348 & ( slmsk,lsm,lsm_noahmp,
lsm_ruc,use_cice_alb,snodi, &
349 & sncovr,sncovr_ice,snoalb,zorlf,coszf, &
350 & tsknf,tairf,hprif,frac_grid, lakefrac, &
351 & alvsf,alnsf,alvwf,alnwf,facsf,facwf,fice,tisfc, &
352 & lsmalbdvis, lsmalbdnir, lsmalbivis, lsmalbinir, &
353 & icealbdvis, icealbdnir, icealbivis, icealbinir, &
354 & imax, albppert, pertalb, fracl, fraco, fraci, icy, &
355 & ialbflg, con_ttp, &
419 integer,
intent(in) :: imax, ialbflg
420 integer,
intent(in) :: lsm, lsm_noahmp,
lsm_ruc
421 logical,
intent(in) :: use_cice_alb, frac_grid
423 real (kind=kind_phys),
dimension(:),
intent(in) :: &
425 & slmsk, snodi, zorlf, coszf, tsknf, tairf, hprif, &
426 & alvsf, alnsf, alvwf, alnwf, facsf, facwf, fice, tisfc, &
427 & sncovr, sncovr_ice, snoalb, albppert
428 real (kind=kind_phys),
dimension(:),
intent(in),
optional :: &
429 & icealbdvis, icealbdnir, icealbivis, icealbinir
430 real (kind=kind_phys),
intent(in) :: pertalb, con_ttp
431 real (kind=kind_phys),
dimension(:),
intent(in) :: &
432 & fracl, fraco, fraci
433 real (kind=kind_phys),
dimension(:),
intent(inout) :: &
434 & lsmalbdvis, lsmalbdnir, lsmalbivis, lsmalbinir
436 logical,
dimension(:),
intent(in) :: &
440 real (kind=kind_phys),
dimension(:,:),
intent(out) :: sfcalb
443 real (kind=kind_phys) :: asnvb, asnnb, asnvd, asnnd, asevb &
444 &, asenb, asevd, asend, fsno, fsea, rfcs, rfcw, flnd &
445 &, asnow, argh, hrgh, fsno0, fsno1, flnd0, fsea0, csnow &
446 &, a1, a2, b1, b2, b3, ab1bm, ab2bm, m, s, alpha, beta, albtmp
448 real (kind=kind_phys) :: asevb_wat,asenb_wat,asevd_wat,asend_wat, &
449 & asevb_ice,asenb_ice,asevd_ice,asend_ice
451 real (kind=kind_phys) :: alndnb, alndnd, alndvb, alndvd
453 real (kind=kind_phys) ffw, dtgd, icealb
454 real (kind=kind_phys),
parameter :: epsln=1.0e-8_kind_phys
456 integer :: i, k, kk, iflag
462 if ( ialbflg == 1 )
then
469 asevb_wat = asevd_wat
470 asenb_wat = asevd_wat
473 if (fraco(i) > f_zero .and. coszf(i) > 0.0001)
then
474 asevb_wat = max(asevd_wat, 0.026/(coszf(i)**1.7 + 0.065) &
475 & + 0.15 * (coszf(i)-0.1) * (coszf(i)-0.5) &
476 & * (coszf(i)-f_one))
477 asenb_wat = asevb_wat
482 if (use_cice_alb .and. lakefrac(i) < epsln)
then
483 icealb = icealbivis(i)
487 if (icealb > epsln)
then
488 asevd_ice = icealbivis(i)
489 asend_ice = icealbinir(i)
490 asevb_ice = icealbdvis(i)
491 asenb_ice = icealbdnir(i)
493 asnow = 0.02*snodi(i)
494 argh = min(0.50, max(.025, 0.01*zorlf(i)))
495 hrgh = min(f_one,max(0.20,1.0577-1.1538e-3*hprif(i)))
496 fsno0 = asnow / (argh + asnow) * hrgh
498 if (tsknf(i) > 271.1 .and. tsknf(i) < 271.5)
then
500 a1 = (tsknf(i) - 271.1)**2
501 asevd_ice = 0.7 - 4.0*a1
502 asend_ice = 0.65 - 3.6875*a1
508 asevb_ice = asevd_ice
509 asenb_ice = asend_ice
511 if (fsno0 > f_zero)
then
512 dtgd = max(f_zero, min(5.0, (con_ttp-tisfc(i)) ))
514 asnvd = (asevd_ice + b1)
515 asnnd = (asend_ice + b1)
516 if (coszf(i) > 0.0001 .and. coszf(i) < 0.5)
then
517 csnow = 0.5 * (3.0 / (f_one+4.0*coszf(i)) - f_one)
518 asnvb = min( 0.98, asnvd+(f_one-asnvd)*csnow )
519 asnnb = min( 0.98, asnnd+(f_one-asnnd)*csnow )
526 asevd_ice = asevd_ice * (1. - fsno0) + asnvd * fsno0
527 asend_ice = asend_ice * (1. - fsno0) + asnnd * fsno0
528 asevb_ice = asevb_ice * (1. - fsno0) + asnvb * fsno0
529 asenb_ice = asenb_ice * (1. - fsno0) + asnnb * fsno0
539 if (fracl(i) > f_zero)
then
545 fsno1 = f_one - fsno0
546 flnd0 = min(f_one, facsf(i)+facwf(i))
551 if (coszf(i) > 0.0001)
then
552 rfcs = 1.775/(1.0+1.55*coszf(i))
558 ab1bm = min(0.99, alnsf(i)*rfcs)
559 ab2bm = min(0.99, alvsf(i)*rfcs)
561 alndnb = ab1bm *flnd + snoalb(i) * fsno
562 alndnd = alnwf(i)*flnd + snoalb(i) * fsno
563 alndvb = ab2bm *flnd + snoalb(i) * fsno
564 alndvd = alvwf(i)*flnd + snoalb(i) * fsno
565 lsmalbdnir(i) = min(0.99,max(0.01,alndnb))
566 lsmalbinir(i) = min(0.99,max(0.01,alndnd))
567 lsmalbdvis(i) = min(0.99,max(0.01,alndvb))
568 lsmalbivis(i) = min(0.99,max(0.01,alndvd))
579 sfcalb(i,1) = min(0.99,max(0.01,alndnb))*fracl(i) &
580 & + asenb_wat*fraco(i) + asenb_ice*fraci(i)
581 sfcalb(i,2) = min(0.99,max(0.01,alndnd))*fracl(i) &
582 & + asend_wat*fraco(i) + asend_ice*fraci(i)
583 sfcalb(i,3) = min(0.99,max(0.01,alndvb))*fracl(i) &
584 & + asevb_wat*fraco(i) + asevb_ice*fraci(i)
585 sfcalb(i,4) = min(0.99,max(0.01,alndvd))*fracl(i) &
586 & + asevd_wat*fraco(i) + asevd_ice*fraci(i)
591 elseif ( ialbflg == 2 )
then
597 asevb_wat = asevd_wat
598 asenb_wat = asevd_wat
601 if (fraco(i) > f_zero .and. coszf(i) > 0.0001)
then
602 asevb_wat = max(asevd_wat, 0.026/(coszf(i)**1.7 + 0.065) &
603 & + 0.15 * (coszf(i)-0.1) * (coszf(i)-0.5) &
604 & * (coszf(i)-f_one))
605 asenb_wat = asevb_wat
615 if (use_cice_alb .and. lakefrac(i) < epsln)
then
616 icealb = icealbivis(i)
621 if (lsm ==
lsm_ruc .or. icealb > epsln)
then
623 asevd_ice = icealbivis(i)
624 asend_ice = icealbinir(i)
625 asevb_ice = icealbdvis(i)
626 asenb_ice = icealbdnir(i)
629 asnow = 0.02*snodi(i)
630 argh = min(0.50, max(.025, 0.01*zorlf(i)))
631 hrgh = min(f_one,max(0.20,1.0577-1.1538e-3*hprif(i)))
632 fsno0 = asnow / (argh + asnow) * hrgh
634 if (tsknf(i) > 271.1 .and. tsknf(i) < 271.5)
then
636 a1 = (tsknf(i) - 271.1)**2
637 asevd_ice = 0.7 - 4.0*a1
638 asend_ice = 0.65 - 3.6875*a1
644 asevb_ice = asevd_ice
645 asenb_ice = asend_ice
647 if (fsno0 > f_zero)
then
649 dtgd = max(f_zero, min(5.0, (con_ttp-tisfc(i)) ))
651 asnvd = (asevd_ice + b1)
652 asnnd = (asend_ice + b1)
654 if (coszf(i) > 0.0001 .and. coszf(i) < 0.5)
then
655 csnow = 0.5 * (3.0 / (f_one+4.0*coszf(i)) - f_one)
656 asnvb = min( 0.98, asnvd+(f_one-asnvd)*csnow )
657 asnnb = min( 0.98, asnnd+(f_one-asnnd)*csnow )
664 asevd_ice = asevd_ice * (1. - fsno0) + asnvd * fsno0
665 asend_ice = asend_ice * (1. - fsno0) + asnnd * fsno0
666 asevb_ice = asevb_ice * (1. - fsno0) + asnvb * fsno0
667 asenb_ice = asenb_ice * (1. - fsno0) + asnnb * fsno0
680 sfcalb(i,1) = min(0.99,max(0.01,lsmalbdnir(i)))*fracl(i) &
681 & + asenb_wat*fraco(i) + asenb_ice*fraci(i)
682 sfcalb(i,2) = min(0.99,max(0.01,lsmalbinir(i)))*fracl(i) &
683 & + asend_wat*fraco(i) + asend_ice*fraci(i)
684 sfcalb(i,3) = min(0.99,max(0.01,lsmalbdvis(i)))*fracl(i) &
685 & + asevb_wat*fraco(i) + asevb_ice*fraci(i)
686 sfcalb(i,4) = min(0.99,max(0.01,lsmalbivis(i)))*fracl(i) &
687 & + asevd_wat*fraco(i) + asevd_ice*fraci(i)
696 if (pertalb>0.0)
then
702 alpha = m*m*(1.-m)/(s*s)-m
703 beta = alpha*(1.-m)/m
706 call ppfbet(albppert(i),alpha,beta,iflag,albtmp)
707 sfcalb(i,kk) = albtmp
754 & ( lsm,lsm_noahmp,
lsm_ruc,frac_grid,cplice,use_lake_model, &
755 & lakefrac,xlon,xlat,slmsk,snodl,snodi,sncovr,sncovr_ice, &
756 & zorlf,tsknf,tairf,hprif, &
757 & semis_lnd,semis_ice,semis_wat,imax,fracl,fraco,fraci,icy, &
758 & semisbase, sfcemis &
812 integer,
intent(in) :: imax
813 integer,
intent(in) :: lsm, lsm_noahmp,
lsm_ruc
814 logical,
intent(in) :: frac_grid, cplice
815 integer,
dimension(:),
intent(in) :: use_lake_model
816 real (kind=kind_phys),
dimension(:),
intent(in) :: lakefrac
818 real (kind=kind_phys),
dimension(:),
intent(in) :: &
819 & xlon,xlat, slmsk, snodl, snodi, sncovr, sncovr_ice, &
820 & zorlf, tsknf, tairf, hprif
821 real (kind=kind_phys),
dimension(:),
intent(in) :: &
822 & fracl, fraco, fraci
823 real (kind=kind_phys),
dimension(:),
intent(inout) :: &
824 & semis_lnd, semis_ice, semis_wat
825 logical,
dimension(:),
intent(in) :: &
829 real (kind=kind_phys),
dimension(:),
intent(out) :: semisbase
830 real (kind=kind_phys),
dimension(:),
intent(out) :: sfcemis
833 integer :: i, i1, i2, j1, j2, idx
836 real (kind=kind_phys) :: dltg, hdlt, tmp1, tmp2, &
837 & asnow, argh, hrgh, fsno
838 real (kind=kind_phys) :: sfcemis_land, sfcemis_ice
844 real (kind=kind_phys) :: emsref(8)
845 data emsref / 0.97, 0.95, 0.94, 0.90, 0.93, 0.96, 0.96, 0.99 /
852 semis_wat = emsref(1)
853 if ( iemslw == 1 )
then
855 dltg = 360.0 / float(imxems)
862 lab_do_imax :
do i = 1, imax
864 if (.not. cplice .or. lakefrac(i) > f_zero)
then
865 semis_ice(i) = emsref(7)
867 if (fracl(i) < epsln)
then
868 if ( abs(fraco(i)-f_one) < epsln )
then
869 sfcemis(i) = emsref(1)
870 elseif ( abs(fraci(i)-f_one) < epsln )
then
871 sfcemis(i) = semis_ice(i)
874 sfcemis(i) = fraco(i)*emsref(1) + fraci(i)*semis_ice(i)
883 tmp1 = xlon(i) * rad2dg
884 if (tmp1 < f_zero) tmp1 = tmp1 + 360.0
886 lab_do_imxems :
do i1 = 1, imxems
887 tmp2 = dltg * (i1 - 1) + hdlt
889 if (abs(tmp1-tmp2) <= hdlt)
then
896 tmp1 = xlat(i) * rad2dg
899 lab_do_jmxems :
do j1 = 1, jmxems
900 tmp2 = 90.0 - dltg * (j1 - 1)
902 if (abs(tmp1-tmp2) <= hdlt)
then
908 idx = max( 2, idxems(i2,j2) )
909 if ( idx >= 7 ) idx = 2
910 if (abs(fracl(i)-f_one) < epsln)
then
911 sfcemis(i) = emsref(idx)
913 sfcemis(i) = fracl(i)*emsref(idx) + fraco(i)*emsref(1) &
914 & + fraci(i)*emsref(7)
916 semisbase(i) = sfcemis(i)
917 semis_lnd(i) = emsref(idx)
925 if (fracl(i) > epsln)
then
926 if (sncovr(i) > f_zero)
then
927 semis_lnd(i) = semis_lnd(i) * (f_one - sncovr(i)) &
928 & + emsref(8) * sncovr(i)
929 elseif (snodl(i) > f_zero)
then
930 asnow = 0.02*snodl(i)
931 argh = min(0.50, max(.025, 0.01*zorlf(i)))
932 hrgh = min(f_one, max(0.20, 1.0577-1.1538e-3*hprif(i) ) )
933 fsno = min(f_one, max(f_zero, asnow/(argh+asnow) * hrgh))
934 semis_lnd(i) = semis_lnd(i)*(f_one-fsno) + emsref(8)*fsno
937 if (fraci(i) > epsln .and. &
938 & (lakefrac(i) > f_zero .or. .not. cplice))
then
939 if (sncovr_ice(i) > f_zero)
then
940 semis_ice(i) = semis_ice(i) * (f_one - sncovr_ice(i)) &
941 & + emsref(8) * sncovr_ice(i)
942 elseif (snodi(i) > f_zero)
then
943 asnow = 0.02*snodi(i)
944 argh = min(0.50, max(.025, 0.01*zorlf(i)))
945 hrgh = min(f_one, max(0.20, 1.0577-1.1538e-3*hprif(i) ) )
946 fsno = min(f_one, max(f_zero, asnow/(argh+asnow) * hrgh))
947 semis_ice(i) = semis_ice(i)*(f_one-fsno) + emsref(8)*fsno
950 sfcemis(i) = fracl(i)*semis_lnd(i) + fraco(i)*emsref(1) &
951 & + fraci(i)*semis_ice(i)
955 elseif ( iemslw == 2 )
then
959 sfcemis_ice = emsref(7)
963 if (lsm == lsm_noahmp)
then
964 if (.not. cplice .or. lakefrac(i) > f_zero)
then
965 if (sncovr_ice(i) > f_zero)
then
966 sfcemis_ice = emsref(7) * (f_one-sncovr_ice(i)) &
967 & + emsref(8) * sncovr_ice(i)
968 elseif (snodi(i) > f_zero)
then
969 asnow = 0.02*snodi(i)
970 argh = min(0.50, max(.025,0.01*zorlf(i)))
971 hrgh = min(f_one,max(0.20,1.0577-1.1538e-3*hprif(i)))
972 fsno = asnow / (argh + asnow) * hrgh
973 sfcemis_ice = emsref(7)*(f_one-fsno) + emsref(8)*fsno
975 semis_ice(i) = sfcemis_ice
977 sfcemis_ice = semis_ice(i)
980 if (use_lake_model(i)>0)
then
981 if (sncovr_ice(i) > f_zero)
then
982 sfcemis_ice = emsref(7) * (f_one-sncovr_ice(i)) &
983 & + emsref(8) * sncovr_ice(i)
984 elseif (snodi(i) > f_zero)
then
985 asnow = 0.02*snodi(i)
986 argh = min(0.50, max(.025,0.01*zorlf(i)))
987 hrgh = min(f_one,max(0.20,1.0577-1.1538e-3*hprif(i)))
988 fsno = asnow / (argh + asnow) * hrgh
989 sfcemis_ice = emsref(7)*(f_one-fsno) + emsref(8)*fsno
991 semis_ice(i) = sfcemis_ice
993 sfcemis_ice = semis_ice(i)
1000 sfcemis_land = semis_lnd(i)
1003 sfcemis(i) = fracl(i)*sfcemis_land + fraco(i)*emsref(1) &
1004 & + fraci(i)*sfcemis_ice
subroutine, public setalb(slmsk, lsm, lsm_noahmp, lsm_ruc, use_cice_alb, snodi, sncovr, sncovr_ice, snoalb, zorlf, coszf, tsknf, tairf, hprif, frac_grid, lakefrac, alvsf, alnsf, alvwf, alnwf, facsf, facwf, fice, tisfc, lsmalbdvis, lsmalbdnir, lsmalbivis, lsmalbinir, icealbdvis, icealbdnir, icealbivis, icealbinir, imax, albppert, pertalb, fracl, fraco, fraci, icy, ialbflg, con_ttp, sfcalb)
This subroutine computes four components of surface albedos (i.e., vis-nir, direct-diffused) accordin...