OGS
CreateThermoRichardsMechanicsProcess.cpp
Go to the documentation of this file.
1
12
13#include <cassert>
14
17
18#ifdef OGS_USE_MFRONT
21#endif
22
26#include "ParameterLib/Utils.h"
32
33namespace ProcessLib
34{
35namespace ThermoRichardsMechanics
36{
38 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
39{
40 std::array const required_medium_properties = {
44 std::array const required_liquid_properties = {
46 std::array const required_solid_properties = {MaterialPropertyLib::density};
47
48 // Thermal properties are not checked because they can be phase property or
49 // medium property (will be enabled later).
50 for (auto const& m : media)
51 {
52 checkRequiredProperties(*m.second, required_medium_properties);
53 checkRequiredProperties(m.second->phase("AqueousLiquid"),
54 required_liquid_properties);
55 checkRequiredProperties(m.second->phase("Solid"),
56 required_solid_properties);
57 }
58}
59
61 const int dim)
62{
63 DBUG("Associate displacement with process variable '{:s}'.",
64 variable.getName());
65
66 if (variable.getNumberOfGlobalComponents() != dim)
67 {
69 "Number of components of the process variable '{:s}' is different "
70 "from the displacement dimension: got {:d}, expected {:d}",
71 variable.getName(),
73 dim);
74 }
75}
76
77template <int DisplacementDim, typename ConstitutiveTraits,
78 typename CreateConstitutiveSetting>
80 std::string const& name, MeshLib::Mesh& mesh,
81 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
82 std::vector<ProcessVariable> const& variables,
83 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
84 std::optional<ParameterLib::CoordinateSystem> const&
85 local_coordinate_system,
86 unsigned const integration_order, BaseLib::ConfigTree const& config,
87 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media,
88 bool const mandatory_stress0_type)
89{
90 auto const coupling_scheme =
92 config.getConfigParameterOptional<std::string>("coupling_scheme");
93 const bool use_monolithic_scheme =
94 !(coupling_scheme && (*coupling_scheme == "staggered"));
95
97
99 auto const pv_config = config.getConfigSubtree("process_variables");
100
101 ProcessVariable* variable_T;
102 ProcessVariable* variable_p;
103 ProcessVariable* variable_u;
104 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
105 process_variables;
106 if (use_monolithic_scheme) // monolithic scheme.
107 {
110 auto per_process_variables = findProcessVariables(
111 variables, pv_config,
112 {
113 "temperature",
115 "pressure",
117 "displacement"});
118 variable_T = &per_process_variables[0].get();
119 variable_p = &per_process_variables[1].get();
120 variable_u = &per_process_variables[2].get();
121 process_variables.push_back(std::move(per_process_variables));
122 }
123 else // staggered scheme.
124 {
125 OGS_FATAL(
126 "So far, only the monolithic scheme is implemented for "
127 "THERMO_RICHARDS_MECHANICS");
128 }
129
130 checkProcessVariableComponents(*variable_T, 1);
131 checkProcessVariableComponents(*variable_p, 1);
132 checkProcessVariableComponents(*variable_u, DisplacementDim);
133
135
136 auto solid_constitutive_relations =
137 CreateConstitutiveSetting::createSolidConstitutiveRelations(
138 parameters, local_coordinate_system, materialIDs(mesh), config);
139
140 // Specific body force
141 Eigen::Matrix<double, DisplacementDim, 1> specific_body_force;
142 {
143 std::vector<double> const b =
145 config.getConfigParameter<std::vector<double>>(
146 "specific_body_force");
147 if (b.size() != DisplacementDim)
148 {
149 OGS_FATAL(
150 "The size of the specific body force vector does not match the "
151 "displacement dimension. Vector size is {:d}, displacement "
152 "dimension is {:d}",
153 b.size(), DisplacementDim);
154 }
155
156 std::copy_n(b.data(), b.size(), specific_body_force.data());
157 }
158
159 auto media_map =
161 DBUG(
162 "Check the media properties of ThermoRichardsMechanics process "
163 "...");
164 checkMPLProperties(media);
165 DBUG("Media properties verified.");
166
168 config, parameters, mesh, mandatory_stress0_type);
169
170 bool mass_lumping = false;
171 if (auto const mass_lumping_ptr =
173 config.getConfigParameterOptional<bool>("mass_lumping"))
174 {
175 DBUG("Using mass lumping for the Richards flow equation.");
176 mass_lumping = *mass_lumping_ptr;
177 }
178
179 bool const apply_body_force_for_deformation =
181 config.getConfigParameter<bool>("apply_body_force_for_deformation",
182 true);
183
184 bool const initialize_porosity_from_medium_property =
186 config.getConfigParameter("initialize_porosity_from_medium_property",
187 true);
188
189 const bool use_TaylorHood_elements =
190 variable_p->getShapeFunctionOrder() !=
191 variable_u->getShapeFunctionOrder()
192 ? true
193 : false;
194
196 process_data{materialIDs(mesh),
197 std::move(media_map),
198 std::move(solid_constitutive_relations),
199 std::move(initial_stress),
200 specific_body_force,
201 mass_lumping,
202 use_TaylorHood_elements,
203 apply_body_force_for_deformation,
205 initialize_porosity_from_medium_property}};
206
207 SecondaryVariableCollection secondary_variables;
208
209 ProcessLib::createSecondaryVariables(config, secondary_variables);
210
211 return std::make_unique<
213 name, mesh, std::move(jacobian_assembler), parameters,
214 integration_order, std::move(process_variables),
215 std::move(process_data), std::move(secondary_variables),
216 use_monolithic_scheme);
217}
218
219template <int DisplacementDim>
221 std::string const& name,
222 MeshLib::Mesh& mesh,
223 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
224 std::vector<ProcessVariable> const& variables,
225 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
226 std::optional<ParameterLib::CoordinateSystem> const&
227 local_coordinate_system,
228 unsigned const integration_order,
229 BaseLib::ConfigTree const& config,
230 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
231{
233 config.checkConfigParameter("type", "THERMO_RICHARDS_MECHANICS");
234 DBUG("Create ThermoRichardsMechanicsProcess.");
235
236 auto const subtype =
238 config.getConfigParameter<std::string>("subtype",
239 "Stress_StrainTemperature");
240 INFO("TRM process subtype is '{}'", subtype);
241
242 if (subtype == "Stress_StrainTemperature")
243 {
244 bool const mandatory_stress0_type = false;
246 DisplacementDim,
248 DisplacementDim>,
250 DisplacementDim>>(name, mesh, std::move(jacobian_assembler),
251 variables, parameters,
252 local_coordinate_system, integration_order,
253 config, media, mandatory_stress0_type);
254 }
255
256 if (subtype == "StressSaturation_StrainPressureTemperature")
257 {
258#ifdef OGS_USE_MFRONT
259 bool const mandatory_stress0_type = true;
261 DisplacementDim,
262 ConstitutiveStressSaturation_StrainPressureTemperature::
263 ConstitutiveTraits<DisplacementDim>,
264 ConstitutiveStressSaturation_StrainPressureTemperature::
265 CreateConstitutiveSetting<DisplacementDim>>(
266 name, mesh, std::move(jacobian_assembler), variables, parameters,
267 local_coordinate_system, integration_order, config, media,
268 mandatory_stress0_type);
269#else
270 OGS_FATAL(
271 "TRM process subtype 'StressSaturation_StrainPressureTemperature' "
272 "is not supported, because OGS has not been built with MFront.");
273#endif
274 }
275
276 OGS_FATAL("Unknown TRM process subtype '{}'.", subtype);
277}
278
279template std::unique_ptr<Process> createThermoRichardsMechanicsProcess<2>(
280 std::string const& name,
281 MeshLib::Mesh& mesh,
282 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
283 std::vector<ProcessVariable> const& variables,
284 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
285 std::optional<ParameterLib::CoordinateSystem> const&
286 local_coordinate_system,
287 unsigned const integration_order,
288 BaseLib::ConfigTree const& config,
289 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
290
291template std::unique_ptr<Process> createThermoRichardsMechanicsProcess<3>(
292 std::string const& name,
293 MeshLib::Mesh& mesh,
294 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
295 std::vector<ProcessVariable> const& variables,
296 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
297 std::optional<ParameterLib::CoordinateSystem> const&
298 local_coordinate_system,
299 unsigned const integration_order,
300 BaseLib::ConfigTree const& config,
301 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
302
303} // namespace ThermoRichardsMechanics
304} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:26
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:35
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:30
std::optional< T > getConfigParameterOptional(std::string const &param) const
T getConfigParameter(std::string const &param) const
ConfigTree getConfigSubtree(std::string const &root) const
void checkConfigParameter(std::string const &param, std::string_view const value) const
unsigned getShapeFunctionOrder() const
std::string const & getName() const
int getNumberOfGlobalComponents() const
Returns the number of components of the process variable.
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...
MaterialSpatialDistributionMap createMaterialSpatialDistributionMap(std::map< int, std::shared_ptr< Medium > > const &media, MeshLib::Mesh const &mesh)
void checkMPLProperties(std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
std::unique_ptr< Process > createThermoRichardsMechanicsProcessStage2(std::string const &name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::AbstractJacobianAssembler > &&jacobian_assembler, std::vector< ProcessVariable > const &variables, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, std::optional< ParameterLib::CoordinateSystem > const &local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const &config, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media, bool const mandatory_stress0_type)
void checkProcessVariableComponents(ProcessVariable const &variable, const int dim)
template std::unique_ptr< Process > createThermoRichardsMechanicsProcess< 3 >(std::string const &name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::AbstractJacobianAssembler > &&jacobian_assembler, std::vector< ProcessVariable > const &variables, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, std::optional< ParameterLib::CoordinateSystem > const &local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const &config, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
template std::unique_ptr< Process > createThermoRichardsMechanicsProcess< 2 >(std::string const &name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::AbstractJacobianAssembler > &&jacobian_assembler, std::vector< ProcessVariable > const &variables, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, std::optional< ParameterLib::CoordinateSystem > const &local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const &config, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
std::unique_ptr< Process > createThermoRichardsMechanicsProcess(std::string const &name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::AbstractJacobianAssembler > &&jacobian_assembler, std::vector< ProcessVariable > const &variables, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, std::optional< ParameterLib::CoordinateSystem > const &local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const &config, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
std::vector< std::reference_wrapper< ProcessVariable > > findProcessVariables(std::vector< ProcessVariable > const &variables, BaseLib::ConfigTree const &pv_config, std::initializer_list< std::string > tags)
InitialStress createInitialStress(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, MeshLib::Mesh const &mesh, bool const mandatory_stress_type)
void createSecondaryVariables(BaseLib::ConfigTree const &config, SecondaryVariableCollection &secondary_variables)