SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
snow3L_isba.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 snow3l_isba(HISBA, HSNOW_ISBA, HSNOWRES, OMEB, OGLACIER, HIMPLICIT_WIND, &
7  tptime, ptstep, pvegtype, &
8  psnowswe, psnowheat, psnowrho, psnowalb, &
9  psnowgran1, psnowgran2, psnowhist,psnowage, &
10  ptg, pcg, pct, psoilhcapz, psoilcondz, &
11  pps, pta, psw_rad, pqa, pvmod, plw_rad, prr, psr, &
12  prhoa, puref, pexns, pexna, pdircoszw, plvtt, plstt, &
13  pzref, pz0nat, pz0eff, pz0hnat, palb, pd_g, pdzg, &
14  ppew_a_coef, ppew_b_coef, &
15  ppet_a_coef, ppeq_a_coef, ppet_b_coef, ppeq_b_coef, &
16  pthrufal, pgrndflux, pflsn_cor, pgsfcsnow, pevapcor, &
17  pswnetsnow, pswnetsnows, plwnetsnow, &
18  prnsnow, phsnow, pgfluxsnow, phpsnow, ples3l, plel3l, pevap, &
19  psndrift, pustarsnow, ppsn, psrsfc, prrsfc, psnowsfch, &
20  pdelheatn, pdelheatn_sfc, &
21  pemisnow, pcdsnow, pchsnow, psnowtemp, psnowliq, psnowdz, &
22  psnowhmass, pri, pzenith, pdelheatg, pdelheatg_sfc, plat, plon, pqs,&
23  osnowdrift,osnowdrift_sublim,osnow_abs_zenith, &
24  hsnowmetamo, hsnowrad )
25 ! ######################################################################################
26 !
27 !!**** *SNOW3L_ISBA*
28 !!
29 !! PURPOSE
30 !! -------
31 !
32 ! 3-Layer snow scheme option (Boone and Etchevers 1999)
33 ! This routine is NOT called as snow depth goes below
34 ! a critical threshold which is vanishingly small.
35 ! This routine acts as an interface between SNOW3L and ISBA.
36 !
37 !!** METHOD
38 !! ------
39 !
40 ! Direct calculation
41 !
42 !! EXTERNAL
43 !! --------
44 !
45 ! None
46 !!
47 !! IMPLICIT ARGUMENTS
48 !! ------------------
49 !!
50 !!
51 !! REFERENCE
52 !! ---------
53 !!
54 !! Boone and Etchevers (1999)
55 !! Belair (1995)
56 !! Noilhan and Planton (1989)
57 !! Noilhan and Mahfouf (1996)
58 !!
59 !! AUTHOR
60 !! ------
61 !! A. Boone * Meteo-France *
62 !!
63 !! MODIFICATIONS
64 !! -------------
65 !! Original 7/99 Boone
66 !! Packing added 4/00 Masson & Boone
67 !! z0h and snow 2/06 LeMoigne
68 !!
69 !! Modified by B. Decharme (03/2009): Consistency with Arpege permanent
70 !! snow/ice treatment
71 !! Modified by A. Boone (04/2010): Implicit coupling with atmosphere permitted.
72 !!
73 !! Modified by B. Decharme (04/2010): check suspicious low temperature for ES and CROCUS
74 !! Modified by B. Decharme (08/2013): Qsat as argument (needed for coupling with atm)
75 !! Modified by A. Boone (10/2014): MEB: pass in fluxes when using MEB
76 !! Modified by B. Decharme (03/2016): No snowdrift under forest
77 !!
78 !-------------------------------------------------------------------------------
79 !
80 USE modd_csts, ONLY : xtt, xpi, xday, xlmtt, xlstt
81 USE modd_snow_par, ONLY : xrhosmax_es, xsnowdmin, xrhosmin_es, xemissn
82 USE modd_surf_par, ONLY : xundef
84 !
85 USE modd_data_cover_par, ONLY : nvt_snow, &
86  nvt_tebd, nvt_trbe, nvt_bone, &
87  nvt_trbd, nvt_tebe, nvt_tene, &
88  nvt_bobd, nvt_bond, nvt_shrb
89 !
90 USE modi_snow3l
91 USE modi_snowcro
92 !
93 USE modi_abor1_sfx
94 !
95 USE yomhook ,ONLY : lhook, dr_hook
96 USE parkind1 ,ONLY : jprb
97 !
98 IMPLICIT NONE
99 !
100 !
101 !
102 !* 0.1 declarations of arguments
103 !
104 REAL, INTENT(IN) :: ptstep
105 ! PTSTEP = time step of the integration
106 !
107 REAL, DIMENSION(:,:), INTENT(IN) :: pvegtype ! fraction of each vegetation
108 !
109  CHARACTER(LEN=*), INTENT(IN) :: hisba
110 ! HISBA = FLAG to use Force-Restore or DIFfusion
111 ! soil heat and mass transfer method
112 !
113  CHARACTER(LEN=*), INTENT(IN) :: hsnow_isba
114 ! HSNOW_ISBA = FLAG to use SNOW3L or not
115 ! (or default FR method)
116 !
117  CHARACTER(LEN=*), INTENT(IN) :: hsnowres
118 ! HSNOWRES = ISBA-SNOW3L turbulant exchange option
119 ! 'DEF' = Default: Louis (ISBA: Noilhan and Mahfouf 1996)
120 ! 'RIL' = Limit Richarson number under very stable
121 ! conditions (currently testing)
122 !
123 LOGICAL, INTENT(IN) :: omeb ! True = coupled to MEB. This means surface fluxes ae IMPOSED
124 ! ! as an upper boundary condition to the explicit snow schemes.
125 ! ! If = False, then energy
126 ! ! budget and fluxes are computed herein.
127 !
128 LOGICAL, INTENT(IN) :: oglacier ! True = Over permanent snow and ice,
129 ! initialise WGI=WSAT,
130 ! Hsnow>=10m and allow 0.8<SNOALB<0.85
131 !
132  CHARACTER(LEN=*), INTENT(IN) :: himplicit_wind ! wind implicitation option
133 ! ! 'OLD' = direct
134 ! ! 'NEW' = Taylor serie, order 1
135 !
136 TYPE(date_time), INTENT(IN) :: tptime ! current date and time
137 !
138 !
139 REAL, DIMENSION(:,:), INTENT(IN) :: psoilhcapz, pd_g, pdzg
140 REAL, DIMENSION(:), INTENT(IN) :: pcg, pct, psoilcondz
141 ! PD_G = Depth to bottom of each soil layer (m)
142 ! PDZG = Soil layer thicknesses (m)
143 ! PCG = area-averaged soil heat capacity [(K m2)/J]
144 ! PCT = area-averaged surface heat capacity [(K m2)/J]
145 ! PSOILCONDZ= soil thermal conductivity (W m-1 K-1)
146 ! PSOILHCAPZ= soil heat capacity (J m-3 K-1)
147 !
148 REAL, DIMENSION(:), INTENT(IN) :: pps, pta, psw_rad, pqa, &
149  pvmod, plw_rad, psr, prr
150 ! PSW_RAD = incoming solar radiation (W/m2)
151 ! PLW_RAD = atmospheric infrared radiation (W/m2)
152 ! PRR = rain rate [kg/(m2 s)]
153 ! PSR = snow rate (SWE) [kg/(m2 s)]
154 ! PTA = atmospheric temperature at level za (K)
155 ! PVMOD = modulus of the wind parallel to the orography (m/s)
156 ! PPS = surface pressure
157 ! PQA = atmospheric specific humidity
158 ! at level za
159 !
160 REAL, DIMENSION(:), INTENT(IN) :: pzref, puref, pexns, pexna, pdircoszw, prhoa, pz0nat, pz0eff, pz0hnat, palb, &
161  plvtt, plstt
162 ! PZ0EFF = roughness length for momentum
163 ! PZ0NAT = grid box average roughness length
164 ! PZ0HNAT = grid box average roughness length
165 ! PZREF = reference height of the first
166 ! atmospheric level
167 ! PUREF = reference height of the wind
168 ! PRHOA = air density
169 ! PEXNS = Exner function at surface
170 ! PEXNA = Exner function at lowest atmos level
171 ! PDIRCOSZW = Cosinus of the angle between the
172 ! normal to the surface and the vertical
173 ! PALB = soil/vegetation albedo
174 ! PLVTT = latent heat of vaporization-hydrology (J/kg)
175 ! PLSTT = latent heat of sublimation-hydrology (J/kg)
176 !
177 REAL, DIMENSION(:), INTENT(IN) :: ppsn
178 ! PPSN = Snow cover fraction (total)
179 !
180 REAL, DIMENSION(:), INTENT(IN) :: ppew_a_coef, ppew_b_coef, &
181  ppet_a_coef, ppeq_a_coef, ppet_b_coef, &
182  ppeq_b_coef
183 ! PPEW_A_COEF = wind coefficient
184 ! PPEW_B_COEF = wind coefficient
185 ! PPET_A_COEF = A-air temperature coefficient
186 ! PPET_B_COEF = B-air temperature coefficient
187 ! PPEQ_A_COEF = A-air specific humidity coefficient
188 ! PPEQ_B_COEF = B-air specific humidity coefficient !
189 !
190 REAL, DIMENSION(:,:), INTENT(INOUT) :: ptg
191 ! PTG = Soil temperature profile (K)
192 !
193 REAL, DIMENSION(:), INTENT(INOUT) :: psnowalb
194 ! PSNOWALB = Prognostic surface snow albedo
195 ! (does not include anything but
196 ! the actual snow cover)
197 !
198 REAL, DIMENSION(:,:), INTENT(INOUT) :: psnowheat, psnowrho, psnowswe
199 ! PSNOWHEAT = Snow layer(s) heat content (J/m3)
200 ! PSNOWRHO = Snow layer(s) averaged density (kg/m3)
201 ! PSNOWSWE = Snow layer(s) liquid Water Equivalent (SWE:kg m-2)
202 !
203 !
204 REAL, DIMENSION(:,:), INTENT(INOUT) :: psnowgran1, psnowgran2, psnowhist
205 ! PSNOWGRAN1 = Snow layer(s) grain parameter 1
206 ! PSNOWGRAN2 = Snow layer(s) grain parameter 2
207 ! PSNOWHIST = Snow layer(s) grain historical parameter
208 REAL, DIMENSION(:,:), INTENT(INOUT) :: psnowage ! Snow grain age
209 !
210 !
211 REAL, DIMENSION(:), INTENT(INOUT) :: prnsnow, phsnow, ples3l, plel3l, &
212  phpsnow, pemisnow, pevap, pgrndflux, pswnetsnow, &
213  plwnetsnow, pswnetsnows, pdelheatg, pdelheatg_sfc
214 ! PLEL3L = evaporation heat flux from snow (W/m2)
215 ! PLES3L = sublimation (W/m2)
216 ! PHPSNOW = heat release from rainfall (W/m2)
217 ! PRNSNOW = net radiative flux from snow (W/m2)
218 ! PHSNOW = sensible heat flux from snow (W/m2)
219 ! PEMISNOW = snow surface emissivity
220 ! PEVAP = total evaporative flux from snow (kg/m2/s)
221 ! PGRNDFLUX = soil/snow interface heat flux (W/m2)
222 ! PSWNETSNOW = net shortwave radiation entering top of snowpack (W/m2)
223 ! PSWNETSNOWS = net shortwave radiation in uppermost layer of snowpack (W/m2)
224 ! (for surface energy budget closure diagnostics)
225 ! PLWNETSNOW = net longwave radiation entering top of snowpack (W/m2)
226 ! PDELHEATG = ground heat content change (diagnostic) (W/m2)
227 ! note, modified if ground-snow flux adjusted
228 ! PDELHEATG_SFC = ground heat content change in sfc only (diagnostic) (W/m2)
229 ! note, modified if ground-snow flux adjusted
230 !
231 !
232 REAL, DIMENSION(:), INTENT(OUT) :: pgfluxsnow
233 ! PGFLUXSNOW = net heat flux from snow (W/m2)
234 !
235 REAL, DIMENSION(:), INTENT(INOUT) :: pustarsnow, pcdsnow, pchsnow, pri
236 ! PCDSNOW = drag coefficient for momentum over snow (-)
237 ! PUSTARSNOW = friction velocity over snow (m/s)
238 ! PCHSNOW = drag coefficient for heat over snow (-)
239 ! PRI = Richardson number (-)
240 !
241 REAL, DIMENSION(:), INTENT(OUT) :: pthrufal, pflsn_cor, pevapcor, psnowhmass, pgsfcsnow
242 ! PTHRUFAL = rate that liquid water leaves snow pack:
243 ! paritioned into soil infiltration/runoff
244 ! by ISBA [kg/(m2 s)]
245 ! PFLSN_COR = soil/snow correction heat flux (W/m2) (not MEB)
246 ! PEVAPCOR = evaporation/sublimation correction term:
247 ! extract any evaporation exceeding the
248 ! actual snow cover (as snow vanishes)
249 ! and apply it as a surface soil water
250 ! sink. [kg/(m2 s)]
251 ! PSNOWHMASS = heat content change due to mass
252 ! changes in snowpack (J/m2): for budget
253 ! calculations only.
254 ! PGSFCSNOW = heat flux between the surface and sub-surface
255 ! snow layers (for energy budget diagnostics) (W/m2)
256 !
257 REAL, DIMENSION(:), INTENT(OUT) :: psndrift
258 ! PSNDRIFT = blowing snow sublimation (kg/m2/s)
259 !
260 REAL, DIMENSION(:), INTENT(OUT) :: psrsfc, prrsfc, psnowsfch, pdelheatn, pdelheatn_sfc
261 ! PSRSFC = snow rate on soil/veg surface when SNOW3L in use
262 ! PRRSFC = rain rate on soil/veg surface when SNOW3L in use
263 !
264 REAL, DIMENSION(:,:), INTENT(INOUT) :: psnowtemp
265 REAL, DIMENSION(:,:), INTENT(OUT) :: psnowliq, psnowdz
266 ! PSNOWLIQ = Snow layer(s) liquid water content (m)
267 ! PSNOWTEMP = Snow layer(s) temperature (m)
268 ! PSNOWDZ = Snow layer(s) thickness (m)
269 !
270 REAL, DIMENSION(:), INTENT(OUT) :: pqs
271 ! PQS = surface humidity (kg/kg)
272 !
273 ! ajout_EB pour prendre en compte angle zenithal du soleil dans LRAD
274 ! puis plus tard dans LALB
275 REAL, DIMENSION(:), INTENT(IN) :: pzenith ! solar zenith angle
276 REAL, DIMENSION(:), INTENT(IN) :: plat
277 REAL, DIMENSION(:), INTENT(IN) :: plon
278 !
279 LOGICAL, INTENT(IN) :: osnowdrift, osnowdrift_sublim ! activate snowdrift, sublimation during drift
280 LOGICAL, INTENT(IN) :: osnow_abs_zenith ! activate parametrization of solar absorption for polar regions
281  CHARACTER(3), INTENT(IN) :: hsnowmetamo, hsnowrad
282  !-----------------------
283  ! Crocus metamorphism scheme
284  ! HSNOWMETAMO=B92 Brun et al 1992
285  ! HSNOWMETAMO=C13 Carmagnola et al 2014
286  ! HSNOWMETAMO=T07 Taillandier et al 2007
287  ! HSNOWMETAMO=F06 Flanner et al 2006
288  !-----------------------
289  ! Crocus radiative transfer scheme
290  ! HSNOWMETAMO=B92 Brun et al 1992
291  ! HSNOWMETAMO=TAR TARTES (Libois et al 2013)
292  ! HSNOWMETAMO=TA1 TARTES with constant impurities
293  ! HSNOWMETAMO=TA2 TARTES with constant impurities as function of ageing
294 
295 !* 0.2 declarations of local variables
296 !
297 REAL, PARAMETER :: zcheck_temp = 50.0
298 ! Limit to check suspicious low temperature (K)
299 !
300 INTEGER :: jwrk, jj ! Loop control
301 !
302 INTEGER :: inlvls ! maximum number of snow layers
303 INTEGER :: inlvlg ! number of ground layers
304 !
305 REAL, DIMENSION(SIZE(PTA)) :: zrrsnow, zsoilcond, zsnow, zsnowfall, &
306  zsnowablat_delta, zsnowswe_1d, zsnowd, &
307  zsnowh, zsnowh1, zgrndfluxn, zpsn, &
308  zsoilcor, zsnowswe_out, zthrufal, &
309  zsnow_mass_budget
310 ! ZSOILCOND = soil thermal conductivity [W/(m K)]
311 ! ZRRSNOW = rain rate over snow [kg/(m2 s)]
312 ! ZSNOW = snow depth (m)
313 ! ZSNOWFALL = minimum equivalent snow depth
314 ! for snow falling during the
315 ! current time step (m)
316 ! ZSNOWABLAT_DELTA = FLAG =1 if snow ablates completely
317 ! during current time step, else=0
318 ! ZSNOWSWE_1D = TOTAL snowpack SWE (kg m-2)
319 ! ZSNOWD = snow depth
320 ! ZSNOWH = snow total heat content (J m-2)
321 ! ZSNOWH1 = snow surface layer heat content (J m-2)
322 ! ZGRNDFLUXN = corrected snow-ground flux (if snow fully ablated during timestep)
323 ! ZPSN = snow fraction working array
324 ! ZSOILCOR = for vanishingy thin snow cover,
325 ! allow any excess evaporation
326 ! to be extracted from the soil
327 ! to maintain an accurate water
328 ! balance [kg/(m2 s)]
329 ! ZSNOW_MASS_BUDGET = snow water equivalent budget (kg/m2/s)
330 !
331 !* 0.3 declarations of packed variables
332 !
333 INTEGER :: isize_snow ! number of points where computations are done
334 INTEGER, DIMENSION(SIZE(PTA)) :: nmask ! indices correspondance between arrays
335 !
336 LOGICAL, DIMENSION(SIZE(PTA)) :: lremove_snow
337 !
338 REAL(KIND=JPRB) :: zhook_handle
339 !
340 ! - - ---------------------------------------------------
341 !
342 IF (lhook) CALL dr_hook('SNOW3L_ISBA',0,zhook_handle)
343 !
344 !* 0. Initialize variables:
345 ! ---------------------
346 !
347 pflsn_cor(:) = 0.0
348 pthrufal(:) = 0.0
349 pevapcor(:) = 0.0
350 psndrift(:) = 0.0
351 psnowhmass(:) = 0.0
352 psrsfc(:) = psr(:) ! these are snow and rain rates passed to ISBA,
353 prrsfc(:) = prr(:) ! so initialize here if SNOW3L not used:
354 pqs(:) = xundef
355 !
356 zsnow(:) = 0.0
357 zsnowd(:) = 0.0
358 zgrndfluxn(:) = 0.0
359 zsnowh(:) = 0.0
360 zsnowh1(:) = 0.0
361 zsnowswe_1d(:) = 0.0
362 zsnowswe_out(:)= 0.0
363 zsoilcond(:) = 0.0
364 zrrsnow(:) = 0.0
365 zsnowfall(:) = 0.0
366 zsnowablat_delta(:) = 0.0
367 psnowliq(:,:) = 0.0
368 psnowdz(:,:) = 0.0
369 !
370 inlvls = SIZE(psnowswe(:,:),2)
371 inlvlg = min(SIZE(pd_g(:,:),2),SIZE(ptg(:,:),2))
372 !
373 IF(.NOT.omeb)THEN
374 !
375 ! If MEB activated, these values are input, else initialize here:
376 !
377  pgrndflux(:) = 0.0
378  ples3l(:) = 0.0
379  plel3l(:) = 0.0
380  pevap(:) = 0.0
381  prnsnow(:) = 0.0
382  phsnow(:) = 0.0
383  pgfluxsnow(:) = 0.0
384  phpsnow(:) = 0.0
385  pswnetsnow(:) = 0.0
386  pswnetsnows(:) = 0.0
387  plwnetsnow(:) = 0.0
388  pemisnow(:) = xemissn
389  pustarsnow(:) = 0.0
390  pcdsnow(:) = 0.0
391  pchsnow(:) = 0.0
392  pri(:) = xundef
393 END IF
394 !
395 !
396 ! Use ISBA-SNOW3L or NOT: NOTE that if explicit soil diffusion method in use,
397 ! then *must* use explicit snow model:
398 !
399 IF (hsnow_isba=='3-L' .OR. hisba == 'DIF' .OR. hsnow_isba == 'CRO') THEN
400 !
401 ! - Snow and rain falling onto the 3-L grid space:
402 !
403  psrsfc(:)=0.0
404 !
405  DO jj=1,SIZE(psr)
406  zrrsnow(jj) = ppsn(jj)*prr(jj)
407  prrsfc(jj) = prr(jj) - zrrsnow(jj)
408  zsnowfall(jj) = psr(jj)*ptstep/xrhosmax_es ! maximum possible snowfall depth (m)
409  ENDDO
410 !
411 ! Calculate preliminary snow depth (m)
412 
413  zsnow(:)=0.
414  zsnowh(:)=0.
415  zsnowswe_1d(:)=0.
416  zsnowh1(:) = psnowheat(:,1)*psnowswe(:,1)/psnowrho(:,1) ! sfc layer only
417 !
418  DO jwrk=1,SIZE(psnowswe,2)
419  DO jj=1,SIZE(psnowswe,1)
420  zsnowswe_1d(jj) = zsnowswe_1d(jj) + psnowswe(jj,jwrk)
421  zsnow(jj) = zsnow(jj) + psnowswe(jj,jwrk)/psnowrho(jj,jwrk)
422  zsnowh(jj) = zsnowh(jj) + psnowheat(jj,jwrk)*psnowswe(jj,jwrk)/psnowrho(jj,jwrk)
423  END DO
424  ENDDO
425 !
426  IF(hisba == 'DIF')THEN
427  zsoilcond(:) = psoilcondz(:)
428  ELSE
429 !
430 ! - Soil thermal conductivity
431 ! is implicit in Force-Restore soil method, so it
432 ! must be backed-out of surface thermal coefficients
433 ! (Etchevers and Martin 1997):
434 !
435  zsoilcond(:) = 4.*xpi/( pcg(:)*pcg(:)*xday/(pd_g(:,1)*pct(:)) )
436 !
437  ENDIF
438 !
439 ! ===============================================================
440 ! === Packing: Only call snow model when there is snow on the surface
441 ! exceeding a minimum threshold OR if the equivalent
442 ! snow depth falling during the current time step exceeds
443 ! this limit.
444 !
445 ! counts the number of points where the computations will be made
446 !
447 !
448  isize_snow = 0
449  nmask(:) = 0
450 !
451  DO jj=1,SIZE(zsnow)
452  IF (zsnow(jj) >= xsnowdmin .OR. zsnowfall(jj) >= xsnowdmin) THEN
453  isize_snow = isize_snow + 1
454  nmask(isize_snow) = jj
455  ENDIF
456  ENDDO
457 !
458  IF (isize_snow>0) CALL call_model(isize_snow,inlvls,inlvlg,nmask)
459 !
460 ! ===============================================================
461 !
462 ! Remove trace amounts of snow and reinitialize snow prognostic variables
463 ! if snow cover is ablated.
464 ! If MEB used, soil T already computed, therefore correct heating/cooling
465 ! effect of updated snow-soil flux
466 !
467  zsnowd(:) = 0.
468  zsnowswe_out(:) = 0.
469  DO jwrk=1,SIZE(psnowswe,2)
470  DO jj=1,SIZE(psnowswe,1)
471  zsnowd(jj) = zsnowd(jj) + psnowswe(jj,jwrk)/psnowrho(jj,jwrk)
472  zsnowswe_out(jj) = zsnowswe_out(jj) + psnowswe(jj,jwrk)
473  ENDDO
474  END DO
475 !
476  lremove_snow(:)=(zsnowd(:)<xsnowdmin*1.1)
477 !
478 !
479  IF(omeb)THEN
480  zpsn(:)=1.0
481  ELSE
482 ! To Conserve mass in ISBA without MEB,
483 ! EVAP must be weignted by the snow fraction
484 ! in the calulation of THRUFAL
485  zpsn(:)=ppsn(:)
486  ENDIF
487 !
488  zsnowablat_delta(:) = 0.0
489  zthrufal(:) = pthrufal(:)
490 !
491  WHERE(lremove_snow(:))
492  zsnowswe_out(:) = 0.0
493  ples3l(:) = min(ples3l(:), xlstt*(zsnowswe_1d(:)/ptstep + psr(:)))
494  plel3l(:) = 0.0
495  pevap(:) = ples3l(:)/plstt(:)
496  pthrufal(:) = max(0.0, zsnowswe_1d(:)/ptstep + psr(:) - pevap(:)*zpsn(:) + zrrsnow(:)) ! kg m-2 s-1
497  zthrufal(:) = max(0.0, zsnowswe_1d(:)/ptstep + psr(:) - pevap(:) + zrrsnow(:)) ! kg m-2 s-1
498  psrsfc(:) = 0.0
499  prrsfc(:) = prrsfc(:)
500  zsnowablat_delta(:) = 1.0
501  psnowalb(:) = xundef
502  pevapcor(:) = 0.0
503  zsoilcor(:) = 0.0
504  pgfluxsnow(:) = prnsnow(:) - phsnow(:) - ples3l(:) - plel3l(:)
505  psnowhmass(:) = -psr(:)*(xlmtt*ptstep)
506  pgsfcsnow(:) = 0.0
507  pdelheatn(:) = -zsnowh(:) /ptstep
508  pdelheatn_sfc(:) = -zsnowh1(:)/ptstep
509  psnowsfch(:) = pdelheatn_sfc(:) - (pswnetsnows(:) + plwnetsnow(:) &
510  - phsnow(:) - ples3l(:) - plel3l(:)) + pgsfcsnow(:) &
511  - psnowhmass(:)/ptstep
512  zgrndfluxn(:) = (zsnowh(:)+psnowhmass(:))/ptstep + pgfluxsnow(:)
513  ptg(:,1) = ptg(:,1) + ptstep*pct(:)*zpsn(:)*(zgrndfluxn(:) - pgrndflux(:) - pflsn_cor(:))
514  pdelheatg(:) = pdelheatg(:) + zpsn(:)*(zgrndfluxn(:) - pgrndflux(:) - pflsn_cor(:))
515  pdelheatg_sfc(:) = pdelheatg_sfc(:) + zpsn(:)*(zgrndfluxn(:) - pgrndflux(:) - pflsn_cor(:))
516  pgrndflux(:) = zgrndfluxn(:)
517  pflsn_cor(:) = 0.0
518  END WHERE
519 !
520 !
521  DO jwrk=1,inlvls
522  DO jj=1,SIZE(psnowswe,1)
523  psnowswe(jj,jwrk) = (1.0-zsnowablat_delta(jj))*psnowswe(jj,jwrk)
524  psnowheat(jj,jwrk) = (1.0-zsnowablat_delta(jj))*psnowheat(jj,jwrk)
525  psnowrho(jj,jwrk) = (1.0-zsnowablat_delta(jj))*psnowrho(jj,jwrk) + &
526  zsnowablat_delta(jj)*xrhosmin_es
527  psnowtemp(jj,jwrk) = (1.0-zsnowablat_delta(jj))*psnowtemp(jj,jwrk) + &
528  zsnowablat_delta(jj)*xtt
529  psnowliq(jj,jwrk) = (1.0-zsnowablat_delta(jj))*psnowliq(jj,jwrk)
530  psnowdz(jj,jwrk) = (1.0-zsnowablat_delta(jj))*psnowdz(jj,jwrk)
531  psnowage(jj,jwrk) = (1.0-zsnowablat_delta(jj))*psnowage(jj,jwrk)
532  ENDDO
533  ENDDO
534 !
535  IF (hsnow_isba=='CRO') THEN
536  DO jwrk=1,inlvls
537  DO jj=1,SIZE(psnowgran1,1)
538  psnowgran1(jj,jwrk) = (1.0-zsnowablat_delta(jj))*psnowgran1(jj,jwrk)
539  psnowgran2(jj,jwrk) = (1.0-zsnowablat_delta(jj))*psnowgran2(jj,jwrk)
540  psnowhist(jj,jwrk) = (1.0-zsnowablat_delta(jj))*psnowhist(jj,jwrk)
541  ENDDO
542  ENDDO
543  ENDIF
544 !
545 ! ===============================================================
546 !
547 ! Compute snow mass budget
548 !
549  zsnow_mass_budget(:) = (zsnowswe_1d(:)-zsnowswe_out(:))/ptstep + psr(:)+zrrsnow(:) &
550  - pevap(:)-zthrufal(:) &
551  + pevapcor(:)+zsoilcor(:)
552 !
553 !
554 ! ===============================================================
555 !
556 ! To Conserve mass in ISBA, the latent heat flux part of
557 ! the EVAPCOR term must be weignted by the snow fraction
558 !
559  pevapcor(:) = pevapcor(:)*zpsn(:) + zsoilcor(:)
560 !
561 ! ===============================================================
562 !
563 ! check suspicious low temperature
564 !
565  DO jwrk=1,inlvls
566  DO jj=1,SIZE(psnowswe,1)
567  IF(psnowswe(jj,jwrk)>0.0.AND.psnowtemp(jj,jwrk)<zcheck_temp)THEN
568  WRITE(*,*) 'Suspicious low temperature :',psnowtemp(jj,jwrk)
569  WRITE(*,*) 'At point and location :',jj,'LAT=',plat(jj),'LON=',plon(jj)
570  WRITE(*,*) 'At snow level / total layer:',jwrk,'/',inlvls
571  WRITE(*,*) 'SNOW MASS BUDGET (kg/m2/s) :',zsnow_mass_budget(jj)
572  WRITE(*,*) 'SWE BY LAYER (kg/m2) :',psnowswe(jj,1:inlvls)
573  WRITE(*,*) 'DEPTH BY LAYER (m) :',psnowdz(jj,1:inlvls)
574  WRITE(*,*) 'DENSITY BY LAYER (kg/m3) :',psnowrho(jj,1:inlvls)
575  WRITE(*,*) 'TEMPERATURE BY LAYER (K) :',psnowtemp(jj,1:inlvls)
576  CALL abor1_sfx('SNOW3L_ISBA: Suspicious low temperature')
577  ENDIF
578  ENDDO
579  ENDDO
580 !
581 ! ===============================================================
582 !
583 ENDIF
584 !
585 IF (lhook) CALL dr_hook('SNOW3L_ISBA',1,zhook_handle)
586 !
587  CONTAINS
588 !
589 !================================================================
590 SUBROUTINE call_model(KSIZE1,KSIZE2,KSIZE3,KMASK)
591 !
592 IMPLICIT NONE
593 !
594 INTEGER, INTENT(IN) :: ksize1
595 INTEGER, INTENT(IN) :: ksize2
596 INTEGER, INTENT(IN) :: ksize3
597 INTEGER, DIMENSION(:), INTENT(IN) :: kmask
598 !
599 REAL, DIMENSION(KSIZE1,KSIZE2) :: zp_snowswe
600 REAL, DIMENSION(KSIZE1,KSIZE2) :: zp_snowdz
601 REAL, DIMENSION(KSIZE1,KSIZE2) :: zp_snowrho
602 REAL, DIMENSION(KSIZE1,KSIZE2) :: zp_snowheat
603 REAL, DIMENSION(KSIZE1,KSIZE2) :: zp_snowtemp
604 REAL, DIMENSION(KSIZE1,KSIZE2) :: zp_snowliq
605 REAL, DIMENSION(KSIZE1,KSIZE2) :: zp_snowgran1
606 REAL, DIMENSION(KSIZE1,KSIZE2) :: zp_snowgran2
607 REAL, DIMENSION(KSIZE1,KSIZE2) :: zp_snowhist
608 REAL, DIMENSION(KSIZE1,KSIZE2) :: zp_snowage
609 REAL, DIMENSION(KSIZE1) :: zp_snowalb
610 REAL, DIMENSION(KSIZE1) :: zp_swnetsnow
611 REAL, DIMENSION(KSIZE1) :: zp_swnetsnows
612 REAL, DIMENSION(KSIZE1) :: zp_lwnetsnow
613 REAL, DIMENSION(KSIZE1) :: zp_ps
614 REAL, DIMENSION(KSIZE1) :: zp_srsnow
615 REAL, DIMENSION(KSIZE1) :: zp_rrsnow
616 REAL, DIMENSION(KSIZE1) :: zp_psn3l
617 REAL, DIMENSION(KSIZE1) :: zp_ta
618 REAL, DIMENSION(KSIZE1) :: zp_ct
619 REAL, DIMENSION(KSIZE1,KSIZE3) :: zp_tg
620 REAL, DIMENSION(KSIZE1,KSIZE3) :: zp_d_g
621 REAL, DIMENSION(KSIZE1,KSIZE3) :: zp_dzg
622 REAL, DIMENSION(KSIZE1,KSIZE3) :: zp_soilhcapz
623 REAL, DIMENSION(KSIZE1) :: zp_soild
624 REAL, DIMENSION(KSIZE1) :: zp_delheatg
625 REAL, DIMENSION(KSIZE1) :: zp_delheatg_sfc
626 REAL, DIMENSION(KSIZE1) :: zp_sw_rad
627 REAL, DIMENSION(KSIZE1) :: zp_qa
628 REAL, DIMENSION(KSIZE1) :: zp_lvtt
629 REAL, DIMENSION(KSIZE1) :: zp_lstt
630 REAL, DIMENSION(KSIZE1) :: zp_vmod
631 REAL, DIMENSION(KSIZE1) :: zp_lw_rad
632 REAL, DIMENSION(KSIZE1) :: zp_rhoa
633 REAL, DIMENSION(KSIZE1) :: zp_uref
634 REAL, DIMENSION(KSIZE1) :: zp_exns
635 REAL, DIMENSION(KSIZE1) :: zp_exna
636 REAL, DIMENSION(KSIZE1) :: zp_dircoszw
637 REAL, DIMENSION(KSIZE1) :: zp_zref
638 REAL, DIMENSION(KSIZE1) :: zp_z0nat
639 REAL, DIMENSION(KSIZE1) :: zp_z0hnat
640 REAL, DIMENSION(KSIZE1) :: zp_z0eff
641 REAL, DIMENSION(KSIZE1) :: zp_alb
642 REAL, DIMENSION(KSIZE1) :: zp_soilcond
643 REAL, DIMENSION(KSIZE1) :: zp_thrufal
644 REAL, DIMENSION(KSIZE1) :: zp_grndflux
645 REAL, DIMENSION(KSIZE1) :: zp_flsn_cor
646 REAL, DIMENSION(KSIZE1) :: zp_gsfcsnow
647 REAL, DIMENSION(KSIZE1) :: zp_evapcor
648 REAL, DIMENSION(KSIZE1) :: zp_soilcor
649 REAL, DIMENSION(KSIZE1) :: zp_gflxcor
650 REAL, DIMENSION(KSIZE1) :: zp_rnsnow
651 REAL, DIMENSION(KSIZE1) :: zp_hsnow
652 REAL, DIMENSION(KSIZE1) :: zp_gfluxsnow
653 REAL, DIMENSION(KSIZE1) :: zp_delheatn
654 REAL, DIMENSION(KSIZE1) :: zp_delheatn_sfc
655 REAL, DIMENSION(KSIZE1) :: zp_snowsfch
656 REAL, DIMENSION(KSIZE1) :: zp_hpsnow
657 REAL, DIMENSION(KSIZE1) :: zp_les3l
658 REAL, DIMENSION(KSIZE1) :: zp_lel3l
659 REAL, DIMENSION(KSIZE1) :: zp_evap
660 REAL, DIMENSION(KSIZE1) :: zp_sndrift
661 REAL, DIMENSION(KSIZE1) :: zp_ri
662 REAL, DIMENSION(KSIZE1) :: zp_qs
663 REAL, DIMENSION(KSIZE1) :: zp_emisnow
664 REAL, DIMENSION(KSIZE1) :: zp_cdsnow
665 REAL, DIMENSION(KSIZE1) :: zp_ustarsnow
666 REAL, DIMENSION(KSIZE1) :: zp_chsnow
667 REAL, DIMENSION(KSIZE1) :: zp_snowhmass
668 REAL, DIMENSION(KSIZE1) :: zp_vegtype
669 REAL, DIMENSION(KSIZE1) :: zp_forest
670 REAL, DIMENSION(KSIZE1) :: zp_pew_a_coef
671 REAL, DIMENSION(KSIZE1) :: zp_pew_b_coef
672 REAL, DIMENSION(KSIZE1) :: zp_pet_a_coef
673 REAL, DIMENSION(KSIZE1) :: zp_pet_b_coef
674 REAL, DIMENSION(KSIZE1) :: zp_peq_a_coef
675 REAL, DIMENSION(KSIZE1) :: zp_peq_b_coef
676 REAL, DIMENSION(KSIZE1) :: zp_zenith
677 REAL, DIMENSION(KSIZE1) :: zp_lat,zp_lon
678 REAL, DIMENSION(KSIZE1) :: zp_psn_inv
679 REAL, DIMENSION(KSIZE1) :: zp_psn
680 REAL, DIMENSION(KSIZE1) :: zp_psn_gflxcor
681 REAL, DIMENSION(KSIZE1) :: zp_work
682 !
683 REAL, PARAMETER :: zdepthabs = 0.60 ! m
684 !
685 INTEGER :: jwrk, jj, ji
686 REAL(KIND=JPRB) :: zhook_handle
687 !
688 IF (lhook) CALL dr_hook('SNOW3L_ISBA:CALL_MODEL',0,zhook_handle)
689 !
690 ! Initialize:
691 !
692 zp_psn_gflxcor(:) = 0.
693 zp_work(:) = 0.
694 zp_soild(:) = 0.
695 !
696 ! pack the variables
697 !
698 DO jwrk=1,ksize2
699  DO jj=1,ksize1
700  ji = kmask(jj)
701  zp_snowswe(jj,jwrk) = psnowswe(ji,jwrk)
702  zp_snowrho(jj,jwrk) = psnowrho(ji,jwrk)
703  zp_snowheat(jj,jwrk) = psnowheat(ji,jwrk)
704  zp_snowtemp(jj,jwrk) = psnowtemp(ji,jwrk)
705  zp_snowliq(jj,jwrk) = psnowliq(ji,jwrk)
706  zp_snowdz(jj,jwrk) = psnowdz(ji,jwrk)
707  zp_snowage(jj,jwrk) = psnowage(ji,jwrk)
708  ENDDO
709 ENDDO
710 !
711 IF (hsnow_isba=='CRO') THEN
712  DO jwrk=1,ksize2
713  DO jj=1,ksize1
714  ji = kmask(jj)
715  zp_snowgran1(jj,jwrk) = psnowgran1(ji,jwrk)
716  zp_snowgran2(jj,jwrk) = psnowgran2(ji,jwrk)
717  zp_snowhist(jj,jwrk) = psnowhist(ji,jwrk)
718  ENDDO
719  ENDDO
720 ELSE
721  DO jwrk=1,ksize2
722  DO jj=1,ksize1
723  zp_snowgran1(jj,jwrk) = xundef
724  zp_snowgran2(jj,jwrk) = xundef
725  zp_snowhist(jj,jwrk) = xundef
726  ENDDO
727  ENDDO
728 ENDIF
729 !
730 DO jwrk=1,ksize3
731  DO jj=1,ksize1
732  ji = kmask(jj)
733  zp_tg(jj,jwrk) = ptg(ji,jwrk)
734  zp_d_g(jj,jwrk) = pd_g(ji,jwrk)
735  zp_soilhcapz(jj,jwrk) = psoilhcapz(ji,jwrk)
736  ENDDO
737 ENDDO
738 !
739 IF (omeb) THEN
740  DO jwrk=1,ksize3
741  DO jj=1,ksize1
742  ji = kmask(jj)
743  zp_dzg(jj,jwrk) = pdzg(ji,jwrk)
744  ENDDO
745  ENDDO
746 ENDIF
747 !
748 DO jj=1,ksize1
749  ji = kmask(jj)
750  zp_snowalb(jj) = psnowalb(ji)
751  zp_ps(jj) = pps(ji)
752  zp_srsnow(jj) = psr(ji)
753  zp_rrsnow(jj) = zrrsnow(ji)
754  zp_psn3l(jj) = ppsn(ji)
755  zp_ct(jj) = pct(ji)
756  zp_ta(jj) = pta(ji)
757  zp_delheatg(jj) = pdelheatg(ji)
758  zp_delheatg_sfc(jj) = pdelheatg_sfc(ji)
759  zp_sw_rad(jj) = psw_rad(ji)
760  zp_qa(jj) = pqa(ji)
761  zp_vmod(jj) = pvmod(ji)
762  zp_lw_rad(jj) = plw_rad(ji)
763  zp_rhoa(jj) = prhoa(ji)
764  zp_uref(jj) = puref(ji)
765  zp_exns(jj) = pexns(ji)
766  zp_exna(jj) = pexna(ji)
767  zp_lvtt(jj) = plvtt(ji)
768  zp_lstt(jj) = plstt(ji)
769  zp_dircoszw(jj) = pdircoszw(ji)
770  zp_zref(jj) = pzref(ji)
771  zp_z0nat(jj) = pz0nat(ji)
772  zp_z0hnat(jj) = pz0hnat(ji)
773  zp_z0eff(jj) = pz0eff(ji)
774  zp_alb(jj) = palb(ji)
775  zp_soilcond(jj) = zsoilcond(ji)
776  !
777  zp_pew_a_coef(jj) = ppew_a_coef(ji)
778  zp_pew_b_coef(jj) = ppew_b_coef(ji)
779  zp_pet_a_coef(jj) = ppet_a_coef(ji)
780  zp_peq_a_coef(jj) = ppeq_a_coef(ji)
781  zp_pet_b_coef(jj) = ppet_b_coef(ji)
782  zp_peq_b_coef(jj) = ppeq_b_coef(ji)
783  !
784  zp_lat(jj) = plat(ji)
785  zp_lon(jj) = plon(ji)
786  zp_zenith(jj) = pzenith(ji)
787 !
788  zp_grndflux(jj) = pgrndflux(ji)
789  zp_rnsnow(jj) = prnsnow(ji)
790  zp_hsnow(jj) = phsnow(ji)
791  zp_delheatn(jj) = pdelheatn(ji)
792  zp_delheatn_sfc(jj) = pdelheatn_sfc(ji)
793  zp_snowsfch(jj) = psnowsfch(ji)
794  zp_hpsnow(jj) = phpsnow(ji)
795  zp_les3l(jj) = ples3l(ji)
796  zp_lel3l(jj) = plel3l(ji)
797  zp_evap(jj) = pevap(ji)
798  zp_emisnow(jj) = pemisnow(ji)
799  zp_swnetsnow(jj) = pswnetsnow(ji)
800  zp_swnetsnows(jj) = pswnetsnows(ji)
801  zp_lwnetsnow(jj) = plwnetsnow(ji)
802 ENDDO
803 !
804 DO jj=1,ksize1
805  ji = kmask(jj)
806  zp_vegtype(jj) = pvegtype(ji,nvt_snow)
807  zp_forest(jj) = pvegtype(ji,nvt_tebd) + pvegtype(ji,nvt_trbe) + pvegtype(ji,nvt_bone) &
808  + pvegtype(ji,nvt_trbd) + pvegtype(ji,nvt_tebe) + pvegtype(ji,nvt_tene) &
809  + pvegtype(ji,nvt_bobd) + pvegtype(ji,nvt_bond) + pvegtype(ji,nvt_shrb)
810 ENDDO
811 !
812 !
813 ! ===============================================================
814 ! conversion of snow heat from J/m3 into J/m2
815 WHERE(zp_snowswe(:,:)>0.) &
816  zp_snowheat(:,:) = zp_snowheat(:,:) / zp_snowrho(:,:) * zp_snowswe(:,:)
817 ! ===============================================================
818 !
819 zp_psn_inv(:) = 0.0
820 zp_psn(:) = zp_psn3l(:)
821 !
822 IF(omeb)THEN
823 !
824 ! MEB (case of imposed surface fluxes)
825 ! - Prepare inputs for explicit snow scheme(s):
826 ! If using MEB, these are INPUTs ONLY:
827 ! divide fluxes by snow fraction to make "snow-relative"
828 !
829  zp_psn(:) = max(1.e-4, zp_psn3l(:))
830  zp_psn_inv(:) = 1.0/zp_psn(:)
831 !
832  zp_rnsnow(:) = zp_rnsnow(:) *zp_psn_inv(:)
833  zp_swnetsnow(:) = zp_swnetsnow(:) *zp_psn_inv(:)
834  zp_swnetsnows(:) = zp_swnetsnows(:) *zp_psn_inv(:)
835  zp_lwnetsnow(:) = zp_lwnetsnow(:) *zp_psn_inv(:)
836  zp_hsnow(:) = zp_hsnow(:) *zp_psn_inv(:)
837  zp_gfluxsnow(:) = zp_gfluxsnow(:) *zp_psn_inv(:)
838  zp_gsfcsnow(:) = zp_gsfcsnow(:) *zp_psn_inv(:)
839  zp_snowhmass(:) = zp_snowhmass(:) *zp_psn_inv(:)
840  zp_les3l(:) = zp_les3l(:) *zp_psn_inv(:)
841  zp_lel3l(:) = zp_lel3l(:) *zp_psn_inv(:)
842  zp_grndflux(:) = zp_grndflux(:) *zp_psn_inv(:)
843  zp_evap(:) = zp_evap(:) *zp_psn_inv(:)
844  zp_hpsnow(:) = zp_hpsnow(:) *zp_psn_inv(:)
845  zp_delheatn(:) = zp_delheatn(:) *zp_psn_inv(:)
846  zp_delheatn_sfc(:)= zp_delheatn_sfc(:)*zp_psn_inv(:)
847  zp_snowsfch(:) = zp_snowsfch(:) *zp_psn_inv(:)
848 
849  zp_srsnow(:) = zp_srsnow(:) *zp_psn_inv(:)
850  zp_rrsnow(:) = zp_rrsnow(:) *zp_psn_inv(:)
851 
852  DO jj=1,ksize2
853  DO ji=1,ksize1
854  zp_snowswe(ji,jj) = zp_snowswe(ji,jj) *zp_psn_inv(ji)
855  zp_snowheat(ji,jj) = zp_snowheat(ji,jj)*zp_psn_inv(ji)
856  zp_snowdz(ji,jj) = zp_snowdz(ji,jj) *zp_psn_inv(ji)
857  ENDDO
858  ENDDO
859  !
860 ENDIF
861 !
862 ! Call ISBA-SNOW3L model:
863 !
864 IF (hsnow_isba=='CRO') THEN
865 
866  CALL snowcro(hsnowres, tptime, oglacier, himplicit_wind, &
867  zp_pew_a_coef, zp_pew_b_coef, &
868  zp_pet_a_coef, zp_peq_a_coef, zp_pet_b_coef, zp_peq_b_coef, &
869  zp_snowswe,zp_snowrho, zp_snowheat, zp_snowalb, &
870  zp_snowgran1, zp_snowgran2, zp_snowhist, zp_snowage, ptstep, &
871  zp_ps, zp_srsnow, zp_rrsnow ,zp_psn3l, zp_ta, zp_tg(:,1), &
872  zp_sw_rad, zp_qa, zp_vmod, zp_lw_rad, zp_rhoa, zp_uref, &
873  zp_exns, zp_exna, zp_dircoszw, zp_zref, zp_z0nat, zp_z0eff, &
874  zp_z0hnat, zp_alb, zp_soilcond, zp_d_g(:,1), zp_snowliq, &
875  zp_snowtemp, zp_snowdz, zp_thrufal, zp_grndflux, zp_evapcor, &
876  zp_rnsnow, zp_hsnow, zp_gfluxsnow, zp_hpsnow, zp_les3l, &
877  zp_lel3l, zp_evap, zp_sndrift, zp_ri, &
878  zp_emisnow, zp_cdsnow, zp_ustarsnow, &
879  zp_chsnow, zp_snowhmass, zp_qs, zp_vegtype, zp_zenith, &
880  zp_lat, zp_lon, osnowdrift,osnowdrift_sublim, &
881  osnow_abs_zenith, hsnowmetamo,hsnowrad )
882 !
883  zp_gflxcor(:) = 0.0
884  zp_flsn_cor(:) = 0.0
885  zp_soilcor(:) = 0.0
886 !
887 ELSE
888 !
889  CALL snow3l(hsnowres, tptime, omeb, himplicit_wind, &
890  zp_pew_a_coef, zp_pew_b_coef, &
891  zp_pet_a_coef, zp_peq_a_coef,zp_pet_b_coef, zp_peq_b_coef, &
892  zp_snowswe, zp_snowrho, zp_snowheat, zp_snowalb, &
893  zp_snowgran1, zp_snowgran2, zp_snowhist, zp_snowage, ptstep, &
894  zp_ps, zp_srsnow, zp_rrsnow, zp_psn3l, zp_ta, zp_tg(:,1), &
895  zp_sw_rad, zp_qa, zp_vmod, zp_lw_rad, zp_rhoa, zp_uref, &
896  zp_exns, zp_exna, zp_dircoszw, zp_zref, zp_z0nat, zp_z0eff, &
897  zp_z0hnat, zp_alb, zp_soilcond, zp_d_g(:,1), &
898  zp_lvtt, zp_lstt, zp_snowliq, &
899  zp_snowtemp, zp_snowdz, zp_thrufal, zp_grndflux , &
900  zp_evapcor, zp_soilcor, zp_gflxcor, zp_snowsfch, &
901  zp_delheatn, zp_delheatn_sfc, &
902  zp_swnetsnow, zp_swnetsnows, zp_lwnetsnow, zp_gsfcsnow, &
903  zp_rnsnow, zp_hsnow, zp_gfluxsnow, zp_hpsnow, zp_les3l, &
904  zp_lel3l, zp_evap, zp_sndrift, zp_ri, &
905  zp_emisnow, zp_cdsnow, zp_ustarsnow, &
906  zp_chsnow, zp_snowhmass, zp_qs, zp_vegtype, zp_forest, &
907  zp_zenith, zp_lat, zp_lon, osnowdrift, osnowdrift_sublim )
908 !
909  IF(omeb)THEN
910 !
911 ! - reverse transform: back to surface-relative
912 !
913  zp_rnsnow(:) = zp_rnsnow(:) /zp_psn_inv(:)
914  zp_swnetsnow(:) = zp_swnetsnow(:) /zp_psn_inv(:)
915  zp_swnetsnows(:) = zp_swnetsnows(:) /zp_psn_inv(:)
916  zp_lwnetsnow(:) = zp_lwnetsnow(:) /zp_psn_inv(:)
917  zp_hsnow(:) = zp_hsnow(:) /zp_psn_inv(:)
918  zp_les3l(:) = zp_les3l(:) /zp_psn_inv(:)
919  zp_lel3l(:) = zp_lel3l(:) /zp_psn_inv(:)
920  zp_grndflux(:) = zp_grndflux(:) /zp_psn_inv(:)
921  zp_evap(:) = zp_evap(:) /zp_psn_inv(:)
922  zp_hpsnow(:) = zp_hpsnow(:) /zp_psn_inv(:)
923  zp_gfluxsnow(:) = zp_gfluxsnow(:) /zp_psn_inv(:)
924  zp_delheatn(:) = zp_delheatn(:) /zp_psn_inv(:)
925  zp_delheatn_sfc(:)= zp_delheatn_sfc(:)/zp_psn_inv(:)
926  zp_snowsfch(:) = zp_snowsfch(:) /zp_psn_inv(:)
927  zp_gsfcsnow(:) = zp_gsfcsnow(:) /zp_psn_inv(:)
928 
929  zp_srsnow(:) = zp_srsnow(:) /zp_psn_inv(:)
930  zp_rrsnow(:) = zp_rrsnow(:) /zp_psn_inv(:)
931  DO jj=1,ksize2
932  DO ji=1,ksize1
933  zp_snowswe(ji,jj) = zp_snowswe(ji,jj) /zp_psn_inv(ji)
934  zp_snowheat(ji,jj) = zp_snowheat(ji,jj)/zp_psn_inv(ji)
935  zp_snowdz(ji,jj) = zp_snowdz(ji,jj) /zp_psn_inv(ji)
936  ENDDO
937  ENDDO
938 
939  zp_snowhmass(:) = zp_snowhmass(:)/zp_psn_inv(:)
940  zp_thrufal(:) = zp_thrufal(:) /zp_psn_inv(:)
941 !
942 ! Final Adjustments:
943 ! ------------------
944 ! Add cooling/heating flux correction to underlying soil.
945 ! This term is usually active for vanishingly thin snowpacks..
946 ! it is put outside of the snow scheme owing to it's dependence on
947 ! snow fraction. It is related to a possible correction to the ground-snow
948 ! heat flux when it is imposed (using MEB).
949 ! Also, it is added as a heat sink/source here since
950 ! fluxes have already be computed and should not be adjusted at this point:
951 ! applying it to the soil has the same impact as soil freeze-thaw, in the
952 ! sense it is computed after the fluxes have been updated.
953 ! (and update heat storage diagnostic in a consistent manner)
954 !
955 ! Energy is thickness weighted, thus thicker layers receive more energy and energy
956 ! is evenly distributed to depth ZDEPTHABS. An
957 ! alternate method is to weight near surface layers more and diminish weights
958 ! (thus eenrgy received by each layer) with depth. Both methods conserve energy as
959 ! long as vertical weights are normalized.
960 
961 ! i) Determine soil depth for energy absorption:
962 
963  zp_soild(:) = zp_dzg(:,1)
964  DO jj=2,ksize3
965  DO ji=1,ksize1
966  IF(zp_dzg(ji,jj) <= zdepthabs)THEN
967  zp_soild(ji) = zp_dzg(ji,jj)
968  ENDIF
969  ENDDO
970  ENDDO
971 
972 ! ii) Distribute (possible) energy to absorb vertically over some layer (defined above):
973 
974  zp_psn_gflxcor(:) = zp_psn(:)*zp_gflxcor(:) ! (W/m2)
975  zp_work(:) = zp_psn_gflxcor(:)*ptstep/zp_soild(:)
976 
977  zp_tg(:,1) = zp_tg(:,1) + zp_work(:)*zp_ct(:)*zp_d_g(:,1) ! (K)
978  DO jj=2,ksize3
979  DO ji=1,ksize1
980  IF(zp_soild(ji) <= zdepthabs)THEN
981  zp_tg(ji,jj) = zp_tg(ji,jj) + zp_work(ji)/zp_soilhcapz(ji,jj) ! K
982  ENDIF
983  ENDDO
984  ENDDO
985 
986  zp_delheatg(:) = zp_delheatg(:) + zp_psn_gflxcor(:) ! (W/m2)
987  zp_delheatg_sfc(:) = zp_delheatg_sfc(:) + zp_psn_gflxcor(:) ! (W/m2)
988 !
989  zp_flsn_cor(:) = 0.0
990 !
991  ELSE
992 !
993 ! To conserve energy in ISBA, the correction flux must be distributed at least
994 ! over the first 60cm depth. This method prevent numerical oscillations
995 ! especially when explicit snow vanishes. Final Adjustments are done in ISBA_CEB
996 !
997  zp_flsn_cor(:) = zp_gflxcor(:) ! (W/m2)
998 !
999  ENDIF
1000 !
1001 ENDIF
1002 !
1003 !===============================================================
1004 !conversion of snow heat from J/m2 into J/m3
1005 WHERE(zp_snowswe(:,:)>0.)
1006  zp_snowheat(:,:)=zp_snowheat(:,:)*zp_snowrho(:,:)/zp_snowswe(:,:)
1007 ENDWHERE
1008 !===============================================================
1009 !
1010 ! === Packing:
1011 !
1012 ! unpack variables
1013 !
1014 DO jwrk=1,ksize2
1015  DO jj=1,ksize1
1016  ji = kmask(jj)
1017  psnowswe(ji,jwrk) = zp_snowswe(jj,jwrk)
1018  psnowrho(ji,jwrk) = zp_snowrho(jj,jwrk)
1019  psnowheat(ji,jwrk) = zp_snowheat(jj,jwrk)
1020  psnowtemp(ji,jwrk) = zp_snowtemp(jj,jwrk)
1021  psnowliq(ji,jwrk) = zp_snowliq(jj,jwrk)
1022  psnowdz(ji,jwrk) = zp_snowdz(jj,jwrk)
1023  psnowage(ji,jwrk) = zp_snowage(jj,jwrk)
1024  ENDDO
1025 ENDDO
1026 !
1027 IF (hsnow_isba=='CRO') THEN
1028  DO jwrk=1,ksize2
1029  DO jj=1,ksize1
1030  ji = kmask(jj)
1031  psnowgran1(ji,jwrk) = zp_snowgran1(jj,jwrk)
1032  psnowgran2(ji,jwrk) = zp_snowgran2(jj,jwrk)
1033  psnowhist(ji,jwrk) = zp_snowhist(jj,jwrk)
1034  ENDDO
1035  ENDDO
1036 ENDIF
1037 !
1038 DO jwrk=1,ksize3
1039  DO jj=1,ksize1
1040  ji = kmask(jj)
1041  ptg(ji,jwrk)= zp_tg(jj,jwrk)
1042  ENDDO
1043 ENDDO
1044 !
1045 DO jj=1,ksize1
1046  ji = kmask(jj)
1047  pdelheatg(ji) = zp_delheatg(jj)
1048  pdelheatg_sfc(ji) = zp_delheatg_sfc(jj)
1049  psnowalb(ji) = zp_snowalb(jj)
1050  pthrufal(ji) = zp_thrufal(jj)
1051  pevapcor(ji) = zp_evapcor(jj)
1052  zsoilcor(ji) = zp_soilcor(jj)
1053  pri(ji) = zp_ri(jj)
1054  pqs(ji) = zp_qs(jj)
1055  pcdsnow(ji) = zp_cdsnow(jj)
1056  pustarsnow(ji) = zp_ustarsnow(jj)
1057  pchsnow(ji) = zp_chsnow(jj)
1058  psnowhmass(ji) = zp_snowhmass(jj)
1059  pgrndflux(ji) = zp_grndflux(jj)
1060  pflsn_cor(ji) = zp_flsn_cor(jj)
1061  prnsnow(ji) = zp_rnsnow(jj)
1062  phsnow(ji) = zp_hsnow(jj)
1063  pgfluxsnow(ji) = zp_gfluxsnow(jj)
1064  pdelheatn(ji) = zp_delheatn(jj)
1065  pdelheatn_sfc(ji) = zp_delheatn_sfc(jj)
1066  psnowsfch(ji) = zp_snowsfch(jj)
1067  pgsfcsnow(ji) = zp_gsfcsnow(jj)
1068  phpsnow(ji) = zp_hpsnow(jj)
1069  ples3l(ji) = zp_les3l(jj)
1070  plel3l(ji) = zp_lel3l(jj)
1071  pevap(ji) = zp_evap(jj)
1072  pemisnow(ji) = zp_emisnow(jj)
1073  pswnetsnow(ji) = zp_swnetsnow(jj)
1074  pswnetsnows(ji) = zp_swnetsnows(jj)
1075  plwnetsnow(ji) = zp_lwnetsnow(jj)
1076 ENDDO
1077 !
1078 IF (lhook) CALL dr_hook('SNOW3L_ISBA:CALL_MODEL',1,zhook_handle)
1079 !
1080 END SUBROUTINE call_model
1081 !
1082 END SUBROUTINE snow3l_isba
subroutine snowcro(HSNOWRES, TPTIME, OGLACIER, HIMPLICIT_WIND, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PSNOWSWE, PSNOWRHO, PSNOWHEAT, PSNOWALB, PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, PSNOWAGE, PTSTEP, PPS, PSR, PRR, PPSN3L, PTA, PTG, PSW_RAD, PQA, PVMOD, PLW_RAD, PRHOA, PUREF, PEXNS, PEXNA, PDIRCOSZW, PZREF, PZ0, PZ0EFF, PZ0H, PALB, PSOILCOND, PD_G, PSNOWLIQ, PSNOWTEMP, PSNOWDZ, PTHRUFAL, PGRNDFLUX, PEVAPCOR, PRNSNOW, PHSNOW, PGFLUXSNOW, PHPSNOW, PLES3L, PLEL3L, PEVAP, PSNDRIFT, PRI, PEMISNOW, PCDSNOW, PUSTAR, PCHSNOW, PSNOWHMASS, PQS, PPERMSNOWFRAC, PZENITH, PXLAT, PXLON, OSNOWDRIFT, OSNOWDRIFT_SUBLIM, OSNOW_ABS_ZENITH, HSNOWMETAMO, HSNOWRAD)
Definition: snowcro.F90:6
subroutine snow3l_isba(HISBA, HSNOW_ISBA, HSNOWRES, OMEB, OGLACIER, HIMPLICIT_WIND, TPTIME, PTSTEP, PVEGTYPE, PSNOWSWE, PSNOWHEAT, PSNOWRHO, PSNOWALB, PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, PSNOWAGE, PTG, PCG, PCT, PSOILHCAPZ, PSOILCONDZ, PPS, PTA, PSW_RAD, PQA, PVMOD, PLW_RAD, PRR, PSR, PRHOA, PUREF, PEXNS, PEXNA, PDIRCOSZW, PLVTT, PLSTT, PZREF, PZ0NAT, PZ0EFF, PZ0HNAT, PALB, PD_G, PDZG, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PTHRUFAL, PGRNDFLUX, PFLSN_COR, PGSFCSNOW, PEVAPCOR, PSWNETSNOW, PSWNETSNOWS, PLWNETSNOW, PRNSNOW, PHSNOW, PGFLUXSNOW, PHPSNOW, PLES3L, PLEL3L, PEVAP, PSNDRIFT, PUSTARSNOW, PPSN, PSRSFC, PRRSFC, PSNOWSFCH, PDELHEATN, PDELHEATN_SFC, PEMISNOW, PCDSNOW, PCHSNOW, PSNOWTEMP, PSNOWLIQ, PSNOWDZ, PSNOWHMASS, PRI, PZENITH, PDELHEATG, PDELHEATG_SFC, PLAT, PLON, PQS, OSNOWDRIFT, OSNOWDRIFT_SUBLIM, OSNOW_ABS_ZENITH, HSNOWMETAMO, HSNOWRAD)
Definition: snow3L_isba.F90:6
subroutine call_model(KSIZE1, KSIZE2, KSIZE3, KMASK)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine snow3l(HSNOWRES, TPTIME, OMEB, HIMPLICIT_WIND, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PSNOWSWE, PSNOWRHO, PSNOWHEAT, PSNOWALB, PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, PSNOWAGE, PTSTEP, PPS, PSR, PRR, PPSN3L, PTA, PTG, PSW_RAD, PQA, PVMOD, PLW_RAD, PRHOA, PUREF, PEXNS, PEXNA, PDIRCOSZW, PZREF, PZ0, PZ0EFF, PZ0H, PALB, PSOILCOND, PD_G, PLVTT, PLSTT, PSNOWLIQ, PSNOWTEMP, PSNOWDZ, PTHRUFAL, PGRNDFLUX, PEVAPCOR, PSOILCOR, PGFLXCOR, PSNOWSFCH, PDELHEATN, PDELHEATN_SFC, PSWNETSNOW, PSWNETSNOWS, PLWNETSNOW, PSNOWFLUX, PRNSNOW, PHSNOW, PGFLUXSNOW, PHPSNOW, PLES3L, PLEL3L, PEVAP, PSNDRIFT, PRI, PEMISNOW, PCDSNOW, PUSTAR, PCHSNOW, PSNOWHMASS, PQS, PPERMSNOWFRAC, PFORESTFRAC, PZENITH, PXLAT, PXLON, OSNOWDRIFT, OSNOWDRIFT_SUBLIM)
Definition: snow3l.F90:6