Commit 5a48161f authored by Thomas Fetzer's avatar Thomas Fetzer
Browse files

[exercise-basic] Add spatialparameter file to solution

parent 6acc70c2
// -*- 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
*
* \brief Definition of the spatial parameters for the injection problem
* which uses the isothermal two-phase two-component
* fully implicit model.
*/
#ifndef DUMUX_EX_BASIC_SPATIAL_PARAMS_HH
#define DUMUX_EX_BASIC_SPATIAL_PARAMS_HH
#include <dumux/material/spatialparams/fv.hh>
#include <dumux/material/fluidmatrixinteractions/2p/regularizedbrookscorey.hh>
#include <dumux/material/fluidmatrixinteractions/2p/efftoabslaw.hh>
#include <dumux/io/gnuplotinterface.hh>
#include <dumux/io/plotmateriallaw.hh>
namespace Dumux {
/*!
* \ingroup TwoPTwoCModel
* \brief Definition of the spatial parameters for the injection problem
* which uses the isothermal two-phase two-component
* fully implicit model.
*/
template<class FVGridGeometry, class Scalar>
class InjectionSpatialParams
: public FVSpatialParams<FVGridGeometry, Scalar, InjectionSpatialParams<FVGridGeometry, Scalar>>
{
using ThisType = InjectionSpatialParams<FVGridGeometry, Scalar>;
using ParentType = FVSpatialParams<FVGridGeometry, Scalar, ThisType>;
using GridView = typename FVGridGeometry::GridView;
// get the dimensions of the simulation domain from GridView
static const int dimWorld = GridView::dimensionworld;
using Element = typename GridView::template Codim<0>::Entity;
using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
public:
// export permeability type
using PermeabilityType = Scalar;
using MaterialLaw = EffToAbsLaw<RegularizedBrooksCorey<Scalar>>;
using MaterialLawParams = typename MaterialLaw::Params;
/*!
* \brief The constructor
*
* \param fvGridGeometry The finite volume grid geometry
*/
InjectionSpatialParams(std::shared_ptr<const FVGridGeometry>& fvGridGeometry)
: ParentType(fvGridGeometry)
{
aquiferHeightFromBottom_ = 30.0;
// intrinsic permeabilities
aquitardK_ = getParam<Scalar>("SpatialParams.PermeabilityAquitard");
aquiferK_ = getParam<Scalar>("SpatialParams.PermeabilityAquifer");
// porosities
aquitardPorosity_ = 0.2;
aquiferPorosity_ = 0.4;
// residual saturations
aquitardMaterialParams_.setSwr(0.2);
aquitardMaterialParams_.setSnr(0.0);
aquiferMaterialParams_.setSwr(0.2);
aquiferMaterialParams_.setSnr(0.0);
// parameters for the Brooks-Corey law
aquitardMaterialParams_.setPe(getParam<Scalar>("SpatialParams.EntryPressureAquitard"));
aquiferMaterialParams_.setPe(getParam<Scalar>("SpatialParams.EntryPressureAquifer"));
aquitardMaterialParams_.setLambda(2.0);
aquiferMaterialParams_.setLambda(2.0);
}
/*!
* \brief Define the intrinsic permeability \f$\mathrm{[m^2]}\f$.
*
* \param globalPos The global position
*/
PermeabilityType permeabilityAtPos(const GlobalPosition& globalPos) const
{
// here, either aquitard or aquifer permeability are returned, depending on the global position
if (isInAquitard_(globalPos))
return aquitardK_;
return aquiferK_;
}
/*!
* \brief Define the porosity \f$\mathrm{[-]}\f$.
*
* \param globalPos The global position
*/
Scalar porosityAtPos(const GlobalPosition& globalPos) const
{
// here, either aquitard or aquifer porosity are returned, depending on the global position
if (isInAquitard_(globalPos))
return aquitardPorosity_;
return aquiferPorosity_;
}
/*!
* \brief Function for defining the parameters needed by constitutive relationships (kr-sw, pc-sw, etc.).
*
* \param globalPos The global position
*
* \return the material parameters object
*/
const MaterialLawParams& materialLawParamsAtPos(const GlobalPosition& globalPos) const
{
if (isInAquitard_(globalPos))
return aquitardMaterialParams_;
return aquiferMaterialParams_;
}
/*!
* \brief Function for defining which phase is to be considered as the wetting phase.
*
* \return the wetting phase index
* \param globalPos The position of the center of the element
*/
template<class FluidSystem>
int wettingPhaseAtPos(const GlobalPosition& globalPos) const
{ return FluidSystem::H2OIdx; }
private:
static constexpr Scalar eps_ = 1e-6;
// provides a convenient way distinguishing whether a given location is inside the aquitard
bool isInAquitard_(const GlobalPosition &globalPos) const
{
// globalPos[dimWorld-1] is the y direction for 2D grids or the z direction for 3D grids
return globalPos[dimWorld-1] > aquiferHeightFromBottom_ + eps_;
}
Scalar aquitardK_;
Scalar aquiferK_;
Scalar aquiferHeightFromBottom_;
Scalar aquitardPorosity_;
Scalar aquiferPorosity_;
MaterialLawParams aquitardMaterialParams_;
MaterialLawParams aquiferMaterialParams_;
};
} // end namespace Dumux
#endif
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment