From eaafa23883ec0c2581132b7d726202b7d2b69d6e Mon Sep 17 00:00:00 2001 From: Dmitri Naumov <dmitri.naumov@ufz.de> Date: Mon, 28 Jan 2019 16:07:03 +0100 Subject: [PATCH] [PL] Infrastructure for setInitialConditions(). Some processes might require setup of the initial conditions dependent variables in local assemblers. The new interface allows such implementations. --- ProcessLib/LocalAssemblerInterface.cpp | 10 ++++++++++ ProcessLib/LocalAssemblerInterface.h | 9 +++++++++ ProcessLib/Process.cpp | 2 ++ ProcessLib/Process.h | 4 ++++ 4 files changed, 25 insertions(+) diff --git a/ProcessLib/LocalAssemblerInterface.cpp b/ProcessLib/LocalAssemblerInterface.cpp index bdc455178f1..98c59588e90 100644 --- a/ProcessLib/LocalAssemblerInterface.cpp +++ b/ProcessLib/LocalAssemblerInterface.cpp @@ -78,6 +78,16 @@ void LocalAssemblerInterface::computeSecondaryVariable( computeSecondaryVariableConcrete(t, local_x); } +void LocalAssemblerInterface::setInitialConditions( + std::size_t const mesh_item_id, + NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x) +{ + auto const indices = NumLib::getIndices(mesh_item_id, dof_table); + auto const local_x = x.get(indices); + + setInitialConditionsConcrete(local_x); +} + void LocalAssemblerInterface::preTimestep( std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x, diff --git a/ProcessLib/LocalAssemblerInterface.h b/ProcessLib/LocalAssemblerInterface.h index 4c22ce42d91..02cb41bcd1b 100644 --- a/ProcessLib/LocalAssemblerInterface.h +++ b/ProcessLib/LocalAssemblerInterface.h @@ -34,6 +34,10 @@ class LocalAssemblerInterface public: virtual ~LocalAssemblerInterface() = default; + virtual void setInitialConditions( + std::size_t const mesh_item_id, + NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x); + virtual void preAssemble(double const /*t*/, std::vector<double> const& /*local_x*/){}; @@ -96,6 +100,11 @@ public: } private: + virtual void setInitialConditionsConcrete( + std::vector<double> const& /*local_x*/) + { + } + virtual void preTimestepConcrete(std::vector<double> const& /*local_x*/, double const /*t*/, double const /*dt*/) { diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp index 5c6bb2843b3..57ef8b47d93 100644 --- a/ProcessLib/Process.cpp +++ b/ProcessLib/Process.cpp @@ -121,6 +121,7 @@ void Process::setInitialConditions(const int process_id, double const t, variable_id < per_process_variables.size(); variable_id++) { + MathLib::LinAlg::setLocalAccessibleVector(x); SpatialPosition pos; auto const& pv = per_process_variables[variable_id]; @@ -163,6 +164,7 @@ void Process::setInitialConditions(const int process_id, double const t, } } } + setInitialConditionsConcreteProcess(x); } MathLib::MatrixSpecifications Process::getMatrixSpecifications( diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h index d1d22bdfb41..44c099591af 100644 --- a/ProcessLib/Process.h +++ b/ProcessLib/Process.h @@ -176,6 +176,10 @@ private: /// processes. It is called by initialize(). virtual void initializeBoundaryConditions(); + virtual void setInitialConditionsConcreteProcess(GlobalVector const& /*x*/) + { + } + virtual void preAssembleConcreteProcess(const double /*t*/, GlobalVector const& /*x*/) { -- GitLab