WarpX
LinearInterpolation.H
Go to the documentation of this file.
1 /* Copyright 2022 Luca Fedeli
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 
8 #ifndef WARPX_UTILS_ALGORITHMS_LINEAR_INTERPOLATION_H_
9 #define WARPX_UTILS_ALGORITHMS_LINEAR_INTERPOLATION_H_
10 
11 #include <AMReX_Extension.H>
12 #include <AMReX_GpuQualifiers.H>
13 
14 namespace utils::algorithms
15 {
21  template<typename TCoord, typename TVal> AMREX_GPU_DEVICE AMREX_FORCE_INLINE
22  constexpr auto linear_interp(
23  TCoord x0, TCoord x1,
24  TVal f0, TVal f1,
25  TCoord x)
26  {
27  return ((x1-x)*f0 + (x-x0)*f1)/(x1-x0);
28  }
29 
35  template<typename TCoord, typename TVal> AMREX_GPU_DEVICE AMREX_FORCE_INLINE
36  constexpr auto bilinear_interp(
37  TCoord x0, TCoord x1, TCoord y0, TCoord y1,
38  TVal f00, TVal f01, TVal f10, TVal f11,
39  TCoord x, TCoord y)
40  {
41  const auto fx0 = linear_interp(x0, x1, f00, f10, x);
42  const auto fx1 = linear_interp(x0, x1, f01, f11, x);
43  return linear_interp(y0, y1, fx0, fx1, y);
44  }
45 
52  template<typename TCoord, typename TVal> AMREX_GPU_DEVICE AMREX_FORCE_INLINE
53  constexpr auto trilinear_interp(
54  TCoord x0, TCoord x1, TCoord y0, TCoord y1, TCoord z0, TCoord z1,
55  TVal f000, TVal f001, TVal f010, TVal f011, TVal f100, TVal f101, TVal f110, TVal f111,
56  TCoord x, TCoord y, TCoord z)
57  {
58  const auto fxy0 = bilinear_interp(
59  x0, x1, y0, y1, f000, f010, f100, f110, x, y);
60  const auto fxy1 = bilinear_interp(
61  x0, x1, y0, y1, f001, f011, f101, f111, x, y);
62  return linear_interp(z0, z1, fxy0, fxy1, z);
63  }
64 }
65 
66 #endif //WARPX_UTILS_ALGORITHMS_LINEAR_INTERPOLATION_H_
#define AMREX_FORCE_INLINE
#define AMREX_GPU_DEVICE
list x1
Definition: plot_particle_path.py:130
list x0
Definition: plot_particle_path.py:128
list y0
Definition: plot_particle_path.py:129
list y1
Definition: plot_particle_path.py:131
Definition: IsIn.H:16
AMREX_GPU_DEVICE constexpr AMREX_FORCE_INLINE auto linear_interp(TCoord x0, TCoord x1, TVal f0, TVal f1, TCoord x)
Performs a linear interpolation.
Definition: LinearInterpolation.H:22
AMREX_GPU_DEVICE constexpr AMREX_FORCE_INLINE auto trilinear_interp(TCoord x0, TCoord x1, TCoord y0, TCoord y1, TCoord z0, TCoord z1, TVal f000, TVal f001, TVal f010, TVal f011, TVal f100, TVal f101, TVal f110, TVal f111, TCoord x, TCoord y, TCoord z)
Performs a trilinear interpolation.
Definition: LinearInterpolation.H:53
AMREX_GPU_DEVICE constexpr AMREX_FORCE_INLINE auto bilinear_interp(TCoord x0, TCoord x1, TCoord y0, TCoord y1, TVal f00, TVal f01, TVal f10, TVal f11, TCoord x, TCoord y)
Performs a bilinear interpolation.
Definition: LinearInterpolation.H:36