345 & ( slmsk,lsm,lsm_noahmp,
lsm_ruc,use_cice_alb,snodi, &
346 & sncovr,sncovr_ice,snoalb,zorlf,coszf, &
347 & tsknf,tairf,hprif,frac_grid, lakefrac, &
348 & alvsf,alnsf,alvwf,alnwf,facsf,facwf,fice,tisfc, &
349 & lsmalbdvis, lsmalbdnir, lsmalbivis, lsmalbinir, &
350 & icealbdvis, icealbdnir, icealbivis, icealbinir, &
351 & imax, nf_albd, albppert, pertalb, fracl, fraco, fraci, icy,&
352 & ialbflg, con_ttp, &
416 integer,
intent(in) :: imax, nf_albd, ialbflg
417 integer,
intent(in) :: lsm, lsm_noahmp,
lsm_ruc
418 logical,
intent(in) :: use_cice_alb, frac_grid
420 real (kind=kind_phys),
dimension(:),
intent(in) :: &
422 & slmsk, snodi, zorlf, coszf, tsknf, tairf, hprif, &
423 & alvsf, alnsf, alvwf, alnwf, facsf, facwf, fice, tisfc, &
424 & sncovr, sncovr_ice, snoalb, albppert
425 real (kind=kind_phys),
dimension(:),
intent(in),
optional :: &
426 & icealbdvis, icealbdnir, icealbivis, icealbinir
427 real (kind=kind_phys),
intent(in) :: pertalb, con_ttp
428 real (kind=kind_phys),
dimension(:),
intent(in) :: &
429 & fracl, fraco, fraci
430 real (kind=kind_phys),
dimension(:),
intent(inout) :: &
431 & lsmalbdvis, lsmalbdnir, lsmalbivis, lsmalbinir
433 logical,
dimension(:),
intent(in) :: &
437 real (kind=kind_phys),
dimension(IMAX,NF_ALBD),
intent(out) :: &
441 real (kind=kind_phys) :: asnvb, asnnb, asnvd, asnnd, asevb &
442 &, asenb, asevd, asend, fsno, fsea, rfcs, rfcw, flnd &
443 &, asnow, argh, hrgh, fsno0, fsno1, flnd0, fsea0,
csnow &
444 &, a1, a2, b1, b2, b3, ab1bm, ab2bm, m, s, alpha, beta, albtmp
446 real (kind=kind_phys) :: asevb_wat,asenb_wat,asevd_wat,asend_wat, &
447 & asevb_ice,asenb_ice,asevd_ice,asend_ice
449 real (kind=kind_phys) :: alndnb, alndnd, alndvb, alndvd
451 real (kind=kind_phys) ffw, dtgd, icealb
452 real (kind=kind_phys),
parameter ::
epsln=1.0e-8_kind_phys
454 integer :: i, k, kk, iflag
460 if ( ialbflg == 1 )
then
467 asevb_wat = asevd_wat
468 asenb_wat = asevd_wat
471 if (fraco(i) >
f_zero .and. coszf(i) > 0.0001)
then
472 asevb_wat = max(asevd_wat, 0.026/(coszf(i)**1.7 + 0.065) &
473 & + 0.15 * (coszf(i)-0.1) * (coszf(i)-0.5) &
474 & * (coszf(i)-
f_one))
475 asenb_wat = asevb_wat
480 if (use_cice_alb .and. lakefrac(i) <
epsln)
then
481 icealb = icealbivis(i)
485 if (icealb >
epsln)
then
486 asevd_ice = icealbivis(i)
487 asend_ice = icealbinir(i)
488 asevb_ice = icealbdvis(i)
489 asenb_ice = icealbdnir(i)
491 asnow = 0.02*snodi(i)
492 argh = min(0.50, max(.025, 0.01*zorlf(i)))
493 hrgh = min(
f_one,max(0.20,1.0577-1.1538e-3*hprif(i)))
494 fsno0 = asnow / (argh + asnow) * hrgh
496 if (tsknf(i) > 271.1 .and. tsknf(i) < 271.5)
then
498 a1 = (tsknf(i) - 271.1)**2
499 asevd_ice = 0.7 - 4.0*a1
500 asend_ice = 0.65 - 3.6875*a1
506 asevb_ice = asevd_ice
507 asenb_ice = asend_ice
510 dtgd = max(
f_zero, min(5.0, (con_ttp-tisfc(i)) ))
512 asnvd = (asevd_ice + b1)
513 asnnd = (asend_ice + b1)
514 if (coszf(i) > 0.0001 .and. coszf(i) < 0.5)
then
516 asnvb = min( 0.98, asnvd+(
f_one-asnvd)*
csnow )
517 asnnb = min( 0.98, asnnd+(
f_one-asnnd)*
csnow )
524 asevd_ice = asevd_ice * (1. - fsno0) + asnvd * fsno0
525 asend_ice = asend_ice * (1. - fsno0) + asnnd * fsno0
526 asevb_ice = asevb_ice * (1. - fsno0) + asnvb * fsno0
527 asenb_ice = asenb_ice * (1. - fsno0) + asnnb * fsno0
537 if (fracl(i) >
f_zero)
then
543 fsno1 =
f_one - fsno0
544 flnd0 = min(
f_one, facsf(i)+facwf(i))
549 if (coszf(i) > 0.0001)
then
550 rfcs = 1.775/(1.0+1.55*coszf(i))
556 ab1bm = min(0.99, alnsf(i)*rfcs)
557 ab2bm = min(0.99, alvsf(i)*rfcs)
559 alndnb = ab1bm *flnd + snoalb(i) * fsno
560 alndnd = alnwf(i)*flnd + snoalb(i) * fsno
561 alndvb = ab2bm *flnd + snoalb(i) * fsno
562 alndvd = alvwf(i)*flnd + snoalb(i) * fsno
563 lsmalbdnir(i) = min(0.99,max(0.01,alndnb))
564 lsmalbinir(i) = min(0.99,max(0.01,alndnd))
565 lsmalbdvis(i) = min(0.99,max(0.01,alndvb))
566 lsmalbivis(i) = min(0.99,max(0.01,alndvd))
577 sfcalb(i,1) = min(0.99,max(0.01,alndnb))*fracl(i) &
578 & + asenb_wat*fraco(i) + asenb_ice*fraci(i)
579 sfcalb(i,2) = min(0.99,max(0.01,alndnd))*fracl(i) &
580 & + asend_wat*fraco(i) + asend_ice*fraci(i)
581 sfcalb(i,3) = min(0.99,max(0.01,alndvb))*fracl(i) &
582 & + asevb_wat*fraco(i) + asevb_ice*fraci(i)
583 sfcalb(i,4) = min(0.99,max(0.01,alndvd))*fracl(i) &
584 & + asevd_wat*fraco(i) + asevd_ice*fraci(i)
589 elseif ( ialbflg == 2 )
then
595 asevb_wat = asevd_wat
596 asenb_wat = asevd_wat
599 if (fraco(i) >
f_zero .and. coszf(i) > 0.0001)
then
600 asevb_wat = max(asevd_wat, 0.026/(coszf(i)**1.7 + 0.065) &
601 & + 0.15 * (coszf(i)-0.1) * (coszf(i)-0.5) &
602 & * (coszf(i)-
f_one))
603 asenb_wat = asevb_wat
613 if (use_cice_alb .and. lakefrac(i) <
epsln)
then
614 icealb = icealbivis(i)
621 asevd_ice = icealbivis(i)
622 asend_ice = icealbinir(i)
623 asevb_ice = icealbdvis(i)
624 asenb_ice = icealbdnir(i)
627 asnow = 0.02*snodi(i)
628 argh = min(0.50, max(.025, 0.01*zorlf(i)))
629 hrgh = min(
f_one,max(0.20,1.0577-1.1538e-3*hprif(i)))
630 fsno0 = asnow / (argh + asnow) * hrgh
632 if (tsknf(i) > 271.1 .and. tsknf(i) < 271.5)
then
634 a1 = (tsknf(i) - 271.1)**2
635 asevd_ice = 0.7 - 4.0*a1
636 asend_ice = 0.65 - 3.6875*a1
642 asevb_ice = asevd_ice
643 asenb_ice = asend_ice
647 dtgd = max(
f_zero, min(5.0, (con_ttp-tisfc(i)) ))
649 asnvd = (asevd_ice + b1)
650 asnnd = (asend_ice + b1)
652 if (coszf(i) > 0.0001 .and. coszf(i) < 0.5)
then
654 asnvb = min( 0.98, asnvd+(
f_one-asnvd)*
csnow )
655 asnnb = min( 0.98, asnnd+(
f_one-asnnd)*
csnow )
662 asevd_ice = asevd_ice * (1. - fsno0) + asnvd * fsno0
663 asend_ice = asend_ice * (1. - fsno0) + asnnd * fsno0
664 asevb_ice = asevb_ice * (1. - fsno0) + asnvb * fsno0
665 asenb_ice = asenb_ice * (1. - fsno0) + asnnb * fsno0
678 sfcalb(i,1) = min(0.99,max(0.01,lsmalbdnir(i)))*fracl(i) &
679 & + asenb_wat*fraco(i) + asenb_ice*fraci(i)
680 sfcalb(i,2) = min(0.99,max(0.01,lsmalbinir(i)))*fracl(i) &
681 & + asend_wat*fraco(i) + asend_ice*fraci(i)
682 sfcalb(i,3) = min(0.99,max(0.01,lsmalbdvis(i)))*fracl(i) &
683 & + asevb_wat*fraco(i) + asevb_ice*fraci(i)
684 sfcalb(i,4) = min(0.99,max(0.01,lsmalbivis(i)))*fracl(i) &
685 & + asevd_wat*fraco(i) + asevd_ice*fraci(i)
694 if (pertalb>0.0)
then
700 alpha = m*m*(1.-m)/(s*s)-m
701 beta = alpha*(1.-m)/m
704 call ppfbet(albppert(i),alpha,beta,iflag,albtmp)
705 sfcalb(i,kk) = albtmp
752 & ( lsm,lsm_noahmp,
lsm_ruc,frac_grid,cplice,use_lake_model, &
753 & lakefrac,xlon,xlat,slmsk,snodl,snodi,sncovr,sncovr_ice, &
754 & zorlf,tsknf,tairf,hprif, &
755 & semis_lnd,semis_ice,semis_wat,imax,fracl,fraco,fraci,icy, &
756 & 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)
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
869 sfcemis(i) = emsref(1)
871 sfcemis(i) = semis_ice(i)
874 sfcemis(i) = fraco(i)*emsref(1) + fraci(i)*semis_ice(i)
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
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
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, nf_albd, 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...