SURFEX v8.1
General documentation of Surfex
get_teb_depths.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 get_teb_depths (DTCO, &
7  HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, &
8  PD_ROOF, PD_ROAD, PD_WALL, PD_FLOOR,HDIR)
9 ! ##############################################################
10 !
11 !!**** *CONVERT_COVER*
12 !!
13 !! PURPOSE
14 !! -------
15 !!
16 !! METHOD
17 !! ------
18 !!
19 !! EXTERNAL
20 !! --------
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !! AUTHOR
29 !! ------
30 !!
31 !! V. Masson Meteo-France
32 !!
33 !! MODIFICATION
34 !! ------------
35 !!
36 !! Original 01/2004
37 !
38 !----------------------------------------------------------------------------
39 !
40 !* 0. DECLARATION
41 ! -----------
42 !
44 !
45 USE modd_surfex_mpi, ONLY : nrank, npio
47 USE modd_data_cover_par, ONLY : ncover, ntype, ndata_roof_layer, ndata_road_layer, &
48  ndata_wall_layer, ndata_floor_layer
49 !
50 USE modi_open_aux_io_surf
51 USE modi_close_aux_io_surf
53 !
55 USE modi_av_pgd
56 USE modi_old_name
57 USE modi_thermal_layers_conf
58 USE modi_open_aux_io_surf
59 USE modi_close_aux_io_surf
60 USE modi_read_lecoclimap
61 USE modi_default_data_cover
62 !
63 USE yomhook ,ONLY : lhook, dr_hook
64 USE parkind1 ,ONLY : jprb
65 !
66 USE modi_abor1_sfx
67 !
68 IMPLICIT NONE
69 !
70 !* 0.1 Declaration of arguments
71 ! ------------------------
72 !
73 !
74 !
75 !
76 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
77 !
78  CHARACTER(LEN=28), INTENT(IN) :: HFILE ! type of input file
79  CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! type of input file
80  CHARACTER(LEN=28), INTENT(IN) :: HFILEPGD ! type of input file
81  CHARACTER(LEN=6), INTENT(IN) :: HFILEPGDTYPE ! type of input file
82 !
83 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PD_ROOF
84 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PD_ROAD
85 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PD_WALL
86 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PD_FLOOR
87 !
88  CHARACTER(LEN=1), INTENT(IN), OPTIONAL :: HDIR
89 !
90 !* 0.2 Declaration of local variables
91 ! ------------------------------
92 !
93 TYPE(data_cover_t) :: YDTCO
94 !
95 LOGICAL, DIMENSION(:), ALLOCATABLE :: GCOVER ! flag to read the covers
96 REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOVER ! cover fractions
97 REAL, DIMENSION(:,:), ALLOCATABLE :: ZD ! depth of surface layers
98 REAL, DIMENSION(:,:), ALLOCATABLE :: ZPAR_D ! depth of data_surface layers
99 !
100 REAL, DIMENSION(:,:), ALLOCATABLE :: ZDATA
101 !
102 INTEGER :: IVERSION_PGD, IVERSION_PREP ! surface version
103 INTEGER :: IBUGFIX_PGD, IBUGFIX_PREP ! surface bugfix version
104 INTEGER :: IVERSION ! surface version
105 INTEGER :: IBUGFIX ! surface bugfix version
106  CHARACTER(LEN=1) :: YDIR
107  CHARACTER(LEN=3) :: YAREA ! Area where field is to be averaged
108  CHARACTER(LEN=5) :: YSURF ! Type of surface
109  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
110  CHARACTER(LEN=12) :: YRECFM0 ! Name of the article to be read
111  CHARACTER(LEN=12) :: YRECFM1 ! Name of the article to be read
112  CHARACTER(LEN=12) :: YRECFM2 ! Name of the article to be read
113  CHARACTER(LEN=12) :: YRECFM3 ! Name of the article to be read
114 INTEGER :: IRESP ! reading return code
115 INTEGER :: ILAYER ! number of surface layers
116 INTEGER :: JL ! loop counter on surface layers
117 INTEGER :: IPAR_LAYER ! number of data surface layers
118 INTEGER :: IDATA_LAYER ! number of data surface layers from ecoclimap
119 INTEGER :: ILU ! number of points
120 LOGICAL :: GECOCLIMAP, GECOSG
121 LOGICAL :: GDATA, GDIM ! T if depth is to be read in the file
122 LOGICAL :: GREAD_EXT
123 REAL(KIND=JPRB) :: ZHOOK_HANDLE
124 !-------------------------------------------------------------------------------
125 !
126 !* 2. SECONDARY VARIABLES
127 ! -------------------
128 !
129 !* 2.2 fields on artificial surfaces only
130 ! ----------------------------------
131 !
132 IF (lhook) CALL dr_hook('GET_TEB_DEPTHS',0,zhook_handle)
133 !
134 ydir = 'H'
135 IF (PRESENT(hdir)) ydir = hdir
136 !
137  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'FULL ')
138 yrecfm='VERSION'
139  CALL read_surf(hfilepgdtype,yrecfm,iversion_pgd,iresp,hdir='-')
140 yrecfm='BUG'
141  CALL read_surf(hfilepgdtype,yrecfm,ibugfix_pgd,iresp,hdir='-')
142  CALL read_lecoclimap(hfilepgdtype,gecoclimap,gecosg,hdir='-')
143  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
144 gdim = (iversion_pgd>8 .OR. iversion_pgd==8 .AND. ibugfix_pgd>0)
145 !
146  CALL open_aux_io_surf(hfile,hfiletype,'FULL ')
147 yrecfm='VERSION'
148  CALL read_surf(hfiletype,yrecfm,iversion_prep,iresp,hdir='-')
149 yrecfm='BUG'
150  CALL read_surf(hfiletype,yrecfm,ibugfix_prep,iresp,hdir='-')
151  CALL close_aux_io_surf(hfile,hfiletype)
152 !
153 IF (gecosg) THEN
154  ALLOCATE(zdata(sum(ntype),SIZE(xdata_d_roof,2)))
155 ELSE
156  ALLOCATE(zdata(ncover,SIZE(xdata_d_roof,2)))
157 ENDIF
158 zdata(:,:) = 0.
159 !
160  CALL data_cover_init(ydtco)
161 ALLOCATE(ydtco%XDATA_GARDEN(SIZE(zdata,1)))
162 ALLOCATE(ydtco%XDATA_TOWN (SIZE(zdata,1)))
163 ALLOCATE(ydtco%XDATA_BLD (SIZE(zdata,1)))
164 !
165 IF (SIZE(zdata,1)/=SIZE(xdata_d_roof,1)) THEN
166  CALL default_data_cover(pdata_town=ydtco%XDATA_TOWN,pdata_garden=ydtco%XDATA_GARDEN,&
167  pdata_bld=ydtco%XDATA_BLD)
168 ELSE
169  ydtco%XDATA_TOWN (:) = dtco%XDATA_TOWN(:)
170  ydtco%XDATA_GARDEN(:) = dtco%XDATA_GARDEN(:)
171  ydtco%XDATA_BLD (:) = dtco%XDATA_BLD(:)
172 ENDIF
173 !
174 IF (PRESENT(pd_roof)) THEN
175  ysurf='ROOF '
176  IF (gecosg) THEN
177  zdata = xdata_d_roof
178  ELSE
179  CALL default_data_cover(pdata_town=ydtco%XDATA_TOWN,pdata_d_roof=zdata)
180  ENDIF
181  yrecfm0 = 'PAR_RF_LAYER'
182  yrecfm1 = 'L_D_ROOF'
183  yrecfm2 = 'D_D_ROOF'
184  yrecfm3 = 'D_ROOF'
185  idata_layer = ndata_roof_layer
186  ilu = SIZE(pd_roof,1)
187  ilayer = SIZE(pd_roof,2)
188  yarea = 'BLD'
189 END IF
190 IF (PRESENT(pd_wall)) THEN
191  ysurf='WALL '
192  IF (gecosg) THEN
193  zdata = xdata_d_wall
194  ELSE
195  CALL default_data_cover(pdata_town=ydtco%XDATA_TOWN,pdata_d_wall=zdata)
196  ENDIF
197  yrecfm0 = 'PAR_WL_LAYER'
198  yrecfm1 = 'L_D_WALL'
199  yrecfm2 = 'D_D_WALL'
200  yrecfm3 = 'D_WALL'
201  idata_layer = ndata_wall_layer
202  ilu = SIZE(pd_wall,1)
203  ilayer = SIZE(pd_wall,2)
204  yarea = 'BLD'
205 END IF
206 IF (PRESENT(pd_road)) THEN
207  ysurf='ROAD '
208  IF (gecosg) THEN
209  zdata = xdata_d_road
210  ELSE
211  CALL default_data_cover(pdata_town=ydtco%XDATA_TOWN,pdata_d_road=zdata)
212  ENDIF
213  yrecfm0 = 'PAR_RD_LAYER'
214  yrecfm1 = 'L_D_ROAD'
215  yrecfm2 = 'D_D_ROAD'
216  yrecfm3 = 'D_ROAD'
217  idata_layer = ndata_road_layer
218  ilu = SIZE(pd_road,1)
219  ilayer = SIZE(pd_road,2)
220  yarea = 'STR'
221 END IF
222 IF (PRESENT(pd_floor)) THEN
223  ysurf='FLOOR'
224  IF (gecosg) THEN
225  zdata = xdata_d_floor
226  ELSE
227  WHERE (ydtco%XDATA_TOWN>0.)
228  zdata(:,1) = 0.01
229  zdata(:,2) = 0.04
230  zdata(:,3) = 0.10
231  END WHERE
232  ENDIF
233  yrecfm0 = 'PAR_FL_LAYER'
234  yrecfm1 = 'L_D_FLOOR'
235  yrecfm2 = 'D_D_FLOOR'
236  yrecfm3 = 'D_FLOOR'
237  idata_layer = ndata_floor_layer
238  ilu = SIZE(pd_floor,1)
239  ilayer = SIZE(pd_floor,2)
240  yarea = 'BLD'
241 END IF
242 !
243 !* read if the depths description are written in the file
244 IF (iversion_pgd<7 .OR. (iversion_pgd==7 .AND. ibugfix_pgd<=2)) THEN
245  gdata = .false.
246 ELSE
247  !
248  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'TOWN ')
249  !
250  CALL read_surf(hfilepgdtype,yrecfm1,gdata,iresp,hdir='-')
251  !* depths are read in the file
252  IF (gdata) THEN
253  !* gets number of data layers
254  ipar_layer = 0
255  CALL read_surf(hfilepgdtype,yrecfm0,ipar_layer,iresp,hdir='-')
256  !* gets the data layers depths
257  ALLOCATE(zd(ilu,ipar_layer))
258  DO jl=1,ipar_layer
259  WRITE(yrecfm,fmt='(A,I1)') trim(yrecfm2),jl
260  CALL read_surf(hfilepgdtype,yrecfm,zd(:,jl),iresp,hdir=ydir)
261  END DO
262  ENDIF
263  !
264  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
265  !
266 END IF
267 !
268 !* depths are read in the file
269 IF (.NOT.gdata) THEN
270  !
271 !* depths are deduced from the cover types
272  ALLOCATE(zd(ilu,ilayer))
273  !
274  IF (iversion_prep>8 .OR. (iversion_prep==8 .AND. ibugfix_prep>=1)) THEN
275  CALL open_aux_io_surf(hfile,hfiletype,'TOWN ')
276  CALL read_surf(hfiletype,'WRITE_EXT ',gread_ext,iresp,hdir='-')
277  IF (gread_ext) THEN
278  DO jl=1,ilayer
279  WRITE(yrecfm,fmt='(A,I1)') trim(yrecfm3),jl
280  CALL read_surf(hfiletype,yrecfm,zd(:,jl),iresp,hdir=ydir)
281  END DO
282  ENDIF
283  CALL close_aux_io_surf(hfile,hfiletype)
284  ELSE
285  gread_ext = .false.
286  ENDIF
287  !
288  IF (.NOT.gread_ext) THEN
289  !
290  IF (gdim.AND.gecosg) THEN
291  ALLOCATE(gcover(sum(ntype)))
292  ELSE
293  ALLOCATE(gcover(ncover))
294  ENDIF
295  !
296  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'FULL ')
297  !* reading of the cover to obtain the thickness of layers
298  CALL old_name(hfilepgdtype,'COVER_LIST ',yrecfm,'-')
299  CALL read_surf(hfilepgdtype,yrecfm,gcover(:),iresp,hdir='-')
300  !* reading of the cover fractions
301  IF (ydir/='E'.OR.nrank==npio) THEN
302  ALLOCATE(zcover(ilu,count(gcover)))
303  ELSE
304  ALLOCATE(zcover(0,0))
305  ENDIF
306  yrecfm='COVER'
307  CALL read_surf_cov(hfilepgdtype,yrecfm,zcover(:,:),gcover,iresp,&
308  hdir=ydir)
309  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
310  !
311  ALLOCATE(zpar_d(ilu,idata_layer))
312  IF (nrank==npio) THEN
313  !* deduces the depths of each layer
314  DO jl=1,idata_layer
315  CALL av_pgd (ydtco,zpar_d(:,jl), zcover, zdata(:,jl),yarea,'ARI',gcover)
316  END DO
317  ENDIF
318  CALL data_cover_init(ydtco)
319  DEALLOCATE(zdata)
320  DEALLOCATE(gcover,zcover)
321  !
322  IF (iversion_prep<7 .OR. (iversion_prep==7 .AND. ibugfix_prep<=2)) THEN
323  !* ind version of TEB, the computational grid was equal to the data grid
324  zd(:,:) = zpar_d(:,:)
325  ELSEIF (nrank==npio) THEN
326  !* recomputes the grid from the available data
327  CALL thermal_layers_conf(ysurf,zpar_d,zd)
328  END IF
329  DEALLOCATE(zpar_d)
330  !
331  ENDIF
332  !
333 ENDIF
334 !
335 IF (PRESENT(pd_roof )) pd_roof = zd
336 IF (PRESENT(pd_wall )) pd_wall = zd
337 IF (PRESENT(pd_road )) pd_road = zd
338 IF (PRESENT(pd_floor)) pd_floor = zd
339 !
340 DEALLOCATE(zd)
341 !
342 IF (lhook) CALL dr_hook('GET_TEB_DEPTHS',1,zhook_handle)
343 !-------------------------------------------------------------------------------
344 !
345 END SUBROUTINE get_teb_depths
real, dimension(:,:), allocatable xdata_d_roof
subroutine old_name(HPROGRAM, HRECIN, HRECOUT, HDIR)
Definition: old_name.F90:7
subroutine get_teb_depths(DTCO, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYP
subroutine close_aux_io_surf(HFILE, HFILETYPE)
subroutine read_surf_cov(HPROGRAM, HREC, PFIELD, OFLAG, KRESP, HCOMMENT, HDIR)
subroutine default_data_cover(PDATA_TOWN, PDATA_NATURE, PDATA_WATER, PDATA_SEA, PDATA_Z0_TOWN, PDATA_BLD_HEIGHT, PDATA_WALL_O_HOR, PDATA_BLD, PDATA_GARDEN, PDATA_ALB_ROOF, PDATA_ALB_ROAD, PDATA_ALB_WALL, PDATA_EMIS_ROOF, PDATA_EMIS_ROAD, PDATA_EMIS_WALL, PDATA_HC_ROOF, PDATA_TC_ROOF, PDATA_D_ROOF, PDATA_HC_ROAD, PDATA_TC_ROAD, PDATA_D_ROAD, PDATA_HC_WALL, PDATA_TC_WALL, PDATA_D_WALL, PDATA_H_TRAFFIC, PDATA_LE_TRAFFIC, PDATA_H_INDUSTRY, PDATA_LE_INDUSTRY, PDATA_VEGTYPE, PDATA_H_TREE, PDATA_WATSUP, PDATA_IRRIG, PDATA_ROOT_DEPTH, PDATA_GROUND_DEPTH, PDATA_DICE, TPDATA_SEED, TPDATA_REAP)
subroutine read_lecoclimap(HPROGRAM, OECOCLIMAP, OECOSG, HDIR)
integer, parameter jprb
Definition: parkind1.F90:32
real, dimension(:,:), allocatable xdata_d_road
real, dimension(:,:), allocatable xdata_d_floor
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
logical lhook
Definition: yomhook.F90:15
subroutine thermal_layers_conf(HTYPE, PD, PD_OUT, PHC, PHC_OUT, PTC, PTC
subroutine data_cover_init(YDATA_COVER)
subroutine open_aux_io_surf(HFILE, HFILETYPE, HMASK, HDIR)
real, dimension(:,:), allocatable xdata_d_wall
static int count
Definition: memory_hook.c:21