SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
snow_cover_1layer.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_cover_1layer(PTSTEP, PANSMIN, PANSMAX, PTODRY, &
7  prhosmin, prhosmax, prhofold, oall_melt, &
8  pdrain_time, pwcrn, pz0sn, pz0hsn, &
9  ptsnow, pasnow, prsnow, pwsnow, pts_snow, &
10  pesnow, &
11  ptg, ptg_coefa, ptg_coefb, &
12  pabs_sw, plw1, plw2, &
13  pta, pqa, pvmod, pps, prhoa, psr, &
14  pzref, puref, &
15  prnsnow, phsnow, plesnow, pgsnow, pmelt, &
16  pdqs_snow, pabs_lw )
17 ! ##########################################################################
18 !
19 !!**** *SNOW_COVER_1LAYER*
20 !!
21 !! PURPOSE
22 !! -------
23 !
24 ! One layer snow mantel scheme
25 !
26 !
27 !!** METHOD
28 ! ------
29 !
30 !
31 ! The temperature equation is written as:
32 !
33 ! b T+ = y
34 !
35 !
36 !! EXTERNAL
37 !! --------
38 !!
39 !!
40 !! IMPLICIT ARGUMENTS
41 !! ------------------
42 !!
43 !! MODD_CST
44 !!
45 !!
46 !! REFERENCE
47 !! ---------
48 !!
49 !!
50 !! AUTHOR
51 !! ------
52 !!
53 !! V. Masson * Meteo-France *
54 !!
55 !! MODIFICATIONS
56 !! -------------
57 !! Original 08/09/98
58 !! J. Escobar 24/10/2012 : BUF PGI10.X , rewrite some 1 line WHERE statement
59 !! V. Masson 13/09/2013 : implicitation of coupling with roof below
60 !-------------------------------------------------------------------------------
61 !
62 !* 0. DECLARATIONS
63 ! ------------
64 !
65 USE modd_csts, ONLY : xtt, xci, xrholi, xrholw, xcpd, xlstt, xlmtt, xday, xcondi
66 USE modd_snow_par, ONLY : xemissn
67 USE modd_surf_par, ONLY : xundef
68 !
69 USE mode_thermos
70 !
71 USE modi_surface_ri
72 USE modi_surface_aero_cond
73 !
74 !
75 USE yomhook ,ONLY : lhook, dr_hook
76 USE parkind1 ,ONLY : jprb
77 !
78 IMPLICIT NONE
79 !
80 !* 0.1 declarations of arguments
81 !
82 !
83 REAL, INTENT(IN) :: ptstep ! time step
84 REAL, INTENT(IN) :: pansmin ! minimum snow albedo
85 REAL, INTENT(IN) :: pansmax ! maximum snow albedo
86 REAL, INTENT(IN) :: ptodry ! snow albedo decreasing constant
87 REAL, INTENT(IN) :: prhosmin ! minimum snow density
88 REAL, INTENT(IN) :: prhosmax ! maximum snow density
89 REAL, INTENT(IN) :: prhofold ! snow density increasing constant
90 LOGICAL, INTENT(IN) :: oall_melt! T --> all snow runs off if
91  ! lower surf. temperature is
92  ! positive
93 REAL, INTENT(IN) :: pdrain_time ! drainage folding time (days)
94 REAL, INTENT(IN) :: pwcrn ! critical snow amount necessary
95  ! to cover the considered surface
96 REAL, INTENT(IN) :: pz0sn ! snow roughness length for momentum
97 REAL, INTENT(IN) :: pz0hsn ! snow roughness length for heat
98 REAL, DIMENSION(:), INTENT(INOUT) :: pwsnow ! snow reservoir (kg/m2)
99 REAL, DIMENSION(:), INTENT(INOUT) :: ptsnow ! snow temperature
100 REAL, DIMENSION(:), INTENT(INOUT) :: pasnow ! snow albedo
101 REAL, DIMENSION(:), INTENT(INOUT) :: prsnow ! snow density
102 REAL, DIMENSION(:), INTENT(INOUT) :: pts_snow ! snow surface temperature
103 REAL, DIMENSION(:), INTENT(INOUT) :: pesnow ! snow emissivity
104 REAL, DIMENSION(:), INTENT(IN) :: ptg ! underlying ground temperature
105 REAL, DIMENSION(:), INTENT(IN) :: ptg_coefa! underlying ground temperature
106 REAL, DIMENSION(:), INTENT(IN) :: ptg_coefb! implicit terms
107 REAL, DIMENSION(:), INTENT(IN) :: pabs_sw ! absorbed SW energy (Wm-2)
108 REAL, DIMENSION(:), INTENT(IN) :: plw1 ! LW coef independant of TSNOW
109  ! (Wm-2) usually equal to:
110  ! emis_snow * LW_down
111  !
112 REAL, DIMENSION(:), INTENT(IN) :: plw2 ! LW coef dependant of TSNOW
113  ! (Wm-2 K-4) usually equal to:
114  ! -1 * emis_snow * stefan_constant
115  !
116 REAL, DIMENSION(:), INTENT(IN) :: pta ! temperature at the lowest level
117 REAL, DIMENSION(:), INTENT(IN) :: pqa ! specific humidity
118  ! at the lowest level
119 REAL, DIMENSION(:), INTENT(IN) :: pvmod ! module of the horizontal wind
120 REAL, DIMENSION(:), INTENT(IN) :: pps ! pressure at the surface
121 REAL, DIMENSION(:), INTENT(IN) :: prhoa ! air density
122  ! at the lowest level
123 REAL, DIMENSION(:), INTENT(IN) :: psr ! snow rate
124 REAL, DIMENSION(:), INTENT(IN) :: pzref ! reference height of the first
125  ! atmospheric level (temperature)
126 REAL, DIMENSION(:), INTENT(IN) :: puref ! reference height of the first
127  ! atmospheric level (wind)
128 REAL, DIMENSION(:), INTENT(OUT) :: prnsnow ! net radiation over snow
129 REAL, DIMENSION(:), INTENT(OUT) :: phsnow ! sensible heat flux over snow
130 REAL, DIMENSION(:), INTENT(OUT) :: plesnow ! latent heat flux over snow
131 REAL, DIMENSION(:), INTENT(OUT) :: pgsnow ! flux under the snow
132 REAL, DIMENSION(:), INTENT(OUT) :: pmelt ! snow melting rate (kg/m2/s)
133 REAL, DIMENSION(:), INTENT(OUT) :: pdqs_snow! heat storage inside snow
134 REAL, DIMENSION(:), INTENT(OUT) :: pabs_lw ! absorbed LW rad by snow (W/m2)
135 !
136 !
137 !* 0.2 declarations of local variables
138 !
139 REAL :: zexpl = 0.
140 REAL :: zimpl = 1.
141 !
142 REAL, DIMENSION(SIZE(PWSNOW)) :: zexns, zexna, zdircoszw
143 REAL, DIMENSION(SIZE(PWSNOW)) :: zz0 ! roughness length for momentum
144 REAL, DIMENSION(SIZE(PWSNOW)) :: zz0h ! roughness length forheat
145 !
146 REAL, DIMENSION(SIZE(PWSNOW)) :: zri ! Richardson number
147 REAL, DIMENSION(SIZE(PWSNOW)) :: zac ! aerodynamical conductance
148 REAL, DIMENSION(SIZE(PWSNOW)) :: zra ! aerodynamical resistance
149 REAL, DIMENSION(SIZE(PWSNOW)) :: zch ! drag coefficient for heat
150 REAL, DIMENSION(SIZE(PWSNOW)) :: zb, zy ! coefficients in Ts eq.
151 REAL, DIMENSION(SIZE(PWSNOW)) :: zwsnow ! snow before evolution
152 REAL, DIMENSION(SIZE(PWSNOW)) :: zsnow_hc ! snow heat capacity
153 REAL, DIMENSION(SIZE(PWSNOW)) :: zsnow_tc ! snow thermal conductivity
154 REAL, DIMENSION(SIZE(PWSNOW)) :: zsnow_d ! snow depth
155 REAL, DIMENSION(SIZE(PWSNOW)) :: zmelt ! snow melting rate (kg/m3/s)
156 REAL, DIMENSION(SIZE(PWSNOW)) :: zts_snow ! snow surface temperature
157  ! at previous time-step
158 REAL, DIMENSION(SIZE(PWSNOW)) :: zqsat ! specific humidity
159 ! ! for ice
160 REAL, DIMENSION(SIZE(PWSNOW)) :: zdqsat ! d(specific humidity)/dT
161 ! ! for ice
162 !
163 REAL, DIMENSION(SIZE(PWSNOW)) :: zsr1, zsr2 ! norm. snow precip.
164 !
165 LOGICAL, DIMENSION(SIZE(PWSNOW)) :: gsnowmask ! where snow is
166 ! ! at previuos time-step
167 LOGICAL, DIMENSION(SIZE(PWSNOW)) :: gfluxmask ! where fluxes can
168 ! ! be computed at
169 ! ! new time-step
170 ! ! i.e. snow occurence
171 ! ! at previous time-step
172 ! ! OR snow fall
173 INTEGER, DIMENSION(SIZE(PWSNOW)) :: jsnowmask1, jsnowmask2, jsnowmask3 ! where snow is or not
174 ! ! at previuos time-step
175 INTEGER, DIMENSION(SIZE(PWSNOW)) :: jfluxmask ! where fluxes can
176 ! ! be computed at
177 ! ! new time-step
178 ! ! i.e. snow occurence
179 ! ! at previous time-step
180 ! ! OR snow fall
181 !
182 REAL :: zwsnow_min = 0.1 ! minimum value of snow content (kg/m2) for prognostic
183 ! ! computations
184 !
185 REAL, DIMENSION(SIZE(PWSNOW)) :: zei_snow ! internal energy of snow
186 REAL, DIMENSION(SIZE(PWSNOW)) :: zpei_snow ! internal energy of snow at t+
187 REAL, DIMENSION(SIZE(PWSNOW)) :: zwork1
188 REAL, DIMENSION(SIZE(PWSNOW)) :: zdqsati, zqsati
189 !
190 INTEGER :: jj, ji, jcompt_snow1, jcompt_snow2, jcompt_snow3, jcompt_flux
191 REAL(KIND=JPRB) :: zhook_handle
192 !-------------------------------------------------------------------------------
193 !
194 !
195 IF (lhook) CALL dr_hook('SNOW_COVER_1LAYER',0,zhook_handle)
196 zb(:)=0.
197 zy(:)=0.
198 zmelt(:) = 0.
199 pmelt(:) = 0.
200 prnsnow(:) = 0.
201 phsnow(:) = 0.
202 plesnow(:) = 0.
203 pgsnow(:) = 0.
204 !RJ: workaround to prevent decomposition unstable xundef masks for Tx_LWA_SN_RD fields
205 !RJ: in TEB_DIAGNOSTICS.nc during TEB_GARDEN_GREENROOF_BEM_3L_IRRIG_* tests
206 !RJ: problem with decomposition handling somewhere else
207 #ifdef RJ_PFIX
208 pabs_lw(:) = 0.0
209 #else
210 pabs_lw(:) = xundef
211 #endif
212 !
213 !* snow reservoir before evolution
214 !
215 zwsnow(:) = pwsnow(:)
216 zts_snow(:) = min(xtt,ptg(:))
217 !
218 zsnow_d(:) = 0.
219 zsnow_tc(:) = 0.
220 zsnow_hc(:) = 0.
221 !
222 !-------------------------------------------------------------------------------
223 !
224 !* 1.1 most useful masks
225 ! -----------------
226 !
227 gsnowmask(:)=.false.
228 gfluxmask(:)=.false.
229 jsnowmask1(:)=0.
230 jsnowmask2(:)=0.
231 jsnowmask3(:)=0.
232 jfluxmask(:)=0.
233 
234  !* 1.2 drag
235 ! ----
236 !
237 !* 1.2.1 defaults
238 ! --------
239 !
240 !* variation of temperature with altitude is neglected
241 !
242 zexns(:) = 1.
243 zexna(:) = 1.
244 !
245 !* slope is neglected in drag computation
246 !
247 zdircoszw(:) = 1.
248 !
249 !* roughness length are imposed:
250 !
251 zz0(:) = pz0sn
252 zz0h(:) = pz0hsn
253 
254 !
255 !
256 !* 1.1 most useful masks
257 ! -----------------
258 !* snow occurence at previous time-step
259 !
260 !* snow occurence during the time-step for fluxes computation
261 !
262 jcompt_snow1=0
263 jcompt_snow2=0
264 jcompt_snow3=0
265 jcompt_flux=0
266 DO jj=1,SIZE(zwsnow)
267  IF (zwsnow(jj)>0.) THEN
268  gsnowmask(jj)=.true.
269  !* surface temperature
270  zts_snow(jj)=pts_snow(jj)
271  gfluxmask(jj)=.true.
272  !gsnowmask=t
273  jcompt_snow1=jcompt_snow1+1
274  jsnowmask1(jcompt_snow1) = jj
275  !gfluxmask=t
276  jcompt_flux=jcompt_flux+1
277  jfluxmask(jcompt_flux) = jj
278  IF (zwsnow(jj)>=zwsnow_min) THEN
279  !second snow mask
280  jcompt_snow3=jcompt_snow3+1
281  jsnowmask3(jcompt_snow3)=jj
282  ELSE
283  !lower limit of snow cover for prognostic computations
284  !0.1 kg/m2 of snow water content
285  ptsnow(jj)=min(ptg(jj),xtt)
286  ENDIF
287  ELSE
288  ptsnow(jj)=min(ptg(jj),xtt)
289  !gsnowmask=false
290  jcompt_snow2=jcompt_snow2+1
291  jsnowmask2(jcompt_snow2) = jj
292  IF (psr(jj)>0.) THEN
293  gfluxmask(jj)=.true.
294  jcompt_flux=jcompt_flux+1
295  jfluxmask(jcompt_flux) = jj
296  ENDIF
297  ENDIF
298 ENDDO
299 !
300 !-------------------------------------------------------------------------------
301 !
302 !* 1.2 drag
303 ! ----
304 !
305 !* 1.2.2 qsat (Tsnow)
306 ! ------------
307 !
308 zqsat(:) = qsati(zts_snow(:), pps(:) )
309 !
310 !* 1.2.3 Richardson number
311 ! -----------------
312 !
313 !* snow is present on all the considered surface.
314 !* computation occurs where snow is and/or falls.
315 !
316  CALL surface_ri(zts_snow, zqsat, zexns, zexna, pta, pqa, &
317  pzref, puref, zdircoszw, pvmod, zri )
318 !
319 !* 1.2.4 Aerodynamical conductance
320 ! -------------------------
321 !
322  CALL surface_aero_cond(zri, pzref, puref, pvmod, zz0, zz0h, zac, zra, zch)
323 !
324 !-------------------------------------------------------------------------------
325 !
326 !* 2. snow thermal characteristics
327 ! ----------------------------
328 !cdir nodep
329 DO jj=1,jcompt_snow1
330  !
331  ji = jsnowmask1(jj)
332  !
333  !* 2.1 snow heat capacity
334  zsnow_hc(ji) = prsnow(ji) * xci * xrholi / xrholw
335 !* 2.2 snow depth
336  zsnow_d(ji) = zwsnow(ji) / prsnow(ji)
337 !* 2.3 snow thermal conductivity
338  zsnow_tc(ji) = xcondi * (prsnow(ji)/xrholw)**1.885
339 !* 2.4 internal energy of snow
340  zei_snow(ji) = zsnow_hc(ji)*zsnow_d(ji)*ptsnow(ji)
341  !
342 ENDDO
343 !
344 !cdir nodep
345 DO jj=1,jcompt_snow2
346  !
347  ji = jsnowmask2(jj)
348  !
349  !* 2.1 snow heat capacity
350  zsnow_hc(ji) = prhosmin * xci * xrholi / xrholw
351 !* 2.2 snow depth
352  zsnow_d(ji) = ptstep * psr(ji) / prhosmin
353 !* 2.3 snow thermal conductivity
354  zsnow_tc(ji) = xcondi * (prhosmin /xrholw)**1.885
355 !* 2.4 internal energy of snow
356  zei_snow(ji) = 0.
357 !
358 ENDDO
359 !
360 !-------------------------------------------------------------------------------
361 !
362 !* 3. Snow temperature evolution
363 ! --------------------------
364 !
365 !* 3.5 dqsat/ dT (Tsnow)
366 ! -----------------
367 !
368 zdqsati = dqsati(zts_snow(:),pps(:),zqsat(:))
369 WHERE (gsnowmask(:) .AND. zwsnow(:)>=zwsnow_min)
370  zdqsat(:) = zdqsati(:)
371 END WHERE
372 !
373 !* 3.1 coefficients from Temperature tendency
374 ! --------------------------------------
375 !
376 !cdir nodep
377 DO jj=1,jcompt_snow3
378 !
379  ji=jsnowmask3(jj)
380 
381  zwork1(ji) = zsnow_d(ji) * zsnow_hc(ji) / ptstep
382 !
383  zb(ji) = zb(ji) + zwork1(ji)
384 !
385 !* 3.2 coefficients from solar radiation
386 ! ---------------------------------
387 !
388  zy(ji) = zy(ji) + zwork1(ji) * ptsnow(ji) + pabs_sw(ji)
389 !
390 !
391 !* 3.3 coefficients from infra-red radiation
392 ! -------------------------------------
393 !
394  zwork1(ji) = plw2(ji) * ptsnow(ji)**3
395 !
396  zb(ji) = zb(ji) - 4 * zimpl * zwork1(ji)
397 !
398  zy(ji) = zy(ji) + plw1(ji) + zwork1(ji) * (zexpl-3.*zimpl) * ptsnow(ji)
399 !
400 !
401 !* 3.4 coefficients from sensible heat flux
402 ! ------------------------------------
403 !
404  zwork1(ji) = xcpd * prhoa(ji) * zac(ji)
405 !
406  zb(ji) = zb(ji) + zwork1(ji) * zimpl
407 !
408  zy(ji) = zy(ji) - zwork1(ji) * ( zexpl * ptsnow(ji) - pta(ji) )
409 !
410 !
411 !* 3.6 coefficients from latent heat flux
412 ! ----------------------------------
413 !
414  zwork1(ji) = xlstt * prhoa(ji) * zac(ji)
415 !
416  zb(ji) = zb(ji) + zwork1(ji) * zimpl * zdqsat(ji)
417 !
418  zy(ji) = zy(ji) - zwork1(ji) * ( zqsat(ji) - pqa(ji) - zimpl * zdqsat(ji)*ptsnow(ji) )
419 !
420 !* 3.7 coefficients from conduction flux at snow base
421 ! ----------------------------------------------
422 !
423  zwork1(ji) = zsnow_tc(ji)/(0.5*zsnow_d(ji))
424 !
425  zb(ji) = zb(ji) + zwork1(ji) * zimpl / ( 1. + zwork1(ji)*ptg_coefa(ji) )
426 !
427  zy(ji) = zy(ji) - zwork1(ji) * (zexpl * ptsnow(ji) - ptg_coefb(ji)) &
428  / ( 1. + zwork1(ji)*ptg_coefa(ji) )
429 !
430 !* 3.8 guess of snow temperature before accumulation and melting
431 ! ---------------------------------------------------------
432 !
433  ptsnow(ji) = zy(ji) / zb(ji)
434 !
435 ENDDO
436 !
437 !-------------------------------------------------------------------------------
438 !
439 !* 4. Snow melt
440 ! ---------
441 !
442 !* 4.1 melting
443 ! -------
444 !
445 !cdir nodep
446 DO jj=1,jcompt_snow1
447 !
448  ji = jsnowmask1(jj)
449 !
450  zmelt(ji) = max( ptsnow(ji) - xtt , 0. ) * zsnow_hc(ji) / xlmtt / ptstep
451 !
452  zmelt(ji) = min( zmelt(ji) , zwsnow(ji) / zsnow_d(ji) / ptstep )
453 !
454  ptsnow(ji) = min( ptsnow(ji) , xtt )
455 !
456 ENDDO
457 !
458 !* 4.2 run-off of all snow if lower surface temperature is positive
459 ! ------------------------------------------------------------
460 !
461 !* this option is used when snow is located on sloping roofs for example.
462 !
463 IF (oall_melt) THEN
464  WHERE ( gsnowmask(:) .AND. ptg(:)>xtt .AND. zwsnow(:)>=zwsnow_min )
465  pmelt(:) = pmelt(:) + zwsnow(:) / ptstep
466  END WHERE
467 END IF
468 !
469 !* 4.3 output melting in kg/m2/s
470 ! -------------------------
471 !
472 pmelt(:) = zmelt(:) * zsnow_d(:)
473 !
474 !-------------------------------------------------------------------------------
475 !
476 !* 5. fluxes
477 ! ------
478 !
479 !* 5.3 qsat (Tsnow)
480 ! ------------
481 !
482 zqsati = qsati(ptsnow(:),pps(:))
483 WHERE (gfluxmask(:))
484  zqsat(:) = zqsati(:)
485 END WHERE
486 !
487 !* 5.1 net radiation (with Ts lin. extrapolation)
488 ! -------------
489 !
490 !cdir nodep
491 DO jj = 1, jcompt_flux
492 !
493  ji = jfluxmask(jj)
494 !
495  pabs_lw(ji) = plw1(ji) + plw2(ji) * ptsnow(ji)**4
496 !
497  prnsnow(ji) = pabs_sw(ji) + pabs_lw(ji)
498 !
499 !
500 !* 5.2 sensible heat flux
501 ! ------------------
502 !
503  phsnow(ji) = xcpd * prhoa(ji) * zac(ji) * ( ptsnow(ji) - pta(ji) )
504 !
505 !
506 !* 5.4 latent heat flux
507 ! ----------------
508 !
509  plesnow(ji) = xlstt * prhoa(ji) * zac(ji) * ( zqsat(ji) - pqa(ji) )
510  !
511 !
512 !* 5.5 Conduction heat flux
513 ! --------------------
514 !
515  !PGSNOW(JI) = ZSNOW_TC(JI)/(0.5*ZSNOW_D(JI)) * ( PTSNOW(JI) - PTG(JI) )
516  pgsnow(ji) = zsnow_tc(ji)/(0.5*zsnow_d(ji)) * ( ptsnow(ji) - ptg_coefb(ji) ) &
517  / ( 1. + zsnow_tc(ji)/(0.5*zsnow_d(ji))*ptg_coefa(ji) )
518 !
519 !
520 !* 5.6 If ground T>0 C, Melting is estimated from conduction heat flux
521 ! ---------------------------------------------------------------
522 !
523  IF (ptg(ji)>xtt) pmelt(ji) = max(pmelt(ji), -pgsnow(ji)/xlmtt)
524 !
525 ENDDO
526 !
527 !-------------------------------------------------------------------------------
528 !
529 !* 6. reservoir evolution
530 ! -------------------
531 !
532 !cdir nodep
533 DO jj = 1, SIZE(pwsnow)
534 !
535 !* 6.1 snow fall
536 ! ---------
537 !
538  pwsnow(jj) = pwsnow(jj) + ptstep * psr(jj)
539 !
540 !
541 !* 6.2 sublimation
542 ! -----------
543 !
544  plesnow(jj) = min( plesnow(jj), xlstt*pwsnow(jj)/ptstep )
545 !
546  pwsnow(jj) = max( pwsnow(jj) - ptstep * plesnow(jj)/xlstt , 0.)
547 !
548  IF ( pwsnow(jj)<1.e-8 * ptstep ) pwsnow(jj) = 0.
549 !
550 !* 6.3 melting
551 ! -------
552 !
553  pmelt(jj) = min( pmelt(jj), pwsnow(jj)/ptstep )
554 !
555  pwsnow(jj)= max( pwsnow(jj) - ptstep * pmelt(jj) , 0.)
556 !
557  IF ( pwsnow(jj)<1.e-8 * ptstep ) pwsnow(jj) = 0.
558 !
559  IF (pwsnow(jj)==0.) pgsnow(jj) = max( pgsnow(jj), - pmelt(jj)*xlmtt )
560 !
561 ENDDO
562 !
563 !* 6.4 time dependent drainage
564 ! -----------------------
565 !
566 IF (pdrain_time>0.) THEN
567  WHERE ( pwsnow(:)>0.)
568  pwsnow(:) = pwsnow(:) * exp(-ptstep/pdrain_time/xday)
569  END WHERE
570 END IF
571 !
572 !* 6.5 melting of last 1mm of snow depth
573 ! ---------------------------------
574 !
575 WHERE ( pwsnow(:)<zwsnow_min .AND. pmelt(:)>0. .AND. psr(:)==0. )
576  pmelt(:) = pmelt(:) + pwsnow(:) / ptstep
577  pwsnow(:)=0.
578 END WHERE
579 !
580 WHERE ( pwsnow(:)<1.e-8 * ptstep )
581  pwsnow(:) = 0.
582 END WHERE
583 !
584 !-------------------------------------------------------------------------------
585 !
586 !* 7. albedo evolution
587 ! ----------------
588 !
589 !* 7.1 If melting occurs or not
590 ! -----------------------
591 !
592 !
593 !cdir nodep
594 DO jj=1,jcompt_snow1
595 !
596  ji = jsnowmask1(jj)
597 !
598  IF (pmelt(ji) > 0. ) THEN
599 !
600  pasnow(ji) = (pasnow(ji)-pansmin)*exp(-prhofold*ptstep/xday) + pansmin &
601  + psr(ji)*ptstep/pwcrn*pansmax
602 !
603  ELSEIF (pmelt(ji)==0.) THEN
604  pasnow(ji) = pasnow(ji) - ptodry*ptstep/xday &
605  + psr(ji)*ptstep/pwcrn*pansmax
606 !
607  ENDIF
608 !
609 ENDDO
610 !
611 !-------------------------------------------------------------------------------
612 !
613 !* 8. density evolution
614 ! -----------------
615 !
616 !* 8.1 old snow
617 ! --------
618 !
619 !cdir nodep
620 DO jj = 1, jcompt_snow1
621 !
622  ji = jsnowmask1(jj)
623 !
624  IF (pwsnow(ji)>0. ) THEN
625 !
626  zsr1(ji) = max( pwsnow(ji) , psr(ji) * ptstep )
627 !
628  prsnow(ji) = (prsnow(ji)-prhosmax)*exp(-prhofold*ptstep/xday) + prhosmax
629  prsnow(ji) = ( (zsr1(ji)-psr(ji)*ptstep) * prsnow(ji) &
630  + (psr(ji)*ptstep) * prhosmin ) / zsr1(ji)
631  ENDIF
632 !
633 ENDDO
634 !
635 !* 8.2 fresh snow
636 ! ----------
637 !
638 !cdir nodep
639 DO jj=1,SIZE(pwsnow)
640  IF ( pwsnow(jj)>0. ) THEN
641  pasnow(jj) = max(pasnow(jj),pansmin)
642  pasnow(jj) = min(pasnow(jj),pansmax)
643  IF (zwsnow(jj)==0.) THEN
644  pasnow(jj) = pansmax
645  pesnow(jj) = xemissn
646  prsnow(jj) = prhosmin
647  ENDIF
648  ENDIF
649  ENDDO
650 !
651 !-------------------------------------------------------------------------------
652 !
653 !* 9. fresh snow accumulation (if more than 1mm of snow depth)
654 ! -----------------------
655 !
656 !cdir nodep
657 DO jj=1,jcompt_snow3
658 !
659  ji = jsnowmask3(jj)
660 !
661  IF (psr(ji)>0. .AND. pwsnow(ji)>0.) THEN
662 !
663  zsr2(ji) = min( pwsnow(ji) , psr(ji) * ptstep )
664 !
665  ptsnow(ji) =( ( pwsnow(ji) - zsr2(ji) ) * ptsnow(ji) &
666  + zsr2(ji) * min( pta(ji) ,xtt ))&
667  /( pwsnow(ji) )
668  ENDIF
669 !
670 ENDDO
671 !
672 !-------------------------------------------------------------------------------
673 !
674 !* 10. Surface temperature
675 ! -------------------
676 !
677 !* note that if the relation between snow pack temperature and its
678 ! surface temperature is modified, think to modify it also in
679 ! subroutine init_snow_lw.f90
680 !
681 WHERE (gsnowmask(:) )
682  pts_snow(:) = ptsnow(:)
683 END WHERE
684 !
685 !-------------------------------------------------------------------------------
686 !
687 !* 11. bogus values
688 ! ------------
689 !
690 !* 11.1 snow characteristics where snow IS present at current time-step
691 ! ---------------------------------------------------------------
692 !
693 WHERE (pwsnow(:)==0.)
694  ptsnow(:) = xundef
695  prsnow(:) = xundef
696  pasnow(:) = xundef
697  pts_snow(:) = xundef
698  pesnow(:) = xundef
699 END WHERE
700 !
701 !
702 !-------------------------------------------------------------------------------
703 !
704 !* 12. Heat storage inside snow pack
705 !
706 WHERE (gsnowmask(:))
707  zpei_snow(:) = zsnow_hc(:)*zsnow_d(:)*ptsnow(:)
708 ELSEWHERE
709  zpei_snow(:) = 0.
710 END WHERE
711 pdqs_snow(:) = (zpei_snow(:)-zei_snow(:))/ptstep
712 !
713 IF (lhook) CALL dr_hook('SNOW_COVER_1LAYER',1,zhook_handle)
714 
715 !------------------------------------------------------------------------------- !
716 END SUBROUTINE snow_cover_1layer
717 
subroutine snow_cover_1layer(PTSTEP, PANSMIN, PANSMAX, PTODRY, PRHOSMIN, PRHOSMAX, PRHOFOLD, OALL_MELT, PDRAIN_TIME, PWCRN, PZ0SN, PZ0HSN, PTSNOW, PASNOW, PRSNOW, PWSNOW, PTS_SNOW, PESNOW, 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)
subroutine surface_ri(PTG, PQS, PEXNS, PEXNA, PTA, PQA, PZREF, PUREF, PDIRCOSZW, PVMOD, PRI)
Definition: surface_ri.F90:6
subroutine surface_aero_cond(PRI, PZREF, PUREF, PVMOD, PZ0, PZ0H, PAC, PRA, PCH)