OGS
ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim > Class Template Reference

Detailed Description

template<typename ShapeFunction, int GlobalDim>
class ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >

Definition at line 29 of file ThermoRichardsFlowFEM.h.

#include <ThermoRichardsFlowFEM.h>

Inheritance diagram for ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >:
[legend]
Collaboration diagram for ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >:
[legend]

Public Types

using ShapeMatricesType = ShapeMatrixPolicyType<ShapeFunction, GlobalDim>
using GlobalDimMatrixType = typename ShapeMatricesType::GlobalDimMatrixType
using GlobalDimVectorType = typename ShapeMatricesType::GlobalDimVectorType
using IpData = IntegrationPointData<ShapeMatricesType>

Public Member Functions

 ThermoRichardsFlowLocalAssembler (ThermoRichardsFlowLocalAssembler const &)=delete
 ThermoRichardsFlowLocalAssembler (ThermoRichardsFlowLocalAssembler &&)=delete
 ThermoRichardsFlowLocalAssembler (MeshLib::Element const &e, std::size_t const, NumLib::GenericIntegrationMethod const &integration_method, bool const is_axially_symmetric, ThermoRichardsFlowProcessData &process_data)
std::size_t setIPDataInitialConditions (std::string_view const name, double const *values, int const integration_order) override
void setInitialConditionsConcrete (Eigen::VectorXd const local_x, double const t, int const process_id) override
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_rhs_data, std::vector< double > &local_Jac_data) override
void assemble (double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &local_x_prev, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_rhs_data) override
void initializeConcrete () override
void postTimestepConcrete (Eigen::VectorXd const &, Eigen::VectorXd const &, double const, double const, int const) override
void computeSecondaryVariableConcrete (double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev) override
Eigen::Map< const Eigen::RowVectorXd > getShapeMatrix (const unsigned integration_point) const override
 Provides the shape matrix at the given integration point.
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 > getSaturation () const override
std::vector< double > const & getIntPtSaturation (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 > getPorosity () const override
std::vector< double > const & getIntPtPorosity (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 & getIntPtDryDensitySolid (const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override
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 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)
virtual 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)
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< double > const &) const
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 Member Functions

unsigned getNumberOfIntegrationPoints () const override

Private Attributes

ThermoRichardsFlowProcessData_process_data
std::vector< IpData, Eigen::aligned_allocator< IpData > > _ip_data
NumLib::GenericIntegrationMethod const & _integration_method
MeshLib::Element const & _element
bool const _is_axially_symmetric

Static Private Attributes

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

Member Typedef Documentation

◆ GlobalDimMatrixType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::GlobalDimMatrixType = typename ShapeMatricesType::GlobalDimMatrixType

Definition at line 36 of file ThermoRichardsFlowFEM.h.

◆ GlobalDimVectorType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::GlobalDimVectorType = typename ShapeMatricesType::GlobalDimVectorType

Definition at line 37 of file ThermoRichardsFlowFEM.h.

◆ IpData

◆ ShapeMatricesType

template<typename ShapeFunction, int GlobalDim>
using ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::ShapeMatricesType = ShapeMatrixPolicyType<ShapeFunction, GlobalDim>

Definition at line 34 of file ThermoRichardsFlowFEM.h.

Constructor & Destructor Documentation

◆ ThermoRichardsFlowLocalAssembler() [1/3]

◆ ThermoRichardsFlowLocalAssembler() [2/3]

template<typename ShapeFunction, int GlobalDim>
ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::ThermoRichardsFlowLocalAssembler ( ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim > && )
delete

◆ ThermoRichardsFlowLocalAssembler() [3/3]

template<typename ShapeFunction, int GlobalDim>
ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::ThermoRichardsFlowLocalAssembler ( MeshLib::Element const & e,
std::size_t const ,
NumLib::GenericIntegrationMethod const & integration_method,
bool const is_axially_symmetric,
ThermoRichardsFlowProcessData & process_data )

Definition at line 30 of file ThermoRichardsFlowFEM-impl.h.

39 _element(e),
41{
42 unsigned const n_integration_points =
43 _integration_method.getNumberOfPoints();
44
46
47 auto const shape_matrices =
50
51 auto const& medium = *_process_data.media_map.getMedium(_element.getID());
52
53 for (unsigned ip = 0; ip < n_integration_points; ip++)
54 {
55 auto const& sm = shape_matrices[ip];
56 _ip_data.emplace_back();
57 auto& ip_data = _ip_data[ip];
58 _ip_data[ip].integration_weight =
59 _integration_method.getWeightedPoint(ip).getWeight() *
60 sm.integralMeasure * sm.detJ;
61
62 ip_data.N = sm.N;
63 ip_data.dNdx = sm.dNdx;
64
66 std::nullopt, _element.getID(),
69 _element, sm.N))};
70 // Initial porosity. Could be read from integration point data or mesh.
73 std::numeric_limits<double>::quiet_NaN() /* t independent */);
74 }
75}
ShapeMatrixPolicyType< ShapeFunction, GlobalDim > ShapeMatricesType
std::vector< IpData, Eigen::aligned_allocator< IpData > > _ip_data
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)

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

Member Function Documentation

◆ assemble()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::assemble ( double const t,
double const dt,
std::vector< double > const & local_x,
std::vector< double > const & local_x_prev,
std::vector< double > & local_M_data,
std::vector< double > & local_K_data,
std::vector< double > & local_rhs_data )
overridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 680 of file ThermoRichardsFlowFEM-impl.h.

684{
687
691 auto const p_L = Eigen::Map<
694
695 auto const p_L_prev = Eigen::Map<
698
703
708
712
713 auto const& medium = *_process_data.media_map.getMedium(_element.getID());
714 auto const& liquid_phase =
716 auto const& solid_phase =
718 MPL::Phase const* gas_phase =
722
723 unsigned const n_integration_points =
724 _integration_method.getNumberOfPoints();
725 for (unsigned ip = 0; ip < n_integration_points; ip++)
726 {
727 auto const& w = _ip_data[ip].integration_weight;
728
729 auto const& N = _ip_data[ip].N;
730 auto const& dNdx = _ip_data[ip].dNdx;
731
733 std::nullopt, _element.getID(),
736 _element, N))};
737
738 double T_ip;
740
741 double p_cap_ip;
743
744 double p_cap_prev_ip;
746
747 variables.capillary_pressure = p_cap_ip;
748 variables.liquid_phase_pressure = -p_cap_ip;
749 // setting pG to 1 atm
750 // TODO : rewrite equations s.t. p_L = pG-p_cap
751 variables.gas_phase_pressure = 1.0e5;
752 variables.temperature = T_ip;
753
754 auto& S_L = _ip_data[ip].saturation;
755 auto const S_L_prev = _ip_data[ip].saturation_prev;
756 auto const alpha =
759
760 auto& solid_elasticity = *_process_data.simplified_elasticity;
761 // TODO (buchwaldj)
762 // is bulk_modulus good name for bulk modulus of solid skeleton?
763 auto const beta_S =
764 solid_elasticity.bulkCompressibilityFromYoungsModulus(
766 auto const beta_SR = (1 - alpha) * beta_S;
767 variables.grain_compressibility = beta_SR;
768
769 auto const rho_LR =
772 auto const& b = _process_data.specific_body_force;
773
774 double const drho_LR_dp =
777 dt);
778 auto const beta_LR = drho_LR_dp / rho_LR;
779
782 variables.liquid_saturation = S_L;
783 variables_prev.liquid_saturation = S_L_prev;
784
785 // tangent derivative for Jacobian
786 double const dS_L_dp_cap =
789 dt);
790 // secant derivative from time discretization for storage
791 // use tangent, if secant is not available
792 double const DeltaS_L_Deltap_cap =
796
797 auto chi_S_L = S_L;
798 auto chi_S_L_prev = S_L_prev;
800 {
801 auto const chi = [&medium, x_position, t, dt](double const S_L)
802 {
803 MPL::VariableArray variables;
804 variables.liquid_saturation = S_L;
805 return medium[MPL::PropertyType::bishops_effective_stress]
806 .template value<double>(variables, x_position, t, dt);
807 };
808 chi_S_L = chi(S_L);
810 }
811 // TODO (buchwaldj)
812 // should solid_grain_pressure or effective_pore_pressure remain?
813 // double const p_FR = -chi_S_L * p_cap_ip;
814 // variables.solid_grain_pressure = p_FR;
815
816 variables.effective_pore_pressure = -chi_S_L * p_cap_ip;
817 variables_prev.effective_pore_pressure = -chi_S_L_prev * p_cap_prev_ip;
818
819 auto& phi = _ip_data[ip].porosity;
820 { // Porosity update
821
822 variables_prev.porosity = _ip_data[ip].porosity_prev;
825 variables.porosity = phi;
826 }
827
828 if (alpha < phi)
829 {
830 OGS_FATAL(
831 "ThermoRichardsFlow: Biot-coefficient {} is smaller than "
832 "porosity {} in element/integration point {}/{}.",
833 alpha, phi, _element.getID(), ip);
834 }
835
836 double const k_rel =
838 .template value<double>(variables, x_position, t, dt);
839 auto const mu =
842
845 t, dt));
846
850
853
854 // Consider anisotropic thermal expansion.
855 // Read in 3x3 tensor. 2D case also requires expansion coeff. for z-
856 // component.
863
864 auto const rho_SR =
867
868 //
869 // pressure equation, pressure part.
870 //
871 local_K
874 .noalias() += dNdx.transpose() * k_rel * rho_Ki_over_mu * dNdx * w;
875
876 const double alphaB_minus_phi = alpha - phi;
877 double const a0 = alphaB_minus_phi * beta_SR;
878 double const specific_storage_a_p =
879 S_L * (phi * beta_LR + S_L * a0 +
880 chi_S_L * alpha * alpha *
881 solid_elasticity.storageContribution(
883 double const specific_storage_a_S = phi - p_cap_ip * S_L * a0;
884
885 local_M
888 .noalias() += N.transpose() * rho_LR *
891 N * w;
892
893 local_rhs.template segment<pressure_size>(pressure_index).noalias() +=
894 dNdx.transpose() * rho_LR * k_rel * rho_Ki_over_mu * b * w;
895
896 //
897 // pressure equation, temperature part.
898 //
901 x_position, t, dt);
902 const double eff_thermal_expansion =
906 alpha * solid_elasticity.thermalExpansivityContribution(
909
910 local_K
913 .noalias() +=
914 dNdx.transpose() * rho_LR * K_pT_thermal_osmosis * dNdx * w;
915
916 local_M
919 .noalias() -=
920 N.transpose() * rho_LR * eff_thermal_expansion * N * w;
921
922 //
923 // temperature equation.
924 //
925 {
928 .template value<double>(variables, x_position, t, dt);
929
933 .template value<double>(variables, x_position, t, dt);
934
935 local_M
938 .noalias() +=
939 w *
942 N.transpose() * N;
943
944 auto const thermal_conductivity =
949
951 -Ki_over_mu * k_rel * (dNdx * p_L - rho_LR * b) -
953
954 local_K
957 .noalias() += (dNdx.transpose() * thermal_conductivity * dNdx +
958 N.transpose() * velocity_L.transpose() * dNdx *
960 w;
961 local_K
964 .noalias() +=
965 dNdx.transpose() * T_ip * K_pT_thermal_osmosis * dNdx * w;
966 }
967 if (gas_phase && S_L < 1.0)
968 {
969 variables.density = rho_LR;
970
971 double const rho_wv =
973 .template value<double>(variables, x_position, t, dt);
974
975 double const drho_wv_dT =
977 .template dValue<double>(variables,
979 x_position, t, dt);
980 double const drho_wv_dp =
982 .template dValue<double>(
984 x_position, t, dt);
985 auto const f_Tv =
987 ->property(
989 .template value<double>(variables, x_position, t, dt);
990
991 variables.porosity = phi;
992 auto const tortuosity =
994 .template value<double>(variables, x_position, t, dt);
995 double const D_v =
996 phi * (1.0 - S_L) * tortuosity *
998 .template value<double>(variables, x_position, t, dt);
999
1000 double const f_Tv_D_Tv = f_Tv * D_v * drho_wv_dT;
1001 double const D_pv = D_v * drho_wv_dp;
1002
1003 GlobalDimVectorType const grad_T = dNdx * T;
1007 double const specific_heat_capacity_vapour =
1009 .template value<double>(variables, x_position, t, dt);
1010
1011 local_M
1014 .noalias() +=
1015 w * (rho_wv * specific_heat_capacity_vapour * (1 - S_L) * phi) *
1016 N.transpose() * N;
1017
1018 local_K
1021 .noalias() += N.transpose() * vapour_flux.transpose() * dNdx *
1023
1025 phi * (rho_wv * dS_L_dp_cap + (1 - S_L) * drho_wv_dp);
1026 local_M
1029 .noalias() +=
1030 N.transpose() * storage_coefficient_by_water_vapor * N * w;
1031
1032 double const vapor_expansion_factor = phi * (1 - S_L) * drho_wv_dT;
1033 local_M
1036 .noalias() += N.transpose() * vapor_expansion_factor * N * w;
1037
1039 .noalias() -= f_Tv_D_Tv * dNdx.transpose() * (dNdx * T) * w;
1040
1041 local_K
1044 .noalias() += dNdx.transpose() * D_pv * dNdx * w;
1045
1046 //
1047 // Latent heat term
1048 //
1050 {
1051 double const factor = phi * (1 - S_L) / rho_LR;
1052 // The volumetric latent heat of vaporization of liquid water
1053 double const L0 =
1055 .template value<double>(variables, x_position, t, dt) *
1056 rho_LR;
1057
1058 double const drho_LR_dT =
1060 .template dValue<double>(variables,
1062 x_position, t, dt);
1063
1064 double const rho_wv_over_rho_L = rho_wv / rho_LR;
1065 local_M
1068 .noalias() +=
1069 factor * L0 *
1071 N.transpose() * N * w;
1072
1073 local_M
1076 .noalias() +=
1077 (factor * L0 *
1080 N.transpose() * N * w;
1081
1082 // temperature equation, temperature part
1083 local_K
1086 .noalias() +=
1087 L0 * f_Tv_D_Tv * dNdx.transpose() * dNdx * w / rho_LR;
1088 // temperature equation, pressure part
1089 local_K
1092 .noalias() +=
1093 L0 * D_pv * dNdx.transpose() * dNdx * w / rho_LR;
1094 }
1095 }
1096 }
1097
1098 if (_process_data.apply_mass_lumping)
1099 {
1102 Mpp = Mpp.colwise().sum().eval().asDiagonal();
1103 }
1104}
#define OGS_FATAL(...)
Definition Error.h:10
typename ShapeMatricesType::GlobalDimVectorType GlobalDimVectorType
typename ShapeMatricesType::GlobalDimMatrixType GlobalDimMatrixType
constexpr Eigen::Matrix< double, GlobalDim, GlobalDim > formEigenTensor(MaterialPropertyLib::PropertyDataType const &values)
template Eigen::Matrix< double, 3, 3 > formEigenTensor< 3 >(MaterialPropertyLib::PropertyDataType const &values)
double getLiquidThermalExpansivity(Phase const &phase, VariableArray const &vars, const double density, ParameterLib::SpatialPosition const &pos, double const t, double const dt)
void shapeFunctionInterpolate(const NodalValues &, const ShapeMatrix &)
Eigen::Matrix< double, GlobalDim, GlobalDim > getThermoOsmoticCoefficient(MaterialPropertyLib::Medium const &medium, MaterialPropertyLib::VariableArray const &variable_array, ParameterLib::SpatialPosition const &pos, double const t, double const dt, Eigen::Matrix< double, GlobalDim, GlobalDim > const &intrinsic_permeability, double const liquid_dynamic_viscosity)

References _element, _integration_method, _ip_data, _process_data, MaterialPropertyLib::AqueousLiquid, MaterialPropertyLib::biot_coefficient, MaterialPropertyLib::bishops_effective_stress, MaterialPropertyLib::capillary_pressure, MaterialPropertyLib::VariableArray::capillary_pressure, MathLib::createZeroedMatrix(), MathLib::createZeroedVector(), MaterialPropertyLib::density, MaterialPropertyLib::VariableArray::density, MaterialPropertyLib::diffusion, MaterialPropertyLib::VariableArray::effective_pore_pressure, MaterialPropertyLib::formEigenTensor(), MaterialPropertyLib::formEigenTensor< 3 >(), MaterialPropertyLib::Gas, MaterialPropertyLib::VariableArray::gas_phase_pressure, MaterialPropertyLib::getLiquidThermalExpansivity(), ProcessLib::getThermoOsmoticCoefficient(), MaterialPropertyLib::VariableArray::grain_compressibility, MaterialPropertyLib::Phase::hasProperty(), NumLib::interpolateCoordinates(), MaterialPropertyLib::liquid_phase_pressure, MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::VariableArray::liquid_saturation, OGS_FATAL, MaterialPropertyLib::permeability, MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, pressure_index, pressure_size, MaterialPropertyLib::Phase::property(), MaterialPropertyLib::relative_permeability, MaterialPropertyLib::saturation, NumLib::detail::shapeFunctionInterpolate(), MaterialPropertyLib::Solid, MaterialPropertyLib::specific_heat_capacity, MaterialPropertyLib::specific_latent_heat, MaterialPropertyLib::temperature, MaterialPropertyLib::VariableArray::temperature, temperature_index, temperature_size, MaterialPropertyLib::thermal_diffusion_enhancement_factor, MaterialPropertyLib::thermal_expansivity, MaterialPropertyLib::tortuosity, and MaterialPropertyLib::viscosity.

◆ assembleWithJacobian()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::assembleWithJacobian ( double const t,
double const dt,
std::vector< double > const & local_x,
std::vector< double > const & local_x_prev,
std::vector< double > & local_rhs_data,
std::vector< double > & local_Jac_data )
overridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 150 of file ThermoRichardsFlowFEM-impl.h.

156{
159
163 auto const p_L = Eigen::Map<
166
167 auto const T_prev =
171 auto const p_L_prev = Eigen::Map<
174
179
183
209
212
215
216 auto const& medium = *_process_data.media_map.getMedium(_element.getID());
217 auto const& liquid_phase =
219 auto const& solid_phase =
221 MPL::Phase const* gas_phase =
225
226 unsigned const n_integration_points =
227 _integration_method.getNumberOfPoints();
228 for (unsigned ip = 0; ip < n_integration_points; ip++)
229 {
230 auto const& w = _ip_data[ip].integration_weight;
231
232 auto const& N = _ip_data[ip].N;
233 auto const& dNdx = _ip_data[ip].dNdx;
234
236 std::nullopt, _element.getID(),
239 _element, N))};
240
241 double T_ip;
243
244 double p_cap_ip;
246
247 double p_cap_prev_ip;
249
250 variables.capillary_pressure = p_cap_ip;
251 variables.liquid_phase_pressure = -p_cap_ip;
252 // setting pG to 1 atm
253 // TODO : rewrite equations s.t. p_L = pG-p_cap
254 variables.gas_phase_pressure = 1.0e5;
255 variables.temperature = T_ip;
256
257 auto& S_L = _ip_data[ip].saturation;
258 auto const S_L_prev = _ip_data[ip].saturation_prev;
259 auto const alpha =
262
263 auto& solid_elasticity = *_process_data.simplified_elasticity;
264 // TODO (buchwaldj)
265 // is bulk_modulus good name for bulk modulus of solid skeleton?
266 auto const beta_S =
267 solid_elasticity.bulkCompressibilityFromYoungsModulus(
269 auto const beta_SR = (1 - alpha) * beta_S;
270 variables.grain_compressibility = beta_SR;
271
272 auto const rho_LR =
275 variables.density = rho_LR;
276 auto const& b = _process_data.specific_body_force;
277
278 double const drho_LR_dp =
281 dt);
282 auto const beta_LR = drho_LR_dp / rho_LR;
283
286 variables.liquid_saturation = S_L;
287 variables_prev.liquid_saturation = S_L_prev;
288
289 // tangent derivative for Jacobian
290 double const dS_L_dp_cap =
293 dt);
294 // secant derivative from time discretization for storage
295 // use tangent, if secant is not available
296 double const DeltaS_L_Deltap_cap =
300
301 auto chi_S_L = S_L;
302 auto chi_S_L_prev = S_L_prev;
303 auto dchi_dS_L = 1.0;
305 {
306 auto const chi = [&medium, x_position, t, dt](double const S_L)
307 {
308 MPL::VariableArray variables;
309 variables.liquid_saturation = S_L;
310 return medium[MPL::PropertyType::bishops_effective_stress]
311 .template value<double>(variables, x_position, t, dt);
312 };
313 chi_S_L = chi(S_L);
315
317 .template dValue<double>(
319 x_position, t, dt);
320 }
321 // TODO (buchwaldj)
322 // should solid_grain_pressure or effective_pore_pressure remain?
323 // double const p_FR = -chi_S_L * p_cap_ip;
324 // variables.solid_grain_pressure = p_FR;
325
326 variables.effective_pore_pressure = -chi_S_L * p_cap_ip;
327 variables_prev.effective_pore_pressure = -chi_S_L_prev * p_cap_prev_ip;
328
329 auto& phi = _ip_data[ip].porosity;
330 { // Porosity update
331
332 variables_prev.porosity = _ip_data[ip].porosity_prev;
335 variables.porosity = phi;
336 }
337
338 if (alpha < phi)
339 {
340 OGS_FATAL(
341 "ThermoRichardsFlow: Biot-coefficient {} is smaller than "
342 "porosity {} in element/integration point {}/{}.",
343 alpha, phi, _element.getID(), ip);
344 }
345
346 double const k_rel =
348 .template value<double>(variables, x_position, t, dt);
349 auto const mu =
352
355 t, dt));
356
359
363
364 // Consider anisotropic thermal expansion.
365 // Read in 3x3 tensor. 2D case also requires expansion coeff. for z-
366 // component.
373
374 auto const rho_SR =
377
378 //
379 // pressure equation, pressure part.
380 //
381 laplace_p.noalias() +=
382 dNdx.transpose() * k_rel * rho_Ki_over_mu * dNdx * w;
383 laplace_T.noalias() +=
384 dNdx.transpose() * rho_LR * K_pT_thermal_osmosis * dNdx * w;
385 const double alphaB_minus_phi = alpha - phi;
386 double const a0 = alphaB_minus_phi * beta_SR;
387 double const specific_storage_a_p =
388 S_L * (phi * beta_LR + S_L * a0 +
389 chi_S_L * alpha * alpha *
390 solid_elasticity.storageContribution(
392 double const specific_storage_a_S = phi - p_cap_ip * S_L * a0;
393
394 double const dspecific_storage_a_p_dp_cap =
395 dS_L_dp_cap * (phi * beta_LR + 2 * S_L * a0 +
396 alpha * alpha *
397 solid_elasticity.storageContribution(
399 (chi_S_L + dchi_dS_L * S_L));
400 double const dspecific_storage_a_S_dp_cap =
401 -a0 * (S_L + p_cap_ip * dS_L_dp_cap);
402
403 storage_p_a_p.noalias() +=
404 N.transpose() * rho_LR * specific_storage_a_p * N * w;
405
406 storage_p_a_S.noalias() -= N.transpose() * rho_LR *
408 N * w;
409
413 .noalias() += N.transpose() * (p_cap_ip - p_cap_prev_ip) / dt *
415
416 storage_p_a_S_Jpp.noalias() -=
417 N.transpose() * rho_LR *
420 dt * N * w;
421
422 double const dk_rel_dS_L =
424 .template dValue<double>(variables,
426 x_position, t, dt);
431 .noalias() += dNdx.transpose() * rho_Ki_over_mu * grad_p_cap *
433
437 .noalias() += dNdx.transpose() * rho_LR * rho_Ki_over_mu * b *
439
440 local_rhs.template segment<pressure_size>(pressure_index).noalias() +=
441 dNdx.transpose() * rho_LR * k_rel * rho_Ki_over_mu * b * w;
442
443 //
444 // pressure equation, temperature part.
445 //
448 x_position, t, dt);
449 const double eff_thermal_expansion =
453 alpha * solid_elasticity.thermalExpansivityContribution(
456 M_pT.noalias() -=
457 N.transpose() * rho_LR * eff_thermal_expansion * N * w;
458
459 //
460 // temperature equation.
461 //
462 {
465 .template value<double>(variables, x_position, t, dt);
466
470 .template value<double>(variables, x_position, t, dt);
471
472 M_TT.noalias() +=
473 w *
476 N.transpose() * N;
477
478 auto const thermal_conductivity =
483
485 -Ki_over_mu * k_rel * (dNdx * p_L - rho_LR * b) -
487
488 K_TT.noalias() += (dNdx.transpose() * thermal_conductivity * dNdx +
489 N.transpose() * velocity_L.transpose() * dNdx *
491 w;
492
493 //
494 // temperature equation, pressure part
495 //
496 K_Tp.noalias() +=
497 dNdx.transpose() * T_ip * K_pT_thermal_osmosis * dNdx * w;
499 N.transpose() * (dNdx * T).transpose() *
500 k_rel * Ki_over_mu * dNdx * w;
501
503 N.transpose() * velocity_L.dot(dNdx * T) /
505 }
506 if (gas_phase && S_L < 1.0)
507 {
508 variables.density = rho_LR;
509
510 double const rho_wv =
512 .template value<double>(variables, x_position, t, dt);
513
514 double const drho_wv_dT =
516 .template dValue<double>(variables,
518 x_position, t, dt);
519 double const drho_wv_dp =
521 .template dValue<double>(
523 x_position, t, dt);
524 auto const f_Tv =
526 ->property(
528 .template value<double>(variables, x_position, t, dt);
529
530 variables.porosity = phi;
531 auto const tortuosity =
533 .template value<double>(variables, x_position, t, dt);
534 double const D_v =
535 phi * (1.0 - S_L) * tortuosity *
537 .template value<double>(variables, x_position, t, dt);
538
539 double const f_Tv_D_Tv = f_Tv * D_v * drho_wv_dT;
540 double const D_pv = D_v * drho_wv_dp;
541
545 double const specific_heat_capacity_vapour =
547 .template value<double>(variables, x_position, t, dt);
548
549 M_TT.noalias() +=
551 N.transpose() * N;
552
553 K_TT.noalias() += N.transpose() * vapour_flux.transpose() * dNdx *
555
557 phi * (rho_wv * dS_L_dp_cap + (1 - S_L) * drho_wv_dp);
558
559 storage_p_a_p.noalias() +=
560 N.transpose() * storage_coefficient_by_water_vapor * N * w;
561
562 double const vapor_expansion_factor = phi * (1 - S_L) * drho_wv_dT;
563 M_pT.noalias() += N.transpose() * vapor_expansion_factor * N * w;
564
568 .noalias() += dNdx.transpose() * f_Tv_D_Tv * dNdx * w;
569
571 .noalias() -= f_Tv_D_Tv * dNdx.transpose() * (dNdx * T) * w;
572
573 laplace_p.noalias() += dNdx.transpose() * D_pv * dNdx * w;
574
575 //
576 // Latent heat term
577 //
579 {
580 double const factor = phi * (1 - S_L) / rho_LR;
581 // The volumetric latent heat of vaporization of liquid water
582 double const L0 =
584 .template value<double>(variables, x_position, t, dt) *
585 rho_LR;
586
587 double const drho_LR_dT =
589 .template dValue<double>(variables,
591 x_position, t, dt);
592
593 double const rho_wv_over_rho_L = rho_wv / rho_LR;
594 M_TT.noalias() +=
595 factor * L0 *
597 N.transpose() * N * w;
598
599 M_Tp.noalias() +=
600 (factor * L0 *
603 N.transpose() * N * w;
604
605 // temperature equation, temperature part
606 K_TT.noalias() +=
607 L0 * f_Tv_D_Tv * dNdx.transpose() * dNdx * w / rho_LR;
608 // temperature equation, pressure part
609 K_Tp.noalias() +=
610 L0 * D_pv * dNdx.transpose() * dNdx * w / rho_LR;
611 }
612 }
613 }
614
615 if (_process_data.apply_mass_lumping)
616 {
617 storage_p_a_p = storage_p_a_p.colwise().sum().eval().asDiagonal();
618 storage_p_a_S = storage_p_a_S.colwise().sum().eval().asDiagonal();
620 storage_p_a_S_Jpp.colwise().sum().eval().asDiagonal();
621 }
622
623 //
624 // -- Jacobian
625 //
626 // temperature equation.
630 .noalias() += M_TT / dt + K_TT;
631 // temperature equation, pressure part
635 .noalias() += K_Tp + dK_TT_dp;
636
637 // pressure equation, pressure part.
641 .noalias() += laplace_p + storage_p_a_p / dt + storage_p_a_S_Jpp;
642
643 // pressure equation, temperature part (contributed by thermal expansion).
647 .noalias() += M_pT / dt + laplace_T;
648
649 //
650 // -- Residual
651 //
652 // temperature equation
654 M_TT * (T - T_prev) / dt + K_TT * T;
656 K_Tp * p_L;
657
658 // pressure equation
659 local_rhs.template segment<pressure_size>(pressure_index).noalias() -=
660 laplace_p * p_L + laplace_T * T +
662 M_pT * (T - T_prev) / dt;
663 if (gas_phase)
664 {
666 {
667 // Jacobian: temperature equation, pressure part
671 .noalias() += M_Tp / dt;
672 // RHS: temperature part
674 .noalias() -= M_Tp * (p_L - p_L_prev) / dt;
675 }
676 }
677}
MatrixType< ShapeFunction::NPOINTS, ShapeFunction::NPOINTS > NodalMatrixType

References _element, _integration_method, _ip_data, _process_data, MaterialPropertyLib::AqueousLiquid, MaterialPropertyLib::biot_coefficient, MaterialPropertyLib::bishops_effective_stress, MaterialPropertyLib::capillary_pressure, MaterialPropertyLib::VariableArray::capillary_pressure, MathLib::createZeroedMatrix(), MathLib::createZeroedVector(), MaterialPropertyLib::density, MaterialPropertyLib::VariableArray::density, MaterialPropertyLib::diffusion, MaterialPropertyLib::VariableArray::effective_pore_pressure, MaterialPropertyLib::formEigenTensor(), MaterialPropertyLib::formEigenTensor< 3 >(), MaterialPropertyLib::Gas, MaterialPropertyLib::VariableArray::gas_phase_pressure, MaterialPropertyLib::getLiquidThermalExpansivity(), ProcessLib::getThermoOsmoticCoefficient(), MaterialPropertyLib::VariableArray::grain_compressibility, MaterialPropertyLib::Phase::hasProperty(), NumLib::interpolateCoordinates(), MaterialPropertyLib::liquid_phase_pressure, MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::liquid_saturation, MaterialPropertyLib::VariableArray::liquid_saturation, OGS_FATAL, MaterialPropertyLib::permeability, MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, pressure_index, pressure_size, MaterialPropertyLib::Phase::property(), MaterialPropertyLib::relative_permeability, MaterialPropertyLib::saturation, NumLib::detail::shapeFunctionInterpolate(), MaterialPropertyLib::Solid, MaterialPropertyLib::specific_heat_capacity, MaterialPropertyLib::specific_latent_heat, MaterialPropertyLib::temperature, MaterialPropertyLib::VariableArray::temperature, temperature_index, temperature_size, MaterialPropertyLib::thermal_diffusion_enhancement_factor, MaterialPropertyLib::thermal_expansivity, MaterialPropertyLib::tortuosity, and MaterialPropertyLib::viscosity.

◆ computeSecondaryVariableConcrete()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::computeSecondaryVariableConcrete ( double const t,
double const dt,
Eigen::VectorXd const & local_x,
Eigen::VectorXd const & local_x_prev )
overridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 1187 of file ThermoRichardsFlowFEM-impl.h.

1191{
1192 auto const T =
1194
1195 auto const p_L = local_x.template segment<pressure_size>(pressure_index);
1196
1197 auto p_L_prev =
1199
1200 auto const& medium = *_process_data.media_map.getMedium(_element.getID());
1201 auto const& liquid_phase =
1203 auto const& solid_phase =
1207
1208 unsigned const n_integration_points =
1209 _integration_method.getNumberOfPoints();
1210
1211 double saturation_avg = 0;
1212 double porosity_avg = 0;
1213
1214 for (unsigned ip = 0; ip < n_integration_points; ip++)
1215 {
1216 auto const& N = _ip_data[ip].N;
1217
1219 std::nullopt, _element.getID(),
1222 _element, N))};
1223
1224 double T_ip;
1226
1227 double p_cap_ip;
1229
1230 double p_cap_prev_ip;
1232
1233 variables.capillary_pressure = p_cap_ip;
1234 variables.liquid_phase_pressure = -p_cap_ip;
1235 // setting pG to 1 atm
1236 // TODO : rewrite equations s.t. p_L = pG-p_cap
1237 variables.gas_phase_pressure = 1.0e5;
1238
1239 variables.temperature = T_ip;
1240
1241 auto& S_L = _ip_data[ip].saturation;
1242 auto const S_L_prev = _ip_data[ip].saturation_prev;
1245 variables.liquid_saturation = S_L;
1246 variables_prev.liquid_saturation = S_L_prev;
1247
1248 auto chi_S_L = S_L;
1249 auto chi_S_L_prev = S_L_prev;
1251 {
1252 auto const chi = [&medium, x_position, t, dt](double const S_L)
1253 {
1255 variables.liquid_saturation = S_L;
1257 .template value<double>(variables, x_position, t, dt);
1258 };
1259 chi_S_L = chi(S_L);
1261 }
1262 variables.effective_pore_pressure = -chi_S_L * p_cap_ip;
1263 variables_prev.effective_pore_pressure = -chi_S_L_prev * p_cap_prev_ip;
1264
1265 auto const alpha =
1268
1269 auto& solid_elasticity = *_process_data.simplified_elasticity;
1270 auto const beta_S =
1271 solid_elasticity.bulkCompressibilityFromYoungsModulus(
1273 auto const beta_SR = (1 - alpha) * beta_S;
1274 variables.grain_compressibility = beta_SR;
1275
1276 auto& phi = _ip_data[ip].porosity;
1277 { // Porosity update
1278 variables_prev.porosity = _ip_data[ip].porosity_prev;
1281 variables.porosity = phi;
1282 }
1283
1284 auto const mu =
1287 auto const rho_LR =
1290
1293 t, dt));
1294
1295 double const k_rel =
1297 .template value<double>(variables, x_position, t, dt);
1298
1300
1301 auto const rho_SR =
1304 _ip_data[ip].dry_density_solid = (1 - phi) * rho_SR;
1305
1306 auto const& b = _process_data.specific_body_force;
1307
1311
1312 // Compute the velocity
1313 auto const& dNdx = _ip_data[ip].dNdx;
1314 _ip_data[ip].v_darcy.noalias() = -K_over_mu * dNdx * p_L -
1316 rho_LR * K_over_mu * b;
1317
1319 porosity_avg += phi;
1320 }
1323
1324 (*_process_data.element_saturation)[_element.getID()] = saturation_avg;
1325 (*_process_data.element_porosity)[_element.getID()] = porosity_avg;
1326}

References _element, _integration_method, _ip_data, _process_data, MaterialPropertyLib::AqueousLiquid, MaterialPropertyLib::biot_coefficient, MaterialPropertyLib::bishops_effective_stress, MaterialPropertyLib::VariableArray::capillary_pressure, MaterialPropertyLib::density, MaterialPropertyLib::VariableArray::effective_pore_pressure, MaterialPropertyLib::formEigenTensor(), MaterialPropertyLib::VariableArray::gas_phase_pressure, ProcessLib::getThermoOsmoticCoefficient(), MaterialPropertyLib::VariableArray::grain_compressibility, NumLib::interpolateCoordinates(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, MaterialPropertyLib::VariableArray::liquid_saturation, MaterialPropertyLib::permeability, MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, pressure_index, MaterialPropertyLib::relative_permeability, MaterialPropertyLib::saturation, NumLib::detail::shapeFunctionInterpolate(), MaterialPropertyLib::Solid, MaterialPropertyLib::VariableArray::temperature, temperature_index, and MaterialPropertyLib::viscosity.

◆ getIntPtDarcyVelocity()

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

Implements ProcessLib::ThermoRichardsFlow::LocalAssemblerInterface.

Definition at line 1108 of file ThermoRichardsFlowFEM-impl.h.

1114{
1115 unsigned const n_integration_points =
1116 _integration_method.getNumberOfPoints();
1117
1118 cache.clear();
1122
1123 for (unsigned ip = 0; ip < n_integration_points; ip++)
1124 {
1125 cache_matrix.col(ip).noalias() = _ip_data[ip].v_darcy;
1126 }
1127
1128 return cache;
1129}

References _integration_method, _ip_data, and MathLib::createZeroedMatrix().

◆ getIntPtDryDensitySolid()

template<typename ShapeFunction, int GlobalDim>
std::vector< double > const & ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::getIntPtDryDensitySolid ( const double t,
std::vector< GlobalVector * > const & x,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & dof_table,
std::vector< double > & cache ) const
overridevirtual

◆ getIntPtPorosity()

template<typename ShapeFunction, int GlobalDim>
std::vector< double > const & ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::getIntPtPorosity ( const double t,
std::vector< GlobalVector * > const & x,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & dof_table,
std::vector< double > & cache ) const
overridevirtual

◆ getIntPtSaturation()

template<typename ShapeFunction, int GlobalDim>
std::vector< double > const & ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::getIntPtSaturation ( const double t,
std::vector< GlobalVector * > const & x,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & dof_table,
std::vector< double > & cache ) const
overridevirtual

◆ getNumberOfIntegrationPoints()

template<typename ShapeFunction, int GlobalDim>
unsigned ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::getNumberOfIntegrationPoints ( ) const
overrideprivatevirtual

Implements ProcessLib::ThermoRichardsFlow::LocalAssemblerInterface.

Definition at line 1330 of file ThermoRichardsFlowFEM-impl.h.

1331{
1332 return _integration_method.getNumberOfPoints();
1333}

References _integration_method, and getNumberOfIntegrationPoints().

Referenced by getNumberOfIntegrationPoints().

◆ getPorosity()

template<typename ShapeFunction, int GlobalDim>
std::vector< double > ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::getPorosity ( ) const
overridevirtual

Implements ProcessLib::ThermoRichardsFlow::LocalAssemblerInterface.

Definition at line 1154 of file ThermoRichardsFlowFEM-impl.h.

1155{
1157 getIntPtPorosity(0, {}, {}, result);
1158 return result;
1159}
std::vector< double > const & getIntPtPorosity(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override

References getIntPtPorosity().

◆ getSaturation()

template<typename ShapeFunction, int GlobalDim>
std::vector< double > ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::getSaturation ( ) const
overridevirtual

Implements ProcessLib::ThermoRichardsFlow::LocalAssemblerInterface.

Definition at line 1133 of file ThermoRichardsFlowFEM-impl.h.

1134{
1136 getIntPtSaturation(0, {}, {}, result);
1137 return result;
1138}
std::vector< double > const & getIntPtSaturation(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override

References getIntPtSaturation(), and getSaturation().

Referenced by getSaturation().

◆ getShapeMatrix()

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

Provides the shape matrix at the given integration point.

Implements NumLib::ExtrapolatableElement.

Definition at line 106 of file ThermoRichardsFlowFEM.h.

108 {
109 auto const& N = _ip_data[integration_point].N;
110
111 // assumes N is stored contiguously in memory
112 return Eigen::Map<const Eigen::RowVectorXd>(N.data(), N.size());
113 }

References _ip_data.

◆ initializeConcrete()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::initializeConcrete ( )
inlineoverridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 76 of file ThermoRichardsFlowFEM.h.

77 {
78 unsigned const n_integration_points =
79 _integration_method.getNumberOfPoints();
80
81 for (unsigned ip = 0; ip < n_integration_points; ip++)
82 {
83 auto& ip_data = _ip_data[ip];
84 ip_data.pushBackState();
85 }
86 }

References _integration_method, and _ip_data.

◆ postTimestepConcrete()

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

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 88 of file ThermoRichardsFlowFEM.h.

92 {
93 unsigned const n_integration_points =
94 _integration_method.getNumberOfPoints();
95
96 for (unsigned ip = 0; ip < n_integration_points; ip++)
97 {
98 _ip_data[ip].pushBackState();
99 }
100 }

References _integration_method, and _ip_data.

◆ setInitialConditionsConcrete()

template<typename ShapeFunction, int GlobalDim>
void ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::setInitialConditionsConcrete ( Eigen::VectorXd const local_x,
double const t,
int const process_id )
overridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 107 of file ThermoRichardsFlowFEM-impl.h.

111{
113
114 auto const p_L = local_x.template segment<pressure_size>(pressure_index);
115
116 auto const& medium = *_process_data.media_map.getMedium(_element.getID());
118
119 unsigned const n_integration_points =
120 _integration_method.getNumberOfPoints();
121 for (unsigned ip = 0; ip < n_integration_points; ip++)
122 {
123 auto const& N = _ip_data[ip].N;
124
126 std::nullopt, _element.getID(),
129 _element, N))};
130
131 double p_cap_ip;
133
134 variables.capillary_pressure = p_cap_ip;
135 variables.liquid_phase_pressure = -p_cap_ip;
136 // setting pG to 1 atm
137 // TODO : rewrite equations s.t. p_L = pG-p_cap
138 variables.gas_phase_pressure = 1.0e5;
139
140 // Note: temperature dependent saturation model is not considered so
141 // far.
142 _ip_data[ip].saturation_prev =
146 }
147}

References _element, _integration_method, _ip_data, _process_data, MaterialPropertyLib::VariableArray::capillary_pressure, MaterialPropertyLib::VariableArray::gas_phase_pressure, NumLib::interpolateCoordinates(), MaterialPropertyLib::VariableArray::liquid_phase_pressure, pressure_index, pressure_size, MaterialPropertyLib::saturation, NumLib::detail::shapeFunctionInterpolate(), and temperature_size.

◆ setIPDataInitialConditions()

template<typename ShapeFunction, int GlobalDim>
std::size_t ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::setIPDataInitialConditions ( std::string_view const name,
double const * values,
int const integration_order )
overridevirtual
Returns
the number of read integration points.

Implements ProcessLib::ThermoRichardsFlow::LocalAssemblerInterface.

Definition at line 78 of file ThermoRichardsFlowFEM-impl.h.

82{
84 static_cast<int>(_integration_method.getIntegrationOrder()))
85 {
87 "Setting integration point initial conditions; The integration "
88 "order of the local assembler for element {:d} is different "
89 "from the integration order in the initial condition.",
90 _element.getID());
91 }
92
93 if (name == "saturation")
94 {
97 }
98 if (name == "porosity")
99 {
102 }
103 return 0;
104}
std::size_t setIntegrationPointScalarData(double const *values, IntegrationPointDataVector &ip_data_vector, MemberType IpData::*const member)

References _element, _integration_method, _ip_data, OGS_FATAL, ProcessLib::ThermoRichardsFlow::IntegrationPointData< ShapeMatricesType >::porosity, ProcessLib::ThermoRichardsFlow::IntegrationPointData< ShapeMatricesType >::saturation, and ProcessLib::setIntegrationPointScalarData().

Member Data Documentation

◆ _element

◆ _integration_method

◆ _ip_data

◆ _is_axially_symmetric

template<typename ShapeFunction, int GlobalDim>
bool const ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::_is_axially_symmetric
private

Definition at line 151 of file ThermoRichardsFlowFEM.h.

Referenced by ThermoRichardsFlowLocalAssembler().

◆ _process_data

◆ pressure_index

◆ pressure_size

template<typename ShapeFunction, int GlobalDim>
const int ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::pressure_size = ShapeFunction::NPOINTS
staticprivate

◆ temperature_index

template<typename ShapeFunction, int GlobalDim>
const int ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::temperature_index = 0
staticprivate

◆ temperature_size

template<typename ShapeFunction, int GlobalDim>
const int ProcessLib::ThermoRichardsFlow::ThermoRichardsFlowLocalAssembler< ShapeFunction, GlobalDim >::temperature_size = ShapeFunction::NPOINTS
staticprivate

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