ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_Morrison_Advance_F.H
Go to the documentation of this file.
1  double dummy_reflectivity = Real(0);
3 
4  // If using Fortran version, update the Fortran module variable as well
6 
7  // The pointers handed to Fortran are Array4::dataPtr() of the mic_fab_vars, whose
8  // origin/strides come from the FAB box. Deriving the declared bounds from anything
9  // else (e.g. tilebox grown by a hard-coded 3) mis-declares the strides whenever the
10  // grow count is not 3 or the MFIter tiles the box. fab_box is defined by the caller;
11  // every staging FAB below is allocated on it so the declared bounds describe them
12  // all. The compute window stays ITS..KTE, i.e. the tilebox.
13  const int ilom = fab_box.loVect()[0];
14  const int ihim = fab_box.hiVect()[0];
15  const int jlom = fab_box.loVect()[1];
16  const int jhim = fab_box.hiVect()[1];
17  const int klom = fab_box.loVect()[2];
18  const int khim = fab_box.hiVect()[2];
19 
20 #if defined(ERF_USE_MORR_FORT) && defined(AMREX_USE_GPU)
21  Arena* Arena_Used = The_Pinned_Arena();
22 #else
23  Arena* Arena_Used = The_Arena();
24 #endif
25 
26  // Create dummy arrays for cumulus tendencies (if needed)
27  FArrayBox qrcuten_fab(fab_box, 1, Arena_Used);
28  FArrayBox qscuten_fab(fab_box, 1, Arena_Used);
29  FArrayBox qicuten_fab(fab_box, 1, Arena_Used);
30  auto const& qrcuten_arr = qrcuten_fab.array();
31  auto const& qscuten_arr = qscuten_fab.array();
32  auto const& qicuten_arr = qicuten_fab.array();
33 
34  // Initialize tendencies to Real(0) (no cumulus parameterization in this example)
35  ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (int i, int j, int k) {
36  qrcuten_arr(i,j,k) = Real(0);
37  qscuten_arr(i,j,k) = Real(0);
38  qicuten_arr(i,j,k) = Real(0);
39  });
40 
41  // WRF-Chem related variables (optional)
42  bool flag_qndrop = false; // Flag to indicate droplet number prediction
43 
44  // Now create arrays for other optional variables
45  FArrayBox rainprod_fab(fab_box, 1, Arena_Used);
46  FArrayBox evapprod_fab(fab_box, 1, Arena_Used);
47  FArrayBox qlsink_fab(fab_box, 1, Arena_Used);
48  FArrayBox precr_fab(fab_box, 1, Arena_Used);
49  FArrayBox preci_fab(fab_box, 1, Arena_Used);
50  FArrayBox precs_fab(fab_box, 1, Arena_Used);
51  FArrayBox precg_fab(fab_box, 1, Arena_Used);
52 
53  auto const& rainprod_arr = rainprod_fab.array();
54  auto const& evapprod_arr = evapprod_fab.array();
55  auto const& qlsink_arr = qlsink_fab.array();
56  auto const& precr_arr = precr_fab.array();
57  auto const& preci_arr = preci_fab.array();
58  auto const& precs_arr = precs_fab.array();
59  auto const& precg_arr = precg_fab.array();
60 
61  // Initialize WRF-Chem arrays to Real(0)
62  ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (int i, int j, int k) {
63  rainprod_arr(i,j,k) = Real(0);
64  evapprod_arr(i,j,k) = Real(0);
65  qlsink_arr(i,j,k) = Real(0);
66  precr_arr(i,j,k) = Real(0);
67  preci_arr(i,j,k) = Real(0);
68  precs_arr(i,j,k) = Real(0);
69  precg_arr(i,j,k) = Real(0);
70  });
71 
72 #ifdef AMREX_USE_GPU
73  // The staging FABs are pinned (host-accessible) but that says nothing about
74  // ordering: the device kernels that zero/fill them may still be in flight.
75  amrex::Gpu::streamSynchronize();
76 #endif
78  (
79  1, // ITIMESTEP - Use 1 for simplicity
80 
81  // 3D arrays in Fortran expected order (assume column-major for Fortran)
82  theta_arr.dataPtr(), // TH
83  qv_arr.dataPtr(), // QV
84  qcl_arr.dataPtr(), // QC
85  qpr_arr.dataPtr(), // QR
86  qci_arr.dataPtr(), // QI
87  qps_arr.dataPtr(), // QS
88  qpg_arr.dataPtr(), // QG
89  ni_arr.dataPtr(), // NI
90  ns_arr.dataPtr(), // NS
91  nr_arr.dataPtr(), // NR
92  ng_arr.dataPtr(), // NG
93 
94  rho_arr.dataPtr(), // RHO
95  pii_arr.dataPtr(), // PII (Exner function)
96  pres_arr.dataPtr(), // P (in hPa, convert if needed)
97  dt, // DT_IN
98  dz_arr.dataPtr(), // DZ
99  w_arr.dataPtr(), // W (vertical velocity)
100 
101  // 2D arrays for precipitation accounting
102  rain_accum_arr.dataPtr(), // RAINNC
103  rainncv_arr.dataPtr(), // RAINNCV
104  sr_arr.dataPtr(), // SR
105  snow_accum_arr.dataPtr(), // SNOWNC
106  snowncv_arr.dataPtr(), // SNOWNCV
107  graup_accum_arr.dataPtr(),// GRAUPELNC
108  graupelncv_arr.dataPtr(), // GRAUPELNCV
109 
110  // Radar reflectivity
111  dummy_reflectivity_ptr, // refl_10cm
112  true, // diagflag
113  0, // do_radar_ref
114 
115  // Cumulus tendencies
116  qrcuten_arr.dataPtr(), // qrcuten
117  qscuten_arr.dataPtr(), // qscuten
118  qicuten_arr.dataPtr(), // qicuten
119 
120  // WRF-Chem flags
121  flag_qndrop, // F_QNDROP
122  nullptr, // qndrop (not used here)
123  // ht_arr.dataPtr(), // HT (terrain height - not used)
124 
125  // Domain dimensions
126  ilo, ihi, jlo, jhi, klo, khi, // IDS,IDE,JDS,JDE,KDS,KDE
127  ilom, ihim, jlom, jhim, klom, khim, // IMS,IME,JMS,JME,KMS,KME
128  ilo, ihi, jlo, jhi, klo, khi, // ITS,ITE,JTS,JTE,KTS,KTE
129 
130  // Optional WRF-Chem outputs
131  false, // wetscav_on
132  rainprod_arr.dataPtr(), // rainprod
133  evapprod_arr.dataPtr(), // evapprod
134  qlsink_arr.dataPtr(), // QLSINK
135  precr_arr.dataPtr(), // PRECR
136  preci_arr.dataPtr(), // PRECI
137  precs_arr.dataPtr(), // PRECS
138  precg_arr.dataPtr() // PRECG
139  );
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
auto qv_arr
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:210
FArrayBox precs_fab(fab_box, 1, Arena_Used)
FArrayBox qscuten_fab(fab_box, 1, Arena_Used)
const int jhim
Definition: ERF_Morrison_Advance_F.H:16
FArrayBox evapprod_fab(fab_box, 1, Arena_Used)
FArrayBox rainprod_fab(fab_box, 1, Arena_Used)
const int ilom
Definition: ERF_Morrison_Advance_F.H:13
const int khim
Definition: ERF_Morrison_Advance_F.H:18
double * dummy_reflectivity_ptr
Definition: ERF_Morrison_Advance_F.H:2
auto const & rainprod_arr
Definition: ERF_Morrison_Advance_F.H:53
auto const & evapprod_arr
Definition: ERF_Morrison_Advance_F.H:54
Arena * Arena_Used
Definition: ERF_Morrison_Advance_F.H:23
FArrayBox preci_fab(fab_box, 1, Arena_Used)
const int jlom
Definition: ERF_Morrison_Advance_F.H:15
auto const & qlsink_arr
Definition: ERF_Morrison_Advance_F.H:55
const int ihim
Definition: ERF_Morrison_Advance_F.H:14
FArrayBox qicuten_fab(fab_box, 1, Arena_Used)
FArrayBox qrcuten_fab(fab_box, 1, Arena_Used)
const int klom
Definition: ERF_Morrison_Advance_F.H:17
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);})
set_morrison_ndcnst_c(m_ndcnst)
auto const & qicuten_arr
Definition: ERF_Morrison_Advance_F.H:32
auto const & qrcuten_arr
Definition: ERF_Morrison_Advance_F.H:30
auto const & qscuten_arr
Definition: ERF_Morrison_Advance_F.H:31
auto const & precs_arr
Definition: ERF_Morrison_Advance_F.H:58
FArrayBox precr_fab(fab_box, 1, Arena_Used)
auto const & preci_arr
Definition: ERF_Morrison_Advance_F.H:57
FArrayBox qlsink_fab(fab_box, 1, Arena_Used)
FArrayBox precg_fab(fab_box, 1, Arena_Used)
double dummy_reflectivity
Definition: ERF_Morrison_Advance_F.H:1
auto const & precg_arr
Definition: ERF_Morrison_Advance_F.H:59
bool flag_qndrop
Definition: ERF_Morrison_Advance_F.H:42
auto const & precr_arr
Definition: ERF_Morrison_Advance_F.H:56
mp_morr_two_moment_c(1, theta_arr.dataPtr(), qv_arr.dataPtr(), qcl_arr.dataPtr(), qpr_arr.dataPtr(), qci_arr.dataPtr(), qps_arr.dataPtr(), qpg_arr.dataPtr(), ni_arr.dataPtr(), ns_arr.dataPtr(), nr_arr.dataPtr(), ng_arr.dataPtr(), rho_arr.dataPtr(), pii_arr.dataPtr(), pres_arr.dataPtr(), dt, dz_arr.dataPtr(), w_arr.dataPtr(), rain_accum_arr.dataPtr(), rainncv_arr.dataPtr(), sr_arr.dataPtr(), snow_accum_arr.dataPtr(), snowncv_arr.dataPtr(), graup_accum_arr.dataPtr(), graupelncv_arr.dataPtr(), dummy_reflectivity_ptr, true, 0, qrcuten_arr.dataPtr(), qscuten_arr.dataPtr(), qicuten_arr.dataPtr(), flag_qndrop, nullptr, ilo, ihi, jlo, jhi, klo, khi, ilom, ihim, jlom, jhim, klom, khim, ilo, ihi, jlo, jhi, klo, khi, false, rainprod_arr.dataPtr(), evapprod_arr.dataPtr(), qlsink_arr.dataPtr(), precr_arr.dataPtr(), preci_arr.dataPtr(), precs_arr.dataPtr(), precg_arr.dataPtr())
amrex::Real Real
Definition: ERF_ShocInterface.H:19
auto rho_arr
Definition: ERF_UpdateWSubsidence_SineMassFlux.H:3