Skip to content
Snippets Groups Projects
Commit 7672e64a authored by Oliver Heidmann's avatar Oliver Heidmann Committed by Uwe Schulzweida
Browse files

class rework Timselstat.cc

parent e6f9322c
No related branches found
No related tags found
1 merge request!96Develop
...@@ -45,219 +45,258 @@ addOperators(void) ...@@ -45,219 +45,258 @@ addOperators(void)
// clang-format on // clang-format on
} }
void * class ModuleTimselstat
Timselstat(void *process)
{ {
constexpr auto timestatDate{ TimeStat::MEAN };
cdo_initialize(process); CdoStreamID streamID1;
int taxisID1;
addOperators(); CdoStreamID streamID2;
int taxisID2;
auto operatorID = cdo_operator_id(); int noffset;
auto operfunc = cdo_operator_f1(operatorID); int ndates;
int nskip;
auto lrange = (operfunc == FieldFunc_Range); int operfunc;
auto lmean = (operfunc == FieldFunc_Mean || operfunc == FieldFunc_Avg); int maxrecs;
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);
auto field2_stdvar_func = lstd ? field2_std : field2_var; bool lrange;
auto fieldc_stdvar_func = lstd ? fieldc_std : fieldc_var; bool lmean;
bool lstd;
bool lvarstd;
bool lvars2;
int divisor;
operator_input_arg("numSets <noffset <nskip>>"); std::vector<RecordInfo> recList;
DateTimeList dtlist;
VarList varList;
Field field;
FieldVector2D samp1, vars1, vars2;
auto nargc = cdo_operator_argc(); public:
auto ndates = parameter_to_int(cdo_operator_argv(0)); void
auto noffset = (nargc > 1) ? parameter_to_int(cdo_operator_argv(1)) : 0; init(void *process)
auto nskip = (nargc > 2) ? parameter_to_int(cdo_operator_argv(2)) : 0; {
cdo_initialize(process);
if (Options::cdoVerbose) cdo_print("numSets = %d, noffset = %d, nskip = %d", ndates, noffset, nskip); addOperators();
auto streamID1 = cdo_open_read(0); auto operatorID = cdo_operator_id();
operfunc = cdo_operator_f1(operatorID);
auto vlistID1 = cdo_stream_inq_vlist(streamID1); lrange = (operfunc == FieldFunc_Range);
auto vlistID2 = vlistDuplicate(vlistID1); lmean = (operfunc == FieldFunc_Mean || operfunc == FieldFunc_Avg);
lstd = (operfunc == FieldFunc_Std || operfunc == FieldFunc_Std1);
lvarstd = (lstd || operfunc == FieldFunc_Var || operfunc == FieldFunc_Var1);
lvars2 = (lvarstd || lrange);
divisor = (operfunc == FieldFunc_Std1 || operfunc == FieldFunc_Var1);
auto taxisID1 = vlistInqTaxis(vlistID1); operator_input_arg("numSets <noffset <nskip>>");
auto taxisID2 = taxisDuplicate(taxisID1);
taxisWithBounds(taxisID2);
vlistDefTaxis(vlistID2, taxisID2);
auto streamID2 = cdo_open_write(1); auto nargc = cdo_operator_argc();
cdo_def_vlist(streamID2, vlistID2); ndates = parameter_to_int(cdo_operator_argv(0));
noffset = (nargc > 1) ? parameter_to_int(cdo_operator_argv(1)) : 0;
nskip = (nargc > 2) ? parameter_to_int(cdo_operator_argv(2)) : 0;
auto maxrecs = vlistNrecs(vlistID1); if (Options::cdoVerbose) cdo_print("numSets = %d, noffset = %d, nskip = %d", ndates, noffset, nskip);
std::vector<RecordInfo> recList(maxrecs);
DateTimeList dtlist; streamID1 = cdo_open_read(0);
dtlist.set_stat(timestatDate);
dtlist.set_calendar(taxisInqCalendar(taxisID1));
VarList varList; auto vlistID1 = cdo_stream_inq_vlist(streamID1);
varListInit(varList, vlistID1); auto vlistID2 = vlistDuplicate(vlistID1);
int VARS_MEMTYPE = 0; taxisID1 = vlistInqTaxis(vlistID1);
if ((operfunc == FieldFunc_Min) || (operfunc == FieldFunc_Max)) VARS_MEMTYPE = FIELD_NAT; taxisID2 = taxisDuplicate(taxisID1);
taxisWithBounds(taxisID2);
vlistDefTaxis(vlistID2, taxisID2);
Field field; streamID2 = cdo_open_write(1);
cdo_def_vlist(streamID2, vlistID2);
FieldVector2D samp1, vars1, vars2; maxrecs = vlistNrecs(vlistID1);
fields_from_vlist(vlistID1, samp1); recList = std::vector<RecordInfo>(maxrecs);
fields_from_vlist(vlistID1, vars1, FIELD_VEC | VARS_MEMTYPE);
if (lvars2) fields_from_vlist(vlistID1, vars2, FIELD_VEC); dtlist.set_stat(TimeStat::MEAN);
dtlist.set_calendar(taxisInqCalendar(taxisID1));
int tsID;
for (tsID = 0; tsID < noffset; ++tsID) varListInit(varList, vlistID1);
{
auto nrecs = cdo_stream_inq_timestep(streamID1, tsID); int VARS_MEMTYPE = 0;
if (nrecs == 0) break; if ((operfunc == FieldFunc_Min) || (operfunc == FieldFunc_Max)) VARS_MEMTYPE = FIELD_NAT;
for (int recID = 0; recID < nrecs; ++recID) fields_from_vlist(vlistID1, samp1);
{ fields_from_vlist(vlistID1, vars1, FIELD_VEC | VARS_MEMTYPE);
int varID, levelID; if (lvars2) fields_from_vlist(vlistID1, vars2, FIELD_VEC);
cdo_inq_record(streamID1, &varID, &levelID); }
void
if (tsID == 0) recList[recID].set(varID, levelID); run()
} {
}
auto field2_stdvar_func = lstd ? field2_std : field2_var;
int otsID = 0; auto fieldc_stdvar_func = lstd ? fieldc_std : fieldc_var;
if (tsID < noffset)
{ int tsID;
cdo_warning("noffset is larger than number of timesteps!"); for (tsID = 0; tsID < noffset; ++tsID)
goto LABEL_END; {
} auto nrecs = cdo_stream_inq_timestep(streamID1, tsID);
if (nrecs == 0) break;
while (true)
{ for (int recID = 0; recID < nrecs; ++recID)
int nrecs = 0; {
int numSets; int varID, levelID;
for (numSets = 0; numSets < ndates; numSets++) cdo_inq_record(streamID1, &varID, &levelID);
{
nrecs = cdo_stream_inq_timestep(streamID1, tsID);
if (nrecs == 0) break;
dtlist.taxis_inq_timestep(taxisID1, numSets);
for (int recID = 0; recID < nrecs; ++recID)
{
int varID, levelID;
cdo_inq_record(streamID1, &varID, &levelID);
if (tsID == 0) recList[recID].set(varID, levelID);
auto &rsamp1 = samp1[varID][levelID];
auto &rvars1 = vars1[varID][levelID];
if (numSets == 0)
{
cdo_read_record(streamID1, rvars1);
if (lrange)
{
vars2[varID][levelID].nmiss = rvars1.nmiss;
vars2[varID][levelID].vec_d = rvars1.vec_d;
}
if (rvars1.nmiss || !rsamp1.empty())
{
if (rsamp1.empty()) rsamp1.resize(rvars1.size);
field2_vinit(rsamp1, rvars1);
}
}
else
{
field.init(varList[varID]);
cdo_read_record(streamID1, field);
if (field.nmiss || !rsamp1.empty()) if (tsID == 0) recList[recID].set(varID, levelID);
{ }
if (rsamp1.empty()) rsamp1.resize(rvars1.size, numSets); }
field2_vincr(rsamp1, field);
}
// clang-format off int otsID = 0;
if (tsID < noffset)
{
cdo_warning("noffset is larger than number of timesteps!");
return;
}
while (true)
{
int nrecs = 0;
int numSets;
for (numSets = 0; numSets < ndates; numSets++)
{
nrecs = cdo_stream_inq_timestep(streamID1, tsID);
if (nrecs == 0) break;
dtlist.taxis_inq_timestep(taxisID1, numSets);
for (int recID = 0; recID < nrecs; ++recID)
{
int varID, levelID;
cdo_inq_record(streamID1, &varID, &levelID);
if (tsID == 0) recList[recID].set(varID, levelID);
auto &rsamp1 = samp1[varID][levelID];
auto &rvars1 = vars1[varID][levelID];
if (numSets == 0)
{
cdo_read_record(streamID1, rvars1);
if (lrange)
{
vars2[varID][levelID].nmiss = rvars1.nmiss;
vars2[varID][levelID].vec_d = rvars1.vec_d;
}
if (rvars1.nmiss || !rsamp1.empty())
{
if (rsamp1.empty()) rsamp1.resize(rvars1.size);
field2_vinit(rsamp1, rvars1);
}
}
else
{
field.init(varList[varID]);
cdo_read_record(streamID1, field);
if (field.nmiss || !rsamp1.empty())
{
if (rsamp1.empty()) rsamp1.resize(rvars1.size, numSets);
field2_vincr(rsamp1, field);
}
// clang-format off
if (lvarstd) field2_sumsumq(rvars1, vars2[varID][levelID], field); if (lvarstd) field2_sumsumq(rvars1, vars2[varID][levelID], field);
else if (lrange) field2_maxmin(rvars1, vars2[varID][levelID], field); else if (lrange) field2_maxmin(rvars1, vars2[varID][levelID], field);
else field2_function(rvars1, field, operfunc); else field2_function(rvars1, field, operfunc);
// clang-format on // clang-format on
}
}
if (numSets == 0 && lvarstd)
for (int recID = 0; recID < maxrecs; ++recID)
{
auto [varID, levelID] = recList[recID].get();
if (varList[varID].isConstant) continue;
field2_moq(vars2[varID][levelID], vars1[varID][levelID]);
} }
}
if (numSets == 0 && lvarstd) tsID++;
for (int recID = 0; recID < maxrecs; ++recID) }
{
auto [varID, levelID] = recList[recID].get(); if (nrecs == 0 && numSets == 0) break;
if (varList[varID].isConstant) continue;
field2_moq(vars2[varID][levelID], vars1[varID][levelID]); for (int recID = 0; recID < maxrecs; ++recID)
{
auto [varID, levelID] = recList[recID].get();
if (varList[varID].isConstant) continue;
const auto &rsamp1 = samp1[varID][levelID];
auto &rvars1 = vars1[varID][levelID];
if (lmean)
{
if (!rsamp1.empty())
field2_div(rvars1, rsamp1);
else
fieldc_div(rvars1, (double) numSets);
}
else if (lvarstd)
{
if (!rsamp1.empty())
field2_stdvar_func(rvars1, vars2[varID][levelID], rsamp1, divisor);
else
fieldc_stdvar_func(rvars1, vars2[varID][levelID], numSets, divisor);
} }
else if (lrange) { field2_sub(rvars1, vars2[varID][levelID]); }
}
dtlist.stat_taxis_def_timestep(taxisID2, numSets);
cdo_def_timestep(streamID2, otsID);
for (int recID = 0; recID < maxrecs; ++recID)
{
auto [varID, levelID] = recList[recID].get();
if (otsID && varList[varID].isConstant) continue;
auto &rvars1 = vars1[varID][levelID];
cdo_def_record(streamID2, varID, levelID);
cdo_write_record(streamID2, rvars1);
}
if (nrecs == 0) break;
otsID++;
for (int i = 0; i < nskip; ++i)
{
nrecs = cdo_stream_inq_timestep(streamID1, tsID);
if (nrecs == 0) break;
tsID++;
}
if (nrecs == 0) break;
}
}
void
close()
{
cdo_stream_close(streamID2);
cdo_stream_close(streamID1);
cdo_finish();
}
};
void *
Timselstat(void *process)
{
ModuleTimselstat timselstat;
tsID++; timselstat.init(process);
} timselstat.run();
timselstat.close();
if (nrecs == 0 && numSets == 0) break;
for (int recID = 0; recID < maxrecs; ++recID)
{
auto [varID, levelID] = recList[recID].get();
if (varList[varID].isConstant) continue;
const auto &rsamp1 = samp1[varID][levelID];
auto &rvars1 = vars1[varID][levelID];
if (lmean)
{
if (!rsamp1.empty())
field2_div(rvars1, rsamp1);
else
fieldc_div(rvars1, (double) numSets);
}
else if (lvarstd)
{
if (!rsamp1.empty())
field2_stdvar_func(rvars1, vars2[varID][levelID], rsamp1, divisor);
else
fieldc_stdvar_func(rvars1, vars2[varID][levelID], numSets, divisor);
}
else if (lrange) { field2_sub(rvars1, vars2[varID][levelID]); }
}
dtlist.stat_taxis_def_timestep(taxisID2, numSets);
cdo_def_timestep(streamID2, otsID);
for (int recID = 0; recID < maxrecs; ++recID)
{
auto [varID, levelID] = recList[recID].get();
if (otsID && varList[varID].isConstant) continue;
auto &rvars1 = vars1[varID][levelID];
cdo_def_record(streamID2, varID, levelID);
cdo_write_record(streamID2, rvars1);
}
if (nrecs == 0) break;
otsID++;
for (int i = 0; i < nskip; ++i)
{
nrecs = cdo_stream_inq_timestep(streamID1, tsID);
if (nrecs == 0) break;
tsID++;
}
if (nrecs == 0) break;
}
LABEL_END:
cdo_stream_close(streamID2);
cdo_stream_close(streamID1);
cdo_finish();
return nullptr; return nullptr;
} }
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