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;
341 auto const C_el =
ip_data_[ip].computeElasticTangentStiffness(
345 auto const& sigma_sw =
346 std::get<ProcessLib::ThermoRichardsMechanics::
347 ConstitutiveStress_StrainTemperature::
348 SwellingDataStateful<DisplacementDim>>(
352 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
353 MechanicalStrainData<DisplacementDim>>>(
357 eps_m_prev.noalias() =
359 ? eps + C_el.inverse() * sigma_sw
364template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
367 ShapeFunctionDisplacement, ShapeFunctionPressure,
369 std::vector<double>
const& local_x,
370 std::vector<double>
const& local_x_prev,
371 std::vector<double>& local_M_data,
372 std::vector<double>& local_K_data,
373 std::vector<double>& local_rhs_data)
377 auto const [p_L, u] =
localDOF(local_x);
378 auto const [p_L_prev, u_prev] =
localDOF(local_x_prev);
381 typename ShapeMatricesTypeDisplacement::template MatrixType<
388 typename ShapeMatricesTypeDisplacement::template MatrixType<
395 typename ShapeMatricesTypeDisplacement::template VectorType<
401 DisplacementDim)>::identity2;
405 auto const& liquid_phase =
407 auto const& solid_phase =
415 unsigned const n_integration_points =
417 for (
unsigned ip = 0; ip < n_integration_points; ip++)
419 auto const& w =
ip_data_[ip].integration_weight;
422 auto const& dNdx_u =
ip_data_[ip].dNdx_u;
425 auto const& dNdx_p =
ip_data_[ip].dNdx_p;
428 std::nullopt, this->
element_.getID(),
437 ShapeFunctionDisplacement::NPOINTS,
443 eps.eps.noalias() = B * u;
446 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(
449 auto const S_L_prev =
458 double p_cap_prev_ip;
467 auto const temperature =
469 .template value<double>(variables, x_position, t, dt);
474 .template value<double>(variables, x_position, t, dt);
478 DisplacementDim>>(SD)
484 auto const C_el =
ip_data_[ip].computeElasticTangentStiffness(
488 auto const beta_SR = (1 - alpha) / this->
solid_material_.getBulkModulus(
489 t, x_position, &C_el);
494 .template value<double>(variables, x_position, t, dt);
500 .template value<double>(variables, x_position, t, dt);
505 double const dS_L_dp_cap =
507 .template dValue<double>(variables,
512 double const DeltaS_L_Deltap_cap =
513 (p_cap_ip == p_cap_prev_ip)
515 : (S_L - S_L_prev) / (p_cap_ip - p_cap_prev_ip);
517 auto const chi = [medium, x_position, t, dt](
double const S_L)
522 .template value<double>(vs, x_position, t, dt);
524 double const chi_S_L = chi(S_L);
525 double const chi_S_L_prev = chi(S_L_prev);
527 double const p_FR = -chi_S_L * p_cap_ip;
535 auto& phi = std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(
539 auto const phi_prev = std::get<
PrevState<
545 .template value<double>(variables, variables_prev,
553 "RichardsMechanics: Biot-coefficient {} is smaller than "
554 "porosity {} in element/integration point {}/{}.",
555 alpha, phi, this->
element_.getID(), ip);
561 std::get<ProcessLib::ThermoRichardsMechanics::
562 ConstitutiveStress_StrainTemperature::
563 SwellingDataStateful<DisplacementDim>>(
566 auto const& sigma_sw_prev = std::get<
PrevState<
567 ProcessLib::ThermoRichardsMechanics::
568 ConstitutiveStress_StrainTemperature::SwellingDataStateful<
574 sigma_sw = sigma_sw_prev;
575 if (solid_phase.hasProperty(
578 auto const sigma_sw_dot =
582 .value(variables, variables_prev, x_position, t,
584 sigma_sw += sigma_sw_dot * dt;
588 identity2.transpose() * C_el.inverse() * sigma_sw;
591 identity2.transpose() * C_el.inverse() * sigma_sw_prev;
603 auto& transport_porosity =
604 std::get<ProcessLib::ThermoRichardsMechanics::
605 TransportPorosityData>(
608 auto const transport_porosity_prev =
609 std::get<
PrevState<ProcessLib::ThermoRichardsMechanics::
610 TransportPorosityData>>(
617 .template value<double>(variables, variables_prev,
629 .template value<double>(variables, x_position, t, dt);
632 .template value<double>(variables, x_position, t, dt);
634 auto const& sigma_sw =
635 std::get<ProcessLib::ThermoRichardsMechanics::
636 ConstitutiveStress_StrainTemperature::
637 SwellingDataStateful<DisplacementDim>>(
640 auto const& sigma_eff =
648 auto const sigma_total =
649 (sigma_eff - alpha * p_FR * identity2).eval();
659 .material_state_variables->getEquivalentPlasticStrain();
663 .value(variables, x_position, t, dt));
666 K_intrinsic * rho_LR * k_rel / mu;
672 auto& eps_m = std::get<ProcessLib::ConstitutiveRelations::
673 MechanicalStrainData<DisplacementDim>>(
678 ? eps.eps + C_el.inverse() * sigma_sw
690 DisplacementDim>>(SD);
691 auto const& sigma_eff_prev =
692 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
693 EffectiveStressData<DisplacementDim>>>(
696 std::get<ProcessLib::ConstitutiveRelations::
697 MechanicalStrainData<DisplacementDim>>(SD);
699 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
700 MechanicalStrainData<DisplacementDim>>>(
703 auto const C =
ip_data_[ip].updateConstitutiveRelation(
704 variables, t, x_position, dt, temperature, sigma_eff,
710 K.template block<displacement_size, displacement_size>(
712 .noalias() += B.transpose() * C * B * w;
718 p_FR - sigma_eff.dot(identity2) / (3 * (1 - phi));
721 .template value<double>(variables, x_position, t, dt);
726 double const rho = rho_SR * (1 - phi) + S_L * phi * rho_LR;
728 (B.transpose() * sigma_eff -
N_u_op(N_u).transpose() * rho * b) * w;
736 .template dValue<double>(variables,
740 double const a0 = S_L * (alpha - phi) * beta_SR;
742 double const specific_storage =
743 DeltaS_L_Deltap_cap * (p_cap_ip * a0 - phi) +
744 S_L * (phi * beta_LR + a0);
747 .noalias() += N_p.transpose() * rho_LR * specific_storage * N_p * w;
751 .noalias() += dNdx_p.transpose() * rho_K_over_mu * dNdx_p * w;
754 dNdx_p.transpose() * rho_LR * rho_K_over_mu * b * w;
761 .noalias() -= B.transpose() * alpha * chi_S_L * identity2 * N_p * w;
766 M.template block<pressure_size, displacement_size>(
pressure_index,
768 .noalias() += N_p.transpose() * S_L * rho_LR * alpha *
769 identity2.transpose() * B * w;
774 auto Mpp = M.template block<pressure_size, pressure_size>(
776 Mpp = Mpp.colwise().sum().eval().asDiagonal();
780template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
783 ShapeFunctionPressure, DisplacementDim>::
784 assembleWithJacobianEvalConstitutiveSetting(
785 double const t,
double const dt,
788 ShapeFunctionPressure,
796 std::optional<MicroPorosityParameters>
const& micro_porosity_parameters,
802 auto const& liquid_phase =
804 auto const& solid_phase =
809 DisplacementDim)>::identity2;
811 double const temperature = T_data();
812 double const p_cap_ip = p_cap_data.
p_cap;
813 double const p_cap_prev_ip = p_cap_data.
p_cap_prev;
815 auto const& eps = std::get<StrainData<DisplacementDim>>(SD);
817 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(SD).S_L;
818 auto const S_L_prev =
825 .template value<double>(variables, x_position, t, dt);
826 *std::get<ProcessLib::ThermoRichardsMechanics::BiotData>(CD) = alpha;
830 DisplacementDim>>(SD)
836 auto const C_el = ip_data.computeElasticTangentStiffness(
837 variables, t, x_position, dt, solid_material,
841 (1 - alpha) / solid_material.
getBulkModulus(t, x_position, &C_el);
843 std::get<ProcessLib::ThermoRichardsMechanics::SolidCompressibilityData>(CD)
848 .template value<double>(variables, x_position, t, dt);
850 *std::get<LiquidDensity>(CD) = rho_LR;
853 .template value<double>(variables, x_position, t, dt);
858 double const dS_L_dp_cap =
860 .template dValue<double>(variables,
863 std::get<ProcessLib::ThermoRichardsMechanics::SaturationDataDeriv>(CD)
864 .dS_L_dp_cap = dS_L_dp_cap;
867 double const DeltaS_L_Deltap_cap =
868 (p_cap_ip == p_cap_prev_ip)
870 : (S_L - S_L_prev) / (p_cap_ip - p_cap_prev_ip);
871 std::get<SaturationSecantDerivative>(CD).DeltaS_L_Deltap_cap =
874 auto const chi = [medium, x_position, t, dt](
double const S_L)
879 .template value<double>(vs, x_position, t, dt);
881 double const chi_S_L = chi(S_L);
882 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD).chi_S_L =
884 double const chi_S_L_prev = chi(S_L_prev);
885 std::get<PrevState<ProcessLib::ThermoRichardsMechanics::BishopsData>>(CD)
886 ->chi_S_L = chi_S_L_prev;
888 auto const dchi_dS_L =
890 .template dValue<double>(
892 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD).dchi_dS_L =
895 double const p_FR = -chi_S_L * p_cap_ip;
907 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(SD).phi;
909 auto const phi_prev =
916 .template value<double>(variables, variables_prev, x_position,
920 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(CD).phi = phi;
926 ?
static_cast<std::ptrdiff_t
>(*x_position.
getElementID())
927 :
static_cast<std::ptrdiff_t
>(-1);
929 "RichardsMechanics: Biot-coefficient {} is smaller than porosity "
935 .template value<double>(variables, x_position, t, dt);
936 *std::get<ProcessLib::ThermoRichardsMechanics::LiquidViscosityData>(CD) =
942 std::get<ProcessLib::ThermoRichardsMechanics::
943 ConstitutiveStress_StrainTemperature::
944 SwellingDataStateful<DisplacementDim>>(SD);
945 auto const& sigma_sw_prev =
946 std::get<
PrevState<ProcessLib::ThermoRichardsMechanics::
947 ConstitutiveStress_StrainTemperature::
948 SwellingDataStateful<DisplacementDim>>>(
950 auto const transport_porosity_prev = std::get<
PrevState<
953 auto const phi_prev = std::get<
956 auto& transport_porosity = std::get<
958 auto& p_L_m = std::get<MicroPressure>(SD);
959 auto const p_L_m_prev = std::get<PrevState<MicroPressure>>(SD_prev);
960 auto& S_L_m = std::get<MicroSaturation>(SD);
961 auto const S_L_m_prev = std::get<PrevState<MicroSaturation>>(SD_prev);
964 *medium, solid_phase, C_el, rho_LR, mu, micro_porosity_parameters,
965 alpha, phi, p_cap_ip, variables, variables_prev, x_position, t, dt,
966 sigma_sw, sigma_sw_prev, transport_porosity_prev, phi_prev,
967 transport_porosity, p_L_m_prev, S_L_m_prev, p_L_m, S_L_m);
974 auto& transport_porosity =
979 auto const transport_porosity_prev = std::get<
PrevState<
987 .template value<double>(variables, variables_prev,
1001 auto const sigma_total =
1003 DisplacementDim>>(SD)
1005 alpha * p_FR * identity2)
1014 ->getEquivalentPlasticStrain();
1016 double const k_rel =
1018 .template value<double>(variables, x_position, t, dt);
1022 .
value(variables, x_position, t, dt));
1039 std::get<ProcessLib::ThermoRichardsMechanics::
1040 ConstitutiveStress_StrainTemperature::
1041 SwellingDataStateful<DisplacementDim>>(SD)
1046 DisplacementDim>>(SD)
1050 ? eps.eps + C_el.inverse() * sigma_sw
1060 DisplacementDim>>(SD);
1061 auto const& sigma_eff_prev =
1062 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1063 EffectiveStressData<DisplacementDim>>>(
1067 DisplacementDim>>(SD);
1069 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1070 MechanicalStrainData<DisplacementDim>>>(
1073 auto C = ip_data.updateConstitutiveRelation(
1074 variables, t, x_position, dt, temperature, sigma_eff,
1075 sigma_eff_prev, eps_m, eps_m_prev, solid_material,
1078 *std::get<StiffnessTensor<DisplacementDim>>(CD) = std::move(C);
1084 DisplacementDim>>(SD)
1085 .sigma_eff.dot(identity2) /
1089 .template value<double>(variables, x_position, t, dt);
1091 double const rho = rho_SR * (1 - phi) + S_L * phi * rho_LR;
1092 *std::get<Density>(CD) = rho;
1095template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1096 int DisplacementDim>
1098 ShapeFunctionPressure, DisplacementDim>::
1099 assembleWithJacobian(
double const t,
double const dt,
1100 std::vector<double>
const& local_x,
1101 std::vector<double>
const& local_x_prev,
1102 std::vector<double>& local_rhs_data,
1103 std::vector<double>& local_Jac_data)
1107 auto const [p_L, u] =
localDOF(local_x);
1108 auto const [p_L_prev, u_prev] =
localDOF(local_x_prev);
1111 typename ShapeMatricesTypeDisplacement::template MatrixType<
1118 typename ShapeMatricesTypeDisplacement::template VectorType<
1124 DisplacementDim)>::identity2;
1127 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
1131 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
1135 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
1139 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
1142 typename ShapeMatricesTypeDisplacement::template MatrixType<
1144 Kup = ShapeMatricesTypeDisplacement::template MatrixType<
1148 typename ShapeMatricesTypeDisplacement::template MatrixType<
1150 Kpu = ShapeMatricesTypeDisplacement::template MatrixType<
1154 auto const& medium =
1156 auto const& liquid_phase =
1158 auto const& solid_phase =
1163 unsigned const n_integration_points =
1165 for (
unsigned ip = 0; ip < n_integration_points; ip++)
1173 auto const& w =
ip_data_[ip].integration_weight;
1175 auto const& N_u =
ip_data_[ip].N_u;
1176 auto const& dNdx_u =
ip_data_[ip].dNdx_u;
1178 auto const& N_p =
ip_data_[ip].N_p;
1179 auto const& dNdx_p =
ip_data_[ip].dNdx_p;
1182 std::nullopt, this->
element_.getID(),
1191 ShapeFunctionDisplacement::NPOINTS,
1198 double p_cap_prev_ip;
1207 auto const temperature =
1209 .template value<double>(variables, x_position, t, dt);
1212 std::get<StrainData<DisplacementDim>>(SD).eps.noalias() = B * u;
1215 t, dt, x_position,
ip_data_[ip], variables, variables_prev, medium,
1218 p_cap_ip, p_cap_prev_ip,
1219 Eigen::Vector<double, DisplacementDim>::Zero()},
1220 CD, SD, SD_prev, this->
process_data_.micro_porosity_parameters,
1224 auto const& C = *std::get<StiffnessTensor<DisplacementDim>>(CD);
1226 .template block<displacement_size, displacement_size>(
1228 .noalias() += B.transpose() * C * B * w;
1234 auto const& sigma_eff =
1238 double const rho = *std::get<Density>(CD);
1240 .noalias() -= (B.transpose() * sigma_eff -
1241 N_u_op(N_u).transpose() * rho * b) *
1249 double const alpha =
1250 *std::get<ProcessLib::ThermoRichardsMechanics::BiotData>(CD);
1251 double const dS_L_dp_cap =
1252 std::get<ProcessLib::ThermoRichardsMechanics::SaturationDataDeriv>(
1257 double const chi_S_L =
1258 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD)
1261 B.transpose() * alpha * chi_S_L * identity2 * N_p * w;
1262 double const dchi_dS_L =
1263 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD)
1267 .template block<displacement_size, pressure_size>(
1269 .noalias() -= B.transpose() * alpha *
1270 (chi_S_L + dchi_dS_L * p_cap_ip * dS_L_dp_cap) *
1271 identity2 * N_p * w;
1275 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(CD).phi;
1276 double const rho_LR = *std::get<LiquidDensity>(CD);
1278 .template block<displacement_size, pressure_size>(
1281 N_u_op(N_u).transpose() * phi * rho_LR * dS_L_dp_cap * b * N_p * w;
1295 using DimMatrix = Eigen::Matrix<double, 3, 3>;
1296 auto const dsigma_sw_dS_L =
1300 .
template dValue<DimMatrix>(
1301 variables, variables_prev,
1305 .template block<displacement_size, pressure_size>(
1308 B.transpose() * dsigma_sw_dS_L * dS_L_dp_cap * N_p * w;
1314 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(
1317 if (this->
process_data_.explicit_hm_coupling_in_unsaturated_zone)
1319 double const chi_S_L_prev = std::get<
PrevState<
1322 Kpu.noalias() += N_p.transpose() * chi_S_L_prev * rho_LR * alpha *
1323 identity2.transpose() * B * w;
1327 Kpu.noalias() += N_p.transpose() * S_L * rho_LR * alpha *
1328 identity2.transpose() * B * w;
1335 double const k_rel =
1337 DisplacementDim>>(CD)
1339 auto const& K_intrinsic =
1341 DisplacementDim>>(CD)
1344 *std::get<ProcessLib::ThermoRichardsMechanics::LiquidViscosityData>(
1349 laplace_p.noalias() +=
1350 dNdx_p.transpose() * k_rel * rho_Ki_over_mu * dNdx_p * w;
1352 auto const beta_LR =
1355 .template dValue<double>(variables,
1359 double const beta_SR =
1364 double const a0 = (alpha - phi) * beta_SR;
1365 double const specific_storage_a_p = S_L * (phi * beta_LR + S_L * a0);
1366 double const specific_storage_a_S = phi - p_cap_ip * S_L * a0;
1368 double const dspecific_storage_a_p_dp_cap =
1369 dS_L_dp_cap * (phi * beta_LR + 2 * S_L * a0);
1370 double const dspecific_storage_a_S_dp_cap =
1371 -a0 * (S_L + p_cap_ip * dS_L_dp_cap);
1373 storage_p_a_p.noalias() +=
1374 N_p.transpose() * rho_LR * specific_storage_a_p * N_p * w;
1376 double const DeltaS_L_Deltap_cap =
1377 std::get<SaturationSecantDerivative>(CD).DeltaS_L_Deltap_cap;
1378 storage_p_a_S.noalias() -= N_p.transpose() * rho_LR *
1379 specific_storage_a_S * DeltaS_L_Deltap_cap *
1385 .noalias() += N_p.transpose() * (p_cap_ip - p_cap_prev_ip) / dt *
1386 rho_LR * dspecific_storage_a_p_dp_cap * N_p * w;
1388 double const S_L_prev =
1393 storage_p_a_S_Jpp.noalias() -=
1394 N_p.transpose() * rho_LR *
1395 ((S_L - S_L_prev) * dspecific_storage_a_S_dp_cap +
1396 specific_storage_a_S * dS_L_dp_cap) /
1399 if (!this->
process_data_.explicit_hm_coupling_in_unsaturated_zone)
1404 .noalias() -= N_p.transpose() * rho_LR * dS_L_dp_cap * alpha *
1405 identity2.transpose() * B * (u - u_prev) / dt *
1409 double const dk_rel_dS_l =
1411 .template dValue<double>(variables,
1415 grad_p_cap = -dNdx_p * p_L;
1419 .noalias() += dNdx_p.transpose() * rho_Ki_over_mu * grad_p_cap *
1420 dk_rel_dS_l * dS_L_dp_cap * N_p * w;
1425 .noalias() += dNdx_p.transpose() * rho_LR * rho_Ki_over_mu * b *
1426 dk_rel_dS_l * dS_L_dp_cap * N_p * w;
1428 local_rhs.template segment<pressure_size>(
pressure_index).noalias() +=
1429 dNdx_p.transpose() * rho_LR * k_rel * rho_Ki_over_mu * b * w;
1433 double const alpha_bar =
1435 ->mass_exchange_coefficient;
1440 N_p.transpose() * alpha_bar / mu * (-p_cap_ip - p_L_m) * w;
1445 .noalias() += N_p.transpose() * alpha_bar / mu * N_p * w;
1446 if (p_cap_ip != p_cap_prev_ip)
1448 auto const p_L_m_prev = **std::get<PrevState<MicroPressure>>(
1451 .template block<pressure_size, pressure_size>(
1453 .noalias() += N_p.transpose() * alpha_bar / mu *
1454 (p_L_m - p_L_m_prev) /
1455 (p_cap_ip - p_cap_prev_ip) * N_p * w;
1462 storage_p_a_p = storage_p_a_p.colwise().sum().eval().asDiagonal();
1463 storage_p_a_S = storage_p_a_S.colwise().sum().eval().asDiagonal();
1465 storage_p_a_S_Jpp.colwise().sum().eval().asDiagonal();
1472 .noalias() += laplace_p + storage_p_a_p / dt + storage_p_a_S_Jpp;
1476 .template block<pressure_size, displacement_size>(
pressure_index,
1478 .noalias() = Kpu / dt;
1481 local_rhs.template segment<pressure_size>(
pressure_index).noalias() -=
1483 (storage_p_a_p + storage_p_a_S) * (p_L - p_L_prev) / dt +
1484 Kpu * (u - u_prev) / dt;
1488 .noalias() += Kup * p_L;
1491template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1492 int DisplacementDim>
1494 ShapeFunctionPressure, DisplacementDim>::
1495 assembleWithJacobianForPressureEquations(
1496 const double ,
double const ,
1497 Eigen::VectorXd
const& ,
1498 Eigen::VectorXd
const& ,
1499 std::vector<double>& ,
1500 std::vector<double>& )
1502 OGS_FATAL(
"RichardsMechanics; The staggered scheme is not implemented.");
1505template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1506 int DisplacementDim>
1508 ShapeFunctionPressure, DisplacementDim>::
1509 assembleWithJacobianForDeformationEquations(
1510 const double ,
double const ,
1511 Eigen::VectorXd
const& ,
1512 Eigen::VectorXd
const& ,
1513 std::vector<double>& ,
1514 std::vector<double>& )
1516 OGS_FATAL(
"RichardsMechanics; The staggered scheme is not implemented.");
1519template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1520 int DisplacementDim>
1522 ShapeFunctionPressure, DisplacementDim>::
1523 assembleWithJacobianForStaggeredScheme(
double const t,
double const dt,
1524 Eigen::VectorXd
const& local_x,
1525 Eigen::VectorXd
const& local_x_prev,
1526 int const process_id,
1527 std::vector<double>& local_b_data,
1528 std::vector<double>& local_Jac_data)
1531 if (process_id == 0)
1534 local_b_data, local_Jac_data);
1540 local_b_data, local_Jac_data);
1543template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1544 int DisplacementDim>
1546 ShapeFunctionPressure, DisplacementDim>::
1547 computeSecondaryVariableConcrete(
double const t,
double const dt,
1548 Eigen::VectorXd
const& local_x,
1549 Eigen::VectorXd
const& local_x_prev)
1551 auto const [p_L, u] =
localDOF(local_x);
1552 auto const [p_L_prev, u_prev] =
localDOF(local_x_prev);
1556 DisplacementDim)>::identity2;
1558 auto const& medium =
1560 auto const& liquid_phase =
1562 auto const& solid_phase =
1567 unsigned const n_integration_points =
1570 double saturation_avg = 0;
1571 double porosity_avg = 0;
1574 KV sigma_avg = KV::Zero();
1576 for (
unsigned ip = 0; ip < n_integration_points; ip++)
1578 auto const& N_p =
ip_data_[ip].N_p;
1579 auto const& N_u =
ip_data_[ip].N_u;
1580 auto const& dNdx_u =
ip_data_[ip].dNdx_u;
1583 std::nullopt, this->
element_.getID(),
1592 ShapeFunctionDisplacement::NPOINTS,
1599 double p_cap_prev_ip;
1608 auto const temperature =
1610 .template value<double>(variables, x_position, t, dt);
1616 eps.noalias() = B * u;
1618 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(
1621 auto const S_L_prev =
1627 .template value<double>(variables, x_position, t, dt);
1631 auto const chi = [medium, x_position, t, dt](
double const S_L)
1636 .template value<double>(vs, x_position, t, dt);
1638 double const chi_S_L = chi(S_L);
1639 double const chi_S_L_prev = chi(S_L_prev);
1643 .template value<double>(variables, x_position, t, dt);
1647 DisplacementDim>>(SD)
1653 auto const C_el =
ip_data_[ip].computeElasticTangentStiffness(
1657 auto const beta_SR = (1 - alpha) / this->
solid_material_.getBulkModulus(
1658 t, x_position, &C_el);
1668 auto& phi = std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(
1672 auto const phi_prev = std::get<
PrevState<
1676 variables_prev.
porosity = phi_prev;
1678 .template value<double>(variables, variables_prev,
1685 .template value<double>(variables, x_position, t, dt);
1689 .template value<double>(variables, x_position, t, dt);
1694 std::get<ProcessLib::ThermoRichardsMechanics::
1695 ConstitutiveStress_StrainTemperature::
1696 SwellingDataStateful<DisplacementDim>>(
1698 auto const& sigma_sw_prev = std::get<
1699 PrevState<ProcessLib::ThermoRichardsMechanics::
1700 ConstitutiveStress_StrainTemperature::
1701 SwellingDataStateful<DisplacementDim>>>(
1703 auto const transport_porosity_prev = std::get<
PrevState<
1706 auto const phi_prev = std::get<
1709 auto& transport_porosity = std::get<
1713 auto const p_L_m_prev =
1714 std::get<PrevState<MicroPressure>>(this->
prev_states_[ip]);
1716 auto const S_L_m_prev =
1717 std::get<PrevState<MicroSaturation>>(this->
prev_states_[ip]);
1720 *medium, solid_phase, C_el, rho_LR, mu,
1722 p_cap_ip, variables, variables_prev, x_position, t, dt,
1723 sigma_sw, sigma_sw_prev, transport_porosity_prev, phi_prev,
1724 transport_porosity, p_L_m_prev, S_L_m_prev, p_L_m, S_L_m);
1731 auto& transport_porosity =
1732 std::get<ProcessLib::ThermoRichardsMechanics::
1733 TransportPorosityData>(
1736 auto const transport_porosity_prev =
1737 std::get<
PrevState<ProcessLib::ThermoRichardsMechanics::
1738 TransportPorosityData>>(
1744 transport_porosity =
1746 .template value<double>(variables, variables_prev,
1756 auto const& sigma_eff =
1764 auto const sigma_total =
1765 (sigma_eff + alpha * chi_S_L * identity2 * p_cap_ip).eval();
1774 .material_state_variables->getEquivalentPlasticStrain();
1778 .value(variables, x_position, t, dt));
1780 double const k_rel =
1782 .template value<double>(variables, x_position, t, dt);
1786 double const p_FR = -chi_S_L * p_cap_ip;
1789 p_FR - sigma_eff.dot(identity2) / (3 * (1 - phi));
1792 .template value<double>(variables, x_position, t, dt);
1793 *std::get<DrySolidDensity>(this->
output_data_[ip]) = (1 - phi) * rho_SR;
1797 auto const& sigma_sw =
1798 std::get<ProcessLib::ThermoRichardsMechanics::
1799 ConstitutiveStress_StrainTemperature::
1800 SwellingDataStateful<DisplacementDim>>(SD)
1803 std::get<ProcessLib::ConstitutiveRelations::
1804 MechanicalStrainData<DisplacementDim>>(SD)
1808 ? eps + C_el.inverse() * sigma_sw
1820 DisplacementDim>>(SD);
1821 auto const& sigma_eff_prev =
1822 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1823 EffectiveStressData<DisplacementDim>>>(
1826 std::get<ProcessLib::ConstitutiveRelations::
1827 MechanicalStrainData<DisplacementDim>>(SD);
1828 auto const& eps_m_prev =
1829 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1830 MechanicalStrainData<DisplacementDim>>>(
1833 ip_data_[ip].updateConstitutiveRelation(
1834 variables, t, x_position, dt, temperature, sigma_eff,
1842 auto const& dNdx_p =
ip_data_[ip].dNdx_p;
1846 ->noalias() = -K_over_mu * dNdx_p * p_L + rho_LR * K_over_mu * b;
1848 saturation_avg += S_L;
1849 porosity_avg += phi;
1850 sigma_avg += sigma_eff;
1852 saturation_avg /= n_integration_points;
1853 porosity_avg /= n_integration_points;
1854 sigma_avg /= n_integration_points;
1862 &(*this->
process_data_.element_stresses)[this->element_.getID() *
1863 KV::RowsAtCompileTime]) =
1867 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_