albice.f90

来自「CCSM Research Tools: Community Atmospher」· F90 代码 · 共 162 行

F90
162
字号
#include <misc.h>#include <params.h>subroutine albice(lchnk   ,ncol    ,Tair,  snowh   ,coszrs  ,&                  asdir   ,aldir   ,asdif   ,aldif   )!----------------------------------------------------------------------- ! ! Purpose: ! Compute surface albedos!! Method: ! Computes surface albedos for direct/diffuse incident radiation for! two spectral intervals:!   s = 0.2-0.7 micro-meters!   l = 0.7-5.0 micro-meters!! Albedos specified as follows:! Ocean with      Surface albs specified; combined with overlying snow!   sea ice       !! For more details , see Briegleb, Bruce P., 1992: Delta-Eddington! Approximation for Solar Radiation in the NCAR Community Climate Model,! Journal of Geophysical Research, Vol 97, D7, pp7603-7612).! ! Author: CCM1! !-----------------------------------------------------------------------!! $Id: albice.F90,v 1.1.4.2 2002/05/02 21:11:35 rosinski Exp $! $Author: rosinski $!!-----------------------------------------------------------------------  use precision  use ppgrid  use comsrf, only :icefrac,sicthk  use ice_constants  implicit none#include <albedo.h>!------------------------------Arguments--------------------------------  integer , intent(in) :: lchnk            ! chunk identifier  integer , intent(in) :: ncol             ! number of atmospheric columns  real(r8), intent(in) :: Tair(pcols)      ! bottom level air temp  real(r8), intent(in) :: snowh(pcols)     ! Snow depth (liquid water equivalent)  real(r8), intent(in) :: coszrs(pcols)    ! Cosine solar zenith angle  real(r8), intent(out):: asdir(pcols)     ! Srf alb for direct rad   0.2-0.7 micro-ms  real(r8), intent(out):: aldir(pcols)     ! Srf alb for direct rad   0.7-5.0 micro-ms  real(r8), intent(out):: asdif(pcols)     ! Srf alb for diffuse rad  0.2-0.7 micro-ms  real(r8), intent(out):: aldif(pcols)     ! Srf alb for diffuse rad  0.7-5.0 micro-ms      ! albedos for ice in each category  real(r8) :: alvdrn (pcols) ! visible, direct   (fraction)  real(r8) :: alidrn (pcols) ! near-ir, direct   (fraction)  real(r8) :: alvdfn (pcols) ! visible, diffuse  (fraction)  real(r8) :: alidfn (pcols) ! near-ir, diffuse  (fraction)!-----------------------------------------------------------------------!---------------------------Local variables-----------------------------  integer i                 ! Longitude index!-----------------------------------------------------------------------      real (r8), parameter :: albocn = 0.06_dbl_kind  ! ocean albedo      real (r8), parameter :: &           ahmax    = 0.5_dbl_kind,   &! thickns above which ice alb is const,           albicev  = 0.78_dbl_kind,  &! visible ice albedo for h > ahmax           albicei  = 0.36_dbl_kind,  &! near-ir ice albedo for h > ahmax           albsnowv = 0.98_dbl_kind,  &! cold snow albedo, visible           albsnowi = 0.70_dbl_kind,  &! cold snow albedo, near IR           dT_mlt   = 1._dbl_kind,    &! change in temp to give dalb_mlt change           dalb_mlt = -0.075_dbl_kind,&! albedo change per dT_mlt change           dalb_mltv= -0.100_dbl_kind,&! albedo vis change per dT_mlt change in temp for snow           dalb_mlti= -0.150_dbl_kind,&! albedo nir change per dT_mlt change in temp for snow           Tf       = -1.8_dbl_kind    ! hardwired      ! parameter for fractional snow area       real(r8)  fhtan ! factor used in dependence of albedo on ice thickness      real(r8)  vicen(pcols),vsnon(pcols),aicen(pcols),tsfcn(pcols)      real (r8) hi ! ice thickness  (m)      real (r8) hs ! snow thickness (m)      real (r8) snw !      real (r8) albo  ! effective ocean albedo, function of ice thickness      real (r8) asnow ! snow-covered area fraction      real (r8) asnwv ! snow albedo, visible       real (r8) asnwi ! snow albedo, near IR      real (r8) fh ! piecewise linear function of thickness       real (r8) fT ! piecewise linear function of surface temperature      real (r8) dTs ! difference of Tsfc and Timelt!-----------------------------------------------------------------------!! Initialize all sea ice surface albedos to zero!      asdir(:) = 0.      aldir(:) = 0.      asdif(:) = 0.      aldif(:) = 0.      alvdrn(:) = 0.      alidrn(:) = 0.      alvdfn(:) = 0.      alidfn(:) = 0.  fhtan = atan(ahmax*5._dbl_kind)   do i=1,ncol     if (icefrac(i,lchnk) > 0._r8 .and. coszrs(i)>0.0) then        hi  = sicthk(i,lchnk)        snw = snowh(i)*rhofresh/rhos        aicen(i) = icefrac(i,lchnk)        vicen(i) = hi*aicen(i)         !---------------------------------------------------------        ! keep snow/ice boundary above sea level by reducing snow        !---------------------------------------------------------        vsnon(i) = min(snw*aicen(i),p33*vicen(i))        Tsfcn(i) = min(Tair(i)-Tffresh,-p2)   ! deg C               !---------------------------------------------------------        ! make linear temp profile and compute enthalpy        !---------------------------------------------------------        hi = vicen(i) / aicen(i)        hs = vsnon(i) / aicen(i)                ! bare ice, thickness dependence        fh = min(atan(hi*5.)/fhtan,c1)        albo = albocn*(c1-fh)        alvdfn(i) = albicev*fh + albo        alidfn(i) = albicei*fh + albo        ! bare ice, temperature dependence        dTs = Timelt - Tsfcn(i)        fT = min(dTs/dT_mlt-c1,c0)        alvdfn(i) = alvdfn(i) - dalb_mlt*fT        alidfn(i) = alidfn(i) - dalb_mlt*fT        if( hs .gt. 0._r8 ) then           ! fractional area of snow on ice (thickness dependent)           asnow = hs / ( hs + snowpatch )            asnwv = albsnowv           asnwi = albsnowi           ! snow on ice, temperature dependence           asnwv = asnwv - dalb_mltv*fT           asnwi = asnwi - dalb_mlti*fT                      ! combine ice and snow albedos           alvdfn(i) = alvdfn(i)*(c1-asnow) + asnwv*asnow           alidfn(i) = alidfn(i)*(c1-asnow) + asnwi*asnow        endif        alvdrn(i) = alvdfn(i)        alidrn(i) = alidfn(i)     endif  ! aicen > 0._r8     if (icefrac(i,lchnk) > 0._r8 .and. coszrs(i)>0.0) then        asdir(i)  = alvdrn(i)        aldir(i)  = alidrn(i)        asdif(i) = alvdfn(i)        aldif(i) = alidfn(i)     end if  enddo!  returnend subroutine albice

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?