SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
prep_hor_teb_garden_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_teb_garden_field (DTCO, IG, I, UG, U, USS, &
7  tgd, tgdo, tgdpe, tgdp, tg, top, tvg, &
8  hprogram,hsurf,hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,kpatch)
9 ! #################################################################################
10 !
11 !!**** *PREP_HOR_TEB_GARDEN_FIELD* - reads, interpolates and prepares an ISBA field
12 !!
13 !! PURPOSE
14 !! -------
15 !
16 !!** METHOD
17 !! ------
18 !!
19 !! REFERENCE
20 !! ---------
21 !!
22 !!
23 !! AUTHOR
24 !! ------
25 !! V. Masson
26 !!
27 !! MODIFICATIONS
28 !! -------------
29 !! Original 01/2004
30 !! P. Le Moigne 10/2005, Phasage Arome
31 !! P. Le Moigne 03/2007, Ajout initialisation par ascllv
32 !! B. Decharme 01/2009, Optional Arpege deep soil temperature initialization
33 !! B. Decharme 03/2014, external init with FA files
34 !! new vertical interpol
35 !!------------------------------------------------------------------
36 !
37 !
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 !
56 USE modd_teb_grid_n, ONLY : teb_grid_t
59 !
60 USE modd_prep, ONLY : cingrid_type, cinterp_type, xzs_ls, &
61  xlat_out, xlon_out, xx_out, xy_out, &
62  linterp, cmask
63 
64 USE modd_prep_teb_garden, ONLY : xgrid_soil, ngrid_level, &
65  xwsnow_gd, xrsnow_gd, xtsnow_gd, xlwcsnow_gd, &
66  xagesnow_gd, xasnow_gd, lsnow_ideal_gd
67 
68 USE modd_isba_par, ONLY : xwgmin
69 USE modd_data_cover_par, ONLY : nvegtype
70 USE modd_surf_par, ONLY : xundef
71 !
72 USE modi_read_prep_teb_garden_conf
73 USE modi_read_prep_garden_snow
74 USE modi_prep_teb_garden_ascllv
75 USE modi_prep_teb_garden_grib
76 USE modi_prep_teb_garden_unif
77 USE modi_prep_teb_garden_buffer
78 USE modi_hor_interpol
79 USE modi_put_on_all_vegtypes
80 USE modi_vegtype_grid_to_patch_grid
81 USE modi_prep_hor_snow_fields
82 USE modi_get_luout
83 USE modi_prep_teb_garden_extern
84 USE modi_abor1_sfx
85 !
86 USE yomhook ,ONLY : lhook, dr_hook
87 USE parkind1 ,ONLY : jprb
88 !
89 IMPLICIT NONE
90 !
91 !* 0.1 declarations of arguments
92 !
93 !
94 !
95 TYPE(data_cover_t), INTENT(INOUT) :: dtco
96 TYPE(isba_grid_t), INTENT(INOUT) :: ig
97 TYPE(isba_t), INTENT(INOUT) :: i
98 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
99 TYPE(surf_atm_t), INTENT(INOUT) :: u
100 TYPE(surf_atm_sso_t), INTENT(INOUT) :: uss
101 !
102 TYPE(teb_garden_t), INTENT(INOUT) :: tgd
103 TYPE(teb_garden_options_t), INTENT(INOUT) :: tgdo
104 TYPE(teb_garden_pgd_evol_t), INTENT(INOUT) :: tgdpe
105 TYPE(teb_garden_pgd_t), INTENT(INOUT) :: tgdp
106 TYPE(teb_grid_t), INTENT(INOUT) :: tg
107 TYPE(teb_options_t), INTENT(INOUT) :: top
108 TYPE(teb_veg_options_t), INTENT(INOUT) :: tvg
109 !
110  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling surf. schemes
111  CHARACTER(LEN=7), INTENT(IN) :: hsurf ! type of field
112  CHARACTER(LEN=28), INTENT(IN) :: hatmfile ! name of the Atmospheric file
113  CHARACTER(LEN=6), INTENT(IN) :: hatmfiletype! type of the Atmospheric file
114  CHARACTER(LEN=28), INTENT(IN) :: hpgdfile ! name of the Atmospheric file
115  CHARACTER(LEN=6), INTENT(IN) :: hpgdfiletype! type of the Atmospheric file
116 !
117 INTEGER, INTENT(IN) :: kpatch
118 !
119 !* 0.2 declarations of local variables
120 !
121  CHARACTER(LEN=6) :: yfiletype ! type of input file
122  CHARACTER(LEN=28) :: yfile ! name of file
123  CHARACTER(LEN=6) :: yfilepgdtype ! type of input file
124  CHARACTER(LEN=28) :: yfilepgd ! name of file
125  CHARACTER(LEN=6) :: yfiletype_snow ! type of input file
126  CHARACTER(LEN=28) :: yfile_snow ! name of file
127  CHARACTER(LEN=6) :: yfilepgdtype_snow ! type of input file
128  CHARACTER(LEN=28) :: yfilepgd_snow ! name of file
129 REAL, POINTER, DIMENSION(:,:,:) :: zfieldin ! field to interpolate horizontally
130 REAL, POINTER, DIMENSION(:,:) :: zfield ! field to interpolate horizontally
131 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zfieldoutp ! field interpolated horizontally
132 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zfieldoutv !
133 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zvegtype_patch ! vegtype for each patch
134 REAL, ALLOCATABLE, DIMENSION(:,:) :: zw ! work array (x, fine soil grid)
135 REAL, ALLOCATABLE, DIMENSION(:) :: zsum
136 REAL, ALLOCATABLE, DIMENSION(:,:) :: zf ! work array (x, output soil grid)
137 REAL, ALLOCATABLE, DIMENSION(:,:) :: zdg ! out T grid (x, output soil grid)
138 REAL, ALLOCATABLE, DIMENSION(:,:) :: zpatch ! work array for patches
139 REAL, ALLOCATABLE, DIMENSION(:) :: zsg1snow, zsg2snow, zhistsnow
140 INTEGER :: iluout ! output listing logical unit
141 !
142 LOGICAL :: gunif ! flag for prescribed uniform field
143 LOGICAL :: gunif_snow! flag for prescribed uniform field
144 INTEGER :: jvegtype, jpatch ! loop on vegtypes
145 INTEGER :: jlayer ! loop on layers
146 INTEGER :: ji, inp, inl, ini
147 INTEGER :: iwork ! Work integer
148 REAL(KIND=JPRB) :: zhook_handle
149 !-------------------------------------------------------------------------------------
150 !
151 !
152 !* 1. Reading of input file name and type
153 !
154 IF (lhook) CALL dr_hook('PREP_HOR_TEB_GARDEN_FIELD',0,zhook_handle)
155  CALL get_luout(hprogram,iluout)
156 !
157  CALL read_prep_teb_garden_conf(hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,&
158  hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,iluout,gunif)
159 !
160  cmask = 'TOWN '
161 !
162 ini=SIZE(tg%XLAT)
163 !-------------------------------------------------------------------------------------
164 !
165 !* 2. Snow variables case?
166 !
167 IF (hsurf=='SN_VEG ') THEN
168  CALL read_prep_garden_snow(hprogram,tgd%CUR%TSNOW%SCHEME,tgd%CUR%TSNOW%NLAYER,yfile_snow,&
169  yfiletype_snow,yfilepgd_snow,yfilepgdtype_snow,gunif_snow)
170  IF(.NOT.gunif_snow.AND.len_trim(yfile_snow)==0.AND.len_trim(yfiletype_snow)==0)THEN
171  !IF(LEN_TRIM(YFILE)/=0.AND.LEN_TRIM(YFILETYPE)/=0)THEN
172  IF (yfiletype=='GRIB') THEN
173  yfile_snow =yfile
174  yfiletype_snow=yfiletype
175  yfilepgd_snow =yfilepgd
176  yfilepgdtype_snow=yfilepgdtype
177  ELSE
178  gunif_snow=.true.
179  IF(all(xwsnow_gd==xundef))xwsnow_gd=0.0
180  ENDIF
181  ENDIF
182  ALLOCATE(zsg1snow(SIZE(xwsnow_gd)))
183  ALLOCATE(zsg2snow(SIZE(xwsnow_gd)))
184  ALLOCATE(zhistsnow(SIZE(xwsnow_gd)))
185  ALLOCATE(zpatch(SIZE(tgdp%XVEGTYPE,1),1))
186  ALLOCATE(zvegtype_patch(SIZE(tgdp%XVEGTYPE,1),SIZE(tgdp%XVEGTYPE,2),1))
187  !
188  zpatch=1.
189  zvegtype_patch(:,:,1) = tgdp%XVEGTYPE(:,:)
190  CALL prep_hor_snow_fields(dtco, &
191  ig, u, &
192  hprogram,hsurf, &
193  yfile,yfiletype, &
194  yfilepgd, yfilepgdtype, &
195  iluout,gunif_snow,1,kpatch, &
196  ini,tgd%CUR%TSNOW, top%TTIME, &
197  xwsnow_gd, xrsnow_gd, xtsnow_gd,&
198  xlwcsnow_gd, xasnow_gd, &
199  lsnow_ideal_gd, zsg1snow, &
200  zsg2snow, zhistsnow, xagesnow_gd, &
201  tgdp%XVEGTYPE,zvegtype_patch, zpatch )
202  DEALLOCATE(zsg1snow)
203  DEALLOCATE(zsg2snow)
204  DEALLOCATE(zhistsnow)
205  DEALLOCATE(zpatch)
206  DEALLOCATE(zvegtype_patch)
207  IF (lhook) CALL dr_hook('PREP_HOR_TEB_GARDEN_FIELD',1,zhook_handle)
208  RETURN
209 END IF
210 !
211 !-------------------------------------------------------------------------------------
212 !
213 !* 3. Reading of input configuration (Grid and interpolation type)
214 !
215 IF (gunif) THEN
216  CALL prep_teb_garden_unif(iluout,hsurf,zfieldin)
217 ELSE IF (yfiletype=='ASCLLV') THEN
218  CALL prep_teb_garden_ascllv(dtco, ug, u, uss, &
219  hprogram,hsurf,iluout,zfieldin)
220 ELSE IF (yfiletype=='GRIB ') THEN
221  CALL prep_teb_garden_grib(hprogram,hsurf,yfile,iluout,zfieldin)
222 ELSE IF (yfiletype=='MESONH' .OR. yfiletype=='ASCII ' .OR. yfiletype=='LFI '.OR.yfiletype=='FA ') THEN
223  CALL prep_teb_garden_extern(dtco, i, u, &
224  hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,iluout,kpatch,zfieldin)
225 ELSE IF (yfiletype=='BUFFER') THEN
226  CALL prep_teb_garden_buffer(hprogram,hsurf,iluout,zfieldin)
227 ELSE
228  CALL abor1_sfx('PREP_HOR_TEB_GARDEN_FIELD: data file type not supported : '//yfiletype)
229 END IF
230 !
231 !-------------------------------------------------------------------------------------
232 !
233 !* 5. Horizontal interpolation
234 !
235 inl = SIZE(zfieldin,2)
236 inp = SIZE(zfieldin,3)
237 !
238 ALLOCATE(zfieldoutp(ini,inl,inp))
239 ALLOCATE(zfield(SIZE(zfieldin,1),inl))
240 !
241 DO jpatch = 1, SIZE(zfieldin,3)
242  zfield=zfieldin(:,:,jpatch)
243  IF (inp==nvegtype) linterp = (tgdp%XVEGTYPE(:,jpatch) > 0.)
244  CALL hor_interpol(dtco, u, &
245  iluout,zfield,zfieldoutp(:,:,jpatch))
246  linterp = .true.
247 END DO
248 !
249 DEALLOCATE(zfield)
250 !
251 ALLOCATE(zfieldoutv(ini,inl,nvegtype))
252 !
253  CALL put_on_all_vegtypes(ini,inl,inp,nvegtype,zfieldoutp,zfieldoutv)
254 !
255 DEALLOCATE(zfieldoutp)
256 !
257 !-------------------------------------------------------------------------------------
258 !
259 !* 6. Transformation from vegtype grid to averaged grid
260 !
261 ALLOCATE(zw(ini,SIZE(zfieldoutv,2)))
262 ALLOCATE(zsum(SIZE(zfieldoutv,1)))
263 zw = 0.
264 !
265 DO jlayer=1,SIZE(zw,2)
266  zsum(:) = sum(tgdp%XVEGTYPE(:,:),2,zfieldoutv(:,jlayer,:)/=xundef)
267  DO jvegtype=1,nvegtype
268  WHERE (zfieldoutv(:,jlayer,jvegtype)/=xundef)
269  zw(:,jlayer) = zw(:,jlayer) + tgdp%XVEGTYPE(:,jvegtype) * zfieldoutv(:,jlayer,jvegtype) / zsum(:)
270  END WHERE
271  END DO
272  DO ji=1,SIZE(zw,1)
273  IF (all(zfieldoutv(ji,jlayer,:)==xundef)) zw(ji,jlayer) = xundef
274  ENDDO
275 END DO
276 !
277 !-------------------------------------------------------------------------------------
278 !
279 !* 7. Return to historical variable
280 !
281 !
282 SELECT CASE (hsurf)
283  !
284  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
285  !
286  CASE('WG ')
287  ALLOCATE(zf(SIZE(zfieldoutv,1),tgdo%NGROUND_LAYER))
288  !
289  !* interpolates on output levels
290  CALL init_from_ref_grid(xgrid_soil,zw,tgdp%XDG,zf)
291  !
292  !* retrieves soil water content from soil relative humidity
293  ALLOCATE(tgd%CUR%XWG(SIZE(zfieldoutv,1),tgdo%NGROUND_LAYER))
294  tgd%CUR%XWG(:,:) = tgdp%XWWILT + zf(:,:) * (tgdp%XWFC-tgdp%XWWILT)
295  tgd%CUR%XWG(:,:) = max(min(tgd%CUR%XWG(:,:),tgdp%XWSAT),xwgmin)
296  !
297  WHERE(zf(:,:)==xundef)tgd%CUR%XWG(:,:)=xundef
298  !
299  DEALLOCATE(zf)
300  !
301  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
302  !
303  CASE('WGI ')
304  ALLOCATE(zf(SIZE(zfieldoutv,1),tgdo%NGROUND_LAYER))
305  !
306  !* interpolates on output levels
307  CALL init_from_ref_grid(xgrid_soil,zw,tgdp%XDG,zf)
308  !
309  !* retrieves soil ice content from soil relative humidity
310  ALLOCATE(tgd%CUR%XWGI(SIZE(zfieldoutv,1),tgdo%NGROUND_LAYER))
311  tgd%CUR%XWGI(:,:) = zf(:,:) * tgdp%XWSAT
312  tgd%CUR%XWGI(:,:) = max(min(tgd%CUR%XWGI(:,:),tgdp%XWSAT),0.)
313  !
314  WHERE(zf(:,:)==xundef)tgd%CUR%XWGI(:,:)=xundef
315  !
316  DEALLOCATE(zf)
317  !
318  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
319  !
320  CASE('TG ')
321  iwork=tgdo%NGROUND_LAYER
322  ALLOCATE(tgd%CUR%XTG(SIZE(zfieldoutv,1),iwork))
323  ALLOCATE(zdg(SIZE(tgdp%XDG,1),iwork))
324  IF (tvg%CISBA=='2-L'.OR.tvg%CISBA=='3-L') THEN
325  zdg(:,1) = 0.01
326  zdg(:,2) = 0.40 ! deep temperature for force-restore taken at 20cm
327  IF(tvg%CISBA=='3-L') zdg(:,3) = 5.00 ! climatological temperature, usually not used
328  ELSE
329  !* diffusion method, the soil grid is the same as for humidity
330  zdg(:,:) = tgdp%XDG(:,:)
331  END IF
332  CALL init_from_ref_grid(xgrid_soil,zw,zdg,tgd%CUR%XTG)
333  DEALLOCATE(zdg)
334  !
335 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
336  !
337  CASE('WR ')
338  ALLOCATE(tgd%CUR%XWR(SIZE(zfieldoutv,1)))
339  tgd%CUR%XWR(:) = zw(:,1)
340  !
341  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
342  !
343  CASE('LAI ')
344  !* LAI is updated only if present and pertinent (evolutive LAI) in input file
345 
346  WHERE (zw(:,1)/=xundef) tgdpe%CUR%XLAI(:) = zw(:,1)
347  !
348 END SELECT
349 !
350 DEALLOCATE(zw)
351 !-------------------------------------------------------------------------------------
352 !
353 !* 8. Deallocations
354 !
355 DEALLOCATE(zfieldin )
356 DEALLOCATE(zfieldoutv)
357 !
358 IF (lhook) CALL dr_hook('PREP_HOR_TEB_GARDEN_FIELD',1,zhook_handle)
359 !
360 !-------------------------------------------------------------------------------------
361 !-------------------------------------------------------------------------------------
362 !
363  CONTAINS
364 !
365 !-------------------------------------------------------------------------------------
366 !-------------------------------------------------------------------------------------
367 !
368 SUBROUTINE init_from_ref_grid(PGRID1,PT1,PD2,PT2)
369 !
371 !
372 REAL, DIMENSION(:,:), INTENT(IN) :: pt1 ! variable profile
373 REAL, DIMENSION(:), INTENT(IN) :: pgrid1 ! normalized grid
374 REAL, DIMENSION(:,:), INTENT(IN) :: pd2 ! output layer thickness
375 REAL, DIMENSION(:,:), INTENT(OUT) :: pt2 ! variable profile
376 !
377 INTEGER :: ji, jl ! loop counter
378 REAL, DIMENSION(SIZE(PT1,1),SIZE(PT1,2)) :: zd1 ! input grid
379 !
380 INTEGER :: ilayer1, ilayer2
381 REAL(KIND=JPRB) :: zhook_handle
382 !
383 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
384 !
385 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',0,zhook_handle)
386 !
387 IF (SIZE(pt1,2)==3) THEN
388 !
389 !* 1. case with only 3 input levels (typically coming from 'UNIF')
390 ! -----------------------------
391 !
392  IF (tvg%CISBA=='2-L' .OR. tvg%CISBA=='3-L') THEN
393  !* Possible LTEMP_ARP case
394  IF(SIZE(pt2,2)>3)THEN
395  ilayer1=3
396  ilayer2=SIZE(pt2,2)
397  ELSE
398  ilayer1=SIZE(pt2,2)
399  ilayer2=0
400  ENDIF
401  !* historical 2L or 3L ISBA version
402  pt2(:,1:ilayer1) = pt1(:,1:ilayer1)
403  !* Possible LTEMP_ARP case
404  IF(ilayer2>0)THEN
405  DO jl=ilayer1+1,ilayer2
406  pt2(:,jl) = pt2(:,ilayer1)
407  ENDDO
408  ENDIF
409 !
410  ELSEIF(tvg%CISBA=='DIF')THEN
411  !surface layer (generally 0.01m imposed)
412  pt2(:,1) = pt1(:,1)
413  !deep layers
414  DO jl=2,tgdo%NGROUND_LAYER
415  pt2(:,jl) = pt1(:,3)
416  END DO
417  !if root layers
418  DO ji=1,SIZE(pt1,1)
419  DO jl=2,tgdo%NGROUND_LAYER
420  IF(tgdp%XROOTFRAC(ji,jl)<=1.0)THEN
421  pt2(ji,jl) = pt1(ji,2)
422  EXIT
423  ENDIF
424  END DO
425  END DO
426  END IF
427 !
428 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
429 ELSE
430 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
431 !
432 !* 2. case with fine grid as input (general case)
433 ! ----------------------------
434 !
435  DO jl=1,SIZE(pt1,2)
436  zd1(:,jl) = pgrid1(jl)
437  END DO
438 !
439  CALL interp_grid_nat(zd1,pt1(:,:),pd2,pt2(:,:))
440 !
441 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
442 ENDIF
443 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
444 !
445 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',1,zhook_handle)
446 !
447 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
448 END SUBROUTINE init_from_ref_grid
449 !-------------------------------------------------------------------------------------
450 !
451 END SUBROUTINE prep_hor_teb_garden_field
subroutine prep_hor_teb_garden_field(DTCO, IG, I, UG, U, USS, TGD, TGDO, TGDPE, TGDP, TG, TOP, TVG, HPROGRAM, HSURF, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, KPATCH)
subroutine prep_teb_garden_ascllv(DTCO, UG, U, USS, HPROGRAM, HSURF, KLUOUT, PFIELD)
subroutine init_from_ref_grid(PGRID1, PT1, PD2, PT2)
subroutine prep_teb_garden_unif(KLUOUT, HSURF, PFIELD)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine read_prep_garden_snow(HPROGRAM, HSNOW, KSNOW_LAYER, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, OUNIF)
subroutine read_prep_teb_garden_conf(HPROGRAM, HVAR, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, KLUOUT, OUNIF)
subroutine prep_teb_garden_extern(DTCO, I, U, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, KPATCH, PFIELD)
subroutine hor_interpol(DTCO, U, KLUOUT, PFIELDIN, PFIELDOUT)
Definition: hor_interpol.F90:6
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_teb_garden_buffer(HPROGRAM, HSURF, KLUOUT, PFIELD)
subroutine prep_teb_garden_grib(HPROGRAM, HSURF, HFILE, KLUOUT, PFIELD)