81 use module_iounitdef
, only : niradsf
88 character(40),
parameter :: &
89 & VTAGSFC=
'NCEP-Radiation_surface v5.1 Nov 2012 ' 96 integer,
parameter,
public ::
imxems = 360
98 integer,
parameter,
public ::
jmxems = 180
100 real (kind=kind_phys),
parameter ::
f_zero = 0.0
101 real (kind=kind_phys),
parameter ::
f_one = 1.0
165 integer,
intent(in) :: me
172 logical :: file_exist
173 character :: cline*80
177 if ( me == 0 ) print *,
vtagsfc 184 print *,
' - Using climatology surface albedo scheme for sw' 190 print *,
' - Using MODIS based land surface albedo for sw' 194 print *,
' !! ERROR in Albedo Scheme Setting, IALB=',
ialbflg 204 print *,
' - Using Fixed Surface Emissivity = 1.0 for lw' 207 elseif (
iemslw == 1 )
then 210 if ( .not.
allocated(
idxems) )
then 218 if ( .not. file_exist )
then 220 print *,
' - Using Varying Surface Emissivity for lw' 221 print *,
' Requested data file "',
semis_file,
'" not found!' 222 print *,
' Change to fixed surface emissivity = 1.0 !' 228 open (niradsf,file=
semis_file,form=
'formatted',status=
'old')
231 read (niradsf,12) cline
238 print *,
' - Using Varying Surface Emissivity for lw' 251 print *,
' !! ERROR in Emissivity Scheme Setting, IEMS=',
iemsflg 305 & ( slmsk,snowf,sncovr,snoalb,zorlf,coszf,tsknf,tairf,hprif, &
306 & alvsf,alnsf,alvwf,alnwf,facsf,facwf,fice,tisfc, &
372 integer,
intent(in) :: IMAX
374 real (kind=kind_phys),
dimension(:),
intent(in) :: &
375 & slmsk, snowf, zorlf, coszf, tsknf, tairf, hprif, &
376 & alvsf, alnsf, alvwf, alnwf, facsf, facwf, fice, tisfc, &
380 real (kind=kind_phys),
dimension(IMAX,NF_ALBD),
intent(out) :: &
385 real (kind=kind_phys) :: asnvb, asnnb, asnvd, asnnd, asevb &
386 &, asenb, asevd, asend, fsno, fsea, rfcs, rfcw, flnd &
387 &, asnow, argh, hrgh, fsno0, fsno1, flnd0, fsea0, csnow &
388 &, a1, a2, b1, b2, b3, ab1bm, ab2bm
390 real (kind=kind_phys) ffw, dtgd
406 asnow = 0.02*snowf(i)
407 argh = min(0.50, max(.025, 0.01*zorlf(i)))
408 hrgh = min(
f_one, max(0.20, 1.0577-1.1538e-3*hprif(i) ) )
409 fsno0 = asnow / (argh + asnow) * hrgh
411 fsno1 =
f_one - fsno0
412 flnd0 = min(
f_one, facsf(i)+facwf(i))
421 if (tsknf(i) >= 271.5)
then 424 elseif (tsknf(i) < 271.1)
then 428 a1 = (tsknf(i) - 271.1)**2
430 asend = 0.65 - 3.6875*a1
436 if (nint(slmsk(i)) == 2)
then 437 ffw =
f_one - fice(i)
438 if (ffw <
f_one)
then 446 asnvd = (0.70 + b1) * fice(i) + b3
447 asnnd = (0.60 + b1) * fice(i) + b3
448 asevd = 0.70 * fice(i) + b3
449 asend = 0.60 * fice(i) + b3
458 if (coszf(i) < 0.5)
then 459 csnow = 0.5 * (3.0 / (
f_one+4.0*coszf(i)) -
f_one)
460 asnvb = min( 0.98, asnvd+(1.0-asnvd)*csnow )
461 asnnb = min( 0.98, asnnd+(1.0-asnnd)*csnow )
470 if (coszf(i) > 0.0001)
then 473 rfcs = 2.14 / (
f_one + 1.48*coszf(i))
477 asevb = max(asevd, 0.026/(coszf(i)**1.7+0.065) &
478 & + 0.15 * (coszf(i)-0.1) * (coszf(i)-0.5) &
479 & * (coszf(i)-
f_one))
492 a1 = alvsf(i) * facsf(i)
493 b1 = alvwf(i) * facwf(i)
494 a2 = alnsf(i) * facsf(i)
495 b2 = alnwf(i) * facwf(i)
496 ab1bm = a1*rfcs + b1*rfcw
497 ab2bm = a2*rfcs + b2*rfcw
498 sfcalb(i,1) = min(0.99, ab2bm) *flnd + asenb*fsea + asnnb*fsno
499 sfcalb(i,2) = (a2 + b2) * 0.96 *flnd + asend*fsea + asnnd*fsno
500 sfcalb(i,3) = min(0.99, ab1bm) *flnd + asevb*fsea + asnvb*fsno
501 sfcalb(i,4) = (a1 + b1) * 0.96 *flnd + asevd*fsea + asnvd*fsno
517 if (nint(slmsk(i)) == 2)
then 518 asnow = 0.02*snowf(i)
519 argh = min(0.50, max(.025, 0.01*zorlf(i)))
520 hrgh = min(
f_one, max(0.20, 1.0577-1.1538e-3*hprif(i) ) )
521 fsno0 = asnow / (argh + asnow) * hrgh
524 fsno1 =
f_one - fsno0
525 flnd0 = min(
f_one, facsf(i)+facwf(i))
534 if (tsknf(i) >= 271.5)
then 537 elseif (tsknf(i) < 271.1)
then 541 a1 = (tsknf(i) - 271.1)**2
543 asend = 0.65 - 3.6875*a1
549 if (nint(slmsk(i)) == 2)
then 550 ffw =
f_one - fice(i)
551 if (ffw <
f_one)
then 559 asnvd = (0.70 + b1) * fice(i) + b3
560 asnnd = (0.60 + b1) * fice(i) + b3
561 asevd = 0.70 * fice(i) + b3
562 asend = 0.60 * fice(i) + b3
571 if (nint(slmsk(i)) == 2)
then 572 if (coszf(i) < 0.5)
then 573 csnow = 0.5 * (3.0 / (
f_one+4.0*coszf(i)) -
f_one)
574 asnvb = min( 0.98, asnvd+(
f_one-asnvd)*csnow )
575 asnnb = min( 0.98, asnnd+(
f_one-asnnd)*csnow )
588 if (coszf(i) > 0.0001)
then 592 rfcs = 1.775/(1.0+1.55*coszf(i))
595 asevb = max(asevd, 0.026/(coszf(i)**1.7+0.065) &
596 & + 0.15 * (coszf(i)-0.1) * (coszf(i)-0.5) &
597 & * (coszf(i)-
f_one))
609 ab1bm = min(0.99, alnsf(i)*rfcs)
610 ab2bm = min(0.99, alvsf(i)*rfcs)
611 sfcalb(i,1) = ab1bm *flnd + asenb*fsea + asnnb*fsno
612 sfcalb(i,2) = alnwf(i) *flnd + asend*fsea + asnnd*fsno
613 sfcalb(i,3) = ab2bm *flnd + asevb*fsea + asnvb*fsno
614 sfcalb(i,4) = alvwf(i) *flnd + asevd*fsea + asnvd*fsno
645 & ( xlon,xlat,slmsk,snowf,sncovr,zorlf,tsknf,tairf,hprif, &
693 integer,
intent(in) :: IMAX
695 real (kind=kind_phys),
dimension(:),
intent(in) :: &
696 & xlon,xlat, slmsk, snowf,sncovr, zorlf, tsknf, tairf, hprif
699 real (kind=kind_phys),
dimension(:),
intent(out) :: sfcemis
702 integer :: i, i1, i2, j1, j2, idx
704 real (kind=kind_phys) :: dltg, hdlt, tmp1, tmp2, &
705 & asnow, argh, hrgh, fsno, fsno0, fsno1
711 real (kind=kind_phys) :: emsref(8)
712 data emsref / 0.97, 0.95, 0.94, 0.90, 0.93, 0.96, 0.96, 0.99 /
725 dltg = 360.0 / float(
imxems)
733 lab_do_imax :
do i = 1, imax
735 if ( nint(slmsk(i)) == 0 )
then 737 sfcemis(i) = emsref(1)
739 else if ( nint(slmsk(i)) == 2 )
then 741 sfcemis(i) = emsref(7)
750 if (tmp1 <
f_zero) tmp1 = tmp1 + 360.0
752 lab_do_imxems :
do i1 = 1,
imxems 753 tmp2 = dltg * (i1 - 1) + hdlt
755 if (abs(tmp1-tmp2) <= hdlt)
then 765 lab_do_jmxems :
do j1 = 1,
jmxems 766 tmp2 = 90.0 - dltg * (j1 - 1)
768 if (abs(tmp1-tmp2) <= hdlt)
then 775 idx = max( 2,
idxems(i2,j2) )
776 if ( idx >= 7 ) idx = 2
777 sfcemis(i) = emsref(idx)
784 if (
ialbflg==1 .and. nint(slmsk(i))==1 )
then 787 fsno1 =
f_one - fsno0
788 sfcemis(i) = sfcemis(i)*fsno1 + emsref(8)*fsno0
791 if ( snowf(i) >
f_zero )
then 792 asnow = 0.02*snowf(i)
793 argh = min(0.50, max(.025, 0.01*zorlf(i)))
794 hrgh = min(
f_one, max(0.20, 1.0577-1.1538e-3*hprif(i) ) )
795 fsno0 = asnow / (argh + asnow) * hrgh
796 if (nint(slmsk(i)) == 0 .and. tsknf(i) > 271.2) &
798 fsno1 =
f_one - fsno0
799 sfcemis(i) = sfcemis(i)*fsno1 + emsref(8)*fsno0
integer, save ialbflg
surface albedo scheme control flag
integer, parameter, public jmxems
num of latitude points in global emis-type map
real(kind=kind_phys), parameter con_t0c
temp at 0C (K)
integer, save iemsflg
surface emissivity scheme control flag
integer, dimension(:,:), allocatable idxems
global surface emissivity index array
real(kind=kind_phys), parameter f_zero
integer iemslw
global surface emissivity contrl flag set up in 'sfc_init'
subroutine, public sfc_init
This subroutine is the initialization program for surface radiation related quantities (albedo...
This module contains some the most frequently used math and physics constants for gcm models...
character(40), parameter vtagsfc
real(kind=kind_phys), parameter con_ttp
temp at H2O 3pt (K)
This module defines commonly used control variables/parameters in physics related programs...
real(kind=kind_phys), parameter f_one
subroutine, public setemis
This subroutine computes surface emissivity for LW radiation.
subroutine, public setalb
This subroutine computes four components of surface albedos (i.e., vis-nir, direct-diffused) accordin...
real(kind=kind_phys), parameter con_tice
temp freezing sea (K)
character, save semis_file
external sfc emissivity data table
real(kind=kind_phys), parameter con_pi
integer, parameter, public nf_albd
num of sfc albedo components
integer, parameter, public imxems
num of longitude points in global emis-type map
This module sets up surface albedo for sw radiation and surface emissivity for lw radiation...
real(kind=kind_phys), parameter rad2dg