306 use physcons,
only : con_g, con_cp, con_avgd, con_amd, &
308 use machine,
only : rb => kind_phys, im => kind_io4, &
309 & kind_phys, kind_dbl_prec
322 character(40),
parameter :: &
323 & VTAGSW=
'NCEP SW v5.1 Nov 2012 -RRTMG-SW v3.8 '
335 real (kind=kind_phys),
parameter :: eps = 1.0e-6
336 real (kind=kind_phys),
parameter :: oneminus= 1.0 - eps
338 real (kind=kind_phys),
parameter :: bpade = 1.0/0.278
339 real (kind=kind_phys),
parameter :: stpfac = 296.0/1013.0
340 real (kind=kind_phys),
parameter :: ftiny = 1.0e-12
341 real (kind=kind_phys),
parameter :: flimit = 1.0e-20
343 real (kind=kind_phys),
parameter :: s0 = 1368.22
345 real (kind=kind_phys),
parameter :: f_zero = 0.0
346 real (kind=kind_phys),
parameter :: f_one = 1.0
349 real (kind=kind_phys),
parameter :: amdw = con_amd/con_amw
350 real (kind=kind_phys),
parameter :: amdo3 = con_amd/con_amo3
353 integer,
dimension(nblow:nbhgh) :: nspa, nspb
355 integer,
dimension(nblow:nbhgh) :: idxsfc
357 integer,
dimension(nblow:nbhgh) :: idxebc
359 data nspa(:) / 9, 9, 9, 9, 1, 9, 9, 1, 9, 1, 0, 1, 9, 1 /
360 data nspb(:) / 1, 5, 1, 1, 1, 5, 1, 0, 1, 0, 0, 1, 5, 1 /
363 data idxsfc(:) / 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 1 /
364 data idxebc(:) / 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 5 /
380 integer,
parameter :: nuvb = 27
383 logical :: lhswb = .false.
384 logical :: lhsw0 = .false.
385 logical :: lflxprf= .false.
386 logical :: lfdncmp= .false.
390 real (kind=kind_phys) :: exp_tbl(0:ntbmx)
395 real (kind=kind_phys) :: heatfac
399 integer,
parameter :: ipsdsw0 = 1
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)
1390 subroutine rswinit( me, rad_hr_units, inc_minor_gas, iswcliq, &
1391 isubcsw, iovr, iovr_rand, iovr_maxrand, iovr_max, iovr_dcorr,&
1392 iovr_exp, iovr_exprand, iswmode, errflg, errmsg )
1446 integer,
intent(in) :: me, rad_hr_units, iswcliq, isubcsw, iovr, &
1447 iswmode, iovr_rand, iovr_maxrand, iovr_max, iovr_dcorr, &
1448 iovr_exp, iovr_exprand
1449 logical,
intent(in) :: inc_minor_gas
1451 character(len=*),
intent(out) :: errmsg
1452 integer,
intent(out) :: errflg
1455 real (kind=kind_phys),
parameter :: expeps = 1.e-20
1459 real (kind=kind_phys) :: tfn, tau
1468 if ((iovr .ne. iovr_rand) .and. (iovr .ne. iovr_maxrand) .and. &
1469 (iovr .ne. iovr_max) .and. (iovr .ne. iovr_dcorr) .and. &
1470 (iovr .ne. iovr_exp) .and. (iovr .ne. iovr_exprand))
then
1472 errmsg =
'ERROR(rswinit): Error in specification of cloud overlap flag'
1476 print *,
' - Using AER Shortwave Radiation, Version: ',vtagsw
1478 if (iswmode == 1)
then
1479 print *,
' --- Delta-eddington 2-stream transfer scheme'
1480 else if (iswmode == 2)
then
1481 print *,
' --- PIFM 2-stream transfer scheme'
1482 else if (iswmode == 3)
then
1483 print *,
' --- Discrete ordinates 2-stream transfer scheme'
1486 if (.not. inc_minor_gas)
then
1487 print *,
' --- Rare gases absorption is NOT included in SW'
1489 print *,
' --- Include rare gases N2O, CH4, O2, absorptions',&
1493 if ( isubcsw == 0 )
then
1494 print *,
' --- Using standard grid average clouds, no ', &
1495 &
'sub-column clouds approximation applied'
1496 elseif ( isubcsw == 1 )
then
1497 print *,
' --- Using MCICA sub-colum clouds approximation ', &
1498 &
'with a prescribed sequence of permutation seeds'
1499 elseif ( isubcsw == 2 )
then
1500 print *,
' --- Using MCICA sub-colum clouds approximation ', &
1501 &
'with provided input array of permutation seeds'
1508 if (rad_hr_units == 1)
then
1511 heatfac = con_g * 864.0 / con_cp
1513 heatfac = con_g * 1.0e-2 / con_cp
1524 exp_tbl(ntbmx) = expeps
1527 tfn = float(i) / float(ntbmx-i)
1529 exp_tbl(i) = exp( -tau )
1532 if (exp_tbl(i) .le. expeps) exp_tbl(i) = expeps
1568 subroutine cldprop &
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
1940 end subroutine cldprop
1954 subroutine mcica_subcol &
1955 & ( cldf, nlay, ipseed, dz, de_lgth, alpha, iovr, &
1987 integer,
intent(in) :: nlay, ipseed, iovr
1989 real (kind=kind_phys),
dimension(nlay),
intent(in) :: cldf, dz
1990 real (kind=kind_phys),
intent(in) :: de_lgth
1991 real (kind=kind_phys),
dimension(nlay),
intent(in) :: alpha
1994 logical,
dimension(nlay,ngptsw),
intent(out):: lcloudy
1997 real (kind=kind_phys) :: cdfunc(nlay,ngptsw), tem1, &
1999 & cdfun2(nlay,ngptsw)
2000 real (kind=kind_dbl_prec) :: rand2d(nlay*ngptsw), rand1d(ngptsw)
2019 select case ( iovr )
2032 cdfunc(k,n) = rand2d(k1)
2047 cdfunc(k,n) = rand2d(k1)
2059 tem1 = f_one - cldf(k1)
2062 if ( cdfunc(k1,n) > tem1 )
then
2063 cdfunc(k,n) = cdfunc(k1,n)
2065 cdfunc(k,n) = cdfunc(k,n) * tem1
2109 fac_lcf(k) = exp( -0.5 * (dz(k)+dz(k-1)) / de_lgth )
2120 cdfunc(k,n) = rand2d(k1)
2130 cdfun2(k,n) = rand2d(k1)
2140 do k = nlay-1, 1, -1
2142 if ( cdfun2(k,n) <= fac_lcf(k1) )
then
2143 cdfunc(k,n) = cdfunc(k1,n)
2172 cdfunc(k,n) = rand2d(k1)
2182 cdfun2(k,n) = rand2d(k1)
2194 if ( cdfun2(k,n) < alpha(k) )
then
2195 cdfunc(k,n) = cdfunc(k1,n)
2205 tem1 = f_one - cldf(k)
2208 lcloudy(k,n) = cdfunc(k,n) >= tem1
2214 end subroutine mcica_subcol
2244 subroutine setcoef &
2245 & ( pavel,tavel,h2ovmr, nlay,nlp1, &
2246 & laytrop,jp,jt,jt1,fac00,fac01,fac10,fac11, &
2247 & selffac,selffrac,indself,forfac,forfrac,indfor &
2287 integer,
intent(in) :: nlay, nlp1
2289 real (kind=kind_phys),
dimension(:),
intent(in) :: pavel, tavel, &
2293 integer,
dimension(nlay),
intent(out) :: indself, indfor, &
2295 integer,
intent(out) :: laytrop
2297 real (kind=kind_phys),
dimension(nlay),
intent(out) :: fac00, &
2298 & fac01, fac10, fac11, selffac, selffrac, forfac, forfrac
2301 real (kind=kind_phys) :: plog, fp, fp1, ft, ft1, tem1, tem2
2303 integer :: i, k, jp1
2311 forfac(k) = pavel(k)*stpfac / (tavel(k)*(f_one + h2ovmr(k)))
2318 plog = log(pavel(k))
2319 jp(k) = max(1, min(58, int(36.0 - 5.0*(plog+0.04)) ))
2321 fp = 5.0 * (preflog(jp(k)) - plog)
2330 tem1 = (tavel(k) - tref(jp(k))) / 15.0
2331 tem2 = (tavel(k) - tref(jp1 )) / 15.0
2332 jt(k) = max(1, min(4, int(3.0 + tem1) ))
2333 jt1(k) = max(1, min(4, int(3.0 + tem2) ))
2334 ft = tem1 - float(jt(k) - 3)
2335 ft1 = tem2 - float(jt1(k) - 3)
2346 fac00(k) = fp1 * (f_one - ft)
2348 fac01(k) = fp * (f_one - ft1)
2353 if ( plog > 4.56 )
then
2360 tem1 = (332.0 - tavel(k)) / 36.0
2361 indfor(k) = min(2, max(1, int(tem1)))
2362 forfrac(k) = tem1 - float(indfor(k))
2367 tem2 = (tavel(k) - 188.0) / 7.2
2368 indself(k) = min(9, max(1, int(tem2)-7))
2369 selffrac(k) = tem2 - float(indself(k) + 7)
2370 selffac(k) = h2ovmr(k) * forfac(k)
2377 tem1 = (tavel(k) - 188.0) / 36.0
2379 forfrac(k) = tem1 - f_one
2382 selffrac(k) = f_zero
2391 end subroutine setcoef
2434 subroutine spcvrtc &
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)
3185 end subroutine spcvrtc
3230 subroutine spcvrtm &
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)
3944 end subroutine spcvrtm
3962 & ( zrefb,zrefd,ztrab,ztrad,zldbt,ztdbt, &
3994 integer,
intent(in) :: nlay, nlp1
3996 real (kind=kind_phys),
dimension(nlp1),
intent(in) :: zrefb, &
3997 & zrefd, ztrab, ztrad, ztdbt, zldbt
4000 real (kind=kind_phys),
dimension(nlp1),
intent(out) :: zfu, zfd
4003 real (kind=kind_phys),
dimension(nlp1) :: zrupb,zrupd,zrdnd,ztdn
4005 real (kind=kind_phys) :: zden1
4020 zden1 = f_one / ( f_one - zrupd(k)*zrefd(kp) )
4021 zrupb(kp) = zrefb(kp) + ( ztrad(kp) * &
4022 & ( (ztrab(kp) - zldbt(kp))*zrupd(k) + &
4023 & zldbt(kp)*zrupb(k)) ) * zden1
4024 zrupd(kp) = zrefd(kp) + ztrad(kp)*ztrad(kp)*zrupd(k)*zden1
4029 zrdnd(nlp1) = f_zero
4030 ztdn(nlay) = ztrab(nlp1)
4031 zrdnd(nlay) = zrefd(nlp1)
4035 zden1 = f_one / (f_one - zrefd(k)*zrdnd(k))
4036 ztdn(k-1) = ztdbt(k)*ztrab(k) + ( ztrad(k) * &
4037 & ( (ztdn(k) - ztdbt(k)) + ztdbt(k) * &
4038 & zrefb(k)*zrdnd(k) )) * zden1
4039 zrdnd(k-1) = zrefd(k) + ztrad(k)*ztrad(k)*zrdnd(k)*zden1
4044 zden1 = f_one / (f_one - zrdnd(k)*zrupd(k))
4045 zfu(k) = ( ztdbt(k)*zrupb(k) + &
4046 & (ztdn(k) - ztdbt(k))*zrupd(k) ) * zden1
4047 zfd(k) = ztdbt(k) + ( ztdn(k) - ztdbt(k) + &
4048 & ztdbt(k)*zrupb(k)*zrdnd(k) ) * zden1
4053 end subroutine vrtqdr
4097 & ( colamt,colmol,fac00,fac01,fac10,fac11,jp,jt,jt1,laytrop, &
4098 & forfac,forfrac,indfor,selffac,selffrac,indself, nlay, &
4099 & sfluxzen, taug, taur &
4199 integer,
intent(in) :: nlay, laytrop
4201 integer,
dimension(nlay),
intent(in) :: indfor, indself, &
4204 real (kind=kind_phys),
dimension(nlay),
intent(in) :: colmol, &
4205 & fac00, fac01, fac10, fac11, forfac, forfrac, selffac, &
4208 real (kind=kind_phys),
dimension(nlay,maxgas),
intent(in) :: colamt
4211 real (kind=kind_phys),
dimension(ngptsw),
intent(out) :: sfluxzen
4213 real (kind=kind_phys),
dimension(nlay,ngptsw),
intent(out) :: &
4217 real (kind=kind_phys) :: fs, speccomb, specmult, colm1, colm2
4219 integer,
dimension(nlay,nblow:nbhgh) :: id0, id1
4221 integer :: ibd, j, jb, js, k, klow, khgh, klim, ks, njb, ns
4227 do jb = nblow, nbhgh
4232 id0(k,jb) = ((jp(k)-1)*5 + (jt(k)-1)) * nspa(jb)
4233 id1(k,jb) = ( jp(k) *5 + (jt1(k)-1)) * nspa(jb)
4236 do k = laytrop+1, nlay
4237 id0(k,jb) = ((jp(k)-13)*5 + (jt(k)-1)) * nspb(jb)
4238 id1(k,jb) = ((jp(k)-12)*5 + (jt1(k)-1)) * nspb(jb)
4249 case (16, 20, 23, 25, 26, 29)
4252 sfluxzen(ns+j) = sfluxref01(j,1,ibd)
4258 sfluxzen(ns+j) = scalekur * sfluxref01(j,1,ibd)
4263 if (jb==17 .or. jb==28)
then
4266 lab_do_k1 :
do k = laytrop, nlay-1
4267 if (jp(k)<layreffr(jb) .and. jp(k+1)>=layreffr(jb))
then
4273 colm1 = colamt(ks,ix1(jb))
4274 colm2 = colamt(ks,ix2(jb))
4275 speccomb = colm1 + strrat(jb)*colm2
4276 specmult = specwt(jb) * min( oneminus, colm1/speccomb )
4277 js = 1 + int( specmult )
4278 fs = mod(specmult, f_one)
4281 sfluxzen(ns+j) = sfluxref02(j,js,ibd) &
4282 & + fs * (sfluxref02(j,js+1,ibd) - sfluxref02(j,js,ibd))
4288 lab_do_k2 :
do k = 1, laytrop-1
4289 if (jp(k)<layreffr(jb) .and. jp(k+1)>=layreffr(jb))
then
4295 colm1 = colamt(ks,ix1(jb))
4296 colm2 = colamt(ks,ix2(jb))
4297 speccomb = colm1 + strrat(jb)*colm2
4298 specmult = specwt(jb) * min( oneminus, colm1/speccomb )
4299 js = 1 + int( specmult )
4300 fs = mod(specmult, f_one)
4303 sfluxzen(ns+j) = sfluxref03(j,js,ibd) &
4304 & + fs * (sfluxref03(j,js+1,ibd) - sfluxref03(j,js,ibd))
4364 real (kind=kind_phys) :: speccomb, specmult, tauray, fs, fs1, &
4365 & fac000,fac001,fac010,fac011, fac100,fac101,fac110,fac111
4367 integer :: ind01, ind02, ind03, ind04, ind11, ind12, ind13, ind14
4368 integer :: inds, indf, indsp, indfp, j, js, k
4379 tauray = colmol(k) * rayl
4382 taur(k,ns16+j) = tauray
4387 speccomb = colamt(k,1) + strrat(16)*colamt(k,5)
4388 specmult = 8.0 * min( oneminus, colamt(k,1)/speccomb )
4390 js = 1 + int( specmult )
4391 fs = mod( specmult, f_one )
4393 fac000 = fs1 * fac00(k)
4394 fac010 = fs1 * fac10(k)
4395 fac100 = fs * fac00(k)
4396 fac110 = fs * fac10(k)
4397 fac001 = fs1 * fac01(k)
4398 fac011 = fs1 * fac11(k)
4399 fac101 = fs * fac01(k)
4400 fac111 = fs * fac11(k)
4402 ind01 = id0(k,16) + js
4406 ind11 = id1(k,16) + js
4416 taug(k,ns16+j) = speccomb &
4417 & *( fac000 * absa(ind01,j) + fac100 * absa(ind02,j) &
4418 & + fac010 * absa(ind03,j) + fac110 * absa(ind04,j) &
4419 & + fac001 * absa(ind11,j) + fac101 * absa(ind12,j) &
4420 & + fac011 * absa(ind13,j) + fac111 * absa(ind14,j) ) &
4421 & + colamt(k,1) * (selffac(k) * (selfref(inds,j) &
4422 & + selffrac(k) * (selfref(indsp,j)-selfref(inds,j))) &
4423 & + forfac(k) * (forref(indf,j) + forfrac(k) &
4424 & * (forref(indfp,j) - forref(indf,j))))
4428 do k = laytrop+1, nlay
4429 ind01 = id0(k,16) + 1
4431 ind11 = id1(k,16) + 1
4435 taug(k,ns16+j) = colamt(k,5) &
4436 & * ( fac00(k)*absb(ind01,j) + fac10(k)*absb(ind02,j) &
4437 & + fac01(k)*absb(ind11,j) + fac11(k)*absb(ind12,j) )
4443 end subroutine taumol16
4460 real (kind=kind_phys) :: speccomb, specmult, tauray, fs, fs1, &
4461 & fac000,fac001,fac010,fac011, fac100,fac101,fac110,fac111
4463 integer :: ind01, ind02, ind03, ind04, ind11, ind12, ind13, ind14
4464 integer :: inds, indf, indsp, indfp, j, js, k
4475 tauray = colmol(k) * rayl
4478 taur(k,ns17+j) = tauray
4483 speccomb = colamt(k,1) + strrat(17)*colamt(k,2)
4484 specmult = 8.0 * min(oneminus, colamt(k,1) / speccomb)
4486 js = 1 + int(specmult)
4487 fs = mod(specmult, f_one)
4489 fac000 = fs1 * fac00(k)
4490 fac010 = fs1 * fac10(k)
4491 fac100 = fs * fac00(k)
4492 fac110 = fs * fac10(k)
4493 fac001 = fs1 * fac01(k)
4494 fac011 = fs1 * fac11(k)
4495 fac101 = fs * fac01(k)
4496 fac111 = fs * fac11(k)
4498 ind01 = id0(k,17) + js
4502 ind11 = id1(k,17) + js
4513 taug(k,ns17+j) = speccomb &
4514 & * ( fac000 * absa(ind01,j) + fac100 * absa(ind02,j) &
4515 & + fac010 * absa(ind03,j) + fac110 * absa(ind04,j) &
4516 & + fac001 * absa(ind11,j) + fac101 * absa(ind12,j) &
4517 & + fac011 * absa(ind13,j) + fac111 * absa(ind14,j) ) &
4518 & + colamt(k,1) * (selffac(k) * (selfref(inds,j) &
4519 & + selffrac(k) * (selfref(indsp,j)-selfref(inds,j))) &
4520 & + forfac(k) * (forref(indf,j) + forfrac(k) &
4521 & * (forref(indfp,j) - forref(indf,j))))
4525 do k = laytrop+1, nlay
4526 speccomb = colamt(k,1) + strrat(17)*colamt(k,2)
4527 specmult = 4.0 * min(oneminus, colamt(k,1) / speccomb)
4529 js = 1 + int(specmult)
4530 fs = mod(specmult, f_one)
4532 fac000 = fs1 * fac00(k)
4533 fac010 = fs1 * fac10(k)
4534 fac100 = fs * fac00(k)
4535 fac110 = fs * fac10(k)
4536 fac001 = fs1 * fac01(k)
4537 fac011 = fs1 * fac11(k)
4538 fac101 = fs * fac01(k)
4539 fac111 = fs * fac11(k)
4541 ind01 = id0(k,17) + js
4545 ind11 = id1(k,17) + js
4554 taug(k,ns17+j) = speccomb &
4555 & * ( fac000 * absb(ind01,j) + fac100 * absb(ind02,j) &
4556 & + fac010 * absb(ind03,j) + fac110 * absb(ind04,j) &
4557 & + fac001 * absb(ind11,j) + fac101 * absb(ind12,j) &
4558 & + fac011 * absb(ind13,j) + fac111 * absb(ind14,j) ) &
4559 & + colamt(k,1) * forfac(k) * (forref(indf,j) &
4560 & + forfrac(k) * (forref(indfp,j) - forref(indf,j)))
4566 end subroutine taumol17
4583 real (kind=kind_phys) :: speccomb, specmult, tauray, fs, fs1, &
4584 & fac000,fac001,fac010,fac011, fac100,fac101,fac110,fac111
4586 integer :: ind01, ind02, ind03, ind04, ind11, ind12, ind13, ind14
4587 integer :: inds, indf, indsp, indfp, j, js, k
4598 tauray = colmol(k) * rayl
4601 taur(k,ns18+j) = tauray
4606 speccomb = colamt(k,1) + strrat(18)*colamt(k,5)
4607 specmult = 8.0 * min(oneminus, colamt(k,1) / speccomb)
4609 js = 1 + int(specmult)
4610 fs = mod(specmult, f_one)
4612 fac000 = fs1 * fac00(k)
4613 fac010 = fs1 * fac10(k)
4614 fac100 = fs * fac00(k)
4615 fac110 = fs * fac10(k)
4616 fac001 = fs1 * fac01(k)
4617 fac011 = fs1 * fac11(k)
4618 fac101 = fs * fac01(k)
4619 fac111 = fs * fac11(k)
4621 ind01 = id0(k,18) + js
4625 ind11 = id1(k,18) + js
4636 taug(k,ns18+j) = speccomb &
4637 & * ( fac000 * absa(ind01,j) + fac100 * absa(ind02,j) &
4638 & + fac010 * absa(ind03,j) + fac110 * absa(ind04,j) &
4639 & + fac001 * absa(ind11,j) + fac101 * absa(ind12,j) &
4640 & + fac011 * absa(ind13,j) + fac111 * absa(ind14,j) ) &
4641 & + colamt(k,1) * (selffac(k) * (selfref(inds,j) &
4642 & + selffrac(k) * (selfref(indsp,j)-selfref(inds,j))) &
4643 & + forfac(k) * (forref(indf,j) + forfrac(k) &
4644 & * (forref(indfp,j) - forref(indf,j))))
4648 do k = laytrop+1, nlay
4649 ind01 = id0(k,18) + 1
4651 ind11 = id1(k,18) + 1
4655 taug(k,ns18+j) = colamt(k,5) &
4656 & * ( fac00(k)*absb(ind01,j) + fac10(k)*absb(ind02,j) &
4657 & + fac01(k)*absb(ind11,j) + fac11(k)*absb(ind12,j) )
4663 end subroutine taumol18
4680 real (kind=kind_phys) :: speccomb, specmult, tauray, fs, fs1, &
4681 & fac000,fac001,fac010,fac011, fac100,fac101,fac110,fac111
4683 integer :: ind01, ind02, ind03, ind04, ind11, ind12, ind13, ind14
4684 integer :: inds, indf, indsp, indfp, j, js, k
4695 tauray = colmol(k) * rayl
4698 taur(k,ns19+j) = tauray
4703 speccomb = colamt(k,1) + strrat(19)*colamt(k,2)
4704 specmult = 8.0 * min(oneminus, colamt(k,1) / speccomb)
4706 js = 1 + int(specmult)
4707 fs = mod(specmult, f_one)
4709 fac000 = fs1 * fac00(k)
4710 fac010 = fs1 * fac10(k)
4711 fac100 = fs * fac00(k)
4712 fac110 = fs * fac10(k)
4713 fac001 = fs1 * fac01(k)
4714 fac011 = fs1 * fac11(k)
4715 fac101 = fs * fac01(k)
4716 fac111 = fs * fac11(k)
4718 ind01 = id0(k,19) + js
4722 ind11 = id1(k,19) + js
4733 taug(k,ns19+j) = speccomb &
4734 & * ( fac000 * absa(ind01,j) + fac100 * absa(ind02,j) &
4735 & + fac010 * absa(ind03,j) + fac110 * absa(ind04,j) &
4736 & + fac001 * absa(ind11,j) + fac101 * absa(ind12,j) &
4737 & + fac011 * absa(ind13,j) + fac111 * absa(ind14,j) ) &
4738 & + colamt(k,1) * (selffac(k) * (selfref(inds,j) &
4739 & + selffrac(k) * (selfref(indsp,j)-selfref(inds,j))) &
4740 & + forfac(k) * (forref(indf,j) + forfrac(k) &
4741 & * (forref(indfp,j) - forref(indf,j))))
4745 do k = laytrop+1, nlay
4746 ind01 = id0(k,19) + 1
4748 ind11 = id1(k,19) + 1
4752 taug(k,ns19+j) = colamt(k,2) &
4753 & * ( fac00(k)*absb(ind01,j) + fac10(k)*absb(ind02,j) &
4754 & + fac01(k)*absb(ind11,j) + fac11(k)*absb(ind12,j) )
4759 end subroutine taumol19
4776 real (kind=kind_phys) :: tauray
4778 integer :: ind01, ind02, ind11, ind12
4779 integer :: inds, indf, indsp, indfp, j, k
4790 tauray = colmol(k) * rayl
4793 taur(k,ns20+j) = tauray
4798 ind01 = id0(k,20) + 1
4800 ind11 = id1(k,20) + 1
4809 taug(k,ns20+j) = colamt(k,1) &
4810 & * ( (fac00(k)*absa(ind01,j) + fac10(k)*absa(ind02,j) &
4811 & + fac01(k)*absa(ind11,j) + fac11(k)*absa(ind12,j)) &
4812 & + selffac(k) * (selfref(inds,j) + selffrac(k) &
4813 & * (selfref(indsp,j) - selfref(inds,j))) &
4814 & + forfac(k) * (forref(indf,j) + forfrac(k) &
4815 & * (forref(indfp,j) - forref(indf,j))) ) &
4816 & + colamt(k,5) * absch4(j)
4820 do k = laytrop+1, nlay
4821 ind01 = id0(k,20) + 1
4823 ind11 = id1(k,20) + 1
4830 taug(k,ns20+j) = colamt(k,1) &
4831 & * ( fac00(k)*absb(ind01,j) + fac10(k)*absb(ind02,j) &
4832 & + fac01(k)*absb(ind11,j) + fac11(k)*absb(ind12,j) &
4833 & + forfac(k) * (forref(indf,j) + forfrac(k) &
4834 & * (forref(indfp,j) - forref(indf,j))) ) &
4835 & + colamt(k,5) * absch4(j)
4841 end subroutine taumol20
4858 real (kind=kind_phys) :: speccomb, specmult, tauray, fs, fs1, &
4859 & fac000,fac001,fac010,fac011, fac100,fac101,fac110,fac111
4861 integer :: ind01, ind02, ind03, ind04, ind11, ind12, ind13, ind14
4862 integer :: inds, indf, indsp, indfp, j, js, k
4873 tauray = colmol(k) * rayl
4876 taur(k,ns21+j) = tauray
4881 speccomb = colamt(k,1) + strrat(21)*colamt(k,2)
4882 specmult = 8.0 * min(oneminus, colamt(k,1) / speccomb)
4884 js = 1 + int(specmult)
4885 fs = mod(specmult, f_one)
4887 fac000 = fs1 * fac00(k)
4888 fac010 = fs1 * fac10(k)
4889 fac100 = fs * fac00(k)
4890 fac110 = fs * fac10(k)
4891 fac001 = fs1 * fac01(k)
4892 fac011 = fs1 * fac11(k)
4893 fac101 = fs * fac01(k)
4894 fac111 = fs * fac11(k)
4896 ind01 = id0(k,21) + js
4900 ind11 = id1(k,21) + js
4911 taug(k,ns21+j) = speccomb &
4912 & * ( fac000 * absa(ind01,j) + fac100 * absa(ind02,j) &
4913 & + fac010 * absa(ind03,j) + fac110 * absa(ind04,j) &
4914 & + fac001 * absa(ind11,j) + fac101 * absa(ind12,j) &
4915 & + fac011 * absa(ind13,j) + fac111 * absa(ind14,j) ) &
4916 & + colamt(k,1) * (selffac(k) * (selfref(inds,j) &
4917 & + selffrac(k) * (selfref(indsp,j) - selfref(inds,j))) &
4918 & + forfac(k) * (forref(indf,j) + forfrac(k) &
4919 & * (forref(indfp,j) - forref(indf,j))))
4923 do k = laytrop+1, nlay
4924 speccomb = colamt(k,1) + strrat(21)*colamt(k,2)
4925 specmult = 4.0 * min(oneminus, colamt(k,1) / speccomb)
4927 js = 1 + int(specmult)
4928 fs = mod(specmult, f_one)
4930 fac000 = fs1 * fac00(k)
4931 fac010 = fs1 * fac10(k)
4932 fac100 = fs * fac00(k)
4933 fac110 = fs * fac10(k)
4934 fac001 = fs1 * fac01(k)
4935 fac011 = fs1 * fac11(k)
4936 fac101 = fs * fac01(k)
4937 fac111 = fs * fac11(k)
4939 ind01 = id0(k,21) + js
4943 ind11 = id1(k,21) + js
4952 taug(k,ns21+j) = speccomb &
4953 & * ( fac000 * absb(ind01,j) + fac100 * absb(ind02,j) &
4954 & + fac010 * absb(ind03,j) + fac110 * absb(ind04,j) &
4955 & + fac001 * absb(ind11,j) + fac101 * absb(ind12,j) &
4956 & + fac011 * absb(ind13,j) + fac111 * absb(ind14,j) ) &
4957 & + colamt(k,1) * forfac(k) * (forref(indf,j) &
4958 & + forfrac(k) * (forref(indfp,j) - forref(indf,j)))
4963 end subroutine taumol21
4980 real (kind=kind_phys) :: speccomb, specmult, tauray, fs, fs1, &
4981 & fac000,fac001,fac010,fac011, fac100,fac101,fac110,fac111, &
4982 & o2adj, o2cont, o2tem
4984 integer :: ind01, ind02, ind03, ind04, ind11, ind12, ind13, ind14
4985 integer :: inds, indf, indsp, indfp, j, js, k
4995 o2tem = 4.35e-4 / (350.0*2.0)
5003 tauray = colmol(k) * rayl
5006 taur(k,ns22+j) = tauray
5011 o2cont = o2tem * colamt(k,6)
5012 speccomb = colamt(k,1) + strrat(22)*colamt(k,6)
5013 specmult = 8.0 * min(oneminus, colamt(k,1) / speccomb)
5015 js = 1 + int(specmult)
5016 fs = mod(specmult, f_one)
5018 fac000 = fs1 * fac00(k)
5019 fac010 = fs1 * fac10(k)
5020 fac100 = fs * fac00(k)
5021 fac110 = fs * fac10(k)
5022 fac001 = fs1 * fac01(k)
5023 fac011 = fs1 * fac11(k)
5024 fac101 = fs * fac01(k)
5025 fac111 = fs * fac11(k)
5027 ind01 = id0(k,22) + js
5031 ind11 = id1(k,22) + js
5042 taug(k,ns22+j) = speccomb &
5043 & * ( fac000 * absa(ind01,j) + fac100 * absa(ind02,j) &
5044 & + fac010 * absa(ind03,j) + fac110 * absa(ind04,j) &
5045 & + fac001 * absa(ind11,j) + fac101 * absa(ind12,j) &
5046 & + fac011 * absa(ind13,j) + fac111 * absa(ind14,j) ) &
5047 & + colamt(k,1) * (selffac(k) * (selfref(inds,j) &
5048 & + selffrac(k) * (selfref(indsp,j)-selfref(inds,j))) &
5049 & + forfac(k) * (forref(indf,j) + forfrac(k) &
5050 & * (forref(indfp,j) - forref(indf,j)))) + o2cont
5054 do k = laytrop+1, nlay
5055 o2cont = o2tem * colamt(k,6)
5057 ind01 = id0(k,22) + 1
5059 ind11 = id1(k,22) + 1
5063 taug(k,ns22+j) = colamt(k,6) * o2adj &
5064 & * ( fac00(k)*absb(ind01,j) + fac10(k)*absb(ind02,j) &
5065 & + fac01(k)*absb(ind11,j) + fac11(k)*absb(ind12,j) ) &
5072 end subroutine taumol22
5089 integer :: ind01, ind02, ind11, ind12
5090 integer :: inds, indf, indsp, indfp, j, k
5102 taur(k,ns23+j) = colmol(k) * rayl(j)
5107 ind01 = id0(k,23) + 1
5109 ind11 = id1(k,23) + 1
5118 taug(k,ns23+j) = colamt(k,1) * (givfac &
5119 & * ( fac00(k)*absa(ind01,j) + fac10(k)*absa(ind02,j) &
5120 & + fac01(k)*absa(ind11,j) + fac11(k)*absa(ind12,j) ) &
5121 & + selffac(k) * (selfref(inds,j) + selffrac(k) &
5122 & * (selfref(indsp,j) - selfref(inds,j))) &
5123 & + forfac(k) * (forref(indf,j) + forfrac(k) &
5124 & * (forref(indfp,j) - forref(indf,j))))
5128 do k = laytrop+1, nlay
5130 taug(k,ns23+j) = f_zero
5135 end subroutine taumol23
5152 real (kind=kind_phys) :: speccomb, specmult, fs, fs1, &
5153 & fac000,fac001,fac010,fac011, fac100,fac101,fac110,fac111
5155 integer :: ind01, ind02, ind03, ind04, ind11, ind12, ind13, ind14
5156 integer :: inds, indf, indsp, indfp, j, js, k
5167 speccomb = colamt(k,1) + strrat(24)*colamt(k,6)
5168 specmult = 8.0 * min(oneminus, colamt(k,1) / speccomb)
5170 js = 1 + int(specmult)
5171 fs = mod(specmult, f_one)
5173 fac000 = fs1 * fac00(k)
5174 fac010 = fs1 * fac10(k)
5175 fac100 = fs * fac00(k)
5176 fac110 = fs * fac10(k)
5177 fac001 = fs1 * fac01(k)
5178 fac011 = fs1 * fac11(k)
5179 fac101 = fs * fac01(k)
5180 fac111 = fs * fac11(k)
5182 ind01 = id0(k,24) + js
5186 ind11 = id1(k,24) + js
5197 taug(k,ns24+j) = speccomb &
5198 & * ( fac000 * absa(ind01,j) + fac100 * absa(ind02,j) &
5199 & + fac010 * absa(ind03,j) + fac110 * absa(ind04,j) &
5200 & + fac001 * absa(ind11,j) + fac101 * absa(ind12,j) &
5201 & + fac011 * absa(ind13,j) + fac111 * absa(ind14,j) ) &
5202 & + colamt(k,3) * abso3a(j) + colamt(k,1) &
5203 & * (selffac(k) * (selfref(inds,j) + selffrac(k) &
5204 & * (selfref(indsp,j) - selfref(inds,j))) &
5205 & + forfac(k) * (forref(indf,j) + forfrac(k) &
5206 & * (forref(indfp,j) - forref(indf,j))))
5208 taur(k,ns24+j) = colmol(k) &
5209 & * (rayla(j,js) + fs*(rayla(j,js+1) - rayla(j,js)))
5213 do k = laytrop+1, nlay
5214 ind01 = id0(k,24) + 1
5216 ind11 = id1(k,24) + 1
5220 taug(k,ns24+j) = colamt(k,6) &
5221 & * ( fac00(k)*absb(ind01,j) + fac10(k)*absb(ind02,j) &
5222 & + fac01(k)*absb(ind11,j) + fac11(k)*absb(ind12,j) ) &
5223 & + colamt(k,3) * abso3b(j)
5225 taur(k,ns24+j) = colmol(k) * raylb(j)
5231 end subroutine taumol24
5248 integer :: ind01, ind02, ind11, ind12
5261 taur(k,ns25+j) = colmol(k) * rayl(j)
5266 ind01 = id0(k,25) + 1
5268 ind11 = id1(k,25) + 1
5272 taug(k,ns25+j) = colamt(k,1) &
5273 & * ( fac00(k)*absa(ind01,j) + fac10(k)*absa(ind02,j) &
5274 & + fac01(k)*absa(ind11,j) + fac11(k)*absa(ind12,j) ) &
5275 & + colamt(k,3) * abso3a(j)
5279 do k = laytrop+1, nlay
5281 taug(k,ns25+j) = colamt(k,3) * abso3b(j)
5287 end subroutine taumol25
5316 taug(k,ns26+j) = f_zero
5317 taur(k,ns26+j) = colmol(k) * rayl(j)
5323 end subroutine taumol26
5340 integer :: ind01, ind02, ind11, ind12
5353 taur(k,ns27+j) = colmol(k) * rayl(j)
5358 ind01 = id0(k,27) + 1
5360 ind11 = id1(k,27) + 1
5364 taug(k,ns27+j) = colamt(k,3) &
5365 & * ( fac00(k)*absa(ind01,j) + fac10(k)*absa(ind02,j) &
5366 & + fac01(k)*absa(ind11,j) + fac11(k)*absa(ind12,j) )
5370 do k = laytrop+1, nlay
5371 ind01 = id0(k,27) + 1
5373 ind11 = id1(k,27) + 1
5377 taug(k,ns27+j) = colamt(k,3) &
5378 & * ( fac00(k)*absb(ind01,j) + fac10(k)*absb(ind02,j) &
5379 & + fac01(k)*absb(ind11,j) + fac11(k)*absb(ind12,j) )
5385 end subroutine taumol27
5402 real (kind=kind_phys) :: speccomb, specmult, tauray, fs, fs1, &
5403 & fac000,fac001,fac010,fac011, fac100,fac101,fac110,fac111
5405 integer :: ind01, ind02, ind03, ind04, ind11, ind12, ind13, ind14
5417 tauray = colmol(k) * rayl
5420 taur(k,ns28+j) = tauray
5425 speccomb = colamt(k,3) + strrat(28)*colamt(k,6)
5426 specmult = 8.0 * min(oneminus, colamt(k,3) / speccomb)
5428 js = 1 + int(specmult)
5429 fs = mod(specmult, f_one)
5431 fac000 = fs1 * fac00(k)
5432 fac010 = fs1 * fac10(k)
5433 fac100 = fs * fac00(k)
5434 fac110 = fs * fac10(k)
5435 fac001 = fs1 * fac01(k)
5436 fac011 = fs1 * fac11(k)
5437 fac101 = fs * fac01(k)
5438 fac111 = fs * fac11(k)
5440 ind01 = id0(k,28) + js
5444 ind11 = id1(k,28) + js
5450 taug(k,ns28+j) = speccomb &
5451 & * ( fac000 * absa(ind01,j) + fac100 * absa(ind02,j) &
5452 & + fac010 * absa(ind03,j) + fac110 * absa(ind04,j) &
5453 & + fac001 * absa(ind11,j) + fac101 * absa(ind12,j) &
5454 & + fac011 * absa(ind13,j) + fac111 * absa(ind14,j) )
5458 do k = laytrop+1, nlay
5459 speccomb = colamt(k,3) + strrat(28)*colamt(k,6)
5460 specmult = 4.0 * min(oneminus, colamt(k,3) / speccomb)
5462 js = 1 + int(specmult)
5463 fs = mod(specmult, f_one)
5465 fac000 = fs1 * fac00(k)
5466 fac010 = fs1 * fac10(k)
5467 fac100 = fs * fac00(k)
5468 fac110 = fs * fac10(k)
5469 fac001 = fs1 * fac01(k)
5470 fac011 = fs1 * fac11(k)
5471 fac101 = fs * fac01(k)
5472 fac111 = fs * fac11(k)
5474 ind01 = id0(k,28) + js
5478 ind11 = id1(k,28) + js
5484 taug(k,ns28+j) = speccomb &
5485 & * ( fac000 * absb(ind01,j) + fac100 * absb(ind02,j) &
5486 & + fac010 * absb(ind03,j) + fac110 * absb(ind04,j) &
5487 & + fac001 * absb(ind11,j) + fac101 * absb(ind12,j) &
5488 & + fac011 * absb(ind13,j) + fac111 * absb(ind14,j) )
5494 end subroutine taumol28
5511 real (kind=kind_phys) :: tauray
5513 integer :: ind01, ind02, ind11, ind12
5514 integer :: inds, indf, indsp, indfp, j, k
5525 tauray = colmol(k) * rayl
5528 taur(k,ns29+j) = tauray
5533 ind01 = id0(k,29) + 1
5535 ind11 = id1(k,29) + 1
5544 taug(k,ns29+j) = colamt(k,1) &
5545 & * ( (fac00(k)*absa(ind01,j) + fac10(k)*absa(ind02,j) &
5546 & + fac01(k)*absa(ind11,j) + fac11(k)*absa(ind12,j) ) &
5547 & + selffac(k) * (selfref(inds,j) + selffrac(k) &
5548 & * (selfref(indsp,j) - selfref(inds,j))) &
5549 & + forfac(k) * (forref(indf,j) + forfrac(k) &
5550 & * (forref(indfp,j) - forref(indf,j)))) &
5551 & + colamt(k,2) * absco2(j)
5555 do k = laytrop+1, nlay
5556 ind01 = id0(k,29) + 1
5558 ind11 = id1(k,29) + 1
5562 taug(k,ns29+j) = colamt(k,2) &
5563 & * ( fac00(k)*absb(ind01,j) + fac10(k)*absb(ind02,j) &
5564 & + fac01(k)*absb(ind11,j) + fac11(k)*absb(ind12,j) ) &
5565 & + colamt(k,1) * absh2o(j)
5571 end subroutine taumol29
5575 end subroutine taumol
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)
subroutine, public rswinit(me, rad_hr_units, inc_minor_gas, iswcliq, isubcsw, iovr, iovr_rand, iovr_maxrand, iovr_max, iovr_dcorr, iovr_exp, iovr_exprand, iswmode, errflg, errmsg)
This subroutine initializes non-varying module variables, conversion factors, and look-up tables.
This module calculates random numbers using the Mersenne twister.
This module contains cloud radiative property coefficients.
This module sets up absorption coefficients for band 16: 2600-3250 cm-1 (low - h2o,...
This module sets up absorption coeffients for band 17: 3250-4000 cm-1 (low - h2o,co2; high - h2o,...
This module sets up absorption coeffients for band 18: 4000-4650 cm-1 (low - h2o,ch4; high - ch4)
This module sets up absorption coeffients for band 19: 4650-5150 cm-1 (low - h2o,co2; high - co2)
This module sets up absorption coeffients for band 20: 5150-6150 cm-1 (low - h2o; high - h2o)
This module sets up absorption coeffients for band 21: 6150-7700 cm-1 (low - h2o,co2; high - h2o,...
This module sets up absorption coeffients for band 22: 7700-8050 cm-1 (low - h2o, o2; high - o2)
This module sets up absorption coeffients for band 23: 8050-12850 cm-1 (low - h2o; high - nothing)
This module sets up absorption coeffients for band 24: 12850-16000 cm-1 (low - h2o,...
This module sets up absorption coeffients for band 25: 16000-22650 cm-1 (low - h2o; high - nothing)
This module sets up absorption coeffients for band 26: 22650-29000 cm-1 (low - nothing; high - nothin...
This module sets up absorption coeffients for band 27: 29000-38000 cm-1 (low - o3; high - o3)
This module sets up absorption coeffients for band 28: 38000-50000 cm-1 (low - o3,...
This module sets up absorption coeffients for band 29: 820-2600 cm-1 (low - h2o; high - co2)
This module is for specifying the band structures and program parameters used by the RRTMG-SW scheme.
This module contains the reference pressures (in logarithm form) at 59 vertical levels (TOA is omitte...
This module contains various indexes and coefficients for SW spectral bands, as well as the spectral ...
This module contains the CCPP-compliant NCEP's modifications of the rrtmg-sw radiation code from aer ...
derived type for special components of surface SW fluxes
derived type for SW fluxes' column profiles (at layer interfaces)
derived type for SW fluxes at surface
derived type for SW fluxes at TOA