ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ERF_MakeBuoyancy.cpp File Reference
#include <AMReX_MultiFab.H>
#include <AMReX_ArrayLim.H>
#include <AMReX_GpuContainers.H>
#include <ERF_Constants.H>
#include <ERF_EOS.H>
#include <ERF_IndexDefines.H>
#include <ERF_SrcHeaders.H>
#include <ERF_BuoyancyUtils.H>
Include dependency graph for ERF_MakeBuoyancy.cpp:

Functions

void make_buoyancy (const Vector< MultiFab > &S_data, const MultiFab &S_prim, MultiFab &buoyancy, const Geometry geom, const SolverChoice &solverChoice, const MultiFab &base_state, const int n_qstate, const int anelastic)
 

Function Documentation

◆ make_buoyancy()

void make_buoyancy ( const Vector< MultiFab > &  S_data,
const MultiFab &  S_prim,
MultiFab &  buoyancy,
const Geometry  geom,
const SolverChoice solverChoice,
const MultiFab &  base_state,
const int  n_qstate,
const int  anelastic 
)

Function for computing the buoyancy term to be used in the evolution equation for the z-component of momentum in the slow integrator. There are three options for how buoyancy is computed (two are the same in the absence of moisture).

Parameters
[in]S_datacurrent solution
[in]S_primprimitive variables (i.e. conserved variables divided by density)
[out]buoyancybuoyancy term computed here
[in]qmoistmoisture variables (in order: qv, qc, qi, ...)
[in]qv_dlateral average of cloud vapor
[in]qc_dlateral average of cloud vapor
[in]qd_dlateral average of cloud vapor
[in]geomContainer for geometric information
[in]solverChoiceContainer for solver parameters
[in]r0Reference (hydrostatically stratified) density
[in]n_qstateNumber of moist variables used by the current model
39 {
40  BL_PROFILE("make_buoyancy()");
41 
42  const Array<Real,AMREX_SPACEDIM> grav{0.0, 0.0, -solverChoice.gravity};
43  const GpuArray<Real,AMREX_SPACEDIM> grav_gpu{grav[0], grav[1], grav[2]};
44 
45  const int klo = geom.Domain().smallEnd()[2];
46  const int khi = geom.Domain().bigEnd()[2] + 1;
47 
48  Real rd_over_cp = solverChoice.rdOcp;
49  Real rv_over_rd = R_v/R_d;
50 
51  MultiFab r0 (base_state, make_alias, BaseState::r0_comp , 1);
52  MultiFab p0 (base_state, make_alias, BaseState::p0_comp , 1);
53  MultiFab th0(base_state, make_alias, BaseState::th0_comp, 1);
54  MultiFab qv0(base_state, make_alias, BaseState::qv0_comp, 1);
55 
56 #ifdef _OPENMP
57 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
58 #endif
59  for ( MFIter mfi(buoyancy,TilingIfNotGPU()); mfi.isValid(); ++mfi)
60  {
61  Box tbz = mfi.tilebox();
62 
63  // We don't compute a source term for z-momentum on the bottom or top boundary
64  if (tbz.smallEnd(2) == klo) tbz.growLo(2,-1);
65  if (tbz.bigEnd(2) == khi) tbz.growHi(2,-1);
66 
67  const Array4<const Real> & cell_data = S_data[IntVars::cons].array(mfi);
68  const Array4<const Real> & cell_prim = S_prim.array(mfi);
69  const Array4< Real> & buoyancy_fab = buoyancy.array(mfi);
70 
71  // Base state density and pressure
72  const Array4<const Real>& r0_arr = r0.const_array(mfi);
73  const Array4<const Real>& p0_arr = p0.const_array(mfi);
74  const Array4<const Real>& th0_arr = th0.const_array(mfi);
75  const Array4<const Real>& qv0_arr = qv0.const_array(mfi);
76 
77  if ( anelastic && (solverChoice.moisture_type == MoistureType::None) )
78  {
79  // ******************************************************************************************
80  // Dry anelastic
81  // ******************************************************************************************
82  ParallelFor(tbz, [=] AMREX_GPU_DEVICE (int i, int j, int k)
83  {
84  //
85  // Return -rho0 g (thetaprime / theta0)
86  //
87  buoyancy_fab(i, j, k) = buoyancy_dry_anelastic(i,j,k,grav_gpu[2],
88  r0_arr,th0_arr,cell_data);
89  });
90  }
91  else if ( anelastic && (solverChoice.moisture_type != MoistureType::None) )
92  {
93  // ******************************************************************************************
94  // Moist anelastic
95  // ******************************************************************************************
96  ParallelFor(tbz, [=] AMREX_GPU_DEVICE (int i, int j, int k)
97  {
98  //
99  // Return -rho0 g (thetaprime / theta0)
100  //
101  buoyancy_fab(i, j, k) = buoyancy_moist_anelastic(i,j,k,grav_gpu[2],rv_over_rd,
102  r0_arr,th0_arr,qv0_arr,cell_data);
103  });
104  }
105  else if ( !anelastic && (solverChoice.moisture_type == MoistureType::None) )
106  {
107  // ******************************************************************************************
108  // Dry compressible
109  // ******************************************************************************************
110  int n_q_dry = 0;
111  if (solverChoice.buoyancy_type == 1) {
112 
113  ParallelFor(tbz, [=] AMREX_GPU_DEVICE (int i, int j, int k)
114  {
115  //
116  // Return -rho0 g (thetaprime / theta0)
117  //
118  buoyancy_fab(i, j, k) = buoyancy_rhopert(i,j,k,n_q_dry,grav_gpu[2],
119  r0_arr,cell_data);
120  });
121  }
122  else if (solverChoice.buoyancy_type == 2 || solverChoice.buoyancy_type == 3)
123  {
124  ParallelFor(tbz, [=] AMREX_GPU_DEVICE (int i, int j, int k)
125  {
126  //
127  // Return -rho0 g (Tprime / T0)
128  //
129  buoyancy_fab(i, j, k) = buoyancy_dry_Tpert(i,j,k,grav_gpu[2],rd_over_cp,
130  r0_arr,p0_arr,th0_arr,cell_data);
131  });
132  }
133  else if (solverChoice.buoyancy_type == 4)
134  {
135  ParallelFor(tbz, [=] AMREX_GPU_DEVICE (int i, int j, int k)
136  {
137  //
138  // Return -rho0 g (Theta_prime / Theta_0)
139  //
140  buoyancy_fab(i, j, k) = buoyancy_dry_Thpert(i,j,k,grav_gpu[2],
141  r0_arr,th0_arr,cell_data);
142  });
143  } // buoyancy_type for dry compressible
144  }
145  else // if ( !anelastic && (solverChoice.moisture_type != MoistureType::None) )
146  {
147  // ******************************************************************************************
148  // Moist compressible
149  // ******************************************************************************************
150 
151  if ( (solverChoice.moisture_type == MoistureType::Kessler_NoRain) ||
152  (solverChoice.moisture_type == MoistureType::SAM) ||
153  (solverChoice.moisture_type == MoistureType::SAM_NoPrecip_NoIce) )
154  {
155  AMREX_ALWAYS_ASSERT(solverChoice.buoyancy_type == 1);
156  }
157 
158  if (solverChoice.buoyancy_type == 1)
159  {
160  ParallelFor(tbz, [=] AMREX_GPU_DEVICE (int i, int j, int k)
161  {
162  buoyancy_fab(i, j, k) = buoyancy_rhopert(i,j,k,n_qstate,grav_gpu[2],
163  r0_arr,cell_data);
164  });
165  }
166  else if (solverChoice.buoyancy_type == 2 || solverChoice.buoyancy_type == 3)
167  {
168 
169  ParallelFor(tbz, [=] AMREX_GPU_DEVICE (int i, int j, int k)
170  {
171  buoyancy_fab(i, j, k) = buoyancy_moist_Tpert(i,j,k,n_qstate,grav_gpu[2],rd_over_cp,
172  r0_arr,th0_arr,qv0_arr,p0_arr,
173  cell_prim,cell_data);
174  });
175  }
176  else if (solverChoice.buoyancy_type == 4)
177  {
178  ParallelFor(tbz, [=] AMREX_GPU_DEVICE (int i, int j, int k)
179  {
180  buoyancy_fab(i, j, k) = buoyancy_moist_Thpert(i,j,k,n_qstate,grav_gpu[2],
181  r0_arr,th0_arr,qv0_arr,cell_prim);
182  });
183  }
184  } // moist compressible
185  } // mfi
186 }
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_rhopert(int &i, int &j, int &k, const int &n_qstate, amrex::Real const &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &cell_data)
Definition: ERF_BuoyancyUtils.H:69
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_dry_anelastic(int &i, int &j, int &k, amrex::Real const &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:10
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_dry_Thpert(int &i, int &j, int &k, amrex::Real const &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:113
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_moist_Thpert(int &i, int &j, int &k, const int &n_qstate, amrex::Real const &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)
Definition: ERF_BuoyancyUtils.H:171
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_dry_Tpert(int &i, int &j, int &k, amrex::Real const &grav_gpu, amrex::Real const &rd_over_cp, 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:87
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_moist_Tpert(int &i, int &j, int &k, const int &n_qstate, amrex::Real const &grav_gpu, amrex::Real const &rd_over_cp, 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)
Definition: ERF_BuoyancyUtils.H:131
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_moist_anelastic(int &i, int &j, int &k, amrex::Real const &grav_gpu, amrex::Real const &rv_over_rd, 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)
Definition: ERF_BuoyancyUtils.H:30
constexpr amrex::Real R_v
Definition: ERF_Constants.H:11
constexpr amrex::Real R_d
Definition: ERF_Constants.H:10
@ qv0_comp
Definition: ERF_IndexDefines.H:67
@ p0_comp
Definition: ERF_IndexDefines.H:64
@ th0_comp
Definition: ERF_IndexDefines.H:66
@ r0_comp
Definition: ERF_IndexDefines.H:63
@ cons
Definition: ERF_IndexDefines.H:158
real(c_double), parameter p0
Definition: ERF_module_model_constants.F90:40
amrex::Real rdOcp
Definition: ERF_DataStruct.H:738
amrex::Real gravity
Definition: ERF_DataStruct.H:736
MoistureType moisture_type
Definition: ERF_DataStruct.H:783
int buoyancy_type
Definition: ERF_DataStruct.H:712
Here is the call graph for this function: