81 updateConstitutiveVariables(
82 Eigen::VectorXd
const& local_x, Eigen::VectorXd
const& local_x_prev,
83 double const t,
double const dt,
87 [[maybe_unused]]
auto const matrix_size =
91 assert(local_x.size() == matrix_size);
93 auto const gas_pressure =
95 auto const gas_pressure_prev =
97 auto const capillary_pressure =
98 local_x.template segment<capillary_pressure_size>(
100 auto const capillary_pressure_prev =
101 local_x_prev.template segment<capillary_pressure_size>(
104 auto const temperature =
106 auto const temperature_prev =
109 auto const displacement =
111 auto const displacement_prev =
118 unsigned const n_integration_points =
121 std::vector<ConstitutiveRelations::ConstitutiveData<DisplacementDim>>
122 ip_constitutive_data(n_integration_points);
123 std::vector<ConstitutiveRelations::ConstitutiveTempData<DisplacementDim>>
124 ip_constitutive_variables(n_integration_points);
126 for (
unsigned ip = 0; ip < n_integration_points; ip++)
129 auto& ip_cv = ip_constitutive_variables[ip];
130 auto& ip_cd = ip_constitutive_data[ip];
135 auto const& Np = ip_data.N_p;
137 auto const& Nu = ip_data.N_u;
138 auto const& gradNu = ip_data.dNdx_u;
139 auto const& gradNp = ip_data.dNdx_p;
141 std::nullopt, this->
element_.getID(),
150 double const T = NT.dot(temperature);
151 double const T_prev = NT.dot(temperature_prev);
152 double const pG = Np.dot(gas_pressure);
153 double const pG_prev = Np.dot(gas_pressure_prev);
154 double const pCap = Np.dot(capillary_pressure);
155 double const pCap_prev = Np.dot(capillary_pressure_prev);
163 grad_p_GR{gradNp * gas_pressure};
165 DisplacementDim>
const grad_p_cap{gradNp * capillary_pressure};
167 grad_T{gradNp * temperature};
173 models.
biot_model.
eval({pos, t, dt}, media_data, ip_cv.biot_data);
177 ShapeFunctionDisplacement::NPOINTS,
181 ip_out.eps_data.eps.noalias() = Bu * displacement;
183 current_state.S_L_data);
186 current_state.S_L_data,
187 current_state.chi_S_L);
190 prev_state.S_L_data, prev_state.chi_S_L);
194 ip_cv.C_el_data, ip_cv.beta_p_SR);
198 {pos, t, dt}, media_data, ip_cv.C_el_data, current_state.S_L_data,
199 prev_state.S_L_data, prev_state.swelling_data,
200 current_state.swelling_data, ip_cv.swelling_data);
204 ip_cv.s_therm_exp_data);
207 T_data, ip_cv.s_therm_exp_data, ip_out.eps_data,
208 Bu * displacement_prev, prev_state.mechanical_strain_data,
209 ip_cv.swelling_data, current_state.mechanical_strain_data);
212 {pos, t, dt}, T_data, current_state.mechanical_strain_data,
213 prev_state.mechanical_strain_data, prev_state.eff_stress_data,
215 ip_cd.s_mech_data, ip_cv.equivalent_plastic_strain_data);
218 ip_cv.biot_data, current_state.chi_S_L,
220 ip_out.total_stress_data);
223 pGR_data, pCap_data, T_data,
224 current_state.rho_W_LR);
227 {pos, t, dt}, media_data, pGR_data, pCap_data, T_data,
228 current_state.rho_W_LR, ip_out.fluid_enthalpy_data,
229 ip_out.mass_mole_fractions_data, ip_out.fluid_density_data,
230 ip_out.vapour_pressure_data, current_state.constituent_density_data,
231 ip_cv.phase_transition_data);
234 ip_out.mass_mole_fractions_data,
235 ip_cv.viscosity_data);
238 {pos, t, dt}, media_data, current_state.S_L_data,
239 prev_state.S_L_data, pCap_data, pGR_data, current_state.chi_S_L,
240 prev_state.chi_S_L, ip_cv.beta_p_SR, ip_out.eps_data,
241 Bu * displacement_prev, prev_state.porosity_data,
242 current_state.porosity_data);
247 {pos, t, dt}, media_data, current_state.S_L_data,
248 prev_state.S_L_data, pCap_data, pGR_data, current_state.chi_S_L,
249 prev_state.chi_S_L, ip_cv.beta_p_SR,
250 current_state.mechanical_strain_data,
251 prev_state.mechanical_strain_data,
252 prev_state.transport_porosity_data, current_state.porosity_data,
253 current_state.transport_porosity_data);
257 current_state.transport_porosity_data.phi =
258 current_state.porosity_data.phi;
262 {pos, t, dt}, media_data, current_state.S_L_data, pGR_data,
263 pCap_data, T_data, current_state.transport_porosity_data,
264 ip_out.total_stress_data, current_state.mechanical_strain_data,
265 ip_out.eps_data, ip_cv.equivalent_plastic_strain_data,
266 ip_out.permeability_data);
269 {pos, t, dt}, media_data, T_data, current_state.eff_stress_data,
270 pCap_data, pGR_data, current_state.chi_S_L,
271 current_state.porosity_data, ip_out.solid_density_data);
274 ip_cv.solid_heat_capacity_data);
277 {pos, t, dt}, media_data, T_data, current_state.porosity_data,
278 current_state.S_L_data, ip_cv.thermal_conductivity_data);
281 ip_out.permeability_data,
282 current_state.rho_W_LR,
283 ip_cv.viscosity_data,
284 ip_cv.advection_data);
287 ip_out.fluid_density_data,
288 current_state.porosity_data,
289 current_state.S_L_data,
290 ip_out.solid_density_data,
292 this->process_data_.specific_body_force),
293 ip_cv.volumetric_body_force);
297 ip_out.mass_mole_fractions_data,
298 ip_cv.phase_transition_data,
299 current_state.porosity_data,
300 current_state.S_L_data,
302 ip_out.diffusion_velocity_data);
305 ip_out.solid_enthalpy_data);
308 ip_cv.phase_transition_data,
309 current_state.porosity_data,
310 current_state.S_L_data,
311 ip_out.solid_density_data,
312 ip_out.solid_enthalpy_data,
313 current_state.internal_energy_data);
316 ip_out.fluid_density_data,
317 ip_out.fluid_enthalpy_data,
318 current_state.porosity_data,
319 current_state.S_L_data,
320 ip_out.solid_density_data,
321 ip_out.solid_enthalpy_data,
322 ip_cv.effective_volumetric_enthalpy_data);
324 models.
fC_1_model.eval(ip_cv.advection_data, ip_out.fluid_density_data,
331 current_state.constituent_density_data,
332 current_state.porosity_data,
333 current_state.S_L_data,
338 current_state.constituent_density_data,
339 prev_state.constituent_density_data,
340 current_state.S_L_data,
344 ip_out.fluid_density_data,
345 ip_cv.phase_transition_data,
346 current_state.porosity_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_cv.phase_transition_data,
359 current_state.porosity_data,
360 current_state.S_L_data,
364 current_state.constituent_density_data,
365 current_state.porosity_data,
366 current_state.S_L_data,
372 current_state.constituent_density_data,
373 current_state.porosity_data,
375 current_state.S_L_data,
380 current_state.constituent_density_data,
381 current_state.porosity_data,
382 current_state.S_L_data,
383 ip_cv.s_therm_exp_data,
387 current_state.constituent_density_data,
388 current_state.S_L_data,
391 models.
fW_1_model.eval(ip_cv.advection_data, ip_out.fluid_density_data,
398 current_state.constituent_density_data,
399 current_state.porosity_data,
400 current_state.rho_W_LR,
401 current_state.S_L_data,
406 current_state.constituent_density_data,
407 prev_state.constituent_density_data,
409 current_state.rho_W_LR,
410 current_state.S_L_data,
414 ip_out.fluid_density_data,
415 ip_cv.phase_transition_data,
416 current_state.porosity_data,
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_cv.phase_transition_data,
429 current_state.porosity_data,
430 current_state.S_L_data,
434 current_state.constituent_density_data,
435 current_state.porosity_data,
436 current_state.rho_W_LR,
437 current_state.S_L_data,
443 current_state.constituent_density_data,
444 current_state.porosity_data,
446 current_state.rho_W_LR,
447 current_state.S_L_data,
452 current_state.constituent_density_data,
453 current_state.porosity_data,
454 current_state.rho_W_LR,
455 current_state.S_L_data,
456 ip_cv.s_therm_exp_data,
460 current_state.constituent_density_data,
461 current_state.rho_W_LR,
462 current_state.S_L_data,
466 current_state.internal_energy_data,
467 prev_state.internal_energy_data,
476 ip_out.fluid_density_data,
478 ip_out.permeability_data,
480 this->process_data_.specific_body_force),
481 ip_cv.viscosity_data,
482 ip_out.darcy_velocity_data);
484 models.
fT_2_model.eval(ip_out.darcy_velocity_data,
485 ip_out.fluid_density_data,
486 ip_out.fluid_enthalpy_data,
490 current_state.constituent_density_data,
491 ip_out.darcy_velocity_data,
492 ip_out.diffusion_velocity_data,
493 ip_out.fluid_density_data,
494 ip_cv.phase_transition_data,
496 this->process_data_.specific_body_force),
503 return {ip_constitutive_data, ip_constitutive_variables};
511 updateConstitutiveVariablesDerivatives(
512 Eigen::VectorXd
const& local_x, Eigen::VectorXd
const& local_x_prev,
513 double const t,
double const dt,
516 ip_constitutive_data,
519 ip_constitutive_variables,
523 [[maybe_unused]]
auto const matrix_size =
527 assert(local_x.size() == matrix_size);
529 auto const gas_pressure =
531 auto const gas_pressure_prev =
533 auto const temperature =
535 auto const temperature_prev =
537 auto const displacement_prev =
540 auto const capillary_pressure =
541 local_x.template segment<capillary_pressure_size>(
543 auto const capillary_pressure_prev =
544 local_x_prev.template segment<capillary_pressure_size>(
551 unsigned const n_integration_points =
554 std::vector<ConstitutiveRelations::DerivativesData<DisplacementDim>>
555 ip_d_data(n_integration_points);
557 for (
unsigned ip = 0; ip < n_integration_points; ip++)
560 auto& ip_dd = ip_d_data[ip];
561 auto const& ip_cd = ip_constitutive_data[ip];
562 auto const& ip_cv = ip_constitutive_variables[ip];
567 auto const& Nu = ip_data.N_u;
568 auto const& Np = ip_data.N_p;
570 auto const& gradNu = ip_data.dNdx_u;
573 std::nullopt, this->
element_.getID(),
581 double const T = NT.dot(temperature);
582 double const T_prev = NT.dot(temperature_prev);
583 double const pG = Np.dot(gas_pressure);
584 double const pG_prev = Np.dot(gas_pressure_prev);
585 double const pCap = Np.dot(capillary_pressure);
586 double const pCap_prev = Np.dot(capillary_pressure_prev);
594 ShapeFunctionDisplacement::NPOINTS,
602 ip_out.permeability_data,
603 ip_cv.viscosity_data,
605 ip_cv.phase_transition_data,
606 ip_dd.advection_d_data);
609 {pos, t, dt}, media_data, current_state.S_L_data,
610 prev_state.S_L_data, pCap_data, pGR_data, current_state.chi_S_L,
611 prev_state.chi_S_L, ip_cv.beta_p_SR, ip_out.eps_data,
612 Bu * displacement_prev, prev_state.porosity_data,
613 ip_dd.porosity_d_data);
616 {pos, t, dt}, media_data, T_data, current_state.porosity_data,
617 ip_dd.porosity_d_data, current_state.S_L_data,
618 ip_dd.thermal_conductivity_d_data);
621 {pos, t, dt}, media_data, T_data, current_state.eff_stress_data,
622 pCap_data, pGR_data, current_state.chi_S_L,
623 current_state.porosity_data, ip_dd.solid_density_d_data);
626 ip_out.fluid_density_data,
627 ip_cv.phase_transition_data,
628 current_state.porosity_data,
629 ip_dd.porosity_d_data,
630 current_state.S_L_data,
631 ip_out.solid_density_data,
632 ip_dd.solid_density_d_data,
633 ip_out.solid_enthalpy_data,
634 ip_cv.solid_heat_capacity_data,
635 ip_dd.effective_volumetric_internal_energy_d_data);
638 ip_out.fluid_density_data,
639 ip_out.fluid_enthalpy_data,
640 ip_cv.phase_transition_data,
641 current_state.porosity_data,
642 ip_dd.porosity_d_data,
643 current_state.S_L_data,
644 ip_out.solid_density_data,
645 ip_dd.solid_density_d_data,
646 ip_out.solid_enthalpy_data,
647 ip_cv.solid_heat_capacity_data,
648 ip_dd.effective_volumetric_enthalpy_d_data);
653 current_state.constituent_density_data,
654 ip_cv.phase_transition_data,
655 current_state.porosity_data,
656 ip_dd.porosity_d_data,
657 current_state.S_L_data,
663 current_state.constituent_density_data,
664 prev_state.constituent_density_data,
665 ip_cv.phase_transition_data,
666 current_state.S_L_data,
671 ip_cv.viscosity_data,
672 ip_cv.phase_transition_data,
673 ip_dd.advection_d_data,
677 ip_out.permeability_data,
678 ip_cv.phase_transition_data,
680 ip_cv.viscosity_data,
684 current_state.constituent_density_data,
685 ip_cv.phase_transition_data,
686 current_state.porosity_data,
687 ip_dd.porosity_d_data,
688 current_state.S_L_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,
698 ip_cv.s_therm_exp_data,
702 ip_cv.phase_transition_data,
703 current_state.S_L_data,
710 current_state.constituent_density_data,
711 ip_cv.phase_transition_data,
712 current_state.porosity_data,
713 ip_dd.porosity_d_data,
714 current_state.rho_W_LR,
715 current_state.S_L_data,
722 current_state.constituent_density_data,
723 ip_cv.phase_transition_data,
724 prev_state.constituent_density_data,
726 current_state.rho_W_LR,
727 current_state.S_L_data,
732 ip_out.permeability_data,
733 ip_cv.phase_transition_data,
734 current_state.rho_W_LR,
736 ip_cv.viscosity_data,
740 ip_out.fluid_density_data,
741 ip_out.permeability_data,
742 ip_cv.phase_transition_data,
743 current_state.porosity_data,
744 current_state.rho_W_LR,
745 current_state.S_L_data,
747 ip_cv.viscosity_data,
751 dt, ip_dd.effective_volumetric_internal_energy_d_data, ip_dd.dfT_1);
754 ip_out.darcy_velocity_data,
755 ip_out.fluid_density_data,
756 ip_out.fluid_enthalpy_data,
757 ip_out.permeability_data,
758 ip_cv.phase_transition_data,
760 this->process_data_.specific_body_force),
761 ip_cv.viscosity_data,
764 models.
fu_1_KuT_model.dEval(ip_cd.s_mech_data, ip_cv.s_therm_exp_data,
768 current_state.chi_S_L,
974 std::vector<double>
const& local_x,
975 std::vector<double>
const& local_x_prev,
976 std::vector<double>& local_M_data,
977 std::vector<double>& local_K_data,
978 std::vector<double>& local_rhs_data)
982 assert(local_x.size() == matrix_size);
984 auto const capillary_pressure =
985 Eigen::Map<VectorType<capillary_pressure_size>
const>(
988 auto const capillary_pressure_prev =
989 Eigen::Map<VectorType<capillary_pressure_size>
const>(
996 local_M_data, matrix_size, matrix_size);
1001 local_K_data, matrix_size, matrix_size);
1005 local_rhs_data, matrix_size);
1011 auto MCpG = local_M.template block<C_size, gas_pressure_size>(
1013 auto MCpC = local_M.template block<C_size, capillary_pressure_size>(
1015 auto MCT = local_M.template block<C_size, temperature_size>(
1017 auto MCu = local_M.template block<C_size, displacement_size>(
1021 auto LCpG = local_K.template block<C_size, gas_pressure_size>(
1023 auto LCpC = local_K.template block<C_size, capillary_pressure_size>(
1025 auto LCT = local_K.template block<C_size, temperature_size>(
1029 auto MWpG = local_M.template block<W_size, gas_pressure_size>(
1031 auto MWpC = local_M.template block<W_size, capillary_pressure_size>(
1033 auto MWT = local_M.template block<W_size, temperature_size>(
1035 auto MWu = local_M.template block<W_size, displacement_size>(
1039 auto LWpG = local_K.template block<W_size, gas_pressure_size>(
1041 auto LWpC = local_K.template block<W_size, capillary_pressure_size>(
1043 auto LWT = local_K.template block<W_size, temperature_size>(
1047 auto MTu = local_M.template block<temperature_size, displacement_size>(
1051 auto KTT = local_K.template block<temperature_size, temperature_size>(
1055 auto KUpG = local_K.template block<displacement_size, gas_pressure_size>(
1058 local_K.template block<displacement_size, capillary_pressure_size>(
1061 auto KUU = local_K.template block<displacement_size, displacement_size>(
1065 auto fC = local_f.template segment<C_size>(
C_index);
1067 auto fW = local_f.template segment<W_size>(
W_index);
1073 unsigned const n_integration_points =
1079 auto const [ip_constitutive_data, ip_constitutive_variables] =
1081 Eigen::Map<Eigen::VectorXd const>(local_x.data(), local_x.size()),
1082 Eigen::Map<Eigen::VectorXd const>(local_x_prev.data(),
1083 local_x_prev.size()),
1086 for (
unsigned int_point = 0; int_point < n_integration_points; int_point++)
1089 auto& ip_cv = ip_constitutive_variables[int_point];
1090 auto& ip_cd = ip_constitutive_data[int_point];
1093 auto const& prev_state = this->
prev_states_[int_point];
1095 auto const& Np = ip.N_p;
1096 auto const& Nu = ip.N_u;
1098 std::nullopt, this->
element_.getID(),
1104 auto const& NpT = Np.transpose().eval();
1105 auto const& NTT = NpT;
1107 auto const& gradNp = ip.dNdx_p;
1108 auto const& gradNT = gradNp;
1109 auto const& gradNu = ip.dNdx_u;
1111 auto const& gradNpT = gradNp.transpose().eval();
1112 auto const& gradNTT = gradNpT;
1114 auto const& w = ip.integration_weight;
1116 auto const x_coord =
1120 ShapeFunctionDisplacement::NPOINTS,
1124 auto const NTN = (Np.transpose() * Np).eval();
1127 double const pCap = Np.dot(capillary_pressure);
1128 double const pCap_prev = Np.dot(capillary_pressure_prev);
1130 auto const s_L = current_state.S_L_data.S_L;
1131 auto const s_L_dot = (s_L - prev_state.S_L_data->S_L) / dt;
1139 MCpG.noalias() += NTN * (ip_cv.fC_4_MCpG.m * w);
1140 MCpC.noalias() += NTN * (ip_cv.fC_4_MCpC.m * w);
1144 if (pCap - pCap_prev != 0.)
1147 NTN * (ip_cv.fC_4_MCpC.ml / (pCap - pCap_prev) * w);
1151 MCT.noalias() += NTN * (ip_cv.fC_4_MCT.m * w);
1152 MCu.noalias() += BTI2N.transpose() * (ip_cv.fC_4_MCu.m * w);
1154 LCpG.noalias() += gradNpT * ip_cv.fC_4_LCpG.L * gradNp * w;
1156 LCpC.noalias() += gradNpT * ip_cv.fC_4_LCpC.L * gradNp * w;
1158 LCT.noalias() += gradNpT * ip_cv.fC_4_LCT.L * gradNp * w;
1160 fC.noalias() += gradNpT * ip_cv.fC_1.A * b * w;
1164 fC.noalias() -= NpT * (ip_cv.fC_2a.a * s_L_dot * w);
1168 NpT * (current_state.porosity_data.phi * ip_cv.fC_3a.a * w);
1174 MWpG.noalias() += NTN * (ip_cv.fW_4_MWpG.m * w);
1175 MWpC.noalias() += NTN * (ip_cv.fW_4_MWpC.m * w);
1179 if (pCap - pCap_prev != 0.)
1182 NTN * (ip_cv.fW_4_MWpC.ml / (pCap - pCap_prev) * w);
1186 MWT.noalias() += NTN * (ip_cv.fW_4_MWT.m * w);
1188 MWu.noalias() += BTI2N.transpose() * (ip_cv.fW_4_MWu.m * w);
1190 LWpG.noalias() += gradNpT * ip_cv.fW_4_LWpG.L * gradNp * w;
1192 LWpC.noalias() += gradNpT * ip_cv.fW_4_LWpC.L * gradNp * w;
1194 LWT.noalias() += gradNpT * ip_cv.fW_4_LWT.L * gradNp * w;
1196 fW.noalias() += gradNpT * ip_cv.fW_1.A * b * w;
1200 fW.noalias() -= NpT * (ip_cv.fW_2.a * s_L_dot * w);
1204 NpT * (current_state.porosity_data.phi * ip_cv.fW_3a.a * w);
1212 (ip_cv.effective_volumetric_enthalpy_data.rho_h_eff * w);
1215 gradNTT * ip_cv.thermal_conductivity_data.lambda * gradNT * w;
1217 fT.noalias() -= NTT * (ip_cv.fT_1.m * w);
1219 fT.noalias() += gradNTT * ip_cv.fT_2.A * w;
1221 fT.noalias() += gradNTT * ip_cv.fT_3.gradN * w;
1223 fT.noalias() += NTT * (ip_cv.fT_3.N * w);
1229 KUpG.noalias() -= BTI2N * (ip_cv.biot_data() * w);
1231 KUpC.noalias() += BTI2N * (ip_cv.fu_2_KupC.m * w);
1234 (Bu.transpose() * ip_cd.s_mech_data.stiffness_tensor).eval();
1235 KUU.noalias() += BuTC * Bu * w;
1238 (Bu.transpose() * current_state.eff_stress_data.sigma_eff -
1239 N_u_op(Nu).transpose() * ip_cv.volumetric_body_force()) *
1244 MCpG = MCpG.colwise().sum().eval().asDiagonal();
1245 MCpC = MCpC.colwise().sum().eval().asDiagonal();
1246 MWpG = MWpG.colwise().sum().eval().asDiagonal();
1247 MWpC = MWpC.colwise().sum().eval().asDiagonal();
1258 assembleWithJacobian(
double const t,
double const dt,
1259 std::vector<double>
const& local_x,
1260 std::vector<double>
const& local_x_prev,
1261 std::vector<double>& local_rhs_data,
1262 std::vector<double>& local_Jac_data)
1266 assert(local_x.size() == matrix_size);
1268 auto const temperature = Eigen::Map<VectorType<temperature_size>
const>(
1271 auto const gas_pressure = Eigen::Map<VectorType<gas_pressure_size>
const>(
1274 auto const capillary_pressure =
1275 Eigen::Map<VectorType<capillary_pressure_size>
const>(
1278 auto const displacement = Eigen::Map<VectorType<displacement_size>
const>(
1281 auto const gas_pressure_prev =
1282 Eigen::Map<VectorType<gas_pressure_size>
const>(
1285 auto const capillary_pressure_prev =
1286 Eigen::Map<VectorType<capillary_pressure_size>
const>(
1290 auto const temperature_prev =
1291 Eigen::Map<VectorType<temperature_size>
const>(
1294 auto const displacement_prev =
1295 Eigen::Map<VectorType<displacement_size>
const>(
1300 local_Jac_data, matrix_size, matrix_size);
1303 local_rhs_data, matrix_size);
1367 auto fC = local_f.template segment<C_size>(
C_index);
1369 auto fW = local_f.template segment<W_size>(
W_index);
1375 unsigned const n_integration_points =
1381 auto const [ip_constitutive_data, ip_constitutive_variables] =
1383 Eigen::Map<Eigen::VectorXd const>(local_x.data(), local_x.size()),
1384 Eigen::Map<Eigen::VectorXd const>(local_x_prev.data(),
1385 local_x_prev.size()),
1389 Eigen::Map<Eigen::VectorXd const>(local_x.data(), local_x.size()),
1390 Eigen::Map<Eigen::VectorXd const>(local_x_prev.data(),
1391 local_x_prev.size()),
1392 t, dt, ip_constitutive_data, ip_constitutive_variables, models);
1394 for (
unsigned int_point = 0; int_point < n_integration_points; int_point++)
1397 auto& ip_cd = ip_constitutive_data[int_point];
1398 auto& ip_dd = ip_d_data[int_point];
1399 auto& ip_cv = ip_constitutive_variables[int_point];
1403 auto const& Np = ip.N_p;
1404 auto const& NT = Np;
1405 auto const& Nu = ip.N_u;
1407 std::nullopt, this->
element_.getID(),
1413 auto const& NpT = Np.transpose().eval();
1414 auto const& NTT = NpT;
1416 auto const& gradNp = ip.dNdx_p;
1417 auto const& gradNT = gradNp;
1418 auto const& gradNu = ip.dNdx_u;
1420 auto const& gradNpT = gradNp.transpose().eval();
1421 auto const& gradNTT = gradNpT;
1423 auto const& w = ip.integration_weight;
1425 auto const x_coord =
1429 ShapeFunctionDisplacement::NPOINTS,
1433 auto const NTN = (Np.transpose() * Np).eval();
1436 double const div_u_dot =
1439 double const pGR = Np.dot(gas_pressure);
1440 double const pCap = Np.dot(capillary_pressure);
1441 double const T = NT.dot(temperature);
1447 double const pGR_prev = Np.dot(gas_pressure_prev);
1448 double const pCap_prev = Np.dot(capillary_pressure_prev);
1449 double const T_prev = NT.dot(temperature_prev);
1451 auto const& s_L = current_state.S_L_data.S_L;
1452 auto const s_L_dot = (s_L - prev_state.S_L_data->S_L) / dt;
1460 MCpG.noalias() += NTN * (ip_cv.fC_4_MCpG.m * w);
1461 MCpC.noalias() += NTN * (ip_cv.fC_4_MCpC.m * w);
1465 if (pCap - pCap_prev != 0.)
1468 NTN * (ip_cv.fC_4_MCpC.ml / (pCap - pCap_prev) * w);
1472 MCT.noalias() += NTN * (ip_cv.fC_4_MCT.m * w);
1475 .template block<C_size, temperature_size>(
C_index,
1477 .noalias() += NTN * (ip_dd.dfC_4_MCT.dT * (T - T_prev) / dt * w);
1479 MCu.noalias() += BTI2N.transpose() * (ip_cv.fC_4_MCu.m * w);
1482 .template block<C_size, temperature_size>(
C_index,
1484 .noalias() += NTN * (ip_dd.dfC_4_MCu.dT * div_u_dot * w);
1486 LCpG.noalias() += gradNpT * ip_cv.fC_4_LCpG.L * gradNp * w;
1489 local_Jac.template block<C_size, C_size>(
C_index,
C_index).noalias() +=
1490 gradNpT * ip_dd.dfC_4_LCpG.dp_GR * gradpGR * Np * w;
1493 local_Jac.template block<C_size, W_size>(
C_index,
W_index).noalias() +=
1494 gradNpT * ip_dd.dfC_4_LCpG.dp_cap * gradpGR * Np * w;
1498 .template block<C_size, temperature_size>(
C_index,
1500 .noalias() += gradNpT * ip_dd.dfC_4_LCpG.dT * gradpGR * NT * w;
1503 local_Jac.template block<C_size, C_size>(
C_index,
C_index).noalias() +=
1504 NTN * (ip_dd.dfC_4_MCpG.dp_GR * (pGR - pGR_prev) / dt * w);
1508 .template block<C_size, temperature_size>(
C_index,
1511 NTN * (ip_dd.dfC_4_MCpG.dT * (pGR - pGR_prev) / dt * w);
1513 LCpC.noalias() -= gradNpT * ip_cv.fC_4_LCpC.L * gradNp * w;
1529 LCT.noalias() += gradNpT * ip_cv.fC_4_LCT.L * gradNp * w;
1532 fC.noalias() += gradNpT * ip_cv.fC_1.A * b * w;
1537 fC.noalias() -= NpT * (ip_cv.fC_2a.a * s_L_dot * w);
1541 NTN * ((ip_dd.dfC_2a.dp_GR * s_L_dot
1547 NTN * ((ip_dd.dfC_2a.dp_cap * s_L_dot +
1548 ip_cv.fC_2a.a * ip_dd.dS_L_dp_cap() / dt) *
1552 .template block<C_size, temperature_size>(
C_index,
1554 .noalias() += NTN * (ip_dd.dfC_2a.dT * s_L_dot * w);
1559 NpT * (current_state.porosity_data.phi * ip_cv.fC_3a.a * w);
1562 .noalias() += NTN * (current_state.porosity_data.phi *
1563 ip_dd.dfC_3a.dp_GR * w);
1566 .noalias() += NTN * (current_state.porosity_data.phi *
1567 ip_dd.dfC_3a.dp_cap * w);
1570 .template block<C_size, temperature_size>(
C_index,
1573 NTN * ((ip_dd.porosity_d_data.dphi_dT * ip_cv.fC_3a.a +
1574 current_state.porosity_data.phi * ip_dd.dfC_3a.dT) *
1581 MWpG.noalias() += NTN * (ip_cv.fW_4_MWpG.m * w);
1582 MWpC.noalias() += NTN * (ip_cv.fW_4_MWpC.m * w);
1586 if (pCap - pCap_prev != 0.)
1589 NTN * (ip_cv.fW_4_MWpC.ml / (pCap - pCap_prev) * w);
1593 MWT.noalias() += NTN * (ip_cv.fW_4_MWT.m * w);
1595 MWu.noalias() += BTI2N.transpose() * (ip_cv.fW_4_MWu.m * w);
1597 LWpG.noalias() += gradNpT * ip_cv.fW_4_LWpG.L * gradNp * w;
1600 local_Jac.template block<W_size, C_size>(
W_index,
C_index).noalias() +=
1601 gradNpT * ip_dd.dfW_4_LWpG.dp_GR * gradpGR * Np * w;
1603 local_Jac.template block<W_size, W_size>(
W_index,
W_index).noalias() +=
1604 gradNpT * ip_dd.dfW_4_LWpG.dp_cap * gradpGR * Np * w;
1607 .template block<W_size, temperature_size>(
W_index,
1609 .noalias() += gradNpT * ip_dd.dfW_4_LWpG.dT * gradpGR * NT * w;
1611 LWpC.noalias() += gradNpT * ip_cv.fW_4_LWpC.L * gradNp * w;
1614 local_Jac.template block<W_size, C_size>(
W_index,
C_index).noalias() -=
1615 gradNpT * ip_dd.dfW_4_LWpC.dp_GR * gradpCap * Np * w;
1617 local_Jac.template block<W_size, W_size>(
W_index,
W_index).noalias() -=
1618 gradNpT * ip_dd.dfW_4_LWpC.dp_cap * gradpCap * Np * w;
1621 .template block<W_size, temperature_size>(
W_index,
1623 .noalias() -= gradNpT * ip_dd.dfW_4_LWpC.dT * gradpCap * NT * w;
1625 LWT.noalias() += gradNpT * ip_cv.fW_4_LWT.L * gradNp * w;
1628 fW.noalias() += gradNpT * ip_cv.fW_1.A * b * w;
1633 fW.noalias() -= NpT * (ip_cv.fW_2.a * s_L_dot * w);
1636 .noalias() += NTN * (ip_dd.dfW_2.dp_GR * s_L_dot * w);
1642 .noalias() += NTN * ((ip_dd.dfW_2.dp_cap * s_L_dot +
1643 ip_cv.fW_2.a * ip_dd.dS_L_dp_cap() / dt) *
1647 .template block<W_size, temperature_size>(
W_index,
1649 .noalias() += NTN * (ip_dd.dfW_2.dT * s_L_dot * w);
1654 NpT * (current_state.porosity_data.phi * ip_cv.fW_3a.a * w);
1656 local_Jac.template block<W_size, C_size>(
W_index,
C_index).noalias() +=
1657 NTN * (current_state.porosity_data.phi * ip_dd.dfW_3a.dp_GR * w);
1659 local_Jac.template block<W_size, W_size>(
W_index,
W_index).noalias() +=
1660 NTN * (current_state.porosity_data.phi * ip_dd.dfW_3a.dp_cap * w);
1663 .template block<W_size, temperature_size>(
W_index,
1666 NTN * ((ip_dd.porosity_d_data.dphi_dT * ip_cv.fW_3a.a +
1667 current_state.porosity_data.phi * ip_dd.dfW_3a.dT) *
1676 (ip_cv.effective_volumetric_enthalpy_data.rho_h_eff * w);
1684 NTN * (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dp_GR *
1694 (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dp_cap *
1700 .template block<temperature_size, temperature_size>(
1703 NTN * (ip_dd.effective_volumetric_enthalpy_d_data.drho_h_eff_dT *
1707 gradNTT * ip_cv.thermal_conductivity_data.lambda * gradNT * w;
1727 .noalias() += gradNTT *
1728 ip_dd.thermal_conductivity_d_data.dlambda_dp_cap *
1733 .template block<temperature_size, temperature_size>(
1735 .noalias() += gradNTT *
1736 ip_dd.thermal_conductivity_d_data.dlambda_dT * gradT *
1740 fT.noalias() -= NTT * (ip_cv.fT_1.m * w);
1746 .noalias() += NTN * (ip_dd.dfT_1.dp_GR * w);
1752 .noalias() += NTN * (ip_dd.dfT_1.dp_cap * w);
1757 .template block<temperature_size, temperature_size>(
1759 .noalias() += NTN * (ip_dd.dfT_1.dT * w);
1762 fT.noalias() += gradNTT * ip_cv.fT_2.A * w;
1770 gradNTT * ip_dd.dfT_2.dp_GR_Npart * Np * w +
1772 gradNTT * ip_dd.dfT_2.dp_GR_gradNpart * gradNp * w;
1780 gradNTT * (-ip_dd.dfT_2.dp_cap_Npart) * Np * w +
1782 gradNTT * (-ip_dd.dfT_2.dp_cap_gradNpart) * gradNp * w;
1786 .template block<temperature_size, temperature_size>(
1788 .noalias() -= gradNTT * ip_dd.dfT_2.dT * NT * w;
1791 fT.noalias() += NTT * (ip_cv.fT_3.N * w);
1793 fT.noalias() += gradNTT * ip_cv.fT_3.gradN * w;
1799 KUpG.noalias() -= BTI2N * (ip_cv.biot_data() * w);
1804 KUpC.noalias() += BTI2N * (ip_cv.fu_2_KupC.m * w);
1811 .noalias() += BTI2N * (ip_dd.dfu_2_KupC.dp_cap * w);
1814 (Bu.transpose() * ip_cd.s_mech_data.stiffness_tensor).eval();
1816 .template block<displacement_size, displacement_size>(
1818 .noalias() += BuTC * Bu * w;
1822 (Bu.transpose() * current_state.eff_stress_data.sigma_eff -
1823 N_u_op(Nu).transpose() * ip_cv.volumetric_body_force()) *
1828 .template block<displacement_size, temperature_size>(
1830 .noalias() -= Bu.transpose() * ip_dd.dfu_1_KuT.dT * NT * w;
1842 MCpG = MCpG.colwise().sum().eval().asDiagonal();
1843 MCpC = MCpC.colwise().sum().eval().asDiagonal();
1844 MWpG = MWpG.colwise().sum().eval().asDiagonal();
1845 MWpC = MWpC.colwise().sum().eval().asDiagonal();
1851 fC.noalias() -= LCpG * gas_pressure + LCpC * capillary_pressure +
1853 MCpG * (gas_pressure - gas_pressure_prev) / dt +
1854 MCpC * (capillary_pressure - capillary_pressure_prev) / dt +
1855 MCT * (temperature - temperature_prev) / dt +
1856 MCu * (displacement - displacement_prev) / dt;
1858 local_Jac.template block<C_size, C_size>(
C_index,
C_index).noalias() +=
1860 local_Jac.template block<C_size, W_size>(
C_index,
W_index).noalias() +=
1864 .noalias() += LCT + MCT / dt;
1867 .noalias() += MCu / dt;
1871 fW.noalias() -= LWpG * gas_pressure + LWpC * capillary_pressure +
1873 MWpG * (gas_pressure - gas_pressure_prev) / dt +
1874 MWpC * (capillary_pressure - capillary_pressure_prev) / dt +
1875 MWT * (temperature - temperature_prev) / dt +
1876 MWu * (displacement - displacement_prev) / dt;
1878 local_Jac.template block<W_size, W_size>(
W_index,
W_index).noalias() +=
1880 local_Jac.template block<W_size, C_size>(
W_index,
C_index).noalias() +=
1884 .noalias() += LWT + MWT / dt;
1887 .noalias() += MWu / dt;
1892 KTT * temperature + MTu * (displacement - displacement_prev) / dt;
1901 .noalias() += MTu / dt;
1905 fU.noalias() -= KUpG * gas_pressure + KUpC * capillary_pressure;