62 std::vector<double>
const& local_x,
63 std::vector<double>
const& ,
64 std::vector<double>& local_M_data,
65 std::vector<double>& local_K_data,
66 std::vector<double>& local_b_data)
override
68 auto const local_matrix_size = local_x.size();
71 assert(local_matrix_size == ShapeFunction::NPOINTS *
NUM_NODAL_DOF);
74 local_M_data, local_matrix_size, local_matrix_size);
76 local_K_data, local_matrix_size, local_matrix_size);
78 local_b_data, local_matrix_size);
80 auto KTT = local_K.template block<temperature_size, temperature_size>(
82 auto MTT = local_M.template block<temperature_size, temperature_size>(
84 auto Kpp = local_K.template block<pressure_size, pressure_size>(
86 auto Mpp = local_M.template block<pressure_size, pressure_size>(
88 auto MpT = local_M.template block<pressure_size, temperature_size>(
90 auto Bp = local_b.template block<pressure_size, 1>(
pressure_index, 0);
96 auto p_nodal_values = Eigen::Map<const NodalVectorType>(
100 *process_data.media_map.getMedium(this->
_element.getID());
101 auto const& liquid_phase =
103 auto const& solid_phase =
106 bool const has_solid_thermal_expansivity = solid_phase.hasProperty(
111 .projected_specific_body_force_vectors[this->
_element.getID()];
115 unsigned const n_integration_points =
118 std::vector<GlobalDimVectorType> ip_flux_vector;
119 double average_velocity_norm = 0.0;
120 ip_flux_vector.reserve(n_integration_points);
123 process_data.shape_matrix_cache
124 .template NsHigherOrder<typename ShapeFunction::MeshElement>();
126 for (
unsigned ip(0); ip < n_integration_points; ip++)
128 auto const& ip_data = this->
_ip_data[ip];
129 auto const& dNdx = ip_data.dNdx;
130 auto const& N = Ns[ip];
131 auto const& w = ip_data.integration_weight;
134 std::nullopt, this->
_element.getID(),
140 double T_int_pt = 0.0;
141 double p_int_pt = 0.0;
149 auto const specific_storage =
151 .template value<double>(vars, pos, t, dt);
153 auto const porosity =
155 .template value<double>(vars, pos, t, dt);
158 auto const intrinsic_permeability =
163 .value(vars, pos, t, dt));
165 auto const specific_heat_capacity_fluid =
168 .template value<double>(vars, pos, t, dt);
171 auto const fluid_density =
174 .template value<double>(vars, pos, t, dt);
179 auto const viscosity =
182 .template value<double>(vars, pos, t, dt);
186 process_data.has_gravity
194 vars, fluid_density, specific_heat_capacity_fluid, velocity,
198 dNdx.transpose() * thermal_conductivity_dispersivity * dNdx * w;
200 ip_flux_vector.emplace_back(velocity * fluid_density *
201 specific_heat_capacity_fluid);
202 average_velocity_norm += velocity.norm();
204 NtN.noalias() = N.transpose() * N;
208 vars, porosity, fluid_density,
209 specific_heat_capacity_fluid, pos, t, dt)) *
212 double const scaling_factor =
213 process_data.is_volume_balance_equation_type ? 1.0
217 (scaling_factor * w) * dNdx.transpose() * K_over_mu * dNdx;
219 double const dfluid_density_dp =
222 .template dValue<double>(
227 Mpp.noalias() += (scaling_factor * w *
228 (porosity * dfluid_density_dp / fluid_density +
231 if (process_data.has_gravity)
233 Bp += (scaling_factor * w * fluid_density) * dNdx.transpose() *
239 double const eff_thermal_expansivity =
241 t, dt, pos, vars, medium, liquid_phase, solid_phase,
242 has_solid_thermal_expansivity, specific_storage);
244 (scaling_factor * w * eff_thermal_expansivity) * NtN;
249 process_data.stabilizer, this->_ip_data,
250 process_data.shape_matrix_cache, ip_flux_vector,
251 average_velocity_norm /
static_cast<double>(n_integration_points),