SURFEX v8.1
General documentation of Surfex
prep_teb_extern.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_teb_extern (DTCO, GCP, TOP, BOP, &
7  HPROGRAM,HSURF,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,KLUOUT,KPATCH,PFIELD)
8 ! #################################################################################
9 !
10 !
11 !! MODIFICATIONS
12 !! -------------
13 !
14 !
19 !
20 USE modd_surfex_mpi, ONLY : nrank, npio
22 !
23 USE modi_prep_grid_extern
25 USE modi_get_teb_depths
27 USE modi_open_aux_io_surf
28 USE modi_close_aux_io_surf
29 USE modi_town_presence
30 USE modi_read_teb_patch
31 USE modi_make_choice_array
32 !
34 USE modd_prep_teb, ONLY : xgrid_road, xgrid_wall, xgrid_roof, &
35  xgrid_floor, xws_roof, xws_road, &
36  xti_bld_def, xws_roof_def, xws_road_def, xhui_bld_def
37 USE modd_data_cover_par, ONLY : jpcover
38 USE modd_surf_par, ONLY: xundef
39 !
40 USE yomhook ,ONLY : lhook, dr_hook
41 USE parkind1 ,ONLY : jprb
42 !
43 IMPLICIT NONE
44 !
45 !* 0.1 declarations of arguments
46 !
47 !
48 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
49 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
50 TYPE(teb_options_t), INTENT(INOUT) :: TOP
51 TYPE(bem_options_t), INTENT(INOUT) :: BOP
52 !
53  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
54  CHARACTER(LEN=7), INTENT(IN) :: HSURF ! type of field
55  CHARACTER(LEN=28), INTENT(IN) :: HFILE ! name of file
56  CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! type of input file
57  CHARACTER(LEN=28), INTENT(IN) :: HFILEPGD ! name of file
58  CHARACTER(LEN=6), INTENT(IN) :: HFILEPGDTYPE ! type of input file
59 INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing
60 INTEGER, INTENT(IN) :: KPATCH
61 REAL,DIMENSION(:,:), POINTER :: PFIELD ! field to interpolate horizontally
62 !
63 !* 0.2 declarations of local variables
64 !
65 REAL, DIMENSION(:,:), ALLOCATABLE :: ZFIELD ! field read
66 REAL, DIMENSION(:,:), ALLOCATABLE :: ZDEPTH ! depth of each layer
67 REAL :: ZDEPTH_TOT ! total depth of surface
68 !
69 REAL, DIMENSION(:,:), ALLOCATABLE :: ZD ! intermediate array
70 !
71 REAL, DIMENSION(:), ALLOCATABLE :: ZMASK
72 !
73  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
74 INTEGER :: IRESP ! reading return code
75 INTEGER :: ILAYER ! number of layers
76 INTEGER :: JLAYER, JI ! loop counter
77 INTEGER :: IVERSION_PGD, IVERSION_PREP ! SURFEX version
78 INTEGER :: IBUGFIX_PGD, IBUGFIX_PREP ! SURFEX bug version
79 LOGICAL :: GOLD_NAME ! old name flag for temperatures
80  CHARACTER(LEN=4) :: YWALL_OPT ! option of walls
81  CHARACTER(LEN=6) :: YSURF ! Surface type
82  CHARACTER(LEN=3) :: YBEM ! key of the building energy model DEF for DEFault (Masson et al. 2002) ,
83  ! BEM for Building Energy Model (Bueno et al. 2012)
84 !
85 INTEGER :: INI ! total 1D dimension
86 !
87 LOGICAL :: GDIM
88 LOGICAL :: GTEB ! flag if TEB fields are present
89 INTEGER :: IPATCH ! number of soil temperature patches
90 INTEGER :: ITEB_PATCH! number of TEB patches in file
91  CHARACTER(LEN=3) :: YPATCH ! indentificator for TEB patch
92 REAL(KIND=JPRB) :: ZHOOK_HANDLE
93 !-------------------------------------------------------------------------------------
94 !
95 !* 1. Preparation of IO for reading in the file
96 ! -----------------------------------------
97 !
98 !* Note that all points are read, even those without physical meaning.
99 ! These points will not be used during the horizontal interpolation step.
100 ! Their value must be defined as XUNDEF.
101 !
102 IF (lhook) CALL dr_hook('PREP_TEB_EXTERN',0,zhook_handle)
103 !
104 !
105  CALL open_aux_io_surf(hfile,hfiletype,'FULL ')
106  CALL read_surf(hfiletype,'VERSION',iversion_prep,iresp,hdir='-')
107  CALL read_surf(hfiletype,'BUG',ibugfix_prep,iresp,hdir='-')
108  gdim = (iversion_prep>8 .OR. iversion_prep==8 .AND. ibugfix_prep>0)
109  IF (gdim) CALL read_surf(hfiletype,'SPLIT_PATCH',gdim,iresp)
110  CALL close_aux_io_surf(hfile,hfiletype)
111  !
112 !* reading of version of the file being read
113  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'FULL ')
114  CALL read_surf(hfilepgdtype,'VERSION',iversion_pgd,iresp,hdir='-')
115  CALL read_surf(hfilepgdtype,'BUG',ibugfix_pgd,iresp,hdir='-')
116 !
117 !-------------------------------------------------------------------------------------
118 !
119 !* 2. Reading of grid
120 ! ---------------
121 !
122 !* reads the grid
123  CALL prep_grid_extern(gcp,hfilepgdtype,kluout,cingrid_type,cinterp_type,ini)
124 !
125 IF (nrank/=npio) ini = 0
126 !
127 !* reads if TEB fields exist in the input file
128  CALL town_presence(hfilepgdtype,gteb,hdir='-')
129 !
130 ALLOCATE(zmask(ini))
131 IF (iversion_pgd>=7.AND.gteb) THEN
132  yrecfm='FRAC_TOWN'
133  CALL read_surf(hfilepgdtype,yrecfm,zmask,iresp,hdir='A')
134 ELSE
135  zmask(:) = 1.
136 ENDIF
137 !
138  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
139 !
140 !---------------------------------------------------------------------------------------
141 !
142 !* 3. Orography
143 ! ---------
144 !
145 IF (hsurf=='ZS ') THEN
146  !
147  ALLOCATE(pfield(ini,1))
148  yrecfm='ZS'
149  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'FULL ')
150  CALL read_surf(hfilepgdtype,yrecfm,pfield(:,1),iresp,hdir='E')
151  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
152  !
153  !---------------------------------------------------------------------------------------
154 ELSE
155 !---------------------------------------------------------------------------------------
156 !
157 !* 4. TEB fields are read
158 ! -------------------
159 !
160  IF (gteb) THEN
161 !
162  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'TOWN ')
163  gold_name=(iversion_pgd<7 .OR. (iversion_pgd==7 .AND. ibugfix_pgd<3))
164  IF (.NOT.gold_name.AND.gteb) THEN
165  yrecfm='BEM'
166  CALL read_surf(hfilepgdtype,yrecfm,ybem,iresp,hdir='-')
167  ELSE
168  ybem='DEF'
169  ENDIF
170  CALL read_teb_patch(hfilepgd,hfilepgdtype,iversion_pgd,ibugfix_pgd,iteb_patch,hdir='-')
171  ypatch=' '
172  IF (iteb_patch>1) THEN
173  WRITE(ypatch,fmt='(A,I1,A)') 'T',min(kpatch,iteb_patch),'_'
174  END IF
175  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
176 !
177 !---------------------------------------------------------------------------------------
178  SELECT CASE(hsurf)
179 !---------------------------------------------------------------------------------------
180 !
181 !* 4.1 Profile of temperatures in roads, roofs or walls
182 ! ------------------------------------------------
183 !
184  CASE('T_ROAD','T_ROOF','T_WALLA','T_WALLB','T_FLOOR','T_MASS')
185  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'TOWN ')
186  ysurf=hsurf(1:6)
187  !* reading of number of layers
188  IF (ysurf=='T_ROAD') yrecfm='ROAD_LAYER'
189  IF (ysurf=='T_ROOF') yrecfm='ROOF_LAYER'
190  IF (ysurf=='T_WALL') yrecfm='WALL_LAYER'
191  IF (ysurf=='T_FLOO' .OR. ysurf=='T_MASS') THEN
192  IF (ybem=='DEF') THEN
193  yrecfm='ROAD_LAYER'
194  ELSE
195  yrecfm='FLOOR_LAYER'
196  END IF
197  END IF
198  CALL read_surf(hfilepgdtype,yrecfm,ilayer,iresp,hdir='-')
199  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
200  !
201  !* reading of version of the file being read
202  gold_name=(iversion_prep<7 .OR. (iversion_prep==7 .AND. ibugfix_prep<3))
203  !
204  CALL open_aux_io_surf(hfile,hfiletype,'TOWN ')
205  !
206  !* reading option for road orientation
207  ywall_opt = 'UNIF'
208  IF (ysurf =='T_WALL' .AND. .NOT. gold_name) THEN
209  CALL read_surf(hfiletype,'WALL_OPT',ywall_opt,iresp,hdir='-')
210  END IF
211  !
212  !* reading of the profile
213  ALLOCATE(zfield(ini,ilayer))
214  DO jlayer=1,ilayer
215  !
216  IF (gold_name) THEN
217  WRITE(yrecfm,'(A6,I1.1)') hsurf(1:6),jlayer
218  ELSE
219  !
220  IF (ysurf =='T_WALL' .AND. ywall_opt/='UNIF') THEN
221  WRITE(yrecfm,'(A1,A5,I1.1)') hsurf(1:1),hsurf(3:7),jlayer
222  ELSEIF ((ysurf=='T_FLOO' .OR. ysurf=='T_MASS') .AND. ybem=='DEF') THEN
223  IF (ysurf=='T_FLOO' .AND. jlayer>1) THEN
224  WRITE(yrecfm,'(A5,I1.1)') 'TROAD',jlayer
225  ELSE
226  WRITE(yrecfm,'(A6)') 'TI_BLD'
227  ENDIF
228  ELSE
229  WRITE(yrecfm,'(A1,A4,I1.1)') hsurf(1:1),hsurf(3:6),jlayer
230  END IF
231  !
232  END IF
233  !
234  yrecfm=ypatch//yrecfm
235  yrecfm=adjustl(yrecfm)
236  CALL read_surf(hfiletype,yrecfm,zfield(:,jlayer),iresp,hdir='E')
237  !
238  END DO
239  CALL close_aux_io_surf(hfile,hfiletype)
240  !
241  DO jlayer=1,SIZE(zfield,2)
242  WHERE (zmask(:)==0.) zfield(:,jlayer) = xundef
243  ENDDO
244  !
245  ALLOCATE(zd(ini,ilayer))
246  IF (ysurf=='T_ROAD') CALL get_teb_depths(dtco,hfile,hfiletype,hfilepgd,hfilepgdtype,pd_road=zd,hdir='E')
247  IF (ysurf=='T_ROOF') CALL get_teb_depths(dtco,hfile,hfiletype,hfilepgd,hfilepgdtype,pd_roof=zd,hdir='E')
248  IF (ysurf=='T_WALL') CALL get_teb_depths(dtco,hfile,hfiletype,hfilepgd,hfilepgdtype,pd_wall=zd,hdir='E')
249  IF (ysurf=='T_MASS') CALL get_teb_depths(dtco,hfile,hfiletype,hfilepgd,hfilepgdtype,pd_floor=zd,hdir='E')
250  IF (ysurf=='T_FLOO') CALL get_teb_depths(dtco,hfile,hfiletype,hfilepgd,hfilepgdtype,pd_floor=zd,hdir='E')
251  !
252  IF (nrank==npio) THEN
253  !
254  !* recovers middle layer depth (from the surface)
255  ALLOCATE(zdepth(ini,ilayer))
256  DO ji=1,ini
257  !
258  zdepth(ji,1)= zd(ji,1)/2.
259  zdepth_tot = zd(ji,1)
260  DO jlayer=2,ilayer
261  zdepth(ji,jlayer) = zdepth_tot + zd(ji,jlayer)/2.
262  zdepth_tot = zdepth_tot + zd(ji,jlayer)
263  ENDDO
264  !
265  !* in case of wall or roof, normalizes by total wall or roof thickness
266  IF (ysurf=='T_ROOF' .OR. ysurf=='T_WALL' .OR. ysurf == 'T_FLOO' .OR. ysurf == 'T_MASS') THEN
267  DO jlayer=1,ilayer
268  zdepth(ji,jlayer) = zdepth(ji,jlayer) / zdepth_tot
269  END DO
270  END IF
271  !
272  ENDDO
273  !
274  !* interpolation on the fine vertical grid
275  IF (ysurf=='T_ROAD') THEN
276  ALLOCATE(pfield(SIZE(zfield,1),SIZE(xgrid_road)))
277  CALL interp_grid(zdepth,zfield,xgrid_road,pfield)
278  ELSEIF (ysurf=='T_ROOF') THEN
279  ALLOCATE(pfield(SIZE(zfield,1),SIZE(xgrid_roof)))
280  CALL interp_grid(zdepth,zfield,xgrid_roof,pfield)
281  ELSEIF (ysurf=='T_WALL') THEN
282  ALLOCATE(pfield(SIZE(zfield,1),SIZE(xgrid_wall)))
283  CALL interp_grid(zdepth,zfield,xgrid_wall,pfield)
284  ELSEIF (ysurf=='T_FLOO' .OR. ysurf=='T_MASS') THEN
285  ALLOCATE(pfield(SIZE(zfield,1),SIZE(xgrid_floor)))
286  CALL interp_grid(zdepth,zfield,xgrid_floor,pfield)
287  END IF
288  DEALLOCATE(zdepth)
289  !
290  ENDIF
291  !
292  DEALLOCATE(zd)
293  DEALLOCATE(zfield)
294 !---------------------------------------------------------------------------------------
295 !
296 !* 4.2 Internal moisture
297 ! ---------------
298 !
299  CASE('QI_BLD ')
300  ALLOCATE(pfield(ini,1))
301  IF (ybem=='BEM') THEN
302  yrecfm='QI_BLD'
303  yrecfm=ypatch//yrecfm
304  yrecfm=adjustl(yrecfm)
305  CALL open_aux_io_surf(hfile,hfiletype,'TOWN ')
306  CALL read_surf(hfiletype,yrecfm,pfield(:,1),iresp,hdir='E')
307  CALL close_aux_io_surf(hfile,hfiletype)
308  WHERE (zmask(:)==0.) pfield(:,1) = xundef
309  ELSE
310  IF (ini>0) pfield(:,1) = xundef
311  ENDIF
312 !
313 !---------------------------------------------------------------------------------------
314 !
315 !* 4.2 Other variables
316 ! ---------------
317 !
318  CASE DEFAULT
319  ALLOCATE(pfield(ini,1))
320  CALL open_aux_io_surf(hfile,hfiletype,'TOWN ')
321  yrecfm=hsurf
322  gold_name=(iversion_prep<7 .OR. (iversion_prep==7 .AND. ibugfix_prep<3))
323  IF (hsurf=='T_CAN ') THEN
324  yrecfm='TCANYON'
325  IF (gold_name) yrecfm='T_CANYON'
326  ELSEIF (hsurf=='Q_CAN ') THEN
327  yrecfm='QCANYON'
328  IF (gold_name) yrecfm='Q_CANYON'
329  ELSEIF (hsurf=='T_WIN2 ' .OR. hsurf=='T_WIN1') THEN
330  IF (ybem=='BEM') THEN
331  yrecfm=hsurf
332  ELSE
333  yrecfm='TI_BLD'
334  ENDIF
335  ENDIF
336  yrecfm=ypatch//yrecfm
337  yrecfm=adjustl(yrecfm)
338  CALL read_surf(hfiletype,yrecfm,pfield(:,1),iresp,hdir='E')
339  CALL close_aux_io_surf(hfile,hfiletype)
340  WHERE (zmask(:)==0.) pfield(:,1) = xundef
341 !
342 !---------------------------------------------------------------------------------------
343  END SELECT
344 !---------------------------------------------------------------------------------------
345 !
346 !* 5. Subtitutes if TEB fields do not exist
347 ! -------------------------------------
348 !
349  ELSE
350 
351  SELECT CASE(hsurf)
352 
353  !* temperature profiles
354  CASE('T_ROAD','T_ROOF','T_WALL','T_WIN1','T_FLOOR','T_CAN','TI_ROAD','T_WALLA','T_WALLB')
355  ysurf=hsurf(1:6)
356  !
357  !* reading of the soil surface temperature
358  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'NATURE')
359  ipatch = 0
360  CALL read_surf(hfilepgdtype,'PATCH_NUMBER',ipatch,iresp,hdir='-')
361  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
362  !
363  ALLOCATE(zfield(ini,ipatch))
364  !
365  CALL open_aux_io_surf(hfile,hfiletype,'NATURE')
366  IF (ysurf=='T_FLOO' .OR. ysurf=='T_CAN ' .OR. ysurf=='TI_ROA') THEN
367  CALL make_choice_array(hfiletype, ipatch, gdim, 'TG2', zfield(:,:),hdir='E')
368  ELSE
369  CALL make_choice_array(hfiletype, ipatch, gdim, 'TG1', zfield(:,:),hdir='E')
370  ENDIF
371  CALL close_aux_io_surf(hfile,hfiletype)
372  DO jlayer=1,SIZE(zfield,2)
373  WHERE (zmask(:)==0.) zfield(:,jlayer) = xundef
374  ENDDO
375  !* fills the whole temperature profile by this soil temperature
376  IF (ysurf=='T_ROAD') ilayer=SIZE(xgrid_road)
377  IF (ysurf=='T_ROOF') ilayer=SIZE(xgrid_roof)
378  IF (ysurf=='T_WALL') ilayer=SIZE(xgrid_wall)
379  IF (ysurf=='T_FLOO') ilayer=SIZE(xgrid_floor)
380  IF (ysurf=='T_WIN1' .OR. ysurf=='T_CAN ' .OR. ysurf=='TI_ROA') ilayer=1
381  ALLOCATE(pfield(ini,ilayer))
382  IF (ysurf=='T_FLOO') THEN
383  !* sets the temperature equal to this deep soil temperature
384  pfield(:,1) = xti_bld_def
385  ELSE
386  pfield(:,1) = zfield(:,1)
387  ENDIF
388  DO jlayer=2,ilayer
389  pfield(:,jlayer) = zfield(:,1)
390  END DO
391  DEALLOCATE(zfield)
392 
393  CASE('T_MASS','TI_BLD','T_WIN2')
394  ysurf=hsurf(1:6)
395  IF (ysurf=='T_MASS') ilayer = SIZE(xgrid_floor)
396  IF (ysurf=='TI_BLD'.OR.ysurf=='T_WIN2') ilayer=1
397  ALLOCATE(pfield(ini, ilayer))
398  pfield(:,:) = xti_bld_def
399 
400  !* building moisture
401  CASE('QI_BLD ')
402  ALLOCATE(pfield(ini,1))
403  pfield(:,1) = xundef
404 
405  !* water reservoirs
406  CASE('WS_ROOF','WS_ROAD')
407  ALLOCATE(pfield(ini,1))
408  IF (hsurf=='WS_ROOF') pfield = xws_roof_def
409  IF (hsurf=='WS_ROAD') pfield = xws_road_def
410 
411  !* other fields
412  CASE DEFAULT
413  ALLOCATE(pfield(ini,1))
414  pfield = 0.
415 
416  END SELECT
417 
418  END IF
419 !-------------------------------------------------------------------------------------
420 END IF
421 !-------------------------------------------------------------------------------------
422 !
423 DEALLOCATE(zmask)
424 !
425 !* 6. End of IO
426 ! ---------
427 !
428 IF (lhook) CALL dr_hook('PREP_TEB_EXTERN',1,zhook_handle)
429 !
430 !---------------------------------------------------------------------------------------
431 !
432 END SUBROUTINE prep_teb_extern
character(len=10) cingrid_type
Definition: modd_prep.F90:39
subroutine make_choice_array(HPROGRAM, KNPATCH, ODIM, HRECFM, PWORK, HDIR, KPATCH)
subroutine get_teb_depths(DTCO, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYP
character(len=6) cinterp_type
Definition: modd_prep.F90:40
subroutine close_aux_io_surf(HFILE, HFILETYPE)
subroutine town_presence(HFILETYPE, OTEB, HDIR)
subroutine prep_grid_extern(GCP, HFILETYPE, KLUOUT, HGRIDTYPE, HINTER
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine prep_teb_extern(DTCO, GCP, TOP, BOP, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, KPATCH, PFIELD)
subroutine read_teb_patch(HFILEPGD, HFILEPGDTYPE, KVERSION, KBUGFIX,
subroutine open_aux_io_surf(HFILE, HFILETYPE, HMASK, HDIR)