ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
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 > 2.
6  */
7 template<typename InterpType_H, typename InterpType_V>
8 void
9 AdvectionSrcForScalarsWrapper (const amrex::Box& bx,
10  const int& cons_index,
11  const amrex::GpuArray<const amrex::Array4<amrex::Real>, AMREX_SPACEDIM> flx_arr,
12  const amrex::Array4<const amrex::Real>& cell_prim,
13  const amrex::Array4<const amrex::Real>& avg_xmom,
14  const amrex::Array4<const amrex::Real>& avg_ymom,
15  const amrex::Array4<const amrex::Real>& avg_zmom,
16  const amrex::Real horiz_upw_frac,
17  const amrex::Real vert_upw_frac)
18 {
19  // Instantiate structs for vert/horiz interp
20  InterpType_H interp_prim_h(cell_prim, horiz_upw_frac);
21  InterpType_V interp_prim_v(cell_prim, vert_upw_frac);
22 
23  const amrex::Box xbx = amrex::surroundingNodes(bx,0);
24  const amrex::Box ybx = amrex::surroundingNodes(bx,1);
25  const amrex::Box zbx = amrex::surroundingNodes(bx,2);
26 
27  amrex::ParallelFor(xbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
28  {
29  const int prim_index = cons_index - 1;
30  amrex::Real interpx(0.);
31  interp_prim_h.InterpolateInX(i,j,k,prim_index,interpx,avg_xmom(i ,j ,k ));
32  (flx_arr[0])(i,j,k) = avg_xmom(i,j,k) * interpx;
33  });
34  amrex::ParallelFor(ybx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
35  {
36  const int prim_index = cons_index - 1;
37  amrex::Real interpy(0.);
38  interp_prim_h.InterpolateInY(i,j,k,prim_index,interpy,avg_ymom(i ,j ,k ));
39 
40  (flx_arr[1])(i,j,k) = avg_ymom(i,j,k) * interpy;
41  });
42  amrex::ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
43  {
44  const int prim_index = cons_index - 1;
45  amrex::Real interpz(0.);
46  interp_prim_v.InterpolateInZ(i,j,k,prim_index,interpz,avg_zmom(i ,j ,k ));
47  (flx_arr[2])(i,j,k) = avg_zmom(i,j,k) * interpz;
48  });
49 }
50 
51 /**
52  * Wrapper function for templating the vertical advective tendency w/ spatial order > 2.
53  */
54 template<typename InterpType_H>
55 void
56 AdvectionSrcForScalarsVert (const amrex::Box& bx,
57  const int& cons_index,
58  const amrex::GpuArray<const amrex::Array4<amrex::Real>, AMREX_SPACEDIM> flx_arr,
59  const amrex::Array4<const amrex::Real>& cell_prim,
60  const amrex::Array4<const amrex::Real>& avg_xmom,
61  const amrex::Array4<const amrex::Real>& avg_ymom,
62  const amrex::Array4<const amrex::Real>& avg_zmom,
63  const amrex::Real horiz_upw_frac,
64  const amrex::Real vert_upw_frac,
65  const AdvType vert_adv_type)
66 {
67  switch(vert_adv_type) {
69  AdvectionSrcForScalarsWrapper<InterpType_H,CENTERED2>(bx, cons_index,
70  flx_arr, cell_prim,
71  avg_xmom, avg_ymom, avg_zmom,
72  horiz_upw_frac, vert_upw_frac);
73  break;
75  AdvectionSrcForScalarsWrapper<InterpType_H,UPWIND3>(bx, cons_index,
76  flx_arr, cell_prim,
77  avg_xmom, avg_ymom, avg_zmom,
78  horiz_upw_frac, vert_upw_frac);
79  break;
81  AdvectionSrcForScalarsWrapper<InterpType_H,CENTERED4>(bx, cons_index,
82  flx_arr, cell_prim,
83  avg_xmom, avg_ymom, avg_zmom,
84  horiz_upw_frac, vert_upw_frac);
85  break;
87  AdvectionSrcForScalarsWrapper<InterpType_H,UPWIND5>(bx, cons_index,
88  flx_arr, cell_prim,
89  avg_xmom, avg_ymom, avg_zmom,
90  horiz_upw_frac, vert_upw_frac);
91  break;
93  AdvectionSrcForScalarsWrapper<InterpType_H,CENTERED6>(bx, cons_index,
94  flx_arr, cell_prim,
95  avg_xmom, avg_ymom, avg_zmom,
96  horiz_upw_frac, vert_upw_frac);
97  break;
98  default:
99  AMREX_ASSERT_WITH_MESSAGE(false, "Unknown vertical advection scheme!");
100  }
101 }
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:9
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:56
const Box zbx
Definition: ERF_DiffSetup.H:23
const Box xbx
Definition: ERF_DiffSetup.H:21
const Box ybx
Definition: ERF_DiffSetup.H:22
AdvType
Definition: ERF_IndexDefines.H:221
@ Centered_4th
@ Centered_6th
@ Centered_2nd