diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp index 7766fbb107c04226a8941342db85504df0a52287..487d0c55796fbf1c1c7810b804f626e06a595331 100644 --- a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp +++ b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp @@ -105,12 +105,17 @@ createLiquidFlowMaterialProperties( "thermal_expansion", parameters, 1); DBUG("Use \'%s\' as solid thermal expansion.", solid_thermal_expansion.name.c_str()); + auto& biot_constant = findParameter<double>( + *solid_config, + //! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__solid__biot_constant} + "biot_constant", parameters, 1); return std::unique_ptr<LiquidFlowMaterialProperties>( new LiquidFlowMaterialProperties( std::move(fluid_properties), std::move(intrinsic_permeability_models), std::move(porosity_models), std::move(storage_models), - has_material_ids, material_ids, solid_thermal_expansion)); + has_material_ids, material_ids, solid_thermal_expansion, + biot_constant)); } else { @@ -121,7 +126,8 @@ createLiquidFlowMaterialProperties( std::move(fluid_properties), std::move(intrinsic_permeability_models), std::move(porosity_models), std::move(storage_models), - has_material_ids, material_ids, void_parameter)); + has_material_ids, material_ids, void_parameter, + void_parameter)); } } diff --git a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h index 1cedbbb231e7b356058621f45f396a1728504ed2..c28b5e44fdb05404ce5d4f5d9212a6ced04f7204 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h +++ b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h @@ -60,20 +60,45 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: { SpatialPosition pos; pos.setElementID(_element.getID()); - _material_properties->setMaterialID(pos); + const int material_id = _material_properties.getMaterialID(pos); - const Eigen::MatrixXd& perm = - _material_properties->getPermeability(t, pos, _element.getDimension()); + const Eigen::MatrixXd& perm = _material_properties.getPermeability( + material_id, t, pos, _element.getDimension()); // Note: For Inclined 1D in 2D/3D or 2D element in 3D, the first item in // the assert must be changed to perm.rows() == _element->getDimension() assert(perm.rows() == GlobalDim || perm.rows() == 1); - if (perm.size() == 1) // isotropic or 1D problem. - local_assemble<IsotropicCalculator>( - t, local_x, local_M_data, local_K_data, local_b_data, pos, perm); - else - local_assemble<AnisotropicCalculator>( - t, local_x, local_M_data, local_K_data, local_b_data, pos, perm); + const double dt = coupled_term.dt; + auto it = coupled_term.coupled_processes.begin(); + while (it != coupled_term.coupled_processes.end()) + { + switch (it->first) + { + case ProcessLib::ProcessType::HeatConductionProcess: + { + const auto local_T0 = coupled_term.local_coupled_xs0.at( + ProcessLib::ProcessType::HeatConductionProcess); + const auto local_T1 = coupled_term.local_coupled_xs.at( + ProcessLib::ProcessType::HeatConductionProcess); + + if (perm.size() == 1) // isotropic or 1D problem. + local_assembleCoupledWithHeatTransport<IsotropicCalculator>( + material_id, t, dt, local_x, local_T0, local_T1, + local_M_data, local_K_data, local_b_data, pos, perm); + else + local_assembleCoupledWithHeatTransport< + AnisotropicCalculator>( + material_id, t, dt, local_x, local_T0, local_T1, + local_M_data, local_K_data, local_b_data, pos, perm); + } + break; + default: + OGS_FATAL( + "This coupled process is not presented for " + "LiquidFlow process"); + } + it++; + } } template <typename ShapeFunction, typename IntegrationMethod, @@ -142,8 +167,9 @@ template <typename ShapeFunction, typename IntegrationMethod, template <typename LaplacianGravityVelocityCalculator> void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: local_assembleCoupledWithHeatTransport( - double const t, std::vector<double> const& local_x, - std::vector<double> const& local_T, std::vector<double>& local_M_data, + const int material_id, double const t, double const dt, + std::vector<double> const& local_x, std::vector<double> const& local_T0, + std::vector<double> const& local_T1, std::vector<double>& local_M_data, std::vector<double>& local_K_data, std::vector<double>& local_b_data, SpatialPosition const& pos, Eigen::MatrixXd const& perm) { @@ -171,28 +197,44 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: double p = 0.; NumLib::shapeFunctionInterpolate(local_x, sm.N, p); + double T0 = 0.; + NumLib::shapeFunctionInterpolate(local_T0, sm.N, T0); double T = 0.; - NumLib::shapeFunctionInterpolate(local_T, sm.N, T); + NumLib::shapeFunctionInterpolate(local_T1, sm.N, T); const double integration_factor = sm.integralMeasure * sm.detJ * wp.getWeight(); // Assemble mass matrix, M - local_M.noalias() += - _material_properties->getMassCoefficient(t, pos, porosity_variable, - storage_variable, p, T) * - sm.N.transpose() * sm.N * integration_factor; + local_M.noalias() += _material_properties.getMassCoefficient( + material_id, t, pos, porosity_variable, + storage_variable, p, T) * + sm.N.transpose() * sm.N * integration_factor; // Compute density: - const double rho_g = _material_properties->getLiquidDensity(p, T) * - _gravitational_acceleration; + const double rho = _material_properties.getLiquidDensity(p, T); + const double rho_g = rho * _gravitational_acceleration; + // Compute viscosity: - const double mu = _material_properties->getViscosity(p, T); + const double mu = _material_properties.getViscosity(p, T); // Assemble Laplacian, K, and RHS by the gravitational term LaplacianGravityVelocityCalculator::calculateLaplacianAndGravityTerm( local_K, local_b, sm, perm, integration_factor, mu, rho_g, _gravitational_axis_id); + + // Add the thermal expansion term + auto const solid_thermal_expansion = + _material_properties.getSolidThermalExpansion(t, pos); + auto const biot_constant = + _material_properties.getBiotConstant(t, pos); + auto const porosity = _material_properties.getPorosity( + material_id, porosity_variable, T); + const double eff_thermal_expansion = + 3.0 * (biot_constant - porosity) * solid_thermal_expansion + + porosity * _material_properties.getdLiquidDensity_dT(p, T) / rho; + local_b.noalias() += + eff_thermal_expansion * (T - T0) * integration_factor * sm.N / dt; } } @@ -258,7 +300,6 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: } } - template <typename ShapeFunction, typename IntegrationMethod, unsigned GlobalDim> template <typename LaplacianGravityVelocityCalculator> @@ -287,10 +328,10 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: double T = 0.; NumLib::shapeFunctionInterpolate(local_T, sm.N, T); - const double rho_g = _material_properties->getLiquidDensity(p, T) * + const double rho_g = _material_properties.getLiquidDensity(p, T) * _gravitational_acceleration; // Compute viscosity: - const double mu = _material_properties->getViscosity(p, T); + const double mu = _material_properties.getViscosity(p, T); LaplacianGravityVelocityCalculator::calculateVelocity( _darcy_velocities, local_p_vec, sm, perm, ip, mu, rho_g, diff --git a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h index 884fc8d2b6afba9863d04ed441a8e244a83bb32e..c8a61de086c371df3423d31cf1c92fc6bebe5e37 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h +++ b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h @@ -190,14 +190,11 @@ private: template <typename LaplacianGravityVelocityCalculator> void local_assembleCoupledWithHeatTransport( - double const t, - std::vector<double> const& local_x, - std::vector<double> const& local_T, - std::vector<double>& local_M_data, - std::vector<double>& local_K_data, - std::vector<double>& local_b_data, - SpatialPosition const& pos, - Eigen::MatrixXd const& perm); + const int material_id, double const t, double const dt, + std::vector<double> const& local_x, std::vector<double> const& local_T0, + std::vector<double> const& local_T1, std::vector<double>& local_M_data, + std::vector<double>& local_K_data, std::vector<double>& local_b_data, + SpatialPosition const& pos, Eigen::MatrixXd const& perm); template <typename LaplacianGravityVelocityCalculator> void computeSecondaryVariableLocal(double const /*t*/, diff --git a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp index 295423d505607bd7ade397e0425ae0221608b99d..2f99c1360cff4e955f7a0a1470d7859660a92501 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp +++ b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp @@ -55,6 +55,17 @@ double LiquidFlowMaterialProperties::getLiquidDensity(const double p, MaterialLib::Fluid::FluidPropertyType::Density, vars); } +double LiquidFlowMaterialProperties::getdLiquidDensity_dT(const double p, + const double T) const +{ + ArrayType vars; + vars[static_cast<int>(MaterialLib::Fluid::PropertyVariableType::T)] = T; + vars[static_cast<int>(MaterialLib::Fluid::PropertyVariableType::p)] = p; + return _fluid_properties->getdValue( + MaterialLib::Fluid::FluidPropertyType::Density, vars, + MaterialLib::Fluid::PropertyVariableType::T); +} + double LiquidFlowMaterialProperties::getViscosity(const double p, const double T) const { @@ -65,6 +76,26 @@ double LiquidFlowMaterialProperties::getViscosity(const double p, MaterialLib::Fluid::FluidPropertyType::Viscosity, vars); } +double LiquidFlowMaterialProperties::getHeatCapacity(const double p, + const double T) const +{ + ArrayType vars; + vars[static_cast<int>(MaterialLib::Fluid::PropertyVariableType::T)] = T; + vars[static_cast<int>(MaterialLib::Fluid::PropertyVariableType::p)] = p; + return _fluid_properties->getValue( + MaterialLib::Fluid::FluidPropertyType::HeatCapacity, vars); +} + +double LiquidFlowMaterialProperties::getThermalConductivity( + const double p, const double T) const +{ + ArrayType vars; + vars[static_cast<int>(MaterialLib::Fluid::PropertyVariableType::T)] = T; + vars[static_cast<int>(MaterialLib::Fluid::PropertyVariableType::p)] = p; + return _fluid_properties->getValue( + MaterialLib::Fluid::FluidPropertyType::ThermalConductivity, vars); +} + double LiquidFlowMaterialProperties::getMassCoefficient( const int material_id, const double /*t*/, const SpatialPosition& /*pos*/, const double p, const double T, const double porosity_variable, @@ -94,5 +125,17 @@ Eigen::MatrixXd const& LiquidFlowMaterialProperties::getPermeability( return _intrinsic_permeability_models[material_id]; } +double LiquidFlowMaterialProperties::getSolidThermalExpansion( + const double t, const SpatialPosition& pos) const +{ + return _solid_thermal_expansion(t, pos)[0]; +} + +double LiquidFlowMaterialProperties::getBiotConstant( + const double t, const SpatialPosition& pos) const +{ + return _biot_constant(t, pos)[0]; +} + } // end of namespace } // end of namespace diff --git a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h index 2078f1608ddb8f97e4cd9757a42ef57d839eca9e..90f5557e835eeb23e2810b8922d24748c49e62b6 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h +++ b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h @@ -68,7 +68,8 @@ public: storage_models, bool const has_material_ids, MeshLib::PropertyVector<int> const& material_ids, - Parameter<double> const& solid_thermal_expansion) + Parameter<double> const& solid_thermal_expansion, + Parameter<double> const& biot_constant) : _has_material_ids(has_material_ids), _material_ids(material_ids), _fluid_properties(std::move(fluid_properties)), @@ -76,7 +77,8 @@ public: std::move(intrinsic_permeability_models)), _porosity_models(std::move(porosity_models)), _storage_models(std::move(storage_models)), - _solid_thermal_expansion(solid_thermal_expansion) + _solid_thermal_expansion(solid_thermal_expansion), + _biot_constant(biot_constant) { } @@ -111,8 +113,25 @@ public: double getLiquidDensity(const double p, const double T) const; + double getdLiquidDensity_dT(const double p, const double T) const; + double getViscosity(const double p, const double T) const; + double getHeatCapacity(const double p, const double T) const; + + double getThermalConductivity(const double p, const double T) const; + + double getPorosity(const int material_id, const double porosity_variable, + const double T) const + { + return _porosity_models[material_id]->getValue(porosity_variable, T); + } + + double getSolidThermalExpansion(const double t, + const SpatialPosition& pos) const; + + double getBiotConstant(const double t, const SpatialPosition& pos) const; + private: /// A flag to indicate whether the reference member, _material_ids, /// is not assigned. @@ -132,6 +151,7 @@ private: _storage_models; Parameter<double> const& _solid_thermal_expansion; + Parameter<double> const& _biot_constant; // Note: For the statistical data of porous media, they could be read from // vtu files directly. This can be done by using property vectors directly. // Such property vectors will be added here if they are needed.