6 SUBROUTINE snow_cover_1layer(PTSTEP, PANSMIN, PANSMAX, PTODRY, PRHOSMIN, PRHOSMAX, &
7 PRHOFOLD, OALL_MELT, PDRAIN_TIME, PWCRN, PZ0SN, PZ0HSN, &
8 TPSNOW, PTG, PTG_COEFA, PTG_COEFB, PABS_SW, PLW1, PLW2, &
9 PTA, PQA, PVMOD, PPS, PRHOA, PSR, PZREF, PUREF, PRNSNOW,&
10 PHSNOW, PLESNOW, PGSNOW, PMELT, PDQS_SNOW, PABS_LW )
62 USE modd_snow_par
, ONLY : xemissn
68 USE modi_surface_aero_cond
79 REAL,
INTENT(IN) :: PTSTEP
80 REAL,
INTENT(IN) :: PANSMIN
81 REAL,
INTENT(IN) :: PANSMAX
82 REAL,
INTENT(IN) :: PTODRY
83 REAL,
INTENT(IN) :: PRHOSMIN
84 REAL,
INTENT(IN) :: PRHOSMAX
85 REAL,
INTENT(IN) :: PRHOFOLD
86 LOGICAL,
INTENT(IN) :: OALL_MELT
89 REAL,
INTENT(IN) :: PDRAIN_TIME
90 REAL,
INTENT(IN) :: PWCRN
92 REAL,
INTENT(IN) :: PZ0SN
93 REAL,
INTENT(IN) :: PZ0HSN
95 REAL,
DIMENSION(:),
INTENT(IN) :: PTG
96 REAL,
DIMENSION(:),
INTENT(IN) :: PTG_COEFA
97 REAL,
DIMENSION(:),
INTENT(IN) :: PTG_COEFB
98 REAL,
DIMENSION(:),
INTENT(IN) :: PABS_SW
99 REAL,
DIMENSION(:),
INTENT(IN) :: PLW1
103 REAL,
DIMENSION(:),
INTENT(IN) :: PLW2
107 REAL,
DIMENSION(:),
INTENT(IN) :: PTA
108 REAL,
DIMENSION(:),
INTENT(IN) :: PQA
110 REAL,
DIMENSION(:),
INTENT(IN) :: PVMOD
111 REAL,
DIMENSION(:),
INTENT(IN) :: PPS
112 REAL,
DIMENSION(:),
INTENT(IN) :: PRHOA
114 REAL,
DIMENSION(:),
INTENT(IN) :: PSR
115 REAL,
DIMENSION(:),
INTENT(IN) :: PZREF
117 REAL,
DIMENSION(:),
INTENT(IN) :: PUREF
119 REAL,
DIMENSION(:),
INTENT(OUT) :: PRNSNOW
120 REAL,
DIMENSION(:),
INTENT(OUT) :: PHSNOW
121 REAL,
DIMENSION(:),
INTENT(OUT) :: PLESNOW
122 REAL,
DIMENSION(:),
INTENT(OUT) :: PGSNOW
123 REAL,
DIMENSION(:),
INTENT(OUT) :: PMELT
124 REAL,
DIMENSION(:),
INTENT(OUT) :: PDQS_SNOW
125 REAL,
DIMENSION(:),
INTENT(OUT) :: PABS_LW
133 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZEXNS, ZEXNA, ZDIRCOSZW
134 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZZ0
135 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZZ0H
137 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZRI
138 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZAC
139 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZRA
140 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZCH
141 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZB, ZY
142 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZWSNOW
143 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZSNOW_HC
144 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZSNOW_TC
145 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZSNOW_D
146 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZMELT
147 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZTS_SNOW
149 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZQSAT
151 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZDQSAT
154 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZSR1, ZSR2
156 LOGICAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: GSNOWMASK
158 LOGICAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: GFLUXMASK
164 INTEGER,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: JSNOWMASK1, JSNOWMASK2, JSNOWMASK3
166 INTEGER,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: JFLUXMASK
173 REAL :: ZWSNOW_MIN = 0.1
176 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZEI_SNOW
177 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZPEI_SNOW
178 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZWORK1
179 REAL,
DIMENSION(SIZE(TPSNOW%WSNOW,1)) :: ZDQSATI, ZQSATI
181 INTEGER :: JJ, JI, JCOMPT_SNOW1, JCOMPT_SNOW2, JCOMPT_SNOW3, JCOMPT_FLUX
182 REAL(KIND=JPRB) :: ZHOOK_HANDLE
186 IF (
lhook)
CALL dr_hook(
'SNOW_COVER_1LAYER',0,zhook_handle)
206 zwsnow(:) = tpsnow%WSNOW(:,1)
207 zts_snow(:) = min(
xtt,ptg(:))
258 IF (zwsnow(jj)>0.)
THEN 261 zts_snow(jj) = tpsnow%TS(jj)
264 jcompt_snow1=jcompt_snow1+1
265 jsnowmask1(jcompt_snow1) = jj
267 jcompt_flux=jcompt_flux+1
268 jfluxmask(jcompt_flux) = jj
269 IF (zwsnow(jj)>=zwsnow_min)
THEN 271 jcompt_snow3=jcompt_snow3+1
272 jsnowmask3(jcompt_snow3)=jj
276 tpsnow%T(jj,1) = min(ptg(jj),
xtt)
279 tpsnow%T(jj,1) = min(ptg(jj),
xtt)
281 jcompt_snow2=jcompt_snow2+1
282 jsnowmask2(jcompt_snow2) = jj
285 jcompt_flux=jcompt_flux+1
286 jfluxmask(jcompt_flux) = jj
299 zqsat(:) =
qsati(zts_snow(:), pps(:) )
307 CALL surface_ri(zts_snow, zqsat, zexns, zexna, pta, pqa, &
308 pzref, puref, zdircoszw, pvmod, zri )
327 zsnow_d(ji) = zwsnow(ji) / tpsnow%RHO(ji,1)
329 zsnow_tc(ji) =
xcondi * (tpsnow%RHO(ji,1)/
xrholw)**1.885
331 zei_snow(ji) = zsnow_hc(ji)*zsnow_d(ji)*tpsnow%T(ji,1)
343 zsnow_d(ji) = ptstep * psr(ji) / prhosmin
359 zdqsati =
dqsati(zts_snow(:),pps(:),zqsat(:))
360 WHERE (gsnowmask(:) .AND. zwsnow(:)>=zwsnow_min)
361 zdqsat(:) = zdqsati(:)
372 zwork1(ji) = zsnow_d(ji) * zsnow_hc(ji) / ptstep
374 zb(ji) = zb(ji) + zwork1(ji)
379 zy(ji) = zy(ji) + zwork1(ji) * tpsnow%T(ji,1) + pabs_sw(ji)
385 zwork1(ji) = plw2(ji) * tpsnow%T(ji,1)**3
387 zb(ji) = zb(ji) - 4 * zimpl * zwork1(ji)
389 zy(ji) = zy(ji) + plw1(ji) + zwork1(ji) * (zexpl-3.*zimpl) * tpsnow%T(ji,1)
395 zwork1(ji) =
xcpd * prhoa(ji) * zac(ji)
397 zb(ji) = zb(ji) + zwork1(ji) * zimpl
399 zy(ji) = zy(ji) - zwork1(ji) * ( zexpl * tpsnow%T(ji,1) - pta(ji) )
405 zwork1(ji) =
xlstt * prhoa(ji) * zac(ji)
407 zb(ji) = zb(ji) + zwork1(ji) * zimpl * zdqsat(ji)
409 zy(ji) = zy(ji) - zwork1(ji) * ( zqsat(ji) - pqa(ji) - zimpl * zdqsat(ji)*tpsnow%T(ji,1) )
414 zwork1(ji) = zsnow_tc(ji)/(0.5*zsnow_d(ji))
416 zb(ji) = zb(ji) + zwork1(ji) * zimpl / ( 1. + zwork1(ji)*ptg_coefa(ji) )
418 zy(ji) = zy(ji) - zwork1(ji) * (zexpl * tpsnow%T(ji,1) - ptg_coefb(ji)) &
419 / ( 1. + zwork1(ji)*ptg_coefa(ji) )
424 tpsnow%T(ji,1) = zy(ji) / zb(ji)
441 zmelt(ji) = max( tpsnow%T(ji,1) -
xtt , 0. ) * zsnow_hc(ji) /
xlmtt / ptstep
443 zmelt(ji) = min( zmelt(ji) , zwsnow(ji) / zsnow_d(ji) / ptstep )
445 tpsnow%T(ji,1) = min( tpsnow%T(ji,1) ,
xtt )
455 WHERE ( gsnowmask(:) .AND. ptg(:)>
xtt .AND. zwsnow(:)>=zwsnow_min )
456 pmelt(:) = pmelt(:) + zwsnow(:) / ptstep
463 pmelt(:) = zmelt(:) * zsnow_d(:)
473 zqsati =
qsati(tpsnow%T(:,1),pps(:))
482 DO jj = 1, jcompt_flux
486 pabs_lw(ji) = plw1(ji) + plw2(ji) * tpsnow%T(ji,1)**4
488 prnsnow(ji) = pabs_sw(ji) + pabs_lw(ji)
494 phsnow(ji) =
xcpd * prhoa(ji) * zac(ji) * ( tpsnow%T(ji,1) - pta(ji) )
500 plesnow(ji) =
xlstt * prhoa(ji) * zac(ji) * ( zqsat(ji) - pqa(ji) )
507 pgsnow(ji) = zsnow_tc(ji)/(0.5*zsnow_d(ji)) * ( tpsnow%T(ji,1) - ptg_coefb(ji) ) &
508 / ( 1. + zsnow_tc(ji)/(0.5*zsnow_d(ji))*ptg_coefa(ji) )
514 IF (ptg(ji)>
xtt) pmelt(ji) = max(pmelt(ji), -pgsnow(ji)/
xlmtt)
524 DO jj = 1,
SIZE(tpsnow%WSNOW,1)
529 tpsnow%WSNOW(jj,1) = tpsnow%WSNOW(jj,1) + ptstep * psr(jj)
535 plesnow(jj) = min( plesnow(jj),
xlstt*tpsnow%WSNOW(jj,1)/ptstep )
537 tpsnow%WSNOW(jj,1) = max( tpsnow%WSNOW(jj,1) - ptstep * plesnow(jj)/
xlstt , 0.)
539 IF ( tpsnow%WSNOW(jj,1)<1.e-8 * ptstep ) tpsnow%WSNOW(jj,1) = 0.
544 pmelt(jj) = min( pmelt(jj), tpsnow%WSNOW(jj,1)/ptstep )
546 tpsnow%WSNOW(jj,1)= max( tpsnow%WSNOW(jj,1) - ptstep * pmelt(jj) , 0.)
548 IF ( tpsnow%WSNOW(jj,1)<1.e-8 * ptstep ) tpsnow%WSNOW(jj,1) = 0.
550 IF (tpsnow%WSNOW(jj,1)==0.) pgsnow(jj) = max( pgsnow(jj), - pmelt(jj)*
xlmtt )
557 IF (pdrain_time>0.)
THEN 558 WHERE ( tpsnow%WSNOW(:,1)>0.)
559 tpsnow%WSNOW(:,1) = tpsnow%WSNOW(:,1) * exp(-ptstep/pdrain_time/
xday)
566 WHERE ( tpsnow%WSNOW(:,1)<zwsnow_min .AND. pmelt(:)>0. .AND. psr(:)==0. )
567 pmelt(:) = pmelt(:) + tpsnow%WSNOW(:,1) / ptstep
571 WHERE ( tpsnow%WSNOW(:,1)<1.e-8 * ptstep )
572 tpsnow%WSNOW(:,1) = 0.
589 IF (pmelt(ji) > 0. )
THEN 591 tpsnow%ALB(ji) = (tpsnow%ALB(ji)-pansmin)*exp(-prhofold*ptstep/
xday) + pansmin &
592 + psr(ji)*ptstep/pwcrn*pansmax
594 ELSEIF (pmelt(ji)==0.)
THEN 595 tpsnow%ALB(ji) = tpsnow%ALB(ji) - ptodry*ptstep/
xday + psr(ji)*ptstep/pwcrn*pansmax
610 DO jj = 1, jcompt_snow1
614 IF (tpsnow%WSNOW(ji,1)>0. )
THEN 616 zsr1(ji) = max( tpsnow%WSNOW(ji,1) , psr(ji) * ptstep )
618 tpsnow%RHO(ji,1) = (tpsnow%RHO(ji,1)-prhosmax)*exp(-prhofold*ptstep/
xday) + prhosmax
619 tpsnow%RHO(ji,1) = ( (zsr1(ji)-psr(ji)*ptstep) * tpsnow%RHO(ji,1) &
620 + (psr(ji)*ptstep) * prhosmin ) / zsr1(ji)
629 DO jj=1,
SIZE(tpsnow%WSNOW,1)
630 IF ( tpsnow%WSNOW(jj,1)>0. )
THEN 631 tpsnow%ALB(jj) = max(tpsnow%ALB(jj),pansmin)
632 tpsnow%ALB(jj) = min(tpsnow%ALB(jj),pansmax)
633 IF (zwsnow(jj)==0.)
THEN 634 tpsnow%ALB (jj) = pansmax
635 tpsnow%EMIS (jj) = xemissn
636 tpsnow%RHO(jj,1) = prhosmin
651 IF (psr(ji)>0. .AND. tpsnow%WSNOW(ji,1)>0.)
THEN 653 zsr2(ji) = min( tpsnow%WSNOW(ji,1) , psr(ji) * ptstep )
655 tpsnow%T(ji,1) =( ( tpsnow%WSNOW(ji,1) - zsr2(ji) ) * tpsnow%T(ji,1) &
656 + zsr2(ji) * min( pta(ji) ,
xtt )) / ( tpsnow%WSNOW(ji,1) )
670 WHERE (gsnowmask(:) )
671 tpsnow%TS(:) = tpsnow%T(:,1)
682 WHERE (tpsnow%WSNOW(:,1)==0.)
696 zpei_snow(:) = zsnow_hc(:)*zsnow_d(:)*tpsnow%T(:,1)
700 pdqs_snow(:) = (zpei_snow(:)-zei_snow(:))/ptstep
702 IF (
lhook)
CALL dr_hook(
'SNOW_COVER_1LAYER',1,zhook_handle)
subroutine snow_cover_1layer(PTSTEP, PANSMIN, PANSMAX, PTODRY, PRHOSMIN, PRHOSMAX, PRHOFOLD, OALL_MELT, PDRAIN_TIME, PWCRN, PZ0SN, PZ0HSN, TPSNOW, 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)
subroutine surface_aero_cond(PRI, PZREF, PUREF, PVMOD, PZ0, PZ0H, PAC, PRA, PCH)