22 std::unique_ptr<NumLib::TimeStepAlgorithm>&& timestepper,
26 std::unique_ptr<NumLib::TimeDiscretization>&& time_disc,
27 std::unique_ptr<NumLib::ConvergenceCriterion>&& conv_crit,
28 bool const compensate_non_equilibrium_initial_residuum)
32 if (
auto* nonlinear_solver_picard =
36 nonlinear_solver_picard->compensateNonEquilibriumInitialResiduum(
37 compensate_non_equilibrium_initial_residuum);
38 return std::make_unique<ProcessData>(
39 std::move(timestepper), Tag::Picard, *nonlinear_solver_picard,
40 std::move(conv_crit), std::move(time_disc), process_id, process);
42 if (
auto* nonlinear_solver_newton =
46 nonlinear_solver_newton->compensateNonEquilibriumInitialResiduum(
47 compensate_non_equilibrium_initial_residuum);
48 return std::make_unique<ProcessData>(
49 std::move(timestepper), Tag::Newton, *nonlinear_solver_newton,
50 std::move(conv_crit), std::move(time_disc), process_id, process);
53 if (
auto* nonlinear_solver_petsc =
56 return std::make_unique<ProcessData>(
57 std::move(timestepper), Tag::Newton, *nonlinear_solver_petsc,
58 std::move(conv_crit), std::move(time_disc), process_id, process);
62 OGS_FATAL(
"Encountered unknown nonlinear solver type. Aborting");
67 std::vector<std::unique_ptr<Process>>
const& processes,
68 std::map<std::string, std::unique_ptr<NumLib::NonlinearSolverBase>>
const&
71 std::vector<std::unique_ptr<ProcessData>> per_process_data;
78 auto const pcs_name = pcs_config.getConfigAttribute<std::string>(
"ref");
81 [&pcs_name](std::unique_ptr<Process>
const& p)
82 {
return p->name == pcs_name; },
83 "A process with the given name has not been defined.");
85 auto const nl_slv_name =
87 pcs_config.getConfigParameter<std::string>(
"nonlinear_solver");
89 nonlinear_solvers, nl_slv_name,
90 "A nonlinear solver with the given name has not been defined.");
94 pcs_config.getConfigSubtree(
"time_discretization"));
98 pcs_config.getConfigSubtree(
"time_stepping"));
102 pcs_config.getConfigSubtree(
"convergence_criterion"));
104 auto const compensate_non_equilibrium_initial_residuum =
106 pcs_config.getConfigParameter<
bool>(
107 "compensate_non_equilibrium_initial_residuum",
false);
110 auto output = pcs_config.getConfigSubtreeOptional(
"output");
114 "In order to make the specification of output in the project "
115 "file consistent, the variables output tags were moved from "
117 "'//OpenGeoSysProject/time_loop/processes/process/output' to "
118 "the global output section, i.e., to the xpath "
119 "'//OpenGeoSysProject/time_loop/output'. This has to be done "
120 "in the current project file!");
123 per_process_data.emplace_back(
125 std::move(time_disc), std::move(conv_crit),
126 compensate_non_equilibrium_initial_residuum));
130 if (per_process_data.size() != processes.size())
132 if (processes.size() > 1)
135 "Some processes have not been configured to be solved by this "
141 "The equations of the coupled processes will be solved by the "
142 "staggered scheme.");
146 return per_process_data;
void INFO(char const *fmt, Args const &... args)
Range< SubtreeIterator > getConfigSubtreeList(std::string const &root) const
NonlinearSolverTag
Tag used to specify which nonlinear solver will be used.
Map::mapped_type & getOrError(Map &map, Key const &key, std::string const &error_message)
Container::value_type const & getIfOrError(Container const &container, Predicate &&predicate, std::string const &error_message)
std::unique_ptr< TimeStepAlgorithm > createTimeStepper(BaseLib::ConfigTree const &config)
std::unique_ptr< TimeDiscretization > createTimeDiscretization(BaseLib::ConfigTree const &config)
std::unique_ptr< ConvergenceCriterion > createConvergenceCriterion(const BaseLib::ConfigTree &config)
Creates a convergence criterion from the given configuration.
std::vector< std::unique_ptr< ProcessData > > createPerProcessData(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< Process >> const &processes, std::map< std::string, std::unique_ptr< NumLib::NonlinearSolverBase >> const &nonlinear_solvers)
static std::unique_ptr< ProcessData > makeProcessData(std::unique_ptr< NumLib::TimeStepAlgorithm > &×tepper, NumLib::NonlinearSolverBase &nonlinear_solver, int const process_id, Process &process, std::unique_ptr< NumLib::TimeDiscretization > &&time_disc, std::unique_ptr< NumLib::ConvergenceCriterion > &&conv_crit, bool const compensate_non_equilibrium_initial_residuum)