From 2027967ac80c5ab2c4105d323767d189f7da65bf Mon Sep 17 00:00:00 2001
From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de>
Date: Wed, 28 Jun 2023 13:55:53 +0200
Subject: [PATCH] Varsstat::set_attributes(): define missval

---
 src/Varsstat.cc | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/src/Varsstat.cc b/src/Varsstat.cc
index 57cd75c79..f4d2d72c7 100644
--- a/src/Varsstat.cc
+++ b/src/Varsstat.cc
@@ -11,7 +11,7 @@
 #include "field_functions.h"
 
 static void
-checkUniqueZaxis(int vlistID)
+check_unique_zaxis(int vlistID)
 {
   auto nzaxis = vlistNzaxis(vlistID);
   auto zaxisID = vlistZaxis(vlistID, 0);
@@ -23,7 +23,7 @@ checkUniqueZaxis(int vlistID)
 }
 
 static void
-checkUniqueGridsize(int vlistID)
+check_unique_gridsize(int vlistID)
 {
   auto ngrids = vlistNgrids(vlistID);
   auto gridID = vlistGrid(vlistID, 0);
@@ -35,13 +35,13 @@ checkUniqueGridsize(int vlistID)
 }
 
 static void
-setAttributes(const VarList &varList1, int vlistID2, int varID2, int operatorID)
+set_attributes(const VarList &varList1, int vlistID2, int varID2, int operatorID)
 {
   const auto &var0 = varList1[0];
   auto paramIsEqual = true;
   auto name = var0.name;
   auto param = var0.param;
-  const int nvars = varList1.size();
+  int nvars = varList1.size();
   for (int varID = 1; varID < nvars; ++varID)
     {
       if (param != varList1[varID].param || name != varList1[varID].name)
@@ -53,6 +53,8 @@ setAttributes(const VarList &varList1, int vlistID2, int varID2, int operatorID)
 
   if (!paramIsEqual) name = cdo_operator_name(operatorID);
   cdiDefKeyString(vlistID2, varID2, CDI_KEY_NAME, name.c_str());
+  vlistDefVarMissval(vlistID2, varID2, var0.missval);
+
   if (paramIsEqual)
     {
       if (param >= 0) vlistDefVarParam(vlistID2, varID2, param);
@@ -62,7 +64,7 @@ setAttributes(const VarList &varList1, int vlistID2, int varID2, int operatorID)
 }
 
 static void
-addOperators(void)
+add_operators(void)
 {
   // clang-format off
   cdo_operator_add("varsrange", FieldFunc_Range, 0, nullptr);
@@ -83,7 +85,7 @@ Varsstat(void *process)
 {
   cdo_initialize(process);
 
-  addOperators();
+  add_operators();
 
   auto operatorID = cdo_operator_id();
   auto operfunc = cdo_operator_f1(operatorID);
@@ -95,7 +97,7 @@ Varsstat(void *process)
   auto lstd = (operfunc == FieldFunc_Std || operfunc == FieldFunc_Std1);
   auto lvarstd = (lstd || operfunc == FieldFunc_Var || operfunc == FieldFunc_Var1);
   auto lvars2 = (lvarstd || lrange);
-  const int divisor = (operfunc == FieldFunc_Std1 || operfunc == FieldFunc_Var1);
+  int divisor = (operfunc == FieldFunc_Std1 || operfunc == FieldFunc_Var1);
 
   auto field2_stdvar_func = lstd ? field2_std : field2_var;
   auto fieldc_stdvar_func = lstd ? fieldc_std : fieldc_var;
@@ -106,11 +108,11 @@ Varsstat(void *process)
   VarList varList1;
   varListInit(varList1, vlistID1);
 
-  checkUniqueZaxis(vlistID1);
+  check_unique_zaxis(vlistID1);
   auto zaxisID = vlistZaxis(vlistID1, 0);
   auto nlevels = zaxisInqSize(zaxisID);
 
-  checkUniqueGridsize(vlistID1);
+  check_unique_gridsize(vlistID1);
   auto gridID = vlistGrid(vlistID1, 0);
   auto gridsize = gridInqSize(gridID);
 
@@ -125,7 +127,7 @@ Varsstat(void *process)
   vlistDefNtsteps(vlistID2, vlistNtsteps(vlistID1));
 
   auto varID2 = vlistDefVar(vlistID2, gridID, zaxisID, timetype);
-  setAttributes(varList1, vlistID2, varID2, operatorID);
+  set_attributes(varList1, vlistID2, varID2, operatorID);
 
   auto taxisID1 = vlistInqTaxis(vlistID1);
   auto taxisID2 = taxisDuplicate(taxisID1);
-- 
GitLab