27template <
int DisplacementDim>
32 double const rho_LR,
double const mu,
33 std::optional<MicroPorosityParameters> micro_porosity_parameters,
34 double const alpha,
double const phi,
double const p_cap_ip,
39 SwellingDataStateful<DisplacementDim>& sigma_sw,
41 ConstitutiveStress_StrainTemperature::SwellingDataStateful<
42 DisplacementDim>>
const& sigma_sw_prev,
53 DisplacementDim)>::identity2;
59 sigma_sw = *sigma_sw_prev;
62 auto const sigma_sw_dot =
66 .value(variables, variables_prev, x_position, t,
68 sigma_sw.sigma_sw += sigma_sw_dot * dt;
72 identity2.transpose() * C_el.inverse() * sigma_sw.sigma_sw;
76 sigma_sw_prev->sigma_sw;
91 double const phi_m_prev = phi_prev->phi - phi_M_prev->phi;
93 auto const [delta_phi_m, delta_e_sw, delta_p_L_m, delta_sigma_sw] =
95 identity2.transpose() * C_el.inverse(), rho_LR, mu,
96 *micro_porosity_parameters, alpha, phi, -p_cap_ip, **p_L_m_prev,
97 variables_prev, **S_L_m_prev, phi_m_prev, x_position, t, dt,
101 phi_M.
phi = phi - (phi_m_prev + delta_phi_m);
105 *p_L_m = **p_L_m_prev + delta_p_L_m;
113 .template value<double>(variables, x_position, t, dt);
115 sigma_sw.sigma_sw = sigma_sw_prev->sigma_sw + delta_sigma_sw;
119template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
121RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
122 ShapeFunctionPressure, DisplacementDim>::
123 RichardsMechanicsLocalAssembler(
127 bool const is_axially_symmetric,
130 e, integration_method, is_axially_symmetric, process_data}
132 unsigned const n_integration_points =
133 this->integration_method_.getNumberOfPoints();
135 ip_data_.resize(n_integration_points);
136 secondary_data_.N_u.resize(n_integration_points);
138 auto const shape_matrices_u =
140 ShapeMatricesTypeDisplacement,
141 DisplacementDim>(e, is_axially_symmetric,
142 this->integration_method_);
144 auto const shape_matrices_p =
146 ShapeMatricesTypePressure, DisplacementDim>(
147 e, is_axially_symmetric, this->integration_method_);
150 this->process_data_.media_map.getMedium(this->element_.getID());
152 for (
unsigned ip = 0; ip < n_integration_points; ip++)
154 auto& ip_data = ip_data_[ip];
155 auto const& sm_u = shape_matrices_u[ip];
156 ip_data_[ip].integration_weight =
157 this->integration_method_.getWeightedPoint(ip).getWeight() *
158 sm_u.integralMeasure * sm_u.detJ;
160 ip_data.N_u = sm_u.N;
161 ip_data.dNdx_u = sm_u.dNdx;
164 std::nullopt, this->element_.getID(),
167 ShapeMatricesTypeDisplacement>(
168 this->element_, ip_data.N_u))};
170 ip_data.N_p = shape_matrices_p[ip].N;
171 ip_data.dNdx_p = shape_matrices_p[ip].dNdx;
175 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(
176 this->current_states_[ip])
179 .template initialValue<double>(
182 double>::quiet_NaN() );
184 auto& transport_porosity =
187 this->current_states_[ip])
189 transport_porosity = porosity;
194 .template initialValue<double>(
197 double>::quiet_NaN() );
200 secondary_data_.N_u[ip] = shape_matrices_u[ip].N;
204template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
207 ShapeFunctionPressure, DisplacementDim>::
208 setInitialConditionsConcrete(Eigen::VectorXd
const local_x,
214 auto const [p_L, u] =
localDOF(local_x);
216 constexpr double dt = std::numeric_limits<double>::quiet_NaN();
221 auto const& solid_phase =
226 DisplacementDim)>::identity2;
228 unsigned const n_integration_points =
230 for (
unsigned ip = 0; ip < n_integration_points; ip++)
235 std::nullopt, this->
element_.getID(),
253 std::get<PrevState<MicroPressure>>(this->
prev_states_[ip]);
254 **p_L_m_prev = -p_cap_ip;
258 auto const temperature =
260 .template value<double>(variables, x_position, t, dt);
269 .template value<double>(variables, x_position, t, dt);
275 .template value<double>(variables, x_position, t, dt);
278 double const chi_S_L =
280 .template value<double>(variables, x_position, t, dt);
289 auto& sigma_eff_prev =
290 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
291 EffectiveStressData<DisplacementDim>>>(
295 sigma_eff.sigma_eff.noalias() +=
296 chi_S_L * alpha_b * (-p_cap_ip) * identity2;
297 sigma_eff_prev->sigma_eff = sigma_eff.sigma_eff;
307 std::get<PrevState<MicroSaturation>>(this->
prev_states_[ip]);
310 .template value<double>(vars, x_position, t, dt);
319 DisplacementDim>>(SD)
323 auto const& dNdx_u =
ip_data_[ip].dNdx_u;
328 ShapeFunctionDisplacement::NPOINTS,
334 eps.noalias() = B * u;
344 auto const C_el =
ip_data_[ip].computeElasticTangentStiffness(
348 auto const& sigma_sw =
349 std::get<ProcessLib::ThermoRichardsMechanics::
350 ConstitutiveStress_StrainTemperature::
351 SwellingDataStateful<DisplacementDim>>(
355 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
356 MechanicalStrainData<DisplacementDim>>>(
360 eps_m_prev.noalias() =
362 ? eps + C_el.inverse() * sigma_sw
367template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
370 ShapeFunctionDisplacement, ShapeFunctionPressure,
372 std::vector<double>
const& local_x,
373 std::vector<double>
const& local_x_prev,
374 std::vector<double>& local_M_data,
375 std::vector<double>& local_K_data,
376 std::vector<double>& local_rhs_data)
380 auto const [p_L, u] =
localDOF(local_x);
381 auto const [p_L_prev, u_prev] =
localDOF(local_x_prev);
384 typename ShapeMatricesTypeDisplacement::template MatrixType<
391 typename ShapeMatricesTypeDisplacement::template MatrixType<
398 typename ShapeMatricesTypeDisplacement::template VectorType<
404 DisplacementDim)>::identity2;
408 auto const& liquid_phase =
410 auto const& solid_phase =
418 unsigned const n_integration_points =
420 for (
unsigned ip = 0; ip < n_integration_points; ip++)
422 auto const& w =
ip_data_[ip].integration_weight;
425 auto const& dNdx_u =
ip_data_[ip].dNdx_u;
428 auto const& dNdx_p =
ip_data_[ip].dNdx_p;
431 std::nullopt, this->
element_.getID(),
440 ShapeFunctionDisplacement::NPOINTS,
446 eps.eps.noalias() = B * u;
449 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(
452 auto const S_L_prev =
461 double p_cap_prev_ip;
470 auto const temperature =
472 .template value<double>(variables, x_position, t, dt);
477 .template value<double>(variables, x_position, t, dt);
481 DisplacementDim>>(SD)
487 auto const C_el =
ip_data_[ip].computeElasticTangentStiffness(
491 auto const beta_SR = (1 - alpha) / this->
solid_material_.getBulkModulus(
492 t, x_position, &C_el);
497 .template value<double>(variables, x_position, t, dt);
503 .template value<double>(variables, x_position, t, dt);
508 double const dS_L_dp_cap =
510 .template dValue<double>(variables,
515 double const DeltaS_L_Deltap_cap =
516 (p_cap_ip == p_cap_prev_ip)
518 : (S_L - S_L_prev) / (p_cap_ip - p_cap_prev_ip);
520 auto const chi = [medium, x_position, t, dt](
double const S_L)
525 .template value<double>(vs, x_position, t, dt);
527 double const chi_S_L = chi(S_L);
528 double const chi_S_L_prev = chi(S_L_prev);
530 double const p_FR = -chi_S_L * p_cap_ip;
538 auto& phi = std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(
542 auto const phi_prev = std::get<
PrevState<
548 .template value<double>(variables, variables_prev,
556 "RichardsMechanics: Biot-coefficient {} is smaller than "
557 "porosity {} in element/integration point {}/{}.",
558 alpha, phi, this->
element_.getID(), ip);
564 std::get<ProcessLib::ThermoRichardsMechanics::
565 ConstitutiveStress_StrainTemperature::
566 SwellingDataStateful<DisplacementDim>>(
569 auto const& sigma_sw_prev = std::get<
PrevState<
570 ProcessLib::ThermoRichardsMechanics::
571 ConstitutiveStress_StrainTemperature::SwellingDataStateful<
577 sigma_sw = sigma_sw_prev;
578 if (solid_phase.hasProperty(
581 auto const sigma_sw_dot =
585 .value(variables, variables_prev, x_position, t,
587 sigma_sw += sigma_sw_dot * dt;
591 identity2.transpose() * C_el.inverse() * sigma_sw;
594 identity2.transpose() * C_el.inverse() * sigma_sw_prev;
606 auto& transport_porosity =
607 std::get<ProcessLib::ThermoRichardsMechanics::
608 TransportPorosityData>(
611 auto const transport_porosity_prev =
612 std::get<
PrevState<ProcessLib::ThermoRichardsMechanics::
613 TransportPorosityData>>(
620 .template value<double>(variables, variables_prev,
632 .template value<double>(variables, x_position, t, dt);
635 .template value<double>(variables, x_position, t, dt);
637 auto const& sigma_sw =
638 std::get<ProcessLib::ThermoRichardsMechanics::
639 ConstitutiveStress_StrainTemperature::
640 SwellingDataStateful<DisplacementDim>>(
643 auto const& sigma_eff =
651 auto const sigma_total =
652 (sigma_eff - alpha * p_FR * identity2).eval();
662 .material_state_variables->getEquivalentPlasticStrain();
666 .value(variables, x_position, t, dt));
669 K_intrinsic * rho_LR * k_rel / mu;
675 auto& eps_m = std::get<ProcessLib::ConstitutiveRelations::
676 MechanicalStrainData<DisplacementDim>>(
681 ? eps.eps + C_el.inverse() * sigma_sw
693 DisplacementDim>>(SD);
694 auto const& sigma_eff_prev =
695 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
696 EffectiveStressData<DisplacementDim>>>(
699 std::get<ProcessLib::ConstitutiveRelations::
700 MechanicalStrainData<DisplacementDim>>(SD);
702 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
703 MechanicalStrainData<DisplacementDim>>>(
706 auto const C =
ip_data_[ip].updateConstitutiveRelation(
707 variables, t, x_position, dt, temperature, sigma_eff,
713 K.template block<displacement_size, displacement_size>(
715 .noalias() += B.transpose() * C * B * w;
721 p_FR - sigma_eff.dot(identity2) / (3 * (1 - phi));
724 .template value<double>(variables, x_position, t, dt);
729 double const rho = rho_SR * (1 - phi) + S_L * phi * rho_LR;
731 (B.transpose() * sigma_eff -
N_u_op(N_u).transpose() * rho * b) * w;
739 .template dValue<double>(variables,
743 double const a0 = S_L * (alpha - phi) * beta_SR;
745 double const specific_storage =
746 DeltaS_L_Deltap_cap * (p_cap_ip * a0 - phi) +
747 S_L * (phi * beta_LR + a0);
750 .noalias() += N_p.transpose() * rho_LR * specific_storage * N_p * w;
754 .noalias() += dNdx_p.transpose() * rho_K_over_mu * dNdx_p * w;
757 dNdx_p.transpose() * rho_LR * rho_K_over_mu * b * w;
764 .noalias() -= B.transpose() * alpha * chi_S_L * identity2 * N_p * w;
769 M.template block<pressure_size, displacement_size>(
pressure_index,
771 .noalias() += N_p.transpose() * S_L * rho_LR * alpha *
772 identity2.transpose() * B * w;
777 auto Mpp = M.template block<pressure_size, pressure_size>(
779 Mpp = Mpp.colwise().sum().eval().asDiagonal();
783template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
786 ShapeFunctionPressure, DisplacementDim>::
787 assembleWithJacobianEvalConstitutiveSetting(
788 double const t,
double const dt,
791 ShapeFunctionPressure,
799 std::optional<MicroPorosityParameters>
const& micro_porosity_parameters,
805 auto const& liquid_phase =
807 auto const& solid_phase =
812 DisplacementDim)>::identity2;
814 double const temperature = T_data();
815 double const p_cap_ip = p_cap_data.
p_cap;
816 double const p_cap_prev_ip = p_cap_data.
p_cap_prev;
818 auto const& eps = std::get<StrainData<DisplacementDim>>(SD);
820 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(SD).S_L;
821 auto const S_L_prev =
828 .template value<double>(variables, x_position, t, dt);
829 *std::get<ProcessLib::ThermoRichardsMechanics::BiotData>(CD) = alpha;
833 DisplacementDim>>(SD)
839 auto const C_el = ip_data.computeElasticTangentStiffness(
840 variables, t, x_position, dt, solid_material,
844 (1 - alpha) / solid_material.
getBulkModulus(t, x_position, &C_el);
846 std::get<ProcessLib::ThermoRichardsMechanics::SolidCompressibilityData>(CD)
851 .template value<double>(variables, x_position, t, dt);
853 *std::get<LiquidDensity>(CD) = rho_LR;
856 .template value<double>(variables, x_position, t, dt);
861 double const dS_L_dp_cap =
863 .template dValue<double>(variables,
866 std::get<ProcessLib::ThermoRichardsMechanics::SaturationDataDeriv>(CD)
867 .dS_L_dp_cap = dS_L_dp_cap;
870 double const DeltaS_L_Deltap_cap =
871 (p_cap_ip == p_cap_prev_ip)
873 : (S_L - S_L_prev) / (p_cap_ip - p_cap_prev_ip);
874 std::get<SaturationSecantDerivative>(CD).DeltaS_L_Deltap_cap =
877 auto const chi = [medium, x_position, t, dt](
double const S_L)
882 .template value<double>(vs, x_position, t, dt);
884 double const chi_S_L = chi(S_L);
885 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD).chi_S_L =
887 double const chi_S_L_prev = chi(S_L_prev);
888 std::get<PrevState<ProcessLib::ThermoRichardsMechanics::BishopsData>>(CD)
889 ->chi_S_L = chi_S_L_prev;
891 auto const dchi_dS_L =
893 .template dValue<double>(
895 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD).dchi_dS_L =
898 double const p_FR = -chi_S_L * p_cap_ip;
910 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(SD).phi;
912 auto const phi_prev =
919 .template value<double>(variables, variables_prev, x_position,
923 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(CD).phi = phi;
929 ?
static_cast<std::ptrdiff_t
>(*x_position.
getElementID())
930 :
static_cast<std::ptrdiff_t
>(-1);
932 "RichardsMechanics: Biot-coefficient {} is smaller than porosity "
938 .template value<double>(variables, x_position, t, dt);
939 *std::get<ProcessLib::ThermoRichardsMechanics::LiquidViscosityData>(CD) =
945 std::get<ProcessLib::ThermoRichardsMechanics::
946 ConstitutiveStress_StrainTemperature::
947 SwellingDataStateful<DisplacementDim>>(SD);
948 auto const& sigma_sw_prev =
949 std::get<
PrevState<ProcessLib::ThermoRichardsMechanics::
950 ConstitutiveStress_StrainTemperature::
951 SwellingDataStateful<DisplacementDim>>>(
953 auto const transport_porosity_prev = std::get<
PrevState<
956 auto const phi_prev = std::get<
959 auto& transport_porosity = std::get<
961 auto& p_L_m = std::get<MicroPressure>(SD);
962 auto const p_L_m_prev = std::get<PrevState<MicroPressure>>(SD_prev);
963 auto& S_L_m = std::get<MicroSaturation>(SD);
964 auto const S_L_m_prev = std::get<PrevState<MicroSaturation>>(SD_prev);
967 *medium, solid_phase, C_el, rho_LR, mu, micro_porosity_parameters,
968 alpha, phi, p_cap_ip, variables, variables_prev, x_position, t, dt,
969 sigma_sw, sigma_sw_prev, transport_porosity_prev, phi_prev,
970 transport_porosity, p_L_m_prev, S_L_m_prev, p_L_m, S_L_m);
977 auto& transport_porosity =
982 auto const transport_porosity_prev = std::get<
PrevState<
990 .template value<double>(variables, variables_prev,
1004 auto const sigma_total =
1006 DisplacementDim>>(SD)
1008 alpha * p_FR * identity2)
1017 ->getEquivalentPlasticStrain();
1019 double const k_rel =
1021 .template value<double>(variables, x_position, t, dt);
1025 .
value(variables, x_position, t, dt));
1042 std::get<ProcessLib::ThermoRichardsMechanics::
1043 ConstitutiveStress_StrainTemperature::
1044 SwellingDataStateful<DisplacementDim>>(SD)
1049 DisplacementDim>>(SD)
1053 ? eps.eps + C_el.inverse() * sigma_sw
1063 DisplacementDim>>(SD);
1064 auto const& sigma_eff_prev =
1065 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1066 EffectiveStressData<DisplacementDim>>>(
1070 DisplacementDim>>(SD);
1072 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1073 MechanicalStrainData<DisplacementDim>>>(
1076 auto C = ip_data.updateConstitutiveRelation(
1077 variables, t, x_position, dt, temperature, sigma_eff,
1078 sigma_eff_prev, eps_m, eps_m_prev, solid_material,
1081 *std::get<StiffnessTensor<DisplacementDim>>(CD) = std::move(C);
1087 DisplacementDim>>(SD)
1088 .sigma_eff.dot(identity2) /
1092 .template value<double>(variables, x_position, t, dt);
1094 double const rho = rho_SR * (1 - phi) + S_L * phi * rho_LR;
1095 *std::get<Density>(CD) = rho;
1098template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1099 int DisplacementDim>
1101 ShapeFunctionPressure, DisplacementDim>::
1102 assembleWithJacobian(
double const t,
double const dt,
1103 std::vector<double>
const& local_x,
1104 std::vector<double>
const& local_x_prev,
1105 std::vector<double>& local_rhs_data,
1106 std::vector<double>& local_Jac_data)
1110 auto const [p_L, u] =
localDOF(local_x);
1111 auto const [p_L_prev, u_prev] =
localDOF(local_x_prev);
1114 typename ShapeMatricesTypeDisplacement::template MatrixType<
1121 typename ShapeMatricesTypeDisplacement::template VectorType<
1127 DisplacementDim)>::identity2;
1130 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
1134 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
1138 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
1142 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
1145 typename ShapeMatricesTypeDisplacement::template MatrixType<
1147 Kup = ShapeMatricesTypeDisplacement::template MatrixType<
1151 typename ShapeMatricesTypeDisplacement::template MatrixType<
1153 Kpu = ShapeMatricesTypeDisplacement::template MatrixType<
1157 auto const& medium =
1159 auto const& liquid_phase =
1161 auto const& solid_phase =
1166 unsigned const n_integration_points =
1168 for (
unsigned ip = 0; ip < n_integration_points; ip++)
1176 auto const& w =
ip_data_[ip].integration_weight;
1178 auto const& N_u =
ip_data_[ip].N_u;
1179 auto const& dNdx_u =
ip_data_[ip].dNdx_u;
1181 auto const& N_p =
ip_data_[ip].N_p;
1182 auto const& dNdx_p =
ip_data_[ip].dNdx_p;
1185 std::nullopt, this->
element_.getID(),
1194 ShapeFunctionDisplacement::NPOINTS,
1201 double p_cap_prev_ip;
1210 auto const temperature =
1212 .template value<double>(variables, x_position, t, dt);
1215 std::get<StrainData<DisplacementDim>>(SD).eps.noalias() = B * u;
1218 t, dt, x_position,
ip_data_[ip], variables, variables_prev, medium,
1221 p_cap_ip, p_cap_prev_ip,
1222 Eigen::Vector<double, DisplacementDim>::Zero()},
1223 CD, SD, SD_prev, this->
process_data_.micro_porosity_parameters,
1227 auto const& C = *std::get<StiffnessTensor<DisplacementDim>>(CD);
1229 .template block<displacement_size, displacement_size>(
1231 .noalias() += B.transpose() * C * B * w;
1237 auto const& sigma_eff =
1241 double const rho = *std::get<Density>(CD);
1243 .noalias() -= (B.transpose() * sigma_eff -
1244 N_u_op(N_u).transpose() * rho * b) *
1252 double const alpha =
1253 *std::get<ProcessLib::ThermoRichardsMechanics::BiotData>(CD);
1254 double const dS_L_dp_cap =
1255 std::get<ProcessLib::ThermoRichardsMechanics::SaturationDataDeriv>(
1260 double const chi_S_L =
1261 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD)
1264 B.transpose() * alpha * chi_S_L * identity2 * N_p * w;
1265 double const dchi_dS_L =
1266 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD)
1270 .template block<displacement_size, pressure_size>(
1272 .noalias() -= B.transpose() * alpha *
1273 (chi_S_L + dchi_dS_L * p_cap_ip * dS_L_dp_cap) *
1274 identity2 * N_p * w;
1278 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(CD).phi;
1279 double const rho_LR = *std::get<LiquidDensity>(CD);
1281 .template block<displacement_size, pressure_size>(
1284 N_u_op(N_u).transpose() * phi * rho_LR * dS_L_dp_cap * b * N_p * w;
1298 using DimMatrix = Eigen::Matrix<double, 3, 3>;
1299 auto const dsigma_sw_dS_L =
1303 .
template dValue<DimMatrix>(
1304 variables, variables_prev,
1308 .template block<displacement_size, pressure_size>(
1311 B.transpose() * dsigma_sw_dS_L * dS_L_dp_cap * N_p * w;
1317 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(
1320 if (this->
process_data_.explicit_hm_coupling_in_unsaturated_zone)
1322 double const chi_S_L_prev = std::get<
PrevState<
1325 Kpu.noalias() += N_p.transpose() * chi_S_L_prev * rho_LR * alpha *
1326 identity2.transpose() * B * w;
1330 Kpu.noalias() += N_p.transpose() * S_L * rho_LR * alpha *
1331 identity2.transpose() * B * w;
1338 double const k_rel =
1340 DisplacementDim>>(CD)
1342 auto const& K_intrinsic =
1344 DisplacementDim>>(CD)
1347 *std::get<ProcessLib::ThermoRichardsMechanics::LiquidViscosityData>(
1352 laplace_p.noalias() +=
1353 dNdx_p.transpose() * k_rel * rho_Ki_over_mu * dNdx_p * w;
1355 auto const beta_LR =
1358 .template dValue<double>(variables,
1362 double const beta_SR =
1367 double const a0 = (alpha - phi) * beta_SR;
1368 double const specific_storage_a_p = S_L * (phi * beta_LR + S_L * a0);
1369 double const specific_storage_a_S = phi - p_cap_ip * S_L * a0;
1371 double const dspecific_storage_a_p_dp_cap =
1372 dS_L_dp_cap * (phi * beta_LR + 2 * S_L * a0);
1373 double const dspecific_storage_a_S_dp_cap =
1374 -a0 * (S_L + p_cap_ip * dS_L_dp_cap);
1376 storage_p_a_p.noalias() +=
1377 N_p.transpose() * rho_LR * specific_storage_a_p * N_p * w;
1379 double const DeltaS_L_Deltap_cap =
1380 std::get<SaturationSecantDerivative>(CD).DeltaS_L_Deltap_cap;
1381 storage_p_a_S.noalias() -= N_p.transpose() * rho_LR *
1382 specific_storage_a_S * DeltaS_L_Deltap_cap *
1388 .noalias() += N_p.transpose() * (p_cap_ip - p_cap_prev_ip) / dt *
1389 rho_LR * dspecific_storage_a_p_dp_cap * N_p * w;
1391 double const S_L_prev =
1396 storage_p_a_S_Jpp.noalias() -=
1397 N_p.transpose() * rho_LR *
1398 ((S_L - S_L_prev) * dspecific_storage_a_S_dp_cap +
1399 specific_storage_a_S * dS_L_dp_cap) /
1402 if (!this->
process_data_.explicit_hm_coupling_in_unsaturated_zone)
1407 .noalias() -= N_p.transpose() * rho_LR * dS_L_dp_cap * alpha *
1408 identity2.transpose() * B * (u - u_prev) / dt *
1412 double const dk_rel_dS_l =
1414 .template dValue<double>(variables,
1418 grad_p_cap = -dNdx_p * p_L;
1422 .noalias() += dNdx_p.transpose() * rho_Ki_over_mu * grad_p_cap *
1423 dk_rel_dS_l * dS_L_dp_cap * N_p * w;
1428 .noalias() += dNdx_p.transpose() * rho_LR * rho_Ki_over_mu * b *
1429 dk_rel_dS_l * dS_L_dp_cap * N_p * w;
1431 local_rhs.template segment<pressure_size>(
pressure_index).noalias() +=
1432 dNdx_p.transpose() * rho_LR * k_rel * rho_Ki_over_mu * b * w;
1436 double const alpha_bar =
1438 ->mass_exchange_coefficient;
1443 N_p.transpose() * alpha_bar / mu * (-p_cap_ip - p_L_m) * w;
1448 .noalias() += N_p.transpose() * alpha_bar / mu * N_p * w;
1449 if (p_cap_ip != p_cap_prev_ip)
1451 auto const p_L_m_prev = **std::get<PrevState<MicroPressure>>(
1454 .template block<pressure_size, pressure_size>(
1456 .noalias() += N_p.transpose() * alpha_bar / mu *
1457 (p_L_m - p_L_m_prev) /
1458 (p_cap_ip - p_cap_prev_ip) * N_p * w;
1465 storage_p_a_p = storage_p_a_p.colwise().sum().eval().asDiagonal();
1466 storage_p_a_S = storage_p_a_S.colwise().sum().eval().asDiagonal();
1468 storage_p_a_S_Jpp.colwise().sum().eval().asDiagonal();
1475 .noalias() += laplace_p + storage_p_a_p / dt + storage_p_a_S_Jpp;
1479 .template block<pressure_size, displacement_size>(
pressure_index,
1481 .noalias() = Kpu / dt;
1484 local_rhs.template segment<pressure_size>(
pressure_index).noalias() -=
1486 (storage_p_a_p + storage_p_a_S) * (p_L - p_L_prev) / dt +
1487 Kpu * (u - u_prev) / dt;
1491 .noalias() += Kup * p_L;
1494template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1495 int DisplacementDim>
1497 ShapeFunctionPressure, DisplacementDim>::
1498 assembleWithJacobianForPressureEquations(
1499 const double ,
double const ,
1500 Eigen::VectorXd
const& ,
1501 Eigen::VectorXd
const& ,
1502 std::vector<double>& ,
1503 std::vector<double>& )
1505 OGS_FATAL(
"RichardsMechanics; The staggered scheme is not implemented.");
1508template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1509 int DisplacementDim>
1511 ShapeFunctionPressure, DisplacementDim>::
1512 assembleWithJacobianForDeformationEquations(
1513 const double ,
double const ,
1514 Eigen::VectorXd
const& ,
1515 Eigen::VectorXd
const& ,
1516 std::vector<double>& ,
1517 std::vector<double>& )
1519 OGS_FATAL(
"RichardsMechanics; The staggered scheme is not implemented.");
1522template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1523 int DisplacementDim>
1525 ShapeFunctionPressure, DisplacementDim>::
1526 assembleWithJacobianForStaggeredScheme(
double const t,
double const dt,
1527 Eigen::VectorXd
const& local_x,
1528 Eigen::VectorXd
const& local_x_prev,
1529 int const process_id,
1530 std::vector<double>& local_b_data,
1531 std::vector<double>& local_Jac_data)
1534 if (process_id == 0)
1537 local_b_data, local_Jac_data);
1543 local_b_data, local_Jac_data);
1546template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1547 int DisplacementDim>
1549 ShapeFunctionPressure, DisplacementDim>::
1550 computeSecondaryVariableConcrete(
double const t,
double const dt,
1551 Eigen::VectorXd
const& local_x,
1552 Eigen::VectorXd
const& local_x_prev)
1554 auto const [p_L, u] =
localDOF(local_x);
1555 auto const [p_L_prev, u_prev] =
localDOF(local_x_prev);
1559 DisplacementDim)>::identity2;
1561 auto const& medium =
1563 auto const& liquid_phase =
1565 auto const& solid_phase =
1570 unsigned const n_integration_points =
1573 double saturation_avg = 0;
1574 double porosity_avg = 0;
1577 KV sigma_avg = KV::Zero();
1579 for (
unsigned ip = 0; ip < n_integration_points; ip++)
1581 auto const& N_p =
ip_data_[ip].N_p;
1582 auto const& N_u =
ip_data_[ip].N_u;
1583 auto const& dNdx_u =
ip_data_[ip].dNdx_u;
1586 std::nullopt, this->
element_.getID(),
1595 ShapeFunctionDisplacement::NPOINTS,
1602 double p_cap_prev_ip;
1611 auto const temperature =
1613 .template value<double>(variables, x_position, t, dt);
1619 eps.noalias() = B * u;
1621 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(
1624 auto const S_L_prev =
1630 .template value<double>(variables, x_position, t, dt);
1634 auto const chi = [medium, x_position, t, dt](
double const S_L)
1639 .template value<double>(vs, x_position, t, dt);
1641 double const chi_S_L = chi(S_L);
1642 double const chi_S_L_prev = chi(S_L_prev);
1646 .template value<double>(variables, x_position, t, dt);
1650 DisplacementDim>>(SD)
1656 auto const C_el =
ip_data_[ip].computeElasticTangentStiffness(
1660 auto const beta_SR = (1 - alpha) / this->
solid_material_.getBulkModulus(
1661 t, x_position, &C_el);
1671 auto& phi = std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(
1675 auto const phi_prev = std::get<
PrevState<
1679 variables_prev.
porosity = phi_prev;
1681 .template value<double>(variables, variables_prev,
1688 .template value<double>(variables, x_position, t, dt);
1692 .template value<double>(variables, x_position, t, dt);
1697 std::get<ProcessLib::ThermoRichardsMechanics::
1698 ConstitutiveStress_StrainTemperature::
1699 SwellingDataStateful<DisplacementDim>>(
1701 auto const& sigma_sw_prev = std::get<
1702 PrevState<ProcessLib::ThermoRichardsMechanics::
1703 ConstitutiveStress_StrainTemperature::
1704 SwellingDataStateful<DisplacementDim>>>(
1706 auto const transport_porosity_prev = std::get<
PrevState<
1709 auto const phi_prev = std::get<
1712 auto& transport_porosity = std::get<
1716 auto const p_L_m_prev =
1717 std::get<PrevState<MicroPressure>>(this->
prev_states_[ip]);
1719 auto const S_L_m_prev =
1720 std::get<PrevState<MicroSaturation>>(this->
prev_states_[ip]);
1723 *medium, solid_phase, C_el, rho_LR, mu,
1725 p_cap_ip, variables, variables_prev, x_position, t, dt,
1726 sigma_sw, sigma_sw_prev, transport_porosity_prev, phi_prev,
1727 transport_porosity, p_L_m_prev, S_L_m_prev, p_L_m, S_L_m);
1734 auto& transport_porosity =
1735 std::get<ProcessLib::ThermoRichardsMechanics::
1736 TransportPorosityData>(
1739 auto const transport_porosity_prev =
1740 std::get<
PrevState<ProcessLib::ThermoRichardsMechanics::
1741 TransportPorosityData>>(
1747 transport_porosity =
1749 .template value<double>(variables, variables_prev,
1759 auto const& sigma_eff =
1767 auto const sigma_total =
1768 (sigma_eff + alpha * chi_S_L * identity2 * p_cap_ip).eval();
1777 .material_state_variables->getEquivalentPlasticStrain();
1781 .value(variables, x_position, t, dt));
1783 double const k_rel =
1785 .template value<double>(variables, x_position, t, dt);
1789 double const p_FR = -chi_S_L * p_cap_ip;
1792 p_FR - sigma_eff.dot(identity2) / (3 * (1 - phi));
1795 .template value<double>(variables, x_position, t, dt);
1796 *std::get<DrySolidDensity>(this->
output_data_[ip]) = (1 - phi) * rho_SR;
1800 auto const& sigma_sw =
1801 std::get<ProcessLib::ThermoRichardsMechanics::
1802 ConstitutiveStress_StrainTemperature::
1803 SwellingDataStateful<DisplacementDim>>(SD)
1806 std::get<ProcessLib::ConstitutiveRelations::
1807 MechanicalStrainData<DisplacementDim>>(SD)
1811 ? eps + C_el.inverse() * sigma_sw
1823 DisplacementDim>>(SD);
1824 auto const& sigma_eff_prev =
1825 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1826 EffectiveStressData<DisplacementDim>>>(
1829 std::get<ProcessLib::ConstitutiveRelations::
1830 MechanicalStrainData<DisplacementDim>>(SD);
1831 auto const& eps_m_prev =
1832 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1833 MechanicalStrainData<DisplacementDim>>>(
1836 ip_data_[ip].updateConstitutiveRelation(
1837 variables, t, x_position, dt, temperature, sigma_eff,
1845 auto const& dNdx_p =
ip_data_[ip].dNdx_p;
1849 ->noalias() = -K_over_mu * dNdx_p * p_L + rho_LR * K_over_mu * b;
1851 saturation_avg += S_L;
1852 porosity_avg += phi;
1853 sigma_avg += sigma_eff;
1855 saturation_avg /= n_integration_points;
1856 porosity_avg /= n_integration_points;
1857 sigma_avg /= n_integration_points;
1865 &(*this->
process_data_.element_stresses)[this->element_.getID() *
1866 KV::RowsAtCompileTime]) =
1870 ShapeFunctionPressure,
typename ShapeFunctionDisplacement::MeshElement,
Phase const & phase(std::size_t index) const
Property const & property(PropertyType const &p) const
bool hasProperty(PropertyType const &p) const
Property const & property(PropertyType const &p) const
bool hasProperty(PropertyType const &p) const
virtual PropertyDataType value() const
KelvinVector mechanical_strain
KelvinVector total_stress
double solid_grain_pressure
double volumetric_mechanical_strain
double transport_porosity
double grain_compressibility
double gas_phase_pressure
double effective_pore_pressure
double equivalent_plastic_strain
double capillary_pressure
double liquid_phase_pressure
std::optional< std::size_t > getElementID() const
void setElementID(std::size_t element_id)
std::optional< MathLib::Point3d > const getCoordinates() const
MatrixType< _kelvin_vector_size, _number_of_dof > BMatrixType
ShapeMatrixPolicyType< ShapeFunctionDisplacement, DisplacementDim > ShapeMatricesTypeDisplacement
static const int pressure_size
IntegrationPointData< BMatricesType, ShapeMatricesTypeDisplacement, ShapeMatricesTypePressure, DisplacementDim, ShapeFunctionDisplacement::NPOINTS > IpData
void assembleWithJacobianForPressureEquations(double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
static constexpr auto localDOF(auto const &x)
static const int displacement_index
static constexpr auto & N_u_op
Eigen::Matrix< double, KelvinVectorSize, 1 > SymmetricTensor
static void assembleWithJacobianEvalConstitutiveSetting(double const t, double const dt, ParameterLib::SpatialPosition const &x_position, IpData &ip_data, MPL::VariableArray &variables, MPL::VariableArray &variables_prev, MPL::Medium const *const medium, TemperatureData const T_data, CapillaryPressureData< DisplacementDim > const &p_cap_data, ConstitutiveData< DisplacementDim > &CD, StatefulData< DisplacementDim > &SD, StatefulDataPrev< DisplacementDim > const &SD_prev, std::optional< MicroPorosityParameters > const µ_porosity_parameters, MaterialLib::Solids::MechanicsBase< DisplacementDim > const &solid_material, ProcessLib::ThermoRichardsMechanics::MaterialStateData< DisplacementDim > &material_state_data)
static const int displacement_size
typename ShapeMatricesTypePressure::GlobalDimMatrixType GlobalDimMatrixType
ShapeMatrixPolicyType< ShapeFunctionPressure, DisplacementDim > ShapeMatricesTypePressure
RichardsMechanicsLocalAssembler(RichardsMechanicsLocalAssembler const &)=delete
void assembleWithJacobianForDeformationEquations(double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
static const int pressure_index
std::vector< IpData, Eigen::aligned_allocator< IpData > > ip_data_
void assemble(double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &local_x_prev, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_rhs_data) override
std::unique_ptr< MSV > material_state_variables
constexpr Eigen::Matrix< double, GlobalDim, GlobalDim > formEigenTensor(MaterialPropertyLib::PropertyDataType const &values)
@ saturation_micro
capillary pressure saturation relationship for microstructure.
@ bishops_effective_stress
Eigen::Matrix< double, 4, 1 > kelvinVectorToSymmetricTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
KelvinVectorType< DisplacementDim > tensorToKelvin(Eigen::Matrix< double, 3, 3 > const &m)
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType
Eigen::Map< Vector > createZeroedVector(std::vector< double > &data, Eigen::VectorXd::Index size)
Eigen::Map< Matrix > createZeroedMatrix(std::vector< double > &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)
void shapeFunctionInterpolate(const NodalValues &, const ShapeMatrix &)
void interpolateToHigherOrderNodes(MeshLib::Element const &element, bool const is_axially_symmetric, Eigen::MatrixBase< EigenMatrixType > const &node_values, MeshLib::PropertyVector< double > &interpolated_values_global_vector)
std::vector< typename ShapeMatricesType::ShapeMatrices, Eigen::aligned_allocator< typename ShapeMatricesType::ShapeMatrices > > initShapeMatrices(MeshLib::Element const &e, bool const is_axially_symmetric, IntegrationMethod const &integration_method)
std::array< double, 3 > interpolateCoordinates(MeshLib::Element const &e, typename ShapeMatricesType::ShapeMatrices::ShapeType const &N)
BMatrixType computeBMatrix(DNDX_Type const &dNdx, N_Type const &N, const double radius, const bool is_axially_symmetric)
Fills a B-matrix based on given shape function dN/dx values.
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)
BaseLib::StrongType< double, struct TemperatureDataTag > TemperatureData
ProcessLib::ConstitutiveRelations::PrevStateOf< StatefulData< DisplacementDim > > StatefulDataPrev
std::tuple< StrainData< DisplacementDim >, ProcessLib::ConstitutiveRelations::EffectiveStressData< DisplacementDim >, ProcessLib::ThermoRichardsMechanics::ConstitutiveStress_StrainTemperature:: SwellingDataStateful< DisplacementDim >, ProcessLib::ConstitutiveRelations::MechanicalStrainData< DisplacementDim >, ProcessLib::ThermoRichardsMechanics::SaturationData, ProcessLib::ThermoRichardsMechanics::PorosityData, ProcessLib::ThermoRichardsMechanics::TransportPorosityData, MicroPressure, MicroSaturation > StatefulData
Data whose state must be tracked by the process.
ConstitutiveModels< DisplacementDim > createConstitutiveModels(TRMProcessData const &process_data, MaterialLib::Solids::MechanicsBase< DisplacementDim > const &solid_material)
std::tuple< StiffnessTensor< DisplacementDim >, ProcessLib::ThermoRichardsMechanics::PorosityData, Density, LiquidDensity, ProcessLib::ThermoRichardsMechanics::BiotData, ProcessLib::ThermoRichardsMechanics::SaturationDataDeriv, ProcessLib::ThermoRichardsMechanics::LiquidViscosityData, ProcessLib::ThermoRichardsMechanics::SolidCompressibilityData, ProcessLib::ThermoRichardsMechanics::BishopsData, PrevState< ProcessLib::ThermoRichardsMechanics::BishopsData >, ProcessLib::ThermoRichardsMechanics::PermeabilityData< DisplacementDim >, SaturationSecantDerivative > ConstitutiveData
Data that is needed for the equation system assembly.
BaseLib::StrongType< double, struct MicroPressureTag > MicroPressure
MicroPorosityStateSpace< DisplacementDim > computeMicroPorosity(MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &I_2_C_el_inverse, double const rho_LR_m, double const mu_LR, MicroPorosityParameters const µ_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)
BaseLib::StrongType< double, struct MicroSaturationTag > MicroSaturation
BaseLib::StrongType< Eigen::Vector< double, DisplacementDim >, struct DarcyLawDataTag > DarcyLawData
MatrixType< ShapeFunction::NPOINTS, ShapeFunction::NPOINTS > NodalMatrixType
VectorType< GlobalDim > GlobalDimVectorType
virtual double getBulkModulus(double const, ParameterLib::SpatialPosition const &, KelvinMatrix const *const =nullptr) const
static double trace(Eigen::Matrix< double, KelvinVectorSize, 1 > const &v)
Trace of the corresponding tensor.
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > sigma_eff
Represents a previous state of type T.
std::vector< StatefulData< DisplacementDim > > current_states_
bool const is_axially_symmetric_
LocalAssemblerInterface(MeshLib::Element const &e, NumLib::GenericIntegrationMethod const &integration_method, bool const is_axially_symmetric, RichardsMechanicsProcessData< DisplacementDim > &process_data)
std::vector< StatefulDataPrev< DisplacementDim > > prev_states_
RichardsMechanicsProcessData< DisplacementDim > & process_data_
MaterialLib::Solids::MechanicsBase< DisplacementDim > const & solid_material_
std::vector< ProcessLib::ThermoRichardsMechanics::MaterialStateData< DisplacementDim > > material_states_
MeshLib::Element const & element_
std::vector< OutputData< DisplacementDim > > output_data_
NumLib::GenericIntegrationMethod const & integration_method_