OGS
ProcessLib::TimeLoop Class Reference

Detailed Description

Time loop capable of time-integrating several processes at once.

Definition at line 39 of file TimeLoop.h.

#include <TimeLoop.h>

Collaboration diagram for ProcessLib::TimeLoop:
[legend]

Public Member Functions

 TimeLoop (std::vector< Output > &&outputs, std::vector< std::unique_ptr< ProcessData > > &&per_process_data, std::unique_ptr< NumLib::StaggeredCoupling > &&staggered_coupling, const NumLib::Time &start_time, const NumLib::Time &end_time)
 
void initialize ()
 initialize output, convergence criterion, etc.
 
void outputLastTimeStep () const
 
 ~TimeLoop ()
 
bool executeTimeStep ()
 
bool calculateNextTimeStep ()
 
NumLib::Time endTime () const
 
NumLib::Time currentTime () const
 

Public Attributes

bool successful_time_step = true
 

Private Types

using TimeStepConstraintCallback
 

Private Member Functions

bool preTsNonlinearSolvePostTs (NumLib::Time const &t, double const dt, std::size_t const timesteps)
 
NumLib::NonlinearSolverStatus solveUncoupledEquationSystems (const NumLib::Time &t, const double dt, const std::size_t timestep_id)
 Member to solver non coupled systems of equations, which can be a single system of equations, or several systems of equations without any dependency among the different systems.
 
NumLib::NonlinearSolverStatus solveCoupledEquationSystemsByStaggeredScheme (const NumLib::Time &t, const double dt, const std::size_t timestep_id)
 Member to solver coupled systems of equations by the staggered scheme.
 
std::pair< NumLib::TimeIncrement, bool > computeTimeStepping (const double prev_dt, NumLib::Time &t, std::size_t &accepted_steps, std::size_t &rejected_steps, std::vector< TimeStepConstraintCallback > const &time_step_constraints)
 
template<typename OutputClassMember >
void outputSolutions (unsigned timestep, const double t, OutputClassMember output_class_member) const
 
std::vector< TimeStepConstraintCallbackgenerateOutputTimeStepConstraints (std::vector< double > &&fixed_times) const
 
void preOutputInitialConditions (NumLib::Time const &t, const double dt) const
 

Private Attributes

std::vector< GlobalVector * > _process_solutions
 
std::vector< GlobalVector * > _process_solutions_prev
 
std::vector< Output_outputs
 
std::vector< std::unique_ptr< ProcessData > > _per_process_data
 
const NumLib::Time _start_time
 
const NumLib::Time _end_time
 
NumLib::Time _current_time = _start_time
 
std::size_t _accepted_steps = 0
 
std::size_t _rejected_steps = 0
 
NumLib::TimeIncrement _dt {0.}
 
int _repeating_times_of_rejected_step = 0
 
bool _last_step_rejected = false
 
std::unique_ptr< NumLib::StaggeredCoupling_staggered_coupling
 

Member Typedef Documentation

◆ TimeStepConstraintCallback

Initial value:
std::function<double(NumLib::Time const&, double)>

Definition at line 98 of file TimeLoop.h.

Constructor & Destructor Documentation

◆ TimeLoop()

ProcessLib::TimeLoop::TimeLoop ( std::vector< Output > && outputs,
std::vector< std::unique_ptr< ProcessData > > && per_process_data,
std::unique_ptr< NumLib::StaggeredCoupling > && staggered_coupling,
const NumLib::Time & start_time,
const NumLib::Time & end_time )

Definition at line 269 of file TimeLoop.cpp.

274 : _outputs{std::move(outputs)},
275 _per_process_data(std::move(per_process_data)),
276 _start_time(start_time),
277 _end_time(end_time),
278 _staggered_coupling(std::move(staggered_coupling))
279{
280}
std::vector< std::unique_ptr< ProcessData > > _per_process_data
Definition TimeLoop.h:133
std::vector< Output > _outputs
Definition TimeLoop.h:132
std::unique_ptr< NumLib::StaggeredCoupling > _staggered_coupling
Definition TimeLoop.h:144
const NumLib::Time _end_time
Definition TimeLoop.h:136
const NumLib::Time _start_time
Definition TimeLoop.h:135

◆ ~TimeLoop()

ProcessLib::TimeLoop::~TimeLoop ( )

Definition at line 734 of file TimeLoop.cpp.

735{
736 for (auto* x : _process_solutions)
737 {
739 }
740 for (auto* x : _process_solutions_prev)
741 {
743 }
744}
virtual void releaseVector(GlobalVector const &x)=0
std::vector< GlobalVector * > _process_solutions
Definition TimeLoop.h:130
std::vector< GlobalVector * > _process_solutions_prev
Definition TimeLoop.h:131
static NUMLIB_EXPORT VectorProvider & provider

References _process_solutions, _process_solutions_prev, NumLib::GlobalVectorProvider::provider, and NumLib::VectorProvider::releaseVector().

Member Function Documentation

◆ calculateNextTimeStep()

bool ProcessLib::TimeLoop::calculateNextTimeStep ( )

Computes and sets the next timestep.

Attention
The timestepper might reject the current timestep and repeat it (with a reduced timestep size).
Returns
true if the simulation (time) has not finished, yet, false otherwise.

Definition at line 532 of file TimeLoop.cpp.

533{
534 const double prev_dt = _dt();
535 auto const current_time = _current_time;
536
537 const std::size_t timesteps = _accepted_steps + 1;
538
539 auto const time_step_constraints = generateOutputTimeStepConstraints(
541
542 // _last_step_rejected is also checked in computeTimeStepping.
543 std::tie(_dt, _last_step_rejected) =
545 _rejected_steps, time_step_constraints);
546
548 {
549 outputSolutions(timesteps, current_time(), &Output::doOutput);
550 }
551
552 if (current_time == (_current_time + _dt()))
553 {
554 ERR("Time step size of {} is too small.\n"
555 "Time stepping stops at step {:d} and at time of {}.",
556 _dt, timesteps, _current_time);
557 return false;
558 }
559
561 {
562 return false;
563 }
564
565 return true;
566}
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:45
void doOutput(Process const &process, const int process_id, int const timestep, const NumLib::Time &t, int const iteration, std::vector< GlobalVector * > const &xs) const
Definition Output.cpp:336
NumLib::TimeIncrement _dt
Definition TimeLoop.h:140
NumLib::Time _current_time
Definition TimeLoop.h:137
std::pair< NumLib::TimeIncrement, bool > computeTimeStepping(const double prev_dt, NumLib::Time &t, std::size_t &accepted_steps, std::size_t &rejected_steps, std::vector< TimeStepConstraintCallback > const &time_step_constraints)
Definition TimeLoop.cpp:295
void outputSolutions(unsigned timestep, const double t, OutputClassMember output_class_member) const
Definition TimeLoop.cpp:709
std::size_t _accepted_steps
Definition TimeLoop.h:138
std::size_t _rejected_steps
Definition TimeLoop.h:139
std::vector< TimeStepConstraintCallback > generateOutputTimeStepConstraints(std::vector< double > &&fixed_times) const
Definition TimeLoop.cpp:444
std::vector< double > calculateUniqueFixedTimesForAllOutputs(std::vector< Output > const &outputs)
Definition Output.cpp:433

References _accepted_steps, _current_time, _dt, _end_time, _last_step_rejected, _outputs, _rejected_steps, ProcessLib::calculateUniqueFixedTimesForAllOutputs(), computeTimeStepping(), ProcessLib::Output::doOutput(), ERR(), generateOutputTimeStepConstraints(), and outputSolutions().

◆ computeTimeStepping()

std::pair< NumLib::TimeIncrement, bool > ProcessLib::TimeLoop::computeTimeStepping ( const double prev_dt,
NumLib::Time & t,
std::size_t & accepted_steps,
std::size_t & rejected_steps,
std::vector< TimeStepConstraintCallback > const & time_step_constraints )
private

Find the minimum time step size among the predicted step sizes of processes and step it as common time step size.

Parameters
prev_dtPrevious time step size.
tCurrent time.
accepted_stepsAccepted time steps that are counted in this function.
rejected_stepsRejected time steps that are counted in this function.
time_step_constraintsFunctions that are evaluate to influence the time step size (for instance a fixed output time)
Returns
the time step size and the information if the last time step was rejected

Definition at line 295 of file TimeLoop.cpp.

299{
300 bool all_process_steps_accepted = true;
301 // Get minimum time step size among step sizes of all processes.
302 NumLib::TimeIncrement dt{std::numeric_limits<double>::max()};
303 constexpr double eps = std::numeric_limits<double>::epsilon();
304
305 bool const is_initial_step =
306 std::any_of(_per_process_data.begin(), _per_process_data.end(),
307 [](auto const& ppd) -> bool
308 { return ppd->timestep_current.timeStepNumber() == 0; });
309
310 for (std::size_t i = 0; i < _per_process_data.size(); i++)
311 {
312 auto& ppd = *_per_process_data[i];
313 auto& timestep_algorithm = *ppd.timestep_algorithm.get();
314
315 auto const& x = *_process_solutions[i];
316 auto const& x_prev = *_process_solutions_prev[i];
317
318 const double solution_error =
319 computationOfChangeNeeded(timestep_algorithm, t)
321 x, x_prev,
322 ppd.conv_crit.get() ? ppd.conv_crit->getVectorNormType()
324 : 0.0;
325
326 ppd.timestep_current.setAccepted(
327 ppd.nonlinear_solver_status.error_norms_met);
328
329 auto [previous_step_accepted, timestepper_dt] = timestep_algorithm.next(
330 solution_error, ppd.nonlinear_solver_status.number_iterations,
331 ppd.timestep_previous, ppd.timestep_current);
332
333 if (!previous_step_accepted)
334 {
335 // Not all processes have accepted steps.
336 all_process_steps_accepted = false;
337 }
338
339 if (!ppd.nonlinear_solver_status.error_norms_met)
340 {
341 WARN(
342 "Time step will be rejected due to nonlinear solver "
343 "divergence.");
344 all_process_steps_accepted = false;
345 }
346
347 if (timestepper_dt > eps || t < timestep_algorithm.end())
348 {
349 dt = NumLib::TimeIncrement{std::min(timestepper_dt, dt())};
350 }
351 }
352
353 if (all_process_steps_accepted)
354 {
356 }
357 else
358 {
360 }
361
362 bool last_step_rejected = false;
363 if (!is_initial_step)
364 {
365 if (all_process_steps_accepted)
366 {
367 accepted_steps++;
368 last_step_rejected = false;
369 }
370 else
371 {
372 if (t <= _end_time)
373 {
374 t -= prev_dt;
375 rejected_steps++;
376 last_step_rejected = true;
377 }
378 }
379 }
380
381 // adjust step size considering external communciation_point_calculators
382 for (auto const& time_step_constraint : time_step_constraints)
383 {
385 std::min(dt(), time_step_constraint(t, dt()))};
386 }
387
388 // Check whether the time stepping is stabilized
389 if (std::abs(dt() - prev_dt) < eps)
390 {
391 if (last_step_rejected)
392 {
393 OGS_FATAL(
394 "The new step size of {} is the same as that of the previous "
395 "rejected time step. \nPlease re-run ogs with a proper "
396 "adjustment in the numerical settings, \ne.g. those for time "
397 "stepper, local or global non-linear solver.",
398 dt);
399 }
400 else
401 {
402 DBUG("The time stepping is stabilized with the step size of {}.",
403 dt);
404 }
405 }
406
407 // Reset the time step with the minimum step size, dt
408 // Update the solution of the previous time step.
409 for (std::size_t i = 0; i < _per_process_data.size(); i++)
410 {
411 if (all_process_steps_accepted)
412 {
413 auto& ppd = *_per_process_data[i];
414 NumLib::updateTimeSteps(dt(), ppd.timestep_previous,
415 ppd.timestep_current);
416 auto& timestep_algorithm = ppd.timestep_algorithm;
417 timestep_algorithm->resetCurrentTimeStep(
418 dt(), ppd.timestep_previous, ppd.timestep_current);
419 }
420
421 auto& x = *_process_solutions[i];
422 auto& x_prev = *_process_solutions_prev[i];
423 if (all_process_steps_accepted)
424 {
425 MathLib::LinAlg::copy(x, x_prev); // pushState
426 }
427 else
428 {
429 if (t <= _end_time)
430 {
431 WARN(
432 "Time step {:d} was rejected {:d} times and it will be "
433 "repeated with a reduced step size.",
434 accepted_steps + 1, _repeating_times_of_rejected_step);
435 MathLib::LinAlg::copy(x_prev, x); // popState
436 }
437 }
438 }
439
440 return {dt, last_step_rejected};
441}
#define OGS_FATAL(...)
Definition Error.h:26
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:30
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:40
int _repeating_times_of_rejected_step
Definition TimeLoop.h:141
void copy(PETScVector const &x, PETScVector &y)
Definition LinAlg.cpp:37
double computeRelativeNorm(VectorType const &x, VectorType const &y, MathLib::VecNormType norm_type)
Definition LinAlg.h:299
void updateTimeSteps(double const dt, TimeStep &previous_timestep, TimeStep &current_timestep)
Definition TimeStep.h:100
bool computationOfChangeNeeded(NumLib::TimeStepAlgorithm const &timestep_algorithm, NumLib::Time const &time)
Definition TimeLoop.cpp:282

References _end_time, _per_process_data, _process_solutions, _process_solutions_prev, _repeating_times_of_rejected_step, ProcessLib::computationOfChangeNeeded(), MathLib::LinAlg::computeRelativeNorm(), MathLib::LinAlg::copy(), DBUG(), MathLib::NORM2, OGS_FATAL, NumLib::updateTimeSteps(), and WARN().

Referenced by calculateNextTimeStep(), and initialize().

◆ currentTime()

NumLib::Time ProcessLib::TimeLoop::currentTime ( ) const
inline

Definition at line 64 of file TimeLoop.h.

64{ return _current_time; }

References _current_time.

◆ endTime()

NumLib::Time ProcessLib::TimeLoop::endTime ( ) const
inline

Definition at line 63 of file TimeLoop.h.

63{ return _end_time; }

References _end_time.

◆ executeTimeStep()

bool ProcessLib::TimeLoop::executeTimeStep ( )

Definition at line 511 of file TimeLoop.cpp.

512{
513 BaseLib::RunTime time_timestep;
514 time_timestep.start();
515
516 _current_time += _dt();
517
518 const std::size_t timesteps = _accepted_steps + 1;
519 // TODO(wenqing): , input option for time unit.
520 INFO("=== Time stepping at step #{:d} and time {} with step size {}",
521 timesteps, _current_time, _dt);
522
524
527 INFO("[time] Time step #{:d} took {:g} s.", timesteps,
528 time_timestep.elapsed());
530}
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:35
Count the running time.
Definition RunTime.h:29
double elapsed() const
Get the elapsed time in seconds.
Definition RunTime.h:42
void start()
Start the timer.
Definition RunTime.h:32
bool preTsNonlinearSolvePostTs(NumLib::Time const &t, double const dt, std::size_t const timesteps)
Definition TimeLoop.cpp:583
void updateDeactivatedSubdomains(std::vector< std::unique_ptr< ProcessLib::ProcessData > > const &per_process_data, double const t)
Definition TimeLoop.cpp:28

References _accepted_steps, _current_time, _dt, _per_process_data, BaseLib::RunTime::elapsed(), INFO(), preTsNonlinearSolvePostTs(), BaseLib::RunTime::start(), and successful_time_step.

◆ generateOutputTimeStepConstraints()

std::vector< TimeLoop::TimeStepConstraintCallback > ProcessLib::TimeLoop::generateOutputTimeStepConstraints ( std::vector< double > && fixed_times) const
private

Definition at line 444 of file TimeLoop.cpp.

446{
447 std::vector<TimeStepConstraintCallback> const time_step_constraints{
448 [fixed_times = std::move(fixed_times)](NumLib::Time const& t, double dt)
449 { return NumLib::possiblyClampDtToNextFixedTime(t, dt, fixed_times); },
450 [this](NumLib::Time const& t, double dt) -> double
451 {
452 if (t < _end_time && _end_time < t + dt)
453 {
454 return _end_time() - t();
455 }
456 return dt;
457 }};
458 return time_step_constraints;
459}
double possiblyClampDtToNextFixedTime(Time const &t, double const dt, std::vector< double > const &fixed_output_times)

References _end_time, and NumLib::possiblyClampDtToNextFixedTime().

Referenced by calculateNextTimeStep(), and initialize().

◆ initialize()

void ProcessLib::TimeLoop::initialize ( )

initialize output, convergence criterion, etc.

Definition at line 462 of file TimeLoop.cpp.

463{
464 for (auto const& process_data : _per_process_data)
465 {
466 auto& pcs = process_data->process;
467 for (auto& output : _outputs)
468 {
469 output.addProcess(pcs);
470 }
471
472 setTimeDiscretizedODESystem(*process_data);
473
474 if (auto* conv_crit =
476 process_data->conv_crit.get()))
477 {
478 int const process_id = process_data->process_id;
479 conv_crit->setDOFTable(pcs.getDOFTable(process_id), pcs.getMesh());
480 }
481 }
482
483 // initial solution storage
486
488 {
489 _staggered_coupling->initializeCoupledSolutions(_process_solutions);
490 }
491
493
494 auto const time_step_constraints = generateOutputTimeStepConstraints(
496
497 std::tie(_dt, _last_step_rejected) =
499 _rejected_steps, time_step_constraints);
500
501 // Output initial conditions
502 {
505 }
506
509}
void preOutputInitialConditions(NumLib::Time const &t, const double dt) const
Definition TimeLoop.cpp:746
void setTimeDiscretizedODESystem(ProcessData &process_data, NumLib::ODESystem< ODETag, NumLib::NonlinearSolverTag::Picard > &ode_sys)
Definition TimeLoop.cpp:114
void calculateNonEquilibriumInitialResiduum(std::vector< std::unique_ptr< ProcessData > > const &per_process_data, std::vector< GlobalVector * > const &process_solutions, std::vector< GlobalVector * > const &process_solutions_prev)
Definition TimeLoop.cpp:208
std::pair< std::vector< GlobalVector * >, std::vector< GlobalVector * > > setInitialConditions(NumLib::Time const &t0, std::vector< std::unique_ptr< ProcessData > > const &per_process_data)
Definition TimeLoop.cpp:173

References _accepted_steps, _current_time, _dt, _last_step_rejected, _outputs, _per_process_data, _process_solutions, _process_solutions_prev, _rejected_steps, _staggered_coupling, _start_time, ProcessLib::calculateNonEquilibriumInitialResiduum(), ProcessLib::calculateUniqueFixedTimesForAllOutputs(), computeTimeStepping(), ProcessLib::Output::doOutput(), generateOutputTimeStepConstraints(), outputSolutions(), preOutputInitialConditions(), ProcessLib::setInitialConditions(), and ProcessLib::setTimeDiscretizedODESystem().

◆ outputLastTimeStep()

void ProcessLib::TimeLoop::outputLastTimeStep ( ) const

Definition at line 568 of file TimeLoop.cpp.

569{
570 INFO(
571 "The whole computation of the time stepping took {:d} steps, in which\n"
572 "\t the accepted steps are {:d}, and the rejected steps are {:d}.\n",
574
575 // output last time step
577 {
580 }
581}
void doOutputLastTimestep(Process const &process, const int process_id, int const timestep, const NumLib::Time &t, int const iteration, std::vector< GlobalVector * > const &xs) const
Definition Output.cpp:355

References _accepted_steps, _current_time, _rejected_steps, ProcessLib::Output::doOutputLastTimestep(), INFO(), outputSolutions(), and successful_time_step.

◆ outputSolutions()

template<typename OutputClassMember >
void ProcessLib::TimeLoop::outputSolutions ( unsigned timestep,
const double t,
OutputClassMember output_class_member ) const
private

Definition at line 709 of file TimeLoop.cpp.

711{
712 for (auto const& process_data : _per_process_data)
713 {
714 // If nonlinear solver diverged, the solution has already been
715 // saved.
716 if (!process_data->nonlinear_solver_status.error_norms_met)
717 {
718 continue;
719 }
720
721 auto const process_id = process_data->process_id;
722 auto const& pcs = process_data->process;
723
724 for (auto const& output_object : _outputs)
725 {
726 (output_object.*output_class_member)(
727 pcs, process_id, timestep, NumLib::Time(t),
728 process_data->nonlinear_solver_status.number_iterations,
730 }
731 }
732}

References _outputs, _per_process_data, and _process_solutions.

Referenced by calculateNextTimeStep(), initialize(), and outputLastTimeStep().

◆ preOutputInitialConditions()

void ProcessLib::TimeLoop::preOutputInitialConditions ( NumLib::Time const & t,
const double dt ) const
private

Definition at line 746 of file TimeLoop.cpp.

748{
749 for (auto const& process_data : _per_process_data)
750 {
751 // If nonlinear solver diverged, the solution has already been
752 // saved.
753 if (!process_data->nonlinear_solver_status.error_norms_met)
754 {
755 continue;
756 }
757
758 auto const process_id = process_data->process_id;
759 auto& pcs = process_data->process;
760
761 process_data->time_disc->nextTimestep(t(), dt);
762
763 pcs.preTimestep(_process_solutions, _start_time(), dt, process_id);
764
765 pcs.preOutput(_start_time(), dt, _process_solutions,
766 _process_solutions_prev, process_id);
767
768 // Update secondary variables, which might be uninitialized, before
769 // output.
770 pcs.computeSecondaryVariable(_start_time(), dt, _process_solutions,
771 *_process_solutions_prev[process_id],
772 process_id);
773 }
774}

References _per_process_data, _process_solutions, _process_solutions_prev, and _start_time.

Referenced by initialize().

◆ preTsNonlinearSolvePostTs()

bool ProcessLib::TimeLoop::preTsNonlinearSolvePostTs ( NumLib::Time const & t,
double const dt,
std::size_t const timesteps )
private

Definition at line 583 of file TimeLoop.cpp.

585{
587
588 NumLib::NonlinearSolverStatus nonlinear_solver_status;
589
591 {
592 nonlinear_solver_status =
594 }
595 else
596 {
597 nonlinear_solver_status =
598 solveUncoupledEquationSystems(t, dt, timesteps);
599 }
600
601 // Run post time step only if the last iteration was successful.
602 // Otherwise it runs the risks to get the same errors as in the last
603 // iteration, an exception thrown in assembly, for example.
604 if (nonlinear_solver_status.error_norms_met)
605 {
606 // Later on, the timestep_algorithm might reject the timestep. We assume
607 // that this is a rare case, so still, we call preOutput() here. We
608 // don't expect a large overhead from it.
611 _outputs);
612
616 }
617 return nonlinear_solver_status.error_norms_met;
618}
NumLib::NonlinearSolverStatus solveUncoupledEquationSystems(const NumLib::Time &t, const double dt, const std::size_t timestep_id)
Member to solver non coupled systems of equations, which can be a single system of equations,...
Definition TimeLoop.cpp:641
NumLib::NonlinearSolverStatus solveCoupledEquationSystemsByStaggeredScheme(const NumLib::Time &t, const double dt, const std::size_t timestep_id)
Member to solver coupled systems of equations by the staggered scheme.
Definition TimeLoop.cpp:683
void preTimestepForAllProcesses(NumLib::Time const &t, double const dt, std::vector< std::unique_ptr< ProcessData > > const &per_process_data, std::vector< GlobalVector * > const &_process_solutions)
Definition TimeLoop.cpp:81
void postTimestepForAllProcesses(NumLib::Time const &t, double const dt, std::vector< std::unique_ptr< ProcessData > > const &per_process_data, std::vector< GlobalVector * > const &process_solutions, std::vector< GlobalVector * > const &process_solutions_prev)
Definition TimeLoop.cpp:94
void preOutputForAllProcesses(int const timestep, NumLib::Time const &t, double const dt, const NumLib::Time &end_time, std::vector< std::unique_ptr< ProcessLib::ProcessData > > const &per_process_data, std::vector< GlobalVector * > const &process_solutions, std::vector< GlobalVector * > const &process_solutions_prev, std::vector< ProcessLib::Output > const &outputs)
Definition TimeLoop.cpp:54
Status of the non-linear solver.

References _end_time, _outputs, _per_process_data, _process_solutions, _process_solutions_prev, _staggered_coupling, NumLib::NonlinearSolverStatus::error_norms_met, ProcessLib::postTimestepForAllProcesses(), ProcessLib::preTimestepForAllProcesses(), solveCoupledEquationSystemsByStaggeredScheme(), and solveUncoupledEquationSystems().

Referenced by executeTimeStep().

◆ solveCoupledEquationSystemsByStaggeredScheme()

NumLib::NonlinearSolverStatus ProcessLib::TimeLoop::solveCoupledEquationSystemsByStaggeredScheme ( const NumLib::Time & t,
const double dt,
const std::size_t timestep_id )
private

Member to solver coupled systems of equations by the staggered scheme.

Parameters
tCurrent time
dtTime step size
timestep_idIndex of the time step
Returns
true: if all nonlinear solvers convergence. false: if any of nonlinear solvers divergences.

Definition at line 683 of file TimeLoop.cpp.

685{
686 auto const nonlinear_solver_status =
687 _staggered_coupling->execute<ProcessData, Output>(
688 t(), dt, timestep_id, _process_solutions, _process_solutions_prev,
690
691 _last_step_rejected = nonlinear_solver_status.error_norms_met;
692
693 {
694 for (auto const& process_data : _per_process_data)
695 {
696 auto& pcs = process_data->process;
697 int const process_id = process_data->process_id;
698 auto& ode_sys = *process_data->tdisc_ode_sys;
699 pcs.solveReactionEquation(_process_solutions,
700 _process_solutions_prev, t(), dt, ode_sys,
701 process_id);
702 }
703 }
704
705 return nonlinear_solver_status;
706}
NumLib::NonlinearSolverStatus solveOneTimeStepOneProcess(std::vector< GlobalVector * > &x, std::vector< GlobalVector * > const &x_prev, std::size_t const timestep, double const t, double const delta_t, ProcessData const &process_data, std::vector< Output > const &outputs)
Definition TimeLoop.cpp:224

References _last_step_rejected, _outputs, _per_process_data, _process_solutions, _process_solutions_prev, _staggered_coupling, and ProcessLib::solveOneTimeStepOneProcess().

Referenced by preTsNonlinearSolvePostTs().

◆ solveUncoupledEquationSystems()

NumLib::NonlinearSolverStatus ProcessLib::TimeLoop::solveUncoupledEquationSystems ( const NumLib::Time & t,
const double dt,
const std::size_t timestep_id )
private

Member to solver non coupled systems of equations, which can be a single system of equations, or several systems of equations without any dependency among the different systems.

Parameters
tCurrent time
dtTime step size
timestep_idIndex of the time step
Returns
true: if all nonlinear solvers convergence. false: if any of nonlinear solvers divergences.

Definition at line 641 of file TimeLoop.cpp.

643{
644 NumLib::NonlinearSolverStatus nonlinear_solver_status;
645
646 for (auto const& process_data : _per_process_data)
647 {
648 auto const process_id = process_data->process_id;
649 nonlinear_solver_status = solveMonolithicProcess(
650 t, dt, timestep_id, *process_data, _process_solutions,
652
653 process_data->nonlinear_solver_status = nonlinear_solver_status;
654 if (!nonlinear_solver_status.error_norms_met)
655 {
656 ERR("The nonlinear solver failed in time step #{:d} at t = {} s "
657 "for process #{:d}.",
658 timestep_id, t, process_id);
659
660 if (!process_data->timestep_algorithm->canReduceTimestepSize(
661 process_data->timestep_current,
662 process_data->timestep_previous))
663 {
664 // save unsuccessful solution
665 for (auto const& output : _outputs)
666 {
667 output.doOutputAlways(
668 process_data->process, process_id, timestep_id, t,
669 process_data->nonlinear_solver_status.number_iterations,
671 }
673 }
674
675 return nonlinear_solver_status;
676 }
677 }
678
679 return nonlinear_solver_status;
680}
static constexpr std::string_view timestepper_cannot_reduce_dt
Definition TimeLoop.cpp:638
static NumLib::NonlinearSolverStatus solveMonolithicProcess(const NumLib::Time &t, const double dt, const std::size_t timestep_id, ProcessData const &process_data, std::vector< GlobalVector * > &x, std::vector< GlobalVector * > const &x_prev, std::vector< Output > const &outputs)
Definition TimeLoop.cpp:620

References _outputs, _per_process_data, _process_solutions, _process_solutions_prev, ERR(), NumLib::NonlinearSolverStatus::error_norms_met, OGS_FATAL, ProcessLib::solveMonolithicProcess(), and ProcessLib::timestepper_cannot_reduce_dt.

Referenced by preTsNonlinearSolvePostTs().

Member Data Documentation

◆ _accepted_steps

std::size_t ProcessLib::TimeLoop::_accepted_steps = 0
private

Definition at line 138 of file TimeLoop.h.

Referenced by calculateNextTimeStep(), executeTimeStep(), initialize(), and outputLastTimeStep().

◆ _current_time

NumLib::Time ProcessLib::TimeLoop::_current_time = _start_time
private

◆ _dt

NumLib::TimeIncrement ProcessLib::TimeLoop::_dt {0.}
private

Definition at line 140 of file TimeLoop.h.

140{0.};

Referenced by calculateNextTimeStep(), executeTimeStep(), and initialize().

◆ _end_time

const NumLib::Time ProcessLib::TimeLoop::_end_time
private

◆ _last_step_rejected

bool ProcessLib::TimeLoop::_last_step_rejected = false
private

◆ _outputs

◆ _per_process_data

◆ _process_solutions

◆ _process_solutions_prev

◆ _rejected_steps

std::size_t ProcessLib::TimeLoop::_rejected_steps = 0
private

Definition at line 139 of file TimeLoop.h.

Referenced by calculateNextTimeStep(), initialize(), and outputLastTimeStep().

◆ _repeating_times_of_rejected_step

int ProcessLib::TimeLoop::_repeating_times_of_rejected_step = 0
private

Definition at line 141 of file TimeLoop.h.

Referenced by computeTimeStepping().

◆ _staggered_coupling

std::unique_ptr<NumLib::StaggeredCoupling> ProcessLib::TimeLoop::_staggered_coupling
private

◆ _start_time

const NumLib::Time ProcessLib::TimeLoop::_start_time
private

Definition at line 135 of file TimeLoop.h.

Referenced by initialize(), and preOutputInitialConditions().

◆ successful_time_step

bool ProcessLib::TimeLoop::successful_time_step = true

Definition at line 65 of file TimeLoop.h.

Referenced by executeTimeStep(), and outputLastTimeStep().


The documentation for this class was generated from the following files: