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, albppert, pertalb, fracl, fraco, fraci, icy, &
352 & ialbflg, con_ttp, &
416 integer,
intent(in) :: imax, 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(:,:),
intent(out) :: sfcalb
440 real (kind=kind_phys) :: asnvb, asnnb, asnvd, asnnd, asevb &
441 &, asenb, asevd, asend, fsno, fsea, rfcs, rfcw, flnd &
442 &, asnow, argh, hrgh, fsno0, fsno1, flnd0, fsea0,
csnow &
443 &, a1, a2, b1, b2, b3, ab1bm, ab2bm, m, s, alpha, beta, albtmp
445 real (kind=kind_phys) :: asevb_wat,asenb_wat,asevd_wat,asend_wat, &
446 & asevb_ice,asenb_ice,asevd_ice,asend_ice
448 real (kind=kind_phys) :: alndnb, alndnd, alndvb, alndvd
450 real (kind=kind_phys) ffw, dtgd, icealb
451 real (kind=kind_phys),
parameter ::
epsln=1.0e-8_kind_phys
453 integer :: i, k, kk, iflag
459 if ( ialbflg == 1 )
then
466 asevb_wat = asevd_wat
467 asenb_wat = asevd_wat
470 if (fraco(i) >
f_zero .and. coszf(i) > 0.0001)
then
471 asevb_wat = max(asevd_wat, 0.026/(coszf(i)**1.7 + 0.065) &
472 & + 0.15 * (coszf(i)-0.1) * (coszf(i)-0.5) &
473 & * (coszf(i)-
f_one))
474 asenb_wat = asevb_wat
479 if (use_cice_alb .and. lakefrac(i) <
epsln)
then
480 icealb = icealbivis(i)
484 if (icealb >
epsln)
then
485 asevd_ice = icealbivis(i)
486 asend_ice = icealbinir(i)
487 asevb_ice = icealbdvis(i)
488 asenb_ice = icealbdnir(i)
490 asnow = 0.02*snodi(i)
491 argh = min(0.50, max(.025, 0.01*zorlf(i)))
492 hrgh = min(
f_one,max(0.20,1.0577-1.1538e-3*hprif(i)))
493 fsno0 = asnow / (argh + asnow) * hrgh
495 if (tsknf(i) > 271.1 .and. tsknf(i) < 271.5)
then
497 a1 = (tsknf(i) - 271.1)**2
498 asevd_ice = 0.7 - 4.0*a1
499 asend_ice = 0.65 - 3.6875*a1
505 asevb_ice = asevd_ice
506 asenb_ice = asend_ice
509 dtgd = max(
f_zero, min(5.0, (con_ttp-tisfc(i)) ))
511 asnvd = (asevd_ice + b1)
512 asnnd = (asend_ice + b1)
513 if (coszf(i) > 0.0001 .and. coszf(i) < 0.5)
then
515 asnvb = min( 0.98, asnvd+(
f_one-asnvd)*
csnow )
516 asnnb = min( 0.98, asnnd+(
f_one-asnnd)*
csnow )
523 asevd_ice = asevd_ice * (1. - fsno0) + asnvd * fsno0
524 asend_ice = asend_ice * (1. - fsno0) + asnnd * fsno0
525 asevb_ice = asevb_ice * (1. - fsno0) + asnvb * fsno0
526 asenb_ice = asenb_ice * (1. - fsno0) + asnnb * fsno0
536 if (fracl(i) >
f_zero)
then
542 fsno1 =
f_one - fsno0
543 flnd0 = min(
f_one, facsf(i)+facwf(i))
548 if (coszf(i) > 0.0001)
then
549 rfcs = 1.775/(1.0+1.55*coszf(i))
555 ab1bm = min(0.99, alnsf(i)*rfcs)
556 ab2bm = min(0.99, alvsf(i)*rfcs)
558 alndnb = ab1bm *flnd + snoalb(i) * fsno
559 alndnd = alnwf(i)*flnd + snoalb(i) * fsno
560 alndvb = ab2bm *flnd + snoalb(i) * fsno
561 alndvd = alvwf(i)*flnd + snoalb(i) * fsno
562 lsmalbdnir(i) = min(0.99,max(0.01,alndnb))
563 lsmalbinir(i) = min(0.99,max(0.01,alndnd))
564 lsmalbdvis(i) = min(0.99,max(0.01,alndvb))
565 lsmalbivis(i) = min(0.99,max(0.01,alndvd))
576 sfcalb(i,1) = min(0.99,max(0.01,alndnb))*fracl(i) &
577 & + asenb_wat*fraco(i) + asenb_ice*fraci(i)
578 sfcalb(i,2) = min(0.99,max(0.01,alndnd))*fracl(i) &
579 & + asend_wat*fraco(i) + asend_ice*fraci(i)
580 sfcalb(i,3) = min(0.99,max(0.01,alndvb))*fracl(i) &
581 & + asevb_wat*fraco(i) + asevb_ice*fraci(i)
582 sfcalb(i,4) = min(0.99,max(0.01,alndvd))*fracl(i) &
583 & + asevd_wat*fraco(i) + asevd_ice*fraci(i)
588 elseif ( ialbflg == 2 )
then
594 asevb_wat = asevd_wat
595 asenb_wat = asevd_wat
598 if (fraco(i) >
f_zero .and. coszf(i) > 0.0001)
then
599 asevb_wat = max(asevd_wat, 0.026/(coszf(i)**1.7 + 0.065) &
600 & + 0.15 * (coszf(i)-0.1) * (coszf(i)-0.5) &
601 & * (coszf(i)-
f_one))
602 asenb_wat = asevb_wat
612 if (use_cice_alb .and. lakefrac(i) <
epsln)
then
613 icealb = icealbivis(i)
620 asevd_ice = icealbivis(i)
621 asend_ice = icealbinir(i)
622 asevb_ice = icealbdvis(i)
623 asenb_ice = icealbdnir(i)
626 asnow = 0.02*snodi(i)
627 argh = min(0.50, max(.025, 0.01*zorlf(i)))
628 hrgh = min(
f_one,max(0.20,1.0577-1.1538e-3*hprif(i)))
629 fsno0 = asnow / (argh + asnow) * hrgh
631 if (tsknf(i) > 271.1 .and. tsknf(i) < 271.5)
then
633 a1 = (tsknf(i) - 271.1)**2
634 asevd_ice = 0.7 - 4.0*a1
635 asend_ice = 0.65 - 3.6875*a1
641 asevb_ice = asevd_ice
642 asenb_ice = asend_ice
646 dtgd = max(
f_zero, min(5.0, (con_ttp-tisfc(i)) ))
648 asnvd = (asevd_ice + b1)
649 asnnd = (asend_ice + b1)
651 if (coszf(i) > 0.0001 .and. coszf(i) < 0.5)
then
653 asnvb = min( 0.98, asnvd+(
f_one-asnvd)*
csnow )
654 asnnb = min( 0.98, asnnd+(
f_one-asnnd)*
csnow )
661 asevd_ice = asevd_ice * (1. - fsno0) + asnvd * fsno0
662 asend_ice = asend_ice * (1. - fsno0) + asnnd * fsno0
663 asevb_ice = asevb_ice * (1. - fsno0) + asnvb * fsno0
664 asenb_ice = asenb_ice * (1. - fsno0) + asnnb * fsno0
677 sfcalb(i,1) = min(0.99,max(0.01,lsmalbdnir(i)))*fracl(i) &
678 & + asenb_wat*fraco(i) + asenb_ice*fraci(i)
679 sfcalb(i,2) = min(0.99,max(0.01,lsmalbinir(i)))*fracl(i) &
680 & + asend_wat*fraco(i) + asend_ice*fraci(i)
681 sfcalb(i,3) = min(0.99,max(0.01,lsmalbdvis(i)))*fracl(i) &
682 & + asevb_wat*fraco(i) + asevb_ice*fraci(i)
683 sfcalb(i,4) = min(0.99,max(0.01,lsmalbivis(i)))*fracl(i) &
684 & + asevd_wat*fraco(i) + asevd_ice*fraci(i)
693 if (pertalb>0.0)
then
699 alpha = m*m*(1.-m)/(s*s)-m
700 beta = alpha*(1.-m)/m
703 call ppfbet(albppert(i),alpha,beta,iflag,albtmp)
704 sfcalb(i,kk) = albtmp
751 & ( lsm,lsm_noahmp,
lsm_ruc,frac_grid,cplice,use_lake_model, &
752 & lakefrac,xlon,xlat,slmsk,snodl,snodi,sncovr,sncovr_ice, &
753 & zorlf,tsknf,tairf,hprif, &
754 & semis_lnd,semis_ice,semis_wat,imax,fracl,fraco,fraci,icy, &
755 & semisbase, sfcemis &
809 integer,
intent(in) :: imax
810 integer,
intent(in) :: lsm, lsm_noahmp,
lsm_ruc
811 logical,
intent(in) :: frac_grid, cplice
812 integer,
dimension(:),
intent(in) :: use_lake_model
813 real (kind=kind_phys),
dimension(:),
intent(in) :: lakefrac
815 real (kind=kind_phys),
dimension(:),
intent(in) :: &
816 & xlon,xlat, slmsk, snodl, snodi, sncovr, sncovr_ice, &
817 & zorlf, tsknf, tairf, hprif
818 real (kind=kind_phys),
dimension(:),
intent(in) :: &
819 & fracl, fraco, fraci
820 real (kind=kind_phys),
dimension(:),
intent(inout) :: &
821 & semis_lnd, semis_ice, semis_wat
822 logical,
dimension(:),
intent(in) :: &
826 real (kind=kind_phys),
dimension(:),
intent(out) :: semisbase
827 real (kind=kind_phys),
dimension(:),
intent(out) :: sfcemis
830 integer :: i, i1, i2, j1, j2, idx
833 real (kind=kind_phys) :: dltg, hdlt, tmp1, tmp2, &
834 & asnow, argh, hrgh, fsno
835 real (kind=kind_phys) :: sfcemis_land, sfcemis_ice
841 real (kind=kind_phys) :: emsref(8)
842 data emsref / 0.97, 0.95, 0.94, 0.90, 0.93, 0.96, 0.96, 0.99 /
849 semis_wat = emsref(1)
852 dltg = 360.0 / float(
imxems)
859 lab_do_imax :
do i = 1, imax
861 if (.not. cplice .or. lakefrac(i) >
f_zero)
then
862 semis_ice(i) = emsref(7)
864 if (fracl(i) <
epsln)
then
866 sfcemis(i) = emsref(1)
868 sfcemis(i) = semis_ice(i)
871 sfcemis(i) = fraco(i)*emsref(1) + fraci(i)*semis_ice(i)
881 if (tmp1 <
f_zero) tmp1 = tmp1 + 360.0
883 lab_do_imxems :
do i1 = 1,
imxems
884 tmp2 = dltg * (i1 - 1) + hdlt
886 if (abs(tmp1-tmp2) <= hdlt)
then
896 lab_do_jmxems :
do j1 = 1,
jmxems
897 tmp2 = 90.0 - dltg * (j1 - 1)
899 if (abs(tmp1-tmp2) <= hdlt)
then
905 idx = max( 2,
idxems(i2,j2) )
906 if ( idx >= 7 ) idx = 2
908 sfcemis(i) = emsref(idx)
910 sfcemis(i) = fracl(i)*emsref(idx) + fraco(i)*emsref(1) &
911 & + fraci(i)*emsref(7)
913 semisbase(i) = sfcemis(i)
914 semis_lnd(i) = emsref(idx)
922 if (fracl(i) >
epsln)
then
923 if (sncovr(i) >
f_zero)
then
924 semis_lnd(i) = semis_lnd(i) * (
f_one - sncovr(i)) &
925 & + emsref(8) * sncovr(i)
926 elseif (snodl(i) >
f_zero)
then
927 asnow = 0.02*snodl(i)
928 argh = min(0.50, max(.025, 0.01*zorlf(i)))
929 hrgh = min(
f_one, max(0.20, 1.0577-1.1538e-3*hprif(i) ) )
930 fsno = min(
f_one, max(
f_zero, asnow/(argh+asnow) * hrgh))
931 semis_lnd(i) = semis_lnd(i)*(
f_one-fsno) + emsref(8)*fsno
934 if (fraci(i) >
epsln .and. &
935 & (lakefrac(i) >
f_zero .or. .not. cplice))
then
936 if (sncovr_ice(i) >
f_zero)
then
937 semis_ice(i) = semis_ice(i) * (
f_one - sncovr_ice(i)) &
938 & + emsref(8) * sncovr_ice(i)
939 elseif (snodi(i) >
f_zero)
then
940 asnow = 0.02*snodi(i)
941 argh = min(0.50, max(.025, 0.01*zorlf(i)))
942 hrgh = min(
f_one, max(0.20, 1.0577-1.1538e-3*hprif(i) ) )
943 fsno = min(
f_one, max(
f_zero, asnow/(argh+asnow) * hrgh))
944 semis_ice(i) = semis_ice(i)*(
f_one-fsno) + emsref(8)*fsno
947 sfcemis(i) = fracl(i)*semis_lnd(i) + fraco(i)*emsref(1) &
948 & + fraci(i)*semis_ice(i)
952 elseif (
iemslw == 2 )
then
956 sfcemis_ice = emsref(7)
960 if (lsm == lsm_noahmp)
then
961 if (.not. cplice .or. lakefrac(i) >
f_zero)
then
962 if (sncovr_ice(i) >
f_zero)
then
963 sfcemis_ice = emsref(7) * (
f_one-sncovr_ice(i)) &
964 & + emsref(8) * sncovr_ice(i)
965 elseif (snodi(i) >
f_zero)
then
966 asnow = 0.02*snodi(i)
967 argh = min(0.50, max(.025,0.01*zorlf(i)))
968 hrgh = min(
f_one,max(0.20,1.0577-1.1538e-3*hprif(i)))
969 fsno = asnow / (argh + asnow) * hrgh
970 sfcemis_ice = emsref(7)*(
f_one-fsno) + emsref(8)*fsno
972 semis_ice(i) = sfcemis_ice
974 sfcemis_ice = semis_ice(i)
977 if (use_lake_model(i)>0)
then
978 if (sncovr_ice(i) >
f_zero)
then
979 sfcemis_ice = emsref(7) * (
f_one-sncovr_ice(i)) &
980 & + emsref(8) * sncovr_ice(i)
981 elseif (snodi(i) >
f_zero)
then
982 asnow = 0.02*snodi(i)
983 argh = min(0.50, max(.025,0.01*zorlf(i)))
984 hrgh = min(
f_one,max(0.20,1.0577-1.1538e-3*hprif(i)))
985 fsno = asnow / (argh + asnow) * hrgh
986 sfcemis_ice = emsref(7)*(
f_one-fsno) + emsref(8)*fsno
988 semis_ice(i) = sfcemis_ice
990 sfcemis_ice = semis_ice(i)
997 sfcemis_land = semis_lnd(i)
1000 sfcemis(i) = fracl(i)*sfcemis_land + fraco(i)*emsref(1) &
1001 & + 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...