62 double const t,
double const dt, std::vector<double>
const& local_x,
63 std::vector<double>
const& ,
64 std::vector<double>& local_M_data, std::vector<double>& local_K_data,
65 std::vector<double>& local_b_data)
67 auto const local_matrix_size = local_x.size();
70 assert(local_matrix_size == ShapeFunction::NPOINTS *
NUM_NODAL_DOF);
73 local_M_data, local_matrix_size, local_matrix_size);
75 local_K_data, local_matrix_size, local_matrix_size);
77 local_b_data, local_matrix_size);
79 unsigned const n_integration_points =
80 _integration_method.getNumberOfPoints();
85 auto p_nodal_values = Eigen::Map<const NodalVectorType>(
86 &local_x[pressure_index], pressure_size);
88 auto const& b = _process_data.specific_body_force;
93 GlobalDimMatrixType::Identity(GlobalDim, GlobalDim));
96 auto const& medium = *_process_data.media_map.getMedium(_element_id);
97 auto const& phase = medium.phase(
"AqueousLiquid");
98 auto const& component =
99 phase.component(_transport_process_variable.getName());
101 auto KCC = local_K.template block<concentration_size, concentration_size>(
102 concentration_index, concentration_index);
103 auto MCC = local_M.template block<concentration_size, concentration_size>(
104 concentration_index, concentration_index);
105 auto Kpp = local_K.template block<pressure_size, pressure_size>(
106 pressure_index, pressure_index);
107 auto Mpp = local_M.template block<pressure_size, pressure_size>(
108 pressure_index, pressure_index);
109 auto Bp = local_b.template block<pressure_size, 1>(pressure_index, 0);
111 for (std::size_t ip(0); ip < n_integration_points; ++ip)
113 auto const& ip_data = _ip_data[ip];
114 auto const& N = ip_data.N;
115 auto const& dNdx = ip_data.dNdx;
116 auto const& w = ip_data.integration_weight;
118 double C_int_pt = 0.0;
119 double p_int_pt = 0.0;
125 .template value<double>(vars, pos, t, dt);
127 double const dSw_dpc =
129 .template dValue<double>(
141 auto const specific_storage =
143 .template value<double>(vars, pos, t, dt);
146 auto const porosity =
148 .template value<double>(vars, pos, t, dt);
150 auto const retardation_factor =
152 .template value<double>(vars, pos, t, dt);
154 auto const solute_dispersivity_transverse =
156 .template value<double>(vars, pos, t, dt);
157 auto const solute_dispersivity_longitudinal =
159 .template value<double>(vars, pos, t, dt);
163 .template value<double>(vars, pos, t, dt);
166 auto const decay_rate =
168 .template value<double>(vars, pos, t, dt);
169 auto const pore_diffusion_coefficient =
172 .value(vars, pos, t, dt));
180 .template value<double>(vars, pos, t, dt);
183 .template value<double>(vars, pos, t, dt);
184 auto const K_times_k_rel_over_mu = K * (k_rel / mu);
187 _process_data.has_gravity
189 (dNdx * p_nodal_values - density * b))
193 double const velocity_magnitude = velocity.norm();
195 velocity_magnitude != 0.0
197 porosity * pore_diffusion_coefficient +
198 solute_dispersivity_transverse * velocity_magnitude * I +
199 (solute_dispersivity_longitudinal -
200 solute_dispersivity_transverse) /
201 velocity_magnitude * velocity * velocity.transpose())
203 solute_dispersivity_transverse *
204 velocity_magnitude * I);
208 (dNdx.transpose() * hydrodynamic_dispersion * dNdx +
209 N.transpose() * velocity.transpose() * dNdx +
210 N.transpose() * decay_rate * porosity * retardation_factor * N) *
212 MCC.noalias() += w * N.transpose() * porosity * retardation_factor * N;
213 Kpp.noalias() += w * dNdx.transpose() * K_times_k_rel_over_mu * dNdx;
215 double const drhow_dp(0.0);
216 Mpp.noalias() += (specific_storage * Sw + porosity * Sw * drhow_dp -
217 porosity * dSw_dpc) *
218 ip_data.mass_operator;
220 if (_process_data.has_gravity)
222 Bp += w * density * dNdx.transpose() * K_times_k_rel_over_mu * b;
233 std::vector<GlobalVector*>
const& x,
234 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
235 std::vector<double>& cache)
const
237 unsigned const n_integration_points =
238 _integration_method.getNumberOfPoints();
240 constexpr int process_id = 0;
243 assert(!indices.empty());
244 auto const local_x = x[process_id]->get(indices);
248 Eigen::Matrix<double, GlobalDim, Eigen::Dynamic, Eigen::RowMajor>>(
249 cache, GlobalDim, n_integration_points);
257 auto const& medium = *_process_data.media_map.getMedium(_element_id);
258 auto const& phase = medium.phase(
"AqueousLiquid");
260 auto const p_nodal_values = Eigen::Map<const NodalVectorType>(
261 &local_x[ShapeFunction::NPOINTS], ShapeFunction::NPOINTS);
263 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
265 auto const& ip_data = _ip_data[ip];
266 auto const& N = ip_data.N;
267 auto const& dNdx = ip_data.dNdx;
269 auto const dt = std::numeric_limits<double>::quiet_NaN();
274 .template value<double>(vars, pos, t, dt);
276 double C_int_pt = 0.0;
277 double p_int_pt = 0.0;
283 .template value<double>(vars, pos, t, dt);
288 .template value<double>(vars, pos, t, dt);
290 cache_mat.col(ip).noalias() = -dNdx * p_nodal_values;
291 if (_process_data.has_gravity)
296 .template value<double>(vars, pos, t, dt);
297 auto const b = _process_data.specific_body_force;
299 cache_mat.col(ip).noalias() += rho_w * b;
301 cache_mat.col(ip).noalias() = k_rel / mu * (K * cache_mat.col(ip));
321 std::vector<GlobalVector*>
const& x,
322 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
323 std::vector<double>& cache)
const
330 auto const& medium = *_process_data.media_map.getMedium(_element_id);
332 unsigned const n_integration_points =
333 _integration_method.getNumberOfPoints();
335 constexpr int process_id = 0;
338 assert(!indices.empty());
339 auto const local_x = x[process_id]->get(indices);
343 Eigen::Matrix<double, 1, Eigen::Dynamic, Eigen::RowMajor>>(
344 cache, n_integration_points);
346 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
348 auto const& ip_data = _ip_data[ip];
349 auto const& N = ip_data.N;
351 double C_int_pt = 0.0;
352 double p_int_pt = 0.0;
357 auto const dt = std::numeric_limits<double>::quiet_NaN();
359 .template value<double>(vars, pos, t, dt);