13#ifndef DUMUX_PNM_2P_SPATIAL_PARAMS_HH 
   14#define DUMUX_PNM_2P_SPATIAL_PARAMS_HH 
   30template<
class Gr
idGeometry, 
class Scalar, 
class LocalRules, 
class Implementation>
 
   35    using GridView = 
typename GridGeometry::GridView;
 
   36    using SubControlVolume = 
typename GridGeometry::SubControlVolume;
 
   37    using Element = 
typename GridView::template Codim<0>::Entity;
 
   38    using GlobalPosition = 
typename Element::Geometry::GlobalCoordinate;
 
   45        if (!
gridGeometry->useSameGeometryForAllPores() && LocalRules::supportsMultipleGeometries())
 
   46            DUNE_THROW(Dune::InvalidStateException, 
"Your MaterialLaw does not support multiple pore body shapes.");
 
   50            cornerHalfAngles_.resize(1);
 
   51            const auto& shape = this->
gridGeometry().throatCrossSectionShape(0);
 
   59                const auto eIdx = this->
gridGeometry().elementMapper().index(element);
 
   60                const auto& shape = this->
gridGeometry().throatCrossSectionShape(eIdx);
 
 
   69    template<
class FS, 
class ElementVolumeVariables>
 
   71                     const ElementVolumeVariables& elemVolVars)
 const 
 
   77    template<
class FS, 
class ElementSolutionVector>
 
   79                     const SubControlVolume& scv,
 
   80                     const ElementSolutionVector& elemSol)
 const 
 
   89    template<
class Flu
idSystem>
 
   92        DUNE_THROW(Dune::InvalidStateException,
 
   93                   "The spatial parameters do not provide " 
   94                   "a wettingPhaseAtPos() method.");
 
 
  104    template<
class ElementVolumeVariables>
 
  106                        const ElementVolumeVariables& elemVolVars)
 const 
  107    { 
return this->
asImp_().contactAngleAtPos(element.geometry().center()); }
 
 
  117    template<
class ElementSolutionVector>
 
  119                        const SubControlVolume& scv,
 
  120                        const ElementSolutionVector& elemSol)
 const 
  121    { 
return this->
asImp_().contactAngleAtPos(scv.center()); }
 
 
  126        DUNE_THROW(Dune::InvalidStateException,
 
  127                   "The spatial parameters do not provide " 
  128                   "a contactAngleAtPos() method.");
 
 
  138    template<
class ElementSolution>
 
  140                          const SubControlVolume& scv,
 
  141                          const ElementSolution& elemSol)
 const 
  142    { 
return this->
asImp_().surfaceTensionAtPos(scv.center()); }
 
 
  147        DUNE_THROW(Dune::InvalidStateException,
 
  148                   "The spatial parameters do not provide " 
  149                   "a surfaceTensionAtPos() method.");
 
 
  157    template<
class ElementVolumeVariables>
 
  159                         const ElementVolumeVariables& elemVolVars)
 const 
  161        const auto eIdx = this->
gridGeometry().elementMapper().index(element);
 
 
  175    template<
class ElementVolumeVariables>
 
  177                           const ElementVolumeVariables& elemVolVars)
 const 
 
  195    template<
class ElementSolution>
 
  197                                const SubControlVolume& scv,
 
  198                                const ElementSolution& elemSol)
 const 
  200        const auto params = 
typename LocalRules::BasicParams(this->
asImp_(), element, scv, elemSol);
 
 
  207            return cornerHalfAngles_[0];
 
  210            const auto eIdx = this->
gridGeometry().gridView().indexSet().index(element);
 
  211            return cornerHalfAngles_[eIdx];
 
 
  216    std::vector<Dune::ReservedVector<Scalar, 4>> cornerHalfAngles_;
 
 
  224template<
class Gr
idGeometry, 
class Scalar, 
class LocalRules>
 
  226: 
public TwoPSpatialParams<GridGeometry, Scalar, LocalRules, TwoPDefaultSpatialParams<GridGeometry, Scalar, LocalRules>>
 
  230    using GridView = 
typename GridGeometry::GridView;
 
  231    using Element = 
typename GridView::template Codim<0>::Entity;
 
  232    using GlobalPosition = 
typename Element::Geometry::GlobalCoordinate;
 
  234    using ParentType::ParentType;
 
  246    template<
class Flu
idSystem>
 
  248    { 
return FluidSystem::phase0Idx; }
 
 
  258        static const Scalar theta = 
getParam<Scalar>(
"SpatialParams.ContactAngle", 0.0);
 
 
  270        static const Scalar gamma = 
getParam<Scalar>(
"SpatialParams.SurfaceTension", 0.0725); 
 
 
 
Implementation & asImp_()
Returns the implementation of the spatial parameters (static polymorphism)
Definition common/fvspatialparams.hh:135
const GridGeometry & gridGeometry() const
Definition common/fvspatialparams.hh:130
Base class for the finite volume geometry for porenetwork models.
Definition discretization/porenetwork/gridgeometry.hh:477
Scalar throatInscribedRadius(const Element &element, const ElementVolumeVariables &elemVolVars) const
Inscribed radius of the throat . Can be solution-dependent.
Definition porenetwork/common/spatialparams.hh:72
const GridView & gridView() const
Returns a reference to the gridview.
Definition porenetwork/common/spatialparams.hh:111
SpatialParams(std::shared_ptr< const GridGeometry > gridGeometry)
Definition porenetwork/common/spatialparams.hh:45
Scalar surfaceTensionAtPos(const GlobalPosition &globalPos) const
Function for defining the surface Tension.
Definition porenetwork/2p/spatialparams.hh:268
int contactAngleAtPos(const GlobalPosition &globalPos) const
Function for defining the Contact Angle.
Definition porenetwork/2p/spatialparams.hh:256
int wettingPhaseAtPos(const GlobalPosition &globalPos) const
Function for defining which phase is to be considered as the wetting phase.
Definition porenetwork/2p/spatialparams.hh:247
TwoPDefaultSpatialParams(std::shared_ptr< const GridGeometry > gridGeometry)
Definition porenetwork/2p/spatialparams.hh:236
int wettingPhase(const Element &element, const ElementVolumeVariables &elemVolVars) const
The index of the wetting phase within a pore throat.
Definition porenetwork/2p/spatialparams.hh:70
Scalar contactAngle(const Element &element, const ElementVolumeVariables &elemVolVars) const
The contact angle within a pore throat .
Definition porenetwork/2p/spatialparams.hh:105
Scalar surfaceTension(const Element &element, const SubControlVolume &scv, const ElementSolution &elemSol) const
Returns the surface tension .
Definition porenetwork/2p/spatialparams.hh:139
int contactAngleAtPos(const GlobalPosition &globalPos) const
Function for defining the Contact Angle.
Definition porenetwork/2p/spatialparams.hh:124
int wettingPhase(const Element &element, const SubControlVolume &scv, const ElementSolutionVector &elemSol) const
The index of the wetting phase within a pore body.
Definition porenetwork/2p/spatialparams.hh:78
TwoPSpatialParams(std::shared_ptr< const GridGeometry > gridGeometry)
Definition porenetwork/2p/spatialparams.hh:42
Scalar surfaceTensionAtPos(const GlobalPosition &globalPos) const
Function for defining the surface Tension.
Definition porenetwork/2p/spatialparams.hh:145
const Scalar pcEntry(const Element &element, const ElementVolumeVariables &elemVolVars) const
Return the element (throat) specific entry capillary pressure .
Definition porenetwork/2p/spatialparams.hh:158
int wettingPhaseAtPos(const GlobalPosition &globalPos) const
Function for defining which phase is to be considered as the wetting phase.
Definition porenetwork/2p/spatialparams.hh:90
Scalar contactAngle(const Element &element, const SubControlVolume &scv, const ElementSolutionVector &elemSol) const
The contact angle within a pore body .
Definition porenetwork/2p/spatialparams.hh:118
const Scalar pcSnapoff(const Element &element, const ElementVolumeVariables &elemVolVars) const
Return the element (throat) specific snap-off capillary pressure .
Definition porenetwork/2p/spatialparams.hh:176
const Dune::ReservedVector< Scalar, 4 > & cornerHalfAngles(const Element &element) const
Definition porenetwork/2p/spatialparams.hh:204
auto fluidMatrixInteraction(const Element &element, const SubControlVolume &scv, const ElementSolution &elemSol) const
Returns the parameter object for the pore-local pc-Sw law.
Definition porenetwork/2p/spatialparams.hh:196
Wrapper type to combine an arbitrary number of different laws for fluid-matrix interaction (e....
auto makeFluidMatrixInteraction(Laws &&... laws)
Helper function to create an FluidMatrixInteraction object containing an arbitrary number of fluid ma...
Definition fluidmatrixinteraction.hh:40
T getParam(Args &&... args)
A free function to get a parameter from the parameter tree singleton.
Definition parameters.hh:139
Scalar pcSnapoff(const Scalar surfaceTension, const Scalar contactAngle, const Scalar inscribedRadius, const Throat::Shape shape)
The snap-off capillary pressure of a pore throat It checks if the cross section shape of the throat i...
Definition thresholdcapillarypressures.hh:65
Scalar pcEntry(const Scalar surfaceTension, const Scalar contactAngle, const Scalar inscribedRadius, const Scalar shapeFactor) noexcept
The entry capillary pressure of a pore throat.
Definition thresholdcapillarypressures.hh:82
Dune::ReservedVector< Scalar, 4 > cornerHalfAngles(Shape shape)
Returns the corner half angle.
Definition throatproperties.hh:85
Definition discretization/porenetwork/fvelementgeometry.hh:24
The base class for spatial parameters for pore-network models.
This file contains functions related to calculate pore-body properties.
Specification of threshold capillary pressures for the PNM.
This file contains functions related to calculate pore-throat properties.