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