ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_AdvectionSrcForScalars.H
Go to the documentation of this file.
1 #include <ERF_IndexDefines.H>
2 #include <ERF_Interpolation.H>
3 
4 /**
5  * Wrapper function for computing the advective tendency w/ spatial order > two
6  *
7  * @tparam InterpType_H horizontal interpolation type
8  * @tparam InterpType_V vertical interpolation type
9  * @param[in] bx cell-centered box over which scalar fluxes are computed
10  * @param[in] cons_index conserved scalar component to update
11  * @param[out] flx_arr flux arrays for the selected scalar component
12  * @param[in] cell_prim primitive scalar variables
13  * @param[in] avg_xmom x-component of time-averaged momentum
14  * @param[in] avg_ymom y-component of time-averaged momentum
15  * @param[in] avg_zmom z-component of time-averaged momentum
16  * @param[in] horiz_upw_frac horizontal upwind blending fraction
17  * @param[in] vert_upw_frac vertical upwind blending fraction
18  */
19 template<typename InterpType_H, typename InterpType_V>
20 void
21 AdvectionSrcForScalarsWrapper (const amrex::Box& bx,
22  const int& cons_index,
23  const amrex::GpuArray<const amrex::Array4<amrex::Real>, AMREX_SPACEDIM> flx_arr,
24  const amrex::Array4<const amrex::Real>& cell_prim,
25  const amrex::Array4<const amrex::Real>& avg_xmom,
26  const amrex::Array4<const amrex::Real>& avg_ymom,
27  const amrex::Array4<const amrex::Real>& avg_zmom,
28  const amrex::Real horiz_upw_frac,
29  const amrex::Real vert_upw_frac)
30 {
31  // Instantiate structs for vert/horiz interp
32  InterpType_H interp_prim_h(cell_prim, horiz_upw_frac);
33  InterpType_V interp_prim_v(cell_prim, vert_upw_frac);
34 
35  const amrex::Box xbx = amrex::surroundingNodes(bx,0);
36  const amrex::Box ybx = amrex::surroundingNodes(bx,1);
37  const amrex::Box zbx = amrex::surroundingNodes(bx,2);
38 
39  amrex::ParallelFor(xbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
40  {
41  const int prim_index = cons_index - 1;
42  amrex::Real interpx(zero);
43  interp_prim_h.InterpolateInX(i,j,k,prim_index,interpx,avg_xmom(i ,j ,k ));
44  (flx_arr[0])(i,j,k) = avg_xmom(i,j,k) * interpx;
45  });
46  amrex::ParallelFor(ybx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
47  {
48  const int prim_index = cons_index - 1;
49  amrex::Real interpy(zero);
50  interp_prim_h.InterpolateInY(i,j,k,prim_index,interpy,avg_ymom(i ,j ,k ));
51  (flx_arr[1])(i,j,k) = avg_ymom(i,j,k) * interpy;
52  });
53  amrex::ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
54  {
55  const int prim_index = cons_index - 1;
56  amrex::Real interpz(zero);
57  interp_prim_v.InterpolateInZ(i,j,k,prim_index,interpz,avg_zmom(i ,j ,k ));
58  (flx_arr[2])(i,j,k) = avg_zmom(i,j,k) * interpz;
59  });
60 }
61 
62 /**
63  * Wrapper function for templating the vertical advective tendency w/ spatial order > two
64  *
65  * @tparam InterpType_H horizontal interpolation type
66  * @param[in] bx cell-centered box over which scalar fluxes are computed
67  * @param[in] cons_index conserved scalar component to update
68  * @param[out] flx_arr flux arrays for the selected scalar component
69  * @param[in] cell_prim primitive scalar variables
70  * @param[in] avg_xmom x-component of time-averaged momentum
71  * @param[in] avg_ymom y-component of time-averaged momentum
72  * @param[in] avg_zmom z-component of time-averaged momentum
73  * @param[in] horiz_upw_frac horizontal upwind blending fraction
74  * @param[in] vert_upw_frac vertical upwind blending fraction
75  * @param[in] vert_adv_type vertical advection stencil
76  */
77 template<typename InterpType_H>
78 void
79 AdvectionSrcForScalarsVert (const amrex::Box& bx,
80  const int& cons_index,
81  const amrex::GpuArray<const amrex::Array4<amrex::Real>, AMREX_SPACEDIM> flx_arr,
82  const amrex::Array4<const amrex::Real>& cell_prim,
83  const amrex::Array4<const amrex::Real>& avg_xmom,
84  const amrex::Array4<const amrex::Real>& avg_ymom,
85  const amrex::Array4<const amrex::Real>& avg_zmom,
86  const amrex::Real horiz_upw_frac,
87  const amrex::Real vert_upw_frac,
88  const AdvType vert_adv_type)
89 {
90  switch(vert_adv_type) {
92  AdvectionSrcForScalarsWrapper<InterpType_H,CENTERED2>(bx, cons_index,
93  flx_arr, cell_prim,
94  avg_xmom, avg_ymom, avg_zmom,
95  horiz_upw_frac, vert_upw_frac);
96  break;
98  AdvectionSrcForScalarsWrapper<InterpType_H,UPWIND3>(bx, cons_index,
99  flx_arr, cell_prim,
100  avg_xmom, avg_ymom, avg_zmom,
101  horiz_upw_frac, vert_upw_frac);
102  break;
104  AdvectionSrcForScalarsWrapper<InterpType_H,UPWIND3SL>(bx, cons_index,
105  flx_arr, cell_prim,
106  avg_xmom, avg_ymom, avg_zmom,
107  horiz_upw_frac, vert_upw_frac);
108  break;
110  AdvectionSrcForScalarsWrapper<InterpType_H,CENTERED4>(bx, cons_index,
111  flx_arr, cell_prim,
112  avg_xmom, avg_ymom, avg_zmom,
113  horiz_upw_frac, vert_upw_frac);
114  break;
115  case AdvType::Upwind_5th:
116  AdvectionSrcForScalarsWrapper<InterpType_H,UPWIND5>(bx, cons_index,
117  flx_arr, cell_prim,
118  avg_xmom, avg_ymom, avg_zmom,
119  horiz_upw_frac, vert_upw_frac);
120  break;
122  AdvectionSrcForScalarsWrapper<InterpType_H,CENTERED6>(bx, cons_index,
123  flx_arr, cell_prim,
124  avg_xmom, avg_ymom, avg_zmom,
125  horiz_upw_frac, vert_upw_frac);
126  break;
127  default:
128  AMREX_ASSERT_WITH_MESSAGE(false, "Unknown vertical advection scheme!");
129  }
130 }
void AdvectionSrcForScalarsWrapper(const amrex::Box &bx, const int &cons_index, const amrex::GpuArray< const amrex::Array4< amrex::Real >, AMREX_SPACEDIM > flx_arr, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< const amrex::Real > &avg_xmom, const amrex::Array4< const amrex::Real > &avg_ymom, const amrex::Array4< const amrex::Real > &avg_zmom, const amrex::Real horiz_upw_frac, const amrex::Real vert_upw_frac)
Definition: ERF_AdvectionSrcForScalars.H:21
void AdvectionSrcForScalarsVert(const amrex::Box &bx, const int &cons_index, const amrex::GpuArray< const amrex::Array4< amrex::Real >, AMREX_SPACEDIM > flx_arr, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< const amrex::Real > &avg_xmom, const amrex::Array4< const amrex::Real > &avg_ymom, const amrex::Array4< const amrex::Real > &avg_zmom, const amrex::Real horiz_upw_frac, const amrex::Real vert_upw_frac, const AdvType vert_adv_type)
Definition: ERF_AdvectionSrcForScalars.H:79
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
AdvType
Definition: ERF_IndexDefines.H:261
@ Upwind_3rd_SL
@ Centered_4th
@ Centered_6th
@ Centered_2nd
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_ASSERT_WITH_MESSAGE(wbar_cutoff_min > wbar_cutoff_max, "ERROR: wbar_cutoff_min < wbar_cutoff_max")