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 = {
45 std::array const required_liquid_properties = {
47 std::array const required_solid_properties = {MaterialPropertyLib::density};
48
49 // Thermal properties are not checked because they can be phase property or
50 // medium property (will be enabled later).
51 for (auto const& m : media)
52 {
53 checkRequiredProperties(*m.second, required_medium_properties);
54 checkRequiredProperties(m.second->phase("AqueousLiquid"),
55 required_liquid_properties);
56 checkRequiredProperties(m.second->phase("Solid"),
57 required_solid_properties);
58 }
59}
60
62 const int dim)
63{
64 DBUG("Associate displacement with process variable '{:s}'.",
65 variable.getName());
66
67 if (variable.getNumberOfGlobalComponents() != dim)
68 {
70 "Number of components of the process variable '{:s}' is different "
71 "from the displacement dimension: got {:d}, expected {:d}",
72 variable.getName(),
74 dim);
75 }
76}
77
78template <int DisplacementDim, typename ConstitutiveTraits,
79 typename CreateConstitutiveSetting>
81 std::string const& name, MeshLib::Mesh& mesh,
82 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
83 std::vector<ProcessVariable> const& variables,
84 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
85 std::optional<ParameterLib::CoordinateSystem> const&
86 local_coordinate_system,
87 unsigned const integration_order, BaseLib::ConfigTree const& config,
88 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media,
89 bool const mandatory_stress0_type)
90{
91 auto const coupling_scheme =
93 config.getConfigParameterOptional<std::string>("coupling_scheme");
94 const bool use_monolithic_scheme =
95 !(coupling_scheme && (*coupling_scheme == "staggered"));
96
98
100 auto const pv_config = config.getConfigSubtree("process_variables");
101
102 ProcessVariable* variable_T;
103 ProcessVariable* variable_p;
104 ProcessVariable* variable_u;
105 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
106 process_variables;
107 if (use_monolithic_scheme) // monolithic scheme.
108 {
111 auto per_process_variables = findProcessVariables(
112 variables, pv_config,
113 {
114 "temperature",
116 "pressure",
118 "displacement"});
119 variable_T = &per_process_variables[0].get();
120 variable_p = &per_process_variables[1].get();
121 variable_u = &per_process_variables[2].get();
122 process_variables.push_back(std::move(per_process_variables));
123 }
124 else // staggered scheme.
125 {
126 OGS_FATAL(
127 "So far, only the monolithic scheme is implemented for "
128 "THERMO_RICHARDS_MECHANICS");
129 }
130
131 checkProcessVariableComponents(*variable_T, 1);
132 checkProcessVariableComponents(*variable_p, 1);
133 checkProcessVariableComponents(*variable_u, DisplacementDim);
134
136
137 auto solid_constitutive_relations =
138 CreateConstitutiveSetting::createSolidConstitutiveRelations(
139 parameters, local_coordinate_system, config);
140
141 // Specific body force
142 Eigen::Matrix<double, DisplacementDim, 1> specific_body_force;
143 {
144 std::vector<double> const b =
146 config.getConfigParameter<std::vector<double>>(
147 "specific_body_force");
148 if (b.size() != DisplacementDim)
149 {
150 OGS_FATAL(
151 "The size of the specific body force vector does not match the "
152 "displacement dimension. Vector size is {:d}, displacement "
153 "dimension is {:d}",
154 b.size(), DisplacementDim);
155 }
156
157 std::copy_n(b.data(), b.size(), specific_body_force.data());
158 }
159
160 auto media_map =
162 DBUG(
163 "Check the media properties of ThermoRichardsMechanics process "
164 "...");
165 checkMPLProperties(media);
166 DBUG("Media properties verified.");
167
168 auto initial_stress = ProcessLib::createInitialStress<DisplacementDim>(
169 config, parameters, mesh, mandatory_stress0_type);
170
171 bool mass_lumping = false;
172 if (auto const mass_lumping_ptr =
174 config.getConfigParameterOptional<bool>("mass_lumping"))
175 {
176 DBUG("Using mass lumping for the Richards flow equation.");
177 mass_lumping = *mass_lumping_ptr;
178 }
179
180 bool const apply_body_force_for_deformation =
182 config.getConfigParameter<bool>("apply_body_force_for_deformation",
183 true);
184
185 bool const initialize_porosity_from_medium_property =
187 config.getConfigParameter("initialize_porosity_from_medium_property",
188 true);
189
190 const bool use_TaylorHood_elements =
191 variable_p->getShapeFunctionOrder() !=
192 variable_u->getShapeFunctionOrder()
193 ? true
194 : false;
195
197 process_data{materialIDs(mesh),
198 std::move(media_map),
199 std::move(solid_constitutive_relations),
200 std::move(initial_stress),
201 specific_body_force,
202 mass_lumping,
203 use_TaylorHood_elements,
204 apply_body_force_for_deformation,
206 initialize_porosity_from_medium_property}};
207
208 SecondaryVariableCollection secondary_variables;
209
210 ProcessLib::createSecondaryVariables(config, secondary_variables);
211
212 return std::make_unique<
214 name, mesh, std::move(jacobian_assembler), parameters,
215 integration_order, std::move(process_variables),
216 std::move(process_data), std::move(secondary_variables),
217 use_monolithic_scheme);
218}
219
220template <int DisplacementDim>
222 std::string const& name,
223 MeshLib::Mesh& mesh,
224 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
225 std::vector<ProcessVariable> const& variables,
226 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
227 std::optional<ParameterLib::CoordinateSystem> const&
228 local_coordinate_system,
229 unsigned const integration_order,
230 BaseLib::ConfigTree const& config,
231 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
232{
234 config.checkConfigParameter("type", "THERMO_RICHARDS_MECHANICS");
235 DBUG("Create ThermoRichardsMechanicsProcess.");
236
237 auto const subtype =
239 config.getConfigParameter<std::string>("subtype",
240 "Stress_StrainTemperature");
241 INFO("TRM process subtype is '{}'", subtype);
242
243 if (subtype == "Stress_StrainTemperature")
244 {
245 bool const mandatory_stress0_type = false;
247 DisplacementDim,
249 DisplacementDim>,
251 DisplacementDim>>(name, mesh, std::move(jacobian_assembler),
252 variables, parameters,
253 local_coordinate_system, integration_order,
254 config, media, mandatory_stress0_type);
255 }
256
257 if (subtype == "StressSaturation_StrainPressureTemperature")
258 {
259#ifdef OGS_USE_MFRONT
260 bool const mandatory_stress0_type = true;
262 DisplacementDim,
263 ConstitutiveStressSaturation_StrainPressureTemperature::
264 ConstitutiveTraits<DisplacementDim>,
265 ConstitutiveStressSaturation_StrainPressureTemperature::
266 CreateConstitutiveSetting<DisplacementDim>>(
267 name, mesh, std::move(jacobian_assembler), variables, parameters,
268 local_coordinate_system, integration_order, config, media,
269 mandatory_stress0_type);
270#else
271 OGS_FATAL(
272 "TRM process subtype 'StressSaturation_StrainPressureTemperature' "
273 "is not supported, because OGS has not been built with MFront.");
274#endif
275 }
276
277 OGS_FATAL("Unknown TRM process subtype '{}'.", subtype);
278}
279
280template std::unique_ptr<Process> createThermoRichardsMechanicsProcess<2>(
281 std::string const& name,
282 MeshLib::Mesh& mesh,
283 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
284 std::vector<ProcessVariable> const& variables,
285 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
286 std::optional<ParameterLib::CoordinateSystem> const&
287 local_coordinate_system,
288 unsigned const integration_order,
289 BaseLib::ConfigTree const& config,
290 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
291
292template std::unique_ptr<Process> createThermoRichardsMechanicsProcess<3>(
293 std::string const& name,
294 MeshLib::Mesh& mesh,
295 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
296 std::vector<ProcessVariable> const& variables,
297 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
298 std::optional<ParameterLib::CoordinateSystem> const&
299 local_coordinate_system,
300 unsigned const integration_order,
301 BaseLib::ConfigTree const& config,
302 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
303
304} // namespace ThermoRichardsMechanics
305} // 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)
void createSecondaryVariables(BaseLib::ConfigTree const &config, SecondaryVariableCollection &secondary_variables)