494 & ( plyr,plvl,tlyr,tlvl,qlyr,olyr, &
495 & gasvmr_co2,gasvmr_n2o,gasvmr_ch4,gasvmr_o2,gasvmr_co, &
496 & gasvmr_cfc11,gasvmr_cfc12,gasvmr_cfc22,gasvmr_ccl4, &
497 & icseed, aeraod, aerssa, aerasy, &
498 & sfcalb_nir_dir, sfcalb_nir_dif, &
499 & sfcalb_uvis_dir, sfcalb_uvis_dif, &
500 & dzlyr,delpin,de_lgth,alpha, &
501 & cosz,solcon,nday,idxday, &
502 & npts, nlay, nlp1, lprnt, inc_minor_gas, iswcliq, iswcice, &
503 & isubcsw, iovr, top_at_1, iswmode, cld_cf, lsswr, iovr_rand,&
504 & iovr_maxrand, iovr_max, iovr_dcorr, iovr_exp, iovr_exprand,&
505 & hswc,topflx,sfcflx,cldtau, &
506 & hsw0,hswb,flxprf,fdncmp, &
507 & cld_lwp, cld_ref_liq, cld_iwp, cld_ref_ice, &
508 & cld_rwp,cld_ref_rain, cld_swp, cld_ref_snow, &
509 & cld_od, cld_ssa, cld_asy, errmsg, errflg &
688 integer,
intent(in) :: npts, nlay, nlp1, nday, iswcliq, iswcice, &
689 isubcsw, iovr, iswmode, iovr_dcorr, iovr_exp, iovr_exprand, &
690 iovr_rand, iovr_maxrand, iovr_max
692 integer,
dimension(:),
intent(in) :: idxday
693 integer,
dimension(:),
intent(in) :: icseed
695 logical,
intent(in) :: lprnt, lsswr, inc_minor_gas, top_at_1
697 real (kind=kind_phys),
dimension(:,:),
intent(in) :: &
699 real (kind=kind_phys),
dimension(:,:),
intent(in) :: &
700 & plyr, tlyr, qlyr, olyr, dzlyr, delpin
702 real (kind=kind_phys),
dimension(:),
intent(in):: sfcalb_nir_dir
703 real (kind=kind_phys),
dimension(:),
intent(in):: sfcalb_nir_dif
704 real (kind=kind_phys),
dimension(:),
intent(in):: sfcalb_uvis_dir
705 real (kind=kind_phys),
dimension(:),
intent(in):: sfcalb_uvis_dif
707 real(kind=kind_phys),
dimension(:,:),
intent(in)::gasvmr_co2
708 real(kind=kind_phys),
dimension(:,:),
intent(in)::gasvmr_n2o
709 real(kind=kind_phys),
dimension(:,:),
intent(in)::gasvmr_ch4
710 real(kind=kind_phys),
dimension(:,:),
intent(in)::gasvmr_o2
711 real(kind=kind_phys),
dimension(:,:),
intent(in)::gasvmr_co
712 real(kind=kind_phys),
dimension(:,:),
intent(in)::gasvmr_cfc11
713 real(kind=kind_phys),
dimension(:,:),
intent(in)::gasvmr_cfc12
714 real(kind=kind_phys),
dimension(:,:),
intent(in)::gasvmr_cfc22
715 real(kind=kind_phys),
dimension(:,:),
intent(in)::gasvmr_ccl4
717 real (kind=kind_phys),
dimension(:,:),
intent(in):: cld_cf
718 real (kind=kind_phys),
dimension(:,:),
intent(in),
optional:: &
719 & cld_lwp, cld_ref_liq, cld_iwp, cld_ref_ice, &
720 & cld_rwp, cld_ref_rain, cld_swp, cld_ref_snow, &
721 & cld_od, cld_ssa, cld_asy
723 real(kind=kind_phys),
dimension(:,:,:),
intent(in)::aeraod
724 real(kind=kind_phys),
dimension(:,:,:),
intent(in)::aerssa
725 real(kind=kind_phys),
dimension(:,:,:),
intent(in)::aerasy
727 real (kind=kind_phys),
intent(in) :: cosz(npts), solcon, &
729 real (kind=kind_phys),
dimension(npts,nlay),
intent(in) :: &
733 real (kind=kind_phys),
dimension(:,:),
intent(inout) :: hswc
734 real (kind=kind_phys),
dimension(:,:),
intent(inout) :: &
737 type (
topfsw_type),
dimension(:),
intent(inout) :: topflx
738 type (
sfcfsw_type),
dimension(:),
intent(inout) :: sfcflx
740 character(len=*),
intent(out) :: errmsg
741 integer,
intent(out) :: errflg
744 real (kind=kind_phys),
dimension(:,:,:),
optional, &
745 &
intent(inout) :: hswb
747 real (kind=kind_phys),
dimension(:,:),
optional, &
748 &
intent(inout) :: hsw0
750 & intent(inout) :: flxprf
752 & intent(inout) :: fdncmp
755 real (kind=kind_phys),
dimension(nlay,ngptsw) :: cldfmc, &
758 real (kind=kind_phys),
dimension(nlp1,nbdsw):: fxupc, fxdnc, &
761 real (kind=kind_phys),
dimension(nlay,nbdsw) :: &
762 & tauae, ssaae, asyae, taucw, ssacw, asycw
764 real (kind=kind_phys),
dimension(ngptsw) :: sfluxzen
766 real (kind=kind_phys),
dimension(nlay) :: cldfrc, delp, &
767 & pavel, tavel, coldry, colmol, h2ovmr, o3vmr, temcol, &
768 & cliqp, reliq, cicep, reice, cdat1, cdat2, cdat3, cdat4, &
769 & cfrac, fac00, fac01, fac10, fac11, forfac, forfrac, &
770 & selffac, selffrac, rfdelp, dz
772 real (kind=kind_phys),
dimension(nlp1) :: fnet, flxdc, flxuc, &
775 real (kind=kind_phys),
dimension(2) :: albbm, albdf, sfbmc, &
776 & sfbm0, sfdfc, sfdf0
778 real (kind=kind_phys) :: cosz1, sntz1, tem0, tem1, tem2, s0fac, &
779 & ssolar, zcf0, zcf1, ftoau0, ftoauc, ftoadc, &
780 & fsfcu0, fsfcuc, fsfcd0, fsfcdc, suvbfc, suvbf0, delgth
781 real (kind=kind_phys),
dimension(nlay) :: alph
785 real (kind=kind_phys) :: colamt(nlay,maxgas)
787 integer,
dimension(npts) :: ipseed
788 integer,
dimension(nlay) :: indfor, indself, jp, jt, jt1
790 integer :: i, ib, ipt, j1, k, kk, laytrop, mb, ig
791 integer :: inflgsw, iceflgsw, liqflgsw
792 integer :: irng, permuteseed
810 if (.not. lsswr)
return
811 if (nday <= 0)
return
813 lhswb =
present ( hswb )
814 lhsw0 =
present ( hsw0 )
815 lflxprf=
present ( flxprf )
816 lfdncmp=
present ( fdncmp )
829 sfcflx =
sfcfsw_type( f_zero, f_zero, f_zero, f_zero )
833 flxprf =
profsw_type( f_zero, f_zero, f_zero, f_zero )
837 fdncmp =
cmpfsw_type(f_zero,f_zero,f_zero,f_zero,f_zero,f_zero)
849 if (iswcliq > 0)
then
850 if ( .not.
present(cld_lwp) .or. .not.
present(cld_ref_liq) .or. &
851 & .not.
present(cld_iwp) .or. .not.
present(cld_ref_ice) .or. &
852 & .not.
present(cld_rwp) .or. .not.
present(cld_ref_rain) .or. &
853 & .not.
present(cld_swp) .or. .not.
present(cld_ref_snow) )
then
854 write(errmsg,
'(*(a))') &
855 &
'Logic error: iswcliq>0 requires the following', &
856 &
' optional arguments to be present:', &
857 &
' cld_lwp, cld_ref_liq, cld_iwp, cld_ref_ice,', &
858 &
' cld_rwp, cld_ref_rain, cld_swp, cld_ref_snow'
863 if ( .not.
present(cld_od) .or. .not.
present(cld_ssa) .or. &
864 & .not.
present(cld_asy))
then
865 write(errmsg,
'(*(a))') &
866 &
'Logic error: iswcliq<=0 requires the following', &
867 &
' optional arguments to be present:', &
868 &
' cld_od, cld_ssa, cld_asy'
877 if ( isubcsw == 1 )
then
879 ipseed(i) = ipsdsw0 + i
881 elseif ( isubcsw == 2 )
then
883 ipseed(i) = icseed(i)
888 write(0,*)
' In radsw, isubcsw, ipsdsw0,ipseed =', &
889 & isubcsw, ipsdsw0, ipseed
894 lab_do_ipt :
do ipt = 1, nday
899 sntz1 = f_one / cosz(j1)
900 ssolar = s0fac * cosz(j1)
901 if (iovr == iovr_dcorr) delgth = de_lgth(j1)
904 albbm(1) = sfcalb_nir_dir(j1)
905 albdf(1) = sfcalb_nir_dif(j1)
906 albbm(2) = sfcalb_uvis_dir(j1)
907 albdf(2) = sfcalb_uvis_dif(j1)
915 tem2 = 1.0e-20 * 1.0e3 * con_avgd
919 pavel(k) = plyr(j1,kk)
920 tavel(k) = tlyr(j1,kk)
921 delp(k) = delpin(j1,kk)
923 if (iovr == iovr_exp .or. iovr == iovr_exprand) alph(k) = alpha(j1,k)
936 h2ovmr(k)= max(f_zero,qlyr(j1,kk)*amdw/(f_one-qlyr(j1,kk)))
937 o3vmr(k)= max(f_zero,olyr(j1,kk)*amdo3)
939 tem0 = (f_one - h2ovmr(k))*con_amd + h2ovmr(k)*con_amw
940 coldry(k) = tem2 * delp(k) / (tem1*tem0*(f_one + h2ovmr(k)))
941 temcol(k) = 1.0e-12 * coldry(k)
943 colamt(k,1) = max(f_zero, coldry(k)*h2ovmr(k))
944 colamt(k,2) = max(temcol(k), coldry(k)*gasvmr_co2(j1,kk))
945 colamt(k,3) = max(f_zero, coldry(k)*o3vmr(k))
946 colmol(k) = coldry(k) + colamt(k,1)
952 if (inc_minor_gas)
then
955 colamt(k,4) = max(temcol(k), coldry(k)*gasvmr_n2o(j1,kk))
956 colamt(k,5) = max(temcol(k), coldry(k)*gasvmr_ch4(j1,kk))
957 colamt(k,6) = max(temcol(k), coldry(k)*gasvmr_o2(j1,kk))
962 colamt(k,4) = temcol(k)
963 colamt(k,5) = temcol(k)
964 colamt(k,6) = temcol(k)
974 tauae(k,ib) = aeraod(j1,kk,ib)
975 ssaae(k,ib) = aerssa(j1,kk,ib)
976 asyae(k,ib) = aerasy(j1,kk,ib)
981 if (iswcliq > 0)
then
984 cfrac(k) = cld_cf(j1,kk)
985 cliqp(k) = cld_lwp(j1,kk)
986 reliq(k) = cld_ref_liq(j1,kk)
987 cicep(k) = cld_iwp(j1,kk)
988 reice(k) = cld_ref_ice(j1,kk)
989 cdat1(k) = cld_rwp(j1,kk)
990 cdat2(k) = cld_ref_rain(j1,kk)
991 cdat3(k) = cld_swp(j1,kk)
992 cdat4(k) = cld_ref_snow(j1,kk)
997 cfrac(k) = cld_cf(j1,kk)
998 cdat1(k) = cld_od(j1,kk)
999 cdat2(k) = cld_ssa(j1,kk)
1000 cdat3(k) = cld_asy(j1,kk)
1006 tem1 = 100.0 * con_g
1007 tem2 = 1.0e-20 * 1.0e3 * con_avgd
1010 pavel(k) = plyr(j1,k)
1011 tavel(k) = tlyr(j1,k)
1012 delp(k) = delpin(j1,k)
1014 if (iovr == iovr_exp .or. iovr == iovr_exprand) alph(k) = alpha(j1,k)
1022 h2ovmr(k)= max(f_zero,qlyr(j1,k)*amdw/(f_one-qlyr(j1,k)))
1023 o3vmr(k)= max(f_zero,olyr(j1,k)*amdo3)
1025 tem0 = (f_one - h2ovmr(k))*con_amd + h2ovmr(k)*con_amw
1026 coldry(k) = tem2 * delp(k) / (tem1*tem0*(f_one + h2ovmr(k)))
1027 temcol(k) = 1.0e-12 * coldry(k)
1029 colamt(k,1) = max(f_zero, coldry(k)*h2ovmr(k))
1030 colamt(k,2) = max(temcol(k), coldry(k)*gasvmr_co2(j1,k))
1031 colamt(k,3) = max(f_zero, coldry(k)*o3vmr(k))
1032 colmol(k) = coldry(k) + colamt(k,1)
1038 write(0,*)
' pavel=',pavel
1039 write(0,*)
' tavel=',tavel
1040 write(0,*)
' delp=',delp
1041 write(0,*)
' h2ovmr=',h2ovmr*1000
1042 write(0,*)
' o3vmr=',o3vmr*1000000
1049 if (inc_minor_gas)
then
1051 colamt(k,4) = max(temcol(k), coldry(k)*gasvmr_n2o(j1,k))
1052 colamt(k,5) = max(temcol(k), coldry(k)*gasvmr_ch4(j1,k))
1053 colamt(k,6) = max(temcol(k), coldry(k)*gasvmr_o2(j1,k))
1058 colamt(k,4) = temcol(k)
1059 colamt(k,5) = temcol(k)
1060 colamt(k,6) = temcol(k)
1069 tauae(k,ib) = aeraod(j1,k,ib)
1070 ssaae(k,ib) = aerssa(j1,k,ib)
1071 asyae(k,ib) = aerasy(j1,k,ib)
1075 if (iswcliq > 0)
then
1077 cfrac(k) = cld_cf(j1,k)
1078 cliqp(k) = cld_lwp(j1,k)
1079 reliq(k) = cld_ref_liq(j1,k)
1080 cicep(k) = cld_iwp(j1,k)
1081 reice(k) = cld_ref_ice(j1,k)
1082 cdat1(k) = cld_rwp(j1,k)
1083 cdat2(k) = cld_ref_rain(j1,k)
1084 cdat3(k) = cld_swp(j1,k)
1085 cdat4(k) = cld_ref_snow(j1,k)
1089 cfrac(k) = cld_cf(j1,k)
1090 cdat1(k) = cld_od(j1,k)
1091 cdat2(k) = cld_ssa(j1,k)
1092 cdat3(k) = cld_asy(j1,k)
1105 if (iovr == iovr_rand)
then
1107 zcf0 = zcf0 * (f_one - cfrac(k))
1109 else if (iovr == iovr_maxrand)
then
1111 if (cfrac(k) > ftiny)
then
1112 zcf1 = min( zcf1, f_one-cfrac(k) )
1113 elseif (zcf1 < f_one)
then
1119 else if (iovr >= 2)
then
1121 zcf0 = min( zcf0, f_one-cfrac(k) )
1125 if (zcf0 <= ftiny) zcf0 = f_zero
1126 if (zcf0 > oneminus) zcf0 = f_one
1132 if (zcf1 > f_zero)
then
1136 & ( cfrac,cliqp,reliq,cicep,reice,cdat1,cdat2,cdat3,cdat4, &
1137 & zcf1, nlay, ipseed(j1), dz, delgth, alph, iswcliq, iswcice,&
1140 & taucw, ssacw, asycw, cldfrc, cldfmc &
1149 cldtau(j1,kk) = taucw(k,10)
1153 cldtau(j1,k) = taucw(k,10)
1173 & ( pavel,tavel,h2ovmr, nlay,nlp1, &
1175 & laytrop,jp,jt,jt1,fac00,fac01,fac10,fac11, &
1176 & selffac,selffrac,indself,forfac,forfrac,indfor &
1183 & ( colamt,colmol,fac00,fac01,fac10,fac11,jp,jt,jt1,laytrop, &
1184 & forfac,forfrac,indfor,selffac,selffrac,indself, nlay, &
1186 & sfluxzen, taug, taur &
1195 if ( isubcsw <= 0 )
then
1199 & ( ssolar,cosz1,sntz1,albbm,albdf,sfluxzen,cldfrc, &
1200 & zcf1,zcf0,taug,taur,tauae,ssaae,asyae,taucw,ssacw,asycw, &
1201 & nlay, nlp1, iswmode, &
1203 & fxupc,fxdnc,fxup0,fxdn0, &
1204 & ftoauc,ftoau0,ftoadc,fsfcuc,fsfcu0,fsfcdc,fsfcd0, &
1205 & sfbmc,sfdfc,sfbm0,sfdf0,suvbfc,suvbf0 &
1212 & ( ssolar,cosz1,sntz1,albbm,albdf,sfluxzen,cldfmc, &
1213 & zcf1,zcf0,taug,taur,tauae,ssaae,asyae,taucw,ssacw,asycw, &
1214 & nlay, nlp1, iswmode, &
1216 & fxupc,fxdnc,fxup0,fxdn0, &
1217 & ftoauc,ftoau0,ftoadc,fsfcuc,fsfcu0,fsfcdc,fsfcd0, &
1218 & sfbmc,sfdfc,sfbm0,sfdf0,suvbfc,suvbf0 &
1231 flxuc(k) = flxuc(k) + fxupc(k,ib)
1232 flxdc(k) = flxdc(k) + fxdnc(k,ib)
1238 if ( lhsw0 .or. lflxprf )
then
1244 flxu0(k) = flxu0(k) + fxup0(k,ib)
1245 flxd0(k) = flxd0(k) + fxdn0(k,ib)
1253 rfdelp(k) = heatfac / delp(k)
1258 fdncmp(j1)%uvbf0 = suvbf0
1259 fdncmp(j1)%uvbfc = suvbfc
1262 fdncmp(j1)%nirbm = sfbmc(1)
1263 fdncmp(j1)%nirdf = sfdfc(1)
1264 fdncmp(j1)%visbm = sfbmc(2)
1265 fdncmp(j1)%visdf = sfdfc(2)
1270 topflx(j1)%upfxc = ftoauc
1271 topflx(j1)%dnfxc = ftoadc
1272 topflx(j1)%upfx0 = ftoau0
1274 sfcflx(j1)%upfxc = fsfcuc
1275 sfcflx(j1)%dnfxc = fsfcdc
1276 sfcflx(j1)%upfx0 = fsfcu0
1277 sfcflx(j1)%dnfx0 = fsfcd0
1283 fnet(1) = flxdc(1) - flxuc(1)
1287 fnet(k) = flxdc(k) - flxuc(k)
1288 hswc(j1,kk) = (fnet(k)-fnet(k-1)) * rfdelp(k-1)
1296 flxprf(j1,kk)%upfxc = flxuc(k)
1297 flxprf(j1,kk)%dnfxc = flxdc(k)
1298 flxprf(j1,kk)%upfx0 = flxu0(k)
1299 flxprf(j1,kk)%dnfx0 = flxd0(k)
1306 fnet(1) = flxd0(1) - flxu0(1)
1310 fnet(k) = flxd0(k) - flxu0(k)
1311 hsw0(j1,kk) = (fnet(k)-fnet(k-1)) * rfdelp(k-1)
1319 fnet(1) = fxdnc(1,mb) - fxupc(1,mb)
1323 fnet(k) = fxdnc(k,mb) - fxupc(k,mb)
1324 hswb(j1,kk,mb) = (fnet(k) - fnet(k-1)) * rfdelp(k-1)
1333 fnet(1) = flxdc(1) - flxuc(1)
1336 fnet(k) = flxdc(k) - flxuc(k)
1337 hswc(j1,k-1) = (fnet(k)-fnet(k-1)) * rfdelp(k-1)
1344 flxprf(j1,k)%upfxc = flxuc(k)
1345 flxprf(j1,k)%dnfxc = flxdc(k)
1346 flxprf(j1,k)%upfx0 = flxu0(k)
1347 flxprf(j1,k)%dnfx0 = flxd0(k)
1354 fnet(1) = flxd0(1) - flxu0(1)
1357 fnet(k) = flxd0(k) - flxu0(k)
1358 hsw0(j1,k-1) = (fnet(k)-fnet(k-1)) * rfdelp(k-1)
1366 fnet(1) = fxdnc(1,mb) - fxupc(1,mb)
1369 fnet(k+1) = fxdnc(k+1,mb) - fxupc(k+1,mb)
1370 hswb(j1,k,mb) = (fnet(k+1) - fnet(k)) * rfdelp(k)
1569 & ( cfrac,cliqp,reliq,cicep,reice,cdat1,cdat2,cdat3,cdat4, &
1570 & cf1, nlay, ipseed, dz, delgth, alpha, iswcliq, iswcice, &
1571 & isubcsw, iovr, taucw, ssacw, asycw, cldfrc, cldfmc &
1657 integer,
intent(in) :: nlay, ipseed, iswcliq, iswcice, isubcsw, &
1659 real (kind=kind_phys),
intent(in) :: cf1, delgth
1661 real (kind=kind_phys),
dimension(nlay),
intent(in) :: cliqp, &
1662 & reliq, cicep, reice, cdat1, cdat2, cdat3, cdat4, cfrac, dz
1663 real (kind=kind_phys),
dimension(nlay),
intent(in) :: alpha
1666 real (kind=kind_phys),
dimension(nlay,ngptsw),
intent(out) :: &
1668 real (kind=kind_phys),
dimension(nlay,nbdsw),
intent(out) :: &
1669 & taucw, ssacw, asycw
1670 real (kind=kind_phys),
dimension(nlay),
intent(out) :: cldfrc
1673 real (kind=kind_phys),
dimension(nblow:nbhgh) :: tauliq, tauice, &
1674 & ssaliq, ssaice, ssaran, ssasnw, asyliq, asyice, &
1676 real (kind=kind_phys),
dimension(nlay) :: cldf
1678 real (kind=kind_phys) :: dgeice, factor, fint, tauran, tausnw, &
1679 & cldliq, refliq, cldice, refice, cldran, cldsnw, refsnw, &
1680 & extcoliq, ssacoliq, asycoliq, extcoice, ssacoice, asycoice,&
1683 logical :: lcloudy(nlay,ngptsw)
1684 integer :: ia, ib, ig, jb, k, index
1691 taucw(k,ib) = f_zero
1693 asycw(k,ib) = f_zero
1699 lab_if_iswcliq :
if (iswcliq > 0)
then
1701 lab_do_k :
do k = 1, nlay
1702 lab_if_cld :
if (cfrac(k) > ftiny)
then
1720 dgesnw = 1.0315 * refsnw
1722 tauran = cldran * a0r
1730 if (cldsnw>f_zero .and. refsnw>10.0_kind_phys)
then
1732 tausnw = cldsnw*1.09087*(a0s + a1s/dgesnw)
1737 do ib = nblow, nbhgh
1738 ssaran(ib) = tauran * (f_one - b0r(ib))
1739 ssasnw(ib) = tausnw * (f_one - (b0s(ib)+b1s(ib)*dgesnw))
1740 asyran(ib) = ssaran(ib) * c0r(ib)
1741 asysnw(ib) = ssasnw(ib) * c0s(ib)
1751 if ( cldliq <= f_zero )
then
1752 do ib = nblow, nbhgh
1758 factor = refliq - 1.5
1759 index = max( 1, min( 57, int( factor ) ))
1760 fint = factor - float(index)
1762 if ( iswcliq == 1 )
then
1763 do ib = nblow, nbhgh
1764 extcoliq = max(f_zero, extliq1(index,ib) &
1765 & + fint*(extliq1(index+1,ib)-extliq1(index,ib)) )
1766 ssacoliq = max(f_zero, min(f_one, ssaliq1(index,ib) &
1767 & + fint*(ssaliq1(index+1,ib)-ssaliq1(index,ib)) ))
1769 asycoliq = max(f_zero, min(f_one, asyliq1(index,ib) &
1770 & + fint*(asyliq1(index+1,ib)-asyliq1(index,ib)) ))
1773 tauliq(ib) = cldliq * extcoliq
1774 ssaliq(ib) = tauliq(ib) * ssacoliq
1775 asyliq(ib) = ssaliq(ib) * asycoliq
1777 elseif ( iswcliq == 2 )
then
1778 do ib = nblow, nbhgh
1779 extcoliq = max(f_zero, extliq2(index,ib) &
1780 & + fint*(extliq2(index+1,ib)-extliq2(index,ib)) )
1781 ssacoliq = max(f_zero, min(f_one, ssaliq2(index,ib) &
1782 & + fint*(ssaliq2(index+1,ib)-ssaliq2(index,ib)) ))
1784 asycoliq = max(f_zero, min(f_one, asyliq2(index,ib) &
1785 & + fint*(asyliq2(index+1,ib)-asyliq2(index,ib)) ))
1788 tauliq(ib) = cldliq * extcoliq
1789 ssaliq(ib) = tauliq(ib) * ssacoliq
1790 asyliq(ib) = ssaliq(ib) * asycoliq
1797 if ( cldice <= f_zero )
then
1798 do ib = nblow, nbhgh
1808 if ( iswcice == 1 )
then
1809 refice = min(130.0_kind_phys,max(13.0_kind_phys,refice))
1811 do ib = nblow, nbhgh
1814 extcoice = max(f_zero, abari(ia)+bbari(ia)/refice )
1815 ssacoice = max(f_zero, min(f_one, &
1816 & f_one-cbari(ia)-dbari(ia)*refice ))
1817 asycoice = max(f_zero, min(f_one, &
1818 & ebari(ia)+fbari(ia)*refice ))
1821 tauice(ib) = cldice * extcoice
1822 ssaice(ib) = tauice(ib) * ssacoice
1823 asyice(ib) = ssaice(ib) * asycoice
1828 elseif ( iswcice == 2 )
then
1829 refice = min(131.0_kind_phys,max(5.0_kind_phys,refice))
1831 factor = (refice - 2.0) / 3.0
1832 index = max( 1, min( 42, int( factor ) ))
1833 fint = factor - float(index)
1835 do ib = nblow, nbhgh
1836 extcoice = max(f_zero, extice2(index,ib) &
1837 & + fint*(extice2(index+1,ib)-extice2(index,ib)) )
1838 ssacoice = max(f_zero, min(f_one, ssaice2(index,ib) &
1839 & + fint*(ssaice2(index+1,ib)-ssaice2(index,ib)) ))
1840 asycoice = max(f_zero, min(f_one, asyice2(index,ib) &
1841 & + fint*(asyice2(index+1,ib)-asyice2(index,ib)) ))
1844 tauice(ib) = cldice * extcoice
1845 ssaice(ib) = tauice(ib) * ssacoice
1846 asyice(ib) = ssaice(ib) * asycoice
1852 elseif ( iswcice == 3 )
then
1853 dgeice = max( 5.0, min( 140.0, 1.0315*refice ))
1855 factor = (dgeice - 2.0) / 3.0
1856 index = max( 1, min( 45, int( factor ) ))
1857 fint = factor - float(index)
1859 do ib = nblow, nbhgh
1860 extcoice = max(f_zero, extice3(index,ib) &
1861 & + fint*(extice3(index+1,ib)-extice3(index,ib)) )
1862 ssacoice = max(f_zero, min(f_one, ssaice3(index,ib) &
1863 & + fint*(ssaice3(index+1,ib)-ssaice3(index,ib)) ))
1864 asycoice = max(f_zero, min(f_one, asyice3(index,ib) &
1865 & + fint*(asyice3(index+1,ib)-asyice3(index,ib)) ))
1870 tauice(ib) = cldice * extcoice
1871 ssaice(ib) = tauice(ib) * ssacoice
1872 asyice(ib) = ssaice(ib) * asycoice
1880 taucw(k,ib) = tauliq(jb)+tauice(jb)+tauran+tausnw
1881 ssacw(k,ib) = ssaliq(jb)+ssaice(jb)+ssaran(jb)+ssasnw(jb)
1882 asycw(k,ib) = asyliq(jb)+asyice(jb)+asyran(jb)+asysnw(jb)
1891 if (cfrac(k) > ftiny)
then
1893 taucw(k,ib) = cdat1(k)
1894 ssacw(k,ib) = cdat1(k) * cdat2(k)
1895 asycw(k,ib) = ssacw(k,ib) * cdat3(k)
1900 endif lab_if_iswcliq
1905 if ( isubcsw > 0 )
then
1908 where (cldf(:) < ftiny)
1916 & ( cldf, nlay, ipseed, dz, delgth, alpha, iovr, &
1923 if ( lcloudy(k,ig) )
then
1924 cldfmc(k,ig) = f_one
1926 cldfmc(k,ig) = f_zero
1934 cldfrc(k) = cfrac(k) / cf1
2435 & ( ssolar,cosz,sntz,albbm,albdf,sfluxzen,cldfrc, &
2436 & cf1,cf0,taug,taur,tauae,ssaae,asyae,taucw,ssacw,asycw, &
2437 & nlay, nlp1, iswmode, &
2438 & fxupc,fxdnc,fxup0,fxdn0, &
2439 & ftoauc,ftoau0,ftoadc,fsfcuc,fsfcu0,fsfcdc,fsfcd0, &
2440 & sfbmc,sfdfc,sfbm0,sfdf0,suvbfc,suvbf0 &
2534 real (kind=kind_phys),
parameter :: zcrit = 0.9999995
2535 real (kind=kind_phys),
parameter :: zsr3 = sqrt(3.0)
2536 real (kind=kind_phys),
parameter :: od_lo = 0.06
2537 real (kind=kind_phys),
parameter :: eps1 = 1.0e-8
2540 integer,
intent(in) :: nlay, nlp1, iswmode
2542 real (kind=kind_phys),
dimension(nlay,ngptsw),
intent(in) :: &
2544 real (kind=kind_phys),
dimension(nlay,nbdsw),
intent(in) :: &
2545 & taucw, ssacw, asycw, tauae, ssaae, asyae
2547 real (kind=kind_phys),
dimension(ngptsw),
intent(in) :: sfluxzen
2548 real (kind=kind_phys),
dimension(nlay),
intent(in) :: cldfrc
2550 real (kind=kind_phys),
dimension(2),
intent(in) :: albbm, albdf
2552 real (kind=kind_phys),
intent(in) :: cosz, sntz, cf1, cf0, ssolar
2555 real (kind=kind_phys),
dimension(nlp1,nbdsw),
intent(out) :: &
2556 & fxupc, fxdnc, fxup0, fxdn0
2558 real (kind=kind_phys),
dimension(2),
intent(out) :: sfbmc, sfdfc, &
2561 real (kind=kind_phys),
intent(out) :: suvbfc, suvbf0, ftoadc, &
2562 & ftoauc, ftoau0, fsfcuc, fsfcu0, fsfcdc, fsfcd0
2565 real (kind=kind_phys),
dimension(nlay) :: ztaus, zssas, zasys, &
2568 real (kind=kind_phys),
dimension(nlp1) :: zrefb, zrefd, ztrab, &
2569 & ztrad, ztdbt, zldbt, zfu, zfd
2571 real (kind=kind_phys) :: ztau1, zssa1, zasy1, ztau0, zssa0, &
2572 & zasy0, zasy3, zssaw, zasyw, zgam1, zgam2, zgam3, zgam4, &
2573 & zc0, zc1, za1, za2, zb1, zb2, zrk, zrk2, zrp, zrp1, zrm1, &
2574 & zrpp, zrkg1, zrkg3, zrkg4, zexp1, zexm1, zexp2, zexm2, &
2575 & zexp3, zexp4, zden1, ze1r45, ftind, zsolar, zrefb1, &
2576 & zrefd1, ztrab1, ztrad1, ztdbt0, zr1, zr2, zr3, zr4, zr5, &
2577 & zt1, zt2, zt3, zf1, zf2, zrpp1
2579 integer :: ib, ibd, jb, jg, k, kp, itind
2586 fxdnc(k,ib) = f_zero
2587 fxupc(k,ib) = f_zero
2588 fxdn0(k,ib) = f_zero
2589 fxup0(k,ib) = f_zero
2617 lab_do_jg :
do jg = 1, ngptsw
2623 zsolar = ssolar * sfluxzen(jg)
2632 zrefb(1) = albbm(ibd)
2633 zrefd(1) = albdf(ibd)
2635 zrefb(1) = 0.5 * (albbm(1) + albbm(2))
2636 zrefd(1) = 0.5 * (albdf(1) + albdf(2))
2655 ztau0 = max( ftiny, taur(k,jg)+taug(k,jg)+tauae(k,ib) )
2656 zssa0 = taur(k,jg) + tauae(k,ib)*ssaae(k,ib)
2657 zasy0 = asyae(k,ib)*ssaae(k,ib)*tauae(k,ib)
2658 zssaw = min( oneminus, zssa0 / ztau0 )
2659 zasyw = zasy0 / max( ftiny, zssa0 )
2670 ztau1 = (f_one - za2) * ztau0
2671 zssa1 = (zssaw - za2) / (f_one - za2)
2673 zasy1 = zasyw / (f_one + zasyw)
2674 zasy3 = 0.75 * zasy1
2682 if ( iswmode == 1 )
then
2683 zgam1 = 1.75 - zssa1 * (f_one + zasy3)
2684 zgam2 =-0.25 + zssa1 * (f_one - zasy3)
2685 zgam3 = 0.5 - zasy3 * cosz
2686 elseif ( iswmode == 2 )
then
2687 zgam1 = 2.0 - zssa1 * (1.25 + zasy3)
2688 zgam2 = 0.75* zssa1 * (f_one- zasy1)
2689 zgam3 = 0.5 - zasy3 * cosz
2690 elseif ( iswmode == 3 )
then
2691 zgam1 = zsr3 * (2.0 - zssa1 * (1.0 + zasy1)) * 0.5
2692 zgam2 = zsr3 * zssa1 * (1.0 - zasy1) * 0.5
2693 zgam3 = (1.0 - zsr3 * zasy1 * cosz) * 0.5
2695 zgam4 = f_one - zgam3
2700 if ( zssaw >= zcrit )
then
2701 za1 = zgam1 * cosz - zgam3
2707 zb1 = min( ztau1*sntz , 500.0 )
2708 if ( zb1 <= od_lo )
then
2709 zb2 = f_one - zb1 + 0.5*zb1*zb1
2711 ftind = zb1 / (bpade + zb1)
2712 itind = ftind*ntbmx + 0.5
2713 zb2 = exp_tbl(itind)
2717 zrefb(kp) = max(f_zero, min(f_one, &
2718 & (za2 - za1*(f_one - zb2))/(f_one + za2) ))
2719 ztrab(kp) = max(f_zero, min(f_one, f_one-zrefb(kp) ))
2722 zrefd(kp) = max(f_zero, min(f_one, za2/(f_one + za2) ))
2723 ztrad(kp) = max(f_zero, min(f_one, f_one-zrefd(kp) ))
2726 za1 = zgam1*zgam4 + zgam2*zgam3
2727 za2 = zgam1*zgam3 + zgam2*zgam4
2728 zrk = (zgam1 - zgam2) * (zgam1 + zgam2)
2729 if (zrk > eps1)
then
2739 zrpp1= f_one - zrp*zrp
2740 zrpp = sign( max(flimit, abs(zrpp1)), zrpp1 )
2745 zr1 = zrm1 * (za2 + zrkg3)
2746 zr2 = zrp1 * (za2 - zrkg3)
2747 zr3 = zrk2 * (zgam3 - za2*cosz)
2749 zr5 = zrpp * (zrk - zgam1)
2751 zt1 = zrp1 * (za1 + zrkg4)
2752 zt2 = zrm1 * (za1 - zrkg4)
2753 zt3 = zrk2 * (zgam4 + za1*cosz)
2758 zb1 = min( zrk*ztau1, 500.0 )
2759 if ( zb1 <= od_lo )
then
2760 zexm1 = f_one - zb1 + 0.5*zb1*zb1
2762 ftind = zb1 / (bpade + zb1)
2763 itind = ftind*ntbmx + 0.5
2764 zexm1 = exp_tbl(itind)
2766 zexp1 = f_one / zexm1
2768 zb2 = min( sntz*ztau1, 500.0 )
2769 if ( zb2 <= od_lo )
then
2770 zexm2 = f_one - zb2 + 0.5*zb2*zb2
2772 ftind = zb2 / (bpade + zb2)
2773 itind = ftind*ntbmx + 0.5
2774 zexm2 = exp_tbl(itind)
2776 zexp2 = f_one / zexm2
2777 ze1r45 = zr4*zexp1 + zr5*zexm1
2781 if (abs(ze1r45) <= eps1)
then
2785 zden1 = zssa1 / ze1r45
2786 zrefb(kp) = max(f_zero, min(f_one, &
2787 & (zr1*zexp1 - zr2*zexm1 - zr3*zexm2)*zden1 ))
2788 ztrab(kp) = max(f_zero, min(f_one, zexm2*(f_one &
2789 & - (zt1*zexp1 - zt2*zexm1 - zt3*zexp2)*zden1) ))
2793 if (ze1r45 >= f_zero)
then
2794 zden1 = zr4 / max(eps1, ze1r45*zrkg1)
2796 zden1 = zr4 / min(-eps1, ze1r45*zrkg1)
2798 zrefd(kp) = max(f_zero, min(f_one, &
2799 & zgam2*(zexp1 - zexm1)*zden1 ))
2800 ztrad(kp) = max(f_zero, min(f_one, zrk2*zden1 ))
2807 if ( zr1 <= od_lo )
then
2808 zexp3 = f_one - zr1 + 0.5*zr1*zr1
2810 ftind = zr1 / (bpade + zr1)
2811 itind = max(0, min(ntbmx, int(0.5+ntbmx*ftind) ))
2812 zexp3 = exp_tbl(itind)
2815 ztdbt(k) = zexp3 * ztdbt(kp)
2822 if ( zr1 <= od_lo )
then
2823 zexp4 = f_one - zr1 + 0.5*zr1*zr1
2825 ftind = zr1 / (bpade + zr1)
2826 itind = max(0, min(ntbmx, int(0.5+ntbmx*ftind) ))
2827 zexp4 = exp_tbl(itind)
2831 ztdbt0 = zexp4 * ztdbt0
2837 & ( zrefb,zrefd,ztrab,ztrad,zldbt,ztdbt, &
2845 fxup0(k,ib) = fxup0(k,ib) + zsolar*zfu(k)
2846 fxdn0(k,ib) = fxdn0(k,ib) + zsolar*zfd(k)
2851 zb2 = zsolar*(zfd(1) - ztdbt0)
2854 sfbm0(ibd) = sfbm0(ibd) + zb1
2855 sfdf0(ibd) = sfdf0(ibd) + zb2
2859 sfbm0(1) = sfbm0(1) + zf1
2860 sfdf0(1) = sfdf0(1) + zf2
2861 sfbm0(2) = sfbm0(2) + zf1
2862 sfdf0(2) = sfdf0(2) + zf2
2877 if ( cf1 > eps )
then
2885 zc0 = f_one - cldfrc(k)
2887 if ( zc1 > ftiny )
then
2889 ztau0 = ztaus(k) + taucw(k,ib)
2890 zssa0 = zssas(k) + ssacw(k,ib)
2891 zasy0 = zasys(k) + asycw(k,ib)
2892 zssaw = min(oneminus, zssa0 / ztau0)
2893 zasyw = zasy0 / max(ftiny, zssa0)
2899 ztau1 = (f_one - za2) * ztau0
2900 zssa1 = (zssaw - za2) / (f_one - za2)
2902 zasy1 = zasyw / (f_one + zasyw)
2903 zasy3 = 0.75 * zasy1
2912 if ( iswmode == 1 )
then
2913 zgam1 = 1.75 - zssa1 * (f_one + zasy3)
2914 zgam2 =-0.25 + zssa1 * (f_one - zasy3)
2915 zgam3 = 0.5 - zasy3 * cosz
2916 elseif ( iswmode == 2 )
then
2917 zgam1 = 2.0 - zssa1 * (1.25 + zasy3)
2918 zgam2 = 0.75* zssa1 * (f_one- zasy1)
2919 zgam3 = 0.5 - zasy3 * cosz
2920 elseif ( iswmode == 3 )
then
2921 zgam1 = zsr3 * (2.0 - zssa1 * (1.0 + zasy1)) * 0.5
2922 zgam2 = zsr3 * zssa1 * (1.0 - zasy1) * 0.5
2923 zgam3 = (1.0 - zsr3 * zasy1 * cosz) * 0.5
2925 zgam4 = f_one - zgam3
2935 if ( zssaw >= zcrit )
then
2936 za1 = zgam1 * cosz - zgam3
2942 zb1 = min( ztau1*sntz , 500.0 )
2943 if ( zb1 <= od_lo )
then
2944 zb2 = f_one - zb1 + 0.5*zb1*zb1
2946 ftind = zb1 / (bpade + zb1)
2947 itind = ftind*ntbmx + 0.5
2948 zb2 = exp_tbl(itind)
2952 zrefb(kp) = max(f_zero, min(f_one, &
2953 & (za2 - za1*(f_one - zb2))/(f_one + za2) ))
2954 ztrab(kp) = max(f_zero, min(f_one, f_one-zrefb(kp)))
2957 zrefd(kp) = max(f_zero, min(f_one, za2 / (f_one+za2) ))
2958 ztrad(kp) = max(f_zero, min(f_one, f_one - zrefd(kp) ))
2961 za1 = zgam1*zgam4 + zgam2*zgam3
2962 za2 = zgam1*zgam3 + zgam2*zgam4
2963 zrk = (zgam1 - zgam2) * (zgam1 + zgam2)
2964 if (zrk > eps1)
then
2974 zrpp1= f_one - zrp*zrp
2975 zrpp = sign( max(flimit, abs(zrpp1)), zrpp1 )
2980 zr1 = zrm1 * (za2 + zrkg3)
2981 zr2 = zrp1 * (za2 - zrkg3)
2982 zr3 = zrk2 * (zgam3 - za2*cosz)
2984 zr5 = zrpp * (zrk - zgam1)
2986 zt1 = zrp1 * (za1 + zrkg4)
2987 zt2 = zrm1 * (za1 - zrkg4)
2988 zt3 = zrk2 * (zgam4 + za1*cosz)
2993 zb1 = min( zrk*ztau1, 500.0 )
2994 if ( zb1 <= od_lo )
then
2995 zexm1 = f_one - zb1 + 0.5*zb1*zb1
2997 ftind = zb1 / (bpade + zb1)
2998 itind = ftind*ntbmx + 0.5
2999 zexm1 = exp_tbl(itind)
3001 zexp1 = f_one / zexm1
3003 zb2 = min( ztau1*sntz, 500.0 )
3004 if ( zb2 <= od_lo )
then
3005 zexm2 = f_one - zb2 + 0.5*zb2*zb2
3007 ftind = zb2 / (bpade + zb2)
3008 itind = ftind*ntbmx + 0.5
3009 zexm2 = exp_tbl(itind)
3011 zexp2 = f_one / zexm2
3012 ze1r45 = zr4*zexp1 + zr5*zexm1
3016 if ( abs(ze1r45) <= eps1 )
then
3020 zden1 = zssa1 / ze1r45
3021 zrefb(kp) = max(f_zero, min(f_one, &
3022 & (zr1*zexp1-zr2*zexm1-zr3*zexm2)*zden1 ))
3023 ztrab(kp) = max(f_zero, min(f_one, zexm2*(f_one - &
3024 & (zt1*zexp1-zt2*zexm1-zt3*zexp2)*zden1) ))
3028 if (ze1r45 >= f_zero)
then
3029 zden1 = zr4 / max(eps1, ze1r45*zrkg1)
3031 zden1 = zr4 / min(-eps1, ze1r45*zrkg1)
3033 zrefd(kp) = max(f_zero, min(f_one, &
3034 & zgam2*(zexp1 - zexm1)*zden1 ))
3035 ztrad(kp) = max(f_zero, min(f_one, zrk2*zden1 ))
3041 zrefb(kp) = zc0*zrefb1 + zc1*zrefb(kp)
3042 zrefd(kp) = zc0*zrefd1 + zc1*zrefd(kp)
3043 ztrab(kp) = zc0*ztrab1 + zc1*ztrab(kp)
3044 ztrad(kp) = zc0*ztrad1 + zc1*ztrad(kp)
3051 if ( zr1 <= od_lo )
then
3052 zexp3 = f_one - zr1 + 0.5*zr1*zr1
3054 ftind = zr1 / (bpade + zr1)
3055 itind = max(0, min(ntbmx, int(0.5+ntbmx*ftind) ))
3056 zexp3 = exp_tbl(itind)
3059 zldbt(kp) = zc0*zldbt(kp) + zc1*zexp3
3060 ztdbt(k) = zldbt(kp) * ztdbt(kp)
3066 if ( zr1 <= od_lo )
then
3067 zexp4 = f_one - zr1 + 0.5*zr1*zr1
3069 ftind = zr1 / (bpade + zr1)
3070 itind = max(0, min(ntbmx, int(0.5+ntbmx*ftind) ))
3071 zexp4 = exp_tbl(itind)
3074 ztdbt0 = (zc0*zldbt0(k) + zc1*zexp4) * ztdbt0
3079 ztdbt(k) = zldbt(kp) * ztdbt(kp)
3082 ztdbt0 = zldbt0(k) * ztdbt0
3091 & ( zrefb,zrefd,ztrab,ztrad,zldbt,ztdbt, &
3099 fxupc(k,ib) = fxupc(k,ib) + zsolar*zfu(k)
3100 fxdnc(k,ib) = fxdnc(k,ib) + zsolar*zfd(k)
3106 zb2 = zsolar*(zfd(1) - ztdbt0)
3109 sfbmc(ibd) = sfbmc(ibd) + zb1
3110 sfdfc(ibd) = sfdfc(ibd) + zb2
3114 sfbmc(1) = sfbmc(1) + zf1
3115 sfdfc(1) = sfdfc(1) + zf2
3116 sfbmc(2) = sfbmc(2) + zf1
3117 sfdfc(2) = sfdfc(2) + zf2
3129 ftoadc = ftoadc + fxdn0(nlp1,ib)
3130 ftoau0 = ftoau0 + fxup0(nlp1,ib)
3131 fsfcu0 = fsfcu0 + fxup0(1,ib)
3132 fsfcd0 = fsfcd0 + fxdn0(1,ib)
3136 ibd = nuvb - nblow + 1
3137 suvbf0 = fxdn0(1,ibd)
3139 if ( cf1 <= eps )
then
3142 fxupc(k,ib) = fxup0(k,ib)
3143 fxdnc(k,ib) = fxdn0(k,ib)
3162 fxupc(k,ib) = cf1*fxupc(k,ib) + cf0*fxup0(k,ib)
3163 fxdnc(k,ib) = cf1*fxdnc(k,ib) + cf0*fxdn0(k,ib)
3168 ftoauc = ftoauc + fxupc(nlp1,ib)
3169 fsfcuc = fsfcuc + fxupc(1,ib)
3170 fsfcdc = fsfcdc + fxdnc(1,ib)
3174 suvbfc = fxdnc(1,ibd)
3177 sfbmc(1) = cf1*sfbmc(1) + cf0*sfbm0(1)
3178 sfbmc(2) = cf1*sfbmc(2) + cf0*sfbm0(2)
3179 sfdfc(1) = cf1*sfdfc(1) + cf0*sfdf0(1)
3180 sfdfc(2) = cf1*sfdfc(2) + cf0*sfdf0(2)
3231 & ( ssolar,cosz,sntz,albbm,albdf,sfluxzen,cldfmc, &
3232 & cf1,cf0,taug,taur,tauae,ssaae,asyae,taucw,ssacw,asycw, &
3233 & nlay, nlp1, iswmode, &
3234 & fxupc,fxdnc,fxup0,fxdn0, &
3235 & ftoauc,ftoau0,ftoadc,fsfcuc,fsfcu0,fsfcdc,fsfcd0, &
3236 & sfbmc,sfdfc,sfbm0,sfdf0,suvbfc,suvbf0 &
3330 real (kind=kind_phys),
parameter :: zcrit = 0.9999995
3331 real (kind=kind_phys),
parameter :: zsr3 = sqrt(3.0)
3332 real (kind=kind_phys),
parameter :: od_lo = 0.06
3333 real (kind=kind_phys),
parameter :: eps1 = 1.0e-8
3336 integer,
intent(in) :: nlay, nlp1, iswmode
3338 real (kind=kind_phys),
dimension(nlay,ngptsw),
intent(in) :: &
3339 & taug, taur, cldfmc
3340 real (kind=kind_phys),
dimension(nlay,nbdsw),
intent(in) :: &
3341 & taucw, ssacw, asycw, tauae, ssaae, asyae
3343 real (kind=kind_phys),
dimension(ngptsw),
intent(in) :: sfluxzen
3345 real (kind=kind_phys),
dimension(2),
intent(in) :: albbm, albdf
3347 real (kind=kind_phys),
intent(in) :: cosz, sntz, cf1, cf0, ssolar
3350 real (kind=kind_phys),
dimension(nlp1,nbdsw),
intent(out) :: &
3351 & fxupc, fxdnc, fxup0, fxdn0
3353 real (kind=kind_phys),
dimension(2),
intent(out) :: sfbmc, sfdfc, &
3356 real (kind=kind_phys),
intent(out) :: suvbfc, suvbf0, ftoadc, &
3357 & ftoauc, ftoau0, fsfcuc, fsfcu0, fsfcdc, fsfcd0
3360 real (kind=kind_phys),
dimension(nlay) :: ztaus, zssas, zasys, &
3363 real (kind=kind_phys),
dimension(nlp1) :: zrefb, zrefd, ztrab, &
3364 & ztrad, ztdbt, zldbt, zfu, zfd
3366 real (kind=kind_phys) :: ztau1, zssa1, zasy1, ztau0, zssa0, &
3367 & zasy0, zasy3, zssaw, zasyw, zgam1, zgam2, zgam3, zgam4, &
3368 & za1, za2, zb1, zb2, zrk, zrk2, zrp, zrp1, zrm1, zrpp, &
3369 & zrkg1, zrkg3, zrkg4, zexp1, zexm1, zexp2, zexm2, zden1, &
3370 & zexp3, zexp4, ze1r45, ftind, zsolar, ztdbt0, zr1, zr2, &
3371 & zr3, zr4, zr5, zt1, zt2, zt3, zf1, zf2, zrpp1
3373 integer :: ib, ibd, jb, jg, k, kp, itind
3381 fxdnc(k,ib) = f_zero
3382 fxupc(k,ib) = f_zero
3383 fxdn0(k,ib) = f_zero
3384 fxup0(k,ib) = f_zero
3412 lab_do_jg :
do jg = 1, ngptsw
3418 zsolar = ssolar * sfluxzen(jg)
3427 zrefb(1) = albbm(ibd)
3428 zrefd(1) = albdf(ibd)
3430 zrefb(1) = 0.5 * (albbm(1) + albbm(2))
3431 zrefd(1) = 0.5 * (albdf(1) + albdf(2))
3449 ztau0 = max( ftiny, taur(k,jg)+taug(k,jg)+tauae(k,ib) )
3450 zssa0 = taur(k,jg) + tauae(k,ib)*ssaae(k,ib)
3451 zasy0 = asyae(k,ib)*ssaae(k,ib)*tauae(k,ib)
3452 zssaw = min( oneminus, zssa0 / ztau0 )
3453 zasyw = zasy0 / max( ftiny, zssa0 )
3464 ztau1 = (f_one - za2) * ztau0
3465 zssa1 = (zssaw - za2) / (f_one - za2)
3467 zasy1 = zasyw / (f_one + zasyw)
3468 zasy3 = 0.75 * zasy1
3476 if ( iswmode == 1 )
then
3477 zgam1 = 1.75 - zssa1 * (f_one + zasy3)
3478 zgam2 =-0.25 + zssa1 * (f_one - zasy3)
3479 zgam3 = 0.5 - zasy3 * cosz
3480 elseif ( iswmode == 2 )
then
3481 zgam1 = 2.0 - zssa1 * (1.25 + zasy3)
3482 zgam2 = 0.75* zssa1 * (f_one- zasy1)
3483 zgam3 = 0.5 - zasy3 * cosz
3484 elseif ( iswmode == 3 )
then
3485 zgam1 = zsr3 * (2.0 - zssa1 * (1.0 + zasy1)) * 0.5
3486 zgam2 = zsr3 * zssa1 * (1.0 - zasy1) * 0.5
3487 zgam3 = (1.0 - zsr3 * zasy1 * cosz) * 0.5
3489 zgam4 = f_one - zgam3
3493 if ( zssaw >= zcrit )
then
3494 za1 = zgam1 * cosz - zgam3
3500 zb1 = min( ztau1*sntz , 500.0 )
3501 if ( zb1 <= od_lo )
then
3502 zb2 = f_one - zb1 + 0.5*zb1*zb1
3504 ftind = zb1 / (bpade + zb1)
3505 itind = ftind*ntbmx + 0.5
3506 zb2 = exp_tbl(itind)
3510 zrefb(kp) = max(f_zero, min(f_one, &
3511 & (za2 - za1*(f_one - zb2))/(f_one + za2) ))
3512 ztrab(kp) = max(f_zero, min(f_one, f_one-zrefb(kp) ))
3515 zrefd(kp) = max(f_zero, min(f_one, za2/(f_one + za2) ))
3516 ztrad(kp) = max(f_zero, min(f_one, f_one-zrefd(kp) ))
3519 za1 = zgam1*zgam4 + zgam2*zgam3
3520 za2 = zgam1*zgam3 + zgam2*zgam4
3521 zrk = (zgam1 - zgam2) * (zgam1 + zgam2)
3522 if (zrk > eps1)
then
3532 zrpp1= f_one - zrp*zrp
3533 zrpp = sign( max(flimit, abs(zrpp1)), zrpp1 )
3538 zr1 = zrm1 * (za2 + zrkg3)
3539 zr2 = zrp1 * (za2 - zrkg3)
3540 zr3 = zrk2 * (zgam3 - za2*cosz)
3542 zr5 = zrpp * (zrk - zgam1)
3544 zt1 = zrp1 * (za1 + zrkg4)
3545 zt2 = zrm1 * (za1 - zrkg4)
3546 zt3 = zrk2 * (zgam4 + za1*cosz)
3551 zb1 = min( zrk*ztau1, 500.0 )
3552 if ( zb1 <= od_lo )
then
3553 zexm1 = f_one - zb1 + 0.5*zb1*zb1
3555 ftind = zb1 / (bpade + zb1)
3556 itind = ftind*ntbmx + 0.5
3557 zexm1 = exp_tbl(itind)
3559 zexp1 = f_one / zexm1
3561 zb2 = min( sntz*ztau1, 500.0 )
3562 if ( zb2 <= od_lo )
then
3563 zexm2 = f_one - zb2 + 0.5*zb2*zb2
3565 ftind = zb2 / (bpade + zb2)
3566 itind = ftind*ntbmx + 0.5
3567 zexm2 = exp_tbl(itind)
3569 zexp2 = f_one / zexm2
3570 ze1r45 = zr4*zexp1 + zr5*zexm1
3574 if (abs(ze1r45) <= eps1)
then
3578 zden1 = zssa1 / ze1r45
3579 zrefb(kp) = max(f_zero, min(f_one, &
3580 & (zr1*zexp1 - zr2*zexm1 - zr3*zexm2)*zden1 ))
3581 ztrab(kp) = max(f_zero, min(f_one, zexm2*(f_one &
3582 & - (zt1*zexp1 - zt2*zexm1 - zt3*zexp2)*zden1) ))
3586 if (ze1r45 >= f_zero)
then
3587 zden1 = zr4 / max(eps1, ze1r45*zrkg1)
3589 zden1 = zr4 / min(-eps1, ze1r45*zrkg1)
3591 zrefd(kp) = max(f_zero, min(f_one, &
3592 & zgam2*(zexp1 - zexm1)*zden1 ))
3593 ztrad(kp) = max(f_zero, min(f_one, zrk2*zden1 ))
3600 if ( zr1 <= od_lo )
then
3601 zexp3 = f_one - zr1 + 0.5*zr1*zr1
3603 ftind = zr1 / (bpade + zr1)
3604 itind = max(0, min(ntbmx, int(0.5+ntbmx*ftind) ))
3605 zexp3 = exp_tbl(itind)
3608 ztdbt(k) = zexp3 * ztdbt(kp)
3615 if ( zr1 <= od_lo )
then
3616 zexp4 = f_one - zr1 + 0.5*zr1*zr1
3618 ftind = zr1 / (bpade + zr1)
3619 itind = max(0, min(ntbmx, int(0.5+ntbmx*ftind) ))
3620 zexp4 = exp_tbl(itind)
3624 ztdbt0 = zexp4 * ztdbt0
3630 & ( zrefb,zrefd,ztrab,ztrad,zldbt,ztdbt, &
3638 fxup0(k,ib) = fxup0(k,ib) + zsolar*zfu(k)
3639 fxdn0(k,ib) = fxdn0(k,ib) + zsolar*zfd(k)
3644 zb2 = zsolar*(zfd(1) - ztdbt0)
3647 sfbm0(ibd) = sfbm0(ibd) + zb1
3648 sfdf0(ibd) = sfdf0(ibd) + zb2
3652 sfbm0(1) = sfbm0(1) + zf1
3653 sfdf0(1) = sfdf0(1) + zf2
3654 sfbm0(2) = sfbm0(2) + zf1
3655 sfdf0(2) = sfdf0(2) + zf2
3670 if ( cf1 > eps )
then
3678 if ( cldfmc(k,jg) > ftiny )
then
3680 ztau0 = ztaus(k) + taucw(k,ib)
3681 zssa0 = zssas(k) + ssacw(k,ib)
3682 zasy0 = zasys(k) + asycw(k,ib)
3683 zssaw = min(oneminus, zssa0 / ztau0)
3684 zasyw = zasy0 / max(ftiny, zssa0)
3690 ztau1 = (f_one - za2) * ztau0
3691 zssa1 = (zssaw - za2) / (f_one - za2)
3693 zasy1 = zasyw / (f_one + zasyw)
3694 zasy3 = 0.75 * zasy1
3697 if ( iswmode == 1 )
then
3698 zgam1 = 1.75 - zssa1 * (f_one + zasy3)
3699 zgam2 =-0.25 + zssa1 * (f_one - zasy3)
3700 zgam3 = 0.5 - zasy3 * cosz
3701 elseif ( iswmode == 2 )
then
3702 zgam1 = 2.0 - zssa1 * (1.25 + zasy3)
3703 zgam2 = 0.75* zssa1 * (f_one- zasy1)
3704 zgam3 = 0.5 - zasy3 * cosz
3705 elseif ( iswmode == 3 )
then
3706 zgam1 = zsr3 * (2.0 - zssa1 * (1.0 + zasy1)) * 0.5
3707 zgam2 = zsr3 * zssa1 * (1.0 - zasy1) * 0.5
3708 zgam3 = (1.0 - zsr3 * zasy1 * cosz) * 0.5
3710 zgam4 = f_one - zgam3
3715 if ( zssaw >= zcrit )
then
3716 za1 = zgam1 * cosz - zgam3
3722 zb1 = min( ztau1*sntz , 500.0 )
3723 if ( zb1 <= od_lo )
then
3724 zb2 = f_one - zb1 + 0.5*zb1*zb1
3726 ftind = zb1 / (bpade + zb1)
3727 itind = ftind*ntbmx + 0.5
3728 zb2 = exp_tbl(itind)
3732 zrefb(kp) = max(f_zero, min(f_one, &
3733 & (za2 - za1*(f_one - zb2))/(f_one + za2) ))
3734 ztrab(kp) = max(f_zero, min(f_one, f_one-zrefb(kp)))
3737 zrefd(kp) = max(f_zero, min(f_one, za2 / (f_one+za2) ))
3738 ztrad(kp) = max(f_zero, min(f_one, f_one - zrefd(kp) ))
3741 za1 = zgam1*zgam4 + zgam2*zgam3
3742 za2 = zgam1*zgam3 + zgam2*zgam4
3743 zrk = (zgam1 - zgam2) * (zgam1 + zgam2)
3744 if (zrk > eps1)
then
3754 zrpp1= f_one - zrp*zrp
3755 zrpp = sign( max(flimit, abs(zrpp1)), zrpp1 )
3760 zr1 = zrm1 * (za2 + zrkg3)
3761 zr2 = zrp1 * (za2 - zrkg3)
3762 zr3 = zrk2 * (zgam3 - za2*cosz)
3764 zr5 = zrpp * (zrk - zgam1)
3766 zt1 = zrp1 * (za1 + zrkg4)
3767 zt2 = zrm1 * (za1 - zrkg4)
3768 zt3 = zrk2 * (zgam4 + za1*cosz)
3773 zb1 = min( zrk*ztau1, 500.0 )
3774 if ( zb1 <= od_lo )
then
3775 zexm1 = f_one - zb1 + 0.5*zb1*zb1
3777 ftind = zb1 / (bpade + zb1)
3778 itind = ftind*ntbmx + 0.5
3779 zexm1 = exp_tbl(itind)
3781 zexp1 = f_one / zexm1
3783 zb2 = min( ztau1*sntz, 500.0 )
3784 if ( zb2 <= od_lo )
then
3785 zexm2 = f_one - zb2 + 0.5*zb2*zb2
3787 ftind = zb2 / (bpade + zb2)
3788 itind = ftind*ntbmx + 0.5
3789 zexm2 = exp_tbl(itind)
3791 zexp2 = f_one / zexm2
3792 ze1r45 = zr4*zexp1 + zr5*zexm1
3796 if ( abs(ze1r45) <= eps1 )
then
3800 zden1 = zssa1 / ze1r45
3801 zrefb(kp) = max(f_zero, min(f_one, &
3802 & (zr1*zexp1-zr2*zexm1-zr3*zexm2)*zden1 ))
3803 ztrab(kp) = max(f_zero, min(f_one, zexm2*(f_one - &
3804 & (zt1*zexp1-zt2*zexm1-zt3*zexp2)*zden1) ))
3808 if (ze1r45 >= f_zero)
then
3809 zden1 = zr4 / max(eps1, ze1r45*zrkg1)
3811 zden1 = zr4 / min(-eps1, ze1r45*zrkg1)
3813 zrefd(kp) = max(f_zero, min(f_one, &
3814 & zgam2*(zexp1 - zexm1)*zden1 ))
3815 ztrad(kp) = max(f_zero, min(f_one, zrk2*zden1 ))
3823 if ( zr1 <= od_lo )
then
3824 zexp3 = f_one - zr1 + 0.5*zr1*zr1
3826 ftind = zr1 / (bpade + zr1)
3827 itind = max(0, min(ntbmx, int(0.5+ntbmx*ftind) ))
3828 zexp3 = exp_tbl(itind)
3832 ztdbt(k) = zexp3 * ztdbt(kp)
3838 if ( zr1 <= od_lo )
then
3839 zexp4 = f_one - zr1 + 0.5*zr1*zr1
3841 ftind = zr1 / (bpade + zr1)
3842 itind = max(0, min(ntbmx, int(0.5+ntbmx*ftind) ))
3843 zexp4 = exp_tbl(itind)
3846 ztdbt0 = zexp4 * ztdbt0
3851 ztdbt(k) = zldbt(kp) * ztdbt(kp)
3854 ztdbt0 = zldbt0(k) * ztdbt0
3863 & ( zrefb,zrefd,ztrab,ztrad,zldbt,ztdbt, &
3871 fxupc(k,ib) = fxupc(k,ib) + zsolar*zfu(k)
3872 fxdnc(k,ib) = fxdnc(k,ib) + zsolar*zfd(k)
3878 zb2 = zsolar*(zfd(1) - ztdbt0)
3881 sfbmc(ibd) = sfbmc(ibd) + zb1
3882 sfdfc(ibd) = sfdfc(ibd) + zb2
3886 sfbmc(1) = sfbmc(1) + zf1
3887 sfdfc(1) = sfdfc(1) + zf2
3888 sfbmc(2) = sfbmc(2) + zf1
3889 sfdfc(2) = sfdfc(2) + zf2
3901 ftoadc = ftoadc + fxdn0(nlp1,ib)
3902 ftoau0 = ftoau0 + fxup0(nlp1,ib)
3903 fsfcu0 = fsfcu0 + fxup0(1,ib)
3904 fsfcd0 = fsfcd0 + fxdn0(1,ib)
3908 ibd = nuvb - nblow + 1
3909 suvbf0 = fxdn0(1,ibd)
3911 if ( cf1 <= eps )
then
3914 fxupc(k,ib) = fxup0(k,ib)
3915 fxdnc(k,ib) = fxdn0(k,ib)
3933 ftoauc = ftoauc + fxupc(nlp1,ib)
3934 fsfcuc = fsfcuc + fxupc(1,ib)
3935 fsfcdc = fsfcdc + fxdnc(1,ib)
3939 suvbfc = fxdnc(1,ibd)
subroutine, public rrtmg_sw_run(plyr, plvl, tlyr, tlvl, qlyr, olyr, gasvmr_co2, gasvmr_n2o, gasvmr_ch4, gasvmr_o2, gasvmr_co, gasvmr_cfc11, gasvmr_cfc12, gasvmr_cfc22, gasvmr_ccl4, icseed, aeraod, aerssa, aerasy, sfcalb_nir_dir, sfcalb_nir_dif, sfcalb_uvis_dir, sfcalb_uvis_dif, dzlyr, delpin, de_lgth, alpha, cosz, solcon, nday, idxday, npts, nlay, nlp1, lprnt, inc_minor_gas, iswcliq, iswcice, isubcsw, iovr, top_at_1, iswmode, cld_cf, lsswr, iovr_rand, iovr_maxrand, iovr_max, iovr_dcorr, iovr_exp, iovr_exprand, hswc, topflx, sfcflx, cldtau, hsw0, hswb, flxprf, fdncmp, cld_lwp, cld_ref_liq, cld_iwp, cld_ref_ice, cld_rwp, cld_ref_rain, cld_swp, cld_ref_snow, cld_od, cld_ssa, cld_asy, errmsg, errflg)