Skip to content
Snippets Groups Projects
Commit 8820928d authored by Uwe Schulzweida's avatar Uwe Schulzweida
Browse files

Info: changed to Task::doAsync()

parent 10679db3
No related branches found
No related tags found
1 merge request!221M214003/develop
Pipeline #65638 passed
Subproject commit bf80cda5dd36439aedbdc4d91cfdf81d15b00352
Subproject commit 3077cc81a21f7f5f2e1365ed600468807394d4c0
......@@ -333,6 +333,97 @@ print_stat_comp(const InfoStat &infoStat)
fprintf(stdout, " - (%#12.5g,%#12.5g) -", arrmean_r, arrmean_i);
}
static void
info(const Field &field, int indg, int indf, int tsID, int recID, int levelID, CdiDateTime vDateTime, const CdoVar &var,
int operfunc, bool printMap, bool lvinfo, InfoStat &infoStat)
{
if ((tsID == 0 && recID == 0) || printMap) print_header(-(indf + 1), lvinfo, operfunc);
auto numMissVals = field.numMissVals;
auto loutput = !lvinfo;
if (loutput) infostat_init(infoStat);
infoStat.nlevels += 1;
infoStat.numMissVals += numMissVals;
if (var.nlevels == infoStat.nlevels) loutput = true;
char paramstr[32];
if (loutput)
{
cdiParamToString(var.param, paramstr, sizeof(paramstr));
fprintf(stdout, "%6d ", indg);
fprintf(stdout, ":");
auto vdateString = date_to_string(vDateTime.date);
auto vtimeString = time_to_string(vDateTime.time);
set_text_color(stdout, MAGENTA);
fprintf(stdout, "%s %s ", vdateString.c_str(), vtimeString.c_str());
reset_text_color(stdout);
set_text_color(stdout, GREEN);
if (lvinfo)
fprintf(stdout, "%7d ", var.nlevels);
else
fprintf(stdout, "%7g ", cdo_zaxis_inq_level(var.zaxisID, levelID));
fprintf(stdout, "%8zu %7zu ", var.gridsize, infoStat.numMissVals);
reset_text_color(stdout);
fprintf(stdout, ":");
set_text_color(stdout, BLUE);
}
size_t imiss = 0;
// clang-format off
if (var.nwpv == CDI_REAL) compute_stat_real(field, infoStat, imiss, var.gridsize);
else compute_stat_comp(field, infoStat, imiss, var.gridsize);
// clang-format on
if (loutput)
{
// clang-format off
if (var.nwpv == CDI_REAL) print_stat_real(infoStat);
else print_stat_comp(infoStat);
// clang-format on
reset_text_color(stdout);
fprintf(stdout, " : ");
// set_text_color(stdout, GREEN);
// clang-format off
if (operfunc == Func_Name) fprintf(stdout, "%-14s", var.name.c_str());
else if (operfunc == Func_Code) fprintf(stdout, "%4d ", var.code);
else fprintf(stdout, "%-14s", paramstr);
// clang-format on
// reset_text_color(stdout);
fprintf(stdout, "\n");
}
if (imiss != numMissVals && numMissVals) cdo_warning("Found %zu of %zu missing values!", imiss, numMissVals);
if (printMap)
{
auto gridID = var.gridID;
auto gridtype = var.gridType;
auto nlon = gridInqXsize(gridID);
auto nlat = gridInqYsize(gridID);
if (gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT || gridtype == GRID_CURVILINEAR
|| (gridtype == GRID_GENERIC && nlon * nlat == var.gridsize && nlon < 2048))
{
print_map(nlon, nlat, field, infoStat);
}
}
}
class Info : public Process
{
public:
......@@ -379,149 +470,6 @@ public:
lvinfo = (operatorID == VINFON || operatorID == XINFON);
}
struct FuncArgs
{
FieldVector &fieldVector;
std::vector<InfoStat> &infoStatList;
int operfunc;
bool printMap{ false };
bool lvinfo{ false };
int t{ 0 };
int indg{ 0 };
int indf{ 0 };
int tsID{ 0 };
int recID{ 0 };
int varID{ 0 };
int levelID{ 0 };
CdoVar var;
CdiDateTime vDateTime{};
FuncArgs(FieldVector &_fieldVector, std::vector<InfoStat> &_infoStatList, int _operfunc, bool _printMap, bool _lvinfo)
: fieldVector(_fieldVector), infoStatList(_infoStatList), operfunc(_operfunc), printMap(_printMap), lvinfo(_lvinfo)
{
}
void
set(int _t, int _indg, int _indf, int _tsID, int _recID, int _varID, int _levelID, const CdoVar &_var, CdiDateTime _vDateTime)
{
t = _t;
indg = _indg;
indf = _indf;
tsID = _tsID;
recID = _recID;
varID = _varID;
levelID = _levelID;
var = _var;
vDateTime = _vDateTime;
}
};
static void *
info(void *_args)
{
FuncArgs *args = (FuncArgs *) _args;
auto &field = args->fieldVector[args->t];
auto indg = args->indg;
auto indf = args->indf;
auto tsID = args->tsID;
auto recID = args->recID;
auto varID = args->varID;
auto levelID = args->levelID;
auto &var = args->var;
auto &infoStat = args->infoStatList[varID];
auto operfunc = args->operfunc;
auto printMap = args->printMap;
auto lvinfo = args->lvinfo;
if ((tsID == 0 && recID == 0) || printMap) print_header(-(indf + 1), lvinfo, operfunc);
auto numMissVals = field.numMissVals;
auto loutput = !lvinfo;
if (loutput) infostat_init(infoStat);
infoStat.nlevels += 1;
infoStat.numMissVals += numMissVals;
if (var.nlevels == infoStat.nlevels) loutput = true;
char paramstr[32];
if (loutput)
{
cdiParamToString(var.param, paramstr, sizeof(paramstr));
fprintf(stdout, "%6d ", indg);
fprintf(stdout, ":");
auto vdateString = date_to_string(args->vDateTime.date);
auto vtimeString = time_to_string(args->vDateTime.time);
set_text_color(stdout, MAGENTA);
fprintf(stdout, "%s %s ", vdateString.c_str(), vtimeString.c_str());
reset_text_color(stdout);
set_text_color(stdout, GREEN);
if (lvinfo)
fprintf(stdout, "%7d ", var.nlevels);
else
fprintf(stdout, "%7g ", cdo_zaxis_inq_level(var.zaxisID, levelID));
fprintf(stdout, "%8zu %7zu ", var.gridsize, infoStat.numMissVals);
reset_text_color(stdout);
fprintf(stdout, ":");
set_text_color(stdout, BLUE);
}
size_t imiss = 0;
// clang-format off
if (var.nwpv == CDI_REAL) compute_stat_real(field, infoStat, imiss, var.gridsize);
else compute_stat_comp(field, infoStat, imiss, var.gridsize);
// clang-format on
if (loutput)
{
// clang-format off
if (var.nwpv == CDI_REAL) print_stat_real(infoStat);
else print_stat_comp(infoStat);
// clang-format on
reset_text_color(stdout);
fprintf(stdout, " : ");
// set_text_color(stdout, GREEN);
// clang-format off
if (operfunc == Func_Name) fprintf(stdout, "%-14s", var.name.c_str());
else if (operfunc == Func_Code) fprintf(stdout, "%4d ", var.code);
else fprintf(stdout, "%-14s", paramstr);
// clang-format on
// reset_text_color(stdout);
fprintf(stdout, "\n");
}
if (imiss != numMissVals && numMissVals) cdo_warning("Found %zu of %zu missing values!", imiss, numMissVals);
if (printMap)
{
auto gridID = var.gridID;
auto gridtype = var.gridType;
auto nlon = gridInqXsize(gridID);
auto nlat = gridInqYsize(gridID);
if (gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT || gridtype == GRID_CURVILINEAR
|| (gridtype == GRID_GENERIC && nlon * nlat == gridInqSize(gridID) && nlon < 1024))
{
print_map(nlon, nlat, field, infoStat);
}
}
return nullptr;
}
void
run() override
{
......@@ -545,8 +493,6 @@ public:
FieldVector fieldVector(numTasks);
std::vector<InfoStat> infoStatList(numVars);
FuncArgs funcArgs(fieldVector, infoStatList, operfunc, printMap, lvinfo);
numSets = 0;
int tsID = 0;
while (true)
......@@ -567,20 +513,15 @@ public:
field.init(var);
cdo_read_record(streamID, field);
if (runAsync)
{
if (numSets > 0) { task.wait(); }
if (runAsync && numSets > 0) { task.wait(); }
numSets = lvinfo ? varID + 1 : numSets + 1;
funcArgs.set(taskNum, numSets, indf, tsID, recID, varID, levelID, var, vDateTime);
task.start(info, &funcArgs);
}
else
{
numSets = lvinfo ? varID + 1 : numSets + 1;
funcArgs.set(taskNum, numSets, indf, tsID, recID, varID, levelID, var, vDateTime);
info(&funcArgs);
}
numSets = lvinfo ? varID + 1 : numSets + 1;
std::function<void()> info_func
= std::bind(info, std::cref(field), numSets, indf, tsID, recID, levelID, vDateTime, std::cref(var), operfunc,
printMap, lvinfo, std::ref(infoStatList[varID]));
runAsync ? task.doAsync(info_func) : info_func();
}
tsID++;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment