Skip to content
Snippets Groups Projects
Commit dc1fcce7 authored by Dmitri Naumov's avatar Dmitri Naumov
Browse files

[PL] Use process_id from process_data, not local.

Avoid local variables `process_id' when looping over
all processes.
Move numbering of the processes to the ProcessData ctor.
parent 6f0a4459
No related branches found
No related tags found
No related merge requests found
......@@ -20,6 +20,7 @@ namespace ProcessLib
static std::unique_ptr<ProcessData> makeProcessData(
std::unique_ptr<NumLib::TimeStepAlgorithm>&& timestepper,
NumLib::NonlinearSolverBase& nonlinear_solver,
int const process_id,
Process& process,
std::unique_ptr<NumLib::TimeDiscretization>&& time_disc,
std::unique_ptr<NumLib::ConvergenceCriterion>&& conv_crit)
......@@ -32,7 +33,7 @@ static std::unique_ptr<ProcessData> makeProcessData(
{
return std::make_unique<ProcessData>(
std::move(timestepper), *nonlinear_solver_picard,
std::move(conv_crit), std::move(time_disc), process);
std::move(conv_crit), std::move(time_disc), process_id, process);
}
if (auto* nonlinear_solver_newton =
dynamic_cast<NumLib::NonlinearSolver<Tag::Newton>*>(
......@@ -40,7 +41,7 @@ static std::unique_ptr<ProcessData> makeProcessData(
{
return std::make_unique<ProcessData>(
std::move(timestepper), *nonlinear_solver_newton,
std::move(conv_crit), std::move(time_disc), process);
std::move(conv_crit), std::move(time_disc), process_id, process);
}
OGS_FATAL("Encountered unknown nonlinear solver type. Aborting");
......@@ -53,6 +54,7 @@ std::vector<std::unique_ptr<ProcessData>> createPerProcessData(
nonlinear_solvers)
{
std::vector<std::unique_ptr<ProcessData>> per_process_data;
int process_id = 0;
//! \ogs_file_param{prj__time_loop__processes__process}
for (auto pcs_config : config.getConfigSubtreeList("process"))
......@@ -99,9 +101,10 @@ std::vector<std::unique_ptr<ProcessData>> createPerProcessData(
"in the current project file!");
}
per_process_data.emplace_back(makeProcessData(
std::move(timestepper), nl_slv, pcs, std::move(time_disc),
std::move(conv_crit)));
per_process_data.emplace_back(
makeProcessData(std::move(timestepper), nl_slv, process_id, pcs,
std::move(time_disc), std::move(conv_crit)));
++process_id;
}
if (per_process_data.size() != processes.size())
......
......@@ -27,6 +27,7 @@ struct ProcessData
NumLib::NonlinearSolver<NLTag>& nonlinear_solver,
std::unique_ptr<NumLib::ConvergenceCriterion>&& conv_crit_,
std::unique_ptr<NumLib::TimeDiscretization>&& time_disc_,
int const process_id_,
Process& process_)
: timestepper(std::move(timestepper_)),
nonlinear_solver_tag(NLTag),
......@@ -34,6 +35,7 @@ struct ProcessData
nonlinear_solver_status{true, 0},
conv_crit(std::move(conv_crit_)),
time_disc(std::move(time_disc_)),
process_id(process_id_),
process(process_)
{
}
......@@ -47,6 +49,7 @@ struct ProcessData
time_disc(std::move(pd.time_disc)),
tdisc_ode_sys(std::move(pd.tdisc_ode_sys)),
mat_strg(pd.mat_strg),
process_id(pd.process_id),
process(pd.process)
{
pd.mat_strg = nullptr;
......@@ -67,9 +70,7 @@ struct ProcessData
//! cast of \c tdisc_ode_sys to NumLib::InternalMatrixStorage
NumLib::InternalMatrixStorage* mat_strg = nullptr;
/// Process ID. It is alway 0 when the monolithic scheme is used or
/// a single process is modelled.
int process_id = 0;
int const process_id;
Process& process;
};
......
......@@ -130,10 +130,10 @@ std::vector<GlobalVector*> setInitialConditions(
{
std::vector<GlobalVector*> process_solutions;
int process_id = 0;
for (auto& process_data : per_process_data)
{
auto& pcs = process_data->process;
auto const process_id = process_data->process_id;
auto& time_disc = *process_data->time_disc;
auto& ode_sys = *process_data->tdisc_ode_sys;
......@@ -162,16 +162,14 @@ std::vector<GlobalVector*> setInitialConditions(
t0, x0,
mat_strg); // TODO: that might do duplicate work
}
++process_id;
}
return process_solutions;
}
NumLib::NonlinearSolverStatus solveOneTimeStepOneProcess(
int const process_id, GlobalVector& x, std::size_t const timestep,
double const t, double const delta_t, ProcessData const& process_data,
GlobalVector& x, std::size_t const timestep, double const t,
double const delta_t, ProcessData const& process_data,
Output& output_control)
{
auto& process = process_data.process;
......@@ -192,8 +190,8 @@ NumLib::NonlinearSolverStatus solveOneTimeStepOneProcess(
auto const post_iteration_callback = [&](int iteration,
GlobalVector const& x) {
output_control.doOutputNonlinearIteration(process, process_id, timestep,
t, x, iteration);
output_control.doOutputNonlinearIteration(
process, process_data.process_id, timestep, t, x, iteration);
};
auto const nonlinear_solver_status =
......@@ -201,7 +199,7 @@ NumLib::NonlinearSolverStatus solveOneTimeStepOneProcess(
if (nonlinear_solver_status.error_norms_met)
{
process.postNonLinearSolver(x, t, delta_t, process_id);
process.postNonLinearSolver(x, t, delta_t, process_data.process_id);
}
return nonlinear_solver_status;
......@@ -228,10 +226,9 @@ TimeLoop::TimeLoop(
void TimeLoop::setCoupledSolutions()
{
_solutions_of_coupled_processes.reserve(_per_process_data.size());
for (unsigned process_id = 0; process_id < _per_process_data.size();
process_id++)
for (auto& process_data : _per_process_data)
{
auto const& x = *_process_solutions[process_id];
auto const& x = *_process_solutions[process_data->process_id];
_solutions_of_coupled_processes.emplace_back(x);
// Create a vector to store the solution of the last coupling iteration
......@@ -383,13 +380,12 @@ double TimeLoop::computeTimeStepping(const double prev_dt, double& t,
/// initialize output, convergence criterion, etc.
void TimeLoop::initialize()
{
int process_id = 0;
for (auto& process_data : _per_process_data)
{
auto& pcs = process_data->process;
int const process_id = process_data->process_id;
_output->addProcess(pcs, process_id);
process_data->process_id = process_id;
setTimeDiscretizedODESystem(*process_data);
if (auto* conv_crit =
......@@ -405,8 +401,6 @@ void TimeLoop::initialize()
// the fixed times.
auto& timestepper = process_data->timestepper;
timestepper->addFixedOutputTimes(_output->getFixedOutputTimes());
++process_id;
}
// init solution storage
......@@ -465,11 +459,10 @@ bool TimeLoop::loop()
timesteps, t, dt);
// Check element deactivation:
int process_id = 0;
for (auto& process_data : _per_process_data)
{
process_data->process.updateDeactivatedSubdomains(t, process_id);
++process_id;
process_data->process.updateDeactivatedSubdomains(
t, process_data->process_id);
}
if (is_staggered_coupling)
......@@ -549,8 +542,8 @@ static NumLib::NonlinearSolverStatus solveMonolithicProcess(
BaseLib::RunTime time_timestep_process;
time_timestep_process.start();
auto const nonlinear_solver_status = solveOneTimeStepOneProcess(
process_data.process_id, x, timestep_id, t, dt, process_data, output);
auto const nonlinear_solver_status =
solveOneTimeStepOneProcess(x, timestep_id, t, dt, process_data, output);
INFO("[time] Solving process #%u took %g s in time step #%u ",
process_data.process_id, time_timestep_process.elapsed(), timestep_id);
......@@ -598,24 +591,24 @@ NumLib::NonlinearSolverStatus TimeLoop::solveUncoupledEquationSystems(
NumLib::NonlinearSolverStatus nonlinear_solver_status;
for (auto& process_data : _per_process_data)
{
nonlinear_solver_status = solveMonolithicProcess(
t, dt, timestep_id, *process_data,
*_process_solutions[process_data->process_id], *_output);
auto const process_id = process_data->process_id;
nonlinear_solver_status =
solveMonolithicProcess(t, dt, timestep_id, *process_data,
*_process_solutions[process_id], *_output);
process_data->nonlinear_solver_status = nonlinear_solver_status;
if (!nonlinear_solver_status.error_norms_met)
{
ERR("The nonlinear solver failed in time step #%u at t = %g s for "
"process #%u.",
timestep_id, t, process_data->process_id);
timestep_id, t, process_id);
if (!process_data->timestepper->isSolutionErrorComputationNeeded())
{
// save unsuccessful solution
_output->doOutputAlways(
process_data->process, process_data->process_id,
timestep_id, t,
*_process_solutions[process_data->process_id]);
_output->doOutputAlways(process_data->process, process_id,
timestep_id, t,
*_process_solutions[process_id]);
OGS_FATAL(nonlinear_fixed_dt_fails_info.data());
}
......@@ -659,10 +652,10 @@ TimeLoop::solveCoupledEquationSystemsByStaggeredScheme(
{
// TODO(wenqing): use process name
coupling_iteration_converged = true;
int process_id = 0;
int const last_process_id = _per_process_data.size() - 1;
for (auto& process_data : _per_process_data)
{
auto const process_id = process_data->process_id;
BaseLib::RunTime time_timestep_process;
time_timestep_process.start();
......@@ -675,7 +668,7 @@ TimeLoop::solveCoupledEquationSystemsByStaggeredScheme(
&coupled_solutions);
nonlinear_solver_status = solveOneTimeStepOneProcess(
process_id, x, timestep_id, t, dt, *process_data, *_output);
x, timestep_id, t, dt, *process_data, *_output);
process_data->nonlinear_solver_status = nonlinear_solver_status;
INFO(
......@@ -719,8 +712,6 @@ TimeLoop::solveCoupledEquationSystemsByStaggeredScheme(
}
}
MathLib::LinAlg::copy(x, x_old);
++process_id;
} // end of for (auto& process_data : _per_process_data)
if (coupling_iteration_converged && global_coupling_iteration > 0)
......@@ -771,15 +762,14 @@ void TimeLoop::outputSolutions(bool const output_initial_condition,
bool const is_staggered_coupling =
!isMonolithicProcess(*_per_process_data[0]);
unsigned process_id = 0;
for (auto& process_data : _per_process_data)
{
auto const process_id = process_data->process_id;
auto& pcs = process_data->process;
// If nonlinear solver diverged, the solution has already been
// saved.
if (!process_data->nonlinear_solver_status.error_norms_met)
{
++process_id;
continue;
}
......@@ -805,8 +795,6 @@ void TimeLoop::outputSolutions(bool const output_initial_condition,
.setCoupledTermForTheStaggeredSchemeToLocalAssemblers();
}
(output_object.*output_class_member)(pcs, process_id, timestep, t, x);
++process_id;
}
}
......
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