FV3 Bundle
PCG.h File Reference

Preconditioned Conjugate Gradients solver. More...

#include <cmath>
#include <vector>
#include "oops/util/dot_product.h"
#include "oops/util/formats.h"
#include "oops/util/Logger.h"
Include dependency graph for PCG.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Namespaces

 oops
 The namespace for the main oops code.
 

Functions

template<typename VECTOR , typename AMATRIX , typename PMATRIX >
double oops::PCG (VECTOR &x, const VECTOR &b, const AMATRIX &A, const PMATRIX &precond, const int maxiter, const double tolerance)
 

Detailed Description

Preconditioned Conjugate Gradients solver.

This solver is based on the standard Preconditioned Conjugate Gradients solver for Ax=b

A must be square, symmetric, positive definite. A preconditioner must be supplied that, given a vector q, returns an approximate solution of Ap=q.

On entry:

  • x = starting point, \( x_0 \).
  • b = right hand side.
  • A = \( A \).
  • precond = preconditioner \( P \approx (A)^{-1} \).

On exit, x will contain the solution \( x \)

The return value is the achieved reduction in preconditioned residual norm.

Iteration will stop if the maximum iteration limit "maxiter" is reached or if the preconditioned residual norm reduces by a factor of "tolerance".

VECTOR must implement:

  • dot_product
  • operator(=)
  • operator(+=),
  • operator(-=)
  • operator(*=) [double * VECTOR],
  • axpy

Each of AMATRIX and PMATRIX must implement a method:

  • void multiply(const VECTOR&, VECTOR&) const

which applies the matrix to the first argument, and returns the matrix-vector product in the second. (Note: the const is optional, but recommended.)

Definition in file PCG.h.