SURFEX v8.1
General documentation of Surfex
urban_fluxes.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 urban_fluxes(TOP, T, B, DMT, HIMPLICIT_WIND, PT_CANYON, PPEW_A_COEF, PPEW_B_COEF, &
7  PEXNS, PRHOA, PVMOD, PH_TRAFFIC, PLE_TRAFFIC, PAC_WL, PCD, PDF_RF, &
8  PDN_RF, PDF_RD, PDN_RD, PRNSN_RF, PHSN_RF, PLESN_RF, PGSN_RF, &
9  PRNSN_RD, PHSN_RD, PLESN_RD, PGSN_RD, PMELT_RF, PDQS_RF, PMELT_RD, &
10  PDQS_RD, PDQS_WL_A, PDQS_WL_B, PFLX_BLD_RF, PFLX_BLD_WL_A, &
11  PFLX_BLD_WL_B, PFLX_BLD_FL, PFLX_BLD_MA, PE_SHADING, PLEW_RF, &
12  PRN_GR, PH_GR, PLE_GR, PGFLUX_GR, &
13  PLEW_RD, PLE_WL_A, PLE_WL_B, PMELT_BLT, PUSTAR_TWN )
14 ! ##########################################################################
15 !
16 !!**** *URBAN_FLUXES* computes fluxes on urbanized surfaces
17 !!
18 !! PURPOSE
19 !! -------
20 !
21 !
22 !!** METHOD
23 ! ------
24 !
25 !
26 !
27 !
28 !! EXTERNAL
29 !! --------
30 !!
31 !!
32 !! IMPLICIT ARGUMENTS
33 !! ------------------
34 !!
35 !! MODD_CST
36 !!
37 !!
38 !! REFERENCE
39 !! ---------
40 !!
41 !!
42 !! AUTHOR
43 !! ------
44 !!
45 !! V. Masson * Meteo-France *
46 !!
47 !! MODIFICATIONS
48 !! -------------
49 !! Original 23/01/98
50 !! 12/02 (A. Lemonsu) modifications of emissivity and Tstown
51 !! 07/07 (P. LeMoigne) expression of latent heat fluxes as
52 !! functions of w'theta' instead of w'T'
53 !! 17/10 (G. Pigeon) computation of anthropogenic heat due
54 !! to domestic heating
55 !! Modified 09/2012 : B. Decharme New wind implicitation
56 !-------------------------------------------------------------------------------
57 !
58 !* 0. DECLARATIONS
59 ! ------------
60 !
62 USE modd_teb_n, ONLY : teb_t
63 USE modd_bem_n, ONLY : bem_t
65 !
66 USE modd_surf_par, ONLY : xundef
67 USE modd_csts, ONLY : xcpd
68 !
69 USE yomhook ,ONLY : lhook, dr_hook
70 USE parkind1 ,ONLY : jprb
71 !
72 IMPLICIT NONE
73 !
74 !* 0.1 declarations of arguments
75 !
76 TYPE(teb_options_t), INTENT(INOUT) :: TOP
77 TYPE(teb_t), INTENT(INOUT) :: T
78 TYPE(bem_t), INTENT(INOUT) :: B
79 TYPE(diag_misc_teb_t), INTENT(INOUT) :: DMT
80 !
81  CHARACTER(LEN=*), INTENT(IN) :: HIMPLICIT_WIND ! wind implicitation option
82 ! ! 'OLD' = direct
83 ! ! 'NEW' = Taylor serie, order 1
84 REAL, DIMENSION(:), INTENT(IN) :: PT_CANYON ! canyon air temperature
85 
86 REAL, DIMENSION(:), INTENT(IN) :: PPEW_A_COEF ! implicit coefficients
87 REAL, DIMENSION(:), INTENT(IN) :: PPEW_B_COEF ! for wind coupling
88 REAL, DIMENSION(:), INTENT(IN) :: PEXNS ! surface exner function
89 
90 REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density
91  ! at the lowest level
92 REAL, DIMENSION(:), INTENT(IN) :: PVMOD ! module of the horizontal wind
93 REAL, DIMENSION(:), INTENT(IN) :: PH_TRAFFIC ! anthropogenic sensible
94 ! ! heat fluxes due to traffic
95 REAL, DIMENSION(:), INTENT(IN) :: PLE_TRAFFIC ! anthropogenic latent
96 ! ! heat fluxes due to traffic
97 REAL, DIMENSION(:), INTENT(IN) :: PAC_WL ! surface conductance
98 ! ! for heat transfer
99 ! ! between wall and canyon
100 REAL, DIMENSION(:), INTENT(IN) :: PCD ! drag coefficient
101 REAL, DIMENSION(:), INTENT(IN) :: PDF_RF ! snow-free roof fraction
102 REAL, DIMENSION(:), INTENT(IN) :: PDN_RF ! snow-covered roof fraction
103 REAL, DIMENSION(:), INTENT(IN) :: PDF_RD ! snow-free road fraction
104 REAL, DIMENSION(:), INTENT(IN) :: PDN_RD ! snow-covered road fraction
105 !
106 REAL, DIMENSION(:), INTENT(IN) :: PRNSN_RF ! net radiation over snow
107 REAL, DIMENSION(:), INTENT(IN) :: PHSN_RF ! sensible heat flux over snow
108 REAL, DIMENSION(:), INTENT(IN) :: PLESN_RF ! latent heat flux over snow
109 REAL, DIMENSION(:), INTENT(IN) :: PGSN_RF ! flux under the snow
110 REAL, DIMENSION(:), INTENT(IN) :: PRNSN_RD ! net radiation over snow
111 REAL, DIMENSION(:), INTENT(IN) :: PHSN_RD ! sensible heat flux over snow
112 REAL, DIMENSION(:), INTENT(IN) :: PLESN_RD ! latent heat flux over snow
113 REAL, DIMENSION(:), INTENT(IN) :: PGSN_RD ! flux under the snow
114 !
115 REAL, DIMENSION(:), INTENT(IN) :: PMELT_RF ! snow melting on roof
116 REAL, DIMENSION(:), INTENT(IN) :: PDQS_RF ! storage inside roofs
117 REAL, DIMENSION(:), INTENT(IN) :: PMELT_RD ! snow melting on road
118 REAL, DIMENSION(:), INTENT(IN) :: PDQS_RD ! storage inside roads
119 REAL, DIMENSION(:), INTENT(IN) :: PDQS_WL_A ! storage inside walls
120 REAL, DIMENSION(:), INTENT(IN) :: PDQS_WL_B ! storage inside walls
121 REAL, DIMENSION(:), INTENT(IN) :: PFLX_BLD_RF! heat flx from bld to roof
122 REAL, DIMENSION(:), INTENT(IN) :: PFLX_BLD_WL_A! heat flx from bld to wall A
123 REAL, DIMENSION(:), INTENT(IN) :: PFLX_BLD_WL_B! heat flx from bld to wall B
124 REAL, DIMENSION(:), INTENT(IN) :: PFLX_BLD_FL! heat flx from bld to floor
125 REAL, DIMENSION(:), INTENT(IN) :: PFLX_BLD_MA! heat flx from bld to mass
126 REAL, DIMENSION(:), INTENT(IN) :: PE_SHADING ! energy not ref., nor absorbed, nor
127  !trans. by glazing [W
128  !m-2(win)]
129 !
130 REAL, DIMENSION(:), INTENT(IN) :: PLEW_RF ! latent heat flux over snow-free roof
131 REAL, DIMENSION(:), INTENT(IN) :: PLEW_RD ! latent heat flux of snow-free road
132 REAL, DIMENSION(:), INTENT(IN) :: PRN_GR ! net radiation over greenroof
133 REAL, DIMENSION(:), INTENT(IN) :: PH_GR ! sensible heat flux over greenroof
134 REAL, DIMENSION(:), INTENT(IN) :: PLE_GR ! latent heat flux over greenroof
135 REAL, DIMENSION(:), INTENT(IN) :: PGFLUX_GR ! flux through the greenroof
136 !
137 REAL, DIMENSION(:), INTENT(OUT) :: PLE_WL_A ! latent heat flux over wall
138 REAL, DIMENSION(:), INTENT(OUT) :: PLE_WL_B ! latent heat flux over wall
139 !
140 REAL, DIMENSION(:), INTENT(OUT) :: PMELT_BLT ! snow melting for town
141 !
142 REAL, DIMENSION(:), INTENT(OUT) :: PUSTAR_TWN ! friction velocity over town
143 !
144 !* 0.2 declarations of local variables
145 !
146 REAL, DIMENSION(SIZE(PRHOA)) :: ZH_RF_SNFREE
147 REAL, DIMENSION(SIZE(PRHOA)) :: ZRN_RF_SNFREE
148 REAL, DIMENSION(SIZE(PRHOA)) :: ZUSTAR2 ! square of friction velocity (m2/s2)
149 REAL, DIMENSION(SIZE(PRHOA)) :: ZVMOD ! Wind
150 REAL, DIMENSIOn(SIZE(PRHOA)) :: ZINTER
151 !
152 REAL(KIND=JPRB) :: ZHOOK_HANDLE
153 !
154 !-------------------------------------------------------------------------------
155 IF (lhook) CALL dr_hook('URBAN_FLUXES',0,zhook_handle)
156 !
157 !* 1. Fluxes at snow-free roofs
158 ! -------------------------
159 !
160 ! net radiation
161 !
162 !
163 zrn_rf_snfree(:) = dmt%XABS_SW_ROOF(:) + dmt%XABS_LW_ROOF(:)
164 !
165 ! sensible heat flux
166 !
167 zh_rf_snfree(:) = dmt%XH_ROOF(:)
168 !
169 !-------------------------------------------------------------------------------
170 !
171 !* 2. Fluxes at snow-free roads
172 ! -------------------------
173 !
174 ! net radiation
175 !
176 dmt%XRN_ROAD(:) = dmt%XABS_SW_ROAD(:) + dmt%XABS_LW_ROAD(:)
177 !
178 !-------------------------------------------------------------------------------
179 !
180 !* 3. Fluxes at walls
181 ! ---------------
182 !
183 ! net radiation
184 !
185 dmt%XRN_WALL_A(:) = dmt%XABS_SW_WALL_A(:) + dmt%XABS_LW_WALL_A(:)
186 dmt%XRN_WALL_B(:) = dmt%XABS_SW_WALL_B(:) + dmt%XABS_LW_WALL_B(:)
187 !
188 IF (top%CBEM=="BEM") THEN
189  zinter(:) = dmt%XABS_SW_WIN (:) + dmt%XABS_LW_WIN (:)
190  dmt%XRN_WALL_A(:) = dmt%XRN_WALL_A(:) * (1.-b%XGR(:)) + zinter(:) * b%XGR(:)
191  dmt%XRN_WALL_B(:) = dmt%XRN_WALL_B(:) * (1.-b%XGR(:)) + zinter(:) * b%XGR(:)
192 ENDIF
193 !
194 ! heat flux into the ground
195 !
196 dmt%XGFLUX_WALL_A(:) = dmt%XRN_WALL_A(:) - dmt%XH_WALL_A(:)
197 dmt%XGFLUX_WALL_B(:) = dmt%XRN_WALL_B(:) - dmt%XH_WALL_B(:)
198 !
199 ! sensible heat flux
200 !
201 !before -> PH_WL in [W.m-2(wall)]
202 zinter(:) = pac_wl(:)*xcpd*prhoa(:)/pexns(:) * (b%XT_WIN1(:)-pt_canyon(:)) + pe_shading(:)
203 !
204 dmt%XH_WALL_A(:) = (1. - b%XGR(:)) * dmt%XH_WALL_A(:) + b%XGR(:) * zinter(:)
205 dmt%XH_WALL_B(:) = (1. - b%XGR(:)) * dmt%XH_WALL_B(:) + b%XGR(:) * zinter(:)
206 !
207 IF (top%CBEM=="BEM") THEN
208  zinter(:) = b%XF_WASTE_CAN(:) * dmt%XH_WASTE(:) / t%XWALL_O_HOR(:)
209  dmt%XH_WALL_A(:) = dmt%XH_WALL_A(:) + zinter(:)
210  dmt%XH_WALL_B(:) = dmt%XH_WALL_B(:) + zinter(:)
211 ENDIF
212 !
213 IF (top%CBEM=="BEM") THEN
214  !after PH_WALL in [W.m-2(facade=wall + win)]
215  zinter(:) = b%XF_WASTE_CAN(:) * dmt%XLE_WASTE(:) / t%XWALL_O_HOR(:)
216 ELSE
217  zinter(:) = 0.
218 ENDIF
219 ple_wl_a(:) = zinter(:)
220 ple_wl_b(:) = zinter(:)
221 !
222 !-------------------------------------------------------------------------------
223 !
224 !* 4. Snow-free and snow-covered surfaces averaging
225 ! ---------------------------------------------
226 !
227 !* 4.1 Roads
228 ! -----
229 !
230 ! heat flux into the ground
231 !
232 dmt%XGFLUX_ROAD (:) = pdf_rd(:) * (dmt%XRN_ROAD(:) - dmt%XH_ROAD (:) - plew_rd(:) )&
233  + pdn_rd(:) * pgsn_rd(:)
234 !
235 ! net radiation
236 !
237 dmt%XRN_ROAD(:) = dmt%XRN_ROAD(:) * pdf_rd(:) + prnsn_rd(:) * pdn_rd(:)
238 !
239 ! sensible heat flux
240 ! total latent heat of evaporation from
241 ! the road (snow free + snow)
242 !
243 ! sensible heat flux
244 !
245 dmt%XH_ROAD (:) = dmt%XH_ROAD (:) * pdf_rd(:) + phsn_rd(:) * pdn_rd(:)
246 ! total latent heat of evaporation from the road (snow free + snow)
247 !
248 dmt%XLE_ROAD (:) = plew_rd(:) * pdf_rd(:) + plesn_rd(:) * pdn_rd(:)
249 !
250 !* 4.2 Roofs
251 ! -----
252 !
253 ! heat flux into the ground
254 !
255 dmt%XGFLUX_STRLROOF(:) = pdf_rf(:) * (zrn_rf_snfree(:) - zh_rf_snfree(:) - plew_rf(:)) + pdn_rf(:) * pgsn_rf(:)
256 dmt%XGFLUX_ROOF (:) = (1.-t%XGREENROOF(:)) * dmt%XGFLUX_STRLROOF(:) + t%XGREENROOF(:) * pgflux_gr(:)
257 !
258 !
259 ! net radiation
260 !
261 dmt%XRN_STRLROOF (:) = zrn_rf_snfree(:) * pdf_rf(:) + prnsn_rf(:) * pdn_rf(:)
262 dmt%XRN_ROOF (:) = (1.-t%XGREENROOF(:)) * dmt%XRN_STRLROOF(:) + t%XGREENROOF(:) * prn_gr(:)
263 !
264 ! sensible heat flux
265 ! total latent heat of evaporation from
266 ! the roof (snow free + snow)
267 !
268 ! sensible heat flux
269 !
270 dmt%XH_STRLROOF (:) = dmt%XH_ROOF(:) * pdf_rf(:) + phsn_rf(:) * pdn_rf(:)
271 dmt%XH_ROOF (:) = (1.-t%XGREENROOF(:)) * dmt%XH_STRLROOF(:) + t%XGREENROOF(:) * ph_gr(:)
272 !
273 !
274 ! total latent heat of evaporation from the roof (snow free + snow)
275 !
276 dmt%XLE_STRLROOF (:) = plew_rf(:) * pdf_rf(:) + plesn_rf(:) * pdn_rf(:)
277 dmt%XLE_ROOF (:) = (1.-t%XGREENROOF(:)) * dmt%XLE_STRLROOF(:) + t%XGREENROOF(:) * ple_gr(:)
278 !
279 IF (top%CBEM=="BEM") THEN
280  dmt%XH_ROOF (:) = dmt%XH_ROOF (:) + (1 - b%XF_WASTE_CAN(:)) * dmt%XH_WASTE (:)/t%XBLD(:)
281  dmt%XLE_ROOF(:) = dmt%XLE_ROOF(:) + (1 - b%XF_WASTE_CAN(:)) * dmt%XLE_WASTE(:)/t%XBLD(:)
282 ENDIF
283 
284 !-------------------------------------------------------------------------------
285 !
286 !* 5. Momentum fluxes
287 ! ---------------
288 !
289 pustar_twn(:) = xundef
290 !
291 IF (.NOT. top%LCANOPY) THEN
292  !
293  zustar2(:) = 0.0
294  zvmod(:) = pvmod(:)
295  !
296  IF(himplicit_wind=='OLD')THEN
297  ! old implicitation
298  zustar2(:) = (pcd(:)*pvmod(:)*ppew_b_coef(:))/ (1.0-prhoa(:)*pcd(:)*pvmod(:)*ppew_a_coef(:))
299  ELSE
300  ! new implicitation
301  zustar2(:) = (pcd(:)*pvmod(:)*(2.*ppew_b_coef(:)-pvmod(:)))/ &
302  (1.0-2.0*prhoa(:)*pcd(:)*pvmod(:)*ppew_a_coef(:))
303  !
304  zvmod(:) = prhoa(:)*ppew_a_coef(:)*zustar2(:) + ppew_b_coef(:)
305  zvmod(:) = max(zvmod(:),0.)
306  !
307  WHERE(ppew_a_coef(:)/= 0.)
308  zustar2(:) = max( ( zvmod(:) - ppew_b_coef(:) ) / (prhoa(:)*ppew_a_coef(:)), 0.)
309  ENDWHERE
310  !
311  ENDIF
312  !
313  pustar_twn(:) = sqrt(zustar2(:))
314  !
315 ENDIF
316 !
317 !-------------------------------------------------------------------------------
318 !
319 !* 6. Averaged fluxes
320 ! ---------------
321 !
322 !* 6.1 Built fraction
323 ! --------------
324 !
325 dmt%XRN_BLT (:) = ( t%XBLD(:) * dmt%XRN_ROOF(:) &
326  + t%XROAD(:) * dmt%XRN_ROAD(:) &
327  + 0.5*t%XWALL_O_HOR(:) * dmt%XRN_WALL_A(:) &
328  + 0.5*t%XWALL_O_HOR(:) * dmt%XRN_WALL_B(:)) &
329  / (t%XROAD(:) + t%XBLD(:))
330 !
331 dmt%XH_BLT (:) = ( t%XBLD(:) * dmt%XH_ROOF(:) &
332  + t%XROAD(:) * dmt%XH_ROAD(:) &
333  + 0.5*t%XWALL_O_HOR(:) * dmt%XH_WALL_A(:) &
334  + 0.5*t%XWALL_O_HOR(:) * dmt%XH_WALL_B(:)) &
335  / (t%XROAD(:) + t%XBLD(:))
336 !
337 dmt%XLE_BLT (:) = ( t%XBLD(:) * dmt%XLE_ROOF (:) &
338  + t%XROAD(:) * dmt%XLE_ROAD (:) &
339  + 0.5*t%XWALL_O_HOR(:) * ple_wl_a(:) &
340  + 0.5*t%XWALL_O_HOR(:) * ple_wl_b(:)) &
341  / (t%XROAD(:) + t%XBLD(:))
342 !
343 dmt%XGFLUX_BLT (:) = ( t%XBLD(:) * dmt%XGFLUX_ROOF (:) &
344  + t%XROAD(:) * dmt%XGFLUX_ROAD (:) &
345  + 0.5*t%XWALL_O_HOR(:) * dmt%XGFLUX_WALL_A (:) &
346  + 0.5*t%XWALL_O_HOR(:) * dmt%XGFLUX_WALL_B (:)) &
347  / (t%XROAD(:) + t%XBLD(:))
348 !
349 pmelt_blt(:) = ( t%XBLD(:) * pmelt_rf(:) * pdn_rf(:) &
350  + t%XROAD(:) * pmelt_rd(:) * pdn_rd(:)) &
351  / (t%XROAD(:) + t%XBLD(:))
352 !
353 dmt%XDQS_TOWN (:) = ( t%XBLD(:) * pdqs_rf(:) &
354  + t%XROAD(:) * pdqs_rd(:) &
355  + 0.5*t%XWALL_O_HOR(:) * pdqs_wl_a(:) &
356  + 0.5*t%XWALL_O_HOR(:) * pdqs_wl_b(:) ) &
357  / (t%XROAD(:) + t%XBLD(:))
358 !
359 IF (top%CBEM == "DEF") THEN
360  dmt%XQF_BLD(:) = ( zh_rf_snfree(:) + plew_rf(:) + &
361  pdqs_rf(:) - zrn_rf_snfree(:) ) * pdf_rf(:) &
362  + ( pdqs_rf(:) - pgsn_rf(:) ) * pdn_rf(:) &
363  + 0.5*t%XWALL_O_HOR(:)/t%XBLD(:) * ( dmt%XH_WALL_A(:) + ple_wl_a(:) + pdqs_wl_a(:) - dmt%XRN_WALL_A(:) ) &
364  + 0.5*t%XWALL_O_HOR(:)/t%XBLD(:) * ( dmt%XH_WALL_B(:) + ple_wl_b(:) + pdqs_wl_b(:) - dmt%XRN_WALL_B(:) )
365  dmt%XFLX_BLD(:)= xundef
366 ELSEIF (top%CBEM == "BEM") THEN
367  dmt%XQF_BLD(:) = dmt%XQIN(:)*b%XN_FLOOR(:) + dmt%XHVAC_COOL(:) + dmt%XHVAC_HEAT(:)
368  dmt%XFLX_BLD(:)= pflx_bld_rf(:) + 0.5*t%XWALL_O_HOR(:)/t%XBLD(:)*pflx_bld_wl_a(:) &
369  + 0.5*t%XWALL_O_HOR(:)/t%XBLD(:)*pflx_bld_wl_b(:) &
370  + pflx_bld_fl(:) + pflx_bld_ma(:)
371 ENDIF
372 !
373 dmt%XQF_TOWN(:)= t%XBLD(:)*dmt%XQF_BLD(:) + ph_traffic(:) + t%XH_INDUSTRY(:) + ple_traffic(:) + t%XLE_INDUSTRY(:)
374 !
375 !Flux from the building to its structure -> we need to add the component to the
376 !floor, the mass and the window
377 !
378 !
379 IF (lhook) CALL dr_hook('URBAN_FLUXES',1,zhook_handle)
380 !
381 END SUBROUTINE urban_fluxes
real, save xcpd
Definition: modd_csts.F90:63
subroutine urban_fluxes(TOP, T, B, DMT, HIMPLICIT_WIND, PT_CANYON, PPEW_A_COEF, PPEW_B_COEF, PEXNS, PRHOA, PVMOD, PH_TRAFFIC, PLE_TRAFFIC, PAC_WL, PCD, PDF_RF, PDN_RF, PDF_RD, PDN_RD, PRNSN_RF, PHSN_RF, PLESN_RF, PGSN_RF, PRNSN_RD, PHSN_RD, PLESN_RD, PGSN_RD, PMELT_RF, PDQS_RF, PMELT_RD, PDQS_RD, PDQS_WL_A, PDQS_WL_B, PFLX_BLD_RF, PFLX_BLD_WL_A, PFLX_BLD_WL_B, PFLX_BLD_FL, PFLX_BLD_MA, PE_SHADING, PLEW_RF, PRN_GR, PH_GR, PLE_GR, PGFLUX_GR, PLEW_RD, PLE_WL_A, PLE_WL_B, PMELT_BLT, PUSTAR_TWN)
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15