ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ERF_Radiation.H
Go to the documentation of this file.
1 #ifndef ERF_RADIATION_H
2 #define ERF_RADIATION_H
3 
4 /*
5  * RTE-RRTMGP radiation model interface to ERF
6  * The original code is developed by RobertPincus, and the code is open source available at:
7  * https://github.com/earth-system-radiation/rte-rrtmgp
8  * Please reference to the following paper,
9  * https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2019MS001621
10  * NOTE: we use the C++ version of RTE-RRTMGP, which is the implementation of the original Fortran
11  * code using C++ KOKKOS for CUDA, HiP and SYCL application by E3SM ECP team, the C++ version
12  * of the rte-rrtmgp code is located at:
13  * https://github.com/E3SM-Project/rte-rrtmgp
14  * The RTE-RRTMGP uses BSD-3-Clause Open Source License, if you want to make changes,
15  * and modifications to the code, please refer to BSD-3-Clause Open Source License.
16  */
17 
18 #include <ctime>
19 #include <string>
20 #include <vector>
21 #include <memory>
22 
23 #include <mo_gas_concentrations.h>
24 
25 #include <Kokkos_Core.hpp>
26 
27 #include <AMReX_ParmParse.H>
28 #include <AMReX_FArrayBox.H>
29 #include <AMReX_Geometry.H>
30 #include <AMReX_TableData.H>
31 #include <AMReX_MultiFabUtil.H>
32 #include <AMReX_PlotFileUtil.H>
33 
34 #include <ERF_RadiationInterface.H>
35 #include <ERF_RRTMGP_Interface.H>
36 #include <ERF_RRTMGP_Utils.H>
37 #include <ERF_OrbCosZenith.H>
38 #include <ERF_Constants.H>
39 #include <ERF_IndexDefines.H>
40 #include <ERF_DataStruct.H>
41 #include <ERF_EOS.H>
42 
43 #include <ERF_LandSurface.H>
44 
45 class Radiation : public IRadiation {
46 public:
47 
48  #include <ERF_Kokkos.H>
49 
50  // Constructor
51  Radiation (const int& lev,
52  SolverChoice& sc);
53 
54  // Destructor
56  {
57  // Finalize kokkos
58  Kokkos::finalize();
59  }
60 
61  virtual
62  void
63  Init (const amrex::Geometry& geom,
64  const amrex::BoxArray& ba,
65  amrex::MultiFab* cons_in) override
66  {
67  // Ensure the boxes span klo -> khi
68  int klo = geom.Domain().smallEnd(2);
69  int khi = geom.Domain().bigEnd(2);
70 
71  // Reset vector of offsets for columnar data
72  m_nlay = geom.Domain().length(2);
73 
74  m_ncol = 0;
75  m_col_offsets.clear();
76  m_col_offsets.resize(int(ba.size()));
77  for (amrex::MFIter mfi(*cons_in); mfi.isValid(); ++mfi) {
78  const amrex::Box& vbx = mfi.validbox();
79  AMREX_ALWAYS_ASSERT_WITH_MESSAGE((klo == vbx.smallEnd(2)) &&
80  (khi == vbx.bigEnd(2)),
81  "Vertical decomposition with radiation is not allowed.");
82  int nx = vbx.length(0);
83  int ny = vbx.length(1);
84  m_col_offsets[mfi.index()] = m_ncol;
85  m_ncol += nx * ny;
86  }
87  };
88 
89  virtual
90  void
91  Run (int& level,
92  int& step,
93  amrex::Real& time,
94  const amrex::Real& dt,
95  const amrex::BoxArray& ba,
96  amrex::Geometry& geom,
97  amrex::MultiFab* cons_in,
98  amrex::MultiFab* lsm_fluxes,
99  amrex::MultiFab* lsm_zenith,
100  amrex::Vector<amrex::MultiFab*>& lsm_input_ptrs,
101  amrex::Vector<amrex::MultiFab*>& lsm_output_ptrs,
102  amrex::MultiFab* qheating_rates,
103  amrex::MultiFab* z_phys,
104  amrex::MultiFab* lat,
105  amrex::MultiFab* lon) override
106  {
107  set_grids(level, step, time, dt, ba, geom,
108  cons_in, lsm_fluxes, lsm_zenith,
109  lsm_input_ptrs, qheating_rates,
110  z_phys, lat, lon);
111  rad_run_impl(lsm_output_ptrs);
112  }
113 
114  // Set the grid info for columnar data in KOKKOS
115  void
116  set_grids (int& level,
117  int& step,
118  amrex::Real& time,
119  const amrex::Real& dt,
120  const amrex::BoxArray& ba,
121  amrex::Geometry& geom,
122  amrex::MultiFab* cons_in,
123  amrex::MultiFab* lsm_fluxes,
124  amrex::MultiFab* lsm_zenith,
125  amrex::Vector<amrex::MultiFab*>& lsm_input_ptrs,
126  amrex::MultiFab* qheating_rates,
127  amrex::MultiFab* z_phys,
128  amrex::MultiFab* lat,
129  amrex::MultiFab* lon);
130 
131  template<typename LandSurfaceModelType>
132  void set_lsm_inputs (LandSurfaceModelType *model)
133  {
134  if constexpr(std::is_same_v<LandSurfaceModelType, SLM>)
135  {
136  if (!m_update_rad)
137  {
138  // skip getting LSM inputs if radiation not updating this timestep
139  return;
140  }
141 
142  // get surface temperature, LW flux, and emissivities from SLM
143  /*
144  auto slm_to_rad_vars = model->export_to_RRTMGP();
145 
146  for (amrex::MFIter mfi(*slm_to_rad_vars[0]); mfi.isValid(); ++mfi) {
147  const auto& vbx = mfi.validbox();
148  const auto& sbx = amrex::makeSlab(vbx, 2, 0);
149 
150  const int nx = vbx.length(0);
151  const int imin = vbx.smallEnd(0);
152  const int jmin = vbx.smallEnd(1);
153  const int offset = m_col_offsets[mfi.index()];
154 
155  const auto &slm_tsurf = slm_to_rad_vars[0]->const_array(mfi);
156  const auto &slm_alb_dir_vis_arr = slm_to_rad_vars[2]->const_array(mfi);
157  const auto &slm_alb_dir_nir_arr = slm_to_rad_vars[4]->const_array(mfi);
158  const auto &slm_IR_emis_arr = slm_to_rad_vars[5]->const_array(mfi);
159  const auto &slm_net_rad_arr = slm_to_rad_vars[6]->const_array(mfi);
160  amrex::ParallelFor(sbx, [=] AMREX_GPU_DEVICE (int i, int j, int k)
161  {
162  // map [i,j,k] 0-based to [icol, ilay] 1-based
163  const int icol = (j-jmin)*nx + (i-imin) + 1 + offset;
164  const int ilay = 0;
165 
166  t_sfc(icol) = slm_tsurf(i, j, k);
167 
168  sfc_alb_dir_vis(icol) = slm_alb_dir_vis_arr(i, j, k);
169  sfc_alb_dir_nir(icol) = slm_alb_dir_nir_arr(i, j, k);
170  sfc_alb_dif_vis(icol) = slm_alb_dir_vis_arr(i, j, k);
171  sfc_alb_dif_nir(icol) = slm_alb_dir_nir_arr(i, j, k);
172 
173  sfc_emis(icol) = slm_IR_emis_arr(i, j, k);
174 
175  //lw_src(icol) = slm_net_rad_arr(i, j, k, SLM_NetRad::net_lwup1);
176  lw_src(icol) = 0.0; // TODO
177  });
178  }
179 
180  // expand sfc_emis and lw_src over nlwbands
181  // TODO: check if this is correct - should emissivity vary based on band?
182  Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {m_nlwbands, m_ncol}),
183  KOKKOS_LAMBDA (int ibnd, int icol)
184  {
185  emis_sfc(icol, ibnd) = sfc_emis(icol);
186  });
187  */
188 
189  Kokkos::deep_copy(emis_sfc, 0.98);
190  Kokkos::deep_copy(lw_src, 0.0);
191  }
192  }
193 
194  // Initialize the temporary variables
195  void
196  alloc_buffers ();
197 
198  // Clear the temporary variables
199  void
200  dealloc_buffers ();
201 
202  // Fill KOKKOS Views from AMReX MultiFabs
203  void
204  mf_to_kokkos_buffers(amrex::Vector<amrex::MultiFab*>& lsm_input_ptrs);
205 
206  // Fill AMReX MultiFabs from KOKKOS Views
207  void
208  kokkos_buffers_to_mf (amrex::Vector<amrex::MultiFab*>& lsm_output_ptrs);
209 
210  // Write the rrtmgp fluxes
211  void
213 
214  // Initialize the implementation
215  void
216  initialize_impl ();
217 
218  // Run the implementation
219  void
220  run_impl ();
221 
222  // Finalize the implementation
223  void
224  finalize_impl (amrex::Vector<amrex::MultiFab*>& lsm_output_ptrs);
225 
226  // Wrapper for implementation steps
227  void
228  rad_run_impl (amrex::Vector<amrex::MultiFab*>& lsm_output_ptrs)
229  {
230  if (m_update_rad) {
231  amrex::Print() << "Advancing radiation at level: " << m_lev << " ...";
232  this->initialize_impl();
233  this->run_impl();
234  this->finalize_impl(lsm_output_ptrs);
235  amrex::Print() << "DONE\n";
236  }
237  }
238 
239  // Get names input varnames for lsm
240  virtual
241  amrex::Vector<std::string>
243  {
244  return m_lsm_input_names;
245  }
246 
247  // Get names output varnames for lsm
248  virtual
249  amrex::Vector<std::string>
251  {
252  return m_lsm_output_names;
253  }
254 
255  // Populate datalog structures
256  void
258 
259  // Write datalog
260  virtual
261  void
262  WriteDataLog (const amrex::Real &time) override;
263 
264 private:
265 
266  // Process interface vars from ERF/AMReX
267  //===================================================================================
268 
269  // Grid level
270  int m_lev;
271 
272  // Step number
273  int m_step;
274 
275  // Current time
276  amrex::Real m_time;
277 
278  // Timestep at given level
279  amrex::Real m_dt;
280 
281  // Geometry at given level
282  amrex::Geometry m_geom;
283 
284  // Boxarray at given level
285  amrex::BoxArray m_ba;
286 
287  // Are we updating radiation?
288  bool m_update_rad = false;
289 
290  // Are we writing out the fluxes?
291  bool m_rad_write_fluxes = false;
292 
293  bool m_first_step = true;
294 
295  // Do we have moisture and cold comps?
296  bool m_moist = false;
297  bool m_ice = false;
298 
299  // Do we have a land surface model?
300  bool m_lsm = false;
301 
302  // List of input parameter names
303  amrex::Vector<std::string> m_lsm_input_names = {"t_sfc" , "sfc_emis" ,
304  "sfc_alb_dir_vis", "sfc_alb_dir_nir",
305  "sfc_alb_dif_vis", "sfc_alb_dif_nir"};
306 
307  // List of output parameter names
308  amrex::Vector<std::string> m_lsm_output_names = {"sw_flux_dn", "lw_flux_dn"};
309 
310  // T surf if no LSM is available
311  amrex::Real m_rad_t_sfc = -1;
312 
313  // Pointer to the CC conserved vars
314  amrex::MultiFab* m_cons_in = nullptr;
315 
316  // Pointer to the radiation source terms
317  amrex::MultiFab* m_qheating_rates = nullptr;
318 
319  // Pointer to the terrain heights
320  amrex::MultiFab* m_z_phys = nullptr;
321 
322  // Pointer to latitude and longitude
323  amrex::MultiFab* m_lat = nullptr;
324  amrex::MultiFab* m_lon = nullptr;
325 
326  // Constant lat/lon if the above MFs are not valid
327  amrex::Real m_lat_cons = 39.809860;
328  amrex::Real m_lon_cons = -98.555183;
329 
330  // Pointer to output data for LSM
331  amrex::MultiFab* m_lsm_fluxes = nullptr;
332  amrex::MultiFab* m_lsm_zenith = nullptr;
333 
334  // Holds output from KOKKOS views used in the datalog
335  amrex::MultiFab datalog_mf;
336 
337  // Path, data file, and coefficient file for K-distribution
338  std::string rrtmgp_file_path = ".";
339  std::string rrtmgp_coeffs_sw = "rrtmgp-data-sw-g224-2018-12-04.nc";
340  std::string rrtmgp_coeffs_lw = "rrtmgp-data-lw-g224-2018-12-04.nc";
341  std::string rrtmgp_cloud_optics_sw = "rrtmgp-cloud-optics-coeffs-sw.nc";
342  std::string rrtmgp_cloud_optics_lw = "rrtmgp-cloud-optics-coeffs-lw.nc";
347 
348  // Active gases
349  int m_ngas = 8;
350  const std::vector<std::string> m_gas_names = {"H2O", "CO2", "O3", "N2O",
351  "CO" , "CH4", "O2", "N2" };
352  const std::vector<amrex::Real> m_mol_weight_gas = {18.01528, 44.00950, 47.9982, 44.0128,
353  28.01010, 16.04246, 31.9980, 28.0134}; // g/mol
354 
355  // Prescribed greenhouse gas surface concentrations in moles / moles air
356  amrex::Real m_co2vmr = 388.717e-6;
357  amrex::Vector<amrex::Real> m_o3vmr;
358  amrex::Real m_n2ovmr = 323.141e-9;
359  amrex::Real m_covmr = 1.0e-7;
360  amrex::Real m_ch4vmr = 1807.851e-9;
361  amrex::Real m_o2vmr = 0.209448;
362  amrex::Real m_n2vmr = 0.7906;
363  //amrex::Real m_f11vmr = 768.7644e-12;
364  //amrex::Real m_f12vmr = 531.2820e-12;
365 
368  std::vector<std::string> gas_names_offset;
369 
370  GasConcsK<amrex::Real, layout_t, KokkosDefaultDevice> m_gas_concs;
371 
372  // Process interface vars modeled after EAMXX
373  //===================================================================================
374 
375  // Keep track of number of columns and levels
376  int m_ncol;
377  int m_nlay;
378 
379  // Offsets for MultiFab <-> KOKKOS transfer
380  amrex::Vector<int> m_col_offsets;
381 
382  // Whether we use aerosol forcing in radiation
383  bool m_do_aerosol_rad = true;
384 
385  // Whether we do extra aerosol forcing calls
386  bool m_extra_clnsky_diag = false;
388 
389  // The orbital year, used for zenith angle calculations:
390  // If > 0, use constant orbital year for duration of simulation
391  // If < 0, use year from timestamp for orbital parameters
392  int m_orbital_year = -9999;
393  int m_orbital_mon = -9999;
394  int m_orbital_day = -9999;
395  int m_orbital_sec = -9999;
396 
397  // Orbital parameters, used for zenith angle calculations.
398  // If >= 0, bypass computation based on orbital year and use fixed parameters
399  // If < 0, compute based on orbital year, specified above
400  bool m_fixed_orbital_year = false;
401  amrex::Real m_orbital_eccen = -9999.; // Eccentricity
402  amrex::Real m_orbital_obliq = -9999.; // Obliquity
403  amrex::Real m_orbital_mvelp = -9999.; // Vernal Equinox Mean Longitude of Perihelion
404 
405  // Value for prescribing an invariant solar constant (i.e. total solar irradiance
406  // at TOA). Used for idealized experiments such as RCE. This is only used when a
407  // positive value is supplied.
408  amrex::Real m_fixed_total_solar_irradiance = -9999.;
409 
410  // Fixed solar zenith angle to use for shortwave calculations
411  // This is only used if a positive value is supplied
412  amrex::Real m_fixed_solar_zenith_angle = -9999.;
413 
414  // Need to hard-code some dimension sizes for now.
415  // TODO: find a better way of configuring this
416  int m_nswbands = 14;
417  int m_nlwbands = 16;
418  int m_nswgpts = 112;
419  int m_nlwgpts = 128;
420 
421  // Rad frequency in number of steps
423 
424  // Whether or not to do subcolumn sampling of cloud state for MCICA
425  bool m_do_subcol_sampling = true;
426 
427  // 1d size (1 or nlay)
429 
430  // 1d size (ncol)
446 
447  // 2d size (ncol, nlay)
466 
467  // 2d size (ncol, nlay+1)
491 
492  // 3d size (ncol, nlay+1, nswbands)
497 
498  // 3d size (ncol, nlay+1, nlwbands)
501 
502  // 2d size (ncol, nswbands)
505 
506  // 2d size (ncol, nlwbands)
508 
509  // 3d size (ncol, nlay, n[sw,lw]bands)
514 
515  // 3d size (ncol, nlay, n[sw,lw]bnds)
518 
519  // 3d size (ncol, nlay, n[sw,lw]gpts)
522 };
523 #endif
Kokkos::View< RealT *, KokkosDefaultDevice > real1d_k
Definition: ERF_Kokkos.H:17
Kokkos::View< RealT ***, layout_t, KokkosDefaultDevice > real3d_k
Definition: ERF_Kokkos.H:19
Kokkos::View< RealT **, layout_t, KokkosDefaultDevice > real2d_k
Definition: ERF_Kokkos.H:18
Definition: ERF_RadiationInterface.H:14
Definition: ERF_Radiation.H:45
real3d_k sw_bnd_flux_dn
Definition: ERF_Radiation.H:494
amrex::MultiFab * m_lon
Definition: ERF_Radiation.H:324
real2d_k lw_flux_up
Definition: ERF_Radiation.H:474
virtual amrex::Vector< std::string > get_lsm_output_varnames() override
Definition: ERF_Radiation.H:250
real3d_k aero_tau_sw
Definition: ERF_Radiation.H:510
int m_o3_size
Definition: ERF_Radiation.H:366
real3d_k sw_bnd_flux_dir
Definition: ERF_Radiation.H:495
real2d_k sw_clnsky_flux_dn
Definition: ERF_Radiation.H:483
std::string rrtmgp_coeffs_file_sw
Definition: ERF_Radiation.H:343
std::string rrtmgp_coeffs_sw
Definition: ERF_Radiation.H:339
real2d_k d_tint
Definition: ERF_Radiation.H:468
real2d_k lw_clnclrsky_flux_dn
Definition: ERF_Radiation.H:486
int m_rad_freq_in_steps
Definition: ERF_Radiation.H:422
real2d_k lwp
Definition: ERF_Radiation.H:460
real3d_k cld_tau_lw_gpt
Definition: ERF_Radiation.H:521
real1d_k lw_src
Definition: ERF_Radiation.H:445
real2d_k eff_radius_qi
Definition: ERF_Radiation.H:458
void dealloc_buffers()
Definition: ERF_Radiation.cpp:311
real1d_k m_gas_mol_weights
Definition: ERF_Radiation.H:367
amrex::Real m_lon_cons
Definition: ERF_Radiation.H:328
void initialize_impl()
Definition: ERF_Radiation.cpp:945
int m_nswbands
Definition: ERF_Radiation.H:416
bool m_do_aerosol_rad
Definition: ERF_Radiation.H:383
std::string rrtmgp_coeffs_lw
Definition: ERF_Radiation.H:340
bool m_moist
Definition: ERF_Radiation.H:296
std::string rrtmgp_cloud_optics_file_lw
Definition: ERF_Radiation.H:346
amrex::MultiFab * m_cons_in
Definition: ERF_Radiation.H:314
amrex::MultiFab datalog_mf
Definition: ERF_Radiation.H:335
Radiation(const int &lev, SolverChoice &sc)
Definition: ERF_Radiation.cpp:19
real2d_k sw_heating
Definition: ERF_Radiation.H:462
bool m_lsm
Definition: ERF_Radiation.H:300
bool m_do_subcol_sampling
Definition: ERF_Radiation.H:425
real3d_k lw_bnd_flux_dn
Definition: ERF_Radiation.H:500
bool m_rad_write_fluxes
Definition: ERF_Radiation.H:291
void set_lsm_inputs(LandSurfaceModelType *model)
Definition: ERF_Radiation.H:132
real3d_k sw_bnd_flux_up
Definition: ERF_Radiation.H:493
real2d_k qv_lay
Definition: ERF_Radiation.H:453
std::string rrtmgp_cloud_optics_file_sw
Definition: ERF_Radiation.H:345
amrex::Vector< std::string > m_lsm_output_names
Definition: ERF_Radiation.H:308
void run_impl()
Definition: ERF_Radiation.cpp:956
real2d_k sw_clnclrsky_flux_dn_dir
Definition: ERF_Radiation.H:478
real1d_k sfc_flux_dif_vis
Definition: ERF_Radiation.H:439
int m_step
Definition: ERF_Radiation.H:273
real2d_k lw_clnclrsky_flux_up
Definition: ERF_Radiation.H:485
real3d_k cld_tau_sw_gpt
Definition: ERF_Radiation.H:520
real1d_k lat
Definition: ERF_Radiation.H:441
void populateDatalogMF()
Definition: ERF_Radiation.cpp:721
real2d_k qi_lay
Definition: ERF_Radiation.H:455
real2d_k sw_clrsky_flux_up
Definition: ERF_Radiation.H:479
amrex::Real m_orbital_mvelp
Definition: ERF_Radiation.H:403
real2d_k t_lev
Definition: ERF_Radiation.H:470
amrex::Vector< amrex::Real > m_o3vmr
Definition: ERF_Radiation.H:357
real1d_k o3_lay
Definition: ERF_Radiation.H:428
std::string rrtmgp_cloud_optics_sw
Definition: ERF_Radiation.H:341
real1d_k sfc_alb_dif_vis
Definition: ERF_Radiation.H:435
int m_nlwgpts
Definition: ERF_Radiation.H:419
real1d_k mu0
Definition: ERF_Radiation.H:432
real2d_k cldfrac_tot
Definition: ERF_Radiation.H:456
real3d_k cld_tau_lw_bnd
Definition: ERF_Radiation.H:517
real1d_k sfc_flux_dir_nir
Definition: ERF_Radiation.H:438
amrex::MultiFab * m_z_phys
Definition: ERF_Radiation.H:320
real2d_k sw_clnclrsky_flux_up
Definition: ERF_Radiation.H:476
real3d_k aero_g_sw
Definition: ERF_Radiation.H:512
real2d_k sw_flux_up
Definition: ERF_Radiation.H:471
std::string rrtmgp_cloud_optics_lw
Definition: ERF_Radiation.H:342
real3d_k sw_bnd_flux_dif
Definition: ERF_Radiation.H:496
real2d_k sfc_alb_dif
Definition: ERF_Radiation.H:504
amrex::Real m_co2vmr
Definition: ERF_Radiation.H:356
bool m_extra_clnsky_diag
Definition: ERF_Radiation.H:386
real2d_k emis_sfc
Definition: ERF_Radiation.H:507
real1d_k sfc_alb_dif_nir
Definition: ERF_Radiation.H:436
amrex::MultiFab * m_lsm_fluxes
Definition: ERF_Radiation.H:331
virtual void Init(const amrex::Geometry &geom, const amrex::BoxArray &ba, amrex::MultiFab *cons_in) override
Definition: ERF_Radiation.H:63
real2d_k lw_clnsky_flux_dn
Definition: ERF_Radiation.H:490
amrex::BoxArray m_ba
Definition: ERF_Radiation.H:285
real2d_k p_lay
Definition: ERF_Radiation.H:449
real2d_k r_lay
Definition: ERF_Radiation.H:448
int m_ncol
Definition: ERF_Radiation.H:376
real2d_k sw_flux_dn_dir
Definition: ERF_Radiation.H:473
const std::vector< amrex::Real > m_mol_weight_gas
Definition: ERF_Radiation.H:352
amrex::Real m_lat_cons
Definition: ERF_Radiation.H:327
amrex::Real m_fixed_total_solar_irradiance
Definition: ERF_Radiation.H:408
void kokkos_buffers_to_mf(amrex::Vector< amrex::MultiFab * > &lsm_output_ptrs)
Definition: ERF_Radiation.cpp:591
std::vector< std::string > gas_names_offset
Definition: ERF_Radiation.H:368
real2d_k sw_clrsky_flux_dn
Definition: ERF_Radiation.H:480
amrex::Real m_dt
Definition: ERF_Radiation.H:279
virtual amrex::Vector< std::string > get_lsm_input_varnames() override
Definition: ERF_Radiation.H:242
int m_orbital_mon
Definition: ERF_Radiation.H:393
real3d_k aero_ssa_sw
Definition: ERF_Radiation.H:511
real2d_k sw_clnsky_flux_dn_dir
Definition: ERF_Radiation.H:484
amrex::Real m_o2vmr
Definition: ERF_Radiation.H:361
void rad_run_impl(amrex::Vector< amrex::MultiFab * > &lsm_output_ptrs)
Definition: ERF_Radiation.H:228
GasConcsK< amrex::Real, layout_t, KokkosDefaultDevice > m_gas_concs
Definition: ERF_Radiation.H:370
amrex::MultiFab * m_qheating_rates
Definition: ERF_Radiation.H:317
real2d_k qc_lay
Definition: ERF_Radiation.H:454
virtual void WriteDataLog(const amrex::Real &time) override
Definition: ERF_Radiation.cpp:810
real2d_k lw_clrsky_flux_up
Definition: ERF_Radiation.H:487
amrex::Real m_n2ovmr
Definition: ERF_Radiation.H:358
amrex::Real m_rad_t_sfc
Definition: ERF_Radiation.H:311
std::string rrtmgp_file_path
Definition: ERF_Radiation.H:338
real2d_k sw_flux_dn
Definition: ERF_Radiation.H:472
amrex::MultiFab * m_lsm_zenith
Definition: ERF_Radiation.H:332
int m_nlwbands
Definition: ERF_Radiation.H:417
real2d_k tmp2d
Definition: ERF_Radiation.H:459
virtual void Run(int &level, int &step, amrex::Real &time, const amrex::Real &dt, const amrex::BoxArray &ba, amrex::Geometry &geom, amrex::MultiFab *cons_in, amrex::MultiFab *lsm_fluxes, amrex::MultiFab *lsm_zenith, amrex::Vector< amrex::MultiFab * > &lsm_input_ptrs, amrex::Vector< amrex::MultiFab * > &lsm_output_ptrs, amrex::MultiFab *qheating_rates, amrex::MultiFab *z_phys, amrex::MultiFab *lat, amrex::MultiFab *lon) override
Definition: ERF_Radiation.H:91
real2d_k lw_clrsky_flux_dn
Definition: ERF_Radiation.H:488
amrex::Real m_orbital_eccen
Definition: ERF_Radiation.H:401
void finalize_impl(amrex::Vector< amrex::MultiFab * > &lsm_output_ptrs)
Definition: ERF_Radiation.cpp:1213
amrex::Real m_covmr
Definition: ERF_Radiation.H:359
int m_orbital_sec
Definition: ERF_Radiation.H:395
real2d_k z_del
Definition: ERF_Radiation.H:451
real2d_k p_del
Definition: ERF_Radiation.H:452
real3d_k aero_tau_lw
Definition: ERF_Radiation.H:513
real2d_k lw_flux_dn
Definition: ERF_Radiation.H:475
~Radiation()
Definition: ERF_Radiation.H:55
void mf_to_kokkos_buffers(amrex::Vector< amrex::MultiFab * > &lsm_input_ptrs)
Definition: ERF_Radiation.cpp:419
real2d_k sw_clrsky_flux_dn_dir
Definition: ERF_Radiation.H:481
void write_rrtmgp_fluxes()
Definition: ERF_Radiation.cpp:680
std::string rrtmgp_coeffs_file_lw
Definition: ERF_Radiation.H:344
int m_lev
Definition: ERF_Radiation.H:270
real1d_k sfc_flux_dif_nir
Definition: ERF_Radiation.H:440
int m_ngas
Definition: ERF_Radiation.H:349
real2d_k lw_heating
Definition: ERF_Radiation.H:463
real1d_k sfc_alb_dir_nir
Definition: ERF_Radiation.H:434
real2d_k lw_clnsky_flux_up
Definition: ERF_Radiation.H:489
amrex::Real m_ch4vmr
Definition: ERF_Radiation.H:360
bool m_update_rad
Definition: ERF_Radiation.H:288
real2d_k sfc_alb_dir
Definition: ERF_Radiation.H:503
bool m_ice
Definition: ERF_Radiation.H:297
amrex::Real m_fixed_solar_zenith_angle
Definition: ERF_Radiation.H:412
real1d_k lon
Definition: ERF_Radiation.H:442
int m_orbital_day
Definition: ERF_Radiation.H:394
real1d_k sfc_emis
Definition: ERF_Radiation.H:443
amrex::Real m_orbital_obliq
Definition: ERF_Radiation.H:402
amrex::Real m_n2vmr
Definition: ERF_Radiation.H:362
real3d_k cld_tau_sw_bnd
Definition: ERF_Radiation.H:516
bool m_fixed_orbital_year
Definition: ERF_Radiation.H:400
real2d_k sw_clnsky_flux_up
Definition: ERF_Radiation.H:482
int m_nlay
Definition: ERF_Radiation.H:377
real3d_k lw_bnd_flux_up
Definition: ERF_Radiation.H:499
int m_nswgpts
Definition: ERF_Radiation.H:418
bool m_first_step
Definition: ERF_Radiation.H:293
real1d_k sfc_alb_dir_vis
Definition: ERF_Radiation.H:433
const std::vector< std::string > m_gas_names
Definition: ERF_Radiation.H:350
real2d_k sw_clrsky_heating
Definition: ERF_Radiation.H:464
bool m_extra_clnclrsky_diag
Definition: ERF_Radiation.H:387
real2d_k t_lay
Definition: ERF_Radiation.H:450
void set_grids(int &level, int &step, amrex::Real &time, const amrex::Real &dt, const amrex::BoxArray &ba, amrex::Geometry &geom, amrex::MultiFab *cons_in, amrex::MultiFab *lsm_fluxes, amrex::MultiFab *lsm_zenith, amrex::Vector< amrex::MultiFab * > &lsm_input_ptrs, amrex::MultiFab *qheating_rates, amrex::MultiFab *z_phys, amrex::MultiFab *lat, amrex::MultiFab *lon)
Definition: ERF_Radiation.cpp:118
real1d_k sfc_flux_dir_vis
Definition: ERF_Radiation.H:437
real2d_k iwp
Definition: ERF_Radiation.H:461
amrex::Geometry m_geom
Definition: ERF_Radiation.H:282
amrex::MultiFab * m_lat
Definition: ERF_Radiation.H:323
real2d_k p_lev
Definition: ERF_Radiation.H:469
real2d_k lw_clrsky_heating
Definition: ERF_Radiation.H:465
real2d_k eff_radius_qc
Definition: ERF_Radiation.H:457
real1d_k cosine_zenith
Definition: ERF_Radiation.H:431
amrex::Vector< int > m_col_offsets
Definition: ERF_Radiation.H:380
real1d_k t_sfc
Definition: ERF_Radiation.H:444
void alloc_buffers()
Definition: ERF_Radiation.cpp:185
int m_orbital_year
Definition: ERF_Radiation.H:392
real2d_k sw_clnclrsky_flux_dn
Definition: ERF_Radiation.H:477
amrex::Vector< std::string > m_lsm_input_names
Definition: ERF_Radiation.H:303
amrex::Real m_time
Definition: ERF_Radiation.H:276
Definition: ERF_DataStruct.H:123