SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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 (&
7  dtco, &
8  hfilepgd, hfilepgdtype, pd_roof, pd_road, pd_wall, pd_floor)
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 !
43 !
44 !
45 !
46 !
47 !
49 !
50 USE modd_data_cover, ONLY : xdata_d_roof, xdata_d_road, xdata_d_wall, xdata_d_floor
51 USE modd_data_cover_par, ONLY : jpcover, ndata_roof_layer, ndata_road_layer, &
52  ndata_wall_layer, ndata_floor_layer
53 !
55 !
57 USE modi_av_pgd
58 USE modi_old_name
59 USE modi_thermal_layers_conf
60 USE modi_open_aux_io_surf
61 USE modi_close_aux_io_surf
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) :: hfilepgd ! name of file
79  CHARACTER(LEN=6), INTENT(IN) :: hfilepgdtype ! type of input file
80 !
81 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: pd_roof
82 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: pd_road
83 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: pd_wall
84 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: pd_floor
85 !
86 !* 0.2 Declaration of local variables
87 ! ------------------------------
88 !
89 LOGICAL, DIMENSION(JPCOVER) :: gcover ! flag to read the covers
90 REAL, DIMENSION(:,:), ALLOCATABLE :: zcover ! cover fractions
91 REAL, DIMENSION(:,:), ALLOCATABLE :: zd ! depth of surface layers
92 REAL, DIMENSION(:,:), ALLOCATABLE :: zpar_d ! depth of data_surface layers
93 REAL, DIMENSION(:,:), ALLOCATABLE :: zpar_hc, zpar_tc, zhc, ztc ! work arrays
94 !
95 INTEGER :: iversion ! surface version
96 INTEGER :: ibugfix ! surface bugfix version
97  CHARACTER(LEN=5) :: ysurf ! Type of surface
98  CHARACTER(LEN=12) :: yrecfm ! Name of the article to be read
99  CHARACTER(LEN=12) :: yrecfm0 ! Name of the article to be read
100  CHARACTER(LEN=12) :: yrecfm1 ! Name of the article to be read
101  CHARACTER(LEN=12) :: yrecfm2 ! Name of the article to be read
102  CHARACTER(LEN=3) :: yarea ! Area where field is to be averaged
103 INTEGER :: iresp ! reading return code
104 LOGICAL :: gdata ! T if depth is to be read in the file
105 REAL, DIMENSION(SIZE(XDATA_D_ROOF,1),SIZE(XDATA_D_ROOF,2)) :: zdata
106 INTEGER :: ilayer ! number of surface layers
107 INTEGER :: jlayer ! loop counter on surface layers
108 INTEGER :: ipar_layer ! number of data surface layers
109 INTEGER :: idata_layer ! number of data surface layers from ecoclimap
110 INTEGER :: ilu ! number of points
111 REAL(KIND=JPRB) :: zhook_handle
112 !-------------------------------------------------------------------------------
113 !
114 !* 2. SECONDARY VARIABLES
115 ! -------------------
116 !
117 !* 2.2 fields on artificial surfaces only
118 ! ----------------------------------
119 !
120 IF (lhook) CALL dr_hook('GET_TEB_DEPTHS',0,zhook_handle)
121 !
122  CALL open_aux_io_surf(&
123  hfilepgd,hfilepgdtype,'FULL ')
124 yrecfm='VERSION'
125  CALL read_surf(&
126  hfilepgdtype,yrecfm,iversion,iresp)
127 yrecfm='BUG'
128  CALL read_surf(&
129  hfilepgdtype,yrecfm,ibugfix,iresp)
130  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
131 !
132 IF (present(pd_roof)) THEN
133  ysurf='ROOF '
134  zdata = xdata_d_roof
135  yrecfm0 = 'PAR_RF_LAYER'
136  yrecfm1 = 'L_D_ROOF'
137  yrecfm2 = 'D_D_ROOF'
138  idata_layer = ndata_roof_layer
139  ilu = SIZE(pd_roof,1)
140  ilayer = SIZE(pd_roof,2)
141  yarea = 'BLD'
142 END IF
143 IF (present(pd_wall)) THEN
144  ysurf='WALL '
145  zdata = xdata_d_wall
146  yrecfm0 = 'PAR_WL_LAYER'
147  yrecfm1 = 'L_D_WALL'
148  yrecfm2 = 'D_D_WALL'
149  idata_layer = ndata_wall_layer
150  ilu = SIZE(pd_wall,1)
151  ilayer = SIZE(pd_wall,2)
152  yarea = 'BLD'
153 END IF
154 IF (present(pd_road)) THEN
155  ysurf='ROAD '
156  zdata = xdata_d_road
157  yrecfm0 = 'PAR_RD_LAYER'
158  yrecfm1 = 'L_D_ROAD'
159  yrecfm2 = 'D_D_ROAD'
160  idata_layer = ndata_road_layer
161  ilu = SIZE(pd_road,1)
162  ilayer = SIZE(pd_road,2)
163  yarea = 'STR'
164 END IF
165 IF (present(pd_floor)) THEN
166  ysurf='FLOOR'
167  zdata = xdata_d_floor
168  yrecfm0 = 'PAR_FL_LAYER'
169  yrecfm1 = 'L_D_FLOOR'
170  yrecfm2 = 'D_D_FLOOR'
171  idata_layer = ndata_floor_layer
172  ilu = SIZE(pd_floor,1)
173  ilayer = SIZE(pd_floor,2)
174  yarea = 'BLD'
175 END IF
176 !
177 ALLOCATE(zd(ilu,ilayer))
178 !
179 !* read if the depths description are written in the file
180 IF (iversion<7 .OR. (iversion==7 .AND. ibugfix<=2)) THEN
181  gdata = .false.
182 ELSE
183  CALL open_aux_io_surf(&
184  hfilepgd,hfilepgdtype,'TOWN ')
185  CALL read_surf(&
186  hfilepgdtype,yrecfm1,gdata,iresp)
187  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
188 END IF
189 !
190 !* depths are read in the file
191 IF (gdata) THEN
192  !* gets number of data layers
193  CALL open_aux_io_surf(&
194  hfilepgd,hfilepgdtype,'TOWN ')
195  CALL read_surf(&
196  hfilepgdtype,yrecfm0,ipar_layer,iresp)
197  !* gets the data layers depths
198  ALLOCATE(zpar_d(ilu,ipar_layer))
199  DO jlayer=1,ipar_layer
200  WRITE(yrecfm,fmt='(A,I1)') trim(yrecfm2),jlayer
201  CALL read_surf(&
202  hfilepgdtype,yrecfm,zpar_d(:,jlayer),iresp,hdir='A')
203  END DO
204  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
205 !
206 ELSE
207 !* depths are deduced from the cover types
208  CALL open_aux_io_surf(&
209  hfilepgd,hfilepgdtype,'FULL ')
210  ALLOCATE(zpar_d(ilu,idata_layer))
211  !* reading of the cover to obtain the thickness of layers
212  CALL old_name(&
213  hfilepgdtype,'COVER_LIST ',yrecfm)
214  CALL read_surf(&
215  hfilepgdtype,yrecfm,gcover(:),iresp,hdir='-')
216  !* reading of the cover fractions
217  ALLOCATE(zcover(ilu,count(gcover)))
218  yrecfm='COVER'
219  CALL read_surf_cov(&
220  hfilepgdtype,yrecfm,zcover(:,:),gcover,iresp,hdir='A')
221  !
222  !* deduces the depths of each layer
223  DO jlayer=1,idata_layer
224  CALL av_pgd(dtco, &
225  zpar_d(:,jlayer), zcover, zdata(:,jlayer),yarea,'ARI',gcover)
226  END DO
227  DEALLOCATE(zcover)
228  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
229 ENDIF
230 !
231 !* recomputes the grid from the available data
232 !
233 IF (iversion<7 .OR. (iversion==7 .AND. ibugfix<=2)) THEN
234  !* in old version of TEB, the computational grid was equal to the data grid
235  zd(:,:) = zpar_d(:,:)
236 ELSE
237  !* recomputes the grid from the available data
238  ALLOCATE(zpar_hc(ilu,SIZE(zpar_d,2)))
239  ALLOCATE(zpar_tc(ilu,SIZE(zpar_d,2)))
240  ALLOCATE(ztc(ilu,ilayer))
241  ALLOCATE(zhc(ilu,ilayer))
242  zpar_hc = 1.e6 ! not physically used
243  zpar_tc = 1. ! not physically used
244  CALL thermal_layers_conf(ysurf,zpar_hc,zpar_tc,zpar_d,zhc,ztc,zd)
245  DEALLOCATE(zpar_hc)
246  DEALLOCATE(zpar_tc)
247  DEALLOCATE(zhc)
248  DEALLOCATE(ztc)
249 END IF
250 !
251 IF (present(pd_roof )) pd_roof = zd
252 IF (present(pd_wall )) pd_wall = zd
253 IF (present(pd_road )) pd_road = zd
254 IF (present(pd_floor)) pd_floor = zd
255 !
256 DEALLOCATE(zd)
257 !
258 IF (lhook) CALL dr_hook('GET_TEB_DEPTHS',1,zhook_handle)
259 !-------------------------------------------------------------------------------
260 !
261 END SUBROUTINE get_teb_depths
subroutine, public read_surf_cov(HPROGRAM, HREC, PFIELD, OFLAG, KRESP, HCOMMENT, HDIR)
subroutine close_aux_io_surf(HFILE, HFILETYPE)
subroutine open_aux_io_surf(HFILE, HFILETYPE, HMASK)
subroutine get_teb_depths(DTCO, HFILEPGD, HFILEPGDTYPE, PD_ROOF, PD_ROAD, PD_WALL, PD_FLOOR)
subroutine thermal_layers_conf(HTYPE, PHC, PTC, PD, PHC_OUT, PTC_OUT, PD_OUT)
subroutine old_name(HPROGRAM, HRECIN, HRECOUT)
Definition: old_name.F90:6