7 #ifndef DISTANCETOEB_H_ 8 #define DISTANCETOEB_H_ 11 #include <AMReX_REAL.H> 12 #include <AMReX_RealVect.H> 13 #include <AMReX_Array.H> 17 namespace DistanceToEB
20 AMREX_GPU_HOST_DEVICE AMREX_INLINE
21 amrex::Real dot_product (
const amrex::RealVect& a,
const amrex::RealVect& b) noexcept
23 return AMREX_D_TERM(a[0]*b[0], + a[1]*b[1], + a[2]*b[2]);
26 AMREX_GPU_HOST_DEVICE AMREX_INLINE
27 void normalize (amrex::RealVect& a) noexcept
29 amrex::Real inv_norm = 1.0/std::sqrt(dot_product(a,a));
30 AMREX_D_DECL(a[0] *= inv_norm,
35 AMREX_GPU_HOST_DEVICE AMREX_INLINE
36 amrex::RealVect interp_normal (
int i,
int j,
int k,
const amrex::Real W[AMREX_SPACEDIM][2],
37 amrex::Array4<const amrex::Real>
const& phi,
38 amrex::GpuArray<amrex::Real,AMREX_SPACEDIM>
const& dxi) noexcept
40 #if (defined WARPX_DIM_3D) 41 amrex::RealVect normal{0.0, 0.0, 0.0};
43 normal[0] -= phi(
i, j , k ) * dxi[0] * W[1][0] * W[2][0];
44 normal[0] += phi(
i+1, j , k ) * dxi[0] * W[1][0] * W[2][0];
45 normal[0] -= phi(
i, j+1, k ) * dxi[0] * W[1][1] * W[2][0];
46 normal[0] += phi(
i+1, j+1, k ) * dxi[0] * W[1][1] * W[2][0];
47 normal[0] -= phi(
i, j , k+1) * dxi[0] * W[1][0] * W[2][1];
48 normal[0] += phi(
i+1, j , k+1) * dxi[0] * W[1][0] * W[2][1];
49 normal[0] -= phi(
i , j+1, k+1) * dxi[0] * W[1][1] * W[2][1];
50 normal[0] += phi(
i+1, j+1, k+1) * dxi[0] * W[1][1] * W[2][1];
52 normal[1] -= phi(
i, j , k ) * dxi[1] * W[0][0] * W[2][0];
53 normal[1] += phi(
i , j+1, k ) * dxi[1] * W[0][0] * W[2][0];
54 normal[1] -= phi(
i+1, j , k ) * dxi[1] * W[0][1] * W[2][0];
55 normal[1] += phi(
i+1, j+1, k ) * dxi[1] * W[0][1] * W[2][0];
56 normal[1] -= phi(
i, j , k+1) * dxi[1] * W[0][0] * W[2][1];
57 normal[1] += phi(
i , j+1, k+1) * dxi[1] * W[0][0] * W[2][1];
58 normal[1] -= phi(
i+1, j , k+1) * dxi[1] * W[0][1] * W[2][1];
59 normal[1] += phi(
i+1, j+1, k+1) * dxi[1] * W[0][1] * W[2][1];
61 normal[2] -= phi(
i , j , k ) * dxi[2] * W[0][0] * W[1][0];
62 normal[2] += phi(
i , j , k+1) * dxi[2] * W[0][0] * W[1][0];
63 normal[2] -= phi(
i+1, j , k ) * dxi[2] * W[0][1] * W[1][0];
64 normal[2] += phi(
i+1, j , k+1) * dxi[2] * W[0][1] * W[1][0];
65 normal[2] -= phi(
i, j+1, k ) * dxi[2] * W[0][0] * W[1][1];
66 normal[2] += phi(
i , j+1, k+1) * dxi[2] * W[0][0] * W[1][1];
67 normal[2] -= phi(
i+1, j+1, k ) * dxi[2] * W[0][1] * W[1][1];
68 normal[2] += phi(
i+1, j+1, k+1) * dxi[2] * W[0][1] * W[1][1];
69 #elif (defined WARPX_DIM_XZ) 70 amrex::RealVect normal{0.0, 0.0};
72 normal[0] -= phi(
i, j , k) * dxi[0] * W[1][0];
73 normal[0] += phi(
i+1, j , k) * dxi[0] * W[1][0];
74 normal[0] -= phi(
i, j+1, k) * dxi[0] * W[1][1];
75 normal[0] += phi(
i+1, j+1, k) * dxi[0] * W[1][1];
77 normal[1] -= phi(
i, j , k) * dxi[1] * W[0][0];
78 normal[1] += phi(
i , j+1, k) * dxi[1] * W[0][0];
79 normal[1] -= phi(
i+1, j , k) * dxi[1] * W[0][1];
80 normal[1] += phi(
i+1, j+1, k) * dxi[1] * W[0][1];
82 amrex::RealVect normal{0.0, 0.0};
83 amrex::ignore_unused(
i, j, k, W, phi, dxi);
84 amrex::Abort(
"Error: interp_distance not yet implemented in RZ");
90 #endif // AMREX_USE_EB 91 #endif // DISTANCETOEB_H_ i
Definition: check_interp_points_and_weights.py:171