32 std::map<
int, std::shared_ptr<MaterialPropertyLib::Medium>>
const& media)
34 std::array
const required_medium_properties = {
38 std::array
const required_liquid_properties = {
44 for (
auto const& m : media)
46 checkRequiredProperties(*m.second, required_medium_properties);
47 checkRequiredProperties(
49 required_liquid_properties);
50 checkRequiredProperties(
52 required_solid_properties);
61 DBUG(
"Associate displacement with process variable '{:s}'.",
67 "Number of components of the process variable '{:s}' is different "
68 "from the displacement dimension: got {:d}, expected {:d}",
75template <
int DisplacementDim,
typename ConstitutiveTraits,
76 typename CreateConstitutiveSetting>
79 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
80 std::vector<ProcessVariable>
const& variables,
81 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
82 std::optional<ParameterLib::CoordinateSystem>
const&
83 local_coordinate_system,
85 std::map<
int, std::shared_ptr<MaterialPropertyLib::Medium>>
const& media,
86 bool const mandatory_stress0_type)
88 auto const coupling_scheme =
91 const bool use_monolithic_scheme =
92 !(coupling_scheme && (*coupling_scheme ==
"staggered"));
102 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
104 if (use_monolithic_scheme)
109 variables, pv_config,
116 variable_T = &per_process_variables[0].get();
117 variable_p = &per_process_variables[1].get();
118 variable_u = &per_process_variables[2].get();
119 process_variables.push_back(std::move(per_process_variables));
124 "So far, only the monolithic scheme is implemented for "
125 "THERMO_RICHARDS_MECHANICS");
134 auto solid_constitutive_relations =
135 CreateConstitutiveSetting::createSolidConstitutiveRelations(
136 parameters, local_coordinate_system, materialIDs(mesh), config);
139 Eigen::Matrix<double, DisplacementDim, 1> specific_body_force;
141 std::vector<double>
const b =
144 "specific_body_force");
145 if (b.size() != DisplacementDim)
148 "The size of the specific body force vector does not match the "
149 "displacement dimension. Vector size is {:d}, displacement "
151 b.size(), DisplacementDim);
154 std::copy_n(b.data(), b.size(), specific_body_force.data());
160 "Check the media properties of ThermoRichardsMechanics process "
163 DBUG(
"Media properties verified.");
166 config, parameters, mesh, mandatory_stress0_type);
168 bool mass_lumping =
false;
169 if (
auto const mass_lumping_ptr =
173 DBUG(
"Using mass lumping for the Richards flow equation.");
174 mass_lumping = *mass_lumping_ptr;
177 bool const apply_body_force_for_deformation =
182 bool const initialize_porosity_from_medium_property =
187 auto const is_linear =
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)
void checkThermoOsmosisProperties(MaterialPropertyLib::Medium const &medium)
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)