ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_Rebalance.cpp File Reference
#include "ERF_HSEUtils.H"
#include "ERF_Utils.H"
Include dependency graph for ERF_Rebalance.cpp:

Functions

void rebalance_columns (MultiFab &rho, const MultiFab &theta, const MultiFab &qv, const MultiFab &qt, const MultiFab *z_phys, const Geometry &geom, bool use_existing_sfc_density)
 

Function Documentation

◆ rebalance_columns()

void rebalance_columns ( MultiFab &  rho,
const MultiFab &  theta,
const MultiFab &  qv,
const MultiFab &  qt,
const MultiFab *  z_phys,
const Geometry &  geom,
bool  use_existing_sfc_density 
)
10 {
11 
12 #ifdef AMREX_USE_FLOAT
13  Real tol = Real(1.0e-6);
14 #else
15  Real tol = Real(1.0e-10);
16 #endif
17  Real grav = CONST_GRAV;
18 
19  // int ncomp = cons.nComp();
20  int k_dom_lo = geom.Domain().smallEnd(2);
21  int k_dom_hi = geom.Domain().bigEnd(2);
22 
23  for ( MFIter mfi(rho,TileNoZ()); mfi.isValid(); ++mfi ) {
24  Box bx = mfi.tilebox();
25  int klo = bx.smallEnd(2);
26  int khi = bx.bigEnd(2);
27  AMREX_ALWAYS_ASSERT((klo == k_dom_lo) && (khi == k_dom_hi));
28  bx.makeSlab(2,klo);
29 
30  const Array4< Real>& rho_arr = rho.array(mfi);
31  const Array4<const Real>& th_arr = theta.const_array(mfi);
32  const Array4<const Real>& qv_arr = qv.const_array(mfi);
33  const Array4<const Real>& qt_arr = qt.const_array(mfi);
34 
35  const Array4<const Real>& z_arr = z_phys->const_array(mfi);
36 
37  ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int /*k*/) noexcept
38  {
39  // integrate from surface to domain top
40  // Real Factor;
41  Real dz, F, C;
42  Real rho_tot_hi, rho_tot_lo;
43  Real z_lo, z_hi;
44  Real R_lo, R_hi;
45  Real qv_lo, qv_hi;
46  Real qt_lo, qt_hi;
47  Real Th_lo, Th_hi;
48  Real P_lo, P_hi;
49 
50  // First integrate from sea level to the height at klo
51  if (!use_existing_sfc_density)
52  {
53  // Vertical grid spacing
54  z_lo = zero; // corresponding to p_0
55  z_hi = Real(0.125) * (z_arr(i,j,klo ) + z_arr(i+1,j,klo ) + z_arr(i,j+1,klo ) + z_arr(i+1,j+1,klo )
56  +z_arr(i,j,klo+1) + z_arr(i+1,j,klo+1) + z_arr(i,j+1,klo+1) + z_arr(i+1,j+1,klo+1));
57  dz = z_hi - z_lo;
58 
59  // Establish known constant
60  qt_lo = qt_arr(i,j,klo);
61  qv_lo = qv_arr(i,j,klo);
62  Th_lo = th_arr(i,j,klo);
63  P_lo = p_0;
64  R_lo = getRhogivenThetaPress(Th_lo, P_lo, R_d/Cp_d, qv_lo);
65  rho_tot_lo = R_lo * (one + qt_lo);
66  C = -P_lo + myhalf*rho_tot_lo*grav*dz;
67 
68  // Initial guess and residual
69  qt_hi = qt_arr(i,j,klo);
70  qv_hi = qv_arr(i,j,klo);
71  Th_hi = th_arr(i,j,klo);
72  P_hi = p_0;
73  R_hi = getRhogivenThetaPress(Th_hi, P_hi, R_d/Cp_d, qv_hi);
74  rho_tot_hi = R_hi * (one + qt_hi);
75  F = P_hi + myhalf*rho_tot_hi*grav*dz + C;
76 
77  // Do iterations
79  grav, C, Th_hi,
80  qt_hi, qv_hi,
81  P_hi, R_hi, F);
82 
83  // Assign data
84  // Factor = R_hi / con_arr(i,j,klo,Rho_comp);
85  rho_arr(i,j,klo) = R_hi;
86  // for (int n(1); n<ncomp; ++n) { con_arr(i,j,klo,n) *= Factor; }
87  P_lo = P_hi;
88  z_lo = z_hi;
89  } else {
90  z_lo = Real(0.125) * (z_arr(i,j,klo ) + z_arr(i+1,j,klo ) + z_arr(i,j+1,klo ) + z_arr(i+1,j+1,klo )
91  +z_arr(i,j,klo+1) + z_arr(i+1,j,klo+1) + z_arr(i,j+1,klo+1) + z_arr(i+1,j+1,klo+1));
92  P_lo = getPgivenRTh(rho_arr(i,j,klo)*th_arr(i,j,klo),qv_arr(i,j,klo));
93  P_hi = P_lo;
94  }
95 
96  for (int k(klo+1); k<=khi; ++k)
97  {
98  z_hi = Real(0.125) * (z_arr(i,j,k ) + z_arr(i+1,j,k ) + z_arr(i,j+1,k ) + z_arr(i+1,j+1,k )
99  +z_arr(i,j,k+1) + z_arr(i+1,j,k+1) + z_arr(i,j+1,k+1) + z_arr(i+1,j+1,k+1));
100  dz = z_hi - z_lo;
101 
102  // Establish known constant
103  qt_lo = qt_arr(i,j,k-1);
104  qv_lo = qv_arr(i,j,k-1);
105  Th_lo = th_arr(i,j,k-1);
106  R_lo = getRhogivenThetaPress(Th_lo, P_lo, R_d/Cp_d, qv_lo);
107  rho_tot_lo = R_lo * (one + qt_lo);
108  C = -P_lo + myhalf*rho_tot_lo*grav*dz;
109 
110  // Initial guess and residual
111  qt_hi = qt_arr(i,j,k);
112  qv_hi = qv_arr(i,j,k);
113  Th_hi = th_arr(i,j,k);
114  R_hi = getRhogivenThetaPress(Th_hi, P_hi, R_d/Cp_d, qv_hi);
115  rho_tot_hi = R_hi * (one + qt_hi);
116  F = P_hi + myhalf*rho_tot_hi*grav*dz + C;
117 
118  // Do iterations
120  grav, C, Th_hi,
121  qt_hi, qv_hi,
122  P_hi, R_hi, F);
123 
124  // Assign data
125  // Factor = R_hi / con_arr(i,j,k,Rho_comp);
126  rho_arr(i,j,k) = R_hi;
127  // for (int n(1); n<ncomp; ++n) { con_arr(i,j,k,n) *= Factor; }
128  P_lo = P_hi;
129  z_lo = z_hi;
130  }
131  });
132  } // mfi
133 } // rebalance_columns
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:44
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 p_0
Definition: ERF_Constants.H:50
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:53
constexpr amrex::Real R_d
Definition: ERF_Constants.H:42
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getRhogivenThetaPress(const amrex::Real th, const amrex::Real p, const amrex::Real rdOcp, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:96
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getPgivenRTh(const amrex::Real rhotheta, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:81
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
rho
Definition: ERF_InitCustomPert_Bubble.H:106
auto qv_arr
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:210
ParallelFor(grown_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_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
auto rho_arr
Definition: ERF_UpdateWSubsidence_SineMassFlux.H:3
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void Newton_Raphson_hse(const Real &m_tol, const Real &RdOCp, const Real &dz, const Real &g, const Real &C, const Real &Th, const Real &qt, const Real &qv, Real &P, Real &rd, Real &F)
Definition: ERF_HSEUtils.H:43
@ theta
Definition: ERF_MM5.H:20
@ qt
Definition: ERF_Kessler.H:28
@ qv
Definition: ERF_Kessler.H:29
@ dz
Definition: ERF_AdvanceWSM6.cpp:104

Referenced by ERF::init_from_input_sounding().

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