SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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(PTSTEP,PSR,PTV,PWRVNMAX,PKVN,PCHEATV,PLERCV,PLESC,PMELTVN, &
7  pvelc,pmeltcv,pfrzcv,punloadsnow,pwrv,pwrvn,psubvcor,plvtt,plstt)
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_csts, ONLY : xtt, xlmtt
49 !
50 USE modd_snow_par, ONLY : xrhosmax_es
51 !
52 USE yomhook ,ONLY : lhook, dr_hook
53 USE parkind1 ,ONLY : jprb
54 !
55 IMPLICIT NONE
56 !
57 !* 0.1 Declaration of Arguments
58 !
59 REAL, INTENT(IN) :: ptstep
60 !
61 REAL, DIMENSION(:), INTENT(IN) :: plvtt, plstt
62 REAL, DIMENSION(:), INTENT(IN) :: psr,pcheatv, plercv, pvelc, &
63  plesc, pmeltvn, pwrvnmax, pkvn
64 !
65 REAL, DIMENSION(:), INTENT(INOUT) :: pwrvn, pwrv, ptv
66 !
67 REAL, DIMENSION(:), INTENT(OUT) :: pmeltcv, pfrzcv, punloadsnow, psubvcor
68 !
69 !
70 !* 0.2 declarations of local variables
71 !
72 REAL, DIMENSION(SIZE(PSR)) :: zsrint, zunload, zwrvn, zsub
73 !
74 REAL(KIND=JPRB) :: zhook_handle
75 !
76 !* 0.3 declarations of local parameters
77 !
78 ! Snow unloading parameters (Roesch el al., Clim. Dyn., 2001)
79 !
80 REAL, PARAMETER :: zunload_t = 1.5e+5 ! K s
81 REAL, PARAMETER :: zunload_tt = 270.15 ! K
82 REAL, PARAMETER :: zunload_v = 1.87e+5 ! m
83 !
84 !-------------------------------------------------
85 ! 0) Initialization
86 !
87 IF (lhook) CALL dr_hook('SNOW_LOAD_MEB',0,zhook_handle)
88 !
89 zsrint(:) = 0.0
90 zwrvn(:) = 0.0
91 zsub(:) = 0.0
92 zunload(:) = 0.0
93 !
94 !
95 ! 1) First consider the case when maximum interception is zero...
96 ! this only occurs when vegetation canopy is *totally* buried. The follwing line
97 ! results in non-zero snow loading (total removal of intercepted snow)
98 ! only during the timestep when vegetation has just been buried:
99 !
100 !
101 WHERE(pwrvnmax(:) == 0.0)
102 !
103  punloadsnow(:) = pwrvn(:)/ptstep ! kg m-2 s-1
104  pwrvn(:) = 0.0
105 
106 ! for a totally buried canopy, the following are zero:
107 
108  pmeltcv(:) = 0.0
109  pfrzcv(:) = 0.0
110  psubvcor(:) = 0.0
111 !
112 !
113 ELSEWHERE
114 !
115 !
116 ! 2) Case for snow beneath or only partially covering the vegetation canopy:
117 !
118 !
119 ! The following are computed as steps to ensure mass conservation.
120 !
121 ! Interception: gain
122 
123  zsrint(:) = max(0.0,pwrvnmax(:)-pwrvn(:))*(1.0-exp(-pkvn(:)*psr(:)*ptstep)) ! kg m-2
124  zsrint(:) = min(psr(:)*ptstep, zsrint(:)) ! kg m-2
125  zwrvn(:) = pwrvn(:) + zsrint(:) ! kg m-2
126 
127  punloadsnow(:) = max(0.0, psr(:) - zsrint(:)/ptstep) ! kg m-2 s-1
128 
129 ! Sublimation: gain or loss
130 ! NOTE for the rare case that sublimation exceeds snow mass (possible as traces of snow disappear)
131 ! compute a mass correction to be removed from soil (to conserve mass): PSUBVCOR
132 
133  zsub(:) = plesc(:)*(ptstep/plstt(:)) ! kg m-2
134  psubvcor(:) = max(0.0, zsub(:) - zwrvn(:))/ptstep ! kg m-2 s-1
135  zwrvn(:) = max(0.0, zwrvn(:) - zsub(:)) ! kg m-2
136 
137 ! Phase change: loss (melt of snow mass)
138 
139  pmeltcv(:) = ptstep*max(0.0, pmeltvn(:)) ! kg m-2
140  pmeltcv(:) = min(pmeltcv(:), zwrvn(:))
141  zwrvn(:) = zwrvn(:) - pmeltcv(:)
142  pwrv(:) = pwrv(:) + pmeltcv(:) ! NOTE...liq reservoir can exceed maximum holding
143  ! capacity here, but this is accounted for
144  ! in main prognostic PWRV routine.
145 
146 ! Phase change: gain (freeze of intercepted water)
147 ! Note, to get a better estimate of water available for freezing, remove Er in
148 ! estimation of water for freezing:
149 ! Also, update liquid water stored on the canopy here:
150 
151  pfrzcv(:) = ptstep*max(0.0, -pmeltvn(:)) ! kg m-2
152  pfrzcv(:) = min(pfrzcv(:), max(0.0,pwrv(:)-plercv(:)*(ptstep/plvtt(:))))
153  zwrvn(:) = zwrvn(:) + pfrzcv(:)
154  pwrv(:) = pwrv(:) - pfrzcv(:)
155 
156 ! Unloading (falling off branches, etc...): loss
157 ! Note, the temperature effect is assumed to vanish for cold temperatures.
158 
159  zunload(:) = min(zwrvn(:), pwrvn(:)*( pvelc(:)*(ptstep/zunload_v) &
160  + max(0.0, ptv(:)-zunload_tt)*(ptstep/zunload_t) )) ! kg m-2
161  zwrvn(:) = zwrvn(:) - zunload(:) ! kg m-2
162  punloadsnow(:) = punloadsnow(:) + zunload(:)/ptstep
163 
164 ! Diagnostic updates:
165 ! final phase change (units)
166 
167  pmeltcv(:) = pmeltcv(:)/ptstep ! kg m-2 s-1
168  pfrzcv(:) = pfrzcv(:) /ptstep ! kg m-2 s-1
169 
170 ! Prognostic Updates:
171 
172  pwrvn(:) = zwrvn(:)
173 
174  ptv(:) = ptv(:) + (pfrzcv(:) - pmeltcv(:))*(xlmtt*ptstep)/pcheatv(:) ! K
175 
176 END WHERE
177 !
178 IF (lhook) CALL dr_hook('SNOW_LOAD_MEB',1,zhook_handle)
179 !
180 END SUBROUTINE snow_load_meb
subroutine snow_load_meb(PTSTEP, PSR, PTV, PWRVNMAX, PKVN, PCHEATV, PLERCV, PLESC, PMELTVN, PVELC, PMELTCV, PFRZCV, PUNLOADSNOW, PWRV, PWRVN, PSUBVCOR, PLVTT, PLSTT)