From f7fdc7653756fcc223ce1a3685a2bff8bd2b24ae Mon Sep 17 00:00:00 2001
From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de>
Date: Wed, 26 Feb 2025 08:55:25 +0100
Subject: [PATCH 1/2] cdo_cmpstr: changed parameter type to std::string_view

---
 src/after_sptrans.cc  |  1 +
 src/compare.h         | 11 ++---------
 src/grid_from_name.cc | 10 +++++-----
 3 files changed, 8 insertions(+), 14 deletions(-)

diff --git a/src/after_sptrans.cc b/src/after_sptrans.cc
index 63a1e2765..979dc20be 100644
--- a/src/after_sptrans.cc
+++ b/src/after_sptrans.cc
@@ -6,6 +6,7 @@
 */
 
 #include <cmath>
+#include <cstring>
 
 #include "cdo_options.h"
 #include "cdo_omp.h"
diff --git a/src/compare.h b/src/compare.h
index 86364a9e4..8e8ac6375 100644
--- a/src/compare.h
+++ b/src/compare.h
@@ -2,8 +2,7 @@
 #define COMPARE_H
 
 #include <cmath>
-#include <cstring>
-#include <string>
+#include <string_view>
 
 // compare
 // clang-format off
@@ -15,13 +14,7 @@ const auto fp_is_equal      = [](auto a, auto b) noexcept { return ((std::isnan(
 // clang-format on
 
 static inline bool
-cdo_cmpstr(const char *x, const char *y)
-{
-  return (strcmp(x, y) == 0);
-}
-
-static inline bool
-cdo_cmpstr(std::string_view lhs, const std::string &rhs)
+cdo_cmpstr(std::string_view lhs, std::string_view rhs)
 {
   return (lhs.compare(rhs) == 0);
 }
diff --git a/src/grid_from_name.cc b/src/grid_from_name.cc
index d4da98ec6..9e3492fab 100644
--- a/src/grid_from_name.cc
+++ b/src/grid_from_name.cc
@@ -533,15 +533,15 @@ generate_grid_gaussian(GridDesciption &grid, std::string gridname)
 
       if (gridname.size())
         {
-          int intVal = 0;
+          int intValue = 0;
           std::vector<char> typeString(gridname.size(), 0);
-          auto numVals = sscanf(gridname.c_str(), "%d%s", &intVal, typeString.data());
+          auto numValues = sscanf(gridname.c_str(), "%d%s", &intValue, typeString.data());
           // printf("%s: %d %d%s\n", gridname.c_str(), numVals, intVal, typeString.data());
 
-          if (numVals <= 0 || numVals > 2) return;
-          if (intVal < 0) return;
+          if (numValues <= 0 || numValues > 2) return;
+          if (intValue < 0) return;
 
-          grid.ntr = intVal;
+          grid.ntr = intValue;
           // clang-format off
           if      (cdo_cmpstr(typeString.data(), "grid")) grid.type = GRID_GAUSSIAN;
           else if (cdo_cmpstr(typeString.data(), "zon"))  grid.type = GRID_GAUSSIAN;
-- 
GitLab


From 082de0752600d198b4a46957f456139bec4e45ce Mon Sep 17 00:00:00 2001
From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de>
Date: Wed, 26 Feb 2025 10:36:49 +0100
Subject: [PATCH 2/2] include csdtio

---
 src/Eofcoeff3d.cc | 82 +++++++++++++++++++++++------------------------
 src/statistic.cc  |  1 +
 2 files changed, 41 insertions(+), 42 deletions(-)

diff --git a/src/Eofcoeff3d.cc b/src/Eofcoeff3d.cc
index 576138b0a..bfc89bb90 100644
--- a/src/Eofcoeff3d.cc
+++ b/src/Eofcoeff3d.cc
@@ -36,7 +36,6 @@ public:
   inline static RegisterEntry<Eofcoeff3d> registration = RegisterEntry<Eofcoeff3d>(module);
 
   double missval1 = -999, missval2 = -999;
-  int varID, levelID;
   int numFields;
 
   CdoStreamID streamID1;
@@ -63,8 +62,6 @@ public:
 
   std::vector<CdoStreamID> streamIDs;
 
-  int eofID = 0;
-
 public:
   void
   init() override
@@ -98,36 +95,39 @@ public:
     fileSuffix = FileUtils::gen_suffix(cdo_inq_filetype(streamID1), vlistID1, cdo_get_stream_name(0));
 
     eof = FieldVector3D(numVars);
-    for (varID = 0; varID < numVars; ++varID) eof[varID].resize(numLevels);
+    for (int varID = 0; varID < numVars; ++varID) eof[varID].resize(numLevels);
   }
 
   void
   run() override
   {
-    while (1)
-      {
-        numFields = cdo_stream_inq_timestep(streamID1, eofID);
-        if (numFields == 0) break;
-
-        for (int fieldID = 0; fieldID < numFields; ++fieldID)
-          {
-            cdo_inq_field(streamID1, &varID, &levelID);
-            missval1 = varList1.vars[varID].missval;
-            eof[varID][levelID].resize((eofID == 0) ? 1 : eofID + 1);
-            eof[varID][levelID][eofID].grid = gridID1;
-            eof[varID][levelID][eofID].missval = missval1;
-            eof[varID][levelID][eofID].resize(gridsize);
-            ranges::fill(eof[varID][levelID][eofID].vec_d, missval1);
-
-            if (varID >= numVars) cdo_abort("Internal error - varID >= nvars");
-            if (levelID >= numLevels) cdo_abort("Internal error - levelID >= nlevs");
-
-            cdo_read_field(streamID1, eof[varID][levelID][eofID]);
-          }
-        eofID++;
-      }
+    {
+      int eofID = 0;
+      while (1)
+        {
+          numFields = cdo_stream_inq_timestep(streamID1, eofID);
+          if (numFields == 0) break;
+
+          for (int fieldID = 0; fieldID < numFields; ++fieldID)
+            {
+              auto [varID, levelID] = cdo_inq_field(streamID1);
+              missval1 = varList1.vars[varID].missval;
+              eof[varID][levelID].resize((eofID == 0) ? 1 : eofID + 1);
+              eof[varID][levelID][eofID].grid = gridID1;
+              eof[varID][levelID][eofID].missval = missval1;
+              eof[varID][levelID][eofID].resize(gridsize);
+              ranges::fill(eof[varID][levelID][eofID].vec_d, missval1);
+
+              if (varID >= numVars) cdo_abort("Internal error - varID >= nvars");
+              if (levelID >= numLevels) cdo_abort("Internal error - levelID >= nlevs");
+
+              cdo_read_field(streamID1, eof[varID][levelID][eofID]);
+            }
+          eofID++;
+        }
 
-    neof = eofID;
+      neof = eofID;
+    }
 
     if (Options::cdoVerbose) cdo_print("%s contains %i eof's", cdo_get_stream_name(0), neof);
     // Create 1x1 Grid for output
@@ -156,12 +156,12 @@ public:
     for (int i = 0; i < numZaxes; ++i) vlistChangeZaxisIndex(vlistID3, i, zaxisID3);
 
     vlistDefTaxis(vlistID3, taxisID3);
-    for (varID = 0; varID < numVars; ++varID) vlistDefVarTimetype(vlistID3, varID, TIME_VARYING);
+    for (int varID = 0; varID < numVars; ++varID) vlistDefVarTimetype(vlistID3, varID, TIME_VARYING);
 
     // open streams for eofcoeff output
 
     streamIDs = std::vector<CdoStreamID>(neof);
-    for (eofID = 0; eofID < neof; eofID++)
+    for (int eofID = 0; eofID < neof; eofID++)
       {
         auto fileName = cdo_get_obase() + string_format("%5.5i", eofID);
         if (fileSuffix.size() > 0) fileName += fileSuffix;
@@ -179,10 +179,10 @@ public:
     in.resize(gridsize);
     in.grid = gridID1;
     FieldVector2D out(numVars);
-    for (varID = 0; varID < numVars; ++varID)
+    for (int varID = 0; varID < numVars; ++varID)
       {
         out[varID].resize(neof);
-        for (eofID = 0; eofID < neof; eofID++)
+        for (int eofID = 0; eofID < neof; eofID++)
           {
             out[varID][eofID].missval = missval1;
             out[varID][eofID].numMissVals = 0;
@@ -196,8 +196,8 @@ public:
         numFields = cdo_stream_inq_timestep(streamID2, tsID);
         if (numFields == 0) break;
 
-        for (varID = 0; varID < numVars; ++varID)
-          for (eofID = 0; eofID < neof; eofID++)
+        for (int varID = 0; varID < numVars; ++varID)
+          for (int eofID = 0; eofID < neof; eofID++)
             {
               out[varID][eofID].vec_d[0] = 0;
               out[varID][eofID].grid = gridID3;
@@ -208,16 +208,15 @@ public:
 
         for (int fieldID = 0; fieldID < numFields; ++fieldID)
           {
-            cdo_inq_field(streamID2, &varID, &levelID);
+            auto [varID, levelID] = cdo_inq_field(streamID2);
             cdo_read_field(streamID2, in);
             missval2 = varList2.vars[varID].missval;
 
-            size_t numMissVals;
-            for (eofID = 0; eofID < neof; eofID++)
+            for (int eofID = 0; eofID < neof; eofID++)
               {
                 if (fieldID == 0) cdo_def_timestep(streamIDs[eofID], tsID);
 
-                numMissVals = 0;
+                // size_t numMissVals = 0;
                 for (size_t i = 0; i < gridsize; ++i)
                   {
                     if (!fp_is_equal(in.vec_d[i], missval2) && !fp_is_equal(eof[varID][levelID][eofID].vec_d[i], missval1))
@@ -225,8 +224,7 @@ public:
                         // out[varID][eofID].vec_d[0] += w[i]*in.vec_d[i]*eof[varID][levelID][eofID].vec_d[i];
                         out[varID][eofID].vec_d[0] += in.vec_d[i] * eof[varID][levelID][eofID].vec_d[i];
                       }
-                    else
-                      numMissVals += 1;
+                    // else { numMissVals += 1; }
                   }
                 /*
                 if ( numMissVals ) {
@@ -240,9 +238,9 @@ public:
             if (levelID >= numLevels) cdo_abort("Internal error - levelID >= nlevs");
           }
 
-        for (eofID = 0; eofID < neof; eofID++)
+        for (int eofID = 0; eofID < neof; eofID++)
           {
-            for (varID = 0; varID < numVars; ++varID)
+            for (int varID = 0; varID < numVars; ++varID)
               {
                 cdo_def_field(streamIDs[eofID], varID, 0);
                 cdo_write_field(streamIDs[eofID], out[varID][eofID]);
@@ -256,7 +254,7 @@ public:
   void
   close() override
   {
-    for (eofID = 0; eofID < neof; eofID++) cdo_stream_close(streamIDs[eofID]);
+    for (int eofID = 0; eofID < neof; eofID++) cdo_stream_close(streamIDs[eofID]);
 
     cdo_stream_close(streamID2);
     cdo_stream_close(streamID1);
diff --git a/src/statistic.cc b/src/statistic.cc
index f3aabbe3e..3e13208e9 100644
--- a/src/statistic.cc
+++ b/src/statistic.cc
@@ -2,6 +2,7 @@
 
 #include <cfloat>
 #include <cmath>
+#include <cstdio>
 
 #include "compare.h"
 #include "statistic.h"
-- 
GitLab