### 4.4 Stencil operators ¶

This section lists all the stencil operators provided by Blitz++. They assume that an array represents evenly spaced data points separated by a distance of `h`. A 2nd-order accurate operator has error term O(h^2); a 4th-order accurate operator has error term O(h^4).

All of the stencils have factors associated with them. For example, the `central12` operator is a discrete first derivative which is 2nd-order accurate. Its factor is 2h; this means that to get the first derivative of an array A, you need to use `central12(A,firstDim)`/(2h). Typically when designing stencils, one factors out all of the h terms for efficiency.

The factor terms always consist of an integer multiplier (often 1) and a power of h. For ease of use, all of the operators listed below are provided in a second “normalized” version in which the integer multiplier is 1. The normalized versions have an `n` appended to the name, for example `central12n` is the normalized version of `central12`, and has factor h instead of 2h.

These operators are defined in `blitz/array/stencilops.h` if you wish to see the implementation.

#### 4.4.1 Central differences ¶

`central12(A,dimension)`

  1st derivative, 2nd order accurate. Factor: 2h

  | -1 | 0 | 1
  | -1 |  | 1

`central22(A,dimension)`

  2nd derivative, 2nd order accurate. Factor: h^2

  | -1 | 0 | 1
  | 1 | -2 | 1

`central32(A,dimension)`

  3rd derivative, 2nd order accurate. Factor: 2h^3

  | -2 | -1 | 0 | 1 | 2
  | -1 | 2 |  | -2 | 1

`central42(A,dimension)`

  4th derivative, 2nd order accurate. Factor: h^4

  | -2 | -1 | 0 | 1 | 2
  | 1 | -4 | 6 | -4 | 1

`central14(A,dimension)`

  1st derivative, 4th order accurate. Factor: 12h

  | -2 | -1 | 0 | 1 | 2
  | 1 | -8 |  | 8 | -1

`central24(A,dimension)`

  2nd derivative, 4th order accurate. Factor: 12h^2

  | -2 | -1 | 0 | 1 | 2
  | -1 | 16 | -30 | 16 | -1

`central34(A,dimension)`

  3rd derivative, 4th order accurate. Factor: 8h^3

  | -2 | -1 | 0 | 1 | 2
  | -8 | 13 |  | -13 | 8

`central44(A,dimension)`

  4th derivative, 4th order accurate. Factor: 6h^4

  | -2 | -1 | 0 | 1 | 2
  | 12 | -39 | 56 | -39 | 12

Note that the above are available in normalized versions `central12n`, `central22n`, ..., `central44n` which have factors of h, h^2, h^3, or h^4 as appropriate.

These are available in multicomponent versions: for example, `central12(A,component,dimension)` gives the central12 operator for the specified component (Components are numbered 0, 1, ... N-1).

#### 4.4.2 Forward differences ¶

`forward11(A,dimension)`

  1st derivative, 1st order accurate. Factor: h

  | 0 | 1
  | -1 | 1

`forward21(A,dimension)`

  2nd derivative, 1st order accurate. Factor: h^2

  | 0 | 1 | 2
  | 1 | -2 | 1

`forward31(A,dimension)`

  3rd derivative, 1st order accurate. Factor: h^3

  | 0 | 1 | 2 | 3
  | -1 | 3 | -3 | 1

`forward41(A,dimension)`

  4th derivative, 1st order accurate. Factor: h^4

  | 0 | 1 | 2 | 3 | 4
  | 1 | -4 | 6 | -4 | 1

`forward12(A,dimension)`

  1st derivative, 2nd order accurate. Factor: 2h

  | 0 | 1 | 2
  | -3 | 4 | -1

`forward22(A,dimension)`

  2nd derivative, 2nd order accurate. Factor: h^2

  | 0 | 1 | 2 | 3
  | 2 | -5 | 4 | -1

`forward32(A,dimension)`

  3rd derivative, 2nd order accurate. Factor: 2h^3

  | 0 | 1 | 2 | 3 | 4
  | -5 | 18 | -24 | 14 | -3

`forward42(A,dimension)`

  4th derivative, 2nd order accurate. Factor: h^4

  | 0 | 1 | 2 | 3 | 4 | 5
  | 3 | -14 | 26 | -24 | 11 | -2

Note that the above are available in normalized versions `forward11n`, `forward21n`, ..., `forward42n` which have factors of h, h^2, h^3, or h^4 as appropriate.

These are available in multicomponent versions: for example, `forward11(A,component,dimension)` gives the forward11 operator for the specified component (Components are numbered 0, 1, ... N-1).

#### 4.4.3 Backward differences ¶

`backward11(A,dimension)`

  1st derivative, 1st order accurate. Factor: h

  | -1 | 0
  | -1 | 1

`backward21(A,dimension)`

  2nd derivative, 1st order accurate. Factor: h^2

  | -2 | -1 | 0
  | 1 | -2 | 1

`backward31(A,dimension)`

  3rd derivative, 1st order accurate. Factor: h^3

  | -3 | -2 | -1 | 0
  | -1 | 3 | -3 | 1

`backward41(A,dimension)`

  4th derivative, 1st order accurate. Factor: h^4

  | -4 | -3 | -2 | -1 | 0
  | 1 | -4 | 6 | -4 | 1

`backward12(A,dimension)`

  1st derivative, 2nd order accurate. Factor: 2h

  | -2 | -1 | 0
  | 1 | -4 | 3

`backward22(A,dimension)`

  2nd derivative, 2nd order accurate. Factor: h^2

  | -3 | -2 | -1 | 0
  | -1 | 4 | -5 | 2

`backward32(A,dimension)`

  3rd derivative, 2nd order accurate. Factor: 2h^3

  | -4 | -3 | -2 | -1 | 0
  | 3 | -14 | 24 | -18 | 5

`backward42(A,dimension)`

  4th derivative, 2nd order accurate. Factor: h^4

  | -5 | -4 | -3 | -2 | -1 | 0
  | -2 | 11 | -24 | 26 | -14 | 3

Note that the above are available in normalized versions `backward11n`, `backward21n`, ..., `backward42n` which have factors of h, h^2, h^3, or h^4 as appropriate.

These are available in multicomponent versions: for example, `backward42(A,component,dimension)` gives the backward42 operator for the specified component (Components are numbered 0, 1, ... N-1).

#### 4.4.4 Laplacian (\nabla ^2) operators ¶

`Laplacian2D(A)`

  2nd order accurate, 2-dimensional laplacian. Factor: h^2

  | -1 | 0 | 1
  -1 |  | 1 |
  0 | 1 | -4 | 1
  1 |  | 1 |

`Laplacian3D(A)`

  2nd order accurate, 3-dimensional laplacian. Factor: h^2

`Laplacian2D4(A)`

  4th order accurate, 2-dimensional laplacian. Factor: 12h^2

  | -2 | -1 | 0 | 1 | 2
  -2 |  |  | -1 |  |
  -1 |  |  | 16 |  |
  0 | -1 | 16 | -60 | 16 | -1
  1 |  |  | 16 |  |
  2 |  |  | -1 |  |

`Laplacian3D4(A)`

  4th order accurate, 3-dimensional laplacian. Factor: 12h^2

Note that the above are available in normalized versions `Laplacian2D4n`, `Laplacian3D4n` which have factors h^2.

#### 4.4.5 Gradient (\nabla) operators ¶

These return `TinyVector`s of the appropriate numeric type and length:

`grad2D(A)`

  2nd order, 2-dimensional gradient (vector of first derivatives), generated using the central12 operator. Factor: 2h

`grad2D4(A)`

  4th order, 2-dimensional gradient, using central14 operator. Factor: 12h

`grad3D(A)`

  2nd order, 3-dimensional gradient, using central12 operator. Factor: 2h

`grad3D4(A)`

  4th order, 3-dimensional gradient, using central14 operator. Factor: 12h

These are available in normalized versions `grad2Dn`, `grad2D4n`, `grad3Dn` and `grad3D4n` which have factors h.

#### 4.4.6 Jacobian operators ¶

The Jacobian operators are defined over 3D vector fields only (e.g. `Array<TinyVector<double,3>,3>`). They return a `TinyMatrix<T,3,3>` where T is the numeric type of the vector field.

`Jacobian3D(A)`

  2nd order, 3-dimensional Jacobian using the central12 operator. Factor: 2h.

`Jacobian3D4(A)`

  4th order, 3-dimensional Jacobian using the central14 operator. Factor: 12h.

These are also available in normalized versions `Jacobian3Dn` and `Jacobain3D4n` which have factors h.

#### 4.4.7 Grad-squared operators ¶

There are also grad-squared operators, which return `TinyVector`s of second derivatives:

`gradSqr2D(A)`

  2nd order, 2-dimensional grad-squared (vector of second derivatives), generated using the central22 operator. Factor: h^2

`gradSqr2D4(A)`

  4th order, 2-dimensional grad-squared, using central24 operator. Factor: 12h^2

`gradSqr3D(A)`

  2nd order, 3-dimensional grad-squared, using the central22 operator. Factor: h^2

`gradSqr3D4(A)`

  4th order, 3-dimensional grad-squared, using central24 operator. Factor: 12h^2

Note that the above are available in normalized versions `gradSqr2Dn`, `gradSqr2D4n`, `gradSqr3Dn`, `gradSqr3D4n` which have factors h^2.

#### 4.4.8 Curl (\nabla \times) operators ¶

These curl operators return scalar values:

`curl(Vx,Vy)`

  2nd order curl operator using the central12 operator. Factor: 2h

`curl4(Vx,Vy)`

  4th order curl operator using the central14 operator. Factor: 12h

`curl2D(V)`

  2nd order curl operator on a 2D vector field (e.g. `Array<TinyVector<float,2>,2>`), using the central12 operator. Factor: 2h

`curl2D4(V)`

  4th order curl operator on a 2D vector field, using the central12 operator. Factor: 12h

Available in normalized forms `curln`, `curl4n`, `curl2Dn`, `curl2D4n`.

These curl operators return three-dimensional `TinyVector`s of the appropriate numeric type:

`curl(Vx,Vy,Vz)`

  2nd order curl operator using the central12 operator. Factor: 2h

`curl4(Vx,Vy,Vz)`

  4th order curl operator using the central14 operator. Factor: 12h

`curl(V)`

  2nd order curl operator on a 3D vector field (e.g. `Array<TinyVector<double,3>,3>`, using the central12 operator. Factor: 2h

`curl4(V)`

  4th order curl operator on a 3D vector field, using the central14 operator. Factor: 12h

Note that the above are available in normalized versions `curln` and `curl4n`, which have factors of `h`.

#### 4.4.9 Divergence (\nabla \cdot) operators ¶

The divergence operators return a scalar value.

`div(Vx,Vy)`

  2nd order div operator using the central12 operator. Factor: 2h

`div4(Vx,Vy)`

  4th order div operator using the central14 operator. Factor: 12h

`div(Vx,Vy,Vz)`

  2nd order div operator using the central12 operator. Factor: 2h

`div4(Vx,Vy,Vz)`

  4th order div operator using the central14 operator. Factor: 12h

`div2D(V)`

  2nd order div operator on a 2D vector field, using the central12 operator. Factor: 2h

`div2D4(V)`

  2nd order div operator on a 2D vector field, using the central14 operator. Factor: 12h

`div3D(V)`

  2nd order div operator on a 3D vector field, using the central12 operator. Factor: 2h

`div3D4(V)`

  2nd order div operator on a 3D vector field using the central14 operator. Factor: 12h

These are available in normalized versions `divn`, `div4n`, `div2Dn`, `div2D4n`, `div3Dn`, and `div3D4n` which have factors of h.

#### 4.4.10 Mixed partial derivatives ¶

`mixed22(A,dim1,dim2)`

  2nd order accurate, 2nd mixed partial derivative. Factor: 4h^2

`mixed24(A,dim1,dim2)`

  4th order accurate, 2nd mixed partial derivative. Factor: 144h^2

There are also normalized versions of the above, `mixed22n` and `mixed24n` which have factors h^2.