diff --git a/src/Info.cc b/src/Info.cc index 01954583def41b700b1b81fc6afcb38d3ba53862..8c948733e7b17379e9f371193d658ae51b9619c8 100644 --- a/src/Info.cc +++ b/src/Info.cc @@ -310,13 +310,15 @@ compute_stat_real(const Field &field, InfoStat &infoStat, size_t &imiss, size_t { if (infoStat.numMissVals) { - auto nvals = field_min_max_sum_mv(field, infoStat.min, infoStat.max, infoStat.sum); - imiss = gridsize - nvals; - infoStat.numVals += nvals; + auto numVals = field_min_max_sum_mv(field, infoStat.min, infoStat.max, infoStat.sum); + imiss = gridsize - numVals; + infoStat.numVals += numVals; } else if (gridsize == 1) { infoStat.sum = (infoStat.numVals == 0) ? field[0] : infoStat.sum + field[0]; + infoStat.min = (infoStat.numVals == 0) ? field[0] : std::min(infoStat.min, field[0]); + infoStat.max = (infoStat.numVals == 0) ? field[0] : std::max(infoStat.max, field[0]); infoStat.numVals += 1; } else @@ -380,13 +382,13 @@ print_xinfo(int numSteps, CdoVar const &var, InfoStat const &infoStat) } static void -print_info(int indg, int levelID, CdiDateTime const &vDateTime, CdoVar const &var, int operfunc, bool lvinfo, +print_info(int setNum, int levelID, CdiDateTime const &vDateTime, CdoVar const &var, int operfunc, bool lvinfo, InfoStat const &infoStat) { char paramstr[32]; cdiParamToString(var.param, paramstr, sizeof(paramstr)); - fprintf(stdout, "%6d :", indg); + fprintf(stdout, "%6d :", setNum); auto vdateString = date_to_string(vDateTime.date); auto vtimeString = time_to_string(vDateTime.time); @@ -427,10 +429,10 @@ print_info(int indg, int levelID, CdiDateTime const &vDateTime, CdoVar const &va } static void -info(Field &field, int indg, int indf, int levelID, CdiDateTime vDateTime, CdoVar &var, int operfunc, bool printMap, bool lvinfo, - bool lcinfo, InfoStat &infoStat) +info(Field &field, int setNum, int streamIndex, int levelID, CdiDateTime vDateTime, CdoVar &var, int operfunc, bool printMap, + bool lvinfo, bool lcinfo, InfoStat &infoStat) { - if (printMap) print_header(-(indf + 1), lvinfo, operfunc); + if (printMap) print_header(-(streamIndex + 1), lvinfo, operfunc); auto numMissVals = field.numMissVals; auto loutput = (not lvinfo and not lcinfo); @@ -455,7 +457,7 @@ info(Field &field, int indg, int indf, int levelID, CdiDateTime vDateTime, CdoVa else compute_stat_comp(field, infoStat, imiss, var.gridsize); // clang-format on - if (loutput) print_info(indg, levelID, vDateTime, var, operfunc, lvinfo, infoStat); + if (loutput) print_info(setNum, levelID, vDateTime, var, operfunc, lvinfo, infoStat); if (imiss != numMissVals && numMissVals) cdo_warning("Found %zu of %zu missing values (%s)!", imiss, numMissVals, var.name); @@ -530,9 +532,9 @@ public: int numSets = 0; auto numStreams = cdo_stream_cnt(); - for (int indf = 0; indf < numStreams; indf++) + for (int streamIndex = 0; streamIndex < numStreams; streamIndex++) { - auto streamID = cdo_open_read(indf); + auto streamID = cdo_open_read(streamIndex); auto vlistID = cdo_stream_inq_vlist(streamID); auto taxisID = vlistInqTaxis(vlistID); @@ -541,19 +543,19 @@ public: if (numVars == 0) continue; auto runAsync = (Options::CDO_Async_Read > 0); - auto task = runAsync ? std::make_unique<WorkerThread>() : nullptr; + auto workerThread = runAsync ? std::make_unique<WorkerThread>() : nullptr; auto numTasks = runAsync ? 2 : 1; - FieldVector fieldVector(numTasks); + Field fieldVector[2]; std::vector<InfoStat> infoStatList(numVars); if (lcinfo) - print_xheader(-(indf + 1)); - else if (not printMap) - print_header(-(indf + 1), lvinfo, operfunc); + for (auto &infoStat : infoStatList) infostat_init(infoStat); if (lcinfo) - for (auto &infoStat : infoStatList) infostat_init(infoStat); + print_xheader(-(streamIndex + 1)); + else if (not printMap) + print_header(-(streamIndex + 1), lvinfo, operfunc); numSets = 0; int tsID = 0; @@ -565,7 +567,10 @@ public: auto vDateTime = taxisInqVdatetime(taxisID); if (not lcinfo) - for (auto &infoStat : infoStatList) infostat_init(infoStat); + { + if (numFields == 1 && runAsync && numSets > 0) { workerThread->wait(); } + for (auto &infoStat : infoStatList) infostat_init(infoStat); + } for (int fieldID = 0; fieldID < numFields; ++fieldID) { @@ -576,20 +581,21 @@ public: field.init(var); cdo_read_field(streamID, field); - if (runAsync && numSets > 0) { task->wait(); } + if (runAsync && numSets > 0) { workerThread->wait(); } numSets = lvinfo ? varID + 1 : numSets + 1; - std::function<void()> info_func = std::bind(info, std::ref(field), numSets, indf, levelID, vDateTime, std::ref(var), - operfunc, printMap, lvinfo, lcinfo, std::ref(infoStatList[varID])); + std::function<void()> info_task + = std::bind(info, std::ref(field), numSets, streamIndex, levelID, vDateTime, std::ref(var), operfunc, printMap, + lvinfo, lcinfo, std::ref(infoStatList[varID])); - runAsync ? task->doAsync(info_func) : info_func(); + runAsync ? workerThread->doAsync(info_task) : info_task(); } tsID++; } - if (runAsync) task->wait(); + if (runAsync) workerThread->wait(); cdo_stream_close(streamID); diff --git a/src/Vertintgh.cc b/src/Vertintgh.cc index 30f4522e824711a21b8c7fa81556e0b8f35f04f4..d04ed1f5b086e1248df7a82ba7c61979f37abc8a 100644 --- a/src/Vertintgh.cc +++ b/src/Vertintgh.cc @@ -193,9 +193,9 @@ public: for (int index = 0; index < numZaxes; ++index) { auto zaxisID = vlistZaxis(vlistID1, index); - auto nlevels = zaxisInqSize(zaxisID); + auto numLevels = zaxisInqSize(zaxisID); if (zaxisID == zaxisID_FL || zaxisID == zaxisID_HL - || (is_height_axis(zaxisID) && (nlevels == numHalfLevels || nlevels == numFullLevels))) + || (is_height_axis(zaxisID) && (numLevels == numHalfLevels || numLevels == numFullLevels))) vlistChangeZaxis(vlistID2, zaxisID, zaxisID2); } @@ -345,7 +345,7 @@ public: { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, interpVars[varID] ? vardata2[varID] : vardata1[varID], levelID, - varnumMissVals[varID][levelID]); + varnumMissVals[varID][levelID]); } } }