From 09e1eea45ea5717bd4ea0faa764740047c65cda9 Mon Sep 17 00:00:00 2001
From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de>
Date: Mon, 17 Mar 2025 13:51:51 +0100
Subject: [PATCH] Detrend: failed if missing_value is between 0 and numSteps
 (bug fix)

---
 ChangeLog          | 2 +-
 NEWS               | 5 +++++
 src/Detrend.cc     | 8 ++++----
 src/Trend.cc       | 4 ++--
 src/field_trend.cc | 6 +++---
 5 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 449802dd9..211f29c28 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,6 @@
 2025-03-15  Uwe Schulzweida
 
-	* timpctl: Missing error handling for CDO_PCTL_NBINS>32768 (bug fix)
+	* timpctl: Short integer overflow for CDO_PCTL_NBINS>32768 (bug fix)
 
 2025-03-14  Uwe Schulzweida
 
diff --git a/NEWS b/NEWS
index ef15a1a5a..c27aea57a 100644
--- a/NEWS
+++ b/NEWS
@@ -3,11 +3,16 @@ CDO NEWS
 
 Improvement
 
+Version 2.5.2 (15 Mar 2025):
+
    New features:
      * option --chunkspec to define chunkSize of t and z dimension
    New operators:
      * air_density
      * setchunkspec - Specify chunking
+   Fixed bugs:
+     * timpctl: Short integer overflow for CDO_PCTL_NBINS>32768
+     * enable-hirlam-extensions failed since release 2.5.1
 
 Version 2.5.1 (5 Mar 2025):
 
diff --git a/src/Detrend.cc b/src/Detrend.cc
index c6043e01a..89a1d300f 100644
--- a/src/Detrend.cc
+++ b/src/Detrend.cc
@@ -129,11 +129,11 @@ public:
             auto const &zn = work[4][varID][levelID].vec_d;
 
             auto trend_kernel = [&](auto i, auto is_EQ) {
-              auto temp1 = SUBM(sumjx[i], DIVM(MULM(sumj[i], sumx[i]), zn[i]));
-              auto temp2 = SUBM(sumjj[i], DIVM(MULM(sumj[i], sumj[i]), zn[i]));
+              auto temp1 = SUBM(sumjx[i], DIVX(MULM(sumj[i], sumx[i]), zn[i]));
+              auto temp2 = SUBM(sumjj[i], DIVX(MULM(sumj[i], sumj[i]), zn[i]));
               auto temp3 = DIVM(temp1, temp2);
 
-              paramA[i] = SUBM(DIVM(sumx[i], zn[i]), MULM(DIVM(sumj[i], zn[i]), temp3));
+              paramA[i] = SUBM(DIVX(sumx[i], zn[i]), MULM(DIVX(sumj[i], zn[i]), temp3));
               paramB[i] = temp3;
             };
 
@@ -146,7 +146,7 @@ public:
   }
 
   static void
-  vars_sub_trend(FieldVector3D &work, FieldVector2D &varsData, const VarList &varList, double zj)
+  vars_sub_trend(FieldVector3D &work, FieldVector2D &varsData, VarList const &varList, double zj)
   {
     auto numVars = varList.numVars();
     for (int varID = 0; varID < numVars; ++varID)
diff --git a/src/Trend.cc b/src/Trend.cc
index 9c9099163..ea2badeb0 100644
--- a/src/Trend.cc
+++ b/src/Trend.cc
@@ -123,7 +123,7 @@ public:
   }
 
   void
-  write_output(const FieldVector3D &work)
+  write_output(FieldVector3D const &work)
   {
     Field field2, field3;
 
@@ -198,7 +198,7 @@ public:
   }
 
   static void
-  fields_calc_trend_sum(FieldVector3D &work, const FieldVector2D &fields2D, const std::vector<FieldInfo> &fieldInfoList,
+  fields_calc_trend_sum(FieldVector3D &work, FieldVector2D const &fields2D, std::vector<FieldInfo> const &fieldInfoList,
                         double zj) noexcept
   {
     for (auto const &fieldInfo : fieldInfoList)
diff --git a/src/field_trend.cc b/src/field_trend.cc
index 9155952d0..a1da6d78d 100644
--- a/src/field_trend.cc
+++ b/src/field_trend.cc
@@ -99,11 +99,11 @@ calc_trend_param(const FieldVector3D &work, Field &paramA, Field &paramB, int va
   auto const &zn = work[4][varID][levelID].vec_d;
 
   auto trend_kernel = [&](auto i, auto is_EQ) {
-    auto temp1 = SUBM(sumjx[i], DIVM(MULM(sumj[i], sumx[i]), zn[i]));
-    auto temp2 = SUBM(sumjj[i], DIVM(MULM(sumj[i], sumj[i]), zn[i]));
+    auto temp1 = SUBM(sumjx[i], DIVX(MULM(sumj[i], sumx[i]), zn[i]));
+    auto temp2 = SUBM(sumjj[i], DIVX(MULM(sumj[i], sumj[i]), zn[i]));
     auto temp3 = DIVM(temp1, temp2);
 
-    paramA.vec_d[i] = SUBM(DIVM(sumx[i], zn[i]), MULM(DIVM(sumj[i], zn[i]), temp3));
+    paramA.vec_d[i] = SUBM(DIVX(sumx[i], zn[i]), MULM(DIVX(sumj[i], zn[i]), temp3));
     paramB.vec_d[i] = temp3;
   };
 
-- 
GitLab