1 #ifndef ERF_TERRAIN_CONVERSION_H_
2 #define ERF_TERRAIN_CONVERSION_H_
4 #include <AMReX_Array.H>
5 #include <AMReX_Array4.H>
6 #include <AMReX_GpuQualifiers.H>
7 #include <AMReX_REAL.H>
20 namespace ParticlePos {
34 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
37 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>
const& plo,
38 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>
const& dxi,
39 amrex::Array4<amrex::Real const>
const& height_arr) noexcept
43 const int ix =
static_cast<int>(amrex::Math::floor(lx));
44 const int iy =
static_cast<int>(amrex::Math::floor(ly));
48 + height_arr(ix+1, iy , k_face) * fx * (
amrex::Real(1) - fy)
49 + height_arr(ix , iy+1, k_face) * (
amrex::Real(1) - fx) * fy
50 + height_arr(ix+1, iy+1, k_face) * fx * fy;
69 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
72 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>
const& plo,
73 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>
const& dxi,
74 amrex::Array4<amrex::Real const>
const& height_arr) noexcept
79 const amrex::Real lz = (zeta - plo[AMREX_SPACEDIM-1]) * dxi[AMREX_SPACEDIM-1];
80 const int k =
static_cast<int>(amrex::Math::floor(lz));
104 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
107 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>
const& plo,
108 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>
const& dxi,
109 amrex::Array4<amrex::Real const>
const& height_arr,
115 const int k_lo = amrex::max(0, height_arr.begin[2]);
116 const int k_hi = amrex::min(k_max, height_arr.end[2] - 2);
120 if (
z < z_hi) {
break; }
126 ? (
z - z_lo) / (z_hi - z_lo)
128 return plo[AMREX_SPACEDIM-1]
129 + (
static_cast<amrex::Real>(k) + fz) / dxi[AMREX_SPACEDIM-1];
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real z_from_zeta(amrex::Real x, amrex::Real y, amrex::Real zeta, amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > const &plo, amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > const &dxi, amrex::Array4< amrex::Real const > const &height_arr) noexcept
Convert computational vertical coordinate zeta to physical z at column (x, y).
Definition: ERF_TerrainConversion.H:71
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real zeta_from_z(amrex::Real x, amrex::Real y, amrex::Real z, amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > const &plo, amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > const &dxi, amrex::Array4< amrex::Real const > const &height_arr, int k_max) noexcept
Convert physical z to computational vertical coordinate zeta at column (x, y).
Definition: ERF_TerrainConversion.H:106
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real z_face_at_xy(amrex::Real x, amrex::Real y, int k_face, amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > const &plo, amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > const &dxi, amrex::Array4< amrex::Real const > const &height_arr) noexcept
Bilinear interpolation of the height array at (x, y) for a given vertical node index k_face.
Definition: ERF_TerrainConversion.H:36
Definition: ERF_InterpolationUtils.H:16