88 updateConstitutiveVariables(
89 Eigen::VectorXd
const& local_x, Eigen::VectorXd
const& local_x_prev,
90 double const t,
double const dt,
94 [[maybe_unused]]
auto const matrix_size =
95 gas_pressure_size + capillary_pressure_size + temperature_size +
98 assert(local_x.size() == matrix_size);
100 auto const gas_pressure =
101 local_x.template segment<gas_pressure_size>(gas_pressure_index);
102 auto const gas_pressure_prev =
103 local_x_prev.template segment<gas_pressure_size>(gas_pressure_index);
104 auto const capillary_pressure =
105 local_x.template segment<capillary_pressure_size>(
106 capillary_pressure_index);
107 auto const capillary_pressure_prev =
108 local_x_prev.template segment<capillary_pressure_size>(
109 capillary_pressure_index);
111 auto const temperature =
112 local_x.template segment<temperature_size>(temperature_index);
113 auto const temperature_prev =
114 local_x_prev.template segment<temperature_size>(temperature_index);
116 auto const displacement =
117 local_x.template segment<displacement_size>(displacement_index);
118 auto const displacement_prev =
119 local_x_prev.template segment<displacement_size>(displacement_index);
122 *this->process_data_.media_map.getMedium(this->element_.getID());
125 unsigned const n_integration_points =
126 this->integration_method_.getNumberOfPoints();
128 std::vector<ConstitutiveRelations::ConstitutiveData<DisplacementDim>>
129 ip_constitutive_data(n_integration_points);
130 std::vector<ConstitutiveRelations::ConstitutiveTempData<DisplacementDim>>
131 ip_constitutive_variables(n_integration_points);
133 for (
unsigned ip = 0; ip < n_integration_points; ip++)
135 auto& ip_data = _ip_data[ip];
136 auto& ip_cv = ip_constitutive_variables[ip];
137 auto& ip_cd = ip_constitutive_data[ip];
138 auto& ip_out = this->output_data_[ip];
139 auto& current_state = this->current_states_[ip];
140 auto& prev_state = this->prev_states_[ip];
142 auto const& Np = ip_data.N_p;
144 auto const& Nu = ip_data.N_u;
145 auto const& gradNu = ip_data.dNdx_u;
146 auto const& gradNp = ip_data.dNdx_p;
148 std::nullopt, this->element_.getID(),
152 this->element_, Nu))};
158 double const T = NT.dot(temperature);
159 double const T_prev = NT.dot(temperature_prev);
160 double const pG = Np.dot(gas_pressure);
161 double const pG_prev = Np.dot(gas_pressure_prev);
162 double const pCap = Np.dot(capillary_pressure);
163 double const pCap_prev = Np.dot(capillary_pressure_prev);
169 this->process_data_.reference_temperature(t, pos)[0]};
171 grad_p_GR{gradNp * gas_pressure};
173 DisplacementDim>
const grad_p_cap{gradNp * capillary_pressure};
175 grad_T{gradNp * temperature};
181 models.
biot_model.
eval({pos, t, dt}, media_data, ip_cv.biot_data);
185 ShapeFunctionDisplacement::NPOINTS,
187 gradNu, Nu, x_coord, this->is_axially_symmetric_);
189 ip_out.eps_data.eps.noalias() = Bu * displacement;
191 current_state.S_L_data);
194 current_state.S_L_data,
195 current_state.chi_S_L);
198 prev_state.S_L_data, prev_state.chi_S_L);
202 ip_cv.C_el_data, ip_cv.beta_p_SR);
206 {pos, t, dt}, media_data, ip_cv.C_el_data, current_state.S_L_data,
207 prev_state.S_L_data, prev_state.swelling_data,
208 current_state.swelling_data, ip_cv.swelling_data);
212 ip_cv.s_therm_exp_data);
215 T_data, ip_cv.s_therm_exp_data, ip_out.eps_data,
216 Bu * displacement_prev, prev_state.mechanical_strain_data,
217 ip_cv.swelling_data, current_state.mechanical_strain_data);
220 {pos, t, dt}, T_data, current_state.mechanical_strain_data,
221 prev_state.mechanical_strain_data, prev_state.eff_stress_data,
222 current_state.eff_stress_data, this->material_states_[ip],
223 ip_cd.s_mech_data, ip_cv.equivalent_plastic_strain_data);
226 ip_cv.biot_data, current_state.chi_S_L,
228 ip_cv.total_stress_data);
231 pGR_data, pCap_data, T_data,
232 current_state.rho_W_LR);
235 {pos, t, dt}, media_data, pGR_data, pCap_data, T_data,
236 current_state.rho_W_LR, ip_out.fluid_enthalpy_data,
237 ip_out.mass_mole_fractions_data, ip_out.fluid_density_data,
238 ip_out.vapour_pressure_data, current_state.constituent_density_data,
239 ip_cv.phase_transition_data);
242 ip_out.mass_mole_fractions_data,
243 ip_cv.viscosity_data);
246 {pos, t, dt}, media_data, current_state.S_L_data,
247 prev_state.S_L_data, pCap_data, pGR_data, current_state.chi_S_L,
248 prev_state.chi_S_L, ip_cv.beta_p_SR, ip_out.eps_data,
249 Bu * displacement_prev, prev_state.porosity_data,
250 current_state.porosity_data);
252 if (medium.hasProperty(MPL::PropertyType::transport_porosity))
255 {pos, t, dt}, media_data, current_state.S_L_data,
256 prev_state.S_L_data, pCap_data, pGR_data, current_state.chi_S_L,
257 prev_state.chi_S_L, ip_cv.beta_p_SR,
258 current_state.mechanical_strain_data,
259 prev_state.mechanical_strain_data,
260 prev_state.transport_porosity_data, current_state.porosity_data,
261 current_state.transport_porosity_data);
265 current_state.transport_porosity_data.phi =
266 current_state.porosity_data.phi;
270 {pos, t, dt}, media_data, current_state.S_L_data, pCap_data, T_data,
271 current_state.transport_porosity_data, ip_cv.total_stress_data,
272 ip_out.eps_data, ip_cv.equivalent_plastic_strain_data,
273 ip_out.permeability_data);
276 {pos, t, dt}, media_data, T_data, current_state.eff_stress_data,
277 pCap_data, pGR_data, current_state.chi_S_L,
278 current_state.porosity_data, ip_out.solid_density_data);
281 ip_cv.solid_heat_capacity_data);
284 {pos, t, dt}, media_data, T_data, current_state.porosity_data,
285 current_state.S_L_data, ip_cv.thermal_conductivity_data);
288 ip_out.permeability_data,
289 current_state.rho_W_LR,
290 ip_cv.viscosity_data,
291 ip_cv.advection_data);
294 ip_out.fluid_density_data,
295 current_state.porosity_data,
296 current_state.S_L_data,
297 ip_out.solid_density_data,
299 this->process_data_.specific_body_force},
300 ip_cv.volumetric_body_force);
304 ip_out.mass_mole_fractions_data,
305 ip_cv.phase_transition_data,
306 current_state.porosity_data,
307 current_state.S_L_data,
309 ip_out.diffusion_velocity_data);
312 ip_out.solid_enthalpy_data);
315 ip_cv.phase_transition_data,
316 current_state.porosity_data,
317 current_state.S_L_data,
318 ip_out.solid_density_data,
319 ip_out.solid_enthalpy_data,
320 current_state.internal_energy_data);
323 ip_out.fluid_density_data,
324 ip_out.fluid_enthalpy_data,
325 current_state.porosity_data,
326 current_state.S_L_data,
327 ip_out.solid_density_data,
328 ip_out.solid_enthalpy_data,
329 ip_cv.effective_volumetric_enthalpy_data);
331 models.
fC_1_model.eval(ip_cv.advection_data, ip_out.fluid_density_data,
334 if (!this->process_data_.apply_mass_lumping)
338 current_state.constituent_density_data,
339 current_state.porosity_data,
340 current_state.S_L_data,
345 current_state.constituent_density_data,
346 prev_state.constituent_density_data,
347 current_state.S_L_data,
351 ip_out.fluid_density_data,
352 ip_cv.phase_transition_data,
353 current_state.porosity_data,
354 current_state.S_L_data,
358 ip_out.fluid_density_data,
359 ip_cv.phase_transition_data,
360 current_state.porosity_data,
361 current_state.S_L_data,
365 ip_cv.phase_transition_data,
366 current_state.porosity_data,
367 current_state.S_L_data,
371 current_state.constituent_density_data,
372 current_state.porosity_data,
373 current_state.S_L_data,
379 current_state.constituent_density_data,
380 current_state.porosity_data,
382 current_state.S_L_data,
387 current_state.constituent_density_data,
388 current_state.porosity_data,
389 current_state.S_L_data,
390 ip_cv.s_therm_exp_data,
394 current_state.constituent_density_data,
395 current_state.S_L_data,
398 models.
fW_1_model.eval(ip_cv.advection_data, ip_out.fluid_density_data,
401 if (!this->process_data_.apply_mass_lumping)
405 current_state.constituent_density_data,
406 current_state.porosity_data,
407 current_state.rho_W_LR,
408 current_state.S_L_data,
413 current_state.constituent_density_data,
414 prev_state.constituent_density_data,
416 current_state.rho_W_LR,
417 current_state.S_L_data,
421 ip_out.fluid_density_data,
422 ip_cv.phase_transition_data,
423 current_state.porosity_data,
424 current_state.S_L_data,
428 ip_out.fluid_density_data,
429 ip_cv.phase_transition_data,
430 current_state.porosity_data,
431 current_state.S_L_data,
435 ip_cv.phase_transition_data,
436 current_state.porosity_data,
437 current_state.S_L_data,
441 current_state.constituent_density_data,
442 current_state.porosity_data,
443 current_state.rho_W_LR,
444 current_state.S_L_data,
450 current_state.constituent_density_data,
451 current_state.porosity_data,
453 current_state.rho_W_LR,
454 current_state.S_L_data,
459 current_state.constituent_density_data,
460 current_state.porosity_data,
461 current_state.rho_W_LR,
462 current_state.S_L_data,
463 ip_cv.s_therm_exp_data,
467 current_state.constituent_density_data,
468 current_state.rho_W_LR,
469 current_state.S_L_data,
473 current_state.internal_energy_data,
474 prev_state.internal_energy_data,
483 ip_out.fluid_density_data,
485 ip_out.permeability_data,
487 this->process_data_.specific_body_force},
488 ip_cv.viscosity_data,
489 ip_out.darcy_velocity_data);
491 models.
fT_2_model.eval(ip_out.darcy_velocity_data,
492 ip_out.fluid_density_data,
493 ip_out.fluid_enthalpy_data,
497 current_state.constituent_density_data,
498 ip_out.darcy_velocity_data,
499 ip_out.diffusion_velocity_data,
500 ip_out.fluid_density_data,
501 ip_cv.phase_transition_data,
503 this->process_data_.specific_body_force},
510 return {ip_constitutive_data, ip_constitutive_variables};
518 updateConstitutiveVariablesDerivatives(
519 Eigen::VectorXd
const& local_x, Eigen::VectorXd
const& local_x_prev,
520 double const t,
double const dt,
523 ip_constitutive_data,
526 ip_constitutive_variables,
530 [[maybe_unused]]
auto const matrix_size =
531 gas_pressure_size + capillary_pressure_size + temperature_size +
534 assert(local_x.size() == matrix_size);
536 auto const gas_pressure =
537 local_x.template segment<gas_pressure_size>(gas_pressure_index);
538 auto const gas_pressure_prev =
539 local_x_prev.template segment<gas_pressure_size>(gas_pressure_index);
540 auto const temperature =
541 local_x.template segment<temperature_size>(temperature_index);
542 auto const temperature_prev =
543 local_x_prev.template segment<temperature_size>(temperature_index);
544 auto const displacement_prev =
545 local_x_prev.template segment<displacement_size>(displacement_index);
547 auto const capillary_pressure =
548 local_x.template segment<capillary_pressure_size>(
549 capillary_pressure_index);
550 auto const capillary_pressure_prev =
551 local_x_prev.template segment<capillary_pressure_size>(
552 capillary_pressure_index);
555 *this->process_data_.media_map.getMedium(this->element_.getID());
558 unsigned const n_integration_points =
559 this->integration_method_.getNumberOfPoints();
561 std::vector<ConstitutiveRelations::DerivativesData<DisplacementDim>>
562 ip_d_data(n_integration_points);
564 for (
unsigned ip = 0; ip < n_integration_points; ip++)
566 auto const& ip_data = _ip_data[ip];
567 auto& ip_dd = ip_d_data[ip];
568 auto const& ip_cd = ip_constitutive_data[ip];
569 auto const& ip_cv = ip_constitutive_variables[ip];
570 auto const& ip_out = this->output_data_[ip];
571 auto const& current_state = this->current_states_[ip];
572 auto const& prev_state = this->prev_states_[ip];
574 auto const& Nu = ip_data.N_u;
575 auto const& Np = ip_data.N_p;
577 auto const& gradNu = ip_data.dNdx_u;
584 std::nullopt, this->element_.getID(),
588 this->element_, Nu))};
590 double const T = NT.dot(temperature);
591 double const T_prev = NT.dot(temperature_prev);
592 double const pG = Np.dot(gas_pressure);
593 double const pG_prev = Np.dot(gas_pressure_prev);
594 double const pCap = Np.dot(capillary_pressure);
595 double const pCap_prev = Np.dot(capillary_pressure_prev);
603 ShapeFunctionDisplacement::NPOINTS,
605 gradNu, Nu, x_coord, this->is_axially_symmetric_);
611 ip_out.permeability_data,
612 ip_cv.viscosity_data,
614 ip_cv.phase_transition_data,
615 ip_dd.advection_d_data);
618 {pos, t, dt}, media_data, current_state.S_L_data,
619 prev_state.S_L_data, pCap_data, pGR_data, current_state.chi_S_L,
620 prev_state.chi_S_L, ip_cv.beta_p_SR, ip_out.eps_data,
621 Bu * displacement_prev, prev_state.porosity_data,
622 ip_dd.porosity_d_data);
625 {pos, t, dt}, media_data, T_data, current_state.porosity_data,
626 ip_dd.porosity_d_data, current_state.S_L_data,
627 ip_dd.thermal_conductivity_d_data);
630 {pos, t, dt}, media_data, T_data, current_state.eff_stress_data,
631 pCap_data, pGR_data, current_state.chi_S_L,
632 current_state.porosity_data, ip_dd.solid_density_d_data);
635 ip_out.fluid_density_data,
636 ip_cv.phase_transition_data,
637 current_state.porosity_data,
638 ip_dd.porosity_d_data,
639 current_state.S_L_data,
640 ip_out.solid_density_data,
641 ip_dd.solid_density_d_data,
642 ip_out.solid_enthalpy_data,
643 ip_cv.solid_heat_capacity_data,
644 ip_dd.effective_volumetric_internal_energy_d_data);
647 ip_out.fluid_density_data,
648 ip_out.fluid_enthalpy_data,
649 ip_cv.phase_transition_data,
650 current_state.porosity_data,
651 ip_dd.porosity_d_data,
652 current_state.S_L_data,
653 ip_out.solid_density_data,
654 ip_dd.solid_density_d_data,
655 ip_out.solid_enthalpy_data,
656 ip_cv.solid_heat_capacity_data,
657 ip_dd.effective_volumetric_enthalpy_d_data);
658 if (!this->process_data_.apply_mass_lumping)
662 current_state.constituent_density_data,
663 ip_cv.phase_transition_data,
664 current_state.porosity_data,
665 ip_dd.porosity_d_data,
666 current_state.S_L_data,
672 current_state.constituent_density_data,
673 prev_state.constituent_density_data,
674 ip_cv.phase_transition_data,
675 current_state.S_L_data,
680 ip_cv.viscosity_data,
681 ip_cv.phase_transition_data,
682 ip_dd.advection_d_data,
686 ip_out.permeability_data,
687 ip_cv.phase_transition_data,
689 ip_cv.viscosity_data,
693 current_state.constituent_density_data,
694 ip_cv.phase_transition_data,
695 current_state.porosity_data,
696 ip_dd.porosity_d_data,
697 current_state.S_L_data,
702 current_state.constituent_density_data,
703 ip_cv.phase_transition_data,
704 current_state.porosity_data,
705 ip_dd.porosity_d_data,
706 current_state.S_L_data,
707 ip_cv.s_therm_exp_data,
711 ip_cv.phase_transition_data,
712 current_state.S_L_data,
715 if (!this->process_data_.apply_mass_lumping)
719 current_state.constituent_density_data,
720 ip_cv.phase_transition_data,
721 current_state.porosity_data,
722 ip_dd.porosity_d_data,
723 current_state.rho_W_LR,
724 current_state.S_L_data,
731 current_state.constituent_density_data,
732 ip_cv.phase_transition_data,
733 prev_state.constituent_density_data,
735 current_state.rho_W_LR,
736 current_state.S_L_data,
741 ip_out.permeability_data,
742 ip_cv.phase_transition_data,
743 current_state.rho_W_LR,
745 ip_cv.viscosity_data,
749 ip_out.fluid_density_data,
750 ip_out.permeability_data,
751 ip_cv.phase_transition_data,
752 current_state.porosity_data,
753 current_state.rho_W_LR,
754 current_state.S_L_data,
756 ip_cv.viscosity_data,
760 dt, ip_dd.effective_volumetric_internal_energy_d_data, ip_dd.dfT_1);
763 ip_out.darcy_velocity_data,
764 ip_out.fluid_density_data,
765 ip_out.fluid_enthalpy_data,
766 ip_out.permeability_data,
767 ip_cv.phase_transition_data,
769 this->process_data_.specific_body_force},
770 ip_cv.viscosity_data,
773 models.
fu_1_KuT_model.dEval(ip_cd.s_mech_data, ip_cv.s_therm_exp_data,
777 current_state.chi_S_L,
983 DisplacementDim>::assemble(
double const t,
double const dt,
984 std::vector<double>
const& local_x,
985 std::vector<double>
const& local_x_prev,
986 std::vector<double>& local_M_data,
987 std::vector<double>& local_K_data,
988 std::vector<double>& local_rhs_data)
990 auto const matrix_size = gas_pressure_size + capillary_pressure_size +
991 temperature_size + displacement_size;
992 assert(local_x.size() == matrix_size);
994 auto const capillary_pressure =
995 Eigen::Map<VectorType<capillary_pressure_size>
const>(
996 local_x.data() + capillary_pressure_index, capillary_pressure_size);
998 auto const capillary_pressure_prev =
999 Eigen::Map<VectorType<capillary_pressure_size>
const>(
1000 local_x_prev.data() + capillary_pressure_index,
1001 capillary_pressure_size);
1006 local_M_data, matrix_size, matrix_size);
1011 local_K_data, matrix_size, matrix_size);
1015 local_rhs_data, matrix_size);
1021 auto MCpG = local_M.template block<C_size, gas_pressure_size>(
1022 C_index, gas_pressure_index);
1023 auto MCpC = local_M.template block<C_size, capillary_pressure_size>(
1024 C_index, capillary_pressure_index);
1025 auto MCT = local_M.template block<C_size, temperature_size>(
1026 C_index, temperature_index);
1027 auto MCu = local_M.template block<C_size, displacement_size>(
1028 C_index, displacement_index);
1031 auto LCpG = local_K.template block<C_size, gas_pressure_size>(
1032 C_index, gas_pressure_index);
1033 auto LCpC = local_K.template block<C_size, capillary_pressure_size>(
1034 C_index, capillary_pressure_index);
1035 auto LCT = local_K.template block<C_size, temperature_size>(
1036 C_index, temperature_index);
1039 auto MWpG = local_M.template block<W_size, gas_pressure_size>(
1040 W_index, gas_pressure_index);
1041 auto MWpC = local_M.template block<W_size, capillary_pressure_size>(
1042 W_index, capillary_pressure_index);
1043 auto MWT = local_M.template block<W_size, temperature_size>(
1044 W_index, temperature_index);
1045 auto MWu = local_M.template block<W_size, displacement_size>(
1046 W_index, displacement_index);
1049 auto LWpG = local_K.template block<W_size, gas_pressure_size>(
1050 W_index, gas_pressure_index);
1051 auto LWpC = local_K.template block<W_size, capillary_pressure_size>(
1052 W_index, capillary_pressure_index);
1053 auto LWT = local_K.template block<W_size, temperature_size>(
1054 W_index, temperature_index);
1057 auto MTu = local_M.template block<temperature_size, displacement_size>(
1058 temperature_index, displacement_index);
1061 auto KTT = local_K.template block<temperature_size, temperature_size>(
1062 temperature_index, temperature_index);
1065 auto KUpG = local_K.template block<displacement_size, gas_pressure_size>(
1066 displacement_index, gas_pressure_index);
1068 local_K.template block<displacement_size, capillary_pressure_size>(
1069 displacement_index, capillary_pressure_index);
1071 auto KUU = local_K.template block<displacement_size, displacement_size>(
1072 displacement_index, displacement_index);
1075 auto fC = local_f.template segment<C_size>(C_index);
1077 auto fW = local_f.template segment<W_size>(W_index);
1079 auto fT = local_f.template segment<temperature_size>(temperature_index);
1081 auto fU = local_f.template segment<displacement_size>(displacement_index);
1083 unsigned const n_integration_points =
1084 this->integration_method_.getNumberOfPoints();
1087 this->solid_material_, *this->process_data_.phase_transition_model_};
1089 auto const [ip_constitutive_data, ip_constitutive_variables] =
1090 updateConstitutiveVariables(
1091 Eigen::Map<Eigen::VectorXd const>(local_x.data(), local_x.size()),
1092 Eigen::Map<Eigen::VectorXd const>(local_x_prev.data(),
1093 local_x_prev.size()),
1096 for (
unsigned int_point = 0; int_point < n_integration_points; int_point++)
1098 auto& ip = _ip_data[int_point];
1099 auto& ip_cv = ip_constitutive_variables[int_point];
1100 auto& ip_cd = ip_constitutive_data[int_point];
1102 auto& current_state = this->current_states_[int_point];
1103 auto const& prev_state = this->prev_states_[int_point];
1105 auto const& Np = ip.N_p;
1106 auto const& NT = Np;
1107 auto const& Nu = ip.N_u;
1109 std::nullopt, this->element_.getID(),
1113 this->element_, Nu))};
1115 auto const& NpT = Np.transpose().eval();
1116 auto const& NTT = NT.transpose().eval();
1118 auto const& gradNp = ip.dNdx_p;
1119 auto const& gradNT = gradNp;
1120 auto const& gradNu = ip.dNdx_u;
1122 auto const& gradNpT = gradNp.transpose().eval();
1123 auto const& gradNTT = gradNT.transpose().eval();
1125 auto const& w = ip.integration_weight;
1127 auto const x_coord =
1130 this->element_, Nu);
1134 ShapeFunctionDisplacement::NPOINTS,
1136 gradNu, Nu, x_coord, this->is_axially_symmetric_);
1138 auto const NTN = (Np.transpose() * Np).eval();
1139 auto const BTI2N = (Bu.transpose() * Invariants::identity2 * Np).eval();
1141 double const pCap = Np.dot(capillary_pressure);
1142 double const pCap_prev = Np.dot(capillary_pressure_prev);
1144 auto const s_L = current_state.S_L_data.S_L;
1145 auto const s_L_dot = (s_L - prev_state.S_L_data->S_L) / dt;
1147 auto const& b = this->process_data_.specific_body_force;
1153 MCpG.noalias() += NTN * (ip_cv.fC_4_MCpG.m * w);
1154 MCpC.noalias() += NTN * (ip_cv.fC_4_MCpC.m * w);
1156 if (this->process_data_.apply_mass_lumping)
1158 if (pCap - pCap_prev != 0.)
1161 NTN * (ip_cv.fC_4_MCpC.ml / (pCap - pCap_prev) * w);
1165 MCT.noalias() += NTN * (ip_cv.fC_4_MCT.m * w);
1166 MCu.noalias() += BTI2N.transpose() * (ip_cv.fC_4_MCu.m * w);
1168 LCpG.noalias() += gradNpT * ip_cv.fC_4_LCpG.L * gradNp * w;
1170 LCpC.noalias() += gradNpT * ip_cv.fC_4_LCpC.L * gradNp * w;
1172 LCT.noalias() += gradNpT * ip_cv.fC_4_LCT.L * gradNp * w;
1174 fC.noalias() += gradNpT * ip_cv.fC_1.A * b * w;
1176 if (!this->process_data_.apply_mass_lumping)
1178 fC.noalias() -= NpT * (ip_cv.fC_2a.a * s_L_dot * w);
1182 NpT * (current_state.porosity_data.phi * ip_cv.fC_3a.a * w);
1188 MWpG.noalias() += NTN * (ip_cv.fW_4_MWpG.m * w);
1189 MWpC.noalias() += NTN * (ip_cv.fW_4_MWpC.m * w);
1191 if (this->process_data_.apply_mass_lumping)
1193 if (pCap - pCap_prev != 0.)
1196 NTN * (ip_cv.fW_4_MWpC.ml / (pCap - pCap_prev) * w);
1200 MWT.noalias() += NTN * (ip_cv.fW_4_MWT.m * w);
1202 MWu.noalias() += BTI2N.transpose() * (ip_cv.fW_4_MWu.m * w);
1204 LWpG.noalias() += gradNpT * ip_cv.fW_4_LWpG.L * gradNp * w;
1206 LWpC.noalias() += gradNpT * ip_cv.fW_4_LWpC.L * gradNp * w;
1208 LWT.noalias() += gradNpT * ip_cv.fW_4_LWT.L * gradNp * w;
1210 fW.noalias() += gradNpT * ip_cv.fW_1.A * b * w;
1212 if (!this->process_data_.apply_mass_lumping)
1214 fW.noalias() -= NpT * (ip_cv.fW_2.a * s_L_dot * w);
1218 NpT * (current_state.porosity_data.phi * ip_cv.fW_3a.a * w);
1226 (ip_cv.effective_volumetric_enthalpy_data.rho_h_eff * w);
1229 gradNTT * ip_cv.thermal_conductivity_data.lambda * gradNT * w;
1231 fT.noalias() -= NTT * (ip_cv.fT_1.m * w);
1233 fT.noalias() += gradNTT * ip_cv.fT_2.A * w;
1235 fT.noalias() += gradNTT * ip_cv.fT_3.gradN * w;
1237 fT.noalias() += NTT * (ip_cv.fT_3.N * w);
1243 KUpG.noalias() -= BTI2N * (ip_cv.biot_data() * w);
1245 KUpC.noalias() += BTI2N * (ip_cv.fu_2_KupC.m * w);
1248 Bu.transpose() * ip_cd.s_mech_data.stiffness_tensor * Bu * w;
1251 (Bu.transpose() * current_state.eff_stress_data.sigma_eff -
1252 N_u_op(Nu).transpose() * ip_cv.volumetric_body_force()) *
1255 if (this->process_data_.apply_mass_lumping)
1257 MCpG = MCpG.colwise().sum().eval().asDiagonal();
1258 MCpC = MCpC.colwise().sum().eval().asDiagonal();
1259 MWpG = MWpG.colwise().sum().eval().asDiagonal();
1260 MWpC = MWpC.colwise().sum().eval().asDiagonal();
1271 assembleWithJacobian(
double const t,
double const dt,
1272 std::vector<double>
const& local_x,
1273 std::vector<double>
const& local_x_prev,
1274 std::vector<double>& local_rhs_data,
1275 std::vector<double>& local_Jac_data)
1277 auto const matrix_size = gas_pressure_size + capillary_pressure_size +
1278 temperature_size + displacement_size;
1279 assert(local_x.size() == matrix_size);
1281 auto const temperature = Eigen::Map<VectorType<temperature_size>
const>(
1282 local_x.data() + temperature_index, temperature_size);
1284 auto const gas_pressure = Eigen::Map<VectorType<gas_pressure_size>
const>(
1285 local_x.data() + gas_pressure_index, gas_pressure_size);
1287 auto const capillary_pressure =
1288 Eigen::Map<VectorType<capillary_pressure_size>
const>(
1289 local_x.data() + capillary_pressure_index, capillary_pressure_size);
1291 auto const displacement = Eigen::Map<VectorType<displacement_size>
const>(
1292 local_x.data() + displacement_index, displacement_size);
1294 auto const gas_pressure_prev =
1295 Eigen::Map<VectorType<gas_pressure_size>
const>(
1296 local_x_prev.data() + gas_pressure_index, gas_pressure_size);
1298 auto const capillary_pressure_prev =
1299 Eigen::Map<VectorType<capillary_pressure_size>
const>(
1300 local_x_prev.data() + capillary_pressure_index,
1301 capillary_pressure_size);
1303 auto const temperature_prev =
1304 Eigen::Map<VectorType<temperature_size>
const>(
1305 local_x_prev.data() + temperature_index, temperature_size);
1307 auto const displacement_prev =
1308 Eigen::Map<VectorType<displacement_size>
const>(
1309 local_x_prev.data() + displacement_index, displacement_size);
1313 local_Jac_data, matrix_size, matrix_size);
1316 local_rhs_data, matrix_size);
1327 C_size, capillary_pressure_size);
1337 C_size, capillary_pressure_size);
1346 W_size, capillary_pressure_size);
1357 W_size, capillary_pressure_size);
1364 temperature_size, displacement_size);
1374 displacement_size, gas_pressure_size);
1377 displacement_size, capillary_pressure_size);
1380 auto fC = local_f.template segment<C_size>(C_index);
1382 auto fW = local_f.template segment<W_size>(W_index);
1384 auto fT = local_f.template segment<temperature_size>(temperature_index);
1386 auto fU = local_f.template segment<displacement_size>(displacement_index);
1388 unsigned const n_integration_points =
1389 this->integration_method_.getNumberOfPoints();
1392 this->solid_material_, *this->process_data_.phase_transition_model_};
1394 auto const [ip_constitutive_data, ip_constitutive_variables] =
1395 updateConstitutiveVariables(
1396 Eigen::Map<Eigen::VectorXd const>(local_x.data(), local_x.size()),
1397 Eigen::Map<Eigen::VectorXd const>(local_x_prev.data(),
1398 local_x_prev.size()),
1401 auto const ip_d_data = updateConstitutiveVariablesDerivatives(
1402 Eigen::Map<Eigen::VectorXd const>(local_x.data(), local_x.size()),
1403 Eigen::Map<Eigen::VectorXd const>(local_x_prev.data(),
1404 local_x_prev.size()),
1405 t, dt, ip_constitutive_data, ip_constitutive_variables, models);
1407 for (
unsigned int_point = 0; int_point < n_integration_points; int_point++)
1409 auto& ip = _ip_data[int_point];
1410 auto& ip_cd = ip_constitutive_data[int_point];
1411 auto& ip_dd = ip_d_data[int_point];
1412 auto& ip_cv = ip_constitutive_variables[int_point];
1413 auto& current_state = this->current_states_[int_point];
1414 auto& prev_state = this->prev_states_[int_point];
1416 auto const& Np = ip.N_p;
1417 auto const& NT = Np;
1418 auto const& Nu = ip.N_u;
1420 std::nullopt, this->element_.getID(),
1424 this->element_, Nu))};
1426 auto const& NpT = Np.transpose().eval();
1427 auto const& NTT = NT.transpose().eval();
1429 auto const& gradNp = ip.dNdx_p;
1430 auto const& gradNT = gradNp;
1431 auto const& gradNu = ip.dNdx_u;
1433 auto const& gradNpT = gradNp.transpose().eval();
1434 auto const& gradNTT = gradNT.transpose().eval();
1436 auto const& w = ip.integration_weight;
1438 auto const x_coord =
1441 this->element_, Nu);
1445 ShapeFunctionDisplacement::NPOINTS,
1447 gradNu, Nu, x_coord, this->is_axially_symmetric_);
1449 auto const NTN = (Np.transpose() * Np).eval();
1450 auto const BTI2N = (Bu.transpose() * Invariants::identity2 * Np).eval();
1452 double const div_u_dot =
1453 Invariants::trace(Bu * (displacement - displacement_prev) / dt);
1455 double const pGR = Np.dot(gas_pressure);
1456 double const pCap = Np.dot(capillary_pressure);
1457 double const T = NT.dot(temperature);
1463 double const pGR_prev = Np.dot(gas_pressure_prev);
1464 double const pCap_prev = Np.dot(capillary_pressure_prev);
1465 double const T_prev = NT.dot(temperature_prev);
1467 auto const& s_L = current_state.S_L_data.S_L;
1468 auto const s_L_dot = (s_L - prev_state.S_L_data->S_L) / dt;
1470 auto const& b = this->process_data_.specific_body_force;
1476 MCpG.noalias() += NTN * (ip_cv.fC_4_MCpG.m * w);
1477 MCpC.noalias() += NTN * (ip_cv.fC_4_MCpC.m * w);
1479 if (this->process_data_.apply_mass_lumping)
1481 if (pCap - pCap_prev != 0.)
1484 NTN * (ip_cv.fC_4_MCpC.ml / (pCap - pCap_prev) * w);
1488 MCT.noalias() += NTN * (ip_cv.fC_4_MCT.m * w);
1491 .template block<C_size, temperature_size>(C_index,
1493 .noalias() += NTN * (ip_dd.dfC_4_MCT.dT * (T - T_prev) / dt * w);
1495 MCu.noalias() += BTI2N.transpose() * (ip_cv.fC_4_MCu.m * w);
1498 .template block<C_size, temperature_size>(C_index,
1500 .noalias() += NTN * (ip_dd.dfC_4_MCu.dT * div_u_dot * w);
1502 LCpG.noalias() += gradNpT * ip_cv.fC_4_LCpG.L * gradNp * w;
1505 local_Jac.template block<C_size, C_size>(C_index, C_index).noalias() +=
1506 gradNpT * ip_dd.dfC_4_LCpG.dp_GR * gradpGR * Np * w;
1509 local_Jac.template block<C_size, W_size>(C_index, W_index).noalias() +=
1510 gradNpT * ip_dd.dfC_4_LCpG.dp_cap * gradpGR * Np * w;
1514 .template block<C_size, temperature_size>(C_index,
1516 .noalias() += gradNpT * ip_dd.dfC_4_LCpG.dT * gradpGR * NT * w;
1519 local_Jac.template block<C_size, C_size>(C_index, C_index).noalias() +=
1520 NTN * (ip_dd.dfC_4_MCpG.dp_GR * (pGR - pGR_prev) / dt * w);
1524 .template block<C_size, temperature_size>(C_index,
1527 NTN * (ip_dd.dfC_4_MCpG.dT * (pGR - pGR_prev) / dt * w);
1529 LCpC.noalias() -= gradNpT * ip_cv.fC_4_LCpC.L * gradNp * w;
1545 LCT.noalias() += gradNpT * ip_cv.fC_4_LCT.L * gradNp * w;
1548 fC.noalias() += gradNpT * ip_cv.fC_1.A * b * w;
1550 if (!this->process_data_.apply_mass_lumping)
1553 fC.noalias() -= NpT * (ip_cv.fC_2a.a * s_L_dot * w);
1555 local_Jac.template block<C_size, C_size>(C_index, C_index)
1557 NTN * ((ip_dd.dfC_2a.dp_GR * s_L_dot
1561 local_Jac.template block<C_size, W_size>(C_index, W_index)
1563 NTN * ((ip_dd.dfC_2a.dp_cap * s_L_dot +
1564 ip_cv.fC_2a.a * ip_dd.dS_L_dp_cap() / dt) *
1568 .template block<C_size, temperature_size>(C_index,
1570 .noalias() += NTN * (ip_dd.dfC_2a.dT * s_L_dot * w);
1575 NpT * (current_state.porosity_data.phi * ip_cv.fC_3a.a * w);
1577 local_Jac.template block<C_size, C_size>(C_index, C_index)
1578 .noalias() += NTN * (current_state.porosity_data.phi *
1579 ip_dd.dfC_3a.dp_GR * w);
1581 local_Jac.template block<C_size, W_size>(C_index, W_index)
1582 .noalias() += NTN * (current_state.porosity_data.phi *
1583 ip_dd.dfC_3a.dp_cap * w);
1586 .template block<C_size, temperature_size>(C_index,
1589 NTN * ((ip_dd.porosity_d_data.dphi_dT * ip_cv.fC_3a.a +
1590 current_state.porosity_data.phi * ip_dd.dfC_3a.dT) *
1597 MWpG.noalias() += NTN * (ip_cv.fW_4_MWpG.m * w);
1598 MWpC.noalias() += NTN * (ip_cv.fW_4_MWpC.m * w);
1600 if (this->process_data_.apply_mass_lumping)
1602 if (pCap - pCap_prev != 0.)
1605 NTN * (ip_cv.fW_4_MWpC.ml / (pCap - pCap_prev) * w);
1609 MWT.noalias() += NTN * (ip_cv.fW_4_MWT.m * w);
1611 MWu.noalias() += BTI2N.transpose() * (ip_cv.fW_4_MWu.m * w);
1613 LWpG.noalias() += gradNpT * ip_cv.fW_4_LWpG.L * gradNp * w;
1616 local_Jac.template block<W_size, C_size>(W_index, C_index).noalias() +=
1617 gradNpT * ip_dd.dfW_4_LWpG.dp_GR * gradpGR * Np * w;
1619 local_Jac.template block<W_size, W_size>(W_index, W_index).noalias() +=
1620 gradNpT * ip_dd.dfW_4_LWpG.dp_cap * gradpGR * Np * w;
1623 .template block<W_size, temperature_size>(W_index,
1625 .noalias() += gradNpT * ip_dd.dfW_4_LWpG.dT * gradpGR * NT * w;
1627 LWpC.noalias() += gradNpT * ip_cv.fW_4_LWpC.L * gradNp * w;
1630 local_Jac.template block<W_size, C_size>(W_index, C_index).noalias() -=
1631 gradNpT * ip_dd.dfW_4_LWpC.dp_GR * gradpCap * Np * w;
1633 local_Jac.template block<W_size, W_size>(W_index, W_index).noalias() -=
1634 gradNpT * ip_dd.dfW_4_LWpC.dp_cap * gradpCap * Np * w;
1637 .template block<W_size, temperature_size>(W_index,
1639 .noalias() -= gradNpT * ip_dd.dfW_4_LWpC.dT * gradpCap * NT * w;
1641 LWT.noalias() += gradNpT * ip_cv.fW_4_LWT.L * gradNp * w;
1644 fW.noalias() += gradNpT * ip_cv.fW_1.A * b * w;
1647 if (!this->process_data_.apply_mass_lumping)
1649 fW.noalias() -= NpT * (ip_cv.fW_2.a * s_L_dot * w);
1651 local_Jac.template block<W_size, C_size>(W_index, C_index)
1652 .noalias() += NTN * (ip_dd.dfW_2.dp_GR * s_L_dot * w);
1657 local_Jac.template block<W_size, W_size>(W_index, W_index)
1658 .noalias() += NTN * ((ip_dd.dfW_2.dp_cap * s_L_dot +
1659 ip_cv.fW_2.a * ip_dd.dS_L_dp_cap() / dt) *
1663 .template block<W_size, temperature_size>(W_index,
1665 .noalias() += NTN * (ip_dd.dfW_2.dT * s_L_dot * w);
1670 NpT * (current_state.porosity_data.phi * ip_cv.fW_3a.a * w);
1672 local_Jac.template block<W_size, C_size>(W_index, C_index).noalias() +=
1673 NTN * (current_state.porosity_data.phi * ip_dd.dfW_3a.dp_GR * w);
1675 local_Jac.template block<W_size, W_size>(W_index, W_index).noalias() +=
1676 NTN * (current_state.porosity_data.phi * ip_dd.dfW_3a.dp_cap * w);
1679 .template block<W_size, temperature_size>(W_index,
1682 NTN * ((ip_dd.porosity_d_data.dphi_dT * ip_cv.fW_3a.a +
1683 current_state.porosity_data.phi * ip_dd.dfW_3a.dT) *
1692 (ip_cv.effective_volumetric_enthalpy_data.rho_h_eff * w);
1697 .template block<temperature_size, C_size>(temperature_index,
1700 NTN * (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dp_GR *
1706 .template block<temperature_size, W_size>(temperature_index,
1710 (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dp_cap *
1716 .template block<temperature_size, temperature_size>(
1717 temperature_index, temperature_index)
1719 NTN * (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dT *
1723 gradNTT * ip_cv.thermal_conductivity_data.lambda * gradNT * w;
1741 .template block<temperature_size, W_size>(temperature_index,
1743 .noalias() += gradNTT *
1744 ip_dd.thermal_conductivity_d_data.dlambda_dp_cap *
1749 .template block<temperature_size, temperature_size>(
1750 temperature_index, temperature_index)
1751 .noalias() += gradNTT *
1752 ip_dd.thermal_conductivity_d_data.dlambda_dT * gradT *
1756 fT.noalias() -= NTT * (ip_cv.fT_1.m * w);
1760 .template block<temperature_size, C_size>(temperature_index,
1762 .noalias() += NTN * (ip_dd.dfT_1.dp_GR * w);
1766 .template block<temperature_size, W_size>(temperature_index,
1768 .noalias() += NTN * (ip_dd.dfT_1.dp_cap * w);
1773 .template block<temperature_size, temperature_size>(
1774 temperature_index, temperature_index)
1775 .noalias() += NTN * (ip_dd.dfT_1.dT * w);
1778 fT.noalias() += gradNTT * ip_cv.fT_2.A * w;
1782 .template block<temperature_size, C_size>(temperature_index,
1786 gradNTT * ip_dd.dfT_2.dp_GR_Npart * Np * w +
1788 gradNTT * ip_dd.dfT_2.dp_GR_gradNpart * gradNp * w;
1792 .template block<temperature_size, W_size>(temperature_index,
1796 gradNTT * (-ip_dd.dfT_2.dp_cap_Npart) * Np * w +
1798 gradNTT * (-ip_dd.dfT_2.dp_cap_gradNpart) * gradNp * w;
1802 .template block<temperature_size, temperature_size>(
1803 temperature_index, temperature_index)
1804 .noalias() -= gradNTT * ip_dd.dfT_2.dT * NT * w;
1807 fT.noalias() += NTT * (ip_cv.fT_3.N * w);
1809 fT.noalias() += gradNTT * ip_cv.fT_3.gradN * w;
1815 KUpG.noalias() -= BTI2N * (ip_cv.biot_data() * w);
1820 KUpC.noalias() += BTI2N * (ip_cv.fu_2_KupC.m * w);
1825 .template block<displacement_size, W_size>(displacement_index,
1827 .noalias() += BTI2N * (ip_dd.dfu_2_KupC.dp_cap * w);
1830 .template block<displacement_size, displacement_size>(
1831 displacement_index, displacement_index)
1833 Bu.transpose() * ip_cd.s_mech_data.stiffness_tensor * Bu * w;
1837 (Bu.transpose() * current_state.eff_stress_data.sigma_eff -
1838 N_u_op(Nu).transpose() * ip_cv.volumetric_body_force()) *
1843 .template block<displacement_size, temperature_size>(
1844 displacement_index, temperature_index)
1845 .noalias() -= Bu.transpose() * ip_dd.dfu_1_KuT.dT * NT * w;
1855 if (this->process_data_.apply_mass_lumping)
1857 MCpG = MCpG.colwise().sum().eval().asDiagonal();
1858 MCpC = MCpC.colwise().sum().eval().asDiagonal();
1859 MWpG = MWpG.colwise().sum().eval().asDiagonal();
1860 MWpC = MWpC.colwise().sum().eval().asDiagonal();
1866 fC.noalias() -= LCpG * gas_pressure + LCpC * capillary_pressure +
1868 MCpG * (gas_pressure - gas_pressure_prev) / dt +
1869 MCpC * (capillary_pressure - capillary_pressure_prev) / dt +
1870 MCT * (temperature - temperature_prev) / dt +
1871 MCu * (displacement - displacement_prev) / dt;
1873 local_Jac.template block<C_size, C_size>(C_index, C_index).noalias() +=
1875 local_Jac.template block<C_size, W_size>(C_index, W_index).noalias() +=
1878 .template block<C_size, temperature_size>(C_index, temperature_index)
1879 .noalias() += LCT + MCT / dt;
1881 .template block<C_size, displacement_size>(C_index, displacement_index)
1882 .noalias() += MCu / dt;
1886 fW.noalias() -= LWpG * gas_pressure + LWpC * capillary_pressure +
1888 MWpG * (gas_pressure - gas_pressure_prev) / dt +
1889 MWpC * (capillary_pressure - capillary_pressure_prev) / dt +
1890 MWT * (temperature - temperature_prev) / dt +
1891 MWu * (displacement - displacement_prev) / dt;
1893 local_Jac.template block<W_size, W_size>(W_index, W_index).noalias() +=
1895 local_Jac.template block<W_size, C_size>(W_index, C_index).noalias() +=
1898 .template block<W_size, temperature_size>(W_index, temperature_index)
1899 .noalias() += LWT + MWT / dt;
1901 .template block<W_size, displacement_size>(W_index, displacement_index)
1902 .noalias() += MWu / dt;
1907 KTT * temperature + MTu * (displacement - displacement_prev) / dt;
1910 .template block<temperature_size, temperature_size>(temperature_index,
1914 .template block<temperature_size, displacement_size>(temperature_index,
1916 .noalias() += MTu / dt;
1920 fU.noalias() -= KUpG * gas_pressure + KUpC * capillary_pressure;
1923 .template block<displacement_size, C_size>(displacement_index, C_index)
1926 .template block<displacement_size, W_size>(displacement_index, W_index)