7 #ifndef WARPX_MusclHancock_H_
8 #define WARPX_MusclHancock_H_
19 amrex::Real
F_r (amrex::Real r, amrex::Real u_r, amrex::Real u_theta, amrex::Real u_z, amrex::Real
dt)
21 using namespace amrex::literals;
22 return dt*(-u_theta*u_theta/r)/std::sqrt(1.0_rt + u_r*u_r + u_theta*u_theta + u_z*u_z) + u_r;
28 amrex::Real
F_theta (amrex::Real r, amrex::Real u_r, amrex::Real u_theta, amrex::Real u_z, amrex::Real
dt)
30 using namespace amrex::literals;
31 return dt*(u_theta*u_r/r)/std::sqrt(1.0_rt + u_r*u_r + u_theta*u_theta + u_z*u_z) + u_theta;
37 using namespace amrex::literals;
39 amrex::Real
gamma = std::sqrt(1.0_rt + (U(
i,j,k,1)*U(
i,j,k,1) + U(
i,j,k,2)*U(
i,j,k,2) + U(
i,j,k,3)*U(
i,j,k,3))/(
c*
c));
40 return U(
i,j,k,comp+1)/
gamma;
44 amrex::Real
minmod (amrex::Real a, amrex::Real b)
46 using namespace amrex::literals;
47 if (a > 0.0_rt && b > 0.0_rt)
48 return std::min(a, b);
49 else if (a < 0.0_rt && b < 0.0_rt)
50 return std::max(a, b);
56 amrex::Real
min3 (amrex::Real a, amrex::Real b, amrex::Real
c)
58 return std::min(a, std::min(b,
c) );
62 amrex::Real
max3 (amrex::Real a, amrex::Real b, amrex::Real
c)
64 return std::max(a, std::max(b,
c) );
68 amrex::Real
minmod3 (amrex::Real a, amrex::Real b , amrex::Real
c)
70 using namespace amrex::literals;
71 if (a > 0.0_rt && b > 0.0_rt &&
c > 0.0_rt)
73 else if (a < 0.0_rt && b < 0.0_rt &&
c < 0.0_rt)
80 amrex::Real
maxmod (amrex::Real a, amrex::Real b)
82 using namespace amrex::literals;
83 if (a > 0.0_rt && b > 0.0_rt)
84 return std::max(a, b);
85 else if (a < 0.0_rt && b < 0.0_rt)
86 return std::min(a, b);
93 int i,
int j,
int k, amrex::Real Vm, amrex::Real Vp)
95 using namespace amrex::literals;
96 amrex::Real
c = std::max( std::abs(Vm) , std::abs(Vp) );
97 return 0.5_rt*(Vm*Um(
i,j,k,0) + Vp*Up(
i,j,k,0)) - (0.5_rt*
c)*(Up(
i,j,k,0) - Um(
i,j,k,0));
102 int i,
int j,
int k, amrex::Real Vm, amrex::Real Vp)
104 using namespace amrex::literals;
105 amrex::Real
c = std::max( std::abs(Vm) , std::abs(Vp) );
106 return 0.5_rt*(Vm*Um(
i,j,k,0)*Um(
i,j,k,1) + Vp*Up(
i,j,k,0)*Up(
i,j,k,1))
107 - (0.5_rt*
c)*(Up(
i,j,k,0)*Up(
i,j,k,1) - Um(
i,j,k,0)*Um(
i,j,k,1));
112 int i,
int j,
int k, amrex::Real Vm, amrex::Real Vp)
114 using namespace amrex::literals;
115 amrex::Real
c = std::max( std::abs(Vm) , std::abs(Vp) );
116 return 0.5_rt*(Vm*Um(
i,j,k,0)*Um(
i,j,k,2) + Vp*Up(
i,j,k,0)*Up(
i,j,k,2))
117 - (0.5_rt*
c)*(Up(
i,j,k,0)*Up(
i,j,k,2) - Um(
i,j,k,0)*Um(
i,j,k,2));
122 int i,
int j,
int k, amrex::Real Vm, amrex::Real Vp)
124 using namespace amrex::literals;
125 amrex::Real
c = std::max( std::abs(Vm) , std::abs(Vp) );
126 return 0.5_rt*(Vm*Um(
i,j,k,0)*Um(
i,j,k,3) + Vp*Up(
i,j,k,0)*Up(
i,j,k,3))
127 - (0.5_rt*
c)*(Up(
i,j,k,0)*Up(
i,j,k,3) - Um(
i,j,k,0)*Um(
i,j,k,3));
133 using namespace amrex::literals;
134 constexpr
auto sigma =
static_cast<amrex::Real
>(2.0*0.732050807568877);
136 return minmod3( (a+b)/2.0_rt, sigma*a, sigma*b );
142 amrex::Real
ave (amrex::Real a, amrex::Real b)
144 using namespace amrex::literals;
146 return minmod3( (a+b)/2.0_rt, 2.0_rt*a, 2.0_rt*b );
154 using namespace amrex::literals;
162 amrex::Real
ave_stage2 (amrex::Real dQ, amrex::Real a, amrex::Real b, amrex::Real
c)
164 using namespace amrex::literals;
166 constexpr
auto sigma = 0.732050807568877_rt;
167 amrex::Real dq_min = 2.0_rt*std::min( b -
min3(a,b,
c),
max3(a,b,
c) - b);
168 return ( std::abs(dQ)/dQ ) * std::min( std::abs(dQ) , sigma*std::abs(dq_min) );
174 using namespace amrex::literals;
176 #if defined(WARPX_DIM_3D)
178 ip =
i - 1; jp = j; kp = k;
179 }
else if (comp == 1){
180 ip =
i; jp = j - 1; kp = k;
181 }
else if (comp == 2){
182 ip =
i; jp = j; kp = k - 1;
184 #elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
186 ip =
i - 1; jp = j; kp = k;
187 }
else if (comp == 2){
188 ip =
i; jp = j - 1; kp = k;
192 ip =
i - 1; jp = j; kp = k;
199 amrex::Real U_tilde0, amrex::Real U_tilde1, amrex::Real U_tilde2, amrex::Real U_tilde3,
200 amrex::Real dU0x, amrex::Real dU1x, amrex::Real dU2x, amrex::Real dU3x,
int comp)
202 using namespace amrex::literals;
208 Um(
i,j,k,0) = U_tilde0 + dU0x/2.0_rt;
209 Um(
i,j,k,1) = U_tilde1 + dU1x/2.0_rt;
210 Um(
i,j,k,2) = U_tilde2 + dU2x/2.0_rt;
211 Um(
i,j,k,3) = U_tilde3 + dU3x/2.0_rt;
215 Up(ip,jp,kp,0) = U_tilde0 - dU0x/2.0_rt;
216 Up(ip,jp,kp,1) = U_tilde1 - dU1x/2.0_rt;
217 Up(ip,jp,kp,2) = U_tilde2 - dU2x/2.0_rt;
218 Up(ip,jp,kp,3) = U_tilde3 - dU3x/2.0_rt;
226 using namespace amrex::literals;
232 Um(
i,j,k,0) = 0.0_rt;
233 Um(
i,j,k,1) = 0.0_rt;
234 Um(
i,j,k,2) = 0.0_rt;
235 Um(
i,j,k,3) = 0.0_rt;
239 Up(ip,jp,kp,0) = 0.0_rt;
240 Up(ip,jp,kp,1) = 0.0_rt;
241 Up(ip,jp,kp,2) = 0.0_rt;
242 Up(ip,jp,kp,3) = 0.0_rt;
250 int i,
int j,
int k,
amrex::Box box, amrex::Real Ux, amrex::Real Uy, amrex::Real Uz,
254 using namespace amrex::literals;
263 if ((U_edge_minus(
i,j,k,0) < 0.0_rt) || (U_edge_plus(ip,jp,kp,0) < 0.0_rt)) {
264 U_edge_minus(
i,j,k,0) = N_arr(
i,j,k);
265 U_edge_minus(
i,j,k,1) = Ux;
266 U_edge_minus(
i,j,k,2) = Uy;
267 U_edge_minus(
i,j,k,3) = Uz;
268 U_edge_plus(ip,jp,kp,0) = N_arr(
i,j,k);
269 U_edge_plus(ip,jp,kp,1) = Ux;
270 U_edge_plus(ip,jp,kp,2) = Uy;
271 U_edge_plus(ip,jp,kp,3) = Uz;
274 if (U_edge_minus(
i,j,k,0) < 0.0_rt) {
275 U_edge_minus(
i,j,k,0) = N_arr(
i,j,k);
276 U_edge_minus(
i,j,k,1) = Ux;
277 U_edge_minus(
i,j,k,2) = Uy;
278 U_edge_minus(
i,j,k,3) = Uz;
281 if (U_edge_plus(ip,jp,kp,0) < 0.0_rt){
282 U_edge_plus(ip,jp,kp,0) = N_arr(
i,j,k);
283 U_edge_plus(ip,jp,kp,1) = Ux;
284 U_edge_plus(ip,jp,kp,2) = Uy;
285 U_edge_plus(ip,jp,kp,3) = Uz;
294 using namespace amrex::literals;
296 #if defined(WARPX_DIM_3D) || defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
297 return N(
i,j,k) - N(
i-1,j,k);
307 using namespace amrex::literals;
309 #if defined(WARPX_DIM_3D) || defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
310 return N(
i+1,j,k) - N(
i,j,k);
320 using namespace amrex::literals;
322 #if defined(WARPX_DIM_3D)
323 return N(
i,j,k) - N(
i,j-1,k);
333 using namespace amrex::literals;
335 #if defined(WARPX_DIM_3D)
336 return N(
i,j+1,k) - N(
i,j,k);
346 using namespace amrex::literals;
348 #if defined(WARPX_DIM_3D)
349 return N(
i,j,k) - N(
i,j,k-1);
350 #elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
351 return N(
i,j,k) - N(
i,j-1,k);
353 return N(
i,j,k) - N(
i-1,j,k);
360 using namespace amrex::literals;
362 #if defined(WARPX_DIM_3D)
363 return N(
i,j,k+1) - N(
i,j,k);
364 #elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
365 return N(
i,j+1,k) - N(
i,j,k);
367 return N(
i+1,j,k) - N(
i,j,k);
377 using namespace amrex::literals;
379 #if defined(WARPX_DIM_3D) || defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
382 if (N(
i-1,j,k) > 0) U_m = NU(
i-1,j,k)/N(
i-1,j,k);
394 using namespace amrex::literals;
396 #if defined(WARPX_DIM_3D) || defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
399 if (N(
i+1,j,k) > 0) U_p = NU(
i+1,j,k)/N(
i+1,j,k);
412 using namespace amrex::literals;
414 #if defined(WARPX_DIM_3D)
417 if (N(
i,j-1,k) > 0) U_m = NU(
i,j-1,k)/N(
i,j-1,k);
429 using namespace amrex::literals;
431 #if defined(WARPX_DIM_3D)
434 if (N(
i,j+1,k) > 0) U_p = NU(
i,j+1,k)/N(
i,j+1,k);
447 using namespace amrex::literals;
449 amrex::Real U_m = 0_rt;
452 #if defined(WARPX_DIM_3D)
453 if (N(
i,j,k-1) > 0) U_m = NU(
i,j,k-1)/N(
i,j,k-1);
454 #elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
455 if (N(
i,j-1,k) > 0) U_m = NU(
i,j-1,k)/N(
i,j-1,k);
457 if (N(
i-1,j,k) > 0) U_m = NU(
i-1,j,k)/N(
i-1,j,k);
468 using namespace amrex::literals;
473 #if defined(WARPX_DIM_3D)
474 if (N(
i,j,k+1) > 0) U_p = NU(
i,j,k+1)/N(
i,j,k+1);
475 #elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
476 if (N(
i,j+1,k) > 0) U_p = NU(
i,j+1,k)/N(
i,j+1,k);
478 if (N(
i+1,j,k) > 0) U_p = NU(
i+1,j,k)/N(
i+1,j,k);
491 using namespace amrex::literals;
496 amrex::Real V_L_minus =
V_calc(U_minus,ip,jp,kp,dir,
clight);
498 amrex::Real V_L_plus =
V_calc(U_plus,ip,jp,kp,dir,
clight);
503 return flux_N( U_minus, U_plus,
i, j, k, V_I_minus, V_I_plus) -
flux_N( U_minus, U_plus, ip, jp, kp, V_L_minus, V_L_plus);
504 }
else if (comp == 1){
505 return flux_NUx( U_minus, U_plus,
i, j, k, V_I_minus, V_I_plus) -
flux_NUx( U_minus, U_plus, ip, jp, kp, V_L_minus, V_L_plus);
506 }
else if (comp == 2){
507 return flux_NUy( U_minus, U_plus,
i, j, k, V_I_minus, V_I_plus) -
flux_NUy( U_minus, U_plus, ip, jp, kp, V_L_minus, V_L_plus);
509 return flux_NUz( U_minus, U_plus,
i, j, k, V_I_minus, V_I_plus) -
flux_NUz( U_minus, U_plus, ip, jp, kp, V_L_minus, V_L_plus);
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real max3(amrex::Real a, amrex::Real b, amrex::Real c)
Definition: MusclHancockUtils.H:62
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real DownDx_U(const amrex::Array4< amrex::Real > &N, const amrex::Array4< amrex::Real > &NU, amrex::Real &U, int i, int j, int k)
Definition: MusclHancockUtils.H:374
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void positivity_limiter(const amrex::Array4< amrex::Real > &U_edge_plus, const amrex::Array4< amrex::Real > &U_edge_minus, const amrex::Array4< amrex::Real > &N_arr, int i, int j, int k, amrex::Box box, amrex::Real Ux, amrex::Real Uy, amrex::Real Uz, int comp)
Definition: MusclHancockUtils.H:248
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real dF(const amrex::Array4< amrex::Real > &U_minus, const amrex::Array4< amrex::Real > &U_plus, int i, int j, int k, amrex::Real clight, int comp, int dir)
Definition: MusclHancockUtils.H:488
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void compute_U_edges(const amrex::Array4< amrex::Real > &Um, const amrex::Array4< amrex::Real > &Up, int i, int j, int k, amrex::Box box, amrex::Real U_tilde0, amrex::Real U_tilde1, amrex::Real U_tilde2, amrex::Real U_tilde3, amrex::Real dU0x, amrex::Real dU1x, amrex::Real dU2x, amrex::Real dU3x, int comp)
Definition: MusclHancockUtils.H:198
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real DownDz_N(const amrex::Array4< amrex::Real > &N, int i, int j, int k)
Definition: MusclHancockUtils.H:344
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real UpDx_U(const amrex::Array4< amrex::Real > &N, const amrex::Array4< amrex::Real > &NU, amrex::Real &U, int i, int j, int k)
Definition: MusclHancockUtils.H:391
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real UpDy_N(const amrex::Array4< amrex::Real > &N, int i, int j, int k)
Definition: MusclHancockUtils.H:331
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real V_calc(const amrex::Array4< amrex::Real > &U, int i, int j, int k, int comp, amrex::Real c)
Definition: MusclHancockUtils.H:35
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real minmod3(amrex::Real a, amrex::Real b, amrex::Real c)
Definition: MusclHancockUtils.H:68
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ave_superbee(amrex::Real a, amrex::Real b)
Definition: MusclHancockUtils.H:152
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real UpDy_U(const amrex::Array4< amrex::Real > &N, const amrex::Array4< amrex::Real > &NU, amrex::Real &U, int i, int j, int k)
Definition: MusclHancockUtils.H:426
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ave(amrex::Real a, amrex::Real b)
Definition: MusclHancockUtils.H:142
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real UpDx_N(const amrex::Array4< amrex::Real > &N, int i, int j, int k)
Definition: MusclHancockUtils.H:305
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void plus_index_offsets(int i, int j, int k, int &ip, int &jp, int &kp, int comp)
Definition: MusclHancockUtils.H:172
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real minmod(amrex::Real a, amrex::Real b)
Definition: MusclHancockUtils.H:44
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real DownDy_U(const amrex::Array4< amrex::Real > &N, const amrex::Array4< amrex::Real > &NU, amrex::Real &U, int i, int j, int k)
Definition: MusclHancockUtils.H:409
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real min3(amrex::Real a, amrex::Real b, amrex::Real c)
Definition: MusclHancockUtils.H:56
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real flux_NUz(const amrex::Array4< amrex::Real > &Um, const amrex::Array4< amrex::Real > &Up, int i, int j, int k, amrex::Real Vm, amrex::Real Vp)
Definition: MusclHancockUtils.H:121
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ave_adjustable_diff(amrex::Real a, amrex::Real b)
Definition: MusclHancockUtils.H:131
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real DownDx_N(const amrex::Array4< amrex::Real > &N, int i, int j, int k)
Definition: MusclHancockUtils.H:292
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real F_theta(amrex::Real r, amrex::Real u_r, amrex::Real u_theta, amrex::Real u_z, amrex::Real dt)
Definition: MusclHancockUtils.H:28
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ave_stage2(amrex::Real dQ, amrex::Real a, amrex::Real b, amrex::Real c)
Definition: MusclHancockUtils.H:162
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real UpDz_N(const amrex::Array4< amrex::Real > &N, int i, int j, int k)
Definition: MusclHancockUtils.H:358
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real maxmod(amrex::Real a, amrex::Real b)
Definition: MusclHancockUtils.H:80
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real flux_NUy(const amrex::Array4< amrex::Real > &Um, const amrex::Array4< amrex::Real > &Up, int i, int j, int k, amrex::Real Vm, amrex::Real Vp)
Definition: MusclHancockUtils.H:111
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real flux_N(const amrex::Array4< amrex::Real > &Um, const amrex::Array4< amrex::Real > &Up, int i, int j, int k, amrex::Real Vm, amrex::Real Vp)
Definition: MusclHancockUtils.H:92
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real DownDy_N(const amrex::Array4< amrex::Real > &N, int i, int j, int k)
Definition: MusclHancockUtils.H:318
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void set_U_edges_to_zero(const amrex::Array4< amrex::Real > &Um, const amrex::Array4< amrex::Real > &Up, int i, int j, int k, amrex::Box box, int comp)
Definition: MusclHancockUtils.H:223
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real flux_NUx(const amrex::Array4< amrex::Real > &Um, const amrex::Array4< amrex::Real > &Up, int i, int j, int k, amrex::Real Vm, amrex::Real Vp)
Definition: MusclHancockUtils.H:101
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real UpDz_U(const amrex::Array4< amrex::Real > &N, const amrex::Array4< amrex::Real > &NU, amrex::Real &U, int i, int j, int k)
Definition: MusclHancockUtils.H:465
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real F_r(amrex::Real r, amrex::Real u_r, amrex::Real u_theta, amrex::Real u_z, amrex::Real dt)
Definition: MusclHancockUtils.H:19
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real DownDz_U(const amrex::Array4< amrex::Real > &N, const amrex::Array4< amrex::Real > &NU, amrex::Real &U, int i, int j, int k)
Definition: MusclHancockUtils.H:444
AMREX_GPU_HOST_DEVICE bool contains(const IntVect &p) const noexcept
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
i
Definition: check_interp_points_and_weights.py:174
float dt
Definition: stencil.py:442
int gamma
boosted frame
Definition: stencil.py:431
float clight
Definition: video_yt.py:41