File interpolation_xz.hxx#

Defines

USE_NEW_WEIGHTS#
HS_USE_PETSC#

Typedefs

using XZMonotonicHermiteSpline = XZHermiteSplineBase<true>#

Monotonic Hermite spline interpolator

Similar to XZHermiteSpline, so uses most of the same code. Forces the interpolated result to be in the range of the neighbouring cell values. This prevents unphysical overshoots, but also degrades accuracy near maxima and minima. Perhaps should only impose near boundaries, since that is where problems most obviously occur.

using XZHermiteSpline = XZHermiteSplineBase<false>#
template<class DerivedType>
using RegisterXZInterpolation = XZInterpolationFactory::RegisterInFactory<DerivedType>#

Functions

const Field3D interpolate(const Field3D &f, const Field3D &delta_x, const Field3D &delta_z)

Interpolate a field onto a perturbed set of points.

const Field3D interpolate(const Field2D &f, const Field3D &delta_x, const Field3D &delta_z)
const Field3D interpolate(const Field2D &f, const Field3D &delta_x)
class XZInterpolation#

Subclassed by XZHermiteSplineBase< false >, XZBilinear, XZHermiteSplineBase< monotonic >, XZLagrange4pt

Public Functions

inline XZInterpolation(int y_offset = 0, Mesh *localmeshIn = nullptr)#
inline XZInterpolation(const BoutMask &mask, int y_offset = 0, Mesh *mesh = nullptr)#
inline XZInterpolation(const std::string &region_name, int y_offset = 0, Mesh *mesh = nullptr)#
inline XZInterpolation(const Region<Ind3D> &region, int y_offset = 0, Mesh *mesh = nullptr)#
virtual ~XZInterpolation() = default#
inline void setMask(const BoutMask &mask)#
inline void setRegion(const std::string &region_name)#
inline void setRegion(const std::unique_ptr<Region<Ind3D>> region)#
inline void setRegion(const Region<Ind3D> &region)#
inline const Region<Ind3D> &getRegion() const#
inline const Region<Ind3D> &getRegion(const std::string &region) const#
virtual void calcWeights(const Field3D &delta_x, const Field3D &delta_z, const std::string &region = "RGN_NOBNDRY") = 0#
virtual void calcWeights(const Field3D &delta_x, const Field3D &delta_z, const BoutMask &mask, const std::string &region = "RGN_NOBNDRY") = 0#
virtual Field3D interpolate(const Field3D &f, const std::string &region = "RGN_NOBNDRY") const = 0#
virtual Field3D interpolate(const Field3D &f, const Field3D &delta_x, const Field3D &delta_z, const std::string &region = "RGN_NOBNDRY") = 0#
virtual Field3D interpolate(const Field3D &f, const Field3D &delta_x, const Field3D &delta_z, const BoutMask &mask, const std::string &region = "RGN_NOBNDRY") = 0#
inline void setYOffset(int offset)#
inline virtual std::vector<ParallelTransform::PositionsAndWeights> getWeightsForYUpApproximation(int i, int j, int k)#
inline virtual std::vector<ParallelTransform::PositionsAndWeights> getWeightsForYDownApproximation(int i, int j, int k)#
inline virtual std::vector<ParallelTransform::PositionsAndWeights> getWeightsForYApproximation(int i, int j, int k, int yoffset)#

Public Members

int y_offset#

Protected Attributes

Mesh *localmesh = {nullptr}#
int region_id = {-1}#
template<bool monotonic>
class XZHermiteSplineBase : public XZInterpolation#

Public Functions

inline XZHermiteSplineBase(Mesh *mesh = nullptr)#
XZHermiteSplineBase(int y_offset = 0, Mesh *mesh = nullptr)#
inline XZHermiteSplineBase(const BoutMask &mask, int y_offset = 0, Mesh *mesh = nullptr)#
inline ~XZHermiteSplineBase()#
virtual void calcWeights(const Field3D &delta_x, const Field3D &delta_z, const std::string &region = "RGN_NOBNDRY") override#
virtual void calcWeights(const Field3D &delta_x, const Field3D &delta_z, const BoutMask &mask, const std::string &region = "RGN_NOBNDRY") override#
virtual Field3D interpolate(const Field3D &f, const std::string &region = "RGN_NOBNDRY") const override#
virtual Field3D interpolate(const Field3D &f, const Field3D &delta_x, const Field3D &delta_z, const std::string &region = "RGN_NOBNDRY") override#
virtual Field3D interpolate(const Field3D &f, const Field3D &delta_x, const Field3D &delta_z, const BoutMask &mask, const std::string &region = "RGN_NOBNDRY") override#
virtual std::vector<ParallelTransform::PositionsAndWeights> getWeightsForYApproximation(int i, int j, int k, int yoffset) override#

Return position and weight of points needed to approximate the function value at the point that the field line through (i,j,k) meets the (j+1)-plane. For the case where only the z-direction is not aligned to grid points, the approximation is: f(i,j+1,k*) = h00_z * f(i,j+1,k) + h01_z * f(i,j+1,k+1)

  • h10_z * dfdz(i,j+1,k) + h11_z * dfdz(i,j+1,k+1) = h00_z * f(i,j+1,k) + h01_z * f(i,j+1,k+1)

  • h10_z * ( f(i,j+1,k+1) - f(i,j+1,k-1) ) / 2

  • h11_z * ( f(i,j+1,k+2) - f(i,j+1,k) ) / 2 for k* a point between k and k+1. Therefore, this function returns position weight (i, j+1, k-1) - h10_z / 2 (i, j+1, k) h00_z - h11_z / 2 (i, j+1, k+1) h01_z + h10_z / 2 (i, j+1, k+2) h11_z / 2

Protected Attributes

Tensor<SpecificInd<IND_TYPE::IND_3D>> i_corner#

This is protected rather than private so that it can be extended and used by HermiteSplineMonotonic

Tensor<int> k_corner#
std::unique_ptr<GlobalField3DAccess> gf3daccess#
Tensor<std::array<int, 4>> g3dinds#
Field3D h00_x#
Field3D h01_x#
Field3D h10_x#
Field3D h11_x#
Field3D h00_z#
Field3D h01_z#
Field3D h10_z#
Field3D h11_z#
std::vector<Field3D> newWeights#
PetscLib *petsclib#
bool isInit = {false}#
Mat petscWeights = {}#
Vec rhs = {}#
Vec result = {}#
class XZLagrange4pt : public XZInterpolation#

Public Functions

inline XZLagrange4pt(Mesh *mesh = nullptr)#
XZLagrange4pt(int y_offset = 0, Mesh *mesh = nullptr)#
inline XZLagrange4pt(const BoutMask &mask, int y_offset = 0, Mesh *mesh = nullptr)#
virtual void calcWeights(const Field3D &delta_x, const Field3D &delta_z, const std::string &region = "RGN_NOBNDRY") override#
virtual void calcWeights(const Field3D &delta_x, const Field3D &delta_z, const BoutMask &mask, const std::string &region = "RGN_NOBNDRY") override#
virtual Field3D interpolate(const Field3D &f, const std::string &region = "RGN_NOBNDRY") const override#
virtual Field3D interpolate(const Field3D &f, const Field3D &delta_x, const Field3D &delta_z, const std::string &region = "RGN_NOBNDRY") override#
virtual Field3D interpolate(const Field3D &f, const Field3D &delta_x, const Field3D &delta_z, const BoutMask &mask, const std::string &region = "RGN_NOBNDRY") override#
BoutReal lagrange_4pt(BoutReal v2m, BoutReal vm, BoutReal vp, BoutReal v2p, BoutReal offset) const#
BoutReal lagrange_4pt(const BoutReal v[], BoutReal offset) const#

Private Members

Tensor<int> i_corner#
Tensor<int> k_corner#
Field3D t_x#
Field3D t_z#
class XZBilinear : public XZInterpolation#

Public Functions

inline XZBilinear(Mesh *mesh = nullptr)#
XZBilinear(int y_offset = 0, Mesh *mesh = nullptr)#
inline XZBilinear(const BoutMask &mask, int y_offset = 0, Mesh *mesh = nullptr)#
virtual void calcWeights(const Field3D &delta_x, const Field3D &delta_z, const std::string &region = "RGN_NOBNDRY") override#
virtual void calcWeights(const Field3D &delta_x, const Field3D &delta_z, const BoutMask &mask, const std::string &region = "RGN_NOBNDRY") override#
virtual Field3D interpolate(const Field3D &f, const std::string &region = "RGN_NOBNDRY") const override#
virtual Field3D interpolate(const Field3D &f, const Field3D &delta_x, const Field3D &delta_z, const std::string &region = "RGN_NOBNDRY") override#
virtual Field3D interpolate(const Field3D &f, const Field3D &delta_x, const Field3D &delta_z, const BoutMask &mask, const std::string &region = "RGN_NOBNDRY") override#

Private Members

Tensor<int> i_corner#
Tensor<int> k_corner#
Field3D w0#
Field3D w1#
Field3D w2#
Field3D w3#
class XZMonotonicHermiteSplineLegacy : public XZHermiteSplineBase<false>#

Public Functions

virtual Field3D interpolate(const Field3D &f, const std::string &region = "RGN_NOBNDRY") const override#
template<class ...Ts>
inline XZMonotonicHermiteSplineLegacy(Ts... args)#
class XZInterpolationFactory : public Factory<XZInterpolation, XZInterpolationFactory, Mesh*>#

Public Functions

inline ReturnType create(Options *options = nullptr, Mesh *mesh = nullptr) const#
inline ReturnType create(const std::string &type, [[maybe_unused]] Options *options) const#

Public Static Functions

static void ensureRegistered()#

Public Static Attributes

static constexpr auto type_name = "XZInterpolation"#
static constexpr auto section_name = "xzinterpolation"#
static constexpr auto option_name = "type"#
static constexpr auto default_type = "hermitespline"#