From 3ac3e68958aa6b542437b0754486f58e33a982bc Mon Sep 17 00:00:00 2001 From: Thomas Fischer <thomas.fischer@ufz.de> Date: Thu, 26 Oct 2017 15:23:56 +0200 Subject: [PATCH] [MaterialLib] Create class Permeability using Parameter. --- .../CreatePorousMediaProperties.cpp | 5 +- .../PorousMedium/Permeability/Permeability.h | 81 +++++++++++++++++++ .../Permeability/createPermeabilityModel.cpp | 48 ++++++----- .../Permeability/createPermeabilityModel.h | 13 ++- .../PorousMedium/PorousMediaProperties.cpp | 5 +- .../PorousMedium/PorousMediaProperties.h | 13 +-- .../CreateTwoPhaseFlowMaterialProperties.cpp | 5 +- .../TwoPhaseFlowWithPPMaterialProperties.cpp | 9 ++- .../TwoPhaseFlowWithPPMaterialProperties.h | 5 +- .../ComponentTransportFEM.h | 4 +- ProcessLib/HT/HTFEM.h | 9 ++- .../CreateLiquidFlowMaterialProperties.cpp | 5 +- .../LiquidFlowMaterialProperties.cpp | 5 +- .../LiquidFlow/LiquidFlowMaterialProperties.h | 7 +- .../CreatePorousMediaProperties.cpp | 5 +- .../PorousMediaProperties.cpp | 5 +- .../PorousMediaProperties.h | 12 ++- .../RichardsComponentTransportFEM-impl.h | 12 +-- .../CreateRichardsFlowMaterialProperties.cpp | 5 +- .../RichardsFlowMaterialProperties.cpp | 12 +-- .../RichardsFlowMaterialProperties.h | 6 +- ...teTwoPhaseFlowWithPPMaterialProperties.cpp | 7 +- .../TwoPhaseFlowWithPPMaterialProperties.cpp | 9 ++- .../TwoPhaseFlowWithPPMaterialProperties.h | 5 +- ...eateTwoPhaseFlowPrhoMaterialProperties.cpp | 7 +- ...TwoPhaseFlowWithPrhoMaterialProperties.cpp | 9 ++- .../TwoPhaseFlowWithPrhoMaterialProperties.h | 5 +- 27 files changed, 219 insertions(+), 94 deletions(-) create mode 100644 MaterialLib/PorousMedium/Permeability/Permeability.h diff --git a/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp b/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp index d1743048401..13b27c6a5bd 100644 --- a/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp +++ b/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp @@ -33,7 +33,8 @@ PorousMediaProperties createPorousMediaProperties( //! \ogs_file_param{material__porous_medium__porous_medium} configs.getConfigSubtree("porous_medium"); - std::vector<Eigen::MatrixXd> intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> + intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> porosity_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> @@ -62,7 +63,7 @@ PorousMediaProperties createPorousMediaProperties( porous_medium_config.getConfigSubtree("permeability"); intrinsic_permeability_models.emplace_back( MaterialLib::PorousMedium::createPermeabilityModel( - permeability_config)); + permeability_config, parameters)); // Configuration for the specific storage. auto const& storage_config = diff --git a/MaterialLib/PorousMedium/Permeability/Permeability.h b/MaterialLib/PorousMedium/Permeability/Permeability.h new file mode 100644 index 00000000000..75c2fd700f6 --- /dev/null +++ b/MaterialLib/PorousMedium/Permeability/Permeability.h @@ -0,0 +1,81 @@ +/** + * \copyright + * Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org) + * Distributed under a Modified BSD License. + * See accompanying file LICENSE.txt or + * http://www.opengeosys.org/project/license + * + * \file: Permeability.h + * + */ + +#pragma once + +#include <Eigen/Dense> + +#include "BaseLib/Error.h" +#include "ProcessLib/Parameter/Parameter.h" + +namespace MaterialLib +{ +namespace PorousMedium +{ +/// The class implements a basic permeability model that employs a parameter +/// (for instance a constant parameter or mesh cell dependend parameter) to fill +/// the intrinsic permeability tensor. +class Permeability +{ +public: + explicit Permeability( + ProcessLib::Parameter<double> const& permeability_parameter, + int const dimension) + : _permeability_parameter(permeability_parameter), _dimension(dimension) + { + if (permeability_parameter.getNumberOfComponents() != + _dimension * _dimension) + { + OGS_FATAL( + "The given parameter has %d components, but the permeability " + "tensor is defined for a %d dimensional problem.", + permeability_parameter.getNumberOfComponents(), _dimension); + } + _intrinsic_permeability_tensor = + Eigen::MatrixXd(_dimension, _dimension); + } + + ~Permeability() = default; + + /** + * Get property value. + * @param t point in time + * @param pos spatial position + * @param variable A variable with any double type value. + * @param temperature Temperature with any double type value. + */ + Eigen::MatrixXd const& getValue( + const double t, + ProcessLib::SpatialPosition const& pos, + const double variable, + const double temperature) const + { + (void)variable; + (void)temperature; + + _intrinsic_permeability_tensor = + Eigen::Map<Eigen::Matrix<double, + Eigen::Dynamic, + Eigen::Dynamic, + Eigen::RowMajor> const>( + _permeability_parameter(t, pos).data(), _dimension, _dimension); + + return _intrinsic_permeability_tensor; + } + +private: + ProcessLib::Parameter<double> const& _permeability_parameter; + int const _dimension; + mutable Eigen::MatrixXd _intrinsic_permeability_tensor; +}; + +} // end of namespace +} // end of namespace diff --git a/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.cpp b/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.cpp index 3927950dd2b..3b64875815d 100644 --- a/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.cpp +++ b/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.cpp @@ -18,39 +18,45 @@ #include "BaseLib/Error.h" #include "MathLib/LinAlg/Eigen/EigenMapTools.h" +#include "ProcessLib/Parameter/ConstantParameter.h" +#include "ProcessLib/Parameter/SpatialPosition.h" +#include "ProcessLib/Utils/ProcessUtils.h" namespace MaterialLib { namespace PorousMedium { -Eigen::MatrixXd createPermeabilityModel(BaseLib::ConfigTree const& config) +std::unique_ptr<Permeability> createPermeabilityModel( + BaseLib::ConfigTree const& config, + std::vector<std::unique_ptr<ProcessLib::ParameterBase>> const& parameters) { - auto const values = - //! \ogs_file_param{material__porous_medium__permeability__values} - config.getConfigParameter<std::vector<double>>("values"); + //! \ogs_file_param{material__porous_medium__permeability__type} + auto const type = config.getConfigParameter<std::string>("type"); - auto const data_size = values.size(); - - int dim = -1; - switch (data_size) + if (type == "Constant") { - case 1: - dim = 1; - break; - case 4: - dim = 2; - break; - case 9: - dim = 3; - break; - default: + auto const& permeability_parameter = ProcessLib::findParameter<double>( + config, + //! \ogs_file_param_special{material__porous_medium__permeability__permeability_tensor_entries} + "permeability_tensor_entries", parameters, 0); + + int dimension = static_cast<int>( + std::sqrt(permeability_parameter.getNumberOfComponents())); + if (permeability_parameter.getNumberOfComponents() != + dimension * dimension) { OGS_FATAL( - "Number of values for permeability tensor must be 1, 4 or 9."); + "The given parameter has %d components, but the permeability " + "tensor is defined for a %d dimensional problem.", + permeability_parameter.getNumberOfComponents(), dimension); } - } - return MathLib::toMatrix(values, dim, dim); + return std::make_unique<Permeability>( + permeability_parameter, dimension); + } + OGS_FATAL("The permeability type '%s' is unavailable.\n", + "The available types are \n\tConstant.", + type.data()); } } // end of namespace diff --git a/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.h b/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.h index d7503a845d2..2979f7b8e58 100644 --- a/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.h +++ b/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.h @@ -12,7 +12,9 @@ #pragma once -#include <Eigen/Dense> +#include <memory> + +#include "Permeability.h" namespace BaseLib { @@ -24,9 +26,14 @@ namespace MaterialLib namespace PorousMedium { /** Create a porosity model - * @param config ConfigTree object has a tag of `<permeability>` + * @param config ConfigTree object has a tag of `<permeability>` that + * describes the permeability relationsship and contains the name of the + * parameter + * @param parameters a vector containing the available parameters */ -Eigen::MatrixXd createPermeabilityModel(BaseLib::ConfigTree const& config); +std::unique_ptr<Permeability> createPermeabilityModel( + BaseLib::ConfigTree const& config, + std::vector<std::unique_ptr<ProcessLib::ParameterBase>> const& parameters); } // end of namespace } // end of namespace diff --git a/MaterialLib/PorousMedium/PorousMediaProperties.cpp b/MaterialLib/PorousMedium/PorousMediaProperties.cpp index c60da41fec6..b8cc5173804 100644 --- a/MaterialLib/PorousMedium/PorousMediaProperties.cpp +++ b/MaterialLib/PorousMedium/PorousMediaProperties.cpp @@ -28,10 +28,11 @@ MaterialLib::PorousMedium::Porosity const& PorousMediaProperties::getPorosity( return *_porosity_models[getMaterialID(pos)]; } -Eigen::MatrixXd const& PorousMediaProperties::getIntrinsicPermeability( +MaterialLib::PorousMedium::Permeability const& +PorousMediaProperties::getIntrinsicPermeability( double /*t*/, ProcessLib::SpatialPosition const& pos) const { - return _intrinsic_permeability_models[getMaterialID(pos)]; + return *_intrinsic_permeability_models[getMaterialID(pos)]; } MaterialLib::PorousMedium::Storage const& diff --git a/MaterialLib/PorousMedium/PorousMediaProperties.h b/MaterialLib/PorousMedium/PorousMediaProperties.h index 8aa143fa7c9..0706df63c1b 100644 --- a/MaterialLib/PorousMedium/PorousMediaProperties.h +++ b/MaterialLib/PorousMedium/PorousMediaProperties.h @@ -16,7 +16,7 @@ #include <Eigen/Dense> #include "BaseLib/reorderVector.h" - +#include "Permeability/Permeability.h" #include "Porosity/Porosity.h" #include "Storage/Storage.h" @@ -33,7 +33,8 @@ public: PorousMediaProperties( std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&& porosity_models, - std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models, + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&& + intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&& specific_storage_models, std::vector<int>&& material_ids) @@ -47,7 +48,8 @@ public: PorousMediaProperties(PorousMediaProperties&& other) : _porosity_models(std::move(other._porosity_models)), - _intrinsic_permeability_models(other._intrinsic_permeability_models), + _intrinsic_permeability_models( + std::move(other._intrinsic_permeability_models)), _specific_storage_models(std::move(other._specific_storage_models)), _material_ids(other._material_ids) { @@ -56,7 +58,7 @@ public: MaterialLib::PorousMedium::Porosity const& getPorosity( double t, ProcessLib::SpatialPosition const& pos) const; - Eigen::MatrixXd const& getIntrinsicPermeability( + MaterialLib::PorousMedium::Permeability const& getIntrinsicPermeability( double t, ProcessLib::SpatialPosition const& pos) const; MaterialLib::PorousMedium::Storage const& getSpecificStorage( @@ -67,7 +69,8 @@ private: private: std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> _porosity_models; - std::vector<Eigen::MatrixXd> _intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> + _intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> _specific_storage_models; std::vector<int> _material_ids; diff --git a/MaterialLib/TwoPhaseModels/CreateTwoPhaseFlowMaterialProperties.cpp b/MaterialLib/TwoPhaseModels/CreateTwoPhaseFlowMaterialProperties.cpp index 1e9530be7ce..9e43b6c08d4 100644 --- a/MaterialLib/TwoPhaseModels/CreateTwoPhaseFlowMaterialProperties.cpp +++ b/MaterialLib/TwoPhaseModels/CreateTwoPhaseFlowMaterialProperties.cpp @@ -59,7 +59,8 @@ createTwoPhaseFlowMaterialProperties( // Get porous properties std::vector<int> mat_ids; std::vector<int> mat_krel_ids; - std::vector<Eigen::MatrixXd> intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> + intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> porosity_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> @@ -84,7 +85,7 @@ createTwoPhaseFlowMaterialProperties( auto const& permeability_conf = conf.getConfigSubtree("permeability"); intrinsic_permeability_models.emplace_back( MaterialLib::PorousMedium::createPermeabilityModel( - permeability_conf)); + permeability_conf, parameters)); //! \ogs_file_param{material__twophase_flow__material_property__porous_medium__porous_medium__porosity} auto const& porosity_conf = conf.getConfigSubtree("porosity"); diff --git a/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.cpp b/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.cpp index aea1ec6a530..42cb8cc46e1 100644 --- a/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.cpp +++ b/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.cpp @@ -35,7 +35,8 @@ TwoPhaseFlowWithPPMaterialProperties::TwoPhaseFlowWithPPMaterialProperties( std::unique_ptr<MaterialLib::Fluid::FluidProperty>&& liquid_viscosity, std::unique_ptr<MaterialLib::Fluid::FluidProperty>&& gas_density, std::unique_ptr<MaterialLib::Fluid::FluidProperty>&& gas_viscosity, - std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models, + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&& + intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&& porosity_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&& @@ -119,10 +120,10 @@ double TwoPhaseFlowWithPPMaterialProperties::getGasViscosity( } Eigen::MatrixXd const& TwoPhaseFlowWithPPMaterialProperties::getPermeability( - const int material_id, const double /*t*/, - const ProcessLib::SpatialPosition& /*pos*/, const int /*dim*/) const + const int material_id, const double t, + const ProcessLib::SpatialPosition& pos, const int /*dim*/) const { - return _intrinsic_permeability_models[material_id]; + return _intrinsic_permeability_models[material_id]->getValue(t, pos, 0, 0); } double TwoPhaseFlowWithPPMaterialProperties::getPorosity( diff --git a/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.h b/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.h index a88b56bde92..4eeb6caa84b 100644 --- a/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.h +++ b/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.h @@ -64,7 +64,7 @@ public: gas_density, std::unique_ptr<MaterialLib::Fluid::FluidProperty>&& gas_viscosity, - std::vector<Eigen::MatrixXd>&& + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&& intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&& porosity_models, @@ -124,7 +124,8 @@ private: std::unique_ptr<MaterialLib::Fluid::FluidProperty> const _gas_density; std::unique_ptr<MaterialLib::Fluid::FluidProperty> const _gas_viscosity; - std::vector<Eigen::MatrixXd> const _intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> const + _intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> const _porosity_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> const diff --git a/ProcessLib/ComponentTransport/ComponentTransportFEM.h b/ProcessLib/ComponentTransport/ComponentTransportFEM.h index 65ed5b0a8aa..f68dc8ece73 100644 --- a/ProcessLib/ComponentTransport/ComponentTransportFEM.h +++ b/ProcessLib/ComponentTransport/ComponentTransportFEM.h @@ -204,7 +204,7 @@ public: auto const& K = _process_data.porous_media_properties.getIntrinsicPermeability( - t, pos); + t, pos).getValue(t, pos, 0.0, 0.0); // Use the viscosity model to compute the viscosity auto const mu = _process_data.fluid_properties->getValue( MaterialLib::Fluid::FluidPropertyType::Viscosity, vars); @@ -289,7 +289,7 @@ public: auto const& K = _process_data.porous_media_properties.getIntrinsicPermeability( - t, pos); + t, pos).getValue(t, pos, 0.0, 0.0); auto const mu = _process_data.fluid_properties->getValue( MaterialLib::Fluid::FluidPropertyType::Viscosity, vars); GlobalDimMatrixType const K_over_mu = K / mu; diff --git a/ProcessLib/HT/HTFEM.h b/ProcessLib/HT/HTFEM.h index 0bf467662fd..31bd9d10d02 100644 --- a/ProcessLib/HT/HTFEM.h +++ b/ProcessLib/HT/HTFEM.h @@ -172,9 +172,6 @@ public: auto const specific_storage = _process_data.porous_media_properties.getSpecificStorage(t, pos) .getValue(0.0); - auto const intrinsic_permeability = - _process_data.porous_media_properties.getIntrinsicPermeability( - t, pos); auto const thermal_conductivity_solid = _process_data.thermal_conductivity_solid(t, pos)[0]; @@ -197,6 +194,10 @@ public: _process_data.porous_media_properties.getPorosity(t, pos) .getValue(t, pos, 0.0, T_int_pt); + auto const intrinsic_permeability = + _process_data.porous_media_properties.getIntrinsicPermeability( + t, pos).getValue(t, pos, 0.0, T_int_pt); + double const thermal_conductivity = thermal_conductivity_solid * (1 - porosity) + thermal_conductivity_fluid * porosity; @@ -318,7 +319,7 @@ public: auto const K = _process_data.porous_media_properties.getIntrinsicPermeability( - t, pos); + t, pos).getValue(t, pos, 0.0, T_int_pt); auto const mu = _process_data.fluid_properties->getValue( MaterialLib::Fluid::FluidPropertyType::Viscosity, vars); diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp index c55cba5e82f..5ac06dc06d7 100644 --- a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp +++ b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp @@ -51,7 +51,8 @@ createLiquidFlowMaterialProperties( MaterialLib::Fluid::createFluidProperties(fluid_config); // Get porous properties - std::vector<Eigen::MatrixXd> intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> + intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> porosity_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> @@ -75,7 +76,7 @@ createLiquidFlowMaterialProperties( porous_medium_config.getConfigSubtree("permeability"); intrinsic_permeability_models.emplace_back( MaterialLib::PorousMedium::createPermeabilityModel( - permeability_config)); + permeability_config, parameters)); auto const& porosity_config = //! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__porosity} diff --git a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp index e8f54f5dc47..a6297371edc 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp +++ b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp @@ -118,10 +118,11 @@ double LiquidFlowMaterialProperties::getMassCoefficient( } Eigen::MatrixXd const& LiquidFlowMaterialProperties::getPermeability( - const int material_id, const double /*t*/, const SpatialPosition& /*pos*/, + const int material_id, const double t, const SpatialPosition& pos, const int /*dim*/) const { - return _intrinsic_permeability_models[material_id]; + return _intrinsic_permeability_models[material_id]->getValue(t, pos, 0.0, + 0.0); } double LiquidFlowMaterialProperties::getSolidThermalExpansion( diff --git a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h index 59f2d718717..8145d0bd743 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h +++ b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h @@ -20,6 +20,7 @@ #include "MaterialLib/Fluid/FluidProperties/FluidProperties.h" #include "MaterialLib/PorousMedium/Porosity/Porosity.h" +#include "MaterialLib/PorousMedium/Permeability/Permeability.h" #include "MaterialLib/PorousMedium/Storage/Storage.h" namespace MaterialLib @@ -61,7 +62,8 @@ public: LiquidFlowMaterialProperties( std::unique_ptr<MaterialLib::Fluid::FluidProperties>&& fluid_properties, - std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models, + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&& + intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&& porosity_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&& @@ -146,7 +148,8 @@ private: const std::unique_ptr<MaterialLib::Fluid::FluidProperties> _fluid_properties; - const std::vector<Eigen::MatrixXd> _intrinsic_permeability_models; + const std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> + _intrinsic_permeability_models; const std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> _porosity_models; const std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> diff --git a/ProcessLib/RichardsComponentTransport/CreatePorousMediaProperties.cpp b/ProcessLib/RichardsComponentTransport/CreatePorousMediaProperties.cpp index 032e078c643..94ff92b4d3c 100644 --- a/ProcessLib/RichardsComponentTransport/CreatePorousMediaProperties.cpp +++ b/ProcessLib/RichardsComponentTransport/CreatePorousMediaProperties.cpp @@ -31,7 +31,8 @@ PorousMediaProperties createPorousMediaProperties( { DBUG("Create PorousMediaProperties."); - std::vector<Eigen::MatrixXd> intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> + intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> porosity_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> @@ -65,7 +66,7 @@ PorousMediaProperties createPorousMediaProperties( porous_medium_config.getConfigSubtree("permeability"); intrinsic_permeability_models.emplace_back( MaterialLib::PorousMedium::createPermeabilityModel( - permeability_config)); + permeability_config, parameters)); // Configuration for the specific storage. auto const& storage_config = diff --git a/ProcessLib/RichardsComponentTransport/PorousMediaProperties.cpp b/ProcessLib/RichardsComponentTransport/PorousMediaProperties.cpp index c89ce7c999e..9afd76ad7a4 100644 --- a/ProcessLib/RichardsComponentTransport/PorousMediaProperties.cpp +++ b/ProcessLib/RichardsComponentTransport/PorousMediaProperties.cpp @@ -27,10 +27,11 @@ MaterialLib::PorousMedium::Porosity const& PorousMediaProperties::getPorosity( return *_porosity_models[getMaterialID(pos)]; } -Eigen::MatrixXd const& PorousMediaProperties::getIntrinsicPermeability( +MaterialLib::PorousMedium::Permeability const& +PorousMediaProperties::getIntrinsicPermeability( double /*t*/, SpatialPosition const& pos) const { - return _intrinsic_permeability_models[getMaterialID(pos)]; + return *_intrinsic_permeability_models[getMaterialID(pos)]; } MaterialLib::PorousMedium::Storage const& diff --git a/ProcessLib/RichardsComponentTransport/PorousMediaProperties.h b/ProcessLib/RichardsComponentTransport/PorousMediaProperties.h index 6b538c77133..1c49d089a74 100644 --- a/ProcessLib/RichardsComponentTransport/PorousMediaProperties.h +++ b/ProcessLib/RichardsComponentTransport/PorousMediaProperties.h @@ -16,6 +16,7 @@ #include <Eigen/Dense> #include "BaseLib/reorderVector.h" +#include "MaterialLib/PorousMedium/Permeability/Permeability.h" #include "MaterialLib/PorousMedium/Porosity/Porosity.h" #include "MaterialLib/PorousMedium/Storage/Storage.h" #include "MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CapillaryPressureSaturation.h" @@ -34,7 +35,8 @@ public: PorousMediaProperties( std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&& porosity_models, - std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models, + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&& + intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&& specific_storage_models, std::vector<std::unique_ptr< @@ -58,7 +60,8 @@ public: PorousMediaProperties(PorousMediaProperties&& other) : _porosity_models(std::move(other._porosity_models)), - _intrinsic_permeability_models(other._intrinsic_permeability_models), + _intrinsic_permeability_models( + std::move(other._intrinsic_permeability_models)), _specific_storage_models(std::move(other._specific_storage_models)), _capillary_pressure_saturation_models( std::move(other._capillary_pressure_saturation_models)), @@ -71,7 +74,7 @@ public: MaterialLib::PorousMedium::Porosity const& getPorosity( double t, SpatialPosition const& pos) const; - Eigen::MatrixXd const& getIntrinsicPermeability( + MaterialLib::PorousMedium::Permeability const& getIntrinsicPermeability( double t, SpatialPosition const& pos) const; MaterialLib::PorousMedium::Storage const& getSpecificStorage( @@ -89,7 +92,8 @@ private: private: std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> _porosity_models; - std::vector<Eigen::MatrixXd> _intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> + _intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> _specific_storage_models; std::vector< diff --git a/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM-impl.h b/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM-impl.h index fc42d20c110..9c71041cc35 100644 --- a/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM-impl.h +++ b/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM-impl.h @@ -155,9 +155,9 @@ void LocalAssemblerData<ShapeFunction, IntegrationMethod, GlobalDim>::assemble( auto const& molecular_diffusion_coefficient = _process_data.molecular_diffusion_coefficient(t, pos)[0]; - auto const& K = - _process_data.porous_media_properties.getIntrinsicPermeability(t, - pos); + auto const& K = _process_data.porous_media_properties + .getIntrinsicPermeability(t, pos) + .getValue(t, pos, 0.0, 0.0); auto const& k_rel = _process_data.porous_media_properties .getRelativePermeability(t, pos) .getValue(Sw); @@ -246,9 +246,9 @@ LocalAssemblerData<ShapeFunction, IntegrationMethod, GlobalDim>:: pos.setIntegrationPoint(ip); - auto const& K = - _process_data.porous_media_properties.getIntrinsicPermeability(t, - pos); + auto const& K = _process_data.porous_media_properties + .getIntrinsicPermeability(t, pos) + .getValue(t, pos, 0.0, 0.0); auto const mu = _process_data.fluid_properties->getValue( MaterialLib::Fluid::FluidPropertyType::Viscosity, vars); diff --git a/ProcessLib/RichardsFlow/CreateRichardsFlowMaterialProperties.cpp b/ProcessLib/RichardsFlow/CreateRichardsFlowMaterialProperties.cpp index 291851eef74..7bc235f5e31 100644 --- a/ProcessLib/RichardsFlow/CreateRichardsFlowMaterialProperties.cpp +++ b/ProcessLib/RichardsFlow/CreateRichardsFlowMaterialProperties.cpp @@ -49,7 +49,8 @@ createRichardsFlowMaterialProperties( // Get porous properties std::vector<int> mat_ids; std::vector<int> mat_krel_ids; - std::vector<Eigen::MatrixXd> intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> + intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> porosity_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> @@ -74,7 +75,7 @@ createRichardsFlowMaterialProperties( auto const& permeability_conf = conf.getConfigSubtree("permeability"); intrinsic_permeability_models.emplace_back( MaterialLib::PorousMedium::createPermeabilityModel( - permeability_conf)); + permeability_conf, parameters)); //! \ogs_file_param{prj__processes__process__RICHARDS_FLOW__material_property__porous_medium__porous_medium__porosity} auto const& porosity_conf = conf.getConfigSubtree("porosity"); diff --git a/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.cpp b/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.cpp index e9c8b6e613e..8ca45d945dd 100644 --- a/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.cpp +++ b/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.cpp @@ -31,7 +31,8 @@ namespace RichardsFlow RichardsFlowMaterialProperties::RichardsFlowMaterialProperties( boost::optional<MeshLib::PropertyVector<int> const&> const material_ids, std::unique_ptr<MaterialLib::Fluid::FluidProperties>&& fluid_properties, - std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models, + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&& + intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&& porosity_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&& @@ -44,7 +45,7 @@ RichardsFlowMaterialProperties::RichardsFlowMaterialProperties( relative_permeability_models) : _material_ids(material_ids), _fluid_properties(std::move(fluid_properties)), - _intrinsic_permeability_models(intrinsic_permeability_models), + _intrinsic_permeability_models(std::move(intrinsic_permeability_models)), _porosity_models(std::move(porosity_models)), _storage_models(std::move(storage_models)), _capillary_pressure_models(std::move(capillary_pressure_models)), @@ -85,10 +86,11 @@ double RichardsFlowMaterialProperties::getFluidViscosity(const double p, } Eigen::MatrixXd const& RichardsFlowMaterialProperties::getPermeability( - const int material_id, const double /*t*/, - const ProcessLib::SpatialPosition& /*pos*/, const int /*dim*/) const + const int material_id, const double t, + const ProcessLib::SpatialPosition& pos, const int /*dim*/) const { - return _intrinsic_permeability_models[material_id]; + return _intrinsic_permeability_models[material_id]->getValue(t, pos, 0.0, + 0.0); } double RichardsFlowMaterialProperties::getPorosity( diff --git a/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.h b/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.h index cf6db124c52..71eb46151d3 100644 --- a/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.h +++ b/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.h @@ -51,7 +51,8 @@ public: RichardsFlowMaterialProperties( boost::optional<MeshLib::PropertyVector<int> const&> const material_ids, std::unique_ptr<MaterialLib::Fluid::FluidProperties>&& fluid_properties, - std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models, + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&& + intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&& porosity_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&& @@ -104,7 +105,8 @@ private: const std::unique_ptr<MaterialLib::Fluid::FluidProperties> _fluid_properties; - std::vector<Eigen::MatrixXd> const _intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> const + _intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> const _porosity_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> const diff --git a/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPMaterialProperties.cpp b/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPMaterialProperties.cpp index 1dbd72700e2..bf88de94c1c 100644 --- a/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPMaterialProperties.cpp +++ b/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPMaterialProperties.cpp @@ -58,7 +58,8 @@ createTwoPhaseFlowWithPPMaterialProperties( // Get porous properties std::vector<int> mat_ids; std::vector<int> mat_krel_ids; - std::vector<Eigen::MatrixXd> intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> + intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> porosity_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> @@ -83,7 +84,7 @@ createTwoPhaseFlowWithPPMaterialProperties( auto const& permeability_conf = conf.getConfigSubtree("permeability"); intrinsic_permeability_models.emplace_back( MaterialLib::PorousMedium::createPermeabilityModel( - permeability_conf)); + permeability_conf, parameters)); //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PP__material_property__porous_medium__porous_medium__porosity} auto const& porosity_conf = conf.getConfigSubtree("porosity"); @@ -130,7 +131,7 @@ createTwoPhaseFlowWithPPMaterialProperties( return std::make_unique<TwoPhaseFlowWithPPMaterialProperties>( material_ids, std::move(liquid_density), std::move(liquid_viscosity), std::move(gas_density), std::move(gas_viscosity), - intrinsic_permeability_models, std::move(porosity_models), + std::move(intrinsic_permeability_models), std::move(porosity_models), std::move(storage_models), std::move(capillary_pressure_models), std::move(relative_permeability_models)); } diff --git a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.cpp b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.cpp index 457d78de520..f376df17324 100644 --- a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.cpp +++ b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.cpp @@ -37,7 +37,7 @@ TwoPhaseFlowWithPPMaterialProperties::TwoPhaseFlowWithPPMaterialProperties( gas_density, std::unique_ptr<MaterialLib::Fluid::FluidProperty> gas_viscosity, - std::vector<Eigen::MatrixXd> + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&& intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&& porosity_models, @@ -122,10 +122,11 @@ double TwoPhaseFlowWithPPMaterialProperties::getGasViscosity( } Eigen::MatrixXd const& TwoPhaseFlowWithPPMaterialProperties::getPermeability( - const int material_id, const double /*t*/, - const ProcessLib::SpatialPosition& /*pos*/, const int /*dim*/) const + const int material_id, const double t, + const ProcessLib::SpatialPosition& pos, const int /*dim*/) const { - return _intrinsic_permeability_models[material_id]; + return _intrinsic_permeability_models[material_id]->getValue(t, pos, 0.0, + 0.0); } double TwoPhaseFlowWithPPMaterialProperties::getPorosity( diff --git a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.h b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.h index fd3b0657d01..510e8d4dd59 100644 --- a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.h +++ b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.h @@ -55,7 +55,7 @@ public: gas_density, std::unique_ptr<MaterialLib::Fluid::FluidProperty> gas_viscosity, - std::vector<Eigen::MatrixXd> + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&& intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&& porosity_models, @@ -112,7 +112,8 @@ protected: */ boost::optional<MeshLib::PropertyVector<int> const&> const _material_ids; - std::vector<Eigen::MatrixXd> _intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> + _intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> _porosity_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> diff --git a/ProcessLib/TwoPhaseFlowWithPrho/CreateTwoPhaseFlowPrhoMaterialProperties.cpp b/ProcessLib/TwoPhaseFlowWithPrho/CreateTwoPhaseFlowPrhoMaterialProperties.cpp index c28e8116b70..5383548d5a5 100644 --- a/ProcessLib/TwoPhaseFlowWithPrho/CreateTwoPhaseFlowPrhoMaterialProperties.cpp +++ b/ProcessLib/TwoPhaseFlowWithPrho/CreateTwoPhaseFlowPrhoMaterialProperties.cpp @@ -58,7 +58,8 @@ createTwoPhaseFlowPrhoMaterialProperties( // Get porous properties std::vector<int> mat_ids; std::vector<int> mat_krel_ids; - std::vector<Eigen::MatrixXd> _intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> + _intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> _porosity_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> @@ -83,7 +84,7 @@ createTwoPhaseFlowPrhoMaterialProperties( auto const& permeability_conf = conf.getConfigSubtree("permeability"); _intrinsic_permeability_models.emplace_back( MaterialLib::PorousMedium::createPermeabilityModel( - permeability_conf)); + permeability_conf, parameters)); //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__porosity} auto const& porosity_conf = conf.getConfigSubtree("porosity"); @@ -130,7 +131,7 @@ createTwoPhaseFlowPrhoMaterialProperties( return std::make_unique<TwoPhaseFlowWithPrhoMaterialProperties>( material_ids, std::move(_liquid_density), std::move(_viscosity), std::move(_gas_density), std::move(_gas_viscosity), - _intrinsic_permeability_models, std::move(_porosity_models), + std::move(_intrinsic_permeability_models), std::move(_porosity_models), std::move(_storage_models), std::move(_capillary_pressure_models), std::move(_relative_permeability_models)); } diff --git a/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.cpp b/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.cpp index 2f635f90521..6554bcbdb2c 100644 --- a/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.cpp +++ b/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.cpp @@ -42,7 +42,7 @@ TwoPhaseFlowWithPrhoMaterialProperties::TwoPhaseFlowWithPrhoMaterialProperties( gas_density, std::unique_ptr<MaterialLib::Fluid::FluidProperty> gas_viscosity, - std::vector<Eigen::MatrixXd> + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&& intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&& porosity_models, @@ -127,10 +127,11 @@ double TwoPhaseFlowWithPrhoMaterialProperties::getGasViscosity( } Eigen::MatrixXd const& TwoPhaseFlowWithPrhoMaterialProperties::getPermeability( - const int material_id, const double /*t*/, - const ProcessLib::SpatialPosition& /*pos*/, const int /*dim*/) const + const int material_id, const double t, + const ProcessLib::SpatialPosition& pos, const int /*dim*/) const { - return _intrinsic_permeability_models[material_id]; + return _intrinsic_permeability_models[material_id]->getValue(t, pos, 0.0, + 0.0); } double TwoPhaseFlowWithPrhoMaterialProperties::getPorosity( diff --git a/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.h b/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.h index 5566d363867..295c88390a9 100644 --- a/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.h +++ b/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.h @@ -48,7 +48,7 @@ public: gas_density, std::unique_ptr<MaterialLib::Fluid::FluidProperty> gas_viscosity, - std::vector<Eigen::MatrixXd> + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&& intrinsic_permeability_models, std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&& porosity_models, @@ -119,7 +119,8 @@ protected: */ boost::optional<MeshLib::PropertyVector<int> const&> const _material_ids; - std::vector<Eigen::MatrixXd> _intrinsic_permeability_models; + std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> + _intrinsic_permeability_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> _porosity_models; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> -- GitLab