OGS
ThermoRichardsMechanics/ConstitutiveStress_StrainTemperature/Swelling.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#include "Swelling.h"
5
6#include <Eigen/LU>
7
9
11{
13{
14template <int DisplacementDim>
16 SpaceTimeData const& x_t, MediaData const& media_data,
18 StrainData<DisplacementDim> const& eps_data,
19 PrevState<StrainData<DisplacementDim>> const& eps_prev_data,
20 SaturationData const& S_L_data, SaturationDataDeriv const& dS_L_data,
21 PrevState<SaturationData> const& S_L_prev_data,
25{
26 namespace MPL = MaterialPropertyLib;
27
28 static constexpr int kelvin_vector_size =
31
32 auto const& solid_phase = media_data.solid;
33
34 if (!solid_phase.hasProperty(MPL::PropertyType::swelling_stress_rate))
35 {
36 out.eps_m.setZero();
37 out.J_up_BT_K_N.setZero();
38 return;
39 }
40
41 MPL::VariableArray variables;
42 variables.liquid_saturation = S_L_data.S_L;
43
44 MPL::VariableArray variables_prev;
45 variables_prev.liquid_saturation = S_L_prev_data->S_L;
46
47 auto const& identity2 = MathLib::KelvinVector::Invariants<
49 DisplacementDim)>::identity2;
50
51 // Swelling and possibly volumetric strain rate update.
52
53 // If there is swelling, compute it. Update volumetric strain rate,
54 // s.t. it corresponds to the mechanical part only.
55 state.sigma_sw = prev_state->sigma_sw;
56
57 auto const sigma_sw_dot =
61 variables, variables_prev, x_t.x, x_t.t, x_t.dt)));
62 state.sigma_sw += sigma_sw_dot * x_t.dt;
63
64 auto const C_el_inv = C_el_data.C_el.inverse().eval();
65
66 // !!! Misusing volumetric strain for mechanical volumetric
67 // strain just to update the transport porosity !!!
68 variables.volumetric_strain =
69 Invariants::trace(eps_data.eps) +
70 identity2.transpose() * C_el_inv * state.sigma_sw;
71 variables_prev.volumetric_strain =
72 Invariants::trace(eps_prev_data->eps) +
73 identity2.transpose() * C_el_inv * prev_state->sigma_sw;
74
75 out.eps_m.noalias() = C_el_inv * (state.sigma_sw - prev_state->sigma_sw);
76
77 using DimMatrix = Eigen::Matrix<double, 3, 3>;
78 auto const dsigma_sw_dS_L =
80 solid_phase.property(MPL::PropertyType::swelling_stress_rate)
81 .template dValue<DimMatrix>(variables, variables_prev,
83 x_t.x, x_t.t, x_t.dt));
84
85 out.J_up_BT_K_N = -dsigma_sw_dS_L * dS_L_data.dS_L_dp_cap;
86}
87
88template struct SwellingModel<2>;
89template struct SwellingModel<3>;
90} // namespace ConstitutiveStress_StrainTemperature
91} // namespace ProcessLib::ThermoRichardsMechanics
constexpr Eigen::Matrix< double, GlobalDim, GlobalDim > formEigenTensor(MaterialPropertyLib::PropertyDataType const &values)
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)
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > eps
Definition StrainData.h:14
void eval(SpaceTimeData const &x_t, MediaData const &media_data, ElasticTangentStiffnessData< DisplacementDim > const &C_el_data, StrainData< DisplacementDim > const &eps_data, PrevState< StrainData< DisplacementDim > > const &eps_prev_data, SaturationData const &S_L_data, SaturationDataDeriv const &dS_L_data, PrevState< SaturationData > const &S_L_prev_data, PrevState< SwellingDataStateful< DisplacementDim > > const &prev_state, SwellingDataStateful< DisplacementDim > &state, SwellingDataStateless< DisplacementDim > &out) const