31 std::map<
int, std::shared_ptr<MaterialPropertyLib::Medium>>
const& media)
33 std::array
const required_medium_properties = {
37 std::array
const required_liquid_properties = {
43 for (
auto const& m : media)
45 checkRequiredProperties(*m.second, required_medium_properties);
46 checkRequiredProperties(
48 required_liquid_properties);
49 checkRequiredProperties(
51 required_solid_properties);
58 DBUG(
"Associate displacement with process variable '{:s}'.",
64 "Number of components of the process variable '{:s}' is different "
65 "from the displacement dimension: got {:d}, expected {:d}",
72template <
int DisplacementDim,
typename ConstitutiveTraits,
73 typename CreateConstitutiveSetting>
76 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
77 std::vector<ProcessVariable>
const& variables,
78 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
79 std::optional<ParameterLib::CoordinateSystem>
const&
80 local_coordinate_system,
82 std::map<
int, std::shared_ptr<MaterialPropertyLib::Medium>>
const& media,
83 bool const mandatory_stress0_type)
85 auto const coupling_scheme =
88 const bool use_monolithic_scheme =
89 !(coupling_scheme && (*coupling_scheme ==
"staggered"));
99 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
101 if (use_monolithic_scheme)
106 variables, pv_config,
113 variable_T = &per_process_variables[0].get();
114 variable_p = &per_process_variables[1].get();
115 variable_u = &per_process_variables[2].get();
116 process_variables.push_back(std::move(per_process_variables));
121 "So far, only the monolithic scheme is implemented for "
122 "THERMO_RICHARDS_MECHANICS");
131 auto solid_constitutive_relations =
132 CreateConstitutiveSetting::createSolidConstitutiveRelations(
133 parameters, local_coordinate_system, materialIDs(mesh), config);
136 Eigen::Matrix<double, DisplacementDim, 1> specific_body_force;
138 std::vector<double>
const b =
141 "specific_body_force");
142 if (b.size() != DisplacementDim)
145 "The size of the specific body force vector does not match the "
146 "displacement dimension. Vector size is {:d}, displacement "
148 b.size(), DisplacementDim);
151 std::copy_n(b.data(), b.size(), specific_body_force.data());
157 "Check the media properties of ThermoRichardsMechanics process "
160 DBUG(
"Media properties verified.");
163 config, parameters, mesh, mandatory_stress0_type);
165 bool mass_lumping =
false;
166 if (
auto const mass_lumping_ptr =
170 DBUG(
"Using mass lumping for the Richards flow equation.");
171 mass_lumping = *mass_lumping_ptr;
174 bool const apply_body_force_for_deformation =
179 bool const initialize_porosity_from_medium_property =
184 auto const is_linear =
188 const bool use_TaylorHood_elements =
195 process_data{materialIDs(mesh),
196 std::move(media_map),
197 std::move(solid_constitutive_relations),
198 std::move(initial_stress),
201 use_TaylorHood_elements,
202 apply_body_force_for_deformation,
204 initialize_porosity_from_medium_property}};
210 return std::make_unique<
212 name, mesh, std::move(jacobian_assembler), parameters,
213 integration_order, std::move(process_variables),
214 std::move(process_data), std::move(secondary_variables),
215 use_monolithic_scheme, is_linear);
218template <
int DisplacementDim>
220 std::string
const& name,
222 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
223 std::vector<ProcessVariable>
const& variables,
224 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
225 std::optional<ParameterLib::CoordinateSystem>
const&
226 local_coordinate_system,
227 unsigned const integration_order,
229 std::map<
int, std::shared_ptr<MaterialPropertyLib::Medium>>
const& media)
233 DBUG(
"Create ThermoRichardsMechanicsProcess.");
238 "Stress_StrainTemperature");
239 INFO(
"TRM process subtype is '{}'", subtype);
241 if (subtype ==
"Stress_StrainTemperature")
243 bool const mandatory_stress0_type =
false;
249 DisplacementDim>>(name, mesh, std::move(jacobian_assembler),
250 variables, parameters,
251 local_coordinate_system, integration_order,
252 config, media, mandatory_stress0_type);
255 if (subtype ==
"StressSaturation_StrainPressureTemperature")
258 bool const mandatory_stress0_type =
true;
261 ConstitutiveStressSaturation_StrainPressureTemperature::
262 ConstitutiveTraits<DisplacementDim>,
263 ConstitutiveStressSaturation_StrainPressureTemperature::
264 CreateConstitutiveSetting<DisplacementDim>>(
265 name, mesh, std::move(jacobian_assembler), variables, parameters,
266 local_coordinate_system, integration_order, config, media,
267 mandatory_stress0_type);
270 "TRM process subtype 'StressSaturation_StrainPressureTemperature' "
271 "is not supported, because OGS has not been built with MFront.");
275 OGS_FATAL(
"Unknown TRM process subtype '{}'.", subtype);
279 std::string
const& name,
281 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
282 std::vector<ProcessVariable>
const& variables,
283 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
284 std::optional<ParameterLib::CoordinateSystem>
const&
285 local_coordinate_system,
286 unsigned const integration_order,
288 std::map<
int, std::shared_ptr<MaterialPropertyLib::Medium>>
const& media);
291 std::string
const& name,
293 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
294 std::vector<ProcessVariable>
const& variables,
295 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
296 std::optional<ParameterLib::CoordinateSystem>
const&
297 local_coordinate_system,
298 unsigned const integration_order,
300 std::map<
int, std::shared_ptr<MaterialPropertyLib::Medium>>
const& media);
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
std::optional< T > getConfigParameterOptional(std::string const ¶m) const
T getConfigParameter(std::string const ¶m) const
ConfigTree getConfigSubtree(std::string const &root) const
void checkConfigParameter(std::string const ¶m, 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)
@ bishops_effective_stress
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 ¶meters, 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 ¶meters, 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 ¶meters, 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)
BaseLib::StrongType< bool, struct InitializePorosityFromMediumPropertyTag > InitializePorosityFromMediumProperty
A type helping to avoid confusion of different boolean values.
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 ¶meters, 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 ¶meters, MeshLib::Mesh const &mesh, bool const mandatory_stress_type)
void createSecondaryVariables(BaseLib::ConfigTree const &config, SecondaryVariableCollection &secondary_variables)