9 #ifndef ERF_MAM4_AERO_H_
10 #define ERF_MAM4_AERO_H_
12 #include "YAKL_netcdf.h"
13 #include "rrtmgp_const.h"
14 #include "ERF_Mam4Constituents.H"
17 #include "ERF_Config.H"
18 #include "ERF_ModalAeroWaterUptake.H"
20 using yakl::fortran::parallel_for;
21 using yakl::fortran::SimpleBounds;
57 void initialize (
int ncols,
int nlevs,
int top_levs,
int nsw_bands,
int nlw_bands)
66 const real rmmin = 0.01e-6;
67 const real rmmax = 25.e-6;
68 xrmin = std::log(rmmin);
69 xrmax = std::log(rmmax);
74 for(
auto ilist = 0; ilist <
n_diag; ++ilist) {
76 for(
auto m = 0; m <
nmodes; ++m) {
81 auto erf_rad_data_dir = getRadiationDataDir() +
"/";
103 yakl::SimpleNetCDF water_ref_file;
104 water_ref_file.open(infilename, yakl::NETCDF_MODE_READ);
107 int nlw_bands = water_ref_file.getDimSize(
"lw_band" );
108 int nsw_bands = water_ref_file.getDimSize(
"sw_band" );
111 amrex::Print() <<
"ERROR - file and bandwidth values do not match: "
112 <<
"\n nswbands: " <<
nswbands <<
"; nsw_bands: " << nsw_bands
113 <<
"\n nlwbands: " <<
nlwbands <<
"; nlw_bands: " << nlw_bands <<
"\n";
116 real1d refrwsw(
"refrwsw", nsw_bands), refiwsw(
"refiwsw", nsw_bands);
117 real1d refrwlw(
"refrwlw", nlw_bands), refiwlw(
"refiwlw", nlw_bands);
120 water_ref_file.read( refrwsw,
"refindex_real_water_sw");
121 water_ref_file.read( refiwsw,
"refindex_im_water_sw");
122 water_ref_file.read( refrwlw,
"refindex_real_water_lw");
123 water_ref_file.read( refiwlw,
"refindex_im_water_lw");
131 const real2d& dgnumwet,
const real2d& radsurf,
132 const real2d& logradsurf,
const real3d& cheb)
134 real1d xrad(
"xrad",
ncol);
136 auto alnsg_amode = std::log(sigma_logr_aer);
137 auto explnsigma = std::exp(2.0*alnsg_amode*alnsg_amode);
141 for(
auto i = 1; i <=
ncol; ++i) {
143 radsurf(i,k) = 0.5*dgnumwet(i,k)*explnsigma;
144 logradsurf(i,k) = std::log(radsurf(i,k));
147 xrad(i) = std::max(logradsurf(i,k),
xrmin);
148 xrad(i) = std::min(xrad(i),
xrmax);
153 cheb(2,i,k) = xrad(i);
154 for(
auto nc = 3; nc <=
ncoef; ++nc) {
155 cheb(nc,i,k) = 2.*xrad(i)*cheb(nc-1,i,k)-cheb(nc-2,i,k);
165 void binterp (
const real3d& table,
int ncol,
int km,
int im,
int jm,
166 const real1d&
x,
const real1d&
y,
const real1d& xtab,
const real1d& ytab,
167 const int1d& ix,
const int1d& jy,
const real1d& t,
const real1d& u,
const real2d& out)
170 real1d tu(
"tu",
ncol), tuc(
"tuc",
ncol), tcu(
"tcu",
ncol), tcuc(
"tcuc",
ncol);
174 parallel_for (SimpleBounds<1>(
ncol), YAKL_LAMBDA (
int ic)
177 for (i = 1; i <= im; ++i) {
178 if(
x(ic) < xtab(i))
break;
181 ix(ic) = std::max(i-1,1);
182 auto ip1 = std::min(ix(ic)+1,im);
183 auto dx = (xtab(ip1)-xtab(ix(ic)));
185 if(abs(dx) > 1.0-20) {
186 t(ic)=(
x(ic)-xtab(ix(ic)))/dx;
192 parallel_for (SimpleBounds<1>(
ncol), YAKL_LAMBDA (
int i)
200 parallel_for(SimpleBounds<1>(
ncol), YAKL_LAMBDA (
int ic)
203 for (j = 1; j <= jm; ++j) {
204 if(
y(ic) < ytab(j))
break;
207 jy(ic) = std::max(j-1,1);
208 auto jp1 = std::min(jy(ic)+1,jm);
209 auto dy = (ytab(jp1)-ytab(jy(ic)));
211 if(std::abs(dy) > 1.e-20) {
212 u(ic) = (
y(ic)-ytab(jy(ic)))/dy;
213 if(u(ic) < 0. || u(ic) > 1.)
214 amrex::Print() <<
"u= " << u(ic) <<
"; y= " <<
y(ic) <<
"; ytab= "
215 << ytab(jy(ic)) <<
"; dy= " << dy << std::endl;
221 parallel_for (SimpleBounds<1>(
ncol), YAKL_LAMBDA (
int i)
229 parallel_for (SimpleBounds<2>(
ncol, km), YAKL_LAMBDA (
int ic,
int k)
231 tu(ic) = t(ic)*u(ic);
232 tuc(ic) = t(ic)-tu(ic);
233 tcuc(ic) = 1.-tuc(ic)-u(ic);
234 tcu(ic) = u(ic)-tu(ic);
235 auto jp1 = std::min(jy(ic)+1,jm);
236 auto ip1 = std::min(ix(ic)+1,im);
237 out(ic,k) = tcuc(ic)*table(k,ix(ic),jy(ic))+tuc(ic)*table(k,ip1 ,jy(ic))
238 +tu(ic)*table(k,ip1 ,jp1 )+tcu(ic)*table(k,ix(ic),jp1 );
245 real2d dgncur_a(
"dgncur",
ncol,
nlev);
246 real2d mode_num(
"mode_num",
ncol,
nlev);
247 real2d specmmr(
"specmmr",
ncol,
nlev);
248 real2d dryvol_a(
"dryvol_a",
ncol,
nlev);
250 for (
auto n = 1; n <=
nmodes; ++n) {
251 parallel_for(SimpleBounds<2>(
ncol,
nlev), YAKL_LAMBDA (
int i,
int k)
253 dgncur_a(i,k) = dgnum_m(i,k,n);
257 real dgnum, dgnumhi, dgnumlo, sigmag;
263 yakl::memset(dgncur_a, dgnum);
264 yakl::memset(dryvol_a, 0.0);
269 for (
auto l1 = 0; l1 <
nspec; ++l1) {
270 real specdens = 1.0e-20;
275 real dummwdens = 1.0 / specdens;
279 for (
auto i=1; i<=
ncol; ++i) {
280 dryvol_a(i,k) = dryvol_a(i,k) + std::max(0.0, specmmr(i,k))*dummwdens;
285 auto alnsg = std::log(sigmag);
286 auto dumfac = std::exp(4.5*std::pow(alnsg, 2))*
PI/6.0;
287 auto voltonumblo = 1./((
PI/6.)*(std::pow(dgnumlo, 3))*std::exp(4.5*std::pow(alnsg, 2)));
288 auto voltonumbhi = 1./((
PI/6.)*(std::pow(dgnumhi, 3))*std::exp(4.5*std::pow(alnsg, 2)));
289 auto v2nmin = voltonumbhi;
290 auto v2nmax = voltonumblo;
291 auto dgnxx = dgnumhi;
292 auto dgnyy = dgnumlo;
296 for (
auto i = 1; i <=
ncol; ++i) {
297 auto drv_a = dryvol_a(i,k);
298 auto num_a0 = mode_num(i,k);
299 auto num_a = std::max(0.0, num_a0);
302 if (num_a <= drv_a*v2nmin)
303 dgncur_a(i,k) = dgnxx;
304 else if (num_a >= drv_a*v2nmax)
305 dgncur_a(i,k) = dgnyy;
307 dgncur_a(i,k) = std::pow((drv_a/(dumfac*num_a)), 1./3.);
311 parallel_for(SimpleBounds<2>(
ncol,
nlev), YAKL_LAMBDA (
int i,
int k)
313 dgnum_m(i,k,n) = dgncur_a(i,k);
322 const int1d& idxnite,
const bool& is_cmip6_volc,
323 const real2d& pdeldry,
const real2d& pmid,
const real2d& temperature,
const real2d&
qt,
324 const real2d& ext_cmip6_sw,
const int1d& trop_level,
325 const real3d& tauxar,
const real3d& wa,
const real3d& ga,
326 const real3d& fa,
const real2d& clear_rh)
330 real2d air_density(
"air_density",
ncol,
nlev);
332 real2d specmmr(
"specmmr",
ncol,
nlev);
333 real1d specrefindex_real(
"specrefindex_real",
nswbands);
334 real1d specrefindex_im(
"specrefindex_im",
nswbands);
335 std::string spectype;
338 amrex::ignore_unused(volf);
340 real2d dgnumwet(
"dgnumwet",
ncol,
nlev);
341 real2d qaerwat(
"qaerwat",
ncol,
nlev);
342 real2d wetdens(
"wetdens",
ncol,
nlev);
345 real2d radsurf(
"radsurf",
ncol,
nlev);
346 real2d logradsurf(
"logradsurf",
ncol,
nlev);
349 real1d refr(
"refr",
ncol);
350 real1d refi(
"refi",
ncol);
351 real1d crefin_real(
"crefin_real",
ncol);
352 real1d crefin_im(
"crefin_im",
ncol);
361 real1d vol(
"vol",
ncol);
362 real1d dryvol(
"dryvol",
ncol);
363 real1d watervol(
"watervol",
ncol);
364 real1d wetvol(
"wetvol",
ncol);
366 int1d itab(
"itab",
ncol), jtab(
"jtab",
ncol);
367 real1d ttab(
"ttab",
ncol), utab(
"utab",
ncol);
369 real1d pext(
"pext",
ncol);
370 real1d specpext(
"specpext",
ncol);
371 real1d dopaer(
"dopaer",
ncol);
372 real1d pabs(
"pabs",
ncol);
373 real1d pasm(
"pasm",
ncol);
374 real1d palb(
"palb",
ncol);
377 yakl::memset(tauxar, 0.);
378 yakl::memset(wa, 0.);
379 yakl::memset(ga, 0.);
380 yakl::memset(fa, 0.);
389 parallel_for(SimpleBounds<2>(
ncol,
nlev), YAKL_LAMBDA (
int i,
int k)
391 mass(i,k) = pdeldry(i,k)*
rga;
392 air_density(i,k) = pmid(i,k)/(
rair*temperature(i,k));
399 amrex::Print() <<
"Radiation diagnostic calls are not supported for prescribed aerosols\n";
412 for(
auto m = 1; m <=
nmodes; ++m) {
413 parallel_for(SimpleBounds<2>(
ncol,
nlev), YAKL_LAMBDA (
int icol,
int ilev)
415 dgnumwet(icol,ilev) =
dgnumwet_m(icol,ilev,m);
416 qaerwat(icol,ilev) =
qaerwat_m(icol,ilev,m);
421 refitabsw, extpsw, abspsw, asmpsw);
429 for(
auto isw = 1; isw <=
nswbands; ++isw) {
432 yakl::memset(crefin_real, 0.);
433 yakl::memset(crefin_im , 0.);
434 yakl::memset(dryvol , 0.);
437 for(
auto l = 0; l <
nspec; ++l) {
438 real specdens = 1.0e-20;
441 specrefindex_real, specrefindex_im);
442 for(
auto i = 1; i <=
ncol; ++i) {
443 vol(i) = specmmr(i,k)/specdens;
444 dryvol(i) = dryvol(i) + vol(i);
445 crefin_real(i) = crefin_real(i) + vol(i)*specrefindex_real(isw);
446 crefin_im(i) = crefin_im(i) + vol(i)*specrefindex_im(isw);
450 for(
auto i = 1; i <=
ncol; ++i) {
451 watervol(i) = qaerwat(i,k)/
rhoh2o;
452 wetvol(i) = watervol(i) + dryvol(i);
453 if (watervol(i) < 0.) {
454 if (std::abs(watervol(i)) > 1.e-1*wetvol(i)) {
455 amrex::Print() <<
"watervol,wetvol=" << watervol(i) <<
"; " << wetvol(i) << std::endl;
458 wetvol(i) = dryvol(i);
461 crefin_real(i) = crefin_real(i)+watervol(i)*
crefwswr(isw);
462 crefin_real(i) = crefin_real(i)/std::max(wetvol(i),1.e-60);
463 crefin_im(i) = crefin_im(i)+watervol(i)*
crefwswi(isw);
464 crefin_im(i) = crefin_im(i)/std::max(wetvol(i),1.e-60);
465 refr(i) = crefin_real(i);
466 refi(i) = std::abs(crefin_im(i));
474 real1d refitabswr(
"refitabswr",
prefi);
475 real1d refrtabswr(
"refrtabswr",
prefr);
477 parallel_for(SimpleBounds<3>(
ncoef,
prefr,
prefi), YAKL_LAMBDA (
int icoef,
int irefr,
int irefi)
479 extpswr(icoef,irefr,irefi) = extpsw(icoef,irefr,irefi,isw);
480 abspswr(icoef,irefr,irefi) = abspsw(icoef,irefr,irefi,isw);
481 asmpswr(icoef,irefr,irefi) = asmpsw(icoef,irefr,irefi,isw);
482 refitabswr(irefi) = refitabsw(irefi,isw);
483 refrtabswr(irefr) = refrtabsw(irefr,isw);
486 yakl::memset(itab, 0);
488 refrtabswr, refitabswr, itab, jtab, ttab, utab, cext);
490 refrtabswr, refitabswr, itab, jtab, ttab, utab, cabs);
492 refrtabswr, refitabswr, itab, jtab, ttab, utab, casm);
495 for(
auto i=1; i <=
ncol; ++i) {
496 if (logradsurf(i,k) <=
xrmax) {
497 pext(i) = 0.5*cext(i,1);
498 for(
auto nc = 2; nc <=
ncoef; ++nc) {
499 pext(i) = pext(i) + cheb(nc,i,k)*cext(i,nc);
501 pext(i) = std::exp(pext(i));
503 pext(i) = 1.5/(radsurf(i,k)*
rhoh2o);
507 specpext(i) = pext(i);
508 pext(i) = pext(i)*wetvol(i)*
rhoh2o;
509 pabs(i) = 0.5*cabs(i,1);
510 pasm(i) = 0.5*casm(i,1);
511 for(
auto nc = 2; nc <=
ncoef; ++nc) {
512 pabs(i) = pabs(i) + cheb(nc,i,k)*cabs(i,nc);
513 pasm(i) = pasm(i) + cheb(nc,i,k)*casm(i,nc);
515 pabs(i) = pabs(i)*wetvol(i)*
rhoh2o;
516 pabs(i) = std::max(0.,pabs(i));
517 pabs(i) = std::min(pext(i),pabs(i));
518 palb(i) = 1.-pabs(i)/std::max(pext(i),1.e-40);
519 dopaer(i) = pext(i)*mass(i,k);
522 for (
auto i = 1; i <=
ncol; ++i) {
523 if ((dopaer(i) <= -1.e-10) || (dopaer(i) >= 30.)) {
524 if (dopaer(i) <= -1.e-10)
525 amrex::Print() <<
"ERROR: Negative aerosol optical depth in this layer.\n";
529 amrex::Print() <<
"WARNING: Aerosol optical depth is unreasonably high in this layer.\n";
532 for(
auto l = 1; l <
nspec; ++l) {
533 real specdens = 1.0e-20;
536 volf = specmmr(i,k)/specdens;
538 if (dopaer(i) < -1.e-10) {
539 amrex::Print() <<
"*** halting with error!\n";
545 for(
auto i=1; i <=
ncol; ++i) {
546 tauxar(i,k,isw) = tauxar(i,k,isw) + dopaer(i);
547 wa(i,k,isw) = wa(i,k,isw) + dopaer(i)*palb(i);
548 ga(i,k,isw) = ga(i,k,isw) + dopaer(i)*palb(i)*pasm(i);
549 fa(i,k,isw) = fa(i,k,isw) + dopaer(i)*palb(i)*pasm(i)*pasm(i);
560 const real2d& pdeldry,
const real2d& pmid,
const real2d& temperature,
const real2d&
qt,
561 const real3d& tauxar,
const real2d& clear_rh)
565 real1d xrad(
"xrad",
ncol);
571 real1d specrefrindex(
"specrefrindex",
ncol);
572 real1d specrefiindex(
"specrefiindex",
ncol);
574 real1d vol(
"vol",
ncol);
575 real1d dryvol(
"dryvol",
ncol);
576 real1d wetvol(
"wetvol",
ncol);
577 real1d watervol(
"watervol",
ncol);
578 real1d refr(
"refr",
ncol);
579 real1d refi(
"refi",
ncol);
580 real1d crefinr(
"crefinr",
ncol);
581 real1d crefini(
"crefini",
ncol);
587 int1d itab(
"itab",
ncol), jtab(
"jtab",
ncol);
588 real1d ttab(
"ttab",
ncol), utab(
"utab",
ncol);
590 real1d pabs(
"pabs",
ncol);
591 real1d dopaer(
"dopaer",
ncol);
597 constexpr
int nerrmax_dopaer=1000;
600 amrex::ignore_unused(volf);
603 yakl::memset(tauxar, 0.);
606 parallel_for (SimpleBounds<2> (
ncol,
nlev), YAKL_LAMBDA (
int icol,
int ilev)
608 mass(icol,ilev) = pdeldry(icol,ilev)*
rga;
615 amrex::Print() <<
"Radiation diagnostic calls are not supported for prescribed aerosols\n";
625 for(
auto m = 0; m <
nmodes; ++m) {
626 parallel_for (SimpleBounds<2> (
ncol,
nlev), YAKL_LAMBDA (
int icol,
int ilev)
628 dgnumwet(icol, ilev) =
dgnumwet_m(icol,ilev,m);
629 qaerwat(icol, ilev) =
qaerwat_m(icol,ilev,m);
634 refrtablw, refitablw, absplw);
644 for(
auto i = 1; i <=
ncol; ++i) {
645 alnsg_amode = std::log(sigma_logr_aer);
647 xrad(i) = std::log(0.5*dgnumwet(i,k)) + 2.0*alnsg_amode*alnsg_amode;
649 xrad(i) = std::max(xrad(i),
xrmin);
650 xrad(i) = std::min(xrad(i),
xrmax);
654 cheby(2,i,k) = xrad(i);
655 for(
auto nc = 3; nc <=
ncoef; ++nc) {
656 cheby(nc,i,k) = 2.0*xrad(i)*cheby(nc-1,i,k)-cheby(nc-2,i,k);
661 for(
auto ilw = 1; ilw <=
nlwbands; ++ilw) {
664 yakl::memset(crefinr, 0.0);
665 yakl::memset(crefini, 0.0);
666 yakl::memset(dryvol, 0.0);
668 for(
auto l = 0; l <
nspec; ++l) {
671 for(
auto i = 1; i <=
ncol; ++i) {
672 vol(i) = specmmr(i,k)/specdens;
673 dryvol(i) = dryvol(i) + vol(i);
674 crefinr(i) = crefinr(i) + vol(i)*specrefrindex(ilw);
675 crefini(i) = crefini(i) + vol(i)*specrefiindex(ilw);
678 for(
auto i = 1; i <=
ncol; ++i) {
679 watervol(i) = qaerwat(i,k)/
rhoh2o;
680 wetvol(i) = watervol(i) + dryvol(i);
681 if (watervol(i) < 0.0) {
682 if (abs(watervol(i)) > 1.e-1*wetvol(i)) {
683 amrex::Print() <<
"watervol is too large\n";
686 wetvol(i) = dryvol(i);
688 crefinr(i) = crefinr(i) + watervol(i)*
crefwlwr(ilw);
689 crefini(i) = crefini(i) + watervol(i)*
crefwlwi(ilw);
690 if (wetvol(i) > 1.e-40) {
691 crefinr(i) = crefinr(i)/wetvol(i);
692 crefini(i) = crefini(i)/wetvol(i);
694 refr(i) = crefinr(i);
695 refi(i) = crefini(i);
700 yakl::memset(itab, 0);
703 real1d refitablwr(
"refitablwr",
prefi);
704 real1d refrtablwr(
"refrtablwr",
prefr);
706 parallel_for(SimpleBounds<3>(
ncoef,
prefr,
prefi) , YAKL_LAMBDA (
int icoef,
int irefr,
int irefi)
708 absplwr(icoef,irefr,irefi) = absplw(icoef,irefr,irefi,ilw);
709 refitablwr(irefi) = refitablw(irefi,ilw);
710 refrtablwr(irefr) = refrtablw(irefr,ilw);
714 refrtablwr, refitablwr, itab, jtab, ttab, utab, cabs);
717 for(
auto i = 1; i <=
ncol; ++i) {
718 pabs(i) = 0.5*cabs(i,1);
719 for(
auto nc = 2; nc <=
ncoef; ++nc) {
720 pabs(i) = pabs(i) + cheby(nc,i,k)*cabs(i,nc);
722 pabs(i) = pabs(i)*wetvol(i)*
rhoh2o;
723 pabs(i) = std::max(0.,pabs(i));
724 dopaer(i) = pabs(i)*mass(i,k);
727 for(
auto i = 1; i <=
ncol; ++i) {
728 if ((dopaer(i) <= -1.e-10) || (dopaer(i) >= 20.)) {
729 if (dopaer(i) <= -1.e-10)
730 amrex::Print() <<
"ERROR: Negative aerosol optical depth in this layer.\n";
732 amrex::Print() <<
"WARNING: Aerosol optical depth is unreasonably high in this layer.\n";
734 for(
auto l = 0; l <
nspec; ++l) {
737 volf = specmmr(i,k)/specdens;
740 nerr_dopaer = nerr_dopaer + 1;
741 if (nerr_dopaer >= nerrmax_dopaer || dopaer(i) < -1.e-10) {
742 amrex::Print() <<
"*** halting after nerr_dopaer = " << nerr_dopaer;
748 for(
auto i = 1; i <=
ncol; ++i) {
749 tauxar(i,k,ilw) = tauxar(i,k,ilw) + dopaer(i);
constexpr amrex::Real rga
Definition: ERF_Constants.H:71
constexpr amrex::Real rhoh2o
Definition: ERF_Constants.H:94
constexpr amrex::Real rair
Definition: ERF_Constants.H:69
constexpr amrex::Real PI
Definition: ERF_Constants.H:6
Definition: ERF_Mam4Aero.H:23
real3d qaerwat_m
Definition: ERF_Mam4Aero.H:49
void modal_size_parameters(real sigma_logr_aer, const real2d &dgnumwet, const real2d &radsurf, const real2d &logradsurf, const real3d &cheb)
Definition: ERF_Mam4Aero.H:130
real3d dgnumdry_m
Definition: ERF_Mam4Aero.H:47
real1d crefwswr
Definition: ERF_Mam4Aero.H:41
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
MamConstituents mam_consti
Definition: ERF_Mam4Aero.H:53
real1d crefwlwi
Definition: ERF_Mam4Aero.H:44
std::string modal_optics_file
Definition: ERF_Mam4Aero.H:27
void read_water_refindex(std::string infilename)
Definition: ERF_Mam4Aero.H:101
int nspec
Definition: ERF_Mam4Aero.H:25
void initialize(int ncols, int nlevs, int top_levs, int nsw_bands, int nlw_bands)
Definition: ERF_Mam4Aero.H:57
std::string water_refindex_file
Definition: ERF_Mam4Aero.H:28
real3d dgnumwet_m
Definition: ERF_Mam4Aero.H:48
int prefr
Definition: ERF_Mam4Aero.H:33
int nswbands
Definition: ERF_Mam4Aero.H:26
bool clim_modal_aero
Definition: ERF_Mam4Aero.H:37
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
real xrmin
Definition: ERF_Mam4Aero.H:39
int ncol
Definition: ERF_Mam4Aero.H:25
real3d wetdens_m
Definition: ERF_Mam4Aero.H:50
int nlwbands
Definition: ERF_Mam4Aero.H:26
void binterp(const real3d &table, int ncol, int km, int im, int jm, const real1d &x, const real1d &y, const real1d &xtab, const real1d &ytab, const int1d &ix, const int1d &jy, const real1d &t, const real1d &u, const real2d &out)
Definition: ERF_Mam4Aero.H:165
real1d crefwswi
Definition: ERF_Mam4Aero.H:42
int nmodes
Definition: ERF_Mam4Aero.H:35
int nlev
Definition: ERF_Mam4Aero.H:25
void modal_aero_calcsize_diag(int list_idx, const real3d &dgnum_m)
Definition: ERF_Mam4Aero.H:243
int prefi
Definition: ERF_Mam4Aero.H:34
int top_lev
Definition: ERF_Mam4Aero.H:25
real1d crefwlwr
Definition: ERF_Mam4Aero.H:43
int ncoef
Definition: ERF_Mam4Aero.H:32
int n_diag
Definition: ERF_Mam4Aero.H:36
real xrmax
Definition: ERF_Mam4Aero.H:39
Definition: ERF_Mam4Constitutents.H:18
void rad_cnst_get_mode_num(int list_idx, int mode_idx, const std::string &phase, real2d &num) const
Definition: ERF_Mam4Constitutents.H:711
void get_mode_nspec(int list_idx, int m_idx, int &nspec) const
Definition: ERF_Mam4Constitutents.H:394
void get_mam_props(int list_idx, int mode_idx, int spec_idx, real &density_aer, std::string &spectype, real &hygro_aer, real1d &refindex_real_aer_sw, real1d &refindex_im_aer_sw) const
Definition: ERF_Mam4Constitutents.H:919
void rad_cnst_get_mam_mmr_by_idx(int list_idx, int mode_idx, int spec_idx, const std::string &phase, real2d &mmr) const
Definition: ERF_Mam4Constitutents.H:639
void get_mam_props_lw(int list_idx, int mode_idx, int spec_idx, real &density_aer, real1d &refindex_real_aer_lw, real1d &refindex_im_aer_lw) const
Definition: ERF_Mam4Constitutents.H:970
void get_nmodes(int list_idx, int &nmodes) const
Definition: ERF_Mam4Constitutents.H:350
void get_mode_props(int list_idx, int mode_idx, real &sigmag, real &rhcrystal, real &rhdeliques) const
Definition: ERF_Mam4Constitutents.H:808
void get_mam_props_sw(int list_idx, int mode_idx, int spec_idx, real &density_aer, real1d &refindex_real_aer_sw, real1d &refindex_im_aer_sw) const
Definition: ERF_Mam4Constitutents.H:939
static void modal_aero_wateruptake_dr(int list_idx, int ncol, int nlev, int nmodes, int top_lev, MamConstituents &consti, const real2d &h2ommr, const real2d &t, const real2d &pmid, const real3d &dgnumdry_m, const real3d &dgnumwet_m, const real3d &qaerwat_m, const real3d &wetdens_m, const real2d &clear_rh_in)
Definition: ERF_ModalAeroWaterUpdate.H:26
@ qt
Definition: ERF_Kessler.H:35