# Linear Interpolators

$ \newcommand{\cross}{\times} \newcommand{\inner}{\cdot} \newcommand{\div}{\nabla\cdot} \newcommand{\curl}{\nabla\times} \newcommand{\grad}{\nabla} \newcommand{\ddx}[1]{\frac{d#1}{dx}} \newcommand{\abs}[1]{|#1|} $

Linear interpolators can be very useful for interpolating one discrete representation of a field onto another set of basis functions to produce another representation. However, this must be done with care because different discrete representations are not completely interchangeable.

As an example consider a scalar field projected onto either piece-wise linear ($H_1$) or piece-wise constant ($L_2$) basis functions. Interpolating from an $H_1$ representation to an $L_2$ representation should produce a reasonable result because the constant value needed in each element can be computed as a weighted sum of the $H_1$ basis functions in that element. On the other hand, if we try to interpolate from the $L_2$ representation to an $H_1$ representation we don't have enough information to determine reasonable values for the degrees of freedom which are shared between neighboring elements because linear interpolators can only access one element at a time. To accurately compute an $H_1$ representation from an $L_2$ representation requires the type of weighted average of values from neighboring elements that bilinear forms provide but this requires a linear solve and often suitable boundary conditions.

The operators produced by the `BilinearForm`

classes involve
integrations and therefore they sum the various contributions from
neighboring elements to compute a full integral. The
`DiscreteLinearOperator`

classes are not performing integrals but
rather interpolations and as such they do not combine contributions
from different elements in any way. Consequently if the
`LinearInterpolator`

s produce different results for entities that are
shared between neighboring elements then the resulting representation
will depend on the order in which the elements are processed. Such
operators are not good candidates for `DiscreteLinearOperator`

s. The
sections below will offer some guidance on the appropriate use of these
operators.

In the tables below the *Space* column refers to finite element spaces which
implement the following methods:

Space | Operator | Derivative Operator |
---|---|---|

H1 | CalcShape | CalcDShape |

ND | CalcVShape | CalcCurlShape |

RT | CalcVShape | CalcDivShape |

L2 | CalcShape | None |

The *Coef.* column refers to the types of coefficients that are
available. A boldface coefficient type is required whereas most
coefficients are optional.

Coef. | Type |
---|---|

S | Scalar Valued Function |

V | Vector Valued Function |

D | Diagonal Matrix Function |

M | General Matrix Function |

### Derivative Interpolators

The $H(Curl)$ and $H(Div)$ spaces are specifically designed to support these derivative operators by having the necessary inter-element continuity. Other possible derivative operators would not possess the correct continuity and must therefore be implemented in a weak sense.

Class Name | Domain | Range | Operator |
---|---|---|---|

GradientInterpolator | H1 | ND | $\grad u$ |

CurlInterpolator | ND in 3D | RT | $\curl\vec{u}$ |

CurlInterpolator | ND in 2D | L2 | $\hat{z}\cdot(\curl\vec{u})$ |

DivergenceInterpolator | RT | L2 | $\div\vec{u}$ |

### Product Interpolators

These operators require a bit more care than the previous set. In order for these operators to produce valid results the product of the coefficient with the domain space must be uniquely representable within the desired range space. Additionally, it may sometimes be desirable for the range space to have a higher order than the domain space if the coefficient is not constant. For example if the domain space and the coefficient are both linear it might be desirable, though not necessary, for the range space to be quadratic.

Class Name | Domain | Range | Coef. | Operator |
---|---|---|---|---|

ScalarProductInterpolator | H1,L2 | H1,L2 | S | $\lambda u$ |

ScalarVectorProductInterpolator | ND,RT | ND,RT | S | $\lambda\vec{u}$ |

VectorScalarProductInterpolator | H1,L2 | ND,RT | V | $\vec{\lambda}u$ |

VectorCrossProductInterpolator | ND,RT in 3D | ND,RT | V | $\vec{\lambda}\times\vec{u}$ |

ScalarCrossProductInterpolator | ND,RT in 2D | H1,L2 | V | $\hat{z}\cdot(\vec{\lambda}\times\vec{u})$ |

VectorInnerProductInterpolator | ND,RT | H1,L2 | V | $\vec{\lambda}\cdot\vec{u}$ |

### Special Purpose Interpolators

Class Name | Domain | Range | Operator |
---|---|---|---|

IdentityInterpolator | H1,L2 | H1,L2 | $u$ |

NormalInterpolator | H1$^d$ | RT_Trace | $\hat{n}\cdot\vec{u}$ |