OGS
ThermoRichardsMechanicsProcess.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
5
6#include <cassert>
7
8#include "BaseLib/Error.h"
15#include "ProcessLib/Process.h"
19
20namespace ProcessLib
21{
23{
24template <int DisplacementDim, typename ConstitutiveTraits>
27 std::string name, MeshLib::Mesh& mesh,
28 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&&
29 jacobian_assembler,
30 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const&
31 parameters,
32 unsigned const integration_order,
33 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>&&
34 process_variables,
36 ConstitutiveTraits>&& process_data,
37 SecondaryVariableCollection&& secondary_variables,
38 bool const use_monolithic_scheme, bool const is_linear)
39 : Process(std::move(name), mesh, std::move(jacobian_assembler), parameters,
40 integration_order, std::move(process_variables),
41 std::move(secondary_variables), use_monolithic_scheme),
43 ThermoRichardsMechanicsProcess<DisplacementDim, ConstitutiveTraits>>{
44 *_jacobian_assembler, is_linear, use_monolithic_scheme},
45 process_data_(std::move(process_data))
46{
48 DisplacementDim>(LocalAssemblerIF::getReflectionDataForOutput(),
49 _integration_point_writer, integration_order,
50 local_assemblers_);
51
52 // For numerical Jacobian
53 if (this->_jacobian_assembler->isPerturbationEnabled())
54 {
56 "Numerical Jacobian is not implemented for "
57 "ThermoRichardsMechanicsProcess.");
58 }
59}
60
61template <int DisplacementDim, typename ConstitutiveTraits>
62bool ThermoRichardsMechanicsProcess<DisplacementDim,
63 ConstitutiveTraits>::isLinear() const
64{
66 DisplacementDim, ConstitutiveTraits>>::isLinear();
67}
68
69template <int DisplacementDim, typename ConstitutiveTraits>
71 DisplacementDim,
72 ConstitutiveTraits>::getMatrixSpecifications(const int /*process_id*/) const
73{
74 auto const& l = *_local_to_global_index_map;
75 return {l.dofSizeWithoutGhosts(), l.dofSizeWithoutGhosts(),
76 &l.getGhostIndices(), &this->_sparsity_pattern};
77}
78
79template <int DisplacementDim, typename ConstitutiveTraits>
80void ThermoRichardsMechanicsProcess<DisplacementDim,
81 ConstitutiveTraits>::constructDofTable()
82{
83 // Create single component dof in every of the mesh's nodes.
84 _mesh_subset_all_nodes = std::make_unique<MeshLib::MeshSubset>(
85 _mesh, _mesh.getNodes(), process_data_.use_TaylorHood_elements);
86 // Create single component dof in the mesh's base nodes.
88 mesh_subset_base_nodes_ = std::make_unique<MeshLib::MeshSubset>(
89 _mesh, base_nodes_, process_data_.use_TaylorHood_elements);
90
91 // TODO move the two data members somewhere else.
92 // for extrapolation of secondary variables of stress or strain
93 std::vector<MeshLib::MeshSubset> all__meshsubsets_single_component{
96 std::make_unique<NumLib::LocalToGlobalIndexMap>(
97 std::move(all__meshsubsets_single_component),
98 // by location order is needed for output
100
101 // For temperature, which is the first variable.
102 std::vector<MeshLib::MeshSubset> all__meshsubsets{*mesh_subset_base_nodes_};
103
104 // For pressure, which is the second variable
105 all__meshsubsets.push_back(*mesh_subset_base_nodes_);
106
107 // For displacement.
108 const int monolithic_process_id = 0;
109 std::generate_n(std::back_inserter(all__meshsubsets),
110 getProcessVariables(monolithic_process_id)[2]
111 .get()
112 .getNumberOfGlobalComponents(),
113 [&]() { return *_mesh_subset_all_nodes; });
114
115 std::vector<int> const vec_n_components{1, 1, DisplacementDim};
117 std::make_unique<NumLib::LocalToGlobalIndexMap>(
118 std::move(all__meshsubsets), vec_n_components,
121}
122
123template <int DisplacementDim, typename ConstitutiveTraits>
126 MeshLib::Mesh const& mesh,
127 unsigned const integration_order)
128{
130 mesh.getElements(), dof_table, local_assemblers_,
131 NumLib::IntegrationOrder{integration_order}, mesh.isAxiallySymmetric(),
133
134 auto add_secondary_variable = [&](std::string const& name,
135 int const num_components,
136 auto get_ip_values_function)
137 {
138 _secondary_variables.addSecondaryVariable(
139 name,
140 makeExtrapolator(num_components, getExtrapolator(),
142 std::move(get_ip_values_function)));
143 };
144
148
149 //
150 // enable output of internal variables defined by material models
151 //
153 LocalAssemblerIF>(process_data_.solid_materials,
154 add_secondary_variable);
155
158 process_data_.solid_materials, local_assemblers_,
159 _integration_point_writer, integration_order);
160
161 process_data_.pressure_interpolated =
163 const_cast<MeshLib::Mesh&>(mesh), "pressure_interpolated",
165 process_data_.temperature_interpolated =
167 const_cast<MeshLib::Mesh&>(mesh), "temperature_interpolated",
169
172
173 // Initialize local assemblers after all variables have been set.
177}
178
179template <int DisplacementDim, typename ConstitutiveTraits>
182 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const&
183 media)
184{
185 const int process_id = 0;
187 *_local_to_global_index_map, process_id, media);
188}
189
190template <int DisplacementDim, typename ConstitutiveTraits>
192 setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x,
193 double const t,
194 int const process_id)
195{
196 DBUG("SetInitialConditions ThermoRichardsMechanicsProcess.");
197
200 getDOFTables(x.size()), x, t, process_id);
201}
202
203template <int DisplacementDim, typename ConstitutiveTraits>
205 assembleConcreteProcess(const double /*t*/, double const /*dt*/,
206 std::vector<GlobalVector*> const& /*x*/,
207 std::vector<GlobalVector*> const& /*x_prev*/,
208 int const /*process_id*/, GlobalMatrix& /*M*/,
209 GlobalMatrix& /*K*/, GlobalVector& /*b*/)
210{
211 OGS_FATAL(
212 "The Picard method or the Newton-Raphson method with numerical "
213 "Jacobian is not implemented for ThermoRichardsMechanics with the full "
214 "monolithic coupling scheme");
215}
216
217template <int DisplacementDim, typename ConstitutiveTraits>
220 const double t, double const dt, std::vector<GlobalVector*> const& x,
221 std::vector<GlobalVector*> const& x_prev, int const process_id,
222 GlobalVector& b, GlobalMatrix& Jac)
223{
225 DisplacementDim, ConstitutiveTraits>>::assembleWithJacobian(t, dt, x,
226 x_prev,
227 process_id,
228 b, Jac);
229}
230
231template <int DisplacementDim, typename ConstitutiveTraits>
233 preTimestepConcreteProcess(std::vector<GlobalVector*> const& /*x*/,
234 const double /*t*/,
235 const double /*dt*/,
236 const int /*process_id*/)
237{
239 DisplacementDim, ConstitutiveTraits>>::updateActiveElements();
240}
241
242template <int DisplacementDim, typename ConstitutiveTraits>
243std::vector<std::vector<std::string>>
246 std::vector<std::reference_wrapper<MeshLib::Mesh>> const& meshes)
247{
248 INFO("TRM process initializeSubmeshOutput().");
249 std::vector<std::vector<std::string>> residuum_names{
250 {"HeatFlowRate", "MassFlowRate", "NodalForces"}};
251
254 initializeAssemblyOnSubmeshes(meshes, residuum_names);
255
256 return residuum_names;
257}
258
259template <int DisplacementDim, typename ConstitutiveTraits>
261 postTimestepConcreteProcess(std::vector<GlobalVector*> const& x,
262 std::vector<GlobalVector*> const& x_prev,
263 double const t, double const dt,
264 const int process_id)
265{
266 DBUG("PostTimestep ThermoRichardsMechanicsProcess.");
267
270 getActiveElementIDs(), getDOFTables(x.size()), x, x_prev, t, dt,
271 process_id);
272}
273
274template <int DisplacementDim, typename ConstitutiveTraits>
276 computeSecondaryVariableConcrete(const double t, const double dt,
277 std::vector<GlobalVector*> const& x,
278 GlobalVector const& x_prev,
279 int const process_id)
280{
281 DBUG("Compute the secondary variables for ThermoRichardsMechanicsProcess.");
282
285 getActiveElementIDs(), getDOFTables(x.size()), t, dt, x, x_prev,
286 process_id);
287
289}
290
291template <int DisplacementDim, typename ConstitutiveTraits>
292std::tuple<NumLib::LocalToGlobalIndexMap*, bool> ThermoRichardsMechanicsProcess<
293 DisplacementDim, ConstitutiveTraits>::getDOFTableForExtrapolatorData() const
294{
295 const bool manage_storage = false;
296 return std::make_tuple(local_to_global_index_map_single_component_.get(),
297 manage_storage);
298}
299
300template <int DisplacementDim, typename ConstitutiveTraits>
302 DisplacementDim, ConstitutiveTraits>::getDOFTable(const int /*process_id*/)
303 const
304{
306}
307
308template class ThermoRichardsMechanicsProcess<
310template class ThermoRichardsMechanicsProcess<
312
313#if OGS_USE_MFRONT
314template class ThermoRichardsMechanicsProcess<
315 2, ConstitutiveStressSaturation_StrainPressureTemperature::
316 ConstitutiveTraits<2>>;
317template class ThermoRichardsMechanicsProcess<
318 3, ConstitutiveStressSaturation_StrainPressureTemperature::
319 ConstitutiveTraits<3>>;
320#endif
321
322} // namespace ThermoRichardsMechanics
323} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
MathLib::EigenMatrix GlobalMatrix
MathLib::EigenVector GlobalVector
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:28
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:22
bool isAxiallySymmetric() const
Definition Mesh.h:128
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
Definition Mesh.h:100
Properties & getProperties()
Definition Mesh.h:125
virtual void postTimestep(std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, double const t, double const dt, int const process_id)
virtual void computeSecondaryVariable(std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_prev, int const process_id)
virtual void initialize(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table)
virtual void setInitialConditions(std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, double const t, int const process_id)
std::string const name
Definition Process.h:361
std::vector< NumLib::LocalToGlobalIndexMap const * > getDOFTables(int const number_of_processes) const
Definition Process.cpp:376
std::vector< std::unique_ptr< MeshLib::IntegrationPointWriter > > _integration_point_writer
Definition Process.h:389
void initializeProcessBoundaryConditionsAndSourceTerms(const NumLib::LocalToGlobalIndexMap &dof_table, const int process_id, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
Definition Process.cpp:83
CellAverageData cell_average_data_
Definition Process.h:371
Process(std::string name_, MeshLib::Mesh &mesh, std::unique_ptr< AbstractJacobianAssembler > &&jacobian_assembler, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, unsigned const integration_order, std::vector< std::vector< std::reference_wrapper< ProcessVariable > > > &&process_variables, SecondaryVariableCollection &&secondary_variables, const bool use_monolithic_scheme=true)
Definition Process.cpp:37
std::unique_ptr< MeshLib::MeshSubset const > _mesh_subset_all_nodes
Definition Process.h:365
MeshLib::Mesh & _mesh
Definition Process.h:364
std::vector< std::size_t > const & getActiveElementIDs() const
Definition Process.h:160
SecondaryVariableCollection _secondary_variables
Definition Process.h:369
std::unique_ptr< NumLib::LocalToGlobalIndexMap > _local_to_global_index_map
Definition Process.h:367
std::unique_ptr< ProcessLib::AbstractJacobianAssembler > _jacobian_assembler
Definition Process.h:375
void assembleWithJacobian(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalVector &b, GlobalMatrix &Jac) final
Definition Process.cpp:279
std::vector< std::vector< std::reference_wrapper< ProcessVariable > > > const & getProcessVariables() const
Definition Process.h:149
NumLib::Extrapolator & getExtrapolator() const
Definition Process.h:201
GlobalSparsityPattern _sparsity_pattern
Definition Process.h:391
Handles configuration of several secondary variables from the project file.
Global assembler for the monolithic scheme of the non-isothermal Richards flow coupled with mechanics...
void assembleConcreteProcess(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b) override
void preTimestepConcreteProcess(std::vector< GlobalVector * > const &, const double, const double, const int) override
void computeSecondaryVariableConcrete(double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_prev, int const process_id) override
void assembleWithJacobianConcreteProcess(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalVector &b, GlobalMatrix &Jac) override
ThermoRichardsMechanicsProcessData< DisplacementDim, ConstitutiveTraits > process_data_
std::vector< std::vector< std::string > > initializeAssemblyOnSubmeshes(std::vector< std::reference_wrapper< MeshLib::Mesh > > const &meshes) override
NumLib::LocalToGlobalIndexMap const & getDOFTable(const int process_id) const override
std::tuple< NumLib::LocalToGlobalIndexMap *, bool > getDOFTableForExtrapolatorData() const override
void setInitialConditionsConcreteProcess(std::vector< GlobalVector * > &x, double const t, int const process_id) override
void initializeBoundaryConditions(std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media) override
std::unique_ptr< NumLib::LocalToGlobalIndexMap > local_to_global_index_map_single_component_
void initializeConcreteProcess(NumLib::LocalToGlobalIndexMap const &dof_table, MeshLib::Mesh const &mesh, unsigned const integration_order) override
Process specific initialization called by initialize().
void postTimestepConcreteProcess(std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, double const t, double const dt, const int process_id) override
MathLib::MatrixSpecifications getMatrixSpecifications(const int process_id) const override
LocalAssemblerInterface< DisplacementDim, ConstitutiveTraits > LocalAssemblerIF
ThermoRichardsMechanicsProcess(std::string name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::AbstractJacobianAssembler > &&jacobian_assembler, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, unsigned const integration_order, std::vector< std::vector< std::reference_wrapper< ProcessVariable > > > &&process_variables, ThermoRichardsMechanicsProcessData< DisplacementDim, ConstitutiveTraits > &&process_data, SecondaryVariableCollection &&secondary_variables, bool const use_monolithic_scheme, bool const is_linear)
PropertyVector< T > * getOrCreateMeshProperty(Mesh &mesh, std::string const &property_name, MeshItemType const item_type, int const number_of_components)
std::vector< Node * > getBaseNodes(std::vector< Element * > const &elements)
@ BY_LOCATION
Ordering data by spatial location.
void solidMaterialInternalVariablesToIntegrationPointWriter(std::map< int, std::shared_ptr< SolidMaterial > > const &solid_materials, std::vector< std::unique_ptr< LocalAssemblerInterface > > const &local_assemblers, std::vector< std::unique_ptr< MeshLib::IntegrationPointWriter > > &integration_point_writer, int const integration_order)
void solidMaterialInternalToSecondaryVariables(std::map< int, std::shared_ptr< SolidMaterial > > const &solid_materials, AddSecondaryVariableCallback const &add_secondary_variable)
void addReflectedSecondaryVariables(ReflData const &reflection_data, SecondaryVariableCollection &secondary_variables, NumLib::Extrapolator &extrapolator, std::vector< std::unique_ptr< LocAsmIF > > const &local_assemblers)
void addReflectedIntegrationPointWriters(ReflData const &reflection_data, std::vector< std::unique_ptr< MeshLib::IntegrationPointWriter > > &integration_point_writers, unsigned const integration_order, std::vector< std::unique_ptr< LocAsmIF > > const &local_assemblers)
void createLocalAssemblers(std::vector< MeshLib::Element * > const &mesh_elements, NumLib::LocalToGlobalIndexMap const &dof_table, std::vector< std::unique_ptr< LocalAssemblerInterface< DisplacementDim, ConstitutiveTraits > > > &local_assemblers, NumLib::IntegrationOrder const integration_order, bool const is_axially_symmetric, ThermoRichardsMechanicsProcessData< DisplacementDim, ConstitutiveTraits > &process_data)
void computeCellAverages(CellAverageData &cell_average_data, std::vector< std::unique_ptr< LAIntf > > const &local_assemblers)
SecondaryVariableFunctions makeExtrapolator(const unsigned num_components, NumLib::Extrapolator &extrapolator, LocalAssemblerCollection const &local_assemblers, typename NumLib::ExtrapolatableLocalAssemblerCollection< LocalAssemblerCollection >::IntegrationPointValuesMethod integration_point_values_method)
void setIPDataInitialConditions(std::vector< std::unique_ptr< MeshLib::IntegrationPointWriter > > const &_integration_point_writer, MeshLib::Properties const &mesh_properties, LocalAssemblersVector &local_assemblers)
static void executeSelectedMemberOnDereferenced(Method method, Container const &container, std::vector< std::size_t > const &active_container_ids, Args &&... args)
static void executeMemberOnDereferenced(Method method, Container const &container, Args &&... args)