1 #ifndef ERF_TERRAIN_CONVERSION_H_
2 #define ERF_TERRAIN_CONVERSION_H_
4 #include <AMReX_Algorithm.H>
5 #include <AMReX_Array.H>
6 #include <AMReX_Array4.H>
7 #include <AMReX_GpuQualifiers.H>
8 #include <AMReX_REAL.H>
21 namespace ParticlePos {
35 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
38 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>
const& plo,
39 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>
const& dxi,
40 amrex::Array4<amrex::Real const>
const& height_arr) noexcept
47 const auto hlo = amrex::lbound(height_arr);
48 const auto hhi = amrex::ubound(height_arr);
49 const int ix = amrex::Clamp(
static_cast<int>(amrex::Math::floor(
lx)), hlo.x, hhi.x - 1);
50 const int iy = amrex::Clamp(
static_cast<int>(amrex::Math::floor(
ly)), hlo.y, hhi.y - 1);
54 + height_arr(ix+1, iy , k_face) * fx * (
amrex::Real(1) - fy)
55 + height_arr(ix , iy+1, k_face) * (
amrex::Real(1) - fx) * fy
56 + height_arr(ix+1, iy+1, k_face) * fx * fy;
75 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
78 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>
const& plo,
79 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>
const& dxi,
80 amrex::Array4<amrex::Real const>
const& height_arr) noexcept
85 const amrex::Real lz = (zeta - plo[AMREX_SPACEDIM-1]) * dxi[AMREX_SPACEDIM-1];
86 const int k =
static_cast<int>(amrex::Math::floor(
lz));
110 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
113 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>
const& plo,
114 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>
const& dxi,
115 amrex::Array4<amrex::Real const>
const& height_arr,
121 const int k_lo = amrex::max(0, height_arr.begin[2]);
122 const int k_hi = amrex::min(k_max, height_arr.end[2] - 2);
126 if (
z < z_hi) {
break; }
132 ? (
z - z_lo) / (z_hi - z_lo)
134 return plo[AMREX_SPACEDIM-1]
135 + (
static_cast<amrex::Real>(k) + fz) / dxi[AMREX_SPACEDIM-1];
const Real lz
Definition: ERF_InitCustomPertVels_CloudChamber.H:12
const Real lx
Definition: ERF_InitCustomPertVels_CloudChamber.H:10
const Real ly
Definition: ERF_InitCustomPertVels_CloudChamber.H:11
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:77
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:112
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:37
Definition: ERF_InterpolationUtils.H:15