SURFEX v8.1
General documentation of Surfex
snow_load_meb.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 snow_load_meb(PK, PEK, DEK, PTSTEP, PSR, PWRVNMAX, PKVN, PCHEATV, PMELTVN, &
7  PVELC, PSUBVCOR)
8 ! ############################################################################
9 !
10 !!**** *SNOW_LOAD_MEB*
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 ! Calculate temporal evolution of canopy-intercepted intercepted snow
16 !
17 !!** METHOD
18 !! ------
19 !
20 !
21 !! EXTERNAL
22 !! --------
23 !!
24 !!
25 !! IMPLICIT ARGUMENTS
26 !! ------------------
27 !!
28 !!
29 !!
30 !! REFERENCE
31 !! ---------
32 !!
33 !!
34 !! AUTHOR
35 !! ------
36 !!
37 !! P. Samuelsson * SMHI *
38 !! A. Boone * CNRM-GAME, Meteo-France *
39 !!
40 !! MODIFICATIONS
41 !! -------------
42 !! Original 02/2011
43 !-------------------------------------------------------------------------------
44 !
45 !* 0. DECLARATIONS
46 ! ------------
47 !
48 USE modd_isba_n, ONLY : isba_pe_t, isba_p_t
50 !
51 USE modd_csts, ONLY : xtt, xlmtt
52 !
53 USE modd_snow_par, ONLY : xrhosmax_es
54 !
55 USE yomhook ,ONLY : lhook, dr_hook
56 USE parkind1 ,ONLY : jprb
57 !
58 IMPLICIT NONE
59 !
60 !* 0.1 Declaration of Arguments
61 !
62 TYPE(isba_p_t), INTENT(INOUT) :: PK
63 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
64 TYPE(diag_evap_isba_t), INTENT(INOUT) :: DEK
65 !
66 REAL, INTENT(IN) :: PTSTEP
67 !
68 REAL, DIMENSION(:), INTENT(IN) :: PSR, PCHEATV, PVELC, PMELTVN, PWRVNMAX, PKVN
69 !
70 REAL, DIMENSION(:), INTENT(OUT) :: PSUBVCOR
71 !
72 !
73 !* 0.2 declarations of local variables
74 !
75 REAL, DIMENSION(SIZE(PSR)) :: ZSRINT, ZUNLOAD, ZWRVN, ZSUB
76 !
77 REAL(KIND=JPRB) :: ZHOOK_HANDLE
78 !
79 !* 0.3 declarations of local parameters
80 !
81 ! Snow unloading parameters (Roesch el al., Clim. Dyn., 2001)
82 !
83 REAL, PARAMETER :: ZUNLOAD_T = 1.5e+5 ! K s
84 REAL, PARAMETER :: ZUNLOAD_TT = 270.15 ! K
85 REAL, PARAMETER :: ZUNLOAD_V = 1.87e+5 ! m
86 !
87 !-------------------------------------------------
88 ! 0) Initialization
89 !
90 IF (lhook) CALL dr_hook('SNOW_LOAD_MEB',0,zhook_handle)
91 !
92 zsrint(:) = 0.0
93 zwrvn(:) = 0.0
94 zsub(:) = 0.0
95 zunload(:) = 0.0
96 !
97 !
98 ! 1) First consider the case when maximum interception is zero...
99 ! this only occurs when vegetation canopy is *totally* buried. The follwing line
100 ! results in non-zero snow loading (total removal of intercepted snow)
101 ! only during the timestep when vegetation has just been buried:
102 !
103 !
104 !
105 WHERE(pwrvnmax(:) == 0.0)
106 !
107  dek%XSR_GN(:) = pek%XWRVN(:)/ptstep ! kg m-2 s-1
108  pek%XWRVN(:) = 0.0
109 
110 ! for a totally buried canopy, the following are zero:
111 
112  dek%XMELT_CV(:) = 0.0
113  dek%XFRZ_CV(:) = 0.0
114  psubvcor(:) = 0.0
115 !
116 !
117 ELSEWHERE
118 !
119 !
120 ! 2) Case for snow beneath or only partially covering the vegetation canopy:
121 !
122 !
123 ! The following are computed as steps to ensure mass conservation.
124 !
125 ! Interception: gain
126 
127 
128  zsrint(:) = max(0.0,pwrvnmax(:)-pek%XWRVN(:))*(1.0-exp(-pkvn(:)*psr(:)*ptstep)) ! kg m-2
129  zsrint(:) = min(psr(:)*ptstep, zsrint(:)) ! kg m-2
130  zwrvn(:) = pek%XWRVN(:) + zsrint(:) ! kg m-2
131 
132  dek%XSR_GN(:) = max(0.0, psr(:) - zsrint(:)/ptstep) ! kg m-2 s-1
133 
134 END WHERE
135 
136  WHERE(pwrvnmax(:) /= 0.0)
137 
138 ! Sublimation: gain or loss
139 ! NOTE for the rare case that sublimation exceeds snow mass (possible as traces of snow disappear)
140 ! compute a mass correction to be removed from soil (to conserve mass): PSUBVCOR
141 
142  zsub(:) = dek%XLES_CV(:)*(ptstep/pk%XLSTT(:)) ! kg m-2
143  psubvcor(:) = max(0.0, zsub(:) - zwrvn(:))/ptstep ! kg m-2 s-1
144  zwrvn(:) = max(0.0, zwrvn(:) - zsub(:)) ! kg m-2
145 
146 ! Phase change: loss (melt of snow mass)
147 
148  dek%XMELT_CV(:) = ptstep*max(0.0, pmeltvn(:)) ! kg m-2
149  dek%XMELT_CV(:) = min(dek%XMELT_CV(:), zwrvn(:))
150  zwrvn(:) = zwrvn(:) - dek%XMELT_CV(:)
151  pek%XWR(:) = pek%XWR(:) + dek%XMELT_CV(:) ! NOTE...liq reservoir can exceed maximum holding
152  ! capacity here, but this is accounted for
153  ! in main prognostic PWRV routine.
154 
155 ! Phase change: gain (freeze of intercepted water)
156 ! Note, to get a better estimate of water available for freezing, remove Er in
157 ! estimation of water for freezing:
158 ! Also, update liquid water stored on the canopy here:
159 
160  dek%XFRZ_CV(:) = ptstep*max(0.0, -pmeltvn(:)) ! kg m-2
161  dek%XFRZ_CV(:) = min(dek%XFRZ_CV(:), max(0.0,pek%XWR(:)-dek%XLER_CV(:)*(ptstep/pk%XLVTT(:))))
162  zwrvn(:) = zwrvn(:) + dek%XFRZ_CV(:)
163  pek%XWR(:) = pek%XWR(:) - dek%XFRZ_CV(:)
164 
165 ! Unloading (falling off branches, etc...): loss
166 ! Note, the temperature effect is assumed to vanish for cold temperatures.
167 
168  zunload(:) = min(zwrvn(:), pek%XWRVN(:)*( pvelc(:)*(ptstep/zunload_v) &
169  + max(0.0, pek%XTV(:)-zunload_tt)*(ptstep/zunload_t) )) ! kg m-2
170  zwrvn(:) = zwrvn(:) - zunload(:) ! kg m-2
171  dek%XSR_GN(:) = dek%XSR_GN(:) + zunload(:)/ptstep
172 
173 ! Diagnostic updates:
174 ! final phase change (units)
175 
176  dek%XMELT_CV(:) = dek%XMELT_CV(:)/ptstep ! kg m-2 s-1
177  dek%XFRZ_CV(:) = dek%XFRZ_CV(:) /ptstep ! kg m-2 s-1
178 
179 ! Prognostic Updates:
180 
181  pek%XWRVN(:) = zwrvn(:)
182 
183  pek%XTV(:) = pek%XTV(:) + (dek%XFRZ_CV(:) - dek%XMELT_CV(:))*(xlmtt*ptstep)/pcheatv(:) ! K
184 
185 END WHERE
186 !
187 IF (lhook) CALL dr_hook('SNOW_LOAD_MEB',1,zhook_handle)
188 !
189 END SUBROUTINE snow_load_meb
integer, parameter jprb
Definition: parkind1.F90:32
subroutine snow_load_meb(PK, PEK, DEK, PTSTEP, PSR, PWRVNMAX, PKVN, PCHEATV, PMELTVN, PVELC, PSUBVCOR)
logical lhook
Definition: yomhook.F90:15
real, save xtt
Definition: modd_csts.F90:66
real, save xlmtt
Definition: modd_csts.F90:72