diff --git a/appl/lecture/msm/buckleyleverett/buckleyleverett_analytic.hh b/appl/lecture/msm/buckleyleverett/buckleyleverett_analytic.hh index 8f13316b4cf35fa1c68b296ab3642d83d5057bae..a65078a7c2a888644819ddbc8b39227f80fa64e4 100644 --- a/appl/lecture/msm/buckleyleverett/buckleyleverett_analytic.hh +++ b/appl/lecture/msm/buckleyleverett/buckleyleverett_analytic.hh @@ -111,8 +111,8 @@ public: // std::cout<<"satVec_ = "<<satVec_<<std::endl; FluidState fluidState; - Scalar temp = problem_.temperature(dummyGlobal_, dummyElement_); - Scalar press = problem_.referencePressure(dummyGlobal_, dummyElement_); + Scalar temp = problem_.temperature(dummyElement_); + Scalar press = problem_.referencePressure(dummyElement_); Scalar viscosityW = FluidSystem::phaseViscosity(wPhaseIdx, temp, press, fluidState); Scalar viscosityNW = FluidSystem::phaseViscosity(nPhaseIdx, temp, press, fluidState); diff --git a/appl/lecture/msm/buckleyleverett/buckleyleverett_ff.cc b/appl/lecture/msm/buckleyleverett/buckleyleverett_ff.cc index 95a2e349591035a5634189e32d40bd23558280a1..b8c9190eb3b741448187ba8c2a7107443a2fcfc4 100644 --- a/appl/lecture/msm/buckleyleverett/buckleyleverett_ff.cc +++ b/appl/lecture/msm/buckleyleverett/buckleyleverett_ff.cc @@ -59,6 +59,7 @@ int main(int argc, char** argv) typedef GET_PROP_TYPE(TypeTag, PTAG(Scalar)) Scalar; typedef GET_PROP_TYPE(TypeTag, PTAG(Grid)) Grid; typedef GET_PROP_TYPE(TypeTag, PTAG(Problem)) Problem; + typedef GET_PROP_TYPE(TypeTag, PTAG(TimeManager)) TimeManager; typedef Dune::FieldVector<Scalar, Grid::dimensionworld> GlobalPosition; static const int dim = Grid::dimension; @@ -109,10 +110,11 @@ int main(int argc, char** argv) WettingPhase::Component::setDensity(interfaceFluidProps.IFP_DensityWettingFluid); NonwettingPhase::Component::setDensity(interfaceFluidProps.IFP_DensityNonWettingFluid); - Problem problem(grid.leafView(), lowerLeft, upperRight); + TimeManager timeManager; + Problem problem(timeManager, grid.leafView(), lowerLeft, upperRight); - problem.timeManager().init(problem, 0, dt, tEnd); - problem.timeManager().run(); + timeManager.init(problem, 0, dt, tEnd); + timeManager.run(); return 0; } catch (Dune::Exception &e) { diff --git a/appl/lecture/msm/buckleyleverett/buckleyleverettproblem.hh b/appl/lecture/msm/buckleyleverett/buckleyleverettproblem.hh index 80ef62ab19a7e7cfc5ace139c08a2ae3c670d54d..c611d1c9c20bb7c0bf4cca58fa625f55a1e1a21d 100644 --- a/appl/lecture/msm/buckleyleverett/buckleyleverettproblem.hh +++ b/appl/lecture/msm/buckleyleverett/buckleyleverettproblem.hh @@ -125,10 +125,9 @@ SET_SCALAR_PROP(BuckleyLeverettProblem, CFLFactor, 0.95); //0.95 * \ingroup DecoupledProblems */ template<class TypeTag = TTAG(BuckleyLeverettProblem)> -class BuckleyLeverettProblem: public IMPESProblem2P<TypeTag, BuckleyLeverettProblem<TypeTag> > +class BuckleyLeverettProblem: public IMPESProblem2P<TypeTag> { - typedef BuckleyLeverettProblem<TypeTag> ThisType; - typedef IMPESProblem2P<TypeTag, ThisType> ParentType; + typedef IMPESProblem2P<TypeTag> ParentType; typedef typename GET_PROP_TYPE(TypeTag, PTAG(GridView)) GridView; typedef typename GET_PROP_TYPE(TypeTag, PTAG(TwoPIndices)) Indices; @@ -136,14 +135,22 @@ class BuckleyLeverettProblem: public IMPESProblem2P<TypeTag, BuckleyLeverettProb typedef typename GET_PROP_TYPE(TypeTag, PTAG(FluidSystem)) FluidSystem; typedef typename GET_PROP_TYPE(TypeTag, PTAG(FluidState)) FluidState; + typedef typename GET_PROP_TYPE(TypeTag, PTAG(TimeManager)) TimeManager; + + typedef typename GET_PROP_TYPE(TypeTag, PTAG(BoundaryTypes)) BoundaryTypes; + typedef typename GET_PROP(TypeTag, PTAG(SolutionTypes))::PrimaryVariables PrimaryVariables; + enum { dim = GridView::dimension, dimWorld = GridView::dimensionworld }; enum { - wetting = 0, nonwetting = 1 + wPhaseIdx = Indices::wPhaseIdx, nPhaseIdx = Indices::nPhaseIdx, + eqIdxPress = Indices::pressureEq, + eqIdxSat = Indices::saturationEq }; + typedef typename GET_PROP_TYPE(TypeTag, PTAG(Scalar)) Scalar; typedef typename GridView::Traits::template Codim<0>::Entity Element; @@ -151,11 +158,11 @@ class BuckleyLeverettProblem: public IMPESProblem2P<TypeTag, BuckleyLeverettProb typedef Dune::FieldVector<Scalar, dimWorld> GlobalPosition; public: - BuckleyLeverettProblem(const GridView &gridView, + BuckleyLeverettProblem(TimeManager& timeManager, const GridView &gridView, const GlobalPosition lowerLeft = 0, const GlobalPosition upperRight = 0, const Scalar pleftbc = 2e5) - : ParentType(gridView), + : ParentType(timeManager, gridView), lowerLeft_(lowerLeft), upperRight_(upperRight), eps_(1e-8), @@ -208,99 +215,78 @@ public: analyticSolution_.addOutputVtkFields(this->resultWriter()); } - //! Write the fields current solution into an VTK output file. - void writeOutput() - { -// if (this->timeManager().time() > 43.1999e6) -// { - if (this->gridView().comm().rank() == 0) - std::cout << "Writing result file for current time step\n"; - - this->resultWriter().beginWrite(this->timeManager().time() + this->timeManager().timeStepSize()); - this->asImp_().addOutputVtkFields(); - this->resultWriter().endWrite(); -// } - } - /*! * \brief Returns the temperature within the domain. * * This problem assumes a temperature of 10 degrees Celsius. */ - Scalar temperature(const GlobalPosition& globalPos, const Element& element) const + Scalar temperatureAtPos(const GlobalPosition& globalPos) const { return 273.15 + 10; // -> 10°C } // \} - - Scalar referencePressure(const GlobalPosition& globalPos, const Element& element) const + Scalar referencePressureAtPos(const GlobalPosition& globalPos) const { - return 1e5; - } - - std::vector<Scalar> source(const GlobalPosition& globalPos, const Element& element) - { - return std::vector<Scalar>(2, 0.0); - } - - typename BoundaryConditions::Flags bctypePress(const GlobalPosition& globalPos, const Intersection& intersection) const - { - if (globalPos[0] < eps_) - return BoundaryConditions::dirichlet; - - // all other boundaries - else - return BoundaryConditions::neumann; + return 1e5; // -> 10°C } - BoundaryConditions::Flags bctypeSat(const GlobalPosition& globalPos, const Intersection& intersection) const + void sourceAtPos(PrimaryVariables &values,const GlobalPosition& globalPos) const { - if (globalPos[0] < eps_) - return Dumux::BoundaryConditions::dirichlet; - else if (globalPos[0] > upperRight_[0] - eps_) - return Dumux::BoundaryConditions::outflow; - else - return Dumux::BoundaryConditions::neumann; + values = 0; } - Scalar dirichletPress(const GlobalPosition& globalPos, const Intersection& intersection) const + void boundaryTypesAtPos(BoundaryTypes &bcTypes, const GlobalPosition& globalPos) const { - return pLeftBc_; + if (globalPos[0] < eps_) + { + bcTypes.setAllDirichlet(); + } + else if (globalPos[0] > upperRight_[0] - eps_) + { + bcTypes.setNeumann(eqIdxPress); + bcTypes.setOutflow(eqIdxSat); + } + // all other boundaries + else + { + bcTypes.setAllNeumann(); + } } - Scalar dirichletSat(const GlobalPosition& globalPos, const Intersection& intersection) const + void dirichletAtPos(PrimaryVariables &values, const GlobalPosition& globalPos) const { if (globalPos[0] < eps_) - return 0.8; - - // all other boundaries - + { + values[eqIdxPress] = pLeftBc_; + values[eqIdxSat] = 0.8; + } else - return 0.2; + { + values[eqIdxPress] = pLeftBc_; + values[eqIdxSat] = 0.2; + } } - std::vector<Scalar> neumann(const GlobalPosition& globalPos, const Intersection& intersection) const + void neumannAtPos(PrimaryVariables &values, const GlobalPosition& globalPos) const { - std::vector<Scalar> neumannFlux(2, 0.0); + values = 0; if (globalPos[0]> upperRight_[0] - eps_) { // the volume flux should remain constant, when density is changed // here, we multiply by the density of the NonWetting Phase const Scalar referenceDensity = 1000.0; - neumannFlux[nonwetting] = 3e-4 * densityNonWetting_/referenceDensity; + + values[nPhaseIdx] = 3e-4 * densityNonWetting_/referenceDensity; } - return neumannFlux; } - Scalar initSat(const GlobalPosition& globalPos, const Element& element) const + void initialAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const { - if (globalPos[0] < eps_) - return 0.8; - - else - return 0.2; + values[eqIdxPress] = 0; + values[eqIdxSat] = 0.2; } private: diff --git a/appl/lecture/msm/mcwhorter/mcwhorter_analytic.hh b/appl/lecture/msm/mcwhorter/mcwhorter_analytic.hh index c27c060c17f017241616fb02aef378649bbdbac6..4970225a061dac76b2a8be64e2f121929a21fa91 100644 --- a/appl/lecture/msm/mcwhorter/mcwhorter_analytic.hh +++ b/appl/lecture/msm/mcwhorter/mcwhorter_analytic.hh @@ -48,6 +48,8 @@ class McWhorterAnalytic typedef typename GET_PROP_TYPE(TypeTag, PTAG(FluidSystem)) FluidSystem; typedef typename GET_PROP_TYPE(TypeTag, PTAG(FluidState)) FluidState; + typedef typename GET_PROP(TypeTag, PTAG(SolutionTypes))::PrimaryVariables PrimaryVariables; + typedef typename GET_PROP_TYPE(TypeTag, PTAG(TwoPIndices)) Indices; enum @@ -56,7 +58,9 @@ class McWhorterAnalytic }; enum { - wPhaseIdx = Indices::wPhaseIdx, nPhaseIdx = Indices::nPhaseIdx + wPhaseIdx = Indices::wPhaseIdx, nPhaseIdx = Indices::nPhaseIdx, + eqIdxPress = Indices::pressureEq, + eqIdxSat = Indices::saturationEq }; typedef Dune::BlockVector<Dune::FieldVector<Scalar, 1> > BlockVector; @@ -128,7 +132,9 @@ public: snr_ = materialLawParams.Snr(); porosity_ = problem_.spatialParameters().porosity(dummyGlobal_, dummyElement_); permeability_ = problem_.spatialParameters().intrinsicPermeability(dummyGlobal_, dummyElement_)[0][0]; - sInit_ = problem_.initSat(dummyGlobal_, dummyElement_); + PrimaryVariables initVec; + problem_.initial(initVec, dummyElement_); + sInit_ = initVec[eqIdxSat]; Scalar s0 =(1 - snr_ - swr_); time_=0; @@ -142,8 +148,8 @@ public: satVec_[i]=satVec_[i-1]+h_; } FluidState fluidState; - Scalar temp = problem_.temperature(dummyGlobal_, dummyElement_); - Scalar press = problem_.referencePressure(dummyGlobal_, dummyElement_); + Scalar temp = problem_.temperature(dummyElement_); + Scalar press = problem_.referencePressure(dummyElement_); Scalar viscosityW = FluidSystem::phaseViscosity(wPhaseIdx, temp, press, fluidState); Scalar viscosityNW = FluidSystem::phaseViscosity(nPhaseIdx, temp, press, fluidState); diff --git a/appl/lecture/msm/mcwhorter/mcwhorter_ff.cc b/appl/lecture/msm/mcwhorter/mcwhorter_ff.cc index 62bbabf4de1e87364eb9f73cd7ef36a151b89350..b3a6068c43beeb36f884562c5ad11cd16cfb813b 100644 --- a/appl/lecture/msm/mcwhorter/mcwhorter_ff.cc +++ b/appl/lecture/msm/mcwhorter/mcwhorter_ff.cc @@ -30,6 +30,7 @@ int main(int argc, char** argv) typedef GET_PROP_TYPE(TypeTag, PTAG(Scalar)) Scalar; typedef GET_PROP_TYPE(TypeTag, PTAG(Grid)) Grid; typedef GET_PROP_TYPE(TypeTag, PTAG(Problem)) Problem; + typedef GET_PROP_TYPE(TypeTag, PTAG(TimeManager)) TimeManager; typedef Dune::FieldVector<Scalar, Grid::dimensionworld> GlobalPosition; static const int dim = Grid::dimension; @@ -78,10 +79,11 @@ int main(int argc, char** argv) WettingPhase::Component::setViscosity(interfaceFluidProps.IFP_ViscosityWettingFluid); NonwettingPhase::Component::setViscosity(interfaceFluidProps.IFP_ViscosityNonWettingFluid); - Problem problem(grid.leafView(), lowerLeft, upperRight); + TimeManager timeManager; + Problem problem(timeManager, grid.leafView(), lowerLeft, upperRight); - problem.timeManager().init(problem, 0, dt, tEnd); - problem.timeManager().run(); + timeManager.init(problem, 0, dt, tEnd); + timeManager.run(); return 0; diff --git a/appl/lecture/msm/mcwhorter/mcwhorterproblem.hh b/appl/lecture/msm/mcwhorter/mcwhorterproblem.hh index e07bd42b428c5aefa29286f399b6315316c6c339..4e70b431b784d939c3729828377d35385574d738 100644 --- a/appl/lecture/msm/mcwhorter/mcwhorterproblem.hh +++ b/appl/lecture/msm/mcwhorter/mcwhorterproblem.hh @@ -119,10 +119,9 @@ SET_SCALAR_PROP(McWhorterProblem, CFLFactor, 0.8); //! @brief McWhorter transport problem template<class TypeTag = TTAG(McWhorterProblem)> -class McWhorterProblem: public IMPESProblem2P<TypeTag, McWhorterProblem<TypeTag> > +class McWhorterProblem: public IMPESProblem2P<TypeTag> { - typedef McWhorterProblem<TypeTag> ThisType; - typedef IMPESProblem2P<TypeTag, ThisType> ParentType; + typedef IMPESProblem2P<TypeTag> ParentType; typedef typename GET_PROP_TYPE(TypeTag, PTAG(GridView)) GridView; typedef typename GET_PROP_TYPE(TypeTag, PTAG(TwoPIndices)) Indices; @@ -130,14 +129,22 @@ class McWhorterProblem: public IMPESProblem2P<TypeTag, McWhorterProblem<TypeTag> typedef typename GET_PROP_TYPE(TypeTag, PTAG(FluidSystem)) FluidSystem; typedef typename GET_PROP_TYPE(TypeTag, PTAG(FluidState)) FluidState; + typedef typename GET_PROP_TYPE(TypeTag, PTAG(TimeManager)) TimeManager; + + typedef typename GET_PROP_TYPE(TypeTag, PTAG(BoundaryTypes)) BoundaryTypes; + typedef typename GET_PROP(TypeTag, PTAG(SolutionTypes))::PrimaryVariables PrimaryVariables; + enum { dim = GridView::dimension, dimWorld = GridView::dimensionworld }; enum { - wPhaseIdx = Indices::wPhaseIdx, nPhaseIdx = Indices::nPhaseIdx + wPhaseIdx = Indices::wPhaseIdx, nPhaseIdx = Indices::nPhaseIdx, + eqIdxPress = Indices::pressureEq, + eqIdxSat = Indices::saturationEq }; + typedef typename GET_PROP_TYPE(TypeTag, PTAG(Scalar)) Scalar; typedef typename GridView::Traits::template Codim<0>::Entity Element; @@ -147,17 +154,19 @@ class McWhorterProblem: public IMPESProblem2P<TypeTag, McWhorterProblem<TypeTag> public: - McWhorterProblem(const GridView &gridView, + McWhorterProblem(TimeManager& timeManager, const GridView &gridView, const GlobalPosition lowerLeft = 0, const GlobalPosition upperRight = 0, const Scalar pleftbc = 2.0e5)//? initial oil pressure? - : ParentType(gridView), + : ParentType(timeManager, gridView), lowerLeft_(lowerLeft), upperRight_(upperRight), eps_(1e-6), pLeftBc_(pleftbc), analyticSolution_(*this) - {} + { + this->setOutputInterval(10); + } /*! * \brief The problem name. @@ -187,73 +196,62 @@ public: analyticSolution_.addOutputVtkFields(this->resultWriter()); } - bool shouldWriteOutput() const - { - if (this->timeManager().timeStepIndex() % 10 == 0) - { - return true; - } - return false; - } - /*! * \brief Returns the temperature within the domain. * * This problem assumes a temperature of 10 degrees Celsius. */ - - Scalar temperature(const GlobalPosition& globalPos, const Element& element) const - {return 273.15 + 10; // -> 10°C - } - - Scalar referencePressure(const GlobalPosition& globalPos, const Element& element) const - { - return 1e5; - } - std::vector<Scalar> source (const GlobalPosition& globalPos, const Element& element) + Scalar temperatureAtPos(const GlobalPosition& globalPos) const { - return std::vector<Scalar>(2,0.0);//no source and sink terms + return 273.15 + 10; // -> 10°C } - BoundaryConditions::Flags bctypePress(const GlobalPosition& globalPos, const Intersection& intersection) const + Scalar referencePressureAtPos(const GlobalPosition& globalPos) const { - if (globalPos[0] < eps_)//west - return BoundaryConditions::dirichlet; - - // all other boundaries - else - return BoundaryConditions::neumann; + return 1e5; // -> 10°C } - BoundaryConditions::Flags bctypeSat(const GlobalPosition& globalPos, const Intersection& intersection) const + void sourceAtPos(PrimaryVariables &values,const GlobalPosition& globalPos) const { - if (globalPos[0] < eps_)// west and east - return Dumux::BoundaryConditions::dirichlet; - else - return Dumux::BoundaryConditions::neumann; + values = 0; } - Scalar dirichletPress(const GlobalPosition& globalPos, const Intersection& intersection) const + void boundaryTypesAtPos(BoundaryTypes &bcTypes, const GlobalPosition& globalPos) const { - return pLeftBc_; + if (globalPos[0] < eps_)//west + { + bcTypes.setAllDirichlet(); + } + // all other boundaries + else + { + bcTypes.setAllNeumann(); + } } - Scalar dirichletSat(const GlobalPosition& globalPos, const Intersection& intersection) const + void dirichletAtPos(PrimaryVariables &values, const GlobalPosition& globalPos) const { - if (globalPos[0] < eps_)//west - return 1.0; - else //east, north and south are Neumann - return 0.0; + if (globalPos[0] < eps_) + { + values[eqIdxPress] = pLeftBc_; + values[eqIdxSat] = 1.0; + } + else + { + values[eqIdxPress] = pLeftBc_; + values[eqIdxSat] = 0.0; + } } - std::vector<Scalar> neumann(const GlobalPosition& globalPos, const Intersection& intersection) const + void neumannAtPos(PrimaryVariables &values, const GlobalPosition& globalPos) const { - return std::vector<Scalar>(2,0.0); + values = 0; } - Scalar initSat (const GlobalPosition& globalPos, const Element& element) const + void initialAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const { - return 0.0; + values = 0; } /* McWhorterProblem(VC& variables, Fluid& wettingphase, Fluid& nonwettingphase, diff --git a/test/decoupled/1p/benchmarkresult.hh b/test/decoupled/1p/benchmarkresult.hh index 5c2ae389f4a1ce48dcbf60603a904fd739fa94ad..d09a89ea21a9f6edcee41a181b97b7f28f63031d 100644 --- a/test/decoupled/1p/benchmarkresult.hh +++ b/test/decoupled/1p/benchmarkresult.hh @@ -431,7 +431,9 @@ public: uMin = std::min(uMin, approxPressure); uMax = std::max(uMax, approxPressure); - sumf += volume*(problem.source(global, element)[0]); + typename Problem::PrimaryVariables sourceVec; + problem.source(sourceVec, element); + sumf += volume*sourceVec[0]; // get the absolute permeability Dune::FieldMatrix<double,dim,dim> K = problem.spatialParameters().intrinsicPermeability(global, element); diff --git a/test/decoupled/1p/test_diffusion.cc b/test/decoupled/1p/test_diffusion.cc index 1fd8f1daa3897ae782ce03cd42df4e508e3ffa7c..f6689a34aff4abfa72d5f9339613ac5973eab1b7 100644 --- a/test/decoupled/1p/test_diffusion.cc +++ b/test/decoupled/1p/test_diffusion.cc @@ -87,6 +87,7 @@ int main(int argc, char** argv) typedef GET_PROP_TYPE(TTAG(FVVelocity2PTestProblem), PTAG(Problem)) FVProblem; FVProblem fvProblem(grid.leafView(), delta); + fvProblem.setName("fvdiffusion"); timer.reset(); fvProblem.init(); fvProblem.model().calculateVelocity(); @@ -97,6 +98,7 @@ int main(int argc, char** argv) typedef GET_PROP_TYPE(TTAG(FVMPFAOVelocity2PTestProblem), PTAG(Problem)) MPFAOProblem; MPFAOProblem mpfaProblem(grid.leafView(), delta); + mpfaProblem.setName("fvmpfaodiffusion"); timer.reset(); mpfaProblem.init(); mpfaProblem.model().calculateVelocity(); @@ -107,6 +109,7 @@ int main(int argc, char** argv) typedef GET_PROP_TYPE(TTAG(MimeticPressure2PTestProblem), PTAG(Problem)) MimeticProblem; MimeticProblem mimeticProblem(grid.leafView(), delta); + mimeticProblem.setName("mimeticdiffusion"); timer.reset(); mimeticProblem.init(); mimeticProblem.model().calculateVelocity(); diff --git a/test/decoupled/1p/test_diffusion_problem.hh b/test/decoupled/1p/test_diffusion_problem.hh index 22a2fdf84fa837fecf6a9b6472b24a750b581849..eeb08d154678dfd2eec4d346383575f263fb2a78 100644 --- a/test/decoupled/1p/test_diffusion_problem.hh +++ b/test/decoupled/1p/test_diffusion_problem.hh @@ -46,16 +46,6 @@ namespace Dumux { -//! \cond INTERNAL -struct FileNames -{ - enum - { - TPFAName = 0, MPFAName = 1, MimeticName = 2 - }; -}; -//! \endcond - /*! * \ingroup IMPETtests */ @@ -123,25 +113,20 @@ public: // Enable gravity SET_BOOL_PROP(DiffusionTestProblem, EnableGravity, false); -NEW_PROP_TAG( FileName ); - // set the types for the 2PFA FV method NEW_TYPE_TAG(FVVelocity2PTestProblem, INHERITS_FROM(DiffusionTestProblem)); -SET_INT_PROP(FVVelocity2PTestProblem, FileName, FileNames::TPFAName); SET_INT_PROP(FVVelocity2PTestProblem, IterationNumberPreconditioner, 0); SET_TYPE_PROP(FVVelocity2PTestProblem, Model, Dumux::FVVelocity2P<TTAG(FVVelocity2PTestProblem)>); SET_TYPE_PROP(FVVelocity2PTestProblem, Problem, Dumux::TestDiffusionProblem<TTAG(FVVelocity2PTestProblem)>); // set the types for the MPFA-O FV method NEW_TYPE_TAG(FVMPFAOVelocity2PTestProblem, INHERITS_FROM(DiffusionTestProblem)); -SET_INT_PROP(FVMPFAOVelocity2PTestProblem, FileName, FileNames::MPFAName); SET_INT_PROP(FVMPFAOVelocity2PTestProblem, IterationNumberPreconditioner, 1); SET_TYPE_PROP(FVMPFAOVelocity2PTestProblem, Model, Dumux::FVMPFAOVelocity2P<TypeTag>); SET_TYPE_PROP(FVMPFAOVelocity2PTestProblem, Problem, Dumux::TestDiffusionProblem<TTAG(FVMPFAOVelocity2PTestProblem)>); // set the types for the mimetic FD method -NEW_TYPE_TAG(MimeticPressure2PTestProblem, INHERITS_FROM(DiffusionTestProblem)); -SET_INT_PROP(MimeticPressure2PTestProblem, FileName, FileNames::MimeticName); +NEW_TYPE_TAG(MimeticPressure2PTestProblem, INHERITS_FROM(DiffusionTestProblem, Mimetic)); SET_INT_PROP(MimeticPressure2PTestProblem, IterationNumberPreconditioner, 0); SET_TYPE_PROP(MimeticPressure2PTestProblem, Model, Dumux::MimeticPressure2P<TTAG(MimeticPressure2PTestProblem)>); SET_TYPE_PROP(MimeticPressure2PTestProblem, Problem, Dumux::TestDiffusionProblem<TTAG(MimeticPressure2PTestProblem)>); @@ -153,10 +138,9 @@ SET_TYPE_PROP(MimeticPressure2PTestProblem, Problem, Dumux::TestDiffusionProblem * \brief test problem for diffusion models from the FVCA5 benchmark. */ template<class TypeTag = TTAG(DiffusionTestProblem)> -class TestDiffusionProblem: public DiffusionProblem2P<TypeTag, TestDiffusionProblem<TypeTag> > +class TestDiffusionProblem: public DiffusionProblem2P<TypeTag> { - typedef TestDiffusionProblem<TypeTag> ThisType; - typedef DiffusionProblem2P<TypeTag, ThisType> ParentType; + typedef DiffusionProblem2P<TypeTag> ParentType; typedef typename GET_PROP_TYPE(TypeTag, PTAG(GridView)) GridView; typedef typename GET_PROP_TYPE(TypeTag, PTAG(TwoPIndices)) Indices; @@ -164,6 +148,8 @@ class TestDiffusionProblem: public DiffusionProblem2P<TypeTag, TestDiffusionProb typedef typename GET_PROP_TYPE(TypeTag, PTAG(FluidSystem)) FluidSystem; typedef typename GET_PROP_TYPE(TypeTag, PTAG(FluidState)) FluidState; + typedef typename GET_PROP_TYPE(TypeTag, PTAG(BoundaryTypes)) BoundaryTypes; + enum { dim = GridView::dimension, dimWorld = GridView::dimensionworld @@ -171,7 +157,9 @@ class TestDiffusionProblem: public DiffusionProblem2P<TypeTag, TestDiffusionProb enum { - wPhaseIdx = Indices::wPhaseIdx, nPhaseIdx = Indices::nPhaseIdx + wPhaseIdx = Indices::wPhaseIdx, nPhaseIdx = Indices::nPhaseIdx, + eqIdxPress = Indices::pressureEq, + eqIdxSat = Indices::saturationEq }; typedef typename GET_PROP_TYPE(TypeTag, PTAG(Scalar)) Scalar; @@ -179,9 +167,10 @@ class TestDiffusionProblem: public DiffusionProblem2P<TypeTag, TestDiffusionProb typedef typename GridView::Traits::template Codim<0>::Entity Element; typedef typename GridView::Intersection Intersection; typedef Dune::FieldVector<Scalar, dimWorld> GlobalPosition; - typedef Dune::FieldVector<Scalar, dim> LocalPosition; public: + typedef typename GET_PROP(TypeTag, PTAG(SolutionTypes))::PrimaryVariables PrimaryVariables; + TestDiffusionProblem(const GridView &gridView, const double delta = 1.0) : ParentType(gridView), delta_(delta) { @@ -194,47 +183,30 @@ public: */ // \{ - /*! - * \brief The problem name. - * - * This is used as a prefix for files generated by the simulation. - */ - const char *name() const - { - switch (GET_PROP_VALUE(TypeTag, PTAG(FileName))) - { - case FileNames::TPFAName: - return "fvdiffusion"; - case FileNames::MPFAName: - return "fvmpfaodiffusion"; - case FileNames::MimeticName: - return "mimeticdiffusion"; - } - return "test_diffusion"; - } - bool shouldWriteRestartFile() const { return false; } /*! - * \brief Returns the temperature within the domain. - * - * This problem assumes a temperature of 10 degrees Celsius. - */ - Scalar temperature(const GlobalPosition& globalPos, const Element& element) const + * \brief Returns the temperature within the domain. + * + * This problem assumes a temperature of 10 degrees Celsius. + */ + Scalar temperatureAtPos(const GlobalPosition& globalPos) const { return 273.15 + 10; // -> 10°C } // \} - Scalar referencePressure(const GlobalPosition& globalPos, const Element& element) const + + //! Returns the reference pressure for evaluation of constitutive relations + Scalar referencePressureAtPos(const GlobalPosition& globalPos) const { return 1e5; // -> 10°C } - std::vector<Scalar> source(const GlobalPosition& globalPos, const Element& element) - { + void sourceAtPos(PrimaryVariables &values,const GlobalPosition& globalPos) const + { double pi = 4.0*atan(1.0); double rt = globalPos[0]*globalPos[0]+globalPos[1]*globalPos[1]; double ux = pi*cos(pi*globalPos[0])*sin(pi*globalPos[1]); @@ -244,42 +216,36 @@ public: double kyy = (globalPos[0]*globalPos[0] + delta_*globalPos[1]*globalPos[1])/rt; double f0 = sin(pi*globalPos[0])*sin(pi*globalPos[1])*pi*pi*(1.0 + delta_)*(globalPos[0]*globalPos[0] + globalPos[1]*globalPos[1]) + cos(pi*globalPos[0])*sin(pi*globalPos[1])*pi*(1.0 - 3.0*delta_)*globalPos[0] - + cos(pi*globalPos[1])*sin(pi*globalPos[0])*pi*(1.0 - 3.0*delta_)*globalPos[1] - + cos(pi*globalPos[1])*cos(pi*globalPos[0])*2.0*pi*pi*(1.0 - delta_)*globalPos[0]*globalPos[1]; - - std::vector<double> result(2, 0.0); - result[wPhaseIdx]=(f0 + 2.0*(globalPos[0]*(kxx*ux + kxy*uy) + globalPos[1]*(kxy*ux + kyy*uy)))/rt; + + cos(pi*globalPos[1])*sin(pi*globalPos[0])*pi*(1.0 - 3.0*delta_)*globalPos[1] + cos(pi*globalPos[1])*cos(pi*globalPos[0])*2.0*pi*pi*(1.0 - delta_)*globalPos[0]*globalPos[1]; - return (result); - } - - typename BoundaryConditions::Flags bctypePress(const GlobalPosition& globalPos, const Intersection& intersection) const - { - return BoundaryConditions::dirichlet; + values[wPhaseIdx] = (f0 + 2.0*(globalPos[0]*(kxx*ux + kxy*uy) + globalPos[1]*(kxy*ux + kyy*uy)))/rt; } - Scalar dirichletPress(const GlobalPosition& globalPos, const Intersection& intersection) const + /*! + * \brief Returns the type of boundary condition. + * + * + * BC for saturation equation can be dirichlet (saturation), neumann (flux), or outflow. + */ + void boundaryTypesAtPos(BoundaryTypes &bcTypes, const GlobalPosition& globalPos) const { - return (exact(globalPos)); + + bcTypes.setAllDirichlet(); } - typename BoundaryConditions::Flags bctypeSat(const GlobalPosition& globalPos, const Intersection& intersection) const + //! set dirichlet condition (saturation [-]) + void dirichletAtPos(PrimaryVariables &values, const GlobalPosition& globalPos) const { - return BoundaryConditions::dirichlet; + values[eqIdxPress] = exact(globalPos); + values[eqIdxSat] = 1.0; } - Scalar dirichletSat(const GlobalPosition& globalPos, const Intersection& intersection) const + //! set neumann condition for phases (flux, [kg/(m^2 s)]) + void neumannAtPos(PrimaryVariables &values, const GlobalPosition& globalPos) const { - return 1.0; + values = 0; } - std::vector<Scalar> neumann(const GlobalPosition& globalPos, const Intersection& intersection) const - { - std::vector<Scalar> neumannFlux(2, 0.0); - - return neumannFlux; - } - Scalar exact (const GlobalPosition& globalPos) const { double pi = 4.0*atan(1.0); diff --git a/test/decoupled/2p/test_impes.cc b/test/decoupled/2p/test_impes.cc index 15faa88e818b3889d62bef2b38b6a445cdd8fa97..e1acad1a056b80b224a8217134ccc29feb7479f6 100644 --- a/test/decoupled/2p/test_impes.cc +++ b/test/decoupled/2p/test_impes.cc @@ -54,6 +54,7 @@ int main(int argc, char** argv) typedef GET_PROP_TYPE(TypeTag, PTAG(Scalar)) Scalar; typedef GET_PROP_TYPE(TypeTag, PTAG(Grid)) Grid; typedef GET_PROP_TYPE(TypeTag, PTAG(Problem)) Problem; + typedef GET_PROP_TYPE(TypeTag, PTAG(TimeManager)) TimeManager; typedef Dune::FieldVector<Scalar, Grid::dimensionworld> GlobalPosition; static const int dim = Grid::dimension; @@ -106,14 +107,15 @@ int main(int argc, char** argv) //////////////////////////////////////////////////////////// // instantiate and run the concrete problem //////////////////////////////////////////////////////////// - Problem problem(grid.leafView(), lowerLeft, upperRight); + TimeManager timeManager; + Problem problem(timeManager, grid.leafView()); // load restart file if necessarry if (restart) problem.deserialize(restartTime); - problem.timeManager().init(problem, 0, dt, tEnd, !restart); - problem.timeManager().run(); + timeManager.init(problem, 0, dt, tEnd, !restart); + timeManager.run(); return 0; } catch (Dune::Exception &e) { diff --git a/test/decoupled/2p/test_impes_problem.hh b/test/decoupled/2p/test_impes_problem.hh index a22fbb687662d1e7c13e0b5d154aa8abd7b3f11d..245484a4aa199cdbf3c16ec06c7fee793c236ca4 100644 --- a/test/decoupled/2p/test_impes_problem.hh +++ b/test/decoupled/2p/test_impes_problem.hh @@ -149,10 +149,9 @@ SET_SCALAR_PROP(IMPESTestProblem, CFLFactor, 0.95); * where the argument defines the simulation endtime. */ template<class TypeTag = TTAG(IMPESTestProblem)> -class TestIMPESProblem: public IMPESProblem2P<TypeTag, TestIMPESProblem<TypeTag> > +class TestIMPESProblem: public IMPESProblem2P<TypeTag> { -typedef TestIMPESProblem<TypeTag> ThisType; -typedef IMPESProblem2P<TypeTag, ThisType> ParentType; +typedef IMPESProblem2P<TypeTag> ParentType; typedef typename GET_PROP_TYPE(TypeTag, PTAG(GridView)) GridView; typedef typename GET_PROP_TYPE(TypeTag, PTAG(TwoPIndices)) Indices; @@ -160,6 +159,8 @@ typedef typename GET_PROP_TYPE(TypeTag, PTAG(TwoPIndices)) Indices; typedef typename GET_PROP_TYPE(TypeTag, PTAG(FluidSystem)) FluidSystem; typedef typename GET_PROP_TYPE(TypeTag, PTAG(FluidState)) FluidState; +typedef typename GET_PROP_TYPE(TypeTag, PTAG(TimeManager)) TimeManager; + enum { dim = GridView::dimension, dimWorld = GridView::dimensionworld @@ -167,7 +168,9 @@ enum enum { - wPhaseIdx = Indices::wPhaseIdx, nPhaseIdx = Indices::nPhaseIdx + wPhaseIdx = Indices::wPhaseIdx, nPhaseIdx = Indices::nPhaseIdx, + eqIdxPress = Indices::pressureEq, + eqIdxSat = Indices::saturationEq }; typedef typename GET_PROP_TYPE(TypeTag, PTAG(Scalar)) Scalar; @@ -175,11 +178,13 @@ typedef typename GET_PROP_TYPE(TypeTag, PTAG(Scalar)) Scalar; typedef typename GridView::Traits::template Codim<0>::Entity Element; typedef typename GridView::Intersection Intersection; typedef Dune::FieldVector<Scalar, dimWorld> GlobalPosition; -typedef Dune::FieldVector<Scalar, dim> LocalPosition; + +typedef typename GET_PROP_TYPE(TypeTag, PTAG(BoundaryTypes)) BoundaryTypes; +typedef typename GET_PROP(TypeTag, PTAG(SolutionTypes))::PrimaryVariables PrimaryVariables; public: -TestIMPESProblem(const GridView &gridView, const GlobalPosition lowerLeft = 0, const GlobalPosition upperRight = 0) : -ParentType(gridView), lowerLeft_(lowerLeft), upperRight_(upperRight) +TestIMPESProblem(TimeManager& timeManager, const GridView &gridView) : +ParentType(timeManager, gridView) { } @@ -208,7 +213,7 @@ bool shouldWriteRestartFile() const * * This problem assumes a temperature of 10 degrees Celsius. */ -Scalar temperature(const GlobalPosition& globalPos, const Element& element) const +Scalar temperatureAtPos(const GlobalPosition& globalPos) const { return 273.15 + 10; // -> 10°C } @@ -216,98 +221,88 @@ Scalar temperature(const GlobalPosition& globalPos, const Element& element) cons // \} //! Returns the reference pressure for evaluation of constitutive relations -Scalar referencePressure(const GlobalPosition& globalPos, const Element& element) const +Scalar referencePressureAtPos(const GlobalPosition& globalPos) const { return 1e5; // -> 10°C } -//!source term [kg/(m^3 s)] -std::vector<Scalar> source(const GlobalPosition& globalPos, const Element& element) +void sourceAtPos(PrimaryVariables &values,const GlobalPosition& globalPos) const { - return std::vector<Scalar>(2, 0.0); + values = 0; } /*! -* \brief Returns the type of boundary condition for the pressure equation. +* \brief Returns the type of boundary condition. * -* BC can be dirichlet (pressure) or neumann (flux). -*/ -typename BoundaryConditions::Flags bctypePress(const GlobalPosition& globalPos, const Intersection& intersection) const -{ - if ((globalPos[0] < eps_)) - return BoundaryConditions::dirichlet; - // all other boundaries - return BoundaryConditions::neumann; -} - -/*! -* \brief Returns the type of boundary condition for the saturation equation. +* BC for pressure equation can be dirichlet (pressure) or neumann (flux). * -* BC can be dirichlet (saturation), neumann (flux), or outflow. +* BC for saturation equation can be dirichlet (saturation), neumann (flux), or outflow. */ -BoundaryConditions::Flags bctypeSat(const GlobalPosition& globalPos, const Intersection& intersection) const +void boundaryTypesAtPos(BoundaryTypes &bcTypes, const GlobalPosition& globalPos) const { - if (globalPos[0] < eps_) - return Dumux::BoundaryConditions::dirichlet; - else if (globalPos[0] > upperRight_[0] - eps_) - return Dumux::BoundaryConditions::outflow; - else - return Dumux::BoundaryConditions::neumann; + if (globalPos[0] < eps_) + { + bcTypes.setAllDirichlet(); + } + else if (globalPos[0] > this->bboxMax()[0] - eps_) + { + bcTypes.setNeumann(eqIdxPress); + bcTypes.setOutflow(eqIdxSat); + } + // all other boundaries + else + { + bcTypes.setAllNeumann(); + } } -//! return dirichlet condition (pressure, [Pa]) -Scalar dirichletPress(const GlobalPosition& globalPos, const Intersection& intersection) const +//! set dirichlet condition (pressure [Pa], saturation [-]) +void dirichletAtPos(PrimaryVariables &values, const GlobalPosition& globalPos) const { + values = 0; if (globalPos[0] < eps_) { if (GET_PROP_VALUE(TypeTag, PTAG(EnableGravity))) { - const Element& element = *(intersection.inside()); - - Scalar pRef = referencePressure(globalPos, element); - Scalar temp = temperature(globalPos, element); - Scalar sat = this->variables().satElement(element); + Scalar pRef = referencePressureAtPos(globalPos); + Scalar temp = temperatureAtPos(globalPos); + Scalar sat = 1; FluidState fluidState; fluidState.update(sat, pRef, pRef, temp); - return (2e5 + (upperRight_[dim-1] - globalPos[dim-1]) * FluidSystem::phaseDensity(wPhaseIdx, temp, pRef, fluidState) * this->gravity().two_norm()); + values[eqIdxPress] = (2e5 + (this->bboxMax()[dim-1] - globalPos[dim-1]) * FluidSystem::phaseDensity(wPhaseIdx, temp, pRef, fluidState) * this->gravity().two_norm()); } else - return 2e5; + { + values[eqIdxPress] = 2e5; + } + values[eqIdxSat] = 0.8; + } + else + { + values[eqIdxPress] = 2e5; + values[eqIdxSat] = 0.2; } - // all other boundaries - return 2e5; -} - -//! return dirichlet condition (saturation, [-]) -Scalar dirichletSat(const GlobalPosition& globalPos, const Intersection& intersection) const -{ - if (globalPos[0] < eps_) - return 0.8; - // all other boundaries - return 0.2; } -//! return neumann condition (flux, [kg/(m^2 s)]) -std::vector<Scalar> neumann(const GlobalPosition& globalPos, const Intersection& intersection) const +//! set neumann condition for phases (flux, [kg/(m^2 s)]) +void neumannAtPos(PrimaryVariables &values, const GlobalPosition& globalPos) const { - std::vector<Scalar> neumannFlux(2, 0.0); - if (globalPos[0] > upperRight_[0] - eps_) + values = 0; + if (globalPos[0] > this->bboxMax()[0] - eps_) { - neumannFlux[nPhaseIdx] = 3e-4; + values[nPhaseIdx] = 3e-4; } - return neumannFlux; } - -//! initial condition for saturation -Scalar initSat(const GlobalPosition& globalPos, const Element& element) const +//! return initial solution -> only saturation values have to be given! +void initialAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const { - return 0.2; + values[eqIdxPress] = 0; + values[eqIdxSat] = 0.2; } private: -GlobalPosition lowerLeft_; -GlobalPosition upperRight_; static constexpr Scalar eps_ = 1e-6; }; diff --git a/test/decoupled/2p/test_transport.cc b/test/decoupled/2p/test_transport.cc index 8979ef98f3afa85b0512ed10e35c5adcc664ea37..c7132a053357ed9ccb9c014177b3f0a7a721bcd0 100644 --- a/test/decoupled/2p/test_transport.cc +++ b/test/decoupled/2p/test_transport.cc @@ -54,6 +54,7 @@ int main(int argc, char** argv) typedef GET_PROP_TYPE(TypeTag, PTAG(Scalar)) Scalar; typedef GET_PROP_TYPE(TypeTag, PTAG(Grid)) Grid; typedef GET_PROP_TYPE(TypeTag, PTAG(Problem)) Problem; + typedef GET_PROP_TYPE(TypeTag, PTAG(TimeManager)) TimeManager; typedef Dune::FieldVector<Scalar, Grid::dimensionworld> GlobalPosition; static const int dim = Grid::dimension; @@ -96,16 +97,15 @@ int main(int argc, char** argv) //////////////////////////////////////////////////////////// // instantiate and run the concrete problem //////////////////////////////////////////////////////////// - Dune::FieldVector<double ,dim> L(0); - Dune::FieldVector<double,dim> H(1); - Problem problem(gridPtr->leafView(), L, H); + + TimeManager timeManager; + Problem problem(timeManager, gridPtr->leafView()); // load restart file if necessarry if (restart) problem.deserialize(restartTime); - - problem.timeManager().init(problem, 0, dt, tEnd, !restart); - problem.timeManager().run(); + timeManager.init(problem, 0, dt, tEnd, !restart); + timeManager.run(); return 0; } diff --git a/test/decoupled/2p/test_transport_problem.hh b/test/decoupled/2p/test_transport_problem.hh index ed307bc6bf3c939385f8426aae68a09439566af4..54587edf89610930564d0769c8ccf2a91d0661be 100644 --- a/test/decoupled/2p/test_transport_problem.hh +++ b/test/decoupled/2p/test_transport_problem.hh @@ -49,7 +49,7 @@ class TestTransportProblem; ////////// namespace Properties { -NEW_TYPE_TAG(TransportTestProblem, INHERITS_FROM(DecoupledModel, Transport)); +NEW_TYPE_TAG(TransportTestProblem, INHERITS_FROM(DecoupledTwoP, Transport)); // Set the grid type @@ -123,10 +123,9 @@ SET_SCALAR_PROP(TransportTestProblem, CFLFactor, 1.0); * where the argument defines the simulation endtime. */ template<class TypeTag = TTAG(TransportTestProblem)> -class TestTransportProblem: public TransportProblem2P<TypeTag, TestTransportProblem<TypeTag> > +class TestTransportProblem: public TransportProblem2P<TypeTag> { - typedef TestTransportProblem<TypeTag> ThisType; - typedef TransportProblem2P<TypeTag, ThisType> ParentType; + typedef TransportProblem2P<TypeTag> ParentType; typedef typename GET_PROP_TYPE(TypeTag, PTAG(GridView)) GridView; typedef typename GET_PROP_TYPE(TypeTag, PTAG(TwoPIndices)) Indices; @@ -134,6 +133,10 @@ class TestTransportProblem: public TransportProblem2P<TypeTag, TestTransportProb typedef typename GET_PROP_TYPE(TypeTag, PTAG(FluidSystem)) FluidSystem; typedef typename GET_PROP_TYPE(TypeTag, PTAG(FluidState)) FluidState; + typedef typename GET_PROP_TYPE(TypeTag, PTAG(TimeManager)) TimeManager; + typedef typename GET_PROP_TYPE(TypeTag, PTAG(BoundaryTypes)) BoundaryTypes; + typedef typename GET_PROP(TypeTag, PTAG(SolutionTypes))::PrimaryVariables PrimaryVariables; + enum { dim = GridView::dimension, dimWorld = GridView::dimensionworld @@ -141,7 +144,7 @@ class TestTransportProblem: public TransportProblem2P<TypeTag, TestTransportProb enum { - wPhaseIdx = Indices::wPhaseIdx, nPhaseIdx = Indices::nPhaseIdx + wPhaseIdx = Indices::wPhaseIdx, nPhaseIdx = Indices::nPhaseIdx, eqIdxSat = Indices::saturationEq }; typedef typename GET_PROP_TYPE(TypeTag, PTAG(Scalar)) Scalar; @@ -149,11 +152,10 @@ class TestTransportProblem: public TransportProblem2P<TypeTag, TestTransportProb typedef typename GridView::Traits::template Codim<0>::Entity Element; typedef typename GridView::Intersection Intersection; typedef Dune::FieldVector<Scalar, dimWorld> GlobalPosition; - typedef Dune::FieldVector<Scalar, dim> LocalPosition; public: - TestTransportProblem(const GridView &gridView, const GlobalPosition lowerLeft = 0, const GlobalPosition upperRight = 0) : - ParentType(gridView), lowerLeft_(lowerLeft), upperRight_(upperRight) + TestTransportProblem(TimeManager &timeManager, const GridView &gridView) : + ParentType(timeManager, gridView) { GlobalPosition vel(0); vel[0] = 1e-5; @@ -186,7 +188,7 @@ public: * * This problem assumes a temperature of 10 degrees Celsius. */ - Scalar temperature(const GlobalPosition& globalPos, const Element& element) const + Scalar temperatureAtPos(const GlobalPosition& globalPos) const { return 273.15 + 10; // -> 10°C } @@ -194,48 +196,64 @@ public: // \} - Scalar referencePressure(const GlobalPosition& globalPos, const Element& element) const + //! Returns the reference pressure for evaluation of constitutive relations + Scalar referencePressureAtPos(const GlobalPosition& globalPos) const { return 1e5; // -> 10°C } - std::vector<Scalar> source(const GlobalPosition& globalPos, const Element& element) + void sourceAtPos(PrimaryVariables &values,const GlobalPosition& globalPos) const { - return std::vector<Scalar>(2, 0.0); + values = 0; } - BoundaryConditions::Flags bctypeSat(const GlobalPosition& globalPos, const Intersection& intersection) const + /*! + * \brief Returns the type of boundary condition. + * + * + * BC for saturation equation can be dirichlet (saturation), neumann (flux), or outflow. + */ + void boundaryTypesAtPos(BoundaryTypes &bcTypes, const GlobalPosition& globalPos) const { - if (globalPos[0] < eps_) - return Dumux::BoundaryConditions::dirichlet; - else if (globalPos[0] > upperRight_[0] - eps_) - return Dumux::BoundaryConditions::outflow; - else - return Dumux::BoundaryConditions::neumann; + if (globalPos[0] < eps_) + { + bcTypes.setAllDirichlet(); + } + else if (globalPos[0] > this->bboxMax()[0] - eps_) + { + bcTypes.setAllOutflow(); + } + // all other boundaries + else + { + bcTypes.setAllNeumann(); + } } - Scalar dirichletSat(const GlobalPosition& globalPos, const Intersection& intersection) const + //! set dirichlet condition (saturation [-]) + void dirichletAtPos(PrimaryVariables &values, const GlobalPosition& globalPos) const { + values = 0; if (globalPos[0] < eps_) - return 1.0; - // all other boundaries - return 0.0; + { + values = 1.0; + } } - std::vector<Scalar> neumann(const GlobalPosition& globalPos, const Intersection& intersection) const + //! set neumann condition for phases (flux, [kg/(m^2 s)]) + void neumannAtPos(PrimaryVariables &values, const GlobalPosition& globalPos) const { - return std::vector<Scalar>(2, 0.0); + values = 0; } - Scalar initSat(const GlobalPosition& globalPos, const Element& element) const + //! return initial solution + void initialAtPos(PrimaryVariables &values, + const GlobalPosition &globalPos) const { - return 0.0; + values = 0; } private: - GlobalPosition lowerLeft_; - GlobalPosition upperRight_; - static constexpr Scalar eps_ = 1e-6; }; } //end namespace