42 USE modd_data_cover_par
, ONLY : nvt_snow
43 USE modd_snow_par
, ONLY : xrhosmax, xansmax, xansmin, &
44 xaglamax, xaglamin, xhgla, &
48 USE modd_isba_par
, ONLY : xwgmin
50 USE modi_vegtype_to_patch
76 REAL,
PARAMETER :: ZRHOL1 = 150.
81 REAL,
DIMENSION(:),
ALLOCATABLE :: ZWSNOW_PERM
82 REAL,
DIMENSION(:),
ALLOCATABLE :: ZWSNOW
83 REAL,
DIMENSION(:),
ALLOCATABLE :: ZD
84 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZDEPTH
85 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZT
86 REAL,
DIMENSION(:),
ALLOCATABLE :: ZPSN
87 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZWAT
89 LOGICAL,
DIMENSION(:,:),
ALLOCATABLE :: GWORK
93 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
98 REAL,
DIMENSION(0:NPROC-1) :: ZPSN0
103 REAL(KIND=JPRB) :: ZHOOK_HANDLE
114 IF (
lhook)
CALL dr_hook(
'PREP_PERM_SNOW',0,zhook_handle)
117 IF(pek%TSNOW%SCHEME==
'3-L'.OR.pek%TSNOW%SCHEME==
'CRO')
THEN 121 ALLOCATE(zpsn(
SIZE(pek%XTG,1)))
123 zpsn(:) = min( pk%XVEGTYPE_PATCH(:,nvt_snow) , 0.9999 )
127 zsum_psn =
sum(zpsn(:))
130 CALL mpi_allgather(zsum_psn,kind(zsum_psn)/4,mpi_real,&
131 zpsn0,kind(zpsn0)/4,mpi_real,
ncomm,infompi)
137 IF (all(zpsn0(:)==0.))
THEN 139 IF (
lhook)
CALL dr_hook(
'PREP_PERM_SNOW',1,zhook_handle)
145 ALLOCATE(zwsnow_perm(
SIZE(pek%XTG,1)))
152 zwsnow_perm(:) = min(zwsnow_perm(:),xhgla * zrhosmax )
155 zwsnow_perm(:) = min(zwsnow_perm(:),2.0 * zrhosmax )
161 IF(.NOT.io%LGLACIER)
THEN 162 WHERE(pek%XTG(:,
SIZE(pek%XTG,2))>
xtt+5.) zwsnow_perm(:) = 0.
172 ALLOCATE(gwork(
SIZE(pek%XTG,1),pek%TSNOW%NLAYER))
174 DO jl=1,pek%TSNOW%NLAYER
179 WHERE(zwsnow_perm(:)>0.)gwork(:,jl)=.true.
181 WHERE(zwsnow_perm(:)>0..AND.pek%TSNOW%WSNOW(:,jl)==0.)gwork(:,jl)=.true.
187 pek%TSNOW%RHO(:,jl) = zrhosmax
194 pek%TSNOW%ALB(:) = (xaglamax+xaglamin)/2.0
198 pek%TSNOW%ALB(:) = (xansmax+xansmin)/2.0
204 IF (pek%TSNOW%SCHEME==
'3-L'.OR.pek%TSNOW%SCHEME==
'CRO')
THEN 208 IF(io%LGLACIER.AND.pek%TSNOW%NLAYER>=6)
THEN 210 pek%TSNOW%RHO(:,1) = zrhol1
212 IF(pek%TSNOW%NLAYER>=6.AND.pek%TSNOW%NLAYER<12)
THEN 214 pek%TSNOW%RHO(:,2) = zrhol1 + 100.
217 pek%TSNOW%RHO(:,3) = zrhol1 + 250.
220 DO jl=2,pek%TSNOW%NLAYER
222 pek%TSNOW%RHO(:,jl) = min(zrhosmax,pek%TSNOW%RHO(:,jl-1)+100.)
230 DO jl=1,pek%TSNOW%NLAYER/4
232 pek%TSNOW%AGE(:,jl) = 365.0*float(jl-1)/ float(pek%TSNOW%NLAYER)
235 DO jl=1+pek%TSNOW%NLAYER/4,pek%TSNOW%NLAYER
237 pek%TSNOW%AGE(:,jl) = 3650.*float(jl-1)/ float(pek%TSNOW%NLAYER)
242 WHERE(gwork(:,:))pek%TSNOW%AGE(:,:) = 0.0
247 IF (pek%TSNOW%SCHEME==
'CRO')
THEN 248 DO jl=1,pek%TSNOW%NLAYER/4
250 pek%TSNOW%GRAN1(:,jl) = min(-1.,-99.* (1.-4*float(jl)/float(pek%TSNOW%NLAYER)))
251 pek%TSNOW%GRAN2(:,jl) = 50.
252 pek%TSNOW%HIST(:,jl) = 0
255 DO jl=1+pek%TSNOW%NLAYER/4,pek%TSNOW%NLAYER
257 pek%TSNOW%GRAN1(:,jl) = 99.
258 pek%TSNOW%GRAN2(:,jl) = 0.0003
259 pek%TSNOW%HIST(:,jl) = 0
271 ALLOCATE(zwsnow(
SIZE(pek%XTG,1)))
273 DO jl=1,pek%TSNOW%NLAYER
274 zwsnow(:) = zwsnow(:) + pek%TSNOW%WSNOW(:,jl)
279 zwsnow_perm(:) = max(zwsnow_perm(:),zwsnow(:))
283 ALLOCATE(zd(
SIZE(pek%XTG,1)))
285 DO jl=1,pek%TSNOW%NLAYER
286 zd(:) = zd(:) + pek%TSNOW%WSNOW(:,jl)/pek%TSNOW%RHO(:,jl)
288 zd(:) = zd(:) + (zwsnow_perm(:)-zwsnow(:))/zrhosmax
292 SELECT CASE(pek%TSNOW%SCHEME)
293 CASE(
'D95',
'1-L',
'EBA')
296 WHERE(zwsnow(:)>=0..AND.pek%TSNOW%WSNOW(:,1)/=
xundef)gwork(:,1)=.true.
298 WHERE(zwsnow(:)==0..AND.pek%TSNOW%WSNOW(:,1)/=
xundef)gwork(:,1)=.true.
301 pek%TSNOW%WSNOW(:,1) = zwsnow_perm(:)
305 ALLOCATE(zdepth(
SIZE(pek%XTG,1),pek%TSNOW%NLAYER))
307 DO jl=1,pek%TSNOW%NLAYER
308 WHERE(zwsnow(:)>= 0. .AND. pek%TSNOW%WSNOW(:,jl)/=
xundef)
309 pek%TSNOW%WSNOW(:,jl) = zdepth(:,jl) * pek%TSNOW%RHO(:,jl)
322 ALLOCATE(zt(
SIZE(pek%TSNOW%WSNOW,1),
SIZE(pek%TSNOW%WSNOW,2)))
324 SELECT CASE(pek%TSNOW%SCHEME)
326 zt(:,:) = pek%TSNOW%T (:,:)
333 DO jl=1,pek%TSNOW%NLAYER
338 WHERE(zwsnow_perm(:)>0.)gwork(:,jl)=.true.
340 WHERE(zwsnow_perm(:)>0. .AND. zwsnow(:)==0)gwork(:,jl)=.true.
344 zt(:,jl) = min(pek%XTG(:,
SIZE(pek%XTG,2)),
xtt)
350 SELECT CASE(pek%TSNOW%SCHEME)
352 pek%TSNOW%T (:,:) = zt(:,:)
366 ALLOCATE(zwat(
SIZE(pek%XTG,1),
SIZE(pek%XTG,2)))
370 IF (io%CISBA ==
'DIF')
THEN 371 iwork=io%NGROUND_LAYER
372 zwat(:,:)=kk%XWFC(:,:)
375 zwat(:,:)=kk%XWSAT(:,:)
379 WHERE(pk%XVEGTYPE_PATCH(:,nvt_snow)>0.0)
380 pek%XWGI(:,jl) = max(pek%XWGI(:,jl),zwat(:,jl)*zpsn(:))
381 pek%XWG (:,jl) = min(pek%XWG (:,jl), max(kk%XWSAT(:,jl)-pek%XWGI(:,jl),xwgmin))
383 WHERE(pek%XWG(:,jl) /=
xundef .AND. (pek%XWG(:,jl) + pek%XWGI(:,jl)) > kk%XWSAT(:,jl) )
384 pek%XWGI(:,jl) = kk%XWSAT(:,jl)-pek%XWG (:,jl)
400 IF (
lhook)
CALL dr_hook(
'PREP_PERM_SNOW',1,zhook_handle)
real function, dimension(size(ppsng)) wsnow_from_snow_frac_ground(PPSNG)
subroutine prep_perm_snow(IO, KK, PK, PEK)
subroutine mkflag_snow(TPSNOW)
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))