diff --git a/dumux/decoupled/common/fv/fvpressure.hh b/dumux/decoupled/common/fv/fvpressure.hh index 8177327093504f422f3439665d20a97dee201ad9..41df7b9ae69cb0c54fceb6ef7ddc4cbd62deaa48 100644 --- a/dumux/decoupled/common/fv/fvpressure.hh +++ b/dumux/decoupled/common/fv/fvpressure.hh @@ -30,14 +30,19 @@ /** * @file * @brief Finite Volume Diffusion Model - * @author Benjamin Faigle, Bernd Flemisch, Jochen Fritz, Markus Wolff + * @author Benjamin Faigle, Bernd Flemisch, Markus Wolff */ namespace Dumux { //! The finite volume base class for the solution of a pressure equation -/*! \ingroup multiphase - * TODO: +/*! \ingroup IMPET + * Base class for finite volume (FV) implementations of a diffusion-like pressure equation. + * The class provides a methods for assembling of the global matrix and right hand side (RHS) as well as for solving the system of equations. + * Additionally, it contains the global matrix, the RHS-vector as well as the solution vector. + * A certain pressure equation defined in the implementation of this base class must be splitted into a storage term, a flux term and a source term. + * Corresponding functions (<tt>getSource()</tt>, <tt>getStorage()</tt>, <tt>getFlux()</tt> and <tt>getFluxOnBoundary()</tt>) have to be defined in the implementation. + * * \tparam TypeTag The Type Tag */ template<class TypeTag> class FVPressure @@ -70,50 +75,109 @@ template<class TypeTag> class FVPressure protected: + //! Indices of matrix and rhs entries + /** + *During the assembling of the global system of equations get-functions are called (getSource(), getFlux(), etc.), which return global matrix or right hand side entries in a vector. These can be accessed using following indices: + */ enum { - rhs = 1, - matrix = 0 + rhs = 1,//!<index for the right hand side entry + matrix = 0//!<index for the global matrix entry }; - //initializes the matrix to store the system of equations + //!Initialize the global matrix of the system of equations to solve void initializeMatrix(); - //function which assembles the system of equations to be solved + //! Function which assembles the system of equations to be solved + /* This function assembles the Matrix and the right hand side (RHS) vector to solve for + * a pressure field with a Finite-Volume (FV) discretization. Implementations of this base class have to provide the methods + * <tt>getSource()</tt>, <tt>getStorage()</tt>, <tt>getFlux()</tt> and <tt>getFluxOnBoundary()</tt> if the assemble() method is called! + * + * \param first Indicates if function is called at the initialization step or during the simulation (If <tt>first</tt> is <tt>true</tt>, no pressure field of previous iterations is required) + */ void assemble(bool first); - //solves the system of equations to get the spatial distribution of the pressure + //!Solves the global system of equations to get the spatial distribution of the pressure void solve(); + //!Returns the vector containing the pressure solution ScalarSolution& pressure() { return pressure_;} + //!Returns the vector containing the pressure solution const ScalarSolution& pressure() const { return pressure_;} - //@} + public: - void getSource(Dune::FieldVector<Scalar, 2>&, const Element&, const CellData&, const bool); + //!Function which calculates the source entry + /** + * Function computes the source term and writes it to the corresponding entry of the entry vector + * + * \param entry Vector containing return values of the function + * \param element Grid element + * \param cellData Object containing all model relevant cell data + * \param first Indicates if function is called in the initialization step or during the simulation + */ + void getSource(Dune::FieldVector<Scalar, 2>& entry, const Element& element, const CellData& cellData, const bool first); - void getStorage(Dune::FieldVector<Scalar, 2>&, const Element&, const CellData&, const bool); + //!Function which calculates the storage entry + /** + * Function computes the storage term and writes it to the corresponding entry of the entry vector + * + * \param entry Vector containing return values of the function + * \param element Grid element + * \param cellData Object containing all model relevant cell data + * \param first Indicates if function is called in the initialization step or during the simulation + */ + void getStorage(Dune::FieldVector<Scalar, 2>& entry, const Element& element, const CellData& cellData, const bool first); - void getFlux(Dune::FieldVector<Scalar, 2>&, const Intersection&, const CellData&, const bool); + //!Function which calculates the flux entry + /** + * Function computes the inter-cell flux term and writes it to the corresponding entry of the entry vector + * + * \param entry Vector containing return values of the function + * \param element Grid element + * \param cellData Object containing all model relevant cell data + * \param first Indicates if function is called in the initialization step or during the simulation + */ + void getFlux(Dune::FieldVector<Scalar, 2>& entry, const Intersection& intersection, const CellData& cellData, const bool first); + //!Function which calculates the boundary flux entry + /** + * Function computes the boundary-flux term and writes it to the corresponding entry of the entry vector + * + * \param entry Vector containing return values of the function + * \param intersection Intersection of two grid elements + * \param cellData Object containing all model relevant cell data + * \param first Indicates if function is called in the initialization step or during the simulation + */ void getFluxOnBoundary(Dune::FieldVector<Scalar, 2>&, const Intersection&, const CellData&, const bool); - //! Public acess function for the primary variable pressure + //! Public access function for the primary pressure variable + /** + * Function returns the cell pressure value at index <tt>globalIdx</tt> + * + * \param globalIdx Global index of a grid cell + */ const Scalar pressure(int globalIdx) const { return pressure_[globalIdx];} - //initialize pressure model + //!Initialize pressure model + /** + * Function initializes the sparse matrix to solve the global system of equations and sets/calculates the initial pressure + */ void initialize() { initializeMatrix(); pressure_ = 0; } - //pressure solution routine: update estimate for secants, assemble, solve. + //!Pressure update + /** + * Function reassembles the system of equations and solves for a new pressure solution. + */ void update() { assemble(false); Dune::dinfo << "pressure calculation"<< std::endl; @@ -122,24 +186,38 @@ public: return; } - /*! \name general methods for serialization, output */ - //@{ - // serialization methods - //! Function needed for restart option. + //! Function for serialization of the pressure field. + /** Function needed for restart option. Writes the pressure of a grid element to a restart file. + * + * \param outstream Stream into the restart file. + * \param element Grid element + */ void serializeEntity(std::ostream &outstream, const Element &element) { int globalIdx = problem_.variables().index(element); outstream << pressure_[globalIdx][0]; } + //! Function for deserialization of the pressure field. + /** Function needed for restart option. Reads the pressure of a grid element from a restart file. + * + * \param instream Stream from the restart file. + * \param element Grid element + */ void deserializeEntity(std::istream &instream, const Element &element) { int globalIdx = problem_.variables().index(element); instream >> pressure_[globalIdx][0]; } - //@} - /*! set a pressure to be fixed at a certain cell */ + //! Set a pressure to be fixed at a certain cell. + /** + *Allows to fix a pressure somewhere (at one certain cell) in the domain. This can be necessary e.g. if only Neumann boundary conditions are defined. + *The pressure is fixed until the <tt>unsetFixPressureAtIndex()</tt> function is called + * + * \param pressure Pressure value at globalIdx + * \param globalIdx Global index of a grid cell + */ void setFixPressureAtIndex(Scalar pressure, int globalIdx) { hasFixPressureAtIndex_ = true; @@ -147,7 +225,12 @@ public: idxFixPressureAtIndex_ = globalIdx; } - /*! unset a fixed pressure at a certain cell */ + //! Reset the fixed pressure state + /** + * No pressure is fixed inside the domain until <tt>setFixPressureAtIndex()</tt> function is called again. + * + * \param globalIdx Global index of a grid cell + */ void unsetFixPressureAtIndex(int globalIdx) { hasFixPressureAtIndex_ = false; @@ -157,7 +240,7 @@ public: //! Constructs a FVPressure object /** - * \param problem a problem class object + * \param problem A problem class object */ FVPressure(Problem& problem) : problem_(problem), size_(problem.gridView().size(0)), @@ -184,14 +267,15 @@ private: std::string solverName_; std::string preconditionerName_; protected: - Matrix A_; - RHSVector f_; + Matrix A_;//!<Global stiffnes matrix (sparse matrix which is build by the <tt> initializeMatrix()</tt> function) + RHSVector f_;//!<Right hand side vector +private: Scalar fixPressureAtIndex_; Scalar idxFixPressureAtIndex_; bool hasFixPressureAtIndex_; }; -//! initializes the matrix to store the system of equations +//!Initialize the global matrix of the system of equations to solve template<class TypeTag> void FVPressure<TypeTag>::initializeMatrix() { @@ -243,13 +327,12 @@ void FVPressure<TypeTag>::initializeMatrix() return; } -//! function which assembles the system of equations to be solved -/* This function assembles the Matrix and the RHS vectors to solve for - * a pressure field with an Finite-Volume Discretization in an implicit - * fasion. In the implementations to this base class, the methods - * getSource(), getStorage(), getFlux() and getFluxOnBoundary() have to - * be provided. - * \param first Flag if pressure field is unknown +//! Function which assembles the system of equations to be solved +/* This function assembles the Matrix and the right hand side (RHS) vector to solve for + * a pressure field with a Finite-Volume (FV) discretization. Implementations of this base class have to provide the methods + * <tt>getSource()</tt>, <tt>getStorage()</tt>, <tt>getFlux()</tt> and <tt>getFluxOnBoundary()</tt> if the assemble() method is called! + * + * \param first Indicates if function is called at the initialization step or during the simulation (If <tt>first</tt> is <tt>true</tt>, no pressure field of previous iterations is required) */ template<class TypeTag> void FVPressure<TypeTag>::assemble(bool first) @@ -338,7 +421,7 @@ void FVPressure<TypeTag>::assemble(bool first) return; } -//! solves the system of equations to get the spatial distribution of the pressure +//!Solves the global system of equations to get the spatial distribution of the pressure template<class TypeTag> void FVPressure<TypeTag>::solve() {