209 ShapeFunctionPressure, DisplacementDim>::
210 setInitialConditionsConcrete(Eigen::VectorXd
const local_x,
214 assert(local_x.size() == pressure_size + displacement_size);
216 auto const [p_L, u] = localDOF(local_x);
218 constexpr double dt = std::numeric_limits<double>::quiet_NaN();
220 this->process_data_.media_map.getMedium(this->element_.getID());
226 auto const& solid_phase = medium->phase(
"Solid");
230 DisplacementDim)>::identity2;
232 unsigned const n_integration_points =
233 this->integration_method_.getNumberOfPoints();
234 for (
unsigned ip = 0; ip < n_integration_points; ip++)
236 auto const& N_p = _ip_data[ip].N_p;
248 auto& p_L_m = std::get<MicroPressure>(this->current_states_[ip]);
250 std::get<PrevState<MicroPressure>>(this->prev_states_[ip]);
251 **p_L_m_prev = -p_cap_ip;
255 auto const temperature =
256 medium->property(MPL::PropertyType::reference_temperature)
257 .template value<double>(variables, x_position, t, dt);
263 this->prev_states_[ip])
265 S_L_prev = medium->property(MPL::PropertyType::saturation)
266 .template value<double>(variables, x_position, t, dt);
268 if (this->process_data_.initial_stress.isTotalStress())
271 medium->property(MPL::PropertyType::biot_coefficient)
272 .template value<double>(variables, x_position, t, dt);
275 double const chi_S_L =
276 medium->property(MPL::PropertyType::bishops_effective_stress)
277 .template value<double>(variables, x_position, t, dt);
284 DisplacementDim>>(this->current_states_[ip]);
286 auto& sigma_eff_prev =
287 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
288 EffectiveStressData<DisplacementDim>>>(
289 this->prev_states_[ip]);
292 sigma_eff.sigma_eff.noalias() +=
293 chi_S_L * alpha_b * (-p_cap_ip) * identity2;
294 sigma_eff_prev->sigma_eff = sigma_eff.sigma_eff;
297 if (medium->hasProperty(MPL::PropertyType::saturation_micro))
302 auto& S_L_m = std::get<MicroSaturation>(this->current_states_[ip]);
304 std::get<PrevState<MicroSaturation>>(this->prev_states_[ip]);
306 *S_L_m = medium->property(MPL::PropertyType::saturation_micro)
307 .template value<double>(vars, x_position, t, dt);
313 auto const C_el = _ip_data[ip].computeElasticTangentStiffness(
314 t, x_position, dt, temperature, this->solid_material_,
315 *this->material_states_[ip].material_state_variables);
317 auto const& N_u = _ip_data[ip].N_u;
318 auto const& dNdx_u = _ip_data[ip].dNdx_u;
322 this->element_, N_u);
325 ShapeFunctionDisplacement::NPOINTS,
327 dNdx_u, N_u, x_coord, this->is_axially_symmetric_);
329 std::get<StrainData<DisplacementDim>>(this->current_states_[ip])
331 eps.noalias() = B * u;
333 auto const& sigma_sw =
334 std::get<ProcessLib::ThermoRichardsMechanics::
335 ConstitutiveStress_StrainTemperature::
336 SwellingDataStateful<DisplacementDim>>(
337 this->current_states_[ip])
340 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
341 MechanicalStrainData<DisplacementDim>>>(
342 this->prev_states_[ip])
345 eps_m_prev.noalias() =
346 solid_phase.hasProperty(MPL::PropertyType::swelling_stress_rate)
347 ? eps + C_el.inverse() * sigma_sw
356 DisplacementDim>::assemble(
double const t,
double const dt,
357 std::vector<double>
const& local_x,
358 std::vector<double>
const& local_x_prev,
359 std::vector<double>& local_M_data,
360 std::vector<double>& local_K_data,
361 std::vector<double>& local_rhs_data)
363 assert(local_x.size() == pressure_size + displacement_size);
365 auto const [p_L, u] = localDOF(local_x);
366 auto const [p_L_prev, u_prev] = localDOF(local_x_prev);
369 typename ShapeMatricesTypeDisplacement::template MatrixType<
370 displacement_size + pressure_size,
371 displacement_size + pressure_size>>(
372 local_K_data, displacement_size + pressure_size,
373 displacement_size + pressure_size);
376 typename ShapeMatricesTypeDisplacement::template MatrixType<
377 displacement_size + pressure_size,
378 displacement_size + pressure_size>>(
379 local_M_data, displacement_size + pressure_size,
380 displacement_size + pressure_size);
383 typename ShapeMatricesTypeDisplacement::template VectorType<
384 displacement_size + pressure_size>>(
385 local_rhs_data, displacement_size + pressure_size);
389 DisplacementDim)>::identity2;
392 this->process_data_.media_map.getMedium(this->element_.getID());
393 auto const& liquid_phase = medium->phase(
"AqueousLiquid");
394 auto const& solid_phase = medium->phase(
"Solid");
401 unsigned const n_integration_points =
402 this->integration_method_.getNumberOfPoints();
403 for (
unsigned ip = 0; ip < n_integration_points; ip++)
405 auto const& w = _ip_data[ip].integration_weight;
407 auto const& N_u = _ip_data[ip].N_u;
408 auto const& dNdx_u = _ip_data[ip].dNdx_u;
410 auto const& N_p = _ip_data[ip].N_p;
411 auto const& dNdx_p = _ip_data[ip].dNdx_p;
416 this->element_, N_u);
419 ShapeFunctionDisplacement::NPOINTS,
421 dNdx_u, N_u, x_coord, this->is_axially_symmetric_);
424 std::get<StrainData<DisplacementDim>>(this->current_states_[ip]);
425 eps.eps.noalias() = B * u;
428 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(
429 this->current_states_[ip])
431 auto const S_L_prev =
434 this->prev_states_[ip])
440 double p_cap_prev_ip;
449 auto const temperature =
450 medium->property(MPL::PropertyType::reference_temperature)
451 .template value<double>(variables, x_position, t, dt);
455 medium->property(MPL::PropertyType::biot_coefficient)
456 .template value<double>(variables, x_position, t, dt);
457 auto const C_el = _ip_data[ip].computeElasticTangentStiffness(
458 t, x_position, dt, temperature, this->solid_material_,
459 *this->material_states_[ip].material_state_variables);
461 auto const beta_SR = (1 - alpha) / this->solid_material_.getBulkModulus(
462 t, x_position, &C_el);
466 liquid_phase.property(MPL::PropertyType::density)
467 .template value<double>(variables, x_position, t, dt);
470 auto const& b = this->process_data_.specific_body_force;
472 S_L = medium->property(MPL::PropertyType::saturation)
473 .template value<double>(variables, x_position, t, dt);
478 double const dS_L_dp_cap =
479 medium->property(MPL::PropertyType::saturation)
480 .template dValue<double>(variables,
481 MPL::Variable::capillary_pressure,
485 double const DeltaS_L_Deltap_cap =
486 (p_cap_ip == p_cap_prev_ip)
488 : (S_L - S_L_prev) / (p_cap_ip - p_cap_prev_ip);
490 auto const chi = [medium, x_position, t, dt](
double const S_L)
494 return medium->property(MPL::PropertyType::bishops_effective_stress)
495 .template value<double>(vs, x_position, t, dt);
497 double const chi_S_L = chi(S_L);
498 double const chi_S_L_prev = chi(S_L_prev);
500 double const p_FR = -chi_S_L * p_cap_ip;
508 auto& phi = std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(
509 this->current_states_[ip])
512 auto const phi_prev = std::get<
PrevState<
514 this->prev_states_[ip])
517 phi = medium->property(MPL::PropertyType::porosity)
518 .template value<double>(variables, variables_prev,
526 "RichardsMechanics: Biot-coefficient {} is smaller than "
527 "porosity {} in element/integration point {}/{}.",
528 alpha, phi, this->element_.getID(), ip);
534 std::get<ProcessLib::ThermoRichardsMechanics::
535 ConstitutiveStress_StrainTemperature::
536 SwellingDataStateful<DisplacementDim>>(
537 this->current_states_[ip])
539 auto const& sigma_sw_prev = std::get<
PrevState<
540 ProcessLib::ThermoRichardsMechanics::
541 ConstitutiveStress_StrainTemperature::SwellingDataStateful<
542 DisplacementDim>>>(this->prev_states_[ip])
547 sigma_sw = sigma_sw_prev;
548 if (solid_phase.hasProperty(
549 MPL::PropertyType::swelling_stress_rate))
551 auto const sigma_sw_dot =
554 solid_phase[MPL::PropertyType::swelling_stress_rate]
555 .value(variables, variables_prev, x_position, t,
557 sigma_sw += sigma_sw_dot * dt;
561 identity2.transpose() * C_el.inverse() * sigma_sw;
564 identity2.transpose() * C_el.inverse() * sigma_sw_prev;
574 if (medium->hasProperty(MPL::PropertyType::transport_porosity))
576 auto& transport_porosity =
577 std::get<ProcessLib::ThermoRichardsMechanics::
578 TransportPorosityData>(
579 this->current_states_[ip])
581 auto const transport_porosity_prev =
582 std::get<
PrevState<ProcessLib::ThermoRichardsMechanics::
583 TransportPorosityData>>(
584 this->prev_states_[ip])
589 medium->property(MPL::PropertyType::transport_porosity)
590 .template value<double>(variables, variables_prev,
601 medium->property(MPL::PropertyType::relative_permeability)
602 .template value<double>(variables, x_position, t, dt);
604 liquid_phase.property(MPL::PropertyType::viscosity)
605 .template value<double>(variables, x_position, t, dt);
607 auto const& sigma_sw =
608 std::get<ProcessLib::ThermoRichardsMechanics::
609 ConstitutiveStress_StrainTemperature::
610 SwellingDataStateful<DisplacementDim>>(
611 this->current_states_[ip])
613 auto const& sigma_eff =
615 DisplacementDim>>(this->current_states_[ip])
621 auto const sigma_total =
622 (sigma_eff - alpha * p_FR * identity2).eval();
631 this->material_states_[ip]
632 .material_state_variables->getEquivalentPlasticStrain();
635 medium->property(MPL::PropertyType::permeability)
636 .value(variables, x_position, t, dt));
639 K_intrinsic * rho_LR * k_rel / mu;
645 auto& eps_m = std::get<ProcessLib::ConstitutiveRelations::
646 MechanicalStrainData<DisplacementDim>>(
647 this->current_states_[ip])
650 solid_phase.hasProperty(MPL::PropertyType::swelling_stress_rate)
651 ? eps.eps + C_el.inverse() * sigma_sw
659 auto& SD = this->current_states_[ip];
660 auto const& SD_prev = this->prev_states_[ip];
663 DisplacementDim>>(SD);
664 auto const& sigma_eff_prev =
665 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
666 EffectiveStressData<DisplacementDim>>>(
669 std::get<ProcessLib::ConstitutiveRelations::
670 MechanicalStrainData<DisplacementDim>>(SD);
672 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
673 MechanicalStrainData<DisplacementDim>>>(
676 _ip_data[ip].updateConstitutiveRelation(
677 variables, t, x_position, dt, temperature, sigma_eff,
678 sigma_eff_prev, eps_m, eps_m_prev, this->solid_material_,
679 this->material_states_[ip].material_state_variables);
684 p_FR - sigma_eff.dot(identity2) / (3 * (1 - phi));
686 solid_phase.property(MPL::PropertyType::density)
687 .template value<double>(variables, x_position, t, dt);
692 double const rho = rho_SR * (1 - phi) + S_L * phi * rho_LR;
693 rhs.template segment<displacement_size>(displacement_index).noalias() -=
694 (B.transpose() * sigma_eff - N_u_op(N_u).transpose() * rho * b) * w;
701 liquid_phase.property(MPL::PropertyType::density)
702 .template dValue<double>(variables,
703 MPL::Variable::liquid_phase_pressure,
706 double const a0 = S_L * (alpha - phi) * beta_SR;
708 double const specific_storage =
709 DeltaS_L_Deltap_cap * (p_cap_ip * a0 - phi) +
710 S_L * (phi * beta_LR + a0);
711 M.template block<pressure_size, pressure_size>(pressure_index,
713 .noalias() += N_p.transpose() * rho_LR * specific_storage * N_p * w;
715 K.template block<pressure_size, pressure_size>(pressure_index,
717 .noalias() += dNdx_p.transpose() * rho_K_over_mu * dNdx_p * w;
719 rhs.template segment<pressure_size>(pressure_index).noalias() +=
720 dNdx_p.transpose() * rho_LR * rho_K_over_mu * b * w;
725 K.template block<displacement_size, pressure_size>(displacement_index,
727 .noalias() -= B.transpose() * alpha * chi_S_L * identity2 * N_p * w;
732 M.template block<pressure_size, displacement_size>(pressure_index,
734 .noalias() += N_p.transpose() * S_L * rho_LR * alpha *
735 identity2.transpose() * B * w;
738 if (this->process_data_.apply_mass_lumping)
740 auto Mpp = M.template block<pressure_size, pressure_size>(
741 pressure_index, pressure_index);
742 Mpp = Mpp.colwise().sum().eval().asDiagonal();
749 ShapeFunctionPressure, DisplacementDim>::
750 assembleWithJacobianEvalConstitutiveSetting(
751 double const t,
double const dt,
754 ShapeFunctionPressure,
755 DisplacementDim>::IpData& ip_data,
762 std::optional<MicroPorosityParameters>
const& micro_porosity_parameters,
768 auto const& liquid_phase = medium->
phase(
"AqueousLiquid");
769 auto const& solid_phase = medium->
phase(
"Solid");
773 DisplacementDim)>::identity2;
775 double const temperature = T_data();
776 double const p_cap_ip = p_cap_data.
p_cap;
777 double const p_cap_prev_ip = p_cap_data.
p_cap_prev;
779 auto const& eps = std::get<StrainData<DisplacementDim>>(SD);
781 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(SD).S_L;
782 auto const S_L_prev =
788 medium->
property(MPL::PropertyType::biot_coefficient)
789 .template value<double>(variables, x_position, t, dt);
790 *std::get<ProcessLib::ThermoRichardsMechanics::BiotData>(CD) = alpha;
792 auto const C_el = ip_data.computeElasticTangentStiffness(
793 t, x_position, dt, temperature, solid_material,
797 (1 - alpha) / solid_material.
getBulkModulus(t, x_position, &C_el);
799 std::get<ProcessLib::ThermoRichardsMechanics::SolidCompressibilityData>(CD)
803 liquid_phase.property(MPL::PropertyType::density)
804 .template value<double>(variables, x_position, t, dt);
806 *std::get<LiquidDensity>(CD) = rho_LR;
808 S_L = medium->
property(MPL::PropertyType::saturation)
809 .template value<double>(variables, x_position, t, dt);
814 double const dS_L_dp_cap =
815 medium->
property(MPL::PropertyType::saturation)
816 .template dValue<double>(variables,
817 MPL::Variable::capillary_pressure,
819 std::get<ProcessLib::ThermoRichardsMechanics::SaturationDataDeriv>(CD)
820 .dS_L_dp_cap = dS_L_dp_cap;
823 double const DeltaS_L_Deltap_cap =
824 (p_cap_ip == p_cap_prev_ip)
826 : (S_L - S_L_prev) / (p_cap_ip - p_cap_prev_ip);
827 std::get<SaturationSecantDerivative>(CD).DeltaS_L_Deltap_cap =
830 auto const chi = [medium, x_position, t, dt](
double const S_L)
834 return medium->
property(MPL::PropertyType::bishops_effective_stress)
835 .template value<double>(vs, x_position, t, dt);
837 double const chi_S_L = chi(S_L);
838 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD).chi_S_L =
840 double const chi_S_L_prev = chi(S_L_prev);
841 std::get<PrevState<ProcessLib::ThermoRichardsMechanics::BishopsData>>(CD)
842 ->chi_S_L = chi_S_L_prev;
844 auto const dchi_dS_L =
845 medium->
property(MPL::PropertyType::bishops_effective_stress)
846 .template dValue<double>(
847 variables, MPL::Variable::liquid_saturation, x_position, t, dt);
848 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD).dchi_dS_L =
851 double const p_FR = -chi_S_L * p_cap_ip;
863 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(SD).phi;
865 auto const phi_prev =
871 phi = medium->
property(MPL::PropertyType::porosity)
872 .template value<double>(variables, variables_prev, x_position,
876 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(CD).phi = phi;
882 ?
static_cast<std::ptrdiff_t
>(*x_position.
getElementID())
883 :
static_cast<std::ptrdiff_t
>(-1);
885 "RichardsMechanics: Biot-coefficient {} is smaller than porosity "
890 auto const mu = liquid_phase.property(MPL::PropertyType::viscosity)
891 .template value<double>(variables, x_position, t, dt);
892 *std::get<ProcessLib::ThermoRichardsMechanics::LiquidViscosityData>(CD) =
898 std::get<ProcessLib::ThermoRichardsMechanics::
899 ConstitutiveStress_StrainTemperature::
900 SwellingDataStateful<DisplacementDim>>(SD);
901 auto const& sigma_sw_prev =
902 std::get<
PrevState<ProcessLib::ThermoRichardsMechanics::
903 ConstitutiveStress_StrainTemperature::
904 SwellingDataStateful<DisplacementDim>>>(
906 auto const transport_porosity_prev = std::get<
PrevState<
909 auto const phi_prev = std::get<
912 auto& transport_porosity = std::get<
914 auto& p_L_m = std::get<MicroPressure>(SD);
915 auto const p_L_m_prev = std::get<PrevState<MicroPressure>>(SD_prev);
916 auto& S_L_m = std::get<MicroSaturation>(SD);
917 auto const S_L_m_prev = std::get<PrevState<MicroSaturation>>(SD_prev);
920 *medium, solid_phase, C_el, rho_LR, mu, micro_porosity_parameters,
921 alpha, phi, p_cap_ip, variables, variables_prev, x_position, t, dt,
922 sigma_sw, sigma_sw_prev, transport_porosity_prev, phi_prev,
923 transport_porosity, p_L_m_prev, S_L_m_prev, p_L_m, S_L_m);
926 if (medium->
hasProperty(MPL::PropertyType::transport_porosity))
928 if (!medium->
hasProperty(MPL::PropertyType::saturation_micro))
930 auto& transport_porosity =
935 auto const transport_porosity_prev = std::get<
PrevState<
942 medium->
property(MPL::PropertyType::transport_porosity)
943 .template value<double>(variables, variables_prev,
957 auto const sigma_total =
959 DisplacementDim>>(SD)
961 alpha * p_FR * identity2)
970 ->getEquivalentPlasticStrain();
973 medium->
property(MPL::PropertyType::relative_permeability)
974 .template value<double>(variables, x_position, t, dt);
977 medium->
property(MPL::PropertyType::permeability)
978 .
value(variables, x_position, t, dt));
995 std::get<ProcessLib::ThermoRichardsMechanics::
996 ConstitutiveStress_StrainTemperature::
997 SwellingDataStateful<DisplacementDim>>(SD)
1002 DisplacementDim>>(SD)
1005 solid_phase.hasProperty(MPL::PropertyType::swelling_stress_rate)
1006 ? eps.eps + C_el.inverse() * sigma_sw
1016 DisplacementDim>>(SD);
1017 auto const& sigma_eff_prev =
1018 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1019 EffectiveStressData<DisplacementDim>>>(
1023 DisplacementDim>>(SD);
1025 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1026 MechanicalStrainData<DisplacementDim>>>(
1029 auto C = ip_data.updateConstitutiveRelation(
1030 variables, t, x_position, dt, temperature, sigma_eff,
1031 sigma_eff_prev, eps_m, eps_m_prev, solid_material,
1034 *std::get<StiffnessTensor<DisplacementDim>>(CD) = std::move(C);
1040 DisplacementDim>>(SD)
1041 .sigma_eff.dot(identity2) /
1044 solid_phase.property(MPL::PropertyType::density)
1045 .template value<double>(variables, x_position, t, dt);
1047 double const rho = rho_SR * (1 - phi) + S_L * phi * rho_LR;
1048 *std::get<Density>(CD) = rho;
1054 ShapeFunctionPressure, DisplacementDim>::
1055 assembleWithJacobian(
double const t,
double const dt,
1056 std::vector<double>
const& local_x,
1057 std::vector<double>
const& local_x_prev,
1058 std::vector<double>& local_rhs_data,
1059 std::vector<double>& local_Jac_data)
1061 assert(local_x.size() == pressure_size + displacement_size);
1063 auto const [p_L, u] = localDOF(local_x);
1064 auto const [p_L_prev, u_prev] = localDOF(local_x_prev);
1067 typename ShapeMatricesTypeDisplacement::template MatrixType<
1068 displacement_size + pressure_size,
1069 displacement_size + pressure_size>>(
1070 local_Jac_data, displacement_size + pressure_size,
1071 displacement_size + pressure_size);
1074 typename ShapeMatricesTypeDisplacement::template VectorType<
1075 displacement_size + pressure_size>>(
1076 local_rhs_data, displacement_size + pressure_size);
1080 DisplacementDim)>::identity2;
1083 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
1087 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
1091 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
1095 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
1098 typename ShapeMatricesTypeDisplacement::template MatrixType<
1099 displacement_size, pressure_size>
1100 Kup = ShapeMatricesTypeDisplacement::template MatrixType<
1101 displacement_size, pressure_size>::Zero(displacement_size,
1104 typename ShapeMatricesTypeDisplacement::template MatrixType<
1105 pressure_size, displacement_size>
1106 Kpu = ShapeMatricesTypeDisplacement::template MatrixType<
1107 pressure_size, displacement_size>::Zero(pressure_size,
1110 auto const& medium =
1111 this->process_data_.media_map.getMedium(this->element_.getID());
1112 auto const& liquid_phase = medium->phase(
"AqueousLiquid");
1113 auto const& solid_phase = medium->phase(
"Solid");
1120 unsigned const n_integration_points =
1121 this->integration_method_.getNumberOfPoints();
1122 for (
unsigned ip = 0; ip < n_integration_points; ip++)
1125 auto& SD = this->current_states_[ip];
1126 auto const& SD_prev = this->prev_states_[ip];
1128 this->process_data_, this->solid_material_);
1130 auto const& w = _ip_data[ip].integration_weight;
1132 auto const& N_u = _ip_data[ip].N_u;
1133 auto const& dNdx_u = _ip_data[ip].dNdx_u;
1135 auto const& N_p = _ip_data[ip].N_p;
1136 auto const& dNdx_p = _ip_data[ip].dNdx_p;
1138 auto const x_coord =
1141 this->element_, N_u);
1144 ShapeFunctionDisplacement::NPOINTS,
1146 dNdx_u, N_u, x_coord, this->is_axially_symmetric_);
1151 double p_cap_prev_ip;
1160 auto const temperature =
1161 medium->property(MPL::PropertyType::reference_temperature)
1162 .template value<double>(variables, x_position, t, dt);
1165 std::get<StrainData<DisplacementDim>>(SD).eps.noalias() = B * u;
1167 assembleWithJacobianEvalConstitutiveSetting(
1168 t, dt, x_position, _ip_data[ip], variables, variables_prev, medium,
1171 p_cap_ip, p_cap_prev_ip,
1172 Eigen::Vector<double, DisplacementDim>::Zero()},
1173 CD, SD, SD_prev, this->process_data_.micro_porosity_parameters,
1174 this->solid_material_, this->material_states_[ip]);
1177 auto const& C = *std::get<StiffnessTensor<DisplacementDim>>(CD);
1179 .template block<displacement_size, displacement_size>(
1180 displacement_index, displacement_index)
1181 .noalias() += B.transpose() * C * B * w;
1184 auto const& b = this->process_data_.specific_body_force;
1187 auto const& sigma_eff =
1189 DisplacementDim>>(this->current_states_[ip])
1191 double const rho = *std::get<Density>(CD);
1192 local_rhs.template segment<displacement_size>(displacement_index)
1193 .noalias() -= (B.transpose() * sigma_eff -
1194 N_u_op(N_u).transpose() * rho * b) *
1202 double const alpha =
1203 *std::get<ProcessLib::ThermoRichardsMechanics::BiotData>(CD);
1204 double const dS_L_dp_cap =
1205 std::get<ProcessLib::ThermoRichardsMechanics::SaturationDataDeriv>(
1210 double const chi_S_L =
1211 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD)
1214 B.transpose() * alpha * chi_S_L * identity2 * N_p * w;
1215 double const dchi_dS_L =
1216 std::get<ProcessLib::ThermoRichardsMechanics::BishopsData>(CD)
1220 .template block<displacement_size, pressure_size>(
1221 displacement_index, pressure_index)
1222 .noalias() -= B.transpose() * alpha *
1223 (chi_S_L + dchi_dS_L * p_cap_ip * dS_L_dp_cap) *
1224 identity2 * N_p * w;
1228 std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(CD).phi;
1229 double const rho_LR = *std::get<LiquidDensity>(CD);
1231 .template block<displacement_size, pressure_size>(
1232 displacement_index, pressure_index)
1234 N_u_op(N_u).transpose() * phi * rho_LR * dS_L_dp_cap * b * N_p * w;
1245 if (!medium->hasProperty(MPL::PropertyType::saturation_micro) &&
1246 solid_phase.hasProperty(MPL::PropertyType::swelling_stress_rate))
1248 using DimMatrix = Eigen::Matrix<double, 3, 3>;
1249 auto const dsigma_sw_dS_L =
1252 .property(MPL::PropertyType::swelling_stress_rate)
1253 .
template dValue<DimMatrix>(
1254 variables, variables_prev,
1255 MPL::Variable::liquid_saturation, x_position, t,
1258 .template block<displacement_size, pressure_size>(
1259 displacement_index, pressure_index)
1261 B.transpose() * dsigma_sw_dS_L * dS_L_dp_cap * N_p * w;
1267 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(
1268 this->current_states_[ip])
1270 if (this->process_data_.explicit_hm_coupling_in_unsaturated_zone)
1272 double const chi_S_L_prev = std::get<
PrevState<
1275 Kpu.noalias() += N_p.transpose() * chi_S_L_prev * rho_LR * alpha *
1276 identity2.transpose() * B * w;
1280 Kpu.noalias() += N_p.transpose() * S_L * rho_LR * alpha *
1281 identity2.transpose() * B * w;
1288 double const k_rel =
1290 DisplacementDim>>(CD)
1292 auto const& K_intrinsic =
1294 DisplacementDim>>(CD)
1297 *std::get<ProcessLib::ThermoRichardsMechanics::LiquidViscosityData>(
1302 laplace_p.noalias() +=
1303 dNdx_p.transpose() * k_rel * rho_Ki_over_mu * dNdx_p * w;
1305 auto const beta_LR =
1307 liquid_phase.property(MPL::PropertyType::density)
1308 .template dValue<double>(variables,
1309 MPL::Variable::liquid_phase_pressure,
1312 double const beta_SR =
1317 double const a0 = (alpha - phi) * beta_SR;
1318 double const specific_storage_a_p = S_L * (phi * beta_LR + S_L * a0);
1319 double const specific_storage_a_S = phi - p_cap_ip * S_L * a0;
1321 double const dspecific_storage_a_p_dp_cap =
1322 dS_L_dp_cap * (phi * beta_LR + 2 * S_L * a0);
1323 double const dspecific_storage_a_S_dp_cap =
1324 -a0 * (S_L + p_cap_ip * dS_L_dp_cap);
1326 storage_p_a_p.noalias() +=
1327 N_p.transpose() * rho_LR * specific_storage_a_p * N_p * w;
1329 double const DeltaS_L_Deltap_cap =
1330 std::get<SaturationSecantDerivative>(CD).DeltaS_L_Deltap_cap;
1331 storage_p_a_S.noalias() -= N_p.transpose() * rho_LR *
1332 specific_storage_a_S * DeltaS_L_Deltap_cap *
1336 .template block<pressure_size, pressure_size>(pressure_index,
1338 .noalias() += N_p.transpose() * (p_cap_ip - p_cap_prev_ip) / dt *
1339 rho_LR * dspecific_storage_a_p_dp_cap * N_p * w;
1341 double const S_L_prev =
1344 this->prev_states_[ip])
1346 storage_p_a_S_Jpp.noalias() -=
1347 N_p.transpose() * rho_LR *
1348 ((S_L - S_L_prev) * dspecific_storage_a_S_dp_cap +
1349 specific_storage_a_S * dS_L_dp_cap) /
1352 if (!this->process_data_.explicit_hm_coupling_in_unsaturated_zone)
1355 .template block<pressure_size, pressure_size>(pressure_index,
1357 .noalias() -= N_p.transpose() * rho_LR * dS_L_dp_cap * alpha *
1358 identity2.transpose() * B * (u - u_prev) / dt *
1362 double const dk_rel_dS_l =
1363 medium->property(MPL::PropertyType::relative_permeability)
1364 .template dValue<double>(variables,
1365 MPL::Variable::liquid_saturation,
1368 grad_p_cap = -dNdx_p * p_L;
1370 .template block<pressure_size, pressure_size>(pressure_index,
1372 .noalias() += dNdx_p.transpose() * rho_Ki_over_mu * grad_p_cap *
1373 dk_rel_dS_l * dS_L_dp_cap * N_p * w;
1376 .template block<pressure_size, pressure_size>(pressure_index,
1378 .noalias() += dNdx_p.transpose() * rho_LR * rho_Ki_over_mu * b *
1379 dk_rel_dS_l * dS_L_dp_cap * N_p * w;
1381 local_rhs.template segment<pressure_size>(pressure_index).noalias() +=
1382 dNdx_p.transpose() * rho_LR * k_rel * rho_Ki_over_mu * b * w;
1384 if (medium->hasProperty(MPL::PropertyType::saturation_micro))
1386 double const alpha_bar =
1387 this->process_data_.micro_porosity_parameters
1388 ->mass_exchange_coefficient;
1390 *std::get<MicroPressure>(this->current_states_[ip]);
1391 local_rhs.template segment<pressure_size>(pressure_index)
1393 N_p.transpose() * alpha_bar / mu * (-p_cap_ip - p_L_m) * w;
1396 .template block<pressure_size, pressure_size>(pressure_index,
1398 .noalias() += N_p.transpose() * alpha_bar / mu * N_p * w;
1399 if (p_cap_ip != p_cap_prev_ip)
1401 auto const p_L_m_prev = **std::get<PrevState<MicroPressure>>(
1402 this->prev_states_[ip]);
1404 .template block<pressure_size, pressure_size>(
1405 pressure_index, pressure_index)
1406 .noalias() += N_p.transpose() * alpha_bar / mu *
1407 (p_L_m - p_L_m_prev) /
1408 (p_cap_ip - p_cap_prev_ip) * N_p * w;
1413 if (this->process_data_.apply_mass_lumping)
1415 storage_p_a_p = storage_p_a_p.colwise().sum().eval().asDiagonal();
1416 storage_p_a_S = storage_p_a_S.colwise().sum().eval().asDiagonal();
1418 storage_p_a_S_Jpp.colwise().sum().eval().asDiagonal();
1423 .template block<pressure_size, pressure_size>(pressure_index,
1425 .noalias() += laplace_p + storage_p_a_p / dt + storage_p_a_S_Jpp;
1429 .template block<pressure_size, displacement_size>(pressure_index,
1431 .noalias() = Kpu / dt;
1434 local_rhs.template segment<pressure_size>(pressure_index).noalias() -=
1436 (storage_p_a_p + storage_p_a_S) * (p_L - p_L_prev) / dt +
1437 Kpu * (u - u_prev) / dt;
1440 local_rhs.template segment<displacement_size>(displacement_index)
1441 .noalias() += Kup * p_L;
1499 ShapeFunctionPressure, DisplacementDim>::
1500 computeSecondaryVariableConcrete(
double const t,
double const dt,
1501 Eigen::VectorXd
const& local_x,
1502 Eigen::VectorXd
const& local_x_prev)
1504 auto const [p_L, u] = localDOF(local_x);
1505 auto const [p_L_prev, u_prev] = localDOF(local_x_prev);
1509 DisplacementDim)>::identity2;
1511 auto const& medium =
1512 this->process_data_.media_map.getMedium(this->element_.getID());
1513 auto const& liquid_phase = medium->phase(
"AqueousLiquid");
1514 auto const& solid_phase = medium->phase(
"Solid");
1521 unsigned const n_integration_points =
1522 this->integration_method_.getNumberOfPoints();
1524 double saturation_avg = 0;
1525 double porosity_avg = 0;
1528 KV sigma_avg = KV::Zero();
1530 for (
unsigned ip = 0; ip < n_integration_points; ip++)
1532 auto const& N_p = _ip_data[ip].N_p;
1533 auto const& N_u = _ip_data[ip].N_u;
1534 auto const& dNdx_u = _ip_data[ip].dNdx_u;
1536 auto const x_coord =
1539 this->element_, N_u);
1542 ShapeFunctionDisplacement::NPOINTS,
1544 dNdx_u, N_u, x_coord, this->is_axially_symmetric_);
1549 double p_cap_prev_ip;
1558 auto const temperature =
1559 medium->property(MPL::PropertyType::reference_temperature)
1560 .template value<double>(variables, x_position, t, dt);
1564 std::get<StrainData<DisplacementDim>>(this->current_states_[ip])
1566 eps.noalias() = B * u;
1568 std::get<ProcessLib::ThermoRichardsMechanics::SaturationData>(
1569 this->current_states_[ip])
1571 auto const S_L_prev =
1574 this->prev_states_[ip])
1576 S_L = medium->property(MPL::PropertyType::saturation)
1577 .template value<double>(variables, x_position, t, dt);
1581 auto const chi = [medium, x_position, t, dt](
double const S_L)
1585 return medium->property(MPL::PropertyType::bishops_effective_stress)
1586 .template value<double>(vs, x_position, t, dt);
1588 double const chi_S_L = chi(S_L);
1589 double const chi_S_L_prev = chi(S_L_prev);
1592 medium->property(MPL::PropertyType::biot_coefficient)
1593 .template value<double>(variables, x_position, t, dt);
1595 auto const C_el = _ip_data[ip].computeElasticTangentStiffness(
1596 t, x_position, dt, temperature, this->solid_material_,
1597 *this->material_states_[ip].material_state_variables);
1599 auto const beta_SR = (1 - alpha) / this->solid_material_.getBulkModulus(
1600 t, x_position, &C_el);
1610 auto& phi = std::get<ProcessLib::ThermoRichardsMechanics::PorosityData>(
1611 this->current_states_[ip])
1614 auto const phi_prev = std::get<
PrevState<
1616 this->prev_states_[ip])
1618 variables_prev.
porosity = phi_prev;
1619 phi = medium->property(MPL::PropertyType::porosity)
1620 .template value<double>(variables, variables_prev,
1626 liquid_phase.property(MPL::PropertyType::density)
1627 .template value<double>(variables, x_position, t, dt);
1630 liquid_phase.property(MPL::PropertyType::viscosity)
1631 .template value<double>(variables, x_position, t, dt);
1636 std::get<ProcessLib::ThermoRichardsMechanics::
1637 ConstitutiveStress_StrainTemperature::
1638 SwellingDataStateful<DisplacementDim>>(
1639 this->current_states_[ip]);
1640 auto const& sigma_sw_prev = std::get<
1641 PrevState<ProcessLib::ThermoRichardsMechanics::
1642 ConstitutiveStress_StrainTemperature::
1643 SwellingDataStateful<DisplacementDim>>>(
1644 this->prev_states_[ip]);
1645 auto const transport_porosity_prev = std::get<
PrevState<
1647 this->prev_states_[ip]);
1648 auto const phi_prev = std::get<
1650 this->prev_states_[ip]);
1651 auto& transport_porosity = std::get<
1653 this->current_states_[ip]);
1654 auto& p_L_m = std::get<MicroPressure>(this->current_states_[ip]);
1655 auto const p_L_m_prev =
1656 std::get<PrevState<MicroPressure>>(this->prev_states_[ip]);
1657 auto& S_L_m = std::get<MicroSaturation>(this->current_states_[ip]);
1658 auto const S_L_m_prev =
1659 std::get<PrevState<MicroSaturation>>(this->prev_states_[ip]);
1662 *medium, solid_phase, C_el, rho_LR, mu,
1663 this->process_data_.micro_porosity_parameters, alpha, phi,
1664 p_cap_ip, variables, variables_prev, x_position, t, dt,
1665 sigma_sw, sigma_sw_prev, transport_porosity_prev, phi_prev,
1666 transport_porosity, p_L_m_prev, S_L_m_prev, p_L_m, S_L_m);
1669 if (medium->hasProperty(MPL::PropertyType::transport_porosity))
1671 if (!medium->hasProperty(MPL::PropertyType::saturation_micro))
1673 auto& transport_porosity =
1674 std::get<ProcessLib::ThermoRichardsMechanics::
1675 TransportPorosityData>(
1676 this->current_states_[ip])
1678 auto const transport_porosity_prev =
1679 std::get<
PrevState<ProcessLib::ThermoRichardsMechanics::
1680 TransportPorosityData>>(
1681 this->prev_states_[ip])
1686 transport_porosity =
1687 medium->property(MPL::PropertyType::transport_porosity)
1688 .template value<double>(variables, variables_prev,
1698 auto const& sigma_eff =
1700 DisplacementDim>>(this->current_states_[ip])
1706 auto const sigma_total =
1707 (sigma_eff + alpha * chi_S_L * identity2 * p_cap_ip).eval();
1715 this->material_states_[ip]
1716 .material_state_variables->getEquivalentPlasticStrain();
1719 medium->property(MPL::PropertyType::permeability)
1720 .value(variables, x_position, t, dt));
1722 double const k_rel =
1723 medium->property(MPL::PropertyType::relative_permeability)
1724 .template value<double>(variables, x_position, t, dt);
1728 double const p_FR = -chi_S_L * p_cap_ip;
1731 p_FR - sigma_eff.dot(identity2) / (3 * (1 - phi));
1733 solid_phase.property(MPL::PropertyType::density)
1734 .template value<double>(variables, x_position, t, dt);
1735 *std::get<DrySolidDensity>(this->output_data_[ip]) = (1 - phi) * rho_SR;
1738 auto& SD = this->current_states_[ip];
1739 auto const& sigma_sw =
1740 std::get<ProcessLib::ThermoRichardsMechanics::
1741 ConstitutiveStress_StrainTemperature::
1742 SwellingDataStateful<DisplacementDim>>(SD)
1745 std::get<ProcessLib::ConstitutiveRelations::
1746 MechanicalStrainData<DisplacementDim>>(SD)
1749 solid_phase.hasProperty(MPL::PropertyType::swelling_stress_rate)
1750 ? eps + C_el.inverse() * sigma_sw
1758 auto& SD = this->current_states_[ip];
1759 auto const& SD_prev = this->prev_states_[ip];
1762 DisplacementDim>>(SD);
1763 auto const& sigma_eff_prev =
1764 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1765 EffectiveStressData<DisplacementDim>>>(
1768 std::get<ProcessLib::ConstitutiveRelations::
1769 MechanicalStrainData<DisplacementDim>>(SD);
1770 auto const& eps_m_prev =
1771 std::get<
PrevState<ProcessLib::ConstitutiveRelations::
1772 MechanicalStrainData<DisplacementDim>>>(
1775 _ip_data[ip].updateConstitutiveRelation(
1776 variables, t, x_position, dt, temperature, sigma_eff,
1777 sigma_eff_prev, eps_m, eps_m_prev, this->solid_material_,
1778 this->material_states_[ip].material_state_variables);
1781 auto const& b = this->process_data_.specific_body_force;
1784 auto const& dNdx_p = _ip_data[ip].dNdx_p;
1787 this->output_data_[ip])
1788 ->noalias() = -K_over_mu * dNdx_p * p_L + rho_LR * K_over_mu * b;
1790 saturation_avg += S_L;
1791 porosity_avg += phi;
1792 sigma_avg += sigma_eff;
1794 saturation_avg /= n_integration_points;
1795 porosity_avg /= n_integration_points;
1796 sigma_avg /= n_integration_points;
1798 (*this->process_data_.element_saturation)[this->element_.getID()] =
1800 (*this->process_data_.element_porosity)[this->element_.getID()] =
1804 &(*this->process_data_.element_stresses)[this->element_.getID() *
1805 KV::RowsAtCompileTime]) =
1809 ShapeFunctionPressure,
typename ShapeFunctionDisplacement::MeshElement,
1810 DisplacementDim>(this->element_, this->is_axially_symmetric_, p_L,
1811 *this->process_data_.pressure_interpolated);