ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_AdvectionSrcForMom_TF.cpp File Reference
#include "AMReX_BCRec.H"
#include <ERF_Advection.H>
#include <ERF_AdvectionSrcForMom_N.H>
#include <ERF_AdvectionSrcForMom_T.H>
Include dependency graph for ERF_AdvectionSrcForMom_TF.cpp:

Functions

void AdvectionSrcForMom_TF (const Box &bxx, const Box &bxy, const Box &bxz, const Array4< Real > &rho_u_rhs, const Array4< Real > &rho_v_rhs, const Array4< Real > &rho_w_rhs, const Array4< const Real > &u, const Array4< const Real > &v, const Array4< const Real > &w, const Array4< const Real > &rho_u, const Array4< const Real > &rho_v, const Array4< const Real > &Omega, const Array4< const Real > &z_nd, const Array4< const Real > &ax, const Array4< const Real > &ay, const Array4< const Real > &az, const Array4< const Real > &detJ, const GpuArray< Real, AMREX_SPACEDIM > &cellSizeInv, const Array4< const Real > &mf_mx, const Array4< const Real > &mf_ux, const Array4< const Real > &mf_vx, const Array4< const Real > &mf_my, const Array4< const Real > &mf_uy, const Array4< const Real > &mf_vy, const AdvType horiz_adv_type, const AdvType vert_adv_type, const Real horiz_upw_frac, const Real vert_upw_frac, const int lo_z_face, const int hi_z_face)
 

Function Documentation

◆ AdvectionSrcForMom_TF()

void AdvectionSrcForMom_TF ( const Box &  bxx,
const Box &  bxy,
const Box &  bxz,
const Array4< Real > &  rho_u_rhs,
const Array4< Real > &  rho_v_rhs,
const Array4< Real > &  rho_w_rhs,
const Array4< const Real > &  u,
const Array4< const Real > &  v,
const Array4< const Real > &  w,
const Array4< const Real > &  rho_u,
const Array4< const Real > &  rho_v,
const Array4< const Real > &  Omega,
const Array4< const Real > &  z_nd,
const Array4< const Real > &  ax,
const Array4< const Real > &  ay,
const Array4< const Real > &  az,
const Array4< const Real > &  detJ,
const GpuArray< Real, AMREX_SPACEDIM > &  cellSizeInv,
const Array4< const Real > &  mf_mx,
const Array4< const Real > &  mf_ux,
const Array4< const Real > &  mf_vx,
const Array4< const Real > &  mf_my,
const Array4< const Real > &  mf_uy,
const Array4< const Real > &  mf_vy,
const AdvType  horiz_adv_type,
const AdvType  vert_adv_type,
const Real  horiz_upw_frac,
const Real  vert_upw_frac,
const int  lo_z_face,
const int  hi_z_face 
)

Function for computing the advective tendency for the momentum equations ONLY when using terrain-fitted coordinates

Parameters
[in]bxxbox over which the x-momentum is updated
[in]bxybox over which the y-momentum is updated
[in]bxzbox over which the z-momentum is updated
[out]rho_u_rhstendency for the x-momentum equation
[out]rho_v_rhstendency for the y-momentum equation
[out]rho_w_rhstendency for the z-momentum equation
[in]ux-component of the velocity
[in]vy-component of the velocity
[in]wz-component of the velocity
[in]rho_ux-component of the momentum
[in]rho_vy-component of the momentum
[in]Omegacomponent of the momentum normal to the z-coordinate surface
[in]z_ndheight coordinate at nodes
[in]axArea fraction of x-faces
[in]ayArea fraction of y-faces
[in]azArea fraction of z-faces
[in]detJJacobian of the metric transformation
[in]cellSizeInvinverse of the grid spacing
[in]mf_mxx map factor at cell centers
[in]mf_uxx map factor at x-faces
[in]mf_vxx map factor at y-faces
[in]mf_myy map factor at cell centers
[in]mf_uyy map factor at x-faces
[in]mf_vyy map factor at y-faces
[in]horiz_adv_typesets the spatial order to be used for lateral derivatives
[in]vert_adv_typesets the spatial order to be used for vertical derivatives
[in]horiz_upw_frachorizontal upwind blending fraction
[in]vert_upw_fracvertical upwind blending fraction
[in]lo_z_faceminimum z-face k-index at this level
[in]hi_z_facemaximum z-face k-index at this level
72 {
73  BL_PROFILE_VAR("AdvectionSrcForMom_TF", AdvectionSrcForMom_TF);
74 
75  AMREX_ALWAYS_ASSERT(bxz.smallEnd(2) > 0);
76 
77  auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
78 
79  // Compute mapfactor inverses
80  Box box2d_u(bxx); box2d_u.setRange(2,0); box2d_u.grow({3,3,0});
81  Box box2d_v(bxy); box2d_v.setRange(2,0); box2d_v.grow({3,3,0});
82 
83  FArrayBox mf_ux_invFAB(box2d_u,1,The_Async_Arena());
84  FArrayBox mf_uy_invFAB(box2d_u,1,The_Async_Arena());
85  const Array4<Real>& mf_ux_inv = mf_ux_invFAB.array();
86  const Array4<Real>& mf_uy_inv = mf_uy_invFAB.array();
87 
88  FArrayBox mf_vx_invFAB(box2d_v,1,The_Async_Arena());
89  FArrayBox mf_vy_invFAB(box2d_v,1,The_Async_Arena());
90  const Array4<Real>& mf_vx_inv = mf_vx_invFAB.array();
91  const Array4<Real>& mf_vy_inv = mf_vy_invFAB.array();
92 
93  ParallelFor(box2d_u, box2d_v,
94  [=] AMREX_GPU_DEVICE (int i, int j, int) noexcept
95  {
96  mf_ux_inv(i,j,0) = one / mf_ux(i,j,0);
97  mf_uy_inv(i,j,0) = one / mf_uy(i,j,0);
98  },
99  [=] AMREX_GPU_DEVICE (int i, int j, int) noexcept
100  {
101  mf_vx_inv(i,j,0) = one / mf_vx(i,j,0);
102  mf_vy_inv(i,j,0) = one / mf_vy(i,j,0);
103  });
104 
105  // Inline with 2nd order for efficiency
106  if (horiz_adv_type == AdvType::Centered_2nd && vert_adv_type == AdvType::Centered_2nd)
107  {
108  ParallelFor(bxx, bxy, bxz,
109  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
110  {
111  Real xflux_hi = fourth * (rho_u(i,j,k) * mf_uy_inv(i,j,0) + rho_u(i+1,j,k) * mf_uy_inv(i+1,j,0)) *
112  (u(i+1,j,k) + u(i,j,k)) * myhalf * (ax(i,j,k) + ax(i+1,j,k));
113 
114  Real xflux_lo = fourth * (rho_u(i,j,k) * mf_uy_inv(i,j,0) + rho_u(i-1,j,k) * mf_uy_inv(i-1,j,0)) *
115  (u(i-1,j,k) + u(i,j,k)) * myhalf * (ax(i,j,k) + ax(i-1,j,k));
116 
117  Real met_h_zeta_yhi = Compute_h_zeta_AtEdgeCenterK(i,j+1,k,cellSizeInv,z_nd);
118  Real yflux_hi = fourth * (rho_v(i,j+1,k)*mf_vx_inv(i,j+1,0) + rho_v(i-1,j+1,k)*mf_vx_inv(i-1,j+1,0)) *
119  (u(i,j+1,k) + u(i,j,k)) * met_h_zeta_yhi;
120 
121  Real met_h_zeta_ylo = Compute_h_zeta_AtEdgeCenterK(i,j ,k,cellSizeInv,z_nd);
122  Real yflux_lo = fourth * (rho_v(i,j ,k)*mf_vx_inv(i,j ,0) + rho_v(i-1,j ,k)*mf_vx_inv(i-1,j ,0)) *
123  (u(i,j-1,k) + u(i,j,k)) * met_h_zeta_ylo;
124 
125  Real zflux_hi = fourth * (Omega(i,j,k+1) + Omega(i-1,j,k+1)) * (u(i,j,k+1) + u(i,j,k)) *
126  myhalf * (az(i,j,k+1) + az(i-1,j,k+1));
127  Real zflux_lo = fourth * (Omega(i,j,k ) + Omega(i-1,j,k )) * (u(i,j,k-1) + u(i,j,k)) *
128  myhalf * (az(i,j,k ) + az(i-1,j,k ));
129 
130  Real mfsq = mf_ux(i,j,0) * mf_uy(i,j,0);
131 
132  Real advectionSrc = (xflux_hi - xflux_lo) * dxInv * mfsq
133  + (yflux_hi - yflux_lo) * dyInv * mfsq
134  + (zflux_hi - zflux_lo) * dzInv;
135  rho_u_rhs(i, j, k) = -advectionSrc / (myhalf * (detJ(i,j,k) + detJ(i-1,j,k)));
136  },
137  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
138  {
139 
140  Real met_h_zeta_xhi = Compute_h_zeta_AtEdgeCenterK(i+1,j,k,cellSizeInv,z_nd);
141  Real xflux_hi = fourth * (rho_u(i+1,j,k)*mf_uy_inv(i+1,j,0) + rho_u(i+1,j-1,k)*mf_uy_inv(i+1,j-1,0)) *
142  (v(i+1,j,k) + v(i,j,k)) * met_h_zeta_xhi;
143 
144  Real met_h_zeta_xlo = Compute_h_zeta_AtEdgeCenterK(i ,j,k,cellSizeInv,z_nd);
145  Real xflux_lo = fourth * (rho_u(i, j, k)*mf_uy_inv(i ,j,0) + rho_u(i ,j-1,k)*mf_uy_inv(i ,j-1,0)) *
146  (v(i-1,j,k) + v(i,j,k)) * met_h_zeta_xlo;
147 
148  Real yflux_hi = fourth * (rho_v(i,j+1,k)*mf_vx_inv(i,j+1,0) + rho_v(i,j ,k) * mf_vx_inv(i,j ,0)) *
149  (v(i,j+1,k) + v(i,j,k)) * myhalf * (ay(i,j,k) + ay(i,j+1,k));
150 
151  Real yflux_lo = fourth * (rho_v(i,j ,k)*mf_vx_inv(i,j ,0) + rho_v(i,j-1,k) * mf_vx_inv(i,j-1,0)) *
152  (v(i,j-1,k) + v(i,j,k)) * myhalf * (ay(i,j,k) + ay(i,j-1,k));
153 
154  Real zflux_hi = fourth * (Omega(i,j,k+1) + Omega(i, j-1, k+1)) * (v(i,j,k+1) + v(i,j,k)) *
155  myhalf * (az(i,j,k+1) + az(i,j-1,k+1));
156  Real zflux_lo = fourth * (Omega(i,j,k ) + Omega(i, j-1, k )) * (v(i,j,k-1) + v(i,j,k)) *
157  myhalf * (az(i,j,k ) + az(i,j-1,k ));
158 
159  Real mfsq = mf_vx(i,j,0) * mf_vy(i,j,0);
160 
161  Real advectionSrc = (xflux_hi - xflux_lo) * dxInv * mfsq
162  + (yflux_hi - yflux_lo) * dyInv * mfsq
163  + (zflux_hi - zflux_lo) * dzInv;
164  rho_v_rhs(i, j, k) = -advectionSrc / (myhalf * (detJ(i,j,k) + detJ(i,j-1,k)));
165  },
166  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
167  {
168  Real met_h_zeta_xhi = Compute_h_zeta_AtEdgeCenterJ(i+1,j ,k ,cellSizeInv,z_nd);
169  Real xflux_hi = fourth*(rho_u(i+1,j ,k) + rho_u(i+1,j,k-1)) * mf_uy_inv(i+1,j,0) *
170  (w(i+1,j,k) + w(i,j,k)) * met_h_zeta_xhi;
171 
172  Real met_h_zeta_xlo = Compute_h_zeta_AtEdgeCenterJ(i ,j ,k ,cellSizeInv,z_nd);
173  Real xflux_lo = fourth*(rho_u(i ,j ,k) + rho_u(i ,j,k-1)) * mf_uy_inv(i ,j,0) *
174  (w(i-1,j,k) + w(i,j,k)) * met_h_zeta_xlo;
175 
176  Real met_h_zeta_yhi = Compute_h_zeta_AtEdgeCenterI(i ,j+1,k ,cellSizeInv,z_nd);
177  Real yflux_hi = fourth*(rho_v(i,j+1,k) + rho_v(i,j+1,k-1)) * mf_vx_inv(i,j+1,0) *
178  (w(i,j+1,k) + w(i,j,k)) * met_h_zeta_yhi;
179 
180  Real met_h_zeta_ylo = Compute_h_zeta_AtEdgeCenterI(i ,j ,k ,cellSizeInv,z_nd);
181  Real yflux_lo = fourth*(rho_v(i,j ,k) + rho_v(i,j ,k-1)) * mf_vx_inv(i,j ,0) *
182  (w(i,j-1,k) + w(i,j,k)) * met_h_zeta_ylo;
183 
184  Real zflux_lo = fourth * (Omega(i,j,k) + Omega(i,j,k-1)) * (w(i,j,k) + w(i,j,k-1));
185 
186  Real zflux_hi = (k == hi_z_face) ? Omega(i,j,k) * w(i,j,k) * az(i,j,k):
187  fourth * (Omega(i,j,k) + Omega(i,j,k+1)) * (w(i,j,k) + w(i,j,k+1)) *
188  myhalf * (az(i,j,k) + az(i,j,k+1));
189 
190  Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
191 
192  Real advectionSrc = (xflux_hi - xflux_lo) * dxInv * mfsq
193  + (yflux_hi - yflux_lo) * dyInv * mfsq
194  + (zflux_hi - zflux_lo) * dzInv;
195  rho_w_rhs(i, j, k) = -advectionSrc / (myhalf*(detJ(i,j,k) + detJ(i,j,k-1)));
196  });
197 
198  // Template higher order methods
199  } else {
200  if (horiz_adv_type == AdvType::Centered_2nd) {
201  AdvectionSrcForMomVert<CENTERED2>(bxx, bxy, bxz,
202  rho_u_rhs, rho_v_rhs, rho_w_rhs,
203  rho_u, rho_v, Omega, u, v, w,
204  z_nd, ax, ay, az, detJ, cellSizeInv,
205  mf_mx, mf_ux_inv, mf_vx_inv,
206  mf_my, mf_uy_inv, mf_vy_inv,
207  horiz_upw_frac, vert_upw_frac,
208  vert_adv_type, lo_z_face, hi_z_face);
209  } else if (horiz_adv_type == AdvType::Upwind_3rd) {
210  AdvectionSrcForMomVert<UPWIND3>(bxx, bxy, bxz,
211  rho_u_rhs, rho_v_rhs, rho_w_rhs,
212  rho_u, rho_v, Omega, u, v, w,
213  z_nd, ax, ay, az, detJ, cellSizeInv,
214  mf_mx, mf_ux_inv, mf_vx_inv,
215  mf_my, mf_uy_inv, mf_vy_inv,
216  horiz_upw_frac, vert_upw_frac,
217  vert_adv_type, lo_z_face, hi_z_face);
218  } else if (horiz_adv_type == AdvType::Centered_4th) {
219  AdvectionSrcForMomVert<CENTERED4>(bxx, bxy, bxz,
220  rho_u_rhs, rho_v_rhs, rho_w_rhs,
221  rho_u, rho_v, Omega, u, v, w,
222  z_nd, ax, ay, az, detJ, cellSizeInv,
223  mf_mx, mf_ux_inv, mf_vx_inv,
224  mf_my, mf_uy_inv, mf_vy_inv,
225  horiz_upw_frac, vert_upw_frac,
226  vert_adv_type, lo_z_face, hi_z_face);
227  } else if (horiz_adv_type == AdvType::Upwind_5th) {
228  AdvectionSrcForMomVert<UPWIND5>(bxx, bxy, bxz,
229  rho_u_rhs, rho_v_rhs, rho_w_rhs,
230  rho_u, rho_v, Omega, u, v, w,
231  z_nd, ax, ay, az, detJ, cellSizeInv,
232  mf_mx, mf_ux_inv, mf_vx_inv,
233  mf_my, mf_uy_inv, mf_vy_inv,
234  horiz_upw_frac, vert_upw_frac,
235  vert_adv_type, lo_z_face, hi_z_face);
236  } else if (horiz_adv_type == AdvType::Centered_6th) {
237  AdvectionSrcForMomVert<CENTERED6>(bxx, bxy, bxz,
238  rho_u_rhs, rho_v_rhs, rho_w_rhs,
239  rho_u, rho_v, Omega, u, v, w,
240  z_nd, ax, ay, az, detJ, cellSizeInv,
241  mf_mx, mf_ux_inv, mf_vx_inv,
242  mf_my, mf_uy_inv, mf_vy_inv,
243  horiz_upw_frac, vert_upw_frac,
244  vert_adv_type, lo_z_face, hi_z_face);
245  } else if (horiz_adv_type == AdvType::Weno_3) {
246  AdvectionSrcForMomVert<WENO3>(bxx, bxy, bxz,
247  rho_u_rhs, rho_v_rhs, rho_w_rhs,
248  rho_u, rho_v, Omega, u, v, w,
249  z_nd, ax, ay, az, detJ, cellSizeInv,
250  mf_mx, mf_ux_inv, mf_vx_inv,
251  mf_my, mf_uy_inv, mf_vy_inv,
252  horiz_upw_frac, vert_upw_frac,
253  vert_adv_type, lo_z_face, hi_z_face);
254  } else if (horiz_adv_type == AdvType::Weno_3Z) {
255  AdvectionSrcForMomVert<WENO_Z3>(bxx, bxy, bxz,
256  rho_u_rhs, rho_v_rhs, rho_w_rhs,
257  rho_u, rho_v, Omega, u, v, w,
258  z_nd, ax, ay, az, detJ, cellSizeInv,
259  mf_mx, mf_ux_inv, mf_vx_inv,
260  mf_my, mf_uy_inv, mf_vy_inv,
261  horiz_upw_frac, vert_upw_frac,
262  vert_adv_type, lo_z_face, hi_z_face);
263  } else if (horiz_adv_type == AdvType::Weno_3MZQ) {
264  AdvectionSrcForMomVert<WENO_MZQ3>(bxx, bxy, bxz,
265  rho_u_rhs, rho_v_rhs, rho_w_rhs,
266  rho_u, rho_v, Omega, u, v, w,
267  z_nd, ax, ay, az, detJ, cellSizeInv,
268  mf_mx, mf_ux_inv, mf_vx_inv,
269  mf_my, mf_uy_inv, mf_vy_inv,
270  horiz_upw_frac, vert_upw_frac,
271  vert_adv_type, lo_z_face, hi_z_face);
272  } else if (horiz_adv_type == AdvType::Weno_5) {
273  AdvectionSrcForMomVert<WENO5>(bxx, bxy, bxz,
274  rho_u_rhs, rho_v_rhs, rho_w_rhs,
275  rho_u, rho_v, Omega, u, v, w,
276  z_nd, ax, ay, az, detJ, cellSizeInv,
277  mf_mx, mf_ux_inv, mf_vx_inv,
278  mf_my, mf_uy_inv, mf_vy_inv,
279  horiz_upw_frac, vert_upw_frac,
280  vert_adv_type, lo_z_face, hi_z_face);
281  } else if (horiz_adv_type == AdvType::Weno_5Z) {
282  AdvectionSrcForMomVert<WENO_Z5>(bxx, bxy, bxz,
283  rho_u_rhs, rho_v_rhs, rho_w_rhs,
284  rho_u, rho_v, Omega, u, v, w,
285  z_nd, ax, ay, az, detJ, cellSizeInv,
286  mf_mx, mf_ux_inv, mf_vx_inv,
287  mf_my, mf_uy_inv, mf_vy_inv,
288  horiz_upw_frac, vert_upw_frac,
289  vert_adv_type, lo_z_face, hi_z_face);
290  } else if (horiz_adv_type == AdvType::Weno_7) {
291  AdvectionSrcForMomVert<WENO7>(bxx, bxy, bxz,
292  rho_u_rhs, rho_v_rhs, rho_w_rhs,
293  rho_u, rho_v, Omega, u, v, w,
294  z_nd, ax, ay, az, detJ, cellSizeInv,
295  mf_mx, mf_ux_inv, mf_vx_inv,
296  mf_my, mf_uy_inv, mf_vy_inv,
297  horiz_upw_frac, vert_upw_frac,
298  vert_adv_type, lo_z_face, hi_z_face);
299  } else if (horiz_adv_type == AdvType::Weno_7Z) {
300  AdvectionSrcForMomVert<WENO_Z7>(bxx, bxy, bxz,
301  rho_u_rhs, rho_v_rhs, rho_w_rhs,
302  rho_u, rho_v, Omega, u, v, w,
303  z_nd, ax, ay, az, detJ, cellSizeInv,
304  mf_mx, mf_ux_inv, mf_vx_inv,
305  mf_my, mf_uy_inv, mf_vy_inv,
306  horiz_upw_frac, vert_upw_frac,
307  vert_adv_type, lo_z_face, hi_z_face);
308  } else {
309  AMREX_ASSERT_WITH_MESSAGE(false, "Unknown advection scheme!");
310  }
311  }
312 }
void AdvectionSrcForMom_TF(const Box &bxx, const Box &bxy, const Box &bxz, const Array4< Real > &rho_u_rhs, const Array4< Real > &rho_v_rhs, const Array4< Real > &rho_w_rhs, const Array4< const Real > &u, const Array4< const Real > &v, const Array4< const Real > &w, const Array4< const Real > &rho_u, const Array4< const Real > &rho_v, const Array4< const Real > &Omega, const Array4< const Real > &z_nd, const Array4< const Real > &ax, const Array4< const Real > &ay, const Array4< const Real > &az, const Array4< const Real > &detJ, const GpuArray< Real, AMREX_SPACEDIM > &cellSizeInv, const Array4< const Real > &mf_mx, const Array4< const Real > &mf_ux, const Array4< const Real > &mf_vx, const Array4< const Real > &mf_my, const Array4< const Real > &mf_uy, const Array4< const Real > &mf_vy, const AdvType horiz_adv_type, const AdvType vert_adv_type, const Real horiz_upw_frac, const Real vert_upw_frac, const int lo_z_face, const int hi_z_face)
Definition: ERF_AdvectionSrcForMom_TF.cpp:45
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real fourth
Definition: ERF_Constants.H:14
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
@ Centered_4th
@ Centered_6th
@ Centered_2nd
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
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);})
Real w
Definition: ERF_Plotfile2DInterpolator.cpp:22
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterJ(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:275
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterK(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:230
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterI(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:319
AMREX_ASSERT_WITH_MESSAGE(wbar_cutoff_min > wbar_cutoff_max, "ERROR: wbar_cutoff_min < wbar_cutoff_max")
Here is the call graph for this function: