OpenFOAM's finite volume method uses a co-located methodology on an unstructured polyhedral grid with arbitrary grid elements. Fluid dynamic quantities are centered on the control volume centroids. A variety of available interpolation, discretization, and matrix solution schemes can be selected at runtime. These are specified in the fvSchemes and fvSolutions files. OpenFOAM loads these schemes through its runTimeSelection mechanism which is flexible enough to allow different schemes to apply for each individual term in the equation. Implicit and explicit methodologies are separated into two different groupings: finite volume calculus for explicit; and finite volume method for implicit.

## 1 Mesh

OpenFOAM uses a co-located grid, i.e. the fluid dynamic properties are all stored at a single point within a control volume. In OpenFOAM this point is at the control volume centroid. The mesh allows for arbitrary polyhedral grid elements. There is no restriction to the number of points per face, nor to the number of faces enclosing a control volume.

There is a good treatise on the mesh structure in the OpenFOAM Programmer's Guide (now defunct).

## 2 Components

The solution method for an implicit equation differ significantly from the solution method for an explicit equation. Therefore OpenFOAM subdivides its finite volume method into two main namespaces:

- fvm ("finite volume method") for implicit equations; and
- fvc ("finite volume calculus") for explicit equations.

**Note:**As these are namespaces, no objects need to be created to make the functions they contain available. Including`fvCFD.H`automatically includes these files.

### 2.1 fvm namespace

The fvm is defined for implicit equations. Since the equation must be solved iteratively, rather than producing an immediate solution (like the fvc namespace), fvm namespace produces an fvMatrix object. This object can simply be solved using the `solve` method, but there are additional methods that an fvMatrix object can perform to facilitate a solution algorithm, such as `relax`.

In other words, the fvm namespace creates an **fvMatrix** from an **operator**. For example, the Laplacian operator:

fvm::laplacian(phi, U)

A number of different discretization schemes are available for each operation. These are loaded at run time using runTimeSelection, based on the schemes defined in fvSchemes.

### 2.2 fvc namespace

Since an explicit equation can be solved immediately, the fvc namespace does so. In other words, given an operation on a **volume field**, the fvc namespace produces another **volume field**.