SURFEX v8.1
General documentation of Surfex
urban_drag.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_drag(TOP, T, B, HIMPLICIT_WIND, PTSTEP, PT_CANYON, PQ_CANYON, &
7  PU_CANYON, PT_LOWCAN, PQ_LOWCAN, PU_LOWCAN, PZ_LOWCAN, &
8  PTS_ROOF, PTS_ROAD, PTS_WALL, PTS_GARDEN, &
9  PDELT_SNOW_ROOF, PDELT_SNOW_ROAD, PEXNS, PEXNA, PTA, &
10  PQA, PPS, PRHOA,PZREF, PUREF, PVMOD, PWS_ROOF_MAX, &
11  PWS_ROAD_MAX, PPEW_A_COEF, PPEW_B_COEF, &
12  PPEW_A_COEF_LOWCAN, PPEW_B_COEF_LOWCAN, PQSAT_ROOF, &
13  PQSAT_ROAD, PDELT_ROOF, PDELT_ROAD, PCD, PCDN, PAC_ROOF, &
14  PAC_ROOF_WAT, PAC_WALL, PAC_ROAD, PAC_ROAD_WAT, PAC_TOP, &
15  PAC_GARDEN, PRI, PUW_ROAD, PUW_ROOF, PDUWDU_ROAD, &
16  PDUWDU_ROOF, PUSTAR_TOWN, PAC_WIN )
17 ! ##########################################################################
18 !
19 !!**** *URBAN_DRAG*
20 !!
21 !! PURPOSE
22 !! -------
23 !
24 ! Computes the surface drag over artificial surfaces as towns,
25 ! taking into account the canyon like geometry of urbanized areas.
26 !
27 !
28 !!** METHOD
29 !! ------
30 !
31 !
32 !
33 !
34 !! EXTERNAL
35 !! --------
36 !!
37 !!
38 !! IMPLICIT ARGUMENTS
39 !! ------------------
40 !!
41 !!
42 !! REFERENCE
43 !! ---------
44 !!
45 !!
46 !! AUTHOR
47 !! ------
48 !!
49 !! V. Masson * Meteo-France *
50 !!
51 !! MODIFICATIONS
52 !! -------------
53 !! Original 20/01/98
54 !! 01/00 (V. Masson) separation of skimming, wake and isolated flows
55 !! 09/00 (V. Masson) use of Z0 for roads
56 !! 12/02 (A. Lemonsu) convective speed w* in canyon
57 ! 04 (A. Lemonsu) z0h=z0m for resistance canyon-atmosphere
58 ! 03/08 (S. Leroyer) debug PU_CAN (1. * H/3)
59 ! 12/08 (S. Leroyer) option (TOP%CZ0H) for z0h applied on roof, road and town
60 !! 09/12 B. Decharme new wind implicitation
61 ! 11/11 (G. Pigeon) apply only urban_exch_coef when necessary if
62 ! canopy/no canopy
63 ! 09/12 (G. Pigeon) add new formulation for outdoor conv. coef for
64 ! wall/roof/window
65 !!
66 !-------------------------------------------------------------------------------
67 !
68 !* 0. DECLARATIONS
69 ! ------------
70 !
72 USE modd_teb_n, ONLY : teb_t
73 USE modd_bem_n, ONLY : bem_t
74 !
75 USE modd_surf_par, ONLY : xundef
76 USE modd_csts,ONLY : xlvtt, xpi, xcpd, xg, xkarman
77 !
78 !USE MODE_SBLS
79 USE mode_thermos
80 USE modi_urban_exch_coef
81 USE mode_conv_doe
82 !
83 USE yomhook ,ONLY : lhook, dr_hook
84 USE parkind1 ,ONLY : jprb
85 !
86 IMPLICIT NONE
87 !
88 !* 0.1 declarations of arguments
89 !
90 TYPE(teb_options_t), INTENT(INOUT) :: TOP
91 TYPE(teb_t), INTENT(INOUT) :: T
92 TYPE(bem_t), INTENT(INOUT) :: B
93 !
94  CHARACTER(LEN=*), INTENT(IN) :: HIMPLICIT_WIND ! wind implicitation option
95 ! ! 'OLD' = direct
96 ! ! 'NEW' = Taylor serie, order 1
97 !
98 REAL, INTENT(IN) :: PTSTEP ! time-step
99 REAL, DIMENSION(:), INTENT(IN) :: PT_CANYON ! canyon air temperature
100 REAL, DIMENSION(:), INTENT(IN) :: PQ_CANYON ! canyon air specific humidity.
101 REAL, DIMENSION(:), INTENT(IN) :: PU_CANYON ! hor. wind in canyon
102 REAL, DIMENSION(:), INTENT(IN) :: PU_LOWCAN ! wind near the road
103 REAL, DIMENSION(:), INTENT(IN) :: PT_LOWCAN ! temp. near the road
104 REAL, DIMENSION(:), INTENT(IN) :: PQ_LOWCAN ! hum. near the road
105 REAL, DIMENSION(:), INTENT(IN) :: PZ_LOWCAN ! height of atm. var. near the road
106 REAL, DIMENSION(:), INTENT(IN) :: PTS_ROOF ! surface temperature
107 REAL, DIMENSION(:), INTENT(IN) :: PTS_ROAD ! surface temperature
108 REAL, DIMENSION(:), INTENT(IN) :: PTS_WALL ! surface temperature
109 REAL, DIMENSION(:), INTENT(IN) :: PTS_GARDEN ! surface temperature
110 REAL, DIMENSION(:), INTENT(IN) :: PDELT_SNOW_ROOF! fraction of snow on roof
111 REAL, DIMENSION(:), INTENT(IN) :: PDELT_SNOW_ROAD! fraction of snow on road
112 REAL, DIMENSION(:), INTENT(IN) :: PEXNS ! surface exner function
113 REAL, DIMENSION(:), INTENT(IN) :: PTA ! temperature at the lowest level
114 REAL, DIMENSION(:), INTENT(IN) :: PQA ! specific humidity
115  ! at the lowest level
116 REAL, DIMENSION(:), INTENT(IN) :: PVMOD ! module of the horizontal wind
117 REAL, DIMENSION(:), INTENT(IN) :: PPS ! pressure at the surface
118 REAL, DIMENSION(:), INTENT(IN) :: PEXNA ! exner function
119  ! at the lowest level
120 REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density
121 REAL, DIMENSION(:), INTENT(IN) :: PZREF ! reference height of the first
122  ! atmospheric level (temperature)
123 REAL, DIMENSION(:), INTENT(IN) :: PUREF ! reference height of the first
124  ! atmospheric level (wind)
125 REAL, DIMENSION(:), INTENT(IN) :: PWS_ROOF_MAX ! maximum deepness of roof
126 REAL, DIMENSION(:), INTENT(IN) :: PWS_ROAD_MAX ! and water reservoirs (kg/m2)
127 REAL, DIMENSION(:), INTENT(IN) :: PPEW_A_COEF ! implicit coefficients (m2s/kg)
128 REAL, DIMENSION(:), INTENT(IN) :: PPEW_B_COEF ! for wind coupling (m/s)
129 REAL, DIMENSION(:), INTENT(IN) :: PPEW_A_COEF_LOWCAN ! implicit coefficients for wind coupling (m2s/kg)
130 REAL, DIMENSION(:), INTENT(IN) :: PPEW_B_COEF_LOWCAN ! between low canyon wind and road (m/s)
131 !
132 REAL, DIMENSION(:), INTENT(OUT) :: PQSAT_ROOF ! qsat(Ts)
133 REAL, DIMENSION(:), INTENT(OUT) :: PQSAT_ROAD ! qsat(Ts)
134 REAL, DIMENSION(:), INTENT(OUT) :: PDELT_ROOF ! water fraction on
135 REAL, DIMENSION(:), INTENT(OUT) :: PDELT_ROAD ! snow-free surfaces
136 REAL, DIMENSION(:), INTENT(OUT) :: PCD ! drag coefficient
137 REAL, DIMENSION(:), INTENT(OUT) :: PCDN ! neutral drag coefficient
138 REAL, DIMENSION(:), INTENT(OUT) :: PAC_ROOF ! aerodynamical conductance
139 REAL, DIMENSION(:), INTENT(OUT) :: PAC_ROOF_WAT ! aerodynamical conductance (for water)
140 REAL, DIMENSION(:), INTENT(OUT) :: PAC_WALL ! aerodynamical conductance
141 ! ! between canyon air and
142 ! ! walls
143 REAL, DIMENSION(:), INTENT(OUT) :: PAC_ROAD ! aerodynamical conductance
144 ! ! between canyon air and
145 ! ! roads
146 REAL, DIMENSION(:), INTENT(OUT) :: PAC_ROAD_WAT ! aerodynamical conductance
147 ! ! between canyon air and
148 ! ! road (for water)
149 REAL, DIMENSION(:), INTENT(OUT) :: PAC_TOP ! aerodynamical conductance
150 ! ! between canyon top and atm.
151 REAL, DIMENSION(:), INTENT(IN) :: PAC_GARDEN ! aerodynamical conductance
152 ! ! between canyon air and GARDEN areas
153 REAL, DIMENSION(:), INTENT(OUT) :: PRI ! Town Richardson number
154 !
155 REAL, DIMENSION(:), INTENT(OUT) :: PUW_ROAD ! Momentum flux for roads
156 REAL, DIMENSION(:), INTENT(OUT) :: PUW_ROOF ! Momentum flux for roofs
157 REAL, DIMENSION(:), INTENT(OUT) :: PDUWDU_ROAD !
158 REAL, DIMENSION(:), INTENT(OUT) :: PDUWDU_ROOF !
159 REAL, DIMENSION(:), INTENT(OUT) :: PUSTAR_TOWN ! Fraction velocity for town
160 !
161 REAL, DIMENSION(:), INTENT(OUT) :: PAC_WIN ! aerodynamical conductance for window
162 !
163 !* 0.2 declarations of local variables
164 !
165 !
166 REAL, DIMENSION(SIZE(PTA)) :: ZTS_TOWN ! town averaged temp.
167 REAL, DIMENSION(SIZE(PTA)) :: ZQ_TOWN ! town averaged hum.
168 REAL, DIMENSION(SIZE(PTA)) :: ZAVDELT_ROOF ! averaged water frac.
169 REAL, DIMENSION(SIZE(PTA)) :: ZQ_ROOF ! roof spec. hum.
170 REAL, DIMENSION(SIZE(PTA)) :: ZZ0_ROOF ! roof roughness length
171 REAL, DIMENSION(SIZE(PTA)) :: ZZ0_ROAD ! road roughness length
172 REAL, DIMENSION(SIZE(PTA)) :: ZW_CAN ! ver. wind in canyon
173 REAL, DIMENSION(SIZE(PTA)) :: ZRI ! Richardson number
174 REAL, DIMENSION(SIZE(PTA)) :: ZLE_MAX ! maximum latent heat flux available
175 REAL, DIMENSION(SIZE(PTA)) :: ZLE ! actual latent heat flux
176 REAL, DIMENSION(SIZE(PTA)) :: ZRA_ROOF ! aerodynamical resistance
177 REAL, DIMENSION(SIZE(PTA)) :: ZCH_ROOF ! drag coefficient for heat
178 REAL, DIMENSION(SIZE(PTA)) :: ZRA_TOP ! aerodynamical resistance
179 REAL, DIMENSION(SIZE(PTA)) :: ZCH_TOP ! drag coefficient for heat
180 REAL, DIMENSION(SIZE(PTA)) :: ZRA_ROAD ! aerodynamical resistance
181 REAL, DIMENSION(SIZE(PTA)) :: ZCH_ROAD ! drag coeifficient for heat
182 REAL, DIMENSION(SIZE(PTA)) :: ZCD_ROAD ! road surf. exchange coefficient
183 REAL, DIMENSION(SIZE(PTA)) :: ZAC ! town aerodynamical conductance (not used)
184 REAL, DIMENSION(SIZE(PTA)) :: ZRA ! town aerodynamical resistance (not used)
185 REAL, DIMENSION(SIZE(PTA)) :: ZCH ! town drag coefficient for heat (not used)
186 REAL, DIMENSION(SIZE(PTA)) :: ZCD ! any surf. exchange coefficient (not used)
187 REAL, DIMENSION(SIZE(PTA)) :: ZCDN ! any surf. neutral exch. coef. (not used)
188 !
189 REAL, DIMENSION(SIZE(PTA)) :: ZU_STAR, ZW_STAR !!
190 REAL, DIMENSION(SIZE(PTA)) :: ZQ0 !!
191 !
192 REAL, DIMENSION(SIZE(PTA)) :: ZUSTAR2 ! square of friction velocity (m2/s2
193 REAL, DIMENSION(SIZE(PTA)) :: ZVMOD ! module of the horizontal wind at t+1
194 !
195 ! for calculation of momentum fluxes
196 REAL, DIMENSION(SIZE(PTA)) :: ZLMO ! Monin-Obukhov length
197 REAL, DIMENSION(SIZE(PTA)) :: ZUSTAR_ROAD ! friction velocity for roads
198 REAL, DIMENSION(SIZE(PTA)) :: ZUSTAR_ROOF ! friction velocity for roofs
199 REAL, DIMENSION(SIZE(PTA)) :: ZUSTAR_TOWN !
200 !
201 REAL, DIMENSION(SIZE(PTA)) :: ZZ0_TOP ! roughness length for zac_top calculation
202 REAL, DIMENSION(SIZE(PTA)) :: ZCHTCN_WIN ! natural convective heat transfer coef. for window [W/(m2.K)]
203 REAL, DIMENSION(SIZE(PTA)) :: ZCHTCN_ROOF ! natural convective heat transfer coef. for roof [W/(m2.K)]
204 REAL, DIMENSION(SIZE(PTA)) :: ZCHTCS_ROOF ! forced convective heat transfer coef. for smooth roof [W/(m2.K)]
205 REAL, DIMENSION(SIZE(PTA)) :: ZCHTCN_WALL ! natural convective heat transfer coef. for wall [W/(m2.K)]
206 REAL, DIMENSION(SIZE(PTA)) :: ZCHTCS_WALL ! forced natural convective heat transfer coef. for smooth wall [W/(m2.K)]
207 !
208 INTEGER :: JLOOP, JJ !!
209 !
210 REAL :: ZZ0_O_Z0H = 200. ! z0/z0h ratio used in Mascart (1995) formulation.
211 ! ! It is set to the maximum value acceptable by
212 ! ! formulation. Observed values are often larger in cities.
213 REAL(KIND=JPRB) :: ZHOOK_HANDLE
214 !-------------------------------------------------------------------------------
215 !
216 !
217 IF (lhook) CALL dr_hook('URBAN_DRAG',0,zhook_handle)
218 !
219 zz0_roof(:) = 0.15 ! z0 for roofs
220 zz0_road(:) = min(0.05,0.1*pz_lowcan(:))! z0 for roads
221 !
222 zz0_top(:) = t%XZ0_TOWN(:)
223 !
224 pcd(:) = xundef
225 pcdn(:) = xundef
226 pac_top(:) = xundef
227 pri(:) = xundef
228 !
229 puw_road(:) = xundef
230 puw_roof(:) = xundef
231 pduwdu_road(:) = xundef
232 pduwdu_roof(:) = xundef
233 pustar_town(:) = xundef
234 !
235 !-------------------------------------------------------------------------------
236 !
237 !* 1. roof and road saturation specific humidity
238 ! ------------------------------------------
239 !
240 pqsat_roof(:) = qsat(pts_roof(:), pps(:))
241 !
242 pqsat_road(:) = qsat(pts_road(:), pps(:))
243 !
244 !-------------------------------------------------------------------------------
245 !
246 !* 2. fraction of water on roofs
247 ! --------------------------
248 !
249 pdelt_roof=1.
250 !
251 !* 2.1 general case
252 ! ------------
253 !
254 WHERE (pqsat_roof(:) >= pqa(:) )
255  pdelt_roof(:) = (t%XWS_ROOF(:)/pws_roof_max)**(2./3.)
256 END WHERE
257 !
258 !* 2.2 dew deposition on roofs (PDELT_ROOF=1)
259 ! -----------------------
260 !
261 !-------------------------------------------------------------------------------
262 !
263 !* 3. fraction of water on roads
264 ! --------------------------
265 !
266 pdelt_road=1.
267 !
268 !* 3.1 general case
269 ! ------------
270 !
271 WHERE (pqsat_road(:) >= pq_canyon(:) )
272  pdelt_road(:) = (t%XWS_ROAD(:)/pws_road_max)**(2./3.)
273 END WHERE
274 !
275 !* 3.2 dew deposition on roads (PDELT_ROAD=1)
276 ! -----------------------
277 !
278 !-------------------------------------------------------------------------------
279 !
280 !* 4. Drag coefficient for momentum between roof level and atmosphere
281 ! ---------------------------------------------------------------
282 !
283 !
284 DO jj=1,SIZE(pta)
285 !
286 !* 4.1 Averaged temperature at roof level
287 ! ----------------------------------
288 !
289  zts_town(jj) = t%XBLD(jj) * pts_roof(jj) + (1.-t%XBLD(jj)) * pt_canyon(jj)
290 !
291 !* 4.2 Averaged water fraction on roofs
292 ! -------------------------------
293 !
294  zavdelt_roof(jj) = pdelt_roof(jj) * pdelt_snow_roof(jj)
295 !
296 !* 4.3 Roof specific humidity
297 ! ----------------------
298 !
299  zq_roof(jj) = pqsat_roof(jj) * zavdelt_roof(jj)
300 !
301 !* 4.4 Averaged Saturation specific humidity
302 ! -------------------------------------
303 !
304  zq_town(jj) = t%XBLD(jj) * zq_roof(jj) + (1.-t%XBLD(jj)) * pq_canyon(jj)
305 !
306 ENDDO
307 !
308 !-------------------------------------------------------------------------------
309 !
310 !* 5. Momentum drag coefficient
311 ! -------------------------
312 !
313 IF (.NOT. top%LCANOPY) THEN
314  CALL urban_exch_coef(top%CZ0H, zz0_o_z0h, zts_town, zq_town, pexns, pexna, pta, pqa, &
315  pzref+ t%XBLD_HEIGHT/3., puref+t%XBLD_HEIGHT/3., pvmod, t%XZ0_TOWN, &
316  pri, pcd, pcdn, zac, zra, zch )
317 ENDIF
318 !
319 !-------------------------------------------------------------------------------
320 !
321 !* 6. Drag coefficient for heat fluxes between roofs and atmosphere
322 ! -------------------------------------------------------------
323 !
324 IF (top%CCH_BEM == "DOE-2") THEN
325  zchtcn_roof = chtc_up_doe(pts_roof, pta)
326  zchtcs_roof = chtc_smooth_wind_doe(zchtcn_roof, pvmod)
327  pac_roof = chtc_rough_doe(zchtcn_roof, zchtcs_roof, t%XROUGH_ROOF) / prhoa / xcpd
328 ELSE
329  CALL urban_exch_coef(top%CZ0H, zz0_o_z0h, pts_roof, zq_roof, pexns, pexna, pta, pqa, &
330  pzref, puref, pvmod, zz0_roof, zri, zcd, zcdn, pac_roof, &
331  zra_roof, zch_roof )
332 ENDIF
333 !
334 !
335 DO jj=1,SIZE(pta)
336  zle_max(jj) = t%XWS_ROOF(jj) / ptstep * xlvtt
337  zle(jj) =(pqsat_roof(jj) - pqa(jj)) &
338  * pac_roof(jj) * pdelt_roof(jj) * xlvtt * prhoa(jj)
339 !
340  pac_roof_wat(jj) = pac_roof(jj)
341 !
342  IF (pdelt_roof(jj)==0.) pac_roof_wat(jj)=0.
343 !
344  IF (zle(jj)>0.) pac_roof_wat(jj) = pac_roof(jj) * min( 1. , zle_max(jj)/zle(jj) )
345 !
346 ENDDO
347 !-------------------------------------------------------------------------------
348 !
349 !* 7. Drag coefficient for heat fluxes between canyon and atmosphere
350 ! --------------------------------------------------------------
351 !
352 !* Because air/air exchanges are considered, roughness length for heat is set
353 ! equal to roughness length for momentum.
354 !
355 IF (.NOT. top%LCANOPY) THEN
356  CALL urban_exch_coef('MASC95', 1., pt_canyon, pq_canyon, pexns, pexna, pta, pqa, &
357  pzref+t%XBLD_HEIGHT-pz_lowcan, puref+t%XBLD_HEIGHT-pz_lowcan, &
358  pvmod, zz0_top, zri, zcd, zcdn, pac_top, zra_top, zch_top )
359 ENDIF
360 !
361 !-------------------------------------------------------------------------------
362 !
363 !* 8. Drag coefficient for heat fluxes between walls, road and canyon
364 ! ---------------------------------------------------------------
365 !
366 !* 8.1 aerodynamical conductance for walls
367 ! -----------------------------------
368 !
369 IF (top%CCH_BEM == "DOE-2") THEN
370  DO jj=1,SIZE(pta)
371  zchtcn_wall(jj) = chtc_vert_doe(pts_wall(jj), pt_canyon(jj))
372  zchtcs_wall(jj) = 0.5 * (chtc_smooth_lee_doe(zchtcn_wall(jj), pu_canyon(jj)) + &
373  chtc_smooth_wind_doe(zchtcn_wall(jj), pu_canyon(jj)) )
374 
375  pac_wall(jj) = chtc_rough_doe(zchtcn_wall(jj), zchtcs_wall(jj), t%XROUGH_WALL(jj)) / xcpd / prhoa(jj)
376  END DO
377 ELSE
378  pac_wall(:) = ( 11.8 + 4.2 * pu_canyon(:) ) / xcpd / prhoa(:)
379 END IF
380 !
381 !* 8.2 aerodynamical conductance for roads
382 ! -----------------------------------
383 !
384 zw_star(:) = 0.
385 zq0(:) = 0.
386 !
387 !
388 DO jloop=1,3
389  !
390  zw_can(:) = zw_star(:)
391  !
392  !
393  CALL urban_exch_coef(top%CZ0H, zz0_o_z0h, pts_road, pq_lowcan, pexns, pexna, &
394  pt_lowcan, pq_lowcan, pz_lowcan, pz_lowcan, &
395  pu_lowcan+zw_can, zz0_road, zri, zcd_road, zcdn, &
396  pac_road, zra_road, zch_road )
397  !
398  DO jj=1,SIZE(pta)
399 
400  zq0(jj) = (pts_wall(jj) - pt_canyon(jj)) * pac_wall(jj) * t%XWALL_O_GRND(jj)
401 
402  IF (t%XROAD(jj) .GT. 0.) THEN
403  zq0(jj) = zq0(jj) &
404  + (pts_road(jj) - pt_lowcan(jj)) * pac_road(jj) * t%XROAD (jj)/(t%XROAD(jj)+t%XGARDEN(jj))
405  ENDIF
406  IF (t%XGARDEN(jj) .GT. 0.) THEN
407  zq0(jj) = zq0(jj) &
408  + (pts_garden(jj) - pt_lowcan(jj)) * pac_garden(jj) * t%XGARDEN(jj)/(t%XROAD(jj)+t%XGARDEN(jj))
409  ENDIF
410  !
411  IF (zq0(jj) >= 0.) THEN
412  zw_star(jj) = ( (xg * pexna(jj) / pta(jj)) * zq0(jj) * t%XBLD_HEIGHT(jj)) ** (1/3.)
413  ELSE
414  zw_star(jj) = 0.
415  ENDIF
416 !
417  ENDDO
418 !
419 END DO
420 !
421 !
422 !* 8.4 aerodynamical conductance for water limited by available water
423 ! --------------------------------------------------------------
424 !
425 DO jj=1,SIZE(pta)
426  !
427  zle_max(jj) = t%XWS_ROAD(jj) / ptstep * xlvtt
428  zle(jj) = ( pqsat_road(jj) - pq_lowcan(jj) ) &
429  * pac_road(jj) * pdelt_road(jj) * xlvtt * prhoa(jj)
430  !
431  pac_road_wat(jj) = pac_road(jj)
432  !
433  IF (pdelt_road(jj)==0.) pac_road_wat(jj) = 0.
434  !
435  IF (zle(jj)>0.) pac_road_wat(jj) = pac_road(jj) * min( 1. , zle_max(jj)/zle(jj) )
436  !
437  !
438  !* 8.5 aerodynamical conductance for window
439  ! ------------------------------------
440  !
441  zchtcn_win(jj) = chtc_vert_doe(b%XT_WIN1(jj), pt_canyon(jj))
442  !
443  pac_win(jj) = 0.5 * (chtc_smooth_lee_doe(zchtcn_win(jj), pu_canyon(jj)) + &
444  chtc_smooth_wind_doe(zchtcn_win(jj), pu_canyon(jj)) ) &
445  / prhoa(jj) / xcpd
446  !
447  !-------------------------------------------------------------------------------
448  !
449  !* 9. Momentum fluxes
450  ! ---------------
451  !
452  !* 9.1 For roads
453  ! ---------
454  !
455  !* road friction
456  !
457  IF (top%LCANOPY) THEN
458  !
459  zustar2(jj)=xundef
460  !
461  IF(himplicit_wind=='OLD')THEN
462  ! old implicitation
463  zustar2(jj) = (zcd_road(jj)*pu_lowcan(jj)*ppew_b_coef_lowcan(jj))/ &
464  (1.0-prhoa(jj)*zcd_road(jj)*pu_lowcan(jj)*ppew_a_coef_lowcan(jj))
465  ELSE
466  ! new implicitation
467  zustar2(jj) = (zcd_road(jj)*pu_lowcan(jj)*(2.*ppew_b_coef_lowcan(jj)-pu_lowcan(jj)))/ &
468  (1.0-2.0*prhoa(jj)*zcd_road(jj)*pu_lowcan(jj)*ppew_a_coef_lowcan(jj))
469  !
470  zvmod(jj) = prhoa(jj)*ppew_a_coef_lowcan(jj)*zustar2(jj) + ppew_b_coef_lowcan(jj)
471  zvmod(jj) = max(zvmod(jj),0.)
472  !
473  IF(ppew_a_coef_lowcan(jj)/= 0.)THEN
474  zustar2(jj) = max( ( zvmod(jj) - ppew_b_coef_lowcan(jj) ) / (prhoa(jj)*ppew_a_coef_lowcan(jj)), 0.)
475  ENDIF
476  !
477  ENDIF
478  !
479  puw_road(jj) = - zustar2(jj)
480  !
481  pduwdu_road(jj) = 0. ! implicitation already taken into account in PUW_ROAD
482  !
483  !* 9.2 For roofs
484  ! ---------
485  !
486  !* roof friction
487  !* neutral case, as guess
488  !
489  !
490  zustar_roof(jj) = pvmod(jj) * xkarman / log(pzref(jj)/zz0_roof(jj))
491  !
492  puw_roof(jj) = - zustar_roof(jj)**2
493  pduwdu_roof(jj) = 0.
494  IF (pvmod(jj)/=0.) pduwdu_roof(jj) = 2. * puw_roof(jj) / pvmod(jj)
495  !
496  ELSE
497  !
498  !* 9.3 For town
499  ! --------
500  !
501  zustar2(jj)=xundef
502  !
503  IF(himplicit_wind=='OLD')THEN
504  ! old implicitation
505  zustar2(jj) = (pcd(jj)*pvmod(jj)*ppew_b_coef(jj))/ &
506  (1.0-prhoa(jj)*pcd(jj)*pvmod(jj)*ppew_a_coef(jj))
507  ELSE
508  ! new implicitation
509  zustar2(jj) = (pcd(jj)*pvmod(jj)*(2.*ppew_b_coef(jj)-pvmod(jj)))/ &
510  (1.0-2.0*prhoa(jj)*pcd(jj)*pvmod(jj)*ppew_a_coef(jj))
511  !
512  zvmod(jj) = prhoa(jj)*ppew_a_coef(jj)*zustar2(jj) + ppew_b_coef(jj)
513  zvmod(jj) = max(zvmod(jj),0.)
514  !
515  IF(ppew_a_coef(jj)/= 0.)THEN
516  zustar2(jj) = max( ( zvmod(jj) - ppew_b_coef(jj) ) / (prhoa(jj)*ppew_a_coef(jj)), 0.)
517  ENDIF
518  !
519  ENDIF
520  !
521  pustar_town(jj) = sqrt(zustar2(jj))
522  !
523  ENDIF
524  !
525 ENDDO
526 !
527 IF (lhook) CALL dr_hook('URBAN_DRAG',1,zhook_handle)
528 !-------------------------------------------------------------------------------
529 !
530 END SUBROUTINE urban_drag
real, save xcpd
Definition: modd_csts.F90:63
subroutine urban_drag(TOP, T, B, HIMPLICIT_WIND, PTSTEP, PT_CANYON, PQ_CANYON, PU_CANYON, PT_LOWCAN, PQ_LOWCAN, PU_LOWCAN, PZ_LOWCAN, PTS_ROOF, PTS_ROAD, PTS_WALL, PTS_GARDEN, PDELT_SNOW_ROOF, PDELT_SNOW_ROAD, PEXNS, PEXNA, PTA, PQA, PPS, PRHOA, PZREF, PUREF, PVMOD, PWS_ROOF_MAX, PWS_ROAD_MAX, PPEW_A_COEF, PPEW_B_COEF, PPEW_A_COEF_LOWCAN, PPEW_B_COEF_LOWCAN, PQSAT_ROOF, PQSAT_ROAD, PDELT_ROOF, PDELT_ROAD, PCD, PCDN, PAC_ROOF, PAC_ROOF_WAT, PAC_WALL, PAC_ROAD, PAC_ROAD_WAT, PAC_TOP, PAC_GARDEN, PRI, PUW_ROAD, PUW_ROOF, PDUWDU_ROAD, PDUWDU_ROOF, PUSTAR_TOWN, PAC_WIN)
Definition: urban_drag.F90:17
real, save xlvtt
Definition: modd_csts.F90:70
real, save xpi
Definition: modd_csts.F90:43
real, save xkarman
Definition: modd_csts.F90:48
real, parameter xundef
real, save xg
Definition: modd_csts.F90:55
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine urban_exch_coef(HZ0H, PZ0_O_Z0H, PTG, PQS, PEXNS, PEXNA, PTA, PQA, PZREF, PUREF, PVMOD, PZ0, PRI, PCD, PCDN, PAC, PRA, PCH)