82 updateConstitutiveVariables(
83 Eigen::VectorXd
const& local_x, Eigen::VectorXd
const& local_x_prev,
84 double const t,
double const dt,
88 [[maybe_unused]]
auto const matrix_size =
92 assert(local_x.size() == matrix_size);
94 auto const gas_pressure =
96 auto const gas_pressure_prev =
98 auto const capillary_pressure =
99 local_x.template segment<capillary_pressure_size>(
101 auto const capillary_pressure_prev =
102 local_x_prev.template segment<capillary_pressure_size>(
105 auto const temperature =
107 auto const temperature_prev =
110 auto const displacement =
112 auto const displacement_prev =
119 unsigned const n_integration_points =
122 std::vector<ConstitutiveRelations::ConstitutiveData<DisplacementDim>>
123 ip_constitutive_data(n_integration_points);
124 std::vector<ConstitutiveRelations::ConstitutiveTempData<DisplacementDim>>
125 ip_constitutive_variables(n_integration_points);
127 for (
unsigned ip = 0; ip < n_integration_points; ip++)
130 auto& ip_cv = ip_constitutive_variables[ip];
131 auto& ip_cd = ip_constitutive_data[ip];
136 auto const& Np = ip_data.N_p;
138 auto const& Nu = ip_data.N_u;
139 auto const& gradNu = ip_data.dNdx_u;
140 auto const& gradNp = ip_data.dNdx_p;
142 std::nullopt, this->
element_.getID(),
151 double const T = NT.dot(temperature);
152 double const T_prev = NT.dot(temperature_prev);
153 double const pG = Np.dot(gas_pressure);
154 double const pG_prev = Np.dot(gas_pressure_prev);
155 double const pCap = Np.dot(capillary_pressure);
156 double const pCap_prev = Np.dot(capillary_pressure_prev);
164 grad_p_GR{gradNp * gas_pressure};
166 DisplacementDim>
const grad_p_cap{gradNp * capillary_pressure};
168 grad_T{gradNp * temperature};
174 models.
biot_model.
eval({pos, t, dt}, media_data, ip_cv.biot_data);
178 ShapeFunctionDisplacement::NPOINTS,
182 ip_out.eps_data.eps.noalias() = Bu * displacement;
184 current_state.S_L_data);
187 current_state.S_L_data,
188 current_state.chi_S_L);
191 prev_state.S_L_data, prev_state.chi_S_L);
195 ip_cv.C_el_data, ip_cv.beta_p_SR);
199 {pos, t, dt}, media_data, ip_cv.C_el_data, current_state.S_L_data,
200 prev_state.S_L_data, prev_state.swelling_data,
201 current_state.swelling_data, ip_cv.swelling_data);
205 ip_cv.s_therm_exp_data);
208 T_data, ip_cv.s_therm_exp_data, ip_out.eps_data,
209 Bu * displacement_prev, prev_state.mechanical_strain_data,
210 ip_cv.swelling_data, current_state.mechanical_strain_data);
213 {pos, t, dt}, T_data, current_state.mechanical_strain_data,
214 prev_state.mechanical_strain_data, prev_state.eff_stress_data,
216 ip_cd.s_mech_data, ip_cv.equivalent_plastic_strain_data);
219 ip_cv.biot_data, current_state.chi_S_L,
221 ip_out.total_stress_data);
224 pGR_data, pCap_data, T_data,
225 current_state.rho_W_LR);
228 {pos, t, dt}, media_data, pGR_data, pCap_data, T_data,
229 current_state.rho_W_LR, ip_out.fluid_enthalpy_data,
230 ip_out.mass_mole_fractions_data, ip_out.fluid_density_data,
231 ip_out.vapour_pressure_data, current_state.constituent_density_data,
232 ip_cv.phase_transition_data);
235 ip_out.mass_mole_fractions_data,
236 ip_cv.viscosity_data);
239 {pos, t, dt}, media_data, current_state.S_L_data,
240 prev_state.S_L_data, pCap_data, pGR_data, current_state.chi_S_L,
241 prev_state.chi_S_L, ip_cv.beta_p_SR, ip_out.eps_data,
242 Bu * displacement_prev, prev_state.porosity_data,
243 current_state.porosity_data);
248 {pos, t, dt}, media_data, current_state.S_L_data,
249 prev_state.S_L_data, pCap_data, pGR_data, current_state.chi_S_L,
250 prev_state.chi_S_L, ip_cv.beta_p_SR,
251 current_state.mechanical_strain_data,
252 prev_state.mechanical_strain_data,
253 prev_state.transport_porosity_data, current_state.porosity_data,
254 current_state.transport_porosity_data);
258 current_state.transport_porosity_data.phi =
259 current_state.porosity_data.phi;
263 {pos, t, dt}, media_data, current_state.S_L_data, pGR_data,
264 pCap_data, T_data, current_state.transport_porosity_data,
265 ip_out.total_stress_data, current_state.mechanical_strain_data,
266 ip_out.eps_data, ip_cv.equivalent_plastic_strain_data,
267 ip_out.permeability_data);
270 {pos, t, dt}, media_data, T_data, current_state.eff_stress_data,
271 pCap_data, pGR_data, current_state.chi_S_L,
272 current_state.porosity_data, ip_out.solid_density_data);
275 ip_cv.solid_heat_capacity_data);
278 {pos, t, dt}, media_data, T_data, current_state.porosity_data,
279 current_state.S_L_data, ip_cv.thermal_conductivity_data);
282 ip_out.permeability_data,
283 current_state.rho_W_LR,
284 ip_cv.viscosity_data,
285 ip_cv.advection_data);
288 ip_out.fluid_density_data,
289 current_state.porosity_data,
290 current_state.S_L_data,
291 ip_out.solid_density_data,
293 this->process_data_.specific_body_force),
294 ip_cv.volumetric_body_force);
298 ip_out.mass_mole_fractions_data,
299 ip_cv.phase_transition_data,
300 current_state.porosity_data,
301 current_state.S_L_data,
303 ip_out.diffusion_velocity_data);
306 ip_out.solid_enthalpy_data);
309 ip_cv.phase_transition_data,
310 current_state.porosity_data,
311 current_state.S_L_data,
312 ip_out.solid_density_data,
313 ip_out.solid_enthalpy_data,
314 current_state.internal_energy_data);
317 ip_out.fluid_density_data,
318 ip_out.fluid_enthalpy_data,
319 current_state.porosity_data,
320 current_state.S_L_data,
321 ip_out.solid_density_data,
322 ip_out.solid_enthalpy_data,
323 ip_cv.effective_volumetric_enthalpy_data);
325 models.
fC_1_model.eval(ip_cv.advection_data, ip_out.fluid_density_data,
332 current_state.constituent_density_data,
333 current_state.porosity_data,
334 current_state.S_L_data,
339 current_state.constituent_density_data,
340 prev_state.constituent_density_data,
341 current_state.S_L_data,
345 ip_out.fluid_density_data,
346 ip_cv.phase_transition_data,
347 current_state.porosity_data,
348 current_state.S_L_data,
352 ip_out.fluid_density_data,
353 ip_cv.phase_transition_data,
354 current_state.porosity_data,
355 current_state.S_L_data,
359 ip_cv.phase_transition_data,
360 current_state.porosity_data,
361 current_state.S_L_data,
365 current_state.constituent_density_data,
366 current_state.porosity_data,
367 current_state.S_L_data,
373 current_state.constituent_density_data,
374 current_state.porosity_data,
376 current_state.S_L_data,
381 current_state.constituent_density_data,
382 current_state.porosity_data,
383 current_state.S_L_data,
384 ip_cv.s_therm_exp_data,
388 current_state.constituent_density_data,
389 current_state.S_L_data,
392 models.
fW_1_model.eval(ip_cv.advection_data, ip_out.fluid_density_data,
399 current_state.constituent_density_data,
400 current_state.porosity_data,
401 current_state.rho_W_LR,
402 current_state.S_L_data,
407 current_state.constituent_density_data,
408 prev_state.constituent_density_data,
410 current_state.rho_W_LR,
411 current_state.S_L_data,
415 ip_out.fluid_density_data,
416 ip_cv.phase_transition_data,
417 current_state.porosity_data,
418 current_state.S_L_data,
422 ip_out.fluid_density_data,
423 ip_cv.phase_transition_data,
424 current_state.porosity_data,
425 current_state.S_L_data,
429 ip_cv.phase_transition_data,
430 current_state.porosity_data,
431 current_state.S_L_data,
435 current_state.constituent_density_data,
436 current_state.porosity_data,
437 current_state.rho_W_LR,
438 current_state.S_L_data,
444 current_state.constituent_density_data,
445 current_state.porosity_data,
447 current_state.rho_W_LR,
448 current_state.S_L_data,
453 current_state.constituent_density_data,
454 current_state.porosity_data,
455 current_state.rho_W_LR,
456 current_state.S_L_data,
457 ip_cv.s_therm_exp_data,
461 current_state.constituent_density_data,
462 current_state.rho_W_LR,
463 current_state.S_L_data,
467 current_state.internal_energy_data,
468 prev_state.internal_energy_data,
477 ip_out.fluid_density_data,
479 ip_out.permeability_data,
481 this->process_data_.specific_body_force),
482 ip_cv.viscosity_data,
483 ip_out.darcy_velocity_data);
485 models.
fT_2_model.eval(ip_out.darcy_velocity_data,
486 ip_out.fluid_density_data,
487 ip_out.fluid_enthalpy_data,
491 current_state.constituent_density_data,
492 ip_out.darcy_velocity_data,
493 ip_out.diffusion_velocity_data,
494 ip_out.fluid_density_data,
495 ip_cv.phase_transition_data,
497 this->process_data_.specific_body_force),
504 return {ip_constitutive_data, ip_constitutive_variables};
512 updateConstitutiveVariablesDerivatives(
513 Eigen::VectorXd
const& local_x, Eigen::VectorXd
const& local_x_prev,
514 double const t,
double const dt,
517 ip_constitutive_data,
520 ip_constitutive_variables,
524 [[maybe_unused]]
auto const matrix_size =
528 assert(local_x.size() == matrix_size);
530 auto const gas_pressure =
532 auto const gas_pressure_prev =
534 auto const temperature =
536 auto const temperature_prev =
538 auto const displacement_prev =
541 auto const capillary_pressure =
542 local_x.template segment<capillary_pressure_size>(
544 auto const capillary_pressure_prev =
545 local_x_prev.template segment<capillary_pressure_size>(
552 unsigned const n_integration_points =
555 std::vector<ConstitutiveRelations::DerivativesData<DisplacementDim>>
556 ip_d_data(n_integration_points);
558 for (
unsigned ip = 0; ip < n_integration_points; ip++)
561 auto& ip_dd = ip_d_data[ip];
562 auto const& ip_cd = ip_constitutive_data[ip];
563 auto const& ip_cv = ip_constitutive_variables[ip];
568 auto const& Nu = ip_data.N_u;
569 auto const& Np = ip_data.N_p;
571 auto const& gradNu = ip_data.dNdx_u;
574 std::nullopt, this->
element_.getID(),
582 double const T = NT.dot(temperature);
583 double const T_prev = NT.dot(temperature_prev);
584 double const pG = Np.dot(gas_pressure);
585 double const pG_prev = Np.dot(gas_pressure_prev);
586 double const pCap = Np.dot(capillary_pressure);
587 double const pCap_prev = Np.dot(capillary_pressure_prev);
595 ShapeFunctionDisplacement::NPOINTS,
603 ip_out.permeability_data,
604 ip_cv.viscosity_data,
606 ip_cv.phase_transition_data,
607 ip_dd.advection_d_data);
610 {pos, t, dt}, media_data, current_state.S_L_data,
611 prev_state.S_L_data, pCap_data, pGR_data, current_state.chi_S_L,
612 prev_state.chi_S_L, ip_cv.beta_p_SR, ip_out.eps_data,
613 Bu * displacement_prev, prev_state.porosity_data,
614 ip_dd.porosity_d_data);
617 {pos, t, dt}, media_data, T_data, current_state.porosity_data,
618 ip_dd.porosity_d_data, current_state.S_L_data,
619 ip_dd.thermal_conductivity_d_data);
622 {pos, t, dt}, media_data, T_data, current_state.eff_stress_data,
623 pCap_data, pGR_data, current_state.chi_S_L,
624 current_state.porosity_data, ip_dd.solid_density_d_data);
627 ip_out.fluid_density_data,
628 ip_cv.phase_transition_data,
629 current_state.porosity_data,
630 ip_dd.porosity_d_data,
631 current_state.S_L_data,
632 ip_out.solid_density_data,
633 ip_dd.solid_density_d_data,
634 ip_out.solid_enthalpy_data,
635 ip_cv.solid_heat_capacity_data,
636 ip_dd.effective_volumetric_internal_energy_d_data);
639 ip_out.fluid_density_data,
640 ip_out.fluid_enthalpy_data,
641 ip_cv.phase_transition_data,
642 current_state.porosity_data,
643 ip_dd.porosity_d_data,
644 current_state.S_L_data,
645 ip_out.solid_density_data,
646 ip_dd.solid_density_d_data,
647 ip_out.solid_enthalpy_data,
648 ip_cv.solid_heat_capacity_data,
649 ip_dd.effective_volumetric_enthalpy_d_data);
654 current_state.constituent_density_data,
655 ip_cv.phase_transition_data,
656 current_state.porosity_data,
657 ip_dd.porosity_d_data,
658 current_state.S_L_data,
664 current_state.constituent_density_data,
665 prev_state.constituent_density_data,
666 ip_cv.phase_transition_data,
667 current_state.S_L_data,
672 ip_cv.viscosity_data,
673 ip_cv.phase_transition_data,
674 ip_dd.advection_d_data,
678 ip_out.permeability_data,
679 ip_cv.phase_transition_data,
681 ip_cv.viscosity_data,
685 current_state.constituent_density_data,
686 ip_cv.phase_transition_data,
687 current_state.porosity_data,
688 ip_dd.porosity_d_data,
689 current_state.S_L_data,
694 current_state.constituent_density_data,
695 ip_cv.phase_transition_data,
696 current_state.porosity_data,
697 ip_dd.porosity_d_data,
698 current_state.S_L_data,
699 ip_cv.s_therm_exp_data,
703 ip_cv.phase_transition_data,
704 current_state.S_L_data,
711 current_state.constituent_density_data,
712 ip_cv.phase_transition_data,
713 current_state.porosity_data,
714 ip_dd.porosity_d_data,
715 current_state.rho_W_LR,
716 current_state.S_L_data,
723 current_state.constituent_density_data,
724 ip_cv.phase_transition_data,
725 prev_state.constituent_density_data,
727 current_state.rho_W_LR,
728 current_state.S_L_data,
733 ip_out.permeability_data,
734 ip_cv.phase_transition_data,
735 current_state.rho_W_LR,
737 ip_cv.viscosity_data,
741 ip_out.fluid_density_data,
742 ip_out.permeability_data,
743 ip_cv.phase_transition_data,
744 current_state.porosity_data,
745 current_state.rho_W_LR,
746 current_state.S_L_data,
748 ip_cv.viscosity_data,
752 dt, ip_dd.effective_volumetric_internal_energy_d_data, ip_dd.dfT_1);
755 ip_out.darcy_velocity_data,
756 ip_out.fluid_density_data,
757 ip_out.fluid_enthalpy_data,
758 ip_out.permeability_data,
759 ip_cv.phase_transition_data,
761 this->process_data_.specific_body_force),
762 ip_cv.viscosity_data,
765 models.
fu_1_KuT_model.dEval(ip_cd.s_mech_data, ip_cv.s_therm_exp_data,
769 current_state.chi_S_L,
976 std::vector<double>
const& local_x,
977 std::vector<double>
const& local_x_prev,
978 std::vector<double>& local_M_data,
979 std::vector<double>& local_K_data,
980 std::vector<double>& local_rhs_data)
984 assert(local_x.size() == matrix_size);
986 auto const capillary_pressure =
987 Eigen::Map<VectorType<capillary_pressure_size>
const>(
990 auto const capillary_pressure_prev =
991 Eigen::Map<VectorType<capillary_pressure_size>
const>(
998 local_M_data, matrix_size, matrix_size);
1003 local_K_data, matrix_size, matrix_size);
1007 local_rhs_data, matrix_size);
1013 auto MCpG = local_M.template block<C_size, gas_pressure_size>(
1015 auto MCpC = local_M.template block<C_size, capillary_pressure_size>(
1017 auto MCT = local_M.template block<C_size, temperature_size>(
1019 auto MCu = local_M.template block<C_size, displacement_size>(
1023 auto LCpG = local_K.template block<C_size, gas_pressure_size>(
1025 auto LCpC = local_K.template block<C_size, capillary_pressure_size>(
1027 auto LCT = local_K.template block<C_size, temperature_size>(
1031 auto MWpG = local_M.template block<W_size, gas_pressure_size>(
1033 auto MWpC = local_M.template block<W_size, capillary_pressure_size>(
1035 auto MWT = local_M.template block<W_size, temperature_size>(
1037 auto MWu = local_M.template block<W_size, displacement_size>(
1041 auto LWpG = local_K.template block<W_size, gas_pressure_size>(
1043 auto LWpC = local_K.template block<W_size, capillary_pressure_size>(
1045 auto LWT = local_K.template block<W_size, temperature_size>(
1049 auto MTu = local_M.template block<temperature_size, displacement_size>(
1053 auto KTT = local_K.template block<temperature_size, temperature_size>(
1057 auto KUpG = local_K.template block<displacement_size, gas_pressure_size>(
1060 local_K.template block<displacement_size, capillary_pressure_size>(
1063 auto KUU = local_K.template block<displacement_size, displacement_size>(
1067 auto fC = local_f.template segment<C_size>(
C_index);
1069 auto fW = local_f.template segment<W_size>(
W_index);
1075 unsigned const n_integration_points =
1081 auto const [ip_constitutive_data, ip_constitutive_variables] =
1083 Eigen::Map<Eigen::VectorXd const>(local_x.data(), local_x.size()),
1084 Eigen::Map<Eigen::VectorXd const>(local_x_prev.data(),
1085 local_x_prev.size()),
1088 for (
unsigned int_point = 0; int_point < n_integration_points; int_point++)
1091 auto& ip_cv = ip_constitutive_variables[int_point];
1092 auto& ip_cd = ip_constitutive_data[int_point];
1095 auto const& prev_state = this->
prev_states_[int_point];
1097 auto const& Np = ip.N_p;
1098 auto const& Nu = ip.N_u;
1100 std::nullopt, this->
element_.getID(),
1106 auto const& NpT = Np.transpose().eval();
1107 auto const& NTT = NpT;
1109 auto const& gradNp = ip.dNdx_p;
1110 auto const& gradNT = gradNp;
1111 auto const& gradNu = ip.dNdx_u;
1113 auto const& gradNpT = gradNp.transpose().eval();
1114 auto const& gradNTT = gradNpT;
1116 auto const& w = ip.integration_weight;
1118 auto const x_coord =
1122 ShapeFunctionDisplacement::NPOINTS,
1126 auto const NTN = (Np.transpose() * Np).eval();
1129 double const pCap = Np.dot(capillary_pressure);
1130 double const pCap_prev = Np.dot(capillary_pressure_prev);
1132 auto const s_L = current_state.S_L_data.S_L;
1133 auto const s_L_dot = (s_L - prev_state.S_L_data->S_L) / dt;
1141 MCpG.noalias() += NTN * (ip_cv.fC_4_MCpG.m * w);
1142 MCpC.noalias() += NTN * (ip_cv.fC_4_MCpC.m * w);
1146 if (pCap - pCap_prev != 0.)
1149 NTN * (ip_cv.fC_4_MCpC.ml / (pCap - pCap_prev) * w);
1153 MCT.noalias() += NTN * (ip_cv.fC_4_MCT.m * w);
1154 MCu.noalias() += BTI2N.transpose() * (ip_cv.fC_4_MCu.m * w);
1156 LCpG.noalias() += gradNpT * ip_cv.fC_4_LCpG.L * gradNp * w;
1158 LCpC.noalias() += gradNpT * ip_cv.fC_4_LCpC.L * gradNp * w;
1160 LCT.noalias() += gradNpT * ip_cv.fC_4_LCT.L * gradNp * w;
1162 fC.noalias() += gradNpT * ip_cv.fC_1.A * b * w;
1166 fC.noalias() -= NpT * (ip_cv.fC_2a.a * s_L_dot * w);
1170 NpT * (current_state.porosity_data.phi * ip_cv.fC_3a.a * w);
1176 MWpG.noalias() += NTN * (ip_cv.fW_4_MWpG.m * w);
1177 MWpC.noalias() += NTN * (ip_cv.fW_4_MWpC.m * w);
1181 if (pCap - pCap_prev != 0.)
1184 NTN * (ip_cv.fW_4_MWpC.ml / (pCap - pCap_prev) * w);
1188 MWT.noalias() += NTN * (ip_cv.fW_4_MWT.m * w);
1190 MWu.noalias() += BTI2N.transpose() * (ip_cv.fW_4_MWu.m * w);
1192 LWpG.noalias() += gradNpT * ip_cv.fW_4_LWpG.L * gradNp * w;
1194 LWpC.noalias() += gradNpT * ip_cv.fW_4_LWpC.L * gradNp * w;
1196 LWT.noalias() += gradNpT * ip_cv.fW_4_LWT.L * gradNp * w;
1198 fW.noalias() += gradNpT * ip_cv.fW_1.A * b * w;
1202 fW.noalias() -= NpT * (ip_cv.fW_2.a * s_L_dot * w);
1206 NpT * (current_state.porosity_data.phi * ip_cv.fW_3a.a * w);
1214 (ip_cv.effective_volumetric_enthalpy_data.rho_h_eff * w);
1217 gradNTT * ip_cv.thermal_conductivity_data.lambda * gradNT * w;
1219 fT.noalias() -= NTT * (ip_cv.fT_1.m * w);
1221 fT.noalias() += gradNTT * ip_cv.fT_2.A * w;
1223 fT.noalias() += gradNTT * ip_cv.fT_3.gradN * w;
1225 fT.noalias() += NTT * (ip_cv.fT_3.N * w);
1231 KUpG.noalias() -= BTI2N * (ip_cv.biot_data() * w);
1233 KUpC.noalias() += BTI2N * (ip_cv.fu_2_KupC.m * w);
1236 (Bu.transpose() * ip_cd.s_mech_data.stiffness_tensor).eval();
1237 KUU.noalias() += BuTC * Bu * w;
1240 (Bu.transpose() * current_state.eff_stress_data.sigma_eff -
1241 N_u_op(Nu).transpose() * ip_cv.volumetric_body_force()) *
1246 MCpG = MCpG.colwise().sum().eval().asDiagonal();
1247 MCpC = MCpC.colwise().sum().eval().asDiagonal();
1248 MWpG = MWpG.colwise().sum().eval().asDiagonal();
1249 MWpC = MWpC.colwise().sum().eval().asDiagonal();
1260 assembleWithJacobian(
double const t,
double const dt,
1261 std::vector<double>
const& local_x,
1262 std::vector<double>
const& local_x_prev,
1263 std::vector<double>& local_rhs_data,
1264 std::vector<double>& local_Jac_data)
1268 assert(local_x.size() == matrix_size);
1270 auto const temperature = Eigen::Map<VectorType<temperature_size>
const>(
1273 auto const gas_pressure = Eigen::Map<VectorType<gas_pressure_size>
const>(
1276 auto const capillary_pressure =
1277 Eigen::Map<VectorType<capillary_pressure_size>
const>(
1280 auto const displacement = Eigen::Map<VectorType<displacement_size>
const>(
1283 auto const gas_pressure_prev =
1284 Eigen::Map<VectorType<gas_pressure_size>
const>(
1287 auto const capillary_pressure_prev =
1288 Eigen::Map<VectorType<capillary_pressure_size>
const>(
1292 auto const temperature_prev =
1293 Eigen::Map<VectorType<temperature_size>
const>(
1296 auto const displacement_prev =
1297 Eigen::Map<VectorType<displacement_size>
const>(
1302 local_Jac_data, matrix_size, matrix_size);
1305 local_rhs_data, matrix_size);
1369 auto fC = local_f.template segment<C_size>(
C_index);
1371 auto fW = local_f.template segment<W_size>(
W_index);
1377 unsigned const n_integration_points =
1383 auto const [ip_constitutive_data, ip_constitutive_variables] =
1385 Eigen::Map<Eigen::VectorXd const>(local_x.data(), local_x.size()),
1386 Eigen::Map<Eigen::VectorXd const>(local_x_prev.data(),
1387 local_x_prev.size()),
1391 Eigen::Map<Eigen::VectorXd const>(local_x.data(), local_x.size()),
1392 Eigen::Map<Eigen::VectorXd const>(local_x_prev.data(),
1393 local_x_prev.size()),
1394 t, dt, ip_constitutive_data, ip_constitutive_variables, models);
1396 for (
unsigned int_point = 0; int_point < n_integration_points; int_point++)
1399 auto& ip_cd = ip_constitutive_data[int_point];
1400 auto& ip_dd = ip_d_data[int_point];
1401 auto& ip_cv = ip_constitutive_variables[int_point];
1405 auto const& Np = ip.N_p;
1406 auto const& NT = Np;
1407 auto const& Nu = ip.N_u;
1409 std::nullopt, this->
element_.getID(),
1415 auto const& NpT = Np.transpose().eval();
1416 auto const& NTT = NpT;
1418 auto const& gradNp = ip.dNdx_p;
1419 auto const& gradNT = gradNp;
1420 auto const& gradNu = ip.dNdx_u;
1422 auto const& gradNpT = gradNp.transpose().eval();
1423 auto const& gradNTT = gradNpT;
1425 auto const& w = ip.integration_weight;
1427 auto const x_coord =
1431 ShapeFunctionDisplacement::NPOINTS,
1435 auto const NTN = (Np.transpose() * Np).eval();
1438 double const div_u_dot =
1441 double const pGR = Np.dot(gas_pressure);
1442 double const pCap = Np.dot(capillary_pressure);
1443 double const T = NT.dot(temperature);
1449 double const pGR_prev = Np.dot(gas_pressure_prev);
1450 double const pCap_prev = Np.dot(capillary_pressure_prev);
1451 double const T_prev = NT.dot(temperature_prev);
1453 auto const& s_L = current_state.S_L_data.S_L;
1454 auto const s_L_dot = (s_L - prev_state.S_L_data->S_L) / dt;
1462 MCpG.noalias() += NTN * (ip_cv.fC_4_MCpG.m * w);
1463 MCpC.noalias() += NTN * (ip_cv.fC_4_MCpC.m * w);
1467 if (pCap - pCap_prev != 0.)
1470 NTN * (ip_cv.fC_4_MCpC.ml / (pCap - pCap_prev) * w);
1474 MCT.noalias() += NTN * (ip_cv.fC_4_MCT.m * w);
1477 .template block<C_size, temperature_size>(
C_index,
1479 .noalias() += NTN * (ip_dd.dfC_4_MCT.dT * (T - T_prev) / dt * w);
1481 MCu.noalias() += BTI2N.transpose() * (ip_cv.fC_4_MCu.m * w);
1484 .template block<C_size, temperature_size>(
C_index,
1486 .noalias() += NTN * (ip_dd.dfC_4_MCu.dT * div_u_dot * w);
1488 LCpG.noalias() += gradNpT * ip_cv.fC_4_LCpG.L * gradNp * w;
1491 local_Jac.template block<C_size, C_size>(
C_index,
C_index).noalias() +=
1492 gradNpT * ip_dd.dfC_4_LCpG.dp_GR * gradpGR * Np * w;
1495 local_Jac.template block<C_size, W_size>(
C_index,
W_index).noalias() +=
1496 gradNpT * ip_dd.dfC_4_LCpG.dp_cap * gradpGR * Np * w;
1500 .template block<C_size, temperature_size>(
C_index,
1502 .noalias() += gradNpT * ip_dd.dfC_4_LCpG.dT * gradpGR * NT * w;
1505 local_Jac.template block<C_size, C_size>(
C_index,
C_index).noalias() +=
1506 NTN * (ip_dd.dfC_4_MCpG.dp_GR * (pGR - pGR_prev) / dt * w);
1510 .template block<C_size, temperature_size>(
C_index,
1513 NTN * (ip_dd.dfC_4_MCpG.dT * (pGR - pGR_prev) / dt * w);
1515 LCpC.noalias() -= gradNpT * ip_cv.fC_4_LCpC.L * gradNp * w;
1531 LCT.noalias() += gradNpT * ip_cv.fC_4_LCT.L * gradNp * w;
1534 fC.noalias() += gradNpT * ip_cv.fC_1.A * b * w;
1539 fC.noalias() -= NpT * (ip_cv.fC_2a.a * s_L_dot * w);
1543 NTN * ((ip_dd.dfC_2a.dp_GR * s_L_dot
1549 NTN * ((ip_dd.dfC_2a.dp_cap * s_L_dot +
1550 ip_cv.fC_2a.a * ip_dd.dS_L_dp_cap() / dt) *
1554 .template block<C_size, temperature_size>(
C_index,
1556 .noalias() += NTN * (ip_dd.dfC_2a.dT * s_L_dot * w);
1561 NpT * (current_state.porosity_data.phi * ip_cv.fC_3a.a * w);
1564 .noalias() += NTN * (current_state.porosity_data.phi *
1565 ip_dd.dfC_3a.dp_GR * w);
1568 .noalias() += NTN * (current_state.porosity_data.phi *
1569 ip_dd.dfC_3a.dp_cap * w);
1572 .template block<C_size, temperature_size>(
C_index,
1575 NTN * ((ip_dd.porosity_d_data.dphi_dT * ip_cv.fC_3a.a +
1576 current_state.porosity_data.phi * ip_dd.dfC_3a.dT) *
1583 MWpG.noalias() += NTN * (ip_cv.fW_4_MWpG.m * w);
1584 MWpC.noalias() += NTN * (ip_cv.fW_4_MWpC.m * w);
1588 if (pCap - pCap_prev != 0.)
1591 NTN * (ip_cv.fW_4_MWpC.ml / (pCap - pCap_prev) * w);
1595 MWT.noalias() += NTN * (ip_cv.fW_4_MWT.m * w);
1597 MWu.noalias() += BTI2N.transpose() * (ip_cv.fW_4_MWu.m * w);
1599 LWpG.noalias() += gradNpT * ip_cv.fW_4_LWpG.L * gradNp * w;
1602 local_Jac.template block<W_size, C_size>(
W_index,
C_index).noalias() +=
1603 gradNpT * ip_dd.dfW_4_LWpG.dp_GR * gradpGR * Np * w;
1605 local_Jac.template block<W_size, W_size>(
W_index,
W_index).noalias() +=
1606 gradNpT * ip_dd.dfW_4_LWpG.dp_cap * gradpGR * Np * w;
1609 .template block<W_size, temperature_size>(
W_index,
1611 .noalias() += gradNpT * ip_dd.dfW_4_LWpG.dT * gradpGR * NT * w;
1613 LWpC.noalias() += gradNpT * ip_cv.fW_4_LWpC.L * gradNp * w;
1616 local_Jac.template block<W_size, C_size>(
W_index,
C_index).noalias() -=
1617 gradNpT * ip_dd.dfW_4_LWpC.dp_GR * gradpCap * Np * w;
1619 local_Jac.template block<W_size, W_size>(
W_index,
W_index).noalias() -=
1620 gradNpT * ip_dd.dfW_4_LWpC.dp_cap * gradpCap * Np * w;
1623 .template block<W_size, temperature_size>(
W_index,
1625 .noalias() -= gradNpT * ip_dd.dfW_4_LWpC.dT * gradpCap * NT * w;
1627 LWT.noalias() += gradNpT * ip_cv.fW_4_LWT.L * gradNp * w;
1630 fW.noalias() += gradNpT * ip_cv.fW_1.A * b * w;
1635 fW.noalias() -= NpT * (ip_cv.fW_2.a * s_L_dot * w);
1638 .noalias() += NTN * (ip_dd.dfW_2.dp_GR * s_L_dot * w);
1644 .noalias() += NTN * ((ip_dd.dfW_2.dp_cap * s_L_dot +
1645 ip_cv.fW_2.a * ip_dd.dS_L_dp_cap() / dt) *
1649 .template block<W_size, temperature_size>(
W_index,
1651 .noalias() += NTN * (ip_dd.dfW_2.dT * s_L_dot * w);
1656 NpT * (current_state.porosity_data.phi * ip_cv.fW_3a.a * w);
1658 local_Jac.template block<W_size, C_size>(
W_index,
C_index).noalias() +=
1659 NTN * (current_state.porosity_data.phi * ip_dd.dfW_3a.dp_GR * w);
1661 local_Jac.template block<W_size, W_size>(
W_index,
W_index).noalias() +=
1662 NTN * (current_state.porosity_data.phi * ip_dd.dfW_3a.dp_cap * w);
1665 .template block<W_size, temperature_size>(
W_index,
1668 NTN * ((ip_dd.porosity_d_data.dphi_dT * ip_cv.fW_3a.a +
1669 current_state.porosity_data.phi * ip_dd.dfW_3a.dT) *
1678 (ip_cv.effective_volumetric_enthalpy_data.rho_h_eff * w);
1686 NTN * (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dp_GR *
1696 (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dp_cap *
1702 .template block<temperature_size, temperature_size>(
1705 NTN * (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dT *
1709 gradNTT * ip_cv.thermal_conductivity_data.lambda * gradNT * w;
1729 .noalias() += gradNTT *
1730 ip_dd.thermal_conductivity_d_data.dlambda_dp_cap *
1735 .template block<temperature_size, temperature_size>(
1737 .noalias() += gradNTT *
1738 ip_dd.thermal_conductivity_d_data.dlambda_dT * gradT *
1742 fT.noalias() -= NTT * (ip_cv.fT_1.m * w);
1748 .noalias() += NTN * (ip_dd.dfT_1.dp_GR * w);
1754 .noalias() += NTN * (ip_dd.dfT_1.dp_cap * w);
1759 .template block<temperature_size, temperature_size>(
1761 .noalias() += NTN * (ip_dd.dfT_1.dT * w);
1764 fT.noalias() += gradNTT * ip_cv.fT_2.A * w;
1772 gradNTT * ip_dd.dfT_2.dp_GR_Npart * Np * w +
1774 gradNTT * ip_dd.dfT_2.dp_GR_gradNpart * gradNp * w;
1782 gradNTT * (-ip_dd.dfT_2.dp_cap_Npart) * Np * w +
1784 gradNTT * (-ip_dd.dfT_2.dp_cap_gradNpart) * gradNp * w;
1788 .template block<temperature_size, temperature_size>(
1790 .noalias() -= gradNTT * ip_dd.dfT_2.dT * NT * w;
1793 fT.noalias() += NTT * (ip_cv.fT_3.N * w);
1795 fT.noalias() += gradNTT * ip_cv.fT_3.gradN * w;
1801 KUpG.noalias() -= BTI2N * (ip_cv.biot_data() * w);
1806 KUpC.noalias() += BTI2N * (ip_cv.fu_2_KupC.m * w);
1813 .noalias() += BTI2N * (ip_dd.dfu_2_KupC.dp_cap * w);
1816 (Bu.transpose() * ip_cd.s_mech_data.stiffness_tensor).eval();
1818 .template block<displacement_size, displacement_size>(
1820 .noalias() += BuTC * Bu * w;
1824 (Bu.transpose() * current_state.eff_stress_data.sigma_eff -
1825 N_u_op(Nu).transpose() * ip_cv.volumetric_body_force()) *
1830 .template block<displacement_size, temperature_size>(
1832 .noalias() -= Bu.transpose() * ip_dd.dfu_1_KuT.dT * NT * w;
1844 MCpG = MCpG.colwise().sum().eval().asDiagonal();
1845 MCpC = MCpC.colwise().sum().eval().asDiagonal();
1846 MWpG = MWpG.colwise().sum().eval().asDiagonal();
1847 MWpC = MWpC.colwise().sum().eval().asDiagonal();
1853 fC.noalias() -= LCpG * gas_pressure + LCpC * capillary_pressure +
1855 MCpG * (gas_pressure - gas_pressure_prev) / dt +
1856 MCpC * (capillary_pressure - capillary_pressure_prev) / dt +
1857 MCT * (temperature - temperature_prev) / dt +
1858 MCu * (displacement - displacement_prev) / dt;
1860 local_Jac.template block<C_size, C_size>(
C_index,
C_index).noalias() +=
1862 local_Jac.template block<C_size, W_size>(
C_index,
W_index).noalias() +=
1866 .noalias() += LCT + MCT / dt;
1869 .noalias() += MCu / dt;
1873 fW.noalias() -= LWpG * gas_pressure + LWpC * capillary_pressure +
1875 MWpG * (gas_pressure - gas_pressure_prev) / dt +
1876 MWpC * (capillary_pressure - capillary_pressure_prev) / dt +
1877 MWT * (temperature - temperature_prev) / dt +
1878 MWu * (displacement - displacement_prev) / dt;
1880 local_Jac.template block<W_size, W_size>(
W_index,
W_index).noalias() +=
1882 local_Jac.template block<W_size, C_size>(
W_index,
C_index).noalias() +=
1886 .noalias() += LWT + MWT / dt;
1889 .noalias() += MWu / dt;
1894 KTT * temperature + MTu * (displacement - displacement_prev) / dt;
1903 .noalias() += MTu / dt;
1907 fU.noalias() -= KUpG * gas_pressure + KUpC * capillary_pressure;