Commit 1d1569ec authored by Uwe Schulzweida's avatar Uwe Schulzweida

Merge branch 'develop'

parents 2eba98f6 6e46aa90
......@@ -2,6 +2,7 @@
"thunder": {
"hostname": "thunder5.zmaw.de",
"dir": "/scratch/mpi/CC/mh0287/users/m300064/builds/remote",
"envConfigFiles": ["/etc/profile",".profile"],
"CC": ["icpc", "icc", "clang", "clang++", "gcc", "g++"]
},
"luthien": {
......@@ -12,11 +13,19 @@
"mpipc": {
"hostname": "mpipc150.mpi.zmaw.de",
"dir": "/scratch/local1/m300064/builds/remote",
"envConfigFiles": ["/etc/profile",".profile"],
"CC": ["gcc"]
},
"jessie-mpi": {
"hostname": "mpipc149.mpi.zmaw.de",
"dir": "/scratch/local1/m300064/builds/remote",
"envConfigFiles": ["/etc/profile",".profile"],
"CC": ["gcc","g++","clang","clang++"]
},
"mistral": {
"hostname": "mistral.dkrz.de",
"dir": "/work/mh0287/users/ralf/builds/remote",
"envConfigFiles": ["/etc/profile",".profile"],
"CC": ["gcc","g++","icc","icpc"]
},
"cygwin": {
......@@ -38,6 +47,7 @@
"ubuntu-32bit": {
"hostname": "cdo4windows-ubuntu.mpimet.mpg.de",
"dir": "/home/mpimet/build/cdo",
"envConfigFiles": ["/etc/profile",".profile"],
"username":"mpimet"
}
},
......@@ -72,7 +82,7 @@
"localGCC": {
"doc": "local builder with default GCC - VPATH build",
"hostname": "luthien",
"configureCall": "/home/ram/src/cdo/configure --enable-openmp CC=gcc CFLAGS='-g -O2'",
"configureCall": "/home/ram/src/cdo/configure --enable-openmp --with-grib_api --with-netcdf --with-hdf5 --with-proj --with-udunits2 CC=gcc CFLAGS='-g -O2'",
"makeCall": "make -j 12",
"sync": false
},
......
2016-06-25 Uwe Schulzweida
2016-06-28 Uwe Schulzweida
* using CDI library version 1.7.2
* Version 1.7.2 released
2016-06-28 Uwe Schulzweida
* replace option -Q by --sort
* delete, delcode, delname: wrong variable check (bug fix)
2016-06-27 Uwe Schulzweida
* round doesn't work as expected, replaced by lround()
* nint, expr(nint()): replace round by lround() (bug fix)
2016-06-21 Uwe Schulzweida
* Renamed operator setpartab to setcodetab
* Renamed operator pardes to codetab
2016-06-13 Uwe Schulzweida
* mul: wrong result for missval*0 (bug fix)
......
CDO NEWS
--------
Version 1.7.2 (25 June 2016):
Version 1.7.2 (28 June 2016):
New operators:
* smooth: Smooth grid points
......@@ -12,10 +12,13 @@ Version 1.7.2 (25 June 2016):
* settbounds: Set time bounds
Changed operators:
* input: added optional zaxis parameter
* setpartab: renamed to setcodetab
* pardes: renamed to codetab
Fixed bugs:
* Error reading Gaussian reduced GRIB files [Bug #6780 #6819]
* Installation error with OpenMP [Bug #6523]
* mul: wrong result for missval*0 (bug was introduced in 1.7.1)
* nint: wrong result (replaced round() by lround())
* shaded, contour, grfill: set NAN missvals to -9e33 [Bug: #6677]
Version 1.7.1 (25 February 2016):
......
......@@ -33,7 +33,8 @@ Operator catalog:
Showinfo showdate Show date information
Showinfo showtime Show time information
Showinfo showtimestamp Show timestamp
Filedes pardes Parameter description
Filedes partab Parameter table
Filedes codetab Parameter code table
Filedes griddes Grid description
Filedes zaxisdes Z-axis description
Filedes vct Vertical coordinate table
......@@ -122,7 +123,7 @@ Operator catalog:
-------------------------------------------------------------
Setpartab setpartabp Set parameter table
Setpartab setpartabn Set parameter table
Set setpartab Set parameter table
Set setcodetab Set parameter code table
Set setcode Set code number
Set setparam Set parameter identifier
Set setname Set variable name
......
......@@ -8,17 +8,17 @@ require 'parallel'
require 'logger'
# configuration {{{ ============================================================
# load user setting if available
RC = "#{ENV['HOME']}/.rake.json"
@userConfig = ( File.exist?(RC) ) ? JSON.load(File.open(RC)) : {}
RC = "#{ENV['HOME']}/.rake.json"
@userConfig = ( File.exist?(RC) ) ? JSON.load(File.open(RC)) : {}
if @userConfig.empty? then
warn "No host information!!"
exit(1)
end
# get setup from the environment
@debug = Rake.application.options.silent ? false : true
@user = ENV['USER']
@debug = Rake.application.options.silent ? false : true
@user = ENV['USER']
# internal variables
@_help = {}
@_help = {}
# }}}
# helper methods {{{ ===========================================================
......@@ -55,16 +55,20 @@ end
# stdout is shown in debug mode only
# stderr is always shown
def executeRemote(command, builder)
Net::SSH.start(builder.hostname,builder.username) do |ssh|
Net::SSH.start(builder.hostname,builder.username,
:config => true, :compression => true) do |ssh|
stdout_data = ""
stderr_data = ""
exit_code = nil
exit_code = nil
exit_signal = nil
ssh.open_channel do |channel|
channel.exec(command) do |ch, success|
unless success
raise "FAILED: couldn't execute command #{command}"
end
channel.on_data do |ch, data|
stdout_data += data
$stdout.write(data) if @debug
......@@ -90,19 +94,19 @@ end
#
# execution wrapper
def execute(command, builder)
# work in the target directory, ONLY
command = ["test -f /etc/profile && source /etc/profile",
"test -f .profile && source .profile",
"test ! -d #{builder.targetDir} && mkdir -p #{builder.targetDir}",
# 1)work in the target directory, ONLY
# 2)load the user given config files for environment setup
commands = (builder.envConfigFiles.map {|rcfile| "test -f #{rcfile} && source #{rcfile}"} +
["test ! -d #{builder.targetDir} && mkdir -p #{builder.targetDir}",
"cd #{builder.targetDir}",
command].join(';')
command]).join(';')
dbg(command)
dbg(commands)
if builder.isLocal? then
executeLocal(command)
executeLocal(commands)
else
executeRemote(command,builder)
executeRemote(commands,builder)
end
end
#
......@@ -143,7 +147,7 @@ def builder2task(builder,useHostAsName=false,syncSource=true)
toDo = lambda {|what| "#{baseTaskName}_#{what}".to_sym}
if syncSource then
@_help[:sync] = "sync files for host: #{builder.host}, branch: #{getBranchName}" unless @_help.has_key?(:sync)
@_help[:sync] = "sync source files " unless @_help.has_key?(:sync)
task toDo[:sync] do |t|
dbg("sync source code for branch:" + getBranchName)
doSync(builder)
......@@ -151,37 +155,50 @@ def builder2task(builder,useHostAsName=false,syncSource=true)
end
@_help[:conf]= \
"configure on host: %s, compiler %s, branch: %s" % [builder.host, builder.compiler, getBranchName] unless @_help.has_key?(:conf)
"run configure on host: ./config/default with user settings activated" unless @_help.has_key?(:conf)
task toDo[:conf] do |t|
dbg("call #{builder.configureCall}")
execute("#{builder.configureCall}",builder)
end
@_help[:make] = \
"build on host: %s, compiler %s, branch: %s" % [builder.host, builder.compiler, getBranchName] unless @_help.has_key?(:make)
"run 'make'" unless @_help.has_key?(:make)
task toDo[:make].to_sym do |t|
execute("make -j4",builder)
end
@_help[:check] = \
"check on host: %s, compiler %s, branch: %s" % [builder.host, builder.compiler, getBranchName] unless @_help.has_key?(:check)
"run 'make check'" unless @_help.has_key?(:check)
task toDo[:check] do |t|
execute("make check",builder)
end
@_help[:checkSerial] = \
"check with serialized IO (-L option)" unless @_help.has_key?(:checkSerial)
task toDo[:checkSerial] do |t|
execute("make check CDO='#{builder.targetDir}/src/cdo -L'",builder)
end
@_help[:clean] = \
"build on host: %s, compiler %s, branch: %s" % [builder.host, builder.compiler, getBranchName] unless @_help.has_key?(:clean)
"run 'make clean'" unless @_help.has_key?(:clean)
task toDo[:clean] do |t|
execute("make clean",builder)
end
@_help[:cleanSync] = \
"rm target source dir and perform a fresh sync" unless @_help.has_key?(:cleanSync)
task toDo[:cleanSync] do |t|
execute("cd ; rm -rf #{builder.targetDir}",builder)
doSync(builder) if syncSource
end
@_help[:checkV] = \
"check on host: %s, compiler %s, branch: %s" % [builder.host, builder.compiler, getBranchName] unless @_help.has_key?(:checkV)
"run './src/cdo -V' " unless @_help.has_key?(:checkV)
task toDo[:checkV] do |t|
execute("./src/cdo -V",builder)
end
@_help[:showLog] = "show remote config.log file" unless @_help.has_key?(:make)
@_help[:showLog] = "show config.log file" unless @_help.has_key?(:make)
task toDo[:showLog] do |t|
execute("cat config.log",builder)
end
......@@ -229,7 +246,7 @@ def getUsername(builderConfig, hostConfig)
exit(1)
end
# constuct builders out of user configuration {{{ ==============================
Builder = Struct.new(:host,:hostname,:username,:compiler,:targetDir,:configureCall,:isLocal?,:docstring)
Builder = Struct.new(:host,:hostname,:username,:compiler,:targetDir,:configureCall,:isLocal?,:docstring,:envConfigFiles)
# 1) construct builders from host configuration
# this is what config/default should be able to handle
@userConfig["hosts"].each {|host,config|
......@@ -245,7 +262,8 @@ Builder = Struct.new(:host,:hostname,:username,:compiler,:targetDir,:configureCa
[config["dir"],cc,getBranchName].join(File::SEPARATOR),
"./config/default CC=#{cc}",
config["hostname"] == 'localhost',
"builder on #{config['hostname']}, CC=#{cc}")
"builder on #{config['hostname']}, CC=#{cc}",
config.has_key?("envConfigFiles") ? config["envConfigFiles"] : [])
builder2task(builder)
} if config.has_key?('CC')
......@@ -275,7 +293,8 @@ Builder = Struct.new(:host,:hostname,:username,:compiler,:targetDir,:configureCa
[builderConfig['hostname'],hostConfig['hostname']].include?('localhost'),
builderConfig.has_key?('docstring') \
? builderConfig['docstring'] \
: "builder on #{builderConfig['hostname']}: #{builderConfig['configureCall']}")
: "builder on #{builderConfig['hostname']}: #{builderConfig['configureCall']}",
builderConfig.has_key?("envConfigFiles") ? builderConfig["envConfigFiles"] : [])
builder2task(builder,true, builderConfig['sync'])
......@@ -332,11 +351,3 @@ task :checkConnections do |t|
}
end
# }}}
#
# check internals {{{
task :checkInterals do
dbg(@srcDir)
dbg(getBranchName)
dbg(syncFileList) if false
end
# }}}
......@@ -117,20 +117,27 @@ case "${HOSTNAME}" in
fi
;;
cdo4windows-cyg)
CDOLIBS="--with-netcdf=/usr \
CDOLIBS="--with-netcdf=/usr/local \
--with-hdf5=/usr/local \
--with-udunits2=/usr \
--with-curl=/usr \
--with-proj=/usr"
if test "$COMP" = clang ; then
${CONFPATH}configure \
if test "$COMP" = g++ ; then
${CONFPATH}configure --prefix=/usr/local \
--program-suffix=-g++ \
--enable-cxx \
--enable-maintainer-mode \
$CDOLIBS \
CC=clang CFLAGS="-g -Wall -O2"
CC=g++ CFLAGS="-g -Wall -O2 -DPIC -pie -mwindows" \
LDFLAGS='-L/usr/local/lib' \
LIBS='-lpthread -lm -lcurl -lhdf5_hl -lhdf5 -lz -lsz -laec -ldl'
else
${CONFPATH}configure --prefix=$HOME/local \
--enable-maintainer-mode \
$CDOLIBS \
CC=gcc CFLAGS="-g -Wall -O2"
CC=gcc CFLAGS="-g -Wall -O2 -DPIC -pie -mwindows" \
LDFLAGS='-L/usr/local/lib' \
LIBS='-lpthread -lm -lcurl -lhdf5_hl -lhdf5 -lz -lsz -laec -ldl'
fi
;;
daint*)
......@@ -295,6 +302,42 @@ case "${HOSTNAME}" in
;;
esac
;;
# standard workstations at MPI-M debian jessie
mpipc149)
CDOLIBS="--prefix=`pwd`/build \
--enable-maintainer-mode \
--with-netcdf=/sw/jessie-x64/netcdf-4.3.3.1-gccsys \
--with-hdf5=/sw/jessie-x64/hdf5-1.8.16-gccsys/ \
--with-szlib=/sw/jessie-x64/szip-2.1-gccsys \
--with-udunits2=/sw/jessie-x64/udunits-2.2.20-gccsys \
--enable-ruby --enable-swig --enable-python "
case "$COMP" in
gcc)
${CONFPATH}configure \
$CDOLIBS \
CC=gcc CFLAGS="-g -Wall -W -Wfloat-equal -pedantic -O2" LIBS='-lm -lpthread '
;;
g++) # jessie used gcc 6.1.1
${CONFPATH}configure \
$CDOLIBS \
--enable-cxx \
CC=gcc CXX=g++ CFLAGS="-std=c++11 -g -Wall -W -Wfloat-equal -pedantic -O2" LIBS='-lm -lpthread '
;;
clang)
${CONFPATH}configure \
$CDOLIBS \
--disable-openmp \
CC=/sw/jessie-x64/util/clang+llvm-3.8.0/bin/clang CXX=/sw/jessie-x64/util/clang+llvm-3.8.0/bin/clang++
;;
clang++) # recent clang-3.8
${CONFPATH}configure \
$CDOLIBS \
--disable-openmp \
--enable-cxx \
CC=/sw/jessie-x64/util/clang+llvm-3.8.0/bin/clang CXX=/sw/jessie-x64/util/clang+llvm-3.8.0/bin/clang++
;;
esac
;;
# standard workstations at MPI-M x86_64-lenny
mpipc* )
${CONFPATH}configure \
......
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.68 for cdo 1.7.2rc6.
# Generated by GNU Autoconf 2.68 for cdo 1.7.2.
#
# Report bugs to <http://mpimet.mpg.de/cdo>.
#
......@@ -570,8 +570,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='cdo'
PACKAGE_TARNAME='cdo'
PACKAGE_VERSION='1.7.2rc6'
PACKAGE_STRING='cdo 1.7.2rc6'
PACKAGE_VERSION='1.7.2'
PACKAGE_STRING='cdo 1.7.2'
PACKAGE_BUGREPORT='http://mpimet.mpg.de/cdo'
PACKAGE_URL=''
......@@ -1395,7 +1395,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures cdo 1.7.2rc6 to adapt to many kinds of systems.
\`configure' configures cdo 1.7.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
......@@ -1465,7 +1465,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of cdo 1.7.2rc6:";;
short | recursive ) echo "Configuration of cdo 1.7.2:";;
esac
cat <<\_ACEOF
......@@ -1613,7 +1613,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
cdo configure 1.7.2rc6
cdo configure 1.7.2
generated by GNU Autoconf 2.68
Copyright (C) 2010 Free Software Foundation, Inc.
......@@ -2206,7 +2206,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by cdo $as_me 1.7.2rc6, which was
It was created by cdo $as_me 1.7.2, which was
generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@
......@@ -3155,7 +3155,7 @@ fi
# Define the identity of the package.
PACKAGE='cdo'
VERSION='1.7.2rc6'
VERSION='1.7.2'
cat >>confdefs.h <<_ACEOF
......@@ -19334,7 +19334,7 @@ fi
UDUNITS_ROOT=$with_udunits2
if test -d "$UDUNITS_ROOT"; then :
LDFLAGS="$LDFLAGS -L$UDUNITS_ROOT/lib"
CPPFLAGS="$CPPFLAGS -I$UDUNITS_ROOT/include"
CPPFLAGS="$CPPFLAGS -I$UDUNITS_ROOT/include -I$UDUNITS_ROOT/include/udunits2"
for ac_header in udunits2.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "udunits2.h" "ac_cv_header_udunits2_h" "$ac_includes_default"
......@@ -19527,7 +19527,7 @@ fi
CMOR_ROOT=$with_cmor
if test -d "$CMOR_ROOT"; then :
LDFLAGS="$LDFLAGS -L$CMOR_ROOT/lib"
CPPFLAGS="$CPPFLAGS -I$CMOR_ROOT/include"
CPPFLAGS="$CPPFLAGS -I$CMOR_ROOT/include -I$CMOR_ROOT/include/cdTime"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing cmor_load_table" >&5
$as_echo_n "checking for library containing cmor_load_table... " >&6; }
if ${ac_cv_search_cmor_load_table+:} false; then :
......@@ -21644,7 +21644,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by cdo $as_me 1.7.2rc6, which was
This file was extended by cdo $as_me 1.7.2, which was
generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
......@@ -21710,7 +21710,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
cdo config.status 1.7.2rc6
cdo config.status 1.7.2
configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\"
......
......@@ -4,7 +4,7 @@
# autoconf 2.68
# libtool 2.4.2
AC_INIT([cdo], [1.7.2rc6], [http://mpimet.mpg.de/cdo])
AC_INIT([cdo], [1.7.2], [http://mpimet.mpg.de/cdo])
AC_DEFINE_UNQUOTED(CDO, ["$PACKAGE_VERSION"], [CDO version])
......
......@@ -5,20 +5,29 @@
@Section = Information
@Class = Information
@Arguments = ifile
@Operators = pardes griddes zaxisdes vct
@Operators = partab codetab griddes zaxisdes vct
@BeginDescription
This module prints the description of the parameters, the grids,
the z-axis or the vertical coordinate table.
This module provides operators to print meta information about a dataset.
The printed meta-data depends on the chosen operator.
@EndDescription
@EndModule
@BeginOperator_pardes
@Title = Parameter description
@BeginOperator_partab
@Title = Parameter table
@BeginDescription
Prints a table with a description of all variables.
Prints all available meta information of the variables.
@EndDescription
@EndOperator
@BeginOperator_codetab
@Title = Parameter code table
@BeginDescription
Prints a code table with a description of all variables.
For each variable the operator prints one line listing the
code, name, description and units.
@EndDescription
......@@ -56,7 +65,7 @@ Prints the vertical coordinate table.
@C Assume an input dataset having three parameters with the names geosp, t and tslm1.
@C To print the description of these parameters use:
@C @BeginVerbatim
@C cdo pardes ifile
@C cdo codetab ifile
@C @EndVerbatim
@C Result:
@C @BeginVerbatim
......
......@@ -57,12 +57,12 @@ INTEGER Index of last latitude
@BeginExample
To select the region with the longitudes from 120E to 90W and latitudes from 20N to 20S from all input fields use:
To select the region with the longitudes from 30W to 60E and latitudes from 30N to 80S from all input fields use:
@BeginVerbatim
cdo sellonlatbox,120,-90,20,-20 ifile ofile
cdo sellonlatbox,-30,60,30,80 ifile ofile
@EndVerbatim
If the input dataset has fields on a Gaussian N16 grid, the same box can be selected with @oper{selindexbox} by:
@BeginVerbatim
cdo selindexbox,23,48,13,20 ifile ofile
cdo selindexbox,60,11,3,11 ifile ofile
@EndVerbatim
@EndExample
......@@ -5,7 +5,7 @@
@Section = Modification
@Class = Modification
@Arguments = ifile ofile
@Operators = setpartab setcode setparam setname setunit setlevel setltype
@Operators = setcodetab setcode setparam setname setunit setlevel setltype
@BeginDescription
This module sets some field information. Depending on the chosen operator the
......@@ -14,12 +14,12 @@ parameter table, code number, parameter identifier, variable name or level is se
@EndModule
@BeginOperator_setpartab
@Title = Set parameter table
@BeginOperator_setcodetab
@Title = Set parameter code table
@Parameter = table
@BeginDescription
Sets the parameter table for all variables.
Sets the parameter code table for all variables.
@EndDescription
@EndOperator
......
......@@ -35,6 +35,8 @@ The following options are available for all operators:
\> to {\tt L}ittle or {\tt B}ig endian. \\
\makebox[1.5in][l]{\hspace*{1cm}\sl -\,-cmor}
\> CMOR conform NetCDF output. \\
\makebox[1.5in][l]{\hspace*{1cm}\sl -C, -\,-color}
\> Colorized output messages. \\
\makebox[1.5in][l]{\hspace*{1cm}\sl -f $<$format$>$}
\> Set the output file format. The valid file formats are: \\
\> \parbox[r]{3in}{
......@@ -88,8 +90,6 @@ The following options are available for all operators:
\> \\
\makebox[1.5in][l]{\hspace*{1cm}}
\> Percentile method: {\tt nrank nist numpy numpy\_lower numpy\_higher numpy\_nearest} \\
\makebox[1.5in][l]{\hspace*{1cm}\sl -Q}
\> Alphanumeric sorting of NetCDF parameter names. \\
\makebox[1.5in][l]{\hspace*{1cm}\sl -\,-reduce\_dim}
\> Reduce NetCDF dimensions (module: TIMSTAT, FLDSTAT). \\
\makebox[1.5in][l]{\hspace*{1cm}\sl -R, -\,-regular}
......@@ -101,6 +101,8 @@ The following options are available for all operators:
\> the number of non missing values for each output period. \\
\makebox[1.5in][l]{\hspace*{1cm}\sl -s, -\,-silent}
\> Silent mode. \\
\makebox[1.5in][l]{\hspace*{1cm}\sl -\,-sort}
\> Alphanumeric sorting of NetCDF parameter names. \\
\makebox[1.5in][l]{\hspace*{1cm}\sl -t $<$partab$>$}
\> Set the GRIB1 (cgribex) default parameter table name or file (see chapter 1.6 on page \pageref{PARAMETER_TABLE}).\\
\> Predefined tables are: {\tt echam4 echam5 echam6 mpiom1 ecmwf remo}\\
......@@ -255,27 +257,27 @@ The result is the same as:
\end{verbatim}
\end{itemize}
\subsection{CMOR compliant NetCDF output}
The {\CDO} NetCDF output is almost conform to the \href{http://cfconventions.org}{CF convention}.
The "Climate Model Output Rewriter" (\href{http://cfconventions.org}{CMOR}) library can be used to produce
CF-compliant NetCDF files that fulfill the requirements of many of the climate community's standard model experiments.
\subsubsection{cmor operator}
The {\CDO} operator cmor can be used to write NetCDF output with the CMOR library.
To enable this feature {\CDO} needs to be compiled with CMOR support:
\begin{verbatim}
./configure --with-netcdf=<NetCDF root directory> --with-cmor=<CMOR root directory> ...
make
\end{verbatim}
\subsubsection{cmor option}
The {\CDO} option -\,-cmor can be used to make the regular NetCDF output more CMOR conform.
This feature is independent from the CMOR library and can be used with all {\CDO} operators, except the operator cmor.
This option:
\begin{itemize}
\item Converts single value vertical coordinate to scalar coordinate variable
\item Stores hybrid sigma pressure level conform to the CF convention
\item Generates new {\tt tracking\_id} attribute
\item Generates new {\tt creation\_date} attribute
\end{itemize}
% \subsection{CMOR compliant NetCDF output}
% The {\CDO} NetCDF output is almost conform to the \href{http://cfconventions.org}{CF convention}.
% The "Climate Model Output Rewriter" (\href{http://cfconventions.org}{CMOR}) library can be used to produce
% CF-compliant NetCDF files that fulfill the requirements of many of the climate community's standard model experiments.
% \subsubsection{cmor operator}
% The {\CDO} operator cmor can be used to write NetCDF output with the CMOR library.
% To enable this feature {\CDO} needs to be compiled with CMOR support:
% \begin{verbatim}
% ./configure --with-netcdf=<NetCDF root directory> --with-cmor=<CMOR root directory> ...
% make
% \end{verbatim}