26template <
int DisplacementDim>
31 double const rho_LR,
double const mu,
32 std::optional<MicroPorosityParameters> micro_porosity_parameters,
33 double const alpha,
double const phi,
double const p_cap_ip,
38 SwellingDataStateful<DisplacementDim>& sigma_sw,
40 ConstitutiveStress_StrainTemperature::SwellingDataStateful<
41 DisplacementDim>>
const& sigma_sw_prev,
52 DisplacementDim)>::identity2;
58 sigma_sw = *sigma_sw_prev;
61 auto const sigma_sw_dot =
65 .value(variables, variables_prev, x_position, t,
67 sigma_sw.sigma_sw += sigma_sw_dot * dt;
71 identity2.transpose() * C_el.inverse() * sigma_sw.sigma_sw;
75 sigma_sw_prev->sigma_sw;
90 double const phi_m_prev = phi_prev->phi - phi_M_prev->phi;
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,
100 phi_M.
phi = phi - (phi_m_prev + delta_phi_m);
104 *p_L_m = **p_L_m_prev + delta_p_L_m;
112 .template value<double>(variables, x_position, t, dt);
114 sigma_sw.sigma_sw = sigma_sw_prev->sigma_sw + delta_sigma_sw;
118template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
120RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
121 ShapeFunctionPressure, DisplacementDim>::
122 RichardsMechanicsLocalAssembler(
126 bool const is_axially_symmetric,
129 e, integration_method, is_axially_symmetric, process_data}
131 unsigned const n_integration_points =
132 this->integration_method_.getNumberOfPoints();
134 ip_data_.resize(n_integration_points);
135 secondary_data_.N_u.resize(n_integration_points);
137 auto const shape_matrices_u =
139 ShapeMatricesTypeDisplacement,
140 DisplacementDim>(e, is_axially_symmetric,
141 this->integration_method_);
143 auto const shape_matrices_p =
145 ShapeMatricesTypePressure, DisplacementDim>(
146 e, is_axially_symmetric, this->integration_method_);
149 this->process_data_.media_map.getMedium(this->element_.getID());
151 for (
unsigned ip = 0; ip < n_integration_points; ip++)
153 auto& ip_data = ip_data_[ip];
154 auto const& sm_u = shape_matrices_u[ip];
155 ip_data_[ip].integration_weight =
156 this->integration_method_.getWeightedPoint(ip).getWeight() *
157 sm_u.integralMeasure * sm_u.detJ;
159 ip_data.N_u = sm_u.N;
160 ip_data.dNdx_u = sm_u.dNdx;
163 std::nullopt, this->element_.getID(),
166 ShapeMatricesTypeDisplacement>(
167 this->element_, ip_data.N_u))};
169 ip_data.N_p = shape_matrices_p[ip].N;
170 ip_data.dNdx_p = shape_matrices_p[ip].dNdx;
174 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(
175 this->current_states_[ip])
178 .template initialValue<double>(
181 double>::quiet_NaN() );
183 auto& transport_porosity =
186 this->current_states_[ip])
188 transport_porosity = porosity;
193 .template initialValue<double>(
196 double>::quiet_NaN() );
199 secondary_data_.N_u[ip] = shape_matrices_u[ip].N;
203template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
206 ShapeFunctionPressure, DisplacementDim>::
207 setInitialConditionsConcrete(Eigen::VectorXd
const local_x,
213 auto const [p_L, u] =
localDOF(local_x);
215 constexpr double dt = std::numeric_limits<double>::quiet_NaN();
220 auto const& solid_phase = medium->phase(
"Solid");
224 DisplacementDim)>::identity2;
226 unsigned const n_integration_points =
228 for (
unsigned ip = 0; ip < n_integration_points; ip++)
233 std::nullopt, this->
element_.getID(),
251 std::get<PrevState<MicroPressure>>(this->
prev_states_[ip]);
252 **p_L_m_prev = -p_cap_ip;
256 auto const temperature =
258 .template value<double>(variables, x_position, t, dt);
267 .template value<double>(variables, x_position, t, dt);
273 .template value<double>(variables, x_position, t, dt);
276 double const chi_S_L =
278 .template value<double>(variables, x_position, t, dt);
287 auto& sigma_eff_prev =
288 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
289 EffectiveStressData<DisplacementDim>>>(
293 sigma_eff.sigma_eff.noalias() +=
294 chi_S_L * alpha_b * (-p_cap_ip) * identity2;
295 sigma_eff_prev->sigma_eff = sigma_eff.sigma_eff;
305 std::get<PrevState<MicroSaturation>>(this->
prev_states_[ip]);
308 .template value<double>(vars, x_position, t, dt);
317 DisplacementDim>>(SD)
321 auto const& dNdx_u =
ip_data_[ip].dNdx_u;
326 ShapeFunctionDisplacement::NPOINTS,
332 eps.noalias() = B * u;
339 auto const C_el =
ip_data_[ip].computeElasticTangentStiffness(
343 auto const& sigma_sw =
344 std::get<ProcessLib::ThermoRichardsMechanics::
345 ConstitutiveStress_StrainTemperature::
346 SwellingDataStateful<DisplacementDim>>(
350 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
351 MechanicalStrainData<DisplacementDim>>>(
355 eps_m_prev.noalias() =
357 ? eps + C_el.inverse() * sigma_sw
362template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
365 ShapeFunctionDisplacement, ShapeFunctionPressure,
367 std::vector<double>
const& local_x,
368 std::vector<double>
const& local_x_prev,
369 std::vector<double>& local_M_data,
370 std::vector<double>& local_K_data,
371 std::vector<double>& local_rhs_data)
375 auto const [p_L, u] =
localDOF(local_x);
376 auto const [p_L_prev, u_prev] =
localDOF(local_x_prev);
379 typename ShapeMatricesTypeDisplacement::template MatrixType<
386 typename ShapeMatricesTypeDisplacement::template MatrixType<
393 typename ShapeMatricesTypeDisplacement::template VectorType<
399 DisplacementDim)>::identity2;
403 auto const& liquid_phase = medium->phase(
"AqueousLiquid");
404 auto const& solid_phase = medium->phase(
"Solid");
411 unsigned const n_integration_points =
413 for (
unsigned ip = 0; ip < n_integration_points; ip++)
415 auto const& w =
ip_data_[ip].integration_weight;
418 auto const& dNdx_u =
ip_data_[ip].dNdx_u;
421 auto const& dNdx_p =
ip_data_[ip].dNdx_p;
424 std::nullopt, this->
element_.getID(),
433 ShapeFunctionDisplacement::NPOINTS,
439 eps.eps.noalias() = B * u;
442 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(
445 auto const S_L_prev =
454 double p_cap_prev_ip;
463 auto const temperature =
465 .template value<double>(variables, x_position, t, dt);
470 .template value<double>(variables, x_position, t, dt);
474 DisplacementDim>>(SD)
480 auto const C_el =
ip_data_[ip].computeElasticTangentStiffness(
484 auto const beta_SR = (1 - alpha) / this->
solid_material_.getBulkModulus(
485 t, x_position, &C_el);
490 .template value<double>(variables, x_position, t, dt);
496 .template value<double>(variables, x_position, t, dt);
501 double const dS_L_dp_cap =
503 .template dValue<double>(variables,
508 double const DeltaS_L_Deltap_cap =
509 (p_cap_ip == p_cap_prev_ip)
511 : (S_L - S_L_prev) / (p_cap_ip - p_cap_prev_ip);
513 auto const chi = [medium, x_position, t, dt](
double const S_L)
518 .template value<double>(vs, x_position, t, dt);
520 double const chi_S_L = chi(S_L);
521 double const chi_S_L_prev = chi(S_L_prev);
523 double const p_FR = -chi_S_L * p_cap_ip;
531 auto& phi = std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(
535 auto const phi_prev = std::get<
PrevState<
541 .template value<double>(variables, variables_prev,
549 "RichardsMechanics: Biot-coefficient {} is smaller than "
550 "porosity {} in element/integration point {}/{}.",
551 alpha, phi, this->
element_.getID(), ip);
557 std::get<ProcessLib::ThermoRichardsMechanics::
558 ConstitutiveStress_StrainTemperature::
559 SwellingDataStateful<DisplacementDim>>(
562 auto const& sigma_sw_prev = std::get<
PrevState<
563 ProcessLib::ThermoRichardsMechanics::
564 ConstitutiveStress_StrainTemperature::SwellingDataStateful<
570 sigma_sw = sigma_sw_prev;
571 if (solid_phase.hasProperty(
574 auto const sigma_sw_dot =
578 .value(variables, variables_prev, x_position, t,
580 sigma_sw += sigma_sw_dot * dt;
584 identity2.transpose() * C_el.inverse() * sigma_sw;
587 identity2.transpose() * C_el.inverse() * sigma_sw_prev;
599 auto& transport_porosity =
600 std::get<ProcessLib::ThermoRichardsMechanics::
601 TransportPorosityData>(
604 auto const transport_porosity_prev =
605 std::get<
PrevState<ProcessLib::ThermoRichardsMechanics::
606 TransportPorosityData>>(
613 .template value<double>(variables, variables_prev,
625 .template value<double>(variables, x_position, t, dt);
628 .template value<double>(variables, x_position, t, dt);
630 auto const& sigma_sw =
631 std::get<ProcessLib::ThermoRichardsMechanics::
632 ConstitutiveStress_StrainTemperature::
633 SwellingDataStateful<DisplacementDim>>(
636 auto const& sigma_eff =
644 auto const sigma_total =
645 (sigma_eff - alpha * p_FR * identity2).eval();
655 .material_state_variables->getEquivalentPlasticStrain();
659 .value(variables, x_position, t, dt));
662 K_intrinsic * rho_LR * k_rel / mu;
668 auto& eps_m = std::get<ProcessLib::ConstitutiveRelations::
669 MechanicalStrainData<DisplacementDim>>(
674 ? eps.eps + C_el.inverse() * sigma_sw
686 DisplacementDim>>(SD);
687 auto const& sigma_eff_prev =
688 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
689 EffectiveStressData<DisplacementDim>>>(
692 std::get<ProcessLib::ConstitutiveRelations::
693 MechanicalStrainData<DisplacementDim>>(SD);
695 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
696 MechanicalStrainData<DisplacementDim>>>(
699 auto const C =
ip_data_[ip].updateConstitutiveRelation(
700 variables, t, x_position, dt, temperature, sigma_eff,
706 K.template block<displacement_size, displacement_size>(
708 .noalias() += B.transpose() * C * B * w;
714 p_FR - sigma_eff.dot(identity2) / (3 * (1 - phi));
717 .template value<double>(variables, x_position, t, dt);
722 double const rho = rho_SR * (1 - phi) + S_L * phi * rho_LR;
724 (B.transpose() * sigma_eff -
N_u_op(N_u).transpose() * rho * b) * w;
732 .template dValue<double>(variables,
736 double const a0 = S_L * (alpha - phi) * beta_SR;
738 double const specific_storage =
739 DeltaS_L_Deltap_cap * (p_cap_ip * a0 - phi) +
740 S_L * (phi * beta_LR + a0);
743 .noalias() += N_p.transpose() * rho_LR * specific_storage * N_p * w;
747 .noalias() += dNdx_p.transpose() * rho_K_over_mu * dNdx_p * w;
750 dNdx_p.transpose() * rho_LR * rho_K_over_mu * b * w;
757 .noalias() -= B.transpose() * alpha * chi_S_L * identity2 * N_p * w;
762 M.template block<pressure_size, displacement_size>(
pressure_index,
764 .noalias() += N_p.transpose() * S_L * rho_LR * alpha *
765 identity2.transpose() * B * w;
770 auto Mpp = M.template block<pressure_size, pressure_size>(
772 Mpp = Mpp.colwise().sum().eval().asDiagonal();
776template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
779 ShapeFunctionPressure, DisplacementDim>::
780 assembleWithJacobianEvalConstitutiveSetting(
781 double const t,
double const dt,
784 ShapeFunctionPressure,
792 std::optional<MicroPorosityParameters>
const& micro_porosity_parameters,
798 auto const& liquid_phase = medium->
phase(
"AqueousLiquid");
799 auto const& solid_phase = medium->
phase(
"Solid");
803 DisplacementDim)>::identity2;
805 double const temperature = T_data();
806 double const p_cap_ip = p_cap_data.
p_cap;
807 double const p_cap_prev_ip = p_cap_data.
p_cap_prev;
809 auto const& eps = std::get<StrainData<DisplacementDim>>(SD);
811 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(SD).S_L;
812 auto const S_L_prev =
819 .template value<double>(variables, x_position, t, dt);
820 *std::get<ProcessLib::ThermoRichardsMechanics::BiotData>(CD) = alpha;
824 DisplacementDim>>(SD)
830 auto const C_el = ip_data.computeElasticTangentStiffness(
831 variables, t, x_position, dt, solid_material,
835 (1 - alpha) / solid_material.
getBulkModulus(t, x_position, &C_el);
837 std::get<ProcessLib::ThermoRichardsMechanics::SolidCompressibilityData>(CD)
842 .template value<double>(variables, x_position, t, dt);
844 *std::get<LiquidDensity>(CD) = rho_LR;
847 .template value<double>(variables, x_position, t, dt);
852 double const dS_L_dp_cap =
854 .template dValue<double>(variables,
857 std::get<ProcessLib::ThermoRichardsMechanics::SaturationDataDeriv>(CD)
858 .dS_L_dp_cap = dS_L_dp_cap;
861 double const DeltaS_L_Deltap_cap =
862 (p_cap_ip == p_cap_prev_ip)
864 : (S_L - S_L_prev) / (p_cap_ip - p_cap_prev_ip);
865 std::get<SaturationSecantDerivative>(CD).DeltaS_L_Deltap_cap =
868 auto const chi = [medium, x_position, t, dt](
double const S_L)
873 .template value<double>(vs, x_position, t, dt);
875 double const chi_S_L = chi(S_L);
876 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD).chi_S_L =
878 double const chi_S_L_prev = chi(S_L_prev);
879 std::get<PrevState<ProcessLib::ThermoRichardsMechanics::BishopsData>>(CD)
880 ->chi_S_L = chi_S_L_prev;
882 auto const dchi_dS_L =
884 .template dValue<double>(
886 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD).dchi_dS_L =
889 double const p_FR = -chi_S_L * p_cap_ip;
901 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(SD).phi;
903 auto const phi_prev =
910 .template value<double>(variables, variables_prev, x_position,
914 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(CD).phi = phi;
920 ?
static_cast<std::ptrdiff_t
>(*x_position.
getElementID())
921 :
static_cast<std::ptrdiff_t
>(-1);
923 "RichardsMechanics: Biot-coefficient {} is smaller than porosity "
929 .template value<double>(variables, x_position, t, dt);
930 *std::get<ProcessLib::ThermoRichardsMechanics::LiquidViscosityData>(CD) =
936 std::get<ProcessLib::ThermoRichardsMechanics::
937 ConstitutiveStress_StrainTemperature::
938 SwellingDataStateful<DisplacementDim>>(SD);
939 auto const& sigma_sw_prev =
940 std::get<
PrevState<ProcessLib::ThermoRichardsMechanics::
941 ConstitutiveStress_StrainTemperature::
942 SwellingDataStateful<DisplacementDim>>>(
944 auto const transport_porosity_prev = std::get<
PrevState<
947 auto const phi_prev = std::get<
950 auto& transport_porosity = std::get<
952 auto& p_L_m = std::get<MicroPressure>(SD);
953 auto const p_L_m_prev = std::get<PrevState<MicroPressure>>(SD_prev);
954 auto& S_L_m = std::get<MicroSaturation>(SD);
955 auto const S_L_m_prev = std::get<PrevState<MicroSaturation>>(SD_prev);
958 *medium, solid_phase, C_el, rho_LR, mu, micro_porosity_parameters,
959 alpha, phi, p_cap_ip, variables, variables_prev, x_position, t, dt,
960 sigma_sw, sigma_sw_prev, transport_porosity_prev, phi_prev,
961 transport_porosity, p_L_m_prev, S_L_m_prev, p_L_m, S_L_m);
968 auto& transport_porosity =
973 auto const transport_porosity_prev = std::get<
PrevState<
981 .template value<double>(variables, variables_prev,
995 auto const sigma_total =
997 DisplacementDim>>(SD)
999 alpha * p_FR * identity2)
1008 ->getEquivalentPlasticStrain();
1010 double const k_rel =
1012 .template value<double>(variables, x_position, t, dt);
1016 .
value(variables, x_position, t, dt));
1033 std::get<ProcessLib::ThermoRichardsMechanics::
1034 ConstitutiveStress_StrainTemperature::
1035 SwellingDataStateful<DisplacementDim>>(SD)
1040 DisplacementDim>>(SD)
1044 ? eps.eps + C_el.inverse() * sigma_sw
1054 DisplacementDim>>(SD);
1055 auto const& sigma_eff_prev =
1056 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1057 EffectiveStressData<DisplacementDim>>>(
1061 DisplacementDim>>(SD);
1063 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1064 MechanicalStrainData<DisplacementDim>>>(
1067 auto C = ip_data.updateConstitutiveRelation(
1068 variables, t, x_position, dt, temperature, sigma_eff,
1069 sigma_eff_prev, eps_m, eps_m_prev, solid_material,
1072 *std::get<StiffnessTensor<DisplacementDim>>(CD) = std::move(C);
1078 DisplacementDim>>(SD)
1079 .sigma_eff.dot(identity2) /
1083 .template value<double>(variables, x_position, t, dt);
1085 double const rho = rho_SR * (1 - phi) + S_L * phi * rho_LR;
1086 *std::get<Density>(CD) = rho;
1089template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1090 int DisplacementDim>
1092 ShapeFunctionPressure, DisplacementDim>::
1093 assembleWithJacobian(
double const t,
double const dt,
1094 std::vector<double>
const& local_x,
1095 std::vector<double>
const& local_x_prev,
1096 std::vector<double>& local_rhs_data,
1097 std::vector<double>& local_Jac_data)
1101 auto const [p_L, u] =
localDOF(local_x);
1102 auto const [p_L_prev, u_prev] =
localDOF(local_x_prev);
1105 typename ShapeMatricesTypeDisplacement::template MatrixType<
1112 typename ShapeMatricesTypeDisplacement::template VectorType<
1118 DisplacementDim)>::identity2;
1121 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
1125 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
1129 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
1133 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
1136 typename ShapeMatricesTypeDisplacement::template MatrixType<
1138 Kup = ShapeMatricesTypeDisplacement::template MatrixType<
1142 typename ShapeMatricesTypeDisplacement::template MatrixType<
1144 Kpu = ShapeMatricesTypeDisplacement::template MatrixType<
1148 auto const& medium =
1150 auto const& liquid_phase = medium->phase(
"AqueousLiquid");
1151 auto const& solid_phase = medium->phase(
"Solid");
1155 unsigned const n_integration_points =
1157 for (
unsigned ip = 0; ip < n_integration_points; ip++)
1165 auto const& w =
ip_data_[ip].integration_weight;
1167 auto const& N_u =
ip_data_[ip].N_u;
1168 auto const& dNdx_u =
ip_data_[ip].dNdx_u;
1170 auto const& N_p =
ip_data_[ip].N_p;
1171 auto const& dNdx_p =
ip_data_[ip].dNdx_p;
1174 std::nullopt, this->
element_.getID(),
1183 ShapeFunctionDisplacement::NPOINTS,
1190 double p_cap_prev_ip;
1199 auto const temperature =
1201 .template value<double>(variables, x_position, t, dt);
1204 std::get<StrainData<DisplacementDim>>(SD).eps.noalias() = B * u;
1207 t, dt, x_position,
ip_data_[ip], variables, variables_prev, medium,
1210 p_cap_ip, p_cap_prev_ip,
1211 Eigen::Vector<double, DisplacementDim>::Zero()},
1212 CD, SD, SD_prev, this->
process_data_.micro_porosity_parameters,
1216 auto const& C = *std::get<StiffnessTensor<DisplacementDim>>(CD);
1218 .template block<displacement_size, displacement_size>(
1220 .noalias() += B.transpose() * C * B * w;
1226 auto const& sigma_eff =
1230 double const rho = *std::get<Density>(CD);
1232 .noalias() -= (B.transpose() * sigma_eff -
1233 N_u_op(N_u).transpose() * rho * b) *
1241 double const alpha =
1242 *std::get<ProcessLib::ThermoRichardsMechanics::BiotData>(CD);
1243 double const dS_L_dp_cap =
1244 std::get<ProcessLib::ThermoRichardsMechanics::SaturationDataDeriv>(
1249 double const chi_S_L =
1250 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD)
1253 B.transpose() * alpha * chi_S_L * identity2 * N_p * w;
1254 double const dchi_dS_L =
1255 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD)
1259 .template block<displacement_size, pressure_size>(
1261 .noalias() -= B.transpose() * alpha *
1262 (chi_S_L + dchi_dS_L * p_cap_ip * dS_L_dp_cap) *
1263 identity2 * N_p * w;
1267 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(CD).phi;
1268 double const rho_LR = *std::get<LiquidDensity>(CD);
1270 .template block<displacement_size, pressure_size>(
1273 N_u_op(N_u).transpose() * phi * rho_LR * dS_L_dp_cap * b * N_p * w;
1287 using DimMatrix = Eigen::Matrix<double, 3, 3>;
1288 auto const dsigma_sw_dS_L =
1292 .
template dValue<DimMatrix>(
1293 variables, variables_prev,
1297 .template block<displacement_size, pressure_size>(
1300 B.transpose() * dsigma_sw_dS_L * dS_L_dp_cap * N_p * w;
1306 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(
1309 if (this->
process_data_.explicit_hm_coupling_in_unsaturated_zone)
1311 double const chi_S_L_prev = std::get<
PrevState<
1314 Kpu.noalias() += N_p.transpose() * chi_S_L_prev * rho_LR * alpha *
1315 identity2.transpose() * B * w;
1319 Kpu.noalias() += N_p.transpose() * S_L * rho_LR * alpha *
1320 identity2.transpose() * B * w;
1327 double const k_rel =
1329 DisplacementDim>>(CD)
1331 auto const& K_intrinsic =
1333 DisplacementDim>>(CD)
1336 *std::get<ProcessLib::ThermoRichardsMechanics::LiquidViscosityData>(
1341 laplace_p.noalias() +=
1342 dNdx_p.transpose() * k_rel * rho_Ki_over_mu * dNdx_p * w;
1344 auto const beta_LR =
1347 .template dValue<double>(variables,
1351 double const beta_SR =
1356 double const a0 = (alpha - phi) * beta_SR;
1357 double const specific_storage_a_p = S_L * (phi * beta_LR + S_L * a0);
1358 double const specific_storage_a_S = phi - p_cap_ip * S_L * a0;
1360 double const dspecific_storage_a_p_dp_cap =
1361 dS_L_dp_cap * (phi * beta_LR + 2 * S_L * a0);
1362 double const dspecific_storage_a_S_dp_cap =
1363 -a0 * (S_L + p_cap_ip * dS_L_dp_cap);
1365 storage_p_a_p.noalias() +=
1366 N_p.transpose() * rho_LR * specific_storage_a_p * N_p * w;
1368 double const DeltaS_L_Deltap_cap =
1369 std::get<SaturationSecantDerivative>(CD).DeltaS_L_Deltap_cap;
1370 storage_p_a_S.noalias() -= N_p.transpose() * rho_LR *
1371 specific_storage_a_S * DeltaS_L_Deltap_cap *
1377 .noalias() += N_p.transpose() * (p_cap_ip - p_cap_prev_ip) / dt *
1378 rho_LR * dspecific_storage_a_p_dp_cap * N_p * w;
1380 double const S_L_prev =
1385 storage_p_a_S_Jpp.noalias() -=
1386 N_p.transpose() * rho_LR *
1387 ((S_L - S_L_prev) * dspecific_storage_a_S_dp_cap +
1388 specific_storage_a_S * dS_L_dp_cap) /
1391 if (!this->
process_data_.explicit_hm_coupling_in_unsaturated_zone)
1396 .noalias() -= N_p.transpose() * rho_LR * dS_L_dp_cap * alpha *
1397 identity2.transpose() * B * (u - u_prev) / dt *
1401 double const dk_rel_dS_l =
1403 .template dValue<double>(variables,
1407 grad_p_cap = -dNdx_p * p_L;
1411 .noalias() += dNdx_p.transpose() * rho_Ki_over_mu * grad_p_cap *
1412 dk_rel_dS_l * dS_L_dp_cap * N_p * w;
1417 .noalias() += dNdx_p.transpose() * rho_LR * rho_Ki_over_mu * b *
1418 dk_rel_dS_l * dS_L_dp_cap * N_p * w;
1420 local_rhs.template segment<pressure_size>(
pressure_index).noalias() +=
1421 dNdx_p.transpose() * rho_LR * k_rel * rho_Ki_over_mu * b * w;
1425 double const alpha_bar =
1427 ->mass_exchange_coefficient;
1432 N_p.transpose() * alpha_bar / mu * (-p_cap_ip - p_L_m) * w;
1437 .noalias() += N_p.transpose() * alpha_bar / mu * N_p * w;
1438 if (p_cap_ip != p_cap_prev_ip)
1440 auto const p_L_m_prev = **std::get<PrevState<MicroPressure>>(
1443 .template block<pressure_size, pressure_size>(
1445 .noalias() += N_p.transpose() * alpha_bar / mu *
1446 (p_L_m - p_L_m_prev) /
1447 (p_cap_ip - p_cap_prev_ip) * N_p * w;
1454 storage_p_a_p = storage_p_a_p.colwise().sum().eval().asDiagonal();
1455 storage_p_a_S = storage_p_a_S.colwise().sum().eval().asDiagonal();
1457 storage_p_a_S_Jpp.colwise().sum().eval().asDiagonal();
1464 .noalias() += laplace_p + storage_p_a_p / dt + storage_p_a_S_Jpp;
1468 .template block<pressure_size, displacement_size>(
pressure_index,
1470 .noalias() = Kpu / dt;
1473 local_rhs.template segment<pressure_size>(
pressure_index).noalias() -=
1475 (storage_p_a_p + storage_p_a_S) * (p_L - p_L_prev) / dt +
1476 Kpu * (u - u_prev) / dt;
1480 .noalias() += Kup * p_L;
1483template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1484 int DisplacementDim>
1486 ShapeFunctionPressure, DisplacementDim>::
1487 assembleWithJacobianForPressureEquations(
1488 const double ,
double const ,
1489 Eigen::VectorXd
const& ,
1490 Eigen::VectorXd
const& ,
1491 std::vector<double>& ,
1492 std::vector<double>& )
1494 OGS_FATAL(
"RichardsMechanics; The staggered scheme is not implemented.");
1497template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1498 int DisplacementDim>
1500 ShapeFunctionPressure, DisplacementDim>::
1501 assembleWithJacobianForDeformationEquations(
1502 const double ,
double const ,
1503 Eigen::VectorXd
const& ,
1504 Eigen::VectorXd
const& ,
1505 std::vector<double>& ,
1506 std::vector<double>& )
1508 OGS_FATAL(
"RichardsMechanics; The staggered scheme is not implemented.");
1511template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1512 int DisplacementDim>
1514 ShapeFunctionPressure, DisplacementDim>::
1515 assembleWithJacobianForStaggeredScheme(
double const t,
double const dt,
1516 Eigen::VectorXd
const& local_x,
1517 Eigen::VectorXd
const& local_x_prev,
1518 int const process_id,
1519 std::vector<double>& local_b_data,
1520 std::vector<double>& local_Jac_data)
1523 if (process_id == 0)
1526 local_b_data, local_Jac_data);
1532 local_b_data, local_Jac_data);
1535template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1536 int DisplacementDim>
1538 ShapeFunctionPressure, DisplacementDim>::
1539 computeSecondaryVariableConcrete(
double const t,
double const dt,
1540 Eigen::VectorXd
const& local_x,
1541 Eigen::VectorXd
const& local_x_prev)
1543 auto const [p_L, u] =
localDOF(local_x);
1544 auto const [p_L_prev, u_prev] =
localDOF(local_x_prev);
1548 DisplacementDim)>::identity2;
1550 auto const& medium =
1552 auto const& liquid_phase = medium->phase(
"AqueousLiquid");
1553 auto const& solid_phase = medium->phase(
"Solid");
1557 unsigned const n_integration_points =
1560 double saturation_avg = 0;
1561 double porosity_avg = 0;
1564 KV sigma_avg = KV::Zero();
1566 for (
unsigned ip = 0; ip < n_integration_points; ip++)
1568 auto const& N_p =
ip_data_[ip].N_p;
1569 auto const& N_u =
ip_data_[ip].N_u;
1570 auto const& dNdx_u =
ip_data_[ip].dNdx_u;
1573 std::nullopt, this->
element_.getID(),
1582 ShapeFunctionDisplacement::NPOINTS,
1589 double p_cap_prev_ip;
1598 auto const temperature =
1600 .template value<double>(variables, x_position, t, dt);
1606 eps.noalias() = B * u;
1608 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(
1611 auto const S_L_prev =
1617 .template value<double>(variables, x_position, t, dt);
1621 auto const chi = [medium, x_position, t, dt](
double const S_L)
1626 .template value<double>(vs, x_position, t, dt);
1628 double const chi_S_L = chi(S_L);
1629 double const chi_S_L_prev = chi(S_L_prev);
1633 .template value<double>(variables, x_position, t, dt);
1637 DisplacementDim>>(SD)
1643 auto const C_el =
ip_data_[ip].computeElasticTangentStiffness(
1647 auto const beta_SR = (1 - alpha) / this->
solid_material_.getBulkModulus(
1648 t, x_position, &C_el);
1658 auto& phi = std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(
1662 auto const phi_prev = std::get<
PrevState<
1666 variables_prev.
porosity = phi_prev;
1668 .template value<double>(variables, variables_prev,
1675 .template value<double>(variables, x_position, t, dt);
1679 .template value<double>(variables, x_position, t, dt);
1684 std::get<ProcessLib::ThermoRichardsMechanics::
1685 ConstitutiveStress_StrainTemperature::
1686 SwellingDataStateful<DisplacementDim>>(
1688 auto const& sigma_sw_prev = std::get<
1689 PrevState<ProcessLib::ThermoRichardsMechanics::
1690 ConstitutiveStress_StrainTemperature::
1691 SwellingDataStateful<DisplacementDim>>>(
1693 auto const transport_porosity_prev = std::get<
PrevState<
1696 auto const phi_prev = std::get<
1699 auto& transport_porosity = std::get<
1703 auto const p_L_m_prev =
1704 std::get<PrevState<MicroPressure>>(this->
prev_states_[ip]);
1706 auto const S_L_m_prev =
1707 std::get<PrevState<MicroSaturation>>(this->
prev_states_[ip]);
1710 *medium, solid_phase, C_el, rho_LR, mu,
1712 p_cap_ip, variables, variables_prev, x_position, t, dt,
1713 sigma_sw, sigma_sw_prev, transport_porosity_prev, phi_prev,
1714 transport_porosity, p_L_m_prev, S_L_m_prev, p_L_m, S_L_m);
1721 auto& transport_porosity =
1722 std::get<ProcessLib::ThermoRichardsMechanics::
1723 TransportPorosityData>(
1726 auto const transport_porosity_prev =
1727 std::get<
PrevState<ProcessLib::ThermoRichardsMechanics::
1728 TransportPorosityData>>(
1734 transport_porosity =
1736 .template value<double>(variables, variables_prev,
1746 auto const& sigma_eff =
1754 auto const sigma_total =
1755 (sigma_eff + alpha * chi_S_L * identity2 * p_cap_ip).eval();
1764 .material_state_variables->getEquivalentPlasticStrain();
1768 .value(variables, x_position, t, dt));
1770 double const k_rel =
1772 .template value<double>(variables, x_position, t, dt);
1776 double const p_FR = -chi_S_L * p_cap_ip;
1779 p_FR - sigma_eff.dot(identity2) / (3 * (1 - phi));
1782 .template value<double>(variables, x_position, t, dt);
1783 *std::get<DrySolidDensity>(this->
output_data_[ip]) = (1 - phi) * rho_SR;
1787 auto const& sigma_sw =
1788 std::get<ProcessLib::ThermoRichardsMechanics::
1789 ConstitutiveStress_StrainTemperature::
1790 SwellingDataStateful<DisplacementDim>>(SD)
1793 std::get<ProcessLib::ConstitutiveRelations::
1794 MechanicalStrainData<DisplacementDim>>(SD)
1798 ? eps + C_el.inverse() * sigma_sw
1810 DisplacementDim>>(SD);
1811 auto const& sigma_eff_prev =
1812 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1813 EffectiveStressData<DisplacementDim>>>(
1816 std::get<ProcessLib::ConstitutiveRelations::
1817 MechanicalStrainData<DisplacementDim>>(SD);
1818 auto const& eps_m_prev =
1819 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1820 MechanicalStrainData<DisplacementDim>>>(
1823 ip_data_[ip].updateConstitutiveRelation(
1824 variables, t, x_position, dt, temperature, sigma_eff,
1832 auto const& dNdx_p =
ip_data_[ip].dNdx_p;
1836 ->noalias() = -K_over_mu * dNdx_p * p_L + rho_LR * K_over_mu * b;
1838 saturation_avg += S_L;
1839 porosity_avg += phi;
1840 sigma_avg += sigma_eff;
1842 saturation_avg /= n_integration_points;
1843 porosity_avg /= n_integration_points;
1844 sigma_avg /= n_integration_points;
1852 &(*this->
process_data_.element_stresses)[this->element_.getID() *
1853 KV::RowsAtCompileTime]) =
1857 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_