7#ifndef WARPX_MusclHancock_H_
8#define WARPX_MusclHancock_H_
21amrex::Real
F_r (amrex::Real r, amrex::Real u_r, amrex::Real u_theta, amrex::Real u_z, amrex::Real dt)
23 using namespace amrex::literals;
24 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;
30amrex::Real
F_theta (amrex::Real r, amrex::Real u_r, amrex::Real u_theta, amrex::Real u_z, amrex::Real dt)
32 using namespace amrex::literals;
33 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;
39 using namespace amrex::literals;
41 const 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));
42 return U(i,j,k,comp+1)/gamma;
46amrex::Real
minmod (amrex::Real a, amrex::Real b)
48 using namespace amrex::literals;
49 if (a > 0.0_rt && b > 0.0_rt) {
50 return std::min(a, b);
51 }
else if (a < 0.0_rt && b < 0.0_rt) {
52 return std::max(a, b);
59amrex::Real
minmod3 (amrex::Real a, amrex::Real b , amrex::Real c)
61 using namespace amrex::literals;
62 if (a > 0.0_rt && b > 0.0_rt && c > 0.0_rt) {
63 return std::min({a,b,c});
64 }
else if (a < 0.0_rt && b < 0.0_rt && c < 0.0_rt) {
65 return std::max({a,b,c});
72amrex::Real
maxmod (amrex::Real a, amrex::Real b)
74 using namespace amrex::literals;
75 if (a > 0.0_rt && b > 0.0_rt) {
76 return std::max(a, b);
77 }
else if (a < 0.0_rt && b < 0.0_rt) {
78 return std::min(a, b);
86int i,
int j,
int k, amrex::Real Vm, amrex::Real Vp)
88 using namespace amrex::literals;
89 const amrex::Real c = std::max( std::abs(Vm) , std::abs(Vp) );
90 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));
95int i,
int j,
int k, amrex::Real Vm, amrex::Real Vp)
97 using namespace amrex::literals;
98 const amrex::Real c = std::max( std::abs(Vm) , std::abs(Vp) );
99 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))
100 - (0.5_rt*c)*(Up(i,j,k,0)*Up(i,j,k,1) - Um(i,j,k,0)*Um(i,j,k,1));
105int i,
int j,
int k, amrex::Real Vm, amrex::Real Vp)
107 using namespace amrex::literals;
108 const amrex::Real c = std::max( std::abs(Vm) , std::abs(Vp) );
109 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))
110 - (0.5_rt*c)*(Up(i,j,k,0)*Up(i,j,k,2) - Um(i,j,k,0)*Um(i,j,k,2));
115int i,
int j,
int k, amrex::Real Vm, amrex::Real Vp)
117 using namespace amrex::literals;
118 const amrex::Real c = std::max( std::abs(Vm) , std::abs(Vp) );
119 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))
120 - (0.5_rt*c)*(Up(i,j,k,0)*Up(i,j,k,3) - Um(i,j,k,0)*Um(i,j,k,3));
126 using namespace amrex::literals;
127 constexpr auto sigma =
static_cast<amrex::Real
>(2.0*0.732050807568877);
129 return minmod3( (a+b)/2.0_rt, sigma*a, sigma*b );
136amrex::Real
ave (amrex::Real a, amrex::Real b)
138 using namespace amrex::literals;
140 return minmod3( (a+b)/2.0_rt, 2.0_rt*a, 2.0_rt*b );
149 using namespace amrex::literals;
158amrex::Real
ave_stage2 (amrex::Real dQ, amrex::Real a, amrex::Real b, amrex::Real c)
160 using namespace amrex::literals;
162 constexpr auto sigma = 0.732050807568877_rt;
163 const amrex::Real dq_min = 2.0_rt*std::min( b - std::min({a,b,c}), std::max({a,b,c}) - b);
164 return ( std::abs(dQ)/dQ ) * std::min( std::abs(dQ) , sigma*std::abs(dq_min) );
175#if defined(WARPX_DIM_3D)
177 ip = i - 1; jp = j; kp = k;
178 }
else if (comp == 1){
179 ip = i; jp = j - 1; kp = k;
180 }
else if (comp == 2){
181 ip = i; jp = j; kp = k - 1;
183#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
185 ip = i - 1; jp = j; kp = k;
186 }
else if (comp == 2){
187 ip = i; jp = j - 1; kp = k;
189#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
191 ip = i - 1; jp = j; kp = k;
193#elif defined(WARPX_DIM_1D_Z)
195 ip = i - 1; jp = j; kp = k;
205amrex::Real U_tilde0, amrex::Real U_tilde1, amrex::Real U_tilde2, amrex::Real U_tilde3,
206amrex::Real dU0x, amrex::Real dU1x, amrex::Real dU2x, amrex::Real dU3x,
int comp)
208 using namespace amrex::literals;
213 Um(i,j,k,0) = U_tilde0 + dU0x/2.0_rt;
214 Um(i,j,k,1) = U_tilde1 + dU1x/2.0_rt;
215 Um(i,j,k,2) = U_tilde2 + dU2x/2.0_rt;
216 Um(i,j,k,3) = U_tilde3 + dU3x/2.0_rt;
220 Up(ip,jp,kp,0) = U_tilde0 - dU0x/2.0_rt;
221 Up(ip,jp,kp,1) = U_tilde1 - dU1x/2.0_rt;
222 Up(ip,jp,kp,2) = U_tilde2 - dU2x/2.0_rt;
223 Up(ip,jp,kp,3) = U_tilde3 - dU3x/2.0_rt;
231 using namespace amrex::literals;
236 Um(i,j,k,0) = 0.0_rt;
237 Um(i,j,k,1) = 0.0_rt;
238 Um(i,j,k,2) = 0.0_rt;
239 Um(i,j,k,3) = 0.0_rt;
243 Up(ip,jp,kp,0) = 0.0_rt;
244 Up(ip,jp,kp,1) = 0.0_rt;
245 Up(ip,jp,kp,2) = 0.0_rt;
246 Up(ip,jp,kp,3) = 0.0_rt;
254int i,
int j,
int k,
amrex::Box box, amrex::Real Ux, amrex::Real Uy, amrex::Real Uz,
258 using namespace amrex::literals;
266 if ((U_edge_minus(i,j,k,0) < 0.0_rt) || (U_edge_plus(ip,jp,kp,0) < 0.0_rt)) {
267 U_edge_minus(i,j,k,0) = N_arr(i,j,k);
268 U_edge_minus(i,j,k,1) = Ux;
269 U_edge_minus(i,j,k,2) = Uy;
270 U_edge_minus(i,j,k,3) = Uz;
271 U_edge_plus(ip,jp,kp,0) = N_arr(i,j,k);
272 U_edge_plus(ip,jp,kp,1) = Ux;
273 U_edge_plus(ip,jp,kp,2) = Uy;
274 U_edge_plus(ip,jp,kp,3) = Uz;
277 if (U_edge_minus(i,j,k,0) < 0.0_rt) {
278 U_edge_minus(i,j,k,0) = N_arr(i,j,k);
279 U_edge_minus(i,j,k,1) = Ux;
280 U_edge_minus(i,j,k,2) = Uy;
281 U_edge_minus(i,j,k,3) = Uz;
284 if (U_edge_plus(ip,jp,kp,0) < 0.0_rt){
285 U_edge_plus(ip,jp,kp,0) = N_arr(i,j,k);
286 U_edge_plus(ip,jp,kp,1) = Ux;
287 U_edge_plus(ip,jp,kp,2) = Uy;
288 U_edge_plus(ip,jp,kp,3) = Uz;
297 using namespace amrex::literals;
299#if defined(WARPX_DIM_1D_Z)
303 return N(i,j,k) - N(i-1,j,k);
310 using namespace amrex::literals;
312#if defined(WARPX_DIM_1D_Z)
316 return N(i+1,j,k) - N(i,j,k);
323 using namespace amrex::literals;
325#if defined(WARPX_DIM_3D)
326 return N(i,j,k) - N(i,j-1,k);
336 using namespace amrex::literals;
338#if defined(WARPX_DIM_3D)
339 return N(i,j+1,k) - N(i,j,k);
349 using namespace amrex::literals;
351#if defined(WARPX_DIM_3D)
352 return N(i,j,k) - N(i,j,k-1);
353#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
354 return N(i,j,k) - N(i,j-1,k);
355#elif defined(WARPX_DIM_1D_Z)
356 return N(i,j,k) - N(i-1,j,k);
366 using namespace amrex::literals;
368#if defined(WARPX_DIM_3D)
369 return N(i,j,k+1) - N(i,j,k);
370#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
371 return N(i,j+1,k) - N(i,j,k);
372#elif defined(WARPX_DIM_1D_Z)
373 return N(i+1,j,k) - N(i,j,k);
386 using namespace amrex::literals;
388#if defined(WARPX_DIM_1D_Z)
394 if (N(i-1,j,k) > 0) { U_m = NU(i-1,j,k)/N(i-1,j,k); }
403 using namespace amrex::literals;
405#if defined(WARPX_DIM_1D_Z)
411 if (N(i+1,j,k) > 0) { U_p = NU(i+1,j,k)/N(i+1,j,k); }
421 using namespace amrex::literals;
423#if defined(WARPX_DIM_3D)
426 if (N(i,j-1,k) > 0) { U_m = NU(i,j-1,k)/N(i,j-1,k); }
438 using namespace amrex::literals;
440#if defined(WARPX_DIM_3D)
443 if (N(i,j+1,k) > 0) { U_p = NU(i,j+1,k)/N(i,j+1,k); }
456 using namespace amrex::literals;
458 amrex::Real U_m = 0_rt;
461#if defined(WARPX_DIM_3D)
462 if (N(i,j,k-1) > 0) { U_m = NU(i,j,k-1)/N(i,j,k-1); }
463#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
464 if (N(i,j-1,k) > 0) { U_m = NU(i,j-1,k)/N(i,j-1,k); }
465#elif defined(WARPX_DIM_1D_Z)
466 if (N(i-1,j,k) > 0) { U_m = NU(i-1,j,k)/N(i-1,j,k); }
480 using namespace amrex::literals;
485#if defined(WARPX_DIM_3D)
486 if (N(i,j,k+1) > 0) { U_p = NU(i,j,k+1)/N(i,j,k+1); }
487#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
488 if (N(i,j+1,k) > 0) { U_p = NU(i,j+1,k)/N(i,j+1,k); }
489#elif defined(WARPX_DIM_1D_Z)
490 if (N(i+1,j,k) > 0) { U_p = NU(i+1,j,k)/N(i+1,j,k); }
506 using namespace amrex::literals;
510 const amrex::Real V_L_minus =
V_calc(U_minus,ip,jp,kp,dir,clight);
511 const amrex::Real V_I_minus =
V_calc(U_minus,i,j,k,dir,clight);
512 const amrex::Real V_L_plus =
V_calc(U_plus,ip,jp,kp,dir,clight);
513 const amrex::Real V_I_plus =
V_calc(U_plus,i,j,k,dir,clight);
517 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);
518 }
else if (comp == 1){
519 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);
520 }
else if (comp == 2){
521 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);
523 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 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:383
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:252
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:503
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:204
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:347
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:400
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:334
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:37
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE std::tuple< int, int, int > plus_index_offsets(int i, int j, int k, int comp)
Definition MusclHancockUtils.H:168
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real minmod3(amrex::Real a, amrex::Real b, amrex::Real c)
Definition MusclHancockUtils.H:59
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ave_superbee(amrex::Real a, amrex::Real b)
Definition MusclHancockUtils.H:147
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:435
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ave(amrex::Real a, amrex::Real b)
Definition MusclHancockUtils.H:136
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:308
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real minmod(amrex::Real a, amrex::Real b)
Definition MusclHancockUtils.H:46
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:418
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:114
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ave_adjustable_diff(amrex::Real a, amrex::Real b)
Definition MusclHancockUtils.H:124
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:295
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:30
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:158
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:364
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real maxmod(amrex::Real a, amrex::Real b)
Definition MusclHancockUtils.H:72
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:104
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:85
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:321
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:228
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:94
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:477
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:21
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:453
__host__ __device__ bool contains(const IntVectND< dim > &p) const noexcept
__host__ __device__ void ignore_unused(const Ts &...)