diff --git a/ChangeLog b/ChangeLog index 9ccd37de40760eacd84c5a96fca4e1f48cbc4fea..98bd5bdd28da7ad10f425b3a0da5dd94f381b304 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2024-10-14 Uwe Schulzweida + + * Diff: added check for NANs + 2024-10-01 Uwe Schulzweida * ydrunpctl: parameter pm=r8 failed (bug fix) diff --git a/src/Diff.cc b/src/Diff.cc index e1999ae8cfad8172b7866db65f786ea39d213c93..71e3c5e90b493a7d969328fcddffd539ec5728d7 100644 --- a/src/Diff.cc +++ b/src/Diff.cc @@ -20,6 +20,7 @@ #include "cdo_task.h" #include "process_int.h" #include "mpmo_color.h" +#include "cdo_math.h" #include "cdo_options.h" #include "printinfo.h" #include "cdo_zaxis.h" @@ -241,9 +242,22 @@ print_header2(int operfunc, DiffParam ¶ms) } static void -compare_fields(const Field &field1, const Field &field2, int recordNumber, const CdoVar &var, int levelID, int operfunc, - CdiDateTime vDateTime, DiffParam ¶ms, bool operfunc2) +compare_fields(Field &field1, Field &field2, int recordNumber, const CdoVar &var, int levelID, int operfunc, CdiDateTime vDateTime, + DiffParam ¶ms, bool operfunc2) { + size_t numNANs1 = std::isnan(field1.missval) ? 0 : field_num_NANs(field1); + if (numNANs1 && field1.numMissVals == 0) + { + field1.missval = cdo::NaN(); + field1.numMissVals = numNANs1; + } + size_t numNANs2 = std::isnan(field2.missval) ? 0 : field_num_NANs(field2); + if (numNANs2 && field2.numMissVals == 0) + { + field2.missval = cdo::NaN(); + field2.numMissVals = numNANs2; + } + auto dr = (operfunc2 == 0) ? diff(var.gridsize, field1, field2) : diff2(var.gridsize, field1, field2); auto checkRelativeLimit = true; @@ -292,6 +306,15 @@ compare_fields(const Field &field1, const Field &field2, int recordNumber, const if (dr.absm > params.absLimit || (checkRelativeLimit && dr.relm >= params.relLimit)) params.numDiffRecords++; if (dr.absm > params.absLimit2 || (checkRelativeLimit && dr.relm >= params.relLimit)) params.numDiffRecords2++; + + if (numNANs1) + cdo_warning("Found %zu NaNs in infile1 which are not treated as missing values. This can lead to incorrect CDO results in all " + "other arithmetic functions!", + numNANs1); + if (numNANs2) + cdo_warning("Found %zu NaNs in infile2 which are not treated as missing values. This can lead to incorrect CDO results in all " + "other arithmetic functions!", + numNANs2); } class Diff : public Process @@ -440,7 +463,7 @@ public: } std::function<void()> compare_fields_func - = std::bind(compare_fields, std::cref(field1), std::cref(field2), numSets + 1, std::cref(var1), levelID, operfunc, + = std::bind(compare_fields, std::ref(field1), std::ref(field2), numSets + 1, std::cref(var1), levelID, operfunc, vDateTime, std::ref(params), operfunc2); runAsync ? task->doAsync(compare_fields_func) : compare_fields_func(); diff --git a/src/Info.cc b/src/Info.cc index ae99bb969da06220de0f13fc9335a5295ec3e8b0..ac937b5958e03eeaa8152bfa1462753440e40ebb 100644 --- a/src/Info.cc +++ b/src/Info.cc @@ -407,7 +407,7 @@ info(Field &field, int indg, int indf, int tsID, int recID, int levelID, CdiDate } if (numNANs) - cdo_warning("Found %zu NAN values which are not treated as missing values. This can lead to incorrect CDO results in all " + cdo_warning("Found %zu NaNs which are not treated as missing values. This can lead to incorrect CDO results in all " "other arithmetic functions!", numNANs); if (imiss != numMissVals && numMissVals) cdo_warning("Found %zu of %zu missing values!", imiss, numMissVals);