ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ERF_NumericalDiffusion.cpp File Reference
Include dependency graph for ERF_NumericalDiffusion.cpp:

Functions

void NumericalDiffusion_Scal (const Box &bx, const int start_comp, const int num_comp, const Real dt, const Real num_diff_coeff, const Array4< const Real > &prim_data, const Array4< const Real > &cell_data, const Array4< Real > &rhs, const Array4< const Real > &mfx_arr, const Array4< const Real > &mfy_arr)
 
void NumericalDiffusion_Xmom (const Box &bx, const Real dt, const Real num_diff_coeff, const Array4< const Real > &prim_data, const Array4< const Real > &cell_data, const Array4< Real > &rhs, const Array4< const Real > &mfx_arr, const Array4< const Real > &mfy_arr)
 
void NumericalDiffusion_Ymom (const Box &bx, const Real dt, const Real num_diff_coeff, const Array4< const Real > &prim_data, const Array4< const Real > &cell_data, const Array4< Real > &rhs, const Array4< const Real > &mfx_arr, const Array4< const Real > &mfy_arr)
 

Function Documentation

◆ NumericalDiffusion_Scal()

void NumericalDiffusion_Scal ( const Box &  bx,
const int  start_comp,
const int  num_comp,
const Real  dt,
const Real  num_diff_coeff,
const Array4< const Real > &  prim_data,
const Array4< const Real > &  cell_data,
const Array4< Real > &  rhs,
const Array4< const Real > &  mfx_arr,
const Array4< const Real > &  mfy_arr 
)

Function to compute 6th order numerical diffusion RHS.

Parameters
[in]bxbox to loop over
[in]start_compstaring component index
[in]num_compnumber of total components
[in]num_diff_coeff
[in]prim_dataprimitive variables
[in]cell_datacell center variables
[out]rhsstore the right hand side
[in]mfmap factor
28 {
29  BL_PROFILE_VAR("NumericalDiffusion_Scal()",NumericalDiffusion_Scal);
30 
31  // Capture diffusion coeff
32  Real coeff6 = num_diff_coeff / (2.0 * dt);
33 
34  // Compute 5th order derivative and augment RHS
35  ParallelFor(bx, num_comp, [=] AMREX_GPU_DEVICE (int i, int j, int k, int m) noexcept
36  {
37  int n = start_comp + m; // conserved index
38  int nm1 = (n==0) ? 0 : n - 1; // prim index
39  Real rho_x_lo = (n==0) ? 1.0 : 0.5 * ( cell_data(i-1,j,k,Rho_comp) + cell_data(i ,j,k,Rho_comp) );
40  Real xflux_lo = rho_x_lo * calc_fifth_order_deriv(prim_data(i+2,j,k,nm1), prim_data(i+1,j,k,nm1),
41  prim_data(i ,j,k,nm1), prim_data(i-1,j,k,nm1),
42  prim_data(i-2,j,k,nm1), prim_data(i-3,j,k,nm1));
43  if ( (xflux_lo * (prim_data(i,j,k,nm1) - prim_data(i-1,j,k,nm1)) ) < 0.) xflux_lo = 0.;
44 
45 
46  Real rho_x_hi = (n==0) ? 1.0 : 0.5 * ( cell_data(i+1,j,k,Rho_comp) + cell_data(i ,j,k,Rho_comp) );
47  Real xflux_hi = rho_x_hi * calc_fifth_order_deriv(prim_data(i+3,j,k,nm1), prim_data(i+2,j,k,nm1),
48  prim_data(i+1,j,k,nm1), prim_data(i ,j,k,nm1),
49  prim_data(i-1,j,k,nm1), prim_data(i-2,j,k,nm1));
50  if ( (xflux_hi * (prim_data(i+1,j,k,nm1) - prim_data(i,j,k,nm1)) ) < 0.) xflux_hi = 0.;
51 
52 
53  Real rho_y_lo = (n==0) ? 1.0 : 0.5 * ( cell_data(i,j-1,k,Rho_comp) + cell_data(i,j ,k,Rho_comp) );
54  Real yflux_lo = rho_y_lo * calc_fifth_order_deriv(prim_data(i,j+2,k,nm1), prim_data(i,j+1,k,nm1),
55  prim_data(i,j ,k,nm1), prim_data(i,j-1,k,nm1),
56  prim_data(i,j-2,k,nm1), prim_data(i,j-3,k,nm1));
57  if ( (yflux_lo * (prim_data(i,j,k,nm1) - prim_data(i,j-1,k,nm1)) ) < 0.) yflux_lo = 0.;
58 
59 
60  Real rho_y_hi = (n==0) ? 1.0 : 0.5 * ( cell_data(i,j+1,k,Rho_comp) + cell_data(i,j ,k,Rho_comp) );
61  Real yflux_hi = rho_y_hi * calc_fifth_order_deriv(prim_data(i,j+3,k,nm1), prim_data(i,j+2,k,nm1),
62  prim_data(i,j+1,k,nm1), prim_data(i,j ,k,nm1),
63  prim_data(i,j-1,k,nm1), prim_data(i,j-2,k,nm1));
64  if ( (yflux_hi * (prim_data(i,j+1,k,nm1) - prim_data(i,j,k,nm1)) ) < 0.) yflux_hi = 0.;
65 
66 
67  rhs(i,j,k,n) += coeff6 * ( mfx_arr(i,j,0) * (xflux_hi - xflux_lo)
68  +mfy_arr(i,j,0) * (yflux_hi - yflux_lo) );
69  });
70 }
#define Rho_comp
Definition: ERF_IndexDefines.H:36
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_fifth_order_deriv(const amrex::Real &dnp2, const amrex::Real &dnp1, const amrex::Real &dn, const amrex::Real &dnm1, const amrex::Real &dnm2, const amrex::Real &dnm3)
Definition: ERF_NumericalDiffusion.H:11
void NumericalDiffusion_Scal(const Box &bx, const int start_comp, const int num_comp, const Real dt, const Real num_diff_coeff, const Array4< const Real > &prim_data, const Array4< const Real > &cell_data, const Array4< Real > &rhs, const Array4< const Real > &mfx_arr, const Array4< const Real > &mfy_arr)
Definition: ERF_NumericalDiffusion.cpp:18

Referenced by make_sources().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ NumericalDiffusion_Xmom()

void NumericalDiffusion_Xmom ( const Box &  bx,
const Real  dt,
const Real  num_diff_coeff,
const Array4< const Real > &  prim_data,
const Array4< const Real > &  cell_data,
const Array4< Real > &  rhs,
const Array4< const Real > &  mfx_arr,
const Array4< const Real > &  mfy_arr 
)

Function to compute 6th order numerical diffusion RHS.

Parameters
[in]bxbox to loop over
[in]start_compstaring component index
[in]num_compnumber of total components
[in]num_diff_coeff
[in]prim_dataprimitive variables
[in]cell_datacell center variables
[out]rhsstore the right hand side
[in]mfmap factor
93 {
94  BL_PROFILE_VAR("NumericalDiffusion_Xmom()",NumericalDiffusion_Xmom);
95 
96  // Capture diffusion coeff
97  Real coeff6 = num_diff_coeff / (2.0 * dt);
98 
99  // Compute 5th order derivative and augment RHS
100  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
101  {
102  Real rho_x_lo = cell_data(i-1,j,k,Rho_comp);
103  Real xflux_lo = rho_x_lo * calc_fifth_order_deriv(prim_data(i+2,j,k), prim_data(i+1,j,k),
104  prim_data(i ,j,k), prim_data(i-1,j,k),
105  prim_data(i-2,j,k), prim_data(i-3,j,k));
106  if ( (xflux_lo * (prim_data(i,j,k) - prim_data(i-1,j,k)) ) < 0.) xflux_lo = 0.;
107 
108 
109  Real rho_x_hi = cell_data(i ,j,k,Rho_comp);
110  Real xflux_hi = rho_x_hi * calc_fifth_order_deriv(prim_data(i+3,j,k), prim_data(i+2,j,k),
111  prim_data(i+1,j,k), prim_data(i ,j,k),
112  prim_data(i-1,j,k), prim_data(i-2,j,k));
113  if ( (xflux_hi * (prim_data(i+1,j,k) - prim_data(i,j,k)) ) < 0.) xflux_hi = 0.;
114 
115 
116  Real rho_y_lo = 0.25 * ( cell_data(i ,j ,k,Rho_comp) + cell_data(i-1,j ,k,Rho_comp)
117  + cell_data(i ,j-1,k,Rho_comp) + cell_data(i-1,j-1,k,Rho_comp) );
118  Real yflux_lo = rho_y_lo * calc_fifth_order_deriv(prim_data(i,j+2,k), prim_data(i,j+1,k),
119  prim_data(i,j ,k), prim_data(i,j-1,k),
120  prim_data(i,j-2,k), prim_data(i,j-3,k));
121  if ( (yflux_lo * (prim_data(i,j,k) - prim_data(i,j-1,k)) ) < 0.) yflux_lo = 0.;
122 
123 
124  Real rho_y_hi = 0.25 * ( cell_data(i ,j ,k,Rho_comp) + cell_data(i-1,j ,k,Rho_comp)
125  + cell_data(i ,j+1,k,Rho_comp) + cell_data(i-1,j+1,k,Rho_comp) );
126  Real yflux_hi = rho_y_hi * calc_fifth_order_deriv(prim_data(i,j+3,k), prim_data(i,j+2,k),
127  prim_data(i,j+1,k), prim_data(i,j ,k),
128  prim_data(i,j-1,k), prim_data(i,j-2,k));
129  if ( (yflux_hi * (prim_data(i,j+1,k) - prim_data(i,j,k)) ) < 0.) yflux_hi = 0.;
130 
131 
132  rhs(i,j,k,0) += coeff6 * ( mfx_arr(i,j,0) * (xflux_hi - xflux_lo)
133  +mfy_arr(i,j,0) * (yflux_hi - yflux_lo) );
134  });
135 }
void NumericalDiffusion_Xmom(const Box &bx, const Real dt, const Real num_diff_coeff, const Array4< const Real > &prim_data, const Array4< const Real > &cell_data, const Array4< Real > &rhs, const Array4< const Real > &mfx_arr, const Array4< const Real > &mfy_arr)
Definition: ERF_NumericalDiffusion.cpp:85

Referenced by make_mom_sources().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ NumericalDiffusion_Ymom()

void NumericalDiffusion_Ymom ( const Box &  bx,
const Real  dt,
const Real  num_diff_coeff,
const Array4< const Real > &  prim_data,
const Array4< const Real > &  cell_data,
const Array4< Real > &  rhs,
const Array4< const Real > &  mfx_arr,
const Array4< const Real > &  mfy_arr 
)

Function to compute 6th order numerical diffusion RHS.

Parameters
[in]bxbox to loop over
[in]start_compstaring component index
[in]num_compnumber of total components
[in]num_diff_coeff
[in]prim_dataprimitive variables
[in]cell_datacell center variables
[out]rhsstore the right hand side
[in]mfmap factor
159 {
160  BL_PROFILE_VAR("NumericalDiffusion_Ymom()",NumericalDiffusion_Ymom);
161 
162  // Capture diffusion coeff
163  Real coeff6 = num_diff_coeff / (2.0 * dt);
164 
165  // Compute 5th order derivative and augment RHS
166  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
167  {
168  Real rho_x_lo = 0.25 * ( cell_data(i ,j ,k,Rho_comp) + cell_data(i ,j-1,k,Rho_comp)
169  + cell_data(i-1,j ,k,Rho_comp) + cell_data(i-1,j-1,k,Rho_comp) );
170  Real xflux_lo = rho_x_lo * calc_fifth_order_deriv(prim_data(i+2,j,k), prim_data(i+1,j,k),
171  prim_data(i ,j,k), prim_data(i-1,j,k),
172  prim_data(i-2,j,k), prim_data(i-3,j,k));
173  if ( (xflux_lo * (prim_data(i,j,k) - prim_data(i-1,j,k)) ) < 0.) xflux_lo = 0.;
174 
175 
176  Real rho_x_hi = 0.25 * ( cell_data(i ,j ,k,Rho_comp) + cell_data(i ,j-1,k,Rho_comp)
177  + cell_data(i+1,j ,k,Rho_comp) + cell_data(i+1,j-1,k,Rho_comp) );
178  Real xflux_hi = rho_x_hi * calc_fifth_order_deriv(prim_data(i+3,j,k), prim_data(i+2,j,k),
179  prim_data(i+1,j,k), prim_data(i ,j,k),
180  prim_data(i-1,j,k), prim_data(i-2,j,k));
181  if ( (xflux_hi * (prim_data(i+1,j,k) - prim_data(i,j,k)) ) < 0.) xflux_hi = 0.;
182 
183 
184  Real rho_y_lo = cell_data(i,j-1,k,Rho_comp);
185  Real yflux_lo = rho_y_lo * calc_fifth_order_deriv(prim_data(i,j+2,k), prim_data(i,j+1,k),
186  prim_data(i,j ,k), prim_data(i,j-1,k),
187  prim_data(i,j-2,k), prim_data(i,j-3,k));
188  if ( (yflux_lo * (prim_data(i,j,k) - prim_data(i,j-1,k)) ) < 0.) yflux_lo = 0.;
189 
190 
191  Real rho_y_hi = cell_data(i,j ,k,Rho_comp);
192  Real yflux_hi = rho_y_hi * calc_fifth_order_deriv(prim_data(i,j+3,k), prim_data(i,j+2,k),
193  prim_data(i,j+1,k), prim_data(i,j ,k),
194  prim_data(i,j-1,k), prim_data(i,j-2,k));
195  if ( (yflux_hi * (prim_data(i,j ,k) - prim_data(i,j,k)) ) < 0.) yflux_hi = 0.;
196 
197 
198  rhs(i,j,k,0) += coeff6 * ( mfx_arr(i,j,0) * (xflux_hi - xflux_lo)
199  +mfy_arr(i,j,0) * (yflux_hi - yflux_lo) );
200  });
201 }
void NumericalDiffusion_Ymom(const Box &bx, const Real dt, const Real num_diff_coeff, const Array4< const Real > &prim_data, const Array4< const Real > &cell_data, const Array4< Real > &rhs, const Array4< const Real > &mfx_arr, const Array4< const Real > &mfy_arr)
Definition: ERF_NumericalDiffusion.cpp:151

Referenced by make_mom_sources().

Here is the call graph for this function:
Here is the caller graph for this function: