ARTEMIS
DistanceToEB.H
Go to the documentation of this file.
1 /* Copyright 2021 Andrew Myers
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 #ifndef DISTANCETOEB_H_
8 #define DISTANCETOEB_H_
9 
10 #include <AMReX.H>
11 #include <AMReX_REAL.H>
12 #include <AMReX_RealVect.H>
13 #include <AMReX_Array.H>
14 
15 #ifdef AMREX_USE_EB
16 
17 namespace DistanceToEB
18 {
19 
21 amrex::Real dot_product (const amrex::RealVect& a, const amrex::RealVect& b) noexcept
22 {
23  return AMREX_D_TERM(a[0]*b[0], + a[1]*b[1], + a[2]*b[2]);
24 }
25 
27 void normalize (amrex::RealVect& a) noexcept
28 {
29  amrex::Real inv_norm = 1.0/std::sqrt(dot_product(a,a));
30  AMREX_D_DECL(a[0] *= inv_norm,
31  a[1] *= inv_norm,
32  a[2] *= inv_norm);
33 }
34 
36 amrex::RealVect interp_normal (int i, int j, int k, const amrex::Real W[AMREX_SPACEDIM][2],
39 {
40 #if (defined WARPX_DIM_3D)
41  amrex::RealVect normal{0.0, 0.0, 0.0};
42 
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];
51 
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];
60 
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) || defined(WARPX_DIM_RZ)
70  amrex::RealVect normal{0.0, 0.0};
71 
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];
76 
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];
81 #else
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 1D");
85 #endif
86  return normal;
87 }
88 }
89 
90 #endif // AMREX_USE_EB
91 #endif // DISTANCETOEB_H_
#define AMREX_INLINE
#define AMREX_GPU_HOST_DEVICE
#define AMREX_D_TERM(a, b, c)
#define AMREX_D_DECL(a, b, c)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real dot_product(XDim3 const &a, XDim3 const &b)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
void Abort(const std::string &msg)
i
Definition: check_interp_points_and_weights.py:174