8 HFILEPGD,HFILEPGDTYPE, &
9 KLUOUT,OUNIF,HSNSURF,KPATCH, &
12 PUNIF_WSNOW, PUNIF_RSNOW, &
13 PUNIF_TSNOW, PUNIF_LWCSNOW, &
14 PUNIF_ASNOW, OSNOW_IDEAL, &
15 PUNIF_SG1SNOW, PUNIF_SG2SNOW, &
16 PUNIF_HISTSNOW,PUNIF_AGESNOW, YDCTL, &
17 PVEGTYPE_PATCH, PPATCH, &
18 KSIZE_P, KR_P, PDEPTH )
65 USE modd_data_cover_par
, ONLY : nvegtype, nvt_snow
68 USE modd_snow_par
, ONLY : xansmax
70 USE modi_prep_grib_grid
71 USE modi_prep_snow_grib
72 USE modi_prep_snow_unif
73 USE modi_prep_snow_extern
74 USE modi_prep_snow_buffer
76 USE modi_vegtype_grid_to_patch_grid
78 USE modi_vegtype_to_patch
80 USE modi_get_prep_interp
81 USE modi_put_on_all_vegtypes
100 TYPE(
grid_t),
INTENT(INOUT) :: G
104 type(
prep_ctl),
INTENT (INOUT) :: ydctl
106 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
107 CHARACTER(LEN=28),
INTENT(IN) :: HFILE
108 CHARACTER(LEN=6),
INTENT(IN) :: HFILETYPE
109 CHARACTER(LEN=28),
INTENT(IN) :: HFILEPGD
110 CHARACTER(LEN=6),
INTENT(IN) :: HFILEPGDTYPE
111 INTEGER,
INTENT(IN) :: KLUOUT
112 LOGICAL,
INTENT(IN) :: OUNIF
113 CHARACTER(LEN=10) :: HSNSURF
114 INTEGER,
INTENT(IN) :: KPATCH
115 INTEGER,
INTENT(IN) :: KTEB_PATCH
117 INTEGER,
INTENT(IN) :: KL
119 REAL,
DIMENSION(:),
INTENT(IN) :: PUNIF_WSNOW
120 REAL,
DIMENSION(:),
INTENT(IN) :: PUNIF_RSNOW
121 REAL,
DIMENSION(:),
INTENT(IN) :: PUNIF_TSNOW
122 REAL,
DIMENSION(:),
INTENT(IN) :: PUNIF_LWCSNOW
123 REAL,
INTENT(IN) :: PUNIF_ASNOW
124 LOGICAL,
INTENT(INOUT) :: OSNOW_IDEAL
125 REAL,
DIMENSION(:),
INTENT(IN) :: PUNIF_SG1SNOW
126 REAL,
DIMENSION(:),
INTENT(IN) :: PUNIF_SG2SNOW
127 REAL,
DIMENSION(:),
INTENT(IN) :: PUNIF_HISTSNOW
128 REAL,
DIMENSION(:),
INTENT(IN) :: PUNIF_AGESNOW
130 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PVEGTYPE_PATCH
131 REAL,
DIMENSION(:,:),
INTENT(IN) :: PPATCH
132 INTEGER,
DIMENSION(:),
INTENT(IN) :: KSIZE_P
133 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: KR_P
135 REAL,
DIMENSION(:,:,:),
INTENT(IN),
OPTIONAL :: PDEPTH
140 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZOUT
143 TYPE(fout),
DIMENSION(:),
ALLOCATABLE :: AL
148 REAL,
POINTER,
DIMENSION(:,:,:) :: ZFIELDIN
149 REAL,
POINTER,
DIMENSION(:,:,:) :: ZFIELDOUTP
150 REAL,
POINTER,
DIMENSION(:,:,:) :: ZFIELDOUTV
151 REAL,
ALLOCATABLE,
DIMENSION(:) :: ZD
152 REAL,
ALLOCATABLE,
DIMENSION(:,:) :: ZTEMP
153 REAL,
ALLOCATABLE,
DIMENSION(:,:) :: ZWLIQ
154 REAL,
ALLOCATABLE,
DIMENSION(:,:,:) :: ZGRID
156 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZDEPTH, ZPATCH
161 INTEGER :: INFOMPI, INL, INP, ISNOW_NLAYER, IMASK, JI
162 REAL(KIND=JPRB) :: ZHOOK_HANDLE
168 IF (
lhook)
CALL dr_hook(
'PREP_HOR_SNOW_FIELD',0,zhook_handle)
170 isnow_nlayer = tnpsnow%AL(1)%NLAYER
176 NULLIFY (zfieldin, zfieldoutp, zfieldoutv)
178 IF (ydctl%LPART1)
THEN 180 CALL prep_snow_unif(kluout,hsnsurf,zfieldin, tptime, osnow_ideal, &
181 punif_wsnow, punif_rsnow, punif_tsnow, &
182 punif_lwcsnow, punif_asnow, punif_sg1snow, &
183 punif_sg2snow, punif_histsnow, punif_agesnow, &
185 ELSE IF (hfiletype==
'GRIB ')
THEN 188 ELSE IF (hfiletype==
'MESONH' .OR. hfiletype==
'ASCII ' .OR. hfiletype==
'LFI '&
189 .OR. hfiletype==
'FA '.OR. hfiletype==
'AROME '.OR.hfiletype==
'NC ')
THEN 190 CALL prep_snow_extern(gcp,hprogram,hsnsurf,hfile,hfiletype,hfilepgd,hfilepgdtype, &
191 kluout,zfieldin,osnow_ideal,isnow_nlayer,kteb_patch)
192 ELSE IF (hfiletype==
'BUFFER')
THEN 195 CALL abor1_sfx(
'PREP_HOR_SNOW_FIELD: data file type not supported : '//hfiletype)
205 IF (ydctl%LPART3)
THEN 208 inl =
SIZE(zfieldin,2)
209 inp =
SIZE(zfieldin,3)
210 ELSEIF (.NOT.
ASSOCIATED(zfieldin))
THEN 211 ALLOCATE(zfieldin(0,0,0))
216 CALL mpi_bcast(inl,kind(inl)/4,mpi_integer,
npio,
ncomm,infompi)
217 CALL mpi_bcast(inp,kind(inp)/4,mpi_integer,
npio,
ncomm,infompi)
221 ALLOCATE(zfieldoutp(kl,inl,inp))
224 ALLOCATE(zpatch(kl,inp))
228 IF (inp==nvegtype)
THEN 232 zpatch(:,jp) = pvegtype_patch(:,jp,ip)
239 IF (
PRESENT(pdepth))
THEN 241 ALLOCATE(zdepth(kl,inp))
244 IF (inp==nvegtype)
THEN 247 zdepth(:,jp) = pdepth(:,1,ip)
258 IF (
PRESENT(pdepth))
THEN 259 linterp(:) = ( zdepth(:,jp) /= 0. .AND. zdepth(:,jp) /=
xundef )
263 CALL hor_interpol(dtco, u, gcp, kluout,zfieldin(:,:,jp),zfieldoutp(:,:,jp))
268 DEALLOCATE(zfieldin, zpatch )
269 IF (
PRESENT(pdepth))
DEALLOCATE(zdepth)
279 IF (ydctl%LPART5)
THEN 281 ALLOCATE(zw%AL(kpatch))
283 IF (kpatch/=inp.and.inp/=1)
THEN 285 ALLOCATE(zfieldoutv(kl,inl,nvegtype))
290 DEALLOCATE(zfieldoutp)
294 ALLOCATE(zw%AL(jp)%ZOUT(ksize_p(jp),inl))
297 ppatch(1:ksize_p(jp),jp), kr_p(1:ksize_p(jp),jp), &
298 zfieldoutv, zw%AL(jp)%ZOUT)
301 DEALLOCATE(zfieldoutv)
307 ALLOCATE(zw%AL(jp)%ZOUT(ksize_p(jp),inl))
309 CALL pack_same_rank(kr_p(1:ksize_p(jp),jp),zfieldoutp(:,:,1),zw%AL(jp)%ZOUT)
317 ALLOCATE(zw%AL(jp)%ZOUT(ksize_p(jp),inl))
319 CALL pack_same_rank(kr_p(1:ksize_p(jp),jp),zfieldoutp(:,:,jp),zw%AL(jp)%ZOUT)
323 DEALLOCATE(zfieldoutp)
332 IF (
PRESENT(pdepth) .AND. .NOT.osnow_ideal )
THEN 334 ALLOCATE(zd(
SIZE(pdepth,1)))
336 ALLOCATE(zgrid(
SIZE(pdepth,1),isnow_nlayer,kpatch))
341 DO jl = 1,isnow_nlayer
342 WHERE (pdepth(1:ksize_p(jp),jl,jp)/=
xundef) zd(1:ksize_p(jp)) = zd(1:ksize_p(jp)) + pdepth(1:ksize_p(jp),jl,jp)
347 zgrid(1:ksize_p(jp),1,jp) = pdepth(1:ksize_p(jp),1,jp)
348 IF(isnow_nlayer>1)
THEN 349 DO jl = 2,isnow_nlayer
350 zgrid(1:ksize_p(jp),jl,jp) = zgrid(1:ksize_p(jp),jl-1,jp) + pdepth(1:ksize_p(jp),jl,jp)
357 WHERE (zd(1:ksize_p(jp))/=0.)
358 zgrid(1:ksize_p(jp),jl,jp) = zgrid(1:ksize_p(jp),jl,jp) / zd(1:ksize_p(jp))
360 zgrid(1:ksize_p(jp),jl,jp) = 1.0
368 ELSEIF (.NOT.osnow_ideal)
THEN 369 IF (hsnsurf(1:3)==
'RHO' .OR. hsnsurf(1:3)==
'HEA')
THEN 370 WRITE(kluout,*)
'when interpolation profiles of snow pack quantities,' 371 WRITE(kluout,*)
'depth of snow layers must be given' 372 CALL abor1_sfx(
'PREP_HOR_SNOW_FIELD: DEPTH OF SNOW LAYERS NEEDED')
384 SELECT CASE (hsnsurf(1:3))
388 IF (osnow_ideal)
THEN 389 sk%WSNOW(:,:) = zw%AL(jp)%ZOUT(:,:)
391 DO jl=1,
SIZE(sk%WSNOW,2)
392 sk%WSNOW(:,jl) = zw%AL(jp)%ZOUT(:,1)
396 DO jl = 1,isnow_nlayer
397 WHERE(ppatch(1:ksize_p(jp),jp)==0.)
404 IF (osnow_ideal)
THEN 405 sk%DEPTH(:,:) = zw%AL(jp)%ZOUT(:,:)
407 CALL snow3lgrid(sk%DEPTH(:,:),zw%AL(jp)%ZOUT(:,1))
413 DO jl = 1,isnow_nlayer
414 WHERE(ppatch(1:ksize_p(jp),jp)==0.)
423 IF (osnow_ideal)
THEN 424 sk%RHO(:,:) = zw%AL(jp)%ZOUT(:,:)
426 DO jl = 1,isnow_nlayer
427 sk%RHO(:,jl) = zw%AL(jp)%ZOUT(:,1)
436 WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==
xundef) sk%RHO(:,jl) =
xundef 443 sk%ALB(:) = zw%AL(jp)%ZOUT(:,1)
446 WHERE(pdepth(1:ksize_p(jp),1,jp)==0. .OR. pdepth(1:ksize_p(jp),1,jp)==
xundef) sk%ALB(:) =
xundef 452 IF (sk%SCHEME==
'3-L' .OR. sk%SCHEME==
'CRO')
THEN 454 ALLOCATE(ztemp(ksize_p(jp),isnow_nlayer))
455 ALLOCATE(zwliq(ksize_p(jp),isnow_nlayer))
458 IF (osnow_ideal)
THEN 459 ztemp(:,:) = zw%AL(jp)%ZOUT(:,:)
461 DO jl = 1,isnow_nlayer
462 ztemp(:,jl) = zw%AL(jp)%ZOUT(:,1)
475 WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==
xundef) sk%HEAT(:,jl) =
xundef 478 ELSE IF (sk%SCHEME==
'1-L')
THEN 481 IF (osnow_ideal)
THEN 482 sk%T(:,:) = zw%AL(jp)%ZOUT(:,:)
484 DO jl = 1,isnow_nlayer
485 sk%T(:,jl) = zw%AL(jp)%ZOUT(:,1)
492 WHERE (sk%T>
xtt) sk%T =
xtt 496 WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==
xundef) sk%T(:,jl) =
xundef 504 IF (osnow_ideal)
THEN 505 sk%GRAN1(:,:) = zw%AL(jp)%ZOUT(:,:)
507 DO jl = 1,isnow_nlayer
508 sk%GRAN1(:,jl) = zw%AL(jp)%ZOUT(:,1)
517 WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==
xundef) sk%GRAN1(:,jl) =
xundef 522 IF (osnow_ideal)
THEN 523 sk%GRAN2(:,:) = zw%AL(jp)%ZOUT(:,:)
524 ELSEIF(
SIZE(zw%AL(jp)%ZOUT,2)==1)
THEN 525 DO jl = 1,isnow_nlayer
526 sk%GRAN2(:,jl) = zw%AL(jp)%ZOUT(:,1)
535 WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==
xundef) sk%GRAN2(:,jl) =
xundef 540 IF (osnow_ideal)
THEN 541 sk%HIST(:,:) = zw%AL(jp)%ZOUT(:,:)
543 DO jl = 1,isnow_nlayer
544 sk%HIST(:,jl) = zw%AL(jp)%ZOUT(:,1)
553 WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==
xundef) sk%HIST(:,jl) =
xundef 558 IF (sk%SCHEME==
'3-L'.AND.(.NOT.osnow_ideal).AND.(.NOT.ounif))
THEN 561 IF (osnow_ideal)
THEN 562 sk%AGE(:,:) = zw%AL(jp)%ZOUT(:,:)
564 DO jl = 1,isnow_nlayer
565 sk%AGE(:,jl) = zw%AL(jp)%ZOUT(:,1)
575 WHERE(pdepth(1:ksize_p(jp),jl,jp)==0. .OR. pdepth(1:ksize_p(jp),jl,jp)==
xundef) sk%AGE(:,jl) =
xundef 586 IF (
PRESENT(pdepth) .AND. .NOT.osnow_ideal)
DEALLOCATE(zgrid )
588 DEALLOCATE(zw%AL(jp)%ZOUT)
594 IF (
lhook)
CALL dr_hook(
'PREP_HOR_SNOW_FIELD',1,zhook_handle)
606 REAL,
DIMENSION(:,:),
INTENT(IN) :: PT1
607 REAL,
DIMENSION(:),
INTENT(IN) :: PGRID1
608 REAL,
DIMENSION(:,:),
INTENT(IN) :: PD2
609 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PT2
612 REAL,
DIMENSION(SIZE(PT1,1),SIZE(PGRID1)) :: ZT1
613 REAL,
DIMENSION(SIZE(PT1,1),SIZE(PGRID1)) :: ZD1
614 REAL,
DIMENSION(SIZE(PD2,1),SIZE(PD2,2)) :: ZD2
616 REAL(KIND=JPRB) :: ZHOOK_HANDLE
620 IF (
lhook)
CALL dr_hook(
'INIT_FROM_REF_GRID',0,zhook_handle)
624 zd2(:,jl) = pd2(:,jl)
628 jl1 = min(jl,
SIZE(pt1,2))
629 zt1(:,jl) = pt1(:,jl1)
630 zd1(:,jl) = pgrid1(jl)
635 IF (
lhook)
CALL dr_hook(
'INIT_FROM_REF_GRID',1,zhook_handle)
subroutine prep_grib_grid(HGRIB, KLUOUT, HINMODEL, HGRIDTYPE, HINTERP_
character(len=10) cingrid_type
subroutine init_from_ref_grid(PGRID1, PT1, PD2, PT2)
character(len=6) cinterp_type
subroutine get_prep_interp(KNP_IN, KNP_OUT, PVEGTYPE, PPATCH_IN, PPATCH_OUT, KMASK_IN)
subroutine put_on_all_vegtypes(KNI, KLAYER, KPATCH, KVEGTYPE, PFIELD_P
subroutine vegtype_grid_to_patch_grid(KPATCH, KNPATCH, PVEGTYPE_PATCH, PPATCH, KMASK, PFIELDOUT, PW)
integer function vegtype_to_patch(IVEGTYPE, INPATCH)
subroutine abor1_sfx(YTEXT)
character(len=6) cinmodel
subroutine prep_snow_grib(HPROGRAM, HSURF, HFILE, KLUOUT, KLAYER, PFIELD)
logical, dimension(:), allocatable linterp
subroutine hor_interpol(DTCO, U, GCP, KLUOUT, PFIELDIN, PFIELDOUT)
subroutine prep_snow_buffer(G, U, HPROGRAM, HSURF, KLUOUT, KLAYER, PFIELD)
subroutine prep_snow_unif(KLUOUT, HSURF, PFIELD, TPTIME, OSNOW_IDEAL, PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_LWCSNOW, PUNIF_ASNOW, PUNIF_SG1SNOW, PUNIF_SG2SNOW, PUNIF_HISTSNOW, PUNIF_AGESNOW, KLAYER)
subroutine prep_hor_snow_field(DTCO, G, U, GCP, HPROGRAM, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, OUNIF, HSNSURF, KPATCH, KTEB_PATCH, KL, TNPSNOW, TPTIME, PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_LWCSNOW, PUNIF_ASNOW, OSNOW_IDEAL, PUNIF_SG1SNOW, PUNIF_SG2SNOW, PUNIF_HISTSNOW, PUNIF_AGESNOW, YDCTL, PVEGTYPE_PATCH, PPATCH, KSIZE_P, KR_P, PDEPTH)
subroutine prep_snow_extern(GCP, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, PFIELD, OSNOW_IDEAL, KLAYER, KTEB_PATCH)
real, dimension(ngrid_level) xgrid_snow