SURFEX v8.1
General documentation of Surfex
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 (HSELECT, OSNOWDIMNC, DTCO, U, TOP, BOP, T, B, ODATA_ROAD_DIR, TPN, &
7  GDO, GDS, GDPEK, GRO, GRS, GRPEK, 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 !! REFERGREENROOFE
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 !
42 USE modd_surf_atm_n, ONLY : surf_atm_t
45 USE modd_teb_n, ONLY : teb_t
46 USE modd_bem_n, ONLY : bem_t
47 USE modd_teb_panel_n, ONLY : teb_panel_t
49 USE modd_isba_n, ONLY : isba_pe_t, isba_s_t
50 !
52 !
53 USE modi_end_io_surf_n
54 USE modi_init_io_surf_n
55 !
57 USE modi_writesurf_gr_snow
58 USE modi_writesurf_teb_garden_n
59 USE modi_writesurf_teb_greenroof_n
60 !
61 !
62 USE yomhook ,ONLY : lhook, dr_hook
63 USE parkind1 ,ONLY : jprb
64 !
65 IMPLICIT NONE
66 !
67 !RJ #ifdef SFX_MPI
68 !RJ INCLUDE "mpif.h"
69 !RJ #endif
70 !
71 !* 0.1 Declarations of arguments
72 ! -------------------------
73 !
74 !
75  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
76 LOGICAL, INTENT(IN) :: OSNOWDIMNC
77 !
78 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
79 TYPE(surf_atm_t), INTENT(INOUT) :: U
80 TYPE(teb_options_t), INTENT(IN) :: TOP
81 TYPE(bem_options_t), INTENT(IN) :: BOP
82 TYPE(teb_t), INTENT(IN) :: T
83 TYPE(bem_t), INTENT(IN) :: B
84 LOGICAL, INTENT(IN) :: ODATA_ROAD_DIR
85 TYPE(teb_panel_t), INTENT(INOUT) :: TPN
86 TYPE(isba_options_t), INTENT(IN) :: GDO
87 TYPE(isba_s_t), INTENT(INOUT) :: GDS
88 TYPE(isba_pe_t), INTENT(IN) :: GDPEK
89 TYPE(isba_options_t), INTENT(IN) :: GRO
90 TYPE(isba_s_t), INTENT(INOUT) :: GRS
91 TYPE(isba_pe_t), INTENT(IN) :: GRPEK
92 !
93  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling
94 INTEGER, INTENT(IN) :: KPATCH ! current TEB patch
95  CHARACTER(LEN=3), INTENT(IN) :: HWRITE ! 'PREP' : does not write SBL XUNDEF fields
96 ! ! 'ALL' : all fields are written
97 !
98 !* 0.2 Declarations of local variables
99 ! -------------------------------
100 !
101 REAL, DIMENSION(0,0,1) :: ZWSN_WR, ZRHO_WR, ZHEA_WR, ZAGE_WR, ZSG1_WR, ZSG2_WR, ZHIS_WR
102 REAL, DIMENSION(0,1) :: ZALB_WR
103 !
104 INTEGER, DIMENSION(SIZE(T%XT_ROOF,1)) :: IMASK
105 INTEGER :: IRESP ! IRESP : return-code if a problem appears
106  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
107  CHARACTER(LEN=100):: YCOMMENT ! Comment string
108  CHARACTER(LEN=3) :: YPATCH ! Patch identificator
109  CHARACTER(LEN=7) :: YDIR ! Direction identificator
110  CHARACTER(LEN=100):: YSTRING ! Comment string
111 !
112 INTEGER :: JLAYER, JI ! loop on surface layers
113 REAL(KIND=JPRB) :: ZHOOK_HANDLE
114 !
115 !-------------------------------------------------------------------------------
116 !
117 IF (lhook) CALL dr_hook('WRITESURF_TEB_N',0,zhook_handle)
118 !
119 ypatch=' '
120 IF (top%NTEB_PATCH>1) WRITE(ypatch,fmt='(A,I1,A)') 'T',kpatch,'_'
121 !
122 !
123 !* 2. Option for road orientation:
124 ! ---------------------------
125 !
126 ycomment='Option for Road orientation in TEB scheme'
127  CALL write_surf(hselect,hprogram,'ROAD_DIR',top%CROAD_DIR,iresp,ycomment)
128 ycomment='Option for Wall representation in TEB scheme'
129  CALL write_surf(hselect,hprogram,'WALL_OPT',top%CWALL_OPT,iresp,ycomment)
130 !
131 !* 3. Prognostic fields:
132 ! -----------------
133 !
134 !* roof temperatures
135 !
136 
137 DO jlayer=1,top%NROOF_LAYER
138  WRITE(yrecfm,'(A3,A5,I1.1,A1)') ypatch,'TROOF',jlayer,' '
139  WRITE(ycomment,'(A9,I1.1,A4)') 'X_Y_TROOF',jlayer,' (K)'
140  yrecfm=adjustl(yrecfm)
141  CALL write_surf(hselect,hprogram,yrecfm,t%XT_ROOF(:,jlayer),iresp,hcomment=ycomment)
142 END DO
143 
144 !
145 !* roof water content
146 !
147 
148 yrecfm=ypatch//'WS_ROOF'
149 yrecfm=adjustl(yrecfm)
150 ycomment='WS_ROOF (kg/m2)'
151  CALL write_surf(hselect,hprogram,yrecfm,t%XWS_ROOF(:),iresp,hcomment=ycomment)
152 !
153 !* road temperatures
154 !
155 
156 DO jlayer=1,top%NROAD_LAYER
157  WRITE(yrecfm,'(A3,A5,I1.1,A1)') ypatch,'TROAD',jlayer,' '
158  yrecfm=adjustl(yrecfm)
159  IF (top%CROAD_DIR=='UNIF' .OR. odata_road_dir) THEN
160  ystring = 'X_Y_TROAD'
161  ELSEIF (SIZE(t%XROAD_DIR)>0) THEN
162  !* road direction is uniform spatially, one can then indicate it in the comment
163  CALL road_dir(t%XROAD_DIR(1),ydir)
164  ystring=trim(ydir)//' ROAD TEMP. LAYER '
165  ELSE
166  ystring='? ROAD TEMP. LAYER '
167  ENDIF
168  WRITE(ycomment,'(A,I1.1,A4)') trim(ystring), jlayer,' (K)'
169  CALL write_surf(hselect,hprogram,yrecfm,t%XT_ROAD(:,jlayer),iresp,hcomment=ycomment)
170 END DO
171 !
172 !* road water content
173 !
174 
175 yrecfm=ypatch//'WS_ROAD'
176 yrecfm=adjustl(yrecfm)
177 ycomment='WS_ROAD (kg/m2)'
178  CALL write_surf(hselect,hprogram,yrecfm,t%XWS_ROAD(:),iresp,hcomment=ycomment)
179 !
180 !* wall temperatures
181 !
182 
183 DO jlayer=1,top%NWALL_LAYER
184  IF (top%CWALL_OPT=='UNIF') THEN
185  WRITE(yrecfm,'(A3,A5,I1.1,A1)') ypatch,'TWALL',jlayer,' '
186  yrecfm=adjustl(yrecfm)
187  WRITE(ycomment,'(A9,I1.1,A4)') 'X_Y_TWALL',jlayer,' (K)'
188  CALL write_surf(hselect,hprogram,yrecfm,t%XT_WALL_A(:,jlayer),iresp,hcomment=ycomment)
189  ELSE
190  !* Wall A
191  WRITE(yrecfm,'(A3,A6,I1.1)') ypatch,'TWALLA',jlayer
192  yrecfm=adjustl(yrecfm)
193  IF (odata_road_dir) THEN
194  ystring = 'X_Y_TWALL_A'
195  ELSEIF (SIZE(t%XROAD_DIR)>0) THEN
196  !* wall direction is uniform spatially, one can then indicate it in the comment
197  CALL walla_dir(t%XROAD_DIR(1),ydir)
198  ystring=trim(ydir)//'-FACING WALL TEMP. LAYER '
199  ELSE
200  ystring='?-FACING WALL TEMP. LAYER '
201  ENDIF
202  WRITE(ycomment,'(A,I1.1,A4)') trim(ystring), jlayer,' (K)'
203  CALL write_surf(hselect,hprogram,yrecfm,t%XT_WALL_A(:,jlayer),iresp,hcomment=ycomment)
204  !
205  !* Wall B
206  WRITE(yrecfm,'(A3,A6,I1.1)') ypatch,'TWALLB',jlayer
207  yrecfm=adjustl(yrecfm)
208  IF (odata_road_dir) THEN
209  ystring = 'X_Y_TWALL_B'
210  ELSEIF (SIZE(t%XROAD_DIR)>0) THEN
211  !* wall direction is uniform spatially, one can then indicate it in the comment
212  CALL wallb_dir(t%XROAD_DIR(1),ydir)
213  ystring=trim(ydir)//'-FACING WALL TEMP. LAYER '
214  ELSE
215  ystring='?-FACING WALL TEMP. LAYER '
216  ENDIF
217  WRITE(ycomment,'(A,I1.1,A4)') trim(ystring), jlayer,' (K)'
218  CALL write_surf(hselect,hprogram,yrecfm,t%XT_WALL_B(:,jlayer),iresp,hcomment=ycomment)
219  END IF
220 END DO
221 !
222 IF (lwrite_extern) THEN
223  !
224  DO jlayer=1,top%NROOF_LAYER
225  WRITE(yrecfm,fmt='(A,I1.1)') 'D_ROOF',jlayer
226  ycomment='Roof layer thickness'
227  CALL write_surf(hselect, &
228  hprogram,yrecfm,t%XD_ROOF(:,jlayer),iresp,hcomment=ycomment)
229  END DO
230  DO jlayer=1,top%NWALL_LAYER
231  WRITE(yrecfm,fmt='(A,I1.1)') 'D_WALL',jlayer
232  ycomment='WALL layer thickness'
233  CALL write_surf(hselect,hprogram,yrecfm,t%XD_WALL(:,jlayer),iresp,hcomment=ycomment)
234  END DO
235  DO jlayer=1,top%NROAD_LAYER
236  WRITE(yrecfm,fmt='(A,I1.1)') 'D_ROAD',jlayer
237  ycomment='ROAD layer thickness'
238  CALL write_surf(hselect,hprogram,yrecfm,t%XD_ROAD(:,jlayer),iresp,hcomment=ycomment)
239  END DO
240  IF (top%CBEM=='BEM') THEN
241  DO jlayer=1,bop%NFLOOR_LAYER
242  WRITE(yrecfm,fmt='(A,I1.1)') 'D_FLOOR',jlayer
243  ycomment='FLOOR layer thickness'
244  CALL write_surf(hselect,hprogram,yrecfm,b%XD_FLOOR(:,jlayer),iresp,hcomment=ycomment)
245  END DO
246  ENDIF
247  !
248 ENDIF
249 !
250 !* internal building temperature
251 !
252 yrecfm=ypatch//'TI_BLD'
253 yrecfm=adjustl(yrecfm)
254 ycomment='TI_BLD (K)'
255  CALL write_surf(hselect,hprogram,yrecfm,b%XTI_BLD(:),iresp,hcomment=ycomment)
256 !
257 !
258 !* outdoor window temperature
259 !
260 yrecfm=ypatch//'T_WIN1'
261 yrecfm=adjustl(yrecfm)
262 ycomment='T_WIN1 (K)'
263  CALL write_surf(hselect,hprogram,yrecfm,b%XT_WIN1(:),iresp,hcomment=ycomment)
264 !
265 IF (top%CBEM=='BEM') THEN
266 !* internal building specific humidity
267 !
268 yrecfm=ypatch//'QI_BLD'
269 yrecfm=adjustl(yrecfm)
270 ycomment='QI_BLD (kg/kg)'
271  CALL write_surf(hselect,hprogram,yrecfm,b%XQI_BLD(:),iresp,hcomment=ycomment)
272 !
273  !
274  !* indoor window temperature
275  !
276  yrecfm=ypatch//'T_WIN2'
277  yrecfm=adjustl(yrecfm)
278  ycomment='T_WIN2 (K)'
279  CALL write_surf(hselect,hprogram,yrecfm,b%XT_WIN2(:),iresp,hcomment=ycomment)
280  !
281  !* floor temperatures
282  !
283  DO jlayer=1,bop%NFLOOR_LAYER
284  WRITE(yrecfm,'(A3,A5,I1.1,A1)') ypatch,'TFLOO',jlayer,' '
285  WRITE(ycomment,'(A9,I1.1,A4)') 'X_Y_TFLOO',jlayer,' (K)'
286  yrecfm=adjustl(yrecfm)
287  CALL write_surf(hselect,hprogram,yrecfm,b%XT_FLOOR(:,jlayer),iresp,hcomment=ycomment)
288  END DO
289  !
290  !* internal th. mass temperature
291  !
292  DO jlayer=1,bop%NFLOOR_LAYER
293  WRITE(yrecfm,'(A3,A5,I1.1,A1)') ypatch,'TMASS',jlayer,' '
294  WRITE(ycomment,'(A9,I1.1,A4)') 'X_Y_TMASS',jlayer,' (K)'
295  yrecfm=adjustl(yrecfm)
296  CALL write_surf(hselect,hprogram,yrecfm,b%XT_MASS(:,jlayer),iresp,hcomment=ycomment)
297  END DO
298  !
299 ENDIF
300 !
301 !* deep road temperature
302 !
303 yrecfm=ypatch//'TI_ROAD'
304 yrecfm=adjustl(yrecfm)
305 ycomment='TI_ROAD (K)'
306  CALL write_surf(hselect,hprogram,yrecfm,t%XTI_ROAD(:),iresp,hcomment=ycomment)
307 !
308 !* snow mantel
309 !*
310 DO ji = 1,SIZE(t%XT_ROOF,1)
311  imask(ji) = ji
312 ENDDO
313 !
314 yrecfm='RF'
315  CALL writesurf_gr_snow(osnowdimnc,hselect,hprogram,yrecfm,ypatch,&
316  SIZE(t%XT_ROOF,1),imask,0,t%TSNOW_ROOF, &
317  zwsn_wr,zrho_wr,zhea_wr,zage_wr,zsg1_wr, &
318  zsg2_wr,zhis_wr,zalb_wr)
319 !
320 yrecfm='RD'
321  CALL writesurf_gr_snow(osnowdimnc,hselect,hprogram,yrecfm,ypatch,&
322  SIZE(t%XT_ROOF,1),imask,0,t%TSNOW_ROAD, &
323  zwsn_wr,zrho_wr,zhea_wr,zage_wr,zsg1_wr, &
324  zsg2_wr,zhis_wr,zalb_wr)
325 !
326 !-------------------------------------------------------------------------------
327 !
328 !* 4. Semi-prognostic fields:
329 ! ----------------------
330 !
331 !* temperature of canyon air
332 !
333 yrecfm=ypatch//'TCANYON'
334 yrecfm=adjustl(yrecfm)
335 ycomment='T_CANYON (K)'
336  CALL write_surf(hselect,hprogram,yrecfm,t%XT_CANYON(:),iresp,hcomment=ycomment)
337 !
338 !* humidity of canyon air
339 !
340 yrecfm=ypatch//'QCANYON'
341 yrecfm=adjustl(yrecfm)
342 ycomment='Q_CANYON (kg/kg)'
343  CALL write_surf(hselect,hprogram,yrecfm,t%XQ_CANYON(:),iresp,hcomment=ycomment)
344 !
345 !
346 !* Thermal solar panels present day production
347 !
348 IF (top%LSOLAR_PANEL) THEN
349  yrecfm=ypatch//'THER_PDAY'
350  yrecfm=adjustl(yrecfm)
351  ycomment='Thermal Solar Panels present day production (J/m2)'
352  IF (.NOT. ASSOCIATED(tpn%XTHER_PRODC_DAY)) THEN
353  ! for PREP cases
354  ALLOCATE(tpn%XTHER_PRODC_DAY(SIZE(b%XTI_BLD)))
355  tpn%XTHER_PRODC_DAY=0.
356  END IF
357  CALL write_surf(hselect,hprogram,yrecfm,tpn%XTHER_PRODC_DAY(:),iresp,hcomment=ycomment)
358 END IF
359 !-------------------------------------------------------------------------------
360 !
361 !* 5. Time
362 ! ----
363 !
364 IF (kpatch==1) THEN
365  yrecfm='DTCUR'
366  ycomment='s'
367  CALL write_surf(hselect,hprogram,yrecfm,top%TTIME,iresp,hcomment=ycomment)
368 END IF
369 !
370 !
371 !-------------------------------------------------------------------------------
372 !
373 !* 6. Urban green areas
374 ! ------------------
375 !
376 ! Gardens
377 IF (top%LGARDEN) THEN
378  CALL end_io_surf_n(hprogram)
379  CALL init_io_surf_n(dtco, u, hprogram,'TOWN ','TEB ','WRITE','GARDEN_PROGNOSTIC.OUT.nc')
380  CALL writesurf_teb_garden_n(hselect, osnowdimnc, gdo, gds, gdpek, hprogram,ypatch)
381 ENDIF
382 !
383 ! Grenn roofs
384 IF (top%LGREENROOF) THEN
385  CALL end_io_surf_n(hprogram)
386  CALL init_io_surf_n(dtco, u, hprogram,'TOWN ','TEB ','WRITE','GREENROOF_PROGNOSTIC.OUT.nc')
387  CALL writesurf_teb_greenroof_n(hselect, osnowdimnc, gro, grs, grpek, hprogram,ypatch)
388 ENDIF
389 !
390 IF (lhook) CALL dr_hook('WRITESURF_TEB_N',1,zhook_handle)
391 !
392 !
393 !-------------------------------------------------------------------------------
394 CONTAINS
395 SUBROUTINE road_dir(PDIR,HDIR)
396 REAL, INTENT(IN) :: PDIR
397  CHARACTER(LEN=7), INTENT(OUT) :: HDIR
398 REAL :: ZDIR
399 zdir=pdir
400 IF (pdir<0) zdir = pdir +360.
401 IF (zdir>= 0. .AND. zdir< 11.25) hdir='N-S '
402 IF (zdir>= 11.25 .AND. zdir< 33.75) hdir='NNE-SSW'
403 IF (zdir>= 33.75 .AND. zdir< 56.25) hdir='NE-SW'
404 IF (zdir>= 56.25 .AND. zdir< 78.75) hdir='ENE-WSW'
405 IF (zdir>= 78.75 .AND. zdir<101.25) hdir='E-W '
406 IF (zdir>=101.25 .AND. zdir<123.75) hdir='ESE-WNW'
407 IF (zdir>=123.75 .AND. zdir<146.25) hdir='SE-NW '
408 IF (zdir>=146.25 .AND. zdir<168.75) hdir='SSE-NNW'
409 IF (zdir>=168.75 .AND. zdir<180.00) hdir='N-S '
410 END SUBROUTINE road_dir
411 SUBROUTINE walla_dir(PDIR,HDIR)
412 REAL, INTENT(IN) :: PDIR
413  CHARACTER(LEN=7), INTENT(OUT) :: HDIR
414 REAL :: ZDIR
415 zdir=pdir
416 IF (pdir<0) zdir = pdir +360.
417 IF (zdir>= 0. .AND. zdir< 11.25) hdir='E '
418 IF (zdir>= 11.25 .AND. zdir< 33.75) hdir='ESE '
419 IF (zdir>= 33.75 .AND. zdir< 56.25) hdir='SE '
420 IF (zdir>= 56.25 .AND. zdir< 78.75) hdir='SSE '
421 IF (zdir>= 78.75 .AND. zdir<101.25) hdir='S '
422 IF (zdir>=101.25 .AND. zdir<123.75) hdir='SSW '
423 IF (zdir>=123.75 .AND. zdir<146.25) hdir='SW '
424 IF (zdir>=146.25 .AND. zdir<168.75) hdir='WSW '
425 IF (zdir>=168.75 .AND. zdir<180.00) hdir='W '
426 END SUBROUTINE walla_dir
427 SUBROUTINE wallb_dir(PDIR,HDIR)
428 REAL, INTENT(IN) :: PDIR
429  CHARACTER(LEN=7), INTENT(OUT) :: HDIR
430 REAL :: ZDIR
431 zdir=pdir
432 IF (pdir<0) zdir = pdir +360.
433 IF (zdir>= 0. .AND. zdir< 11.25) hdir='W '
434 IF (zdir>= 11.25 .AND. zdir< 33.75) hdir='WNW '
435 IF (zdir>= 33.75 .AND. zdir< 56.25) hdir='NW '
436 IF (zdir>= 56.25 .AND. zdir< 78.75) hdir='NNW '
437 IF (zdir>= 78.75 .AND. zdir<101.25) hdir='N '
438 IF (zdir>=101.25 .AND. zdir<123.75) hdir='NNE '
439 IF (zdir>=123.75 .AND. zdir<146.25) hdir='NE '
440 IF (zdir>=146.25 .AND. zdir<168.75) hdir='ENE '
441 IF (zdir>=168.75 .AND. zdir<180.00) hdir='E '
442 END SUBROUTINE wallb_dir
443 !-------------------------------------------------------------------------------
444 !
445 END SUBROUTINE writesurf_teb_n
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine writesurf_teb_garden_n(HSELECT, OSNOWDIMNC, IO, S, PEK
subroutine writesurf_teb_n(HSELECT, OSNOWDIMNC, DTCO, U, TOP, BOP
integer, parameter jprb
Definition: parkind1.F90:32
subroutine wallb_dir(PDIR, HDIR)
subroutine road_dir(PDIR, HDIR)
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:7
subroutine writesurf_teb_greenroof_n(HSELECT, OSNOWDIMNC, IO, S,
logical lhook
Definition: yomhook.F90:15
subroutine writesurf_gr_snow(OSNOWDIMNC, HSELECT, HPROGRAM, HSURF
subroutine walla_dir(PDIR, HDIR)
subroutine init_io_surf_n(DTCO, U, HPROGRAM, HMASK, HSCHEME, HACTION