OGS
ProcessLib::RichardsMechanics Namespace Reference

Classes

struct  CapillaryPressureData
struct  ConstitutiveSetting
struct  CreateConstitutiveSetting
struct  IntegrationPointData
struct  LocalAssemblerInterface
struct  MediaData
struct  MicroPorosityParameters
struct  MicroPorosityStateSpace
class  RichardsMechanicsLocalAssembler
class  RichardsMechanicsProcess
struct  RichardsMechanicsProcessData
struct  SaturationSecantDerivative
struct  SecondaryData

Typedefs

using TemperatureData = BaseLib::StrongType<double, struct TemperatureDataTag>
template<int DisplacementDim>
using StatefulData
 Data whose state must be tracked by the process.
template<int DisplacementDim>
using StatefulDataPrev
template<int DisplacementDim>
using OutputData
 Data that is needed for output purposes, but not directly for the assembly.
template<int DisplacementDim>
using ConstitutiveData
 Data that is needed for the equation system assembly.
template<int DisplacementDim>
using ConstitutiveTempData = std::tuple<>
template<int DisplacementDim>
using ConstitutiveModels = std::tuple<>
 Constitutive models used for assembly.
using Density = BaseLib::StrongType<double, struct DensityTag>
using DrySolidDensity = BaseLib::StrongType<double, struct DrySolidDensityTag>
using EffectivePorePressure
using LiquidDensity = BaseLib::StrongType<double, struct LiquidDensityTag>
using MicroPressure = BaseLib::StrongType<double, struct MicroPressureTag>
using MicroSaturation = BaseLib::StrongType<double, struct MicroSaturationTag>
template<int DisplacementDim>
using StiffnessTensor

Functions

template<int DisplacementDim>
std::ostream & operator<< (std::ostream &os, MicroPorosityStateSpace< DisplacementDim > const &state)
template<int DisplacementDim>
MicroPorosityStateSpace< DisplacementDim > computeMicroPorosity (MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &I_2_C_el_inverse, double const rho_LR_m, double const mu_LR, MicroPorosityParameters const &micro_porosity_parameters, double const alpha_B, double const phi, double const p_L, double const p_L_m_prev, MaterialPropertyLib::VariableArray const &, double const S_L_m_prev, double const phi_m_prev, ParameterLib::SpatialPosition const pos, double const t, double const dt, MaterialPropertyLib::Property const &saturation_micro, MaterialPropertyLib::Property const &swelling_stress_rate)
template<int D>
constexpr GlobalDimVector< D > DVnan ()
 Used to set a D dimensional vector to all not-a-number.
template<int D>
constexpr GlobalDimMatrix< D > DMnan ()
 Used to set a D x D matrix to all not-a-number.
template<int DisplacementDim, typename TRMProcessData>
ConstitutiveModels< DisplacementDim > createConstitutiveModels (TRMProcessData const &process_data, MaterialLib::Solids::MechanicsBase< DisplacementDim > const &solid_material)
constexpr std::string_view ioName (struct DrySolidDensityTag *)
constexpr std::string_view ioName (struct MicroPressureTag *)
constexpr std::string_view ioName (struct MicroSaturationTag *)
void checkMPLProperties (std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
template<int DisplacementDim>
std::unique_ptr< ProcesscreateRichardsMechanicsProcess (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< ProcesscreateRichardsMechanicsProcess< 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)
template std::unique_ptr< ProcesscreateRichardsMechanicsProcess< 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<int DisplacementDim>
void updateSwellingStressAndVolumetricStrain (MaterialPropertyLib::Medium const &medium, MaterialPropertyLib::Phase const &solid_phase, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > const &C_el, double const rho_LR, double const mu, std::optional< MicroPorosityParameters > micro_porosity_parameters, double const alpha, double const phi, double const p_cap_ip, MPL::VariableArray &variables, MPL::VariableArray &variables_prev, ParameterLib::SpatialPosition const &x_position, double const t, double const dt, ProcessLib::ThermoRichardsMechanics::ConstitutiveStress_StrainTemperature::SwellingDataStateful< DisplacementDim > &sigma_sw, PrevState< ProcessLib::ThermoRichardsMechanics::ConstitutiveStress_StrainTemperature::SwellingDataStateful< DisplacementDim > > const &sigma_sw_prev, PrevState< ProcessLib::ThermoRichardsMechanics::TransportPorosityData > const phi_M_prev, PrevState< ProcessLib::ThermoRichardsMechanics::PorosityData > const phi_prev, ProcessLib::ThermoRichardsMechanics::TransportPorosityData &phi_M, PrevState< MicroPressure > const p_L_m_prev, PrevState< MicroSaturation > const S_L_m_prev, MicroPressure &p_L_m, MicroSaturation &S_L_m)

Typedef Documentation

◆ ConstitutiveData

template<int DisplacementDim>
using ProcessLib::RichardsMechanics::ConstitutiveData
Initial value:
std::tuple<
BaseLib::StrongType< KelvinMatrix< DisplacementDim >, struct StiffnessTensorTag > StiffnessTensor
BaseLib::StrongType< double, struct DensityTag > Density
Definition Density.h:11
BaseLib::StrongType< double, struct LiquidDensityTag > LiquidDensity
BaseLib::StrongType< double, struct BiotTag > BiotData
BaseLib::StrongType< double, struct LiquidViscosityDataTag > LiquidViscosityData

Data that is needed for the equation system assembly.

Definition at line 54 of file RichardsMechanics/ConstitutiveRelations/ConstitutiveData.h.

◆ ConstitutiveModels

template<int DisplacementDim>
using ProcessLib::RichardsMechanics::ConstitutiveModels = std::tuple<>

Constitutive models used for assembly.

Definition at line 14 of file RichardsMechanics/ConstitutiveRelations/ConstitutiveModels.h.

◆ ConstitutiveTempData

template<int DisplacementDim>
using ProcessLib::RichardsMechanics::ConstitutiveTempData = std::tuple<>

Data that stores intermediate values, which are not needed outside the constitutive setting.

Definition at line 70 of file RichardsMechanics/ConstitutiveRelations/ConstitutiveData.h.

◆ Density

using ProcessLib::RichardsMechanics::Density = BaseLib::StrongType<double, struct DensityTag>

Definition at line 11 of file Density.h.

◆ DrySolidDensity

using ProcessLib::RichardsMechanics::DrySolidDensity = BaseLib::StrongType<double, struct DrySolidDensityTag>

Definition at line 13 of file DrySolidDensity.h.

◆ EffectivePorePressure

◆ LiquidDensity

◆ MicroPressure

using ProcessLib::RichardsMechanics::MicroPressure = BaseLib::StrongType<double, struct MicroPressureTag>

Definition at line 12 of file MicroPressure.h.

◆ MicroSaturation

using ProcessLib::RichardsMechanics::MicroSaturation = BaseLib::StrongType<double, struct MicroSaturationTag>

Definition at line 12 of file MicroSaturation.h.

◆ OutputData

template<int DisplacementDim>
using ProcessLib::RichardsMechanics::OutputData
Initial value:
std::tuple<
BaseLib::StrongType< double, struct DrySolidDensityTag > DrySolidDensity
BaseLib::StrongType< Eigen::Vector< double, DisplacementDim >, struct DarcyLawDataTag > DarcyLawData
Definition DarcyLaw.h:16

Data that is needed for output purposes, but not directly for the assembly.

Definition at line 48 of file RichardsMechanics/ConstitutiveRelations/ConstitutiveData.h.

◆ StatefulData

◆ StatefulDataPrev

template<int DisplacementDim>
using ProcessLib::RichardsMechanics::StatefulDataPrev
Initial value:
boost::mp11::mp_transform< PrevState, Tuple > PrevStateOf
Applies PrevState to a tuple of constitutive data.
std::tuple< StressData< DisplacementDim > > StatefulData
Data whose state must be tracked by the process.

Definition at line 43 of file RichardsMechanics/ConstitutiveRelations/ConstitutiveData.h.

◆ StiffnessTensor

template<int DisplacementDim>
using ProcessLib::RichardsMechanics::StiffnessTensor
Initial value:

Definition at line 11 of file StiffnessTensor.h.

◆ TemperatureData

using ProcessLib::RichardsMechanics::TemperatureData = BaseLib::StrongType<double, struct TemperatureDataTag>

Function Documentation

◆ checkMPLProperties()

void ProcessLib::RichardsMechanics::checkMPLProperties ( std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const & media)

Definition at line 25 of file CreateRichardsMechanicsProcess.cpp.

27{
28 std::array const required_medium_properties = {
35 std::array const required_liquid_properties = {
37 std::array const required_solid_properties = {MaterialPropertyLib::density};
38
39 for (auto const& m : media)
40 {
41 checkRequiredProperties(*m.second, required_medium_properties);
42 checkRequiredProperties(m.second->phase("AqueousLiquid"),
43 required_liquid_properties);
44 checkRequiredProperties(m.second->phase("Solid"),
45 required_solid_properties);
46 }
47}
void checkRequiredProperties(Component const &c, std::span< PropertyType const > const required_properties)
Definition Component.cpp:51

References MaterialPropertyLib::biot_coefficient, MaterialPropertyLib::bishops_effective_stress, MaterialPropertyLib::density, MaterialPropertyLib::porosity, MaterialPropertyLib::reference_temperature, MaterialPropertyLib::relative_permeability, MaterialPropertyLib::saturation, and MaterialPropertyLib::viscosity.

Referenced by createRichardsMechanicsProcess().

◆ computeMicroPorosity()

template<int DisplacementDim>
MicroPorosityStateSpace< DisplacementDim > ProcessLib::RichardsMechanics::computeMicroPorosity ( MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const & I_2_C_el_inverse,
double const rho_LR_m,
double const mu_LR,
MicroPorosityParameters const & micro_porosity_parameters,
double const alpha_B,
double const phi,
double const p_L,
double const p_L_m_prev,
MaterialPropertyLib::VariableArray const & ,
double const S_L_m_prev,
double const phi_m_prev,
ParameterLib::SpatialPosition const pos,
double const t,
double const dt,
MaterialPropertyLib::Property const & saturation_micro,
MaterialPropertyLib::Property const & swelling_stress_rate )

Definition at line 58 of file ComputeMicroPorosity.h.

71{
72 namespace MPL = MaterialPropertyLib;
73 static constexpr int kelvin_vector_size =
75 // phi_m, e_sw, p_L_m, sigma_sw
76 static constexpr int nls_size = 1 + 1 + 1 + kelvin_vector_size;
77
78 static constexpr int i_phi_m = 0;
79 static constexpr int i_e_sw = 1;
80 static constexpr int i_p_L_m = 2;
81 static constexpr int i_sigma_sw = 3;
82
83 using ResidualVectorType = Eigen::Matrix<double, nls_size, 1>;
84 using JacobianMatrix =
85 Eigen::Matrix<double, nls_size, nls_size, Eigen::RowMajor>;
86
87 Eigen::FullPivLU<Eigen::Matrix<double, nls_size, nls_size, Eigen::RowMajor>>
88 linear_solver;
89
90 JacobianMatrix jacobian;
91
92 // Agglomerated solution vector construction.
93 ResidualVectorType solution = ResidualVectorType::Zero();
94
95 if (p_L >= 0 && p_L_m_prev >= 0)
96 {
97 return {solution[i_phi_m], solution[i_e_sw], solution[i_p_L_m],
98 solution.template segment<kelvin_vector_size>(i_sigma_sw)};
99 }
100
101 double const alpha_bar =
102 micro_porosity_parameters.mass_exchange_coefficient;
103
104 auto const update_residual = [&](ResidualVectorType& residual)
105 {
106 double const delta_phi_m = solution[i_phi_m];
107 double const delta_e_sw = solution[i_e_sw];
108 auto const& delta_sigma_sw =
109 solution.template segment<kelvin_vector_size>(i_sigma_sw);
110 double const delta_p_L_m = solution[i_p_L_m];
111
112 double const phi_m = phi_m_prev + delta_phi_m;
113 double const p_L_m = p_L_m_prev + delta_p_L_m;
114 MPL::VariableArray variables_prev;
115 variables_prev.capillary_pressure = -p_L_m_prev;
116 variables_prev.liquid_saturation = S_L_m_prev;
117
118 MPL::VariableArray variables;
119 variables.capillary_pressure = -p_L_m;
120
121 double const S_L_m =
122 saturation_micro.template value<double>(variables, pos, t, dt);
123 variables.liquid_saturation = S_L_m;
124 double const delta_S_L_m = S_L_m - S_L_m_prev;
125
126 auto const sigma_sw_dot =
128 swelling_stress_rate.template value<Eigen::Matrix3d>(
129 variables, variables_prev, pos, t, dt));
130
131 residual[i_phi_m] = delta_phi_m - (alpha_B - phi) * delta_e_sw;
132 residual[i_e_sw] = delta_e_sw + I_2_C_el_inverse.dot(delta_sigma_sw);
133 residual.template segment<kelvin_vector_size>(i_sigma_sw).noalias() =
134 delta_sigma_sw - sigma_sw_dot * dt;
135
136 residual[i_p_L_m] =
137 rho_LR_m *
138 (phi_m * delta_S_L_m - (alpha_B - phi) * S_L_m * delta_e_sw) +
139 phi_m * S_L_m * rho_LR_m * delta_e_sw -
140 micro_porosity_parameters.mass_exchange_coefficient / mu_LR *
141 (p_L - p_L_m) * dt;
142 };
143
144 auto const update_jacobian = [&](JacobianMatrix& jacobian)
145 {
146 jacobian = JacobianMatrix::Identity();
147
148 double const delta_phi_m = solution[i_phi_m];
149 double const delta_e_sw = solution[i_e_sw];
150 double const delta_p_L_m = solution[i_p_L_m];
151
152 double const phi_m = phi_m_prev + delta_phi_m;
153 double const p_L_m = p_L_m_prev + delta_p_L_m;
154 MPL::VariableArray variables_prev;
155 variables_prev.capillary_pressure = -p_L_m_prev;
156 MPL::VariableArray variables;
157 variables.capillary_pressure = -p_L_m;
158
159 double const S_L_m =
160 saturation_micro.template value<double>(variables, pos, t, dt);
161 variables_prev.liquid_saturation = S_L_m_prev;
162 variables.liquid_saturation = S_L_m;
163 double const delta_S_L_m = S_L_m - S_L_m_prev;
164
165 double const dS_L_m_dp_cap_m = saturation_micro.template dValue<double>(
166 variables, MPL::Variable::capillary_pressure, pos, t, dt);
167 auto const dsigma_sw_dS_L_m =
169 swelling_stress_rate.template dValue<Eigen::Matrix3d>(
170 variables, variables_prev, MPL::Variable::liquid_saturation,
171 pos, t, dt));
172
173 jacobian(i_phi_m, i_e_sw) = -(alpha_B - phi);
174
175 jacobian.template block<1, kelvin_vector_size>(i_e_sw, i_sigma_sw) =
176 I_2_C_el_inverse.transpose();
177
178 jacobian.template block<kelvin_vector_size, 1>(i_sigma_sw, i_p_L_m) =
179 -dsigma_sw_dS_L_m * dS_L_m_dp_cap_m;
180
181 jacobian(i_p_L_m, i_phi_m) =
182 rho_LR_m * (delta_S_L_m + S_L_m * delta_e_sw);
183
184 jacobian(i_p_L_m, i_e_sw) = -rho_LR_m * S_L_m * (alpha_B - phi - phi_m);
185
186 jacobian(i_p_L_m, i_p_L_m) =
187 alpha_bar / mu_LR * dt -
188 rho_LR_m * (phi_m - (alpha_B - phi - phi_m) * delta_e_sw) *
189 dS_L_m_dp_cap_m;
190 };
191
192 auto const update_solution = [&](ResidualVectorType const& increment)
193 { solution += increment; };
194
195 auto newton_solver = NumLib::NewtonRaphson(
196 linear_solver, update_jacobian, update_residual, update_solution,
197 micro_porosity_parameters.nonlinear_solver_parameters);
198
199 auto const success_iterations = newton_solver.solve(jacobian);
200
201 if (!success_iterations)
202 {
203 OGS_FATAL(
204 "Could not find solution for local double structure nonlinear "
205 "problem.");
206 }
207
208 return {solution[i_phi_m], solution[i_e_sw], solution[i_p_L_m],
209 solution.template segment<kelvin_vector_size>(i_sigma_sw)};
210}
#define OGS_FATAL(...)
Definition Error.h:19
@ saturation_micro
capillary pressure saturation relationship for microstructure.
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
KelvinVectorType< DisplacementDim > tensorToKelvin(Eigen::Matrix< double, 3, 3 > const &m)

References MaterialPropertyLib::capillary_pressure, MaterialPropertyLib::VariableArray::capillary_pressure, MathLib::KelvinVector::kelvin_vector_dimensions(), MaterialPropertyLib::liquid_saturation, MaterialPropertyLib::VariableArray::liquid_saturation, ProcessLib::RichardsMechanics::MicroPorosityParameters::mass_exchange_coefficient, ProcessLib::RichardsMechanics::MicroPorosityParameters::nonlinear_solver_parameters, OGS_FATAL, and MathLib::KelvinVector::tensorToKelvin().

Referenced by updateSwellingStressAndVolumetricStrain().

◆ createConstitutiveModels()

template<int DisplacementDim, typename TRMProcessData>
ConstitutiveModels< DisplacementDim > ProcessLib::RichardsMechanics::createConstitutiveModels ( TRMProcessData const & process_data,
MaterialLib::Solids::MechanicsBase< DisplacementDim > const & solid_material )

◆ createRichardsMechanicsProcess()

template<int DisplacementDim>
std::unique_ptr< Process > ProcessLib::RichardsMechanics::createRichardsMechanicsProcess ( 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 )
Input File Parameter
prj__processes__process__type
Input File Parameter
prj__processes__process__RICHARDS_MECHANICS__coupling_scheme

Process Variables

Input File Parameter
prj__processes__process__RICHARDS_MECHANICS__process_variables

Primary process variables as they appear in the global component vector:

Input File Parameter
prj__processes__process__RICHARDS_MECHANICS__process_variables__pressure
Input File Parameter
prj__processes__process__RICHARDS_MECHANICS__process_variables__displacement

Process Parameters

Input File Parameter
prj__processes__process__RICHARDS_MECHANICS__specific_body_force
Input File Parameter
prj__processes__process__RICHARDS_MECHANICS__micro_porosity
Input File Parameter
prj__processes__process__RICHARDS_MECHANICS__micro_porosity__nonlinear_solver
Input File Parameter
prj__processes__process__RICHARDS_MECHANICS__micro_porosity__mass_exchange_coefficient
Input File Parameter
prj__processes__process__RICHARDS_MECHANICS__mass_lumping
Input File Parameter
prj__processes__process__RICHARDS_MECHANICS__explicit_hm_coupling_in_unsaturated_zone
Input File Parameter
prj__processes__process__linear

Definition at line 50 of file CreateRichardsMechanicsProcess.cpp.

61{
63 config.checkConfigParameter("type", "RICHARDS_MECHANICS");
64 DBUG("Create RichardsMechanicsProcess.");
65
66 auto const coupling_scheme =
68 config.getConfigParameterOptional<std::string>("coupling_scheme");
69 const bool use_monolithic_scheme =
70 !(coupling_scheme && (*coupling_scheme == "staggered"));
71
73
75 auto const pv_config = config.getConfigSubtree("process_variables");
76
77 ProcessVariable* variable_p;
78 ProcessVariable* variable_u;
79 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
80 process_variables;
81 if (use_monolithic_scheme) // monolithic scheme.
82 {
85 auto per_process_variables = findProcessVariables(
86 variables, pv_config,
87 {
88 "pressure",
90 "displacement"});
91 variable_p = &per_process_variables[0].get();
92 variable_u = &per_process_variables[1].get();
93 process_variables.push_back(std::move(per_process_variables));
94 }
95 else // staggered scheme.
96 {
97 using namespace std::string_literals;
98 for (auto const& variable_name : {"pressure"s, "displacement"s})
99 {
100 auto per_process_variables =
101 findProcessVariables(variables, pv_config, {variable_name});
102 process_variables.push_back(std::move(per_process_variables));
103 }
104 variable_p = &process_variables[0][0].get();
105 variable_u = &process_variables[1][0].get();
106 }
107
108 DBUG("Associate displacement with process variable '{:s}'.",
109 variable_u->getName());
110
111 if (variable_u->getNumberOfGlobalComponents() != DisplacementDim)
112 {
113 OGS_FATAL(
114 "Number of components of the process variable '{:s}' is different "
115 "from the displacement dimension: got {:d}, expected {:d}",
116 variable_u->getName(),
117 variable_u->getNumberOfGlobalComponents(),
118 DisplacementDim);
119 }
120
121 DBUG("Associate pressure with process variable '{:s}'.",
122 variable_p->getName());
123 if (variable_p->getNumberOfGlobalComponents() != 1)
124 {
125 OGS_FATAL(
126 "Pressure process variable '{:s}' is not a scalar variable but has "
127 "{:d} components.",
128 variable_p->getName(),
129 variable_p->getNumberOfGlobalComponents());
130 }
131
132 auto solid_constitutive_relations =
134 parameters, local_coordinate_system, materialIDs(mesh), config);
135
137 // Specific body force
138 Eigen::Matrix<double, DisplacementDim, 1> specific_body_force;
139 {
140 std::vector<double> const b =
142 config.getConfigParameter<std::vector<double>>(
143 "specific_body_force");
144 if (b.size() != DisplacementDim)
145 {
146 OGS_FATAL(
147 "The size of the specific body force vector does not match the "
148 "displacement dimension. Vector size is {:d}, displacement "
149 "dimension is {:d}",
150 b.size(), DisplacementDim);
151 }
152
153 std::copy_n(b.data(), b.size(), specific_body_force.data());
154 }
155
156 auto media_map =
158 DBUG("Check the media properties of RichardsMechanics process ...");
159 checkMPLProperties(media);
160 DBUG("Media properties verified.");
161
162 // Initial stress conditions
163 auto const initial_stress =
165 mesh);
166
167 std::optional<MicroPorosityParameters> micro_porosity_parameters;
168 if (auto const micro_porosity_config =
170 config.getConfigSubtreeOptional("micro_porosity"))
171 {
172 micro_porosity_parameters = MicroPorosityParameters{
175 micro_porosity_config->getConfigSubtree("nonlinear_solver")),
177 micro_porosity_config->getConfigParameter<double>(
178 "mass_exchange_coefficient")};
179 }
180
181 auto const mass_lumping =
183 config.getConfigParameter<bool>("mass_lumping", false);
184
185 auto const explicit_hm_coupling_in_unsaturated_zone =
187 config.getConfigParameter<bool>(
188 "explicit_hm_coupling_in_unsaturated_zone", false);
189
190 auto const is_linear =
192 config.getConfigParameter("linear", false);
193
194 bool const use_numerical_jacobian =
195 jacobian_assembler->isPerturbationEnabled();
196
198 materialIDs(mesh),
199 std::move(media_map),
200 std::move(solid_constitutive_relations),
201 initial_stress,
202 specific_body_force,
203 micro_porosity_parameters,
204 mass_lumping,
205 explicit_hm_coupling_in_unsaturated_zone,
206 use_numerical_jacobian};
207
208 SecondaryVariableCollection secondary_variables;
209
210 ProcessLib::createSecondaryVariables(config, secondary_variables);
211
212 return std::make_unique<RichardsMechanicsProcess<DisplacementDim>>(
213 std::move(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, is_linear);
217}
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:22
std::string const & getName() const
int getNumberOfGlobalComponents() const
Returns the number of components of the process variable.
std::map< int, std::shared_ptr< MaterialLib::Solids::MechanicsBase< DisplacementDim > > > createConstitutiveRelations(std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, std::optional< ParameterLib::CoordinateSystem > const &local_coordinate_system, MeshLib::PropertyVector< int > const *const material_ids, BaseLib::ConfigTree const &config)
MaterialSpatialDistributionMap createMaterialSpatialDistributionMap(std::map< int, std::shared_ptr< Medium > > const &media, MeshLib::Mesh const &mesh)
PropertyVector< int > const * materialIDs(Mesh const &mesh)
Definition Mesh.cpp:258
NewtonRaphsonSolverParameters createNewtonRaphsonSolverParameters(BaseLib::ConfigTree const &config)
void checkMPLProperties(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)

References BaseLib::ConfigTree::checkConfigParameter(), checkMPLProperties(), MaterialLib::Solids::createConstitutiveRelations(), ProcessLib::createInitialStress(), MaterialPropertyLib::createMaterialSpatialDistributionMap(), NumLib::createNewtonRaphsonSolverParameters(), ProcessLib::createSecondaryVariables(), DBUG(), ProcessLib::findProcessVariables(), BaseLib::ConfigTree::getConfigParameter(), BaseLib::ConfigTree::getConfigParameterOptional(), BaseLib::ConfigTree::getConfigSubtree(), BaseLib::ConfigTree::getConfigSubtreeOptional(), ProcessLib::ProcessVariable::getName(), ProcessLib::ProcessVariable::getNumberOfGlobalComponents(), and OGS_FATAL.

◆ createRichardsMechanicsProcess< 2 >()

template std::unique_ptr< Process > ProcessLib::RichardsMechanics::createRichardsMechanicsProcess< 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 )

◆ createRichardsMechanicsProcess< 3 >()

template std::unique_ptr< Process > ProcessLib::RichardsMechanics::createRichardsMechanicsProcess< 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 )

◆ DMnan()

template<int D>
GlobalDimMatrix< D > ProcessLib::RichardsMechanics::DMnan ( )
constexpr

Used to set a D x D matrix to all not-a-number.

Definition at line 27 of file RichardsMechanics/ConstitutiveRelations/Base.h.

28{
30}
Eigen::Matrix< double, DisplacementDim, DisplacementDim, Eigen::RowMajor > GlobalDimMatrix
static constexpr double nan
Convenience alias for not a number.

References ProcessLib::ConstitutiveRelations::nan.

◆ DVnan()

template<int D>
GlobalDimVector< D > ProcessLib::RichardsMechanics::DVnan ( )
constexpr

Used to set a D dimensional vector to all not-a-number.

Definition at line 20 of file RichardsMechanics/ConstitutiveRelations/Base.h.

21{
23}
Eigen::Vector< double, DisplacementDim > GlobalDimVector

References ProcessLib::ConstitutiveRelations::nan.

◆ ioName() [1/3]

std::string_view ProcessLib::RichardsMechanics::ioName ( struct DrySolidDensityTag * )
constexpr

Definition at line 15 of file DrySolidDensity.h.

16{
17 return "dry_density_solid";
18}

◆ ioName() [2/3]

std::string_view ProcessLib::RichardsMechanics::ioName ( struct MicroPressureTag * )
constexpr

Definition at line 14 of file MicroPressure.h.

15{
16 return "micro_pressure";
17}

◆ ioName() [3/3]

std::string_view ProcessLib::RichardsMechanics::ioName ( struct MicroSaturationTag * )
constexpr

Definition at line 14 of file MicroSaturation.h.

15{
16 return "micro_saturation";
17}

◆ operator<<()

template<int DisplacementDim>
std::ostream & ProcessLib::RichardsMechanics::operator<< ( std::ostream & os,
MicroPorosityStateSpace< DisplacementDim > const & state )

◆ updateSwellingStressAndVolumetricStrain()

template<int DisplacementDim>
void ProcessLib::RichardsMechanics::updateSwellingStressAndVolumetricStrain ( MaterialPropertyLib::Medium const & medium,
MaterialPropertyLib::Phase const & solid_phase,
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > const & C_el,
double const rho_LR,
double const mu,
std::optional< MicroPorosityParameters > micro_porosity_parameters,
double const alpha,
double const phi,
double const p_cap_ip,
MPL::VariableArray & variables,
MPL::VariableArray & variables_prev,
ParameterLib::SpatialPosition const & x_position,
double const t,
double const dt,
ProcessLib::ThermoRichardsMechanics::ConstitutiveStress_StrainTemperature::SwellingDataStateful< DisplacementDim > & sigma_sw,
PrevState< ProcessLib::ThermoRichardsMechanics::ConstitutiveStress_StrainTemperature::SwellingDataStateful< DisplacementDim > > const & sigma_sw_prev,
PrevState< ProcessLib::ThermoRichardsMechanics::TransportPorosityData > const phi_M_prev,
PrevState< ProcessLib::ThermoRichardsMechanics::PorosityData > const phi_prev,
ProcessLib::ThermoRichardsMechanics::TransportPorosityData & phi_M,
PrevState< MicroPressure > const p_L_m_prev,
PrevState< MicroSaturation > const S_L_m_prev,
MicroPressure & p_L_m,
MicroSaturation & S_L_m )

Definition at line 27 of file RichardsMechanicsFEM-impl.h.

49{
50 auto const& identity2 = MathLib::KelvinVector::Invariants<
52 DisplacementDim)>::identity2;
53
54 if (!medium.hasProperty(MPL::PropertyType::saturation_micro))
55 {
56 // If there is swelling, compute it. Update volumetric strain rate,
57 // s.t. it corresponds to the mechanical part only.
58 sigma_sw = *sigma_sw_prev;
59 if (solid_phase.hasProperty(MPL::PropertyType::swelling_stress_rate))
60 {
61 auto const sigma_sw_dot =
65 .value(variables, variables_prev, x_position, t,
66 dt)));
67 sigma_sw.sigma_sw += sigma_sw_dot * dt;
68
70 variables.volumetric_strain +
71 identity2.transpose() * C_el.inverse() * sigma_sw.sigma_sw;
72 variables_prev.volumetric_mechanical_strain =
73 variables_prev.volumetric_strain + identity2.transpose() *
74 C_el.inverse() *
75 sigma_sw_prev->sigma_sw;
76 }
77 else
78 {
80 variables.volumetric_strain;
81 variables_prev.volumetric_mechanical_strain =
82 variables_prev.volumetric_strain;
83 }
84 }
85
86 // TODO (naumov) saturation_micro must be always defined together with
87 // the micro_porosity_parameters.
88 if (medium.hasProperty(MPL::PropertyType::saturation_micro))
89 {
90 double const phi_m_prev = phi_prev->phi - phi_M_prev->phi;
91
92 auto const [delta_phi_m, delta_e_sw, delta_p_L_m, delta_sigma_sw] =
94 identity2.transpose() * C_el.inverse(), rho_LR, mu,
95 *micro_porosity_parameters, alpha, phi, -p_cap_ip, **p_L_m_prev,
96 variables_prev, **S_L_m_prev, phi_m_prev, x_position, t, dt,
98 solid_phase.property(MPL::PropertyType::swelling_stress_rate));
99
100 phi_M.phi = phi - (phi_m_prev + delta_phi_m);
101 variables_prev.transport_porosity = phi_M_prev->phi;
102 variables.transport_porosity = phi_M.phi;
103
104 *p_L_m = **p_L_m_prev + delta_p_L_m;
105 { // Update micro saturation.
106 MPL::VariableArray variables_prev;
107 variables_prev.capillary_pressure = -**p_L_m_prev;
108 MPL::VariableArray variables;
109 variables.capillary_pressure = -*p_L_m;
110
111 *S_L_m = medium.property(MPL::PropertyType::saturation_micro)
112 .template value<double>(variables, x_position, t, dt);
113 }
114 sigma_sw.sigma_sw = sigma_sw_prev->sigma_sw + delta_sigma_sw;
115 }
116}
constexpr Eigen::Matrix< double, GlobalDim, GlobalDim > formEigenTensor(MaterialPropertyLib::PropertyDataType const &values)
MicroPorosityStateSpace< DisplacementDim > computeMicroPorosity(MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &I_2_C_el_inverse, double const rho_LR_m, double const mu_LR, MicroPorosityParameters const &micro_porosity_parameters, double const alpha_B, double const phi, double const p_L, double const p_L_m_prev, MaterialPropertyLib::VariableArray const &, double const S_L_m_prev, double const phi_m_prev, ParameterLib::SpatialPosition const pos, double const t, double const dt, MaterialPropertyLib::Property const &saturation_micro, MaterialPropertyLib::Property const &swelling_stress_rate)

References MaterialPropertyLib::VariableArray::capillary_pressure, computeMicroPorosity(), MaterialPropertyLib::formEigenTensor(), MaterialPropertyLib::Medium::hasProperty(), MaterialPropertyLib::Phase::hasProperty(), MathLib::KelvinVector::kelvin_vector_dimensions(), ProcessLib::ThermoRichardsMechanics::TransportPorosityData::phi, MaterialPropertyLib::Medium::property(), MaterialPropertyLib::Phase::property(), MaterialPropertyLib::saturation_micro, MaterialPropertyLib::swelling_stress_rate, MathLib::KelvinVector::tensorToKelvin(), MaterialPropertyLib::VariableArray::transport_porosity, MaterialPropertyLib::VariableArray::volumetric_mechanical_strain, and MaterialPropertyLib::VariableArray::volumetric_strain.

Referenced by ProcessLib::RichardsMechanics::RichardsMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::assembleWithJacobianEvalConstitutiveSetting(), and ProcessLib::RichardsMechanics::RichardsMechanicsLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::computeSecondaryVariableConcrete().