ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_BuoyancyUtils.H
Go to the documentation of this file.
1 #ifndef ERF_BUOYANCY_UTILS_H_
2 #define ERF_BUOYANCY_UTILS_H_
3 
4 #include <ERF_EOS.H>
5 #include <ERF_Constants.H>
6 
7 /**
8  * Compute dry anelastic buoyancy.
9  *
10  * @param[in] i x-index
11  * @param[in] j y-index
12  * @param[in] k z-index
13  * @param[in] grav_gpu Gravity
14  * @param[in] r0_arr Reference density field
15  * @param[in] th0_arr Reference potential temperature field
16  * @param[in] cell_data State data FAB
17  * @return Dry anelastic buoyancy value
18  */
19 AMREX_GPU_DEVICE
20 AMREX_FORCE_INLINE
22 buoyancy_dry_anelastic (int& i, int& j, int& k,
23  const amrex::Real& grav_gpu,
24  const amrex::Array4<const amrex::Real>& r0_arr,
25  const amrex::Array4<const amrex::Real>& th0_arr,
26  const amrex::Array4<const amrex::Real>& cell_data)
27 {
28  // Note: this is the same term as the moist anelastic buoyancy when qv = qc = qt = 0
29  amrex::Real theta_d_hi = cell_data(i,j,k ,RhoTheta_comp)/cell_data(i,j,k ,Rho_comp);
30  amrex::Real theta_d_lo = cell_data(i,j,k-1,RhoTheta_comp)/cell_data(i,j,k-1,Rho_comp);
31 
32  amrex::Real theta_d_wface = myhalf * (theta_d_lo + theta_d_hi);
33  amrex::Real theta_d0_wface = myhalf * (th0_arr(i,j,k) + th0_arr(i,j,k-1));
34  amrex::Real rho0_wface = myhalf * (r0_arr(i,j,k) + r0_arr(i,j,k-1));
35 
36  return (-rho0_wface * grav_gpu * (theta_d_wface - theta_d0_wface) / theta_d0_wface);
37 }
38 
39 /**
40  * Compute dry anelastic buoyancy with embedded boundary handling.
41  *
42  * @param[in] i x-index
43  * @param[in] j y-index
44  * @param[in] k z-index
45  * @param[in] grav_gpu Gravity
46  * @param[in] r0_arr Reference density field
47  * @param[in] th0_arr Reference potential temperature field
48  * @param[in] cell_data State data FAB
49  * @param[in] flag EB cell flags
50  * @return Dry anelastic buoyancy value
51  */
52 AMREX_GPU_DEVICE
53 AMREX_FORCE_INLINE
55 buoyancy_dry_anelastic_eb (int& i, int& j, int& k,
56  const amrex::Real& grav_gpu,
57  const amrex::Array4<const amrex::Real>& r0_arr,
58  const amrex::Array4<const amrex::Real>& th0_arr,
59  const amrex::Array4<const amrex::Real>& cell_data,
60  amrex::Array4<amrex::EBCellFlag const> const& flag)
61 {
62  amrex::Real buoyancy = zero;
63  if (flag(i,j,k).isRegular()) {
64  amrex::Real theta_d_hi = cell_data(i,j,k ,RhoTheta_comp)/cell_data(i,j,k ,Rho_comp);
65  amrex::Real theta_d_lo = cell_data(i,j,k-1,RhoTheta_comp)/cell_data(i,j,k-1,Rho_comp);
66  amrex::Real theta_d_wface = myhalf * (theta_d_lo + theta_d_hi);
67  amrex::Real theta_d0_wface = myhalf * (th0_arr(i,j,k) + th0_arr(i,j,k-1));
68  amrex::Real rho0_wface = myhalf * (r0_arr(i,j,k) + r0_arr(i,j,k-1));
69  buoyancy = -rho0_wface * grav_gpu * (theta_d_wface - theta_d0_wface) / theta_d0_wface;
70  } else if (flag(i,j,k).isSingleValued()) {
71  if (flag(i,j,k-1).isCovered()) {
72  amrex::Real theta_d_hihi = cell_data(i,j,k+1,RhoTheta_comp)/cell_data(i,j,k+1,Rho_comp);
73  amrex::Real theta_d_hi = cell_data(i,j,k ,RhoTheta_comp)/cell_data(i,j,k ,Rho_comp);
74  amrex::Real theta_d_wface = myhalf * (three*theta_d_hi - theta_d_hihi);
75  amrex::Real theta_d0_wface = myhalf * (three*th0_arr(i,j,k) - th0_arr(i,j,k+1));
76  amrex::Real rho0_wface = myhalf * (three*r0_arr(i,j,k) - r0_arr(i,j,k+1));
77  buoyancy = -rho0_wface * grav_gpu * (theta_d_wface - theta_d0_wface) / theta_d0_wface;
78  } else if (flag(i,j,k).isCovered()) {
79  amrex::Real theta_d_lo = cell_data(i,j,k-1,RhoTheta_comp)/cell_data(i,j,k-1,Rho_comp);
80  amrex::Real theta_d_lolo = cell_data(i,j,k-2,RhoTheta_comp)/cell_data(i,j,k-2,Rho_comp);
81  amrex::Real theta_d_wface = myhalf * (three*theta_d_lo - theta_d_lolo);
82  amrex::Real theta_d0_wface = myhalf * (three*th0_arr(i,j,k-1) - th0_arr(i,j,k-2));
83  amrex::Real rho0_wface = myhalf * (three*r0_arr(i,j,k-1) - r0_arr(i,j,k-2));
84  buoyancy = -rho0_wface * grav_gpu * (theta_d_wface - theta_d0_wface) / theta_d0_wface;
85  } else {
86  amrex::Real theta_d_hi = cell_data(i,j,k ,RhoTheta_comp)/cell_data(i,j,k ,Rho_comp);
87  amrex::Real theta_d_lo = cell_data(i,j,k-1,RhoTheta_comp)/cell_data(i,j,k-1,Rho_comp);
88  amrex::Real theta_d_wface = myhalf * (theta_d_lo + theta_d_hi);
89  amrex::Real theta_d0_wface = myhalf * (th0_arr(i,j,k) + th0_arr(i,j,k-1));
90  amrex::Real rho0_wface = myhalf * (r0_arr(i,j,k) + r0_arr(i,j,k-1));
91  buoyancy = -rho0_wface * grav_gpu * (theta_d_wface - theta_d0_wface) / theta_d0_wface;
92  }
93  }
94  return buoyancy;
95 }
96 
97 /**
98  * Compute moist anelastic buoyancy.
99  *
100  * @param[in] i x-index
101  * @param[in] j y-index
102  * @param[in] k z-index
103  * @param[in] grav_gpu Gravity
104  * @param[in] r0_arr Reference density field
105  * @param[in] th0_arr Reference potential temperature field
106  * @param[in] qv0_arr Reference water vapor mixing ratio field
107  * @param[in] cell_data State data FAB
108  * @param[in] qt_arr Total water mixing ratio field
109  * @return Moist anelastic buoyancy value
110  */
111 AMREX_GPU_DEVICE
112 AMREX_FORCE_INLINE
114 buoyancy_moist_anelastic (int& i, int& j, int& k,
115  const amrex::Real& grav_gpu,
116  const amrex::Array4<const amrex::Real>& r0_arr,
117  const amrex::Array4<const amrex::Real>& th0_arr,
118  const amrex::Array4<const amrex::Real>& qv0_arr,
119  const amrex::Array4<const amrex::Real>& cell_data,
120  const amrex::Array4<const amrex::Real>& qt_arr)
121 {
122  amrex::Real Fact = (one - RvoRd); // ~= -amrex::Real(0.61)
123 
124  amrex::Real th_d_hi = cell_data(i,j,k ,RhoTheta_comp)/cell_data(i,j,k ,Rho_comp);
125  amrex::Real th_d_lo = cell_data(i,j,k-1,RhoTheta_comp)/cell_data(i,j,k-1,Rho_comp);
126 
127  amrex::Real qv_hi = cell_data(i,j,k ,RhoQ1_comp) /cell_data(i,j,k ,Rho_comp);
128  amrex::Real qv_lo = cell_data(i,j,k-1,RhoQ1_comp) /cell_data(i,j,k-1,Rho_comp);
129 
130  amrex::Real qt_hi = qt_arr(i,j,k ) - qv_hi;
131  amrex::Real th_v_hi = th_d_hi * (one - Fact*qt_hi - RvoRd*qt_hi);
132 
133  amrex::Real qt_lo = qt_arr(i,j,k-1) - qv_lo;
134  amrex::Real th_v_lo = th_d_lo * (one - Fact*qt_lo - RvoRd*qt_lo);
135 
136  amrex::Real th_v0_hi = th0_arr(i,j,k ) * (one - Fact*qv0_arr(i,j,k ));
137  amrex::Real th_v0_lo = th0_arr(i,j,k-1) * (one - Fact*qv0_arr(i,j,k-1));
138 
139  amrex::Real qv0_hi = qv0_arr(i,j,k );
140  amrex::Real qv0_lo = qv0_arr(i,j,k-1);
141 
142  amrex::Real q_hi = (qv_hi-qv0_hi) - qt_hi + (th_v_hi - th_v0_hi) / th_v0_hi;
143  amrex::Real q_lo = (qv_lo-qv0_lo) - qt_lo + (th_v_lo - th_v0_lo) / th_v0_lo;
144 
145  amrex::Real qavg = myhalf * (q_hi + q_lo);
146 
147  amrex::Real r0avg = myhalf * (r0_arr(i,j,k) + r0_arr(i,j,k-1));
148 
149  return (-r0avg * grav_gpu * qavg);
150 }
151 
152 /**
153  * Compute buoyancy based on density perturbations.
154  *
155  * @param[in] i x-index
156  * @param[in] j y-index
157  * @param[in] k z-index
158  * @param[in] grav_gpu Gravity
159  * @param[in] r0_arr Reference density field
160  * @param[in] qv0_arr Reference water vapor mixing ratio field
161  * @param[in] cell_data State data FAB
162  * @param[in] qt_arr Total water mixing ratio field
163  * @return Buoyancy value
164  */
165 AMREX_GPU_DEVICE
166 AMREX_FORCE_INLINE
168 buoyancy_rhopert (int& i, int& j, int& k,
169  const amrex::Real& grav_gpu,
170  const amrex::Array4<const amrex::Real>& r0_arr,
171  const amrex::Array4<const amrex::Real>& qv0_arr,
172  const amrex::Array4<const amrex::Real>& cell_data,
173  const amrex::Array4<const amrex::Real>& qt_arr)
174 {
175  amrex::Real rhop_hi = cell_data(i,j,k ,Rho_comp) * (one + qt_arr(i,j,k )) -
176  r0_arr(i,j,k ) * (one + qv0_arr(i,j,k ));
177  amrex::Real rhop_lo = cell_data(i,j,k-1,Rho_comp) * (one + qt_arr(i,j,k-1)) -
178  r0_arr(i,j,k-1 ) * (one + qv0_arr(i,j,k-1));
179  return( grav_gpu * myhalf * ( rhop_hi + rhop_lo ) );
180 }
181 
182 /**
183  * Compute buoyancy based on density perturbations with embedded boundary handling.
184  *
185  * @param[in] i x-index
186  * @param[in] j y-index
187  * @param[in] k z-index
188  * @param[in] grav_gpu Gravity
189  * @param[in] r0_arr Reference density field
190  * @param[in] qv0_arr Reference water vapor mixing ratio field
191  * @param[in] cell_data State data FAB
192  * @param[in] qt_arr Total water mixing ratio field
193  * @param[in] flag EB cell flags
194  * @return Buoyancy value
195  */
196 AMREX_GPU_DEVICE
197 AMREX_FORCE_INLINE
199 buoyancy_rhopert_eb (int& i, int& j, int& k,
200  const amrex::Real& grav_gpu,
201  const amrex::Array4<const amrex::Real>& r0_arr,
202  const amrex::Array4<const amrex::Real>& qv0_arr,
203  const amrex::Array4<const amrex::Real>& cell_data,
204  const amrex::Array4<const amrex::Real>& qt_arr,
205  amrex::Array4<amrex::EBCellFlag const> const& flag)
206 {
207  amrex::Real buoyancy = zero;
208  if (flag(i,j,k).isRegular()) {
209  amrex::Real rhop_hi = cell_data(i,j,k ,Rho_comp) * (one + qt_arr(i,j,k )) -
210  r0_arr(i,j,k ) * (one + qv0_arr(i,j,k ));
211  amrex::Real rhop_lo = cell_data(i,j,k-1,Rho_comp) * (one + qt_arr(i,j,k-1)) -
212  r0_arr(i,j,k-1 ) * (one + qv0_arr(i,j,k-1));
213  buoyancy = grav_gpu * myhalf * ( rhop_hi + rhop_lo );
214  } else if (flag(i,j,k).isSingleValued()) {
215  if (flag(i,j,k-1).isCovered()) {
216  amrex::Real rhop_hihi = cell_data(i,j,k+1,Rho_comp) * (one + qt_arr(i,j,k+1)) -
217  r0_arr(i,j,k+1 ) * (one + qv0_arr(i,j,k+1));
218  amrex::Real rhop_hi = cell_data(i,j,k ,Rho_comp) * (one + qt_arr(i,j,k )) -
219  r0_arr(i,j,k ) * (one + qv0_arr(i,j,k ));
220  buoyancy = grav_gpu * myhalf * ( three * rhop_hi - rhop_hihi );
221  // buoyancy = grav_gpu * rhop_hi;
222  } else if (flag(i,j,k).isCovered()) {
223  amrex::Real rhop_lo = cell_data(i,j,k-1,Rho_comp) * (one + qt_arr(i,j,k-1)) -
224  r0_arr(i,j,k-1 ) * (one + qv0_arr(i,j,k-1));
225  amrex::Real rhop_lolo = cell_data(i,j,k-2,Rho_comp) * (one + qt_arr(i,j,k-2)) -
226  r0_arr(i,j,k-2 ) * (one + qv0_arr(i,j,k-2));
227  buoyancy = grav_gpu * myhalf * ( three * rhop_lo - rhop_lolo );
228  // buoyancy = grav_gpu * rhop_lo;
229  } else {
230  amrex::Real rhop_hi = cell_data(i,j,k ,Rho_comp) * (one + qt_arr(i,j,k )) -
231  r0_arr(i,j,k ) * (one + qv0_arr(i,j,k ));
232  amrex::Real rhop_lo = cell_data(i,j,k-1,Rho_comp) * (one + qt_arr(i,j,k-1)) -
233  r0_arr(i,j,k-1 ) * (one + qv0_arr(i,j,k-1));
234  buoyancy = grav_gpu * myhalf * ( rhop_hi + rhop_lo );
235  }
236  }
237  return buoyancy;
238 }
239 
240 /**
241  * Compute dry buoyancy based on temperature perturbations.
242  *
243  * @param[in] i x-index
244  * @param[in] j y-index
245  * @param[in] k z-index
246  * @param[in] grav_gpu Gravity
247  * @param[in] lRdoCp Gas constant ratio (unused)
248  * @param[in] r0_arr Reference density field
249  * @param[in] p0_arr Reference pressure field
250  * @param[in] th0_arr Reference potential temperature field
251  * @param[in] cell_data State data FAB
252  * @return Dry buoyancy value
253  */
254 AMREX_GPU_DEVICE
255 AMREX_FORCE_INLINE
257 buoyancy_dry_Tpert (int& i, int& j, int& k,
258  const amrex::Real& grav_gpu,
259  const amrex::Real& /*lRdoCp*/,
260  const amrex::Array4<const amrex::Real>& r0_arr,
261  const amrex::Array4<const amrex::Real>& p0_arr,
262  const amrex::Array4<const amrex::Real>& th0_arr,
263  const amrex::Array4<const amrex::Real>& cell_data)
264 {
265  amrex::Real t0_hi = getTgivenPandTh(p0_arr(i,j,k), th0_arr(i,j,k), RdoCp);
266  amrex::Real t_hi = getTgivenRandRTh(cell_data(i,j,k ,Rho_comp), cell_data(i,j,k ,RhoTheta_comp));
267 
268  amrex::Real t0_lo = getTgivenPandTh(p0_arr(i,j,k-1), th0_arr(i,j,k-1), RdoCp);
269  amrex::Real t_lo = getTgivenRandRTh(cell_data(i,j,k-1,Rho_comp), cell_data(i,j,k-1,RhoTheta_comp));
270 
271  amrex::Real tprime_hi = (t_hi-t0_hi)/t0_hi;
272  amrex::Real tprime_lo = (t_lo-t0_lo)/t0_lo;
273 
274  amrex::Real tp_avg = myhalf * (tprime_hi + tprime_lo);
275  amrex::Real r0_avg = myhalf * (r0_arr(i,j,k) + r0_arr(i,j,k-1));
276 
277  return ( -r0_avg * grav_gpu * tp_avg);
278 }
279 
280 /**
281  * Compute dry buoyancy based on potential temperature perturbations.
282  *
283  * @param[in] i x-index
284  * @param[in] j y-index
285  * @param[in] k z-index
286  * @param[in] grav_gpu Gravity
287  * @param[in] r0_arr Reference density field
288  * @param[in] th0_arr Reference potential temperature field
289  * @param[in] cell_prim Primitive variable FAB
290  * @return Dry buoyancy value
291  */
292 AMREX_GPU_DEVICE
293 AMREX_FORCE_INLINE
295 buoyancy_dry_Thpert (int& i, int& j, int& k,
296  const amrex::Real& grav_gpu,
297  const amrex::Array4<const amrex::Real>& r0_arr,
298  const amrex::Array4<const amrex::Real>& th0_arr,
299  const amrex::Array4<const amrex::Real>& cell_prim)
300 {
301  amrex::Real thetaprime_hi = (cell_prim(i,j,k ,PrimTheta_comp) - th0_arr(i,j,k )) / th0_arr(i,j,k );
302  amrex::Real thetaprime_lo = (cell_prim(i,j,k-1,PrimTheta_comp) - th0_arr(i,j,k-1)) / th0_arr(i,j,k-1);
303 
304  amrex::Real thp_avg = myhalf * (thetaprime_hi + thetaprime_lo);
305  amrex::Real r0_avg = myhalf * (r0_arr(i,j,k) + r0_arr(i,j,k-1));
306 
307  return ( -r0_avg * grav_gpu * thp_avg);
308 }
309 
310 /**
311  * Compute moist buoyancy based on temperature perturbations.
312  *
313  * @param[in] i x-index
314  * @param[in] j y-index
315  * @param[in] k z-index
316  * @param[in] n_qstate Number of moisture species
317  * @param[in] grav_gpu Gravity
318  * @param[in] lRdoCp Gas constant ratio (unused)
319  * @param[in] r0_arr Reference density field
320  * @param[in] th0_arr Reference potential temperature field
321  * @param[in] qv0_arr Reference water vapor mixing ratio field
322  * @param[in] p0_arr Reference pressure field
323  * @param[in] cell_prim Primitive variable FAB
324  * @param[in] cell_data State data FAB
325  * @param[in] qt_arr Total water mixing ratio field
326  * @return Moist buoyancy value
327  */
328 AMREX_GPU_DEVICE
329 AMREX_FORCE_INLINE
331 buoyancy_moist_Tpert (int& i, int& j, int& k,
332  const int& n_qstate,
333  const amrex::Real& grav_gpu,
334  const amrex::Real& /*lRdoCp*/,
335  const amrex::Array4<const amrex::Real>& r0_arr,
336  const amrex::Array4<const amrex::Real>& th0_arr,
337  const amrex::Array4<const amrex::Real>& qv0_arr,
338  const amrex::Array4<const amrex::Real>& p0_arr,
339  const amrex::Array4<const amrex::Real>& cell_prim,
340  const amrex::Array4<const amrex::Real>& cell_data,
341  const amrex::Array4<const amrex::Real>& qt_arr)
342 {
343  amrex::Real qv_hi = (n_qstate >= 1) ? cell_prim(i,j,k ,PrimQ1_comp) : zero;
344  amrex::Real qv_lo = (n_qstate >= 1) ? cell_prim(i,j,k-1,PrimQ1_comp) : zero;
345 
346  amrex::Real t0_hi = getTgivenPandTh(p0_arr(i,j,k ), th0_arr(i,j,k ), RdoCp);
347  amrex::Real t0_lo = getTgivenPandTh(p0_arr(i,j,k-1), th0_arr(i,j,k-1), RdoCp);
348 
349  amrex::Real dt_hi = getTgivenRandRTh(cell_data(i,j,k ,Rho_comp), cell_data(i,j,k ,RhoTheta_comp), qv_hi) - t0_hi;
350  amrex::Real dt_lo = getTgivenRandRTh(cell_data(i,j,k-1,Rho_comp), cell_data(i,j,k-1,RhoTheta_comp), qv_lo) - t0_lo;
351 
352  amrex::Real qv0_hi = qv0_arr(i,j,k );
353  amrex::Real qv0_lo = qv0_arr(i,j,k-1);
354 
355  amrex::Real q_hi = epsv * (qv_hi-qv0_hi) - (qt_arr(i,j,k )-qv_hi) + dt_hi/t0_hi;
356  amrex::Real q_lo = epsv * (qv_lo-qv0_lo) - (qt_arr(i,j,k-1)-qv_lo) + dt_lo/t0_lo;
357 
358  amrex::Real qavg = myhalf * (q_hi + q_lo);
359 
360  amrex::Real r0avg = myhalf * (r0_arr(i,j,k) + r0_arr(i,j,k-1));
361 
362  return ( -r0avg * grav_gpu * qavg);
363 }
364 
365 /**
366  * Compute moist buoyancy based on potential temperature perturbations.
367  *
368  * @param[in] i x-index
369  * @param[in] j y-index
370  * @param[in] k z-index
371  * @param[in] n_qstate Number of moisture species
372  * @param[in] grav_gpu Gravity
373  * @param[in] r0_arr Reference density field
374  * @param[in] th0_arr Reference potential temperature field
375  * @param[in] qv0_arr Reference water vapor mixing ratio field
376  * @param[in] cell_prim Primitive variable FAB
377  * @param[in] qt_arr Total water mixing ratio field
378  * @return Moist buoyancy value
379  */
380 AMREX_GPU_DEVICE
381 AMREX_FORCE_INLINE
383 buoyancy_moist_Thpert (int& i, int& j, int& k,
384  const int& n_qstate,
385  const amrex::Real& grav_gpu,
386  const amrex::Array4<const amrex::Real>& r0_arr,
387  const amrex::Array4<const amrex::Real>& th0_arr,
388  const amrex::Array4<const amrex::Real>& qv0_arr,
389  const amrex::Array4<const amrex::Real>& cell_prim,
390  const amrex::Array4<const amrex::Real>& qt_arr)
391 {
392  amrex::Real qv_hi = (n_qstate >= 1) ? cell_prim(i,j,k ,PrimQ1_comp) : zero;
393  amrex::Real qv_lo = (n_qstate >= 1) ? cell_prim(i,j,k-1,PrimQ1_comp) : zero;
394 
395  amrex::Real qt_hi = qt_arr(i,j,k ) - qv_hi;
396  amrex::Real qt_lo = qt_arr(i,j,k-1) - qv_lo;
397 
398  amrex::Real dth_hi = cell_prim(i,j,k ,PrimTheta_comp) - th0_arr(i,j,k );
399  amrex::Real dth_lo = cell_prim(i,j,k-1,PrimTheta_comp) - th0_arr(i,j,k-1);
400 
401  amrex::Real qv0_hi = qv0_arr(i,j,k );
402  amrex::Real qv0_lo = qv0_arr(i,j,k-1);
403 
404  amrex::Real q_hi = epsv * (qv_hi-qv0_hi) - qt_hi + dth_hi/th0_arr(i,j,k );
405  amrex::Real q_lo = epsv * (qv_lo-qv0_lo) - qt_lo + dth_lo/th0_arr(i,j,k-1);
406 
407  amrex::Real qavg = myhalf * (q_hi + q_lo);
408 
409  amrex::Real r0avg = myhalf * (r0_arr(i,j,k) + r0_arr(i,j,k-1));
410 
411  return ( -r0avg * grav_gpu * qavg);
412 }
413 
414 // **************************************************************************************
415 // Routines below this line are not currently used
416 // **************************************************************************************
417 
418 /**
419  * Compute dry anelastic buoyancy using temperature.
420  *
421  * @param[in] i x-index
422  * @param[in] j y-index
423  * @param[in] k z-index
424  * @param[in] grav_gpu Gravity
425  * @param[in] RdoCp Gas constant ratio (unused)
426  * @param[in] r0_arr Reference density field
427  * @param[in] p0_arr Reference pressure field
428  * @param[in] cell_data State data FAB
429  * @return Dry anelastic buoyancy value
430  */
431 AMREX_GPU_DEVICE
432 AMREX_FORCE_INLINE
434 buoyancy_dry_anelastic_T (int& i, int& j, int& k,
435  const amrex::Real& grav_gpu,
436  const amrex::Real& /*RdoCp*/,
437  const amrex::Array4<const amrex::Real>& r0_arr,
438  const amrex::Array4<const amrex::Real>& p0_arr,
439  const amrex::Array4<const amrex::Real>& cell_data)
440 {
441  amrex::Real rt0_hi = getRhoThetagivenP(p0_arr(i,j,k));
442  amrex::Real t0_hi = getTgivenPandTh(p0_arr(i,j,k), rt0_hi/r0_arr(i,j,k), RdoCp);
443  amrex::Real t_hi = getTgivenPandTh(p0_arr(i,j,k), cell_data(i,j,k,RhoTheta_comp)/r0_arr(i,j,k), RdoCp);
444  amrex::Real q_hi = (t_hi-t0_hi)/t0_hi;
445 
446  amrex::Real rt0_lo = getRhoThetagivenP(p0_arr(i,j,k-1));
447  amrex::Real t0_lo = getTgivenPandTh(p0_arr(i,j,k-1), rt0_lo/r0_arr(i,j,k-1), RdoCp);
448  amrex::Real t_lo = getTgivenPandTh(p0_arr(i,j,k-1), cell_data(i,j,k-1,RhoTheta_comp)/r0_arr(i,j,k-1), RdoCp);
449  amrex::Real q_lo = (t_lo-t0_lo)/t0_lo;
450 
451  amrex::Real r0_q_avg = myhalf * (r0_arr(i,j,k) * q_hi + r0_arr(i,j,k-1) * q_lo);
452  return (-r0_q_avg * grav_gpu);
453 }
454 
455 #endif
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_moist_anelastic(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &qv0_arr, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &qt_arr)
Definition: ERF_BuoyancyUtils.H:114
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_dry_Thpert(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &cell_prim)
Definition: ERF_BuoyancyUtils.H:295
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_dry_Tpert(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Real &, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &p0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &cell_data)
Definition: ERF_BuoyancyUtils.H:257
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_rhopert(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &qv0_arr, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &qt_arr)
Definition: ERF_BuoyancyUtils.H:168
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_moist_Tpert(int &i, int &j, int &k, const int &n_qstate, const amrex::Real &grav_gpu, const amrex::Real &, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &qv0_arr, const amrex::Array4< const amrex::Real > &p0_arr, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &qt_arr)
Definition: ERF_BuoyancyUtils.H:331
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_moist_Thpert(int &i, int &j, int &k, const int &n_qstate, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &qv0_arr, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< const amrex::Real > &qt_arr)
Definition: ERF_BuoyancyUtils.H:383
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_dry_anelastic_T(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Real &, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &p0_arr, const amrex::Array4< const amrex::Real > &cell_data)
Definition: ERF_BuoyancyUtils.H:434
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_dry_anelastic_eb(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &cell_data, amrex::Array4< amrex::EBCellFlag const > const &flag)
Definition: ERF_BuoyancyUtils.H:55
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_rhopert_eb(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &qv0_arr, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &qt_arr, amrex::Array4< amrex::EBCellFlag const > const &flag)
Definition: ERF_BuoyancyUtils.H:199
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_dry_anelastic(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &cell_data)
Definition: ERF_BuoyancyUtils.H:22
constexpr amrex::Real epsv
Definition: ERF_Constants.H:53
constexpr amrex::Real three
Definition: ERF_Constants.H:11
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
constexpr amrex::Real RvoRd
Definition: ERF_Constants.H:56
constexpr amrex::Real RdoCp
Definition: ERF_Constants.H:54
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getRhoThetagivenP(const amrex::Real p, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:172
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getTgivenRandRTh(const amrex::Real rho, const amrex::Real rhotheta, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:46
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getTgivenPandTh(const amrex::Real P, const amrex::Real th, const amrex::Real rdOcp)
Definition: ERF_EOS.H:32
#define PrimQ1_comp
Definition: ERF_IndexDefines.H:61
#define Rho_comp
Definition: ERF_IndexDefines.H:39
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:40
#define PrimTheta_comp
Definition: ERF_IndexDefines.H:58
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:45
amrex::Real Real
Definition: ERF_ShocInterface.H:19