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);
52 cornerHalfAngles_[0] = Throat::cornerHalfAngles<Scalar>(
shape);
59 const auto eIdx = this->
gridGeometry().elementMapper().index(element);
61 cornerHalfAngles_[eIdx] = Throat::cornerHalfAngles<Scalar>(
shape);
69 template<
class FS,
class ElementVolumeVariables>
71 const ElementVolumeVariables& elemVolVars)
const
72 {
return this->
asImp_().template wettingPhaseAtPos<FS>(element.geometry().center()); }
77 template<
class FS,
class ElementSolutionVector>
79 const SubControlVolume& scv,
80 const ElementSolutionVector& elemSol)
const
81 {
return this->
asImp_().template wettingPhaseAtPos<FS>(scv.center()); }
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);
163 const Scalar
surfaceTension = 0.5*(elemVolVars[0].surfaceTension() + elemVolVars[1].surfaceTension());
175 template<
class ElementVolumeVariables>
177 const ElementVolumeVariables& elemVolVars)
const
180 const Scalar
surfaceTension = 0.5*(elemVolVars[0].surfaceTension() + elemVolVars[1].surfaceTension());
195 template<
class ElementSolution>
197 const SubControlVolume& scv,
198 const ElementSolution& elemSol)
const
200 const auto params =
typename LocalRules::BasicParams(*
this, 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;
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);
The base class for spatial parameters used with finite-volume schemes.
Definition: common/fvspatialparams.hh:34
Implementation & asImp_()
Returns the implementation of the spatial parameters (static polymorphism)
Definition: common/fvspatialparams.hh:135
const GridGeometry & gridGeometry() const
The finite volume grid geometry.
Definition: common/fvspatialparams.hh:130
Base class for the finite volume geometry for porenetwork models.
Definition: discretization/porenetwork/gridgeometry.hh:477
The base class for spatial parameters for pore-network models.
Definition: porenetwork/common/spatialparams.hh:33
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
The default class for spatial parameters for two-phase pore-network models.
Definition: porenetwork/2p/spatialparams.hh:227
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
The base class for spatial parameters for pore-network models.
Definition: porenetwork/2p/spatialparams.hh:33
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:39
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
constexpr Shape shape(const Scalar shapeFactor) noexcept
Returns the shape for a given shape factor.
Definition: throatproperties.hh:165
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.