SURFEX v8.1
General documentation of Surfex
prep_hor_isba_field.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
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)
8 ! #################################################################################
9 !
10 !!**** *PREP_HOR_ISBA_FIELD* - reads, interpolates and prepares an ISBA field
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 !!** METHOD
16 !! ------
17 !!
18 !! REFERENCE
19 !! ---------
20 !!
21 !!
22 !! AUTHOR
23 !! ------
24 !! V. Masson
25 !!
26 !! MODIFICATIONS
27 !! -------------
28 !! Original 01/2004
29 !! P. Le Moigne 10/2005, Phasage Arome
30 !! P. Le Moigne 03/2007, Ajout initialisation par ascllv
31 !! B. Decharme 01/2009, Optional Arpege deep soil temperature initialization
32 !! M. Lafaysse 07/2012, allow netcdf input files
33 !! B. Decharme 07/2012, Bug init uniform snow
34 !! M. Lafaysse 11/2012, snow liquid water content
35 !! B. Decharme 03/2014, external init with FA files
36 !! new vertical interpolation
37 !! P Samuelsson 10/2014, MEB
38 !! P. Marguinaud10/2014, Support for a 2-part PREP
39 !!------------------------------------------------------------------
40 !
43 USE modd_surfex_mpi, ONLY : nrank, npio, ncomm, nproc
44 !
46 !
47 USE modd_sfx_grid_n, ONLY : grid_t
51 !
53 USE modd_surf_atm_n, ONLY : surf_atm_t
54 USE modd_sso_n, ONLY : sso_t
56 !
59  linterp, cmask
60 USE modd_grid_grib, ONLY : cinmodel
61 !
62 USE modd_prep_isba, ONLY : xgrid_soil, ngrid_level, lsnow_ideal, &
63  xwsnow, xrsnow, xtsnow, xlwcsnow, xasnow, &
64  xsg1snow, xsg2snow, xhistsnow, xagesnow
65 
66 
67 USE modd_isba_par, ONLY : xwgmin
68 USE modd_data_cover_par, ONLY : nvegtype
69 USE modd_surf_par, ONLY : xundef,nundef
70 !
72 !
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
80 USE modi_abor1_sfx
81 USE modi_hor_interpol
82 USE modi_put_on_all_vegtypes
83 USE modi_vegtype_grid_to_patch_grid
84 USE modi_prep_hor_snow_fields
85 USE modi_get_luout
86 USE modi_prep_isba_extern
87 USE modi_prep_isba_netcdf
89 USE modi_allocate_gr_snow
90 USE modi_get_prep_interp
91 !
92 USE yomhook ,ONLY : lhook, dr_hook
93 USE parkind1 ,ONLY : jprb
94 !
95 IMPLICIT NONE
96 !
97 #ifdef SFX_MPI
98 include "mpif.h"
99 #endif
100 !
101 !* 0.1 declarations of arguments
102 !
103 !
104 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
105 !
106 TYPE(grid_t), INTENT(INOUT) :: IG
107 TYPE(isba_options_t), INTENT(INOUT) :: IO
108 TYPE(isba_s_t), INTENT(INOUT) :: S
109 TYPE(isba_nk_t), INTENT(INOUT) :: NK
110 TYPE(isba_np_t), INTENT(INOUT) :: NP
111 TYPE(isba_npe_t), INTENT(INOUT) :: NPE
112 TYPE(date_time), INTENT(IN) :: TPTIME
113 !
114 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
115 TYPE(surf_atm_t), INTENT(INOUT) :: U
116 TYPE(sso_t), INTENT(INOUT) :: USS
117 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
118 !
119 type(prep_ctl), INTENT(INOUT) :: ydctl
120 !
121  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
122  CHARACTER(LEN=7), INTENT(IN) :: HSURF ! type of field
123  CHARACTER(LEN=28), INTENT(IN) :: HATMFILE ! name of the Atmospheric file
124  CHARACTER(LEN=6), INTENT(IN) :: HATMFILETYPE! type of the Atmospheric file
125  CHARACTER(LEN=28), INTENT(IN) :: HPGDFILE ! name of the Atmospheric file
126  CHARACTER(LEN=6), INTENT(IN) :: HPGDFILETYPE! type of the Atmospheric file
127 !
128 LOGICAL, OPTIONAL, INTENT(INOUT):: OKEY
129 !
130 !* 0.2 declarations of local variables
131 !
132  CHARACTER(LEN=6) :: YFILETYPE ! type of input file
133  CHARACTER(LEN=28) :: YFILE ! name of file
134  CHARACTER(LEN=6) :: YFILETYPE_SNOW ! type of input file
135  CHARACTER(LEN=28) :: YFILE_SNOW ! name of file
136  CHARACTER(LEN=6) :: YFILEPGDTYPE_SNOW ! type of input file
137  CHARACTER(LEN=28) :: YFILEPGD_SNOW ! name of file
138  CHARACTER(LEN=6) :: YFILEPGDTYPE ! type of input file
139  CHARACTER(LEN=28) :: YFILEPGD ! name of file
140 REAL, POINTER, DIMENSION(:,:,:) :: ZFIELDIN ! field to interpolate horizontally
141 REAL, POINTER, DIMENSION(:,:,:) :: ZFIELDOUTP ! field interpolated horizontally
142 REAL, POINTER, DIMENSION(:,:,:) :: ZFIELDOUTV !
143 !
144 TYPE(nsurf_snow) :: TNPSNOW
145 !
146 TYPE(isba_k_t), POINTER :: KK
147 TYPE(isba_p_t), POINTER :: PK
148 TYPE(isba_pe_t), POINTER :: PEK
149 !
150 TYPE fout
151  REAL, DIMENSION(:,:), ALLOCATABLE :: ZOUT
152 END TYPE fout
153 TYPE nfout
154  TYPE(fout), DIMENSION(:), ALLOCATABLE :: AL
155 END TYPE nfout
156 type(nfout) :: zw
157 TYPE(nfout) :: ZF
158 !
159 REAL, ALLOCATABLE, DIMENSION(:,:) :: ZDG ! out T grid (x, output soil grid, npatch)
160 type(date_time) :: tztime_grib ! current date and time
161 !
162  CHARACTER(LEN=3) :: YSNOW_SCHEME
163 INTEGER :: ISNOW_NLAYER
164 !
165 INTEGER, DIMENSION(IO%NPATCH) :: ISIZE_P
166 INTEGER, DIMENSION(SIZE(IG%XLAT),IO%NPATCH) :: IR_P
167 !
168 INTEGER :: ILUOUT ! output listing logical unit
169 !
170 LOGICAL :: GUNIF ! flag for prescribed uniform field
171 LOGICAL :: GUNIF_SNOW! flag for prescribed uniform field
172 INTEGER :: JP ! loop on patches
173 INTEGER :: JVEG ! loop on vegtypes
174 INTEGER :: INI, INL, INP, JI, JL! Work integer
175 INTEGER :: INFOMPI
176 INTEGER, DIMENSION(SIZE(IG%XLAT)) :: IWORK
177 !
178 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZVEGTYPE_PATCH
179 REAL, DIMENSION(:,:), ALLOCATABLE :: ZPATCH
180 !
181 REAL(KIND=JPRB) :: ZHOOK_HANDLE
182 !-------------------------------------------------------------------------------------
183 !
184 !
185 !* 1. Reading of input file name and type
186 !
187 IF (lhook) CALL dr_hook('PREP_HOR_ISBA_FIELD',0,zhook_handle)
188  CALL get_luout(hprogram,iluout)
189 !
190  CALL read_prep_isba_conf(hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,&
191  hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,iluout,gunif)
192 !
193 cmask = 'NATURE'
194 !
195 ini=SIZE(ig%XLAT)
196 !
197 !-------------------------------------------------------------------------------------
198 !
199 !* 2. Snow variables case?
200 !
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)
204  !
205  DO jp = 1,io%NPATCH
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
209  ir_p(:,jp) = 0
210  ir_p(1:isize_p(jp),jp) = np%AL(jp)%NR_P
211  ENDDO
212  !
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
215  yfile_snow = yfile
216  yfiletype_snow = yfiletype
217  yfilepgd_snow = yfilepgd
218  yfilepgdtype_snow = yfilepgdtype
219  ELSE
220  gunif_snow=.true.
221  IF(all(xwsnow==xundef))xwsnow=0.0
222  ENDIF
223  ENDIF
224  !
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.
229  zpatch(:,:) = 0.
230  DO jp = 1,io%NPATCH
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
235  ENDDO
236  !
237  CALL prep_hor_snow_fields(dtco, ig, u, gcp, hprogram, hsurf, &
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 )
248  !
249  DEALLOCATE(zpatch)
250  DEALLOCATE(zvegtype_patch)
251  !
252  DO jp = 1,io%NPATCH
253  pek => npe%AL(jp)
254  CALL allocate_gr_snow(pek%TSNOW,np%AL(jp)%NSIZE_P)
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
265  ENDIF
266  !
267  CALL type_snow_init(tnpsnow%AL(jp))
268  ENDDO
269  DEALLOCATE(tnpsnow%AL)
270  !
271  DEALLOCATE(xwsnow)
272  DEALLOCATE(xrsnow)
273  DEALLOCATE(xtsnow)
274  DEALLOCATE(xlwcsnow)
275  DEALLOCATE(xsg1snow)
276  DEALLOCATE(xsg2snow)
277  DEALLOCATE(xhistsnow)
278  DEALLOCATE(xagesnow)
279  IF (lhook) CALL dr_hook('PREP_HOR_ISBA_FIELD',1,zhook_handle)
280  RETURN
281 END IF
282 !
283 !-------------------------------------------------------------------------------------
284 !
285 !* 3. Reading of input configuration (Grid and interpolation type)
286 !
287 NULLIFY (zfieldin, zfieldoutp, zfieldoutv)
288 !
289 IF (ydctl%LPART1) THEN
290 !
291  IF (gunif) THEN
292  CALL prep_isba_unif(iluout,hsurf,zfieldin)
293  ELSE IF (yfiletype=='ASCLLV') THEN
294  CALL prep_isba_ascllv(dtco, ug, u, uss, hprogram,hsurf,iluout,zfieldin)
295  ELSE IF (yfiletype=='GRIB ') THEN
296  CALL prep_grib_grid(yfile,iluout,cinmodel,cingrid_type,cinterp_type,tztime_grib)
297  IF (nrank==npio) CALL prep_isba_grib(hprogram,hsurf,yfile,iluout,zfieldin)
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
302  CALL prep_isba_buffer(ig, u, hprogram,hsurf,iluout,zfieldin)
303  ELSE IF (yfiletype=='NETCDF') THEN
304  CALL prep_isba_netcdf(dtco, u, hprogram,hsurf,yfile,iluout,zfieldin)
305  ELSE
306  CALL abor1_sfx('PREP_HOR_ISBA_FIELD: data file type not supported : '//yfiletype)
307  END IF
308 !
309  inl = SIZE(zfieldin,2)
310  inp = SIZE(zfieldin,3)
311 !
312 ENDIF
313 !
314 !-------------------------------------------------------------------------------------
315 !
316 !* 5. Horizontal interpolation
317 !
318  CALL prep_ctl_int_part2 (ydctl, hsurf, cmask, 'NATURE', zfieldin)
319 !
320 IF (ydctl%LPART3) THEN
321 !
322  IF (nrank==npio) THEN
323  inl = SIZE(zfieldin,2)
324  inp = SIZE(zfieldin,3)
325  ELSEIF (.NOT.ASSOCIATED(zfieldin)) THEN
326  ALLOCATE(zfieldin(0,0,0))
327  ENDIF
328 !
329  IF (nproc>1) THEN
330 #ifdef SFX_MPI
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)
333 #endif
334  ENDIF
335  ALLOCATE(zfieldoutp(ini,inl,inp))
336 !
337 ! ZPATCH is the array of output patches put on the input patches
338  ALLOCATE(zpatch(ini,inp))
339  zpatch(:,:) = 0.
340 !
341  CALL get_prep_interp(inp,io%NPATCH,s%XVEGTYPE,s%XPATCH,zpatch)
342 !
343  DO jp = 1, inp
344  ! we interpolate each point the output patch is present
345  linterp(:) = (zpatch(:,jp) > 0.)
346  CALL hor_interpol(dtco, u, gcp, iluout,zfieldin(:,:,jp),zfieldoutp(:,:,jp))
347  linterp = .true.
348  END DO
349 !
350  DEALLOCATE(zfieldin,zpatch)
351 !
352 ENDIF
353 !
354  CALL prep_ctl_int_part4 (ydctl, hsurf, 'NATURE', cmask, zfieldin, zfieldoutp)
355 !
356 IF (ydctl%LPART5) THEN
357 !
358  inl = SIZE (zfieldoutp,2)
359  inp = SIZE (zfieldoutp,3)
360 !
361  IF (trim(hsurf)/="ZS") THEN
362  !
363  ALLOCATE(zw%AL(io%NPATCH))
364  !
365  IF (io%NPATCH/=inp) THEN
366  !
367  ALLOCATE(zfieldoutv(ini,inl,nvegtype))
368  CALL put_on_all_vegtypes(ini,inl,inp,nvegtype,zfieldoutp,zfieldoutv)
369  !
370  !* 6. Transformation from vegtype grid to patch grid
371  !
372  DEALLOCATE(zfieldoutp)
373  !
374  DO jp = 1,io%NPATCH
375  pk => np%AL(jp)
376  !
377  ALLOCATE(zw%AL(jp)%ZOUT(pk%NSIZE_P,inl))
378  !
379  CALL vegtype_grid_to_patch_grid(jp, io%NPATCH, pk%XVEGTYPE_PATCH, pk%XPATCH,&
380  pk%NR_P, zfieldoutv, zw%AL(jp)%ZOUT)
381  ENDDO
382  !
383  DEALLOCATE(zfieldoutv)
384  !
385  ELSE
386  !
387  DO jp = 1,io%NPATCH
388  !
389  pk => np%AL(jp)
390  !
391  ALLOCATE(zw%AL(jp)%ZOUT(pk%NSIZE_P,inl))
392  !
393  CALL pack_same_rank(pk%NR_P,zfieldoutp(:,:,jp),zw%AL(jp)%ZOUT)
394  !
395  ENDDO
396  !
397  DEALLOCATE(zfieldoutp)
398  !
399  ENDIF
400  !
401  ENDIF
402 !
403 !
404 !-------------------------------------------------------------------------------------
405 !
406 !* 7. Return to historical variable
407 !
408 !
409  SELECT CASE (hsurf)
410  !
411  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
412  !
413  CASE('ZS ')
414  ALLOCATE(xzs_ls(ini))
415  xzs_ls(:) = zfieldoutp(:,1,1)
416  DEALLOCATE(zfieldoutp)
417  !
418  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
419  !
420  CASE('WG ')
421  !
422  ALLOCATE(zf%AL(io%NPATCH))
423  !
424  DO jp = 1,io%NPATCH
425  kk => nk%AL(jp)
426  pk => np%AL(jp)
427  pek => npe%AL(jp)
428  !
429  ALLOCATE(zf%AL(jp)%ZOUT(pk%NSIZE_P,io%NGROUND_LAYER))
430  !
431  !* interpolates on output levels
432  CALL init_from_ref_grid(xgrid_soil,zw%AL(jp)%ZOUT,pk%XDG,zf%AL(jp)%ZOUT)
433  !
434  !* retrieves soil water content from soil relative humidity
435  ALLOCATE(pek%XWG(pk%NSIZE_P,io%NGROUND_LAYER))
436  pek%XWG(:,:)=xundef
437  IF(io%CISBA=='DIF')THEN
438  iwork(1:pk%NSIZE_P)=pk%NWG_LAYER(:)
439  ELSE
440  iwork(1:pk%NSIZE_P)=SIZE(pek%XWG,2)
441  ENDIF
442  DO ji=1,pk%NSIZE_P
443  IF(iwork(ji)==nundef)cycle
444  inl=iwork(ji)
445  DO jl=1,inl
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)
448  ENDDO
449  ENDDO
450  !
451  WHERE(zf%AL(jp)%ZOUT(:,:)==xundef) pek%XWG(:,:)=xundef
452  !
453  DEALLOCATE(zf%AL(jp)%ZOUT)
454  ENDDO
455  !
456  DEALLOCATE(zf%AL)
457  !
458  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
459  !
460  CASE('WGI ')
461  ALLOCATE(zf%AL(io%NPATCH))
462  !
463  DO jp = 1,io%NPATCH
464  kk => nk%AL(jp)
465  pk => np%AL(jp)
466  pek => npe%AL(jp)
467  !
468  ALLOCATE(zf%AL(jp)%ZOUT(pk%NSIZE_P,io%NGROUND_LAYER))
469  !
470  !* interpolates on output levels
471  CALL init_from_ref_grid(xgrid_soil,zw%AL(jp)%ZOUT,pk%XDG,zf%AL(jp)%ZOUT)
472  !
473  !* retrieves soil ice content from soil relative humidity
474  ALLOCATE(pek%XWGI(pk%NSIZE_P,io%NGROUND_LAYER))
475  pek%XWGI(:,:)=0.0
476  IF(io%CISBA=='DIF')THEN
477  iwork(1:pk%NSIZE_P)=pk%NWG_LAYER(:)
478  ELSE
479  iwork(1:pk%NSIZE_P)=2
480  ENDIF
481  DO ji=1,pk%NSIZE_P
482  IF(iwork(ji)==nundef)cycle
483  inl=iwork(ji)
484  DO jl=1,inl
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.)
487  ENDDO
488  END DO
489  !
490  WHERE(zf%AL(jp)%ZOUT(:,:)==xundef ) pek%XWGI(:,:)=xundef
491  WHERE(pek%XWGI(:,:)<=1.0e-10)pek%XWGI(:,:)=0.0
492  !
493  DEALLOCATE(zf%AL(jp)%ZOUT)
494  !
495  ENDDO
496  !
497  DEALLOCATE(zf%AL)
498  !
499  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
500  !
501  CASE('TG ')
502  IF(io%LTEMP_ARP)THEN
503  inl=io%NTEMPLAYER_ARP
504  ELSE
505  inl=io%NGROUND_LAYER
506  ENDIF
507  !
508  DO jp = 1,io%NPATCH
509  !
510  pk => np%AL(jp)
511  pek => npe%AL(jp)
512  !
513  ALLOCATE(pek%XTG(pk%NSIZE_P,inl))
514  !
515  ALLOCATE(zdg(SIZE(pk%XDG,1),inl))
516  IF (io%CISBA=='2-L'.OR.io%CISBA=='3-L') THEN
517  zdg(:,1) = 0.01
518  zdg(:,2) = 0.40 ! deep temperature for force-restore taken at 20cm
519  IF(io%CISBA=='3-L') zdg(:,3) = 5.00 ! climatological temperature, usually not used
520  IF(io%LTEMP_ARP)THEN
521  zdg(:,3) = 1.0
522  DO jl=4,inl
523  zdg(:,jl) = zdg(:,jl-1)+1.0
524  ENDDO
525  ENDIF
526  ELSE
527  !* diffusion method, the soil grid is the same as for humidity
528  zdg(:,:) = pk%XDG(:,:)
529  END IF
530  CALL init_from_ref_grid(xgrid_soil,zw%AL(jp)%ZOUT,zdg,pek%XTG)
531  DEALLOCATE(zdg)
532  !
533  ENDDO
534  !
535  !
536  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
537  !
538  CASE('WR ')
539  DO jp = 1,io%NPATCH
540  ALLOCATE(npe%AL(jp)%XWR(np%AL(jp)%NSIZE_P))
541  npe%AL(jp)%XWR(:) = zw%AL(jp)%ZOUT(:,1)
542 
543  ENDDO
544  !
545  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
546  !
547  CASE('WRL ')
548  DO jp = 1,io%NPATCH
549  ALLOCATE(npe%AL(jp)%XWRL(np%AL(jp)%NSIZE_P))
550  npe%AL(jp)%XWRL(:) = zw%AL(jp)%ZOUT(:,1)
551  ENDDO
552  !
553  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
554  !
555  CASE('WRLI ')
556  DO jp = 1,io%NPATCH
557  ALLOCATE(npe%AL(jp)%XWRLI(np%AL(jp)%NSIZE_P))
558  npe%AL(jp)%XWRLI(:) = zw%AL(jp)%ZOUT(:,1)
559  ENDDO
560  !
561  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
562  !
563  CASE('WRVN ')
564  DO jp = 1,io%NPATCH
565  ALLOCATE(npe%AL(jp)%XWRVN(np%AL(jp)%NSIZE_P))
566  npe%AL(jp)%XWRVN(:) = zw%AL(jp)%ZOUT(:,1)
567  ENDDO
568  !
569  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
570  !
571  CASE('TV ')
572  DO jp = 1,io%NPATCH
573  ALLOCATE(npe%AL(jp)%XTV(np%AL(jp)%NSIZE_P))
574  npe%AL(jp)%XTV(:) = zw%AL(jp)%ZOUT(:,1)
575  ENDDO
576  !
577  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
578  !
579  CASE('TL ')
580  DO jp = 1,io%NPATCH
581  ALLOCATE(npe%AL(jp)%XTL(np%AL(jp)%NSIZE_P))
582  npe%AL(jp)%XTL(:) = zw%AL(jp)%ZOUT(:,1)
583  ENDDO
584  !
585  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
586  !
587  CASE('TC ')
588  DO jp = 1,io%NPATCH
589  ALLOCATE(npe%AL(jp)%XTC(np%AL(jp)%NSIZE_P))
590  npe%AL(jp)%XTC(:) = zw%AL(jp)%ZOUT(:,1)
591  ENDDO
592  !
593  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
594  !
595  CASE('QC ')
596  DO jp = 1,io%NPATCH
597  ALLOCATE(npe%AL(jp)%XQC(np%AL(jp)%NSIZE_P))
598  npe%AL(jp)%XQC(:) = zw%AL(jp)%ZOUT(:,1)
599  ENDDO
600  !
601  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
602  !
603  CASE('LAI ')
604  !* LAI is updated only if present and pertinent (evolutive LAI) in input file
605  DO jp = 1,io%NPATCH
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)
609  ENDIF
610  ENDDO
611  !
612  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
613  !
614  CASE('ICE_STO')
615  DO jp = 1,io%NPATCH
616  ALLOCATE(npe%AL(jp)%XICE_STO(np%AL(jp)%NSIZE_P))
617  npe%AL(jp)%XICE_STO(:) = zw%AL(jp)%ZOUT(:,1)
618  ENDDO
619  !
620  END SELECT
621  !
622  IF (trim(hsurf)/="ZS") THEN
623  DO jp = 1,io%NPATCH
624  DEALLOCATE(zw%AL(jp)%ZOUT)
625  ENDDO
626  DEALLOCATE(zw%AL)
627  ENDIF
628 !
629 ENDIF
630 !-------------------------------------------------------------------------------------
631 !
632 !* 8. Deallocations
633 !
634 IF (lhook) CALL dr_hook('PREP_HOR_ISBA_FIELD',1,zhook_handle)
635 !
636 !-------------------------------------------------------------------------------------
637 !-------------------------------------------------------------------------------------
638 !
639 CONTAINS
640 !
641 !-------------------------------------------------------------------------------------
642 !-------------------------------------------------------------------------------------
643 !
644 SUBROUTINE init_from_ref_grid(PGRID1,PT1,PD2,PT2)
645 !
647 !
648 REAL, DIMENSION(:,:), INTENT(IN) :: PT1 ! variable profile
649 REAL, DIMENSION(:), INTENT(IN) :: PGRID1 ! normalized grid
650 REAL, DIMENSION(:,:), INTENT(IN) :: PD2 ! output layer thickness
651 REAL, DIMENSION(:,:), INTENT(OUT) :: PT2 ! variable profile
652 !
653 INTEGER :: JI,JL ! loop counter
654 REAL, DIMENSION(SIZE(PT1,1),SIZE(PT1,2)) :: ZD1 ! input grid
655 REAL, DIMENSION(SIZE(PD2,1),SIZE(PD2,2)) :: ZD2 ! output grid
656 !
657 INTEGER :: ILAYER1, ILAYER2
658 REAL(KIND=JPRB) :: ZHOOK_HANDLE
659 !
660 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
661 !
662 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',0,zhook_handle)
663 !
664 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
665 IF (SIZE(pt1,2)==3) THEN
666 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
667 !
668 !* 1. case with only 3 input levels (typically coming from 'UNIF')
669 ! -----------------------------
670 !
671  IF (io%CISBA=='2-L' .OR. io%CISBA=='3-L') THEN
672 
673  !* Possible LTEMP_ARP case
674  IF(SIZE(pt2,2)>3)THEN
675  ilayer1=3
676  ilayer2=SIZE(pt2,2)
677  ELSE
678  ilayer1=SIZE(pt2,2)
679  ilayer2=0
680  ENDIF
681  !* historical 2L or 3L ISBA version
682  pt2(:,1:ilayer1) = pt1(:,1:ilayer1)
683  !* Possible LTEMP_ARP case
684  IF(ilayer2>0)THEN
685  DO jl=ilayer1+1,ilayer2
686  pt2(:,jl) = pt2(:,ilayer1)
687  ENDDO
688  ENDIF
689 
690  ELSEIF(io%CISBA=='DIF')THEN
691 
692  !surface layer (generally 0.01m imposed)
693  pt2(:,1) = pt1(:,1)
694  !second layer
695  pt2(:,2) = 0.25*pt1(:,1)+0.75*pt1(:,2)
696  !others layers
697  DO ji=1,SIZE(pt1,1)
698  DO jl=3,io%NGROUND_LAYER
699  IF(pd2(ji,jl)<=pk%XDG2(ji))THEN
700  !root layers
701  pt2(ji,jl) = pt1(ji,2)
702  ELSE
703  !deep layers
704  pt2(ji,jl) = pt1(ji,3)
705  ENDIF
706  END DO
707  END DO
708  END IF
709 !
710 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
711 ELSE
712 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
713 !
714 !* 2. case with fine grid as input (general case)
715 ! ----------------------------
716 !
717  DO jl=1,SIZE(pt1,2)
718  zd1(:,jl) = pgrid1(jl)
719  ENDDO
720 !
721  zd2(:,:) = pd2(:,:)
722  CALL interp_grid_nat(zd1,pt1(:,:),zd2,pt2(:,:))
723 !
724 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
725 ENDIF
726 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
727 !
728 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',1,zhook_handle)
729 !
730 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
731 END SUBROUTINE init_from_ref_grid
732 !-------------------------------------------------------------------------------------
733 !
734 END SUBROUTINE prep_hor_isba_field
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine prep_grib_grid(HGRIB, KLUOUT, HINMODEL, HGRIDTYPE, HINTERP_
character(len=10) cingrid_type
Definition: modd_prep.F90:39
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
Definition: modd_prep.F90:48
real, dimension(:), allocatable xzs_ls
Definition: modd_prep.F90:45
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)
character(len=6) cmask
Definition: modd_prep.F90:41
real, dimension(:), allocatable xy_out
Definition: modd_prep.F90:51
character(len=6) cinterp_type
Definition: modd_prep.F90:40
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)
Definition: abor1_sfx.F90:7
real, parameter xundef
character(len=6) cinmodel
logical, dimension(:), allocatable linterp
Definition: modd_prep.F90:43
subroutine hor_interpol(DTCO, U, GCP, KLUOUT, PFIELDIN, PFIELDOUT)
Definition: hor_interpol.F90:7
subroutine read_prep_isba_snow(HPROGRAM, HSNOW, KSNOW_LAYER, HFILE, HF
subroutine read_prep_isba_conf(HPROGRAM, HVAR, HFILE, HFILETYPE, HFILE
integer, parameter jprb
Definition: parkind1.F90:32
real, dimension(:), allocatable xlat_out
Definition: modd_prep.F90:47
integer, parameter nundef
real, dimension(:), allocatable xx_out
Definition: modd_prep.F90:50
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
subroutine allocate_gr_snow(TPSNOW, KLU)
logical lhook
Definition: yomhook.F90:15
subroutine prep_isba_unif(KLUOUT, HSURF, PFIELD)
subroutine type_snow_init(YSURF_SNOW)