17 const double t,
const double dt,
const std::size_t timestep_id,
18 std::vector<GlobalVector*>& process_solutions,
19 std::vector<GlobalVector*>
const& process_solutions_prev,
20 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data,
21 std::vector<Output>
const& outputs,
24 auto [nonlinear_solver_status, coupling_iteration_converged,
25 number_of_coupling_iterations] =
27 timestep_id, process_solutions, process_solutions_prev,
28 per_process_data, outputs,
29 solve_one_time_step_one_process);
38 if (!coupling_iteration_converged &&
39 nonlinear_solver_status.error_norms_met)
42 "The coupling iterations reached their maximum number {:d} in time "
43 "step #{:d} at t = {:g} s. The time step will be rejected.",
46 nonlinear_solver_status.error_norms_met =
false;
49 for (
auto const& process_data : per_process_data)
51 process_data->nonlinear_solver_status.error_norms_met =
false;
55 return nonlinear_solver_status;
60 int const global_coupling_iteration,
61 CouplingNode const& regular_coupling_node,
const double t,
const double dt,
62 const std::size_t timestep_id,
63 std::vector<GlobalVector*>& process_solutions,
64 std::vector<GlobalVector*>
const& process_solutions_prev,
65 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data,
66 std::vector<Output>
const& outputs,
70 time_timestep_process.
start();
72 auto const process_id = regular_coupling_node.
process_id;
73 auto const& process_name = regular_coupling_node.
process_name;
74 INFO(
"Solve process #{:d} (named as {:s})", process_id, process_name);
76 auto& process_data = *(per_process_data[process_id]);
78 process_data.nonlinear_solver_status = solve_one_time_step_one_process(
79 process_solutions, process_solutions_prev, timestep_id, t, dt,
80 process_data, outputs);
83 "[time] Solving process #{:d} (named as {:s}) took {:g} s in "
84 "time step #{} coupling iteration #{}.",
85 process_id, process_name, time_timestep_process.
elapsed(), timestep_id,
86 global_coupling_iteration);
88 return process_data.nonlinear_solver_status;
94 std::vector<CouplingNodeVariant>& coupling_nodes,
const int max_iterations,
95 const double t,
const double dt,
const std::size_t timestep_id,
96 std::vector<GlobalVector*>& process_solutions,
97 std::vector<GlobalVector*>
const& process_solutions_prev,
98 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data,
99 std::vector<Output>
const& outputs,
106 bool coupling_iteration_converged =
true;
107 int number_of_coupling_iterations = 0;
109 int number_of_sub_coupling_iterations = 0;
110 for (
int global_coupling_iteration = 0;
111 global_coupling_iteration < max_iterations;
112 global_coupling_iteration++,
115 coupling_iteration_converged =
true;
116 number_of_coupling_iterations = global_coupling_iteration + 1;
118 INFO(
"Global coupling iteration #{:d} started.",
119 global_coupling_iteration);
121 coupling_iteration_timer.
start();
123 for (
auto& coupling_node : coupling_nodes)
126 if (std::holds_alternative<RootCouplingNode>(coupling_node))
128 auto const [local_nonlinear_solver_status,
129 local_coupling_iteration_converged,
130 local_number_of_coupling_iterations] =
132 coupling_node, t, dt, timestep_id, process_solutions,
133 process_solutions_prev, per_process_data, outputs,
134 solve_one_time_step_one_process);
136 number_of_sub_coupling_iterations =
137 std::max(number_of_sub_coupling_iterations,
138 local_number_of_coupling_iterations);
140 if (!local_nonlinear_solver_status.error_norms_met)
142 coupling_iteration_converged =
false;
143 return {local_nonlinear_solver_status,
144 coupling_iteration_converged,
145 std::max(number_of_coupling_iterations,
146 number_of_sub_coupling_iterations)};
149 coupling_iteration_converged =
150 coupling_iteration_converged &&
151 local_coupling_iteration_converged;
156 std::get<CouplingNode>(coupling_node);
159 global_coupling_iteration, regular_coupling_node, t, dt,
160 timestep_id, process_solutions, process_solutions_prev,
161 per_process_data, outputs, solve_one_time_step_one_process);
166 "The nonlinear solver failed in time step #{:d} at t = "
167 "{:g} s for process {:s}.",
169 coupling_iteration_converged =
false;
170 return {nonlinear_solver_status, coupling_iteration_converged,
171 std::max(number_of_coupling_iterations,
172 number_of_sub_coupling_iterations)};
176 *process_solutions[regular_coupling_node.
process_id];
180 if (global_coupling_iteration > 0)
183 coupling_iteration_converged, regular_coupling_node, x);
192 INFO(
"Global coupling iteration #{:d} took {:g} s.",
193 global_coupling_iteration, coupling_iteration_timer.
elapsed());
194 if (coupling_iteration_converged && global_coupling_iteration > 0)
200 return {nonlinear_solver_status, coupling_iteration_converged,
201 std::max(number_of_coupling_iterations,
202 number_of_sub_coupling_iterations)};
209 const std::size_t timestep_id,
210 std::vector<GlobalVector*>& process_solutions,
211 std::vector<GlobalVector*>
const& process_solutions_prev,
212 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data,
213 std::vector<Output>
const& outputs,
216 INFO(
"--- Execute sub-coupling:");
218 std::get<RootCouplingNode>(coupling_node);
219 const int local_max_iterations =
223 auto const [sub_nonlinear_solver_status, sub_coupling_iteration_converged,
224 sub_number_of_coupling_iterations] =
227 timestep_id, process_solutions, process_solutions_prev,
228 per_process_data, outputs, solve_one_time_step_one_process);
230 INFO(
"--- End sub-coupling.");
231 return {sub_nonlinear_solver_status, sub_coupling_iteration_converged,
232 sub_number_of_coupling_iterations};
NumLib::NonlinearSolverStatus executeSingleIteration(int const global_coupling_iteration, CouplingNode const ®ular_coupling_node, const double t, const double dt, const std::size_t timestep_id, std::vector< GlobalVector * > &process_solutions, std::vector< GlobalVector * > const &process_solutions_prev, std::vector< std::unique_ptr< ProcessData > > const &per_process_data, std::vector< Output > const &outputs, ProcessSolver< ProcessData, Output > const &solve_one_time_step_one_process)
std::tuple< NumLib::NonlinearSolverStatus, bool, int > executeSubCoupling(CouplingNodeVariant &coupling_node, const double t, const double dt, const std::size_t timestep_id, std::vector< GlobalVector * > &process_solutions, std::vector< GlobalVector * > const &process_solutions_prev, std::vector< std::unique_ptr< ProcessData > > const &per_process_data, std::vector< Output > const &outputs, ProcessSolver< ProcessData, Output > const &solve_one_time_step_one_process)
std::tuple< NumLib::NonlinearSolverStatus, bool, int > executeConcrete(std::vector< CouplingNodeVariant > &coupling_nodes, const int max_iterations, const double t, const double dt, const std::size_t timestep_id, std::vector< GlobalVector * > &process_solutions, std::vector< GlobalVector * > const &process_solutions_prev, std::vector< std::unique_ptr< ProcessData > > const &per_process_data, std::vector< Output > const &outputs, ProcessSolver< ProcessData, Output > const &solve_one_time_step_one_process)