18 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data,
19 std::vector<LocalCouplingParameters>
const& all_local_coupling_parameters)
23 for (
auto const& local_coupling_parameters : all_local_coupling_parameters)
25 for (
auto const& process_name : local_coupling_parameters.process_names)
28 per_process_data.begin(),
29 per_process_data.end(),
30 [&process_name](
auto const& process_data)
31 { return process_data->process_name == process_name; }))
34 "The given process name '{}' for the element "
35 "'time_loop/global_process_coupling/"
36 "local_coupling_processes/process_name' is not found "
37 "in the element 'time_loop/global_process_coupling/"
38 "local_coupling_processes/process_name' in the project "
49 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data,
50 std::vector<LocalCouplingParameters>
const& all_local_coupling_parameters,
51 int const global_max_coupling_iterations,
52 std::vector<std::unique_ptr<NumLib::ConvergenceCriterion>>&
53 global_coupling_conv_criteria)
55 std::vector<CouplingNodeVariant> coupling_nodes;
57 for (
auto const& process_data : per_process_data)
59 auto const& process_name = process_data->process_name;
64 all_local_coupling_parameters.begin(),
65 all_local_coupling_parameters.end(),
66 [&process_name](
auto const& local_coupling_parameters)
68 auto const& process_names =
69 local_coupling_parameters.process_names;
70 return std::find(process_names.begin(), process_names.end(),
71 process_name) != process_names.end();
77 std::string
const used_process_name =
78 process_name.empty() ?
"not given" : process_name;
81 std::move(global_coupling_conv_criteria[process_data->process_id]),
82 global_max_coupling_iterations,
83 process_data->process_id,
85 coupling_nodes.emplace_back(std::move(regular_node));
88 return coupling_nodes;
94 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data,
95 std::vector<LocalCouplingParameters>
const& all_local_coupling_parameters,
96 int const global_max_coupling_iterations,
97 std::vector<std::unique_ptr<NumLib::ConvergenceCriterion>>&
98 global_coupling_conv_criteria)
100 std::vector<CouplingNodeVariant> coupling_nodes;
102 for (
auto const& local_coupling_parameters : all_local_coupling_parameters)
106 for (
auto const& local_process_name :
107 local_coupling_parameters.process_names)
109 if (
auto it = std::find_if(
110 per_process_data.begin(),
111 per_process_data.end(),
112 [&local_process_name](
auto const& process_data) {
113 return process_data->process_name == local_process_name;
115 it != per_process_data.end())
117 auto const& process_data = *it;
120 process_data->process_name,
121 std::move(global_coupling_conv_criteria[process_data
123 local_coupling_parameters.max_iterations,
124 process_data->process_id};
127 std::move(regular_node));
130 coupling_nodes.emplace_back(std::move(root_node));
133 return coupling_nodes;
138 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data,
139 std::vector<LocalCouplingParameters>
const& all_local_coupling_parameters,
140 int const global_max_coupling_iterations,
141 std::vector<std::unique_ptr<NumLib::ConvergenceCriterion>>&
142 global_coupling_conv_criteria)
145 all_local_coupling_parameters);
148 std::vector<CouplingNodeVariant> coupling_nodes =
150 per_process_data, all_local_coupling_parameters,
151 global_max_coupling_iterations, global_coupling_conv_criteria);
154 std::vector<CouplingNodeVariant> root_coupling_nodes =
156 global_max_coupling_iterations,
157 global_coupling_conv_criteria);
159 std::size_t
const num_coupling_nodes =
160 coupling_nodes.size() +
162 root_coupling_nodes.begin(),
163 root_coupling_nodes.end(),
165 [](std::size_t accumulated_sizes,
const auto& coupling_node)
167 return accumulated_sizes +
168 std::get<RootCouplingNode>(coupling_node)
169 .sub_coupling_nodes.size();
172 if (num_coupling_nodes != per_process_data.size())
175 "The number of all coupling nodes including sub-nodes is not "
176 "identical to the number of the processes! Please check the "
177 "element by tag global_process_coupling in the project file.");
180 if (coupling_nodes.empty())
182 coupling_nodes = std::move(root_coupling_nodes);
186 coupling_nodes.reserve(coupling_nodes.size() +
187 root_coupling_nodes.size());
189 std::move(std::begin(root_coupling_nodes),
190 std::end(root_coupling_nodes),
191 std::back_inserter(coupling_nodes));
194 return coupling_nodes;
201 std::vector<std::unique_ptr<ProcessData>>
const& per_process_data)
203 auto [global_coupling_conv_criteria, all_local_coupling_parameters,
206 if (per_process_data.size() != global_coupling_conv_criteria.size())
209 "The number of convergence criteria of the global "
210 "staggered coupling loop is not identical to the number of the "
211 "processes! Please check the element by tag "
212 "global_process_coupling in the project file.");
216 per_process_data, all_local_coupling_parameters,
217 max_coupling_iterations, global_coupling_conv_criteria);
219 return std::make_unique<StaggeredCoupling>(max_coupling_iterations,
220 std::move(coupling_nodes));
std::vector< CouplingNodeVariant > createCouplingNodes(std::vector< std::unique_ptr< ProcessData > > const &per_process_data, std::vector< LocalCouplingParameters > const &all_local_coupling_parameters, int const global_max_coupling_iterations, std::vector< std::unique_ptr< NumLib::ConvergenceCriterion > > &global_coupling_conv_criteria)
std::vector< CouplingNodeVariant > createRootCouplingNodes(std::vector< std::unique_ptr< ProcessData > > const &per_process_data, std::vector< LocalCouplingParameters > const &all_local_coupling_parameters, int const global_max_coupling_iterations, std::vector< std::unique_ptr< NumLib::ConvergenceCriterion > > &global_coupling_conv_criteria)
Create coupling nodes that have local-coupling nodes.
std::vector< CouplingNodeVariant > createRegularCouplingNodes(std::vector< std::unique_ptr< ProcessData > > const &per_process_data, std::vector< LocalCouplingParameters > const &all_local_coupling_parameters, int const global_max_coupling_iterations, std::vector< std::unique_ptr< NumLib::ConvergenceCriterion > > &global_coupling_conv_criteria)
Create coupling nodes that do not have local-coupling nodes.