15 const double t,
const double dt,
const std::size_t timestep_id,
16 std::vector<GlobalVector*>& process_solutions,
17 std::vector<GlobalVector*>
const& process_solutions_prev,
18 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data,
19 std::vector<Output>
const& outputs,
22 auto const [nonlinear_solver_status, coupling_iteration_converged] =
24 timestep_id, process_solutions, process_solutions_prev,
25 per_process_data, outputs,
26 solve_one_time_step_one_process);
28 if (!coupling_iteration_converged)
31 "The coupling iterations reaches its maximum number in time step "
36 return nonlinear_solver_status;
41 int const global_coupling_iteration,
42 CouplingNode const& regular_coupling_node,
const double t,
const double dt,
43 const std::size_t timestep_id,
44 std::vector<GlobalVector*>& process_solutions,
45 std::vector<GlobalVector*>
const& process_solutions_prev,
46 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data,
47 std::vector<Output>
const& outputs,
51 time_timestep_process.
start();
53 auto const process_id = regular_coupling_node.
process_id;
54 auto const& process_name = regular_coupling_node.
process_name;
55 INFO(
"Solve process #{:d} (named as {:s})", process_id, process_name);
57 auto& process_data = *(per_process_data[process_id]);
59 process_data.nonlinear_solver_status = solve_one_time_step_one_process(
60 process_solutions, process_solutions_prev, timestep_id, t, dt,
61 process_data, outputs);
64 "[time] Solving process #{:d} (named as {:s}) took {:g} s in "
65 "time step #{} coupling iteration #{}.",
66 process_id, process_name, time_timestep_process.
elapsed(), timestep_id,
67 global_coupling_iteration);
69 return process_data.nonlinear_solver_status;
75 std::vector<CouplingNodeVariant>& coupling_nodes,
const int max_iterations,
76 const double t,
const double dt,
const std::size_t timestep_id,
77 std::vector<GlobalVector*>& process_solutions,
78 std::vector<GlobalVector*>
const& process_solutions_prev,
79 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data,
80 std::vector<Output>
const& outputs,
87 bool coupling_iteration_converged =
true;
88 for (
int global_coupling_iteration = 0;
89 global_coupling_iteration < max_iterations;
90 global_coupling_iteration++,
93 coupling_iteration_converged =
true;
95 INFO(
"Global coupling iteration #{:d} started.",
96 global_coupling_iteration);
98 coupling_iteration_timer.
start();
100 for (
auto& coupling_node : coupling_nodes)
103 if (std::holds_alternative<RootCouplingNode>(coupling_node))
105 auto const [local_nonlinear_solver_status,
106 local_coupling_iteration_converged] =
108 coupling_node, t, dt, timestep_id, process_solutions,
109 process_solutions_prev, per_process_data, outputs,
110 solve_one_time_step_one_process);
112 if (!local_nonlinear_solver_status.error_norms_met)
114 coupling_iteration_converged =
false;
115 return {local_nonlinear_solver_status,
116 coupling_iteration_converged};
119 coupling_iteration_converged =
120 coupling_iteration_converged &&
121 local_coupling_iteration_converged;
126 std::get<CouplingNode>(coupling_node);
129 global_coupling_iteration, regular_coupling_node, t, dt,
130 timestep_id, process_solutions, process_solutions_prev,
131 per_process_data, outputs, solve_one_time_step_one_process);
136 "The nonlinear solver failed in time step #{:d} at t = "
137 "{:g} s for process {:s}.",
139 coupling_iteration_converged =
false;
140 return {nonlinear_solver_status, coupling_iteration_converged};
144 *process_solutions[regular_coupling_node.
process_id];
148 if (global_coupling_iteration > 0)
151 coupling_iteration_converged, regular_coupling_node, x);
160 INFO(
"Global coupling iteration #{:d} took {:g} s.",
161 global_coupling_iteration, coupling_iteration_timer.
elapsed());
162 if (coupling_iteration_converged && global_coupling_iteration > 0)
168 return {nonlinear_solver_status, coupling_iteration_converged};
175 const std::size_t timestep_id,
176 std::vector<GlobalVector*>& process_solutions,
177 std::vector<GlobalVector*>
const& process_solutions_prev,
178 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data,
179 std::vector<Output>
const& outputs,
182 INFO(
"--- Execute sub-coupling:");
184 std::get<RootCouplingNode>(coupling_node);
185 const int local_max_iterations =
189 auto const [sub_nonlinear_solver_status, sub_coupling_iteration_converged] =
192 timestep_id, process_solutions, process_solutions_prev,
193 per_process_data, outputs, solve_one_time_step_one_process);
195 INFO(
"--- End sub-coupling.");
196 return {sub_nonlinear_solver_status, sub_coupling_iteration_converged};
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 > 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)
NumLib::NonlinearSolverStatus execute(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 > 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)