From 458fa3d405a11a713397d4335d2ff99484248834 Mon Sep 17 00:00:00 2001 From: Christoph Lehmann <christoph.lehmann@ufz.de> Date: Thu, 2 Nov 2023 09:42:02 +0100 Subject: [PATCH] [PL] Pass all coupled solutions to postNonLinearSolver() --- .../HydroMechanics/HydroMechanicsProcess.cpp | 5 +++-- .../HydroMechanics/HydroMechanicsProcess.h | 8 ++++---- ProcessLib/LocalAssemblerInterface.cpp | 9 +++++---- ProcessLib/LocalAssemblerInterface.h | 3 ++- ProcessLib/PhaseField/PhaseFieldProcess.cpp | 3 ++- ProcessLib/PhaseField/PhaseFieldProcess.h | 8 ++++---- ProcessLib/Process.cpp | 18 +++++++++++++----- ProcessLib/Process.h | 8 +++++--- .../ThermoMechanicalPhaseFieldProcess.cpp | 4 ++-- .../ThermoMechanicalPhaseFieldProcess.h | 8 ++++---- ProcessLib/TimeLoop.cpp | 3 +-- 11 files changed, 45 insertions(+), 32 deletions(-) diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp index 96b6c733696..11fdc1a13ac 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp +++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp @@ -421,8 +421,9 @@ void HydroMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess( template <int DisplacementDim> void HydroMechanicsProcess<DisplacementDim>::postNonLinearSolverConcreteProcess( - GlobalVector const& x, GlobalVector const& x_prev, const double t, - double const dt, const int process_id) + std::vector<GlobalVector*> const& x, + std::vector<GlobalVector*> const& x_prev, const double t, double const dt, + const int process_id) { DBUG("PostNonLinearSolver HydroMechanicsProcess."); diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.h b/ProcessLib/HydroMechanics/HydroMechanicsProcess.h index a493d60de08..6a1cf557087 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.h +++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.h @@ -97,10 +97,10 @@ private: const double t, const double dt, int const process_id) override; - void postNonLinearSolverConcreteProcess(GlobalVector const& x, - GlobalVector const& x_prev, - const double t, double const dt, - int const process_id) override; + void postNonLinearSolverConcreteProcess( + std::vector<GlobalVector*> const& x, + std::vector<GlobalVector*> const& x_prev, const double t, + double const dt, int const process_id) override; void setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x, double const t, diff --git a/ProcessLib/LocalAssemblerInterface.cpp b/ProcessLib/LocalAssemblerInterface.cpp index def554c2e3a..5ed9d363e76 100644 --- a/ProcessLib/LocalAssemblerInterface.cpp +++ b/ProcessLib/LocalAssemblerInterface.cpp @@ -162,13 +162,14 @@ void LocalAssemblerInterface::postTimestep( void LocalAssemblerInterface::postNonLinearSolver( std::size_t const mesh_item_id, - NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x, - GlobalVector const& x_prev, double const t, double const dt, + NumLib::LocalToGlobalIndexMap const& dof_table, + std::vector<GlobalVector*> const& x, + std::vector<GlobalVector*> const& x_prev, double const t, double const dt, bool const use_monolithic_scheme, int const process_id) { auto const indices = NumLib::getIndices(mesh_item_id, dof_table); - auto const local_x = x.get(indices); - auto const local_x_prev = x_prev.get(indices); + auto const local_x = x[process_id]->get(indices); + auto const local_x_prev = x_prev[process_id]->get(indices); postNonLinearSolverConcrete(local_x, local_x_prev, t, dt, use_monolithic_scheme, process_id); diff --git a/ProcessLib/LocalAssemblerInterface.h b/ProcessLib/LocalAssemblerInterface.h index 0034cecce20..75252fba2d6 100644 --- a/ProcessLib/LocalAssemblerInterface.h +++ b/ProcessLib/LocalAssemblerInterface.h @@ -97,7 +97,8 @@ public: void postNonLinearSolver(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const& dof_table, - GlobalVector const& x, GlobalVector const& x_prev, + std::vector<GlobalVector*> const& x, + std::vector<GlobalVector*> const& x_prev, double const t, double const dt, bool const use_monolithic_scheme, int const process_id); diff --git a/ProcessLib/PhaseField/PhaseFieldProcess.cpp b/ProcessLib/PhaseField/PhaseFieldProcess.cpp index 5cbe52ab02a..5a725b1f352 100644 --- a/ProcessLib/PhaseField/PhaseFieldProcess.cpp +++ b/ProcessLib/PhaseField/PhaseFieldProcess.cpp @@ -333,7 +333,8 @@ void PhaseFieldProcess<DisplacementDim>::postTimestepConcreteProcess( template <int DisplacementDim> void PhaseFieldProcess<DisplacementDim>::postNonLinearSolverConcreteProcess( - GlobalVector const& x, GlobalVector const& /*x_prev*/, const double t, + std::vector<GlobalVector*> const& x, + std::vector<GlobalVector*> const& /*x_prev*/, const double t, double const /*dt*/, const int process_id) { _process_data.crack_volume = 0.0; diff --git a/ProcessLib/PhaseField/PhaseFieldProcess.h b/ProcessLib/PhaseField/PhaseFieldProcess.h index ba2680f6eac..e7b1a995931 100644 --- a/ProcessLib/PhaseField/PhaseFieldProcess.h +++ b/ProcessLib/PhaseField/PhaseFieldProcess.h @@ -82,10 +82,10 @@ private: const double t, const double delta_t, int const process_id) override; - void postNonLinearSolverConcreteProcess(GlobalVector const& x, - GlobalVector const& x_prev, - const double t, double const dt, - int const process_id) override; + void postNonLinearSolverConcreteProcess( + std::vector<GlobalVector*> const& x, + std::vector<GlobalVector*> const& x_prev, const double t, + double const dt, int const process_id) override; void updateConstraints(GlobalVector& lower, GlobalVector& upper, int const process_id) override; diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp index 86ac40a84e4..3aa82bf248c 100644 --- a/ProcessLib/Process.cpp +++ b/ProcessLib/Process.cpp @@ -414,12 +414,20 @@ void Process::postTimestep(std::vector<GlobalVector*> const& x, _boundary_conditions[process_id].postTimestep(t, x, process_id); } -void Process::postNonLinearSolver(GlobalVector const& x, - GlobalVector const& x_prev, const double t, - double const dt, int const process_id) +void Process::postNonLinearSolver(std::vector<GlobalVector*> const& x, + std::vector<GlobalVector*> const& x_prev, + const double t, double const dt, + int const process_id) { - MathLib::LinAlg::setLocalAccessibleVector(x); - MathLib::LinAlg::setLocalAccessibleVector(x_prev); + for (auto* const solution : x) + { + MathLib::LinAlg::setLocalAccessibleVector(*solution); + } + for (auto* const solution : x_prev) + { + MathLib::LinAlg::setLocalAccessibleVector(*solution); + } + postNonLinearSolverConcreteProcess(x, x_prev, t, dt, process_id); } diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h index d72b136fbea..77b10f70eb4 100644 --- a/ProcessLib/Process.h +++ b/ProcessLib/Process.h @@ -68,7 +68,8 @@ public: /// Calculates secondary variables, e.g. stress and strain for deformation /// analysis, only after nonlinear solver being successfully conducted. - void postNonLinearSolver(GlobalVector const& x, GlobalVector const& x_prev, + void postNonLinearSolver(std::vector<GlobalVector*> const& x, + std::vector<GlobalVector*> const& x_prev, const double t, double const dt, int const process_id); @@ -267,8 +268,9 @@ private: } virtual void postNonLinearSolverConcreteProcess( - GlobalVector const& /*x*/, GlobalVector const& /*x_prev*/, - const double /*t*/, double const /*dt*/, int const /*process_id*/) + std::vector<GlobalVector*> const& /*x*/, + std::vector<GlobalVector*> const& /*x_prev*/, const double /*t*/, + double const /*dt*/, int const /*process_id*/) { } diff --git a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp index 49251ed7e7f..bb990ace0aa 100644 --- a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp +++ b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp @@ -306,8 +306,8 @@ void ThermoMechanicalPhaseFieldProcess<DisplacementDim>:: template <int DisplacementDim> void ThermoMechanicalPhaseFieldProcess<DisplacementDim>:: - postNonLinearSolverConcreteProcess(GlobalVector const& x, - GlobalVector const& x_prev, + postNonLinearSolverConcreteProcess(std::vector<GlobalVector*> const& x, + std::vector<GlobalVector*> const& x_prev, const double t, double const dt, const int process_id) { diff --git a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.h b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.h index 2fa5633e108..cc6cec90450 100644 --- a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.h +++ b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.h @@ -114,10 +114,10 @@ private: double const t, double const dt, int const process_id) override; - void postNonLinearSolverConcreteProcess(GlobalVector const& x, - GlobalVector const& x_prev, - const double t, double const dt, - int const process_id) override; + void postNonLinearSolverConcreteProcess( + std::vector<GlobalVector*> const& x, + std::vector<GlobalVector*> const& x_prev, const double t, + double const dt, int const process_id) override; // To be replaced. NumLib::LocalToGlobalIndexMap& getDOFTableByProcessID( diff --git a/ProcessLib/TimeLoop.cpp b/ProcessLib/TimeLoop.cpp index 7822438802c..fa4825680f1 100644 --- a/ProcessLib/TimeLoop.cpp +++ b/ProcessLib/TimeLoop.cpp @@ -256,8 +256,7 @@ NumLib::NonlinearSolverStatus solveOneTimeStepOneProcess( return nonlinear_solver_status; } - process.postNonLinearSolver(*x[process_id], *x_prev[process_id], t, delta_t, - process_id); + process.postNonLinearSolver(x, x_prev, t, delta_t, process_id); return nonlinear_solver_status; } -- GitLab