7 prhosmin, prhosmax, prhofold, oall_melt, &
8 pdrain_time, pwcrn, pz0sn, pz0hsn, &
9 ptsnow, pasnow, prsnow, pwsnow, pts_snow, &
11 ptg, ptg_coefa, ptg_coefb, &
12 pabs_sw, plw1, plw2, &
13 pta, pqa, pvmod, pps, prhoa, psr, &
15 prnsnow, phsnow, plesnow, pgsnow, pmelt, &
65 USE modd_csts, ONLY : xtt, xci, xrholi, xrholw, xcpd, xlstt, xlmtt, xday, xcondi
72 USE modi_surface_aero_cond
75 USE yomhook
,ONLY : lhook, dr_hook
76 USE parkind1
,ONLY : jprb
83 REAL,
INTENT(IN) :: ptstep
84 REAL,
INTENT(IN) :: pansmin
85 REAL,
INTENT(IN) :: pansmax
86 REAL,
INTENT(IN) :: ptodry
87 REAL,
INTENT(IN) :: prhosmin
88 REAL,
INTENT(IN) :: prhosmax
89 REAL,
INTENT(IN) :: prhofold
90 LOGICAL,
INTENT(IN) :: oall_melt
93 REAL,
INTENT(IN) :: pdrain_time
94 REAL,
INTENT(IN) :: pwcrn
96 REAL,
INTENT(IN) :: pz0sn
97 REAL,
INTENT(IN) :: pz0hsn
98 REAL,
DIMENSION(:),
INTENT(INOUT) :: pwsnow
99 REAL,
DIMENSION(:),
INTENT(INOUT) :: ptsnow
100 REAL,
DIMENSION(:),
INTENT(INOUT) :: pasnow
101 REAL,
DIMENSION(:),
INTENT(INOUT) :: prsnow
102 REAL,
DIMENSION(:),
INTENT(INOUT) :: pts_snow
103 REAL,
DIMENSION(:),
INTENT(INOUT) :: pesnow
104 REAL,
DIMENSION(:),
INTENT(IN) :: ptg
105 REAL,
DIMENSION(:),
INTENT(IN) :: ptg_coefa
106 REAL,
DIMENSION(:),
INTENT(IN) :: ptg_coefb
107 REAL,
DIMENSION(:),
INTENT(IN) :: pabs_sw
108 REAL,
DIMENSION(:),
INTENT(IN) :: plw1
112 REAL,
DIMENSION(:),
INTENT(IN) :: plw2
116 REAL,
DIMENSION(:),
INTENT(IN) :: pta
117 REAL,
DIMENSION(:),
INTENT(IN) :: pqa
119 REAL,
DIMENSION(:),
INTENT(IN) :: pvmod
120 REAL,
DIMENSION(:),
INTENT(IN) :: pps
121 REAL,
DIMENSION(:),
INTENT(IN) :: prhoa
123 REAL,
DIMENSION(:),
INTENT(IN) :: psr
124 REAL,
DIMENSION(:),
INTENT(IN) :: pzref
126 REAL,
DIMENSION(:),
INTENT(IN) :: puref
128 REAL,
DIMENSION(:),
INTENT(OUT) :: prnsnow
129 REAL,
DIMENSION(:),
INTENT(OUT) :: phsnow
130 REAL,
DIMENSION(:),
INTENT(OUT) :: plesnow
131 REAL,
DIMENSION(:),
INTENT(OUT) :: pgsnow
132 REAL,
DIMENSION(:),
INTENT(OUT) :: pmelt
133 REAL,
DIMENSION(:),
INTENT(OUT) :: pdqs_snow
134 REAL,
DIMENSION(:),
INTENT(OUT) :: pabs_lw
142 REAL,
DIMENSION(SIZE(PWSNOW)) :: zexns, zexna, zdircoszw
143 REAL,
DIMENSION(SIZE(PWSNOW)) :: zz0
144 REAL,
DIMENSION(SIZE(PWSNOW)) :: zz0h
146 REAL,
DIMENSION(SIZE(PWSNOW)) :: zri
147 REAL,
DIMENSION(SIZE(PWSNOW)) :: zac
148 REAL,
DIMENSION(SIZE(PWSNOW)) :: zra
149 REAL,
DIMENSION(SIZE(PWSNOW)) :: zch
150 REAL,
DIMENSION(SIZE(PWSNOW)) :: zb, zy
151 REAL,
DIMENSION(SIZE(PWSNOW)) :: zwsnow
152 REAL,
DIMENSION(SIZE(PWSNOW)) :: zsnow_hc
153 REAL,
DIMENSION(SIZE(PWSNOW)) :: zsnow_tc
154 REAL,
DIMENSION(SIZE(PWSNOW)) :: zsnow_d
155 REAL,
DIMENSION(SIZE(PWSNOW)) :: zmelt
156 REAL,
DIMENSION(SIZE(PWSNOW)) :: zts_snow
158 REAL,
DIMENSION(SIZE(PWSNOW)) :: zqsat
160 REAL,
DIMENSION(SIZE(PWSNOW)) :: zdqsat
163 REAL,
DIMENSION(SIZE(PWSNOW)) :: zsr1, zsr2
165 LOGICAL,
DIMENSION(SIZE(PWSNOW)) :: gsnowmask
167 LOGICAL,
DIMENSION(SIZE(PWSNOW)) :: gfluxmask
173 INTEGER,
DIMENSION(SIZE(PWSNOW)) :: jsnowmask1, jsnowmask2, jsnowmask3
175 INTEGER,
DIMENSION(SIZE(PWSNOW)) :: jfluxmask
182 REAL :: zwsnow_min = 0.1
185 REAL,
DIMENSION(SIZE(PWSNOW)) :: zei_snow
186 REAL,
DIMENSION(SIZE(PWSNOW)) :: zpei_snow
187 REAL,
DIMENSION(SIZE(PWSNOW)) :: zwork1
188 REAL,
DIMENSION(SIZE(PWSNOW)) :: zdqsati, zqsati
190 INTEGER :: jj, ji, jcompt_snow1, jcompt_snow2, jcompt_snow3, jcompt_flux
191 REAL(KIND=JPRB) :: zhook_handle
195 IF (lhook) CALL dr_hook(
'SNOW_COVER_1LAYER',0,zhook_handle)
215 zwsnow(:) = pwsnow(:)
216 zts_snow(:) = min(xtt,ptg(:))
267 IF (zwsnow(jj)>0.)
THEN
270 zts_snow(jj)=pts_snow(jj)
273 jcompt_snow1=jcompt_snow1+1
274 jsnowmask1(jcompt_snow1) = jj
276 jcompt_flux=jcompt_flux+1
277 jfluxmask(jcompt_flux) = jj
278 IF (zwsnow(jj)>=zwsnow_min)
THEN
280 jcompt_snow3=jcompt_snow3+1
281 jsnowmask3(jcompt_snow3)=jj
285 ptsnow(jj)=min(ptg(jj),xtt)
288 ptsnow(jj)=min(ptg(jj),xtt)
290 jcompt_snow2=jcompt_snow2+1
291 jsnowmask2(jcompt_snow2) = jj
294 jcompt_flux=jcompt_flux+1
295 jfluxmask(jcompt_flux) = jj
308 zqsat(:) =
qsati(zts_snow(:), pps(:) )
316 CALL
surface_ri(zts_snow, zqsat, zexns, zexna, pta, pqa, &
317 pzref, puref, zdircoszw, pvmod, zri )
334 zsnow_hc(ji) = prsnow(ji) * xci * xrholi / xrholw
336 zsnow_d(ji) = zwsnow(ji) / prsnow(ji)
338 zsnow_tc(ji) = xcondi * (prsnow(ji)/xrholw)**1.885
340 zei_snow(ji) = zsnow_hc(ji)*zsnow_d(ji)*ptsnow(ji)
350 zsnow_hc(ji) = prhosmin * xci * xrholi / xrholw
352 zsnow_d(ji) = ptstep * psr(ji) / prhosmin
354 zsnow_tc(ji) = xcondi * (prhosmin /xrholw)**1.885
368 zdqsati =
dqsati(zts_snow(:),pps(:),zqsat(:))
369 WHERE (gsnowmask(:) .AND. zwsnow(:)>=zwsnow_min)
370 zdqsat(:) = zdqsati(:)
381 zwork1(ji) = zsnow_d(ji) * zsnow_hc(ji) / ptstep
383 zb(ji) = zb(ji) + zwork1(ji)
388 zy(ji) = zy(ji) + zwork1(ji) * ptsnow(ji) + pabs_sw(ji)
394 zwork1(ji) = plw2(ji) * ptsnow(ji)**3
396 zb(ji) = zb(ji) - 4 * zimpl * zwork1(ji)
398 zy(ji) = zy(ji) + plw1(ji) + zwork1(ji) * (zexpl-3.*zimpl) * ptsnow(ji)
404 zwork1(ji) = xcpd * prhoa(ji) * zac(ji)
406 zb(ji) = zb(ji) + zwork1(ji) * zimpl
408 zy(ji) = zy(ji) - zwork1(ji) * ( zexpl * ptsnow(ji) - pta(ji) )
414 zwork1(ji) = xlstt * prhoa(ji) * zac(ji)
416 zb(ji) = zb(ji) + zwork1(ji) * zimpl * zdqsat(ji)
418 zy(ji) = zy(ji) - zwork1(ji) * ( zqsat(ji) - pqa(ji) - zimpl * zdqsat(ji)*ptsnow(ji) )
423 zwork1(ji) = zsnow_tc(ji)/(0.5*zsnow_d(ji))
425 zb(ji) = zb(ji) + zwork1(ji) * zimpl / ( 1. + zwork1(ji)*ptg_coefa(ji) )
427 zy(ji) = zy(ji) - zwork1(ji) * (zexpl * ptsnow(ji) - ptg_coefb(ji)) &
428 / ( 1. + zwork1(ji)*ptg_coefa(ji) )
433 ptsnow(ji) = zy(ji) / zb(ji)
450 zmelt(ji) = max( ptsnow(ji) - xtt , 0. ) * zsnow_hc(ji) / xlmtt / ptstep
452 zmelt(ji) = min( zmelt(ji) , zwsnow(ji) / zsnow_d(ji) / ptstep )
454 ptsnow(ji) = min( ptsnow(ji) , xtt )
464 WHERE ( gsnowmask(:) .AND. ptg(:)>xtt .AND. zwsnow(:)>=zwsnow_min )
465 pmelt(:) = pmelt(:) + zwsnow(:) / ptstep
472 pmelt(:) = zmelt(:) * zsnow_d(:)
482 zqsati =
qsati(ptsnow(:),pps(:))
491 DO jj = 1, jcompt_flux
495 pabs_lw(ji) = plw1(ji) + plw2(ji) * ptsnow(ji)**4
497 prnsnow(ji) = pabs_sw(ji) + pabs_lw(ji)
503 phsnow(ji) = xcpd * prhoa(ji) * zac(ji) * ( ptsnow(ji) - pta(ji) )
509 plesnow(ji) = xlstt * prhoa(ji) * zac(ji) * ( zqsat(ji) - pqa(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) )
523 IF (ptg(ji)>xtt) pmelt(ji) = max(pmelt(ji), -pgsnow(ji)/xlmtt)
533 DO jj = 1,
SIZE(pwsnow)
538 pwsnow(jj) = pwsnow(jj) + ptstep * psr(jj)
544 plesnow(jj) = min( plesnow(jj), xlstt*pwsnow(jj)/ptstep )
546 pwsnow(jj) = max( pwsnow(jj) - ptstep * plesnow(jj)/xlstt , 0.)
548 IF ( pwsnow(jj)<1.e-8 * ptstep ) pwsnow(jj) = 0.
553 pmelt(jj) = min( pmelt(jj), pwsnow(jj)/ptstep )
555 pwsnow(jj)= max( pwsnow(jj) - ptstep * pmelt(jj) , 0.)
557 IF ( pwsnow(jj)<1.e-8 * ptstep ) pwsnow(jj) = 0.
559 IF (pwsnow(jj)==0.) pgsnow(jj) = max( pgsnow(jj), - pmelt(jj)*xlmtt )
566 IF (pdrain_time>0.)
THEN
567 WHERE ( pwsnow(:)>0.)
568 pwsnow(:) = pwsnow(:) * exp(-ptstep/pdrain_time/xday)
575 WHERE ( pwsnow(:)<zwsnow_min .AND. pmelt(:)>0. .AND. psr(:)==0. )
576 pmelt(:) = pmelt(:) + pwsnow(:) / ptstep
580 WHERE ( pwsnow(:)<1.e-8 * ptstep )
598 IF (pmelt(ji) > 0. )
THEN
600 pasnow(ji) = (pasnow(ji)-pansmin)*exp(-prhofold*ptstep/xday) + pansmin &
601 + psr(ji)*ptstep/pwcrn*pansmax
603 ELSEIF (pmelt(ji)==0.)
THEN
604 pasnow(ji) = pasnow(ji) - ptodry*ptstep/xday &
605 + psr(ji)*ptstep/pwcrn*pansmax
620 DO jj = 1, jcompt_snow1
624 IF (pwsnow(ji)>0. )
THEN
626 zsr1(ji) = max( pwsnow(ji) , psr(ji) * ptstep )
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)
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
646 prsnow(jj) = prhosmin
661 IF (psr(ji)>0. .AND. pwsnow(ji)>0.)
THEN
663 zsr2(ji) = min( pwsnow(ji) , psr(ji) * ptstep )
665 ptsnow(ji) =( ( pwsnow(ji) - zsr2(ji) ) * ptsnow(ji) &
666 + zsr2(ji) * min( pta(ji) ,xtt ))&
681 WHERE (gsnowmask(:) )
682 pts_snow(:) = ptsnow(:)
693 WHERE (pwsnow(:)==0.)
707 zpei_snow(:) = zsnow_hc(:)*zsnow_d(:)*ptsnow(:)
711 pdqs_snow(:) = (zpei_snow(:)-zei_snow(:))/ptstep
713 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, 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)
subroutine surface_aero_cond(PRI, PZREF, PUREF, PVMOD, PZ0, PZ0H, PAC, PRA, PCH)