SURFEX v8.1
General documentation of Surfex
read_tebn.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 read_teb_n (B, BOP, DTCO, U, T, TOP, TPN, HPROGRAM,KPATCH)
7 ! #########################################
8 !
9 !!**** *READ_TEB_n* - reads TEB fields
10 !!
11 !!
12 !! PURPOSE
13 !! -------
14 !!
15 !!** METHOD
16 !! ------
17 !!
18 !! EXTERNAL
19 !! --------
20 !!
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !!
29 !! AUTHOR
30 !! ------
31 !! V. Masson *Meteo France*
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !! Original 01/2003
36 !-------------------------------------------------------------------------------
37 !
38 !* 0. DECLARATIONS
39 ! ------------
40 !
41 !
42 USE modd_bem_n, ONLY : bem_t
45 USE modd_surf_atm_n, ONLY : surf_atm_t
46 USE modd_teb_n, ONLY : teb_t
48 USE modd_teb_panel_n, ONLY : teb_panel_t
49 !
50 USE modd_data_cover_par, ONLY : jpcover
51 !
52 USE modd_assim, ONLY : lassim,xat2m_teb,nific,nvar
53 !
55 !
56 USE modi_init_io_surf_n
57 USE modi_set_surfex_filein
58 USE modi_end_io_surf_n
59 USE modi_town_presence
60 USE modi_allocate_gr_snow
61 USE modi_read_gr_snow
62 USE modi_io_buff
63 !
64 !
65 !
66 USE yomhook ,ONLY : lhook, dr_hook
67 USE parkind1 ,ONLY : jprb
68 !
69 USE modi_get_type_dim_n
70 USE modd_surf_par, ONLY : xundef
71 !
72 IMPLICIT NONE
73 !
74 !* 0.1 Declarations of arguments
75 ! -------------------------
76 !
77 !
78 TYPE(bem_t), INTENT(INOUT) :: B
79 TYPE(bem_options_t), INTENT(INOUT) :: BOP
80 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
81 TYPE(surf_atm_t), INTENT(INOUT) :: U
82 TYPE(teb_t), INTENT(INOUT) :: T
83 TYPE(teb_options_t), INTENT(INOUT) :: TOP
84 TYPE(teb_panel_t), INTENT(INOUT) :: TPN
85 !
86  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program
87 INTEGER, INTENT(IN) :: KPATCH ! current patch number
88 !
89 !
90 !* 0.2 Declarations of local variables
91 ! -------------------------------
92 !
93 LOGICAL :: GTOWN ! town variables written in the file
94 INTEGER :: ILU ! 1D physical dimension
95 !
96 INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK
97 INTEGER :: IRESP ! Error code after redding
98 !
99  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
100  CHARACTER(LEN=3) :: YPATCH ! suffix if more than 1 patch
101 !
102 INTEGER :: IVERSION, IBUGFIX
103 LOGICAL :: GOLD_NAME ! name of temperatures in old versions of SURFEX
104 LOGICAL :: GKNOWN
105 !
106 INTEGER :: JLAYER, JI ! loop counter on layers
107 REAL(KIND=JPRB) :: ZHOOK_HANDLE
108 !
109 !-------------------------------------------------------------------------------
110 !
111 !* 1D physical dimension
112 !
113 IF (lhook) CALL dr_hook('READ_TEB_N',0,zhook_handle)
114 yrecfm='SIZE_TOWN'
115  CALL get_type_dim_n(dtco, u, 'TOWN ',ilu)
116 !
117 ypatch=' '
118 IF (top%NTEB_PATCH>1) WRITE(ypatch,fmt='(A1,I1,A1)') 'T',kpatch,'_'
119 !
120  CALL read_surf(hprogram,'VERSION',iversion,iresp)
121  CALL read_surf(hprogram,'BUG',ibugfix,iresp)
122 gold_name = (iversion<7 .OR. (iversion==7 .AND. ibugfix<=2))
123 !
124 !* 2. Prognostic fields:
125 ! -----------------
126 !
127 !* roof temperatures
128 !
129 ALLOCATE(t%XT_ROOF(ilu,top%NROOF_LAYER))
130 !
131 DO jlayer=1,top%NROOF_LAYER
132  WRITE(yrecfm,'(A3,A5,I1.1)') ypatch,'TROOF',jlayer
133  yrecfm=adjustl(yrecfm)
134  IF (gold_name) WRITE(yrecfm,'(A6,I1.1)') 'T_ROOF',jlayer
135 
136  CALL read_surf(hprogram,yrecfm,t%XT_ROOF(:,jlayer),iresp)
137 END DO
138 !
139 !* roof water content
140 !
141 ALLOCATE(t%XWS_ROOF(ilu))
142 !
143 yrecfm=ypatch//'WS_ROOF'
144 yrecfm=adjustl(yrecfm)
145  CALL read_surf(hprogram,yrecfm,t%XWS_ROOF(:),iresp)
146 !
147 !* road temperatures
148 !
149 ALLOCATE(t%XT_ROAD(ilu,top%NROAD_LAYER))
150 !
151 DO jlayer=1,top%NROAD_LAYER
152  WRITE(yrecfm,'(A3,A5,I1.1)') ypatch,'TROAD',jlayer
153  yrecfm=adjustl(yrecfm)
154  IF (gold_name) WRITE(yrecfm,'(A6,I1.1)') 'T_ROAD',jlayer
155  CALL read_surf(hprogram,yrecfm,t%XT_ROAD(:,jlayer),iresp)
156 END DO
157 !
158 !* road water content
159 !
160 ALLOCATE(t%XWS_ROAD(ilu))
161 !
162 yrecfm=ypatch//'WS_ROAD'
163 yrecfm=adjustl(yrecfm)
164  CALL read_surf(hprogram,yrecfm,t%XWS_ROAD(:),iresp)
165 !
166 !* wall temperatures
167 !
168 ALLOCATE(t%XT_WALL_A(ilu,top%NWALL_LAYER))
169 ALLOCATE(t%XT_WALL_B(ilu,top%NWALL_LAYER))
170 !
171 DO jlayer=1,top%NWALL_LAYER
172  IF (top%CWALL_OPT=='UNIF' .OR. gold_name) THEN
173  WRITE(yrecfm,'(A3,A5,I1.1)') ypatch,'TWALL',jlayer
174  yrecfm=adjustl(yrecfm)
175  IF (gold_name) WRITE(yrecfm,'(A6,I1.1)') 'T_WALL',jlayer
176  CALL read_surf(hprogram,yrecfm,t%XT_WALL_A(:,jlayer),iresp)
177  !
178  t%XT_WALL_B = t%XT_WALL_A
179  ELSE
180  WRITE(yrecfm,'(A3,A6,I1.1)') ypatch,'TWALLA',jlayer
181  yrecfm=adjustl(yrecfm)
182  CALL read_surf(hprogram,yrecfm,t%XT_WALL_A(:,jlayer),iresp)
183  !
184  WRITE(yrecfm,'(A3,A6,I1.1)') ypatch,'TWALLB',jlayer
185  yrecfm=adjustl(yrecfm)
186  CALL read_surf(hprogram,yrecfm,t%XT_WALL_B(:,jlayer),iresp)
187  END IF
188 END DO
189 !
190 !* internal building temperature
191 !
192 ALLOCATE(b%XTI_BLD(ilu))
193 !
194 yrecfm=ypatch//'TI_BLD'
195 yrecfm=adjustl(yrecfm)
196  CALL read_surf(hprogram,yrecfm,b%XTI_BLD(:),iresp)
197 
198 !
199 !* outdoor window temperature
200 !
201 ALLOCATE(b%XT_WIN1(ilu))
202 !
203 IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) THEN
204  yrecfm=ypatch//'T_WIN1'
205  yrecfm=adjustl(yrecfm)
206  CALL read_surf(hprogram,yrecfm,b%XT_WIN1(:),iresp)
207 ELSE
208  b%XT_WIN1(:)=xundef
209 ENDIF
210 !
211 !
212 !* internal building specific humidity
213 !
214 ALLOCATE(b%XQI_BLD(ilu))
215 !
216 IF (top%CBEM=='BEM' .AND. (iversion>7 .OR. iversion==7 .AND. ibugfix>=3)) THEN
217  yrecfm=ypatch//'QI_BLD'
218  yrecfm=adjustl(yrecfm)
219  CALL read_surf(hprogram,yrecfm,b%XQI_BLD(:),iresp)
220 ELSE
221  b%XQI_BLD(:) = xundef
222 ENDIF
223 !
224 IF (top%CBEM=='BEM') THEN
225  !
226  !* indoor window temperature
227  !
228  ALLOCATE(b%XT_WIN2(ilu))
229  !
230  yrecfm=ypatch//'T_WIN2'
231  yrecfm=adjustl(yrecfm)
232  CALL read_surf(hprogram,yrecfm,b%XT_WIN2(:),iresp)
233  !
234  !* floor temperatures
235  !
236  ALLOCATE(b%XT_FLOOR(ilu,bop%NFLOOR_LAYER))
237  !
238  DO jlayer=1,bop%NFLOOR_LAYER
239  WRITE(yrecfm,'(A3,A5,I1.1)') ypatch,'TFLOO',jlayer
240  yrecfm=adjustl(yrecfm)
241  CALL read_surf(hprogram,yrecfm,b%XT_FLOOR(:,jlayer),iresp)
242  END DO
243  !
244  !* mass temperatures
245  !
246  ALLOCATE(b%XT_MASS(ilu,bop%NFLOOR_LAYER))
247  !
248  DO jlayer=1,bop%NFLOOR_LAYER
249  WRITE(yrecfm,'(A3,A5,I1.1)') ypatch,'TMASS',jlayer
250  yrecfm=adjustl(yrecfm)
251  CALL read_surf(hprogram,yrecfm,b%XT_MASS(:,jlayer),iresp)
252  END DO
253  !
254 ELSE
255  ALLOCATE(b%XT_WIN2(0))
256  ALLOCATE(b%XT_FLOOR(0,0))
257  ALLOCATE(b%XT_MASS(0,0))
258 ENDIF
259 !
260 !* deep road temperature
261 !
262 ALLOCATE(t%XTI_ROAD(ilu))
263 !
264 yrecfm=ypatch//'TI_ROAD'
265 yrecfm=adjustl(yrecfm)
266  CALL read_surf(hprogram,yrecfm,t%XTI_ROAD(:),iresp)
267 !
268 !
269 !* snow mantel
270 !
271  CALL end_io_surf_n(hprogram)
272  CALL set_surfex_filein(hprogram,'PGD ')
273  CALL init_io_surf_n(dtco, u, hprogram,'FULL ','SURF ','READ ')
274 !
275  CALL town_presence(hprogram,gtown)
276 !
277  CALL end_io_surf_n(hprogram)
278  CALL set_surfex_filein(hprogram,'PREP')
279  CALL init_io_surf_n(dtco, u, hprogram,'TOWN ','TEB ','READ ')
280 !
281 IF (.NOT. gtown) THEN
282  t%TSNOW_ROAD%SCHEME='1-L'
283  CALL allocate_gr_snow(t%TSNOW_ROAD,ilu)
284  t%TSNOW_ROOF%SCHEME='1-L'
285  CALL allocate_gr_snow(t%TSNOW_ROOF,ilu)
286 ELSE
287  ALLOCATE(imask(ilu))
288  DO ji = 1,ilu
289  imask(ji) = ji
290  ENDDO
291  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=3) THEN
292  CALL read_gr_snow(hprogram,'RD',ypatch,ilu,ilu,imask,0,t%TSNOW_ROAD )
293  CALL read_gr_snow(hprogram,'RF',ypatch,ilu,ilu,imask,0,t%TSNOW_ROOF )
294  ELSE
295  CALL read_gr_snow(hprogram,'ROAD',ypatch,ilu,ilu,imask,0,t%TSNOW_ROAD )
296  CALL read_gr_snow(hprogram,'ROOF',ypatch,ilu,ilu,imask,0,t%TSNOW_ROOF )
297  ENDIF
298  DEALLOCATE(imask)
299 END IF
300 !
301 !-------------------------------------------------------------------------------
302 !
303 !* 3. Semi-prognostic fields:
304 ! ----------------------
305 !
306 !* temperature in canyon air
307 !
308 ALLOCATE(t%XT_CANYON(ilu))
309 t%XT_CANYON(:) = t%XT_ROAD(:,1)
310 !
311 yrecfm=ypatch//'TCANYON'
312 yrecfm=adjustl(yrecfm)
313 IF (gold_name) yrecfm='T_CANYON'
314  CALL read_surf(hprogram,yrecfm,t%XT_CANYON(:),iresp)
315 !
316 !* water vapor in canyon air
317 !
318 ALLOCATE(t%XQ_CANYON(ilu))
319 t%XQ_CANYON(:) = 0.
320 !
321 yrecfm=ypatch//'QCANYON'
322 yrecfm=adjustl(yrecfm)
323 IF (gold_name) yrecfm='Q_CANYON'
324  CALL read_surf(hprogram,yrecfm,t%XQ_CANYON(:),iresp)
325 !
326 !* Thermal solar panels present day production
327 !
328 IF (top%LSOLAR_PANEL) THEN
329  ALLOCATE(tpn%XTHER_PRODC_DAY(ilu))
330  tpn%XTHER_PRODC_DAY(:) = 0.
331 
332  yrecfm=ypatch//'THER_PDAY'
333  yrecfm=adjustl(yrecfm)
334  CALL read_surf(hprogram,yrecfm,tpn%XTHER_PRODC_DAY(:),iresp)
335 END IF
336 
337 IF ( lassim .AND. nific/=nvar+2 ) THEN
338  ! Diagnostic fields for assimilation
339  IF ( .NOT. ALLOCATED(xat2m_teb)) ALLOCATE(xat2m_teb(ilu))
340  xat2m_teb=xundef
341  yrecfm='T2M'
342  CALL io_buff(yrecfm,'R',gknown)
343  CALL read_surf(hprogram,yrecfm,xat2m_teb(:),iresp)
344 ENDIF
345 
346 !
347 !-------------------------------------------------------------------------------
348 IF (lhook) CALL dr_hook('READ_TEB_N',1,zhook_handle)
349 !-------------------------------------------------------------------------------
350 !
351 END SUBROUTINE read_teb_n
subroutine get_type_dim_n(DTCO, U, HTYPE, KDIM)
subroutine set_surfex_filein(HPROGRAM, HMASK)
subroutine town_presence(HFILETYPE, OTEB, HDIR)
subroutine read_teb_n(B, BOP, DTCO, U, T, TOP, TPN, HPROGRAM, KPAT
Definition: read_tebn.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:7
subroutine allocate_gr_snow(TPSNOW, KLU)
logical lhook
Definition: yomhook.F90:15
subroutine io_buff(HREC, HACTION, OKNOWN)
Definition: io_buff.F90:8
subroutine read_gr_snow(HPROGRAM, HSURFTYPE, HPREFIX, KLU, KSIZE_P, KMASK_P, KPATCH, TPSNOW, HDI
Definition: read_gr_snow.F90:8
subroutine init_io_surf_n(DTCO, U, HPROGRAM, HMASK, HSCHEME, HACTION