4#if defined ICE_MODEL && defined ICE_ALBEDO
49 SUBROUTINE ice_albedo (ng, tile, model)
56 integer,
intent(in) :: ng, tile, model
60 character (len=*),
parameter :: MyFile = &
66 CALL wclock_on (ng, model, 42, __line__, myfile)
68 CALL ice_albedo_tile (ng, tile, model, &
69 & lbi, ubi, lbj, ubj, &
70 & imins, imaxs, jmins, jmaxs, &
71 & liold(ng), linew(ng), &
72# if defined SHORTWAVE && (defined ALBEDO_CURVE || defined ALBEDO_SZO)
78 &
forces(ng) % albedo_ice, &
81 CALL wclock_off (ng, model, 42, __line__, myfile)
85 END SUBROUTINE ice_albedo
88 SUBROUTINE ice_albedo_tile (ng, tile, model, &
89 & LBi, UBi, LBj, UBj, &
90 & IminS, ImaxS, JminS, JmaxS, &
92# if defined SHORTWAVE && (defined ALBEDO_CURVE || defined ALBEDO_SZO)
101 integer,
intent(in) :: ng, tile, model
102 integer,
intent(in) :: LBi, UBi, LBj, UBj
103 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
104 integer,
intent(in) :: liold, linew
107# if defined SHORTWAVE && (defined ALBEDO_CURVE || defined ALBEDO_SZO)
108 real(r8),
intent(in) :: lonr(LBi:,LBj:)
109 real(r8),
intent(in) :: latr(LBi:,LBj:)
111 real(r8),
intent(in) :: Fi(LBi:,LBj:,:)
112 real(r8),
intent(in) :: Si(LBi:,LBj:,:,:)
113 real(r8),
intent(out) :: albedo_ice(LBi:,LBj:)
114 real(r8),
intent(out) :: albedo(LBi:,LBj:)
118# if defined SHORTWAVE && (defined ALBEDO_CURVE || defined ALBEDO_SZO)
119 real(r8),
intent(in) :: lonr(LBi:UBi,LBj:UBj)
120 real(r8),
intent(in) :: latr(LBi:UBi,LBj:UBj)
122 real(r8),
intent(in) :: Fi(LBi:UBi,LBj:UBj,nIceF)
123 real(r8),
intent(in) :: Si(LBi:UBi,LBj:UBj,2,nIceS)
124 real(r8),
intent(out) :: albedo_ice(LBi:UBi,LBj:UBj)
125 real(r8),
intent(out) :: albedo(LBi:UBi,LBj:UBj)
130 integer :: i, j, li_stp
131# if defined ALBEDO_SZO
132 integer :: iday, month, year
135 real(r8),
parameter :: alb_w = 0.06_r8
138 real(r8),
parameter :: alb_i_thick = 0.54_r8
139 real(r8),
parameter :: alb_s_dry = 0.83_r8
140 real(r8),
parameter :: alb_s_wet = 0.70_r8
142 real(r8),
parameter :: alb_i_dry = 0.65_r8
143 real(r8),
parameter :: alb_i_wet = 0.60_r8
144 real(r8),
parameter :: alb_s_dry = 0.85_r8
145 real(r8),
parameter :: alb_s_wet = 0.72_r8
149 real(r8) :: alb_ice, alb_snow, Hice, Hsnow
151# if defined ALBEDO_SZO
152 real(r8) :: Dangle, Hangle, LatRad, zenith
153 real(dp) :: hour, yday
155 real(r8) :: cff, cff1, cff2, sfc_temp
157 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: ice_thick
158 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: snow_thick
160# include "set_bounds.h"
174# if defined ALBEDO_SZO
183 dangle=23.44_r8*cos((172.0_r8-yday)*2.0_r8*
pi/365.25_r8)
188 hangle=(12.0_r8-hour)*
pi/12.0_r8
200 cff=1.0_r8/(si(i,j,li_stp,
isaice)+0.001_r8)
201 ice_thick(i,j)=cff*si(i,j,li_stp,
ishice)
202 snow_thick(i,j)=cff*si(i,j,li_stp,
ishsno)
214 hsnow=snow_thick(i,j)
220 hice=max(hice, 0.01_r8)
221 IF (hice.ge.2.0_r8)
THEN
223 ELSE IF (hice.ge.1.0_r8)
THEN
224 alb_ice=0.07616_r8*hice+0.414492_r8
226 alb_ice=0.082409_r8*log(hice)+0.485472_r8
232 IF (si(i,j,li_stp,
ishmel).gt.0.0_r8)
THEN
233 IF (hsnow.ge.0.1_r8)
THEN
236 alb_snow=alb_ice+(0.701009_r8-alb_ice)*hsnow/0.1_r8
253 IF (si(i,j,li_stp,
ishsno).gt.0.0_r8)
THEN
254 albedo_ice(i,j)=alb_snow
255 ELSE IF (si(i,j,li_stp,
ishmel).gt.0.02_r8)
THEN
256 albedo_ice(i,j)=0.42_r8
258 albedo_ice(i,j)=alb_ice
261 albedo_ice(i,j)=alb_w
264# elif defined ALBEDO_CSIM
268 fhi=min(atan(4.0_r8*ice_thick(i,j))/atan(2.0_r8), 1.0_r8)
269 fsn=snow_thick(i,j)/(snow_thick(i,j)+0.02_r8)
270 alb_i_dry=alb_w*(1-fh)+alb_i_thick*fh
271 cff1=alb_s_wet-alb_s_dry
274 IF (sfc_temp-273.16_r8.gt. -1.0_r8)
THEN
275 alb_snow=cff1*(sfc_temp-272.16_r8)+alb_s_dry
279 IF (sfc_temp-273.16_r8.gt. -1._r8)
THEN
280 alb_ice=cff2*(sfc_temp-272.16_r8)+alb_i_dry
284 albedo_ice(i,j)=fsn*alb_snow+(1-fsn)*alb_ice
286 albedo_ice(i,j)=alb_w
292 cff1=alb_s_wet-alb_s_dry
293 cff2=alb_i_wet-alb_i_dry
295 IF (si(i,j,li_stp,
ishsno).gt.0.0_r8)
THEN
296 IF ((sfc_temp-273.16_r8).gt.-1.0_r8)
THEN
297 albedo_ice(i,j)=cff1*(sfc_temp-272.16_r8)+alb_s_dry
299 albedo_ice(i,j)=alb_s_dry
302 IF ((sfc_temp-273.16_r8).gt.-1.0_r8)
THEN
303 albedo_ice(i,j)=cff2*(sfc_temp-272.16_r8)+alb_i_dry
305 albedo_ice(i,j)=alb_i_dry
309 albedo_ice(i,j)=alb_w
317 albedo(i,j)=0.069_r8- &
318 & 0.011_r8*cos(2.0_r8*
deg2rad*latr(i,j))
320# elif defined ALBEDO_SZO
331 cff1=sin(latrad)*sin(dangle)
332 cff2=cos(latrad)*cos(dangle)
333 zenith=max(cff1+cff2*cos(hangle-lonr(i,j)*
deg2rad &
334 & -
pi/12.0_r8),0.0_r8)
338 albedo(i,j)=0.026_r8/(zenith**1.7_r8+0.065_r8)+ &
339 & 0.15_r8*(zenith-0.1_r8)* &
340 & (zenith-0.5_r8)*(zenith-1.0_r8)
356 & lbi, ubi, lbj, ubj, &
360 & lbi, ubi, lbj, ubj, &
367 & lbi, ubi, lbj, ubj, &
370 & albedo, albedo_ice)
374 END SUBROUTINE ice_albedo_tile
subroutine, public caldate(currenttime, yy_i, yd_i, mm_i, dd_i, h_i, m_i, s_i, yd_dp, dd_dp, h_dp, m_dp, s_dp)
subroutine exchange_r2d_tile(ng, tile, lbi, ubi, lbj, ubj, a)
type(t_forces), dimension(:), allocatable forces
type(t_grid), dimension(:), allocatable grid
integer, parameter ishsno
type(t_ice), dimension(:), allocatable ice
real(r8), dimension(:), allocatable min_ai
integer, parameter ishmel
integer, parameter isaice
integer, parameter ishice
integer, parameter icisst
integer, dimension(:), allocatable iic
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic
real(dp), dimension(:), allocatable tdays
real(dp), parameter deg2rad
logical, dimension(:), allocatable perfectrst
integer, dimension(:), allocatable ntstart
subroutine mp_exchange2d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, nghost, ew_periodic, ns_periodic, a, b, c, d)
recursive subroutine wclock_off(ng, model, region, line, routine)
recursive subroutine wclock_on(ng, model, region, line, routine)