version 3.9-dev
Cell-centered Finite Volume Methods

Finite volume schemes with degrees of freedom located at grid cell centers. More...

Description

Cell-centered finite volume methods use the elements of the grid as control volumes. For each control volume the discrete values are determined at the element/control volume center (not required to be the barycenters but often chosen so).

We consider a domain \(\Omega \subset \mathbb{R}^d\), \(d \in \{ 2, 3 \}\) with boundary \(\Gamma = \partial \Omega = \Gamma_D \cup \Gamma_N\), and the following elliptic problem with Dirichlet boundary conditions on \(\Gamma_D\) and Neumann boundary on \(\Gamma_N\):

\begin{equation} \begin{aligned} \nabla \cdot \left( - \boldsymbol{\Lambda} \nabla u \right) &= q &&\mathrm{in} \, \Omega \\ \left( - \boldsymbol{\Lambda} \nabla u \right) \cdot \boldsymbol{n} &= v_N &&\mathrm{on} \, \Gamma_N \\ u &= u_D &&\mathrm{on} \, \Gamma_D. \label{eq:elliptic} \end{aligned} \end{equation}

Here, \(\boldsymbol{\Lambda} = \boldsymbol{\Lambda}(\boldsymbol{x}, \boldsymbol{u})\) is a symmetric and positive definite tensor of second rank (e.g. permeability, diffusivity, etc.), \(u = u (\boldsymbol{x})\) is unknown and \(q = q(\boldsymbol{x}, \boldsymbol{u})\) is a source/sink. We denote by \(\mathcal{M}\) the mesh that results from the division of the domain \(\Omega\) into \(n_e\) control volumes \(K \subset \Omega\). Each \(K\) is a polygonal open set such that \(K \cap L = \emptyset, \forall{K \neq L}\) and \(\overline{\Omega} = \cup_{K \in \mathcal{M}} \overline{K}\).

For the derivation of the finite volume formulation, we integrate the governing equation over a control volume \(K\) and apply the Gauss divergence theorem,

\begin{equation} \int_{K} \nabla \cdot \left( - \boldsymbol{\Lambda} \nabla u \right) \, \mathrm{d} \Omega = \int_{\partial K} \left( - \boldsymbol{\Lambda} \nabla u \right) \cdot \boldsymbol{n} \, \mathrm{d} \Gamma = \int_K q \, \mathrm{d}x. \label{eq:ellipticIntegrated} \end{equation}

Splitting the control volume boundary \(\partial K\) into a finite number of faces \(\sigma \subset \partial K\) (such that \(\sigma = \overline{K} \cap \overline{L}\) for some neighboring control volume \(L\)) and replacing the exact fluxes by an approximation, i.e. \(F_{K, \sigma} \approx \int_{\sigma} \left( - \boldsymbol{\Lambda}_K \nabla u \right) \cdot \boldsymbol{n} \mathrm{d} \Gamma\) (here \(\boldsymbol{\Lambda}_K\) is the value of \(\boldsymbol{\Lambda}\) associated with control volume \(K\)), yield the discrete equation

\begin{equation} \sum_{\sigma \subset \partial K} F_{K, \sigma} = Q_K, \quad \forall \, {K \in \mathcal{M}}, \label{eq:ccdisc} \end{equation}

where \(F_{K, \sigma}\) is the discrete flux through face \(\sigma\) flowing out of cell \(K\) and \(Q_K := \int_K q \, \mathrm{d}x\) is the integrated source/sink term. This is the prototypical cell-centered finite volume formulation. Finite volume schemes differ in the way how the term \((\boldsymbol{\Lambda}_K \nabla u ) \cdot \boldsymbol{n} \) is approximated (i.e. the choice of the fluxes \(F_{K, \sigma}\)). Using the symmetry of the tensor \(\boldsymbol{\Lambda}_K\), the flux can be rewritten as \(\nabla u \cdot \boldsymbol{\Lambda}_K\boldsymbol{n}\), which corresponds to the directional derivative of \(u\) in co-normal direction \(\boldsymbol{\Lambda}_K\boldsymbol{n}\).

The main ideas of the two-point flux approximation and the multi-point flux approximation methods are described in the documentation pages for Two-point flux approximation (Tpfa) and Multi-point flux approximation (Mpfa).

Please also note that other types of equations, e.g. instationary parabolic problems, can be discretized by applying some time discretization scheme to the time derivatives and by using the finite-volume scheme for the flux discretization. For simplicity the discussion here is restricted to the elliptic problem presented above.

Modules

 Two-point flux approximation (Tpfa)
 A cell-centered finite volume scheme with two-point flux approximation.
 
 Multi-point flux approximation (Mpfa)
 A cell-centered finite volume scheme with multi-point flux approximation.
 

Files

file  assembly/cclocalassembler.hh
 An assembler for Jacobian and residual contribution per element (cell-centered methods)
 
file  cclocalresidual.hh
 Calculates the element-wise residual for cell-centered discretization schemes.
 
file  cellcentered/connectivitymap.hh
 Stores the face indices corresponding to the neighbors of an element that contribute to the derivative calculation. This is used for finite-volume schemes with symmetric sparsity pattern in the global matrix.
 
file  cellcentered/elementboundarytypes.hh
 Boundary types gathered on an element.
 
file  cellcentered/elementsolution.hh
 The local element solution class for cell-centered methods.
 
file  cellcentered/gridvolumevariables.hh
 The grid volume variables class for cell centered models.
 
file  discretization/cellcentered/subcontrolvolume.hh
 Sub control volumes for cell-centered discretization schemes.
 
file  experimental/assembly/cclocalassembler.hh
 An assembler for Jacobian and residual contribution per element (cell-centered methods)
 
file  experimental/assembly/subdomaincclocalassembler.hh
 A multidomain local assembler for Jacobian and residual contribution per element (cell-centered methods)
 
file  multidomain/subdomaincclocalassembler.hh
 A multidomain local assembler for Jacobian and residual contribution per element (cell-centered methods)
 

Classes

class  Dumux::CCLocalAssemblerBase< TypeTag, Assembler, Implementation, implicit >
 A base class for all local cell-centered assemblers. More...
 
class  Dumux::CCLocalAssembler< TypeTag, Assembler, diffMethod, implicit >
 An assembler for Jacobian and residual contribution per element (cell-centered methods) More...
 
class  Dumux::CCLocalAssembler< TypeTag, Assembler, DiffMethod::numeric, true >
 Cell-centered scheme local assembler using numeric differentiation and implicit time discretization. More...
 
class  Dumux::CCLocalAssembler< TypeTag, Assembler, DiffMethod::numeric, false >
 Cell-centered scheme local assembler using numeric differentiation and explicit time discretization. More...
 
class  Dumux::CCLocalAssembler< TypeTag, Assembler, DiffMethod::analytic, true >
 Cell-centered scheme local assembler using analytic (hand-coded) differentiation and implicit time discretization. More...
 
class  Dumux::CCLocalAssembler< TypeTag, Assembler, DiffMethod::analytic, false >
 Cell-centered scheme local assembler using analytic (hand-coded) differentiation and explicit time discretization. More...
 
class  Dumux::CCLocalResidual< TypeTag >
 Calculates the element-wise residual for the cell-centered discretization schemes. More...
 
class  Dumux::CCSimpleConnectivityMap< GridGeometry >
 A simple version of the connectivity map for cellcentered schemes. This implementation works for schemes in which for a given cell I only those cells J have to be prepared in whose stencil the cell I appears. This means that for the flux calculations in the cells J (in order to compute the derivatives with respect to cell I), we do not need data on any additional cells J to compute these fluxes. The same holds for scvfs in the cells J, i.e. we need only those scvfs in the cells J in which the cell I is in the stencil. More...
 
class  Dumux::CCElementBoundaryTypes
 Boundary types gathered on an element. More...
 
class  Dumux::CCElementSolution< FVElementGeometry, PV >
 The element solution vector. More...
 
class  Dumux::CCGridVolumeVariables< Traits, cachingEnabled >
 Base class for the grid volume variables. More...
 
struct  Dumux::CCDefaultScvGeometryTraits< GridView >
 Default traits class to be used for the sub-control volumes for the cell-centered finite volume scheme using TPFA. More...
 
class  Dumux::CCSubControlVolume< GV, T >
 Sub control volumes for cell-centered discretization schemes. More...
 
class  Dumux::Experimental::CCLocalAssemblerBase< TypeTag, Assembler, Implementation >
 A base class for all local cell-centered assemblers. More...
 
class  Dumux::Experimental::CCLocalAssembler< TypeTag, Assembler, diffMethod, Implementation >
 An assembler for Jacobian and residual contribution per element (cell-centered methods) More...
 
class  Dumux::Experimental::CCLocalAssembler< TypeTag, Assembler, DiffMethod::numeric, Implementation >
 Cell-centered scheme local assembler using numeric differentiation. More...
 
class  Dumux::Experimental::SubDomainCCLocalAssemblerBase< id, TypeTag, Assembler, Implementation, dm >
 A base class for all multidomain local assemblers. More...
 
class  Dumux::Experimental::SubDomainCCLocalAssembler< id, TypeTag, Assembler, DM >
 The cell-centered scheme multidomain local assembler. More...
 
class  Dumux::Experimental::SubDomainCCLocalAssembler< id, TypeTag, Assembler, DiffMethod::numeric >
 Cell-centered scheme multidomain local assembler using numeric differentiation. More...
 
class  Dumux::SubDomainCCLocalAssemblerBase< id, TypeTag, Assembler, Implementation, implicit >
 A base class for all multidomain local assemblers. More...
 
class  Dumux::SubDomainCCLocalAssembler< id, TypeTag, Assembler, DM, implicit >
 The cell-centered scheme multidomain local assembler. More...
 
class  Dumux::SubDomainCCLocalAssembler< id, TypeTag, Assembler, DiffMethod::numeric, true >
 Cell-centered scheme multidomain local assembler using numeric differentiation and implicit time discretization. More...
 
class  Dumux::SubDomainCCLocalAssembler< id, TypeTag, Assembler, DiffMethod::numeric, false >
 Cell-centered scheme multidomain local assembler using numeric differentiation and explicit time discretization. More...
 
class  Dumux::SubDomainCCLocalAssembler< id, TypeTag, Assembler, DiffMethod::analytic, true >
 Cell-centered scheme local assembler using analytic differentiation and implicit time discretization. More...