OGS
ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim > Class Template Reference

Detailed Description

template<typename ShapeFunction, int GlobalDim>
class ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >

Definition at line 205 of file ComponentTransportFEM.h.

#include <ComponentTransportFEM.h>

Inheritance diagram for ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >:
[legend]
Collaboration diagram for ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >:
[legend]

Public Member Functions

 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)
void setChemicalSystemID (std::size_t const) override
void initializeChemicalSystemConcrete (Eigen::VectorXd const &local_x, double const t) override
void setChemicalSystemConcrete (Eigen::VectorXd const &local_x, double const t, double dt) override
void postSpeciationCalculation (std::size_t const ele_id, double const t, double const dt) override
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 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)
void assembleKCmCn (int const component_id, double const t, double const dt, Eigen::Ref< LocalBlockMatrixType > KCmCn, double const stoichiometric_coefficient, double const kinetic_prefactor)
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
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)
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 > &)
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)
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
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)
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)
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
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
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
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
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
Eigen::Map< const Eigen::RowVectorXd > getShapeMatrix (const unsigned integration_point) const override
 Provides the shape matrix at the given integration point.
Eigen::Vector3d getFlux (MathLib::Point3d const &pnt_local_coords, double const t, std::vector< double > const &local_x) const override
void computeSecondaryVariableConcrete (double const t, double const, Eigen::VectorXd const &local_x, Eigen::VectorXd const &) override
void computeReactionRelatedSecondaryVariable (std::size_t const ele_id) 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 postTimestepConcrete (Eigen::VectorXd const &, Eigen::VectorXd const &, double const, double const, int const) override
Public Member Functions inherited from ProcessLib::ComponentTransport::ComponentTransportLocalAssemblerInterface
 ComponentTransportLocalAssemblerInterface ()=default
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)
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)
Public Member Functions inherited from ProcessLib::LocalAssemblerInterface
virtual ~LocalAssemblerInterface ()=default
virtual void setInitialConditions (std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, double const t, int const process_id)
virtual void initialize (std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table)
virtual void preAssemble (double const, double const, std::vector< double > const &)
virtual void assembleWithJacobian (double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
virtual void computeSecondaryVariable (std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_prev, int const process_id)
virtual void preTimestep (std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table, GlobalVector const &x, double const t, double const delta_t)
virtual void postTimestep (std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, double const t, double const dt, int const process_id)
void postNonLinearSolver (std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, double const t, double const dt, int const process_id)
virtual Eigen::Vector3d getFlux (MathLib::Point3d const &, double const, std::vector< std::vector< double > > const &) const
 Fits to staggered scheme.
virtual int getNumberOfVectorElementsForDeformation () const
Public Member Functions inherited from NumLib::ExtrapolatableElement
virtual ~ExtrapolatableElement ()=default

Private Types

using ShapeMatricesType = ShapeMatrixPolicyType<ShapeFunction, GlobalDim>
using ShapeMatrices = typename ShapeMatricesType::ShapeMatrices
using LocalBlockMatrixType
using LocalSegmentVectorType
using LocalMatrixType
using LocalVectorType = Eigen::Matrix<double, Eigen::Dynamic, 1>
using NodalVectorType = typename ShapeMatricesType::NodalVectorType
using NodalRowVectorType = typename ShapeMatricesType::NodalRowVectorType
using GlobalDimVectorType = typename ShapeMatricesType::GlobalDimVectorType
using GlobalDimNodalMatrixType
using GlobalDimMatrixType = typename ShapeMatricesType::GlobalDimMatrixType

Private Member Functions

void updateAveragePorosity (std::size_t const ele_id)
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)
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)
NodalVectorType getLocalTemperature (double const t, Eigen::VectorXd const &local_x) const

Private Attributes

const int temperature_index = -1
const int first_concentration_index = -1
MeshLib::Element const & _element
ComponentTransportProcessData const & _process_data
NumLib::GenericIntegrationMethod const & _integration_method
std::vector< std::reference_wrapper< ProcessVariable > > const _transport_process_variables
std::vector< IntegrationPointData< GlobalDimNodalMatrixType > > _ip_data

Static Private Attributes

static const int pressure_index = 0
static const int pressure_size = ShapeFunction::NPOINTS
static const int temperature_size = ShapeFunction::NPOINTS
static const int concentration_size

Member Typedef Documentation

◆ GlobalDimMatrixType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::GlobalDimMatrixType = typename ShapeMatricesType::GlobalDimMatrixType
private

Definition at line 237 of file ComponentTransportFEM.h.

◆ GlobalDimNodalMatrixType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::GlobalDimNodalMatrixType
private
Initial value:
MatrixType< GlobalDim, ShapeFunction::NPOINTS > GlobalDimNodalMatrixType

Definition at line 235 of file ComponentTransportFEM.h.

◆ GlobalDimVectorType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::GlobalDimVectorType = typename ShapeMatricesType::GlobalDimVectorType
private

Definition at line 234 of file ComponentTransportFEM.h.

◆ LocalBlockMatrixType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::LocalBlockMatrixType
private
Initial value:
typename ShapeMatricesType::template MatrixType<pressure_size,

Definition at line 221 of file ComponentTransportFEM.h.

◆ LocalMatrixType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::LocalMatrixType
private
Initial value:
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>

Definition at line 227 of file ComponentTransportFEM.h.

◆ LocalSegmentVectorType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::LocalSegmentVectorType
private
Initial value:
typename ShapeMatricesType::template VectorType<pressure_size>

Definition at line 224 of file ComponentTransportFEM.h.

◆ LocalVectorType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::LocalVectorType = Eigen::Matrix<double, Eigen::Dynamic, 1>
private

Definition at line 229 of file ComponentTransportFEM.h.

◆ NodalRowVectorType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::NodalRowVectorType = typename ShapeMatricesType::NodalRowVectorType
private

Definition at line 232 of file ComponentTransportFEM.h.

◆ NodalVectorType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::NodalVectorType = typename ShapeMatricesType::NodalVectorType
private

Definition at line 231 of file ComponentTransportFEM.h.

◆ ShapeMatrices

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::ShapeMatrices = typename ShapeMatricesType::ShapeMatrices
private

Definition at line 219 of file ComponentTransportFEM.h.

◆ ShapeMatricesType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::ShapeMatricesType = ShapeMatrixPolicyType<ShapeFunction, GlobalDim>
private

Definition at line 218 of file ComponentTransportFEM.h.

Constructor & Destructor Documentation

◆ LocalAssemblerData()

template<typename ShapeFunction, int GlobalDim>
ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 )
inline

Definition at line 240 of file ComponentTransportFEM.h.

248 : temperature_index(process_data.isothermal ? -1
257 {
259
260 unsigned const n_integration_points =
261 _integration_method.getNumberOfPoints();
263
265 {});
266
267 double const aperture_size =
268 _process_data.aperture_size(0.0, element_pos)[0];
269
270 auto const shape_matrices =
274 auto const& Ns =
275 _process_data.shape_matrix_cache
276 .NsHigherOrder<typename ShapeFunction::MeshElement>();
277 auto const& medium =
278 *_process_data.media_map.getMedium(_element.getID());
279 for (unsigned ip = 0; ip < n_integration_points; ip++)
280 {
282 {}, _element.getID(),
286 Ns[ip])));
287
288 _ip_data.emplace_back(
290 _integration_method.getWeightedPoint(ip).getWeight() *
291 shape_matrices[ip].integralMeasure *
293
294 _ip_data[ip].porosity =
296 .template initialValue<double>(
298
299 _ip_data[ip].pushBackState();
300 }
301 }
NumLib::GenericIntegrationMethod const & _integration_method
std::vector< IntegrationPointData< GlobalDimNodalMatrixType > > _ip_data
ComponentTransportProcessData const & _process_data
ShapeMatrixPolicyType< ShapeFunction, GlobalDim > ShapeMatricesType
std::vector< std::reference_wrapper< ProcessVariable > > const _transport_process_variables

References _element, _integration_method, _ip_data, _process_data, _transport_process_variables, first_concentration_index, NumLib::initShapeMatrices(), NumLib::interpolateCoordinates(), MaterialPropertyLib::porosity, and temperature_index.

Member Function Documentation

◆ assemble()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 )
inlineoverridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 470 of file ComponentTransportFEM.h.

476 {
477 auto const local_matrix_size = local_x.size();
478 // Nodal DOFs include pressure
479 int const num_nodal_dof = 1 + _transport_process_variables.size();
480 // This assertion is valid only if all nodal d.o.f. use the same shape
481 // matrices.
483
490
491 // Get block matrices
497
500
501 auto const& b =
503 .projected_specific_body_force_vectors[_element.getID()];
504
505 auto const number_of_components = num_nodal_dof - 1;
507 ++component_id)
508 {
509 /* Partitioned assembler matrix
510 * | pp | pc1 | pc2 | pc3 |
511 * |-----|-----|-----|-----|
512 * | c1p | c1c1| 0 | 0 |
513 * |-----|-----|-----|-----|
514 * | c2p | 0 | c2c2| 0 |
515 * |-----|-----|-----|-----|
516 * | c3p | 0 | 0 | c3c3|
517 */
520
521 auto KCC =
524 auto MCC =
527 auto MCp =
530 auto MpC =
533
536
538 MCC, MCp, MpC, Kpp, Mpp, Bp);
539
540 if (_process_data.chemical_solver_interface)
541 {
542 auto const stoichiometric_matrix =
543 _process_data.chemical_solver_interface
544 ->getStoichiometricMatrix();
545
547
550 it;
551 ++it)
552 {
553 auto const stoichiometric_coefficient = it.value();
554 auto const coupled_component_id = it.row();
555 auto const kinetic_prefactor =
556 _process_data.chemical_solver_interface
557 ->getKineticPrefactor(coupled_component_id);
558
559 auto const concentration_index =
561 auto const coupled_concentration_index =
564 auto KCmCn = local_K.template block<concentration_size,
567
568 // account for the coupling between components
572 }
573 }
574 }
575 }
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)
void assembleKCmCn(int const component_id, double const t, double const dt, Eigen::Ref< LocalBlockMatrixType > KCmCn, double const stoichiometric_coefficient, double const kinetic_prefactor)
Eigen::Map< Vector > createZeroedVector(std::vector< double > &data, Eigen::VectorXd::Index size)
Eigen::Map< Matrix > createZeroedMatrix(std::vector< double > &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)

References _element, _process_data, _transport_process_variables, assembleBlockMatrices(), assembleKCmCn(), concentration_size, MathLib::createZeroedMatrix(), MathLib::createZeroedVector(), pressure_index, and pressure_size.

◆ assembleBlockMatrices()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 )
inline

Definition at line 577 of file ComponentTransportFEM.h.

589 {
590 unsigned const n_integration_points =
591 _integration_method.getNumberOfPoints();
592
594
595 // Get material properties
596 auto const& medium =
597 *_process_data.media_map.getMedium(_element.getID());
598 // Select the only valid for component transport liquid phase.
599 auto const& phase =
601
602 // Assume that the component name is the same as the process variable
603 // name. Components are shifted by one because the first one is always
604 // pressure.
605 auto const& component = phase.component(
607
610
612 double average_velocity_norm = 0.0;
613 if (!_process_data.non_advective_form)
614 {
616 }
617
618 auto const& Ns =
619 _process_data.shape_matrix_cache
620 .NsHigherOrder<typename ShapeFunction::MeshElement>();
621
622 for (unsigned ip(0); ip < n_integration_points; ++ip)
623 {
624 auto& ip_data = _ip_data[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;
629
631 {}, _element.getID(),
635 N)));
636
637 double C_int_pt = 0.0;
638 double p_int_pt = 0.0;
639
642
643 vars.concentration = C_int_pt;
644 vars.liquid_phase_pressure = p_int_pt;
645
646 // update according to a particular porosity model
648 .template value<double>(vars, pos, t, dt);
649 vars.porosity = porosity;
650
651 auto const& retardation_factor =
653 .template value<double>(vars, pos, t, dt);
654
655 auto const& solute_dispersivity_transverse = medium.template value<
656 double>(
658
660 medium.template value<double>(
663
664 // Use the fluid density model to compute the density
665 // TODO (renchao): concentration of which component as the argument
666 // for calculation of fluid density
667 auto const density =
669 .template value<double>(vars, pos, t, dt);
670
671 auto const decay_rate =
673 .template value<double>(vars, pos, t, dt);
674
675 auto const& pore_diffusion_coefficient =
678 .value(vars, pos, t, dt));
679
682 vars, pos, t, dt));
683
684 // Use the viscosity model to compute the viscosity
686 .template value<double>(vars, pos, t, dt);
687
688 double storage = 0;
690 {
692 .template value<double>(vars, pos, t, dt);
693 }
694
697 _process_data.has_gravity
701
702 const double drho_dp =
704 .template dValue<double>(
705 vars,
707 pos, t, dt);
708
709 const double drho_dC =
711 .template dValue<double>(
713 t, dt);
714
717 _process_data.stabilizer, _element.getID(),
721
724 auto const N_t_N = (N.transpose() * N).eval();
725
726 if (_process_data.non_advective_form)
727 {
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;
731 }
732 else
733 {
734 ip_flux_vector.emplace_back(mass_density_flow);
736 }
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;
741
742 MpC.noalias() += N_t_N * (porosity * drho_dC * w);
743
744 // Calculate Mpp, Kpp, and bp in the first loop over components
745 if (component_id == 0)
746 {
747 Mpp.noalias() +=
748 N_t_N * (porosity * drho_dp * w + density * storage * w);
749 Kpp.noalias() +=
750 dNdx.transpose() * K_over_mu * dNdx * (density * w);
751
752 if (_process_data.has_gravity)
753 {
754 Bp.noalias() += dNdx.transpose() * K_over_mu * b *
755 (density * density * w);
756 }
757 }
758 }
759
760 if (!_process_data.non_advective_form)
761 {
764 _process_data.stabilizer,
765 _ip_data,
766 _process_data.shape_matrix_cache,
769 static_cast<double>(n_integration_points),
771 }
772
773 KCC.noalias() += KCC_Laplacian;
774 }
std::string getName(std::string const &line)
Returns the name/title from the "Zone"-description.
typename ShapeMatricesType::GlobalDimVectorType GlobalDimVectorType
typename ShapeMatricesType::template MatrixType< pressure_size, pressure_size > LocalBlockMatrixType
typename ShapeMatricesType::GlobalDimMatrixType GlobalDimMatrixType
constexpr Eigen::Matrix< double, GlobalDim, GlobalDim > formEigenTensor(MaterialPropertyLib::PropertyDataType const &values)
void shapeFunctionInterpolate(const NodalValues &, const ShapeMatrix &)
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)

References _element, _integration_method, _ip_data, _process_data, _transport_process_variables, MaterialPropertyLib::AqueousLiquid, NumLib::detail::assembleAdvectionMatrix(), NumLib::computeHydrodynamicDispersion(), MaterialPropertyLib::concentration, MaterialPropertyLib::VariableArray::concentration, concentration_size, MaterialPropertyLib::decay_rate, MaterialPropertyLib::density, MaterialPropertyLib::formEigenTensor(), getName(), NumLib::interpolateCoordinates(), MaterialPropertyLib::liquid_phase_pressure, MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::permeability, MaterialPropertyLib::pore_diffusion, MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, MaterialPropertyLib::retardation_factor, NumLib::detail::shapeFunctionInterpolate(), MaterialPropertyLib::storage, MaterialPropertyLib::transversal_dispersivity, and MaterialPropertyLib::viscosity.

Referenced by assemble().

◆ assembleComponentTransportEquation()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 )
inline

Definition at line 1134 of file ComponentTransportFEM.h.

1139 {
1140 assert(static_cast<int>(local_x.size()) ==
1143 static_cast<int>(_transport_process_variables.size()) +
1144 (_process_data.isothermal ? 0 : temperature_size));
1145
1146 auto const local_p =
1148
1150
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 =
1157
1162
1165
1166 unsigned const n_integration_points =
1167 _integration_method.getNumberOfPoints();
1168
1170 double average_velocity_norm = 0.0;
1171 if (!_process_data.non_advective_form)
1172 {
1174 }
1175
1176 auto const& b =
1178 .projected_specific_body_force_vectors[_element.getID()];
1179
1182
1183 auto const& medium =
1184 *_process_data.media_map.getMedium(_element.getID());
1185 auto const& phase =
1187 auto const component_id =
1188 transport_process_id - (_process_data.isothermal ? 1 : 2);
1189 auto const& component = phase.component(
1191
1192 auto const& Ns =
1193 _process_data.shape_matrix_cache
1194 .NsHigherOrder<typename ShapeFunction::MeshElement>();
1195
1196 for (unsigned ip(0); ip < n_integration_points; ++ip)
1197 {
1198 auto& ip_data = _ip_data[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;
1204
1206 {}, _element.getID(),
1210 N)));
1211
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);
1215
1216 vars.concentration = C_int_pt;
1217 vars.liquid_phase_pressure = p_int_pt;
1218 vars.temperature = T_int_pt;
1219
1220 // porosity
1221 {
1222 vars_prev.porosity = porosity_prev;
1223
1224 porosity =
1225 _process_data.chemically_induced_porosity_change
1228 .template value<double>(vars, vars_prev, pos, t,
1229 dt);
1230
1231 vars.porosity = porosity;
1232 }
1233
1234 auto const& retardation_factor =
1236 .template value<double>(vars, pos, t, dt);
1237
1238 auto const& solute_dispersivity_transverse = medium.template value<
1239 double>(
1242 medium.template value<double>(
1245
1246 // Use the fluid density model to compute the density
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);
1253
1254 auto const& pore_diffusion_coefficient =
1257 .value(vars, pos, t, dt));
1258
1261 vars, pos, t, dt));
1262 // Use the viscosity model to compute the viscosity
1264 .template value<double>(vars, pos, t, dt);
1265
1268 _process_data.has_gravity
1270 (dNdx * local_p - density * b))
1272
1275 _process_data.stabilizer, _element.getID(),
1279
1280 double const R_times_phi = retardation_factor * porosity;
1281 auto const N_t_N = (N.transpose() * N).eval();
1282
1283 if (_process_data.non_advective_form)
1284 {
1285 const double drho_dC =
1287 .template dValue<double>(
1289 pos, t, dt);
1290 local_M.noalias() +=
1292 }
1293
1294 local_M.noalias() += N_t_N * (R_times_phi * density * w);
1295
1296 // coupling term
1297 if (_process_data.non_advective_form)
1298 {
1299 double const p_dot = (p_int_pt - N.dot(local_p_prev)) / dt;
1300
1301 const double drho_dp =
1303 .template dValue<double>(vars,
1306 pos, t, dt);
1307
1308 local_K.noalias() +=
1309 N_t_N * ((R_times_phi * drho_dp * p_dot) * w) -
1310 dNdx.transpose() * velocity * N * (density * w);
1311 }
1312 else
1313 {
1314 ip_flux_vector.emplace_back(velocity * density);
1316 }
1317 local_K.noalias() +=
1319
1320 KCC_Laplacian.noalias() += dNdx.transpose() *
1322 (density * w);
1323 }
1324
1325 if (!_process_data.non_advective_form)
1326 {
1329 _process_data.stabilizer, _ip_data,
1330 _process_data.shape_matrix_cache, ip_flux_vector,
1332 static_cast<double>(n_integration_points),
1334 }
1335 local_K.noalias() += KCC_Laplacian;
1336 }
NodalVectorType getLocalTemperature(double const t, Eigen::VectorXd const &local_x) const
typename ShapeMatricesType::NodalVectorType NodalVectorType

References _element, _integration_method, _ip_data, _process_data, _transport_process_variables, MaterialPropertyLib::AqueousLiquid, NumLib::detail::assembleAdvectionMatrix(), NumLib::computeHydrodynamicDispersion(), MaterialPropertyLib::concentration, MaterialPropertyLib::VariableArray::concentration, concentration_size, MathLib::createZeroedMatrix(), MaterialPropertyLib::decay_rate, MaterialPropertyLib::density, first_concentration_index, MaterialPropertyLib::formEigenTensor(), getLocalTemperature(), getName(), NumLib::interpolateCoordinates(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::permeability, MaterialPropertyLib::pore_diffusion, MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, pressure_index, pressure_size, MaterialPropertyLib::retardation_factor, MaterialPropertyLib::VariableArray::temperature, temperature_size, MaterialPropertyLib::transversal_dispersivity, and MaterialPropertyLib::viscosity.

Referenced by assembleForStaggeredScheme().

◆ assembleForStaggeredScheme()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 )
inlineoverridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 828 of file ComponentTransportFEM.h.

835 {
836 if (process_id == _process_data.hydraulic_process_id)
837 {
840 }
841 else if (process_id == _process_data.thermal_process_id)
842 {
846 }
847 else
848 {
849 // Go for assembling in an order of transport process id.
853 }
854 }
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 > &)
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)
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)

References _process_data, assembleComponentTransportEquation(), assembleHeatTransportEquation(), and assembleHydraulicEquation().

◆ assembleHeatTransportEquation()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 > &  )
inline

Definition at line 996 of file ComponentTransportFEM.h.

1002 {
1003 // In the staggered HTC process, number of components might be non-zero.
1004 assert(local_x.size() ==
1007 static_cast<int>(_transport_process_variables.size()));
1008
1009 auto const local_p =
1011 auto const local_T = getLocalTemperature(t, local_x);
1012 auto const local_C = local_x.template segment<concentration_size>(
1014
1019
1020 auto const& process_data = this->_process_data;
1021 auto const& medium =
1022 *process_data.media_map.getMedium(this->_element.getID());
1023 auto const& liquid_phase =
1025
1026 auto const& b =
1028 .projected_specific_body_force_vectors[_element.getID()];
1029
1031
1032 unsigned const n_integration_points =
1033 this->_integration_method.getNumberOfPoints();
1034
1036 double average_velocity_norm = 0.0;
1038
1039 auto const& Ns =
1040 _process_data.shape_matrix_cache
1041 .NsHigherOrder<typename ShapeFunction::MeshElement>();
1042
1043 for (unsigned ip(0); ip < n_integration_points; ip++)
1044 {
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];
1049
1051 {}, this->_element.getID(),
1055 N)));
1056
1057 double p_at_xi = 0.;
1059 double T_at_xi = 0.;
1061 double const C_int_pt = N.dot(local_C);
1062
1063 vars.temperature = T_at_xi;
1064 vars.liquid_phase_pressure = p_at_xi;
1065
1066 vars.liquid_saturation = 1.0;
1067
1068 auto const porosity =
1070 .template value<double>(vars, pos, t, dt);
1071 vars.porosity = porosity;
1072 vars.concentration = C_int_pt;
1073
1074 // Use the fluid density model to compute the density
1075 auto const fluid_density =
1078 .template value<double>(vars, pos, t, dt);
1079 vars.density = fluid_density;
1080 auto const specific_heat_capacity_fluid =
1083 .template value<double>(vars, pos, t, dt);
1084
1085 // Assemble mass matrix
1086 local_M.noalias() +=
1087 N.transpose() * N *
1090 pos, t, dt) *
1091 w);
1092
1093 // Assemble Laplace matrix
1094 auto const viscosity =
1097 .template value<double>(vars, pos, t, dt);
1098
1099 auto const intrinsic_permeability =
1101 medium
1102 .property(
1104 .value(vars, pos, t, dt));
1105
1109 process_data.has_gravity
1111 (dNdx * local_p - fluid_density * b))
1113
1117 pos, t, dt);
1118
1119 local_K.noalias() +=
1120 w * dNdx.transpose() * thermal_conductivity_dispersivity * dNdx;
1121
1122 ip_flux_vector.emplace_back(velocity * fluid_density *
1125 }
1126
1128 process_data.stabilizer, this->_ip_data,
1129 _process_data.shape_matrix_cache, ip_flux_vector,
1130 average_velocity_norm / static_cast<double>(n_integration_points),
1131 local_K);
1132 }
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)
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 assembleAdvectionMatrix(IPData const &ip_data_vector, NumLib::ShapeMatrixCache const &shape_matrix_cache, std::vector< FluxVectorType > const &ip_flux_vector, Eigen::MatrixBase< Derived > &laplacian_matrix)

References _element, _integration_method, _ip_data, _process_data, _transport_process_variables, MaterialPropertyLib::AqueousLiquid, NumLib::detail::assembleAdvectionMatrix(), MaterialPropertyLib::VariableArray::concentration, concentration_size, MathLib::createZeroedMatrix(), MaterialPropertyLib::density, MaterialPropertyLib::VariableArray::density, first_concentration_index, MaterialPropertyLib::formEigenTensor(), getHeatEnergyCoefficient(), getLocalTemperature(), getThermalConductivityDispersivity(), NumLib::interpolateCoordinates(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::VariableArray::liquid_saturation, MaterialPropertyLib::permeability, MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, pressure_index, pressure_size, NumLib::detail::shapeFunctionInterpolate(), MaterialPropertyLib::specific_heat_capacity, MaterialPropertyLib::VariableArray::temperature, temperature_size, and MaterialPropertyLib::viscosity.

Referenced by assembleForStaggeredScheme().

◆ assembleHydraulicEquation()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 )
inline

Definition at line 856 of file ComponentTransportFEM.h.

863 {
864 auto const local_p =
866 auto const local_C = local_x.template segment<concentration_size>(
868 auto const local_C_prev =
870
872
879
880 unsigned const n_integration_points =
881 _integration_method.getNumberOfPoints();
882
883 auto const& b =
885 .projected_specific_body_force_vectors[_element.getID()];
886
887 auto const& medium =
888 *_process_data.media_map.getMedium(_element.getID());
889 auto const& phase =
891
894
895 auto const& Ns =
896 _process_data.shape_matrix_cache
897 .NsHigherOrder<typename ShapeFunction::MeshElement>();
898
899 for (unsigned ip(0); ip < n_integration_points; ++ip)
900 {
901 auto& ip_data = _ip_data[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;
907
909 {}, _element.getID(),
913 N)));
914
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);
918
919 vars.concentration = C_int_pt;
920 vars.liquid_phase_pressure = p_int_pt;
921 vars.temperature = T_int_pt;
922
923 // porosity
924 {
925 vars_prev.porosity = porosity_prev;
926
927 porosity =
928 _process_data.chemically_induced_porosity_change
931 .template value<double>(vars, vars_prev, pos, t,
932 dt);
933
934 vars.porosity = porosity;
935 }
936
937 // Use the fluid density model to compute the density
938 // TODO: Concentration of which component as one of arguments for
939 // calculation of fluid density
940 auto const density =
942 .template value<double>(vars, pos, t, dt);
943
944 double storage = 0;
946 {
948 .template value<double>(vars, pos, t, dt);
949 }
950
953 vars, pos, t, dt));
954
955 // Use the viscosity model to compute the viscosity
957 .template value<double>(vars, pos, t, dt);
958
960
961 const double drho_dp =
963 .template dValue<double>(
964 vars,
966 pos, t, dt);
967 const double drho_dC =
969 .template dValue<double>(
971 t, dt);
972
973 // matrix assembly
974 local_M.noalias() +=
975 N.transpose() * N *
976 (porosity * drho_dp * w + density * storage * w);
977 local_K.noalias() +=
978 w * dNdx.transpose() * density * K_over_mu * dNdx;
979
980 if (_process_data.has_gravity)
981 {
982 local_b.noalias() +=
983 w * density * density * dNdx.transpose() * K_over_mu * b;
984 }
985
986 // coupling term
987 {
988 double const C_dot = (C_int_pt - N.dot(local_C_prev)) / dt;
989
990 local_b.noalias() -=
991 N.transpose() * (porosity * drho_dC * C_dot * w);
992 }
993 }
994 }

References _element, _integration_method, _ip_data, _process_data, MaterialPropertyLib::AqueousLiquid, MaterialPropertyLib::concentration, MaterialPropertyLib::VariableArray::concentration, concentration_size, MathLib::createZeroedMatrix(), MathLib::createZeroedVector(), MaterialPropertyLib::density, first_concentration_index, MaterialPropertyLib::formEigenTensor(), getLocalTemperature(), NumLib::interpolateCoordinates(), MaterialPropertyLib::liquid_phase_pressure, MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::permeability, MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, pressure_index, pressure_size, MaterialPropertyLib::storage, MaterialPropertyLib::VariableArray::temperature, and MaterialPropertyLib::viscosity.

Referenced by assembleForStaggeredScheme().

◆ assembleKCmCn()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::assembleKCmCn ( int const component_id,
double const t,
double const dt,
Eigen::Ref< LocalBlockMatrixType > KCmCn,
double const stoichiometric_coefficient,
double const kinetic_prefactor )
inline

Definition at line 776 of file ComponentTransportFEM.h.

780 {
781 unsigned const n_integration_points =
782 _integration_method.getNumberOfPoints();
783
785
786 auto const& medium =
787 *_process_data.media_map.getMedium(_element.getID());
788 auto const& phase =
790 auto const& component = phase.component(
792
793 auto const& Ns =
794 _process_data.shape_matrix_cache
795 .NsHigherOrder<typename ShapeFunction::MeshElement>();
796
797 for (unsigned ip(0); ip < n_integration_points; ++ip)
798 {
799 auto& ip_data = _ip_data[ip];
800 auto const& w = ip_data.integration_weight;
801 auto const& N = Ns[ip];
802 auto& porosity = ip_data.porosity;
803
805 {}, _element.getID(),
809 N)));
810
811 auto const retardation_factor =
813 .template value<double>(vars, pos, t, dt);
814
816 .template value<double>(vars, pos, t, dt);
817
818 auto const density =
820 .template value<double>(vars, pos, t, dt);
821
822 KCmCn.noalias() -= N.transpose() * N *
825 }
826 }

References _element, _integration_method, _ip_data, _process_data, _transport_process_variables, MaterialPropertyLib::AqueousLiquid, MaterialPropertyLib::density, getName(), NumLib::interpolateCoordinates(), MaterialPropertyLib::porosity, and MaterialPropertyLib::retardation_factor.

Referenced by assemble().

◆ assembleReactionEquationConcrete()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 )
inlineoverridevirtual

Implements ProcessLib::ComponentTransport::ComponentTransportLocalAssemblerInterface.

Definition at line 1617 of file ComponentTransportFEM.h.

1622 {
1623 auto const local_C = local_x.template segment<concentration_size>(
1626
1633
1634 unsigned const n_integration_points =
1635 _integration_method.getNumberOfPoints();
1636
1639
1640 auto const& medium =
1641 *_process_data.media_map.getMedium(_element.getID());
1642 auto const component_id = transport_process_id - 1;
1643
1644 auto const& Ns =
1645 _process_data.shape_matrix_cache
1646 .NsHigherOrder<typename ShapeFunction::MeshElement>();
1647
1648 for (unsigned ip(0); ip < n_integration_points; ++ip)
1649 {
1650 auto& ip_data = _ip_data[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;
1656
1658 {}, _element.getID(),
1662 N)));
1663
1664 double C_int_pt = 0.0;
1666
1667 vars.concentration = C_int_pt;
1668
1669 auto const porosity_dot = (porosity - porosity_prev) / dt;
1670
1671 // porosity
1672 {
1673 vars_prev.porosity = porosity_prev;
1674
1675 porosity =
1676 _process_data.chemically_induced_porosity_change
1679 .template value<double>(vars, vars_prev, pos, t,
1680 dt);
1681 }
1682
1683 local_M.noalias() += w * N.transpose() * porosity * N;
1684
1685 local_K.noalias() += w * N.transpose() * porosity_dot * N;
1686
1687 if (chemical_system_id == -1)
1688 {
1689 continue;
1690 }
1691
1692 auto const C_post_int_pt =
1693 _process_data.chemical_solver_interface->getConcentration(
1695
1696 local_b.noalias() += N.transpose() * ((C_post_int_pt - C_int_pt) /
1697 dt * porosity * w);
1698 }
1699 }

References _element, _integration_method, _ip_data, _process_data, MaterialPropertyLib::VariableArray::concentration, concentration_size, MathLib::createZeroedMatrix(), MathLib::createZeroedVector(), first_concentration_index, NumLib::interpolateCoordinates(), MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, and NumLib::detail::shapeFunctionInterpolate().

◆ assembleWithJacobianComponentTransportEquation()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 )
inline

Definition at line 1472 of file ComponentTransportFEM.h.

1476 {
1477 auto const concentration_index =
1479
1480 auto const p = local_x.template segment<pressure_size>(pressure_index);
1481 auto const c =
1483 auto const c_prev =
1485
1486 auto const local_T = getLocalTemperature(t, local_x);
1487
1492
1495
1496 unsigned const n_integration_points =
1497 _integration_method.getNumberOfPoints();
1498
1500 double average_velocity_norm = 0.0;
1502
1503 auto const& b =
1505 .projected_specific_body_force_vectors[_element.getID()];
1506
1509
1510 auto const& medium =
1511 *_process_data.media_map.getMedium(_element.getID());
1512 auto const& phase =
1514 auto const& component = phase.component(
1516
1517 auto const& Ns =
1518 _process_data.shape_matrix_cache
1519 .NsHigherOrder<typename ShapeFunction::MeshElement>();
1520
1521 for (unsigned ip(0); ip < n_integration_points; ++ip)
1522 {
1523 auto& ip_data = _ip_data[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;
1529
1531 {}, _element.getID(),
1535 N)));
1536
1537 double const p_ip = N.dot(p);
1538 double const c_ip = N.dot(c);
1539
1540 vars.liquid_phase_pressure = p_ip;
1541 vars.concentration = c_ip;
1542 vars.temperature = N.dot(local_T);
1543
1544 // porosity
1545 {
1546 vars_prev.porosity = phi_prev;
1547
1548 phi = _process_data.chemically_induced_porosity_change
1549 ? phi_prev
1551 .template value<double>(vars, vars_prev, pos, t,
1552 dt);
1553
1554 vars.porosity = phi;
1555 }
1556
1557 auto const R =
1559 .template value<double>(vars, pos, t, dt);
1560
1561 auto const alpha_T = medium.template value<double>(
1563 auto const alpha_L = medium.template value<double>(
1565
1567 .template value<double>(vars, pos, t, dt);
1568 // first-order decay constant
1569 auto const alpha =
1571 .template value<double>(vars, pos, t, dt);
1572
1575 .value(vars, pos, t, dt));
1576
1579 vars, pos, t, dt));
1581 .template value<double>(vars, pos, t, dt);
1582 // Darcy flux
1583 GlobalDimVectorType const q =
1584 _process_data.has_gravity
1585 ? GlobalDimVectorType(-k / mu * (dNdx * p - rho * b))
1586 : GlobalDimVectorType(-k / mu * dNdx * p);
1587
1589 _process_data.stabilizer, _element.getID(), Dp, q, phi, alpha_T,
1590 alpha_L);
1591
1592 // matrix assembly
1593 local_Jac.noalias() +=
1594 N.transpose() * N * (rho * phi * R * (alpha + 1 / dt) * w);
1595
1596 KCC_Laplacian.noalias() += w * rho * dNdx.transpose() * D * dNdx;
1597
1598 auto const cdot = (c - c_prev) / dt;
1599 local_rhs.noalias() -=
1600 N.transpose() * N * (cdot + alpha * c) * (rho * phi * R * w);
1601
1602 ip_flux_vector.emplace_back(q * rho);
1603 average_velocity_norm += q.norm();
1604 }
1605
1607 _process_data.stabilizer, _ip_data,
1608 _process_data.shape_matrix_cache, ip_flux_vector,
1609 average_velocity_norm / static_cast<double>(n_integration_points),
1611
1612 local_rhs.noalias() -= KCC_Laplacian * c;
1613
1614 local_Jac.noalias() += KCC_Laplacian;
1615 }

References _element, _integration_method, _ip_data, _process_data, _transport_process_variables, MaterialPropertyLib::AqueousLiquid, NumLib::detail::assembleAdvectionMatrix(), NumLib::computeHydrodynamicDispersion(), MaterialPropertyLib::VariableArray::concentration, concentration_size, MathLib::createZeroedMatrix(), MathLib::createZeroedVector(), MaterialPropertyLib::decay_rate, MaterialPropertyLib::density, first_concentration_index, MaterialPropertyLib::formEigenTensor(), getLocalTemperature(), getName(), NumLib::interpolateCoordinates(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::longitudinal_dispersivity, MaterialPropertyLib::permeability, MaterialPropertyLib::pore_diffusion, MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, pressure_index, MaterialPropertyLib::retardation_factor, MaterialPropertyLib::VariableArray::temperature, MaterialPropertyLib::transversal_dispersivity, and MaterialPropertyLib::viscosity.

Referenced by assembleWithJacobianForStaggeredScheme().

◆ assembleWithJacobianForStaggeredScheme()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 )
inlineoverridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 1338 of file ComponentTransportFEM.h.

1343 {
1344 if (process_id == _process_data.hydraulic_process_id)
1345 {
1348 }
1349 else
1350 {
1351 int const component_id = process_id - 1;
1354 component_id);
1355 }
1356 }
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)
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)

References _process_data, assembleWithJacobianComponentTransportEquation(), and assembleWithJacobianHydraulicEquation().

◆ assembleWithJacobianHydraulicEquation()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 )
inline

Definition at line 1358 of file ComponentTransportFEM.h.

1362 {
1363 auto const p = local_x.template segment<pressure_size>(pressure_index);
1364 auto const c = local_x.template segment<concentration_size>(
1366
1367 auto const p_prev = local_x_prev.segment<pressure_size>(pressure_index);
1368 auto const c_prev =
1370
1375
1376 unsigned const n_integration_points =
1377 _integration_method.getNumberOfPoints();
1378
1379 auto const& b =
1381 .projected_specific_body_force_vectors[_element.getID()];
1382
1383 auto const& medium =
1384 *_process_data.media_map.getMedium(_element.getID());
1385 auto const& phase =
1387
1390
1391 auto const& Ns =
1392 _process_data.shape_matrix_cache
1393 .NsHigherOrder<typename ShapeFunction::MeshElement>();
1394
1395 for (unsigned ip(0); ip < n_integration_points; ++ip)
1396 {
1397 auto& ip_data = _ip_data[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;
1403
1405 {}, _element.getID(),
1409 N)));
1410
1411 double const p_ip = N.dot(p);
1412 double const c_ip = N.dot(c);
1413
1414 double const cdot_ip = (c_ip - N.dot(c_prev)) / dt;
1415
1416 vars.liquid_phase_pressure = p_ip;
1417 vars.concentration = c_ip;
1418
1419 // porosity
1420 {
1421 vars_prev.porosity = phi_prev;
1422
1423 phi = _process_data.chemically_induced_porosity_change
1424 ? phi_prev
1426 .template value<double>(vars, vars_prev, pos, t,
1427 dt);
1428
1429 vars.porosity = phi;
1430 }
1431
1433 .template value<double>(vars, pos, t, dt);
1434
1437 vars, pos, t, dt));
1438
1440 .template value<double>(vars, pos, t, dt);
1441
1442 auto const drho_dp =
1444 .template dValue<double>(
1445 vars,
1447 pos, t, dt);
1448 auto const drho_dc =
1450 .template dValue<double>(
1452 t, dt);
1453
1454 // matrix assembly
1455 local_Jac.noalias() +=
1456 N.transpose() * N * (phi * drho_dp / dt * w) +
1457 w * dNdx.transpose() * rho * k / mu * dNdx;
1458
1459 local_rhs.noalias() -=
1460 N.transpose() * (drho_dp * N * p_prev + drho_dc * cdot_ip) *
1461 (phi * w) +
1462 dNdx.transpose() * k / mu * dNdx * p * (rho * w);
1463
1464 if (_process_data.has_gravity)
1465 {
1466 local_rhs.noalias() +=
1467 w * rho * dNdx.transpose() * k / mu * rho * b;
1468 }
1469 }
1470 }

References _element, _integration_method, _ip_data, _process_data, MaterialPropertyLib::AqueousLiquid, MaterialPropertyLib::concentration, MaterialPropertyLib::VariableArray::concentration, concentration_size, MathLib::createZeroedMatrix(), MathLib::createZeroedVector(), MaterialPropertyLib::density, first_concentration_index, MaterialPropertyLib::formEigenTensor(), NumLib::interpolateCoordinates(), MaterialPropertyLib::liquid_phase_pressure, MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::permeability, MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, pressure_index, pressure_size, and MaterialPropertyLib::viscosity.

Referenced by assembleWithJacobianForStaggeredScheme().

◆ calculateIntPtDarcyVelocity()

template<typename ShapeFunction, int GlobalDim>
std::vector< double > const & ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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
inline

Definition at line 1907 of file ComponentTransportFEM.h.

1913 {
1914 auto const n_integration_points =
1915 _integration_method.getNumberOfPoints();
1916
1917 cache.clear();
1921
1922 auto const& b =
1924 .projected_specific_body_force_vectors[_element.getID()];
1925
1927
1928 auto const& medium =
1929 *_process_data.media_map.getMedium(_element.getID());
1930 auto const& phase =
1932
1933 auto const& Ns =
1934 _process_data.shape_matrix_cache
1935 .NsHigherOrder<typename ShapeFunction::MeshElement>();
1936
1937 for (unsigned ip = 0; ip < n_integration_points; ++ip)
1938 {
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;
1943
1945 {}, _element.getID(),
1949 N)));
1950
1951 double C_int_pt = 0.0;
1952 double p_int_pt = 0.0;
1953 double T_int_pt = 0.0;
1954
1958
1959 vars.concentration = C_int_pt;
1960 vars.liquid_phase_pressure = p_int_pt;
1961 vars.porosity = porosity;
1962 vars.temperature = T_int_pt;
1963
1964 // TODO (naumov) Temporary value not used by current material
1965 // models. Need extension of secondary variables interface.
1969 vars, pos, t, dt));
1971 .template value<double>(vars, pos, t, dt);
1973
1974 cache_mat.col(ip).noalias() = -K_over_mu * dNdx * p_nodal_values;
1975 if (_process_data.has_gravity)
1976 {
1977 auto const rho_w =
1979 .template value<double>(vars, pos, t, dt);
1980 // here it is assumed that the vector b is directed 'downwards'
1981 cache_mat.col(ip).noalias() += K_over_mu * rho_w * b;
1982 }
1983 }
1984
1985 return cache;
1986 }

References _element, _integration_method, _ip_data, _process_data, MaterialPropertyLib::AqueousLiquid, MaterialPropertyLib::VariableArray::concentration, MathLib::createZeroedMatrix(), MaterialPropertyLib::density, MaterialPropertyLib::formEigenTensor(), NumLib::interpolateCoordinates(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::permeability, MaterialPropertyLib::VariableArray::porosity, NumLib::detail::shapeFunctionInterpolate(), MaterialPropertyLib::VariableArray::temperature, and MaterialPropertyLib::viscosity.

Referenced by computeSecondaryVariableConcrete(), and getIntPtDarcyVelocity().

◆ calculateIntPtLiquidDensity()

template<typename ShapeFunction, int GlobalDim>
std::vector< double > const & ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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
inline

Definition at line 1776 of file ComponentTransportFEM.h.

1782 {
1783 auto const n_integration_points =
1784 _integration_method.getNumberOfPoints();
1785
1786 cache.clear();
1789
1791 pos.setElementID(_element.getID());
1792
1794
1795 auto const& medium =
1796 *_process_data.media_map.getMedium(_element.getID());
1797 auto const& phase =
1799
1800 auto const& Ns =
1801 _process_data.shape_matrix_cache
1802 .NsHigherOrder<typename ShapeFunction::MeshElement>();
1803
1804 for (unsigned ip = 0; ip < n_integration_points; ++ip)
1805 {
1806 auto const& N = Ns[ip];
1807
1808 double C_int_pt = 0.0;
1809 double p_int_pt = 0.0;
1810 double T_int_pt = 0.0;
1811
1815
1816 vars.concentration = C_int_pt;
1817 vars.liquid_phase_pressure = p_int_pt;
1818 vars.temperature = T_int_pt;
1819
1820 // TODO (naumov) Temporary value not used by current material
1821 // models. Need extension of secondary variables interface.
1823
1825 .template value<double>(vars, pos, t, dt);
1826 cache_vec[ip] = rho_w;
1827 }
1828
1829 return cache;
1830 }

References _element, _integration_method, _process_data, MaterialPropertyLib::AqueousLiquid, MaterialPropertyLib::VariableArray::concentration, MathLib::createZeroedVector(), MaterialPropertyLib::density, MaterialPropertyLib::VariableArray::liquid_phase_pressure, ParameterLib::SpatialPosition::setElementID(), NumLib::detail::shapeFunctionInterpolate(), and MaterialPropertyLib::VariableArray::temperature.

Referenced by getIntPtLiquidDensity().

◆ computeReactionRelatedSecondaryVariable()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::computeReactionRelatedSecondaryVariable ( std::size_t const ele_id)
inlineoverridevirtual

Implements ProcessLib::ComponentTransport::ComponentTransportLocalAssemblerInterface.

Definition at line 2143 of file ComponentTransportFEM.h.

2145 {
2146 auto const n_integration_points =
2147 _integration_method.getNumberOfPoints();
2148
2149 if (_process_data.chemically_induced_porosity_change)
2150 {
2151 auto const& medium = *_process_data.media_map.getMedium(ele_id);
2152
2153 for (auto& ip_data : _ip_data)
2154 {
2155 ip_data.porosity = ip_data.porosity_prev;
2156
2157 _process_data.chemical_solver_interface
2158 ->updatePorosityPostReaction(ip_data.chemical_system_id,
2159 medium, ip_data.porosity);
2160 }
2161
2163 }
2164
2167 std::transform(_ip_data.begin(), _ip_data.end(),
2169 [](auto const& ip_data)
2170 { return ip_data.chemical_system_id; });
2171
2172 _process_data.chemical_solver_interface->computeSecondaryVariable(
2174 }

References _integration_method, _ip_data, _process_data, and updateAveragePorosity().

◆ computeSecondaryVariableConcrete()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::computeSecondaryVariableConcrete ( double const t,
double const ,
Eigen::VectorXd const & local_x,
Eigen::VectorXd const &  )
inlineoverridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 2065 of file ComponentTransportFEM.h.

2070 {
2071 auto const local_p =
2073 auto const local_C = local_x.template segment<concentration_size>(
2075 auto const local_T = getLocalTemperature(t, local_x);
2076
2079
2080 auto const n_integration_points =
2081 _integration_method.getNumberOfPoints();
2082 auto const ele_velocity_mat =
2084
2085 auto const ele_id = _element.getID();
2087 &(*_process_data.mesh_prop_velocity)[ele_id * GlobalDim],
2088 GlobalDim) =
2089 ele_velocity_mat.rowwise().sum() / n_integration_points;
2090
2092 pos.setElementID(ele_id);
2093
2095 auto const& medium = *_process_data.media_map.getMedium(ele_id);
2096 auto const& Ns =
2097 _process_data.shape_matrix_cache
2098 .NsHigherOrder<typename ShapeFunction::MeshElement>();
2099
2100 double permeability_avg = 0.0;
2101 for (unsigned ip = 0; ip < n_integration_points; ++ip)
2102 {
2103 auto const& ip_data = _ip_data[ip];
2104 auto const& N = Ns[ip];
2105
2106 double C_int_pt = 0.0;
2108
2109 double p_int_pt = 0.0;
2111
2112 double T_int_pt = 0.0;
2114
2115 vars.concentration = C_int_pt;
2116 vars.liquid_phase_pressure = p_int_pt;
2117 vars.porosity = ip_data.porosity;
2118 vars.temperature = T_int_pt;
2119
2120 pos.setCoordinates(MathLib::Point3d(
2123 N)));
2124
2125 // TODO (naumov) Temporary value not used by current material
2126 // models. Need extension of secondary variables interface.
2128 auto const permeability_tensor =
2131 .value(vars, pos, t, dt));
2133 }
2134 (*_process_data.mesh_prop_permeability)[ele_id] =
2136
2137 if (!_process_data.chemically_induced_porosity_change)
2138 {
2140 }
2141 }
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
Eigen::Map< const Matrix > toMatrix(std::vector< double > const &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)

References _element, _integration_method, _ip_data, _process_data, calculateIntPtDarcyVelocity(), MaterialPropertyLib::VariableArray::concentration, first_concentration_index, MaterialPropertyLib::formEigenTensor(), getLocalTemperature(), NumLib::interpolateCoordinates(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::permeability, MaterialPropertyLib::VariableArray::porosity, pressure_index, ParameterLib::SpatialPosition::setCoordinates(), ParameterLib::SpatialPosition::setElementID(), NumLib::detail::shapeFunctionInterpolate(), MaterialPropertyLib::VariableArray::temperature, MathLib::toMatrix(), and updateAveragePorosity().

◆ getFlux()

template<typename ShapeFunction, int GlobalDim>
Eigen::Vector3d ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::getFlux ( MathLib::Point3d const & ,
double const ,
std::vector< double > const &  ) const
inlineoverridevirtual

Computes the flux in the point p_local_coords that is given in local coordinates using the values from local_x. Fits to monolithic scheme.

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 1998 of file ComponentTransportFEM.h.

2001 {
2006
2007 // Eval shape matrices at given point
2008 // Note: Axial symmetry is set to false here, because we only need dNdx
2009 // here, which is not affected by axial symmetry.
2010 auto const shape_matrices =
2012 GlobalDim>(
2013 _element, false /*is_axially_symmetric*/,
2015
2017 {}, _element.getID(),
2021
2022 auto const& b =
2024 .projected_specific_body_force_vectors[_element.getID()];
2025
2027
2028 auto const& medium =
2029 *_process_data.media_map.getMedium(_element.getID());
2030 auto const& phase =
2032
2033 // local_x contains the local concentration and pressure values
2034 double c_int_pt;
2036 vars.concentration = c_int_pt;
2037
2038 double p_int_pt;
2040 vars.liquid_phase_pressure = p_int_pt;
2041
2042 // TODO (naumov) Temporary value not used by current material models.
2043 // Need extension of secondary variables interface.
2047 vars, pos, t, dt));
2048
2050 .template value<double>(vars, pos, t, dt);
2052
2055 .template value<double>(vars, pos, t, dt);
2056 if (_process_data.has_gravity)
2057 {
2058 q += K_over_mu * rho_w * b;
2059 }
2060 Eigen::Vector3d flux(0.0, 0.0, 0.0);
2061 flux.head<GlobalDim>() = rho_w * q;
2062 return flux;
2063 }

References _element, _process_data, MaterialPropertyLib::AqueousLiquid, NumLib::computeShapeMatrices(), MaterialPropertyLib::VariableArray::concentration, concentration_size, MaterialPropertyLib::density, first_concentration_index, MaterialPropertyLib::formEigenTensor(), NumLib::interpolateCoordinates(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::permeability, pressure_index, pressure_size, NumLib::detail::shapeFunctionInterpolate(), and MaterialPropertyLib::viscosity.

◆ getHeatEnergyCoefficient()

template<typename ShapeFunction, int GlobalDim>
double ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 )
inlineprivate

◆ getIntPtDarcyVelocity()

template<typename ShapeFunction, int GlobalDim>
std::vector< double > const & ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::getIntPtDarcyVelocity ( const double t,
std::vector< GlobalVector * > const & x,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & dof_table,
std::vector< double > & cache ) const
inlineoverridevirtual

Implements ProcessLib::ComponentTransport::ComponentTransportLocalAssemblerInterface.

Definition at line 1832 of file ComponentTransportFEM.h.

1837 {
1838 assert(x.size() == dof_table.size());
1839
1840 auto const n_processes = x.size();
1842 local_x.reserve(n_processes);
1843
1845 {
1846 auto const indices =
1848 assert(!indices.empty());
1849 local_x.push_back(x[process_id]->get(indices));
1850 }
1851
1852 // only one process, must be monolithic.
1853 if (n_processes == 1)
1854 {
1860 local_T.setConstant(ShapeFunction::NPOINTS,
1862 int const temperature_index =
1863 _process_data.isothermal ? -1 : ShapeFunction::NPOINTS;
1864 if (temperature_index != -1)
1865 {
1868 }
1870 cache);
1871 }
1872
1873 // multiple processes, must be staggered.
1874 {
1875 constexpr int pressure_process_id = 0;
1877 // Normally temperature process is not there,
1878 // hence set the default temperature index to -1
1879 int temperature_process_id = -1;
1880
1881 // check whether temperature process exists
1882 if (!_process_data.isothermal)
1883 {
1884 // if temperature process exists, its id is 1
1886 // then the concentration index shifts to 2
1888 }
1889
1895 local_T.setConstant(ShapeFunction::NPOINTS,
1897 if (temperature_process_id != -1)
1898 {
1901 }
1903 cache);
1904 }
1905 }
std::vector< GlobalIndexType > getIndices(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table)

References _element, _process_data, calculateIntPtDarcyVelocity(), concentration_size, first_concentration_index, NumLib::getIndices(), pressure_index, pressure_size, temperature_index, and temperature_size.

◆ getIntPtLiquidDensity()

template<typename ShapeFunction, int GlobalDim>
std::vector< double > const & ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::getIntPtLiquidDensity ( const double t,
std::vector< GlobalVector * > const & x,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & dof_table,
std::vector< double > & cache ) const
inlineoverridevirtual

Implements ProcessLib::ComponentTransport::ComponentTransportLocalAssemblerInterface.

Definition at line 1701 of file ComponentTransportFEM.h.

1706 {
1707 assert(x.size() == dof_table.size());
1708
1709 auto const n_processes = x.size();
1711 local_x.reserve(n_processes);
1712
1714 {
1715 auto const indices =
1717 assert(!indices.empty());
1718 local_x.push_back(x[process_id]->get(indices));
1719 }
1720
1721 // only one process, must be monolithic.
1722 if (n_processes == 1)
1723 {
1729 local_T.setConstant(ShapeFunction::NPOINTS,
1731 int const temperature_index =
1732 _process_data.isothermal ? -1 : ShapeFunction::NPOINTS;
1733 if (temperature_index != -1)
1734 {
1737 }
1739 cache);
1740 }
1741
1742 // multiple processes, must be staggered.
1743 {
1744 constexpr int pressure_process_id = 0;
1746 // Normally temperature process is not there,
1747 // hence set the default temperature index to -1
1748 int temperature_process_id = -1;
1749
1750 // check whether temperature process exists
1751 if (!_process_data.isothermal)
1752 {
1753 // if temperature process exists, its id is 1
1755 // then the concentration index shifts to 2
1757 }
1758
1764 local_T.setConstant(ShapeFunction::NPOINTS,
1766 if (temperature_process_id != -1)
1767 {
1770 }
1772 cache);
1773 }
1774 }
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

References _element, _process_data, calculateIntPtLiquidDensity(), concentration_size, first_concentration_index, NumLib::getIndices(), pressure_index, pressure_size, temperature_index, and temperature_size.

◆ getIntPtMolarFlux()

template<typename ShapeFunction, int GlobalDim>
std::vector< double > const & ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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
inlineoverridevirtual

Implements ProcessLib::ComponentTransport::ComponentTransportLocalAssemblerInterface.

Definition at line 2176 of file ComponentTransportFEM.h.

2180 {
2182
2183 auto const n_processes = x.size();
2185 {
2186 auto const indices =
2188 assert(!indices.empty());
2189 auto const local_solution = x[process_id]->get(indices);
2193 }
2195
2196 auto const p = local_x.template segment<pressure_size>(pressure_index);
2197 auto const c = local_x.template segment<concentration_size>(
2199
2200 auto const n_integration_points =
2201 _integration_method.getNumberOfPoints();
2202
2203 cache.clear();
2207
2208 auto const& b =
2210 .projected_specific_body_force_vectors[_element.getID()];
2211
2213
2214 auto const& medium =
2215 *_process_data.media_map.getMedium(_element.getID());
2216 auto const& phase =
2218
2219 auto const& component = phase.component(
2221
2222 auto const& Ns =
2223 _process_data.shape_matrix_cache
2224 .NsHigherOrder<typename ShapeFunction::MeshElement>();
2225
2226 for (unsigned ip = 0; ip < n_integration_points; ++ip)
2227 {
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;
2232
2234 {}, _element.getID(),
2238 N)));
2239
2240 double const p_ip = N.dot(p);
2241 double const c_ip = N.dot(c);
2242
2243 vars.concentration = c_ip;
2244 vars.liquid_phase_pressure = p_ip;
2245 vars.porosity = phi;
2246
2248
2251 vars, pos, t, dt));
2253 .template value<double>(vars, pos, t, dt);
2255 .template value<double>(vars, pos, t, dt);
2256
2257 // Darcy flux
2258 GlobalDimVectorType const q =
2259 _process_data.has_gravity
2260 ? GlobalDimVectorType(-k / mu * (dNdx * p - rho * b))
2261 : GlobalDimVectorType(-k / mu * dNdx * p);
2262
2263 auto const alpha_T = medium.template value<double>(
2265 auto const alpha_L = medium.template value<double>(
2269 .value(vars, pos, t, dt));
2270
2271 // Hydrodynamic dispersion
2273 _process_data.stabilizer, _element.getID(), Dp, q, phi, alpha_T,
2274 alpha_L);
2275
2276 cache_mat.col(ip).noalias() = q * c_ip - D * dNdx * c;
2277 }
2278
2279 return cache;
2280 }
Eigen::Map< const Vector > toVector(std::vector< double > const &data, Eigen::VectorXd::Index size)
Creates an Eigen mapped vector from the given data vector.

References _element, _integration_method, _ip_data, _process_data, _transport_process_variables, MaterialPropertyLib::AqueousLiquid, NumLib::computeHydrodynamicDispersion(), MaterialPropertyLib::VariableArray::concentration, concentration_size, MathLib::createZeroedMatrix(), MaterialPropertyLib::density, first_concentration_index, MaterialPropertyLib::formEigenTensor(), NumLib::getIndices(), getName(), NumLib::interpolateCoordinates(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::longitudinal_dispersivity, MaterialPropertyLib::permeability, MaterialPropertyLib::pore_diffusion, MaterialPropertyLib::VariableArray::porosity, pressure_index, MathLib::toVector(), MaterialPropertyLib::transversal_dispersivity, and MaterialPropertyLib::viscosity.

◆ getLocalTemperature()

template<typename ShapeFunction, int GlobalDim>
NodalVectorType ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::getLocalTemperature ( double const t,
Eigen::VectorXd const & local_x ) const
inlineprivate

Definition at line 2385 of file ComponentTransportFEM.h.

2387 {
2389 if (_process_data.isothermal)
2390 {
2391 if (_process_data.temperature)
2392 {
2393 local_T = _process_data.temperature->getNodalValuesOnElement(
2394 _element, t);
2395 }
2396 else
2397 {
2399 }
2400 }
2401 else
2402 {
2403 local_T =
2405 }
2406 return local_T;
2407 }

References _element, _process_data, temperature_index, and temperature_size.

Referenced by assembleComponentTransportEquation(), assembleHeatTransportEquation(), assembleHydraulicEquation(), assembleWithJacobianComponentTransportEquation(), and computeSecondaryVariableConcrete().

◆ getShapeMatrix()

template<typename ShapeFunction, int GlobalDim>
Eigen::Map< const Eigen::RowVectorXd > ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::getShapeMatrix ( const unsigned integration_point) const
inlineoverridevirtual

Provides the shape matrix at the given integration point.

Implements NumLib::ExtrapolatableElement.

Definition at line 1988 of file ComponentTransportFEM.h.

1990 {
1991 auto const& N = _process_data.shape_matrix_cache.NsHigherOrder<
1993
1994 // assumes N is stored contiguously in memory
1995 return Eigen::Map<const Eigen::RowVectorXd>(N.data(), N.size());
1996 }

References _process_data.

◆ getThermalConductivityDispersivity()

template<typename ShapeFunction, int GlobalDim>
GlobalDimMatrixType ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::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 )
inlineprivate

Definition at line 2344 of file ComponentTransportFEM.h.

2350 {
2351 auto const& medium =
2352 *_process_data.media_map.getMedium(_element.getID());
2353
2356 medium
2357 .property(
2359 .value(vars, pos, t, dt));
2360
2362 medium
2365 .template value<double>();
2366
2368 medium
2371 .template value<double>();
2372
2373 // Thermal conductivity is moved outside and zero matrix is passed
2374 // instead due to multiplication with fluid's density times specific
2375 // heat capacity.
2376 return thermal_conductivity +
2379 _process_data.stabilizer, _element.getID(),
2383 }

References _element, _process_data, NumLib::computeHydrodynamicDispersion(), MaterialPropertyLib::formEigenTensor(), and MaterialPropertyLib::thermal_conductivity.

Referenced by assembleHeatTransportEquation().

◆ initializeChemicalSystemConcrete()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::initializeChemicalSystemConcrete ( Eigen::VectorXd const & local_x,
double const t )
inlineoverridevirtual

Implements ProcessLib::ComponentTransport::ComponentTransportLocalAssemblerInterface.

Definition at line 323 of file ComponentTransportFEM.h.

325 {
326 assert(_process_data.chemical_solver_interface);
327
328 auto const& medium =
329 *_process_data.media_map.getMedium(_element.getID());
330
331 auto const& Ns =
332 _process_data.shape_matrix_cache
333 .NsHigherOrder<typename ShapeFunction::MeshElement>();
334
335 unsigned const n_integration_points =
336 _integration_method.getNumberOfPoints();
337
338 for (unsigned ip = 0; ip < n_integration_points; ip++)
339 {
340 auto& ip_data = _ip_data[ip];
341 auto const& N = Ns[ip];
342 auto const& chemical_system_id = ip_data.chemical_system_id;
343
345 {}, _element.getID(),
349 N)));
350
351 auto const n_component = _transport_process_variables.size();
353 for (unsigned component_id = 0; component_id < n_component;
354 ++component_id)
355 {
356 auto const concentration_index =
359 auto const local_C =
362
365 }
366
367 _process_data.chemical_solver_interface
368 ->initializeChemicalSystemConcrete(C_int_pt, chemical_system_id,
369 medium, pos, t);
370 }
371 }

References _element, _integration_method, _ip_data, _process_data, _transport_process_variables, concentration_size, first_concentration_index, NumLib::interpolateCoordinates(), and NumLib::detail::shapeFunctionInterpolate().

◆ postSpeciationCalculation()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::postSpeciationCalculation ( std::size_t const ele_id,
double const t,
double const dt )
inlineoverridevirtual

Implements ProcessLib::ComponentTransport::ComponentTransportLocalAssemblerInterface.

Definition at line 443 of file ComponentTransportFEM.h.

445 {
446 if (!_process_data.chemically_induced_porosity_change)
447 {
448 return;
449 }
450
451 auto const& medium = *_process_data.media_map.getMedium(ele_id);
452
454 pos.setElementID(ele_id);
455
456 for (auto& ip_data : _ip_data)
457 {
458 ip_data.porosity = ip_data.porosity_prev;
459
460 _process_data.chemical_solver_interface
461 ->updateVolumeFractionPostReaction(ip_data.chemical_system_id,
462 medium, pos,
463 ip_data.porosity, t, dt);
464
465 _process_data.chemical_solver_interface->updatePorosityPostReaction(
466 ip_data.chemical_system_id, medium, ip_data.porosity);
467 }
468 }

References _ip_data, _process_data, and ParameterLib::SpatialPosition::setElementID().

◆ postTimestepConcrete()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::postTimestepConcrete ( Eigen::VectorXd const & ,
Eigen::VectorXd const & ,
double const ,
double const ,
int const  )
inlineoverridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 2282 of file ComponentTransportFEM.h.

2286 {
2287 unsigned const n_integration_points =
2288 _integration_method.getNumberOfPoints();
2289
2290 for (unsigned ip = 0; ip < n_integration_points; ip++)
2291 {
2292 _ip_data[ip].pushBackState();
2293 }
2294 }

References _integration_method, and _ip_data.

◆ setChemicalSystemConcrete()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::setChemicalSystemConcrete ( Eigen::VectorXd const & local_x,
double const t,
double dt )
inlineoverridevirtual

Implements ProcessLib::ComponentTransport::ComponentTransportLocalAssemblerInterface.

Definition at line 373 of file ComponentTransportFEM.h.

375 {
376 assert(_process_data.chemical_solver_interface);
377
378 auto const& medium =
379 _process_data.media_map.getMedium(_element.getID());
380
383
384 auto const& Ns =
385 _process_data.shape_matrix_cache
386 .NsHigherOrder<typename ShapeFunction::MeshElement>();
387
388 unsigned const n_integration_points =
389 _integration_method.getNumberOfPoints();
390
391 for (unsigned ip = 0; ip < n_integration_points; ip++)
392 {
393 auto& ip_data = _ip_data[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;
398
400 {}, _element.getID(),
404 N)));
405
406 auto const n_component = _transport_process_variables.size();
408
409 for (unsigned component_id = 0; component_id < n_component;
410 ++component_id)
411 {
412 auto const concentration_index =
415 auto const local_C =
418
421 }
422
423 {
424 vars_prev.porosity = porosity_prev;
425
426 porosity =
427 _process_data.chemically_induced_porosity_change
429 : medium
430 ->property(
432 .template value<double>(vars, vars_prev, pos, t,
433 dt);
434
435 vars.porosity = porosity;
436 }
437
438 _process_data.chemical_solver_interface->setChemicalSystemConcrete(
440 }
441 }

References _element, _integration_method, _ip_data, _process_data, _transport_process_variables, concentration_size, first_concentration_index, NumLib::interpolateCoordinates(), MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, and NumLib::detail::shapeFunctionInterpolate().

◆ setChemicalSystemID()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::setChemicalSystemID ( std::size_t const )
inlineoverridevirtual

Implements ProcessLib::ComponentTransport::ComponentTransportLocalAssemblerInterface.

Definition at line 303 of file ComponentTransportFEM.h.

304 {
305 assert(_process_data.chemical_solver_interface);
306 // chemical system index map
308 _process_data.chemical_solver_interface->chemical_system_index_map;
309
310 unsigned const n_integration_points =
311 _integration_method.getNumberOfPoints();
312 for (unsigned ip = 0; ip < n_integration_points; ip++)
313 {
314 _ip_data[ip].chemical_system_id =
316 ? 0
317 : chemical_system_index_map.back() + 1;
320 }
321 }

References _integration_method, _ip_data, and _process_data.

◆ updateAveragePorosity()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::updateAveragePorosity ( std::size_t const ele_id)
inlineprivate

Averages ip_data.porosity over the element's integration points and writes it into the porosity_avg mesh output for ele_id.

Definition at line 2299 of file ComponentTransportFEM.h.

2300 {
2301 auto const n_integration_points =
2302 _integration_method.getNumberOfPoints();
2303 (*_process_data.mesh_prop_porosity)[ele_id] =
2304 std::accumulate(_ip_data.begin(), _ip_data.end(), 0.,
2305 [](double const s, auto const& ip)
2306 { return s + ip.porosity; }) /
2308 }

References _integration_method, _ip_data, and _process_data.

Referenced by computeReactionRelatedSecondaryVariable(), and computeSecondaryVariableConcrete().

Member Data Documentation

◆ _element

◆ _integration_method

◆ _ip_data

◆ _process_data

◆ _transport_process_variables

◆ concentration_size

◆ first_concentration_index

◆ pressure_index

◆ pressure_size

◆ temperature_index

template<typename ShapeFunction, int GlobalDim>
const int ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::temperature_index = -1
private

◆ temperature_size

template<typename ShapeFunction, int GlobalDim>
const int ProcessLib::ComponentTransport::LocalAssemblerData< ShapeFunction, GlobalDim >::temperature_size = ShapeFunction::NPOINTS
staticprivate

The documentation for this class was generated from the following file: