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

Detrend: changed to Task::doAsync()

parent 8820928d
No related branches found
No related tags found
1 merge request!222M214003/develop
......@@ -179,47 +179,12 @@ public:
}
}
struct FuncArgs
{
FieldVector3D &work;
FieldVector3D &fields3D;
VarList &varList;
int tsID{ 0 };
double zj{ 0 };
FuncArgs(FieldVector3D &_work, FieldVector3D &_fields3D, VarList &_varList)
: work(_work), fields3D(_fields3D), varList(_varList)
{
}
void
set(int _tsID, double _zj)
{
tsID = _tsID;
zj = _zj;
}
};
static void *
vars_trend_sum_func(void *_args)
{
FuncArgs *args = (FuncArgs *) _args;
vars_trend_sum(args->work, args->fields3D[args->tsID], args->varList, args->zj);
return nullptr;
}
static void *
vars_sub_trend_func(void *_args)
{
FuncArgs *args = (FuncArgs *) _args;
vars_sub_trend(args->work, args->fields3D[args->tsID], args->varList, args->zj);
return nullptr;
}
void
run() override
{
auto useAsyncTask = (Options::CDO_Parallel_Read > 0);
cdo::Task task;
auto runAsync = (Options::CDO_Parallel_Read > 0);
auto calendar = taxisInqCalendar(taxisID1);
CheckTimeIncr checkTimeIncr;
JulianDate julianDate0;
......@@ -232,9 +197,6 @@ public:
FieldVector3D work(numWork);
for (auto &w : work) field2D_init(w, varList1, FIELD_VEC, 0);
cdo::Task task;
FuncArgs funcArgs(work, varsData, varList1);
int tsID = 0;
while (true)
{
......@@ -260,58 +222,48 @@ public:
cdo_read_record(streamID1, field);
}
if (useAsyncTask)
{
if (tsID > 0) task.wait();
funcArgs.set(tsID, zj);
task.start(vars_trend_sum_func, &funcArgs);
}
else
{
funcArgs.set(tsID, zj);
vars_trend_sum_func(&funcArgs);
}
if (runAsync && tsID > 0) task.wait();
std::function<void()> vars_trend_sum_func
= std::bind(vars_trend_sum, std::ref(work), std::cref(varsData[tsID]), std::cref(varList1), zj);
runAsync ? task.doAsync(vars_trend_sum_func) : vars_trend_sum_func();
tsID++;
}
if (useAsyncTask) task.wait();
if (runAsync) task.wait();
numSteps = tsID;
vars_calc_trend_param(work);
if (useAsyncTask)
if (runAsync)
{
auto step = 0;
auto vDateTime = dtlist.get_vDateTime(step);
auto zj = tstepIsEqual ? (double) step : delta_time_step_0(step, calendar, vDateTime, julianDate0, deltat1);
funcArgs.set(step, zj);
task.start(vars_sub_trend_func, &funcArgs);
std::function<void()> vars_sub_trend_func
= std::bind(vars_sub_trend, std::ref(work), std::ref(varsData[step]), std::ref(varList1), zj);
task.doAsync(vars_sub_trend_func);
}
for (tsID = 0; tsID < numSteps; ++tsID)
{
progress.update((tsID + 1.0) / numSteps, 0.5, 0.5);
if (useAsyncTask)
{
task.wait();
auto step = tsID + 1;
if (step < numSteps)
{
auto vDateTime = dtlist.get_vDateTime(step);
auto zj = tstepIsEqual ? (double) step : delta_time_step_0(step, calendar, vDateTime, julianDate0, deltat1);
funcArgs.set(step, zj);
task.start(vars_sub_trend_func, &funcArgs);
}
}
else
if (runAsync) task.wait();
auto step = runAsync ? tsID + 1 : tsID;
if (step < numSteps)
{
auto vDateTime = dtlist.get_vDateTime(tsID);
auto zj = tstepIsEqual ? (double) tsID : delta_time_step_0(tsID, calendar, vDateTime, julianDate0, deltat1);
funcArgs.set(tsID, zj);
vars_sub_trend_func(&funcArgs);
auto vDateTime = dtlist.get_vDateTime(step);
auto zj = tstepIsEqual ? (double) step : delta_time_step_0(step, calendar, vDateTime, julianDate0, deltat1);
std::function<void()> vars_sub_trend_func
= std::bind(vars_sub_trend, std::ref(work), std::ref(varsData[step]), std::cref(varList1), zj);
runAsync ? task.doAsync(vars_sub_trend_func) : vars_sub_trend_func();
}
dtlist.taxis_def_timestep(taxisID2, 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