SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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, IG, I, UG, U, USS, &
7  hprogram,hsurf,hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,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 !!------------------------------------------------------------------
39 !
40 !
41 !
42 !
43 !
44 !
46 USE modd_isba_grid_n, ONLY : isba_grid_t
47 USE modd_isba_n, ONLY : isba_t
49 USE modd_surf_atm_n, ONLY : surf_atm_t
51 !
52 USE modd_prep, ONLY : xzs_ls, linterp, cmask
53 
54 USE modd_prep_isba, ONLY : xgrid_soil, ngrid_level, lsnow_ideal, &
55  xwsnow, xrsnow, xtsnow, xlwcsnow, xasnow, &
56  xsg1snow, xsg2snow, xhistsnow, xagesnow
57 
58 
59 USE modd_isba_par, ONLY : xwgmin
60 USE modd_data_cover_par, ONLY : nvegtype
61 USE modd_surf_par, ONLY : xundef,nundef
62 !
63 USE modi_read_prep_isba_conf
64 USE modi_read_prep_isba_snow
65 USE modi_prep_isba_ascllv
66 USE modi_prep_isba_grib
67 USE modi_prep_isba_unif
68 USE modi_prep_isba_buffer
69 USE modi_abor1_sfx
70 USE modi_hor_interpol
71 USE modi_put_on_all_vegtypes
72 USE modi_vegtype_grid_to_patch_grid
73 USE modi_prep_hor_snow_fields
74 USE modi_get_luout
75 USE modi_prep_isba_extern
76 USE modi_prep_isba_netcdf
77 USE modi_vegtype_to_patch
78 !
79 USE yomhook ,ONLY : lhook, dr_hook
80 USE parkind1 ,ONLY : jprb
81 !
82 IMPLICIT NONE
83 !
84 !* 0.1 declarations of arguments
85 !
86 !
87 TYPE(data_cover_t), INTENT(INOUT) :: dtco
88 TYPE(isba_grid_t), INTENT(INOUT) :: ig
89 TYPE(isba_t), INTENT(INOUT) :: i
90 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
91 TYPE(surf_atm_t), INTENT(INOUT) :: u
92 TYPE(surf_atm_sso_t), INTENT(INOUT) :: uss
93 !
94  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
95  CHARACTER(LEN=7), INTENT(IN) :: hsurf ! type of field
96  CHARACTER(LEN=28), INTENT(IN) :: hatmfile ! name of the Atmospheric file
97  CHARACTER(LEN=6), INTENT(IN) :: hatmfiletype! type of the Atmospheric file
98  CHARACTER(LEN=28), INTENT(IN) :: hpgdfile ! name of the Atmospheric file
99  CHARACTER(LEN=6), INTENT(IN) :: hpgdfiletype! type of the Atmospheric file
100 !
101 LOGICAL, OPTIONAL, INTENT(INOUT):: okey
102 !
103 !* 0.2 declarations of local variables
104 !
105  CHARACTER(LEN=6) :: yfiletype ! type of input file
106  CHARACTER(LEN=28) :: yfile ! name of file
107  CHARACTER(LEN=6) :: yfiletype_snow ! type of input file
108  CHARACTER(LEN=28) :: yfile_snow ! name of file
109  CHARACTER(LEN=6) :: yfilepgdtype_snow ! type of input file
110  CHARACTER(LEN=28) :: yfilepgd_snow ! name of file
111  CHARACTER(LEN=6) :: yfilepgdtype ! type of input file
112  CHARACTER(LEN=28) :: yfilepgd ! name of file
113 REAL, POINTER, DIMENSION(:,:,:) :: zfieldin ! field to interpolate horizontally
114 REAL, POINTER, DIMENSION(:,:) :: zfield, zpatch ! field to interpolate horizontally
115 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zfieldoutp ! field interpolated horizontally
116 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zfieldoutv !
117 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zw ! work array (x, fine soil grid, npatch)
118 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zf ! work array (x, output soil grid, npatch)
119 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zdg ! out T grid (x, output soil grid, npatch)
120 INTEGER :: iluout ! output listing logical unit
121 !
122 LOGICAL :: gunif ! flag for prescribed uniform field
123 LOGICAL :: gunif_snow! flag for prescribed uniform field
124 INTEGER :: jpatch ! loop on patches
125 INTEGER :: jvegtype ! loop on vegtypes
126 INTEGER :: ini, inl, inp, jj, jl, ip_i, ip_o, jp, jveg ! Work integer
127 INTEGER, DIMENSION(SIZE(I%XDG,1),SIZE(I%XDG,3)) :: iwork
128 REAL(KIND=JPRB) :: zhook_handle
129 !-------------------------------------------------------------------------------------
130 !
131 !
132 !* 1. Reading of input file name and type
133 !
134 IF (lhook) CALL dr_hook('PREP_HOR_ISBA_FIELD',0,zhook_handle)
135  CALL get_luout(hprogram,iluout)
136 !
137  CALL read_prep_isba_conf(hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,&
138  hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,iluout,gunif)
139 !
140  cmask = 'NATURE'
141 !
142 ini=SIZE(ig%XLAT)
143 !
144 !-------------------------------------------------------------------------------------
145 !
146 !* 2. Snow variables case?
147 !
148 IF (hsurf=='SN_VEG ') THEN
149  CALL read_prep_isba_snow(hprogram,i%TSNOW%SCHEME,i%TSNOW%NLAYER,yfile_snow,yfiletype_snow,&
150  yfilepgd_snow,yfilepgdtype_snow,gunif_snow)
151  IF(.NOT.gunif_snow.AND.len_trim(yfile_snow)==0.AND.len_trim(yfiletype_snow)==0)THEN
152  IF(len_trim(yfile)/=0.AND.len_trim(yfiletype)/=0)THEN
153  yfile_snow =yfile
154  yfiletype_snow=yfiletype
155  yfilepgd_snow =yfilepgd
156  yfilepgdtype_snow=yfilepgdtype
157  ELSE
158  gunif_snow=.true.
159  IF(all(xwsnow==xundef))xwsnow=0.0
160  ENDIF
161  ENDIF
162  CALL prep_hor_snow_fields(dtco, &
163  ig, u, &
164  hprogram, hsurf, &
165  yfile_snow, yfiletype_snow, &
166  yfilepgd_snow, yfilepgdtype_snow, &
167  iluout, gunif_snow, i%NPATCH, 1, &
168  ini,i%TSNOW, i%TTIME, &
169  xwsnow, xrsnow, xtsnow, xlwcsnow, &
170  xasnow, lsnow_ideal, xsg1snow, &
171  xsg2snow, xhistsnow, xagesnow, &
172  i%XVEGTYPE, i%XVEGTYPE_PATCH, i%XPATCH, &
173  okey )
174  DEALLOCATE(xwsnow)
175  DEALLOCATE(xrsnow)
176  DEALLOCATE(xtsnow)
177  DEALLOCATE(xlwcsnow)
178  DEALLOCATE(xsg1snow)
179  DEALLOCATE(xsg2snow)
180  DEALLOCATE(xhistsnow)
181  DEALLOCATE(xagesnow)
182  IF (lhook) CALL dr_hook('PREP_HOR_ISBA_FIELD',1,zhook_handle)
183  RETURN
184 END IF
185 !
186 !-------------------------------------------------------------------------------------
187 !
188 !* 3. Reading of input configuration (Grid and interpolation type)
189 !
190 IF (gunif) THEN
191  CALL prep_isba_unif(iluout,hsurf,zfieldin)
192 ELSE IF (yfiletype=='ASCLLV') THEN
193  CALL prep_isba_ascllv(dtco, ug, u, uss, &
194  hprogram,hsurf,iluout,zfieldin)
195 ELSE IF (yfiletype=='GRIB ') THEN
196  CALL prep_isba_grib(hprogram,hsurf,yfile,iluout,zfieldin,okey)
197 ELSE IF (yfiletype=='MESONH' .OR. yfiletype=='ASCII ' .OR. yfiletype=='LFI '.OR.yfiletype=='FA ') THEN
198  CALL prep_isba_extern(dtco, i, u, &
199  hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,iluout,zfieldin,okey)
200 ELSE IF (yfiletype=='BUFFER') THEN
201  CALL prep_isba_buffer(ig, u, &
202  hprogram,hsurf,iluout,zfieldin)
203 ELSE IF (yfiletype=='NETCDF') THEN
204  CALL prep_isba_netcdf(dtco, u, &
205  hprogram,hsurf,yfile,iluout,zfieldin)
206 ELSE
207  CALL abor1_sfx('PREP_HOR_ISBA_FIELD: data file type not supported : '//yfiletype)
208 END IF
209 !
210 !-------------------------------------------------------------------------------------
211 !
212 !* 5. Horizontal interpolation
213 !
214 inl = SIZE(zfieldin,2)
215 inp = SIZE(zfieldin,3)
216 !
217 ALLOCATE(zfieldoutp(ini,inl,inp))
218 ALLOCATE(zfield(SIZE(zfieldin,1),inl))
219 !
220 ALLOCATE(zpatch(ini,inp))
221 zpatch(:,:) = 0.
222 !
223 IF (inp==nvegtype) THEN
224  zpatch(:,:) = i%XVEGTYPE(:,:)
225 ELSEIF (inp==i%NPATCH) THEN
226  zpatch(:,:) = i%XPATCH(:,:)
227 ELSEIF (inp<i%NPATCH) THEN
228  DO jp = 1,i%NPATCH
229  DO jveg = 1,nvegtype
230  ip_i = vegtype_to_patch(jveg,inp)
231  ip_o = vegtype_to_patch(jveg,i%NPATCH)
232  !
233  ! pour chaque patch d'entrée à interpoler, le masque
234  ! est la somme des patchs de sortie (plus détaillés) présent sur
235  ! chaque point
236  IF (ip_o==jp) THEN
237  zpatch(:,ip_i) = zpatch(:,ip_i) + i%XPATCH(:,ip_o)
238  EXIT
239  ENDIF
240  ENDDO
241  ENDDO
242 ELSEIF (inp>i%NPATCH) THEN
243  DO jp = 1,inp
244  DO jveg = 1,nvegtype
245  ip_i = vegtype_to_patch(jveg,inp)
246  ip_o = vegtype_to_patch(jveg,i%NPATCH)
247  !
248  ! pour chaque patch d'entrée à interpoler, le masque
249  ! est le patch de sortie (moins détaillé) présent
250  ! sur ce point
251  IF (ip_i==jp) THEN
252  zpatch(:,ip_i) = i%XPATCH(:,ip_o)
253  EXIT
254  ENDIF
255  ENDDO
256  ENDDO
257 ENDIF
258 !
259 DO jpatch = 1, inp
260 
261  zfield=zfieldin(:,:,jpatch)
262  linterp(:) = (zpatch(:,jpatch) > 0.)
263  CALL hor_interpol(dtco, u, &
264  iluout,zfield,zfieldoutp(:,:,jpatch))
265  linterp = .true.
266 
267 END DO
268 !
269 DEALLOCATE(zfield)
270 !
271 ALLOCATE(zfieldoutv(ini,inl,nvegtype))
272 !
273  CALL put_on_all_vegtypes(ini,inl,inp,nvegtype,zfieldoutp,zfieldoutv)
274 !
275 DEALLOCATE(zfieldoutp)
276 !
277 !-------------------------------------------------------------------------------------
278 !
279 !* 6. Transformation from vegtype grid to patch grid
280 !
281 ALLOCATE(zw(ini,SIZE(zfieldoutv,2),i%NPATCH))
282 !
283 zw = 0.
284  CALL vegtype_grid_to_patch_grid(i%NPATCH,i%XVEGTYPE_PATCH,i%XPATCH,zfieldoutv,zw)
285 !
286 !-------------------------------------------------------------------------------------
287 !
288 !* 7. Return to historical variable
289 !
290 !
291 SELECT CASE (hsurf)
292  !
293  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
294  !
295  CASE('ZS ')
296  ALLOCATE(xzs_ls(ini))
297  xzs_ls(:) = zfieldoutv(:,1,1)
298  !
299  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
300  !
301  CASE('WG ')
302  ALLOCATE(zf(ini,i%NGROUND_LAYER,i%NPATCH))
303  !
304  !* interpolates on output levels
305  CALL init_from_ref_grid(xgrid_soil,zw,i%XDG,zf)
306  !
307  !* retrieves soil water content from soil relative humidity
308  ALLOCATE(i%XWG(ini,i%NGROUND_LAYER,i%NPATCH))
309  i%XWG(:,:,:)=xundef
310  IF(i%CISBA=='DIF')THEN
311  iwork(:,:)=i%NWG_LAYER(:,:)
312  ELSE
313  iwork(:,:)=SIZE(i%XWG,2)
314  ENDIF
315  DO jpatch=1,i%NPATCH
316  DO jj=1,ini
317  IF(iwork(jj,jpatch)==nundef)cycle
318  inl=iwork(jj,jpatch)
319  DO jl=1,inl
320  i%XWG(jj,jl,jpatch) = i%XWWILT(jj,jl) + zf(jj,jl,jpatch) * (i%XWFC(jj,jl)-i%XWWILT(jj,jl))
321  i%XWG(jj,jl,jpatch) = max(min(i%XWG(jj,jl,jpatch),i%XWSAT(jj,jl)),xwgmin)
322  ENDDO
323  ENDDO
324  ENDDO
325  !
326  WHERE(zf(:,:,:)==xundef)i%XWG(:,:,:)=xundef
327  !
328  DEALLOCATE(zf)
329  !
330  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
331  !
332  CASE('WGI ')
333  ALLOCATE(zf(ini,i%NGROUND_LAYER,i%NPATCH))
334  !
335  !* interpolates on output levels
336  CALL init_from_ref_grid(xgrid_soil,zw,i%XDG,zf)
337  !
338  !* retrieves soil ice content from soil relative humidity
339  ALLOCATE(i%XWGI(ini,i%NGROUND_LAYER,i%NPATCH))
340  i%XWGI(:,:,:)=0.0
341  IF(i%CISBA=='DIF')THEN
342  iwork(:,:)=i%NWG_LAYER(:,:)
343  ELSE
344  iwork(:,:)=2
345  ENDIF
346  DO jpatch=1,i%NPATCH
347  DO jj=1,ini
348  IF(iwork(jj,jpatch)==nundef)cycle
349  inl=iwork(jj,jpatch)
350  DO jl=1,inl
351  i%XWGI(jj,jl,jpatch) = zf(jj,jl,jpatch) * i%XWSAT(jj,jl)
352  i%XWGI(jj,jl,jpatch) = max(min(i%XWGI(jj,jl,jpatch),i%XWSAT(jj,jl)),0.)
353  ENDDO
354  ENDDO
355  END DO
356  !
357  WHERE(zf(:,:,:)==xundef )i%XWGI(:,:,:)=xundef
358  WHERE(i%XWGI(:,:,:)<=1.0e-10)i%XWGI(:,:,:)=0.0
359  !
360  DEALLOCATE(zf)
361  !
362  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
363  !
364  CASE('TG ')
365  IF(i%LTEMP_ARP)THEN
366  inl=i%NTEMPLAYER_ARP
367  ELSE
368  inl=i%NGROUND_LAYER
369  ENDIF
370  ALLOCATE(i%XTG(ini,inl,i%NPATCH))
371  ALLOCATE(zdg(SIZE(i%XDG,1),inl,SIZE(i%XDG,3)))
372  IF (i%CISBA=='2-L'.OR.i%CISBA=='3-L') THEN
373  DO jpatch=1,i%NPATCH
374  zdg(:,1,jpatch) = 0.01
375  zdg(:,2,jpatch) = 0.40 ! deep temperature for force-restore taken at 20cm
376  IF(i%CISBA=='3-L') zdg(:,3,jpatch) = 5.00 ! climatological temperature, usually not used
377  ENDDO
378  IF(i%LTEMP_ARP)THEN
379  DO jpatch=1,i%NPATCH
380  zdg(:,3,jpatch) = 1.0
381  DO jl=4,inl
382  zdg(:,jl,jpatch) = zdg(:,jl-1,jpatch)+1.0
383  ENDDO
384  ENDDO
385  ENDIF
386  ELSE
387  !* diffusion method, the soil grid is the same as for humidity
388  zdg(:,:,:) = i%XDG(:,:,:)
389  END IF
390  CALL init_from_ref_grid(xgrid_soil,zw,zdg,i%XTG)
391  DEALLOCATE(zdg)
392  !
393  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
394  !
395  CASE('WR ')
396  ALLOCATE(i%XWR(ini,i%NPATCH))
397  DO jpatch=1,i%NPATCH
398  i%XWR(:,jpatch) = zw(:,1,jpatch)
399  END DO
400  !
401  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
402  !
403  CASE('WRL ')
404  ALLOCATE(i%XWRL(ini,i%NPATCH))
405  DO jpatch=1,i%NPATCH
406  i%XWRL(:,jpatch) = zw(:,1,jpatch)
407  END DO
408  !
409  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
410  !
411  CASE('WRLI ')
412  ALLOCATE(i%XWRLI(ini,i%NPATCH))
413  DO jpatch=1,i%NPATCH
414  i%XWRLI(:,jpatch) = zw(:,1,jpatch)
415  END DO
416  !
417  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
418  !
419  CASE('WRVN ')
420  ALLOCATE(i%XWRVN(ini,i%NPATCH))
421  DO jpatch=1,i%NPATCH
422  i%XWRVN(:,jpatch) = zw(:,1,jpatch)
423  END DO
424  !
425  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
426  !
427  CASE('TV ')
428  ALLOCATE(i%XTV(ini,i%NPATCH))
429  DO jpatch=1,i%NPATCH
430  i%XTV(:,jpatch) = zw(:,1,jpatch)
431  END DO
432  !
433  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
434  !
435  CASE('TL ')
436  ALLOCATE(i%XTL(ini,i%NPATCH))
437  DO jpatch=1,i%NPATCH
438  i%XTL(:,jpatch) = zw(:,1,jpatch)
439  END DO
440  !
441  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
442  !
443  CASE('TC ')
444  ALLOCATE(i%XTC(ini,i%NPATCH))
445  DO jpatch=1,i%NPATCH
446  i%XTC(:,jpatch) = zw(:,1,jpatch)
447  END DO
448  !
449  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
450  !
451  CASE('QC ')
452  ALLOCATE(i%XQC(ini,i%NPATCH))
453  DO jpatch=1,i%NPATCH
454  i%XQC(:,jpatch) = zw(:,1,jpatch)
455  END DO
456  !
457  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
458  !
459  CASE('LAI ')
460  !* LAI is updated only if present and pertinent (evolutive LAI) in input file
461  IF (any(zw(:,:,:)/=xundef)) THEN
462  DO jpatch=1,i%NPATCH
463  i%XLAI(:,jpatch) = zw(:,1,jpatch)
464  END DO
465  END IF
466  !
467  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
468  !
469  CASE('ICE_STO')
470  ALLOCATE(i%XICE_STO(ini,i%NPATCH))
471  DO jpatch=1,i%NPATCH
472  i%XICE_STO(:,jpatch) = zw(:,1,jpatch)
473  END DO
474  !
475 END SELECT
476 !
477 DEALLOCATE(zw)
478 !-------------------------------------------------------------------------------------
479 !
480 !* 8. Deallocations
481 !
482 DEALLOCATE(zfieldin )
483 DEALLOCATE(zfieldoutv)
484 !
485 IF (lhook) CALL dr_hook('PREP_HOR_ISBA_FIELD',1,zhook_handle)
486 !
487 !-------------------------------------------------------------------------------------
488 !-------------------------------------------------------------------------------------
489 !
490  CONTAINS
491 !
492 !-------------------------------------------------------------------------------------
493 !-------------------------------------------------------------------------------------
494 !
495 SUBROUTINE init_from_ref_grid(PGRID1,PT1,PD2,PT2)
496 !
498 !
499 REAL, DIMENSION(:,:,:), INTENT(IN) :: pt1 ! variable profile
500 REAL, DIMENSION(:), INTENT(IN) :: pgrid1 ! normalized grid
501 REAL, DIMENSION(:,:,:), INTENT(IN) :: pd2 ! output layer thickness
502 REAL, DIMENSION(:,:,:), INTENT(OUT) :: pt2 ! variable profile
503 !
504 INTEGER :: ji,jl ! loop counter
505 REAL, DIMENSION(SIZE(PT1,1),SIZE(PT1,2)) :: zd1 ! input grid
506 REAL, DIMENSION(SIZE(PD2,1),SIZE(PD2,2)) :: zd2 ! output grid
507 !
508 INTEGER :: ilayer1, ilayer2
509 REAL(KIND=JPRB) :: zhook_handle
510 !
511 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
512 !
513 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',0,zhook_handle)
514 !
515 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
516 IF (SIZE(pt1,2)==3) THEN
517 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
518 !
519 !* 1. case with only 3 input levels (typically coming from 'UNIF')
520 ! -----------------------------
521 !
522  IF (i%CISBA=='2-L' .OR. i%CISBA=='3-L') THEN
523  !* Possible LTEMP_ARP case
524  IF(SIZE(pt2,2)>3)THEN
525  ilayer1=3
526  ilayer2=SIZE(pt2,2)
527  ELSE
528  ilayer1=SIZE(pt2,2)
529  ilayer2=0
530  ENDIF
531  !* historical 2L or 3L ISBA version
532  DO jpatch=1,i%NPATCH
533  pt2(:,1:ilayer1,jpatch) = pt1(:,1:ilayer1,jpatch)
534  !* Possible LTEMP_ARP case
535  IF(ilayer2>0)THEN
536  DO jl=ilayer1+1,ilayer2
537  pt2(:,jl,jpatch) = pt2(:,ilayer1,jpatch)
538  ENDDO
539  ENDIF
540  END DO
541  ELSEIF(i%CISBA=='DIF')THEN
542  DO jpatch=1,i%NPATCH
543  !surface layer (generally 0.01m imposed)
544  pt2(:,1,jpatch) = pt1(:,1,jpatch)
545  !second layer
546  pt2(:,2,jpatch) = 0.25*pt1(:,1,jpatch)+0.75*pt1(:,2,jpatch)
547  !others layers
548  DO ji=1,SIZE(pt1,1)
549  DO jl=3,i%NGROUND_LAYER
550  IF(pd2(ji,jl,jpatch)<=i%XDG2(ji,jpatch))THEN
551  !root layers
552  pt2(ji,jl,jpatch) = pt1(ji,2,jpatch)
553  ELSE
554  !deep layers
555  pt2(ji,jl,jpatch) = pt1(ji,3,jpatch)
556  ENDIF
557  END DO
558  END DO
559  END DO
560  END IF
561 !
562 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
563 ELSE
564 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
565 !
566 !* 2. case with fine grid as input (general case)
567 ! ----------------------------
568 !
569  DO jl=1,SIZE(pt1,2)
570  zd1(:,jl) = pgrid1(jl)
571  ENDDO
572 !
573  DO jpatch=1,i%NPATCH
574  zd2(:,:) = pd2(:,:,jpatch)
575  CALL interp_grid_nat(zd1,pt1(:,:,jpatch),zd2,pt2(:,:,jpatch))
576  ENDDO
577 !
578 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
579 ENDIF
580 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
581 !
582 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',1,zhook_handle)
583 !
584 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
585 END SUBROUTINE init_from_ref_grid
586 !-------------------------------------------------------------------------------------
587 !
588 END SUBROUTINE prep_hor_isba_field
subroutine prep_isba_grib(HPROGRAM, HSURF, HFILE, KLUOUT, PFIELD, OKEY)
subroutine prep_isba_netcdf(DTCO, U, HPROGRAM, HSURF, HFILE, KLUOUT, PFIELD)
subroutine init_from_ref_grid(PGRID1, PT1, PD2, PT2)
subroutine prep_isba_buffer(IG, U, HPROGRAM, HSURF, KLUOUT, PFIELD)
subroutine prep_isba_ascllv(DTCO, UG, U, USS, HPROGRAM, HSURF, KLUOUT, PFIELD)
subroutine prep_hor_isba_field(DTCO, IG, I, UG, U, USS, HPROGRAM, HSURF, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, OKEY)
integer function vegtype_to_patch(IVEGTYPE, INPATCH)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine hor_interpol(DTCO, U, KLUOUT, PFIELDIN, PFIELDOUT)
Definition: hor_interpol.F90:6
subroutine read_prep_isba_conf(HPROGRAM, HVAR, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, KLUOUT, OUNIF)
subroutine vegtype_grid_to_patch_grid(KPATCH, PVEGTYPE_PATCH, PPATCH, PFIELDOUT, PW)
subroutine prep_isba_extern(DTCO, I, U, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, PFIELD, OKEY)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine put_on_all_vegtypes(KNI, KLAYER, KPATCH, KVEGTYPE, PFIELD_PATCH, PFIELD_VEGTYPE)
subroutine prep_hor_snow_fields(DTCO, IG, U, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, OUNIF, KPATCH, KTEB_PATCH, KL, TPSNOW, TPTIME, PUNIF_WSNOW, PUNIF_RSNOW, PUNIF_TSNOW, PUNIF_LWCSNOW, PUNIF_ASNOW, OSNOW_IDEAL, PUNIF_SG1SNOW, PUNIF_SG2SNOW, PUNIF_HISTSNOW, PUNIF_AGESNOW, PVEGTYPE, PVEGTYPE_PATCH, PPATCH, OKEY)
subroutine prep_isba_unif(KLUOUT, HSURF, PFIELD)
subroutine read_prep_isba_snow(HPROGRAM, HSNOW, KSNOW_LAYER, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, OUNIF)