diff --git a/dumux/material/fluidmatrixinteractions/permeabilitykozenycarman.hh b/dumux/material/fluidmatrixinteractions/permeabilitykozenycarman.hh index 7bc259d984993c2bea9671934cb353050dc859ca..5864e210abfb3dc312f1df878b073df11b437105 100644 --- a/dumux/material/fluidmatrixinteractions/permeabilitykozenycarman.hh +++ b/dumux/material/fluidmatrixinteractions/permeabilitykozenycarman.hh @@ -35,71 +35,27 @@ namespace Dumux { * \brief The Kozeny-Carman relationship for the calculation of a porosity-dependent permeability. * When the porosity is implemented as solution-independent, using this relationship for the * permeability leads to unnecessary overhead. + * + * \tparam PermeabilityType The type used for the intrinsic permeability */ -template<class TypeTag> +template<class PermeabilityType> class PermeabilityKozenyCarman { - using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar); - using Problem = typename GET_PROP_TYPE(TypeTag, Problem); - using GridView = typename GET_PROP_TYPE(TypeTag, GridView); - using SpatialParams = typename GET_PROP_TYPE(TypeTag, SpatialParams); - using VolumeVariables = typename GET_PROP_TYPE(TypeTag, VolumeVariables); - using FVElementGeometry = typename GET_PROP_TYPE(TypeTag, FVGridGeometry)::LocalView; - using SubControlVolume = typename FVElementGeometry::SubControlVolume; - - static constexpr int dim = GridView::dimension; - static constexpr int dimWorld = GridView::dimensionworld; - using Element = typename GridView::template Codim<0>::Entity; - using Tensor = Dune::FieldMatrix<Scalar, dimWorld, dimWorld>; - - using PermType = typename SpatialParams::PermeabilityType; - public: - - /*! - * \brief The initial parameter distribution. - * \param spatialParams the spatial parameters - */ - void init(const SpatialParams& spatialParams) - { - spatialParamsPtr_ = &spatialParams; - } - /*! * \brief calculates the permeability for a given sub-control volume - * \param element element - * \param elemSol the element solution - * \param scv sub control volume + * \param refPerm Reference permeability before porosity changes + * \param refPoro The poro corresponding to the reference permeability + * \param poro The porosity for which permeability is to be evaluated */ - template<class ElementSolution> - PermType evaluatePermeability(const Element& element, - const SubControlVolume& scv, - const ElementSolution& elemSol) const + template<class Scalar> + PermeabilityType evaluatePermeability(PermeabilityType refPerm, Scalar refPoro, Scalar poro) const { - auto refPoro = spatialParams().referencePorosity(element, scv); - auto poro = spatialParams().porosity(element, scv, elemSol); - using std::pow; auto factor = pow((1.0 - refPoro)/(1.0 - poro), 2) * pow(poro/refPoro, 3); - return applyFactorToPermeability_(spatialParams().referencePermeability(element, scv), factor); - } - -private: - const SpatialParams& spatialParams() const - { return *spatialParamsPtr_; } - - Scalar applyFactorToPermeability_(Scalar k, Scalar factor) const - { return k*factor; } - - Tensor applyFactorToPermeability_(Tensor K, Scalar factor) const - { - Tensor result(K); - for (int i = 0; i < dim; ++i) - result[i][i] *= factor; - return result; + refPerm *= factor; + return refPerm; } - - const SpatialParams* spatialParamsPtr_; }; } // namespace Dumux diff --git a/test/porousmediumflow/1pncmin/implicit/thermochemspatialparams.hh b/test/porousmediumflow/1pncmin/implicit/thermochemspatialparams.hh index 561a578d20e925d14b440eff2dcf4302953ced86..f5d23d4f3992797c52e34ff6e3d18839eb9558f8 100644 --- a/test/porousmediumflow/1pncmin/implicit/thermochemspatialparams.hh +++ b/test/porousmediumflow/1pncmin/implicit/thermochemspatialparams.hh @@ -28,8 +28,6 @@ #include <dumux/material/spatialparams/fv1p.hh> -#include <dumux/material/fluidmatrixinteractions/porosityreactivebed.hh> -#include <dumux/material/fluidmatrixinteractions/permeabilitykozenycarman.hh> #include <dumux/material/fluidmatrixinteractions/mineralization/effectivesoliddensity.hh> #include <dumux/material/fluidmatrixinteractions/mineralization/effectivesolidheatcapacity.hh> @@ -79,8 +77,6 @@ class ThermoChemSpatialParams : public FVSpatialParamsOneP<TypeTag> using SubControlVolume = typename FVElementGeometry::SubControlVolume; using Element = typename GridView::template Codim<0>::Entity; - using PorosityLaw = PorosityReactiveBed<TypeTag>; - using PermeabilityLaw = PermeabilityKozenyCarman<TypeTag>; using EffectiveSolidRho = EffectiveSolidDensity<TypeTag>; using EffectiveSolidCp = EffectiveSolidHeatCapacity<TypeTag>; @@ -102,32 +98,10 @@ public: cp_[cPhaseIdx-numPhases] = 934; //[J/kgK] heat capacity of CaO (see Shao et al. 2014) cp_[hPhaseIdx-numPhases] = 1530; //[J/kgK] heat capacity of Ca(OH)_2 (see Shao et al. 2014) eps_ = 1e-6; - poroLaw_.init(*this); - permLaw_.init(*this); effSolRho_.init(*this); effSolCp_.init(*this); } - /*! - * \brief Define the reference permeability \f$[m^2]\f$ distribution - * - * \param element The finite element - * \param scv The sub-control volume - */ - Scalar referencePermeability(const Element& element, const SubControlVolume &scv) const - { return 8.53e-12; } - - /*! - * \brief Define the reference porosity \f$[-]\f$ distribution - * - * \param element The finite element - * \param scv The sub-control volume - */ - Scalar referencePorosity(const Element& element, const SubControlVolume &scv) const - { - return 0.8; - } - /*! Intrinsic permeability tensor K \f$[m^2]\f$ depending * on the position in the domain * @@ -141,19 +115,7 @@ public: Scalar permeability(const Element& element, const SubControlVolume& scv, const ElementSolution& elemSol) const - { return permLaw_.evaluatePermeability(element, scv, elemSol); } - - /*! - * \brief Define the minimum porosity \f$[-]\f$ distribution - * - * \param element The finite element - * \param scv The sub-control volume - */ - Scalar minPorosity(const Element& element, const SubControlVolume &scv) const - { -// return 0.604; //intrinsic porosity of CaO2H2 (see Nagel et al. 2014) - return 0.8; - } + { return 8.53e-12; } /*! * \brief Define the minimum porosity \f$[-]\f$ after clogging caused by mineralization @@ -166,10 +128,7 @@ public: Scalar porosity(const Element& element, const SubControlVolume& scv, const ElementSolution& elemSol) const - { -// return poroLaw_.evaluatePorosity(element, scv, elemSol); - return 0.8; - } + { return 0.8; } /*! * \brief Returns the average heat capacity \f$[J / (kg K)]\f$ of solid phases. @@ -248,8 +207,6 @@ private: Scalar lambdaSolid_; std::array<Scalar, numSPhases> rho_; std::array<Scalar, numSPhases> cp_; - PorosityLaw poroLaw_; - PermeabilityLaw permLaw_; EffectiveSolidRho effSolRho_; EffectiveSolidCp effSolCp_; }; diff --git a/test/porousmediumflow/2pncmin/implicit/dissolutionspatialparams.hh b/test/porousmediumflow/2pncmin/implicit/dissolutionspatialparams.hh index c6b0164a0efc417aad2cf5afb7aee29a8d4cc136..0cd4526dcddbc812e43cd09a43a57be926628907 100644 --- a/test/porousmediumflow/2pncmin/implicit/dissolutionspatialparams.hh +++ b/test/porousmediumflow/2pncmin/implicit/dissolutionspatialparams.hh @@ -83,10 +83,6 @@ class DissolutionSpatialparams : public FVSpatialParams<TypeTag> using SubControlVolume = typename FVElementGeometry::SubControlVolume; using Element = typename GridView::template Codim<0>::Entity; - using ModelTraits = typename GET_PROP_TYPE(TypeTag, ModelTraits); - using PorosityLaw = PorosityPrecipitation<Scalar, ModelTraits::numComponents(), ModelTraits::numSPhases()>; - using PermeabilityLaw = PermeabilityKozenyCarman<TypeTag>; - public: // type used for the permeability (i.e. tensor or scalar) using PermeabilityType = Scalar; @@ -109,9 +105,6 @@ public: // parameters of Brooks & Corey Law materialParams_.setPe(pEntry1_); materialParams_.setLambda(bcLambda1_); - - //! Initialize the parameter laws - permLaw_.init(*this); } /*! @@ -147,16 +140,6 @@ public: const ElementSolution& elemSol) const { return poroLaw_.evaluatePorosity(element, scv, elemSol, referencePorosity_, 1e-5); } - /*! - * \brief Define the reference permeability \f$[m^2]\f$ distribution - * - * \param element The finite element - * \param scv The sub-control volume - */ - PermeabilityType referencePermeability(const Element& element, const SubControlVolume &scv) const - { return referencePermeability_; } - - /*! Intrinsic permeability tensor K \f$[m^2]\f$ depending * on the position in the domain * @@ -169,7 +152,10 @@ public: PermeabilityType permeability(const Element& element, const SubControlVolume& scv, const ElementSolution& elemSol) const - { return permLaw_.evaluatePermeability(element, scv, elemSol); } + { + const auto poro = porosity(element, scv, elemSol); + return permLaw_.evaluatePermeability(referencePermeability_, referencePorosity_, poro); + } Scalar solidity(const SubControlVolume &scv) const { return 1.0 - porosityAtPos(scv.center()); } @@ -188,8 +174,11 @@ private: MaterialLawParams materialParams_; + using ModelTraits = typename GET_PROP_TYPE(TypeTag, ModelTraits); + using PorosityLaw = PorosityPrecipitation<Scalar, ModelTraits::numComponents(), ModelTraits::numSPhases()>; PorosityLaw poroLaw_; - PermeabilityLaw permLaw_; + PermeabilityKozenyCarman<PermeabilityType> permLaw_; + Scalar solubilityLimit_; Scalar referencePorosity_; PermeabilityType referencePermeability_ = 0.0;