SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
writesurf_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 writesurf_teb_n (DGU, U, TM, GDM, GRM, &
7  hprogram,kpatch,hwrite)
8 ! ####################################
9 !
10 !!**** *WRITE_TEB_n* - writes TEB fields
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 !
43 !
44 !
45 !
46 !
47 !
48 !
50 USE modd_surf_atm_n, ONLY : surf_atm_t
51 USE modd_surfex_n, ONLY : teb_model_t
54 !
56 USE modi_writesurf_gr_snow
57 USE modi_writesurf_teb_garden_n
58 USE modi_writesurf_teb_greenroof_n
59 !
60 !
61 USE yomhook ,ONLY : lhook, dr_hook
62 USE parkind1 ,ONLY : jprb
63 !
64 IMPLICIT NONE
65 !
66 !RJ #ifdef SFX_MPI
67 !RJ INCLUDE "mpif.h"
68 !RJ #endif
69 !
70 !* 0.1 Declarations of arguments
71 ! -------------------------
72 !
73 !
74 !
75 TYPE(diag_surf_atm_t), INTENT(INOUT) :: dgu
76 TYPE(surf_atm_t), INTENT(INOUT) :: u
77 TYPE(teb_model_t), INTENT(INOUT) :: tm
78 TYPE(teb_garden_model_t), INTENT(INOUT) :: gdm
79 TYPE(teb_greenroof_model_t), INTENT(INOUT) :: grm
80 !
81  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling
82 INTEGER, INTENT(IN) :: kpatch ! current TEB patch
83  CHARACTER(LEN=3), INTENT(IN) :: hwrite ! 'PREP' : does not write SBL XUNDEF fields
84 ! ! 'ALL' : all fields are written
85 !
86 !* 0.2 Declarations of local variables
87 ! -------------------------------
88 !
89 INTEGER :: iresp ! IRESP : return-code if a problem appears
90  CHARACTER(LEN=12) :: yrecfm ! Name of the article to be read
91  CHARACTER(LEN=100):: ycomment ! Comment string
92  CHARACTER(LEN=3) :: ypatch ! Patch identificator
93  CHARACTER(LEN=7) :: ydir ! Direction identificator
94  CHARACTER(LEN=100):: ystring ! Comment string
95 !
96 INTEGER :: jlayer ! loop on surface layers
97 REAL(KIND=JPRB) :: zhook_handle
98 !
99 !-------------------------------------------------------------------------------
100 !
101 IF (lhook) CALL dr_hook('WRITESURF_TEB_N',0,zhook_handle)
102 !
103 ypatch=' '
104 IF (tm%TOP%NTEB_PATCH>1) WRITE(ypatch,fmt='(A,I1,A)') 'T',kpatch,'_'
105 !
106 !
107 !* 2. Option for road orientation:
108 ! ---------------------------
109 !
110 ycomment='Option for Road orientation in TEB scheme'
111  CALL write_surf(dgu, u, &
112  hprogram,'ROAD_DIR',tm%TOP%CROAD_DIR,iresp,ycomment)
113 ycomment='Option for Wall representation in TEB scheme'
114  CALL write_surf(dgu, u, &
115  hprogram,'WALL_OPT',tm%TOP%CWALL_OPT,iresp,ycomment)
116 !
117 !* 3. Prognostic fields:
118 ! -----------------
119 !
120 !* roof temperatures
121 !
122 
123 DO jlayer=1,tm%TOP%NROOF_LAYER
124  WRITE(yrecfm,'(A3,A5,I1.1,A1)') ypatch,'TROOF',jlayer,' '
125  WRITE(ycomment,'(A9,I1.1,A4)') 'X_Y_TROOF',jlayer,' (K)'
126  yrecfm=adjustl(yrecfm)
127  CALL write_surf(dgu, u, &
128  hprogram,yrecfm,tm%T%CUR%XT_ROOF(:,jlayer),iresp,hcomment=ycomment)
129 END DO
130 
131 !
132 !* roof water content
133 !
134 
135 yrecfm=ypatch//'WS_ROOF'
136 yrecfm=adjustl(yrecfm)
137 ycomment='WS_ROOF (kg/m2)'
138  CALL write_surf(dgu, u, &
139  hprogram,yrecfm,tm%T%CUR%XWS_ROOF(:),iresp,hcomment=ycomment)
140 !
141 !* road temperatures
142 !
143 
144 DO jlayer=1,tm%TOP%NROAD_LAYER
145  WRITE(yrecfm,'(A3,A5,I1.1,A1)') ypatch,'TROAD',jlayer,' '
146  yrecfm=adjustl(yrecfm)
147  IF (tm%TOP%CROAD_DIR=='UNIF' .OR. tm%DTT%LDATA_ROAD_DIR) THEN
148  ystring = 'X_Y_TROAD'
149  ELSEIF (SIZE(tm%T%CUR%XROAD_DIR)>0) THEN
150  !* road direction is uniform spatially, one can then indicate it in the comment
151  CALL road_dir(tm%T%CUR%XROAD_DIR(1),ydir)
152  ystring=trim(ydir)//' ROAD TEMP. LAYER '
153  ELSE
154  ystring='? ROAD TEMP. LAYER '
155  ENDIF
156  WRITE(ycomment,'(A,I1.1,A4)') trim(ystring), jlayer,' (K)'
157  CALL write_surf(dgu, u, &
158  hprogram,yrecfm,tm%T%CUR%XT_ROAD(:,jlayer),iresp,hcomment=ycomment)
159 END DO
160 !
161 !* road water content
162 !
163 
164 yrecfm=ypatch//'WS_ROAD'
165 yrecfm=adjustl(yrecfm)
166 ycomment='WS_ROAD (kg/m2)'
167  CALL write_surf(dgu, u, &
168  hprogram,yrecfm,tm%T%CUR%XWS_ROAD(:),iresp,hcomment=ycomment)
169 !
170 !* wall temperatures
171 !
172 
173 DO jlayer=1,tm%TOP%NWALL_LAYER
174  IF (tm%TOP%CWALL_OPT=='UNIF') THEN
175  WRITE(yrecfm,'(A3,A5,I1.1,A1)') ypatch,'TWALL',jlayer,' '
176  yrecfm=adjustl(yrecfm)
177  WRITE(ycomment,'(A9,I1.1,A4)') 'X_Y_TWALL',jlayer,' (K)'
178  CALL write_surf(dgu, u, &
179  hprogram,yrecfm,tm%T%CUR%XT_WALL_A(:,jlayer),iresp,hcomment=ycomment)
180  ELSE
181  !* Wall A
182  WRITE(yrecfm,'(A3,A6,I1.1)') ypatch,'TWALLA',jlayer
183  yrecfm=adjustl(yrecfm)
184  IF (tm%DTT%LDATA_ROAD_DIR) THEN
185  ystring = 'X_Y_TWALL_A'
186  ELSEIF (SIZE(tm%T%CUR%XROAD_DIR)>0) THEN
187  !* wall direction is uniform spatially, one can then indicate it in the comment
188  CALL walla_dir(tm%T%CUR%XROAD_DIR(1),ydir)
189  ystring=trim(ydir)//'-FACING WALL TEMP. LAYER '
190  ELSE
191  ystring='?-FACING WALL TEMP. LAYER '
192  ENDIF
193  WRITE(ycomment,'(A,I1.1,A4)') trim(ystring), jlayer,' (K)'
194  CALL write_surf(dgu, u, &
195  hprogram,yrecfm,tm%T%CUR%XT_WALL_A(:,jlayer),iresp,hcomment=ycomment)
196  !
197  !* Wall B
198  WRITE(yrecfm,'(A3,A6,I1.1)') ypatch,'TWALLB',jlayer
199  yrecfm=adjustl(yrecfm)
200  IF (tm%DTT%LDATA_ROAD_DIR) THEN
201  ystring = 'X_Y_TWALL_B'
202  ELSEIF (SIZE(tm%T%CUR%XROAD_DIR)>0) THEN
203  !* wall direction is uniform spatially, one can then indicate it in the comment
204  CALL wallb_dir(tm%T%CUR%XROAD_DIR(1),ydir)
205  ystring=trim(ydir)//'-FACING WALL TEMP. LAYER '
206  ELSE
207  ystring='?-FACING WALL TEMP. LAYER '
208  ENDIF
209  WRITE(ycomment,'(A,I1.1,A4)') trim(ystring), jlayer,' (K)'
210  CALL write_surf(dgu, u, &
211  hprogram,yrecfm,tm%T%CUR%XT_WALL_B(:,jlayer),iresp,hcomment=ycomment)
212  END IF
213 END DO
214 !
215 !* internal building temperature
216 !
217 yrecfm=ypatch//'TI_BLD'
218 yrecfm=adjustl(yrecfm)
219 ycomment='TI_BLD (K)'
220  CALL write_surf(dgu, u, &
221  hprogram,yrecfm,tm%B%CUR%XTI_BLD(:),iresp,hcomment=ycomment)
222 !
223 !
224 !* outdoor window temperature
225 !
226 yrecfm=ypatch//'T_WIN1'
227 yrecfm=adjustl(yrecfm)
228 ycomment='T_WIN1 (K)'
229  CALL write_surf(dgu, u, &
230  hprogram,yrecfm,tm%B%CUR%XT_WIN1(:),iresp,hcomment=ycomment)
231 !
232 IF (tm%TOP%CBEM=='BEM') THEN
233 !* internal building specific humidity
234 !
235 yrecfm=ypatch//'QI_BLD'
236 yrecfm=adjustl(yrecfm)
237 ycomment='QI_BLD (kg/kg)'
238  CALL write_surf(dgu, u, &
239  hprogram,yrecfm,tm%B%CUR%XQI_BLD(:),iresp,hcomment=ycomment)
240 !
241  !
242  !* indoor window temperature
243  !
244  yrecfm=ypatch//'T_WIN2'
245  yrecfm=adjustl(yrecfm)
246  ycomment='T_WIN2 (K)'
247  CALL write_surf(dgu, u, &
248  hprogram,yrecfm,tm%B%CUR%XT_WIN2(:),iresp,hcomment=ycomment)
249  !
250  !* floor temperatures
251  !
252  DO jlayer=1,tm%BOP%NFLOOR_LAYER
253  WRITE(yrecfm,'(A3,A5,I1.1,A1)') ypatch,'TFLOO',jlayer,' '
254  WRITE(ycomment,'(A9,I1.1,A4)') 'X_Y_TFLOO',jlayer,' (K)'
255  yrecfm=adjustl(yrecfm)
256  CALL write_surf(dgu, u, &
257  hprogram,yrecfm,tm%B%CUR%XT_FLOOR(:,jlayer),iresp,hcomment=ycomment)
258  END DO
259  !
260  !* internal th. mass temperature
261  !
262  DO jlayer=1,tm%BOP%NFLOOR_LAYER
263  WRITE(yrecfm,'(A3,A5,I1.1,A1)') ypatch,'TMASS',jlayer,' '
264  WRITE(ycomment,'(A9,I1.1,A4)') 'X_Y_TMASS',jlayer,' (K)'
265  yrecfm=adjustl(yrecfm)
266  CALL write_surf(dgu, u, &
267  hprogram,yrecfm,tm%B%CUR%XT_MASS(:,jlayer),iresp,hcomment=ycomment)
268  END DO
269  !
270 ENDIF
271 !
272 !* deep road temperature
273 !
274 yrecfm=ypatch//'TI_ROAD'
275 yrecfm=adjustl(yrecfm)
276 ycomment='TI_ROAD (K)'
277  CALL write_surf(dgu, u, &
278  hprogram,yrecfm,tm%T%CUR%XTI_ROAD(:),iresp,hcomment=ycomment)
279 !
280 !* snow mantel
281 !
282 yrecfm='RF'
283  CALL writesurf_gr_snow(dgu, u, &
284  hprogram,yrecfm,ypatch,tm%T%CUR%TSNOW_ROOF )
285 !
286 yrecfm='RD'
287  CALL writesurf_gr_snow(dgu, u, &
288  hprogram,yrecfm,ypatch,tm%T%CUR%TSNOW_ROAD )
289 !
290 !-------------------------------------------------------------------------------
291 !
292 !* 4. Semi-prognostic fields:
293 ! ----------------------
294 !
295 !* temperature of canyon air
296 !
297 yrecfm=ypatch//'TCANYON'
298 yrecfm=adjustl(yrecfm)
299 ycomment='T_CANYON (K)'
300  CALL write_surf(dgu, u, &
301  hprogram,yrecfm,tm%T%CUR%XT_CANYON(:),iresp,hcomment=ycomment)
302 !
303 !* humidity of canyon air
304 !
305 yrecfm=ypatch//'QCANYON'
306 yrecfm=adjustl(yrecfm)
307 ycomment='Q_CANYON (kg/kg)'
308  CALL write_surf(dgu, u, &
309  hprogram,yrecfm,tm%T%CUR%XQ_CANYON(:),iresp,hcomment=ycomment)
310 !
311 !
312 !* Thermal solar panels present day production
313 !
314 IF (tm%TOP%LSOLAR_PANEL) THEN
315  yrecfm=ypatch//'THER_PDAY'
316  yrecfm=adjustl(yrecfm)
317  ycomment='Thermal Solar Panels present day production (J/m2)'
318  IF (.NOT. ASSOCIATED(tm%TPN%XTHER_PRODC_DAY)) THEN
319  ! for PREP cases
320  ALLOCATE(tm%TPN%XTHER_PRODC_DAY(SIZE(tm%B%CUR%XTI_BLD)))
321  tm%TPN%XTHER_PRODC_DAY=0.
322  END IF
323  CALL write_surf(dgu, u, &
324  hprogram,yrecfm,tm%TPN%XTHER_PRODC_DAY(:),iresp,hcomment=ycomment)
325 END IF
326 !-------------------------------------------------------------------------------
327 !
328 !* 5. Time
329 ! ----
330 !
331 IF (kpatch==1) THEN
332  yrecfm='DTCUR'
333  ycomment='s'
334  CALL write_surf(dgu, u, &
335  hprogram,yrecfm,tm%TOP%TTIME,iresp,hcomment=ycomment)
336 END IF
337 !
338 !
339 !-------------------------------------------------------------------------------
340 !
341 !* 6. Urban green areas
342 ! ------------------
343 !
344 ! Gardens
345 IF (tm%TOP%LGARDEN) CALL writesurf_teb_garden_n(dgu, u, gdm, &
346  hprogram,ypatch)
347 !
348 ! Grenn roofs
349 IF (tm%TOP%LGREENROOF) CALL writesurf_teb_greenroof_n(dgu, u, gdm%TVG, grm, &
350  hprogram,ypatch)
351 !
352 IF (lhook) CALL dr_hook('WRITESURF_TEB_N',1,zhook_handle)
353 !
354 !
355 !-------------------------------------------------------------------------------
356  CONTAINS
357 SUBROUTINE road_dir(PDIR,HDIR)
358 REAL, INTENT(IN) :: pdir
359  CHARACTER(LEN=7), INTENT(OUT) :: hdir
360 REAL :: zdir
361 zdir=pdir
362 IF (pdir<0) zdir = pdir +360.
363 IF (zdir>= 0. .AND. zdir< 11.25) hdir='N-S '
364 IF (zdir>= 11.25 .AND. zdir< 33.75) hdir='NNE-SSW'
365 IF (zdir>= 33.75 .AND. zdir< 56.25) hdir='NE-SW'
366 IF (zdir>= 56.25 .AND. zdir< 78.75) hdir='ENE-WSW'
367 IF (zdir>= 78.75 .AND. zdir<101.25) hdir='E-W '
368 IF (zdir>=101.25 .AND. zdir<123.75) hdir='ESE-WNW'
369 IF (zdir>=123.75 .AND. zdir<146.25) hdir='SE-NW '
370 IF (zdir>=146.25 .AND. zdir<168.75) hdir='SSE-NNW'
371 IF (zdir>=168.75 .AND. zdir<180.00) hdir='N-S '
372 END SUBROUTINE road_dir
373 SUBROUTINE walla_dir(PDIR,HDIR)
374 REAL, INTENT(IN) :: pdir
375  CHARACTER(LEN=7), INTENT(OUT) :: hdir
376 REAL :: zdir
377 zdir=pdir
378 IF (pdir<0) zdir = pdir +360.
379 IF (zdir>= 0. .AND. zdir< 11.25) hdir='E '
380 IF (zdir>= 11.25 .AND. zdir< 33.75) hdir='ESE '
381 IF (zdir>= 33.75 .AND. zdir< 56.25) hdir='SE '
382 IF (zdir>= 56.25 .AND. zdir< 78.75) hdir='SSE '
383 IF (zdir>= 78.75 .AND. zdir<101.25) hdir='S '
384 IF (zdir>=101.25 .AND. zdir<123.75) hdir='SSW '
385 IF (zdir>=123.75 .AND. zdir<146.25) hdir='SW '
386 IF (zdir>=146.25 .AND. zdir<168.75) hdir='WSW '
387 IF (zdir>=168.75 .AND. zdir<180.00) hdir='W '
388 END SUBROUTINE walla_dir
389 SUBROUTINE wallb_dir(PDIR,HDIR)
390 REAL, INTENT(IN) :: pdir
391  CHARACTER(LEN=7), INTENT(OUT) :: hdir
392 REAL :: zdir
393 zdir=pdir
394 IF (pdir<0) zdir = pdir +360.
395 IF (zdir>= 0. .AND. zdir< 11.25) hdir='W '
396 IF (zdir>= 11.25 .AND. zdir< 33.75) hdir='WNW '
397 IF (zdir>= 33.75 .AND. zdir< 56.25) hdir='NW '
398 IF (zdir>= 56.25 .AND. zdir< 78.75) hdir='NNW '
399 IF (zdir>= 78.75 .AND. zdir<101.25) hdir='N '
400 IF (zdir>=101.25 .AND. zdir<123.75) hdir='NNE '
401 IF (zdir>=123.75 .AND. zdir<146.25) hdir='NE '
402 IF (zdir>=146.25 .AND. zdir<168.75) hdir='ENE '
403 IF (zdir>=168.75 .AND. zdir<180.00) hdir='E '
404 END SUBROUTINE wallb_dir
405 !-------------------------------------------------------------------------------
406 !
407 END SUBROUTINE writesurf_teb_n
subroutine writesurf_teb_greenroof_n(DGU, U, TVG, GRM, HPROGRAM, HPATCH)
subroutine writesurf_gr_snow(DGU, U, HPROGRAM, HSURFTYPE, HPREFIX, TPSNOW)
subroutine wallb_dir(PDIR, HDIR)
subroutine road_dir(PDIR, HDIR)
subroutine writesurf_teb_garden_n(DGU, U, GDM, HPROGRAM, HPATCH)
subroutine walla_dir(PDIR, HDIR)
subroutine writesurf_teb_n(DGU, U, TM, GDM, GRM, HPROGRAM, KPATCH, HWRITE)