From a6100c002971a018df8548de450ef255ec739cdf Mon Sep 17 00:00:00 2001 From: Wenqing Wang <wenqing.wang@ufz.de> Date: Tue, 7 Feb 2017 17:36:41 +0100 Subject: [PATCH] [Coupling] Other minor changed according to the comments by Christoph --- .../t_convergence_criterion.md | 2 +- .../i_max_iteration.md => t_max_iter.md} | 0 ProcessLib/UncoupledProcessesTimeLoop.cpp | 33 ++++++++++++------- ProcessLib/UncoupledProcessesTimeLoop.h | 4 ++- ProcessLib/VectorMatrixAssembler.cpp | 15 +++++---- 5 files changed, 33 insertions(+), 21 deletions(-) rename Documentation/ProjectFile/prj/time_loop/global_process_coupling/{max_iteration => }/t_convergence_criterion.md (90%) rename Documentation/ProjectFile/prj/time_loop/global_process_coupling/{max_iteration/i_max_iteration.md => t_max_iter.md} (100%) diff --git a/Documentation/ProjectFile/prj/time_loop/global_process_coupling/max_iteration/t_convergence_criterion.md b/Documentation/ProjectFile/prj/time_loop/global_process_coupling/t_convergence_criterion.md similarity index 90% rename from Documentation/ProjectFile/prj/time_loop/global_process_coupling/max_iteration/t_convergence_criterion.md rename to Documentation/ProjectFile/prj/time_loop/global_process_coupling/t_convergence_criterion.md index eeb834757bc..cc1a434ed44 100644 --- a/Documentation/ProjectFile/prj/time_loop/global_process_coupling/max_iteration/t_convergence_criterion.md +++ b/Documentation/ProjectFile/prj/time_loop/global_process_coupling/t_convergence_criterion.md @@ -1,2 +1,2 @@ Defines the convergence criteria of the global un-coupling loop of the staggered - scheme. \ No newline at end of file + scheme. diff --git a/Documentation/ProjectFile/prj/time_loop/global_process_coupling/max_iteration/i_max_iteration.md b/Documentation/ProjectFile/prj/time_loop/global_process_coupling/t_max_iter.md similarity index 100% rename from Documentation/ProjectFile/prj/time_loop/global_process_coupling/max_iteration/i_max_iteration.md rename to Documentation/ProjectFile/prj/time_loop/global_process_coupling/t_max_iter.md diff --git a/ProcessLib/UncoupledProcessesTimeLoop.cpp b/ProcessLib/UncoupledProcessesTimeLoop.cpp index 2612356056c..ab2301a1e8c 100644 --- a/ProcessLib/UncoupledProcessesTimeLoop.cpp +++ b/ProcessLib/UncoupledProcessesTimeLoop.cpp @@ -364,10 +364,10 @@ std::unique_ptr<UncoupledProcessesTimeLoop> createUncoupledProcessesTimeLoop( if (coupling_config) { max_coupling_iterations - //! \ogs_file_param{prj__time_loop__global_process_coupling__max_iteration} - = coupling_config->getConfigParameter<unsigned>("max_iteration"); + //! \ogs_file_param{prj__time_loop__global_process_coupling__max_iter} + = coupling_config->getConfigParameter<unsigned>("max_iter"); coupling_conv_crit = NumLib::createConvergenceCriterion( - //! \ogs_file_param{prj__time_loop__global_process_coupling__max_iteration__convergence_criterion} + //! \ogs_file_param{prj__time_loop__global_process_coupling__convergence_criterion} coupling_config->getConfigSubtree("convergence_criterion")); } @@ -500,10 +500,10 @@ bool UncoupledProcessesTimeLoop::setCoupledSolutions() { auto const& coupled_processes = spd->coupled_processes; std::unordered_map<std::type_index, GlobalVector const&> coupled_xs; - for (auto const& coupled_process_map : coupled_processes) + for (auto const& coupled_process_pair : coupled_processes) { ProcessLib::Process const& coupled_process = - coupled_process_map.second; + coupled_process_pair.second; auto const found_item = std::find_if( _per_process_data.begin(), _per_process_data.end(), @@ -516,24 +516,24 @@ bool UncoupledProcessesTimeLoop::setCoupledSolutions() if (found_item != _per_process_data.end()) { // Id of the coupled process: - const std::size_t c_id = found_item - _per_process_data.begin(); + const std::size_t c_id = + std::distance(_per_process_data.begin(), found_item); BaseLib::insertIfTypeIndexKeyUniqueElseError( - coupled_xs, coupled_process_map.first, + coupled_xs, coupled_process_pair.first, *_process_solutions[c_id], "global_coupled_x"); } } _solutions_of_coupled_processes.emplace_back(coupled_xs); - const auto x = _process_solutions[pcs_idx]; + auto const x = *_process_solutions[pcs_idx]; // Create a vector to store the solution of the last coupling iteration - auto x_coupling0 = - &NumLib::GlobalVectorProvider::provider.getVector(*x); - MathLib::LinAlg::copy(*x, *x_coupling0); + auto& x_coupling0 = NumLib::GlobalVectorProvider::provider.getVector(x); + MathLib::LinAlg::copy(x, x_coupling0); // append a solution vector of suitable size - _solutions_of_last_cpl_iteration.emplace_back(x_coupling0); + _solutions_of_last_cpl_iteration.emplace_back(&x_coupling0); ++pcs_idx; } // end of for (auto& spd : _per_process_data) @@ -541,6 +541,15 @@ bool UncoupledProcessesTimeLoop::setCoupledSolutions() return true; } +/* + * TODO: + * Now we have a structure inside the time loop which is very similar to the + * nonlinear solver. And admittedly, the control flow inside the nonlinear + * solver is rather complicated. Maybe in the future con can introduce an + * abstraction that can do both the convergence checks of the coupling loop and + * of the nonlinear solver. + * + */ bool UncoupledProcessesTimeLoop::loop() { // initialize output, convergence criterion, etc. diff --git a/ProcessLib/UncoupledProcessesTimeLoop.h b/ProcessLib/UncoupledProcessesTimeLoop.h index 2c6b1bbb87a..497e1276a92 100644 --- a/ProcessLib/UncoupledProcessesTimeLoop.h +++ b/ProcessLib/UncoupledProcessesTimeLoop.h @@ -31,7 +31,9 @@ namespace ProcessLib { struct SingleProcessData; -//! Time loop capable of time-integrating several uncoupled processes at once. +/// Time loop capable of time-integrating several processes at once. +/// TODO: Rename to, e.g., TimeLoop, since it is not for purely uncoupled stuff +/// anymore. class UncoupledProcessesTimeLoop { public: diff --git a/ProcessLib/VectorMatrixAssembler.cpp b/ProcessLib/VectorMatrixAssembler.cpp index 5e454b28ce1..a82bd789339 100644 --- a/ProcessLib/VectorMatrixAssembler.cpp +++ b/ProcessLib/VectorMatrixAssembler.cpp @@ -27,22 +27,22 @@ getPreviousLocalSolutionsOfCoupledProcesses( std::unordered_map<std::type_index, const std::vector<double>> local_coupled_xs0; - for (auto const& coupled_process_map : coupling_term.coupled_processes) + for (auto const& coupled_process_pair : coupling_term.coupled_processes) { - auto const& coupled_pcs = coupled_process_map.second; + auto const& coupled_pcs = coupled_process_pair.second; auto const prevous_time_x = coupled_pcs.getPreviousTimeStepSolution(); if (prevous_time_x) { auto const local_coupled_x0 = prevous_time_x->get(indices); BaseLib::insertIfTypeIndexKeyUniqueElseError( - local_coupled_xs0, coupled_process_map.first, local_coupled_x0, + local_coupled_xs0, coupled_process_pair.first, local_coupled_x0, "local_coupled_x0"); } else { const std::vector<double> local_coupled_x0; BaseLib::insertIfTypeIndexKeyUniqueElseError( - local_coupled_xs0, coupled_process_map.first, local_coupled_x0, + local_coupled_xs0, coupled_process_pair.first, local_coupled_x0, "local_coupled_x0"); } } @@ -58,12 +58,13 @@ getCurrentLocalSolutionsOfCoupledProcesses( std::unordered_map<std::type_index, const std::vector<double>> local_coupled_xs; - for (auto const& global_coupled_x_map : global_coupled_xs) + // Get local nodal solutions of the coupled equations. + for (auto const& global_coupled_x_pair : global_coupled_xs) { - auto const coupled_x = global_coupled_x_map.second; + auto const& coupled_x = global_coupled_x_pair.second; auto const local_coupled_x = coupled_x.get(indices); BaseLib::insertIfTypeIndexKeyUniqueElseError( - local_coupled_xs, global_coupled_x_map.first, local_coupled_x, + local_coupled_xs, global_coupled_x_pair.first, local_coupled_x, "local_coupled_x"); } return local_coupled_xs; -- GitLab