OGS
StaggeredCoupling.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <functional>
7#include <memory>
8#include <tuple>
9#include <variant>
10#include <vector>
11
16
17namespace NumLib
18{
19
22{
23 std::string process_name;
24 std::unique_ptr<NumLib::ConvergenceCriterion> convergence_criterion;
27};
28
30{
32 using CouplingNodeVariant = std::variant<CouplingNode, RootCouplingNode>;
33 std::vector<CouplingNodeVariant> sub_coupling_nodes;
34};
35
39{
40 template <typename ProcessData, typename Output>
42 std::vector<GlobalVector*>& /*xs*/,
43 std::vector<GlobalVector*> const& /*xs_prev*/,
44 std::size_t const /*timestep*/, double const /*t*/,
45 double const /*delta_t*/, ProcessData const& /*process_data*/,
46 std::vector<Output> const& /*outputs*/)>;
47
48 using CouplingNodeVariant = std::variant<CouplingNode, RootCouplingNode>;
49
50public:
51 StaggeredCoupling(const int global_coupling_max_iterations,
52 std::vector<CouplingNodeVariant>&& coupling_nodes)
53 : global_coupling_max_iterations_(global_coupling_max_iterations),
54 coupling_nodes_(std::move(coupling_nodes))
55 {
56 }
57
59
66
74 std::vector<GlobalVector*> const& process_solutions);
75
80 template <typename ProcessData, typename Output>
82 const double t, const double dt, const std::size_t timestep_id,
83 std::vector<GlobalVector*>& process_solutions,
84 std::vector<GlobalVector*> const& process_solutions_prev,
85 std::vector<std::unique_ptr<ProcessData>> const& per_process_data,
86 std::vector<Output> const& outputs,
88 solve_one_time_step_one_process);
89
90private:
93
97
108 std::vector<CouplingNodeVariant> coupling_nodes_;
109
116 template <typename ProcessData, typename Output>
117 std::tuple<NumLib::NonlinearSolverStatus, bool, int> executeConcrete(
118 std::vector<CouplingNodeVariant>& coupling_nodes,
119 const int max_iterations, const double t, const double dt,
120 const std::size_t timestep_id,
121 std::vector<GlobalVector*>& process_solutions,
122 std::vector<GlobalVector*> const& process_solutions_prev,
123 std::vector<std::unique_ptr<ProcessData>> const& per_process_data,
124 std::vector<Output> const& outputs,
126 solve_one_time_step_one_process);
127
128 template <typename ProcessData, typename Output>
129 std::tuple<NumLib::NonlinearSolverStatus, bool, int> executeSubCoupling(
130 CouplingNodeVariant& coupling_node, const double t, const double dt,
131 const std::size_t timestep_id,
132 std::vector<GlobalVector*>& process_solutions,
133 std::vector<GlobalVector*> const& process_solutions_prev,
134 std::vector<std::unique_ptr<ProcessData>> const& per_process_data,
135 std::vector<Output> const& outputs,
137 solve_one_time_step_one_process);
138
139 template <typename ProcessData, typename Output>
141 int const global_coupling_iteration,
142 CouplingNode const& regular_coupling_node, const double t,
143 const double dt, const std::size_t timestep_id,
144 std::vector<GlobalVector*>& process_solutions,
145 std::vector<GlobalVector*> const& process_solutions_prev,
146 std::vector<std::unique_ptr<ProcessData>> const& per_process_data,
147 std::vector<Output> const& outputs,
149 solve_one_time_step_one_process);
150
153 std::vector<GlobalVector*> solutions_of_last_cpl_iteration_;
154
157 std::vector<CouplingNodeVariant> const& coupling_nodes);
158
160 std::vector<CouplingNodeVariant> const& coupling_nodes);
161
162 bool checkCouplingConvergence(const bool convergence_of_last_process,
163 CouplingNode const& coupling_node,
164 GlobalVector const& x) const;
165
166 void updatePreviousSolution(int const process_id, GlobalVector const& x);
167};
168
169} // namespace NumLib
170
MathLib::EigenVector GlobalVector
NumLib::NonlinearSolverStatus executeSingleIteration(int const global_coupling_iteration, CouplingNode const &regular_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)
void initializeCoupledSolutions(std::vector< GlobalVector * > const &process_solutions)
const int global_coupling_max_iterations_
Maximum iteration number of the coupling loop of the staggered scheme.
void resetCouplingConvergenceCriteria(std::vector< CouplingNodeVariant > const &coupling_nodes)
std::vector< GlobalVector * > solutions_of_last_cpl_iteration_
void setFirstIterationIndicator(std::vector< CouplingNodeVariant > const &coupling_nodes)
Set the indicator of the first staggered coupling iteration be true.
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::vector< CouplingNodeVariant > coupling_nodes_
std::function< NumLib::NonlinearSolverStatus( std::vector< GlobalVector * > &, std::vector< GlobalVector * > const &, std::size_t const, double const, double const, ProcessData const &, std::vector< Output > const &)> ProcessSolver
StaggeredCoupling(const int global_coupling_max_iterations, std::vector< CouplingNodeVariant > &&coupling_nodes)
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)
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)
bool checkCouplingConvergence(const bool convergence_of_last_process, CouplingNode const &coupling_node, GlobalVector const &x) const
int lastNumberOfCouplingIterations() const
void updatePreviousSolution(int const process_id, GlobalVector const &x)
std::variant< CouplingNode, RootCouplingNode > CouplingNodeVariant
Information of a coupling node.
std::unique_ptr< NumLib::ConvergenceCriterion > convergence_criterion
Status of the non-linear solver.
std::variant< CouplingNode, RootCouplingNode > CouplingNodeVariant
std::vector< CouplingNodeVariant > sub_coupling_nodes