34template <
typename GlobalDimNodalMatrixType>
38 double const& integration_weight_)
44 GlobalDimNodalMatrixType
const dNdx;
51 double porosity = std::numeric_limits<double>::quiet_NaN();
66 std::size_t
const mesh_item_id,
67 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
68 std::vector<GlobalVector*>
const& x,
double const t)
70 std::vector<double> local_x_vec;
72 auto const n_processes = x.size();
73 for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
77 assert(!indices.empty());
78 auto const local_solution = x[process_id]->get(indices);
79 local_x_vec.insert(std::end(local_x_vec),
80 std::begin(local_solution),
81 std::end(local_solution));
89 std::size_t
const mesh_item_id,
90 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
91 std::vector<GlobalVector*>
const& x,
double const t,
double const dt)
93 std::vector<double> local_x_vec;
95 auto const n_processes = x.size();
96 for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
100 assert(!indices.empty());
101 auto const local_solution = x[process_id]->get(indices);
102 local_x_vec.insert(std::end(local_x_vec),
103 std::begin(local_solution),
104 std::end(local_solution));
112 std::size_t
const mesh_item_id,
113 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
114 std::vector<GlobalVector*>
const& x,
double const t,
double const dt,
117 std::vector<double> local_x_vec;
119 auto const n_processes = x.size();
120 for (std::size_t pcs_id = 0; pcs_id < n_processes; ++pcs_id)
124 assert(!indices.empty());
125 auto const local_solution = x[pcs_id]->get(indices);
126 local_x_vec.insert(std::end(local_x_vec),
127 std::begin(local_solution),
128 std::end(local_solution));
134 auto const num_r_c = indices.size();
136 std::vector<double> local_M_data;
137 local_M_data.reserve(num_r_c * num_r_c);
138 std::vector<double> local_K_data;
139 local_K_data.reserve(num_r_c * num_r_c);
140 std::vector<double> local_b_data;
141 local_b_data.reserve(num_r_c);
144 local_K_data, local_b_data,
147 auto const r_c_indices =
149 if (!local_M_data.empty())
153 M.
add(r_c_indices, local_M);
155 if (!local_K_data.empty())
159 K.
add(r_c_indices, local_K);
161 if (!local_b_data.empty())
163 b.
add(indices, local_b_data);
168 double const t,
double const dt) = 0;
171 std::size_t
const ele_id) = 0;
175 std::vector<GlobalVector*>
const& x,
176 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
177 std::vector<double>& cache)
const = 0;
181 std::vector<GlobalVector*>
const& x,
182 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
183 std::vector<double>& cache)
const = 0;
186 const double t, std::vector<GlobalVector*>
const& x,
187 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
188 std::vector<double>& cache,
int const component_id)
const = 0;
192 Eigen::VectorXd
const& ,
double const ) = 0;
199 double const t,
double const dt, Eigen::VectorXd
const& local_x,
200 std::vector<double>& local_M_data, std::vector<double>& local_K_data,
201 std::vector<double>& local_b_data,
int const transport_process_id) = 0;
204template <
typename ShapeFunction,
int GlobalDim>
216 ShapeFunction::NPOINTS;
222 typename ShapeMatricesType::template MatrixType<
pressure_size,
225 typename ShapeMatricesType::template VectorType<pressure_size>;
228 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
242 std::size_t
const local_matrix_size,
244 bool is_axially_symmetric,
246 std::vector<std::reference_wrapper<ProcessVariable>>
const&
247 transport_process_variables)
258 (void)local_matrix_size;
260 unsigned const n_integration_points =
262 _ip_data.reserve(n_integration_points);
267 double const aperture_size =
270 auto const shape_matrices =
272 GlobalDim>(element, is_axially_symmetric,
276 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
279 for (
unsigned ip = 0; ip < n_integration_points; ip++)
289 shape_matrices[ip].dNdx,
291 shape_matrices[ip].integralMeasure *
292 shape_matrices[ip].detJ * aperture_size);
296 .template initialValue<double>(
297 pos, std::numeric_limits<double>::quiet_NaN() );
307 auto& chemical_system_index_map =
308 _process_data.chemical_solver_interface->chemical_system_index_map;
310 unsigned const n_integration_points =
312 for (
unsigned ip = 0; ip < n_integration_points; ip++)
315 chemical_system_index_map.empty()
317 : chemical_system_index_map.back() + 1;
318 chemical_system_index_map.push_back(
324 double const t)
override
333 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
335 unsigned const n_integration_points =
338 for (
unsigned ip = 0; ip < n_integration_points; ip++)
341 auto const& N = Ns[ip];
342 auto const& chemical_system_id = ip_data.chemical_system_id;
352 std::vector<double> C_int_pt(n_component);
353 for (
unsigned component_id = 0; component_id < n_component;
356 auto const concentration_index =
360 local_x.template segment<concentration_size>(
361 concentration_index);
364 C_int_pt[component_id]);
368 ->initializeChemicalSystemConcrete(C_int_pt, chemical_system_id,
374 double const t,
double dt)
override
386 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
388 unsigned const n_integration_points =
391 for (
unsigned ip = 0; ip < n_integration_points; ip++)
394 auto const& N = Ns[ip];
395 auto& porosity = ip_data.porosity;
396 auto const& porosity_prev = ip_data.porosity_prev;
397 auto const& chemical_system_id = ip_data.chemical_system_id;
407 std::vector<double> C_int_pt(n_component);
409 for (
unsigned component_id = 0; component_id < n_component;
412 auto const concentration_index =
416 local_x.template segment<concentration_size>(
417 concentration_index);
420 C_int_pt[component_id]);
432 .template value<double>(vars, vars_prev, pos, t,
438 _process_data.chemical_solver_interface->setChemicalSystemConcrete(
439 C_int_pt, chemical_system_id, medium, vars, pos, t, dt);
444 double const dt)
override
451 auto const& medium = *
_process_data.media_map.getMedium(ele_id);
458 ip_data.porosity = ip_data.porosity_prev;
461 ->updateVolumeFractionPostReaction(ip_data.chemical_system_id,
463 ip_data.porosity, t, dt);
465 _process_data.chemical_solver_interface->updatePorosityPostReaction(
466 ip_data.chemical_system_id, medium, ip_data.porosity);
471 std::vector<double>
const& local_x,
472 std::vector<double>
const& ,
473 std::vector<double>& local_M_data,
474 std::vector<double>& local_K_data,
475 std::vector<double>& local_b_data)
override
477 auto const local_matrix_size = local_x.size();
482 assert(local_matrix_size == ShapeFunction::NPOINTS * num_nodal_dof);
485 local_M_data, local_matrix_size, local_matrix_size);
487 local_K_data, local_matrix_size, local_matrix_size);
489 local_b_data, local_matrix_size);
492 auto Kpp = local_K.template block<pressure_size, pressure_size>(
494 auto Mpp = local_M.template block<pressure_size, pressure_size>(
496 auto Bp = local_b.template segment<pressure_size>(
pressure_index);
498 auto local_p = Eigen::Map<const NodalVectorType>(
503 .projected_specific_body_force_vectors[
_element.getID()];
505 auto const number_of_components = num_nodal_dof - 1;
506 for (
int component_id = 0; component_id < number_of_components;
518 auto concentration_index =
522 local_K.template block<concentration_size, concentration_size>(
523 concentration_index, concentration_index);
525 local_M.template block<concentration_size, concentration_size>(
526 concentration_index, concentration_index);
528 local_M.template block<concentration_size, pressure_size>(
531 local_M.template block<pressure_size, concentration_size>(
534 auto local_C = Eigen::Map<const NodalVectorType>(
538 MCC, MCp, MpC, Kpp, Mpp, Bp);
542 auto const stoichiometric_matrix =
544 ->getStoichiometricMatrix();
546 assert(stoichiometric_matrix);
548 for (Eigen::SparseMatrix<double>::InnerIterator it(
549 *stoichiometric_matrix, component_id);
553 auto const stoichiometric_coefficient = it.value();
554 auto const coupled_component_id = it.row();
555 auto const kinetic_prefactor =
557 ->getKineticPrefactor(coupled_component_id);
559 auto const concentration_index =
561 auto const coupled_concentration_index =
566 concentration_index, coupled_concentration_index);
570 stoichiometric_coefficient,
580 Eigen::Ref<const NodalVectorType>
const& C_nodal_values,
581 Eigen::Ref<const NodalVectorType>
const& p_nodal_values,
582 Eigen::Ref<LocalBlockMatrixType> KCC,
583 Eigen::Ref<LocalBlockMatrixType> MCC,
584 Eigen::Ref<LocalBlockMatrixType> MCp,
585 Eigen::Ref<LocalBlockMatrixType> MpC,
586 Eigen::Ref<LocalBlockMatrixType> Kpp,
587 Eigen::Ref<LocalBlockMatrixType> Mpp,
588 Eigen::Ref<LocalSegmentVectorType> Bp)
590 unsigned const n_integration_points =
605 auto const& component = phase.component(
611 std::vector<GlobalDimVectorType> ip_flux_vector;
612 double average_velocity_norm = 0.0;
615 ip_flux_vector.reserve(n_integration_points);
620 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
622 for (
unsigned ip(0); ip < n_integration_points; ++ip)
625 auto const& dNdx = ip_data.dNdx;
626 auto const& N = Ns[ip];
627 auto const& w = ip_data.integration_weight;
628 auto& porosity = ip_data.porosity;
637 double C_int_pt = 0.0;
638 double p_int_pt = 0.0;
648 .template value<double>(vars, pos, t, dt);
651 auto const& retardation_factor =
653 .template value<double>(vars, pos, t, dt);
655 auto const& solute_dispersivity_transverse = medium.template value<
659 auto const& solute_dispersivity_longitudinal =
660 medium.template value<double>(
662 longitudinal_dispersivity);
669 .template value<double>(vars, pos, t, dt);
671 auto const decay_rate =
673 .template value<double>(vars, pos, t, dt);
675 auto const& pore_diffusion_coefficient =
678 .value(vars, pos, t, dt));
686 .template value<double>(vars, pos, t, dt);
692 .template value<double>(vars, pos, t, dt);
699 (dNdx * p_nodal_values - density * b))
702 const double drho_dp =
704 .template dValue<double>(
709 const double drho_dC =
711 .template dValue<double>(
718 pore_diffusion_coefficient, velocity, porosity,
719 solute_dispersivity_transverse,
720 solute_dispersivity_longitudinal);
722 const double R_times_phi(retardation_factor * porosity);
724 auto const N_t_N = (N.transpose() * N).eval();
728 MCp.noalias() += N_t_N * (C_int_pt * R_times_phi * drho_dp * w);
729 MCC.noalias() += N_t_N * (C_int_pt * R_times_phi * drho_dC * w);
730 KCC.noalias() -= dNdx.transpose() * mass_density_flow * N * w;
734 ip_flux_vector.emplace_back(mass_density_flow);
735 average_velocity_norm += velocity.norm();
737 MCC.noalias() += N_t_N * (R_times_phi * density * w);
738 KCC.noalias() += N_t_N * (decay_rate * R_times_phi * density * w);
739 KCC_Laplacian.noalias() +=
740 dNdx.transpose() * hydrodynamic_dispersion * dNdx * density * w;
742 MpC.noalias() += N_t_N * (porosity * drho_dC * w);
745 if (component_id == 0)
748 N_t_N * (porosity * drho_dp * w + density * storage * w);
750 dNdx.transpose() * K_over_mu * dNdx * (density * w);
754 Bp.noalias() += dNdx.transpose() * K_over_mu * b *
755 (density * density * w);
763 typename ShapeFunction::MeshElement>(
768 average_velocity_norm /
769 static_cast<double>(n_integration_points),
773 KCC.noalias() += KCC_Laplacian;
777 Eigen::Ref<LocalBlockMatrixType> KCmCn,
778 double const stoichiometric_coefficient,
779 double const kinetic_prefactor)
781 unsigned const n_integration_points =
790 auto const& component = phase.component(
795 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
797 for (
unsigned ip(0); ip < n_integration_points; ++ip)
800 auto const& w = ip_data.integration_weight;
801 auto const& N = Ns[ip];
802 auto& porosity = ip_data.porosity;
811 auto const retardation_factor =
813 .template value<double>(vars, pos, t, dt);
816 .template value<double>(vars, pos, t, dt);
820 .template value<double>(vars, pos, t, dt);
822 KCmCn.noalias() -= N.transpose() * N *
823 (stoichiometric_coefficient * kinetic_prefactor *
824 retardation_factor * porosity * density * w);
829 Eigen::VectorXd
const& local_x,
830 Eigen::VectorXd
const& local_x_prev,
831 int const process_id,
832 std::vector<double>& local_M_data,
833 std::vector<double>& local_K_data,
834 std::vector<double>& local_b_data)
override
839 local_M_data, local_K_data, local_b_data);
844 local_M_data, local_K_data,
851 local_M_data, local_K_data,
852 local_b_data, process_id);
858 Eigen::VectorXd
const& local_x,
859 Eigen::VectorXd
const& local_x_prev,
860 std::vector<double>& local_M_data,
861 std::vector<double>& local_K_data,
862 std::vector<double>& local_b_data)
866 auto const local_C = local_x.template segment<concentration_size>(
868 auto const local_C_prev =
880 unsigned const n_integration_points =
885 .projected_specific_body_force_vectors[
_element.getID()];
897 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
899 for (
unsigned ip(0); ip < n_integration_points; ++ip)
902 auto const& dNdx = ip_data.dNdx;
903 auto const& w = ip_data.integration_weight;
904 auto const& N = Ns[ip];
905 auto& porosity = ip_data.porosity;
906 auto const& porosity_prev = ip_data.porosity_prev;
915 double const C_int_pt = N.dot(local_C);
916 double const p_int_pt = N.dot(local_p);
917 double const T_int_pt = N.dot(local_T);
931 .template value<double>(vars, vars_prev, pos, t,
942 .template value<double>(vars, pos, t, dt);
948 .template value<double>(vars, pos, t, dt);
957 .template value<double>(vars, pos, t, dt);
961 const double drho_dp =
963 .template dValue<double>(
967 const double drho_dC =
969 .template dValue<double>(
976 (porosity * drho_dp * w + density * storage * w);
978 w * dNdx.transpose() * density * K_over_mu * dNdx;
983 w * density * density * dNdx.transpose() * K_over_mu * b;
988 double const C_dot = (C_int_pt - N.dot(local_C_prev)) / dt;
991 N.transpose() * (porosity * drho_dC * C_dot * w);
997 Eigen::VectorXd
const& local_x,
998 Eigen::VectorXd
const& ,
999 std::vector<double>& local_M_data,
1000 std::vector<double>& local_K_data,
1001 std::vector<double>& )
1004 assert(local_x.size() ==
1009 auto const local_p =
1012 auto const local_C = local_x.template segment<concentration_size>(
1021 auto const& medium =
1022 *process_data.media_map.getMedium(this->
_element.getID());
1023 auto const& liquid_phase =
1028 .projected_specific_body_force_vectors[
_element.getID()];
1032 unsigned const n_integration_points =
1035 std::vector<GlobalDimVectorType> ip_flux_vector;
1036 double average_velocity_norm = 0.0;
1037 ip_flux_vector.reserve(n_integration_points);
1041 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
1043 for (
unsigned ip(0); ip < n_integration_points; ip++)
1045 auto const& ip_data = this->
_ip_data[ip];
1046 auto const& dNdx = ip_data.dNdx;
1047 auto const& w = ip_data.integration_weight;
1048 auto const& N = Ns[ip];
1057 double p_at_xi = 0.;
1059 double T_at_xi = 0.;
1061 double const C_int_pt = N.dot(local_C);
1068 auto const porosity =
1070 .template value<double>(vars, pos, t, dt);
1075 auto const fluid_density =
1078 .template value<double>(vars, pos, t, dt);
1080 auto const specific_heat_capacity_fluid =
1083 .template value<double>(vars, pos, t, dt);
1086 local_M.noalias() +=
1089 specific_heat_capacity_fluid,
1094 auto const viscosity =
1097 .template value<double>(vars, pos, t, dt);
1099 auto const intrinsic_permeability =
1104 .value(vars, pos, t, dt));
1107 intrinsic_permeability / viscosity;
1109 process_data.has_gravity
1111 (dNdx * local_p - fluid_density * b))
1116 vars, fluid_density, specific_heat_capacity_fluid, velocity,
1119 local_K.noalias() +=
1120 w * dNdx.transpose() * thermal_conductivity_dispersivity * dNdx;
1122 ip_flux_vector.emplace_back(velocity * fluid_density *
1123 specific_heat_capacity_fluid);
1124 average_velocity_norm += velocity.norm();
1128 process_data.stabilizer, this->_ip_data,
1130 average_velocity_norm /
static_cast<double>(n_integration_points),
1135 double const t,
double const dt, Eigen::VectorXd
const& local_x,
1136 Eigen::VectorXd
const& local_x_prev, std::vector<double>& local_M_data,
1137 std::vector<double>& local_K_data,
1138 std::vector<double>& ,
int const transport_process_id)
1140 assert(
static_cast<int>(local_x.size()) ==
1146 auto const local_p =
1151 auto const local_C = local_x.template segment<concentration_size>(
1153 (transport_process_id - (
_process_data.isothermal ? 1 : 2)) *
1155 auto const local_p_prev =
1166 unsigned const n_integration_points =
1169 std::vector<GlobalDimVectorType> ip_flux_vector;
1170 double average_velocity_norm = 0.0;
1173 ip_flux_vector.reserve(n_integration_points);
1178 .projected_specific_body_force_vectors[
_element.getID()];
1183 auto const& medium =
1187 auto const component_id =
1189 auto const& component = phase.component(
1194 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
1196 for (
unsigned ip(0); ip < n_integration_points; ++ip)
1199 auto const& dNdx = ip_data.dNdx;
1200 auto const& w = ip_data.integration_weight;
1201 auto const& N = Ns[ip];
1202 auto& porosity = ip_data.porosity;
1203 auto const& porosity_prev = ip_data.porosity_prev;
1212 double const C_int_pt = N.dot(local_C);
1213 double const p_int_pt = N.dot(local_p);
1214 double const T_int_pt = N.dot(local_T);
1222 vars_prev.
porosity = porosity_prev;
1228 .template value<double>(vars, vars_prev, pos, t,
1234 auto const& retardation_factor =
1236 .template value<double>(vars, pos, t, dt);
1238 auto const& solute_dispersivity_transverse = medium.template value<
1241 auto const& solute_dispersivity_longitudinal =
1242 medium.template value<double>(
1244 longitudinal_dispersivity);
1247 auto const density =
1249 .template value<double>(vars, pos, t, dt);
1250 auto const decay_rate =
1252 .template value<double>(vars, pos, t, dt);
1254 auto const& pore_diffusion_coefficient =
1257 .value(vars, pos, t, dt));
1264 .template value<double>(vars, pos, t, dt);
1270 (dNdx * local_p - density * b))
1276 pore_diffusion_coefficient, velocity, porosity,
1277 solute_dispersivity_transverse,
1278 solute_dispersivity_longitudinal);
1280 double const R_times_phi = retardation_factor * porosity;
1281 auto const N_t_N = (N.transpose() * N).eval();
1285 const double drho_dC =
1287 .template dValue<double>(
1290 local_M.noalias() +=
1291 N_t_N * (R_times_phi * C_int_pt * drho_dC * w);
1294 local_M.noalias() += N_t_N * (R_times_phi * density * w);
1299 double const p_dot = (p_int_pt - N.dot(local_p_prev)) / dt;
1301 const double drho_dp =
1303 .template dValue<double>(vars,
1305 liquid_phase_pressure,
1308 local_K.noalias() +=
1309 N_t_N * ((R_times_phi * drho_dp * p_dot) * w) -
1310 dNdx.transpose() * velocity * N * (density * w);
1314 ip_flux_vector.emplace_back(velocity * density);
1315 average_velocity_norm += velocity.norm();
1317 local_K.noalias() +=
1318 N_t_N * (decay_rate * R_times_phi * density * w);
1320 KCC_Laplacian.noalias() += dNdx.transpose() *
1321 hydrodynamic_dispersion * dNdx *
1328 typename ShapeFunction::MeshElement>(
1331 average_velocity_norm /
1332 static_cast<double>(n_integration_points),
1335 local_K.noalias() += KCC_Laplacian;
1339 double const t,
double const dt, Eigen::VectorXd
const& local_x,
1340 Eigen::VectorXd
const& local_x_prev,
int const process_id,
1341 std::vector<double>& local_b_data,
1342 std::vector<double>& local_Jac_data)
override
1347 local_b_data, local_Jac_data);
1351 int const component_id = process_id - 1;
1353 t, dt, local_x, local_x_prev, local_b_data, local_Jac_data,
1359 double const t,
double const dt, Eigen::VectorXd
const& local_x,
1360 Eigen::VectorXd
const& local_x_prev, std::vector<double>& local_b_data,
1361 std::vector<double>& local_Jac_data)
1363 auto const p = local_x.template segment<pressure_size>(
pressure_index);
1364 auto const c = local_x.template segment<concentration_size>(
1376 unsigned const n_integration_points =
1381 .projected_specific_body_force_vectors[
_element.getID()];
1383 auto const& medium =
1393 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
1395 for (
unsigned ip(0); ip < n_integration_points; ++ip)
1398 auto const& dNdx = ip_data.dNdx;
1399 auto const& w = ip_data.integration_weight;
1400 auto const& N = Ns[ip];
1401 auto& phi = ip_data.porosity;
1402 auto const& phi_prev = ip_data.porosity_prev;
1411 double const p_ip = N.dot(p);
1412 double const c_ip = N.dot(c);
1414 double const cdot_ip = (c_ip - N.dot(c_prev)) / dt;
1426 .template value<double>(vars, vars_prev, pos, t,
1433 .template value<double>(vars, pos, t, dt);
1440 .template value<double>(vars, pos, t, dt);
1442 auto const drho_dp =
1444 .template dValue<double>(
1448 auto const drho_dc =
1450 .template dValue<double>(
1455 local_Jac.noalias() +=
1456 N.transpose() * N * (phi * drho_dp / dt * w) +
1457 w * dNdx.transpose() * rho * k / mu * dNdx;
1459 local_rhs.noalias() -=
1460 N.transpose() * (drho_dp * N * p_prev + drho_dc * cdot_ip) *
1462 dNdx.transpose() * k / mu * dNdx * p * (rho * w);
1466 local_rhs.noalias() +=
1467 w * rho * dNdx.transpose() * k / mu * rho * b;
1473 double const t,
double const dt, Eigen::VectorXd
const& local_x,
1474 Eigen::VectorXd
const& local_x_prev, std::vector<double>& local_b_data,
1475 std::vector<double>& local_Jac_data,
int const component_id)
1477 auto const concentration_index =
1480 auto const p = local_x.template segment<pressure_size>(
pressure_index);
1482 local_x.template segment<concentration_size>(concentration_index);
1496 unsigned const n_integration_points =
1499 std::vector<GlobalDimVectorType> ip_flux_vector;
1500 double average_velocity_norm = 0.0;
1501 ip_flux_vector.reserve(n_integration_points);
1505 .projected_specific_body_force_vectors[
_element.getID()];
1510 auto const& medium =
1514 auto const& component = phase.component(
1519 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
1521 for (
unsigned ip(0); ip < n_integration_points; ++ip)
1524 auto const& dNdx = ip_data.dNdx;
1525 auto const& w = ip_data.integration_weight;
1526 auto const& N = Ns[ip];
1527 auto& phi = ip_data.porosity;
1528 auto const& phi_prev = ip_data.porosity_prev;
1537 double const p_ip = N.dot(p);
1538 double const c_ip = N.dot(c);
1551 .template value<double>(vars, vars_prev, pos, t,
1559 .template value<double>(vars, pos, t, dt);
1561 auto const alpha_T = medium.template value<double>(
1563 auto const alpha_L = medium.template value<double>(
1567 .template value<double>(vars, pos, t, dt);
1571 .template value<double>(vars, pos, t, dt);
1575 .value(vars, pos, t, dt));
1581 .template value<double>(vars, pos, t, dt);
1593 local_Jac.noalias() +=
1594 N.transpose() * N * (rho * phi * R * (alpha + 1 / dt) * w);
1596 KCC_Laplacian.noalias() += w * rho * dNdx.transpose() * D * dNdx;
1598 auto const cdot = (c - c_prev) / dt;
1599 local_rhs.noalias() -=
1600 N.transpose() * N * (cdot + alpha * c) * (rho * phi * R * w);
1602 ip_flux_vector.emplace_back(q * rho);
1603 average_velocity_norm += q.norm();
1609 average_velocity_norm /
static_cast<double>(n_integration_points),
1612 local_rhs.noalias() -= KCC_Laplacian * c;
1614 local_Jac.noalias() += KCC_Laplacian;
1618 double const t,
double const dt, Eigen::VectorXd
const& local_x,
1619 std::vector<double>& local_M_data, std::vector<double>& local_K_data,
1620 std::vector<double>& local_b_data,
1621 int const transport_process_id)
override
1623 auto const local_C = local_x.template segment<concentration_size>(
1634 unsigned const n_integration_points =
1640 auto const& medium =
1642 auto const component_id = transport_process_id - 1;
1646 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
1648 for (
unsigned ip(0); ip < n_integration_points; ++ip)
1651 auto const w = ip_data.integration_weight;
1652 auto const& N = Ns[ip];
1653 auto& porosity = ip_data.porosity;
1654 auto const& porosity_prev = ip_data.porosity_prev;
1655 auto const chemical_system_id = ip_data.chemical_system_id;
1664 double C_int_pt = 0.0;
1669 auto const porosity_dot = (porosity - porosity_prev) / dt;
1673 vars_prev.
porosity = porosity_prev;
1679 .template value<double>(vars, vars_prev, pos, t,
1683 local_M.noalias() += w * N.transpose() * porosity * N;
1685 local_K.noalias() += w * N.transpose() * porosity_dot * N;
1687 if (chemical_system_id == -1)
1692 auto const C_post_int_pt =
1694 component_id, chemical_system_id);
1696 local_b.noalias() += N.transpose() * ((C_post_int_pt - C_int_pt) /
1703 std::vector<GlobalVector*>
const& x,
1704 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
1705 std::vector<double>& cache)
const override
1707 assert(x.size() == dof_table.size());
1709 auto const n_processes = x.size();
1710 std::vector<std::vector<double>> local_x;
1711 local_x.reserve(n_processes);
1713 for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
1715 auto const indices =
1717 assert(!indices.empty());
1718 local_x.push_back(x[process_id]->get(indices));
1722 if (n_processes == 1)
1724 auto const local_p = Eigen::Map<const NodalVectorType>(
1726 auto const local_C = Eigen::Map<const NodalVectorType>(
1729 local_T.setConstant(ShapeFunction::NPOINTS,
1730 std::numeric_limits<double>::quiet_NaN());
1735 local_T = Eigen::Map<const NodalVectorType>(
1744 constexpr int pressure_process_id = 0;
1745 int concentration_process_id = 1;
1748 int temperature_process_id = -1;
1754 temperature_process_id = 1;
1756 concentration_process_id = 2;
1759 auto const local_p = Eigen::Map<const NodalVectorType>(
1761 auto const local_C = Eigen::Map<const NodalVectorType>(
1764 local_T.setConstant(ShapeFunction::NPOINTS,
1765 std::numeric_limits<double>::quiet_NaN());
1766 if (temperature_process_id != -1)
1768 local_T = Eigen::Map<const NodalVectorType>(
1778 Eigen::Ref<const NodalVectorType>
const& p_nodal_values,
1779 Eigen::Ref<const NodalVectorType>
const& C_nodal_values,
1780 Eigen::Ref<const NodalVectorType>
const& T_nodal_values,
1781 std::vector<double>& cache)
const
1783 auto const n_integration_points =
1788 cache, n_integration_points);
1795 auto const& medium =
1802 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
1804 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
1806 auto const& N = Ns[ip];
1808 double C_int_pt = 0.0;
1809 double p_int_pt = 0.0;
1810 double T_int_pt = 0.0;
1822 double const dt = std::numeric_limits<double>::quiet_NaN();
1825 .template value<double>(vars, pos, t, dt);
1826 cache_vec[ip] = rho_w;
1834 std::vector<GlobalVector*>
const& x,
1835 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
1836 std::vector<double>& cache)
const override
1838 assert(x.size() == dof_table.size());
1840 auto const n_processes = x.size();
1841 std::vector<std::vector<double>> local_x;
1842 local_x.reserve(n_processes);
1844 for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
1846 auto const indices =
1848 assert(!indices.empty());
1849 local_x.push_back(x[process_id]->get(indices));
1853 if (n_processes == 1)
1855 auto const local_p = Eigen::Map<const NodalVectorType>(
1857 auto const local_C = Eigen::Map<const NodalVectorType>(
1860 local_T.setConstant(ShapeFunction::NPOINTS,
1861 std::numeric_limits<double>::quiet_NaN());
1866 local_T = Eigen::Map<const NodalVectorType>(
1875 constexpr int pressure_process_id = 0;
1876 int concentration_process_id = 1;
1879 int temperature_process_id = -1;
1885 temperature_process_id = 1;
1887 concentration_process_id = 2;
1890 auto const local_p = Eigen::Map<const NodalVectorType>(
1892 auto const local_C = Eigen::Map<const NodalVectorType>(
1895 local_T.setConstant(ShapeFunction::NPOINTS,
1896 std::numeric_limits<double>::quiet_NaN());
1897 if (temperature_process_id != -1)
1899 local_T = Eigen::Map<const NodalVectorType>(
1909 Eigen::Ref<const NodalVectorType>
const& p_nodal_values,
1910 Eigen::Ref<const NodalVectorType>
const& C_nodal_values,
1911 Eigen::Ref<const NodalVectorType>
const& T_nodal_values,
1912 std::vector<double>& cache)
const
1914 auto const n_integration_points =
1919 Eigen::Matrix<double, GlobalDim, Eigen::Dynamic, Eigen::RowMajor>>(
1920 cache, GlobalDim, n_integration_points);
1924 .projected_specific_body_force_vectors[
_element.getID()];
1928 auto const& medium =
1935 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
1937 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
1939 auto const& ip_data =
_ip_data[ip];
1940 auto const& dNdx = ip_data.dNdx;
1941 auto const& N = Ns[ip];
1942 auto const& porosity = ip_data.porosity;
1951 double C_int_pt = 0.0;
1952 double p_int_pt = 0.0;
1953 double T_int_pt = 0.0;
1966 double const dt = std::numeric_limits<double>::quiet_NaN();
1971 .template value<double>(vars, pos, t, dt);
1974 cache_mat.col(ip).noalias() = -K_over_mu * dNdx * p_nodal_values;
1979 .template value<double>(vars, pos, t, dt);
1981 cache_mat.col(ip).noalias() += K_over_mu * rho_w * b;
1989 const unsigned integration_point)
const override
1991 auto const& N =
_process_data.shape_matrix_cache.NsHigherOrder<
1992 typename ShapeFunction::MeshElement>()[integration_point];
1995 return Eigen::Map<const Eigen::RowVectorXd>(N.data(), N.size());
2000 std::vector<double>
const& local_x)
const override
2002 auto const local_p = Eigen::Map<const NodalVectorType>(
2004 auto const local_C = Eigen::Map<const NodalVectorType>(
2010 auto const shape_matrices =
2014 std::array{pnt_local_coords})[0];
2024 .projected_specific_body_force_vectors[
_element.getID()];
2028 auto const& medium =
2044 double const dt = std::numeric_limits<double>::quiet_NaN();
2050 .template value<double>(vars, pos, t, dt);
2055 .template value<double>(vars, pos, t, dt);
2058 q += K_over_mu * rho_w * b;
2060 Eigen::Vector3d flux(0.0, 0.0, 0.0);
2061 flux.head<GlobalDim>() = rho_w * q;
2068 Eigen::VectorXd
const& local_x,
2069 Eigen::VectorXd
const& )
override
2071 auto const local_p =
2073 auto const local_C = local_x.template segment<concentration_size>(
2077 std::vector<double> ele_velocity;
2080 auto const n_integration_points =
2082 auto const ele_velocity_mat =
2085 auto const ele_id =
_element.getID();
2086 Eigen::Map<LocalVectorType>(
2089 ele_velocity_mat.rowwise().sum() / n_integration_points;
2095 auto const& medium = *
_process_data.media_map.getMedium(ele_id);
2098 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
2100 double permeability_avg = 0.0;
2101 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
2103 auto const& ip_data =
_ip_data[ip];
2104 auto const& N = Ns[ip];
2106 double C_int_pt = 0.0;
2109 double p_int_pt = 0.0;
2112 double T_int_pt = 0.0;
2127 double const dt = std::numeric_limits<double>::quiet_NaN();
2128 auto const permeability_tensor =
2131 .value(vars, pos, t, dt));
2132 permeability_avg += permeability_tensor.trace() / GlobalDim;
2135 permeability_avg / n_integration_points;
2144 std::size_t
const ele_id)
override
2146 auto const n_integration_points =
2151 auto const& medium = *
_process_data.media_map.getMedium(ele_id);
2155 ip_data.porosity = ip_data.porosity_prev;
2158 ->updatePorosityPostReaction(ip_data.chemical_system_id,
2159 medium, ip_data.porosity);
2165 std::vector<GlobalIndexType> chemical_system_indices;
2166 chemical_system_indices.reserve(n_integration_points);
2168 std::back_inserter(chemical_system_indices),
2169 [](
auto const& ip_data)
2170 { return ip_data.chemical_system_id; });
2172 _process_data.chemical_solver_interface->computeSecondaryVariable(
2173 ele_id, chemical_system_indices);
2177 const double t, std::vector<GlobalVector*>
const& x,
2178 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
2179 std::vector<double>& cache,
int const component_id)
const override
2181 std::vector<double> local_x_vec;
2183 auto const n_processes = x.size();
2184 for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
2186 auto const indices =
2188 assert(!indices.empty());
2189 auto const local_solution = x[process_id]->get(indices);
2190 local_x_vec.insert(std::end(local_x_vec),
2191 std::begin(local_solution),
2192 std::end(local_solution));
2196 auto const p = local_x.template segment<pressure_size>(
pressure_index);
2197 auto const c = local_x.template segment<concentration_size>(
2200 auto const n_integration_points =
2205 Eigen::Matrix<double, GlobalDim, Eigen::Dynamic, Eigen::RowMajor>>(
2206 cache, GlobalDim, n_integration_points);
2210 .projected_specific_body_force_vectors[
_element.getID()];
2214 auto const& medium =
2219 auto const& component = phase.component(
2224 .NsHigherOrder<
typename ShapeFunction::MeshElement>();
2226 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
2228 auto const& ip_data =
_ip_data[ip];
2229 auto const& dNdx = ip_data.dNdx;
2230 auto const& N = Ns[ip];
2231 auto const& phi = ip_data.porosity;
2240 double const p_ip = N.dot(p);
2241 double const c_ip = N.dot(c);
2247 double const dt = std::numeric_limits<double>::quiet_NaN();
2253 .template value<double>(vars, pos, t, dt);
2255 .template value<double>(vars, pos, t, dt);
2263 auto const alpha_T = medium.template value<double>(
2265 auto const alpha_L = medium.template value<double>(
2269 .value(vars, pos, t, dt));
2276 cache_mat.col(ip).noalias() = q * c_ip - D * dNdx * c;
2283 Eigen::VectorXd
const& ,
2284 double const ,
double const ,
2285 int const )
override
2287 unsigned const n_integration_points =
2290 for (
unsigned ip = 0; ip < n_integration_points; ip++)
2301 auto const n_integration_points =
2305 [](
double const s,
auto const& ip)
2306 { return s + ip.porosity; }) /
2307 n_integration_points;
2314 std::vector<std::reference_wrapper<ProcessVariable>>
const
2317 std::vector<IntegrationPointData<GlobalDimNodalMatrixType>>
_ip_data;
2321 const double fluid_density,
const double specific_heat_capacity_fluid,
2325 auto const& medium =
2327 auto const& solid_phase =
2330 auto const specific_heat_capacity_solid =
2334 .template value<double>(vars, pos, t, dt);
2336 auto const solid_density =
2338 .template value<double>(vars, pos, t, dt);
2340 return solid_density * specific_heat_capacity_solid * (1 - porosity) +
2341 fluid_density * specific_heat_capacity_fluid * porosity;
2346 const double fluid_density,
const double specific_heat_capacity_fluid,
2351 auto const& medium =
2354 auto thermal_conductivity =
2359 .value(vars, pos, t, dt));
2361 auto const thermal_dispersivity_transversal =
2364 thermal_transversal_dispersivity)
2365 .template value<double>();
2367 auto const thermal_dispersivity_longitudinal =
2370 thermal_longitudinal_dispersivity)
2371 .template value<double>();
2376 return thermal_conductivity +
2377 fluid_density * specific_heat_capacity_fluid *
2380 GlobalDimMatrixType::Zero(GlobalDim, GlobalDim),
2381 velocity, 0 , thermal_dispersivity_transversal,
2382 thermal_dispersivity_longitudinal);
2386 Eigen::VectorXd
const& local_x)
const
2393 local_T =
_process_data.temperature->getNodalValuesOnElement(
Interface for coupling OpenGeoSys with an external geochemical solver.
MathLib::EigenMatrix GlobalMatrix
MathLib::EigenVector GlobalVector
GlobalMatrix::IndexType GlobalIndexType
EigenFixedShapeMatrixPolicy< ShapeFunction, GlobalDim > ShapeMatrixPolicyType
double liquid_phase_pressure
int add(IndexType row, IndexType col, double val)
void add(IndexType rowId, double v)
add entry
std::size_t getID() const
Returns the ID of the element.
MathLib::RowColumnIndices< GlobalIndexType > RowColumnIndices
void setCoordinates(MathLib::Point3d const &coordinates)
void setElementID(std::size_t element_id)
virtual std::vector< double > const & getIntPtLiquidDensity(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const =0
virtual std::vector< double > const & getIntPtDarcyVelocity(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const =0
virtual void setChemicalSystemConcrete(Eigen::VectorXd const &, double const, double const)=0
virtual void postSpeciationCalculation(std::size_t const ele_id, double const t, double const dt)=0
virtual void computeReactionRelatedSecondaryVariable(std::size_t const ele_id)=0
virtual void setChemicalSystemID(std::size_t const)=0
void initializeChemicalSystem(std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, double const t)
void setChemicalSystem(std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, double const t, double const dt)
virtual void assembleReactionEquationConcrete(double const t, double const dt, Eigen::VectorXd const &local_x, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data, int const transport_process_id)=0
void assembleReactionEquation(std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, double const t, double const dt, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, int const process_id)
virtual void initializeChemicalSystemConcrete(Eigen::VectorXd const &, double const)=0
virtual std::vector< double > const & getIntPtMolarFlux(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache, int const component_id) const =0
ComponentTransportLocalAssemblerInterface()=default
NodalVectorType getLocalTemperature(double const t, Eigen::VectorXd const &local_x) const
typename ShapeMatricesType::GlobalDimVectorType GlobalDimVectorType
void assembleForStaggeredScheme(double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, int const process_id, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data) override
typename ShapeMatricesType::ShapeMatrices ShapeMatrices
MeshLib::Element const & _element
std::vector< double > const & getIntPtLiquidDensity(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override
void assembleWithJacobianHydraulicEquation(double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
const int first_concentration_index
void assembleHeatTransportEquation(double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &)
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > LocalMatrixType
void postTimestepConcrete(Eigen::VectorXd const &, Eigen::VectorXd const &, double const, double const, int const) override
std::vector< double > const & getIntPtMolarFlux(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< double > &cache, int const component_id) const override
void postSpeciationCalculation(std::size_t const ele_id, double const t, double const dt) override
NumLib::GenericIntegrationMethod const & _integration_method
std::vector< double > const & calculateIntPtDarcyVelocity(const double t, Eigen::Ref< const NodalVectorType > const &p_nodal_values, Eigen::Ref< const NodalVectorType > const &C_nodal_values, Eigen::Ref< const NodalVectorType > const &T_nodal_values, std::vector< double > &cache) const
void initializeChemicalSystemConcrete(Eigen::VectorXd const &local_x, double const t) override
void computeReactionRelatedSecondaryVariable(std::size_t const ele_id) override
void assembleBlockMatrices(GlobalDimVectorType const &b, int const component_id, double const t, double const dt, Eigen::Ref< const NodalVectorType > const &C_nodal_values, Eigen::Ref< const NodalVectorType > const &p_nodal_values, Eigen::Ref< LocalBlockMatrixType > KCC, Eigen::Ref< LocalBlockMatrixType > MCC, Eigen::Ref< LocalBlockMatrixType > MCp, Eigen::Ref< LocalBlockMatrixType > MpC, Eigen::Ref< LocalBlockMatrixType > Kpp, Eigen::Ref< LocalBlockMatrixType > Mpp, Eigen::Ref< LocalSegmentVectorType > Bp)
typename ShapeMatricesType::template MatrixType< pressure_size, pressure_size > LocalBlockMatrixType
typename ShapeMatricesType::GlobalDimMatrixType GlobalDimMatrixType
void updateAveragePorosity(std::size_t const ele_id)
void assembleWithJacobianForStaggeredScheme(double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, int const process_id, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data) override
static const int temperature_size
std::vector< IntegrationPointData< GlobalDimNodalMatrixType > > _ip_data
ComponentTransportProcessData const & _process_data
Eigen::Map< const Eigen::RowVectorXd > getShapeMatrix(const unsigned integration_point) const override
Provides the shape matrix at the given integration point.
ShapeMatrixPolicyType< ShapeFunction, GlobalDim > ShapeMatricesType
void computeSecondaryVariableConcrete(double const t, double const, Eigen::VectorXd const &local_x, Eigen::VectorXd const &) override
std::vector< std::reference_wrapper< ProcessVariable > > const _transport_process_variables
void assembleHydraulicEquation(double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data)
typename ShapeMatricesType::GlobalDimNodalMatrixType GlobalDimNodalMatrixType
typename ShapeMatricesType::NodalRowVectorType NodalRowVectorType
std::vector< double > const & getIntPtDarcyVelocity(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override
const int temperature_index
static const int concentration_size
void assembleComponentTransportEquation(double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &, int const transport_process_id)
std::vector< double > const & calculateIntPtLiquidDensity(const double t, Eigen::Ref< const NodalVectorType > const &p_nodal_values, Eigen::Ref< const NodalVectorType > const &C_nodal_values, Eigen::Ref< const NodalVectorType > const &T_nodal_values, std::vector< double > &cache) const
Eigen::Vector3d getFlux(MathLib::Point3d const &pnt_local_coords, double const t, std::vector< double > const &local_x) const override
GlobalDimMatrixType getThermalConductivityDispersivity(MaterialPropertyLib::VariableArray const &vars, const double fluid_density, const double specific_heat_capacity_fluid, const GlobalDimVectorType &velocity, ParameterLib::SpatialPosition const &pos, double const t, double const dt)
void assemble(double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data) override
void assembleWithJacobianComponentTransportEquation(double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data, int const component_id)
Eigen::Matrix< double, Eigen::Dynamic, 1 > LocalVectorType
static const int pressure_size
double getHeatEnergyCoefficient(MaterialPropertyLib::VariableArray const &vars, const double porosity, const double fluid_density, const double specific_heat_capacity_fluid, ParameterLib::SpatialPosition const &pos, double const t, double const dt)
void assembleReactionEquationConcrete(double const t, double const dt, Eigen::VectorXd const &local_x, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data, int const transport_process_id) override
LocalAssemblerData(MeshLib::Element const &element, std::size_t const local_matrix_size, NumLib::GenericIntegrationMethod const &integration_method, bool is_axially_symmetric, ComponentTransportProcessData const &process_data, std::vector< std::reference_wrapper< ProcessVariable > > const &transport_process_variables)
typename ShapeMatricesType::template VectorType< pressure_size > LocalSegmentVectorType
void assembleKCmCn(int const component_id, double const t, double const dt, Eigen::Ref< LocalBlockMatrixType > KCmCn, double const stoichiometric_coefficient, double const kinetic_prefactor)
static const int pressure_index
void setChemicalSystemConcrete(Eigen::VectorXd const &local_x, double const t, double dt) override
void setChemicalSystemID(std::size_t const) override
typename ShapeMatricesType::NodalVectorType NodalVectorType
constexpr Eigen::Matrix< double, GlobalDim, GlobalDim > formEigenTensor(MaterialPropertyLib::PropertyDataType const &values)
@ longitudinal_dispersivity
used to compute the hydrodynamic dispersion tensor.
@ transversal_dispersivity
used to compute the hydrodynamic dispersion tensor.
@ retardation_factor
specify retardation factor used in component transport process.
Eigen::Map< Vector > createZeroedVector(std::vector< double > &data, Eigen::VectorXd::Index size)
Eigen::Map< const Vector > toVector(std::vector< double > const &data, Eigen::VectorXd::Index size)
Creates an Eigen mapped vector from the given data vector.
Eigen::Map< Matrix > createZeroedMatrix(std::vector< double > &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)
Eigen::Map< const Matrix > toMatrix(std::vector< double > const &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)
void shapeFunctionInterpolate(const NodalValues &, const ShapeMatrix &)
void assembleAdvectionMatrix(IPData const &ip_data_vector, NumLib::ShapeMatrixCache const &shape_matrix_cache, std::vector< FluxVectorType > const &ip_flux_vector, Eigen::MatrixBase< Derived > &laplacian_matrix)
std::vector< GlobalIndexType > getIndices(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table)
std::vector< typename ShapeMatricesType::ShapeMatrices, Eigen::aligned_allocator< typename ShapeMatricesType::ShapeMatrices > > initShapeMatrices(MeshLib::Element const &e, bool const is_axially_symmetric, IntegrationMethod const &integration_method)
std::vector< typename ShapeMatricesType::ShapeMatrices, Eigen::aligned_allocator< typename ShapeMatricesType::ShapeMatrices > > computeShapeMatrices(MeshLib::Element const &e, bool const is_axially_symmetric, PointContainer const &points)
Eigen::MatrixXd computeHydrodynamicDispersion(NumericalStabilization const &stabilizer, std::size_t const element_id, Eigen::MatrixXd const &pore_diffusion_coefficient, Eigen::VectorXd const &velocity, double const porosity, double const solute_dispersivity_transverse, double const solute_dispersivity_longitudinal)
std::array< double, 3 > interpolateCoordinates(MeshLib::Element const &e, typename ShapeMatricesType::ShapeMatrices::ShapeType const &N)
NumLib::ShapeMatrices< NodalRowVectorType, DimNodalMatrixType, DimMatrixType, GlobalDimNodalMatrixType > ShapeMatrices
MatrixType< GlobalDim, ShapeFunction::NPOINTS > GlobalDimNodalMatrixType
MatrixType< GlobalDim, GlobalDim > GlobalDimMatrixType
VectorType< GlobalDim > GlobalDimVectorType
VectorType< ShapeFunction::NPOINTS > NodalVectorType
RowVectorType< ShapeFunction::NPOINTS > NodalRowVectorType
GlobalIndexType chemical_system_id
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
GlobalDimNodalMatrixType const dNdx
IntegrationPointData(GlobalDimNodalMatrixType const &dNdx_, double const &integration_weight_)
double const integration_weight