55 double const t,
double const dt, std::vector<double>
const& local_x,
56 std::vector<double>
const& ,
57 std::vector<double>& local_M_data, std::vector<double>& local_K_data,
58 std::vector<double>& local_b_data)
60 auto const local_matrix_size = local_x.size();
63 assert(local_matrix_size == ShapeFunction::NPOINTS *
NUM_NODAL_DOF);
66 local_M_data, local_matrix_size, local_matrix_size);
68 local_K_data, local_matrix_size, local_matrix_size);
70 local_b_data, local_matrix_size);
72 unsigned const n_integration_points =
75 auto p_nodal_values = Eigen::Map<const NodalVectorType>(
83 GlobalDimMatrixType::Identity(GlobalDim, GlobalDim));
87 auto const& phase = medium.phase(
"AqueousLiquid");
88 auto const& component =
91 auto KCC = local_K.template block<concentration_size, concentration_size>(
93 auto MCC = local_M.template block<concentration_size, concentration_size>(
95 auto Kpp = local_K.template block<pressure_size, pressure_size>(
97 auto Mpp = local_M.template block<pressure_size, pressure_size>(
99 auto Bp = local_b.template block<pressure_size, 1>(
pressure_index, 0);
101 for (std::size_t ip(0); ip < n_integration_points; ++ip)
104 auto const& N = ip_data.N;
105 auto const& dNdx = ip_data.dNdx;
106 auto const& w = ip_data.integration_weight;
114 double C_int_pt = 0.0;
115 double p_int_pt = 0.0;
121 .template value<double>(vars, pos, t, dt);
123 double const dSw_dpc =
125 .template dValue<double>(
137 auto const specific_storage =
139 .template value<double>(vars, pos, t, dt);
142 auto const porosity =
144 .template value<double>(vars, pos, t, dt);
146 auto const retardation_factor =
148 .template value<double>(vars, pos, t, dt);
150 auto const solute_dispersivity_transverse =
152 .template value<double>(vars, pos, t, dt);
153 auto const solute_dispersivity_longitudinal =
155 .template value<double>(vars, pos, t, dt);
159 .template value<double>(vars, pos, t, dt);
162 auto const decay_rate =
164 .template value<double>(vars, pos, t, dt);
165 auto const pore_diffusion_coefficient =
168 .value(vars, pos, t, dt));
176 .template value<double>(vars, pos, t, dt);
179 .template value<double>(vars, pos, t, dt);
180 auto const K_times_k_rel_over_mu = K * (k_rel / mu);
185 (dNdx * p_nodal_values - density * b))
189 double const velocity_magnitude = velocity.norm();
191 velocity_magnitude != 0.0
193 porosity * pore_diffusion_coefficient +
194 solute_dispersivity_transverse * velocity_magnitude * I +
195 (solute_dispersivity_longitudinal -
196 solute_dispersivity_transverse) /
197 velocity_magnitude * velocity * velocity.transpose())
199 solute_dispersivity_transverse *
200 velocity_magnitude * I);
204 (dNdx.transpose() * hydrodynamic_dispersion * dNdx +
205 N.transpose() * velocity.transpose() * dNdx +
206 N.transpose() * decay_rate * porosity * retardation_factor * N) *
208 MCC.noalias() += w * N.transpose() * porosity * retardation_factor * N;
209 Kpp.noalias() += w * dNdx.transpose() * K_times_k_rel_over_mu * dNdx;
211 double const drhow_dp(0.0);
212 Mpp.noalias() += (specific_storage * Sw + porosity * Sw * drhow_dp -
213 porosity * dSw_dpc) *
214 ip_data.mass_operator;
218 Bp += w * density * dNdx.transpose() * K_times_k_rel_over_mu * b;
229 std::vector<GlobalVector*>
const& x,
230 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
231 std::vector<double>& cache)
const
233 unsigned const n_integration_points =
236 constexpr int process_id = 0;
239 assert(!indices.empty());
240 auto const local_x = x[process_id]->get(indices);
244 Eigen::Matrix<double, GlobalDim, Eigen::Dynamic, Eigen::RowMajor>>(
245 cache, GlobalDim, n_integration_points);
251 auto const& phase = medium.phase(
"AqueousLiquid");
253 auto const p_nodal_values = Eigen::Map<const NodalVectorType>(
254 &local_x[ShapeFunction::NPOINTS], ShapeFunction::NPOINTS);
256 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
259 auto const& N = ip_data.N;
260 auto const& dNdx = ip_data.dNdx;
268 auto const dt = std::numeric_limits<double>::quiet_NaN();
273 .template value<double>(vars, pos, t, dt);
275 double C_int_pt = 0.0;
276 double p_int_pt = 0.0;
280 vars.capillary_pressure = -p_int_pt;
282 .template value<double>(vars, pos, t, dt);
284 vars.liquid_saturation = Sw;
287 .template value<double>(vars, pos, t, dt);
289 cache_mat.col(ip).noalias() = -dNdx * p_nodal_values;
292 vars.concentration = C_int_pt;
293 vars.liquid_phase_pressure = p_int_pt;
295 .template value<double>(vars, pos, t, dt);
298 cache_mat.col(ip).noalias() += rho_w * b;
300 cache_mat.col(ip).noalias() = k_rel / mu * (K * cache_mat.col(ip));
320 std::vector<GlobalVector*>
const& x,
321 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
322 std::vector<double>& cache)
const
328 unsigned const n_integration_points =
331 constexpr int process_id = 0;
334 assert(!indices.empty());
335 auto const local_x = x[process_id]->get(indices);
339 Eigen::Matrix<double, 1, Eigen::Dynamic, Eigen::RowMajor>>(
340 cache, n_integration_points);
342 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
345 auto const& N = ip_data.N;
353 double C_int_pt = 0.0;
354 double p_int_pt = 0.0;
359 auto const dt = std::numeric_limits<double>::quiet_NaN();
361 .template value<double>(vars, pos, t, dt);