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, MultiFab &theta, const MultiFab &qv, const MultiFab &qt, const MultiFab *z_phys, const Geometry &geom, const bool &maintain_Th, bool use_sfc)
 

Function Documentation

◆ rebalance_columns()

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