495 subroutine aer_init &
496 & ( nlay, me, iaermdl, iaerflg, lalw1bd, aeros_file, con_pi, &
497 & con_t0c, con_c, con_boltz, con_plnk, errflg, errmsg)
541 integer,
intent(in) :: nlay, me, iaermdl, iaerflg
542 logical,
intent(in) :: lalw1bd
543 character(len=26),
intent(in) :: aeros_file
544 real(kind_phys),
intent(in) :: con_pi,con_t0c, con_c, con_boltz, &
547 integer,
intent(out) :: errflg
548 character(len=*),
intent(out) :: errmsg
551 real (kind=kind_phys),
dimension(NWVTOT) :: solfwv
552 real (kind=kind_phys),
dimension(NWVTIR) :: eirfwv
566 laswflg= (mod(iaerflg,10) > 0)
567 lalwflg= (mod(iaerflg/10,10) > 0)
568 lavoflg= (mod(iaerflg/100,10) >0)
574 call wrt_aerlog(iaermdl, iaerflg, lalw1bd, errflg, errmsg)
581 if ( iaerflg == 0 )
return
603 nswlwbd = nswbnd + nlwbnd
605 wvn_sw1(:) = wvnsw1(:)
606 wvn_sw2(:) = wvnsw2(:)
607 wvn_lw1(:) = wvnlw1(:)
608 wvn_lw2(:) = wvnlw2(:)
613 if ( iaermdl == 0 )
then
616 wvn_sw1(2:nbdsw-1) = wvn_sw1(2:nbdsw-1) + 1
617 wvn_lw1(2:nbdlw) = wvn_lw1(2:nbdlw) + 1
622 if ( iaerflg /= 100 )
then
627 call set_spectrum(con_pi, con_t0c, con_c, con_boltz, con_plnk, &
635 if ( iaermdl==0 .or. iaermdl==5 )
then
638 & ( solfwv, eirfwv, me, aeros_file, &
643 elseif ( iaermdl==1 .or. iaermdl==2 .or. iaermdl==6)
then
645 call gocart_aerinit &
647 & ( solfwv, eirfwv, me, &
654 print *,
' !!! ERROR in aerosol model scheme selection', &
655 &
' iaermdl =',iaermdl
657 errmsg =
'ERROR(aer_init): aerosol model scheme selected'// &
670 call set_volcaer(errflg, errmsg)
683 subroutine wrt_aerlog(iaermdl, iaerflg, lalw1bd, errflg, errmsg)
712 integer,
intent(in) :: iaermdl, iaerflg
713 logical,
intent(in) :: lalw1bd
715 integer,
intent(out) :: errflg
716 character(len=*),
intent(out) :: errmsg
729 if ( iaermdl==0 .or. iaermdl==5 )
then
730 print *,
' - Using OPAC-seasonal climatology for tropospheric', &
732 elseif ( iaermdl == 1 )
then
733 print *,
' - Using MERRA2-climatology for tropospheric', &
735 elseif ( iaermdl == 6 )
then
736 print *,
' - Using MERRA2 3 hourly aerosol for tropospheric', &
738 elseif ( iaermdl == 2 )
then
739 print *,
' - Using GOCART-prognostic aerosols for tropospheric', &
742 print *,
' !!! ERROR in selection of aerosol model scheme', &
743 &
' IAER_MDL =',iaermdl
745 errmsg =
'ERROR(wrt_aerlog): Selected aerosol model scheme is'//&
750 print *,
' IAER=',iaerflg,
' LW-trop-aer=',lalwflg, &
751 &
' SW-trop-aer=',laswflg,
' Volc-aer=',lavoflg
753 if ( iaerflg <= 0 )
then
754 print *,
' - No tropospheric/volcanic aerosol effect included'
755 print *,
' Input values of aerosol optical properties to' &
756 & ,
' both SW and LW radiations are set to zeros'
758 if ( iaerflg >= 100 )
then
759 print *,
' - Include stratospheric volcanic aerosol effect'
761 print *,
' - No stratospheric volcanic aerosol effect'
765 print *,
' - Compute multi-band aerosol optical' &
766 & ,
' properties for SW input parameters'
768 print *,
' - No SW radiation aerosol effect, values of' &
769 & ,
' aerosol properties to SW input are set to zeros'
774 print *,
' - Compute 1 broad-band aerosol optical' &
775 & ,
' properties for LW input parameters'
777 print *,
' - Compute multi-band aerosol optical' &
778 & ,
' properties for LW input parameters'
781 print *,
' - No LW radiation aerosol effect, values of' &
782 & ,
' aerosol properties to LW input are set to zeros'
787 end subroutine wrt_aerlog
793 subroutine set_spectrum(con_pi, con_t0c, con_c, con_boltz, &
794 & con_plnk, errflg, errmsg)
836 real(kind_phys),
intent(in) :: con_pi, con_t0c, con_c, con_boltz, &
843 integer,
intent(out) :: errflg
844 character(len=*),
intent(out) :: errmsg
846 real (kind=kind_phys) :: soltot, tmp1, tmp2, tmp3
848 integer :: nb, nw, nw1, nw2, nmax, nmin
870 nw1 = nw1 + nwvns0(nb-1)
873 nw2 = nw1 + nwvns0(nb) - 1
876 solfwv(nw) = s0intv(nb)
887 tmp1 = (con_pi + con_pi) * con_plnk * con_c* con_c
888 tmp2 = con_plnk * con_c / (con_boltz * con_t0c)
893 eirfwv(nw) = (tmp1 * tmp3**3) / (exp(tmp2*tmp3) - 1.0)
897 end subroutine set_spectrum
903 subroutine set_volcaer(errflg, errmsg)
926 integer,
intent(out) :: errflg
927 character(len=*),
intent(out) :: errmsg
939 if ( .not.
allocated(ivolae) )
then
940 allocate ( ivolae(12,4,10) )
944 end subroutine set_volcaer
961 subroutine clim_aerinit &
962 & ( solfwv, eirfwv, me, aeros_file, &
1003 real (kind=kind_phys),
dimension(:) :: solfwv
1004 real (kind=kind_phys),
dimension(:) :: eirfwv
1005 integer,
intent(in) :: me
1006 character(len=26),
intent(in) :: aeros_file
1008 integer,
intent(out) :: errflg
1009 character(len=*),
intent(out) :: errmsg
1012 real (kind=kind_phys),
dimension(NAERBND,NCM1) :: &
1013 & rhidext0, rhidsca0, rhidssa0, rhidasy0
1014 real (kind=kind_phys),
dimension(NAERBND,NRHLEV,NCM2):: &
1015 & rhdpext0, rhdpsca0, rhdpssa0, rhdpasy0
1016 real (kind=kind_phys),
dimension(NAERBND) :: straext0
1018 real (kind=kind_phys),
dimension(NSWBND,NAERBND) :: solwaer
1019 real (kind=kind_phys),
dimension(NSWBND) :: solbnd
1020 real (kind=kind_phys),
dimension(NLWBND,NAERBND) :: eirwaer
1021 real (kind=kind_phys),
dimension(NLWBND) :: eirbnd
1023 integer,
dimension(NSWBND) :: nv1, nv2
1024 integer,
dimension(NLWBND) :: nr1, nr2
1035 call set_aercoef(aeros_file, errflg, errmsg)
1049 subroutine set_aercoef(aeros_file,errflg, errmsg)
1129 character(len=26),
intent(in) :: aeros_file
1131 integer,
intent(out) :: errflg
1132 character(len=*),
intent(out) :: errmsg
1135 integer,
dimension(NAERBND) :: iendwv
1137 integer :: i, j, k, m, mb, ib, ii, id, iw, iw1, iw2, ik, ibs, ibe
1139 real (kind=kind_phys) :: sumsol, sumir, fac, tmp, wvs, wve
1141 logical :: file_exist
1142 character :: cline*80
1154 inquire (file=aeros_file, exist=file_exist)
1156 if ( file_exist )
then
1158 open (unit=niaercm,file=aeros_file,status=
'OLD', &
1159 & action=
'read',form=
'FORMATTED')
1163 errmsg =
'ERROR(set_aercoef): Requested aerosol data file '// &
1164 & aeros_file//
' not found'
1171 read (niaercm,12) cline
1183 if ( .not.
allocated( extrhi ) )
then
1184 allocate ( extrhi( ncm1,nswlwbd) )
1185 allocate ( scarhi( ncm1,nswlwbd) )
1186 allocate ( ssarhi( ncm1,nswlwbd) )
1187 allocate ( asyrhi( ncm1,nswlwbd) )
1188 allocate ( extrhd(nrhlev,ncm2,nswlwbd) )
1189 allocate ( scarhd(nrhlev,ncm2,nswlwbd) )
1190 allocate ( ssarhd(nrhlev,ncm2,nswlwbd) )
1191 allocate ( asyrhd(nrhlev,ncm2,nswlwbd) )
1192 allocate ( extstra( nswlwbd) )
1205 read(niaercm,21) cline
1207 read(niaercm,22) iendwv(:)
1211 read(niaercm,21) cline
1212 read(niaercm,24) haer(:,:)
1216 read(niaercm,21) cline
1217 read(niaercm,26) prsref(:,:)
1221 read(niaercm,21) cline
1222 read(niaercm,28) rhidext0(:,:)
1226 read(niaercm,21) cline
1227 read(niaercm,28) rhidsca0(:,:)
1230 read(niaercm,21) cline
1231 read(niaercm,28) rhidssa0(:,:)
1234 read(niaercm,21) cline
1235 read(niaercm,28) rhidasy0(:,:)
1238 read(niaercm,21) cline
1239 read(niaercm,28) rhdpext0(:,:,:)
1242 read(niaercm,21) cline
1243 read(niaercm,28) rhdpsca0(:,:,:)
1246 read(niaercm,21) cline
1247 read(niaercm,28) rhdpssa0(:,:,:)
1250 read(niaercm,21) cline
1251 read(niaercm,28) rhdpasy0(:,:,:)
1254 read(niaercm,21) cline
1255 read(niaercm,28) straext0(:)
1262 sigref(:,:) = 0.001 * prsref(:,:)
1272 solwaer(i,j) = f_zero
1282 mb = ib + nswstr - 1
1283 if ( wvn_sw2(mb) >= wvn550 .and. wvn550 >= wvn_sw1(mb) )
then
1287 if ( wvn_sw1(mb) < wvs )
then
1291 if ( wvn_sw1(mb) > wve )
then
1301 mb = ib + nswstr - 1
1303 iw1 = nint(wvn_sw1(mb))
1304 iw2 = nint(wvn_sw2(mb))
1306 lab_swdowhile :
do while ( iw1 > iendwv(ii) )
1307 if ( ii == naerbnd )
exit lab_swdowhile
1311 if ( lmap_new )
then
1315 sumsol = -0.5 * solfwv(iw1)
1329 solbnd(ib) = solbnd(ib) + solfwv(iw)
1330 sumsol = sumsol + solfwv(iw)
1332 if ( iw == iendwv(ii) )
then
1333 solwaer(ib,ii) = sumsol
1335 if ( ii < naerbnd )
then
1342 if ( iw2 /= iendwv(ii) )
then
1343 solwaer(ib,ii) = sumsol
1346 if ( lmap_new )
then
1347 tmp = fac * solfwv(iw2)
1348 solwaer(ib,ii) = solwaer(ib,ii) + tmp
1349 solbnd(ib) = solbnd(ib) + tmp
1365 eirwaer(i,j) = f_zero
1371 if (nlwbnd > 1 )
then
1375 mb = ib + nlwstr - 1
1376 if ( wvn_lw1(mb) < wvs )
then
1380 if ( wvn_lw1(mb) > wve )
then
1391 if ( nlwbnd == 1 )
then
1396 mb = ib + nlwstr - 1
1397 iw1 = nint(wvn_lw1(mb))
1398 iw2 = nint(wvn_lw2(mb))
1401 lab_lwdowhile :
do while ( iw1 > iendwv(ii) )
1402 if ( ii == naerbnd )
exit lab_lwdowhile
1406 if ( lmap_new )
then
1410 sumir = -0.5 * eirfwv(iw1)
1424 eirbnd(ib) = eirbnd(ib) + eirfwv(iw)
1425 sumir = sumir + eirfwv(iw)
1427 if ( iw == iendwv(ii) )
then
1428 eirwaer(ib,ii) = sumir
1430 if ( ii < naerbnd )
then
1437 if ( iw2 /= iendwv(ii) )
then
1438 eirwaer(ib,ii) = sumir
1441 if ( lmap_new )
then
1442 tmp = fac * eirfwv(iw2)
1443 eirwaer(ib,ii) = eirwaer(ib,ii) + tmp
1444 eirbnd(ib) = eirbnd(ib) + tmp
1502 end subroutine set_aercoef
1554 real (kind=kind_phys) :: sumk, sums, sumok, sumokg, sumreft, &
1555 & sp, refb, reft, rsolbd, rirbd
1557 integer :: ib, nb, ni, nh, nc
1568 rsolbd = f_one / solbnd(nb)
1579 do ni = nv1(nb), nv2(nb)
1580 sp = sqrt( (f_one - rhidssa0(ni,nc)) &
1581 & / (f_one - rhidssa0(ni,nc)*rhidasy0(ni,nc)) )
1582 reft = (f_one - sp) / (f_one + sp)
1583 sumreft = sumreft + reft*solwaer(nb,ni)
1585 sumk = sumk + rhidext0(ni,nc)*solwaer(nb,ni)
1586 sums = sums + rhidsca0(ni,nc)*solwaer(nb,ni)
1587 sumok = sumok + rhidssa0(ni,nc)*solwaer(nb,ni) &
1589 sumokg = sumokg + rhidssa0(ni,nc)*solwaer(nb,ni) &
1590 & * rhidext0(ni,nc)*rhidasy0(ni,nc)
1593 refb = sumreft * rsolbd
1595 extrhi(nc,nb) = sumk * rsolbd
1596 scarhi(nc,nb) = sums * rsolbd
1597 asyrhi(nc,nb) = sumokg / (sumok + 1.0e-10)
1598 ssarhi(nc,nb) = 4.0*refb &
1599 & / ( (f_one+refb)**2 - asyrhi(nc,nb)*(f_one-refb)**2 )
1611 do ni = nv1(nb), nv2(nb)
1612 sp = sqrt( (f_one - rhdpssa0(ni,nh,nc)) &
1613 & / (f_one - rhdpssa0(ni,nh,nc)*rhdpasy0(ni,nh,nc)) )
1614 reft = (f_one - sp) / (f_one + sp)
1615 sumreft = sumreft + reft*solwaer(nb,ni)
1617 sumk = sumk + rhdpext0(ni,nh,nc)*solwaer(nb,ni)
1618 sums = sums + rhdpsca0(ni,nh,nc)*solwaer(nb,ni)
1619 sumok = sumok + rhdpssa0(ni,nh,nc)*solwaer(nb,ni) &
1620 & * rhdpext0(ni,nh,nc)
1621 sumokg = sumokg + rhdpssa0(ni,nh,nc)*solwaer(nb,ni) &
1622 & * rhdpext0(ni,nh,nc)*rhdpasy0(ni,nh,nc)
1625 refb = sumreft * rsolbd
1627 extrhd(nh,nc,nb) = sumk * rsolbd
1628 scarhd(nh,nc,nb) = sums * rsolbd
1629 asyrhd(nh,nc,nb) = sumokg / (sumok + 1.0e-10)
1630 ssarhd(nh,nc,nb) = 4.0*refb &
1631 & / ( (f_one+refb)**2 - asyrhd(nh,nc,nb)*(f_one-refb)**2 )
1638 do ni = nv1(nb), nv2(nb)
1639 sumk = sumk + straext0(ni)*solwaer(nb,ni)
1642 extstra(nb) = sumk * rsolbd
1669 rirbd = f_one / eirbnd(nb)
1678 do ni = nr1(nb), nr2(nb)
1679 sp = sqrt( (f_one - rhidssa0(ni,nc)) &
1680 & / (f_one - rhidssa0(ni,nc)*rhidasy0(ni,nc)) )
1681 reft = (f_one - sp) / (f_one + sp)
1682 sumreft = sumreft + reft*eirwaer(nb,ni)
1684 sumk = sumk + rhidext0(ni,nc)*eirwaer(nb,ni)
1685 sums = sums + rhidsca0(ni,nc)*eirwaer(nb,ni)
1686 sumok = sumok + rhidssa0(ni,nc)*eirwaer(nb,ni) &
1688 sumokg = sumokg + rhidssa0(ni,nc)*eirwaer(nb,ni) &
1689 & * rhidext0(ni,nc)*rhidasy0(ni,nc)
1692 refb = sumreft * rirbd
1694 extrhi(nc,ib) = sumk * rirbd
1695 scarhi(nc,ib) = sums * rirbd
1696 asyrhi(nc,ib) = sumokg / (sumok + 1.0e-10)
1697 ssarhi(nc,ib) = 4.0*refb &
1698 & / ( (f_one+refb)**2 - asyrhi(nc,ib)*(f_one-refb)**2 )
1709 do ni = nr1(nb), nr2(nb)
1710 sp = sqrt( (f_one - rhdpssa0(ni,nh,nc)) &
1711 & / (f_one - rhdpssa0(ni,nh,nc)*rhdpasy0(ni,nh,nc)) )
1712 reft = (f_one - sp) / (f_one + sp)
1713 sumreft = sumreft + reft*eirwaer(nb,ni)
1715 sumk = sumk + rhdpext0(ni,nh,nc)*eirwaer(nb,ni)
1716 sums = sums + rhdpsca0(ni,nh,nc)*eirwaer(nb,ni)
1717 sumok = sumok + rhdpssa0(ni,nh,nc)*eirwaer(nb,ni) &
1718 & * rhdpext0(ni,nh,nc)
1719 sumokg = sumokg + rhdpssa0(ni,nh,nc)*eirwaer(nb,ni) &
1720 & * rhdpext0(ni,nh,nc)*rhdpasy0(ni,nh,nc)
1723 refb = sumreft * rirbd
1725 extrhd(nh,nc,ib) = sumk * rirbd
1726 scarhd(nh,nc,ib) = sums * rirbd
1727 asyrhd(nh,nc,ib) = sumokg / (sumok + 1.0e-10)
1728 ssarhd(nh,nc,ib) = 4.0*refb &
1729 & / ( (f_one+refb)**2 - asyrhd(nh,nc,ib)*(f_one-refb)**2 )
1736 do ni = nr1(nb), nr2(nb)
1737 sumk = sumk + straext0(ni)*eirwaer(nb,ni)
1740 extstra(ib) = sumk * rirbd
1759 end subroutine optavg
2182 & ( prsi,prsl,prslk,tvly,rhlay,slmsk,tracer,aerfld,xlon,xlat, &
2183 & imax,nlay,nlp1, lsswr,lslwr,iaermdl,iaerflg,top_at_1, &
2184 & con_pi,con_rd,con_g,aerosw,aerolw, &
2185 & aerodp, ext550, errflg, errmsg &
2248 integer,
intent(in) :: imax, nlay, nlp1, iaermdl, iaerflg
2249 real (kind=kind_phys),
intent(in) :: con_pi, con_rd, con_g
2250 real (kind=kind_phys),
dimension(:,:),
intent(in) :: prsi, prsl, &
2251 & prslk, tvly, rhlay
2252 real (kind=kind_phys),
dimension(:),
intent(in) :: xlon, xlat, &
2254 real (kind=kind_phys),
dimension(:,:,:),
intent(in):: tracer
2255 real (kind=kind_phys),
dimension(:,:,:),
intent(in):: aerfld
2257 logical,
intent(in) :: lsswr, lslwr, top_at_1
2261 real (kind=kind_phys),
dimension(:,:,:,:),
intent(out) :: &
2264 real (kind=kind_phys),
dimension(:,:) ,
intent(out) :: aerodp
2265 real (kind=kind_phys),
dimension(:,:) ,
intent(out) :: ext550
2266 integer,
intent(out) :: errflg
2267 character(len=*),
intent(out) :: errmsg
2270 real (kind=kind_phys),
parameter :: psrfh = 5.0
2272 real (kind=kind_phys),
dimension(IMAX) :: alon,alat,volcae,rdelp
2274 real (kind=kind_phys) :: prsln(nlp1),hz(imax,nlp1),dz(imax,nlay)
2275 real (kind=kind_phys) :: tmp1, tmp2, psrfl
2277 integer :: kcutl(imax), kcuth(imax)
2278 integer :: i, i1, j, k, m, mb, kh, kl
2280 logical :: laddsw=.false., laersw=.false.
2281 logical :: laddlw=.false., laerlw=.false.
2284 real (kind=kind_phys) :: rdg
2285 real (kind=kind_phys) :: rovg
2288 rdg = 180._kind_phys / con_pi
2289 rovg = 0.001_kind_phys * con_rd / con_g
2301 if ( .not. (lsswr .or. lslwr) )
then
2305 if ( iaerflg <= 0 )
then
2309 laersw = lsswr .and. laswflg
2310 laerlw = lslwr .and. lalwflg
2315 alon(i) = xlon(i) * rdg
2316 if (alon(i) < f_zero) alon(i) = alon(i) + 360.0
2317 alat(i) = xlat(i) * rdg
2323 if ( laswflg .or. lalwflg )
then
2325 lab_do_imax :
do i = 1, imax
2327 lab_if_flip :
if (.not. top_at_1)
then
2330 prsln(k) = log(prsi(i,k))
2332 prsln(nlp1)= log(prsl(i,nlay))
2335 dz(i,k) = rovg * (prsln(k) - prsln(k+1)) * tvly(i,k)
2337 dz(i,nlay) = 2.0 * dz(i,nlay)
2341 hz(i,k+1) = hz(i,k) + dz(i,k)
2346 prsln(1) = log(prsl(i,1))
2348 prsln(k) = log(prsi(i,k))
2352 dz(i,k) = rovg * (prsln(k+1) - prsln(k)) * tvly(i,k)
2354 dz(i,1) = 2.0 * dz(i,1)
2358 hz(i,k) = hz(i,k+1) + dz(i,k)
2376 if ( iaermdl==0 .or. iaermdl==5 )
then
2380 & ( prsi,prsl,prslk,tvly,rhlay,dz,hz,tracer, &
2381 & alon,alat,slmsk, laersw,laerlw, &
2382 & imax,nlay,nlp1,top_at_1, &
2385 & aerosw,aerolw,aerodp,errflg,errmsg &
2389 elseif ( iaermdl==1 .or. iaermdl==2 .or. iaermdl==6)
then
2391 call aer_property_gocart &
2393 & ( prsi,prsl,prslk,tvly,rhlay,dz,hz,tracer,aerfld, &
2394 & alon,alat,slmsk,laersw,laerlw,con_rd, &
2397 & aerosw,aerolw,aerodp,ext550,errflg,errmsg &
2400 if(errflg/=0)
return
2451 if ( iaerflg == 100 )
then
2455 laddsw = lsswr .and. laswflg
2456 laddlw = lslwr .and. lalwflg
2459 i1 = mod(kyrsav, 10) + 1
2464 if ( alat(i) > 46.0 )
then
2465 volcae(i) = 1.0e-4 * ivolae(kmonsav,1,i1)
2466 else if ( alat(i) > 44.0 )
then
2467 volcae(i) = 5.0e-5 &
2468 & * (ivolae(kmonsav,1,i1) + ivolae(kmonsav,2,i1))
2469 else if ( alat(i) > 1.0 )
then
2470 volcae(i) = 1.0e-4 * ivolae(kmonsav,2,i1)
2471 else if ( alat(i) > -1.0 )
then
2472 volcae(i) = 5.0e-5 &
2473 & * (ivolae(kmonsav,2,i1) + ivolae(kmonsav,3,i1))
2474 else if ( alat(i) >-44.0 )
then
2475 volcae(i) = 1.0e-4 * ivolae(kmonsav,3,i1)
2476 else if ( alat(i) >-46.0 )
then
2477 volcae(i) = 5.0e-5 &
2478 & * (ivolae(kmonsav,3,i1) + ivolae(kmonsav,4,i1))
2480 volcae(i) = 1.0e-4 * ivolae(kmonsav,4,i1)
2490 tmp1 = abs( alat(i) )
2491 if ( tmp1 > 70.0 )
then
2493 elseif ( tmp1 < 20.0 )
then
2496 psrfl = 110.0 + 2.0*tmp1
2501 rdelp(i) = f_one / prsi(i,2)
2503 lab_do_kcuth0 :
do k = 2, nlay-2
2504 if ( prsi(i,k) >= psrfh )
then
2510 lab_do_kcutl0 :
do k = 2, nlay-2
2511 if ( prsi(i,k) >= psrfl )
then
2513 rdelp(i) = f_one / (prsi(i,k) - prsi(i,kcuth(i)))
2525 if ( wvn_sw1(mb) > 20000 )
then
2527 elseif ( wvn_sw2(mb) < 20000 )
then
2532 tmp1 = (0.275e-4 * (wvn_sw2(mb)+wvn_sw1(mb))) ** tmp2
2538 tmp2 = tmp1 * ((prsi(i,k+1) - prsi(i,k)) * rdelp(i))
2539 aerosw(i,k,m,1) = aerosw(i,k,m,1) + tmp2*volcae(i)
2544 if ( aerosw(i,kl,m,1) > 10.*aerosw(i,kl+1,m,1) )
then
2545 tmp2 = aerosw(i,kl,m,1) + aerosw(i,kl+1,m,1)
2546 aerosw(i,kl ,m,1) = 0.8 * tmp2
2547 aerosw(i,kl+1,m,1) = 0.2 * tmp2
2569 if ( nlwbnd == 1 )
then
2571 tmp1 = (0.55 / 11.0) ** 1.2
2576 tmp2 = tmp1 * ((prsi(i,k+1) - prsi(i,k)) * rdelp(i)) &
2579 aerolw(i,k,m,1) = aerolw(i,k,m,1) + tmp2
2587 tmp1 = (0.275e-4 * (wvn_lw2(m) + wvn_lw1(m))) ** 1.2
2593 tmp2 = tmp1 * ((prsi(i,k+1)-prsi(i,k)) * rdelp(i))
2594 aerolw(i,k,m,1) = aerolw(i,k,m,1) + tmp2*volcae(i)
2608 tmp1 = abs( alat(i) )
2609 if ( tmp1 > 70.0 )
then
2611 elseif ( tmp1 < 20.0 )
then
2614 psrfl = 110.0 + 2.0*tmp1
2619 rdelp(i) = f_one / prsi(i,nlay-1)
2621 lab_do_kcuth1 :
do k = nlay-1, 2, -1
2622 if ( prsi(i,k) >= psrfh )
then
2628 lab_do_kcutl1 :
do k = nlay, 2, -1
2629 if ( prsi(i,k) >= psrfl )
then
2631 rdelp(i) = f_one / (prsi(i,k) - prsi(i,kcuth(i)+1))
2643 if ( wvn_sw1(mb) > 20000 )
then
2645 elseif ( wvn_sw2(mb) < 20000 )
then
2650 tmp1 = (0.275e-4 * (wvn_sw2(mb)+wvn_sw1(mb))) ** tmp2
2656 tmp2 = tmp1 * ((prsi(i,k) - prsi(i,k+1)) * rdelp(i))
2657 aerosw(i,k,m,1) = aerosw(i,k,m,1) + tmp2*volcae(i)
2662 if ( aerosw(i,kl,m,1) > 10.*aerosw(i,kl-1,m,1) )
then
2663 tmp2 = aerosw(i,kl,m,1) + aerosw(i,kl-1,m,1)
2664 aerosw(i,kl ,m,1) = 0.8 * tmp2
2665 aerosw(i,kl-1,m,1) = 0.2 * tmp2
2686 if ( nlwbnd == 1 )
then
2688 tmp1 = (0.55 / 11.0) ** 1.2
2693 tmp2 = tmp1 * ((prsi(i,k) - prsi(i,k+1)) * rdelp(i)) &
2696 aerolw(i,k,m,1) = aerolw(i,k,m,1) + tmp2
2704 tmp1 = (0.275e-4 * (wvn_lw2(m) + wvn_lw1(m))) ** 1.2
2710 tmp2 = tmp1 * ((prsi(i,k)-prsi(i,k+1)) * rdelp(i))
2711 aerolw(i,k,m,1) = aerolw(i,k,m,1) + tmp2*volcae(i)
2755 subroutine aer_property &
2756 & ( prsi,prsl,prslk,tvly,rhlay,dz,hz,tracer, &
2757 & alon,alat,slmsk, laersw,laerlw, &
2758 & imax,nlay,nlp1,top_at_1, &
2759 & aerosw,aerolw,aerodp,errflg,errmsg &
2823 integer,
intent(in) :: IMAX, NLAY, NLP1
2825 logical,
intent(in) :: laersw, laerlw, top_at_1
2827 real (kind=kind_phys),
dimension(:,:),
intent(in) :: prsi, prsl, &
2828 & prslk, tvly, rhlay, dz, hz
2829 real (kind=kind_phys),
dimension(:),
intent(in) :: alon, alat, &
2831 real (kind=kind_phys),
dimension(:,:,:),
intent(in):: tracer
2834 real (kind=kind_phys),
dimension(:,:,:,:),
intent(out) :: &
2836 real (kind=kind_phys),
dimension(:,:) ,
intent(out) :: aerodp
2837 integer,
intent(out) :: errflg
2838 character(len=*),
intent(out) :: errmsg
2841 real (kind=kind_phys),
dimension(NCM) :: cmix
2842 real (kind=kind_phys),
dimension( 2) :: denn
2843 real (kind=kind_phys),
dimension(NSPC) :: spcodp
2845 real (kind=kind_phys),
dimension(NLAY) :: delz, rh1, dz1
2846 integer,
dimension(NLAY) :: idmaer
2848 real (kind=kind_phys),
dimension(NLAY,NSWLWBD):: tauae,ssaae,asyae
2851 real (kind=kind_phys) :: tmp1, tmp2, rps, dtmp, h1
2852 real (kind=kind_phys) :: wi, wj, w11, w12, w21, w22
2854 integer :: i, ii, i1, i2, i3, j1, j2, j3, k, m, m1, &
2858 real (kind=kind_phys),
parameter :: dltg = 360.0 / float(imxae)
2859 real (kind=kind_phys),
parameter :: hdlt = 0.5 * dltg
2860 real (kind=kind_phys),
parameter :: rdlt = 1.0 / dltg
2879 lab_do_imax :
do i = 1, imax
2885 lab_do_imxae :
do while ( i3 <= imxae )
2886 tmp1 = dltg * (i3 - 1)
2887 dtmp = alon(i) - tmp1
2890 if ( dtmp > dltg )
then
2892 if ( i3 > imxae )
then
2893 print *,
' ERROR! In setclimaer alon>360. ipt =',i, &
2894 &
', dltg,alon,tlon,dlon =',dltg,alon(i),tmp1,dtmp
2896 errmsg =
'ERROR(aer_property) alon > 360'
2899 elseif ( dtmp >= f_zero )
then
2901 i2 = mod(i3,imxae) + 1
2903 if ( dtmp <= hdlt )
then
2913 print *,
' ERROR! In setclimaer alon< 0. ipt =',i, &
2914 &
', dltg,alon,tlon,dlon =',dltg,alon(i),tmp1,dtmp
2916 errmsg =
'ERROR(aer_property) alon < 0'
2926 lab_do_jmxae :
do while ( j3 <= jmxae )
2927 tmp2 = 90.0 - dltg * (j3 - 1)
2928 dtmp = tmp2 - alat(i)
2931 if ( dtmp > dltg )
then
2933 if ( j3 >= jmxae )
then
2934 print *,
' ERROR! In setclimaer alat<-90. ipt =',i, &
2935 &
', dltg,alat,tlat,dlat =',dltg,alat(i),tmp2,dtmp
2937 errmsg =
'ERROR(aer_property) alat < -90'
2940 elseif ( dtmp >= f_zero )
then
2944 if ( dtmp <= hdlt )
then
2954 print *,
' ERROR! In setclimaer alat>90. ipt =',i, &
2955 &
', dltg,alat,tlat,dlat =',dltg,alat(i),tmp2,dtmp
2957 errmsg =
'ERROR(aer_property) alat > 90'
2967 kpa = max( kprfg(i1,j1),kprfg(i1,j2),kprfg(i2,j1),kprfg(i2,j2) )
2972 if ( kp /= kpa )
then
2973 if ( kpa == 6 )
then
2975 if ( slmsk(i) > f_zero )
then
2977 h1 = 0.5*(haer(1,6) + haer(1,7))
2982 elseif ( kpa == 7 )
then
2984 if ( slmsk(i) <= f_zero )
then
2986 h1 = 0.5*(haer(1,6) + haer(1,7))
3000 w11 = (f_one-wi) * (f_one-wj)
3001 w12 = (f_one-wi) * wj
3002 w21 = wi * (f_one-wj)
3017 denn(m) = w11*denng(m,i1,j1) + w12*denng(m,i1,j2) &
3018 & + w21*denng(m,i2,j1) + w22*denng(m,i2,j2)
3027 cmix(ii) = cmix(ii) + w11*cmixg(m,i1,j1)
3031 cmix(ii) = cmix(ii) + w12*cmixg(m,i1,j2)
3035 cmix(ii) = cmix(ii) + w21*cmixg(m,i2,j1)
3039 cmix(ii) = cmix(ii) + w22*cmixg(m,i2,j2)
3055 lab_if_flip :
if (.not. top_at_1)
then
3057 if ( prsi(i,1) > 100.0 )
then
3058 rps = f_one / prsi(i,1)
3060 print *,
' !!! (1) Error in subr radiation_aerosols:', &
3061 &
' unrealistic surface pressure =', i,prsi(i,1)
3063 errmsg =
'ERROR(aer_property): Unrealistic surface pressure'
3069 if (prsi(i,k+1)*rps < sigref(ii,kp))
then
3071 if (ii == 2 .and. prsref(2,kp) == prsref(3,kp))
then
3083 if (tmp1 > f_zero)
then
3085 delz(k) = tmp1 * (exp(-hz(i,k)*tmp2)-exp(-hz(i,k+1)*tmp2))
3093 if ( prsi(i,nlp1) > 100.0 )
then
3094 rps = 1.0 / prsi(i,nlp1)
3096 print *,
' !!! (2) Error in subr radiation_aerosols:', &
3097 &
' unrealistic surface pressure =', i,prsi(i,nlp1)
3102 if (prsi(i,k)*rps < sigref(ii,kp))
then
3104 if (ii == 2 .and. prsref(2,kp) == prsref(3,kp))
then
3116 if (tmp1 > f_zero)
then
3118 delz(k) = tmp1 * (exp(-hz(i,k+1)*tmp2)-exp(-hz(i,k)*tmp2))
3137 call radclimaer(top_at_1)
3145 aerosw(i,k,m,1) = tauae(k,m)
3146 aerosw(i,k,m,2) = ssaae(k,m)
3147 aerosw(i,k,m,3) = asyae(k,m)
3153 aerodp(i,1) = aerodp(i,1) + tauae(k,nv_aod)
3158 aerodp(i,m+1) = spcodp(m)
3165 if ( nlwbnd == 1 )
then
3169 aerolw(i,k,m,1) = tauae(k,m1)
3170 aerolw(i,k,m,2) = ssaae(k,m1)
3171 aerolw(i,k,m,3) = asyae(k,m1)
3178 aerolw(i,k,m,1) = tauae(k,m1)
3179 aerolw(i,k,m,2) = ssaae(k,m1)
3180 aerolw(i,k,m,3) = asyae(k,m1)
3198 subroutine radclimaer(top_at_1)
3230 real (kind=kind_phys) :: crt1, crt2
3231 parameter(crt1=30.0, crt2=0.03333)
3234 logical,
intent(in) :: top_at_1
3238 real (kind=kind_phys) :: cm, hd, hdi, sig0u, sig0l, ratio, tt0, &
3239 & ex00, sc00, ss00, as00, ex01, sc01, ss01, as01, tt1, &
3240 & ex02, sc02, ss02, as02, ex03, sc03, ss03, as03, tt2, &
3241 & ext1, sca1, ssa1, asy1, drh0, drh1, rdrh
3243 integer :: ih1, ih2, kk, idom, icmp, ib, ii, ic, ic1
3252 lab_do_layer :
do kk = 1, nlay
3257 do while ( rh1(kk) > rhlev(ih2) )
3259 if ( ih2 > nrhlev )
exit
3261 ih1 = max( 1, ih2-1 )
3262 ih2 = min( nrhlev, ih2 )
3264 drh0 = rhlev(ih2) - rhlev(ih1)
3265 drh1 = rh1(kk) - rhlev(ih1)
3266 if ( ih1 == ih2 )
then
3276 lab_if_idom :
if (idom == 5)
then
3280 tauae(kk,ib) = f_zero
3281 if ( ib <= nswbnd )
then
3283 asyae(kk,ib) = 0.696
3290 elseif (idom == 4)
then lab_if_idom
3294 tauae(kk,ib) = extstra(ib) * delz(kk)
3295 if ( ib <= nswbnd )
then
3297 asyae(kk,ib) = 0.696
3306 spcodp(idx) = spcodp(idx) + tauae(kk,nv_aod)
3308 elseif (idom == 3)
then lab_if_idom
3323 ex03 = extrhd(ih1,1,ib) &
3324 & + rdrh * (extrhd(ih2,1,ib) - extrhd(ih1,1,ib))
3325 sc03 = scarhd(ih1,1,ib) &
3326 & + rdrh * (scarhd(ih2,1,ib) - scarhd(ih1,1,ib))
3327 ss03 = ssarhd(ih1,1,ib) &
3328 & + rdrh * (ssarhd(ih2,1,ib) - ssarhd(ih1,1,ib))
3329 as03 = asyrhd(ih1,1,ib) &
3330 & + rdrh * (asyrhd(ih2,1,ib) - asyrhd(ih1,1,ib))
3332 ext1 = 0.17e-3*ex01 + 0.4*ex02 + 0.59983*ex03
3333 sca1 = 0.17e-3*sc01 + 0.4*sc02 + 0.59983*sc03
3334 ssa1 = 0.17e-3*ss01*ex01 + 0.4*ss02*ex02 + 0.59983*ss03*ex03
3335 asy1 = 0.17e-3*as01*sc01 + 0.4*as02*sc02 + 0.59983*as03*sc03
3337 tauae(kk,ib) = ext1 * 730.0 * delz(kk)
3338 ssaae(kk,ib) = min(f_one, ssa1/ext1)
3339 asyae(kk,ib) = min(f_one, asy1/sca1)
3342 if ( ib==nv_aod )
then
3343 spcodp(1) = spcodp(1) + 0.17e-3*ex01*730.0*delz(kk)
3344 spcodp(2) = spcodp(2) + 0.4 *ex02*730.0*delz(kk)
3345 spcodp(3) = spcodp(3) + 0.59983*ex03*730.0*delz(kk)
3350 elseif (idom == 1)
then lab_if_idom
3353 lab_do_ib :
do ib = 1, nswlwbd
3359 lab_do_icmp :
do icmp = 1, ncm
3364 lab_if_cm :
if ( cm > f_zero )
then
3366 lab_if_ic :
if ( ic <= ncm1 )
then
3367 tt0 = cm * extrhi(ic,ib)
3369 sca1 = sca1 + cm * scarhi(ic,ib)
3370 ssa1 = ssa1 + cm * ssarhi(ic,ib) * extrhi(ic,ib)
3371 asy1 = asy1 + cm * asyrhi(ic,ib) * scarhi(ic,ib)
3375 ex00 = extrhd(ih1,ic1,ib) &
3376 & + rdrh * (extrhd(ih2,ic1,ib) - extrhd(ih1,ic1,ib))
3377 sc00 = scarhd(ih1,ic1,ib) &
3378 & + rdrh * (scarhd(ih2,ic1,ib) - scarhd(ih1,ic1,ib))
3379 ss00 = ssarhd(ih1,ic1,ib) &
3380 & + rdrh * (ssarhd(ih2,ic1,ib) - ssarhd(ih1,ic1,ib))
3381 as00 = asyrhd(ih1,ic1,ib) &
3382 & + rdrh * (asyrhd(ih2,ic1,ib) - asyrhd(ih1,ic1,ib))
3386 sca1 = sca1 + cm * sc00
3387 ssa1 = ssa1 + cm * ss00 * ex00
3388 asy1 = asy1 + cm * as00 * sc00
3392 if ( ib==nv_aod )
then
3393 spcodp(idx) = spcodp(idx) + tt0*denn(1)*delz(kk)
3399 tauae(kk,ib) = ext1 * denn(1) * delz(kk)
3400 ssaae(kk,ib) = min(f_one, ssa1/ext1)
3401 asyae(kk,ib) = min(f_one, asy1/sca1)
3404 elseif (idom == 2)
then lab_if_idom
3408 tauae(kk,ib) = extrhi(6,ib) * denn(2) * delz(kk)
3409 ssaae(kk,ib) = ssarhi(6,ib)
3410 asyae(kk,ib) = asyrhi(6,ib)
3414 spcodp(1) = spcodp(1) + tauae(kk,nv_aod)
3420 tauae(kk,ib) = f_zero
3421 ssaae(kk,ib) = f_one
3422 asyae(kk,ib) = f_zero
3441 if ( tauae(kk,ib) > f_zero )
then
3442 ratio = tauae(kk-1,ib) / tauae(kk,ib)
3447 tt0 = tauae(kk,ib) + tauae(kk-1,ib)
3451 if ( ratio > crt1 )
then
3453 tauae(kk-1,ib) = tt2
3456 if ( ratio < crt2 )
then
3458 tauae(kk-1,ib) = tt1
3466 do kk = nlay-1, 1, -1
3467 if ( tauae(kk,ib) > f_zero )
then
3468 ratio = tauae(kk+1,ib) / tauae(kk,ib)
3473 tt0 = tauae(kk,ib) + tauae(kk+1,ib)
3477 if ( ratio > crt1 )
then
3479 tauae(kk+1,ib) = tt2
3482 if ( ratio < crt2 )
then
3484 tauae(kk+1,ib) = tt1
3493 end subroutine radclimaer
3510 subroutine gocart_aerinit &
3511 & ( solfwv, eirfwv, me, &
3549 real (kind=kind_phys),
dimension(:) :: solfwv
3550 real (kind=kind_phys),
dimension(:) :: eirfwv
3552 integer,
intent(in) :: me
3555 integer,
intent(out) :: errflg
3556 character(len=*),
intent(out) :: errmsg
3559 real (kind=kind_phys),
dimension(kaerbndi,kcm1) :: &
3560 & rhidext0_grt, rhidsca0_grt, rhidssa0_grt, rhidasy0_grt
3561 real (kind=kind_phys),
dimension(kaerbndd,krhlev,kcm2):: &
3562 & rhdpext0_grt, rhdpsca0_grt, rhdpssa0_grt, rhdpasy0_grt
3564 real (kind=kind_phys),
dimension(nswbnd,kaerbndd) :: solwaer
3565 real (kind=kind_phys),
dimension(nswbnd) :: solbnd
3566 real (kind=kind_phys),
dimension(nlwbnd,kaerbndd) :: eirwaer
3567 real (kind=kind_phys),
dimension(nlwbnd) :: eirbnd
3569 real (kind=kind_phys),
dimension(nswbnd,kaerbndi) :: solwaer_du
3570 real (kind=kind_phys),
dimension(nswbnd) :: solbnd_du
3571 real (kind=kind_phys),
dimension(nlwbnd,kaerbndi) :: eirwaer_du
3572 real (kind=kind_phys),
dimension(nlwbnd) :: eirbnd_du
3574 integer,
dimension(nswbnd) :: nv1, nv2, nv1_du, nv2_du
3575 integer,
dimension(nlwbnd) :: nr1, nr2, nr1_du, nr2_du
3577 integer,
dimension(kaerbndd) :: iendwv
3578 integer,
dimension(kaerbndi) :: iendwv_du
3579 real (kind=kind_phys),
dimension(kaerbndd) :: wavelength
3580 real (kind=kind_phys),
dimension(kaerbndi) :: wavelength_du
3581 real (kind=kind_phys) :: sumsol, sumir, sumsol_du, sumir_du
3583 integer :: i, j, k, mb, ib, ii, iix, iw, iw1, iw2
3596 if (kcm /= ntrcaerm )
then
3597 print *,
'ERROR in # of gocart aer species',kcm
3599 errmsg =
'ERROR(gocart_init): Incorrect # of species'
3605 if ( .not.
allocated( extrhi_grt ) )
then
3606 allocate ( extrhi_grt( kcm1,nswlwbd) )
3607 allocate ( extrhi_grt_550( kcm1,1) )
3608 allocate ( scarhi_grt( kcm1,nswlwbd) )
3609 allocate ( ssarhi_grt( kcm1,nswlwbd) )
3610 allocate ( asyrhi_grt( kcm1,nswlwbd) )
3611 allocate ( extrhd_grt(krhlev,kcm2,nswlwbd) )
3612 allocate ( extrhd_grt_550(krhlev,kcm2,1) )
3613 allocate ( scarhd_grt(krhlev,kcm2,nswlwbd) )
3614 allocate ( ssarhd_grt(krhlev,kcm2,nswlwbd) )
3615 allocate ( asyrhd_grt(krhlev,kcm2,nswlwbd) )
3628 iendwv(i) = int(10000. / wavelength(i))
3632 iendwv_du(i) = int(10000. / wavelength_du(i))
3640 solbnd_du(:)= f_zero
3643 solwaer(i,j) = f_zero
3646 solwaer_du(i,j) = f_zero
3651 mb = ib + nswstr - 1
3654 iw1 = nint(wvnsw1(mb))
3655 iw2 = nint(wvnsw2(mb))
3657 if ( wvnsw2(mb)>=wvn550 .and. wvn550>=wvnsw1(mb) )
then
3662 do while ( iw1 > iendwv(ii) )
3663 if ( ii == kaerbndd )
exit
3670 do while ( iw1 > iendwv_du(iix) )
3671 if ( iix == kaerbndi )
exit
3679 solbnd(ib) = solbnd(ib) + solfwv(iw)
3680 sumsol = sumsol + solfwv(iw)
3682 if ( iw == iendwv(ii) )
then
3683 solwaer(ib,ii) = sumsol
3684 if ( ii < kaerbndd )
then
3691 solbnd_du(ib) = solbnd_du(ib) + solfwv(iw)
3692 sumsol_du = sumsol_du + solfwv(iw)
3694 if ( iw == iendwv_du(iix) )
then
3695 solwaer_du(ib,iix) = sumsol_du
3696 if ( iix < kaerbndi )
then
3703 if ( iw2 /= iendwv(ii) )
then
3704 solwaer(ib,ii) = sumsol
3706 if ( iw2 /= iendwv_du(iix) )
then
3707 solwaer_du(ib,iix) = sumsol_du
3720 eirbnd_du(:) = f_zero
3723 eirwaer(i,j) = f_zero
3726 eirwaer_du(i,j) = f_zero
3733 if ( nlwbnd == 1 )
then
3737 mb = ib + nlwstr - 1
3738 iw1 = nint(wvnlw1(mb))
3739 iw2 = nint(wvnlw2(mb))
3743 do while ( iw1 > iendwv(ii) )
3744 if ( ii == kaerbndd )
exit
3751 do while ( iw1 > iendwv_du(iix) )
3752 if ( iix == kaerbndi )
exit
3760 eirbnd(ib) = eirbnd(ib) + eirfwv(iw)
3761 sumir = sumir + eirfwv(iw)
3763 if ( iw == iendwv(ii) )
then
3764 eirwaer(ib,ii) = sumir
3766 if ( ii < kaerbndd )
then
3773 eirbnd_du(ib) = eirbnd_du(ib) + eirfwv(iw)
3774 sumir_du = sumir_du + eirfwv(iw)
3776 if ( iw == iendwv_du(iix) )
then
3777 eirwaer_du(ib,iix) = sumir_du
3779 if ( iix < kaerbndi )
then
3786 if ( iw2 /= iendwv(ii) )
then
3787 eirwaer(ib,ii) = sumir
3789 if ( iw2 /= iendwv_du(iix) )
then
3790 eirwaer_du(ib,iix) = sumir_du
3855 subroutine rd_gocart_luts
3894 integer :: iradius, ik, ibeg
3895 integer,
parameter :: numspc = 5
3898 real,
dimension(kaerbndd) :: lambda
3899 real,
dimension(kaerbndi) :: lambda_du
3900 real,
dimension(krhlev) :: rh
3901 real,
dimension(kaerbndd,krhlev,numspc) :: bext
3902 real,
dimension(kaerbndd,krhlev,numspc) :: bsca
3903 real,
dimension(kaerbndd,krhlev,numspc) :: g
3904 real,
dimension(kaerbndi,krhlev,numspc) :: bext_du
3905 real,
dimension(kaerbndi,krhlev,numspc) :: bsca_du
3906 real,
dimension(kaerbndi,krhlev,numspc) :: g_du
3908 logical :: file_exist
3909 character*50 :: fin, dummy
3912 fin=
'optics_'//gridcomp(1)//
'.dat'
3913 inquire (file=trim(fin), exist=file_exist)
3914 if ( file_exist )
then
3916 open (unit=niaercm, file=fin, status=
'OLD')
3920 errmsg =
'ERROR(rd_gocart_luts): Requested luts file '// &
3921 & trim(fin)//
' not found'
3927 read(niaercm,
'(a40)') dummy
3928 read(niaercm,*) (lambda_du(i), i=1, kaerbndi)
3930 read(niaercm,
'(a40)') dummy
3931 read(niaercm,*) (rh(i), i=1, krhlev)
3934 read(niaercm,
'(a40)') dummy
3936 read(niaercm,*) (bext_du(i,j,k), i=1,kaerbndi)
3941 read(niaercm,
'(a40)') dummy
3943 read(niaercm,*) (bsca_du(i,j,k), i=1, kaerbndi)
3948 read(niaercm,
'(a40)') dummy
3950 read(niaercm,*) (g_du(i,j,k), i=1, kaerbndi)
3957 wavelength_du(j) = 1.e6 * lambda_du(i)
3958 if (int(wavelength_du(j)*100) == 55)
then
3964 ii = kaerbndi -i + 1
3965 rhidext0_grt(ii,k) = bext_du(i,1,k)
3966 rhidsca0_grt(ii,k) = bsca_du(i,1,k)
3967 if ( bext_du(i,1,k) /= f_zero)
then
3968 rhidssa0_grt(ii,k) = bsca_du(i,1,k)/bext_du(i,1,k)
3970 rhidssa0_grt(ii,k) = f_one
3972 rhidasy0_grt(ii,k) = g_du(i,1,k)
3978 fin=
'optics_'//gridcomp(ib)//
'.dat'
3979 inquire (file=trim(fin), exist=file_exist)
3980 if ( file_exist )
then
3982 open (unit=niaercm, file=fin, status=
'OLD')
3986 errmsg =
'ERROR(rd_gocart_luts): Requested luts file '// &
3987 & trim(fin)//
' not found'
3991 ibeg = radius_lower(ib) - kcm1
3992 iradius = num_radius(ib)
3995 read(niaercm,
'(a40)') dummy
3996 read(niaercm,*) (lambda(i), i=1, kaerbndd)
3998 read(niaercm,
'(a40)') dummy
3999 read(niaercm,*) (rh(i), i=1, krhlev)
4002 read(niaercm,
'(a40)') dummy
4004 read(niaercm,*) (bext(i,j,k), i=1,kaerbndd)
4009 read(niaercm,
'(a40)') dummy
4011 read(niaercm,*) (bsca(i,j,k), i=1, kaerbndd)
4016 read(niaercm,
'(a40)') dummy
4018 read(niaercm,*) (g(i,j,k), i=1, kaerbndd)
4025 wavelength(j) = 1.e6 * lambda(i)
4026 if (int(wavelength(j)*100) == 55)
then
4033 ii = kaerbndd -i + 1
4035 rhdpext0_grt(ii,j,ik) = bext(i,j,k)
4036 rhdpsca0_grt(ii,j,ik) = bsca(i,j,k)
4037 if ( bext(i,j,k) /= f_zero)
then
4038 rhdpssa0_grt(ii,j,ik) = bsca(i,j,k)/bext(i,j,k)
4040 rhdpssa0_grt(ii,j,ik) = f_one
4042 rhdpasy0_grt(ii,j,ik) = g(i,j,k)
4050 end subroutine rd_gocart_luts
4058 subroutine optavg_gocart
4114 real (kind=kind_phys) :: sumk, sums, sumok, sumokg, sumreft, &
4115 & sp, refb, reft, rsolbd, rirbd
4117 integer :: ib, nb, ni, nh, nc
4125 rsolbd = f_one / solbnd_du(nb)
4133 do ni = nv1_du(nb), nv2_du(nb)
4134 sp = sqrt( (f_one - rhidssa0_grt(ni,nc)) &
4135 & / (f_one - rhidssa0_grt(ni,nc)*rhidasy0_grt(ni,nc)) )
4136 reft = (f_one - sp) / (f_one + sp)
4137 sumreft = sumreft + reft*solwaer_du(nb,ni)
4139 sumk = sumk + rhidext0_grt(ni,nc)*solwaer_du(nb,ni)
4140 sums = sums + rhidsca0_grt(ni,nc)*solwaer_du(nb,ni)
4141 sumok = sumok + rhidssa0_grt(ni,nc)*solwaer_du(nb,ni) &
4142 & * rhidext0_grt(ni,nc)
4143 sumokg = sumokg + rhidssa0_grt(ni,nc)*solwaer_du(nb,ni) &
4144 & * rhidext0_grt(ni,nc)*rhidasy0_grt(ni,nc)
4147 refb = sumreft * rsolbd
4149 extrhi_grt(nc,nb) = sumk * rsolbd
4150 if (nb==nv_aod)
then
4151 extrhi_grt_550(nc,1) = rhidext0_grt(id550,nc)
4153 scarhi_grt(nc,nb) = sums * rsolbd
4154 asyrhi_grt(nc,nb) = sumokg / (sumok + 1.0e-10)
4155 ssarhi_grt(nc,nb) = 4.0*refb &
4156 & / ( (f_one+refb)**2 - asyrhi_grt(nc,nb)*(f_one-refb)**2 )
4159 rsolbd = f_one / solbnd(nb)
4168 do ni = nv1(nb), nv2(nb)
4169 sp = sqrt( (f_one - rhdpssa0_grt(ni,nh,nc)) &
4170 & /(f_one-rhdpssa0_grt(ni,nh,nc)*rhdpasy0_grt(ni,nh,nc)))
4171 reft = (f_one - sp) / (f_one + sp)
4172 sumreft = sumreft + reft*solwaer(nb,ni)
4174 sumk = sumk + rhdpext0_grt(ni,nh,nc)*solwaer(nb,ni)
4175 sums = sums + rhdpsca0_grt(ni,nh,nc)*solwaer(nb,ni)
4176 sumok = sumok + rhdpssa0_grt(ni,nh,nc)*solwaer(nb,ni) &
4177 & * rhdpext0_grt(ni,nh,nc)
4178 sumokg = sumokg + rhdpssa0_grt(ni,nh,nc)*solwaer(nb,ni)&
4179 & * rhdpext0_grt(ni,nh,nc)*rhdpasy0_grt(ni,nh,nc)
4182 refb = sumreft * rsolbd
4184 extrhd_grt(nh,nc,nb) = sumk * rsolbd
4185 if (nb==nv_aod)
then
4186 extrhd_grt_550(nh,nc,1) = rhdpext0_grt(i550,nh,nc)
4188 scarhd_grt(nh,nc,nb) = sums * rsolbd
4189 asyrhd_grt(nh,nc,nb) = sumokg / (sumok + 1.0e-10)
4190 ssarhd_grt(nh,nc,nb) = 4.0*refb &
4191 & /((f_one+refb)**2 - asyrhd_grt(nh,nc,nb)*(f_one-refb)**2)
4207 rirbd = f_one / eirbnd_du(nb)
4215 do ni = nr1_du(nb), nr2_du(nb)
4216 sp = sqrt( (f_one - rhidssa0_grt(ni,nc)) &
4217 & / (f_one - rhidssa0_grt(ni,nc)*rhidasy0_grt(ni,nc)) )
4218 reft = (f_one - sp) / (f_one + sp)
4219 sumreft = sumreft + reft*eirwaer_du(nb,ni)
4221 sumk = sumk + rhidext0_grt(ni,nc)*eirwaer_du(nb,ni)
4222 sums = sums + rhidsca0_grt(ni,nc)*eirwaer_du(nb,ni)
4223 sumok = sumok + rhidssa0_grt(ni,nc)*eirwaer_du(nb,ni) &
4224 & * rhidext0_grt(ni,nc)
4225 sumokg = sumokg + rhidssa0_grt(ni,nc)*eirwaer_du(nb,ni) &
4226 & * rhidext0_grt(ni,nc)*rhidasy0_grt(ni,nc)
4229 refb = sumreft * rirbd
4231 extrhi_grt(nc,ib) = sumk * rirbd
4232 scarhi_grt(nc,ib) = sums * rirbd
4233 asyrhi_grt(nc,ib) = sumokg / (sumok + 1.0e-10)
4234 ssarhi_grt(nc,ib) = 4.0*refb &
4235 & / ( (f_one+refb)**2 - asyrhi_grt(nc,ib)*(f_one-refb)**2 )
4239 rirbd = f_one / eirbnd(nb)
4248 do ni = nr1(nb), nr2(nb)
4249 sp = sqrt( (f_one - rhdpssa0_grt(ni,nh,nc)) &
4250 & /(f_one-rhdpssa0_grt(ni,nh,nc)*rhdpasy0_grt(ni,nh,nc)))
4251 reft = (f_one - sp) / (f_one + sp)
4252 sumreft = sumreft + reft*eirwaer(nb,ni)
4254 sumk = sumk + rhdpext0_grt(ni,nh,nc)*eirwaer(nb,ni)
4255 sums = sums + rhdpsca0_grt(ni,nh,nc)*eirwaer(nb,ni)
4256 sumok = sumok + rhdpssa0_grt(ni,nh,nc)*eirwaer(nb,ni) &
4257 & * rhdpext0_grt(ni,nh,nc)
4258 sumokg = sumokg+ rhdpssa0_grt(ni,nh,nc)*eirwaer(nb,ni) &
4259 & * rhdpext0_grt(ni,nh,nc)*rhdpasy0_grt(ni,nh,nc)
4262 refb = sumreft * rirbd
4264 extrhd_grt(nh,nc,ib) = sumk * rirbd
4265 scarhd_grt(nh,nc,ib) = sums * rirbd
4266 asyrhd_grt(nh,nc,ib) = sumokg / (sumok + 1.0e-10)
4267 ssarhd_grt(nh,nc,ib) = 4.0*refb &
4268 & /((f_one+refb)**2 - asyrhd_grt(nh,nc,ib)*(f_one-refb)**2)
4276 end subroutine optavg_gocart
4311 subroutine aer_property_gocart &
4315 & ( prsi,prsl,prslk,tvly,rhlay,dz,hz,tracer,aerfld, &
4316 & alon,alat,slmsk, laersw,laerlw,con_rd, &
4319 & aerosw,aerolw,aerodp,ext550,errflg,errmsg &
4372 integer,
intent(in) :: IMAX, NLAY, NLP1
4373 logical,
intent(in) :: laersw, laerlw
4374 real (kind=kind_phys),
intent(in) :: con_rd
4375 real (kind=kind_phys),
dimension(:,:),
intent(in) :: prsi, prsl, &
4376 & prslk, tvly, rhlay, dz, hz
4377 real (kind=kind_phys),
dimension(:),
intent(in) :: alon, alat, &
4379 real (kind=kind_phys),
dimension(:,:,:),
intent(in):: tracer
4380 real (kind=kind_phys),
dimension(:,:,:),
intent(in):: aerfld
4383 real (kind=kind_phys),
dimension(:,:,:,:),
intent(out) :: &
4385 real (kind=kind_phys),
dimension(:,:) ,
intent(out) :: aerodp
4386 real (kind=kind_phys),
dimension(:,:) ,
intent(out) :: ext550
4387 integer,
intent(out) :: errflg
4388 character(len=*),
intent(out) :: errmsg
4391 real (kind=kind_phys),
dimension(nlay,nswlwbd):: tauae,ssaae,asyae
4392 real (kind=kind_phys),
dimension(nlay,1):: tauae_550
4393 real (kind=kind_phys),
dimension(nlay,nspc) :: spcodp
4395 real (kind=kind_phys),
dimension(nlay,kcm) :: aerms
4396 real (kind=kind_phys),
dimension(nlay) :: dz1, rh1
4397 real (kind=kind_phys) :: plv, tv, rho
4398 integer :: i, m, m1, k
4408 lab_do_imaxg :
do i = 1, imax
4415 tauae_550(k,1) = f_zero
4431 spcodp(k,m) = f_zero
4437 dz1(k) = 1000.*dz(i,k)
4438 plv = 100.*prsl(i,k)
4440 rho = plv / ( con_rd * tv)
4443 aerms(k,m) = aerfld(i,k,m)*rho
4462 aerosw(i,k,m,1) = tauae(k,m)
4463 aerosw(i,k,m,2) = ssaae(k,m)
4464 aerosw(i,k,m,3) = asyae(k,m)
4470 aerodp(i,1) = aerodp(i,1) + tauae_550(k,1)
4471 ext550(i,k) = tauae_550(k,1)
4473 aerodp(i,m+1) = aerodp(i,m+1)+spcodp(k,m)
4481 if ( nlwbnd == 1 )
then
4485 aerolw(i,k,m,1) = tauae(k,m1)
4486 aerolw(i,k,m,2) = ssaae(k,m1)
4487 aerolw(i,k,m,3) = asyae(k,m1)
4494 aerolw(i,k,m,1) = tauae(k,m1)
4495 aerolw(i,k,m,2) = ssaae(k,m1)
4496 aerolw(i,k,m,3) = asyae(k,m1)
4541 real (kind=kind_phys) :: drh0, drh1, rdrh
4542 real (kind=kind_phys) :: cm, ext01, ext01_550, sca01,asy01,ssa01
4543 real (kind=kind_phys) :: ext1, ext1_550, asy1, ssa1,sca1,tau_550
4544 real (kind=kind_phys) :: sum_tau,sum_asy,sum_ssa,tau,asy,ssa
4545 real (kind=kind_phys) :: sum_tau_550
4546 integer :: ih1, ih2, nbin, ib, ntrc, ktrc
4550 do while ( rh1(k) > rhlev_grt(ih2) )
4552 if ( ih2 > krhlev )
exit
4554 ih1 = max( 1, ih2-1 )
4555 ih2 = min( krhlev, ih2 )
4557 drh0 = rhlev_grt(ih2) - rhlev_grt(ih1)
4558 drh1 = rh1(k) - rhlev_grt(ih1)
4559 if ( ih1 == ih2 )
then
4569 if (ib == nv_aod )
then
4570 sum_tau_550 = f_zero
4584 cm = max(aerms(k,m),0.0) * dz1(k)
4585 ext1 = ext1 + cm*extrhi_grt(m,ib)
4586 if (ib == nv_aod)
then
4587 ext1_550 = ext1_550 + cm*extrhi_grt_550(m,1)
4589 sca1 = sca1 + cm*scarhi_grt(m,ib)
4590 ssa1 = ssa1 + cm*extrhi_grt(m,ib) * ssarhi_grt(m,ib)
4591 asy1 = asy1 + cm*scarhi_grt(m,ib) * asyrhi_grt(m,ib)
4594 if (ext1 > f_zero) ssa=min(f_one, ssa1/ext1)
4595 if (sca1 > f_zero) asy=min(f_one, asy1/sca1)
4598 if ( ib==nv_aod )
then
4600 spcodp(k,1) = tau_550
4601 sum_tau_550 = sum_tau_550 + tau_550
4604 sum_tau = sum_tau + tau
4605 sum_ssa = sum_ssa + tau * ssa
4606 sum_asy = sum_asy + tau * ssa * asy
4611 if ( ib==nv_aod )
then
4617 ktrc = trc_to_aod(ntrc)
4618 do nbin = 1, num_radius(ntrc)
4619 m1 = radius_lower(ntrc) + nbin - 1
4620 m = m1 - num_radius(1)
4621 cm = max(aerms(k,m1),0.0) * dz1(k)
4622 ext01 = extrhd_grt(ih1,m,ib) + &
4623 & rdrh * (extrhd_grt(ih2,m,ib)-extrhd_grt(ih1,m,ib))
4624 if ( ib==nv_aod )
then
4625 ext01_550 = extrhd_grt_550(ih1,m,1) + &
4626 & rdrh * (extrhd_grt_550(ih2,m,1)-extrhd_grt_550(ih1,m,1))
4628 sca01 = scarhd_grt(ih1,m,ib) + &
4629 & rdrh * (scarhd_grt(ih2,m,ib)-scarhd_grt(ih1,m,ib))
4630 ssa01 = ssarhd_grt(ih1,m,ib) + &
4631 & rdrh * (ssarhd_grt(ih2,m,ib)-ssarhd_grt(ih1,m,ib))
4632 asy01 = asyrhd_grt(ih1,m,ib) + &
4633 & rdrh * (asyrhd_grt(ih2,m,ib)-asyrhd_grt(ih1,m,ib))
4634 ext1 = ext1 + cm*ext01
4635 if ( ib==nv_aod )
then
4636 ext1_550 = ext1_550 + cm*ext01_550
4638 sca1 = sca1 + cm*sca01
4639 ssa1 = ssa1 + cm*ext01 * ssa01
4640 asy1 = asy1 + cm*sca01 * asy01
4643 if (ext1 > f_zero) ssa=min(f_one, ssa1/ext1)
4644 if (sca1 > f_zero) asy=min(f_one, asy1/sca1)
4646 if ( ib==nv_aod )
then
4648 spcodp(k,ktrc) = tau_550
4649 sum_tau_550 = sum_tau_550 + tau_550
4652 sum_tau = sum_tau + tau
4653 sum_ssa = sum_ssa + tau * ssa
4654 sum_asy = sum_asy + tau * ssa * asy
4658 tauae(k,ib) = sum_tau
4659 if ( ib==nv_aod )
then
4660 tauae_550(k,1) = sum_tau_550
4662 if (sum_tau > f_zero) ssaae(k,ib) = sum_ssa / sum_tau
4663 if (sum_ssa > f_zero) asyae(k,ib) = sum_asy / sum_ssa
4668 end subroutine aeropt