7 tpsnow,ptg,pperm_snow_frac,ksnow)
44 xaglamax, xaglamin, xhgla, &
56 USE yomhook
,ONLY : lhook, dr_hook
57 USE parkind1
,ONLY : jprb
64 TYPE(isba_t
),
INTENT(INOUT) :: i
67 REAL,
DIMENSION(:,:),
INTENT(IN):: ptg
68 REAL,
DIMENSION(:,:),
INTENT(IN):: pperm_snow_frac
69 INTEGER,
INTENT(IN):: ksnow
73 REAL,
PARAMETER :: zrhol1 = 150.
78 REAL,
DIMENSION(:),
ALLOCATABLE :: zwsnow_perm
79 REAL,
DIMENSION(:),
ALLOCATABLE :: zwsnow
80 REAL,
DIMENSION(:),
ALLOCATABLE :: zd
81 REAL,
DIMENSION(:,:),
ALLOCATABLE :: zdepth
82 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: zt
83 REAL,
DIMENSION(:),
ALLOCATABLE :: zpsn
84 REAL,
DIMENSION(:,:),
ALLOCATABLE :: zwat
86 LOGICAL,
DIMENSION(:,:),
ALLOCATABLE :: gwork
92 REAL(KIND=JPRB) :: zhook_handle
103 IF (lhook) CALL dr_hook(
'PREP_PERM_SNOW',0,zhook_handle)
106 IF(tpsnow%SCHEME==
'3-L'.OR.tpsnow%SCHEME==
'CRO')
THEN
110 ALLOCATE(zpsn(
SIZE(ptg,1)))
111 zpsn(:) = min( pperm_snow_frac(:,nvt_snow) , 0.9999 )
115 IF (all(zpsn(:)==0.))
THEN
117 IF (lhook) CALL dr_hook(
'PREP_PERM_SNOW',1,zhook_handle)
123 ALLOCATE(zwsnow_perm(
SIZE(ptg,1)))
130 zwsnow_perm(:) = min(zwsnow_perm(:),xhgla * zrhosmax )
133 zwsnow_perm(:) = min(zwsnow_perm(:),2.0 * zrhosmax )
139 IF(.NOT.i%LGLACIER)
THEN
140 WHERE(ptg(:,
SIZE(ptg,2))>xtt+5.) zwsnow_perm(:) = 0.
150 ALLOCATE(gwork(
SIZE(ptg,1),tpsnow%NLAYER))
152 DO jlayer=1,tpsnow%NLAYER
154 gwork(:,jlayer)=.false.
157 WHERE(zwsnow_perm(:)>0.)gwork(:,jlayer)=.true.
159 WHERE(zwsnow_perm(:)>0..AND.tpsnow%WSNOW(:,jlayer,ksnow)==0.)gwork(:,jlayer)=.true.
164 WHERE(gwork(:,jlayer))
165 tpsnow%RHO(:,jlayer,ksnow) = zrhosmax
171 WHERE(gwork(:,jlayer))
172 tpsnow%ALB(:,ksnow) = (xaglamax+xaglamin)/2.0
175 WHERE(gwork(:,jlayer))
176 tpsnow%ALB(:,ksnow) = (xansmax+xansmin)/2.0
182 IF (tpsnow%SCHEME==
'3-L'.OR.tpsnow%SCHEME==
'CRO')
THEN
186 IF(i%LGLACIER.AND.tpsnow%NLAYER>=6)
THEN
188 tpsnow%RHO(:,1,ksnow) = zrhol1
190 IF(tpsnow%NLAYER>=6.AND.tpsnow%NLAYER<12)
THEN
192 tpsnow%RHO(:,2,ksnow) = zrhol1 + 100.
195 tpsnow%RHO(:,3,ksnow) = zrhol1 + 250.
198 DO jlayer=2,tpsnow%NLAYER
199 WHERE(gwork(:,jlayer))
200 tpsnow%RHO(:,jlayer,ksnow) = min(zrhosmax,tpsnow%RHO(:,jlayer-1,ksnow)+100.)
208 DO jlayer=1,tpsnow%NLAYER/4
209 WHERE(gwork(:,jlayer))
210 tpsnow%AGE(:,jlayer,ksnow) = 365.0*float(jlayer-1)/ &
214 DO jlayer=1+tpsnow%NLAYER/4,tpsnow%NLAYER
215 WHERE(gwork(:,jlayer))
216 tpsnow%AGE(:,jlayer,ksnow) = 3650.*float(jlayer-1)/ &
222 WHERE(gwork(:,:))tpsnow%AGE(:,:,ksnow) = 0.0
227 IF (tpsnow%SCHEME==
'CRO')
THEN
228 DO jlayer=1,tpsnow%NLAYER/4
229 WHERE(gwork(:,jlayer))
230 tpsnow%GRAN1(:,jlayer,ksnow) = min(-1.,-99.* &
231 (1.-4*float(jlayer)/float(tpsnow%NLAYER)))
232 tpsnow%GRAN2(:,jlayer,ksnow) = 50.
233 tpsnow%HIST(:,jlayer,ksnow) = 0
236 DO jlayer=1+tpsnow%NLAYER/4,tpsnow%NLAYER
237 WHERE(gwork(:,jlayer))
238 tpsnow%GRAN1(:,jlayer,ksnow) = 99.
239 tpsnow%GRAN2(:,jlayer,ksnow) = 0.0003
240 tpsnow%HIST(:,jlayer,ksnow) = 0
252 ALLOCATE(zwsnow(
SIZE(ptg,1)))
254 DO jlayer=1,tpsnow%NLAYER
255 zwsnow(:) = zwsnow(:) + tpsnow%WSNOW(:,jlayer,ksnow)
260 zwsnow_perm(:) = max(zwsnow_perm(:),zwsnow(:))
264 ALLOCATE(zd(
SIZE(ptg,1)))
266 DO jlayer=1,tpsnow%NLAYER
267 zd(:) = zd(:) + tpsnow%WSNOW(:,jlayer,ksnow)/tpsnow%RHO(:,jlayer,ksnow)
269 zd(:) = zd(:) + (zwsnow_perm(:)-zwsnow(:))/zrhosmax
273 SELECT CASE(tpsnow%SCHEME)
274 CASE(
'D95',
'1-L',
'EBA')
277 WHERE(zwsnow(:)>=0..AND.tpsnow%WSNOW(:,1,ksnow)/=xundef)gwork(:,1)=.true.
279 WHERE(zwsnow(:)==0..AND.tpsnow%WSNOW(:,1,ksnow)/=xundef)gwork(:,1)=.true.
282 tpsnow%WSNOW(:,1,ksnow) = zwsnow_perm(:)
286 ALLOCATE(zdepth(
SIZE(ptg,1),tpsnow%NLAYER))
288 DO jlayer=1,tpsnow%NLAYER
289 WHERE(zwsnow(:)>= 0. .AND. tpsnow%WSNOW(:,jlayer,ksnow)/=xundef)
290 tpsnow%WSNOW(:,jlayer,ksnow) = zdepth(:,jlayer) * tpsnow%RHO(:,jlayer,ksnow)
303 ALLOCATE(zt(
SIZE(tpsnow%WSNOW,1),
SIZE(tpsnow%WSNOW,2),
SIZE(tpsnow%WSNOW,3)))
305 SELECT CASE(tpsnow%SCHEME)
307 zt(:,:,:) = tpsnow%T (:,:,:)
314 DO jlayer=1,tpsnow%NLAYER
316 gwork(:,jlayer)=.false.
319 WHERE(zwsnow_perm(:)>0.)gwork(:,jlayer)=.true.
321 WHERE(zwsnow_perm(:)>0. .AND. zwsnow(:)==0)gwork(:,jlayer)=.true.
324 WHERE(gwork(:,jlayer))
325 zt(:,jlayer,ksnow) = min(ptg(:,
SIZE(ptg,2)),xtt)
331 SELECT CASE(tpsnow%SCHEME)
333 tpsnow%T (:,:,:) = zt(:,:,:)
347 ALLOCATE(zwat(
SIZE(ptg,1),
SIZE(ptg,2)))
351 IF (i%CISBA ==
'DIF')
THEN
352 iwork=i%NGROUND_LAYER
353 zwat(:,:)=i%XWFC(:,:)
356 zwat(:,:)=i%XWSAT(:,:)
360 WHERE(pperm_snow_frac(:,nvt_snow)>0.0)
361 i%XWGI(:,jlayer,ksnow) = max(i%XWGI(:,jlayer,ksnow),zwat(:,jlayer)*zpsn(:))
362 i%XWG (:,jlayer,ksnow) = min(i%XWG (:,jlayer,ksnow),max(i%XWSAT(:,jlayer)-i%XWGI(:,jlayer,ksnow),xwgmin))
364 WHERE(i%XWG(:,jlayer,ksnow) /= xundef .AND. (i%XWG(:,jlayer,ksnow) + i%XWGI(:,jlayer,ksnow)) > i%XWSAT(:,jlayer) )
365 i%XWGI(:,jlayer,ksnow) = i%XWSAT(:,jlayer)-i%XWG (:,jlayer,ksnow)
380 IF (lhook) CALL dr_hook(
'PREP_PERM_SNOW',1,zhook_handle)
subroutine mkflag_snow(TPSNOW)
real function, dimension(size(ppsng)) wsnow_from_snow_frac_ground(PPSNG)
subroutine prep_perm_snow(I, TPSNOW, PTG, PPERM_SNOW_FRAC, KSNOW)