SURFEX v8.1
General documentation of Surfex
coupling_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 coupling_teb_n (DTCO, DST, SLT, TOP, SB, G, CHT, NT, TPN, TIR, BOP, NB, TD, GDM, GRM, &
7  HPROGRAM, HCOUPLING, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV,&
8  KSW, PTSUN, PZENITH, PAZIM, PZREF, PUREF, PZS, PU, PV, PQA, PTA, &
9  PRHOA, PSV, PCO2, HSV, PRAIN, PSN, PLW, PDIR_SW, PSCA_SW, &
10  PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, &
11  PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, &
12  PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, &
13  PPEQ_B_COEF, HTEST )
14 ! ###############################################################################
15 !
16 !!**** *COUPLING_TEB_n * - Driver for TEB
17 !!
18 !! PURPOSE
19 !! -------
20 !
21 !!** METHOD
22 !! ------
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !!
28 !! AUTHOR
29 !! ------
30 !! V. Masson
31 !!
32 !! MODIFICATIONS
33 !! -------------
34 !! Original 01/2004
35 !! 10/2005 (G.Pigeon) transfer of domestic heating
36 !! S. Riette 06/2009 Initialisation of XT, XQ, XU and XTKE on canopy levels
37 !! S. Riette 01/2010 Use of interpol_sbl to compute 10m wind diagnostic
38 !! G. Pigeon 09/2012 CCH_BEM, ROUGH_WALL, ROUGH_ROOF for building conv. coef
39 !! G. Pigeon 10/2012 XF_WIN_WIN as arg. of TEB_GARDEN
40 !! B. Decharme 09/2012 New wind implicitation
41 !! J. Escobar 09/2012 KI not allowed without-interface , replace by KI
42 !! V. Masson 08/2013 adds solar panels & occupation calendar
43 !! B. Decharme 04/2013 new coupling variables
44 !!---------------------------------------------------------------
45 !
47 USE modd_dst_n, ONLY : dst_t
48 USE modd_slt_n, ONLY : slt_t
49 !
50 USE modd_ch_teb_n, ONLY : ch_teb_t
51 USE modd_canopy_n, ONLY: canopy_t
52 USE modd_sfx_grid_n, ONLY : grid_t
54 USE modd_teb_panel_n, ONLY : teb_panel_t
55 USE modd_teb_irrig_n, ONLY : teb_irrig_t
56 USE modd_teb_n, ONLY : teb_np_t
57 USE modd_surfex_n, ONLY : teb_diag_t
59 USE modd_bem_n, ONLY : bem_np_t
60 !
63 !
65 !
66 USE modd_csts, ONLY : xrd, xcpd, xp00, xlvtt, xpi, xkarman, xg
67 USE modd_surf_par, ONLY : xundef
68 !
69 USE modd_dst_surf
70 USE modd_slt_surf
71 !
73 USE mode_thermos
74 USE mode_sbls
75 !
76 USE modi_average_rad
77 USE modi_sm10
78 USE modi_add_forecast_to_date_surf
79 USE modi_diag_inline_teb_n
80 USE modi_cumul_diag_teb_n
81 USE modi_ch_aer_dep
82 USE modi_ch_dep_town
83 USE modi_dslt_dep
84 USE modi_teb_garden
85 USE modi_teb_canopy
86 !
87 USE yomhook ,ONLY : lhook, dr_hook
88 USE parkind1 ,ONLY : jprb
89 !
90 USE modi_abor1_sfx
91 USE modi_canopy_evol
92 USE modi_canopy_grid_update
93 USE modi_utci_teb
94 USE modi_utcic_stress
95 USE modi_circumsolar_rad
96 !
97 IMPLICIT NONE
98 !
99 !* 0.1 declarations of arguments
100 !
101 !
102 !
103 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
104 TYPE(dst_t), INTENT(INOUT) :: DST
105 TYPE(slt_t), INTENT(INOUT) :: SLT
106 !
107 TYPE(ch_teb_t), INTENT(INOUT) :: CHT
108 TYPE(canopy_t), INTENT(INOUT) :: SB
109 TYPE(grid_t), INTENT(INOUT) :: G
110 TYPE(teb_options_t), INTENT(INOUT) :: TOP
111 TYPE(teb_panel_t), INTENT(INOUT) :: TPN
112 TYPE(teb_irrig_t), INTENT(INOUT) :: TIR
113 TYPE(teb_np_t), INTENT(INOUT) :: NT
114 !
115 TYPE(teb_diag_t), INTENT(INOUT) :: TD
116 !
117 TYPE(bem_options_t), INTENT(INOUT) :: BOP
118 TYPE(bem_np_t), INTENT(INOUT) :: NB
119 !
120 TYPE(teb_garden_model_t), INTENT(INOUT) :: GDM
121 TYPE(teb_greenroof_model_t), INTENT(INOUT) :: GRM
122 !
123  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
124  CHARACTER(LEN=1), INTENT(IN) :: HCOUPLING ! type of coupling
125  ! 'E' : explicit
126  ! 'I' : implicit
127 INTEGER, INTENT(IN) :: KYEAR ! current year (UTC)
128 INTEGER, INTENT(IN) :: KMONTH ! current month (UTC)
129 INTEGER, INTENT(IN) :: KDAY ! current day (UTC)
130 REAL, INTENT(IN) :: PTIME ! current time since midnight (UTC, s)
131 INTEGER, INTENT(IN) :: KI ! number of points
132 INTEGER, INTENT(IN) :: KSV ! number of scalars
133 INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands
134 REAL, DIMENSION(KI), INTENT(IN) :: PTSUN ! solar time (s from midnight)
135 REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s)
136 REAL, DIMENSION(KI), INTENT(IN) :: PZREF ! height of T,q forcing (m)
137 REAL, DIMENSION(KI), INTENT(IN) :: PUREF ! height of wind forcing (m)
138 !
139 REAL, DIMENSION(KI), INTENT(IN) :: PTA ! air temperature forcing (K)
140 REAL, DIMENSION(KI), INTENT(IN) :: PQA ! air humidity forcing (kg/m3)
141 REAL, DIMENSION(KI), INTENT(IN) :: PRHOA ! air density (kg/m3)
142 REAL, DIMENSION(KI,KSV),INTENT(IN) :: PSV ! scalar variables
143 ! ! chemistry: first char. in HSV: '#' (molecule/m3)
144 ! !
145  CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: HSV ! name of all scalar variables
146 REAL, DIMENSION(KI), INTENT(IN) :: PU ! zonal wind (m/s)
147 REAL, DIMENSION(KI), INTENT(IN) :: PV ! meridian wind (m/s)
148 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PDIR_SW ! direct solar radiation (on horizontal surf.)
149 ! ! (W/m2)
150 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PSCA_SW ! diffuse solar radiation (on horizontal surf.)
151 ! ! (W/m2)
152 REAL, DIMENSION(KSW),INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m)
153 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH ! zenithal angle (radian from the vertical)
154 REAL, DIMENSION(KI), INTENT(IN) :: PAZIM ! azimuthal angle (radian from North, clockwise)
155 REAL, DIMENSION(KI), INTENT(IN) :: PLW ! longwave radiation (on horizontal surf.)
156 ! ! (W/m2)
157 REAL, DIMENSION(KI), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa)
158 REAL, DIMENSION(KI), INTENT(IN) :: PPA ! pressure at forcing level (Pa)
159 REAL, DIMENSION(KI), INTENT(IN) :: PZS ! atmospheric model orography (m)
160 REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3)
161 REAL, DIMENSION(KI), INTENT(IN) :: PSN ! snow precipitation (kg/m2/s)
162 REAL, DIMENSION(KI), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s)
163 !
164 !
165 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH ! flux of heat (W/m2)
166 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ ! flux of water vapor (kg/m2/s)
167 REAL, DIMENSION(KI), INTENT(OUT) :: PSFU ! zonal momentum flux (Pa)
168 REAL, DIMENSION(KI), INTENT(OUT) :: PSFV ! meridian momentum flux (Pa)
169 REAL, DIMENSION(KI), INTENT(OUT) :: PSFCO2 ! flux of CO2 (kg/m2/s)
170 REAL, DIMENSION(KI,KSV),INTENT(OUT):: PSFTS ! flux of scalar var. (kg/m2/s)
171 !
172 REAL, DIMENSION(KI), INTENT(OUT) :: PTRAD ! radiative temperature (K)
173 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PDIR_ALB! direct albedo for each spectral band (-)
174 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PSCA_ALB! diffuse albedo for each spectral band (-)
175 REAL, DIMENSION(KI), INTENT(OUT) :: PEMIS ! emissivity (-)
176 !
177 REAL, DIMENSION(KI), INTENT(OUT) :: PTSURF ! surface effective temperature (K)
178 REAL, DIMENSION(KI), INTENT(OUT) :: PZ0 ! roughness length for momentum (m)
179 REAL, DIMENSION(KI), INTENT(OUT) :: PZ0H ! roughness length for heat (m)
180 REAL, DIMENSION(KI), INTENT(OUT) :: PQSURF ! specific humidity at surface (kg/kg)
181 !
182 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_A_COEF! implicit coefficients
183 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_B_COEF! needed if HCOUPLING='I'
184 REAL, DIMENSION(KI), INTENT(IN) :: PPET_A_COEF
185 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_A_COEF
186 REAL, DIMENSION(KI), INTENT(IN) :: PPET_B_COEF
187 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_B_COEF
188  CHARACTER(LEN=2), INTENT(IN) :: HTEST ! must be equal to 'OK'
189 !
190 !
191 !* 0.2 declarations of local variables
192 !
193 INTEGER :: JSWB ! loop counter on shortwave spectral bands
194 !
195 REAL, DIMENSION(KI) :: ZQA ! specific humidity (kg/kg)
196 REAL, DIMENSION(KI) :: ZEXNA ! Exner function at forcing level
197 REAL, DIMENSION(KI) :: ZEXNS ! Exner function at surface level
198 REAL, DIMENSION(KI) :: ZWIND ! wind
199 !
200 ! Ouput Diagnostics:
201 !
202 REAL, DIMENSION(KI) :: ZU_CANYON ! wind in canyon
203 REAL, DIMENSION(KI) :: ZT_CANYON ! temperature in canyon
204 REAL, DIMENSION(KI) :: ZQ_CANYON ! specific humidity in canyon
205 REAL, DIMENSION(KI) :: ZAVG_T_CANYON ! temperature in canyon for town
206 REAL, DIMENSION(KI) :: ZAVG_Q_CANYON ! specific humidity in canyon for town
207 REAL, DIMENSION(KI) :: ZT_CAN ! temperature in canyon (evolving in TEB)
208 REAL, DIMENSION(KI) :: ZQ_CAN ! specific humidity in canyon (evolving in TEB)
209 !
210 REAL, DIMENSION(KI) :: ZPEW_A_COEF ! implicit coefficients
211 REAL, DIMENSION(KI) :: ZPEW_B_COEF ! needed if HCOUPLING='I'
212 !
213 REAL, DIMENSION(KI) :: ZT_LOWCAN ! temperature at lowest canyon level (K)
214 REAL, DIMENSION(KI) :: ZQ_LOWCAN ! humidity at lowest canyon level (kg/kg)
215 REAL, DIMENSION(KI) :: ZU_LOWCAN ! wind at lowest canyon level (m/s)
216 REAL, DIMENSION(KI) :: ZZ_LOWCAN ! height of lowest canyon level (m)
217 !
218 REAL, DIMENSION(KI) :: ZPEW_A_COEF_LOWCAN ! implicit coefficients for wind coupling
219 REAL, DIMENSION(KI) :: ZPEW_B_COEF_LOWCAN ! between first canopy level and road
220 !
221 REAL, DIMENSION(KI) :: ZTA ! temperature at canyon level just above roof (K)
222 REAL, DIMENSION(KI) :: ZPA ! pressure at canyon level just above roof (K)
223 REAL, DIMENSION(KI) :: ZUA ! wind at canyon level just above roof (m/s)
224 REAL, DIMENSION(KI) :: ZUREF ! height of canyon level just above roof (m)
225 REAL, DIMENSION(KI) :: ZZREF ! height of canyon level just above roof (m)
226 !
227 REAL, DIMENSION(KI) :: ZDIR_SW ! total direct SW
228 REAL, DIMENSION(KI) :: ZSCA_SW ! total diffuse SW
229 REAL, DIMENSION(KI) :: ZAVG_SCA_SW
230 REAL, DIMENSION(KI) :: ZAVG_DIR_SW
231 REAL, DIMENSION(KI,SIZE(PDIR_SW,2)) :: ZDIR_SWB ! total direct SW per band
232 REAL, DIMENSION(KI,SIZE(PSCA_SW,2)) :: ZSCA_SWB ! total diffuse SW per band
233 !
234 !
235 REAL, DIMENSION(KI) :: ZLE_WL_A ! latent heat flux on walls
236 REAL, DIMENSION(KI) :: ZLE_WL_B ! latent heat flux on walls
237 REAL, DIMENSION(KI) :: ZAVG_H_WL
238 !
239 REAL, DIMENSION(KI) :: ZPROD_BLD ! averaged energy production from solar panel (W/m2 bld)
240 REAL, DIMENSION(KI) :: ZHU_BLD
241 REAL, DIMENSION(KI) :: ZAVG_TI_BLD
242 REAL, DIMENSION(KI) :: ZAVG_QI_BLD
243 !
244 REAL, DIMENSION(KI) :: ZRN_GRND ! net radiation on ground built surf
245 REAL, DIMENSION(KI) :: ZH_GRND ! sensible heat flux on ground built surf
246 REAL, DIMENSION(KI) :: ZLE_GRND ! latent heat flux on ground built surf
247 REAL, DIMENSION(KI) :: ZGFLX_GRND ! storage flux in ground built surf
248 REAL, DIMENSION(KI) :: ZUW_GRND ! momentum flux for ground built surf
249 REAL, DIMENSION(KI) :: ZDUWDU_GRND !
250 REAL, DIMENSION(KI) :: ZAC_GRND ! ground built surf aerodynamical conductance
251 REAL, DIMENSION(KI) :: ZAC_GRND_WAT ! ground built surf water aerodynamical conductance
252 REAL, DIMENSION(KI) :: ZEMIT_LW_GRND
253 REAL, DIMENSION(KI) :: ZREF_SW_GRND ! total solar rad reflected from ground
254 REAL, DIMENSION(KI) :: ZAVG_UW_GRND
255 REAL, DIMENSION(KI) :: ZAVG_DUWDU_GRND
256 REAL, DIMENSION(KI) :: ZAVG_H_GRND
257 REAL, DIMENSION(KI) :: ZAVG_AC_GRND
258 REAL, DIMENSION(KI) :: ZAVG_AC_GRND_WAT
259 REAL, DIMENSION(KI) :: ZAVG_E_GRND
260 REAL, DIMENSION(KI) :: ZAVG_REF_SW_GRND
261 REAL, DIMENSION(KI) :: ZAVG_EMIT_LW_GRND
262 !
263 REAL, DIMENSION(KI) :: ZLEW_RF ! latent heat flux on snowfree roof
264 REAL, DIMENSION(KI) :: ZRNSN_RF ! net radiation over snow
265 REAL, DIMENSION(KI) :: ZHSN_RF ! sensible heat flux over snow
266 REAL, DIMENSION(KI) :: ZLESN_RF ! latent heat flux over snow
267 REAL, DIMENSION(KI) :: ZGSN_RF ! flux under the snow
268 REAL, DIMENSION(KI) :: ZMELT_RF ! snow melt
269 REAL, DIMENSION(KI) :: ZUW_RF ! momentum flux for roofs
270 REAL, DIMENSION(KI) :: ZDUWDU_RF !
271 REAL, DIMENSION(KI) :: ZAVG_UW_RF
272 REAL, DIMENSION(KI) :: ZAVG_DUWDU_RF
273 REAL, DIMENSION(KI) :: ZAVG_H_RF
274 REAL, DIMENSION(KI) :: ZAVG_E_RF
275 !
276 REAL, DIMENSION(KI) :: ZLEW_RD ! latent heat flux on snowfree road
277 REAL, DIMENSION(KI) :: ZRNSN_RD ! net radiation over snow
278 REAL, DIMENSION(KI) :: ZHSN_RD ! sensible heat flux over snow
279 REAL, DIMENSION(KI) :: ZLESN_RD ! latent heat flux over snow
280 REAL, DIMENSION(KI) :: ZGSN_RD ! flux under the snow
281 REAL, DIMENSION(KI) :: ZMELT_RD ! snow melt
282 REAL, DIMENSION(KI) :: ZAC_RD ! road aerodynamical conductance
283 REAL, DIMENSION(KI) :: ZAC_RD_WAT ! road water aerodynamical conductance
284 !
285 REAL, DIMENSION(KI) :: ZAC_GD ! green area aerodynamical conductance
286 REAL, DIMENSION(KI) :: ZAC_GD_WAT! green area water aerodynamical conductance
287 REAL, DIMENSION(KI,1):: ZESN_GD ! green area snow emissivity
288 !
289 REAL, DIMENSION(KI) :: ZAC_GRF ! green roof aerodynamical conductance
290 REAL, DIMENSION(KI) :: ZAC_GRF_WAT! green roof water aerodynamical conductance
291 !
292 REAL, DIMENSION(KI) :: ZTRAD ! radiative temperature for current patch
293 REAL, DIMENSION(KI) :: ZEMIS ! emissivity for current patch
294 REAL, DIMENSION(KI,TOP%NTEB_PATCH) :: ZTRAD_PATCH ! radiative temperature for each patch
295 REAL, DIMENSION(KI,TOP%NTEB_PATCH) :: ZEMIS_PATCH ! emissivity for each patch
296 !
297 REAL, DIMENSION(KI) :: ZDIR_ALB ! direct albedo of town
298 REAL, DIMENSION(KI) :: ZSCA_ALB ! diffuse albedo of town
299 REAL, DIMENSION(KI,KSW,TOP%NTEB_PATCH) :: ZDIR_ALB_PATCH ! direct albedo per wavelength and patch
300 REAL, DIMENSION(KI,KSW,TOP%NTEB_PATCH) :: ZSCA_ALB_PATCH ! diffuse albedo per wavelength and patch
301 REAL, DIMENSION(KI) :: ZAVG_DIR_ALB ! direct albedo of town
302 REAL, DIMENSION(KI) :: ZAVG_SCA_ALB ! diffuse albedo of town
303 !
304 REAL, DIMENSION(KI) :: ZSFCO2 ! CO2 flux over town
305 !
306 REAL, DIMENSION(KI) :: ZRI ! Richardson number
307 REAL, DIMENSION(KI) :: ZCD ! drag coefficient
308 REAL, DIMENSION(KI) :: ZCDN ! neutral drag coefficient
309 REAL, DIMENSION(KI) :: ZCH ! heat drag
310 REAL, DIMENSION(KI) :: ZRN ! net radiation over town
311 REAL, DIMENSION(KI) :: ZH ! sensible heat flux over town
312 REAL, DIMENSION(KI) :: ZLE ! latent heat flux over town
313 REAL, DIMENSION(KI) :: ZGFLX ! flux through the ground
314 REAL, DIMENSION(KI) :: ZEVAP ! evaporation (km/m2/s)
315 !
316 REAL, DIMENSION(KI) :: ZAVG_CD ! aggregated drag coefficient
317 REAL, DIMENSION(KI) :: ZAVG_CDN ! aggregated neutral drag coefficient
318 REAL, DIMENSION(KI) :: ZAVG_RI ! aggregated Richardson number
319 REAL, DIMENSION(KI) :: ZAVG_CH ! aggregated Heat transfer coefficient
320 !
321 REAL, DIMENSION(KI) :: ZUSTAR ! friction velocity
322 REAL, DIMENSION(KI) :: ZSFU ! momentum flux for patch (U direction)
323 REAL, DIMENSION(KI) :: ZSFV ! momentum flux for patch (V direction)
324 !
325 REAL, DIMENSION(KI) :: ZH_TRAFFIC ! anthropogenic sensible
326 ! ! heat fluxes due to traffic
327 REAL, DIMENSION(KI) :: ZLE_TRAFFIC ! anthropogenic latent
328 ! ! heat fluxes due to traffic
329 !
330 REAL :: ZBEGIN_TRAFFIC_TIME ! start traffic time (solar time, s)
331 REAL :: ZEND_TRAFFIC_TIME ! end traffic time (solar time, s)
332 !
333 REAL, DIMENSION(KI) :: ZRESA ! aerodynamical resistance
334 !
335 REAL, DIMENSION(KI) :: ZEMIT_LW_FAC
336 REAL, DIMENSION(KI) :: ZT_RAD_IND ! Indoor mean radiant temperature [K]
337 REAL, DIMENSION(KI) :: ZREF_SW_FAC ! total solar rad reflected from facade
338 !
339 REAL, DIMENSION(KI) :: ZAVG_Z0
340 REAL, DIMENSION(KI) :: ZAVG_RESA
341 REAL, DIMENSION(KI) :: ZAVG_USTAR ! town avegared Ustar
342 REAL, DIMENSION(KI) :: ZAVG_BLD ! town averaged building fraction
343 REAL, DIMENSION(KI) :: ZAVG_BLD_HEIGHT ! town averaged building height
344 REAL, DIMENSION(KI) :: ZAVG_WL_O_HOR ! town averaged Wall/hor ratio
345 REAL, DIMENSION(KI) :: ZAVG_CAN_HW_RATIO ! town averaged road aspect ratio
346 REAL, DIMENSION(KI) :: ZAVG_H
347 REAL, DIMENSION(KI) :: ZAVG_LE
348 REAL, DIMENSION(KI) :: ZAVG_RN
349 REAL, DIMENSION(KI) :: ZAVG_GFLX
350 REAL, DIMENSION(KI) :: ZAVG_REF_SW_FAC
351 REAL, DIMENSION(KI) :: ZAVG_EMIT_LW_FAC
352 REAL, DIMENSION(KI) :: ZAVG_T_RAD_IND
353 !
354 ! absorbed solar and infra-red radiation by road, wall and roof
355 !
356 REAL, DIMENSION(KI) :: ZU_UTCI ! wind speed for the UTCI calculation (m/s)
357 
358 REAL, DIMENSION(KI) :: ZALFAU ! V+(1) = alfa u'w'(1) + beta
359 REAL, DIMENSION(KI) :: ZBETAU ! V+(1) = alfa u'w'(1) + beta
360 REAL, DIMENSION(KI) :: ZALFAT ! Th+(1) = alfa w'th'(1) + beta
361 REAL, DIMENSION(KI) :: ZBETAT ! Th+(1) = alfa w'th'(1) + beta
362 REAL, DIMENSION(KI) :: ZALFAQ ! Q+(1) = alfa w'q'(1) + beta
363 REAL, DIMENSION(KI) :: ZBETAQ ! Q+(1) = alfa w'q'(1) + beta
364 !***** CANOPY *****
365 REAL, DIMENSION(KI) :: ZWAKE ! reduction of average wind speed
366 ! ! in canyon due to direction average.
367 
368 !new local variables for UTCI calculation
369 REAL, DIMENSION(KI) :: ZF1_o_B
370 !
371 !***** CANOPY *****
372 REAL, DIMENSION(KI) :: ZSFLUX_U ! Surface flux u'w' (m2/s2)
373 REAL, DIMENSION(KI) :: ZSFLUX_T ! Surface flux w'T' (mK/s)
374 REAL, DIMENSION(KI) :: ZSFLUX_Q ! Surface flux w'q' (kgm2/s)
375 REAL, DIMENSION(KI,SB%NLVL) :: ZFORC_U ! tendency due to drag force for wind
376 REAL, DIMENSION(KI,SB%NLVL) :: ZDFORC_UDU! formal derivative of
377 ! ! tendency due to drag force for wind
378 REAL, DIMENSION(KI,SB%NLVL) :: ZFORC_E ! tendency due to drag force for TKE
379 REAL, DIMENSION(KI,SB%NLVL) :: ZDFORC_EDE! formal derivative of
380 ! ! tendency due to drag force for TKE
381 REAL, DIMENSION(KI,SB%NLVL) :: ZFORC_T ! tendency due to drag force for Temp
382 REAL, DIMENSION(KI,SB%NLVL) :: ZDFORC_TDT! formal derivative of
383 ! ! tendency due to drag force for Temp
384 REAL, DIMENSION(KI,SB%NLVL) :: ZFORC_Q ! tendency due to drag force for hum
385 REAL, DIMENSION(KI,SB%NLVL) :: ZDFORC_QDQ! formal derivative of
386 ! ! tendency due to drag force for hum.
387 REAL, DIMENSION(KI) :: ZLAMBDA_F ! frontal density (-)
388 REAL, DIMENSION(KI) :: ZLMO ! Monin-Obukhov length at canopy height (m)
389 REAL, DIMENSION(KI,SB%NLVL) :: ZL ! Mixing length generic profile at mid levels
390 !
391 REAL, DIMENSION(KI) :: ZCOEF
392 !
393 REAL :: ZCONVERTFACM0_SLT, ZCONVERTFACM0_DST
394 REAL :: ZCONVERTFACM3_SLT, ZCONVERTFACM3_DST
395 REAL :: ZCONVERTFACM6_SLT, ZCONVERTFACM6_DST
396 !
397 INTEGER :: JI
398 INTEGER :: JLAYER
399 INTEGER :: JJ
400 !
401 ! number of TEB patches
402 !
403 INTEGER :: JP, IBEG, IEND ! loop counter
404 !
405 REAL(KIND=JPRB) :: ZHOOK_HANDLE
406 !
407 !-------------------------------------------------------------------------------------
408 ! Preliminaries:
409 !-------------------------------------------------------------------------------------
410 IF (lhook) CALL dr_hook('COUPLING_TEB_N',0,zhook_handle)
411 IF (htest/='OK') THEN
412  CALL abor1_sfx('COUPLING_TEBN: FATAL ERROR DURING ARGUMENT TRANSFER')
413 END IF
414 
415 !-------------------------------------------------------------------------------------
416 !
417 ! scalar fluxes
418 !
419 psfts(:,:) = 0.
420 !
421 ! broadband radiative fluxes
422 !
423 zdir_sw(:) = 0.
424 zsca_sw(:) = 0.
425 DO jswb=1,ksw
426  !add directionnal contrib from scattered radiation
427  CALL circumsolar_rad(pdir_sw(:,jswb), psca_sw(:,jswb), pzenith, zf1_o_b)
428  zdir_swb(:,jswb) = pdir_sw(:,jswb) + psca_sw(:,jswb) * zf1_o_b
429  zsca_swb(:,jswb) = psca_sw(:,jswb) * (1. - zf1_o_b)
430  !add directionnal contrib from scattered radiation
431  DO jj=1,SIZE(pdir_sw,1)
432  zdir_sw(jj) = zdir_sw(jj) + zdir_swb(jj,jswb)
433  zsca_sw(jj) = zsca_sw(jj) + zsca_swb(jj,jswb)
434  ENDDO
435 END DO
436 !
437 DO jj=1,ki
438 ! specific humidity (conversion from kg/m3 to kg/kg)
439 !
440  zqa(jj) = pqa(jj) / prhoa(jj)
441 !
442 ! wind
443 !
444  zwind(jj) = sqrt(pu(jj)**2+pv(jj)**2)
445 !
446 ENDDO
447 ! method of wind coupling
448 !
449 IF (hcoupling=='I') THEN
450  zpew_a_coef = ppew_a_coef
451  zpew_b_coef = ppew_b_coef
452 ELSE
453  zpew_a_coef = 0.
454  zpew_b_coef = zwind
455 END IF
456 !
457 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
458 ! Time evolution
459 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
460 !
461 top%TTIME%TIME = top%TTIME%TIME + ptstep
462  CALL add_forecast_to_date_surf(top%TTIME%TDATE%YEAR, top%TTIME%TDATE%MONTH,&
463  top%TTIME%TDATE%DAY, top%TTIME%TIME)
464 !
465 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
466 ! Anthropogenic fluxes (except building heating)
467 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
468 !
469 zbegin_traffic_time = 21600.
470 zend_traffic_time = 64800.
471 !
472 WHERE( ptsun>zbegin_traffic_time .AND. ptsun<zend_traffic_time )
473  zh_traffic(:) = nt%AL(1)%XH_TRAFFIC (:)
474  zle_traffic(:) = nt%AL(1)%XLE_TRAFFIC (:)
475 ELSEWHERE
476  zh_traffic(:) = 0.
477  zle_traffic(:) = 0.
478 END WHERE
479 !
480 !--------------------------------------------------------------------------------------
481 ! Canyon forcing for TEB
482 !--------------------------------------------------------------------------------------
483 !-------------------------------------------------------------------------------------
484 ! Town averaged quantities to force canopy atmospheric layers
485 !-------------------------------------------------------------------------------------
486 
487 DO jp=1,top%NTEB_PATCH
488  CALL add_patch_contrib(jp,zavg_bld, nt%AL(jp)%XBLD )
489  CALL add_patch_contrib(jp,zavg_bld_height, nt%AL(jp)%XBLD_HEIGHT )
490  CALL add_patch_contrib(jp,zavg_wl_o_hor, nt%AL(jp)%XWALL_O_HOR )
491  CALL add_patch_contrib(jp,zavg_can_hw_ratio,nt%AL(jp)%XCAN_HW_RATIO)
492  CALL add_patch_contrib(jp,zavg_z0, nt%AL(jp)%XZ0_TOWN )
493 END DO
494 !
495 IF (top%LCANOPY) THEN
496  !-------------------------------------------------------------------------------------
497  ! Updates canopy vertical grid as a function of forcing height
498  !-------------------------------------------------------------------------------------
499  !
500  !* determines where is the forcing level and modifies the upper levels of the canopy grid
501  !
502  CALL canopy_grid_update(ki, zavg_bld_height, zavg_bld_height+puref, sb)
503  !
504  !* Initialisations of T, Q, TKE and wind at first time step
505  !
506  IF(any(sb%XT(:,:) == xundef)) THEN
507  DO jlayer=1,sb%NLVL
508  sb%XT(:,jlayer) = pta(:)
509  sb%XQ(:,jlayer) = pqa(:)
510  sb%XU(:,jlayer) = 2./xpi * zwind(:) &
511  * log( ( 2.* nt%AL(1)%XBLD_HEIGHT(:)/3.) / nt%AL(1)%XZ0_TOWN(:)) &
512  / log( (puref(:)+ 2.* nt%AL(1)%XBLD_HEIGHT(:)/3.) / nt%AL(1)%XZ0_TOWN(:))
513  END DO
514  sb%XTKE(:,:) = 1.
515  ENDIF
516  !
517  !* default forcing above roof: forcing level
518  zuref(:) = puref(:)
519  zzref(:) = pzref(:)
520  zua(:) = sb%XU(:,sb%NLVL)
521  zta(:) = sb%XT(:,sb%NLVL)
522  zqa(:) = sb%XQ(:,sb%NLVL)/prhoa(:)
523  zpa(:) = sb%XP(:,sb%NLVL)
524  !* for the time being, only one value is kept for wall in-canyon forcing, in the middle of the canyon
525  zu_canyon(:) = zua(:)
526  zt_canyon(:) = zta(:)
527  zq_canyon(:) = zqa(:)
528  DO jlayer=1,sb%NLVL-1
529  DO ji=1,ki
530  !* finds middle canyon layer
531  IF (sb%XZ(ji,jlayer)<zavg_bld_height(ji)/2. .AND. sb%XZ(ji,jlayer+1)>=zavg_bld_height(ji)/2.) THEN
532  zcoef(ji) = (zavg_bld_height(ji)/2.-sb%XZ(ji,jlayer))/(sb%XZ(ji,jlayer+1)-sb%XZ(ji,jlayer))
533  zu_canyon(ji) = sb%XU(ji,jlayer) + zcoef(ji) * (sb%XU(ji,jlayer+1)-sb%XU(ji,jlayer))
534  zt_canyon(ji) = sb%XT(ji,jlayer) + zcoef(ji) * (sb%XT(ji,jlayer+1)-sb%XT(ji,jlayer))
535  zq_canyon(ji) =(sb%XQ(ji,jlayer) + zcoef(ji) * (sb%XQ(ji,jlayer+1)-sb%XQ(ji,jlayer)))/prhoa(ji)
536  END IF
537  !* finds layer just above roof (at least 1m above roof)
538  IF (sb%XZ(ji,jlayer)<zavg_bld_height(ji)+1. .AND. sb%XZ(ji,jlayer+1)>=zavg_bld_height(ji)+1.) THEN
539  zuref(ji) = sb%XZ(ji,jlayer+1) - zavg_bld_height(ji)
540  zzref(ji) = sb%XZ(ji,jlayer+1) - zavg_bld_height(ji)
541  zta(ji) = sb%XT(ji,jlayer+1)
542  zqa(ji) = sb%XQ(ji,jlayer+1)/prhoa(ji)
543  !ZUA (JI) = XU(JI,JLAYER+1)
544  zua(ji) = max(sb%XU(ji,jlayer+1) - 2.*sqrt(sb%XTKE(ji,jlayer+1)) , sb%XU(ji,jlayer+1)/3.)
545  zpa(ji) = sb%XP(ji,jlayer+1)
546  zlmo(ji) = sb%XLMO(ji,jlayer+1)
547  END IF
548  END DO
549  END DO
550  zu_canyon= max(zu_canyon,0.2)
551  zu_lowcan=sb%XU(:,1)
552  zt_lowcan=sb%XT(:,1)
553  zq_lowcan=sb%XQ(:,1) / prhoa(:)
554  zz_lowcan=sb%XZ(:,1)
555  WHERE(zpa==xundef) zpa = ppa ! security for first time step
556  !
557  !-------------------------------------------------------------------------------------
558  ! determine the vertical profile for mixing and dissipative lengths (at full levels)
559  !-------------------------------------------------------------------------------------
560  !
561  ! frontal density
562  zlambda_f(:) = zavg_can_hw_ratio*zavg_bld / (0.5*xpi)
563  !
564  CALL sm10(sb%XZ, zavg_bld_height, zlambda_f, zl)
565  !
566  !-------------------------------------------------------------------------------------
567  ! computes coefficients for implicitation
568  !-------------------------------------------------------------------------------------
569  !
570  zavg_uw_grnd(:) = 0.
571  zavg_duwdu_grnd(:) = 0.
572  zavg_uw_rf(:) = 0.
573  zavg_duwdu_rf(:) = 0.
574  zavg_h_grnd(:) = 0.
575  zavg_h_wl(:) = 0.
576  zavg_h_rf(:) = 0.
577  zavg_e_grnd(:) = 0.
578  zavg_e_rf(:) = 0.
579  zavg_ac_grnd(:) = 0.
580  zavg_ac_grnd_wat(:)= 0.
581  zsflux_u(:) = 0.
582  zsflux_t(:) = 0.
583  zsflux_q(:) = 0.
584  !
585  DO jlayer=1,sb%NLVL-1
586  !* Monin-Obuhkov theory not used inside the urban canopy
587  ! => neutral mixing if layer is below : (roof level +1 meter)
588  WHERE (sb%XZ(:,jlayer)<=zavg_bld_height(:)+1.) sb%XLMO(:,jlayer) = xundef
589  ENDDO
590  !
591  !* computes tendencies on wind and Tke due to canopy
592  CALL teb_canopy(ki, sb, zavg_bld, zavg_bld_height, zavg_wl_o_hor, ppa, prhoa, &
593  zavg_duwdu_grnd, zavg_uw_rf, zavg_duwdu_rf, zavg_h_wl, &
594  zavg_h_rf, zavg_e_rf, zavg_ac_grnd, zavg_ac_grnd_wat, zforc_u, &
595  zdforc_udu, zforc_e, zdforc_ede, zforc_t, zdforc_tdt, zforc_q, &
596  zdforc_qdq )
597  !
598  !* computes coefficients for implicitation
599  CALL canopy_evol(sb, ki, ptstep, 1, zl, zwind, pta, pqa, ppa, prhoa, &
600  zsflux_u, zsflux_t, zsflux_q, zforc_u, zdforc_udu, &
601  zforc_e, zdforc_ede, zforc_t, zdforc_tdt, zforc_q, &
602  zdforc_qdq, sb%XLM, sb%XLEPS, zavg_ustar, zalfau, &
603  zbetau, zalfat, zbetat, zalfaq, zbetaq)
604  !
605  zpew_a_coef_lowcan = - zalfau / prhoa
606  zpew_b_coef_lowcan = zbetau
607  !
608  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
609 ELSE ! no canopy case
610  !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
611  DO ji=1,ki
612  !* skimming flow for h/w>1 (maximum effect of direction on wind in the canyon);
613  !* isolated flow for h/w<0.5 (wind is the same in large streets for all dir.)
614  !* wake flow between.
615  !
616  zwake(ji)= 1. + (2./xpi-1.) * 2. * (zavg_can_hw_ratio(ji)-0.5)
617  zwake(ji)= max(min(zwake(ji),1.),2./xpi)
618  !
619  !* Estimation of canyon wind speed from wind just above roof level
620  ! (at 1.33h). Wind at 1.33h is estimated using the log law.
621  !
622  IF (zavg_bld_height(ji) .GT. 0.) THEN
623  zu_canyon(ji) = zwake(ji) * exp(-zavg_can_hw_ratio(ji)/4.) * zwind(ji) &
624  * log( ( 2.* zavg_bld_height(ji)/3.) / zavg_z0(ji)) &
625  / log( (puref(ji)+ 2.* zavg_bld_height(ji)/3.) / zavg_z0(ji))
626  zz_lowcan(ji) = zavg_bld_height(ji) / 2.
627  ELSE
628  zu_canyon(ji) = zwind(ji)
629  zz_lowcan(ji) = pzref(ji)
630  ENDIF
631  END DO
632  !
633  !* Without SBL scheme, canyon air is assumed at mid height
634  zu_lowcan = zu_canyon
635 
636  zt_lowcan = nt%AL(1)%XT_CANYON
637  zq_lowcan = nt%AL(1)%XQ_CANYON
638  zt_canyon = nt%AL(1)%XT_CANYON
639  zq_canyon = nt%AL(1)%XQ_CANYON
640 
641  zuref = puref
642  zzref = pzref
643  zta = pta
644  zua = zwind
645  zpa = ppa
646  zpew_a_coef_lowcan = 0.
647  zpew_b_coef_lowcan = zu_canyon
648 
649 END IF
650 !
651 ! Exner functions
652 !
653 zexns(:) = (pps(:)/xp00)**(xrd/xcpd)
654 zexna(:) = (zpa(:)/xp00)**(xrd/xcpd)
655 
656 !--------------------------------------------------------------------------------------
657 ! Over Urban surfaces/towns:
658 !--------------------------------------------------------------------------------------
659 !
660 DO jp = 1,top%NTEB_PATCH
661  !
662  zt_can = zt_canyon
663  zq_can = zq_canyon
664  !
665  IF (top%LCANOPY) THEN
666  nt%AL(jp)%XT_CANYON(:) = zt_canyon(:)
667  nt%AL(jp)%XQ_CANYON(:) = zq_canyon(:)
668  END IF
669  !
670  zlesn_rf(:) = 0.
671  zlesn_rd(:) = 0.
672  td%NDMT%AL(jp)%XG_GREENROOF_ROOF(:) = 0.
673  !
674  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
675  ! Call the physical routines of TEB (including gardens & greenroofs)
676  ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
677  !
678  CALL teb_garden(dtco, g, top, nt%AL(jp), bop, nb%AL(jp), tpn, tir, td%NDMT%AL(jp), gdm, grm, jp, &
679  cimplicit_wind, ptsun, zt_can, zq_can, zu_canyon, zt_lowcan, zq_lowcan, &
680  zu_lowcan, zz_lowcan, zpew_a_coef, zpew_b_coef, zpew_a_coef_lowcan, &
681  zpew_b_coef_lowcan, pps, zpa, zexns, zexna, zta, zqa, prhoa, pco2, plw, &
682  zdir_swb, zsca_swb, psw_bands, ksw, pzenith, pazim, prain, psn, zzref, &
683  zuref, zua, zh_traffic, zle_traffic, ptstep, zlew_rf, zlew_rd, zle_wl_a,&
684  zle_wl_b, zrnsn_rf, zhsn_rf, zlesn_rf, zgsn_rf, zmelt_rf, zrnsn_rd, &
685  zhsn_rd, zlesn_rd, zgsn_rd, zmelt_rd, zrn_grnd, zh_grnd, zle_grnd, &
686  zgflx_grnd, zrn, zh, zle, zgflx, zevap, zsfco2, zuw_grnd, &
687  zuw_rf, zduwdu_grnd, zduwdu_rf, zustar, zcd, zcdn, zch, zri, ztrad, &
688  zemis, zdir_alb, zsca_alb, zresa, zac_rd, zac_gd, zac_grf, zac_rd_wat, &
689  zac_gd_wat, zac_grf_wat, kday, zemit_lw_fac, zemit_lw_grnd, zt_rad_ind, &
690  zref_sw_grnd, zref_sw_fac, zhu_bld, ptime, zprod_bld )
691 
692 
693  !
694  IF (.NOT. top%LCANOPY) THEN
695 
696  CALL add_patch_contrib(jp,zavg_t_canyon,zt_can)
697  CALL add_patch_contrib(jp,zavg_q_canyon,zq_can)
698  !
699  ! Momentum fluxes
700  !
701  zsfu = 0.
702  zsfv = 0.
703  DO jj=1,SIZE(pu)
704  IF (zwind(jj)>0.) THEN
705  zcoef(jj) = - prhoa(jj) * zustar(jj)**2 / zwind(jj)
706  zsfu(jj) = zcoef(jj) * pu(jj)
707  zsfv(jj) = zcoef(jj) * pv(jj)
708  ENDIF
709  ENDDO
710  CALL add_patch_contrib(jp,psfu,zsfu)
711  CALL add_patch_contrib(jp,psfv,zsfv)
712  !
713  ENDIF
714  !
715  !-------------------------------------------------------------------------------------
716  ! Outputs:
717  !-------------------------------------------------------------------------------------
718  !
719  ! Grid box average fluxes/properties: Arguments and standard diagnostics
720  !
721  CALL add_patch_contrib(jp,psfth,zh)
722  CALL add_patch_contrib(jp,psftq,zevap)
723  CALL add_patch_contrib(jp,psfco2,zsfco2)
724  !
725  !
726  ! Albedo for each wavelength and patch
727  !
728  DO jswb=1,SIZE(psw_bands)
729  DO jj=1,SIZE(zdir_alb)
730  zdir_alb_patch(jj,jswb,jp) = zdir_alb(jj)
731  zsca_alb_patch(jj,jswb,jp) = zsca_alb(jj)
732  ENDDO
733  END DO
734  !
735  ! emissivity and radiative temperature
736  !
737  zemis_patch(:,jp) = zemis
738  ztrad_patch(:,jp) = ztrad
739  !
740  ! computes some aggregated diagnostics
741  !
742  CALL add_patch_contrib(jp,zavg_cd ,zcd )
743  CALL add_patch_contrib(jp,zavg_cdn,zcdn)
744  CALL add_patch_contrib(jp,zavg_ri ,zri )
745  CALL add_patch_contrib(jp,zavg_ch ,zch )
746  CALL add_patch_contrib(jp,zavg_rn ,zrn )
747  CALL add_patch_contrib(jp,zavg_h ,zh )
748  CALL add_patch_contrib(jp,zavg_le ,zle )
749  CALL add_patch_contrib(jp,zavg_gflx ,zgflx )
750  !
751  !* warning: aerodynamical resistance does not yet take into account gardens
752  CALL add_patch_contrib(jp,zavg_resa,1./zresa)
753  IF (jp==top%NTEB_PATCH) zavg_resa = 1./zavg_resa
754  !
755  !-------------------------------------------------------------------------------------
756  ! Diagnostics on each patch
757  !-------------------------------------------------------------------------------------
758  !
759  IF (td%MTO%LSURF_MISC_BUDGET) THEN
760  !
761  ! cumulated diagnostics
762  ! ---------------------
763  !
764  CALL cumul_diag_teb_n(td%NDMTC%AL(jp), td%NDMT%AL(jp), gdm%VD%NDEC%AL(jp), gdm%VD%NDE%AL(jp), &
765  grm%VD%NDEC%AL(jp), grm%VD%NDE%AL(jp), top, ptstep)
766  !
767  END IF
768  !
769  !
770  !-------------------------------------------------------------------------------------
771  ! Computes averaged parameters necessary for UTCI
772  !-------------------------------------------------------------------------------------
773  !
774  IF (td%O%N2M >0 .AND. td%DUT%LUTCI) THEN
775  CALL add_patch_contrib(jp,zavg_ref_sw_grnd ,zref_sw_grnd )
776  CALL add_patch_contrib(jp,zavg_ref_sw_fac ,zref_sw_fac )
777  CALL add_patch_contrib(jp,zavg_sca_sw ,zsca_sw )
778  CALL add_patch_contrib(jp,zavg_dir_sw ,zdir_sw )
779  CALL add_patch_contrib(jp,zavg_emit_lw_fac ,zemit_lw_fac )
780  CALL add_patch_contrib(jp,zavg_emit_lw_grnd,zemit_lw_grnd)
781  CALL add_patch_contrib(jp,zavg_t_rad_ind ,zt_rad_ind )
782  CALL add_patch_contrib(jp,zavg_ti_bld ,nb%AL(jp)%XTI_BLD)
783  CALL add_patch_contrib(jp,zavg_qi_bld ,nb%AL(jp)%XQI_BLD)
784  END IF
785  !
786  !-------------------------------------------------------------------------------------
787  ! Use of the canopy version of TEB
788  !-------------------------------------------------------------------------------------
789  !
790  IF (top%LCANOPY) THEN
791  !-------------------------------------------------------------------------------------
792  ! Town averaged quantities to force canopy atmospheric layers
793  !-------------------------------------------------------------------------------------
794 
795  CALL add_patch_contrib(jp,zavg_duwdu_grnd, zduwdu_grnd )
796  CALL add_patch_contrib(jp,zavg_uw_rf , zuw_rf)
797  CALL add_patch_contrib(jp,zavg_duwdu_rf , zduwdu_rf)
798  CALL add_patch_contrib(jp,zavg_h_wl , 0.5*(td%NDMT%AL(jp)%XH_WALL_A+td%NDMT%AL(jp)%XH_WALL_B))
799  CALL add_patch_contrib(jp,zavg_h_rf , (td%NDMT%AL(jp)%XH_ROOF + nt%AL(jp)%XH_INDUSTRY))
800  CALL add_patch_contrib(jp,zavg_e_rf , (td%NDMT%AL(jp)%XLE_ROOF+ nt%AL(jp)%XLE_INDUSTRY)/xlvtt)
801  !
802  !-------------------------------------------------------------------------------------
803  ! Computes the impact of canopy and surfaces on air
804  !-------------------------------------------------------------------------------------
805  !
806  zac_grnd(:) = (nt%AL(jp)%XROAD(:)*zac_rd(:) + nt%AL(jp)%XGARDEN(:)*zac_gd(:)) / &
807  (nt%AL(jp)%XROAD(:)+nt%AL(jp)%XGARDEN(:))
808  zac_grnd_wat(:) = (nt%AL(jp)%XROAD(:)*zac_rd_wat(:) + nt%AL(jp)%XGARDEN(:)*zac_gd_wat(:)) / &
809  (nt%AL(jp)%XROAD(:)+nt%AL(jp)%XGARDEN(:))
810  !
811  CALL add_patch_contrib(jp,zavg_ac_grnd , zac_grnd )
812  CALL add_patch_contrib(jp,zavg_ac_grnd_wat, zac_grnd_wat)
813  CALL add_patch_contrib(jp,zsflux_u , zuw_grnd * (1.-nt%AL(jp)%XBLD))
814  CALL add_patch_contrib(jp,zsflux_t , zh_grnd * (1.-nt%AL(jp)%XBLD)/xcpd/prhoa)
815  CALL add_patch_contrib(jp,zsflux_q , zle_grnd * (1.-nt%AL(jp)%XBLD)/xlvtt)
816  !
817  END IF
818  !
819  !-------------------------------------------------------------------------------------
820  ! end of loop on TEB patches
821 END DO
822 !-------------------------------------------------------------------------------------
823 !
824 !-------------------------------------------------------------------------------------
825 !* Evolution of canopy air if canopy option is active
826 !-------------------------------------------------------------------------------------
827 !
828 IF (top%LCANOPY) THEN
829  !
830  !-------------------------------------------------------------------------------------
831  !* Impact of TEB fluxes on the air
832  !-------------------------------------------------------------------------------------
833  !
834  CALL teb_canopy(ki, sb, zavg_bld, zavg_bld_height, zavg_wl_o_hor, ppa, prhoa, &
835  zavg_duwdu_grnd, zavg_uw_rf, zavg_duwdu_rf, zavg_h_wl, &
836  zavg_h_rf, zavg_e_rf, zavg_ac_grnd, zavg_ac_grnd_wat, zforc_u, &
837  zdforc_udu, zforc_e, zdforc_ede, zforc_t, zdforc_tdt, zforc_q, &
838  zdforc_qdq )
839  !
840  !-------------------------------------------------------------------------------------
841  !* Evolution of canopy air due to these impacts
842  !-------------------------------------------------------------------------------------
843  !
844  CALL canopy_evol(sb, ki, ptstep, 2, zl, zwind, pta, pqa, ppa, prhoa, &
845  zsflux_u, zsflux_t, zsflux_q, zforc_u, zdforc_udu, &
846  zforc_e, zdforc_ede, zforc_t, zdforc_tdt, zforc_q, &
847  zdforc_qdq, sb%XLM, sb%XLEPS, zavg_ustar, zalfau, &
848  zbetau, zalfat, zbetat, zalfaq, zbetaq )
849  !
850  !-------------------------------------------------------------------------------------
851  ! Momentum fluxes in the case canopy is active
852  !-------------------------------------------------------------------------------------
853  !
854  psfu=0.
855  psfv=0.
856  zavg_z0(:) = min(zavg_z0(:),puref(:)*0.5)
857  zavg_cdn=(xkarman/log(puref(:)/zavg_z0(:)))**2
858  zavg_cd = zavg_cdn
859  zavg_ri = 0.
860  DO jj=1,SIZE(pu)
861  IF (zwind(jj)>0.) THEN
862  zcoef(jj) = - prhoa(jj) * zavg_ustar(jj)**2 / zwind(jj)
863  psfu(jj) = zcoef(jj) * pu(jj)
864  psfv(jj) = zcoef(jj) * pv(jj)
865  zavg_cd(jj) = zavg_ustar(jj)**2 / zwind(jj)**2
866  zavg_ri(jj) = -xg/pta(jj)*zsflux_t(jj)/zavg_ustar(jj)**4
867  ENDIF
868  ENDDO
869  !
870  !-------------------------------------------------------------------------------------
871  ! End of specific case with canopy option
872  !-------------------------------------------------------------------------------------
873  !
874 END IF
875 !
876 !-------------------------------------------------------------------------------------
877 ! Outputs:
878 !-------------------------------------------------------------------------------------
879 !
880 !-------------------------------------------------------------------------------------
881 !Radiative properties should be at time t+1 (see by the atmosphere) in order to close
882 !the energy budget between surfex and the atmosphere. It is not the case here
883 !for ALB and EMIS
884 !-------------------------------------------------------------------------------------
885 !
886  CALL average_rad(top%XTEB_PATCH, zdir_alb_patch, zsca_alb_patch, zemis_patch, &
887  ztrad_patch, pdir_alb, psca_alb, pemis, ptrad )
888 !
889 !-------------------------------------------------------------------------------
890 !Physical properties see by the atmosphere in order to close the energy budget
891 !between surfex and the atmosphere. All variables should be at t+1 but very
892 !difficult to do. Maybe it will be done later. However, Ts can be at time t+1
893 !-------------------------------------------------------------------------------
894 !
895 ptsurf(:) = ptrad(:) ! Should be the surface effective temperature; not radative
896 pz0(:) = zavg_z0(:) ! Should account for ISBA (greenroof and garden) Z0
897 pz0h(:) = pz0(:) / 200. ! Should account for ISBA (greenroof and garden) Z0
898 pqsurf(:) = nt%AL(1)%XQ_CANYON(:) ! Should account for ISBA (greenroof and garden) Qs
899 !
900 !-------------------------------------------------------------------------------------
901 ! Scalar fluxes:
902 !-------------------------------------------------------------------------------------
903 !
904 zavg_ustar(:) = sqrt(sqrt(psfu**2+psfv**2))
905 !
906 !
907 IF (cht%SVT%NBEQ>0) THEN
908 
909  ibeg = cht%SVT%NSV_CHSBEG
910  iend = cht%SVT%NSV_CHSEND
911 
912  IF (cht%CCH_DRY_DEP == "WES89") THEN
913  CALL ch_dep_town(zavg_resa, zavg_ustar, pta, ptrad, zavg_wl_o_hor,&
914  psv(:,ibeg:iend), cht%SVT%CSV(ibeg:iend), cht%XDEP(:,1:cht%SVT%NBEQ) )
915 
916  DO ji=ibeg,iend
917 !cdir nodep
918  DO jj=1,SIZE(psfts,1)
919  psfts(jj,ji) = - psv(jj,ji) * cht%XDEP(jj,ji-ibeg+1)
920  ENDDO
921  ENDDO
922 
923  IF (cht%SVT%NAEREQ > 0 ) THEN
924 
925  ibeg = cht%SVT%NSV_AERBEG
926  iend = cht%SVT%NSV_AEREND
927 
928  CALL ch_aer_dep(psv(:,ibeg:iend), psfts(:,ibeg:iend), &
929  zavg_ustar, zavg_resa, pta, prhoa)
930  END IF
931 
932  ELSE
933 
934  ibeg = cht%SVT%NSV_CHSBEG
935  iend = cht%SVT%NSV_CHSEND
936 
937  DO ji=ibeg,iend
938  psfts(:,ji) =0.
939  ENDDO
940 
941  ibeg = cht%SVT%NSV_AERBEG
942  iend = cht%SVT%NSV_AEREND
943 
944  IF(ibeg.LT.iend) THEN
945  DO ji=ibeg,iend
946  psfts(:,ji) =0.
947  ENDDO
948  ENDIF
949  ENDIF
950 
951 ENDIF
952 
953 IF (cht%SVT%NDSTEQ>0) THEN
954  ! Blindage à enlever lorsque que TEB aura été corrigé
955  zustar(:) = min(zustar(:), 10.)
956  zresa(:) = max(zresa(:), 10.)
957  !
958  ibeg = cht%SVT%NSV_DSTBEG
959  iend = cht%SVT%NSV_DSTEND
960  !
961  CALL dslt_dep(psv(:,ibeg:iend), psfts(:,ibeg:iend), zustar, zresa, pta, prhoa, &
962  dst%XEMISSIG_DST, dst%XEMISRADIUS_DST, jpmode_dst, xdensity_dst, &
963  xmolarweight_dst, zconvertfacm0_dst, zconvertfacm6_dst, &
964  zconvertfacm3_dst, lvarsig_dst, lrgfix_dst, cvermod )
965 
966  CALL massflux2momentflux( &
967  psfts(:,ibeg:iend), & !I/O ![kg/m2/sec] In: flux of only mass, out: flux of moments
968  prhoa, & !I [kg/m3] air density
969  dst%XEMISRADIUS_DST, &!I [um] emitted radius for the modes (max 3)
970  dst%XEMISSIG_DST, &!I [-] emitted sigma for the different modes (max 3)
971  ndstmde, &
972  zconvertfacm0_dst, &
973  zconvertfacm6_dst, &
974  zconvertfacm3_dst, &
976 ENDIF
977 IF (cht%SVT%NSLTEQ>0) THEN
978  !
979  ibeg = cht%SVT%NSV_SLTBEG
980  iend = cht%SVT%NSV_SLTEND
981  !
982  CALL dslt_dep(psv(:,ibeg:iend), psfts(:,ibeg:iend), zustar, zresa, pta, prhoa, &
983  slt%XEMISSIG_SLT, slt%XEMISRADIUS_SLT, jpmode_slt, xdensity_slt, &
984  xmolarweight_slt, zconvertfacm0_slt, zconvertfacm6_slt, &
985  zconvertfacm3_slt, lvarsig_slt, lrgfix_slt, cvermod )
986 
987  CALL massflux2momentflux( &
988  psfts(:,ibeg:iend), & !I/O ![kg/m2/sec] In: flux of only mass, out: flux of moments
989  prhoa, & !I [kg/m3] air density
990  slt%XEMISRADIUS_SLT, &!I [um] emitted radius for the modes (max 3)
991  slt%XEMISSIG_SLT, &!I [-] emitted sigma for the different modes (max 3)
992  nsltmde, &
993  zconvertfacm0_slt, &
994  zconvertfacm6_slt, &
995  zconvertfacm3_slt, &
997 ENDIF
998 !
999 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1000 ! Inline diagnostics
1001 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1002 !
1003  CALL diag_inline_teb_n(td%O, td%D, sb, nt%AL(1), top%LCANOPY, &
1004  pta, ptrad, zqa, ppa, pps, prhoa, pu, pv, zwind, pzref, puref, &
1005  zavg_cd, zavg_cdn, zavg_ri, zavg_ch, zavg_z0, ptrad, pemis, &
1006  pdir_alb, psca_alb, plw, zdir_swb, zsca_swb, psfth, psftq, &
1007  psfu, psfv, psfco2, zavg_rn, zavg_h, zavg_le, zavg_gflx )
1008 !
1009 !-------------------------------------------------------------------------------------
1010 ! Stores Canyon air and humidity if historical option of TEB is active
1011 !-------------------------------------------------------------------------------------
1012 !
1013 IF (.NOT. top%LCANOPY) THEN
1014  DO jp=1,top%NTEB_PATCH
1015  nt%AL(jp)%XT_CANYON(:) = zavg_t_canyon(:)
1016  nt%AL(jp)%XQ_CANYON(:) = zavg_q_canyon(:)
1017  END DO
1018 END IF
1019 !
1020 !-------------------------------------------------------------------------------------
1021 ! Thermal confort index
1022 !-------------------------------------------------------------------------------------
1023 !
1024 IF (td%DUT%LUTCI .AND. td%O%N2M >0) THEN
1025  DO jj=1,ki
1026  IF (td%D%XZON10M(jj)/=xundef) THEN
1027  zu_utci(jj) = sqrt(td%D%XZON10M(jj)**2+td%D%XMER10M(jj)**2)
1028  ELSE
1029  zu_utci(jj) = zwind(jj)
1030  ENDIF
1031  ENDDO
1032  CALL utci_teb(nt%AL(1), td%DUT, zavg_ti_bld, zavg_qi_bld, zu_utci, pps, zavg_ref_sw_grnd, &
1033  zavg_ref_sw_fac, zavg_sca_sw, zavg_dir_sw, pzenith, zavg_emit_lw_fac, &
1034  zavg_emit_lw_grnd, plw, zavg_t_rad_ind )
1035  CALL utcic_stress(ptstep,td%DUT%XUTCI_IN ,td%DUT%XUTCIC_IN )
1036  CALL utcic_stress(ptstep,td%DUT%XUTCI_OUTSUN ,td%DUT%XUTCIC_OUTSUN )
1037  CALL utcic_stress(ptstep,td%DUT%XUTCI_OUTSHADE,td%DUT%XUTCIC_OUTSHADE)
1038 ELSE IF (td%DUT%LUTCI) THEN
1039  td%DUT%XUTCI_IN (:) = xundef
1040  td%DUT%XUTCI_OUTSUN (:) = xundef
1041  td%DUT%XUTCI_OUTSHADE (:) = xundef
1042  td%DUT%XTRAD_SUN (:) = xundef
1043  td%DUT%XTRAD_SHADE (:) = xundef
1044  td%DUT%XUTCIC_IN (:,:) = xundef
1045  td%DUT%XUTCIC_OUTSUN (:,:) = xundef
1046  td%DUT%XUTCIC_OUTSHADE(:,:) = xundef
1047 ENDIF
1048 
1049 !
1050 IF (lhook) CALL dr_hook('COUPLING_TEB_N',1,zhook_handle)
1051 !
1052 !-------------------------------------------------------------------------------------
1053 CONTAINS
1054 SUBROUTINE add_patch_contrib(JP,PAVG,PFIELD)
1055 INTEGER, INTENT(IN) :: JP
1056 REAL, DIMENSION(:), INTENT(INOUT) :: PAVG
1057 REAL, DIMENSION(:), INTENT(IN) :: PFIELD
1058 !
1059 IF (jp==1) pavg = 0.
1060 pavg = pavg + top%XTEB_PATCH(:,jp) * pfield(:)
1061 !
1062 END SUBROUTINE add_patch_contrib
1063 !-------------------------------------------------------------------------------------
1064 !
1065 END SUBROUTINE coupling_teb_n
1066 
1067 
subroutine massflux2momentflux(PFLUX, PRHODREF, PEMISRADIUS, PEMISSIG, KMDE, PCONVERTFACM0, PCONVERTFACM6, PCONVERTFACM3, OVARSIG, ORGFIX)
subroutine cumul_diag_teb_n(DMTC, DMT, GDDEC, GDDE, GRDEC, GRDE, TOP, PTSTEP)
character(len=3) cimplicit_wind
real, parameter xmolarweight_slt
real, save xcpd
Definition: modd_csts.F90:63
real, parameter xmolarweight_dst
logical lvarsig_dst
subroutine ch_dep_town(PRESA_TOWN, PUSTAR_TOWN, PTA, PTRAD, PWALL_O_HOR, PSV, HSV, PDEP)
Definition: ch_dep_town.F90:8
real, parameter xdensity_dst
subroutine ch_aer_dep(PSVT, PFSVT, PUSTAR, PRESA, PTA, PRHODREF)
Definition: ch_aer_dep.F90:8
real, save xlvtt
Definition: modd_csts.F90:70
real, save xpi
Definition: modd_csts.F90:43
integer jpmode_slt
subroutine sm10(PZ, PBLD_HEIGHT, PLAMBDA_F, PL)
Definition: sm10.F90:7
real, save xkarman
Definition: modd_csts.F90:48
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
real, save xrd
Definition: modd_csts.F90:62
logical lrgfix_dst
subroutine canopy_evol(SB, KI, PTSTEP, KIMPL, PZZ, PWIND, PTA, PQA
Definition: canopy_evol.F90:7
real, save xg
Definition: modd_csts.F90:55
integer, parameter jprb
Definition: parkind1.F90:32
subroutine teb_garden(DTCO, G, TOP, T, BOP, B, TPN, TIR, DMT, GDM, GRM, KTEB_P, HIMPLICIT_WIND, PTSUN, PT_CAN, PQ_CAN, PU_CAN, PT_LOWCAN, PQ_LOWCAN, PU_LOWCAN, PZ_LOWCAN, PPEW_A_COEF, PPEW_B_COEF, PPEW_A_COEF_LOWCAN, PPEW_B_COEF_LOWCAN, PPS, PPA, PEXNS, PEXNA, PTA, PQA, PRHOA, PCO2, PLW_RAD, PDIR_SW, PSCA_SW, PSW_BANDS, KSW, PZENITH, PAZIM, PRR, PSR, PZREF, PUREF, PVMOD, PH_TRAFFIC, PLE_TRAFFIC, PTSTEP, PLEW_RF, PLEW_RD, PLE_WL_A, PLE_WL_B, PRNSN_RF, PHSN_RF, PLESN_RF, PGSN_RF, PMELT_RF, PRNSN_RD, PHSN_RD, PLESN_RD, PGSN_RD, PMELT_RD, PRN_GRND, PH_GRND, PLE_GRND, PGFLX_GRND, PRN_TWN, PH_TWN, PLE_TWN, PGFLX_TWN, PEVAP_TWN, PSFCO2, PUW_GRND, PUW_RF, PDUWDU_GRND, PDUWDU_RF, PUSTAR_TWN, PCD, PCDN, PCH_TWN, PRI_TWN, PTS_TWN, PEMIS_TWN, PDIR_ALB_TWN, PSCA_ALB_TWN, PRESA_TWN, PAC_RD, PAC_GD, PAC_GR, PAC_RD_WAT, PAC_GD_WAT, PAC_GR_WAT, KDAY, PEMIT_LW_FAC, PEMIT_LW_GRND, PT_RAD_IND, PREF_SW_GRND, PREF_SW_FAC, PHU_BLD, PTIME, PPROD_BLD)
Definition: teb_garden.F90:20
subroutine diag_inline_teb_n(DGO, D, SB, T, OCANOPY, PTA, PTS, PQA, PPA, PPS, PRHOA, PZONA, PMERA, PWIND, PHT, PHW, PCD, PCDN, PRI, PCH, PZ0, PTRAD, PEMIS, PDIR_ALB, PSCA_ALB, PLW, PDIR_SW, PSCA_SW, PSFTH, PSFTQ, PSFZON, PSFMER, PSFCO2, PRN, PH, PLE, PGFLUX)
logical lvarsig_slt
subroutine utci_teb(T, DUT, PTI_BLD, PQI_BLD, PU10, PPS, PREF_SW_GRND, PREF_SW_FAC, PSCA_SW, PDIR_SW, PZENITH, PEMIT_LW_FAC, PEMIT_LW_GRND, PLW_RAD, PTRAD_IN)
Definition: utci_teb.F90:9
subroutine coupling_teb_n(DTCO, DST, SLT, TOP, SB, G, CHT, NT, TPN, TIR, BOP, NB, TD, GDM, GRM, HPROGRAM, HCOUPLING, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PAZIM, PZREF, PUREF, PZS, PU, PV, PQA, PTA, PRHOA, PSV, PCO2, HSV, PRAIN, PSN, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, PTRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST)
subroutine dslt_dep(PSVT, PFSVT, PUSTAR, PRESA, PTA, PRHODREF, PEMISSIG, PEMISRADIUS, KPMODE, PDENSITY, PMOLARWEIGHT, PCONVERTFACM0, PCONVERTFACM6, PCONVERTFACM3, OVARSIG, ORGFIX, HVERMOD)
Definition: dslt_dep.F90:10
logical lhook
Definition: yomhook.F90:15
integer jpmode_dst
subroutine add_patch_contrib(JP, PAVG, PFIELD)
subroutine add_forecast_to_date_surf(KYEAR, KMONTH, KDAY, PSEC)
character(len=6) cvermod
real, parameter xdensity_slt
subroutine average_rad(PFRAC_TILE, PDIR_ALB_TILE, PSCA_ALB_TILE, PEMIS_TILE, PTRAD_TILE,
Definition: average_rad.F90:8
subroutine canopy_grid_update(KI, PH, PZFORC, SB)
logical lrgfix_slt
real, save xp00
Definition: modd_csts.F90:57
subroutine circumsolar_rad(PDIR_SW, PSCA_SW, PZENITH, PF1_o_B)
subroutine utcic_stress(PTSTEP, PUTCI, PUTCIC)
Definition: utcic_stress.F90:7
subroutine teb_canopy(KI, SB, PBLD, PBLD_HEIGHT, PWALL_O_HOR, PPA, PRHOA, PDUWDU_ROAD, PUW_ROOF, PDUWDU_ROOF, PH_WALL, PH_ROOF, PE_ROOF, PAC_ROAD, PAC_ROAD_WAT, PFORC_U, PDFORC_UDU, PFORC_E, PDFORC_EDE, PFORC_T, PDFORC_TDT, PFORC_Q, PDFORC_QDQ)
Definition: teb_canopy.F90:9