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);
162 grad_p_GR{gradNp * gas_pressure};
164 DisplacementDim>
const grad_p_cap{gradNp * capillary_pressure};
166 grad_T{gradNp * temperature};
172 models.
biot_model.
eval({pos, t, dt}, media_data, ip_cv.biot_data);
176 ShapeFunctionDisplacement::NPOINTS,
180 ip_out.eps_data.eps.noalias() = Bu * displacement;
182 current_state.S_L_data);
185 current_state.S_L_data,
186 current_state.chi_S_L);
189 prev_state.S_L_data, prev_state.chi_S_L);
193 ip_cv.C_el_data, ip_cv.beta_p_SR);
197 {pos, t, dt}, media_data, ip_cv.C_el_data, current_state.S_L_data,
198 prev_state.S_L_data, prev_state.swelling_data,
199 current_state.swelling_data, ip_cv.swelling_data);
203 ip_cv.s_therm_exp_data);
206 T_data, ip_cv.s_therm_exp_data, ip_out.eps_data,
207 Bu * displacement_prev, prev_state.mechanical_strain_data,
208 ip_cv.swelling_data, current_state.mechanical_strain_data);
211 {pos, t, dt}, T_data, current_state.mechanical_strain_data,
212 prev_state.mechanical_strain_data, prev_state.eff_stress_data,
214 ip_cd.s_mech_data, ip_cv.equivalent_plastic_strain_data);
217 ip_cv.biot_data, current_state.chi_S_L,
219 ip_out.total_stress_data);
222 pGR_data, pCap_data, T_data,
223 current_state.rho_W_LR);
226 {pos, t, dt}, media_data, pGR_data, pCap_data, T_data,
227 current_state.rho_W_LR, ip_out.fluid_enthalpy_data,
228 ip_out.mass_mole_fractions_data, ip_out.fluid_density_data,
229 ip_out.vapour_pressure_data, current_state.constituent_density_data,
230 ip_cv.phase_transition_data);
233 ip_out.mass_mole_fractions_data,
234 ip_cv.viscosity_data);
237 {pos, t, dt}, media_data, current_state.S_L_data,
238 prev_state.S_L_data, pCap_data, pGR_data, current_state.chi_S_L,
239 prev_state.chi_S_L, ip_cv.beta_p_SR, ip_out.eps_data,
240 Bu * displacement_prev, prev_state.porosity_data,
241 current_state.porosity_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,
249 current_state.mechanical_strain_data,
250 prev_state.mechanical_strain_data,
251 prev_state.transport_porosity_data, current_state.porosity_data,
252 current_state.transport_porosity_data);
256 current_state.transport_porosity_data.phi =
257 current_state.porosity_data.phi;
261 {pos, t, dt}, media_data, current_state.S_L_data, pGR_data,
262 pCap_data, T_data, current_state.transport_porosity_data,
263 ip_out.total_stress_data, current_state.mechanical_strain_data,
264 ip_out.eps_data, ip_cv.equivalent_plastic_strain_data,
265 ip_out.permeability_data);
268 {pos, t, dt}, media_data, T_data, current_state.eff_stress_data,
269 pCap_data, pGR_data, current_state.chi_S_L,
270 current_state.porosity_data, ip_out.solid_density_data);
273 ip_cv.solid_heat_capacity_data);
276 {pos, t, dt}, media_data, T_data, current_state.porosity_data,
277 current_state.S_L_data, ip_cv.thermal_conductivity_data);
280 ip_out.permeability_data,
281 current_state.rho_W_LR,
282 ip_cv.viscosity_data,
283 ip_cv.advection_data);
286 ip_out.fluid_density_data,
287 current_state.porosity_data,
288 current_state.S_L_data,
289 ip_out.solid_density_data,
291 this->process_data_.specific_body_force),
292 ip_cv.volumetric_body_force);
296 ip_out.mass_mole_fractions_data,
297 ip_cv.phase_transition_data,
298 current_state.porosity_data,
299 current_state.S_L_data,
301 ip_out.diffusion_velocity_data);
304 ip_out.solid_enthalpy_data);
307 ip_cv.phase_transition_data,
308 current_state.porosity_data,
309 current_state.S_L_data,
310 ip_out.solid_density_data,
311 ip_out.solid_enthalpy_data,
312 current_state.internal_energy_data);
315 ip_out.fluid_density_data,
316 ip_out.fluid_enthalpy_data,
317 current_state.porosity_data,
318 current_state.S_L_data,
319 ip_out.solid_density_data,
320 ip_out.solid_enthalpy_data,
321 ip_cv.effective_volumetric_enthalpy_data);
323 models.
fC_1_model.eval(ip_cv.advection_data, ip_out.fluid_density_data,
330 current_state.constituent_density_data,
331 current_state.porosity_data,
332 current_state.S_L_data,
337 current_state.constituent_density_data,
338 prev_state.constituent_density_data,
339 current_state.S_L_data,
343 ip_out.fluid_density_data,
344 ip_cv.phase_transition_data,
345 current_state.porosity_data,
346 current_state.S_L_data,
350 ip_out.fluid_density_data,
351 ip_cv.phase_transition_data,
352 current_state.porosity_data,
353 current_state.S_L_data,
357 ip_cv.phase_transition_data,
358 current_state.porosity_data,
359 current_state.S_L_data,
363 current_state.constituent_density_data,
364 current_state.porosity_data,
365 current_state.S_L_data,
371 current_state.constituent_density_data,
372 current_state.porosity_data,
374 current_state.S_L_data,
379 current_state.constituent_density_data,
380 current_state.porosity_data,
381 current_state.S_L_data,
382 ip_cv.s_therm_exp_data,
386 current_state.constituent_density_data,
387 current_state.S_L_data,
390 models.
fW_1_model.eval(ip_cv.advection_data, ip_out.fluid_density_data,
397 current_state.constituent_density_data,
398 current_state.porosity_data,
399 current_state.rho_W_LR,
400 current_state.S_L_data,
405 current_state.constituent_density_data,
406 prev_state.constituent_density_data,
408 current_state.rho_W_LR,
409 current_state.S_L_data,
413 ip_out.fluid_density_data,
414 ip_cv.phase_transition_data,
415 current_state.porosity_data,
416 current_state.S_L_data,
420 ip_out.fluid_density_data,
421 ip_cv.phase_transition_data,
422 current_state.porosity_data,
423 current_state.S_L_data,
427 ip_cv.phase_transition_data,
428 current_state.porosity_data,
429 current_state.S_L_data,
433 current_state.constituent_density_data,
434 current_state.porosity_data,
435 current_state.rho_W_LR,
436 current_state.S_L_data,
442 current_state.constituent_density_data,
443 current_state.porosity_data,
445 current_state.rho_W_LR,
446 current_state.S_L_data,
451 current_state.constituent_density_data,
452 current_state.porosity_data,
453 current_state.rho_W_LR,
454 current_state.S_L_data,
455 ip_cv.s_therm_exp_data,
459 current_state.constituent_density_data,
460 current_state.rho_W_LR,
461 current_state.S_L_data,
465 current_state.internal_energy_data,
466 prev_state.internal_energy_data,
475 ip_out.fluid_density_data,
477 ip_out.permeability_data,
479 this->process_data_.specific_body_force),
480 ip_cv.viscosity_data,
481 ip_out.darcy_velocity_data);
483 models.
fT_2_model.eval(ip_out.darcy_velocity_data,
484 ip_out.fluid_density_data,
485 ip_out.fluid_enthalpy_data,
489 current_state.constituent_density_data,
490 ip_out.darcy_velocity_data,
491 ip_out.diffusion_velocity_data,
492 ip_out.fluid_density_data,
493 ip_cv.phase_transition_data,
495 this->process_data_.specific_body_force),
502 return {ip_constitutive_data, ip_constitutive_variables};
510 updateConstitutiveVariablesDerivatives(
511 Eigen::VectorXd
const& local_x, Eigen::VectorXd
const& local_x_prev,
512 double const t,
double const dt,
515 ip_constitutive_data,
518 ip_constitutive_variables,
522 [[maybe_unused]]
auto const matrix_size =
526 assert(local_x.size() == matrix_size);
528 auto const gas_pressure =
530 auto const gas_pressure_prev =
532 auto const temperature =
534 auto const temperature_prev =
536 auto const displacement_prev =
539 auto const capillary_pressure =
540 local_x.template segment<capillary_pressure_size>(
542 auto const capillary_pressure_prev =
543 local_x_prev.template segment<capillary_pressure_size>(
550 unsigned const n_integration_points =
553 std::vector<ConstitutiveRelations::DerivativesData<DisplacementDim>>
554 ip_d_data(n_integration_points);
556 for (
unsigned ip = 0; ip < n_integration_points; ip++)
559 auto& ip_dd = ip_d_data[ip];
560 auto const& ip_cd = ip_constitutive_data[ip];
561 auto const& ip_cv = ip_constitutive_variables[ip];
566 auto const& Nu = ip_data.N_u;
567 auto const& Np = ip_data.N_p;
569 auto const& gradNu = ip_data.dNdx_u;
572 std::nullopt, this->
element_.getID(),
580 double const T = NT.dot(temperature);
581 double const T_prev = NT.dot(temperature_prev);
582 double const pG = Np.dot(gas_pressure);
583 double const pG_prev = Np.dot(gas_pressure_prev);
584 double const pCap = Np.dot(capillary_pressure);
585 double const pCap_prev = Np.dot(capillary_pressure_prev);
593 ShapeFunctionDisplacement::NPOINTS,
601 ip_out.permeability_data,
602 ip_cv.viscosity_data,
604 ip_cv.phase_transition_data,
605 ip_dd.advection_d_data);
608 {pos, t, dt}, media_data, current_state.S_L_data,
609 prev_state.S_L_data, pCap_data, pGR_data, current_state.chi_S_L,
610 prev_state.chi_S_L, ip_cv.beta_p_SR, ip_out.eps_data,
611 Bu * displacement_prev, prev_state.porosity_data,
612 ip_dd.porosity_d_data);
615 {pos, t, dt}, media_data, T_data, current_state.porosity_data,
616 ip_dd.porosity_d_data, current_state.S_L_data,
617 ip_dd.thermal_conductivity_d_data);
620 {pos, t, dt}, media_data, T_data, current_state.eff_stress_data,
621 pCap_data, pGR_data, current_state.chi_S_L,
622 current_state.porosity_data, ip_dd.solid_density_d_data);
625 ip_out.fluid_density_data,
626 ip_cv.phase_transition_data,
627 current_state.porosity_data,
628 ip_dd.porosity_d_data,
629 current_state.S_L_data,
630 ip_out.solid_density_data,
631 ip_dd.solid_density_d_data,
632 ip_out.solid_enthalpy_data,
633 ip_cv.solid_heat_capacity_data,
634 ip_dd.effective_volumetric_internal_energy_d_data);
637 ip_out.fluid_density_data,
638 ip_out.fluid_enthalpy_data,
639 ip_cv.phase_transition_data,
640 current_state.porosity_data,
641 ip_dd.porosity_d_data,
642 current_state.S_L_data,
643 ip_out.solid_density_data,
644 ip_dd.solid_density_d_data,
645 ip_out.solid_enthalpy_data,
646 ip_cv.solid_heat_capacity_data,
647 ip_dd.effective_volumetric_enthalpy_d_data);
652 current_state.constituent_density_data,
653 ip_cv.phase_transition_data,
654 current_state.porosity_data,
655 ip_dd.porosity_d_data,
656 current_state.S_L_data,
662 current_state.constituent_density_data,
663 prev_state.constituent_density_data,
664 ip_cv.phase_transition_data,
665 current_state.S_L_data,
670 ip_cv.viscosity_data,
671 ip_cv.phase_transition_data,
672 ip_dd.advection_d_data,
676 ip_out.permeability_data,
677 ip_cv.phase_transition_data,
679 ip_cv.viscosity_data,
683 current_state.constituent_density_data,
684 ip_cv.phase_transition_data,
685 current_state.porosity_data,
686 ip_dd.porosity_d_data,
687 current_state.S_L_data,
692 current_state.constituent_density_data,
693 ip_cv.phase_transition_data,
694 current_state.porosity_data,
695 ip_dd.porosity_d_data,
696 current_state.S_L_data,
697 ip_cv.s_therm_exp_data,
701 ip_cv.phase_transition_data,
702 current_state.S_L_data,
709 current_state.constituent_density_data,
710 ip_cv.phase_transition_data,
711 current_state.porosity_data,
712 ip_dd.porosity_d_data,
713 current_state.rho_W_LR,
714 current_state.S_L_data,
721 current_state.constituent_density_data,
722 ip_cv.phase_transition_data,
723 prev_state.constituent_density_data,
725 current_state.rho_W_LR,
726 current_state.S_L_data,
731 ip_out.permeability_data,
732 ip_cv.phase_transition_data,
733 current_state.rho_W_LR,
735 ip_cv.viscosity_data,
739 ip_out.fluid_density_data,
740 ip_out.permeability_data,
741 ip_cv.phase_transition_data,
742 current_state.porosity_data,
743 current_state.rho_W_LR,
744 current_state.S_L_data,
746 ip_cv.viscosity_data,
750 dt, ip_dd.effective_volumetric_internal_energy_d_data, ip_dd.dfT_1);
753 ip_out.darcy_velocity_data,
754 ip_out.fluid_density_data,
755 ip_out.fluid_enthalpy_data,
756 ip_out.permeability_data,
757 ip_cv.phase_transition_data,
759 this->process_data_.specific_body_force),
760 ip_cv.viscosity_data,
763 models.
fu_1_KuT_model.dEval(ip_cd.s_mech_data, ip_cv.s_therm_exp_data,
767 current_state.chi_S_L,
977 std::vector<double>
const& local_x,
978 std::vector<double>
const& local_x_prev,
979 std::vector<double>& local_M_data,
980 std::vector<double>& local_K_data,
981 std::vector<double>& local_rhs_data)
985 assert(local_x.size() == matrix_size);
987 auto const capillary_pressure =
988 Eigen::Map<VectorType<capillary_pressure_size>
const>(
991 auto const capillary_pressure_prev =
992 Eigen::Map<VectorType<capillary_pressure_size>
const>(
999 local_M_data, matrix_size, matrix_size);
1004 local_K_data, matrix_size, matrix_size);
1008 local_rhs_data, matrix_size);
1014 auto MCpG = local_M.template block<C_size, gas_pressure_size>(
1016 auto MCpC = local_M.template block<C_size, capillary_pressure_size>(
1018 auto MCT = local_M.template block<C_size, temperature_size>(
1020 auto MCu = local_M.template block<C_size, displacement_size>(
1024 auto LCpG = local_K.template block<C_size, gas_pressure_size>(
1026 auto LCpC = local_K.template block<C_size, capillary_pressure_size>(
1028 auto LCT = local_K.template block<C_size, temperature_size>(
1032 auto MWpG = local_M.template block<W_size, gas_pressure_size>(
1034 auto MWpC = local_M.template block<W_size, capillary_pressure_size>(
1036 auto MWT = local_M.template block<W_size, temperature_size>(
1038 auto MWu = local_M.template block<W_size, displacement_size>(
1042 auto LWpG = local_K.template block<W_size, gas_pressure_size>(
1044 auto LWpC = local_K.template block<W_size, capillary_pressure_size>(
1046 auto LWT = local_K.template block<W_size, temperature_size>(
1050 auto MTu = local_M.template block<temperature_size, displacement_size>(
1054 auto KTT = local_K.template block<temperature_size, temperature_size>(
1058 auto KUpG = local_K.template block<displacement_size, gas_pressure_size>(
1061 local_K.template block<displacement_size, capillary_pressure_size>(
1064 auto KUU = local_K.template block<displacement_size, displacement_size>(
1068 auto fC = local_f.template segment<C_size>(
C_index);
1070 auto fW = local_f.template segment<W_size>(
W_index);
1076 unsigned const n_integration_points =
1082 auto const [ip_constitutive_data, ip_constitutive_variables] =
1084 Eigen::Map<Eigen::VectorXd const>(local_x.data(), local_x.size()),
1085 Eigen::Map<Eigen::VectorXd const>(local_x_prev.data(),
1086 local_x_prev.size()),
1089 for (
unsigned int_point = 0; int_point < n_integration_points; int_point++)
1092 auto& ip_cv = ip_constitutive_variables[int_point];
1093 auto& ip_cd = ip_constitutive_data[int_point];
1096 auto const& prev_state = this->
prev_states_[int_point];
1098 auto const& Np = ip.N_p;
1099 auto const& Nu = ip.N_u;
1101 std::nullopt, this->
element_.getID(),
1107 auto const& NpT = Np.transpose().eval();
1108 auto const& NTT = NpT;
1110 auto const& gradNp = ip.dNdx_p;
1111 auto const& gradNT = gradNp;
1112 auto const& gradNu = ip.dNdx_u;
1114 auto const& gradNpT = gradNp.transpose().eval();
1115 auto const& gradNTT = gradNpT;
1117 auto const& w = ip.integration_weight;
1119 auto const x_coord =
1123 ShapeFunctionDisplacement::NPOINTS,
1127 auto const NTN = (Np.transpose() * Np).eval();
1130 double const pCap = Np.dot(capillary_pressure);
1131 double const pCap_prev = Np.dot(capillary_pressure_prev);
1133 auto const s_L = current_state.S_L_data.S_L;
1134 auto const s_L_dot = (s_L - prev_state.S_L_data->S_L) / dt;
1142 MCpG.noalias() += NTN * (ip_cv.fC_4_MCpG.m * w);
1143 MCpC.noalias() += NTN * (ip_cv.fC_4_MCpC.m * w);
1147 if (pCap - pCap_prev != 0.)
1150 NTN * (ip_cv.fC_4_MCpC.ml / (pCap - pCap_prev) * w);
1154 MCT.noalias() += NTN * (ip_cv.fC_4_MCT.m * w);
1155 MCu.noalias() += BTI2N.transpose() * (ip_cv.fC_4_MCu.m * w);
1157 LCpG.noalias() += gradNpT * ip_cv.fC_4_LCpG.L * gradNp * w;
1159 LCpC.noalias() += gradNpT * ip_cv.fC_4_LCpC.L * gradNp * w;
1161 LCT.noalias() += gradNpT * ip_cv.fC_4_LCT.L * gradNp * w;
1163 fC.noalias() += gradNpT * ip_cv.fC_1.A * b * w;
1167 fC.noalias() -= NpT * (ip_cv.fC_2a.a * s_L_dot * w);
1171 NpT * (current_state.porosity_data.phi * ip_cv.fC_3a.a * w);
1177 MWpG.noalias() += NTN * (ip_cv.fW_4_MWpG.m * w);
1178 MWpC.noalias() += NTN * (ip_cv.fW_4_MWpC.m * w);
1182 if (pCap - pCap_prev != 0.)
1185 NTN * (ip_cv.fW_4_MWpC.ml / (pCap - pCap_prev) * w);
1189 MWT.noalias() += NTN * (ip_cv.fW_4_MWT.m * w);
1191 MWu.noalias() += BTI2N.transpose() * (ip_cv.fW_4_MWu.m * w);
1193 LWpG.noalias() += gradNpT * ip_cv.fW_4_LWpG.L * gradNp * w;
1195 LWpC.noalias() += gradNpT * ip_cv.fW_4_LWpC.L * gradNp * w;
1197 LWT.noalias() += gradNpT * ip_cv.fW_4_LWT.L * gradNp * w;
1199 fW.noalias() += gradNpT * ip_cv.fW_1.A * b * w;
1203 fW.noalias() -= NpT * (ip_cv.fW_2.a * s_L_dot * w);
1207 NpT * (current_state.porosity_data.phi * ip_cv.fW_3a.a * w);
1215 (ip_cv.effective_volumetric_enthalpy_data.rho_h_eff * w);
1218 gradNTT * ip_cv.thermal_conductivity_data.lambda * gradNT * w;
1220 fT.noalias() -= NTT * (ip_cv.fT_1.m * w);
1222 fT.noalias() += gradNTT * ip_cv.fT_2.A * w;
1224 fT.noalias() += gradNTT * ip_cv.fT_3.gradN * w;
1226 fT.noalias() += NTT * (ip_cv.fT_3.N * w);
1232 KUpG.noalias() -= BTI2N * (ip_cv.biot_data() * w);
1234 KUpC.noalias() += BTI2N * (ip_cv.fu_2_KupC.m * w);
1237 (Bu.transpose() * ip_cd.s_mech_data.stiffness_tensor).eval();
1238 KUU.noalias() += BuTC * Bu * w;
1241 (Bu.transpose() * current_state.eff_stress_data.sigma_eff -
1242 N_u_op(Nu).transpose() * ip_cv.volumetric_body_force()) *
1247 MCpG = MCpG.colwise().sum().eval().asDiagonal();
1248 MCpC = MCpC.colwise().sum().eval().asDiagonal();
1249 MWpG = MWpG.colwise().sum().eval().asDiagonal();
1250 MWpC = MWpC.colwise().sum().eval().asDiagonal();
1261 assembleWithJacobian(
double const t,
double const dt,
1262 std::vector<double>
const& local_x,
1263 std::vector<double>
const& local_x_prev,
1264 std::vector<double>& local_rhs_data,
1265 std::vector<double>& local_Jac_data)
1269 assert(local_x.size() == matrix_size);
1271 auto const temperature = Eigen::Map<VectorType<temperature_size>
const>(
1274 auto const gas_pressure = Eigen::Map<VectorType<gas_pressure_size>
const>(
1277 auto const capillary_pressure =
1278 Eigen::Map<VectorType<capillary_pressure_size>
const>(
1281 auto const displacement = Eigen::Map<VectorType<displacement_size>
const>(
1284 auto const gas_pressure_prev =
1285 Eigen::Map<VectorType<gas_pressure_size>
const>(
1288 auto const capillary_pressure_prev =
1289 Eigen::Map<VectorType<capillary_pressure_size>
const>(
1293 auto const temperature_prev =
1294 Eigen::Map<VectorType<temperature_size>
const>(
1297 auto const displacement_prev =
1298 Eigen::Map<VectorType<displacement_size>
const>(
1303 local_Jac_data, matrix_size, matrix_size);
1306 local_rhs_data, matrix_size);
1370 auto fC = local_f.template segment<C_size>(
C_index);
1372 auto fW = local_f.template segment<W_size>(
W_index);
1378 unsigned const n_integration_points =
1384 auto const [ip_constitutive_data, ip_constitutive_variables] =
1386 Eigen::Map<Eigen::VectorXd const>(local_x.data(), local_x.size()),
1387 Eigen::Map<Eigen::VectorXd const>(local_x_prev.data(),
1388 local_x_prev.size()),
1392 Eigen::Map<Eigen::VectorXd const>(local_x.data(), local_x.size()),
1393 Eigen::Map<Eigen::VectorXd const>(local_x_prev.data(),
1394 local_x_prev.size()),
1395 t, dt, ip_constitutive_data, ip_constitutive_variables, models);
1397 for (
unsigned int_point = 0; int_point < n_integration_points; int_point++)
1400 auto& ip_cd = ip_constitutive_data[int_point];
1401 auto& ip_dd = ip_d_data[int_point];
1402 auto& ip_cv = ip_constitutive_variables[int_point];
1406 auto const& Np = ip.N_p;
1407 auto const& NT = Np;
1408 auto const& Nu = ip.N_u;
1410 std::nullopt, this->
element_.getID(),
1416 auto const& NpT = Np.transpose().eval();
1417 auto const& NTT = NpT;
1419 auto const& gradNp = ip.dNdx_p;
1420 auto const& gradNT = gradNp;
1421 auto const& gradNu = ip.dNdx_u;
1423 auto const& gradNpT = gradNp.transpose().eval();
1424 auto const& gradNTT = gradNpT;
1426 auto const& w = ip.integration_weight;
1428 auto const x_coord =
1432 ShapeFunctionDisplacement::NPOINTS,
1436 auto const NTN = (Np.transpose() * Np).eval();
1439 double const div_u_dot =
1442 double const pGR = Np.dot(gas_pressure);
1443 double const pCap = Np.dot(capillary_pressure);
1444 double const T = NT.dot(temperature);
1450 double const pGR_prev = Np.dot(gas_pressure_prev);
1451 double const pCap_prev = Np.dot(capillary_pressure_prev);
1452 double const T_prev = NT.dot(temperature_prev);
1454 auto const& s_L = current_state.S_L_data.S_L;
1455 auto const s_L_dot = (s_L - prev_state.S_L_data->S_L) / dt;
1463 MCpG.noalias() += NTN * (ip_cv.fC_4_MCpG.m * w);
1464 MCpC.noalias() += NTN * (ip_cv.fC_4_MCpC.m * w);
1468 if (pCap - pCap_prev != 0.)
1471 NTN * (ip_cv.fC_4_MCpC.ml / (pCap - pCap_prev) * w);
1475 MCT.noalias() += NTN * (ip_cv.fC_4_MCT.m * w);
1478 .template block<C_size, temperature_size>(
C_index,
1480 .noalias() += NTN * (ip_dd.dfC_4_MCT.dT * (T - T_prev) / dt * w);
1482 MCu.noalias() += BTI2N.transpose() * (ip_cv.fC_4_MCu.m * w);
1485 .template block<C_size, temperature_size>(
C_index,
1487 .noalias() += NTN * (ip_dd.dfC_4_MCu.dT * div_u_dot * w);
1489 LCpG.noalias() += gradNpT * ip_cv.fC_4_LCpG.L * gradNp * w;
1492 local_Jac.template block<C_size, C_size>(
C_index,
C_index).noalias() +=
1493 gradNpT * ip_dd.dfC_4_LCpG.dp_GR * gradpGR * Np * w;
1496 local_Jac.template block<C_size, W_size>(
C_index,
W_index).noalias() +=
1497 gradNpT * ip_dd.dfC_4_LCpG.dp_cap * gradpGR * Np * w;
1501 .template block<C_size, temperature_size>(
C_index,
1503 .noalias() += gradNpT * ip_dd.dfC_4_LCpG.dT * gradpGR * NT * w;
1506 local_Jac.template block<C_size, C_size>(
C_index,
C_index).noalias() +=
1507 NTN * (ip_dd.dfC_4_MCpG.dp_GR * (pGR - pGR_prev) / dt * w);
1511 .template block<C_size, temperature_size>(
C_index,
1514 NTN * (ip_dd.dfC_4_MCpG.dT * (pGR - pGR_prev) / dt * w);
1516 LCpC.noalias() -= gradNpT * ip_cv.fC_4_LCpC.L * gradNp * w;
1532 LCT.noalias() += gradNpT * ip_cv.fC_4_LCT.L * gradNp * w;
1535 fC.noalias() += gradNpT * ip_cv.fC_1.A * b * w;
1540 fC.noalias() -= NpT * (ip_cv.fC_2a.a * s_L_dot * w);
1544 NTN * ((ip_dd.dfC_2a.dp_GR * s_L_dot
1550 NTN * ((ip_dd.dfC_2a.dp_cap * s_L_dot +
1551 ip_cv.fC_2a.a * ip_dd.dS_L_dp_cap() / dt) *
1555 .template block<C_size, temperature_size>(
C_index,
1557 .noalias() += NTN * (ip_dd.dfC_2a.dT * s_L_dot * w);
1562 NpT * (current_state.porosity_data.phi * ip_cv.fC_3a.a * w);
1565 .noalias() += NTN * (current_state.porosity_data.phi *
1566 ip_dd.dfC_3a.dp_GR * w);
1569 .noalias() += NTN * (current_state.porosity_data.phi *
1570 ip_dd.dfC_3a.dp_cap * w);
1573 .template block<C_size, temperature_size>(
C_index,
1576 NTN * ((ip_dd.porosity_d_data.dphi_dT * ip_cv.fC_3a.a +
1577 current_state.porosity_data.phi * ip_dd.dfC_3a.dT) *
1584 MWpG.noalias() += NTN * (ip_cv.fW_4_MWpG.m * w);
1585 MWpC.noalias() += NTN * (ip_cv.fW_4_MWpC.m * w);
1589 if (pCap - pCap_prev != 0.)
1592 NTN * (ip_cv.fW_4_MWpC.ml / (pCap - pCap_prev) * w);
1596 MWT.noalias() += NTN * (ip_cv.fW_4_MWT.m * w);
1598 MWu.noalias() += BTI2N.transpose() * (ip_cv.fW_4_MWu.m * w);
1600 LWpG.noalias() += gradNpT * ip_cv.fW_4_LWpG.L * gradNp * w;
1603 local_Jac.template block<W_size, C_size>(
W_index,
C_index).noalias() +=
1604 gradNpT * ip_dd.dfW_4_LWpG.dp_GR * gradpGR * Np * w;
1606 local_Jac.template block<W_size, W_size>(
W_index,
W_index).noalias() +=
1607 gradNpT * ip_dd.dfW_4_LWpG.dp_cap * gradpGR * Np * w;
1610 .template block<W_size, temperature_size>(
W_index,
1612 .noalias() += gradNpT * ip_dd.dfW_4_LWpG.dT * gradpGR * NT * w;
1614 LWpC.noalias() += gradNpT * ip_cv.fW_4_LWpC.L * gradNp * w;
1617 local_Jac.template block<W_size, C_size>(
W_index,
C_index).noalias() -=
1618 gradNpT * ip_dd.dfW_4_LWpC.dp_GR * gradpCap * Np * w;
1620 local_Jac.template block<W_size, W_size>(
W_index,
W_index).noalias() -=
1621 gradNpT * ip_dd.dfW_4_LWpC.dp_cap * gradpCap * Np * w;
1624 .template block<W_size, temperature_size>(
W_index,
1626 .noalias() -= gradNpT * ip_dd.dfW_4_LWpC.dT * gradpCap * NT * w;
1628 LWT.noalias() += gradNpT * ip_cv.fW_4_LWT.L * gradNp * w;
1631 fW.noalias() += gradNpT * ip_cv.fW_1.A * b * w;
1636 fW.noalias() -= NpT * (ip_cv.fW_2.a * s_L_dot * w);
1639 .noalias() += NTN * (ip_dd.dfW_2.dp_GR * s_L_dot * w);
1645 .noalias() += NTN * ((ip_dd.dfW_2.dp_cap * s_L_dot +
1646 ip_cv.fW_2.a * ip_dd.dS_L_dp_cap() / dt) *
1650 .template block<W_size, temperature_size>(
W_index,
1652 .noalias() += NTN * (ip_dd.dfW_2.dT * s_L_dot * w);
1657 NpT * (current_state.porosity_data.phi * ip_cv.fW_3a.a * w);
1659 local_Jac.template block<W_size, C_size>(
W_index,
C_index).noalias() +=
1660 NTN * (current_state.porosity_data.phi * ip_dd.dfW_3a.dp_GR * w);
1662 local_Jac.template block<W_size, W_size>(
W_index,
W_index).noalias() +=
1663 NTN * (current_state.porosity_data.phi * ip_dd.dfW_3a.dp_cap * w);
1666 .template block<W_size, temperature_size>(
W_index,
1669 NTN * ((ip_dd.porosity_d_data.dphi_dT * ip_cv.fW_3a.a +
1670 current_state.porosity_data.phi * ip_dd.dfW_3a.dT) *
1679 (ip_cv.effective_volumetric_enthalpy_data.rho_h_eff * w);
1687 NTN * (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dp_GR *
1697 (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dp_cap *
1703 .template block<temperature_size, temperature_size>(
1706 NTN * (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dT *
1710 gradNTT * ip_cv.thermal_conductivity_data.lambda * gradNT * w;
1730 .noalias() += gradNTT *
1731 ip_dd.thermal_conductivity_d_data.dlambda_dp_cap *
1736 .template block<temperature_size, temperature_size>(
1738 .noalias() += gradNTT *
1739 ip_dd.thermal_conductivity_d_data.dlambda_dT * gradT *
1743 fT.noalias() -= NTT * (ip_cv.fT_1.m * w);
1749 .noalias() += NTN * (ip_dd.dfT_1.dp_GR * w);
1755 .noalias() += NTN * (ip_dd.dfT_1.dp_cap * w);
1760 .template block<temperature_size, temperature_size>(
1762 .noalias() += NTN * (ip_dd.dfT_1.dT * w);
1765 fT.noalias() += gradNTT * ip_cv.fT_2.A * w;
1773 gradNTT * ip_dd.dfT_2.dp_GR_Npart * Np * w +
1775 gradNTT * ip_dd.dfT_2.dp_GR_gradNpart * gradNp * w;
1783 gradNTT * (-ip_dd.dfT_2.dp_cap_Npart) * Np * w +
1785 gradNTT * (-ip_dd.dfT_2.dp_cap_gradNpart) * gradNp * w;
1789 .template block<temperature_size, temperature_size>(
1791 .noalias() -= gradNTT * ip_dd.dfT_2.dT * NT * w;
1794 fT.noalias() += NTT * (ip_cv.fT_3.N * w);
1796 fT.noalias() += gradNTT * ip_cv.fT_3.gradN * w;
1802 KUpG.noalias() -= BTI2N * (ip_cv.biot_data() * w);
1807 KUpC.noalias() += BTI2N * (ip_cv.fu_2_KupC.m * w);
1814 .noalias() += BTI2N * (ip_dd.dfu_2_KupC.dp_cap * w);
1817 (Bu.transpose() * ip_cd.s_mech_data.stiffness_tensor).eval();
1819 .template block<displacement_size, displacement_size>(
1821 .noalias() += BuTC * Bu * w;
1825 (Bu.transpose() * current_state.eff_stress_data.sigma_eff -
1826 N_u_op(Nu).transpose() * ip_cv.volumetric_body_force()) *
1831 .template block<displacement_size, temperature_size>(
1833 .noalias() -= Bu.transpose() * ip_dd.dfu_1_KuT.dT * NT * w;
1845 MCpG = MCpG.colwise().sum().eval().asDiagonal();
1846 MCpC = MCpC.colwise().sum().eval().asDiagonal();
1847 MWpG = MWpG.colwise().sum().eval().asDiagonal();
1848 MWpC = MWpC.colwise().sum().eval().asDiagonal();
1854 fC.noalias() -= LCpG * gas_pressure + LCpC * capillary_pressure +
1856 MCpG * (gas_pressure - gas_pressure_prev) / dt +
1857 MCpC * (capillary_pressure - capillary_pressure_prev) / dt +
1858 MCT * (temperature - temperature_prev) / dt +
1859 MCu * (displacement - displacement_prev) / dt;
1861 local_Jac.template block<C_size, C_size>(
C_index,
C_index).noalias() +=
1863 local_Jac.template block<C_size, W_size>(
C_index,
W_index).noalias() +=
1867 .noalias() += LCT + MCT / dt;
1870 .noalias() += MCu / dt;
1874 fW.noalias() -= LWpG * gas_pressure + LWpC * capillary_pressure +
1876 MWpG * (gas_pressure - gas_pressure_prev) / dt +
1877 MWpC * (capillary_pressure - capillary_pressure_prev) / dt +
1878 MWT * (temperature - temperature_prev) / dt +
1879 MWu * (displacement - displacement_prev) / dt;
1881 local_Jac.template block<W_size, W_size>(
W_index,
W_index).noalias() +=
1883 local_Jac.template block<W_size, C_size>(
W_index,
C_index).noalias() +=
1887 .noalias() += LWT + MWT / dt;
1890 .noalias() += MWu / dt;
1895 KTT * temperature + MTu * (displacement - displacement_prev) / dt;
1904 .noalias() += MTu / dt;
1908 fU.noalias() -= KUpG * gas_pressure + KUpC * capillary_pressure;