ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
AerRadProps Class Reference

#include <ERF_AeroRadProps.H>

Collaboration diagram for AerRadProps:

Public Member Functions

 AerRadProps ()=default
 
 ~AerRadProps ()=default
 
void initialize (int num_gas, int num_modes, int naeroes, int nswbands_, int nlwbands_, int ncoloum, int nlevel, int num_rh, int top_levels, const std::vector< std::string > &aerosol_names, const real2d &zint, const real2d &pmiddle, const real2d &pdel, const real2d &temperature, const real2d &qtotal, const real2d &geom_rad)
 
void aer_rad_props_sw (const int &list_idx, const real &dt, const int &nnite, const int1d &idxnite, const bool is_cmip6_volc, const real3d &tau, const real3d &tau_w, const real3d &tau_w_g, const real3d &tau_w_f, const real2d &clear_rh)
 
void aer_rad_props_lw (const bool &is_cmip6_volc, const int &list_idx, const real &dt, const real2d &zi, const real3d &odap_aer, const real2d &clear_rh)
 
void get_hygro_rad_props (const int &ncol, const int2d &krh, const real2d &wrh, const real2d &mass, const real2d &ext, const real2d &ssa, const real2d &assm, const real3d &tau, const real3d &tau_w, const real3d &tau_w_g, const real3d &tau_w_f)
 
void get_nonhygro_rad_props (const int &ncol, const real2d &mass, const real1d &ext, const real1d &ssa, const real1d &assm, const real3d &tau, const real3d &tau_w, const real3d &tau_w_g, const real3d &tau_w_f)
 
void get_volcanic_radius_rad_props (const int &ncol, const real2d &mass, const real2d &r_ext, const real2d &r_scat, const real2d &r_ascat, const real1d &r_mu, const real3d &tau, const real3d &tau_w, const real3d &tau_w_g, const real3d &tau_w_f)
 
void volcanic_cmip_sw (const int1d &trop_level, const real2d &zi, const real3d &ext_cmip6_sw_inv_m, const real3d &ssa_cmip6_sw, const real3d &af_cmip6_sw, const real3d &tau, const real3d &tau_w, const real3d &tau_w_g, const real3d &tau_w_f)
 
void get_volcanic_rad_props (const int &ncol, const real2d &mass, const real1d &ext, const real1d &scat, const real1d &ascat, const real3d &tau, const real3d &tau_w, const real3d &tau_w_g, const real3d &tau_w_f)
 
void aer_vis_diag_out (const int &ncol, const int &nnite, const int1d &idxnite, const int &iaer, const real2d &tau, const int &diag_idx)
 

Private Attributes

int nmodes
 
int ngas
 
int num_aeroes
 
std::vector< std::string > aero_names
 
int nswbands
 
int nlwbands
 
int ncol
 
int nlev
 
int nrh
 
int top_lev
 
MamConstituents mam_consti
 
Mam4_aer mam_aer
 
real2d pdeldry
 
real2d pmid
 
real2d temp
 
real2d qt
 
real2d geometric_radius
 
real2d zi
 
real3d ext_cmip6_sw
 
real3d ssa_cmip6_sw
 
real3d af_cmip6_sw
 

Constructor & Destructor Documentation

◆ AerRadProps()

AerRadProps::AerRadProps ( )
default

◆ ~AerRadProps()

AerRadProps::~AerRadProps ( )
default

Member Function Documentation

◆ aer_rad_props_lw()

void AerRadProps::aer_rad_props_lw ( const bool &  is_cmip6_volc,
const int &  list_idx,
const real &  dt,
const real2d &  zi,
const real3d &  odap_aer,
const real2d &  clear_rh 
)
310 {
311  int numaerosols; // number of bulk aerosols in climate/diagnostic list
312  int nmodes; // number of aerosol modes in climate/diagnostic list
313  std::string opticstype; // hygro or nonhygro
314 
315  // optical props for each aerosol
316  real1d lw_abs("lw_abs", ncol);
317  real2d lw_hygro_abs("lw_hygro", ncol, nlev);
318  real2d geometric_radius("geometric_radius", ncol, nlev);
319 
320  // volcanic lookup table
321  real2d r_lw_abs("r_lw_abs", ncol, nlev); // radius dependent mass-specific absorption coefficient
322  real1d r_mu("r_mu", ncol); // log(geometric_mean_radius) domain samples of r_lw_abs(:,:)
323  real2d mu("mu", ncol, nlev); // log(geometric_radius)
324  //real r_mu_min, r_mu_max, wmu, mutrunc;
325  //int nmu, kmu;
326 
327  // for table lookup into rh grid
328  real2d es("es", ncol, nlev); // saturation vapor pressure
329  real2d qs("qs", ncol, nlev); // saturation specific humidity
330  real2d rh("rh", ncol, nlev);
331  real2d rhtrunc("rhtrunc", ncol, nlev);
332  real2d wrh("wrh", ncol, nlev);
333  int2d krh("krh", ncol, nlev);
334 
335  // aerosol (vertical) mass path and extinction aerosol masses
336  real2d aermmr("aermmr", ncol, nlev); // mass mixing ratio of aerosols
337  real2d mmr_to_mass("mmr_to_mass", ncol, nlev); // conversion factor for mmr to mass
338  real2d aermass("aermass", ncol, nlev); // mass of aerosols
339 
340  //For cmip6 volcanic file
341  int1d trop_level("trop_level", ncol);
342  //real lyr_thk;
343  real3d ext_cmip6_lw("ext_cmip6_lw", ncol, nlev, nlwbands);
344  real3d ext_cmip6_lw_inv_m("ext_cmip6_lw_inv_m",ncol, nlev, nlwbands); //long wave extinction in the units of 1/m
345 
346  const real km_inv_to_m_inv = 0.001;
347 
348  // get number of bulk aerosols and number of modes in current list
349  mam_consti.get_nmodes(list_idx, nmodes);
350  mam_consti.get_naero(list_idx, numaerosols);
351 
352  // Contributions from modal aerosols.
353  if (nmodes > 0) {
354  mam_aer.modal_aero_lw(list_idx, dt, pdeldry, pmid, temp, qt, odap_aer,clear_rh);
355  } else {
356  yakl::memset(odap_aer, 0.);
357  }
358 
359  // Contributions from bulk aerosols.
360  if (numaerosols > 0) {
361 
362  // compute mixing ratio to mass conversion
363  parallel_for(SimpleBounds<2>(ncol, nlev), YAKL_LAMBDA (int icol, int ilev)
364  {
365  mmr_to_mass(icol,ilev) = rga * pdeldry(icol,ilev);
366  });
367 
368  // calculate relative humidity for table lookup into rh grid
369  parallel_for(SimpleBounds<2>(ncol, nlev), YAKL_LAMBDA (int icol, int ilev)
370  {
371  WaterVaporSat::qsat(temp(icol,ilev), pmid(icol,ilev), es(icol,ilev), qs(icol,ilev));
372  rh(icol,ilev) = qt(icol,ilev) / qs(icol,ilev);
373 
374  rhtrunc(icol, ilev) = std::min(rh(icol, ilev),1.);
375  krh(icol, ilev) = std::min(std::floor(rhtrunc(icol, ilev) * nrh ) + 1, nrh - 1.); // index into rh mesh
376  wrh(icol, ilev) = rhtrunc(icol, ilev) * nrh - krh(icol, ilev); // (-) weighting on left side values
377  });
378  }
379 
380  yakl::memset(ext_cmip6_lw, 0.);
381  if(is_cmip6_volc) {
382  // Logic:
383  // Update odap_aer with the read in volcanic aerosol extinction (1/km).
384  // It needs to be converted to 1/m and multiplied by layer thickness first.
385 
386  // Obtain read in values for ext from the volcanic input file
387  // call pbuf_get_field(pbuf, idx_ext_lw, ext_cmip6_lw)
388  // call outfld('extinct_lw_inp',ext_cmip6_lw(:,:,idx_lw_diag), pcols, lchnk)
389  // ext_cmip6_lw_inv_m = ext_cmip6_lw * km_inv_to_m_inv !convert from 1/km to 1/m
390  //
391  // Above the tropopause, the read in values from the file include both the stratospheric
392  // and volcanic aerosols. Therefore, we need to zero out odap_aer above the tropopause
393  // and populate it exclusively from the read in values.
394 
395  // Find tropopause
396  // trop_level has value for tropopause for each column
397  // tropopause_find(state, trop_level)
398  real1d strop("strop",1);
399  parallel_for(SimpleBounds<1>(ncol), YAKL_LAMBDA (int i)
400  {
401  // Search from the bottom up, looking for the first minimum.
402  int tlev = -1;
403  for (auto k = nlev-1; k > 0; --k) {
404  real stobie = 0.03 * temp(i,k) - std::log10(pmid(i, k));
405  if (pmid(i, k) <= 4000.) break;
406  if (pmid(i, k) >= 55000.) continue;
407  if ((tlev == -1) || (stobie < strop(0))) {
408  tlev = k;
409  strop(0) = stobie;
410  }
411  }
412  if (tlev != -1) trop_level(i) = tlev;
413  });
414 
415  // Quit if tropopause is not found
416  if (yakl::intrinsics::any(yakl::componentwise::operator==(trop_level, -1)))
417  amrex::Print() << "aer_rad_props_lw: tropopause not found\n";
418 
419  // If tropopause is found, update taus with 50% contributuions from the volcanic input
420  // file and 50% from the existing model computed values
421  // First handle the case of tropopause layer itself:
422  parallel_for(SimpleBounds<2>(ncol, nlwbands), YAKL_LAMBDA (int icol, int ilw)
423  {
424  int ilev_tropp = trop_level(icol); //tropopause level
425  auto lyr_thk = zi(icol,ilev_tropp) - zi(icol,ilev_tropp+1); //in meters
426  auto ext_cmip6_inv_m = km_inv_to_m_inv * ext_cmip6_lw_inv_m(icol,ilev_tropp,ilw);
427  odap_aer(icol,ilev_tropp,ilw) = 0.5 * (odap_aer(icol,ilev_tropp,ilw) + lyr_thk * ext_cmip6_inv_m);
428  });
429 
430  // As it will be more efficient for FORTRAN to loop over levels and then columns, the following loops
431  // are nested keeping that in mind
432  parallel_for(SimpleBounds<3>(ncol, nlev, nlwbands), YAKL_LAMBDA (int icol, int ilev, int ilw)
433  {
434  int ilev_tropp = trop_level(icol); //tropopause level
435  if (ilev < ilev_tropp) {
436  //auto lyr_thk = zi(icol,ilev) - zi(icol,ilev+1);
437  // odap_aer(icol,ilev,ilw) = lyr_thk * ext_cmip6_lw_inv_m(icol,ilev,ilw);
438  }
439  });
440  }
441 
442 
443  // Loop over bulk aerosols in list.
444  for (auto iaerosol = 0; iaerosol < numaerosols; ++iaerosol) {
445 
446  // get aerosol mass mixing ratio
447  // mam_consti.rad_cnst_get_aer_mmr(list_idx, iaerosol, aermmr);
448  parallel_for(SimpleBounds<2>(ncol, nlev), YAKL_LAMBDA (int icol, int ilev)
449  {
450  if (ilev < top_lev) {
451  aermass(icol,ilev) = 0.;
452  } else {
453  aermass(icol,ilev) = aermmr(icol,ilev) * mmr_to_mass(icol,ilev);
454  }
455  });
456 
457  // get optics type
458  mam_consti.get_aer_opticstype(list_idx, iaerosol, opticstype);
459 
460  if (opticstype == "hygroscopic") {
461  // get optical properties for hygroscopic aerosols
462  mam_consti.get_aer_lw_hygro_abs(list_idx, iaerosol, lw_hygro_abs);
463  parallel_for(SimpleBounds<3>(ncol, nlev, nlwbands), YAKL_LAMBDA (int icol, int ilev, int bnd_idx)
464  {
465  odap_aer(icol, ilev, bnd_idx) = odap_aer(icol, ilev, bnd_idx) + aermass(icol, ilev) *
466  ((1 + wrh(icol,ilev)) * lw_hygro_abs(krh(icol, ilev)+1,bnd_idx)
467  - wrh(icol, ilev) * lw_hygro_abs(krh(icol, ilev), bnd_idx));
468  });
469  } else if (opticstype == "insoluble" ||
470  opticstype == "nonhygro" ||
471  opticstype == "hygro" ||
472  opticstype == "volcanic") {
473  // get optical properties for hygroscopic aerosols
474  mam_consti.get_aer_lw_abs(list_idx, iaerosol, lw_abs);
475  parallel_for(SimpleBounds<3>(ncol, nlev, nlwbands), YAKL_LAMBDA (int icol, int ilev, int bnd_idx)
476  {
477  odap_aer(icol,ilev,bnd_idx) = odap_aer(icol,ilev,bnd_idx) + lw_abs(bnd_idx)*aermass(icol,ilev);
478  });
479  } else if (opticstype == "volcanic_radius") {
480  // get optical properties for hygroscopic aerosols
481  mam_consti.get_aer_r_lw_abs(list_idx, iaerosol, r_lw_abs);
482  mam_consti.get_aer_mu(list_idx, iaerosol, r_mu);
483  // get microphysical properties for volcanic aerosols
484  // idx = pbuf_get_index('VOLC_RAD_GEOM')
485  // call pbuf_get_field(pbuf, idx, geometric_radius )
486 
487  // interpolate in radius
488  // caution: clip the table with no warning when outside bounds
489  parallel_for(SimpleBounds<2>(ncol, nlev), YAKL_LAMBDA (int icol, int ilev)
490  {
491  auto nmu = r_mu.extent(0);
492  auto r_mu_max = r_mu(nmu);
493  auto r_mu_min = r_mu(1);
494 
495  if(geometric_radius(icol,ilev) > 0.) {
496  mu(icol,ilev) = std::log(geometric_radius(icol,ilev));
497  } else {
498  mu(icol,ilev) = 0.;
499  }
500  auto mutrunc = std::max(std::min(mu(icol,ilev),r_mu_max),r_mu_min);
501  auto kmu = std::max(std::min(1 + (mutrunc-r_mu_min)/(r_mu_max-r_mu_min)*(nmu-1),nmu-1.),1.);
502  auto wmu = std::max(std::min( (mutrunc -r_mu(kmu)) / (r_mu(kmu+1) - r_mu(kmu)) ,1.),0.);
503  for (auto bnd_idx = 0; bnd_idx < nlwbands; ++bnd_idx) {
504  odap_aer(icol,ilev,bnd_idx) = odap_aer(icol,ilev,bnd_idx) +
505  aermass(icol,ilev) * ((1. - wmu) * r_lw_abs(bnd_idx, kmu) +
506  (wmu) * r_lw_abs(bnd_idx, kmu+1));
507  }
508  });
509  }
510  }
511 }
constexpr amrex::Real rga
Definition: ERF_Constants.H:71
real2d temp
Definition: ERF_AeroRadProps.H:127
real2d pdeldry
Definition: ERF_AeroRadProps.H:125
real2d geometric_radius
Definition: ERF_AeroRadProps.H:129
int nlev
Definition: ERF_AeroRadProps.H:116
int nmodes
Definition: ERF_AeroRadProps.H:112
int ncol
Definition: ERF_AeroRadProps.H:116
MamConstituents mam_consti
Definition: ERF_AeroRadProps.H:119
int top_lev
Definition: ERF_AeroRadProps.H:116
real2d qt
Definition: ERF_AeroRadProps.H:127
int nrh
Definition: ERF_AeroRadProps.H:116
real2d pmid
Definition: ERF_AeroRadProps.H:127
real2d zi
Definition: ERF_AeroRadProps.H:131
int nlwbands
Definition: ERF_AeroRadProps.H:115
Mam4_aer mam_aer
Definition: ERF_AeroRadProps.H:122
void modal_aero_lw(int list_idx, real dt, const real2d &pdeldry, const real2d &pmid, const real2d &temperature, const real2d &qt, const real3d &tauxar, const real2d &clear_rh)
Definition: ERF_Mam4Aero.H:559
void get_aer_lw_hygro_abs(int list_idx, int aer_idx, real2d &lw_hygro_abs) const
Definition: ERF_Mam4Constitutents.H:1025
void get_aer_lw_abs(int list_idx, int aer_idx, real1d &lw_abs) const
Definition: ERF_Mam4Constitutents.H:1079
void get_aer_mu(int list_idx, int aer_idx, real1d &mu) const
Definition: ERF_Mam4Constitutents.H:1148
void get_nmodes(int list_idx, int &nmodes) const
Definition: ERF_Mam4Constitutents.H:350
void get_aer_opticstype(int list_idx, int aer_idx, std::string &opticstype) const
Definition: ERF_Mam4Constitutents.H:989
void get_aer_r_lw_abs(int list_idx, int aer_idx, real2d &r_lw_abs) const
Definition: ERF_Mam4Constitutents.H:1139
void get_naero(int list_idx, int &naero) const
Definition: ERF_Mam4Constitutents.H:362
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE void qsat(const amrex::Real &t, const amrex::Real &p, amrex::Real &es, amrex::Real &qs, amrex::Real *gam=nullptr, amrex::Real *dqsdt=nullptr, amrex::Real *enthalpy=nullptr)
Definition: ERF_WaterVaporSaturation.H:152

Referenced by Optics::set_aerosol_optics_lw().

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

◆ aer_rad_props_sw()

void AerRadProps::aer_rad_props_sw ( const int &  list_idx,
const real &  dt,
const int &  nnite,
const int1d &  idxnite,
const bool  is_cmip6_volc,
const real3d &  tau,
const real3d &  tau_w,
const real3d &  tau_w_g,
const real3d &  tau_w_f,
const real2d &  clear_rh 
)
59 {
60  // for cmip6 style volcanic file
61  int1d trop_level("trop_level", ncol);
62  real3d ext_cmip6_sw_inv_m("ext_cmip6_sw_inv_m", ncol, nlev, nswbands); // short wave extinction in the units of 1/m
63 
64  // compute mixing ratio to mass conversion
65  real2d mmr_to_mass("mmr_to_mass", ncol, nlev); // conversion factor for mmr to mass
66  parallel_for(SimpleBounds<2>(ncol, nlev) , YAKL_LAMBDA (int icol, int ilev)
67  {
68  mmr_to_mass(icol,ilev) = rga * pdeldry(icol,ilev);
69  });
70 
71  // initialize to conditions that would cause failure
72  yakl::memset(tau , -100.);
73  yakl::memset(tau_w , -100.);
74  yakl::memset(tau_w_g, -100.);
75  yakl::memset(tau_w_f, -100.);
76  yakl::memset(ext_cmip6_sw_inv_m, 1.0e-3);
77 
78  // top layer (ilev = 0) has no aerosol (ie tau = 0)
79  // also initialize rest of layers to accumulate od's
80  parallel_for(SimpleBounds<2>(ncol, nswbands) , YAKL_LAMBDA (int icol, int isw)
81  {
82  tau (icol,1,isw) = 0.;
83  tau_w (icol,1,isw) = 0.;
84  tau_w_g(icol,1,isw) = 0.;
85  tau_w_f(icol,1,isw) = 0.;
86  });
87 
88  // local variables
89  real2d wrh("wrh", ncol, nlev);
90  int2d krh("krh", ncol, nlev);
91  // calculate relative humidity for table lookup into rh grid
92  parallel_for(SimpleBounds<2>(ncol, nlev), YAKL_LAMBDA (int icol, int ilev)
93  {
94  real es, qs, rh, rhtrunc;
95  WaterVaporSat::qsat(temp(icol,ilev), pmid(icol,ilev), es, qs);
96  rh = qt(icol,ilev)/qs;
97  rhtrunc = std::min(rh,1.);
98  krh(icol, ilev) = std::min(std::floor(rhtrunc*nrh )+1., nrh - 1.); // index into rh mesh
99  wrh(icol, ilev) = rhtrunc*nrh-krh(icol, ilev); // (-) weighting on left side values
100  });
101 
102  // Special treatment for CMIP6 volcanic aerosols, where extinction, ssa
103  // and af are directly read from the prescribed volcanic aerosol file
104 
105  // Point ext_cmip6_sw to null so that the code breaks if they are used for is_cmip6_volc=.false. case
106  // This is done to avoid having optional arguments in modal_aero_sw call
107  yakl::memset(trop_level, 10000);
108 
109  // I was thinking whether we have to include volcanic effects on radiation? (xyuan)
110  if (is_cmip6_volc) {
111  // get extinction so as to supply to modal_aero_sw routine for computing EXTINCT variable
112  // converting it from 1/km to 1/m
113  // call pbuf_get_field(pbuf, idx_ext_sw, ext_cmip6_sw)
114  // call outfld('extinct_sw_inp',ext_cmip6_sw(:,:,idx_sw_diag), pcols, lchnk)
115  parallel_for(SimpleBounds<3>(ncol, nlev, nswbands), YAKL_LAMBDA (int icol, int ilev, int isw)
116  {
117  ext_cmip6_sw_inv_m(icol, ilev, isw) = 1.0e-3; //*ext_cmip6_sw(icol, ilev, isw); //convert from 1/km to 1/m
118  });
119 
120  //Find tropopause as extinction should be applied only above tropopause
121  //trop_level has value for tropopause for each column
122  //tropopause_find(state, trop_level)
123  // Iterate over all of the columns to find the troppause
124  real1d strop("strop",1);
125  parallel_for(SimpleBounds<1>(ncol), YAKL_LAMBDA (int i)
126  {
127  // Search from the bottom up, looking for the first minimum.
128  int tlev = -1;
129  for (auto k = nlev-1; k > 0; --k) {
130  real stobie = 0.03 * temp(i,k) - std::log10(pmid(i, k));
131  if (pmid(i, k) <= 4000.) break;
132  if (pmid(i, k) >= 55000.) continue;
133  if ((tlev == -1) || (stobie < strop(1))) {
134  tlev = k;
135  strop(1) = stobie;
136  }
137  }
138  if (tlev != -1) trop_level(i) = tlev;
139  });
140 
141  //Quit if tropopause is not found
142  if (yakl::intrinsics::any(yakl::componentwise::operator==(trop_level, -1))) {
143  amrex::Print() << "aer_rad_props.F90: subr aer_rad_props_sw: tropopause not found\n";
144  }
145  }
146 
147  // get number of bulk aerosols and number of modes in current list
148  mam_consti.get_nmodes(list_idx, nmodes);
149  mam_consti.get_ngas(list_idx, ngas);
150  mam_consti.get_naero(list_idx, num_aeroes);
151 
152  // Contributions from modal aerosols.
153  if (nmodes > 0) {
154  real2d ext_cmip6_sw_2d("ext_cmip6_sw",ncol,nlev);
155  parallel_for(SimpleBounds<3>(ncol, nlev, nswbands), YAKL_LAMBDA (int icol, int ilev, int isw)
156  {
157  ext_cmip6_sw_2d(icol,ilev) = ext_cmip6_sw_inv_m(icol,ilev,RadConstants::idx_sw_diag);
158  });
159 
160  mam_aer.modal_aero_sw(list_idx, dt, nnite, idxnite, is_cmip6_volc,
161  pdeldry, pmid, temp, qt, ext_cmip6_sw_2d,
162  trop_level, tau, tau_w, tau_w_g, tau_w_f, clear_rh);
163  } else {
164  yakl::memset(tau, 0.);
165  yakl::memset(tau_w, 0.);
166  yakl::memset(tau_w_g, 0.);
167  yakl::memset(tau_w_f, 0.);
168  }
169 
170 #if 1
171  if (is_cmip6_volc) {
172  //update tau, tau_w, tau_w_g, and tau_w_f with the read in values of extinction, ssa and asymmetry factors
173  volcanic_cmip_sw (trop_level, zi, ext_cmip6_sw_inv_m, ssa_cmip6_sw, af_cmip6_sw,
174  tau, tau_w, tau_w_g, tau_w_f);
175  }
176 
177  // Contributions from bulk aerosols.
178  for (auto iaero = 0; iaero < num_aeroes; ++iaero) {
179  // aerosol masses
180  real2d aermmr("aermmr", ncol, nlev); // mass mixing ratio of aerosols
181  real2d aermass("aermass", ncol, nlev); // mass of aerosols
182 
183  yakl::memset(aermmr, 1.0e-2);
184  // get bulk aerosol mass mixing ratio
185  // mam_consti.rad_cnst_get_aer_mmr(list_idx, iaero, aermmr);
186  parallel_for(SimpleBounds<2>(ncol, nlev), YAKL_LAMBDA (int icol, int ilev)
187  {
188  if (ilev < top_lev) {
189  aermass(icol,ilev) = 0.;
190  } else {
191  aermass(icol,ilev) = aermmr(icol,ilev) * mmr_to_mass(icol,ilev);
192  }
193  });
194 
195  std::string opticstype; // hygro or nonhygro
196  // get optics type
197  mam_consti.get_aer_opticstype(list_idx, iaero, opticstype);
198 
199  // radiative properties for each aerosol
200  real3d ta("ta", ncol, nlev, nswbands);
201  real3d tw("tw", ncol, nlev, nswbands);
202  real3d twf("twf", ncol, nlev, nswbands);
203  real3d twg("twg", ncol, nlev, nswbands);
204 
205  if (opticstype == "hygro") {
206  // get optical properties for hygroscopic aerosols
207  // optical props for each aerosol hygroscopic
208  real2d h_ext("h_ext", ncol, nlev);
209  real2d h_ssa("h_ssa", ncol, nlev);
210  real2d h_asm("h_asm", ncol, nlev);
211  mam_consti.get_aer_sw_hygro_ext(list_idx, iaero, h_ext);
212  mam_consti.get_aer_sw_hygro_ssa(list_idx, iaero, h_ssa);
213  mam_consti.get_aer_sw_hygro_asm(list_idx, iaero, h_asm);
214  get_hygro_rad_props(ncol, krh, wrh, aermass, h_ext, h_ssa, h_asm, ta, tw, twg, twf);
215  parallel_for(SimpleBounds<3>(ncol, nlev, nswbands), YAKL_LAMBDA (int icol, int ilev, int isw)
216  {
217  tau (icol,ilev,isw) = tau (icol,ilev,isw) + ta (icol,ilev,isw);
218  tau_w (icol,ilev,isw) = tau_w (icol,ilev,isw) + tw (icol,ilev,isw);
219  tau_w_g(icol,ilev,isw) = tau_w_g(icol,ilev,isw) + twg(icol,ilev,isw);
220  tau_w_f(icol,ilev,isw) = tau_w_f(icol,ilev,isw) + twf(icol,ilev,isw);
221  });
222  } else if (opticstype == "nonhygro") {
223  // get optical properties for non-hygroscopic aerosols
224  // non-hygroscopic
225  real1d n_ext("n_ext", ncol);
226  real1d n_ssa("n_ssa", ncol);
227  real1d n_asm("n_asm", ncol);
228  mam_consti.get_aer_sw_nonhygro_ext(list_idx, iaero, n_ext);
229  mam_consti.get_aer_sw_nonhygro_ssa(list_idx, iaero, n_ssa);
230  mam_consti.get_aer_sw_nonhygro_asm(list_idx, iaero, n_asm);
231  get_nonhygro_rad_props(ncol, aermass, n_ext, n_ssa, n_asm, ta, tw, twg, twf);
232  parallel_for(SimpleBounds<3>(ncol, nlev, nswbands), YAKL_LAMBDA (int icol, int ilev, int isw)
233  {
234  tau (icol,ilev,isw) = tau (icol,ilev,isw) + ta (icol,ilev,isw);
235  tau_w (icol,ilev,isw) = tau_w (icol,ilev,isw) + tw (icol,ilev,isw);
236  tau_w_g(icol,ilev,isw) = tau_w_g(icol,ilev,isw) + twg(icol,ilev,isw);
237  tau_w_f(icol,ilev,isw) = tau_w_f(icol,ilev,isw) + twf(icol,ilev,isw);
238  });
239  } else if (opticstype == "volcanic") {
240  // get optical properties for volcanic aerosols
241  real1d n_ext("n_ext", ncol);
242  real1d n_scat("n_scat", ncol);
243  real1d n_ascat("n_ascat", ncol);
244  mam_consti.get_aer_sw_nonhygro_ext(list_idx, iaero, n_ext);
245  mam_consti.get_aer_sw_nonhygro_scat(list_idx, iaero, n_scat);
246  mam_consti.get_aer_sw_nonhygro_ascat(list_idx, iaero, n_ascat);
247  get_volcanic_rad_props(ncol, aermass, n_ext, n_scat, n_ascat, ta, tw, twg, twf);
248  parallel_for(SimpleBounds<3>(ncol, nlev, nswbands), YAKL_LAMBDA (int icol, int ilev, int isw)
249  {
250  tau (icol,ilev,isw) = tau (icol,ilev,isw) + ta (icol,ilev,isw);
251  tau_w (icol,ilev,isw) = tau_w (icol,ilev,isw) + tw (icol,ilev,isw);
252  tau_w_g(icol,ilev,isw) = tau_w_g(icol,ilev,isw) + twg(icol,ilev,isw);
253  tau_w_f(icol,ilev,isw) = tau_w_f(icol,ilev,isw) + twf(icol,ilev,isw);
254  });
255  } else if (opticstype == "volcanic_radius") {
256  // get optical properties for volcanic aerosols
257  real2d r_ext("r_ext",ncol,nlev);
258  real2d r_scat("r_scat",ncol,nlev);
259  real2d r_ascat("r_ascat",ncol,nlev);
260  real1d r_mu("r_mu", ncol);
261  mam_consti.get_aer_r_sw_ext(list_idx, iaero, r_ext);
262  mam_consti.get_aer_r_sw_scat(list_idx, iaero, r_scat);
263  mam_consti.get_aer_r_sw_ascat(list_idx, iaero, r_ascat);
264  mam_consti.get_aer_mu(list_idx, iaero, r_mu);
265  get_volcanic_radius_rad_props(ncol, aermass, r_ext, r_scat, r_ascat, r_mu, ta, tw, twg, twf);
266  //get_volcanic_radius_rad_props(const real2d& mass,
267  // const real2d& r_ext,
268  // const real2d& r_scat,
269  // const real2d& r_ascat,
270  // const real1d& r_mu,
271  // real3d& tau,
272  // real3d& tau_w,
273  // real3d& tau_w_g,
274  // real3d& tau_w_f)
275 
276  parallel_for(SimpleBounds<3>(ncol, nlev, nswbands), YAKL_LAMBDA (int icol, int ilev, int isw)
277  {
278  tau (icol,ilev,isw) = tau (icol,ilev,isw) + ta (icol,ilev,isw);
279  tau_w (icol,ilev,isw) = tau_w (icol,ilev,isw) + tw (icol,ilev,isw);
280  tau_w_g(icol,ilev,isw) = tau_w_g(icol,ilev,isw) + twg(icol,ilev,isw);
281  tau_w_f(icol,ilev,isw) = tau_w_f(icol,ilev,isw) + twf(icol,ilev,isw);
282  });
283  } else {
284  amrex::Print() << "aer_rad_props_sw: unsupported opticstype\n";
285  }
286 
287  // diagnostic output of individual aerosol optical properties
288  // currently implemented for climate list only
289  // call aer_vis_diag_out(lchnk, ncol, nnite, idxnite, iaero, ta(:,:,idx_sw_diag), list_idx)
290  }
291 
292  // diagnostic output of total aerosol optical properties
293  // currently implemented for climate list only
294  // call aer_vis_diag_out(lchnk, ncol, nnite, idxnite, 0, tau(:,:,idx_sw_diag), list_idx)
295 #endif
296 }
real3d ssa_cmip6_sw
Definition: ERF_AeroRadProps.H:133
void get_volcanic_radius_rad_props(const int &ncol, const real2d &mass, const real2d &r_ext, const real2d &r_scat, const real2d &r_ascat, const real1d &r_mu, const real3d &tau, const real3d &tau_w, const real3d &tau_w_g, const real3d &tau_w_f)
Definition: ERF_AeroRadProps.cpp:560
void get_hygro_rad_props(const int &ncol, const int2d &krh, const real2d &wrh, const real2d &mass, const real2d &ext, const real2d &ssa, const real2d &assm, const real3d &tau, const real3d &tau_w, const real3d &tau_w_g, const real3d &tau_w_f)
Definition: ERF_AeroRadProps.cpp:513
void get_volcanic_rad_props(const int &ncol, const real2d &mass, const real1d &ext, const real1d &scat, const real1d &ascat, const real3d &tau, const real3d &tau_w, const real3d &tau_w_g, const real3d &tau_w_f)
Definition: ERF_AeroRadProps.cpp:681
void volcanic_cmip_sw(const int1d &trop_level, const real2d &zi, const real3d &ext_cmip6_sw_inv_m, const real3d &ssa_cmip6_sw, const real3d &af_cmip6_sw, const real3d &tau, const real3d &tau_w, const real3d &tau_w_g, const real3d &tau_w_f)
Definition: ERF_AeroRadProps.cpp:624
int nswbands
Definition: ERF_AeroRadProps.H:115
int ngas
Definition: ERF_AeroRadProps.H:112
int num_aeroes
Definition: ERF_AeroRadProps.H:112
void get_nonhygro_rad_props(const int &ncol, const real2d &mass, const real1d &ext, const real1d &ssa, const real1d &assm, const real3d &tau, const real3d &tau_w, const real3d &tau_w_g, const real3d &tau_w_f)
Definition: ERF_AeroRadProps.cpp:538
real3d af_cmip6_sw
Definition: ERF_AeroRadProps.H:133
void modal_aero_sw(int list_idx, real dt, int nnite, const int1d &idxnite, const bool &is_cmip6_volc, const real2d &pdeldry, const real2d &pmid, const real2d &temperature, const real2d &qt, const real2d &ext_cmip6_sw, const int1d &trop_level, const real3d &tauxar, const real3d &wa, const real3d &ga, const real3d &fa, const real2d &clear_rh)
Definition: ERF_Mam4Aero.H:321
void get_aer_r_sw_scat(int list_idx, int aer_idx, real2d &r_sw_scat) const
Definition: ERF_Mam4Constitutents.H:1121
void get_aer_r_sw_ascat(int list_idx, int aer_idx, real2d &r_sw_ascat) const
Definition: ERF_Mam4Constitutents.H:1130
void get_aer_sw_nonhygro_scat(int list_idx, int aer_idx, real1d &sw_nonhygro_scat) const
Definition: ERF_Mam4Constitutents.H:1061
void get_aer_r_sw_ext(int list_idx, int aer_idx, real2d &r_sw_ext) const
Definition: ERF_Mam4Constitutents.H:1112
void get_aer_sw_nonhygro_ext(int list_idx, int aer_idx, real1d &sw_nonhygro_ext) const
Definition: ERF_Mam4Constitutents.H:1034
void get_aer_sw_nonhygro_asm(int list_idx, int aer_idx, real1d &sw_nonhygro_asm) const
Definition: ERF_Mam4Constitutents.H:1052
void get_aer_sw_nonhygro_ascat(int list_idx, int aer_idx, real1d &sw_nonhygro_ascat) const
Definition: ERF_Mam4Constitutents.H:1070
void get_ngas(int list_idx, int &ngas) const
Definition: ERF_Mam4Constitutents.H:356
void get_aer_sw_hygro_asm(int list_idx, int aer_idx, real2d &sw_hygro_asm) const
Definition: ERF_Mam4Constitutents.H:1016
void get_aer_sw_hygro_ssa(int list_idx, int aer_idx, real2d &sw_hygro_ssa) const
Definition: ERF_Mam4Constitutents.H:1007
void get_aer_sw_nonhygro_ssa(int list_idx, int aer_idx, real1d &sw_nonhygro_ssa) const
Definition: ERF_Mam4Constitutents.H:1043
void get_aer_sw_hygro_ext(int list_idx, int aer_idx, real2d &sw_hygro_ext) const
Definition: ERF_Mam4Constitutents.H:998
static constexpr int idx_sw_diag
Definition: ERF_RadConstants.H:60

Referenced by Optics::set_aerosol_optics_sw().

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

◆ aer_vis_diag_out()

void AerRadProps::aer_vis_diag_out ( const int &  ncol,
const int &  nnite,
const int1d &  idxnite,
const int &  iaer,
const real2d &  tau,
const int &  diag_idx 
)

◆ get_hygro_rad_props()

void AerRadProps::get_hygro_rad_props ( const int &  ncol,
const int2d &  krh,
const real2d &  wrh,
const real2d &  mass,
const real2d &  ext,
const real2d &  ssa,
const real2d &  assm,
const real3d &  tau,
const real3d &  tau_w,
const real3d &  tau_w_g,
const real3d &  tau_w_f 
)
524 {
525  parallel_for(SimpleBounds<3>(ncol,nlev,nswbands) , YAKL_LAMBDA (int icol, int ilev, int iswband)
526  {
527  auto ext1 = (1 + wrh(icol,ilev)) * extb(krh(icol,ilev)+1,iswband) - wrh(icol,ilev) * extb(krh(icol,ilev),iswband);
528  auto ssa1 = (1 + wrh(icol,ilev)) * ssab(krh(icol,ilev)+1,iswband) - wrh(icol,ilev) * ssab(krh(icol,ilev),iswband);
529  auto asm1 = (1 + wrh(icol,ilev)) * asmb(krh(icol,ilev)+1,iswband) - wrh(icol,ilev) * asmb(krh(icol,ilev),iswband);
530 
531  tau (icol, ilev, iswband) = mass(icol, ilev) * ext1;
532  tau_w (icol, ilev, iswband) = mass(icol, ilev) * ext1 * ssa1;
533  tau_w_g(icol, ilev, iswband) = mass(icol, ilev) * ext1 * ssa1 * asm1;
534  tau_w_f(icol, ilev, iswband) = mass(icol, ilev) * ext1 * ssa1 * asm1 * asm1;
535  });
536 }

Referenced by aer_rad_props_sw().

Here is the caller graph for this function:

◆ get_nonhygro_rad_props()

void AerRadProps::get_nonhygro_rad_props ( const int &  ncol,
const real2d &  mass,
const real1d &  ext,
const real1d &  ssa,
const real1d &  assm,
const real3d &  tau,
const real3d &  tau_w,
const real3d &  tau_w_g,
const real3d &  tau_w_f 
)
547 {
548  parallel_for(SimpleBounds<3>(ncol,nlev,nswbands) , YAKL_LAMBDA (int icol, int ilev, int iswband)
549  {
550  auto ext1 = extb(iswband);
551  auto ssa1 = ssab(iswband);
552  auto asm1 = asmb(iswband);
553  tau (icol,ilev,iswband) = mass(icol,ilev) * ext1;
554  tau_w (icol,ilev,iswband) = mass(icol,ilev) * ext1 * ssa1;
555  tau_w_g(icol,ilev,iswband) = mass(icol,ilev) * ext1 * ssa1 * asm1;
556  tau_w_f(icol,ilev,iswband) = mass(icol,ilev) * ext1 * ssa1 * asm1 * asm1;
557  });
558 }

Referenced by aer_rad_props_sw().

Here is the caller graph for this function:

◆ get_volcanic_rad_props()

void AerRadProps::get_volcanic_rad_props ( const int &  ncol,
const real2d &  mass,
const real1d &  ext,
const real1d &  scat,
const real1d &  ascat,
const real3d &  tau,
const real3d &  tau_w,
const real3d &  tau_w_g,
const real3d &  tau_w_f 
)
689  {
690  //int nswbands;
691  parallel_for(SimpleBounds<3>(nswbands, ncol,nlev), YAKL_LAMBDA (int iswband, int icol, int ilev) {
692  real g = 0;
693  if (scat(iswband) > 0.)
694  g = ascat(iswband)/scat(iswband);
695 
696  tau (icol, ilev, iswband) = mass(icol, ilev) * ext(iswband);
697  tau_w (icol, ilev, iswband) = mass(icol, ilev) * scat(iswband);
698  tau_w_g(icol, ilev, iswband) = mass(icol, ilev) * ascat(iswband);
699  tau_w_f(icol, ilev, iswband) = mass(icol, ilev) * g * ascat(iswband);
700  });
701 }

Referenced by aer_rad_props_sw().

Here is the caller graph for this function:

◆ get_volcanic_radius_rad_props()

void AerRadProps::get_volcanic_radius_rad_props ( const int &  ncol,
const real2d &  mass,
const real2d &  r_ext,
const real2d &  r_scat,
const real2d &  r_ascat,
const real1d &  r_mu,
const real3d &  tau,
const real3d &  tau_w,
const real3d &  tau_w_g,
const real3d &  tau_w_f 
)
570 {
571  yakl::memset(tau, 0.);
572  yakl::memset(tau_w, 0.);
573  yakl::memset(tau_w_g, 0.);
574  yakl::memset(tau_w_f, 0.);
575 
576  // get microphysical properties for volcanic aerosols
577  //idx = pbuf_get_index('VOLC_RAD_GEOM')
578  //call pbuf_get_field(pbuf, idx, geometric_radius )
579 
580  // interpolate in radius
581  // caution: clip the table with no warning when outside bounds
582  auto nmu = r_mu.extent(0);
583  auto r_mu_max = r_mu(nmu-1);
584  auto r_mu_min = r_mu(0);
585 
586  // interpolated values from table
587  real1d ext("ext", nswbands);
588  real1d scat("scat", nswbands);
589  real1d ascat("ascat", nswbands);
590  real2d mu("mu", ncol, nlev);
591 
592  parallel_for(SimpleBounds<3>(ncol,nlev,nswbands), YAKL_LAMBDA (int icol, int ilev, int iswband)
593  {
594  if(geometric_radius(icol,ilev) > 0.)
595  mu(icol,ilev) = std::log(geometric_radius(icol,ilev));
596  else
597  mu(icol,ilev) = 0.;
598 
599  auto mutrunc = std::max(std::min(mu(icol,ilev),r_mu_max),r_mu_min);
600  auto kmu = std::max(std::min(1 + (mutrunc-r_mu_min)/(r_mu_max-r_mu_min)*(nmu-1),nmu-1.),1.);
601  auto wmu = std::max(std::min((mutrunc -r_mu(kmu)) / (r_mu(kmu+1) - r_mu(kmu)),1.),0.);
602 
603  ext(iswband) = ((1. - wmu) * r_ext(iswband, kmu ) +
604  (wmu) * r_ext(iswband, kmu+1));
605  scat(iswband) = ((1. - wmu) * r_scat(iswband, kmu ) +
606  (wmu) * r_scat(iswband, kmu+1));
607  ascat(iswband) = ((1. - wmu) * r_ascat(iswband, kmu ) +
608  (wmu) * r_ascat(iswband, kmu+1));
609  real g = 0;
610  if (scat(iswband) > 0.)
611  g = ascat(iswband)/scat(iswband);
612 
613  tau (icol,ilev,iswband) = mass(icol,ilev) * ext(iswband);
614  tau_w (icol,ilev,iswband) = mass(icol,ilev) * scat(iswband);
615  tau_w_g(icol,ilev,iswband) = mass(icol,ilev) * ascat(iswband);
616  tau_w_f(icol,ilev,iswband) = mass(icol,ilev) * g * ascat(iswband);
617  });
618 }

Referenced by aer_rad_props_sw().

Here is the caller graph for this function:

◆ initialize()

void AerRadProps::initialize ( int  num_gas,
int  num_modes,
int  naeroes,
int  nswbands_,
int  nlwbands_,
int  ncoloum,
int  nlevel,
int  num_rh,
int  top_levels,
const std::vector< std::string > &  aerosol_names,
const real2d &  zint,
const real2d &  pmiddle,
const real2d &  pdel,
const real2d &  temperature,
const real2d &  qtotal,
const real2d &  geom_rad 
)
19 {
20  nmodes = num_modes;
21  ngas = num_gas;
22  num_aeroes = naeroes;
23  aero_names = aerosol_names;
24 
25  nswbands = nswbands_;
26  nlwbands = nlwbands_;
27  ncol = ncoloum;
28  nlev = nlevel;
29  nrh = num_rh;
30  top_lev = top_levels;
31 
32  // NOTE: pmid is absolute pressure but pdeldry is the vertical
33  // change in pressure (analog to mass per area with HSE balance)
34  pmid = pmiddle;
35  pdeldry = pdel;
36  /*
37  // This will overwrite pmid
38  pdeldry = pmiddle;
39  parallel_for(SimpleBounds<2>(ncol, nlev), YAKL_LAMBDA (int icol, int ilev)
40  {
41  // Pressure max at bottom of column
42  pdeldry(icol,ilev) = pmid(icol,ilev) - pmid(icol,ilev+1);
43  });
44  */
45 
46  temp = temperature;
47  qt = qtotal;
48  // geometric radius
49  geometric_radius = geom_rad;
50  // vertical grid
51  zi = zint;
52  // initialize mam4 aero model
54 }
std::vector< std::string > aero_names
Definition: ERF_AeroRadProps.H:113
void initialize(int ncols, int nlevs, int top_levs, int nsw_bands, int nlw_bands)
Definition: ERF_Mam4Aero.H:57

Referenced by Optics::initialize().

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

◆ volcanic_cmip_sw()

void AerRadProps::volcanic_cmip_sw ( const int1d &  trop_level,
const real2d &  zi,
const real3d &  ext_cmip6_sw_inv_m,
const real3d &  ssa_cmip6_sw,
const real3d &  af_cmip6_sw,
const real3d &  tau,
const real3d &  tau_w,
const real3d &  tau_w_g,
const real3d &  tau_w_f 
)
632  {
633  // Above the tropopause, the read in values from the file include both the stratospheric
634  // and volcanic aerosols. Therefore, we need to zero out taus above the tropopause
635  // and populate them exclusively from the read in values.
636 
637  // If tropopause is found, update taus with 50% contributuions from the volcanic input
638  // file and 50% from the existing model computed values
639  real1d ext_unitless("ext_unitless", nswbands),
640  asym_unitless("asym_unitless",nswbands),
641  ext_ssa("ext_ssa",nswbands),
642  ext_ssa_asym("ext_ssa_asym",nswbands);
643 
644  // First handle the case of tropopause layer itself:
645  parallel_for(SimpleBounds<2>(ncol,nswbands), YAKL_LAMBDA (int icol, int isw) {
646  auto ilev_tropp = trop_level(icol); //tropopause level
647  auto lyr_thk = zi(icol,ilev_tropp) - zi(icol,ilev_tropp+1);
648 
649  ext_unitless(isw) = lyr_thk * ext_cmip6_sw_inv_m(icol,ilev_tropp,isw);
650  asym_unitless(isw) = af_cmip6_sw (icol,ilev_tropp,isw);
651  ext_ssa(isw) = ext_unitless(isw) * ssa_cmip6_sw(icol,ilev_tropp,isw);
652  ext_ssa_asym(isw) = ext_ssa(isw) * asym_unitless(isw);
653 
654  tau (icol,ilev_tropp,isw) = 0.5 * ( tau (icol,ilev_tropp,isw) + ext_unitless(isw) );
655  tau_w (icol,ilev_tropp,isw) = 0.5 * ( tau_w (icol,ilev_tropp,isw) + ext_ssa(isw));
656  tau_w_g(icol,ilev_tropp,isw) = 0.5 * ( tau_w_g(icol,ilev_tropp,isw) + ext_ssa_asym(isw));
657  tau_w_f(icol,ilev_tropp,isw) = 0.5 * ( tau_w_f(icol,ilev_tropp,isw) + ext_ssa_asym(isw) * asym_unitless(isw));
658  });
659 
660  // As it will be more efficient for FORTRAN to loop over levels and then columns, the following loops
661  // are nested keeping that in mind
662  parallel_for(SimpleBounds<3>(ncol,nlev, nswbands), YAKL_LAMBDA (int icol, int ilev, int isw) {
663  auto ilev_tropp = trop_level(icol); //tropopause level
664 
665  if (ilev < ilev_tropp) { //BALLI: see if this is right!
666  auto lyr_thk = zi(icol,ilev) - zi(icol,ilev+1);
667 
668  ext_unitless(isw) = lyr_thk * ext_cmip6_sw_inv_m(icol,ilev,isw);
669  asym_unitless(isw) = af_cmip6_sw(icol,ilev,isw);
670  ext_ssa(isw) = ext_unitless(isw) * ssa_cmip6_sw(icol,ilev,isw);
671  ext_ssa_asym(isw) = ext_ssa(isw) * asym_unitless(isw);
672 
673  tau (icol,ilev,isw) = ext_unitless(isw);
674  tau_w (icol,ilev,isw) = ext_ssa(isw);
675  tau_w_g(icol,ilev,isw) = ext_ssa_asym(isw);
676  tau_w_f(icol,ilev,isw) = ext_ssa_asym(isw) * asym_unitless(isw);
677  }
678  });
679 }

Referenced by aer_rad_props_sw().

Here is the caller graph for this function:

Member Data Documentation

◆ aero_names

std::vector<std::string> AerRadProps::aero_names
private

Referenced by initialize().

◆ af_cmip6_sw

real3d AerRadProps::af_cmip6_sw
private

◆ ext_cmip6_sw

real3d AerRadProps::ext_cmip6_sw
private

◆ geometric_radius

real2d AerRadProps::geometric_radius
private

◆ mam_aer

Mam4_aer AerRadProps::mam_aer
private

◆ mam_consti

MamConstituents AerRadProps::mam_consti
private

◆ ncol

◆ ngas

int AerRadProps::ngas
private

Referenced by aer_rad_props_sw(), and initialize().

◆ nlev

◆ nlwbands

int AerRadProps::nlwbands
private

Referenced by aer_rad_props_lw(), and initialize().

◆ nmodes

int AerRadProps::nmodes
private

◆ nrh

int AerRadProps::nrh
private

◆ nswbands

◆ num_aeroes

int AerRadProps::num_aeroes
private

Referenced by aer_rad_props_sw(), and initialize().

◆ pdeldry

real2d AerRadProps::pdeldry
private

◆ pmid

real2d AerRadProps::pmid
private

◆ qt

real2d AerRadProps::qt
private

◆ ssa_cmip6_sw

real3d AerRadProps::ssa_cmip6_sw
private

◆ temp

real2d AerRadProps::temp
private

◆ top_lev

int AerRadProps::top_lev
private

◆ zi

real2d AerRadProps::zi
private

The documentation for this class was generated from the following files: