SURFEX v8.1
General documentation of Surfex
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(T, B, PT_LWCN, PQ_LWCN, PU_LWCN, PTS_RF, PTS_RD, PTS_WL_A, &
7  PTS_WL_B, PPS, PTA, PQA, PRHOA, PLW_RAD, PSR, PZREF, PUREF, &
8  PVMOD, PTSTEP, PZ_LWCN, PDN_RF, PABS_SW_SN_RF, PABS_LW_SN_RF,&
9  PDN_RD, PABS_SW_SN_RD, PABS_LW_SN_RD, PRNSN_RF, PHSN_RF, &
10  PLESN_RF, PGSN_RF, PMELT_RF, PRNSN_RD, PHSN_RD, PLESN_RD, &
11  PGSN_RD, PMELT_RD, PLW_WA_TO_NR , PLW_WB_TO_NR, PLW_S_TO_NR, &
12  PLW_WIN_TO_NR, PDQS_SN_RF, PDQS_SN_RD )
13 ! ##########################################################################
14 !
15 !!**** *URBAN_SNOW_EVOL*
16 !!
17 !! PURPOSE
18 !! -------
19 !
20 !
21 !!** METHOD
22 ! ------
23 !
24 !
25 !
26 !! EXTERNAL
27 !! --------
28 !!
29 !!
30 !! IMPLICIT ARGUMENTS
31 !! ------------------
32 !!
33 !! MODD_CST
34 !!
35 !!
36 !! REFERENCE
37 !! ---------
38 !!
39 !!
40 !! AUTHOR
41 !! ------
42 !!
43 !! V. Masson * Meteo-France *
44 !!
45 !! MODIFICATIONS
46 !! -------------
47 !! Original 23/01/98
48 !-------------------------------------------------------------------------------
49 !
50 !* 0. DECLARATIONS
51 ! ------------
52 !
53 USE modd_teb_n, ONLY : teb_t
54 USE modd_bem_n, ONLY : bem_t
55 !
56 USE modd_snow_par, ONLY : xz0sn, xz0hsn, &
57  xansmin_roof, xansmax_roof, xans_todry_roof, &
58  xans_t_roof, xrhosmin_roof, xrhosmax_roof, &
59  xwcrn_roof, &
60  xansmin_road, xansmax_road, xans_todry_road, &
61  xans_t_road, xrhosmin_road, xrhosmax_road, &
62  xwcrn_road
63 USE modd_csts, ONLY : xstefan
64 !
66 !
67 USE modi_roof_impl_coef
68 USE modi_snow_cover_1layer
69 !
70 USE modd_surf_par, ONLY : xundef
71 !
72 USE yomhook ,ONLY : lhook, dr_hook
73 USE parkind1 ,ONLY : jprb
74 !
75 IMPLICIT NONE
76 !
77 !* 0.1 declarations of arguments
78 !
79 TYPE(teb_t), INTENT(INOUT) :: T
80 TYPE(bem_t), INTENT(INOUT) :: B
81 !
82 REAL, DIMENSION(:), INTENT(IN) :: PT_LWCN ! LWCN air temperature
83 REAL, DIMENSION(:), INTENT(IN) :: PQ_LWCN ! LWCN air specific humidity
84 REAL, DIMENSION(:), INTENT(IN) :: PU_LWCN ! LWCN hor. wind
85 REAL, DIMENSION(:), INTENT(IN) :: PTS_RF ! roof surface temperature
86 REAL, DIMENSION(:), INTENT(IN) :: PTS_RD ! road surface temperature
87 REAL, DIMENSION(:), INTENT(IN) :: PTS_WL_A ! wall surface temperature
88 REAL, DIMENSION(:), INTENT(IN) :: PTS_WL_B ! wall surface temperature
89 !
90 REAL, DIMENSION(:), INTENT(IN) :: PPS ! pressure at the surface
91 REAL, DIMENSION(:), INTENT(IN) :: PTA ! temperature at the lowest level
92 REAL, DIMENSION(:), INTENT(IN) :: PQA ! specific humidity
93  ! at the lowest level
94 REAL, DIMENSION(:), INTENT(IN) :: PVMOD ! module of the horizontal wind
95 REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density at the lowest level
96 REAL, DIMENSION(:), INTENT(IN) :: PLW_RAD ! atmospheric infrared radiation
97 REAL, DIMENSION(:), INTENT(IN) :: PSR ! snow rate
98 REAL, DIMENSION(:), INTENT(IN) :: PZREF ! reference height of the first
99  ! atmospheric level (temperature)
100 REAL, DIMENSION(:), INTENT(IN) :: PUREF ! reference height of the first
101  ! atmospheric level (wind)
102  ! at first atmospheric level
103 REAL, INTENT(IN) :: PTSTEP ! time step
104 REAL, DIMENSION(:), INTENT(IN) :: PZ_LWCN ! height of forcing
105 !
106 REAL, DIMENSION(:), INTENT(IN) :: PDN_RF ! snow-covered roof frac.
107 REAL, DIMENSION(:), INTENT(IN) :: PABS_SW_SN_RF ! SW absorbed by roof snow
108 REAL, DIMENSION(:), INTENT(OUT) :: PABS_LW_SN_RF ! absorbed IR rad by snow on roof
109 REAL, DIMENSION(:), INTENT(INOUT) :: PDN_RD ! snow-covered road frac.
110 REAL, DIMENSION(:), INTENT(IN) :: PABS_SW_SN_RD ! SW absorbed by road snow
111 REAL, DIMENSION(:), INTENT(OUT) :: PABS_LW_SN_RD ! absorbed IR rad by snow on road
112 !
113 REAL, DIMENSION(:), INTENT(OUT) :: PRNSN_RF ! net radiation over snow
114 REAL, DIMENSION(:), INTENT(OUT) :: PHSN_RF ! sensible heat flux over snow
115 REAL, DIMENSION(:), INTENT(OUT) :: PLESN_RF ! latent heat flux over snow
116 REAL, DIMENSION(:), INTENT(OUT) :: PGSN_RF ! flux under the snow
117 REAL, DIMENSION(:), INTENT(OUT) :: PMELT_RF ! snow melt
118 REAL, DIMENSION(:), INTENT(OUT) :: PRNSN_RD ! net radiation over snow
119 REAL, DIMENSION(:), INTENT(OUT) :: PHSN_RD ! sensible heat flux over snow
120 REAL, DIMENSION(:), INTENT(OUT) :: PLESN_RD ! latent heat flux over snow
121 REAL, DIMENSION(:), INTENT(OUT) :: PGSN_RD ! flux under the snow
122 REAL, DIMENSION(:), INTENT(OUT) :: PMELT_RD ! snow melt
123 !
124 REAL, DIMENSION(:), INTENT(IN) :: PLW_WA_TO_NR ! LW contrib. wall -> road(snow)
125 REAL, DIMENSION(:), INTENT(IN) :: PLW_WB_TO_NR ! LW contrib. wall -> road(snow)
126 REAL, DIMENSION(:), INTENT(IN) :: PLW_S_TO_NR ! LW contrib. sky -> road(snow)
127 REAL, DIMENSION(:), INTENT(IN) :: PLW_WIN_TO_NR ! LW contrib. win -> road(snow)
128 REAL, DIMENSION(:), INTENT(OUT) :: PDQS_SN_RF ! Heat storage in snowpack on roofs
129 REAL, DIMENSION(:), INTENT(OUT) :: PDQS_SN_RD ! Heat storage in snowpack on roads
130 !
131 !* 0.2 declarations of local variables
132 !
133 REAL, DIMENSION(SIZE(PTA)) :: ZLW1_RD ! independant from
134 REAL, DIMENSION(SIZE(PTA)) :: ZLW1_RF ! surface temperature
135 !
136 REAL, DIMENSION(SIZE(PTA)) :: ZLW2_RD ! to be multiplied by
137 REAL, DIMENSION(SIZE(PTA)) :: ZLW2_RF ! 4th power of
138 ! ! surface temperature
139 
140 REAL, DIMENSION(SIZE(PTA)) :: ZSR_RF ! snow fall on roof snow (kg/s/m2 of snow)
141 REAL, DIMENSION(SIZE(PTA)) :: ZSR_RD ! snow fall on road snow (kg/s/m2 of snow)
142 !
143 REAL, DIMENSION(SIZE(PTA)) :: ZT_SKY ! sky temperature
144 REAL, DIMENSION(SIZE(PTA)) :: ZTS_COEFA ! Coefficient A for implicit coupling
145 ! ! of snow with the underlying surface
146 REAL, DIMENSION(SIZE(PTA)) :: ZTS_COEFB ! Coefficient B for implicit coupling
147 ! ! of snow with the underlying surface
148 !
149 ! flags to call to snow routines
150 !
151 LOGICAL :: GSN_RF, GSN_RD
152 !
153 ! loop counters
154 !
155 INTEGER :: JL
156 REAL(KIND=JPRB) :: ZHOOK_HANDLE
157 !
158 !-------------------------------------------------------------------------------
159 !
160 IF (lhook) CALL dr_hook('URBAN_SNOW_EVOL',0,zhook_handle)
161 prnsn_rf(:)=0.
162 phsn_rf(:)=0.
163 plesn_rf(:)=0.
164 pgsn_rf(:)=0.
165 pmelt_rf(:)=0.
166 prnsn_rd(:)=0.
167 phsn_rd(:)=0.
168 plesn_rd(:)=0.
169 pgsn_rd(:)=0.
170 pmelt_rd(:)=0.
171 pabs_lw_sn_rf(:)=0.
172 pabs_lw_sn_rd(:)=0.
173 !
174 !-------------------------------------------------------------------------------
175 !
176 gsn_rf = any( psr(:)>0. .OR. t%TSNOW_ROOF%WSNOW(:,1)>0. )
177 gsn_rd = any( psr(:)>0. .OR. t%TSNOW_ROAD%WSNOW(:,1)>0. )
178 !
179 !-------------------------------------------------------------------------------
180 !
181 !* 5. Snow mantel model
182 ! -----------------
183 !
184 !* 5.1 roofs
185 ! -----
186 !
187 IF ( gsn_rf ) THEN
188 !
189 !* initializes LW radiative coefficients
190 !
191  zlw1_rf(:) = t%TSNOW_ROOF%EMIS(:) * plw_rad(:)
192  zlw2_rf(:) = - t%TSNOW_ROOF%EMIS(:) * xstefan
193 !
194 !* The global amount of snow on roofs is supposed located on a
195 ! fraction of the roof surface. All computations are then
196 ! done only for each m2 of snow, and not for each m2 of roof.
197 !
198  DO jl=1,SIZE(t%TSNOW_ROOF%WSNOW,2)
199  WHERE (pdn_rf(:)>0.) t%TSNOW_ROOF%WSNOW(:,jl) = t%TSNOW_ROOF%WSNOW(:,jl) / pdn_rf(:)
200  END DO
201  zsr_rf=0.
202  WHERE (pdn_rf(:)>0.) zsr_rf(:) = psr(:) / pdn_rf(:)
203 !
204 !* Estimates implicit coupling between snow and roof
205 ! (strictly equal to an implicit formulation for 100% snow coverage)
206 !
207  CALL roof_impl_coef(t, ptstep, zts_coefa, zts_coefb)
208 !
209 !* call to snow mantel scheme
210 !
211  IF (t%TSNOW_ROOF%SCHEME=='1-L') &
212  CALL snow_cover_1layer(ptstep, xansmin_roof, xansmax_roof, xans_todry_roof, &
213  xrhosmin_roof, xrhosmax_roof, xans_t_roof, .true., 0., &
214  xwcrn_roof, xz0sn, xz0hsn, t%TSNOW_ROOF, pts_rf, &
215  zts_coefa, zts_coefb, pabs_sw_sn_rf, zlw1_rf, zlw2_rf,&
216  pta, pqa, pvmod, pps, prhoa, zsr_rf, pzref, puref, &
217  prnsn_rf, phsn_rf, plesn_rf, pgsn_rf, pmelt_rf, &
218  pdqs_sn_rf, pabs_lw_sn_rf)
219 !
220 
221 !
222 !* The global amount of snow on roofs is reported to total roof surface.
223 !
224  DO jl=1,SIZE(t%TSNOW_ROOF%WSNOW,2)
225  t%TSNOW_ROOF%WSNOW(:,jl) = t%TSNOW_ROOF%WSNOW(:,jl) * pdn_rf(:)
226  END DO
227 !
228 END IF
229 !
230 !* 5.2 roads
231 ! -----
232 !
233 IF ( gsn_rd ) THEN
234  !
235  zt_sky(:) = (plw_rad(:)/xstefan)**0.25
236 !
237  zlw1_rd(:) = plw_s_to_nr(:) * (zt_sky(:) - t%TSNOW_ROAD%TS(:)) &
238  + plw_wa_to_nr(:) * (pts_wl_a(:) - t%TSNOW_ROAD%TS(:)) &
239  + plw_wb_to_nr(:) * (pts_wl_b(:) - t%TSNOW_ROAD%TS(:)) &
240  + plw_win_to_nr(:) * (b%XT_WIN1(:) - t%TSNOW_ROAD%TS(:))
241  zlw2_rd(:) = 0.0
242  !
243  !* The global amount of snow on roads is supposed located on a
244  ! fraction of the road surface. All computations are then
245  ! done only for each m2 of snow, and not for each m2 of road.
246  !
247  DO jl=1,SIZE(t%TSNOW_ROAD%WSNOW,2)
248  WHERE (pdn_rd(:)>0.) t%TSNOW_ROAD%WSNOW(:,jl) = t%TSNOW_ROAD%WSNOW(:,jl) / pdn_rd(:)
249  END DO
250  zsr_rd=0.
251  WHERE (pdn_rd(:)>0.) zsr_rd(:) = psr(:) / pdn_rd(:)
252  !
253  !* no implicit coupling necessary with road
254  !
255  zts_coefa = 0.
256  zts_coefb = pts_rd
257  !
258  !* call to snow mantel scheme
259  !
260  IF (t%TSNOW_ROAD%SCHEME=='1-L') &
261  CALL snow_cover_1layer(ptstep, xansmin_road, xansmax_road, xans_todry_road, &
262  xrhosmin_road, xrhosmax_road, xans_t_road, .false., &
263  0., xwcrn_road, xz0sn, xz0hsn, t%TSNOW_ROAD, pts_rd, &
264  zts_coefa, zts_coefb, pabs_sw_sn_rd, zlw1_rd, zlw2_rd,&
265  pt_lwcn, pq_lwcn, pu_lwcn, pps, prhoa, zsr_rd, pz_lwcn,&
266  pz_lwcn, prnsn_rd, phsn_rd, plesn_rd, pgsn_rd, &
267  pmelt_rd, pdqs_sn_rd, pabs_lw_sn_rd )
268 !
269 !* The global amount of snow on roads is reported to total road surface.
270 !
271  DO jl=1,SIZE(t%TSNOW_ROAD%WSNOW,2)
272  t%TSNOW_ROAD%WSNOW(:,jl) = t%TSNOW_ROAD%WSNOW(:,jl) * pdn_rd(:)
273  END DO
274 !
275  WHERE (t%TSNOW_ROAD%T(:,1) .EQ. xundef) pdn_rd(:) = 0.0
276 !
277 END IF
278 IF (lhook) CALL dr_hook('URBAN_SNOW_EVOL',1,zhook_handle)
279 !
280 !
281 !-------------------------------------------------------------------------------
282 !
283 END SUBROUTINE urban_snow_evol
subroutine snow_cover_1layer(PTSTEP, PANSMIN, PANSMAX, PTODRY, PRHOSMIN, PRHOSMAX, PRHOFOLD, OALL_MELT, PDRAIN_TIME, PWCRN, PZ0SN, PZ0HSN, TPSNOW, 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)
real, save xstefan
Definition: modd_csts.F90:59
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine roof_impl_coef(T, PTSTEP, PTDEEP_A, PTDEEP_B)
logical lhook
Definition: yomhook.F90:15
subroutine urban_snow_evol(T, B, PT_LWCN, PQ_LWCN, PU_LWCN, PTS_RF, PTS_RD, PTS_WL_A, PTS_WL_B, PPS, PTA, PQA, PRHOA, PLW_RAD, PSR, PZREF, PUREF, PVMOD, PTSTEP, PZ_LWCN, PDN_RF, PABS_SW_SN_RF, PABS_LW_SN_RF, PDN_RD, PABS_SW_SN_RD, PABS_LW_SN_RD, PRNSN_RF, PHSN_RF, PLESN_RF, PGSN_RF, PMELT_RF, PRNSN_RD, PHSN_RD, PLESN_RD, PGSN_RD, PMELT_RD, PLW_WA_TO_NR, PLW_WB_TO_NR, PLW_S_TO_NR, PLW_WIN_TO_NR, PDQS_SN_RF, PDQS_SN_RD)