Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • mpim-sw/cdo
1 result
Show changes
Commits on Source (33)
include:
- project: 'anw_dienste/ci-templates'
file: '.slurm-ci.yml'
variables: variables:
GIT_SUBMODULE_STRATEGY: recursive GIT_SUBMODULE_STRATEGY: recursive
ACCOUNT: mh0926
SLURM_NTASKS: "12"
stages: stages:
- build - build
- check - check
build-gcc112: build-gcc112:
extends: .default
variables:
SCHEDULER_PARAMETERS: "--account=$ACCOUNT --partition=shared -n $SLURM_NTASKS"
stage: build stage: build
before_script: before_script:
- . /sw/etc/profile.levante && module use /sw/spack-levante/spack/modules && module list - . /sw/etc/profile.levante && module use /sw/spack-levante/spack/modules && module list
...@@ -14,7 +23,7 @@ build-gcc112: ...@@ -14,7 +23,7 @@ build-gcc112:
script: script:
- module load gcc/11.2.0-gcc-11.2.0 - module load gcc/11.2.0-gcc-11.2.0
- mkdir gcc112 && cd gcc112 && ../configure --prefix=/home/k/k202125/local --with-eccodes=/sw/spack-levante/eccodes-2.21.0-4ywkk4 --with-netcdf=/sw/spack-levante/netcdf-c-4.8.1-qk24yp --with-hdf5=/sw/spack-levante/hdf5-1.12.1-akf2kp --with-udunits2=/sw/spack-levante/udunits-2.2.28-da6pla --with-fftw3 --with-szlib=/sw/spack-levante/libaec-1.0.5-r5sdw5 --with-curl --with-ossp-uuid --with-libxml2 --with-proj=/sw/spack-levante/proj-8.1.0-i6a6ah --with-magics=/sw/spack-levante/magics-4.9.3-z64bdu LIBS=-lm LDFLAGS='-L/sw/spack-levante/eccodes-2.21.0-4ywkk4/lib64 -Wl,-rpath,/sw/spack-levante/eccodes-2.21.0-4ywkk4/lib64 -L/sw/spack-levante/magics-4.9.3-z64bdu/lib64 -Wl,-rpath,/sw/spack-levante/magics-4.9.3-z64bdu/lib64 -L/sw/spack-levante/libaec-1.0.5-r5sdw5/lib64 -Wl,-rpath,/sw/spack-levante/libaec-1.0.5-r5sdw5/lib64 -Wl,-rpath,/sw/spack-levante/netcdf-c-4.8.1-qk24yp/lib -Wl,-rpath,/sw/spack-levante/hdf5-1.12.1-akf2kp/lib -Wl,-rpath,/sw/spack-levante/udunits-2.2.28-da6pla/lib -Wl,-rpath,/sw/spack-levante/proj-8.1.0-i6a6ah/lib -L/sw/spack-levante/fftw-3.3.10-fnfhvr/lib -Wl,-rpath,/sw/spack-levante/fftw-3.3.10-fnfhvr/lib' 'FFLAGS=-g -O2' 'CXXFLAGS=-g -Wall -O3 -mavx2 -I/sw/spack-levante/fftw-3.3.10-fnfhvr/include' 'CFLAGS=-g -Wall -O2 -mavx2' CC=gcc CXX=g++ FC=gfortran F77=gfortran - mkdir gcc112 && cd gcc112 && ../configure --prefix=/home/k/k202125/local --with-eccodes=/sw/spack-levante/eccodes-2.21.0-4ywkk4 --with-netcdf=/sw/spack-levante/netcdf-c-4.8.1-qk24yp --with-hdf5=/sw/spack-levante/hdf5-1.12.1-akf2kp --with-udunits2=/sw/spack-levante/udunits-2.2.28-da6pla --with-fftw3 --with-szlib=/sw/spack-levante/libaec-1.0.5-r5sdw5 --with-curl --with-ossp-uuid --with-libxml2 --with-proj=/sw/spack-levante/proj-8.1.0-i6a6ah --with-magics=/sw/spack-levante/magics-4.9.3-z64bdu LIBS=-lm LDFLAGS='-L/sw/spack-levante/eccodes-2.21.0-4ywkk4/lib64 -Wl,-rpath,/sw/spack-levante/eccodes-2.21.0-4ywkk4/lib64 -L/sw/spack-levante/magics-4.9.3-z64bdu/lib64 -Wl,-rpath,/sw/spack-levante/magics-4.9.3-z64bdu/lib64 -L/sw/spack-levante/libaec-1.0.5-r5sdw5/lib64 -Wl,-rpath,/sw/spack-levante/libaec-1.0.5-r5sdw5/lib64 -Wl,-rpath,/sw/spack-levante/netcdf-c-4.8.1-qk24yp/lib -Wl,-rpath,/sw/spack-levante/hdf5-1.12.1-akf2kp/lib -Wl,-rpath,/sw/spack-levante/udunits-2.2.28-da6pla/lib -Wl,-rpath,/sw/spack-levante/proj-8.1.0-i6a6ah/lib -L/sw/spack-levante/fftw-3.3.10-fnfhvr/lib -Wl,-rpath,/sw/spack-levante/fftw-3.3.10-fnfhvr/lib' 'FFLAGS=-g -O2' 'CXXFLAGS=-g -Wall -O3 -mavx2 -I/sw/spack-levante/fftw-3.3.10-fnfhvr/include' 'CFLAGS=-g -Wall -O2 -mavx2' CC=gcc CXX=g++ FC=gfortran F77=gfortran
- make -j 12 - make -j $SLURM_NTASKS
artifacts: artifacts:
paths: paths:
- ../cdo/ - ../cdo/
...@@ -23,12 +32,15 @@ build-gcc112: ...@@ -23,12 +32,15 @@ build-gcc112:
when: always when: always
expire_in: 3 days expire_in: 3 days
tags: tags:
- levante-fake, hpc, dkrz - levante, hpc, dkrz
only: only:
- develop - develop
- merge_requests - merge_requests
check-gcc112: check-gcc112:
extends: .default
variables:
SCHEDULER_PARAMETERS: "--account=$ACCOUNT --partition=shared -n 1"
stage: check stage: check
needs: ["build-gcc112"] needs: ["build-gcc112"]
before_script: before_script:
...@@ -44,12 +56,15 @@ check-gcc112: ...@@ -44,12 +56,15 @@ check-gcc112:
when: always when: always
expire_in: 3 days expire_in: 3 days
tags: tags:
- levante-fake, hpc, dkrz - levante, hpc, dkrz
only: only:
- develop - develop
- merge_requests - merge_requests
build-intel22: build-intel22:
extends: .default
variables:
SCHEDULER_PARAMETERS: "--account=$ACCOUNT --partition=shared -n $SLURM_NTASKS"
stage: build stage: build
before_script: before_script:
- . /sw/etc/profile.levante && module use /sw/spack-levante/spack/modules && module list - . /sw/etc/profile.levante && module use /sw/spack-levante/spack/modules && module list
...@@ -58,7 +73,7 @@ build-intel22: ...@@ -58,7 +73,7 @@ build-intel22:
script: script:
- module load gcc/11.2.0-gcc-11.2.0 intel-oneapi-compilers/2022.0.1-gcc-11.2.0 - module load gcc/11.2.0-gcc-11.2.0 intel-oneapi-compilers/2022.0.1-gcc-11.2.0
- mkdir intel22 && cd intel22 && ../configure --prefix=/home/k/k202125/local --with-eccodes=/sw/spack-levante/eccodes-2.21.0-4ywkk4 --with-netcdf=/sw/spack-levante/netcdf-c-4.8.1-qk24yp --with-hdf5=/sw/spack-levante/hdf5-1.12.1-akf2kp --with-udunits2=/sw/spack-levante/udunits-2.2.28-da6pla --with-fftw3 --with-szlib=/sw/spack-levante/libaec-1.0.5-r5sdw5 --with-curl --with-ossp-uuid --with-libxml2 --with-proj=/sw/spack-levante/proj-8.1.0-i6a6ah --with-magics=/sw/spack-levante/magics-4.9.3-z64bdu LIBS='-lm -lstdc++' LDFLAGS='-L/sw/spack-levante/eccodes-2.21.0-4ywkk4/lib64 -Wl,-rpath,/sw/spack-levante/eccodes-2.21.0-4ywkk4/lib64 -L/sw/spack-levante/magics-4.9.3-z64bdu/lib64 -Wl,-rpath,/sw/spack-levante/magics-4.9.3-z64bdu/lib64 -L/sw/spack-levante/libaec-1.0.5-r5sdw5/lib64 -Wl,-rpath,/sw/spack-levante/libaec-1.0.5-r5sdw5/lib64 -Wl,-rpath,/sw/spack-levante/netcdf-c-4.8.1-qk24yp/lib -Wl,-rpath,/sw/spack-levante/hdf5-1.12.1-akf2kp/lib -Wl,-rpath,/sw/spack-levante/udunits-2.2.28-da6pla/lib -Wl,-rpath,/sw/spack-levante/proj-8.1.0-i6a6ah/lib -L/sw/spack-levante/fftw-3.3.10-fnfhvr/lib -Wl,-rpath,/sw/spack-levante/fftw-3.3.10-fnfhvr/lib -L/sw/spack-levante/gcc-11.2.0-bcn7mb/lib64 -Wl,-rpath,/sw/spack-levante/gcc-11.2.0-bcn7mb/lib64 -Wl,-rpath,/sw/spack-levante/intel-oneapi-compilers-2022.0.1-an2cbq/compiler/2022.0.1/linux/compiler/lib/intel64' F77=ifx FFLAGS="-g -O2" CXX=icpx CXXFLAGS="-g -Wall -O2 -fhonor-nans -I/sw/spack-levante/fftw-3.3.10-fnfhvr/include" CC=icx CFLAGS="-g -Wall -O2 -fhonor-nans" - mkdir intel22 && cd intel22 && ../configure --prefix=/home/k/k202125/local --with-eccodes=/sw/spack-levante/eccodes-2.21.0-4ywkk4 --with-netcdf=/sw/spack-levante/netcdf-c-4.8.1-qk24yp --with-hdf5=/sw/spack-levante/hdf5-1.12.1-akf2kp --with-udunits2=/sw/spack-levante/udunits-2.2.28-da6pla --with-fftw3 --with-szlib=/sw/spack-levante/libaec-1.0.5-r5sdw5 --with-curl --with-ossp-uuid --with-libxml2 --with-proj=/sw/spack-levante/proj-8.1.0-i6a6ah --with-magics=/sw/spack-levante/magics-4.9.3-z64bdu LIBS='-lm -lstdc++' LDFLAGS='-L/sw/spack-levante/eccodes-2.21.0-4ywkk4/lib64 -Wl,-rpath,/sw/spack-levante/eccodes-2.21.0-4ywkk4/lib64 -L/sw/spack-levante/magics-4.9.3-z64bdu/lib64 -Wl,-rpath,/sw/spack-levante/magics-4.9.3-z64bdu/lib64 -L/sw/spack-levante/libaec-1.0.5-r5sdw5/lib64 -Wl,-rpath,/sw/spack-levante/libaec-1.0.5-r5sdw5/lib64 -Wl,-rpath,/sw/spack-levante/netcdf-c-4.8.1-qk24yp/lib -Wl,-rpath,/sw/spack-levante/hdf5-1.12.1-akf2kp/lib -Wl,-rpath,/sw/spack-levante/udunits-2.2.28-da6pla/lib -Wl,-rpath,/sw/spack-levante/proj-8.1.0-i6a6ah/lib -L/sw/spack-levante/fftw-3.3.10-fnfhvr/lib -Wl,-rpath,/sw/spack-levante/fftw-3.3.10-fnfhvr/lib -L/sw/spack-levante/gcc-11.2.0-bcn7mb/lib64 -Wl,-rpath,/sw/spack-levante/gcc-11.2.0-bcn7mb/lib64 -Wl,-rpath,/sw/spack-levante/intel-oneapi-compilers-2022.0.1-an2cbq/compiler/2022.0.1/linux/compiler/lib/intel64' F77=ifx FFLAGS="-g -O2" CXX=icpx CXXFLAGS="-g -Wall -O2 -fhonor-nans -I/sw/spack-levante/fftw-3.3.10-fnfhvr/include" CC=icx CFLAGS="-g -Wall -O2 -fhonor-nans"
- make -j 12 - make -j $SLURM_NTASKS
artifacts: artifacts:
paths: paths:
- ../cdo/ - ../cdo/
...@@ -67,12 +82,15 @@ build-intel22: ...@@ -67,12 +82,15 @@ build-intel22:
when: always when: always
expire_in: 3 days expire_in: 3 days
tags: tags:
- levante-fake, hpc, dkrz - levante, hpc, dkrz
only: only:
- develop - develop
- merge_requests - merge_requests
check-intel22: check-intel22:
extends: .default
variables:
SCHEDULER_PARAMETERS: "--account=$ACCOUNT --partition=shared -n 1"
stage: check stage: check
needs: ["build-intel22"] needs: ["build-intel22"]
before_script: before_script:
...@@ -88,7 +106,7 @@ check-intel22: ...@@ -88,7 +106,7 @@ check-intel22:
when: always when: always
expire_in: 3 days expire_in: 3 days
tags: tags:
- levante-fake, hpc, dkrz - levante, hpc, dkrz
only: only:
- develop - develop
- merge_requests - merge_requests
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
# libtool 2.4.2 # libtool 2.4.2
AC_PREREQ([2.69]) AC_PREREQ([2.69])
AC_INIT([cdo],[2.4.4],[https://mpimet.mpg.de/cdo]) AC_INIT([cdo],[2.5.0],[https://mpimet.mpg.de/cdo])
AC_DEFINE_UNQUOTED(CDO, ["$PACKAGE_VERSION"], [CDO version]) AC_DEFINE_UNQUOTED(CDO, ["$PACKAGE_VERSION"], [CDO version])
...@@ -79,33 +79,22 @@ AC_CHECK_FUNCS(getrlimit) ...@@ -79,33 +79,22 @@ AC_CHECK_FUNCS(getrlimit)
# Check compiler version # Check compiler version
case "$CXX" in case "$CXX" in
*pgc*) CXX_VERSION=`$CXX -V | head -2 | tail -n 1`;; *pgc*) CXX_VERSION=`$CXX -V | head -2 | tail -n 1`;;
*gcc*) CXX_VERSION=`$CXX --version | head -n 1`;; *sxc*) CXX_VERSION=`$CXX -V 2>&1 | tail -n 1`;;
*g++*) CXX_VERSION=`$CXX --version | head -n 1`;; *xlc*) CXX_VERSION=`$CXX -qversion 2>&1 | head -n 1`;;
*clang*) CXX_VERSION=`$CXX --version | head -n 1`;; *) CXX_VERSION=`$CXX --version 2>&1 | head -n 1 | grep -v error`;;
*icp*) CXX_VERSION=`$CXX --version | head -n 1`;;
*sxc*) CXX_VERSION=`$CXX -V 2>&1 | tail -n 1`;;
*xlc*) CXX_VERSION=`$CXX -qversion 2>&1 | head -n 1`;;
*) CXX_VERSION=`$CXX -V 2>&1 | head -n 1 | grep -v error`;;
esac esac
case "$CC" in case "$CC" in
*pgc*) C_VERSION=`$CC -V | head -2 | tail -n 1`;; *pgc*) C_VERSION=`$CC -V | head -2 | tail -n 1`;;
*gcc*) C_VERSION=`$CC --version | head -n 1`;; *sxc*) C_VERSION=`$CC -V 2>&1 | tail -n 1`;;
*g++*) C_VERSION=`$CC --version | head -n 1`;; *xlc*) C_VERSION=`$CC -qversion 2>&1 | head -n 1`;;
*clang*) C_VERSION=`$CC --version | head -n 1`;; *) C_VERSION=`$CC --version 2>&1 | head -n 1 | grep -v error`;;
*ic*) C_VERSION=`$CC --version | head -n 1`;;
*sxc*) C_VERSION=`$CC -V 2>&1 | tail -n 1`;;
*xlc*) C_VERSION=`$CC -qversion 2>&1 | head -n 1`;;
*) C_VERSION=`$CC -V 2>&1 | head -n 1 | grep -v error`;;
esac esac
if test -n "$F77" ; then if test -n "$F77" ; then
case "$F77" in case "$F77" in
*pgf*) F77_VERSION=`$F77 -V | head -2 | tail -n 1`;; *pgf*) F77_VERSION=`$F77 -V | head -2 | tail -n 1`;;
*gfortran*) F77_VERSION=`$F77 --version | head -n 1`;; *) F77_VERSION=`$F77 --version 2>&1 | head -n 1 | grep -v error`;;
*if*) F77_VERSION=`$F77 --version | head -n 1`;;
*f77*) F77_VERSION=`$F77 --version | head -n 1`;;
*) F77_VERSION=`$F77 -V 2>&1 | head -n 1 | grep -v error`;;
esac esac
fi fi
......
Subproject commit 2ff4ca8aac2c2a5621065b667b555c54c6979232 Subproject commit 56d6e73eac6fc225da60f0af0ac54cc5b2797e60
...@@ -1131,7 +1131,7 @@ after_parini(AfterControl &globs, struct Variable *vars) ...@@ -1131,7 +1131,7 @@ after_parini(AfterControl &globs, struct Variable *vars)
else if (c >= 'a' && c <= 'z') else if (c >= 'a' && c <= 'z')
namelist[i++] = c; namelist[i++] = c;
else if (c >= 'A' && c <= 'Z') else if (c >= 'A' && c <= 'Z')
namelist[i++] = tolower(c); namelist[i++] = std::tolower(c);
else else
c = ' '; c = ' ';
......
This diff is collapsed.
...@@ -55,6 +55,8 @@ list( APPEND cdolib_src_files ...@@ -55,6 +55,8 @@ list( APPEND cdolib_src_files
cdo_rlimit.h cdo_rlimit.h
cdo_season.cc cdo_season.cc
cdo_season.h cdo_season.h
cdo_settings.cc
cdo_settings.h
cdo_syntax_error.cc cdo_syntax_error.cc
cdo_syntax_error.h cdo_syntax_error.h
cdo_task.cc cdo_task.cc
......
...@@ -358,7 +358,7 @@ export_e5ml(const char *filename, const std::vector<VAR> &vars, int nvars, int v ...@@ -358,7 +358,7 @@ export_e5ml(const char *filename, const std::vector<VAR> &vars, int nvars, int v
size_t attlen = strlen(atttext); size_t attlen = strlen(atttext);
nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "source_type", attlen, atttext)); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "source_type", attlen, atttext));
std::strcpy(atttext, command_line()); std::strcpy(atttext, cdo::command_line());
attlen = strlen(atttext); attlen = strlen(atttext);
nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "history", attlen, atttext)); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "history", attlen, atttext));
......
...@@ -216,8 +216,8 @@ params_add_ts(ParseParamType &parseArg) ...@@ -216,8 +216,8 @@ params_add_ts(ParseParamType &parseArg)
{ {
auto &params = parseArg.params; auto &params = parseArg.params;
auto varID = parseArg.nparams; auto varID = parseArg.numParams;
if (varID >= parseArg.maxparams) cdo_abort("Too many parameter (limit=%d)", parseArg.maxparams); if (varID >= parseArg.maxParams) cdo_abort("Too many parameter (limit=%d)", parseArg.maxParams);
auto &param = params[varID]; auto &param = params[varID];
param.name = "_timestep_info"; param.name = "_timestep_info";
...@@ -227,8 +227,7 @@ params_add_ts(ParseParamType &parseArg) ...@@ -227,8 +227,7 @@ params_add_ts(ParseParamType &parseArg)
param.ngp = CoordIndex::LEN; param.ngp = CoordIndex::LEN;
param.nlev = 1; param.nlev = 1;
parseArg.nparams++; parseArg.numParams++;
parseArg.cnparams++;
return varID; return varID;
} }
...@@ -241,10 +240,9 @@ parse_param_init(ParseParamType &parseArg, int vlistID, int pointID, int zonalID ...@@ -241,10 +240,9 @@ parse_param_init(ParseParamType &parseArg, int vlistID, int pointID, int zonalID
auto nzaxis = vlistNumZaxis(vlistID); auto nzaxis = vlistNumZaxis(vlistID);
auto maxCoords = ngrids * 5 + nzaxis * 3; auto maxCoords = ngrids * 5 + nzaxis * 3;
parseArg.maxparams = MaxParams; parseArg.maxParams = MaxParams;
parseArg.params.resize(MaxParams); parseArg.params.resize(MaxParams);
parseArg.nparams = numVars; parseArg.numParams = numVars;
parseArg.cnparams = numVars;
parseArg.numVars1 = numVars; parseArg.numVars1 = numVars;
parseArg.init = true; parseArg.init = true;
parseArg.debug = (Options::cdoVerbose != 0); parseArg.debug = (Options::cdoVerbose != 0);
...@@ -329,6 +327,7 @@ public: ...@@ -329,6 +327,7 @@ public:
}; };
inline static RegisterEntry<Exprf> registration = RegisterEntry<Exprf>(module); inline static RegisterEntry<Exprf> registration = RegisterEntry<Exprf>(module);
private:
CdoStreamID streamID1; CdoStreamID streamID1;
CdoStreamID streamID2; CdoStreamID streamID2;
...@@ -353,6 +352,207 @@ public: ...@@ -353,6 +352,207 @@ public:
int surfaceID; int surfaceID;
int calendar; int calendar;
void
parse_expressions()
{
void *scanner = nullptr;
yylex_init(&scanner);
yyset_extra(&parseArg, scanner);
yy_scan_string(exprString.c_str(), scanner);
yyparse(parseArg, scanner);
yylex_destroy(scanner);
}
void
allocate_params()
{
auto &params = parseArg.params;
for (int varID = 0; varID < numVars1; ++varID)
{
if (parseArg.needed[varID])
{
auto nItems = std::max((size_t) 4, params[varID].ngp * params[varID].nlev);
params[varID].data = new double[nItems];
}
}
for (int varID = parseArg.numVars1, n = parseArg.numParams; varID < n; ++varID)
{
auto nItems = std::max((size_t) 4, params[varID].ngp * params[varID].nlev);
params[varID].data = new double[nItems];
}
}
void
read_coordinates_hgrid(std::vector<double> &cdata, size_t csize, int cdiID, int coord)
{
{
auto gridID = cdiID;
auto ngp = csize;
cdata.resize(ngp);
if (coord == 'x' || coord == 'y')
{
gridID = generate_full_point_grid(gridID);
if (!gridHasCoordinates(gridID)) cdo_abort("Cell center coordinates missing!");
if (coord == 'x') gridInqXvals(gridID, cdata.data());
if (coord == 'y') gridInqYvals(gridID, cdata.data());
if (gridID != cdiID) gridDestroy(gridID);
}
else if (coord == 'a') { gridcell_areas(gridID, cdata); }
else if (coord == 'w')
{
cdata[0] = 1;
if (ngp > 1)
{
auto wstatus = gridcell_weights(gridID, cdata);
if (wstatus) cdo_warning("Grid cell bounds not available, using constant grid cell area weights!");
}
}
else if (coord == 'g')
{
for (size_t k = 0; k < ngp; ++k) cdata[k] = k + 1;
}
}
}
void
read_coordinates_vgrid(std::vector<double> &cdata, size_t csize, int cdiID, int coord)
{
{
auto zaxisID = cdiID;
auto nlev = csize;
cdata.resize(nlev);
if (coord == 'z') { cdo_zaxis_inq_levels(zaxisID, cdata.data()); }
else if (coord == 'i')
{
for (size_t k = 0; k < nlev; ++k) cdata[k] = k + 1;
cdo_zaxis_inq_levels(zaxisID, cdata.data());
}
else if (coord == 'd')
{
ranges::fill(cdata, 1.0);
if (zaxisInqLbounds(zaxisID, nullptr) && zaxisInqUbounds(zaxisID, nullptr))
{
std::vector<double> lbounds(nlev), ubounds(nlev);
zaxisInqLbounds(zaxisID, lbounds.data());
zaxisInqUbounds(zaxisID, ubounds.data());
for (size_t k = 0; k < nlev; ++k) cdata[k] = ubounds[k] - lbounds[k];
}
}
}
}
void
read_coordinates()
{
for (int i = 0, n = parseArg.numCoords; i < n; ++i)
{
if (parseArg.coords[i].needed)
{
auto &cdata = parseArg.coords[i].data;
auto csize = parseArg.coords[i].size;
auto cdiID = parseArg.coords[i].cdiID;
auto coord = parseArg.coords[i].coord;
if (coord == 'x' || coord == 'y' || coord == 'a' || coord == 'w' || coord == 'g')
{
read_coordinates_hgrid(cdata, csize, cdiID, coord);
}
else if (coord == 'z' || coord == 'i' || coord == 'd') { read_coordinates_vgrid(cdata, csize, cdiID, coord); }
else { cdo_abort("Computation of coordinate %c not implemented!", coord); }
}
}
}
void
copy_coordinates()
{
auto &params = parseArg.params;
for (int varID = parseArg.numVars1, n = parseArg.numParams; varID < n; ++varID)
{
auto coord = params[varID].coord;
if (coord)
{
if (coord == 'x' || coord == 'y' || coord == 'a' || coord == 'w' || coord == 'g')
{
auto coordID = params_get_coord_ID(parseArg, coord, params[varID].gridID);
auto gridID = parseArg.coords[coordID].cdiID;
auto ngp = parseArg.coords[coordID].size;
const auto &cdata = parseArg.coords[coordID].data;
assert(gridID == params[varID].gridID);
assert(!cdata.empty());
array_copy(ngp, cdata.data(), params[varID].data);
}
else if (coord == 'z' || coord == 'i' || coord == 'd')
{
auto coordID = params_get_coord_ID(parseArg, coord, params[varID].zaxisID);
auto zaxisID = parseArg.coords[coordID].cdiID;
auto nlev = parseArg.coords[coordID].size;
const auto &cdata = parseArg.coords[coordID].data;
assert(zaxisID == params[varID].zaxisID);
assert(!cdata.empty());
array_copy(nlev, cdata.data(), params[varID].data);
}
else
cdo_abort("Computation of coordinate %c not implemented!", coord);
}
}
}
void
init_output_params(std::vector<ParamEntry> &params)
{
for (int varID = 0; varID < numVars2; ++varID)
{
auto pidx = varIDmap[varID];
if (pidx < numVars1) continue;
auto &param = params[pidx];
param.numMissVals = 0;
ranges::fill_n(param.data, param.ngp * param.nlev, 0.0);
}
}
void
add_new_output_params()
{
auto &params = parseArg.params;
// printf("parseArg.nparams %d\n", parseArg.nparams);
for (int pidx = 0, n = parseArg.numParams; pidx < n; pidx++)
{
const auto &param = params[pidx];
if (pidx < numVars1 && !param.select) continue;
if (pidx >= numVars1)
{
if (param.type == ParamType::CONST) continue;
if (param.name[0] == '_') continue;
if (param.remove) continue;
if (param.coord) continue;
}
// printf("gridID %d zaxisID %d\n", param.gridID, param.zaxisID);
auto varID = vlistDefVar(vlistID2, param.gridID, param.zaxisID, param.steptype);
cdiDefKeyString(vlistID2, varID, CDI_KEY_NAME, param.name.c_str());
// printf("add: %d %s %d levs %d\n", pidx, param.name.c_str(), varID, zaxisInqSize(param.zaxisID));
if (param.hasMV) vlistDefVarMissval(vlistID2, varID, param.missval);
if (param.units.size()) cdiDefKeyString(vlistID2, varID, CDI_KEY_UNITS, param.units.c_str());
if (param.longname.size()) cdiDefKeyString(vlistID2, varID, CDI_KEY_LONGNAME, param.longname.c_str());
if (param.stdname.size()) cdiDefKeyString(vlistID2, varID, CDI_KEY_STDNAME, param.stdname.c_str());
if (param.name.size() > 3 && param.name.rfind("var", 0) == 0)
{
if (std::isdigit(param.name[3]))
{
auto code = std::atoi(param.name.c_str() + 3);
vlistDefVarCode(vlistID2, varID, code);
}
}
varIDmap[varID] = pidx;
}
}
public: public:
void void
init() override init() override
...@@ -396,16 +596,9 @@ public: ...@@ -396,16 +596,9 @@ public:
parseArg.tsID = vartsID; parseArg.tsID = vartsID;
params_add_coordinates(vlistID1, parseArg); params_add_coordinates(vlistID1, parseArg);
{ CDO_parser_errorno = 0;
CDO_parser_errorno = 0; parse_expressions();
void *scanner = nullptr; if (CDO_parser_errorno != 0) cdo_abort("Syntax error!");
yylex_init(&scanner);
yyset_extra(&parseArg, scanner);
yy_scan_string(exprString.c_str(), scanner);
yyparse(parseArg, scanner);
yylex_destroy(scanner);
if (CDO_parser_errorno != 0) cdo_abort("Syntax error!");
}
parseArg.init = false; parseArg.init = false;
...@@ -414,11 +607,11 @@ public: ...@@ -414,11 +607,11 @@ public:
if (parseArg.needed[varID]) cdo_print("Needed var: %d %s", varID, params[varID].name); if (parseArg.needed[varID]) cdo_print("Needed var: %d %s", varID, params[varID].name);
if (Options::cdoVerbose) if (Options::cdoVerbose)
for (int varID = 0, n = parseArg.nparams; varID < n; ++varID) for (int varID = 0, n = parseArg.numParams; varID < n; ++varID)
cdo_print("var: %d %s ngp=%zu nlev=%zu coord=%c", varID, params[varID].name, params[varID].ngp, params[varID].nlev, cdo_print("var: %d %s ngp=%zu nlev=%zu coord=%c", varID, params[varID].name, params[varID].ngp, params[varID].nlev,
(params[varID].coord == 0) ? ' ' : params[varID].coord); (params[varID].coord == 0) ? ' ' : params[varID].coord);
varIDmap = std::vector<int>(parseArg.nparams); varIDmap.resize(parseArg.numParams);
vlistID2 = vlistCreate(); vlistID2 = vlistCreate();
vlistDefNtsteps(vlistID2, vlistNtsteps(vlistID1)); vlistDefNtsteps(vlistID2, vlistNtsteps(vlistID1));
...@@ -440,37 +633,7 @@ public: ...@@ -440,37 +633,7 @@ public:
} }
cdo_vlist_copy_flag(vlistID2, vlistID1); // Copy global attributes cdo_vlist_copy_flag(vlistID2, vlistID1); // Copy global attributes
// printf("parseArg.nparams %d\n", parseArg.nparams); add_new_output_params();
for (int pidx = 0, n = parseArg.nparams; pidx < n; pidx++)
{
const auto &param = params[pidx];
if (pidx < numVars1 && !param.select) continue;
if (pidx >= numVars1)
{
if (param.type == ParamType::CONST) continue;
if (param.name[0] == '_') continue;
if (param.remove) continue;
if (param.coord) continue;
}
// printf("gridID %d zaxisID %d\n", param.gridID, param.zaxisID);
auto varID = vlistDefVar(vlistID2, param.gridID, param.zaxisID, param.steptype);
cdiDefKeyString(vlistID2, varID, CDI_KEY_NAME, param.name.c_str());
// printf("add: %d %s %d levs %d\n", pidx, param.name.c_str(), varID, zaxisInqSize(param.zaxisID));
if (param.hasMV) vlistDefVarMissval(vlistID2, varID, param.missval);
if (param.units.size()) cdiDefKeyString(vlistID2, varID, CDI_KEY_UNITS, param.units.c_str());
if (param.longname.size()) cdiDefKeyString(vlistID2, varID, CDI_KEY_LONGNAME, param.longname.c_str());
if (param.stdname.size()) cdiDefKeyString(vlistID2, varID, CDI_KEY_STDNAME, param.stdname.c_str());
if (param.name.size() > 3 && param.name.rfind("var", 0) == 0)
{
if (std::isdigit(param.name[3]))
{
auto code = atoi(param.name.c_str() + 3);
vlistDefVarCode(vlistID2, varID, code);
}
}
varIDmap[varID] = pidx;
}
if (Options::cdoVerbose) if (Options::cdoVerbose)
{ {
...@@ -482,118 +645,10 @@ public: ...@@ -482,118 +645,10 @@ public:
numVars2 = vlistNvars(vlistID2); numVars2 = vlistNvars(vlistID2);
if (numVars2 == 0) cdo_abort("No output variable found!"); if (numVars2 == 0) cdo_abort("No output variable found!");
for (int varID = 0; varID < numVars1; ++varID) allocate_params();
{
if (parseArg.needed[varID])
{
auto nItems = std::max((size_t) 4, params[varID].ngp * params[varID].nlev);
params[varID].data = new double[nItems];
}
}
for (int varID = parseArg.numVars1, n = parseArg.nparams; varID < n; ++varID) read_coordinates();
{ copy_coordinates();
auto nItems = std::max((size_t) 4, params[varID].ngp * params[varID].nlev);
params[varID].data = new double[nItems];
}
for (int i = 0, n = parseArg.numCoords; i < n; ++i)
{
if (parseArg.coords[i].needed)
{
auto &cdata = parseArg.coords[i].data;
auto csize = parseArg.coords[i].size;
auto cdiID = parseArg.coords[i].cdiID;
auto coord = parseArg.coords[i].coord;
if (coord == 'x' || coord == 'y' || coord == 'a' || coord == 'w' || coord == 'g')
{
auto gridID = cdiID;
auto ngp = csize;
cdata.resize(ngp);
if (coord == 'x' || coord == 'y')
{
gridID = generate_full_point_grid(gridID);
if (!gridHasCoordinates(gridID)) cdo_abort("Cell center coordinates missing!");
if (coord == 'x') gridInqXvals(gridID, cdata.data());
if (coord == 'y') gridInqYvals(gridID, cdata.data());
if (gridID != parseArg.coords[i].cdiID) gridDestroy(gridID);
}
else if (coord == 'a') { gridcell_areas(gridID, cdata); }
else if (coord == 'w')
{
cdata[0] = 1;
if (ngp > 1)
{
auto wstatus = gridcell_weights(gridID, cdata);
if (wstatus) cdo_warning("Grid cell bounds not available, using constant grid cell area weights!");
}
}
else if (coord == 'g')
{
for (size_t k = 0; k < ngp; ++k) cdata[k] = k + 1;
}
}
else if (coord == 'z' || coord == 'i' || coord == 'd')
{
auto zaxisID = cdiID;
auto nlev = csize;
cdata.resize(nlev);
if (coord == 'z') { cdo_zaxis_inq_levels(zaxisID, cdata.data()); }
else if (coord == 'i')
{
for (size_t k = 0; k < nlev; ++k) cdata[k] = k + 1;
cdo_zaxis_inq_levels(zaxisID, cdata.data());
}
else if (coord == 'd')
{
ranges::fill(cdata, 1.0);
if (zaxisInqLbounds(zaxisID, nullptr) && zaxisInqUbounds(zaxisID, nullptr))
{
std::vector<double> lbounds(nlev), ubounds(nlev);
zaxisInqLbounds(zaxisID, lbounds.data());
zaxisInqUbounds(zaxisID, ubounds.data());
for (size_t k = 0; k < nlev; ++k) cdata[k] = ubounds[k] - lbounds[k];
}
}
}
else
cdo_abort("Computation of coordinate %c not implemented!", coord);
}
}
for (int varID = parseArg.numVars1, n = parseArg.nparams; varID < n; ++varID)
{
auto coord = params[varID].coord;
if (coord)
{
if (coord == 'x' || coord == 'y' || coord == 'a' || coord == 'w' || coord == 'g')
{
auto coordID = params_get_coord_ID(parseArg, coord, params[varID].gridID);
auto gridID = parseArg.coords[coordID].cdiID;
auto ngp = parseArg.coords[coordID].size;
const auto &cdata = parseArg.coords[coordID].data;
assert(gridID == params[varID].gridID);
assert(!cdata.empty());
array_copy(ngp, cdata.data(), params[varID].data);
}
else if (coord == 'z' || coord == 'i' || coord == 'd')
{
auto coordID = params_get_coord_ID(parseArg, coord, params[varID].zaxisID);
auto zaxisID = parseArg.coords[coordID].cdiID;
auto nlev = parseArg.coords[coordID].size;
const auto &cdata = parseArg.coords[coordID].data;
assert(zaxisID == params[varID].zaxisID);
assert(!cdata.empty());
array_copy(nlev, cdata.data(), params[varID].data);
}
else
cdo_abort("Computation of coordinate %c not implemented!", coord);
}
}
if (Options::cdoVerbose) vlistPrint(vlistID2); if (Options::cdoVerbose) vlistPrint(vlistID2);
...@@ -648,35 +703,16 @@ public: ...@@ -648,35 +703,16 @@ public:
} }
} }
for (int varID = 0; varID < numVars2; ++varID) init_output_params(params);
{
auto pidx = varIDmap[varID];
if (pidx < numVars1) continue;
auto &param = params[pidx]; parse_expressions();
param.numMissVals = 0;
ranges::fill_n(param.data, param.ngp * param.nlev, 0.0);
}
parseArg.cnparams = vartsID + 1;
{
void *scanner = nullptr;
yylex_init(&scanner);
yyset_extra(&parseArg, scanner);
yy_scan_string(exprString.c_str(), scanner);
yyparse(parseArg, scanner);
yylex_destroy(scanner);
}
for (int varID = 0; varID < numVars2; ++varID) for (int varID = 0; varID < numVars2; ++varID)
{ {
auto pidx = varIDmap[varID]; auto pidx = varIDmap[varID];
if (tsID > 0 && params[pidx].steptype == TIME_CONSTANT) continue; if (tsID > 0 && params[pidx].steptype == TIME_CONSTANT) continue;
auto missval = vlistInqVarMissval(vlistID2, varID); auto missval = vlistInqVarMissval(vlistID2, varID);
auto ngp = params[pidx].ngp; auto ngp = params[pidx].ngp;
auto nlev = (int) params[pidx].nlev; auto nlev = (int) params[pidx].nlev;
for (int levelID = 0; levelID < nlev; ++levelID) for (int levelID = 0; levelID < nlev; ++levelID)
......
...@@ -161,8 +161,7 @@ public: ...@@ -161,8 +161,7 @@ public:
int64_t cellIdx = -1; int64_t cellIdx = -1;
if (is_healpix_grid(gridID1)) if (is_healpix_grid(gridID1))
{ {
auto [nside, order] = cdo::get_healpix_params(gridID1); cellIdx = hp_lonlat_to_index(cdo::get_healpix_params(gridID1), DEG2RAD * gridPoint.lon, DEG2RAD * gridPoint.lat);
cellIdx = hp_lonlat_to_index(order, nside, DEG2RAD * gridPoint.lon, DEG2RAD * gridPoint.lat);
} }
else { cellIdx = lonlat_to_index(gridID1, gridPoint); } else { cellIdx = lonlat_to_index(gridID1, gridPoint); }
......
...@@ -249,7 +249,9 @@ hp_define_grid(int gridID1, HealpixParams &params) ...@@ -249,7 +249,9 @@ hp_define_grid(int gridID1, HealpixParams &params)
{ {
int gridIDout = -1; int gridIDout = -1;
auto [nside, order] = cdo::get_healpix_params(gridID1); auto hpParams = cdo::get_healpix_params(gridID1);
auto nside = hpParams.get_nside();
auto order = hpParams.get_order();
params.nsideIn = nside; params.nsideIn = nside;
params.orderIn = order; params.orderIn = order;
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#endif #endif
#include <cdi.h> #include <cdi.h>
#include <stdlib.h> // realloc() #include <cstdlib> // realloc()
#include "cdo_options.h" #include "cdo_options.h"
#include "varray.h" #include "varray.h"
...@@ -802,7 +802,7 @@ read_dataset(hid_t loc_id, const char *name, void *opdata) ...@@ -802,7 +802,7 @@ read_dataset(hid_t loc_id, const char *name, void *opdata)
atype_class = H5Tget_class(atype); atype_class = H5Tget_class(atype);
len = strlen(attname); len = strlen(attname);
for (int k = 0; k < len; ++k) attname[k] = tolower(attname[k]); for (int k = 0; k < len; ++k) attname[k] = std::tolower(attname[k]);
if (cdo_cmpstr(attname, "intercept") || cdo_cmpstr(attname, "offset")) if (cdo_cmpstr(attname, "intercept") || cdo_cmpstr(attname, "offset"))
{ {
......
...@@ -54,6 +54,8 @@ libcdo_la_SOURCES = after_dvtrans.cc \ ...@@ -54,6 +54,8 @@ libcdo_la_SOURCES = after_dvtrans.cc \
cdo_rlimit.h \ cdo_rlimit.h \
cdo_season.cc \ cdo_season.cc \
cdo_season.h \ cdo_season.h \
cdo_settings.cc \
cdo_settings.h \
cdo_stepstat.h \ cdo_stepstat.h \
cdo_syntax_error.cc \ cdo_syntax_error.cc \
cdo_syntax_error.h \ cdo_syntax_error.h \
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <cdi.h> #include <cdi.h>
#include "grid_convert.h"
#include "process_int.h" #include "process_int.h"
#include "param_conversion.h" #include "param_conversion.h"
#include "remap_utils.h" #include "remap_utils.h"
...@@ -236,17 +237,16 @@ print_node_info(int gridID2, const RemapVars &rv, const RemapGrid &srcGrid) ...@@ -236,17 +237,16 @@ print_node_info(int gridID2, const RemapVars &rv, const RemapGrid &srcGrid)
if (rv.numLinks == 1) if (rv.numLinks == 1)
{ {
auto srcCellIndex = rv.srcCellIndices[0]; auto srcCellIndex = rv.srcCellIndices[0];
auto llpoint = remapgrid_get_lonlat(&srcGrid, srcCellIndex); auto llPoint = remapgrid_get_lonlat(&srcGrid, srcCellIndex);
auto lon1 = RAD2DEG * llpoint.lon; auto lon1 = llPoint.get_lon();
auto lat1 = RAD2DEG * llpoint.lat; auto lat1 = llPoint.get_lat();
if (lon1 > 180.0) lon1 -= 360.0; if (lon1 > PI) lon1 -= PI2;
auto distance = orthodrome(DEG2RAD * lon1, DEG2RAD * lat1, DEG2RAD * lon2, DEG2RAD * lat2) auto distance = orthodrome(lon1, lat1, DEG2RAD * lon2, DEG2RAD * lat2) * get_planet_radius_in_meter(srcGrid.gridID) / 1000;
* get_planet_radius_in_meter(srcGrid.gridID) / 1000;
cdo_print("Target Point: lon=%g/lat=%g Source Point: index=%zu lon=%g/lat=%g distance=%.3fkm", lon2, lat2, srcCellIndex + 1, cdo_print("Target Point: lon=%g/lat=%g Source Point: index=%zu lon=%g/lat=%g distance=%.3fkm", lon2, lat2, srcCellIndex + 1,
lon1, lat1, distance); RAD2DEG * lon1, RAD2DEG * lat1, distance);
} }
else if (rv.numLinks == 0) { cdo_print("Target Point: lon=%g/lat=%g Source Point: out of grid area", lon2, lat2); } else if (rv.numLinks == 0) { cdo_print("Target Point: lon=%g/lat=%g Source Point: not found", lon2, lat2); }
} }
class Remapgrid : public Process class Remapgrid : public Process
......
...@@ -517,11 +517,11 @@ gen_mapdata(int gridID1, int gridID2) ...@@ -517,11 +517,11 @@ gen_mapdata(int gridID1, int gridID2)
timer.reset(); timer.reset();
auto ndistMax = gridsize1; auto maxDist = gridsize1;
if (gridsize1 > 1000000) ndistMax /= 4; if (gridsize1 > 1000000) maxDist /= 4;
std::vector<int8_t> vmask(gridsize1, 0); std::vector<int8_t> vmask(gridsize1, 0);
Varray2D<size_t> indices_2D(Threading::ompNumThreads, Varray<size_t>(ndistMax)); Varray2D<size_t> indices_2D(Threading::ompNumThreads, Varray<size_t>(maxDist));
Varray2D<double> dist_2D(Threading::ompNumThreads, Varray<double>(ndistMax)); Varray2D<double> dist_2D(Threading::ompNumThreads, Varray<double>(maxDist));
StatInfo statInfo; StatInfo statInfo;
...@@ -543,7 +543,7 @@ gen_mapdata(int gridID1, int gridID2) ...@@ -543,7 +543,7 @@ gen_mapdata(int gridID1, int gridID2)
if (maxdist < 2.0) { maxdist = 1.01 * std::sqrt(maxdist); } if (maxdist < 2.0) { maxdist = 1.01 * std::sqrt(maxdist); }
else { cdo_abort("Search radius of target grid cell[%zu] > 90 degrees!", i + 1); } else { cdo_abort("Search radius of target grid cell[%zu] > 90 degrees!", i + 1); }
auto numIndices = grid_point_search_distance_qnearest(gps, maxdist, lon2, lat2, ndistMax, indices, dist); auto numIndices = grid_point_search_distance_qnearest(gps, maxdist, lon2, lat2, maxDist, indices, dist);
// printf("%zu numIndices %zu\n", i+1, numIndices); // printf("%zu numIndices %zu\n", i+1, numIndices);
auto nvalues = grid2IsReg2d auto nvalues = grid2IsReg2d
...@@ -565,9 +565,7 @@ gen_mapdata(int gridID1, int gridID2) ...@@ -565,9 +565,7 @@ gen_mapdata(int gridID1, int gridID2)
} }
if (Options::cdoVerbose && Threading::ompNumThreads == 1) statInfo.print(); if (Options::cdoVerbose && Threading::ompNumThreads == 1) statInfo.print();
if (Options::cdoVerbose) check_vmask(vmask); if (Options::cdoVerbose) check_vmask(vmask);
if (Options::cdoVerbose) cdo_print("Point search qnearest: %.2f seconds", timer.elapsed()); if (Options::cdoVerbose) cdo_print("Point search qnearest: %.2f seconds", timer.elapsed());
grid_point_search_delete(gps); grid_point_search_delete(gps);
......
...@@ -29,9 +29,9 @@ gen_grid_unstr_from_healpix(int gridID1, size_t gridsize2, const std::vector<lon ...@@ -29,9 +29,9 @@ gen_grid_unstr_from_healpix(int gridID1, size_t gridsize2, const std::vector<lon
{ {
Varray<double> xvals(gridsize2), yvals(gridsize2); Varray<double> xvals(gridsize2), yvals(gridsize2);
auto [nside, order] = cdo::get_healpix_params(gridID1); auto hpParams = cdo::get_healpix_params(gridID1);
for (size_t i = 0; i < gridsize2; ++i) { hp_index_to_lonlat(order, nside, cellidx[i], &xvals[i], &yvals[i]); } for (size_t i = 0; i < gridsize2; ++i) { hp_index_to_lonlat(hpParams, cellidx[i], &xvals[i], &yvals[i]); }
auto gridID2 = gridCreate(GRID_UNSTRUCTURED, gridsize2); auto gridID2 = gridCreate(GRID_UNSTRUCTURED, gridsize2);
cdiDefKeyString(gridID2, CDI_XAXIS, CDI_KEY_UNITS, "radians"); cdiDefKeyString(gridID2, CDI_XAXIS, CDI_KEY_UNITS, "radians");
......
...@@ -1197,35 +1197,35 @@ printSelectionTuples() ...@@ -1197,35 +1197,35 @@ printSelectionTuples()
for (ri = 0; ri < tuplerec->ncodes; ri++) for (ri = 0; ri < tuplerec->ncodes; ri++)
{ {
std::snprintf(bff, sizeof(bff), "%d", tuplerec->codeLST[ri]); std::snprintf(bff, sizeof(bff), "%d", tuplerec->codeLST[ri]);
strcat(strval, bff); std::strcat(strval, bff);
if ((ri + 1) < tuplerec->ncodes) if ((ri + 1) < tuplerec->ncodes)
strcat(strval, "/"); std::strcat(strval, "/");
else else
strcat(strval, ";"); std::strcat(strval, ";");
} }
for (ri = 0; ri < tuplerec->nlevelTypes; ri++) for (ri = 0; ri < tuplerec->nlevelTypes; ri++)
{ {
std::snprintf(bff, sizeof(bff), "%d", tuplerec->levelTypeLST[ri]); std::snprintf(bff, sizeof(bff), "%d", tuplerec->levelTypeLST[ri]);
strcat(strval, bff); std::strcat(strval, bff);
if ((ri + 1) < tuplerec->nlevelTypes) if ((ri + 1) < tuplerec->nlevelTypes)
strcat(strval, "/"); std::strcat(strval, "/");
else else
strcat(strval, ";"); std::strcat(strval, ";");
} }
for (ri = 0; ri < tuplerec->nlevels; ri++) for (ri = 0; ri < tuplerec->nlevels; ri++)
{ {
std::snprintf(bff, sizeof(bff), "%d", tuplerec->levelLST[ri]); std::snprintf(bff, sizeof(bff), "%d", tuplerec->levelLST[ri]);
strcat(strval, bff); std::strcat(strval, bff);
if ((ri + 1) < tuplerec->nlevels) if ((ri + 1) < tuplerec->nlevels)
strcat(strval, "/"); std::strcat(strval, "/");
else else
strcat(strval, ")"); std::strcat(strval, ")");
} }
if (tuplerec->simpleMath) if (tuplerec->simpleMath)
{ {
std::snprintf(bff, sizeof(bff), " {scale = %f; offset = %f}", tuplerec->scale, tuplerec->offset); std::snprintf(bff, sizeof(bff), " {scale = %f; offset = %f}", tuplerec->scale, tuplerec->offset);
strcat(strval, bff); std::strcat(strval, bff);
} }
// sel_or_del_or_change: 0: operator decides, 1:select , 2:delete, // sel_or_del_or_change: 0: operator decides, 1:select , 2:delete,
......
...@@ -68,35 +68,35 @@ mapvar(int vlistID, int varID, const KeyValues &kv, CmorVar &cmorVar, bool &hasV ...@@ -68,35 +68,35 @@ mapvar(int vlistID, int varID, const KeyValues &kv, CmorVar &cmorVar, bool &hasV
} }
if (key == "standard_name") if (key == "standard_name")
{ {
if (not lv1) cdo_abort("%s can only have one string value!", key.c_str()); if (not lv1) cdo_abort("%s can only have one string value!", key);
cdiDefKeyString(vlistID, varID, CDI_KEY_STDNAME, value.c_str()); cdiDefKeyString(vlistID, varID, CDI_KEY_STDNAME, value.c_str());
} }
else if (key == "long_name") else if (key == "long_name")
{ {
if (not lv1) cdo_abort("%s can only have one string value!", key.c_str()); if (not lv1) cdo_abort("%s can only have one string value!", key);
cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, value.c_str()); cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, value.c_str());
} }
else if (key == "units") else if (key == "units")
{ {
if (not lv1) cdo_abort("%s can only have one string value!", key.c_str()); if (not lv1) cdo_abort("%s can only have one string value!", key);
cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, value.c_str()); cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, value.c_str());
} }
else if (key == "filterspec") else if (key == "filterspec")
{ {
if (not lv1) cdo_abort("%s can only have one string value!", key.c_str()); if (not lv1) cdo_abort("%s can only have one string value!", key);
cdiDefKeyString(vlistID, varID, CDI_KEY_FILTERSPEC, value.c_str()); cdiDefKeyString(vlistID, varID, CDI_KEY_FILTERSPEC, value.c_str());
} }
else if (key == "name") else if (key == "name")
{ {
if (isnPtmodeName) if (isnPtmodeName)
{ {
if (not lv1) cdo_abort("%s can only have one string value!", key.c_str()); if (not lv1) cdo_abort("%s can only have one string value!", key);
cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, parameter_to_word(value.c_str())); cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, parameter_to_word(value.c_str()));
} }
} }
else if (key == "out_name") else if (key == "out_name")
{ {
if (not lv1) cdo_abort("%s can only have one string value!", key.c_str()); if (not lv1) cdo_abort("%s can only have one string value!", key);
auto outname = parameter_to_word(value); auto outname = parameter_to_word(value);
if (cmorVar.name != outname) if (cmorVar.name != outname)
{ {
......
...@@ -230,7 +230,7 @@ public: ...@@ -230,7 +230,7 @@ public:
using Process::Process; using Process::Process;
inline static CdoModule module = { inline static CdoModule module = {
.name = "Specinfo", .name = "Specinfo",
.operators = { { "specinfo"} }, .operators = { { "specinfo" } },
.aliases = {}, .aliases = {},
.mode = EXPOSED, // Module mode: 0:intern 1:extern .mode = EXPOSED, // Module mode: 0:intern 1:extern
.number = CDI_REAL, // Allowed number type .number = CDI_REAL, // Allowed number type
...@@ -480,14 +480,13 @@ public: ...@@ -480,14 +480,13 @@ public:
void void
init() override init() override
{ {
operator_input_arg("Txx, TLxx, NLON=xx, NLAT=xx, NIxx or ICONRyyLxx"); operator_input_arg("Txx, TLxx, NLON=xx, NLAT=xx, NIxx or ICONRyyLxx");
long len = cdo_operator_argv(0).size(); long len = cdo_operator_argv(0).size();
if ((len + 1) >= 128) cdo_abort("Parameter string too large!"); if ((len + 1) >= 128) cdo_abort("Parameter string too large!");
for (long i = 0; i < len; ++i) arg[i] = toupper(cdo_operator_argv(0)[i]); for (long i = 0; i < len; ++i) arg[i] = std::toupper(cdo_operator_argv(0)[i]);
arg[len] = 0; arg[len] = 0;
argument = std::string(cdo_operator_argv(0)); argument = std::string(cdo_operator_argv(0));
......
...@@ -220,8 +220,8 @@ private: ...@@ -220,8 +220,8 @@ private:
{ {
char filename[8192]; char filename[8192];
std::strcpy(filename, cdo_operator_name(operatorID)); std::strcpy(filename, cdo_operator_name(operatorID));
strcat(filename, "_"); std::strcat(filename, "_");
strcat(filename, cdo_get_stream_name(1)); std::strcat(filename, cdo_get_stream_name(1));
streamID3 = cdo_open_write(filename); streamID3 = cdo_open_write(filename);
vlistID3 = vlistDuplicate(vlistID1); vlistID3 = vlistDuplicate(vlistID1);
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#include "arithmetic.h" #include "arithmetic.h"
constexpr int NIN = 2; constexpr int NIN = 2;
constexpr int NOUT = 1;
constexpr int NWORK = 6; constexpr int NWORK = 6;
static void static void
......