From ae450cb3ccd9c57329db5f8a3bc20c847d56c7bb Mon Sep 17 00:00:00 2001
From: Katharina Heck <katharina.heck@iws.uni-stuttgart.de>
Date: Thu, 26 Jul 2018 16:45:28 +0200
Subject: [PATCH] [feature] add spatialparams with base stuff for
 nonequilibrium

---
 .../spatialparams/fvnonequilibrium.hh         | 210 ++++++++++++++++++
 .../nonequilibrium/volumevariables.hh         | 107 +++++++--
 .../mpnc/implicit/kinetic/spatialparams.hh    |  71 ++----
 .../thermalnonequilibrium/spatialparams.hh    |  69 ++----
 4 files changed, 338 insertions(+), 119 deletions(-)
 create mode 100644 dumux/material/spatialparams/fvnonequilibrium.hh

diff --git a/dumux/material/spatialparams/fvnonequilibrium.hh b/dumux/material/spatialparams/fvnonequilibrium.hh
new file mode 100644
index 0000000000..98a0eef7f5
--- /dev/null
+++ b/dumux/material/spatialparams/fvnonequilibrium.hh
@@ -0,0 +1,210 @@
+// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// vi: set et ts=4 sw=4 sts=4:
+/*****************************************************************************
+ *   See the file COPYING for full copying permissions.                      *
+ *                                                                           *
+ *   This program is free software: you can redistribute it and/or modify    *
+ *   it under the terms of the GNU General Public License as published by    *
+ *   the Free Software Foundation, either version 2 of the License, or       *
+ *   (at your option) any later version.                                     *
+ *                                                                           *
+ *   This program is distributed in the hope that it will be useful,         *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the            *
+ *   GNU General Public License for more details.                            *
+ *                                                                           *
+ *   You should have received a copy of the GNU General Public License       *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.   *
+ *****************************************************************************/
+/*!
+ * \file
+ * \ingroup SpatialParameters
+ * \brief base class for spatialparameters dealing with thermal and chemical nonequilibrium
+ *
+ */
+#ifndef DUMUX_FV_SPATIALPARAMS_NONEQUILIBRIUM_HH
+#define DUMUX_FV_SPATIALPARAMS_NONEQUILIBRIUM_HH
+
+#include <dumux/material/spatialparams/fv.hh>
+
+// material laws for interfacial area
+#include <dumux/material/fluidmatrixinteractions/2pia/efftoabslawia.hh>
+#include <dumux/material/fluidmatrixinteractions/2pia/awnsurfacepolynomial2ndorder.hh>
+#include <dumux/material/fluidmatrixinteractions/2pia/awnsurfacepcmaxfct.hh>
+#include <dumux/material/fluidmatrixinteractions/2pia/awnsurfaceexpswpcto3.hh>
+
+namespace Dumux {
+
+/**
+ * \brief Definition of the spatial parameters for nonequilibrium
+ */
+template<class FVGridGeometry, class Scalar, class Implementation>
+class FVNonEquilibriumSpatialParams
+: public FVSpatialParams<FVGridGeometry,
+                         Scalar,
+                         Implementation>
+{
+
+    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, Implementation>;
+    using GridView = typename FVGridGeometry::GridView;
+    using FVElementGeometry = typename FVGridGeometry::LocalView;
+    using SubControlVolume = typename FVGridGeometry::SubControlVolume;
+    using Element = typename GridView::template Codim<0>::Entity;
+
+    using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
+
+public:
+    //! export the types used for interfacial area calculations
+
+    using AwnSurfaceParams = Scalar;
+    using AwsSurfaceParams = Scalar;
+    using AnsSurfaceParams = Scalar;
+
+    FVNonEquilibriumSpatialParams(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
+    : ParentType(fvGridGeometry)
+    {  }
+
+    /*!\brief Return a reference to the container object for the
+     *        parametrization of the surface between wetting and non-Wetting phase.
+     *
+     *        The position is determined based on the coordinate of
+     *        the vertex belonging to the considered sub control volume.
+     * \param element     The finite element
+     * \param fvGeometry  The finite volume geometry
+     * \param scvIdx      The local index of the sub-control volume */
+    template<class ElementSolution>
+    AwnSurfaceParams aWettingNonWettingSurfaceParams(const Element &element,
+                                                   const SubControlVolume &scv,
+                                                   const ElementSolution &elemSol) const
+    {
+        DUNE_THROW(Dune::InvalidStateException,
+                   "The spatial parameters do not provide a aWettingNonWettingSurfaceParams() method.");
+    }
+
+    /*!\brief Return a reference to the container object for the
+     *        parametrization of the surface between non-Wetting and solid phase.
+     *
+     *        The position is determined based on the coordinate of
+     *        the vertex belonging to the considered sub control volume.
+     * \param element     The finite element
+     * \param fvGeometry  The finite volume geometry
+     * \param scvIdx      The local index of the sub-control volume */
+    template<class ElementSolution>
+    AnsSurfaceParams aNonWettingSolidSurfaceParams(const Element &element,
+                                                 const SubControlVolume &scv,
+                                                 const ElementSolution &elemSol) const
+    {
+        DUNE_THROW(Dune::InvalidStateException,
+                   "The spatial parameters do not provide a aNonWettingSolidSurfaceParams() method.");
+    }
+
+    /*!\brief Return a reference to the container object for the
+     *        parametrization of the surface between non-Wetting and solid phase.
+     *
+     *        The position is determined based on the coordinate of
+     *        the vertex belonging to the considered sub control volume.
+     * \param element     The finite element
+     * \param fvGeometry  The finite volume geometry
+     * \param scvIdx      The local index of the sub-control volume */
+    template<class ElementSolution>
+    AwsSurfaceParams aWettingSolidSurfaceParams(const Element &element,
+                                              const SubControlVolume &scv,
+                                              const ElementSolution &elemSol) const
+    {
+        DUNE_THROW(Dune::InvalidStateException,
+                   "The spatial parameters do not provide a aWettingSolidSurfaceParams() method.");
+    }
+
+    /*!\brief Return the maximum capillary pressure for the given pc-Sw curve
+     *
+     *        Of course physically there is no such thing as a maximum capillary pressure.
+     *        The parametrization (VG/BC) goes to infinity and physically there is only one pressure
+     *        for single phase conditions.
+     *        Here, this is used for fitting the interfacial area surface: the capillary pressure,
+     *        where the interfacial area is zero.
+     *        Technically this value is obtained as the capillary pressure of saturation zero.
+     *        This value of course only exists for the case of a regularized pc-Sw relation.
+     * \param element     The finite element
+     * \param fvGeometry  The finite volume geometry
+     * \param scvIdx      The local index of the sub-control volume */
+    template<class ElementSolution>
+    const Scalar pcMax(const Element &element,
+                       const SubControlVolume &scv,
+                       const ElementSolution &elemSol) const
+    {     DUNE_THROW(Dune::InvalidStateException,
+        "The spatial parameters do not provide a aNonWettingSolidSurfaceParams() method.");
+    }
+
+
+    /*!\brief Return the characteristic length for the mass transfer.
+     *
+     *        The position is determined based on the coordinate of
+     *        the vertex belonging to the considered sub controle volume.
+     * \param element     The finite element
+     * \param fvGeometry  The finite volume geometry
+     * \param scvIdx      The local index of the sub control volume */
+    template<class ElementSolution>
+    const Scalar characteristicLength(const Element & element,
+                                      const SubControlVolume &scv,
+                                      const ElementSolution &elemSol) const
+
+    { return this->asImp_().characteristicLengthAtPos(scv.dofPosition()); }
+
+    /*!\brief Return the characteristic length for the mass transfer.
+     * \param globalPos The position in global coordinates.*/
+    const Scalar characteristicLengthAtPos(const GlobalPosition & globalPos) const
+    {
+        DUNE_THROW(Dune::InvalidStateException,
+                   "The spatial parameters do not provide "
+                   "a characteristicLengthAtPos() method.");
+    }
+
+    /*!\brief Return the pre factor the the energy transfer
+     *
+     *        The position is determined based on the coordinate of
+     *        the vertex belonging to the considered sub controle volume.
+     * \param element     The finite element
+     * \param fvGeometry  The finite volume geometry
+     * \param scvIdx      The local index of the sub control volume */
+    template<class ElementSolution>
+    const Scalar factorEnergyTransfer(const Element &element,
+                                      const SubControlVolume &scv,
+                                      const ElementSolution &elemSol) const
+    { return this->asImp_().factorEnergyTransferAtPos(scv.dofPosition()); }
+
+    /*!\brief Return the pre factor the the energy transfer
+     * \param globalPos The position in global coordinates.*/
+    const Scalar factorEnergyTransferAtPos(const  GlobalPosition & globalPos) const
+    {
+        DUNE_THROW(Dune::InvalidStateException,
+                   "The spatial parameters do not provide "
+                   "a factorEnergyTransferAtPos() method.");
+    }
+
+    /*!\brief Return the pre factor the the mass transfer
+     *
+     *        The position is determined based on the coordinate of
+     *        the vertex belonging to the considered sub controle volume.
+     * \param element     The finite element
+     * \param fvGeometry  The finite volume geometry
+     * \param scvIdx      The local index of the sub control volume */
+    template<class ElementSolution>
+    const Scalar factorMassTransfer(const Element &element,
+                                      const SubControlVolume &scv,
+                                      const ElementSolution &elemSol) const
+    { return this->asImp_().factorMassTransferAtPos(scv.dofPosition()); }
+
+
+    /*!\brief Return the pre factor the the mass transfer
+     * \param globalPos The position in global coordinates.*/
+    const Scalar factorMassTransferAtPos(const  GlobalPosition & globalPos) const
+    {
+        DUNE_THROW(Dune::InvalidStateException,
+                   "The spatial parameters do not provide "
+                   "a factorMassTransferAtPos() method.");
+    }
+};
+
+}
+
+#endif // GUARDIAN
diff --git a/dumux/porousmediumflow/nonequilibrium/volumevariables.hh b/dumux/porousmediumflow/nonequilibrium/volumevariables.hh
index 09c73d50a4..af5d888243 100644
--- a/dumux/porousmediumflow/nonequilibrium/volumevariables.hh
+++ b/dumux/porousmediumflow/nonequilibrium/volumevariables.hh
@@ -68,10 +68,14 @@ class NonEquilibriumVolumeVariablesImplementation< Traits,
 
     using ModelTraits = typename Traits::ModelTraits;
     using Indices = typename ModelTraits::Indices;
+    using FS = typename Traits::FluidSystem;
     static constexpr auto numEnergyEqFluid = ModelTraits::numEnergyEqFluid();
     static constexpr auto numEnergyEqSolid = ModelTraits::numEnergyEqSolid();
 
-    static_assert((numEnergyEqFluid < 2), "This model is a specialization for a energy transfer of a fluid mixture and a solid");
+    static constexpr auto phase0Idx = FS::phase0Idx;
+    static constexpr auto phase1Idx = FS::phase1Idx;
+    static constexpr auto sPhaseIdx = FS::numPhases;
+    static_assert((numEnergyEqFluid < 3), "this model only has interfacial area relationships for maximum 2 fluids with one solid");
 
     using DimLessNum = DimensionlessNumbers<Scalar>;
 
@@ -97,7 +101,9 @@ public:
 
         ParameterCache paramCache;
         paramCache.updateAll(this->fluidState());
-        updateInterfacialArea(elemSol, this->fluidState(), paramCache, problem, element, scv);
+        updateDimLessNumbers(elemSol, this->fluidState(), paramCache, problem, element, scv);
+        if (numEnergyEqFluid == 2)
+            updateInterfacialArea(elemSol, this->fluidState(), paramCache, problem, element, scv);
     }
 
     /*!
@@ -111,7 +117,7 @@ public:
      * \param scv The sub-control volume
      */
     template<class ElemSol, class Problem, class Element, class Scv>
-    void updateInterfacialArea(const ElemSol& elemSol,
+    void updateDimLessNumbers(const ElemSol& elemSol,
                                const FluidState& fluidState,
                                const ParameterCache& paramCache,
                                const Problem& problem,
@@ -136,7 +142,7 @@ public:
             const auto thermalConductivity = FluidSystem::thermalConductivity(fluidState, paramCache, phaseIdx);
             const auto porosity            = this->porosity();
 
-            reynoldsNumber_[phaseIdx] = DimLessNum::reynoldsNumber(darcyMagVelocity, characteristicLength_, kinematicViscosity);
+            reynoldsNumber_[phaseIdx] = DimLessNum::reynoldsNumber(darcyMagVelocity, characteristicLength_,kinematicViscosity);
             prandtlNumber_[phaseIdx]  = DimLessNum::prandtlNumber(dynamicViscosity, heatCapacity, thermalConductivity);
             nusseltNumber_[phaseIdx]  = DimLessNum::nusseltNumberForced(reynoldsNumber_[phaseIdx],
                                                                         prandtlNumber_[phaseIdx],
@@ -145,6 +151,80 @@ public:
         }
     }
 
+        /*!
+     * \brief Updates the volume specific interfacial area [m^2 / m^3] between the phases.
+     *
+     * \param elemSol A vector containing all primary variables connected to the element
+     * \param fluidState Container for all the secondary variables concerning the fluids
+     * \param paramCache The parameter cache corresponding to the fluid state
+     * \param problem The problem to be solved
+     * \param element An element which contains part of the control volume
+     * \param scv The sub-control volume
+     */
+    template<class ElemSol, class Problem, class Element, class Scv>
+    void updateInterfacialArea(const ElemSol& elemSol,
+                               const FluidState& fluidState,
+                               const ParameterCache& paramCache,
+                               const Problem& problem,
+                               const Element& element,
+                               const Scv& scv)
+    {
+        // obtain (standard) material parameters (needed for the residual saturations)
+        const auto& materialParams = problem.spatialParams().materialLawParams(element, scv, elemSol);
+
+        //obtain parameters for interfacial area constitutive relations
+        const auto& aWettingNonWettingSurfaceParams =problem.spatialParams().aWettingNonWettingSurfaceParams(element, scv, elemSol);
+        const auto& aNonWettingSolidSurfaceParams =problem.spatialParams().aNonWettingSolidSurfaceParams(element, scv, elemSol);
+
+        const Scalar pc = fluidState.pressure(phase1Idx) - fluidState.pressure(phase0Idx);
+        const Scalar Sw = fluidState.saturation(phase0Idx);
+
+        Scalar awn;
+
+        using AwnSurface = typename Problem::SpatialParams::AwnSurface;
+        awn = AwnSurface::interfacialArea(aWettingNonWettingSurfaceParams, materialParams, Sw, pc );
+        interfacialArea_[phase0Idx][phase1Idx] = awn;
+        interfacialArea_[phase1Idx][phase0Idx] = interfacialArea_[phase0Idx][phase1Idx];
+        interfacialArea_[phase0Idx][phase0Idx] = 0.;
+
+        using AnsSurface = typename Problem::SpatialParams::AnsSurface;
+        Scalar ans = AnsSurface::interfacialArea(aNonWettingSolidSurfaceParams, materialParams,Sw, pc);
+
+        // Switch for using a a_{wn} relations that has some "maximum capillary pressure" as parameter            // That value is obtained by regularization of the pc(Sw) function.
+#if USE_PCMAX
+        const Scalar pcMax = problem.spatialParams().pcMax(element, scv, elemSol);
+        //I know the solid surface from the pore network. But it is more consistent to use the fitvalue.
+        using AnsSurface = typename Problem::SpatialParams::AnsSurface;
+        solidSurface_ = AnsSurface::interfacialArea(aNonWettingSolidSurfaceParams, materialParams, /*Sw=*/0., pcMax);
+
+        const Scalar aws = solidSurface_ - ans;
+        interfacialArea_[phase0Idx][sPhaseIdx] = aws;
+        interfacialArea_[sPhaseIdx][phase0Idx] = interfacialArea_[phase0Idx][sPhaseIdx];
+        interfacialArea_[sPhaseIdx][sPhaseIdx] = 0.;
+#else
+        using AwsSurface = typename Problem::SpatialParams::AwsSurface;
+        const auto& aWettingSolidSurfaceParams = problem.spatialParams().aWettingSolidSurfaceParams(element, scv, elemSol);
+        const auto aws = AwsSurface::interfacialArea(aWettingSolidSurfaceParams,materialParams, Sw, pc);
+        interfacialArea_[phase0Idx][sPhaseIdx] = aws ;
+        interfacialArea_[sPhaseIdx][phase0Idx] = interfacialArea_[phase0Idx][sPhaseIdx];
+        interfacialArea_[sPhaseIdx][sPhaseIdx] = 0.;
+#endif
+        interfacialArea_[phase1Idx][sPhaseIdx] = ans;
+        interfacialArea_[sPhaseIdx][phase1Idx] = interfacialArea_[phase1Idx][sPhaseIdx];
+        interfacialArea_[phase1Idx][phase1Idx] = 0.;
+    }
+
+    /*!
+     * \brief The specific interfacial area between two fluid phases [m^2 / m^3]
+     * \note This is _only_ required by the kinetic mass/energy modules
+     */
+    const Scalar interfacialArea(const unsigned int phaseIIdx, const unsigned int phaseJIdx) const
+    {
+        // there is no interfacial area between a phase and itself
+        assert(phaseIIdx not_eq phaseJIdx);
+        return interfacialArea_[phaseIIdx][phaseJIdx];
+    }
+
     //! access function Reynolds Number
     const Scalar reynoldsNumber(const unsigned int phaseIdx) const { return reynoldsNumber_[phaseIdx]; }
     //! access function Prandtl Number
@@ -168,6 +248,7 @@ private:
     Scalar factorEnergyTransfer_;
     Scalar factorMassTransfer_;
     Scalar solidSurface_ ;
+    Scalar interfacialArea_[ModelTraits::numPhases()+numEnergyEqSolid][ModelTraits::numPhases()+numEnergyEqSolid];
 };
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -390,24 +471,6 @@ public:
 
         Scalar awn;
 
-        // TODO can we delete this??? awn is overwritten anyway!
-#define AwnRegul 0
-        // This regularizes the interfacial area between the fluid phases.
-        // This makes sure, that
-        // a) some saturation cannot be lost: Never leave two phase region.
-        // b) We cannot leave the fit region: no crazy (e.g. negative) values possible
-
-        // const Scalar Swr =  aWettingNonWettingSurfaceParams.Swr() ;
-        // const Scalar Snr =  aWettingNonWettingSurfaceParams.Snr() ;
-
-        // this just leads to a stalling newton error as soon as this kicks in.
-        // May be a spline or sth like this would help, but I do not which derivatives
-        // to specify.
-#if AwnRegul
-        if(Sw < 5e-3 ) // or Sw > (1.-1e-5 )
-            awn = 0. ; // 10.; //
-#endif
-
         using AwnSurface = typename Problem::SpatialParams::AwnSurface;
         awn = AwnSurface::interfacialArea(aWettingNonWettingSurfaceParams, materialParams, Sw, pc );
         interfacialArea_[phase0Idx][phase1Idx] = awn;
diff --git a/test/porousmediumflow/mpnc/implicit/kinetic/spatialparams.hh b/test/porousmediumflow/mpnc/implicit/kinetic/spatialparams.hh
index 58f32f356b..b5088fa2d4 100644
--- a/test/porousmediumflow/mpnc/implicit/kinetic/spatialparams.hh
+++ b/test/porousmediumflow/mpnc/implicit/kinetic/spatialparams.hh
@@ -26,7 +26,7 @@
 #define DUMUX_EVAPORATION_ATMOSPHERE_SPATIALPARAMS_HH
 
 #include <dumux/porousmediumflow/properties.hh>
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/material/spatialparams/fvnonequilibrium.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/linearmaterial.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/regularizedbrookscorey.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/efftoabslaw.hh>
@@ -36,6 +36,12 @@
 #include <dumux/material/fluidmatrixinteractions/mp/2poftadapter.hh>
 #include <dumux/common/parameters.hh>
 
+// material laws for interfacial area
+#include <dumux/material/fluidmatrixinteractions/2pia/efftoabslawia.hh>
+#include <dumux/material/fluidmatrixinteractions/2pia/awnsurfacepolynomial2ndorder.hh>
+#include <dumux/material/fluidmatrixinteractions/2pia/awnsurfacepcmaxfct.hh>
+#include <dumux/material/fluidmatrixinteractions/2pia/awnsurfaceexpswpcto3.hh>
+
 namespace Dumux {
 
 /**
@@ -43,9 +49,9 @@ namespace Dumux {
  */
 template<class TypeTag>
 class EvaporationAtmosphereSpatialParams
-: public FVSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                         GetPropType<TypeTag, Properties::Scalar>,
-                         EvaporationAtmosphereSpatialParams<TypeTag>>
+: public FVNonEquilibriumSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
+                                       GetPropType<TypeTag, Properties::Scalar>,
+                                       EvaporationAtmosphereSpatialParams<TypeTag>>
 {
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
     using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
@@ -53,7 +59,7 @@ class EvaporationAtmosphereSpatialParams
     using FVElementGeometry = typename FVGridGeometry::LocalView;
     using SubControlVolume = typename FVElementGeometry::SubControlVolume;
     using Element = typename GridView::template Codim<0>::Entity;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, EvaporationAtmosphereSpatialParams<TypeTag>>;
+    using ParentType = FVNonEquilibriumSpatialParams<FVGridGeometry, Scalar, EvaporationAtmosphereSpatialParams<TypeTag>>;
 
     using GlobalPosition = Dune::FieldVector<Scalar, GridView::dimension>;
 
@@ -69,13 +75,17 @@ public:
     using PermeabilityType = Scalar;
     //! export the material law type used
     using MaterialLaw = TwoPAdapter<liquidPhaseIdx, EffToAbsLaw<RegularizedBrooksCorey<Scalar>>>;
-    //! export the types used for interfacial area calculations
-    using AwnSurface = GetPropType<TypeTag, Properties::AwnSurface>;
-    using AwsSurface = GetPropType<TypeTag, Properties::AwsSurface>;
-    using AnsSurface = GetPropType<TypeTag, Properties::AnsSurface>;
-
     //! convenience aliases of the law parameters
     using MaterialLawParams = typename MaterialLaw::Params;
+
+    //! export the types used for interfacial area calculations
+    using EffectiveIALawAws = AwnSurfacePolynomial2ndOrder<Scalar>;
+    using EffectiveIALawAwn = AwnSurfacePcMaxFct<Scalar>;
+    using EffectiveIALawAns = AwnSurfaceExpSwPcTo3<Scalar>;
+    using AwnSurface = EffToAbsLawIA<EffectiveIALawAwn, MaterialLawParams>;
+    using AwsSurface = EffToAbsLawIA<EffectiveIALawAws, MaterialLawParams>;
+    using AnsSurface = EffToAbsLawIA<EffectiveIALawAns, MaterialLawParams>;
+
     using AwnSurfaceParams = typename AwnSurface::Params;
     using AwsSurfaceParams = typename AwsSurface::Params;
     using AnsSurfaceParams = typename AnsSurface::Params;
@@ -284,21 +294,6 @@ public:
                        const ElementSolution &elemSol) const
     { return aWettingNonWettingSurfaceParams_.pcMax() ; }
 
-
-    /*!\brief Return the characteristic length for the mass transfer.
-     *
-     *        The position is determined based on the coordinate of
-     *        the vertex belonging to the considered sub controle volume.
-     * \param element     The finite element
-     * \param fvGeometry  The finite volume geometry
-     * \param scvIdx      The local index of the sub control volume */
-    template<class ElementSolution>
-    const Scalar characteristicLength(const Element & element,
-                                      const SubControlVolume &scv,
-                                      const ElementSolution &elemSol) const
-
-    { return characteristicLengthAtPos(scv.dofPosition()); }
-
     /*!\brief Return the characteristic length for the mass transfer.
      * \param globalPos The position in global coordinates.*/
     const Scalar characteristicLengthAtPos(const  GlobalPosition & globalPos) const
@@ -310,19 +305,6 @@ public:
         else DUNE_THROW(Dune::InvalidStateException, "You should not be here: x=" << globalPos[0] << " y= "<< globalPos[dimWorld-1]);
     }
 
-    /*!\brief Return the pre factor the the energy transfer
-     *
-     *        The position is determined based on the coordinate of
-     *        the vertex belonging to the considered sub controle volume.
-     * \param element     The finite element
-     * \param fvGeometry  The finite volume geometry
-     * \param scvIdx      The local index of the sub control volume */
-    template<class ElementSolution>
-    const Scalar factorEnergyTransfer(const Element &element,
-                                      const SubControlVolume &scv,
-                                      const ElementSolution &elemSol) const
-    { return factorEnergyTransferAtPos(scv.dofPosition()); }
-
     /*!\brief Return the pre factor the the energy transfer
      * \param globalPos The position in global coordinates.*/
     const Scalar factorEnergyTransferAtPos(const  GlobalPosition & globalPos) const
@@ -334,19 +316,6 @@ public:
         else DUNE_THROW(Dune::InvalidStateException, "You should not be here: x=" << globalPos[0] << " y= "<< globalPos[dimWorld-1]);
     }
 
-    /*!\brief Return the pre factor the the mass transfer
-     *
-     *        The position is determined based on the coordinate of
-     *        the vertex belonging to the considered sub controle volume.
-     * \param element     The finite element
-     * \param fvGeometry  The finite volume geometry
-     * \param scvIdx      The local index of the sub control volume */
-    template<class ElementSolution>
-    const Scalar factorMassTransfer(const Element &element,
-                                      const SubControlVolume &scv,
-                                      const ElementSolution &elemSol) const
-    { return factorMassTransferAtPos(scv.dofPosition()); }
-
     /*!\brief Return the pre factor the the mass transfer
      * \param globalPos The position in global coordinates.*/
     const Scalar factorMassTransferAtPos(const  GlobalPosition & globalPos) const
diff --git a/test/porousmediumflow/mpnc/implicit/thermalnonequilibrium/spatialparams.hh b/test/porousmediumflow/mpnc/implicit/thermalnonequilibrium/spatialparams.hh
index edb715a669..8b80f1faaa 100644
--- a/test/porousmediumflow/mpnc/implicit/thermalnonequilibrium/spatialparams.hh
+++ b/test/porousmediumflow/mpnc/implicit/thermalnonequilibrium/spatialparams.hh
@@ -26,6 +26,7 @@
 
 #include <dune/common/parametertreeparser.hh>
 
+#include <dumux/material/spatialparams/fvnonequilibrium.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/efftoabslaw.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/heatpipelaw.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/linearmaterial.hh>
@@ -33,6 +34,12 @@
 #include <dumux/porousmediumflow/properties.hh>
 #include <dumux/material/spatialparams/fv.hh>
 
+// material laws for interfacial area
+#include <dumux/material/fluidmatrixinteractions/2pia/efftoabslawia.hh>
+#include <dumux/material/fluidmatrixinteractions/2pia/awnsurfacepolynomial2ndorder.hh>
+#include <dumux/material/fluidmatrixinteractions/2pia/awnsurfacepcmaxfct.hh>
+#include <dumux/material/fluidmatrixinteractions/2pia/awnsurfaceexpswpcto3.hh>
+
 namespace Dumux {
 
 /**
@@ -41,9 +48,9 @@ namespace Dumux {
  */
 template<class TypeTag>
 class CombustionSpatialParams
-: public FVSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                         GetPropType<TypeTag, Properties::Scalar>,
-                         CombustionSpatialParams<TypeTag>>
+: public FVNonEquilibriumSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
+                                       GetPropType<TypeTag, Properties::Scalar>,
+                                       CombustionSpatialParams<TypeTag>>
 {
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
     using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
@@ -51,7 +58,7 @@ class CombustionSpatialParams
     using FVElementGeometry = typename FVGridGeometry::LocalView;
     using SubControlVolume = typename FVElementGeometry::SubControlVolume;
     using Element = typename GridView::template Codim<0>::Entity;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, CombustionSpatialParams<TypeTag>>;
+    using ParentType = FVNonEquilibriumSpatialParams<FVGridGeometry, Scalar, CombustionSpatialParams<TypeTag>>;
 
     enum {dimWorld = GridView::dimensionworld};
     using GlobalPosition = typename SubControlVolume::GlobalPosition;
@@ -68,6 +75,18 @@ public:
     using MaterialLaw = TwoPAdapter<wPhaseIdx, EffToAbsLaw<EffectiveLaw>>;
     using MaterialLawParams = typename MaterialLaw::Params;
 
+    //! export the types used for interfacial area calculations
+    using EffectiveIALawAws = AwnSurfacePolynomial2ndOrder<Scalar>;
+    using EffectiveIALawAwn = AwnSurfacePcMaxFct<Scalar>;
+    using EffectiveIALawAns = AwnSurfaceExpSwPcTo3<Scalar>;
+    using AwnSurface = EffToAbsLawIA<EffectiveIALawAwn, MaterialLawParams>;
+    using AwsSurface = EffToAbsLawIA<EffectiveIALawAws, MaterialLawParams>;
+    using AnsSurface = EffToAbsLawIA<EffectiveIALawAns, MaterialLawParams>;
+
+    using AwnSurfaceParams = typename AwnSurface::Params;
+    using AwsSurfaceParams = typename AwsSurface::Params;
+    using AnsSurfaceParams = typename AnsSurface::Params;
+
     CombustionSpatialParams(std::shared_ptr<const FVGridGeometry> fvGridGeometry) : ParentType(fvGridGeometry)
     {
         // this is the parameter value from file part
@@ -166,59 +185,17 @@ public:
     const MaterialLawParams& materialLawParamsAtPos(const GlobalPosition & globalPos) const
     { return materialParams_ ; }
 
-    /*!\brief Return the characteristic length for the mass transfer.
-     *
-     *        The position is determined based on the coordinate of
-     *        the vertex belonging to the considered sub controle volume.
-     * \param element     The finite element
-     * \param fvGeometry  The finite volume geometry
-     * \param scvIdx      The local index of the sub control volume */
-    template<class ElementSolution>
-    const Scalar characteristicLength(const Element & element,
-                                      const SubControlVolume &scv,
-                                      const ElementSolution &elemSol) const
-
-    { return characteristicLengthAtPos(scv.center()); }
-
-
     /*!\brief Return the characteristic length for the mass transfer.
      * \param globalPos The position in global coordinates.*/
     const Scalar characteristicLengthAtPos(const  GlobalPosition & globalPos) const
     { return characteristicLength_ ; }
 
-    /*!\brief Return the pre factor the the energy transfer
-     *
-     *        The position is determined based on the coordinate of
-     *        the vertex belonging to the considered sub controle volume.
-     * \param element     The finite element
-     * \param fvGeometry  The finite volume geometry
-     * \param scvIdx      The local index of the sub control volume */
-    template<class ElementSolution>
-    const Scalar factorEnergyTransfer(const Element &element,
-                                      const SubControlVolume &scv,
-                                      const ElementSolution &elemSol) const
-    { return factorEnergyTransferAtPos(scv.dofPosition()); }
-
-
     /*!\brief Return the pre factor the the energy transfer
      * \param globalPos The position in global coordinates.*/
     const Scalar factorEnergyTransferAtPos(const  GlobalPosition & globalPos) const
     { return factorEnergyTransfer_; }
 
 
-    /*!\brief Return the pre factor the the mass transfer
-     *
-     *        The position is determined based on the coordinate of
-     *        the vertex belonging to the considered sub controle volume.
-     * \param element     The finite element
-     * \param fvGeometry  The finite volume geometry
-     * \param scvIdx      The local index of the sub control volume */
-    template<class ElementSolution>
-    const Scalar factorMassTransfer(const Element &element,
-                                    const SubControlVolume &scv,
-                                    const ElementSolution &elemSol) const
-    { return factorMassTransferAtPos(scv.dofPosition()); }
-
     /*!\brief Return the pre factor the the mass transfer
      * \param globalPos The position in global coordinates.*/
     const Scalar factorMassTransferAtPos(const  GlobalPosition & globalPos) const
-- 
GitLab