From dc1fcce7e60fa715cda00ea4bf3a0d6e773d190c Mon Sep 17 00:00:00 2001 From: Dmitri Naumov <dmitri.naumov@ufz.de> Date: Mon, 23 Sep 2019 18:06:44 +0200 Subject: [PATCH] [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. --- ProcessLib/CreateProcessData.cpp | 13 ++++--- ProcessLib/ProcessData.h | 7 ++-- ProcessLib/TimeLoop.cpp | 60 +++++++++++++------------------- 3 files changed, 36 insertions(+), 44 deletions(-) diff --git a/ProcessLib/CreateProcessData.cpp b/ProcessLib/CreateProcessData.cpp index fcf42bafd3c..4f46cae448f 100644 --- a/ProcessLib/CreateProcessData.cpp +++ b/ProcessLib/CreateProcessData.cpp @@ -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()) diff --git a/ProcessLib/ProcessData.h b/ProcessLib/ProcessData.h index 69415ff11aa..ad26f9e7547 100644 --- a/ProcessLib/ProcessData.h +++ b/ProcessLib/ProcessData.h @@ -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; }; diff --git a/ProcessLib/TimeLoop.cpp b/ProcessLib/TimeLoop.cpp index 33fe66b1204..065f4e42616 100644 --- a/ProcessLib/TimeLoop.cpp +++ b/ProcessLib/TimeLoop.cpp @@ -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; } } -- GitLab