SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
prep_hor_teb_greenroof_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_greenroof_field (DTCO, IG, I, UG, U, USS, TGR, TGRO, TGRPE, TGRP, &
7  tg, top, &
8  hprogram,hsurf,hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,kpatch)
9 ! #################################################################################################
10 !
11 !!**** *PREP_HOR_TEB_GREENROOF_FIELD* - reads, interpolates and prepares an ISBA field for green roofs
12 !!
13 !! PURPOSE
14 !! -------
15 !
16 !!** METHOD
17 !! ------
18 !!
19 !! Based on "prep_hor_teb_garden_field"
20 !!
21 !! REFERENCE
22 !! ---------
23 !!
24 !!
25 !! AUTHOR
26 !! ------
27 !! V. Masson, A. Lemonsu & C. de Munck
28 !!
29 !! MODIFICATIONS
30 !! -------------
31 !! Original 07/2011
32 !!------------------------------------------------------------------
33 !
34 !
36 USE modd_isba_grid_n, ONLY : isba_grid_t
37 USE modd_isba_n, ONLY : isba_t
39 USE modd_surf_atm_n, ONLY : surf_atm_t
45 USE modd_teb_grid_n, ONLY : teb_grid_t
47 !
48 USE modd_prep, ONLY : cingrid_type, cinterp_type, xzs_ls, &
49  xlat_out, xlon_out, xx_out, xy_out, &
50  linterp, cmask
51 USE modd_prep_teb_greenroof, ONLY : xgrid_soil, ngrid_level, &
52  xwsnow_gr, xrsnow_gr, xtsnow_gr,xlwcsnow_gr, &
53  xagesnow_gr, xasnow_gr, lsnow_ideal_gr
54 USE modd_isba_par, ONLY : xwgmin
55 USE modd_data_cover_par, ONLY : nvegtype
56 USE modd_surf_par, ONLY : xundef
57 !
58 USE modi_read_prep_teb_greenroof_conf
59 USE modi_read_prep_greenroof_snow
60 USE modi_prep_teb_greenroof_ascllv
61 USE modi_prep_teb_greenroof_grib
62 USE modi_prep_teb_greenroof_unif
63 USE modi_prep_teb_greenroof_buffer
64 USE modi_hor_interpol
65 USE modi_vegtype_grid_to_patch_grid
66 USE modi_prep_hor_snow_fields
67 USE modi_get_luout
68 USE modi_prep_teb_greenroof_extern
69 USE modi_put_on_all_vegtypes
70 !
71 USE modi_abor1_sfx
72 !
73 USE yomhook ,ONLY : lhook, dr_hook
74 USE parkind1 ,ONLY : jprb
75 !
76 IMPLICIT NONE
77 !
78 !* 0.1 declarations of arguments
79 !
80 !
81 TYPE(data_cover_t), INTENT(INOUT) :: dtco
82 TYPE(isba_grid_t), INTENT(INOUT) :: ig
83 TYPE(isba_t), INTENT(INOUT) :: i
84 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
85 TYPE(surf_atm_t), INTENT(INOUT) :: u
86 TYPE(surf_atm_sso_t), INTENT(INOUT) :: uss
87 TYPE(teb_greenroof_t), INTENT(INOUT) :: tgr
88 TYPE(teb_greenroof_options_t), INTENT(INOUT) :: tgro
89 TYPE(teb_greenroof_pgd_evol_t), INTENT(INOUT) :: tgrpe
90 TYPE(teb_greenroof_pgd_t), INTENT(INOUT) :: tgrp
91 TYPE(teb_grid_t), INTENT(INOUT) :: tg
92 TYPE(teb_options_t), INTENT(INOUT) :: top
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 INTEGER, INTENT(IN) :: kpatch
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) :: yfilepgdtype ! type of input file
108  CHARACTER(LEN=28) :: yfilepgd ! name of file
109  CHARACTER(LEN=6) :: yfiletype_snow ! type of input file
110  CHARACTER(LEN=28) :: yfile_snow ! name of file
111  CHARACTER(LEN=6) :: yfilepgdtype_snow ! type of input file
112  CHARACTER(LEN=28) :: yfilepgd_snow ! name of file
113 REAL, POINTER, DIMENSION(:,:,:) :: zfieldin ! field to interpolate horizontally
114 REAL, POINTER, DIMENSION(:,:) :: zfield ! field to interpolate horizontally
115 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zfieldoutp ! field interpolated horizontally
116 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zfieldoutv !
117 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zvegtype_patch ! vegtype for each patch
118 REAL, ALLOCATABLE, DIMENSION(:,:) :: zw ! work array (x, fine soil grid, npatch)
119 REAL, ALLOCATABLE, DIMENSION(:,:) :: zf ! work array (x, output soil grid, npatch)
120 REAL, ALLOCATABLE, DIMENSION(:,:) :: zdg ! out T grid (x, output soil grid, npatch)
121 REAL, ALLOCATABLE, DIMENSION(:,:) :: zpatch ! work array for patches
122 REAL, ALLOCATABLE, DIMENSION(:) :: zsg1snow, zsg2snow, zhistsnow
123 INTEGER :: iluout ! output listing logical unit
124 !
125 LOGICAL :: gunif ! flag for prescribed uniform field
126 LOGICAL :: gunif_snow ! flag for prescribed uniform field
127 INTEGER :: jvegtype, jpatch ! loop on vegtypes
128 INTEGER :: jlayer ! loop on layers
129 INTEGER :: ini, inl, inp
130 INTEGER :: iwork ! Work integer
131 REAL(KIND=JPRB) :: zhook_handle
132 !-------------------------------------------------------------------------------------
133 !
134 !
135 !* 1. Reading of input file name and type
136 !
137 IF (lhook) CALL dr_hook('PREP_HOR_TEB_GREENROOF_FIELD',0,zhook_handle)
138 !
139 !
140  CALL get_luout(hprogram,iluout)
141 !
142  CALL read_prep_teb_greenroof_conf(hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,&
143  hatmfile,hatmfiletype,hpgdfile,hpgdfiletype,iluout,gunif)
144 !
145  cmask = 'TOWN '
146 !
147 ini=SIZE(tg%XLAT)
148 !
149 !-------------------------------------------------------------------------------------
150 !* 2. Snow variables case
151 !
152 IF (hsurf=='SN_VEG ') THEN
153  CALL read_prep_greenroof_snow(hprogram,tgr%CUR%TSNOW%SCHEME,tgr%CUR%TSNOW%NLAYER,yfile_snow,&
154  yfiletype_snow,yfilepgd_snow,yfilepgdtype_snow,gunif_snow)
155  IF(.NOT.gunif_snow.AND.len_trim(yfile_snow)==0.AND.len_trim(yfiletype_snow)==0)THEN
156  !IF(LEN_TRIM(YFILE)/=0.AND.LEN_TRIM(YFILETYPE)/=0)THEN
157  IF (yfiletype=='GRIB') THEN
158  yfile_snow =yfile
159  yfiletype_snow=yfiletype
160  yfilepgd_snow =yfilepgd
161  yfilepgdtype_snow=yfilepgdtype
162  ELSE
163  gunif_snow=.true.
164  IF(all(xwsnow_gr==xundef))xwsnow_gr=0.0
165  ENDIF
166  ENDIF
167  ALLOCATE(zsg1snow(SIZE(xwsnow_gr)))
168  ALLOCATE(zsg2snow(SIZE(xwsnow_gr)))
169  ALLOCATE(zhistsnow(SIZE(xwsnow_gr)))
170  ALLOCATE(zpatch(SIZE(tgrp%XVEGTYPE,1),1))
171  ALLOCATE(zvegtype_patch(SIZE(tgrp%XVEGTYPE,1),SIZE(tgrp%XVEGTYPE,2),1))
172  !
173  zpatch=1.
174  zvegtype_patch(:,:,1) = tgrp%XVEGTYPE(:,:)
175  CALL prep_hor_snow_fields(dtco, &
176  ig, u, &
177  hprogram,hsurf, &
178  yfile,yfiletype, &
179  yfilepgd, yfilepgdtype, &
180  iluout,gunif_snow, 1, kpatch, &
181  SIZE(tg%XLAT),tgr%CUR%TSNOW, top%TTIME, &
182  xwsnow_gr, xrsnow_gr, xtsnow_gr,&
183  xlwcsnow_gr, xasnow_gr, &
184  lsnow_ideal_gr, zsg1snow, &
185  zsg2snow, zhistsnow, xagesnow_gr, &
186  tgrp%XVEGTYPE,zvegtype_patch, zpatch )
187  DEALLOCATE(zsg1snow)
188  DEALLOCATE(zsg2snow)
189  DEALLOCATE(zhistsnow)
190  DEALLOCATE(zpatch)
191  DEALLOCATE(zvegtype_patch)
192  IF (lhook) CALL dr_hook('PREP_HOR_TEB_GREENROOF_FIELD',1,zhook_handle)
193  RETURN
194 END IF
195 !
196 !-------------------------------------------------------------------------------------
197 !
198 !* 3. Reading of input configuration (Grid and interpolation type)
199 !
200 IF (gunif) THEN
201  CALL prep_teb_greenroof_unif(iluout,hsurf,zfieldin)
202 ELSE IF (yfiletype=='ASCLLV') THEN
203  CALL prep_teb_greenroof_ascllv(dtco, ug, u, uss, &
204  hprogram,hsurf,iluout,zfieldin)
205 ELSE IF (yfiletype=='GRIB ') THEN
206  CALL prep_teb_greenroof_grib(hprogram,hsurf,yfile,iluout,zfieldin)
207 ELSE IF (yfiletype=='MESONH' .OR. yfiletype=='ASCII ' .OR. yfiletype=='LFI '.OR. yfiletype=='FA ') THEN
208  CALL prep_teb_greenroof_extern(dtco, i, u, &
209  hprogram,hsurf,yfile,yfiletype,yfilepgd,yfilepgdtype,iluout,kpatch,zfieldin)
210 ELSE IF (yfiletype=='BUFFER') THEN
211  CALL prep_teb_greenroof_buffer(hprogram,hsurf,iluout,zfieldin)
212 ELSE
213  CALL abor1_sfx('PREP_HOR_TEB_GREENROOF_FIELD: data file type not supported : '//yfiletype)
214 END IF
215 !
216 !-------------------------------------------------------------------------------------
217 !
218 !* 5. Horizontal interpolation for vegtype grid
219 !
220 inl = SIZE(zfieldin,2)
221 inp = SIZE(zfieldin,3)
222 !
223 ALLOCATE(zfieldoutp(ini,inl,inp))
224 ALLOCATE(zfield(SIZE(zfieldin,1),inl))
225 !
226 DO jpatch = 1, inp
227  zfield=zfieldin(:,:,jpatch)
228  IF (inp==nvegtype) linterp = (tgrp%XVEGTYPE(:,jpatch) > 0.)
229  CALL hor_interpol(dtco, u, &
230  iluout,zfield,zfieldoutp(:,:,jpatch))
231  linterp = .true.
232 END DO
233 !
234 DEALLOCATE(zfield)
235 !
236 ALLOCATE(zfieldoutv(ini,inl,nvegtype))
237 !
238  CALL put_on_all_vegtypes(ini,inl,inp,nvegtype,zfieldoutp,zfieldoutv)
239 !
240 DEALLOCATE(zfieldoutp)
241 !
242 !-------------------------------------------------------------------------------------
243 !
244 !* 6. Transformation from vegtype grid to patch grid
245 !
246 ALLOCATE(zw(ini,inl))
247 zw = 0.
248 DO jvegtype=1,nvegtype
249  DO jlayer=1,SIZE(zw,2)
250  zw(:,jlayer) = zw(:,jlayer) + tgrp%XVEGTYPE(:,jvegtype) * zfieldoutv(:,jlayer,jvegtype)
251  END DO
252 END DO
253 !
254 !
255 !* 8. Deallocations
256 !
257 DEALLOCATE(zfieldin )
258 DEALLOCATE(zfieldoutv)
259 !
260 !-------------------------------------------------------------------------------------
261 !
262 !* 7. Return to historical variable
263 !
264 !
265 SELECT CASE (hsurf)
266  !
267  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
268  !
269  CASE('WG ')
270  ALLOCATE(zf(ini,tgro%NLAYER_GR))
271  !
272  !* interpolates on output levels
273  CALL init_from_ref_grid(xgrid_soil,zw,tgrp%XDG,zf)
274  !
275  !* retrieves soil water content from soil relative humidity
276  ALLOCATE(tgr%CUR%XWG(ini,tgro%NLAYER_GR))
277  tgr%CUR%XWG(:,:) = tgrp%XWWILT + zf(:,:) * (tgrp%XWFC-tgrp%XWWILT)
278  tgr%CUR%XWG(:,:) = max(min(tgr%CUR%XWG(:,:),tgrp%XWSAT),xwgmin)
279  !
280  WHERE(zf(:,:)==xundef)tgr%CUR%XWG(:,:)=xundef
281  !
282  DEALLOCATE(zf)
283  !
284  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
285  !
286  CASE('WGI ')
287  ALLOCATE(zf(ini,tgro%NLAYER_GR))
288  !
289  !* interpolates on output levels
290  CALL init_from_ref_grid(xgrid_soil,zw,tgrp%XDG,zf)
291  !
292  !* retrieves soil ice content from soil relative humidity
293  ALLOCATE(tgr%CUR%XWGI(ini,tgro%NLAYER_GR))
294  tgr%CUR%XWGI(:,:) = zf(:,:) * tgrp%XWSAT
295  tgr%CUR%XWGI(:,:) = max(min(tgr%CUR%XWGI(:,:),tgrp%XWSAT),0.)
296  !
297  WHERE(zf(:,:)==xundef)tgr%CUR%XWGI(:,:)=xundef
298  !
299  DEALLOCATE(zf)
300  !
301  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
302  !
303  CASE('TG ')
304  iwork=tgro%NLAYER_GR
305  ALLOCATE(tgr%CUR%XTG(ini,iwork))
306  ALLOCATE(zdg(SIZE(tgrp%XDG,1),iwork))
307  !* diffusion method, the soil grid is the same as for humidity
308  zdg(:,:) = tgrp%XDG(:,:)
309  CALL init_from_ref_grid(xgrid_soil,zw,zdg,tgr%CUR%XTG)
310  DEALLOCATE(zdg)
311  !
312 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
313  !
314  CASE('WR ')
315  ALLOCATE(tgr%CUR%XWR(ini))
316  tgr%CUR%XWR(:) = zw(:,1)
317  !
318  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
319  !
320  CASE('LAI ')
321  !* LAI is updated only if present and pertinent (evolutive LAI) in input file
322  WHERE (zw(:,1)/=xundef) tgrpe%CUR%XLAI(:) = zw(:,1)
323  !
324 END SELECT
325 !
326 DEALLOCATE(zw)
327 !-------------------------------------------------------------------------------------
328 !
329 IF (lhook) CALL dr_hook('PREP_HOR_TEB_GREENROOF_FIELD',1,zhook_handle)
330 !
331 !-------------------------------------------------------------------------------------
332 !-------------------------------------------------------------------------------------
333 !
334  CONTAINS
335 !
336 !-------------------------------------------------------------------------------------
337 !-------------------------------------------------------------------------------------
338 !
339 SUBROUTINE init_from_ref_grid(PGRID1,PT1,PD2,PT2)
340 !
342 !
343 REAL, DIMENSION(:,:), INTENT(IN) :: pt1 ! variable profile
344 REAL, DIMENSION(:), INTENT(IN) :: pgrid1 ! normalized grid
345 REAL, DIMENSION(:,:), INTENT(IN) :: pd2 ! output layer thickness
346 REAL, DIMENSION(:,:), INTENT(OUT) :: pt2 ! variable profile
347 !
348 INTEGER :: ji, jl ! loop counter
349 REAL, DIMENSION(SIZE(PT1,1),SIZE(PT1,2)) :: zd1 ! input grid
350 !
351 INTEGER :: ilayer1, ilayer2
352 REAL(KIND=JPRB) :: zhook_handle
353 !
354 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
355 !
356 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',0,zhook_handle)
357 !
358 IF (SIZE(pt1,2)==3) THEN
359 !
360 !* 1. case with only 3 input levels (typically coming from 'UNIF')
361 ! -----------------------------
362 !
363  !surface layer (generally 0.01m imposed)
364  pt2(:,1) = pt1(:,1)
365  !deep layers
366  DO jl=2,tgro%NLAYER_GR
367  pt2(:,jl) = pt1(:,3)
368  END DO
369  !if root layers
370  DO ji=1,SIZE(pt1,1)
371  DO jl=2,tgro%NLAYER_GR
372  IF(tgrp%XROOTFRAC(ji,jl)<=1.0)THEN
373  pt2(ji,jl) = pt1(ji,2)
374  EXIT
375  ENDIF
376  END DO
377  END DO
378 !
379 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
380 ELSE
381 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
382 !
383 !* 2. case with fine grid as input (general case)
384 ! ----------------------------
385 !
386  DO jl=1,SIZE(pt1,2)
387  zd1(:,jl) = pgrid1(jl)
388  END DO
389 !
390  CALL interp_grid_nat(zd1,pt1(:,:),pd2,pt2(:,:))
391 !
392 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
393 END IF
394 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
395 !
396 IF (lhook) CALL dr_hook('INIT_FROM_REF_GRID',1,zhook_handle)
397 !
398 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
399 END SUBROUTINE init_from_ref_grid
400 !-------------------------------------------------------------------------------------
401 !
402 END SUBROUTINE prep_hor_teb_greenroof_field
subroutine prep_teb_greenroof_buffer(HPROGRAM, HSURF, KLUOUT, PFIELD)
subroutine init_from_ref_grid(PGRID1, PT1, PD2, PT2)
subroutine read_prep_greenroof_snow(HPROGRAM, HSNOW, KSNOW_LAYER, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, OUNIF)
subroutine prep_hor_teb_greenroof_field(DTCO, IG, I, UG, U, USS, TGR, TGRO, TGRPE, TGRP, TG, TOP, HPROGRAM, HSURF, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, KPATCH)
subroutine prep_teb_greenroof_ascllv(DTCO, UG, U, USS, HPROGRAM, HSURF, KLUOUT, PFIELD)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine prep_teb_greenroof_unif(KLUOUT, HSURF, PFIELD)
subroutine hor_interpol(DTCO, U, KLUOUT, PFIELDIN, PFIELDOUT)
Definition: hor_interpol.F90:6
subroutine prep_teb_greenroof_grib(HPROGRAM, HSURF, HFILE, KLUOUT, PFIELD)
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_greenroof_extern(DTCO, I, U, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, KPATCH, PFIELD)
subroutine read_prep_teb_greenroof_conf(HPROGRAM, HVAR, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, KLUOUT, OUNIF)