From d65e73c68d7baae3514110a27aec0aea5ff7b8d9 Mon Sep 17 00:00:00 2001 From: Markus Wolff <markus.wolff@twt-gmbh.de> Date: Fri, 13 Jan 2012 09:54:29 +0000 Subject: [PATCH] some clean-up and minor changes in the fvpressure base class - fluxes between neighbors are now only calculated from one side - implementation now called by asImp_() - local indices of entries replaced by enums git-svn-id: svn://svn.iws.uni-stuttgart.de/DUMUX/dumux/trunk@7363 2fb0f335-1f38-0410-981e-8018bf24f1b0 --- dumux/decoupled/common/fv/fvpressure.hh | 135 ++++++++++++------------ 1 file changed, 67 insertions(+), 68 deletions(-) diff --git a/dumux/decoupled/common/fv/fvpressure.hh b/dumux/decoupled/common/fv/fvpressure.hh index 4e62244593..8352bf1f4a 100644 --- a/dumux/decoupled/common/fv/fvpressure.hh +++ b/dumux/decoupled/common/fv/fvpressure.hh @@ -24,12 +24,6 @@ #ifndef DUMUX_FVPRESSURE_HH #define DUMUX_FVPRESSURE_HH -// dune environent: -#include <dune/istl/bvector.hh> -#include <dune/istl/operators.hh> -#include <dune/istl/solvers.hh> -#include <dune/istl/preconditioners.hh> - // dumux environment #include "dumux/common/math.hh" #include <dumux/decoupled/common/impetproperties.hh> @@ -49,32 +43,20 @@ namespace Dumux */ template<class TypeTag> class FVPressure { + //the model implementation + typedef typename GET_PROP_TYPE(TypeTag, PressureModel) Implementation; + typedef typename GET_PROP_TYPE(TypeTag, PTAG(GridView)) GridView; typedef typename GET_PROP_TYPE(TypeTag, PTAG(Scalar)) Scalar; typedef typename GET_PROP_TYPE(TypeTag, PTAG(Problem)) Problem; typedef typename GET_PROP(TypeTag, PTAG(SolutionTypes))::ScalarSolution ScalarSolution; - typedef typename GET_PROP_TYPE(TypeTag, PTAG(Indices)) Indices; typedef typename GET_PROP_TYPE(TypeTag, PTAG(CellData)) CellData; enum { dim = GridView::dimension, dimWorld = GridView::dimensionworld }; - enum - { - pw = Indices::pressureW, - pn = Indices::pressureNW, - pglobal = Indices::pressureGlobal, - Sw = Indices::saturationW, - Sn = Indices::saturationNW, - }; - enum - { - wPhaseIdx = Indices::wPhaseIdx, nPhaseIdx = Indices::nPhaseIdx, - wCompIdx = Indices::wPhaseIdx, nCompIdx = Indices::nPhaseIdx, - contiWEqIdx = Indices::contiWEqIdx, contiNEqIdx = Indices::contiNEqIdx - }; // typedefs to abbreviate several dune classes... typedef typename GridView::Traits::template Codim<0>::Entity Element; @@ -83,36 +65,41 @@ template<class TypeTag> class FVPressure typedef typename GridView::IntersectionIterator IntersectionIterator; typedef typename GridView::Intersection Intersection; - // convenience shortcuts for Vectors/Matrices - typedef Dune::FieldVector<Scalar, dimWorld> GlobalPosition; - typedef Dune::FieldMatrix<Scalar, dim, dim> FieldMatrix; - typedef Dune::FieldVector<Scalar, 2> PhaseVector; - typedef typename GET_PROP_TYPE(TypeTag, PTAG(PrimaryVariables)) PrimaryVariables; // the typenames used for the stiffness matrix and solution vector typedef typename GET_PROP_TYPE(TypeTag, PTAG(PressureCoefficientMatrix)) Matrix; typedef typename GET_PROP_TYPE(TypeTag, PTAG(PressureRHSVector)) RHSVector; protected: + + enum + { + rhs = 1, + matrix = 0, + + }; + //initializes the matrix to store the system of equations void initializeMatrix(); + //function which assembles the system of equations to be solved + void assemble(bool first); + //solves the system of equations to get the spatial distribution of the pressure void solve(); - /*! \name Access functions for protected variables */ - //@{ - Problem& problem() - { - return problem_; - } - const Problem& problem() const - { - return problem_; - } + void getSource(Dune::FieldVector<Scalar, 2>&, const Element&, const CellData&, const bool); + + void getStorage(Dune::FieldVector<Scalar, 2>&, const Element&, const CellData&, const bool); + + void getFlux(Dune::FieldVector<Scalar, 2>&, const Intersection&, const CellData&, const bool); + + void getFluxOnBoundary(Dune::FieldVector<Scalar, 2>&, + const Intersection&, const CellData&, const bool); ScalarSolution& pressure() { return pressure_; } + const ScalarSolution& pressure() const { return pressure_; } //@} @@ -121,23 +108,19 @@ public: const Scalar pressure(int globalIdx) const { return pressure_[globalIdx]; } - //function which assembles the system of equations to be solved - void assemble(bool first); - - void getSource(Dune::FieldVector<Scalar, 2>&, const Element&, const CellData&, const bool); - - void getStorage(Dune::FieldVector<Scalar, 2>&, const Element&, const CellData&, const bool); - - void getFlux(Dune::FieldVector<Scalar, 2>&, const Intersection&, const CellData&, const bool); - void getFluxOnBoundary(Dune::FieldVector<Scalar, 2>&, - const Intersection&, const CellData&, const bool); + //initialize pressure model + void initialize() + { + initializeMatrix(); + pressure_ = 0; + } //pressure solution routine: update estimate for secants, assemble, solve. - void update(bool solveTwice = true) + void update() { - problem().pressureModel().assemble(false); Dune::dinfo << "pressure calculation"<< std::endl; - problem().pressureModel().solve(); + assemble(false); Dune::dinfo << "pressure calculation"<< std::endl; + solve(); return; } @@ -165,12 +148,18 @@ public: */ FVPressure(Problem& problem) : problem_(problem), A_(problem.gridView().size(0), problem.gridView().size(0), (2 * dim + 1) - * problem.gridView().size(0), Matrix::random), f_(problem.gridView().size(0)) - { - pressure_.resize(problem.gridView().size(0)); - } + * problem.gridView().size(0), Matrix::random), f_(problem.gridView().size(0)), pressure_(problem.gridView().size(0)) + {} + +private: + //! Returns the implementation of the problem (i.e. static polymorphism) + Implementation &asImp_() + { return *static_cast<Implementation *>(this); } + + //! \copydoc Dumux::IMPETProblem::asImp_() + const Implementation &asImp_() const + { return *static_cast<const Implementation *>(this); } -protected: Problem& problem_; Matrix A_; RHSVector f_; @@ -178,8 +167,6 @@ protected: std::string solverName_; std::string preconditionerName_; - - static constexpr int pressureType = GET_PROP_VALUE(TypeTag, PTAG(PressureFormulation)); //!< gives kind of pressure used (\f$ 0 = p_w \f$, \f$ 1 = p_n \f$, \f$ 2 = p_{global} \f$) }; //! initializes the matrix to store the system of equations @@ -259,8 +246,8 @@ void FVPressure<TypeTag>::assemble(bool first) Dune::FieldVector<Scalar, 2> entries(0.); /***** source term ***********/ - problem().pressureModel().getSource(entries,*eIt, cellDataI, first); - f_[globalIdxI] = entries[1]; + asImp_().getSource(entries,*eIt, cellDataI, first); + f_[globalIdxI] = entries[rhs]; /***** flux term ***********/ // iterate over all faces of the cell @@ -271,36 +258,48 @@ void FVPressure<TypeTag>::assemble(bool first) if (isIt->neighbor()) { int globalIdxJ = problem().variables().index(*(isIt->outside())); - problem().pressureModel().getFlux(entries, *isIt, cellDataI, first); + + //calculate only from one side, but add matrix entries for both sides + if (globalIdxI > globalIdxJ) + continue; + + entries = 0; + asImp_().getFlux(entries, *isIt, cellDataI, first); //set right hand side - f_[globalIdxI] -= entries[1]; + f_[globalIdxI] -= entries[rhs]; + f_[globalIdxJ] += entries[rhs]; + // set diagonal entry - A_[globalIdxI][globalIdxI] += entries[0]; + A_[globalIdxI][globalIdxI] += entries[matrix]; + A_[globalIdxJ][globalIdxJ] += entries[matrix]; // set off-diagonal entry - A_[globalIdxI][globalIdxJ] = -entries[0]; + A_[globalIdxI][globalIdxJ] = -entries[matrix]; + A_[globalIdxJ][globalIdxI] = -entries[matrix]; } // end neighbor /************* boundary face ************************/ else { - problem().pressureModel().getFluxOnBoundary(entries, *isIt, cellDataI, first); + entries = 0; + asImp_().getFluxOnBoundary(entries, *isIt, cellDataI, first); //set right hand side - f_[globalIdxI] += entries[1]; + f_[globalIdxI] += entries[rhs]; // set diagonal entry - A_[globalIdxI][globalIdxI] += entries[0]; + A_[globalIdxI][globalIdxI] += entries[matrix]; } } //end interfaces loop // printmatrix(std::cout, A_, "global stiffness matrix", "row", 11, 3); /***** storage term ***********/ - problem().pressureModel().getStorage(entries, *eIt, cellDataI, first); - f_[globalIdxI] += entries[1]; + entries = 0; + asImp_().getStorage(entries, *eIt, cellDataI, first); + f_[globalIdxI] += entries[rhs]; // set diagonal entry - A_[globalIdxI][globalIdxI] += entries[0]; + A_[globalIdxI][globalIdxI] += entries[matrix]; } // end grid traversal // printmatrix(std::cout, A_, "global stiffness matrix after assempling", "row", 11,3); // printvector(std::cout, f_, "right hand side", "row", 10); -- GitLab