SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
urban_snow_evol.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_snow_evol( &
7  pt_lowcan, pq_lowcan, pu_lowcan, &
8  pts_roof,pts_road,pts_wall_a, pts_wall_b, &
9  pt_roof, pd_roof, ptc_roof, phc_roof, &
10  hsnow_roof, &
11  pwsnow_roof, ptsnow_roof, prsnow_roof, pasnow_roof, &
12  ptssnow_roof, pesnow_roof, &
13  hsnow_road, &
14  pwsnow_road, ptsnow_road, prsnow_road, pasnow_road, &
15  ptssnow_road, pesnow_road, &
16  pps, pta, pqa, prhoa, &
17  plw_rad, &
18  psr, pzref, puref, pvmod, &
19  ptstep, &
20  pz_lowcan, &
21  pdn_roof, pabs_sw_snow_roof, pabs_lw_snow_roof, &
22  pdn_road, pabs_sw_snow_road, pabs_lw_snow_road, &
23  prnsnow_roof, phsnow_roof, plesnow_roof, pgsnow_roof, &
24  pmelt_roof, &
25  prnsnow_road, phsnow_road, plesnow_road, pgsnow_road, &
26  pmelt_road, &
27  plw_wa_to_nr , plw_wb_to_nr, plw_s_to_nr, plw_win_to_nr, &
28  pdqs_snow_roof, pdqs_snow_road, pt_win1 )
29 ! ##########################################################################
30 !
31 !!**** *URBAN_SNOW_EVOL*
32 !!
33 !! PURPOSE
34 !! -------
35 !
36 !
37 !!** METHOD
38 ! ------
39 !
40 !
41 !
42 !! EXTERNAL
43 !! --------
44 !!
45 !!
46 !! IMPLICIT ARGUMENTS
47 !! ------------------
48 !!
49 !! MODD_CST
50 !!
51 !!
52 !! REFERENCE
53 !! ---------
54 !!
55 !!
56 !! AUTHOR
57 !! ------
58 !!
59 !! V. Masson * Meteo-France *
60 !!
61 !! MODIFICATIONS
62 !! -------------
63 !! Original 23/01/98
64 !-------------------------------------------------------------------------------
65 !
66 !* 0. DECLARATIONS
67 ! ------------
68 !
69 USE modd_snow_par, ONLY : xz0sn, xz0hsn, &
70  xansmin_roof, xansmax_roof, xans_todry_roof, &
71  xans_t_roof, xrhosmin_roof, xrhosmax_roof, &
72  xwcrn_roof, &
73  xansmin_road, xansmax_road, xans_todry_road, &
74  xans_t_road, xrhosmin_road, xrhosmax_road, &
75  xwcrn_road
76 USE modd_csts, ONLY : xstefan
77 !
79 !
80 USE modi_roof_impl_coef
81 USE modi_snow_cover_1layer
82 !
83 USE modd_surf_par, ONLY : xundef
84 !
85 USE yomhook ,ONLY : lhook, dr_hook
86 USE parkind1 ,ONLY : jprb
87 !
88 IMPLICIT NONE
89 !
90 !* 0.1 declarations of arguments
91 !
92 !
93 REAL, DIMENSION(:), INTENT(IN) :: pt_lowcan ! LOWCAN air temperature
94 REAL, DIMENSION(:), INTENT(IN) :: pq_lowcan ! LOWCAN air specific humidity
95 REAL, DIMENSION(:), INTENT(IN) :: pu_lowcan ! LOWCAN hor. wind
96 REAL, DIMENSION(:), INTENT(IN) :: pts_roof ! roof surface temperature
97 REAL, DIMENSION(:), INTENT(IN) :: pts_road ! road surface temperature
98 REAL, DIMENSION(:), INTENT(IN) :: pts_wall_a ! wall surface temperature
99 REAL, DIMENSION(:), INTENT(IN) :: pts_wall_b ! wall surface temperature
100 REAL, DIMENSION(:,:), INTENT(IN) :: pt_roof ! roof temperature profile
101 REAL, DIMENSION(:,:), INTENT(IN) :: pd_roof ! roof layer thickness
102 REAL, DIMENSION(:,:), INTENT(IN) :: ptc_roof ! roof layer thermal conductivity
103 REAL, DIMENSION(:,:), INTENT(IN) :: phc_roof ! roof layer heat capacity
104  CHARACTER(LEN=*), INTENT(IN) :: hsnow_roof ! snow roof scheme
105 ! ! 'NONE'
106 ! ! 'D95 '
107 ! ! '1-L '
108  CHARACTER(LEN=*), INTENT(IN) :: hsnow_road ! snow road scheme
109 ! ! 'NONE'
110 ! ! 'D95 '
111 ! ! '1-L '
112 REAL, DIMENSION(:,:), INTENT(INOUT) :: pwsnow_roof ! snow layers reservoir
113 REAL, DIMENSION(:,:), INTENT(INOUT) :: ptsnow_roof ! snow layers temperature
114 REAL, DIMENSION(:,:), INTENT(INOUT) :: prsnow_roof ! snow layers density
115 REAL, DIMENSION(:), INTENT(INOUT) :: pasnow_roof ! snow albedo
116 REAL, DIMENSION(:), INTENT(INOUT) :: pesnow_roof ! snow emissivity
117 REAL, DIMENSION(:), INTENT(INOUT) :: ptssnow_roof! snow surface temperature
118 REAL, DIMENSION(:,:), INTENT(INOUT) :: pwsnow_road ! snow layers reservoir
119 REAL, DIMENSION(:,:), INTENT(INOUT) :: ptsnow_road ! snow layers temperature
120 REAL, DIMENSION(:,:), INTENT(INOUT) :: prsnow_road ! snow layers density
121 REAL, DIMENSION(:), INTENT(INOUT) :: pasnow_road ! snow albedo
122 REAL, DIMENSION(:), INTENT(INOUT) :: pesnow_road ! snow emissivity
123 REAL, DIMENSION(:), INTENT(INOUT) :: ptssnow_road! snow surface temperature
124 
125 REAL, DIMENSION(:), INTENT(IN) :: pps ! pressure at the surface
126 REAL, DIMENSION(:), INTENT(IN) :: pta ! temperature at the lowest level
127 REAL, DIMENSION(:), INTENT(IN) :: pqa ! specific humidity
128  ! at the lowest level
129 REAL, DIMENSION(:), INTENT(IN) :: pvmod ! module of the horizontal wind
130 REAL, DIMENSION(:), INTENT(IN) :: prhoa ! air density at the lowest level
131 REAL, DIMENSION(:), INTENT(IN) :: plw_rad ! atmospheric infrared radiation
132 REAL, DIMENSION(:), INTENT(IN) :: psr ! snow rate
133 REAL, DIMENSION(:), INTENT(IN) :: pzref ! reference height of the first
134  ! atmospheric level (temperature)
135 REAL, DIMENSION(:), INTENT(IN) :: puref ! reference height of the first
136  ! atmospheric level (wind)
137  ! at first atmospheric level
138 REAL, INTENT(IN) :: ptstep ! time step
139 REAL, DIMENSION(:), INTENT(IN) :: pz_lowcan ! height of forcing
140 !
141 REAL, DIMENSION(:), INTENT(IN) :: pdn_roof ! snow-covered roof frac.
142 REAL, DIMENSION(:), INTENT(IN) :: pabs_sw_snow_roof ! SW absorbed by roof snow
143 REAL, DIMENSION(:), INTENT(OUT) :: pabs_lw_snow_roof ! absorbed IR rad by snow on roof
144 REAL, DIMENSION(:), INTENT(INOUT) :: pdn_road ! snow-covered road frac.
145 REAL, DIMENSION(:), INTENT(IN) :: pabs_sw_snow_road ! SW absorbed by road snow
146 REAL, DIMENSION(:), INTENT(OUT) :: pabs_lw_snow_road ! absorbed IR rad by snow on road
147 !
148 REAL, DIMENSION(:), INTENT(OUT) :: prnsnow_roof ! net radiation over snow
149 REAL, DIMENSION(:), INTENT(OUT) :: phsnow_roof ! sensible heat flux over snow
150 REAL, DIMENSION(:), INTENT(OUT) :: plesnow_roof ! latent heat flux over snow
151 REAL, DIMENSION(:), INTENT(OUT) :: pgsnow_roof ! flux under the snow
152 REAL, DIMENSION(:), INTENT(OUT) :: pmelt_roof ! snow melt
153 REAL, DIMENSION(:), INTENT(OUT) :: prnsnow_road ! net radiation over snow
154 REAL, DIMENSION(:), INTENT(OUT) :: phsnow_road ! sensible heat flux over snow
155 REAL, DIMENSION(:), INTENT(OUT) :: plesnow_road ! latent heat flux over snow
156 REAL, DIMENSION(:), INTENT(OUT) :: pgsnow_road ! flux under the snow
157 REAL, DIMENSION(:), INTENT(OUT) :: pmelt_road ! snow melt
158 !
159 REAL, DIMENSION(:), INTENT(IN) :: plw_wa_to_nr ! LW contrib. wall -> road(snow)
160 REAL, DIMENSION(:), INTENT(IN) :: plw_wb_to_nr ! LW contrib. wall -> road(snow)
161 REAL, DIMENSION(:), INTENT(IN) :: plw_s_to_nr ! LW contrib. sky -> road(snow)
162 REAL, DIMENSION(:), INTENT(IN) :: plw_win_to_nr ! LW contrib. win -> road(snow)
163 REAL, DIMENSION(:), INTENT(OUT) :: pdqs_snow_roof ! Heat storage in snowpack on roofs
164 REAL, DIMENSION(:), INTENT(OUT) :: pdqs_snow_road ! Heat storage in snowpack on roads
165 REAL, DIMENSION(:), INTENT(IN) :: pt_win1 ! Window surface temperature
166 !
167 !* 0.2 declarations of local variables
168 !
169 !
170 REAL, DIMENSION(SIZE(PTA)) :: zlw1_road ! independant from
171 REAL, DIMENSION(SIZE(PTA)) :: zlw1_roof ! surface temperature
172 !
173 REAL, DIMENSION(SIZE(PTA)) :: zlw2_road ! to be multiplied by
174 REAL, DIMENSION(SIZE(PTA)) :: zlw2_roof ! 4th power of
175 ! ! surface temperature
176 
177 REAL, DIMENSION(SIZE(PTA)) :: zsr_roof ! snow fall on roof snow (kg/s/m2 of snow)
178 REAL, DIMENSION(SIZE(PTA)) :: zsr_road ! snow fall on road snow (kg/s/m2 of snow)
179 !
180 REAL, DIMENSION(SIZE(PTA)) :: zt_sky ! sky temperature
181 REAL, DIMENSION(SIZE(PTA)) :: zts_coefa ! Coefficient A for implicit coupling
182 ! ! of snow with the underlying surface
183 REAL, DIMENSION(SIZE(PTA)) :: zts_coefb ! Coefficient B for implicit coupling
184 ! ! of snow with the underlying surface
185 !
186 ! flags to call to snow routines
187 !
188 LOGICAL :: gsnow_roof, gsnow_road
189 !
190 ! loop counters
191 !
192 INTEGER :: jl
193 REAL(KIND=JPRB) :: zhook_handle
194 !
195 !-------------------------------------------------------------------------------
196 !
197 IF (lhook) CALL dr_hook('URBAN_SNOW_EVOL',0,zhook_handle)
198 prnsnow_roof(:)=0.
199 phsnow_roof(:)=0.
200 plesnow_roof(:)=0.
201 pgsnow_roof(:)=0.
202 pmelt_roof(:)=0.
203 prnsnow_road(:)=0.
204 phsnow_road(:)=0.
205 plesnow_road(:)=0.
206 pgsnow_road(:)=0.
207 pmelt_road(:)=0.
208 pabs_lw_snow_roof(:)=0.
209 pabs_lw_snow_road(:)=0.
210 !
211 !-------------------------------------------------------------------------------
212 !
213 gsnow_roof = any( psr(:)>0. .OR. pwsnow_roof(:,1)>0. )
214 gsnow_road = any( psr(:)>0. .OR. pwsnow_road(:,1)>0. )
215 !
216 !-------------------------------------------------------------------------------
217 !
218 !* 5. Snow mantel model
219 ! -----------------
220 !
221 !* 5.1 roofs
222 ! -----
223 !
224 IF ( gsnow_roof ) THEN
225 !
226 !* initializes LW radiative coefficients
227 !
228  zlw1_roof(:) = pesnow_roof(:) * plw_rad(:)
229  zlw2_roof(:) = - pesnow_roof(:) * xstefan
230 !
231 !* The global amount of snow on roofs is supposed located on a
232 ! fraction of the roof surface. All computations are then
233 ! done only for each m2 of snow, and not for each m2 of roof.
234 !
235  DO jl=1,SIZE(pwsnow_roof,2)
236  WHERE (pdn_roof(:)>0.) pwsnow_roof(:,jl) = pwsnow_roof(:,jl) / pdn_roof(:)
237  END DO
238  zsr_roof=0.
239  WHERE (pdn_roof(:)>0.) zsr_roof(:) = psr(:) / pdn_roof(:)
240 !
241 !* Estimates implicit coupling between snow and roof
242 ! (strictly equal to an implicit formulation for 100% snow coverage)
243 !
244  CALL roof_impl_coef(ptstep, SIZE(pt_roof,2), pd_roof, ptc_roof, phc_roof, pt_roof, zts_coefa,zts_coefb)
245 !
246 !* call to snow mantel scheme
247 !
248  IF (hsnow_roof=='1-L') &
249  CALL snow_cover_1layer(ptstep, xansmin_roof, xansmax_roof, xans_todry_roof, &
250  xrhosmin_roof, xrhosmax_roof, xans_t_roof, .true., &
251  0., xwcrn_roof, &
252  xz0sn,xz0hsn, &
253  ptsnow_roof(:,1), pasnow_roof, &
254  prsnow_roof(:,1), pwsnow_roof(:,1), ptssnow_roof, &
255  pesnow_roof, &
256  pts_roof, zts_coefa, zts_coefb, pabs_sw_snow_roof, &
257  zlw1_roof, zlw2_roof, &
258  pta, pqa, pvmod, pps, prhoa, zsr_roof, pzref, puref, &
259  prnsnow_roof, phsnow_roof, plesnow_roof, pgsnow_roof,&
260  pmelt_roof, pdqs_snow_roof, pabs_lw_snow_roof )
261 !
262 
263 !
264 !* The global amount of snow on roofs is reported to total roof surface.
265 !
266  DO jl=1,SIZE(pwsnow_roof,2)
267  pwsnow_roof(:,jl) = pwsnow_roof(:,jl) * pdn_roof(:)
268  END DO
269 !
270 END IF
271 !
272 !* 5.2 roads
273 ! -----
274 !
275 IF ( gsnow_road ) THEN
276  !
277  zt_sky(:) = (plw_rad(:)/xstefan)**0.25
278 !
279  zlw1_road(:) = plw_s_to_nr(:) * (zt_sky(:) - ptssnow_road(:)) &
280  + plw_wa_to_nr(:) * (pts_wall_a(:) - ptssnow_road(:)) &
281  + plw_wb_to_nr(:) * (pts_wall_b(:) - ptssnow_road(:)) &
282  + plw_win_to_nr(:) * (pt_win1(:) - ptssnow_road(:))
283  zlw2_road(:) = 0.0
284  !
285  !* The global amount of snow on roads is supposed located on a
286  ! fraction of the road surface. All computations are then
287  ! done only for each m2 of snow, and not for each m2 of road.
288  !
289  DO jl=1,SIZE(pwsnow_road,2)
290  WHERE (pdn_road(:)>0.) pwsnow_road(:,jl) = pwsnow_road(:,jl) / pdn_road(:)
291  END DO
292  zsr_road=0.
293  WHERE (pdn_road(:)>0.) zsr_road(:) = psr(:) / pdn_road(:)
294  !
295  !* no implicit coupling necessary with road
296  !
297  zts_coefa = 0.
298  zts_coefb = pts_road
299  !
300  !* call to snow mantel scheme
301  !
302  IF (hsnow_road=='1-L') &
303  CALL snow_cover_1layer(ptstep, xansmin_road, xansmax_road, xans_todry_road, &
304  xrhosmin_road, xrhosmax_road, xans_t_road, .false., &
305  0., xwcrn_road, &
306  xz0sn,xz0hsn, &
307  ptsnow_road(:,1), pasnow_road, &
308  prsnow_road(:,1), pwsnow_road(:,1), ptssnow_road, &
309  pesnow_road, &
310  pts_road, zts_coefa, zts_coefb, &
311  pabs_sw_snow_road, zlw1_road, zlw2_road, &
312  pt_lowcan, pq_lowcan, pu_lowcan, pps, prhoa, &
313  zsr_road, pz_lowcan, pz_lowcan, &
314  prnsnow_road, phsnow_road, plesnow_road, pgsnow_road,&
315  pmelt_road, pdqs_snow_road ,pabs_lw_snow_road )
316 !
317 !* The global amount of snow on roads is reported to total road surface.
318 !
319  DO jl=1,SIZE(pwsnow_road,2)
320  pwsnow_road(:,jl) = pwsnow_road(:,jl) * pdn_road(:)
321  END DO
322 !
323  WHERE (ptsnow_road(:,1) .EQ. xundef) pdn_road(:) = 0.0
324 !
325 END IF
326 IF (lhook) CALL dr_hook('URBAN_SNOW_EVOL',1,zhook_handle)
327 !
328 !
329 !-------------------------------------------------------------------------------
330 !
331 END SUBROUTINE urban_snow_evol
subroutine urban_snow_evol(PT_LOWCAN, PQ_LOWCAN, PU_LOWCAN, PTS_ROOF, PTS_ROAD, PTS_WALL_A, PTS_WALL_B, PT_ROOF, PD_ROOF, PTC_ROOF, PHC_ROOF, HSNOW_ROOF, PWSNOW_ROOF, PTSNOW_ROOF, PRSNOW_ROOF, PASNOW_ROOF, PTSSNOW_ROOF, PESNOW_ROOF, HSNOW_ROAD, PWSNOW_ROAD, PTSNOW_ROAD, PRSNOW_ROAD, PASNOW_ROAD, PTSSNOW_ROAD, PESNOW_ROAD, PPS, PTA, PQA, PRHOA, PLW_RAD, PSR, PZREF, PUREF, PVMOD, PTSTEP, PZ_LOWCAN, PDN_ROOF, PABS_SW_SNOW_ROOF, PABS_LW_SNOW_ROOF, PDN_ROAD, PABS_SW_SNOW_ROAD, PABS_LW_SNOW_ROAD, PRNSNOW_ROOF, PHSNOW_ROOF, PLESNOW_ROOF, PGSNOW_ROOF, PMELT_ROOF, PRNSNOW_ROAD, PHSNOW_ROAD, PLESNOW_ROAD, PGSNOW_ROAD, PMELT_ROAD, PLW_WA_TO_NR, PLW_WB_TO_NR, PLW_S_TO_NR, PLW_WIN_TO_NR, PDQS_SNOW_ROOF, PDQS_SNOW_ROAD, PT_WIN1)
subroutine snow_cover_1layer(PTSTEP, PANSMIN, PANSMAX, PTODRY, PRHOSMIN, PRHOSMAX, PRHOFOLD, OALL_MELT, PDRAIN_TIME, PWCRN, PZ0SN, PZ0HSN, PTSNOW, PASNOW, PRSNOW, PWSNOW, PTS_SNOW, PESNOW, PTG, PTG_COEFA, PTG_COEFB, PABS_SW, PLW1, PLW2, PTA, PQA, PVMOD, PPS, PRHOA, PSR, PZREF, PUREF, PRNSNOW, PHSNOW, PLESNOW, PGSNOW, PMELT, PDQS_SNOW, PABS_LW)
subroutine roof_impl_coef(PTSTEP, KROOF_LAYER, PD_ROOF, PTC_ROOF, PHC_ROOF, PT_ROOF, PTDEEP_A, PTDEEP_B)