6 SUBROUTINE prep_hor_isba_field (DTCO, UG, U, USS, GCP, IG, IO, S, NK, NP, NPE, TPTIME, &
7 HPROGRAM,HSURF,HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE,YDCTL,OKEY)
62 USE modd_prep_isba
, ONLY : xgrid_soil, ngrid_level, lsnow_ideal, &
63 xwsnow, xrsnow, xtsnow, xlwcsnow, xasnow, &
64 xsg1snow, xsg2snow, xhistsnow, xagesnow
67 USE modd_isba_par
, ONLY : xwgmin
68 USE modd_data_cover_par
, ONLY : nvegtype
73 USE modi_prep_grib_grid
74 USE modi_read_prep_isba_conf
75 USE modi_read_prep_isba_snow
76 USE modi_prep_isba_ascllv
77 USE modi_prep_isba_grib
78 USE modi_prep_isba_unif
79 USE modi_prep_isba_buffer
82 USE modi_put_on_all_vegtypes
83 USE modi_vegtype_grid_to_patch_grid
84 USE modi_prep_hor_snow_fields
86 USE modi_prep_isba_extern
87 USE modi_prep_isba_netcdf
89 USE modi_allocate_gr_snow
90 USE modi_get_prep_interp
106 TYPE(
grid_t),
INTENT(INOUT) :: IG
116 TYPE(
sso_t),
INTENT(INOUT) :: USS
119 type(
prep_ctl),
INTENT(INOUT) :: ydctl
121 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
122 CHARACTER(LEN=7),
INTENT(IN) :: HSURF
123 CHARACTER(LEN=28),
INTENT(IN) :: HATMFILE
124 CHARACTER(LEN=6),
INTENT(IN) :: HATMFILETYPE
125 CHARACTER(LEN=28),
INTENT(IN) :: HPGDFILE
126 CHARACTER(LEN=6),
INTENT(IN) :: HPGDFILETYPE
128 LOGICAL,
OPTIONAL,
INTENT(INOUT):: OKEY
132 CHARACTER(LEN=6) :: YFILETYPE
133 CHARACTER(LEN=28) :: YFILE
134 CHARACTER(LEN=6) :: YFILETYPE_SNOW
135 CHARACTER(LEN=28) :: YFILE_SNOW
136 CHARACTER(LEN=6) :: YFILEPGDTYPE_SNOW
137 CHARACTER(LEN=28) :: YFILEPGD_SNOW
138 CHARACTER(LEN=6) :: YFILEPGDTYPE
139 CHARACTER(LEN=28) :: YFILEPGD
140 REAL,
POINTER,
DIMENSION(:,:,:) :: ZFIELDIN
141 REAL,
POINTER,
DIMENSION(:,:,:) :: ZFIELDOUTP
142 REAL,
POINTER,
DIMENSION(:,:,:) :: ZFIELDOUTV
151 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZOUT
154 TYPE(fout),
DIMENSION(:),
ALLOCATABLE :: AL
159 REAL,
ALLOCATABLE,
DIMENSION(:,:) :: ZDG
162 CHARACTER(LEN=3) :: YSNOW_SCHEME
163 INTEGER :: ISNOW_NLAYER
165 INTEGER,
DIMENSION(IO%NPATCH) :: ISIZE_P
166 INTEGER,
DIMENSION(SIZE(IG%XLAT),IO%NPATCH) :: IR_P
171 LOGICAL :: GUNIF_SNOW
174 INTEGER :: INI, INL, INP, JI, JL
176 INTEGER,
DIMENSION(SIZE(IG%XLAT)) :: IWORK
178 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: ZVEGTYPE_PATCH
179 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZPATCH
181 REAL(KIND=JPRB) :: ZHOOK_HANDLE
187 IF (
lhook)
CALL dr_hook(
'PREP_HOR_ISBA_FIELD',0,zhook_handle)
191 hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,iluout,gunif)
201 IF (hsurf==
'SN_VEG ')
THEN 202 CALL read_prep_isba_snow(hprogram, ysnow_scheme, isnow_nlayer, yfile_snow, yfiletype_snow,&
203 yfilepgd_snow, yfilepgdtype_snow, gunif_snow)
206 npe%AL(jp)%TSNOW%SCHEME = ysnow_scheme
207 npe%AL(jp)%TSNOW%NLAYER = isnow_nlayer
208 isize_p(jp) = np%AL(jp)%NSIZE_P
210 ir_p(1:isize_p(jp),jp) = np%AL(jp)%NR_P
213 IF(.NOT.gunif_snow.AND.len_trim(yfile_snow)==0.AND.len_trim(yfiletype_snow)==0)
THEN 214 IF(len_trim(yfile)/=0.AND.len_trim(yfiletype)/=0)
THEN 216 yfiletype_snow = yfiletype
217 yfilepgd_snow = yfilepgd
218 yfilepgdtype_snow = yfilepgdtype
221 IF(all(xwsnow==
xundef))xwsnow=0.0
225 ALLOCATE(tnpsnow%AL(io%NPATCH))
226 ALLOCATE(zvegtype_patch(
SIZE(s%XVEGTYPE_PATCH,1),
SIZE(s%XVEGTYPE_PATCH,2),
SIZE(s%XVEGTYPE_PATCH,3)))
227 ALLOCATE(zpatch(
SIZE(s%XPATCH,1),
SIZE(s%XPATCH,2)))
228 zvegtype_patch(:,:,:) = 0.
231 CALL pack_same_rank(np%AL(jp)%NR_P,s%XVEGTYPE_PATCH(:,:,jp),zvegtype_patch(1:np%AL(jp)%NSIZE_P,:,jp))
232 CALL pack_same_rank(np%AL(jp)%NR_P,s%XPATCH(:,jp),zpatch(1:np%AL(jp)%NSIZE_P,jp))
233 tnpsnow%AL(jp)%SCHEME = npe%AL(jp)%TSNOW%SCHEME
234 tnpsnow%AL(jp)%NLAYER = npe%AL(jp)%TSNOW%NLAYER
238 yfile_snow, yfiletype_snow, &
239 yfilepgd_snow, yfilepgdtype_snow, &
240 iluout, gunif_snow, io%NPATCH, 1, &
241 ini,tnpsnow, tptime, &
242 xwsnow, xrsnow, xtsnow, xlwcsnow, &
243 xasnow, lsnow_ideal, xsg1snow, &
244 xsg2snow, xhistsnow, xagesnow, ydctl,&
245 pvegtype_patch=zvegtype_patch, &
246 ppatch=zpatch, ksize_p=isize_p, &
247 kr_p=ir_p, okey=okey )
250 DEALLOCATE(zvegtype_patch)
255 pek%TSNOW%WSNOW = tnpsnow%AL(jp)%WSNOW
256 pek%TSNOW%RHO = tnpsnow%AL(jp)%RHO
257 pek%TSNOW%ALB = tnpsnow%AL(jp)%ALB
258 IF (pek%TSNOW%SCHEME/=
'D95') pek%TSNOW%HEAT = tnpsnow%AL(jp)%HEAT
259 IF (pek%TSNOW%SCHEME==
'CRO'.OR.pek%TSNOW%SCHEME==
'3-L') &
260 pek%TSNOW%AGE = tnpsnow%AL(jp)%AGE
261 IF (pek%TSNOW%SCHEME==
'CRO')
THEN 262 pek%TSNOW%GRAN1 = tnpsnow%AL(jp)%GRAN1
263 pek%TSNOW%GRAN2 = tnpsnow%AL(jp)%GRAN2
264 pek%TSNOW%HIST = tnpsnow%AL(jp)%HIST
269 DEALLOCATE(tnpsnow%AL)
277 DEALLOCATE(xhistsnow)
279 IF (
lhook)
CALL dr_hook(
'PREP_HOR_ISBA_FIELD',1,zhook_handle)
287 NULLIFY (zfieldin, zfieldoutp, zfieldoutv)
289 IF (ydctl%LPART1)
THEN 293 ELSE IF (yfiletype==
'ASCLLV')
THEN 295 ELSE IF (yfiletype==
'GRIB ')
THEN 298 ELSE IF (yfiletype==
'MESONH' .OR. yfiletype==
'ASCII ' .OR. yfiletype==
'LFI '&
299 .OR.yfiletype==
'FA '.OR. yfiletype==
'AROME '.OR.yfiletype==
'NC ')
THEN 300 CALL prep_isba_extern(dtco, io, u, gcp, hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,iluout,zfieldin,okey)
301 ELSE IF (yfiletype==
'BUFFER')
THEN 303 ELSE IF (yfiletype==
'NETCDF')
THEN 306 CALL abor1_sfx(
'PREP_HOR_ISBA_FIELD: data file type not supported : '//yfiletype)
309 inl =
SIZE(zfieldin,2)
310 inp =
SIZE(zfieldin,3)
320 IF (ydctl%LPART3)
THEN 323 inl =
SIZE(zfieldin,2)
324 inp =
SIZE(zfieldin,3)
325 ELSEIF (.NOT.
ASSOCIATED(zfieldin))
THEN 326 ALLOCATE(zfieldin(0,0,0))
331 CALL mpi_bcast(inl,kind(inl)/4,mpi_integer,
npio,
ncomm,infompi)
332 CALL mpi_bcast(inp,kind(inp)/4,mpi_integer,
npio,
ncomm,infompi)
335 ALLOCATE(zfieldoutp(ini,inl,inp))
338 ALLOCATE(zpatch(ini,inp))
345 linterp(:) = (zpatch(:,jp) > 0.)
346 CALL hor_interpol(dtco, u, gcp, iluout,zfieldin(:,:,jp),zfieldoutp(:,:,jp))
350 DEALLOCATE(zfieldin,zpatch)
356 IF (ydctl%LPART5)
THEN 358 inl =
SIZE (zfieldoutp,2)
359 inp =
SIZE (zfieldoutp,3)
361 IF (
trim(hsurf)/=
"ZS")
THEN 363 ALLOCATE(zw%AL(io%NPATCH))
365 IF (io%NPATCH/=inp)
THEN 367 ALLOCATE(zfieldoutv(ini,inl,nvegtype))
372 DEALLOCATE(zfieldoutp)
377 ALLOCATE(zw%AL(jp)%ZOUT(pk%NSIZE_P,inl))
380 pk%NR_P, zfieldoutv, zw%AL(jp)%ZOUT)
383 DEALLOCATE(zfieldoutv)
391 ALLOCATE(zw%AL(jp)%ZOUT(pk%NSIZE_P,inl))
397 DEALLOCATE(zfieldoutp)
415 xzs_ls(:) = zfieldoutp(:,1,1)
416 DEALLOCATE(zfieldoutp)
422 ALLOCATE(zf%AL(io%NPATCH))
429 ALLOCATE(zf%AL(jp)%ZOUT(pk%NSIZE_P,io%NGROUND_LAYER))
435 ALLOCATE(pek%XWG(pk%NSIZE_P,io%NGROUND_LAYER))
437 IF(io%CISBA==
'DIF')
THEN 438 iwork(1:pk%NSIZE_P)=pk%NWG_LAYER(:)
440 iwork(1:pk%NSIZE_P)=
SIZE(pek%XWG,2)
443 IF(iwork(ji)==
nundef)cycle
446 pek%XWG(ji,jl) = kk%XWWILT(ji,jl) + zf%AL(jp)%ZOUT(ji,jl) * (kk%XWFC(ji,jl)-kk%XWWILT(ji,jl))
447 pek%XWG(ji,jl) = max(min(pek%XWG(ji,jl),kk%XWSAT(ji,jl)),xwgmin)
453 DEALLOCATE(zf%AL(jp)%ZOUT)
461 ALLOCATE(zf%AL(io%NPATCH))
468 ALLOCATE(zf%AL(jp)%ZOUT(pk%NSIZE_P,io%NGROUND_LAYER))
474 ALLOCATE(pek%XWGI(pk%NSIZE_P,io%NGROUND_LAYER))
476 IF(io%CISBA==
'DIF')
THEN 477 iwork(1:pk%NSIZE_P)=pk%NWG_LAYER(:)
479 iwork(1:pk%NSIZE_P)=2
482 IF(iwork(ji)==
nundef)cycle
485 pek%XWGI(ji,jl) = zf%AL(jp)%ZOUT(ji,jl) * kk%XWSAT(ji,jl)
486 pek%XWGI(ji,jl) = max(min(pek%XWGI(ji,jl),kk%XWSAT(ji,jl)),0.)
490 WHERE(zf%AL(jp)%ZOUT(:,:)==
xundef ) pek%XWGI(:,:)=
xundef 491 WHERE(pek%XWGI(:,:)<=1.0e-10)pek%XWGI(:,:)=0.0
493 DEALLOCATE(zf%AL(jp)%ZOUT)
503 inl=io%NTEMPLAYER_ARP
513 ALLOCATE(pek%XTG(pk%NSIZE_P,inl))
515 ALLOCATE(zdg(
SIZE(pk%XDG,1),inl))
516 IF (io%CISBA==
'2-L'.OR.io%CISBA==
'3-L')
THEN 519 IF(io%CISBA==
'3-L') zdg(:,3) = 5.00
523 zdg(:,jl) = zdg(:,jl-1)+1.0
528 zdg(:,:) = pk%XDG(:,:)
540 ALLOCATE(npe%AL(jp)%XWR(np%AL(jp)%NSIZE_P))
541 npe%AL(jp)%XWR(:) = zw%AL(jp)%ZOUT(:,1)
549 ALLOCATE(npe%AL(jp)%XWRL(np%AL(jp)%NSIZE_P))
550 npe%AL(jp)%XWRL(:) = zw%AL(jp)%ZOUT(:,1)
557 ALLOCATE(npe%AL(jp)%XWRLI(np%AL(jp)%NSIZE_P))
558 npe%AL(jp)%XWRLI(:) = zw%AL(jp)%ZOUT(:,1)
565 ALLOCATE(npe%AL(jp)%XWRVN(np%AL(jp)%NSIZE_P))
566 npe%AL(jp)%XWRVN(:) = zw%AL(jp)%ZOUT(:,1)
573 ALLOCATE(npe%AL(jp)%XTV(np%AL(jp)%NSIZE_P))
574 npe%AL(jp)%XTV(:) = zw%AL(jp)%ZOUT(:,1)
581 ALLOCATE(npe%AL(jp)%XTL(np%AL(jp)%NSIZE_P))
582 npe%AL(jp)%XTL(:) = zw%AL(jp)%ZOUT(:,1)
589 ALLOCATE(npe%AL(jp)%XTC(np%AL(jp)%NSIZE_P))
590 npe%AL(jp)%XTC(:) = zw%AL(jp)%ZOUT(:,1)
597 ALLOCATE(npe%AL(jp)%XQC(np%AL(jp)%NSIZE_P))
598 npe%AL(jp)%XQC(:) = zw%AL(jp)%ZOUT(:,1)
606 IF (any(zw%AL(jp)%ZOUT(:,:)/=
xundef))
THEN 607 ALLOCATE(npe%AL(jp)%XLAI(np%AL(jp)%NSIZE_P))
608 npe%AL(jp)%XLAI(:) = zw%AL(jp)%ZOUT(:,1)
616 ALLOCATE(npe%AL(jp)%XICE_STO(np%AL(jp)%NSIZE_P))
617 npe%AL(jp)%XICE_STO(:) = zw%AL(jp)%ZOUT(:,1)
622 IF (
trim(hsurf)/=
"ZS")
THEN 624 DEALLOCATE(zw%AL(jp)%ZOUT)
634 IF (
lhook)
CALL dr_hook(
'PREP_HOR_ISBA_FIELD',1,zhook_handle)
648 REAL,
DIMENSION(:,:),
INTENT(IN) :: PT1
649 REAL,
DIMENSION(:),
INTENT(IN) :: PGRID1
650 REAL,
DIMENSION(:,:),
INTENT(IN) :: PD2
651 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PT2
654 REAL,
DIMENSION(SIZE(PT1,1),SIZE(PT1,2)) :: ZD1
655 REAL,
DIMENSION(SIZE(PD2,1),SIZE(PD2,2)) :: ZD2
657 INTEGER :: ILAYER1, ILAYER2
658 REAL(KIND=JPRB) :: ZHOOK_HANDLE
662 IF (
lhook)
CALL dr_hook(
'INIT_FROM_REF_GRID',0,zhook_handle)
665 IF (
SIZE(pt1,2)==3)
THEN 671 IF (io%CISBA==
'2-L' .OR. io%CISBA==
'3-L')
THEN 674 IF(
SIZE(pt2,2)>3)
THEN 682 pt2(:,1:ilayer1) = pt1(:,1:ilayer1)
685 DO jl=ilayer1+1,ilayer2
686 pt2(:,jl) = pt2(:,ilayer1)
690 ELSEIF(io%CISBA==
'DIF')
THEN 695 pt2(:,2) = 0.25*pt1(:,1)+0.75*pt1(:,2)
698 DO jl=3,io%NGROUND_LAYER
699 IF(pd2(ji,jl)<=pk%XDG2(ji))
THEN 701 pt2(ji,jl) = pt1(ji,2)
704 pt2(ji,jl) = pt1(ji,3)
718 zd1(:,jl) = pgrid1(jl)
728 IF (
lhook)
CALL dr_hook(
'INIT_FROM_REF_GRID',1,zhook_handle)
static const char * trim(const char *name, int *n)
subroutine prep_grib_grid(HGRIB, KLUOUT, HINMODEL, HGRIDTYPE, HINTERP_
character(len=10) cingrid_type
subroutine prep_isba_grib(HPROGRAM, HSURF, HFILE, KLUOUT, PFIELD, OKEY)
subroutine prep_isba_netcdf(DTCO, U, HPROGRAM, HSURF, HFILE, KLUOUT, PFIELD)
subroutine prep_isba_buffer(G, U, HPROGRAM, HSURF, KLUOUT, PFIELD)
subroutine prep_hor_snow_fields(DTCO, G, U, GCP, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, OUNIF, 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, KSIZE_P, KR_P, PPATCH, OKEY)
subroutine prep_isba_extern(DTCO, IO, U, GCP, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, PFIELD, OKEY)
subroutine init_from_ref_grid(PGRID1, PT1, PD2, PT2)
real, dimension(:), allocatable xlon_out
real, dimension(:), allocatable xzs_ls
subroutine prep_isba_ascllv(DTCO, UG, U, USS, HPROGRAM, HSURF, KLUOUT, PFIELD)
subroutine prep_hor_isba_field(DTCO, UG, U, USS, GCP, IG, IO, S, NK, NP, NPE, TPTIME, HPROGRAM, HSURF, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, YDCTL, OKEY)
real, dimension(:), allocatable xy_out
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)
subroutine abor1_sfx(YTEXT)
character(len=6) cinmodel
logical, dimension(:), allocatable linterp
subroutine hor_interpol(DTCO, U, GCP, KLUOUT, PFIELDIN, PFIELDOUT)
subroutine read_prep_isba_snow(HPROGRAM, HSNOW, KSNOW_LAYER, HFILE, HF
subroutine read_prep_isba_conf(HPROGRAM, HVAR, HFILE, HFILETYPE, HFILE
real, dimension(:), allocatable xlat_out
integer, parameter nundef
real, dimension(:), allocatable xx_out
subroutine get_luout(HPROGRAM, KLUOUT)
subroutine allocate_gr_snow(TPSNOW, KLU)
subroutine prep_isba_unif(KLUOUT, HSURF, PFIELD)
subroutine type_snow_init(YSURF_SNOW)