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
67 std::vector<GlobalVector*> const& process_solutions);
68
73 template <typename ProcessData, typename Output>
75 const double t, const double dt, const std::size_t timestep_id,
76 std::vector<GlobalVector*>& process_solutions,
77 std::vector<GlobalVector*> const& process_solutions_prev,
78 std::vector<std::unique_ptr<ProcessData>> const& per_process_data,
79 std::vector<Output> const& outputs,
81 solve_one_time_step_one_process);
82
83private:
86
97 std::vector<CouplingNodeVariant> coupling_nodes_;
98
105 template <typename ProcessData, typename Output>
106 std::tuple<NumLib::NonlinearSolverStatus, bool> executeConcrete(
107 std::vector<CouplingNodeVariant>& coupling_nodes,
108 const int max_iterations, const double t, const double dt,
109 const std::size_t timestep_id,
110 std::vector<GlobalVector*>& process_solutions,
111 std::vector<GlobalVector*> const& process_solutions_prev,
112 std::vector<std::unique_ptr<ProcessData>> const& per_process_data,
113 std::vector<Output> const& outputs,
115 solve_one_time_step_one_process);
116
117 template <typename ProcessData, typename Output>
118 std::tuple<NumLib::NonlinearSolverStatus, bool> executeSubCoupling(
119 CouplingNodeVariant& coupling_node, 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>
130 int const global_coupling_iteration,
131 CouplingNode const& regular_coupling_node, const double t,
132 const double dt, const std::size_t timestep_id,
133 std::vector<GlobalVector*>& process_solutions,
134 std::vector<GlobalVector*> const& process_solutions_prev,
135 std::vector<std::unique_ptr<ProcessData>> const& per_process_data,
136 std::vector<Output> const& outputs,
138 solve_one_time_step_one_process);
139
142 std::vector<GlobalVector*> solutions_of_last_cpl_iteration_;
143
146 std::vector<CouplingNodeVariant> const& coupling_nodes);
147
149 std::vector<CouplingNodeVariant> const& coupling_nodes);
150
151 bool checkCouplingConvergence(const bool convergence_of_last_process,
152 CouplingNode const& coupling_node,
153 GlobalVector const& x) const;
154
155 void updatePreviousSolution(int const process_id, GlobalVector const& x);
156};
157
158} // namespace NumLib
159
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.
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)
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::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)
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
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)
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