diff --git a/ProcessLib/RichardsComponentTransport/CreatePorousMediaProperties.cpp b/ProcessLib/RichardsComponentTransport/CreatePorousMediaProperties.cpp index fb65c752e570e541fde15b981ea2d1fa3c74490e..8ea175fb6072dfd52eca86914ae20517164899ba 100644 --- a/ProcessLib/RichardsComponentTransport/CreatePorousMediaProperties.cpp +++ b/ProcessLib/RichardsComponentTransport/CreatePorousMediaProperties.cpp @@ -16,6 +16,7 @@ #include "MaterialLib/PorousMedium/Permeability/createPermeabilityModel.h" #include "MaterialLib/PorousMedium/Porosity/createPorosityModel.h" #include "MaterialLib/PorousMedium/Storage/createStorageModel.h" +#include "MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/CreateRelativePermeabilityModel.h" #include "MeshLib/Mesh.h" @@ -33,6 +34,9 @@ PorousMediaProperties createPorousMediaProperties( porosity_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> storage_models; + std::vector< + std::unique_ptr<MaterialLib::PorousMedium::RelativePermeability>> + relative_permeability_models; std::vector<int> mat_ids; for (auto const& porous_medium_config : @@ -63,6 +67,13 @@ PorousMediaProperties createPorousMediaProperties( porous_medium_config.getConfigSubtree("storage"); storage_models.emplace_back( MaterialLib::PorousMedium::createStorageModel(storage_config)); + + auto const& krel_config = + //! \ogs_file_param{prj__processes__process__RichardsComponentTransport__porous_medium__porous_medium__relative_permeability} + porous_medium_config.getConfigSubtree("relative_permeability"); + auto krel = MaterialLib::PorousMedium::createRelativePermeabilityModel( + krel_config); + relative_permeability_models.emplace_back(std::move(krel)); } BaseLib::reorderVector(intrinsic_permeability_models, mat_ids); @@ -79,10 +90,10 @@ PorousMediaProperties createPorousMediaProperties( material_ids.begin()); } - return PorousMediaProperties{std::move(porosity_models), - std::move(intrinsic_permeability_models), - std::move(storage_models), - std::move(material_ids)}; + return PorousMediaProperties{ + std::move(porosity_models), std::move(intrinsic_permeability_models), + std::move(storage_models), std::move(relative_permeability_models), + std::move(material_ids)}; } } // namespace ComponentTransport diff --git a/ProcessLib/RichardsComponentTransport/PorousMediaProperties.h b/ProcessLib/RichardsComponentTransport/PorousMediaProperties.h index 12dd178163fb0fa5dc5a11e048548c9e59778308..fe50331e570511ed5c4641eb1648c8bfae12bc02 100644 --- a/ProcessLib/RichardsComponentTransport/PorousMediaProperties.h +++ b/ProcessLib/RichardsComponentTransport/PorousMediaProperties.h @@ -16,10 +16,9 @@ #include <Eigen/Dense> #include "BaseLib/reorderVector.h" - #include "MaterialLib/PorousMedium/Porosity/Porosity.h" #include "MaterialLib/PorousMedium/Storage/Storage.h" - +#include "MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/RelativePermeability.h" #include "ProcessLib/Parameter/SpatialPosition.h" namespace ProcessLib @@ -36,11 +35,16 @@ public: std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&& specific_storage_models, + std::vector< + std::unique_ptr<MaterialLib::PorousMedium::RelativePermeability>>&& + relative_permeability_models, std::vector<int>&& material_ids) : _porosity_models(std::move(porosity_models)), _intrinsic_permeability_models( std::move(intrinsic_permeability_models)), _specific_storage_models(std::move(specific_storage_models)), + _relative_permeability_models( + std::move(relative_permeability_models)), _material_ids(std::move(material_ids)) { } @@ -49,6 +53,8 @@ public: : _porosity_models(std::move(other._porosity_models)), _intrinsic_permeability_models(other._intrinsic_permeability_models), _specific_storage_models(std::move(other._specific_storage_models)), + _relative_permeability_models( + std::move(other._relative_permeability_models)), _material_ids(other._material_ids) { } @@ -62,6 +68,9 @@ public: MaterialLib::PorousMedium::Storage const& getSpecificStorage( double t, SpatialPosition const& pos) const; + MaterialLib::PorousMedium::RelativePermeability const& + getRelativePermeability(double t, SpatialPosition const& pos) const; + private: int getMaterialID(SpatialPosition const& pos) const; private: @@ -70,6 +79,9 @@ private: std::vector<Eigen::MatrixXd> _intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> _specific_storage_models; + std::vector< + std::unique_ptr<MaterialLib::PorousMedium::RelativePermeability>> + _relative_permeability_models; std::vector<int> _material_ids; }; diff --git a/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM.h b/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM.h index c23ac9fb2c6f3d9d82c87f7349ea27a92f6eda47..eede4c8fd9f508fe09e6ce0c6e99a9fa6fc91226 100644 --- a/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM.h +++ b/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM.h @@ -222,6 +222,9 @@ public: auto const& K = _process_data.porous_media_properties.getIntrinsicPermeability( t, pos); + auto const& k_rel = + _process_data.porous_media_properties.getRelativePermeability( + t, pos).getValue(Sw); // Use the viscosity model to compute the viscosity auto const mu = _process_data.fluid_properties->getValue( MaterialLib::Fluid::FluidPropertyType::Viscosity, vars);