SURFEX v8.1
General documentation of Surfex
preps_for_meb_ebud_rad.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 preps_for_meb_ebud_rad(PPS, &
7  PLAICV,PSNOWRHO,PSNOWSWE,PSNOWHEAT,PSNOWLIQ, &
8  PSNOWTEMP,PSNOWDZ,PSCOND,PHEATCAPS,PEMISNOW,PSIGMA_F,PCHIP, &
9  PTSTEP,PSR,PTA,PVMOD,PSNOWAGE,PPERMSNOWFRAC )
10 ! ############################################################################
11 !
12 !!**** *PREPS_FOR_MEB_EBUD_RAD*
13 !!
14 !! PURPOSE
15 !! -------
16 !
17 ! Get preliminary estimates of certain parameters needed for energy budget
18 ! solution of snowpack, and some other misc inputs needed by radiation
19 ! routines for MEB.
20 !
21 !!** METHOD
22 !! ------
23 !
24 !
25 !! EXTERNAL
26 !! --------
27 !!
28 !!
29 !! IMPLICIT ARGUMENTS
30 !! ------------------
31 !!
32 !!
33 !!
34 !! REFERENCE
35 !! ---------
36 !!
37 !!
38 !! AUTHOR
39 !! ------
40 !!
41 !! A. Boone * CNRM-GAME, Meteo-France *
42 !!
43 !! MODIFICATIONS
44 !! -------------
45 !! Original 02/2011
46 !-------------------------------------------------------------------------------
47 !
48 !* 0. DECLARATIONS
49 ! ------------
50 !
51 !
52 USE modd_snow_par, ONLY : xrhosmax_es, xrhosmin_es, xemissn, xsnowdmin, &
53  xsnowthrmcond1
54 !
55 USE modd_csts, ONLY : xtt, xlmtt, xrholw
56 !
57 USE modd_surf_par, ONLY : xundef
58 !
59 USE modd_snow_metamo, ONLY : xsnowdzmin
60 !
63 !
64 USE mode_meb, ONLY : meb_shield_factor
65 !
66 USE yomhook ,ONLY : lhook, dr_hook
67 USE parkind1 ,ONLY : jprb
68 !
69 IMPLICIT NONE
70 !
71 !
72 !* 0.1 Declaration of Arguments
73 !
74 REAL :: PTSTEP ! time step (s)
75 REAL, DIMENSION(:), INTENT(IN) :: PLAICV
76 REAL, DIMENSION(:), INTENT(IN) :: PPS
77 REAL, DIMENSION(:), INTENT(IN) :: PSR
78 REAL, DIMENSION(:), INTENT(IN) :: PTA
79 REAL, DIMENSION(:), INTENT(IN) :: PVMOD
80 REAL, DIMENSION(:), INTENT(IN) :: PPERMSNOWFRAC
81 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWHEAT
82 
83 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWSWE, PSNOWAGE, PSNOWRHO
84 
85 REAL, DIMENSION(:), INTENT(OUT) :: PSIGMA_F, PCHIP
86 REAL, DIMENSION(:), INTENT(OUT) :: PEMISNOW
87 REAL, DIMENSION(:,:), INTENT(OUT) :: PSNOWDZ, PSCOND, PHEATCAPS, PSNOWTEMP, PSNOWLIQ
88 !
89 !
90 !* 0.2 declarations of local variables
91 !
92 INTEGER :: JI, JK, JJ, INLVLS, ISIZE_SNOW, INI
93 INTEGER, DIMENSION(SIZE(PTA)) :: NMASK ! indices correspondance between arrays
94 REAL, DIMENSION(SIZE(PLAICV,1)) :: ZPSNA
95 REAL, DIMENSION(SIZE(PTA)) :: ZSNOW, ZSNOWFALL
96 !
97 REAL(KIND=JPRB) :: ZHOOK_HANDLE
98 !----------------------------------------------------
99 ! 0) Initialization
100 !
101 IF (lhook) CALL dr_hook('PREPS_FOR_MEB_EBUD_RAD',0,zhook_handle)
102 !
103 ini = SIZE(psnowrho,1)
104 inlvls = SIZE(psnowrho,2)
105 !
106 WHERE(psnowrho(:,:)==xundef)
107  psnowrho(:,:) = xrhosmin_es ! arbitrary...will be correctly set if snow present
108 ENDWHERE
109 !
110 psnowdz(:,:) = psnowswe(:,:)/psnowrho(:,:)
111 pheatcaps(:,:) = snow3lscap(psnowrho)
112 pscond(:,:) = xsnowthrmcond1 ! arbitrary...will be correctly set if snow present
113 psnowtemp(:,:) = xtt
114 psnowliq(:,:) = 0.0
115 !
116 ! Test variables to check for existance of snow:
117 !
118 zsnowfall(:) = psr(:)*ptstep/xrhosmax_es
119 !
120 zsnow(:) = 0.0
121 DO jk=1,inlvls
122  DO ji=1,ini
123  zsnow(ji) = zsnow(ji) + psnowdz(ji,jk)
124  ENDDO
125 ENDDO
126 !
127 ! Here, as in snow3l (ISBA-ES), we account for several processes
128 ! on the snowpack before surface energy budget computations
129 ! (i.e. snowfall on albedo, density, thickness, and compaction etc...)
130 !
131 ! ===============================================================
132 ! === Packing: Only call snow model routines when there is snow on the surface
133 ! exceeding a minimum threshold OR if the equivalent
134 ! snow depth falling during the current time step exceeds
135 ! this limit.
136 !
137 ! counts the number of points where the computations will be made
138 !
139 !
140 isize_snow = 0
141 nmask(:) = 0
142 !
143 DO jj=1,ini
144  IF (zsnow(jj) >= xsnowdmin .OR. zsnowfall(jj) >= xsnowdmin) THEN
145  isize_snow = isize_snow + 1
146  nmask(isize_snow) = jj
147  ENDIF
148 ENDDO
149 !
150 IF (isize_snow>0) THEN
151  CALL call_snow_routines(isize_snow,inlvls,nmask)
152 ENDIF
153 !
154 ! ===============================================================
155 !
156 !
157 ! View factor: (1 - shielding factor)
158 !
159 zpsna(:) = 0.
160 pchip(:) = meb_shield_factor(plaicv,zpsna)
161 psigma_f(:) = 1.0 - pchip(:)
162 !
163 ! snow emissivity
164 !
165 pemisnow(:) = xemissn
166 !
167 IF (lhook) CALL dr_hook('PREPS_FOR_MEB_EBUD_RAD',1,zhook_handle)
168 !
169 !
170 CONTAINS
171 !================================================================
172 SUBROUTINE call_snow_routines(KSIZE1,KSIZE2,KMASK)
173 !
174 ! Make some snow computations only over regions with snow cover or snow falling
175 !
176 IMPLICIT NONE
177 !
178 INTEGER, INTENT(IN) :: KSIZE1
179 INTEGER, INTENT(IN) :: KSIZE2
180 INTEGER, DIMENSION(:), INTENT(IN) :: KMASK
181 !
182 REAL, DIMENSION(KSIZE1,KSIZE2) :: ZP_SNOWSWE
183 REAL, DIMENSION(KSIZE1,KSIZE2) :: ZP_SNOWRHO
184 REAL, DIMENSION(KSIZE1,KSIZE2) :: ZP_SNOWHEAT
185 REAL, DIMENSION(KSIZE1,KSIZE2) :: ZP_SNOWTEMP
186 REAL, DIMENSION(KSIZE1,KSIZE2) :: ZP_SNOWLIQ
187 REAL, DIMENSION(KSIZE1,KSIZE2) :: ZP_SNOWDZ
188 REAL, DIMENSION(KSIZE1,KSIZE2) :: ZP_SCOND
189 REAL, DIMENSION(KSIZE1,KSIZE2) :: ZP_SNOWAGE
190 REAL, DIMENSION(KSIZE1,KSIZE2) :: ZP_SNOWDZN
191 REAL, DIMENSION(KSIZE1,KSIZE2) :: ZP_HEATCAPS
192 REAL, DIMENSION(KSIZE1) :: ZP_SNOW
193 REAL, DIMENSION(KSIZE1) :: ZP_SNOWHMASS
194 REAL, DIMENSION(KSIZE1) :: ZP_PERMSNOWFRAC
195 REAL, DIMENSION(KSIZE1) :: ZP_PS
196 REAL, DIMENSION(KSIZE1) :: ZP_SR
197 REAL, DIMENSION(KSIZE1) :: ZP_TA
198 REAL, DIMENSION(KSIZE1) :: ZP_VMOD
199 
200 INTEGER :: JWRK, JJ, JI
201 REAL(KIND=JPRB) :: ZHOOK_HANDLE
202 !
203 !----------------------------------------------------------------
204 !
205 IF (lhook) CALL dr_hook('SNOW3L_ISBA:CALL_MODEL',0,zhook_handle)
206 !
207 ! pack the variables
208 !
209 DO jwrk=1,ksize2
210  DO jj=1,ksize1
211  ji = kmask(jj)
212  zp_snowswe(jj,jwrk) = psnowswe(ji,jwrk)
213  zp_snowrho(jj,jwrk) = psnowrho(ji,jwrk)
214  zp_snowheat(jj,jwrk) = psnowheat(ji,jwrk)
215  zp_snowage(jj,jwrk) = psnowage(ji,jwrk)
216  zp_snowdz(jj,jwrk) = psnowdz(ji,jwrk)
217  ENDDO
218 ENDDO
219 !
220 DO jj=1,ksize1
221  ji = kmask(jj)
222  zp_snow(jj) = zsnow(ji)
223  zp_ps(jj) = pps(ji)
224  zp_sr(jj) = psr(ji)
225  zp_ta(jj) = pta(ji)
226  zp_vmod(jj) = pvmod(ji)
227  zp_permsnowfrac(jj) = ppermsnowfrac(ji)
228 ENDDO
229 !
230 !---------------------------------------------------------------
231 !
232 ! Local working:
233 !
234 zp_snowheat(:,:) = zp_snowheat(:,:)*zp_snowdz(:,:) ! J/m3 to J/m2
235 !
236 !
237  CALL snow3lfall(ptstep,zp_sr,zp_ta,zp_vmod,zp_snow,zp_snowrho,zp_snowdz, &
238  zp_snowheat,zp_snowhmass,zp_snowage,zp_permsnowfrac)
239 !
240  CALL snow3lgrid(zp_snowdzn,zp_snow,psnowdz_old=zp_snowdz)
241 !
242  CALL snow3ltransf(zp_snow,zp_snowdz,zp_snowdzn,zp_snowrho,zp_snowheat,zp_snowage)
243 !
244 ! Snow heat capacity:
245 !
246 zp_heatcaps(:,:) = snow3lscap(zp_snowrho) ! J m-3 K-1
247 !
248 ! Snow temperature (K)
249 !
250 zp_snowtemp(:,:) = xtt + ( ((zp_snowheat(:,:)/max(1.e-10,zp_snowdz(:,:))) &
251  + xlmtt*zp_snowrho(:,:))/zp_heatcaps(:,:) )
252 !
253 zp_snowliq(:,:) = max(0.0,zp_snowtemp(:,:)-xtt)*zp_heatcaps(:,:)* &
254  zp_snowdz(:,:)/(xlmtt*xrholw)
255 
256 zp_snowtemp(:,:) = min(xtt,zp_snowtemp(:,:))
257 
258 ! SWE:
259 
260 zp_snowswe(:,:) = zp_snowdz(:,:)*zp_snowrho(:,:)
261 
262  CALL snow3lcompactn(ptstep,xsnowdzmin,zp_snowrho,zp_snowdz,zp_snowtemp,zp_snow,zp_snowliq)
263 
264 ! Snow thermal conductivity:
265 !
266  CALL snow3lthrm(zp_snowrho,zp_scond,zp_snowtemp,zp_ps)
267 !
268 !----------------------------------------------------------------
269 !
270 ! Unpack:
271 !
272 DO jwrk=1,ksize2
273  DO jj=1,ksize1
274  ji = kmask(jj)
275  psnowswe(ji,jwrk) = zp_snowswe(jj,jwrk)
276  psnowrho(ji,jwrk) = zp_snowrho(jj,jwrk)
277  psnowage(ji,jwrk) = zp_snowage(jj,jwrk)
278  psnowdz(ji,jwrk) = zp_snowdz(jj,jwrk)
279  psnowtemp(ji,jwrk) = zp_snowtemp(jj,jwrk)
280  psnowliq(ji,jwrk) = zp_snowliq(jj,jwrk)
281  pscond(ji,jwrk) = zp_scond(jj,jwrk)
282  pheatcaps(ji,jwrk) = zp_heatcaps(jj,jwrk)
283  ENDDO
284 ENDDO
285 !
286 END SUBROUTINE call_snow_routines
287 !================================================================
288 !
289 END SUBROUTINE preps_for_meb_ebud_rad
subroutine call_snow_routines(KSIZE1, KSIZE2, KMASK)
real, parameter xsnowdzmin
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine preps_for_meb_ebud_rad(PPS, PLAICV, PSNOWRHO, PSNOWSWE, PSNOWHEAT, PSNOWLIQ, PSNOWTEMP, PSNOWDZ, PSCOND, PHEATCAPS, PEMISNOW, PSIGMA_F, PCHIP, PTSTEP, PSR, PTA, PVMOD, PSNOWAGE, PPERMSNOWFRAC)
real, save xrholw
Definition: modd_csts.F90:64
real, save xtt
Definition: modd_csts.F90:66
real, save xlmtt
Definition: modd_csts.F90:72