7#ifndef WARPX_MusclHancock_H_
8#define WARPX_MusclHancock_H_
19amrex::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;
28amrex::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 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));
40 return U(i,j,k,comp+1)/gamma;
44amrex::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);
57amrex::Real
minmod3 (amrex::Real a, amrex::Real b , amrex::Real c)
59 using namespace amrex::literals;
60 if (a > 0.0_rt && b > 0.0_rt && c > 0.0_rt) {
61 return std::min({a,b,c});
62 }
else if (a < 0.0_rt && b < 0.0_rt && c < 0.0_rt) {
63 return std::max({a,b,c});
70amrex::Real
maxmod (amrex::Real a, amrex::Real b)
72 using namespace amrex::literals;
73 if (a > 0.0_rt && b > 0.0_rt) {
74 return std::max(a, b);
75 }
else if (a < 0.0_rt && b < 0.0_rt) {
76 return std::min(a, b);
84int i,
int j,
int k, amrex::Real Vm, amrex::Real Vp)
86 using namespace amrex::literals;
87 const amrex::Real c = std::max( std::abs(Vm) , std::abs(Vp) );
88 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));
93int i,
int j,
int k, amrex::Real Vm, amrex::Real Vp)
95 using namespace amrex::literals;
96 const amrex::Real c = std::max( std::abs(Vm) , std::abs(Vp) );
97 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))
98 - (0.5_rt*c)*(Up(i,j,k,0)*Up(i,j,k,1) - Um(i,j,k,0)*Um(i,j,k,1));
103int i,
int j,
int k, amrex::Real Vm, amrex::Real Vp)
105 using namespace amrex::literals;
106 const amrex::Real c = std::max( std::abs(Vm) , std::abs(Vp) );
107 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))
108 - (0.5_rt*c)*(Up(i,j,k,0)*Up(i,j,k,2) - Um(i,j,k,0)*Um(i,j,k,2));
113int i,
int j,
int k, amrex::Real Vm, amrex::Real Vp)
115 using namespace amrex::literals;
116 const amrex::Real c = std::max( std::abs(Vm) , std::abs(Vp) );
117 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))
118 - (0.5_rt*c)*(Up(i,j,k,0)*Up(i,j,k,3) - Um(i,j,k,0)*Um(i,j,k,3));
124 using namespace amrex::literals;
125 constexpr auto sigma =
static_cast<amrex::Real
>(2.0*0.732050807568877);
127 return minmod3( (a+b)/2.0_rt, sigma*a, sigma*b );
134amrex::Real
ave (amrex::Real a, amrex::Real b)
136 using namespace amrex::literals;
138 return minmod3( (a+b)/2.0_rt, 2.0_rt*a, 2.0_rt*b );
147 using namespace amrex::literals;
156amrex::Real
ave_stage2 (amrex::Real dQ, amrex::Real a, amrex::Real b, amrex::Real c)
158 using namespace amrex::literals;
160 constexpr auto sigma = 0.732050807568877_rt;
161 const amrex::Real dq_min = 2.0_rt*std::min( b - std::min({a,b,c}), std::max({a,b,c}) - b);
162 return ( std::abs(dQ)/dQ ) * std::min( std::abs(dQ) , sigma*std::abs(dq_min) );
168 using namespace amrex::literals;
170#if defined(WARPX_DIM_3D)
172 ip = i - 1; jp = j; kp = k;
173 }
else if (comp == 1){
174 ip = i; jp = j - 1; kp = k;
175 }
else if (comp == 2){
176 ip = i; jp = j; kp = k - 1;
178#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
180 ip = i - 1; jp = j; kp = k;
181 }
else if (comp == 2){
182 ip = i; jp = j - 1; kp = k;
184#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
186 ip = i - 1; jp = j; kp = k;
188#elif defined(WARPX_DIM_1D_Z)
190 ip = i - 1; jp = j; kp = k;
197amrex::Real U_tilde0, amrex::Real U_tilde1, amrex::Real U_tilde2, amrex::Real U_tilde3,
198amrex::Real dU0x, amrex::Real dU1x, amrex::Real dU2x, amrex::Real dU3x,
int comp)
200 using namespace amrex::literals;
206 Um(i,j,k,0) = U_tilde0 + dU0x/2.0_rt;
207 Um(i,j,k,1) = U_tilde1 + dU1x/2.0_rt;
208 Um(i,j,k,2) = U_tilde2 + dU2x/2.0_rt;
209 Um(i,j,k,3) = U_tilde3 + dU3x/2.0_rt;
213 Up(ip,jp,kp,0) = U_tilde0 - dU0x/2.0_rt;
214 Up(ip,jp,kp,1) = U_tilde1 - dU1x/2.0_rt;
215 Up(ip,jp,kp,2) = U_tilde2 - dU2x/2.0_rt;
216 Up(ip,jp,kp,3) = U_tilde3 - dU3x/2.0_rt;
224 using namespace amrex::literals;
230 Um(i,j,k,0) = 0.0_rt;
231 Um(i,j,k,1) = 0.0_rt;
232 Um(i,j,k,2) = 0.0_rt;
233 Um(i,j,k,3) = 0.0_rt;
237 Up(ip,jp,kp,0) = 0.0_rt;
238 Up(ip,jp,kp,1) = 0.0_rt;
239 Up(ip,jp,kp,2) = 0.0_rt;
240 Up(ip,jp,kp,3) = 0.0_rt;
248int i,
int j,
int k,
amrex::Box box, amrex::Real Ux, amrex::Real Uy, amrex::Real Uz,
252 using namespace amrex::literals;
261 if ((U_edge_minus(i,j,k,0) < 0.0_rt) || (U_edge_plus(ip,jp,kp,0) < 0.0_rt)) {
262 U_edge_minus(i,j,k,0) = N_arr(i,j,k);
263 U_edge_minus(i,j,k,1) = Ux;
264 U_edge_minus(i,j,k,2) = Uy;
265 U_edge_minus(i,j,k,3) = Uz;
266 U_edge_plus(ip,jp,kp,0) = N_arr(i,j,k);
267 U_edge_plus(ip,jp,kp,1) = Ux;
268 U_edge_plus(ip,jp,kp,2) = Uy;
269 U_edge_plus(ip,jp,kp,3) = Uz;
272 if (U_edge_minus(i,j,k,0) < 0.0_rt) {
273 U_edge_minus(i,j,k,0) = N_arr(i,j,k);
274 U_edge_minus(i,j,k,1) = Ux;
275 U_edge_minus(i,j,k,2) = Uy;
276 U_edge_minus(i,j,k,3) = Uz;
279 if (U_edge_plus(ip,jp,kp,0) < 0.0_rt){
280 U_edge_plus(ip,jp,kp,0) = N_arr(i,j,k);
281 U_edge_plus(ip,jp,kp,1) = Ux;
282 U_edge_plus(ip,jp,kp,2) = Uy;
283 U_edge_plus(ip,jp,kp,3) = Uz;
292 using namespace amrex::literals;
294#if defined(WARPX_DIM_1D_Z)
298 return N(i,j,k) - N(i-1,j,k);
305 using namespace amrex::literals;
307#if defined(WARPX_DIM_1D_Z)
311 return N(i+1,j,k) - N(i,j,k);
318 using namespace amrex::literals;
320#if defined(WARPX_DIM_3D)
321 return N(i,j,k) - N(i,j-1,k);
331 using namespace amrex::literals;
333#if defined(WARPX_DIM_3D)
334 return N(i,j+1,k) - N(i,j,k);
344 using namespace amrex::literals;
346#if defined(WARPX_DIM_3D)
347 return N(i,j,k) - N(i,j,k-1);
348#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
349 return N(i,j,k) - N(i,j-1,k);
350#elif defined(WARPX_DIM_1D_Z)
351 return N(i,j,k) - N(i-1,j,k);
361 using namespace amrex::literals;
363#if defined(WARPX_DIM_3D)
364 return N(i,j,k+1) - N(i,j,k);
365#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
366 return N(i,j+1,k) - N(i,j,k);
367#elif defined(WARPX_DIM_1D_Z)
368 return N(i+1,j,k) - N(i,j,k);
381 using namespace amrex::literals;
383#if defined(WARPX_DIM_1D_Z)
389 if (N(i-1,j,k) > 0) { U_m = NU(i-1,j,k)/N(i-1,j,k); }
398 using namespace amrex::literals;
400#if defined(WARPX_DIM_1D_Z)
406 if (N(i+1,j,k) > 0) { U_p = NU(i+1,j,k)/N(i+1,j,k); }
416 using namespace amrex::literals;
418#if defined(WARPX_DIM_3D)
421 if (N(i,j-1,k) > 0) { U_m = NU(i,j-1,k)/N(i,j-1,k); }
433 using namespace amrex::literals;
435#if defined(WARPX_DIM_3D)
438 if (N(i,j+1,k) > 0) { U_p = NU(i,j+1,k)/N(i,j+1,k); }
451 using namespace amrex::literals;
453 amrex::Real U_m = 0_rt;
456#if defined(WARPX_DIM_3D)
457 if (N(i,j,k-1) > 0) { U_m = NU(i,j,k-1)/N(i,j,k-1); }
458#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
459 if (N(i,j-1,k) > 0) { U_m = NU(i,j-1,k)/N(i,j-1,k); }
460#elif defined(WARPX_DIM_1D_Z)
461 if (N(i-1,j,k) > 0) { U_m = NU(i-1,j,k)/N(i-1,j,k); }
475 using namespace amrex::literals;
480#if defined(WARPX_DIM_3D)
481 if (N(i,j,k+1) > 0) { U_p = NU(i,j,k+1)/N(i,j,k+1); }
482#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_XZ)
483 if (N(i,j+1,k) > 0) { U_p = NU(i,j+1,k)/N(i,j+1,k); }
484#elif defined(WARPX_DIM_1D_Z)
485 if (N(i+1,j,k) > 0) { U_p = NU(i+1,j,k)/N(i+1,j,k); }
501 using namespace amrex::literals;
506 const amrex::Real V_L_minus =
V_calc(U_minus,ip,jp,kp,dir,clight);
507 const amrex::Real V_I_minus =
V_calc(U_minus,i,j,k,dir,clight);
508 const amrex::Real V_L_plus =
V_calc(U_plus,ip,jp,kp,dir,clight);
509 const amrex::Real V_I_plus =
V_calc(U_plus,i,j,k,dir,clight);
513 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);
514 }
else if (comp == 1){
515 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);
516 }
else if (comp == 2){
517 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);
519 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:378
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:246
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:498
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:196
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:342
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:395
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:329
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:57
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ave_superbee(amrex::Real a, amrex::Real b)
Definition MusclHancockUtils.H:145
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:430
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ave(amrex::Real a, amrex::Real b)
Definition MusclHancockUtils.H:134
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:303
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:166
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:413
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:112
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ave_adjustable_diff(amrex::Real a, amrex::Real b)
Definition MusclHancockUtils.H:122
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:290
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:156
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:359
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real maxmod(amrex::Real a, amrex::Real b)
Definition MusclHancockUtils.H:70
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:102
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:83
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:316
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:221
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:92
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:472
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:448
__host__ __device__ bool contains(const IntVectND< dim > &p) const noexcept
__host__ __device__ void ignore_unused(const Ts &...)