354 DisplacementDim>::assemble(
double const t,
double const dt,
355 std::vector<double>
const& local_x,
356 std::vector<double>
const& local_x_prev,
357 std::vector<double>& local_M_data,
358 std::vector<double>& local_K_data,
359 std::vector<double>& local_rhs_data)
361 assert(local_x.size() == pressure_size + displacement_size);
364 Eigen::Map<
typename ShapeMatricesTypePressure::template VectorType<
365 pressure_size>
const>(local_x.data() + pressure_index,
369 Eigen::Map<
typename ShapeMatricesTypeDisplacement::template VectorType<
370 displacement_size>
const>(local_x.data() + displacement_index,
374 Eigen::Map<
typename ShapeMatricesTypePressure::template VectorType<
375 pressure_size>
const>(local_x_prev.data() + pressure_index,
379 Eigen::Map<
typename ShapeMatricesTypeDisplacement::template VectorType<
380 displacement_size>
const>(local_x_prev.data() + displacement_index,
384 typename ShapeMatricesTypeDisplacement::template MatrixType<
385 displacement_size + pressure_size,
386 displacement_size + pressure_size>>(
387 local_K_data, displacement_size + pressure_size,
388 displacement_size + pressure_size);
391 typename ShapeMatricesTypeDisplacement::template MatrixType<
392 displacement_size + pressure_size,
393 displacement_size + pressure_size>>(
394 local_M_data, displacement_size + pressure_size,
395 displacement_size + pressure_size);
398 typename ShapeMatricesTypeDisplacement::template VectorType<
399 displacement_size + pressure_size>>(
400 local_rhs_data, displacement_size + pressure_size);
404 DisplacementDim)>::identity2;
406 auto const& medium = _process_data.media_map.getMedium(_element.getID());
407 auto const& liquid_phase = medium->phase(
"AqueousLiquid");
408 auto const& solid_phase = medium->phase(
"Solid");
415 unsigned const n_integration_points =
416 _integration_method.getNumberOfPoints();
417 for (
unsigned ip = 0; ip < n_integration_points; ip++)
420 auto const& w = _ip_data[ip].integration_weight;
422 auto const& N_u = _ip_data[ip].N_u;
423 auto const& dNdx_u = _ip_data[ip].dNdx_u;
425 auto const& N_p = _ip_data[ip].N_p;
426 auto const& dNdx_p = _ip_data[ip].dNdx_p;
434 ShapeFunctionDisplacement::NPOINTS,
436 dNdx_u, N_u, x_coord, _is_axially_symmetric);
438 auto& eps = _ip_data[ip].eps;
439 auto& eps_m = _ip_data[ip].eps_m;
440 eps.noalias() = B * u;
442 auto& S_L = _ip_data[ip].saturation;
443 auto const S_L_prev = _ip_data[ip].saturation_prev;
448 double p_cap_prev_ip;
457 auto const temperature =
458 medium->property(MPL::PropertyType::reference_temperature)
459 .template value<double>(variables, x_position, t, dt);
463 medium->property(MPL::PropertyType::biot_coefficient)
464 .template value<double>(variables, x_position, t, dt);
465 auto const C_el = _ip_data[ip].computeElasticTangentStiffness(
466 t, x_position, dt, temperature);
470 _ip_data[ip].solid_material.getBulkModulus(t, x_position, &C_el);
474 liquid_phase.property(MPL::PropertyType::density)
475 .template value<double>(variables, x_position, t, dt);
478 auto const& b = _process_data.specific_body_force;
480 S_L = medium->property(MPL::PropertyType::saturation)
481 .template value<double>(variables, x_position, t, dt);
486 double const dS_L_dp_cap =
487 medium->property(MPL::PropertyType::saturation)
488 .template dValue<double>(variables,
489 MPL::Variable::capillary_pressure,
493 double const DeltaS_L_Deltap_cap =
494 (p_cap_ip == p_cap_prev_ip)
496 : (S_L - S_L_prev) / (p_cap_ip - p_cap_prev_ip);
498 auto const chi = [medium, x_position, t, dt](
double const S_L)
502 return medium->property(MPL::PropertyType::bishops_effective_stress)
503 .template value<double>(vs, x_position, t, dt);
505 double const chi_S_L = chi(S_L);
506 double const chi_S_L_prev = chi(S_L_prev);
508 double const p_FR = -chi_S_L * p_cap_ip;
516 auto& phi = _ip_data[ip].porosity;
518 variables_prev.
porosity = _ip_data[ip].porosity_prev;
519 phi = medium->property(MPL::PropertyType::porosity)
520 .template value<double>(variables, variables_prev,
528 "RichardsMechanics: Biot-coefficient {} is smaller than "
529 "porosity {} in element/integration point {}/{}.",
530 alpha, phi, _element.getID(), ip);
535 auto& sigma_sw = _ip_data[ip].sigma_sw;
536 auto const& sigma_sw_prev = _ip_data[ip].sigma_sw_prev;
540 sigma_sw = sigma_sw_prev;
541 if (solid_phase.hasProperty(
542 MPL::PropertyType::swelling_stress_rate))
544 auto const sigma_sw_dot =
545 MathLib::KelvinVector::tensorToKelvin<DisplacementDim>(
547 solid_phase[MPL::PropertyType::swelling_stress_rate]
548 .value(variables, variables_prev, x_position, t,
550 sigma_sw += sigma_sw_dot * dt;
555 identity2.transpose() * C_el.inverse() * sigma_sw;
557 identity2.transpose() * C_el.inverse() * sigma_sw_prev;
560 if (medium->hasProperty(MPL::PropertyType::transport_porosity))
563 _ip_data[ip].transport_porosity_prev;
565 _ip_data[ip].transport_porosity =
566 medium->property(MPL::PropertyType::transport_porosity)
567 .template value<double>(variables, variables_prev,
578 medium->property(MPL::PropertyType::relative_permeability)
579 .template value<double>(variables, x_position, t, dt);
581 liquid_phase.property(MPL::PropertyType::viscosity)
582 .template value<double>(variables, x_position, t, dt);
584 auto const& sigma_sw = _ip_data[ip].sigma_sw;
585 auto const& sigma_eff = _ip_data[ip].sigma_eff;
590 auto const sigma_total =
591 (sigma_eff - alpha * p_FR * identity2).eval();
600 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
602 auto const K_intrinsic = MPL::formEigenTensor<DisplacementDim>(
603 medium->property(MPL::PropertyType::permeability)
604 .value(variables, x_position, t, dt));
607 K_intrinsic * rho_LR * k_rel / mu;
613 solid_phase.hasProperty(MPL::PropertyType::swelling_stress_rate)
614 ? eps + C_el.inverse() * sigma_sw
620 _ip_data[ip].updateConstitutiveRelation(variables, t, x_position, dt,
625 p_FR - sigma_eff.dot(identity2) / (3 * (1 - phi));
627 solid_phase.property(MPL::PropertyType::density)
628 .template value<double>(variables, x_position, t, dt);
633 double const rho = rho_SR * (1 - phi) + S_L * phi * rho_LR;
634 rhs.template segment<displacement_size>(displacement_index).noalias() -=
635 (B.transpose() * sigma_eff - N_u_op(N_u).transpose() * rho * b) * w;
642 liquid_phase.property(MPL::PropertyType::density)
643 .template dValue<double>(variables,
644 MPL::Variable::liquid_phase_pressure,
647 double const a0 = S_L * (alpha - phi) * beta_SR;
649 double const specific_storage =
650 DeltaS_L_Deltap_cap * (p_cap_ip * a0 - phi) +
651 S_L * (phi * beta_LR + a0);
652 M.template block<pressure_size, pressure_size>(pressure_index,
654 .noalias() += N_p.transpose() * rho_LR * specific_storage * N_p * w;
656 K.template block<pressure_size, pressure_size>(pressure_index,
658 .noalias() += dNdx_p.transpose() * rho_K_over_mu * dNdx_p * w;
660 rhs.template segment<pressure_size>(pressure_index).noalias() +=
661 dNdx_p.transpose() * rho_LR * rho_K_over_mu * b * w;
666 K.template block<displacement_size, pressure_size>(displacement_index,
668 .noalias() -= B.transpose() * alpha * chi_S_L * identity2 * N_p * w;
673 M.template block<pressure_size, displacement_size>(pressure_index,
675 .noalias() += N_p.transpose() * S_L * rho_LR * alpha *
676 identity2.transpose() * B * w;
679 if (_process_data.apply_mass_lumping)
681 auto Mpp = M.template block<pressure_size, pressure_size>(
682 pressure_index, pressure_index);
683 Mpp = Mpp.colwise().sum().eval().asDiagonal();
690 ShapeFunctionPressure, DisplacementDim>::
691 assembleWithJacobian(
double const t,
double const dt,
692 std::vector<double>
const& local_x,
693 std::vector<double>
const& local_x_prev,
694 std::vector<double>& ,
695 std::vector<double>& ,
696 std::vector<double>& local_rhs_data,
697 std::vector<double>& local_Jac_data)
699 assert(local_x.size() == pressure_size + displacement_size);
702 Eigen::Map<
typename ShapeMatricesTypePressure::template VectorType<
703 pressure_size>
const>(local_x.data() + pressure_index,
707 Eigen::Map<
typename ShapeMatricesTypeDisplacement::template VectorType<
708 displacement_size>
const>(local_x.data() + displacement_index,
712 Eigen::Map<
typename ShapeMatricesTypePressure::template VectorType<
713 pressure_size>
const>(local_x_prev.data() + pressure_index,
716 Eigen::Map<
typename ShapeMatricesTypeDisplacement::template VectorType<
717 displacement_size>
const>(local_x_prev.data() + displacement_index,
721 typename ShapeMatricesTypeDisplacement::template MatrixType<
722 displacement_size + pressure_size,
723 displacement_size + pressure_size>>(
724 local_Jac_data, displacement_size + pressure_size,
725 displacement_size + pressure_size);
728 typename ShapeMatricesTypeDisplacement::template VectorType<
729 displacement_size + pressure_size>>(
730 local_rhs_data, displacement_size + pressure_size);
734 DisplacementDim)>::identity2;
737 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
741 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
745 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
749 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
752 typename ShapeMatricesTypeDisplacement::template MatrixType<
753 displacement_size, pressure_size>
754 Kup = ShapeMatricesTypeDisplacement::template MatrixType<
755 displacement_size, pressure_size>::Zero(displacement_size,
758 typename ShapeMatricesTypeDisplacement::template MatrixType<
759 pressure_size, displacement_size>
760 Kpu = ShapeMatricesTypeDisplacement::template MatrixType<
761 pressure_size, displacement_size>::Zero(pressure_size,
764 auto const& medium = _process_data.media_map.getMedium(_element.getID());
765 auto const& liquid_phase = medium->phase(
"AqueousLiquid");
766 auto const& solid_phase = medium->phase(
"Solid");
773 unsigned const n_integration_points =
774 _integration_method.getNumberOfPoints();
775 for (
unsigned ip = 0; ip < n_integration_points; ip++)
778 auto const& w = _ip_data[ip].integration_weight;
780 auto const& N_u = _ip_data[ip].N_u;
781 auto const& dNdx_u = _ip_data[ip].dNdx_u;
783 auto const& N_p = _ip_data[ip].N_p;
784 auto const& dNdx_p = _ip_data[ip].dNdx_p;
792 ShapeFunctionDisplacement::NPOINTS,
794 dNdx_u, N_u, x_coord, _is_axially_symmetric);
799 double p_cap_prev_ip;
808 auto const temperature =
809 medium->property(MPL::PropertyType::reference_temperature)
810 .template value<double>(variables, x_position, t, dt);
813 auto& eps = _ip_data[ip].eps;
814 auto& eps_m = _ip_data[ip].eps_m;
815 eps.noalias() = B * u;
816 auto const& sigma_eff = _ip_data[ip].sigma_eff;
817 auto& S_L = _ip_data[ip].saturation;
818 auto const S_L_prev = _ip_data[ip].saturation_prev;
820 medium->property(MPL::PropertyType::biot_coefficient)
821 .template value<double>(variables, x_position, t, dt);
823 auto const C_el = _ip_data[ip].computeElasticTangentStiffness(
824 t, x_position, dt, temperature);
828 _ip_data[ip].solid_material.getBulkModulus(t, x_position, &C_el);
832 liquid_phase.property(MPL::PropertyType::density)
833 .template value<double>(variables, x_position, t, dt);
836 auto const& b = _process_data.specific_body_force;
838 S_L = medium->property(MPL::PropertyType::saturation)
839 .template value<double>(variables, x_position, t, dt);
844 double const dS_L_dp_cap =
845 medium->property(MPL::PropertyType::saturation)
846 .template dValue<double>(variables,
847 MPL::Variable::capillary_pressure,
851 double const DeltaS_L_Deltap_cap =
852 (p_cap_ip == p_cap_prev_ip)
854 : (S_L - S_L_prev) / (p_cap_ip - p_cap_prev_ip);
856 auto const chi = [medium, x_position, t, dt](
double const S_L)
860 return medium->property(MPL::PropertyType::bishops_effective_stress)
861 .template value<double>(vs, x_position, t, dt);
863 double const chi_S_L = chi(S_L);
864 double const chi_S_L_prev = chi(S_L_prev);
866 double const p_FR = -chi_S_L * p_cap_ip;
874 auto& phi = _ip_data[ip].porosity;
877 variables_prev.
porosity = _ip_data[ip].porosity_prev;
878 phi = medium->property(MPL::PropertyType::porosity)
879 .template value<double>(variables, variables_prev,
887 "RichardsMechanics: Biot-coefficient {} is smaller than "
888 "porosity {} in element/integration point {}/{}.",
889 alpha, phi, _element.getID(), ip);
893 liquid_phase.property(MPL::PropertyType::viscosity)
894 .template value<double>(variables, x_position, t, dt);
897 updateSwellingStressAndVolumetricStrain<DisplacementDim>(
898 _ip_data[ip], *medium, solid_phase, C_el, rho_LR, mu,
899 _process_data.micro_porosity_parameters, alpha, phi, p_cap_ip,
900 variables, variables_prev, x_position, t, dt);
902 if (medium->hasProperty(MPL::PropertyType::transport_porosity))
904 if (!medium->hasProperty(MPL::PropertyType::saturation_micro))
907 _ip_data[ip].transport_porosity_prev;
909 _ip_data[ip].transport_porosity =
910 medium->property(MPL::PropertyType::transport_porosity)
911 .template value<double>(variables, variables_prev,
922 medium->property(MPL::PropertyType::relative_permeability)
923 .template value<double>(variables, x_position, t, dt);
928 auto const sigma_total =
929 (_ip_data[ip].sigma_eff + alpha * p_FR * identity2).eval();
937 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
939 auto const K_intrinsic = MPL::formEigenTensor<DisplacementDim>(
940 medium->property(MPL::PropertyType::permeability)
941 .value(variables, x_position, t, dt));
948 auto& sigma_sw = _ip_data[ip].sigma_sw;
951 solid_phase.hasProperty(MPL::PropertyType::swelling_stress_rate)
952 ? eps + C_el.inverse() * sigma_sw
958 auto C = _ip_data[ip].updateConstitutiveRelation(
959 variables, t, x_position, dt, temperature);
962 .template block<displacement_size, displacement_size>(
963 displacement_index, displacement_index)
964 .noalias() += B.transpose() * C * B * w;
968 p_FR - sigma_eff.dot(identity2) / (3 * (1 - phi));
970 solid_phase.property(MPL::PropertyType::density)
971 .template value<double>(variables, x_position, t, dt);
973 double const rho = rho_SR * (1 - phi) + S_L * phi * rho_LR;
974 local_rhs.template segment<displacement_size>(displacement_index)
976 (B.transpose() * sigma_eff - N_u_op(N_u).transpose() * rho * b) * w;
981 Kup.noalias() += B.transpose() * alpha * chi_S_L * identity2 * N_p * w;
983 auto const dchi_dS_L =
984 medium->property(MPL::PropertyType::bishops_effective_stress)
985 .template dValue<double>(variables,
986 MPL::Variable::liquid_saturation,
989 .template block<displacement_size, pressure_size>(
990 displacement_index, pressure_index)
991 .noalias() -= B.transpose() * alpha *
992 (chi_S_L + dchi_dS_L * p_cap_ip * dS_L_dp_cap) *
996 .template block<displacement_size, pressure_size>(
997 displacement_index, pressure_index)
999 N_u_op(N_u).transpose() * phi * rho_LR * dS_L_dp_cap * b * N_p * w;
1010 if (!medium->hasProperty(MPL::PropertyType::saturation_micro) &&
1011 solid_phase.hasProperty(MPL::PropertyType::swelling_stress_rate))
1013 using DimMatrix = Eigen::Matrix<double, 3, 3>;
1014 auto const dsigma_sw_dS_L =
1015 MathLib::KelvinVector::tensorToKelvin<DisplacementDim>(
1017 .property(MPL::PropertyType::swelling_stress_rate)
1018 .
template dValue<DimMatrix>(
1019 variables, variables_prev,
1020 MPL::Variable::liquid_saturation, x_position, t,
1023 .template block<displacement_size, pressure_size>(
1024 displacement_index, pressure_index)
1026 B.transpose() * dsigma_sw_dS_L * dS_L_dp_cap * N_p * w;
1031 if (_process_data.explicit_hm_coupling_in_unsaturated_zone)
1033 Kpu.noalias() += N_p.transpose() * chi_S_L_prev * rho_LR * alpha *
1034 identity2.transpose() * B * w;
1038 Kpu.noalias() += N_p.transpose() * S_L * rho_LR * alpha *
1039 identity2.transpose() * B * w;
1045 laplace_p.noalias() +=
1046 dNdx_p.transpose() * k_rel * rho_Ki_over_mu * dNdx_p * w;
1048 auto const beta_LR =
1050 liquid_phase.property(MPL::PropertyType::density)
1051 .template dValue<double>(variables,
1052 MPL::Variable::liquid_phase_pressure,
1055 double const a0 = (alpha - phi) * beta_SR;
1056 double const specific_storage_a_p = S_L * (phi * beta_LR + S_L * a0);
1057 double const specific_storage_a_S = phi - p_cap_ip * S_L * a0;
1059 double const dspecific_storage_a_p_dp_cap =
1060 dS_L_dp_cap * (phi * beta_LR + 2 * S_L * a0);
1061 double const dspecific_storage_a_S_dp_cap =
1062 -a0 * (S_L + p_cap_ip * dS_L_dp_cap);
1064 storage_p_a_p.noalias() +=
1065 N_p.transpose() * rho_LR * specific_storage_a_p * N_p * w;
1067 storage_p_a_S.noalias() -= N_p.transpose() * rho_LR *
1068 specific_storage_a_S * DeltaS_L_Deltap_cap *
1072 .template block<pressure_size, pressure_size>(pressure_index,
1074 .noalias() += N_p.transpose() * (p_cap_ip - p_cap_prev_ip) / dt *
1075 rho_LR * dspecific_storage_a_p_dp_cap * N_p * w;
1077 storage_p_a_S_Jpp.noalias() -=
1078 N_p.transpose() * rho_LR *
1079 ((S_L - S_L_prev) * dspecific_storage_a_S_dp_cap +
1080 specific_storage_a_S * dS_L_dp_cap) /
1083 if (!_process_data.explicit_hm_coupling_in_unsaturated_zone)
1086 .template block<pressure_size, pressure_size>(pressure_index,
1088 .noalias() -= N_p.transpose() * rho_LR * dS_L_dp_cap * alpha *
1089 identity2.transpose() * B * (u - u_prev) / dt *
1093 double const dk_rel_dS_l =
1094 medium->property(MPL::PropertyType::relative_permeability)
1095 .template dValue<double>(variables,
1096 MPL::Variable::liquid_saturation,
1099 grad_p_cap = -dNdx_p * p_L;
1101 .template block<pressure_size, pressure_size>(pressure_index,
1103 .noalias() += dNdx_p.transpose() * rho_Ki_over_mu * grad_p_cap *
1104 dk_rel_dS_l * dS_L_dp_cap * N_p * w;
1107 .template block<pressure_size, pressure_size>(pressure_index,
1109 .noalias() += dNdx_p.transpose() * rho_LR * rho_Ki_over_mu * b *
1110 dk_rel_dS_l * dS_L_dp_cap * N_p * w;
1112 local_rhs.template segment<pressure_size>(pressure_index).noalias() +=
1113 dNdx_p.transpose() * rho_LR * k_rel * rho_Ki_over_mu * b * w;
1115 if (medium->hasProperty(MPL::PropertyType::saturation_micro))
1117 double const alpha_bar = _process_data.micro_porosity_parameters
1118 ->mass_exchange_coefficient;
1119 auto const p_L_m = _ip_data[ip].liquid_pressure_m;
1120 local_rhs.template segment<pressure_size>(pressure_index)
1122 N_p.transpose() * alpha_bar / mu * (-p_cap_ip - p_L_m) * w;
1125 .template block<pressure_size, pressure_size>(pressure_index,
1127 .noalias() += N_p.transpose() * alpha_bar / mu * N_p * w;
1128 if (p_cap_ip != p_cap_prev_ip)
1130 double const p_L_m_prev = _ip_data[ip].liquid_pressure_m_prev;
1132 .template block<pressure_size, pressure_size>(
1133 pressure_index, pressure_index)
1134 .noalias() += N_p.transpose() * alpha_bar / mu *
1135 (p_L_m - p_L_m_prev) /
1136 (p_cap_ip - p_cap_prev_ip) * N_p * w;
1141 if (_process_data.apply_mass_lumping)
1143 storage_p_a_p = storage_p_a_p.colwise().sum().eval().asDiagonal();
1144 storage_p_a_S = storage_p_a_S.colwise().sum().eval().asDiagonal();
1146 storage_p_a_S_Jpp.colwise().sum().eval().asDiagonal();
1151 .template block<pressure_size, pressure_size>(pressure_index,
1153 .noalias() += laplace_p + storage_p_a_p / dt + storage_p_a_S_Jpp;
1157 .template block<pressure_size, displacement_size>(pressure_index,
1159 .noalias() = Kpu / dt;
1162 local_rhs.template segment<pressure_size>(pressure_index).noalias() -=
1164 (storage_p_a_p + storage_p_a_S) * (p_L - p_L_prev) / dt +
1165 Kpu * (u - u_prev) / dt;
1168 local_rhs.template segment<displacement_size>(displacement_index)
1169 .noalias() += Kup * p_L;
1522 ShapeFunctionPressure, DisplacementDim>::
1523 computeSecondaryVariableConcrete(
double const t,
double const dt,
1524 Eigen::VectorXd
const& local_x,
1525 Eigen::VectorXd
const& local_x_prev)
1527 auto p_L = local_x.template segment<pressure_size>(pressure_index);
1528 auto u = local_x.template segment<displacement_size>(displacement_index);
1531 local_x_prev.template segment<pressure_size>(pressure_index);
1533 local_x_prev.template segment<displacement_size>(displacement_index);
1537 DisplacementDim)>::identity2;
1539 auto const& medium = _process_data.media_map.getMedium(_element.getID());
1540 auto const& liquid_phase = medium->phase(
"AqueousLiquid");
1541 auto const& solid_phase = medium->phase(
"Solid");
1548 unsigned const n_integration_points =
1549 _integration_method.getNumberOfPoints();
1551 double saturation_avg = 0;
1552 double porosity_avg = 0;
1555 KV sigma_avg = KV::Zero();
1557 for (
unsigned ip = 0; ip < n_integration_points; ip++)
1560 auto const& N_p = _ip_data[ip].N_p;
1561 auto const& N_u = _ip_data[ip].N_u;
1562 auto const& dNdx_u = _ip_data[ip].dNdx_u;
1564 auto const x_coord =
1570 ShapeFunctionDisplacement::NPOINTS,
1572 dNdx_u, N_u, x_coord, _is_axially_symmetric);
1577 double p_cap_prev_ip;
1586 auto const temperature =
1587 medium->property(MPL::PropertyType::reference_temperature)
1588 .template value<double>(variables, x_position, t, dt);
1591 auto& eps = _ip_data[ip].eps;
1592 eps.noalias() = B * u;
1593 auto& eps_m = _ip_data[ip].eps_m;
1594 auto& S_L = _ip_data[ip].saturation;
1595 auto const S_L_prev = _ip_data[ip].saturation_prev;
1596 S_L = medium->property(MPL::PropertyType::saturation)
1597 .template value<double>(variables, x_position, t, dt);
1601 auto const chi = [medium, x_position, t, dt](
double const S_L)
1605 return medium->property(MPL::PropertyType::bishops_effective_stress)
1606 .template value<double>(vs, x_position, t, dt);
1608 double const chi_S_L = chi(S_L);
1609 double const chi_S_L_prev = chi(S_L_prev);
1612 medium->property(MPL::PropertyType::biot_coefficient)
1613 .template value<double>(variables, x_position, t, dt);
1615 auto const C_el = _ip_data[ip].computeElasticTangentStiffness(
1616 t, x_position, dt, temperature);
1618 auto const beta_SR =
1620 _ip_data[ip].solid_material.getBulkModulus(t, x_position, &C_el);
1630 auto& phi = _ip_data[ip].porosity;
1632 variables_prev.
porosity = _ip_data[ip].porosity_prev;
1633 phi = medium->property(MPL::PropertyType::porosity)
1634 .template value<double>(variables, variables_prev,
1640 liquid_phase.property(MPL::PropertyType::density)
1641 .template value<double>(variables, x_position, t, dt);
1644 liquid_phase.property(MPL::PropertyType::viscosity)
1645 .template value<double>(variables, x_position, t, dt);
1648 updateSwellingStressAndVolumetricStrain<DisplacementDim>(
1649 _ip_data[ip], *medium, solid_phase, C_el, rho_LR, mu,
1650 _process_data.micro_porosity_parameters, alpha, phi, p_cap_ip,
1651 variables, variables_prev, x_position, t, dt);
1653 if (medium->hasProperty(MPL::PropertyType::transport_porosity))
1655 if (!medium->hasProperty(MPL::PropertyType::saturation_micro))
1658 _ip_data[ip].transport_porosity_prev;
1660 _ip_data[ip].transport_porosity =
1661 medium->property(MPL::PropertyType::transport_porosity)
1662 .template value<double>(variables, variables_prev,
1675 auto const sigma_total = (_ip_data[ip].sigma_eff +
1676 alpha * chi_S_L * identity2 * p_cap_ip)
1685 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
1687 auto const K_intrinsic = MPL::formEigenTensor<DisplacementDim>(
1688 medium->property(MPL::PropertyType::permeability)
1689 .value(variables, x_position, t, dt));
1691 double const k_rel =
1692 medium->property(MPL::PropertyType::relative_permeability)
1693 .template value<double>(variables, x_position, t, dt);
1697 auto const& sigma_eff = _ip_data[ip].sigma_eff;
1698 double const p_FR = -chi_S_L * p_cap_ip;
1701 p_FR - sigma_eff.dot(identity2) / (3 * (1 - phi));
1703 solid_phase.property(MPL::PropertyType::density)
1704 .template value<double>(variables, x_position, t, dt);
1705 _ip_data[ip].dry_density_solid = (1 - phi) * rho_SR;
1707 auto& sigma_sw = _ip_data[ip].sigma_sw;
1710 solid_phase.hasProperty(MPL::PropertyType::swelling_stress_rate)
1711 ? eps + C_el.inverse() * sigma_sw
1717 _ip_data[ip].updateConstitutiveRelation(variables, t, x_position, dt,
1720 auto const& b = _process_data.specific_body_force;
1723 auto const& dNdx_p = _ip_data[ip].dNdx_p;
1724 _ip_data[ip].v_darcy.noalias() =
1725 -K_over_mu * dNdx_p * p_L + rho_LR * K_over_mu * b;
1727 saturation_avg += S_L;
1728 porosity_avg += phi;
1729 sigma_avg += sigma_eff;
1731 saturation_avg /= n_integration_points;
1732 porosity_avg /= n_integration_points;
1733 sigma_avg /= n_integration_points;
1735 (*_process_data.element_saturation)[_element.getID()] = saturation_avg;
1736 (*_process_data.element_porosity)[_element.getID()] = porosity_avg;
1738 Eigen::Map<KV>(&(*_process_data.element_stresses)[_element.getID() *
1739 KV::RowsAtCompileTime]) =
1743 ShapeFunctionPressure,
typename ShapeFunctionDisplacement::MeshElement,
1744 DisplacementDim>(_element, _is_axially_symmetric, p_L,
1745 *_process_data.pressure_interpolated);