6 SUBROUTINE snow3l(HSNOWRES, TPTIME, OMEB, HIMPLICIT_WIND, &
7 ppew_a_coef, ppew_b_coef, &
8 ppet_a_coef, ppeq_a_coef, ppet_b_coef, ppeq_b_coef, &
9 psnowswe,psnowrho,psnowheat,psnowalb, &
10 psnowgran1,psnowgran2,psnowhist,psnowage, &
11 ptstep,pps,psr,prr,ppsn3l, &
12 pta,ptg,psw_rad,pqa,pvmod,plw_rad, prhoa, &
13 puref,pexns,pexna,pdircoszw, &
14 pzref,pz0,pz0eff,pz0h,palb, &
15 psoilcond,pd_g,plvtt,plstt, &
16 psnowliq,psnowtemp,psnowdz, &
17 pthrufal,pgrndflux,pevapcor,psoilcor, &
18 pgflxcor,psnowsfch, pdelheatn, pdelheatn_sfc, &
19 pswnetsnow,pswnetsnows,plwnetsnow,psnowflux, &
20 prnsnow,phsnow,pgfluxsnow, &
21 phpsnow,ples3l,plel3l,pevap,psndrift,pri, &
22 pemisnow,pcdsnow,pustar,pchsnow,psnowhmass,pqs, &
23 ppermsnowfrac,pforestfrac,pzenith,pxlat,pxlon, &
24 osnowdrift,osnowdrift_sublim )
100 USE modd_csts, ONLY : xtt, xrholw, xlmtt, xcl, xday
111 USE yomhook
,ONLY : lhook, dr_hook
112 USE parkind1
,ONLY : jprb
119 REAL,
INTENT(IN) :: ptstep
123 CHARACTER(LEN=*),
INTENT(IN) :: hsnowres
129 LOGICAL,
INTENT(IN) :: omeb
134 CHARACTER(LEN=*),
INTENT(IN) :: himplicit_wind
138 REAL,
DIMENSION(:),
INTENT(IN) :: pps, pta, psw_rad, pqa, &
139 pvmod, plw_rad, psr, prr
150 REAL,
DIMENSION(:),
INTENT(IN) :: psoilcond, pd_g, ppsn3l
156 REAL,
DIMENSION(:),
INTENT(IN) :: pzref, puref, pexns, pexna, pdircoszw, prhoa, pz0, pz0eff, &
157 palb, pz0h, ppermsnowfrac, pforestfrac
173 REAL,
DIMENSION(:),
INTENT(IN) :: ppew_a_coef, ppew_b_coef, &
174 ppet_a_coef, ppeq_a_coef, ppet_b_coef, &
183 REAL,
DIMENSION(:),
INTENT(IN) :: ptg
186 REAL,
DIMENSION(:),
INTENT(IN) :: plvtt, plstt
188 REAL,
DIMENSION(:),
INTENT(INOUT) :: psnowalb
193 REAL,
DIMENSION(:,:),
INTENT(INOUT):: psnowheat, psnowrho, psnowswe
198 REAL,
DIMENSION(:,:),
INTENT(INOUT):: psnowgran1, psnowgran2, psnowhist
204 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowage
206 REAL,
DIMENSION(:),
INTENT(INOUT) :: prnsnow, phsnow, ples3l, plel3l, &
207 phpsnow, pevap, pgrndflux, pemisnow
217 REAL,
DIMENSION(:),
INTENT(OUT) :: pgfluxsnow
220 REAL,
DIMENSION(:),
INTENT(INOUT) :: pswnetsnow, plwnetsnow, pswnetsnows
229 REAL,
DIMENSION(:),
INTENT(INOUT) :: pustar, pcdsnow, pchsnow, pri
235 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowtemp
236 REAL,
DIMENSION(:,:),
INTENT(OUT) :: psnowliq, psnowdz
241 REAL,
DIMENSION(:),
INTENT(OUT) :: pthrufal, pevapcor, psoilcor, pgflxcor, &
242 psnowflux, psnowsfch, pdelheatn, pdelheatn_sfc
265 REAL,
DIMENSION(:),
INTENT(OUT) :: psndrift
268 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowhmass
273 REAL,
DIMENSION(:),
INTENT(OUT) :: pqs
276 REAL,
DIMENSION(:),
INTENT(IN) :: pzenith
277 REAL,
DIMENSION(:),
INTENT(IN) :: pxlat,pxlon
279 LOGICAL,
INTENT(IN) :: osnowdrift, osnowdrift_sublim
288 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowtemp, zscap, zsnowdzn, zscond, &
289 zradsink, zwork2d, zsnowtempo
297 REAL,
DIMENSION(SIZE(PTA)) :: zsnow, zsfcfrz, ztsterm1, ztsterm2, &
298 zct, zra, zsnowtempo1
307 LOGICAL,
DIMENSION(SIZE(PTA)) :: gsfcmelt
311 REAL,
DIMENSION(SIZE(PTA)) :: zrsra, zdqsat, zqsat, zradxs, zmeltxs, zliqheatxs, &
312 zlwupsnow, zgrndflux, zgrndfluxo, zgrndfluxi, zpsn3l
333 REAL,
DIMENSION(SIZE(PTA)) :: zustar2_ic, zta_ic, zqa_ic, zwork, zwork2, zwork3, &
334 zpet_a_coef_t, zpeq_a_coef_t, zpet_b_coef_t, zpeq_b_coef_t
343 REAL,
DIMENSION(SIZE(PSNOWRHO,1),NSPEC_BAND_SNOW) :: zspectralalbedo, zspectralwork
346 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowheat0
348 REAL(KIND=JPRB) :: zhook_handle
358 IF (lhook) CALL dr_hook(
'SNOW3L',0,zhook_handle)
360 psnowdz(:,:) = psnowswe(:,:)/psnowrho(:,:)
362 ini =
SIZE(psnowswe(:,:),1)
363 inlvls =
SIZE(psnowswe(:,:),2)
370 zgrndflux = pgrndflux
372 zsnowheat0(:,:) = psnowheat(:,:)
374 zsnowtempo(:,:) = psnowtemp(:,:)
382 zsnow(ji) = zsnow(ji) + psnowdz(ji,jj)
390 zwork2(:)=psnowalb(:)
392 CALL
snow3lalb(zwork2,zspectralalbedo,psnowrho(:,1),psnowage(:,1),ppermsnowfrac,pps)
393 zwork3(:) = psnowalb(:)/zwork2(:)
394 DO jj=1,
SIZE(zspectralalbedo,2)
396 zspectralalbedo(ji,jj)=zspectralalbedo(ji,jj)*zwork3(ji)
406 CALL
snow3lfall(ptstep,psr,pta,pvmod,zsnow,psnowrho,psnowdz, &
407 psnowheat,psnowhmass,psnowage,ppermsnowfrac )
411 CALL
snow3lalb(zwork2,zspectralwork,psnowrho(:,1),psnowage(:,1),ppermsnowfrac,pps)
413 DO jj=1,
SIZE(zspectralalbedo,2)
415 IF(zwork(ji)==0.0.AND.psr(ji)>0.0)
THEN
416 zspectralalbedo(ji,jj) = zspectralwork(ji,jj)
420 WHERE(zwork(:)==0.0.AND.psr(:)>0.0)
421 psnowalb(:) = zwork2(:)
428 CALL
snow3lgrid(zsnowdzn,zsnow,psnowdz_old=psnowdz)
432 CALL
snow3ltransf(zsnow,psnowdz,zsnowdzn,psnowrho,psnowheat,psnowage)
443 zsnowtemp(:,:) = xtt + ( ((psnowheat(:,:)/psnowdz(:,:)) &
444 + xlmtt*psnowrho(:,:))/zscap(:,:) )
446 psnowliq(:,:) = max(0.0,zsnowtemp(:,:)-xtt)*zscap(:,:)* &
447 psnowdz(:,:)/(xlmtt*xrholw)
449 zsnowtemp(:,:) = min(xtt,zsnowtemp(:,:))
457 CALL
snow3lcompactn(ptstep,xsnowdzmin,psnowrho,psnowdz,zsnowtemp,zsnow,psnowliq)
463 CALL
snow3ldrift(ptstep,pforestfrac,pvmod,pta,pqa,pps,prhoa,&
464 psnowrho,psnowdz,zsnow,osnowdrift_sublim,psndrift)
470 psnowheat(:,:) = psnowdz(:,:)*( zscap(:,:)*(zsnowtemp(:,:)-xtt) &
471 - xlmtt*psnowrho(:,:) ) + xlmtt*xrholw*psnowliq(:,:)
480 CALL
snow3lrad(omeb,xsnowdzmin,psw_rad,psnowalb, &
481 zspectralalbedo,psnowdz,psnowrho,palb, &
482 ppermsnowfrac,pzenith,pswnetsnow, &
483 pswnetsnows,zradsink,zradxs,psnowage)
490 CALL
snow3lthrm(psnowrho,zscond,zsnowtemp,pps)
511 zsnowtemp(:,1),psnowdz(:,1),psnowdz(:,2), &
512 zscond(:,1),zscond(:,2),zscap(:,1), &
513 pswnetsnows,plwnetsnow, &
514 phsnow,ples3l,plel3l,phpsnow, &
515 zct,ztsterm1,ztsterm2,pgfluxsnow)
523 zpsn3l(:) = ppsn3l(:)
528 ppew_a_coef, ppew_b_coef, &
529 ppet_a_coef, ppeq_a_coef, ppet_b_coef, ppeq_b_coef, &
531 pzref,zsnowtemp(:,1),psnowrho(:,1),psnowliq(:,1),zscap(:,1), &
532 zscond(:,1),zscond(:,2), &
533 puref,pexns,pexna,pdircoszw,pvmod, &
534 plw_rad,psw_rad,pta,pqa,pps,ptstep, &
535 psnowdz(:,1),psnowdz(:,2),psnowalb,pz0,pz0eff,pz0h, &
536 zsfcfrz,zradsink(:,1),phpsnow, &
537 zct,pemisnow,prhoa,ztsterm1,ztsterm2,zra,pcdsnow,pchsnow, &
538 zqsat, zdqsat, zrsra, zustar2_ic, pri, &
539 zpet_a_coef_t,zpeq_a_coef_t,zpet_b_coef_t,zpeq_b_coef_t )
545 zsnowtempo1(:) = zsnowtemp(:,1)
547 zgrndfluxi(:) = zgrndflux(:)
549 CALL
snow3lsolvt(omeb,ptstep,xsnowdzmin,psnowdz,zscond,zscap,ptg, &
550 psoilcond,pd_g,zradsink,zct,ztsterm1,ztsterm2, &
551 zpet_a_coef_t,zpeq_a_coef_t,zpet_b_coef_t,zpeq_b_coef_t, &
552 zta_ic,zqa_ic,zgrndflux,zgrndfluxo,zsnowtemp,psnowflux )
563 CALL
snow3lflux(zsnowtemp(:,1),psnowdz(:,1),pexns,pexna, &
565 ptstep,psnowalb,psw_rad, &
566 pemisnow,zlwupsnow,plw_rad,plwnetsnow, &
567 zta_ic,zsfcfrz,zqa_ic,phpsnow, &
568 zsnowtempo1,psnowflux,zct,zradsink(:,1), &
569 zqsat,zdqsat,zrsra, &
570 prnsnow,phsnow,pgfluxsnow,ples3l,plel3l,pevap, &
581 CALL
snow3lgone(ptstep,plel3l,ples3l,psnowrho, &
582 psnowheat,zradsink(:,inlvls),pevapcor,pthrufal,zgrndflux, &
583 pgfluxsnow,zgrndfluxo,psnowdz,psnowliq,zsnowtemp, &
588 CALL
snow3lmelt(ptstep,zscap,zsnowtemp,psnowdz,psnowrho,psnowliq,zmeltxs)
596 CALL
snow3lrefrz(ptstep,prr,psnowrho,zsnowtemp,psnowdz,psnowliq,pthrufal)
599 psnowheat(:,:) = psnowdz(:,:)*( zscap(:,:)*(zsnowtemp(:,:)-xtt) &
600 - xlmtt*psnowrho(:,:) ) + xlmtt*xrholw*psnowliq(:,:)
606 CALL
snow3levapn(zpsn3l,ples3l,plel3l,ptstep,zsnowtemp(:,1),psnowrho(:,1), &
607 psnowdz,psnowliq(:,1),pta,plvtt,plstt,psnowheat,psoilcor )
615 zwork2d(:,:) = min(1.0, psnowdz(:,:)/xsnowdmin)
616 zsnowtemp(:,:) = xtt + zwork2d(:,:)*( ((psnowheat(:,:)/max(xsnowdmin,psnowdz(:,:))) &
617 + xlmtt*psnowrho(:,:))/zscap(:,:) )
618 psnowliq(:,:) = max(0.0,zsnowtemp(:,:)-xtt)*zscap(:,:)*psnowdz(:,:)/(xlmtt*xrholw)
619 zsnowtemp(:,:) = min(xtt,zsnowtemp(:,:))
625 CALL
snow3levapgone(psnowheat,psnowdz,psnowrho,zsnowtemp,psnowliq)
632 CALL
snow3lalb(psnowalb,zspectralalbedo,psnowrho(:,1),psnowage(:,1),ppermsnowfrac,pps)
645 zliqheatxs(ji) = max(0.0,psnowliq(ji,jj)*xrholw-psnowdz(ji,jj)*psnowrho(ji,jj))*xlmtt/ptstep
646 psnowliq(ji,jj)= psnowliq(ji,jj) - zliqheatxs(ji)*ptstep/(xrholw*xlmtt)
647 psnowliq(ji,jj)= max(0.0, psnowliq(ji,jj))
651 psnowtemp(:,:) = zsnowtemp(:,:)
655 psnowheat(:,:) = psnowdz(:,:)*( zscap(:,:)*(psnowtemp(:,:)-xtt) &
656 - xlmtt*psnowrho(:,:) ) + xlmtt*xrholw*psnowliq(:,:)
664 pgrndflux(:) = zgrndfluxo(:)+zradxs(:)
669 pgflxcor(:) = (zgrndflux(:)-zgrndfluxo(:))+zmeltxs(:)+zliqheatxs(:)
675 psnowswe(:,:) = psnowdz(:,:)*psnowrho(:,:)
677 WHERE (psnowswe(:,:)>0)
678 psnowage(:,:)=psnowage(:,:)+(ptstep/xday)
680 psnowage(:,:)= xundef
688 pqs(:) =
qsati(psnowtemp(:,1),pps)
712 zwork(ji) = zwork(ji) + psnowheat(ji,jj)
715 zwork2(:) = min(0.0, zwork(:) + pgrndflux(:) - zgrndfluxi(:))
716 pgflxcor(:) = pgflxcor(:) + max(0., zwork2(:))
718 WHERE(zwork(:) > -1.e-10)
721 zwork(:) = zwork2(:)/zwork(:)
726 psnowheat(ji,jj) = psnowheat(ji,jj)*zwork(ji)
732 zwork2d(:,:) = min(1.0, psnowdz(:,:)/xsnowdmin)/max(xsnowdmin,psnowdz(:,:))
733 psnowtemp(:,:) = xtt + zwork2d(:,:)*( (psnowheat(:,:) + xlmtt*psnowswe(:,:))/zscap(:,:) )
734 psnowliq(:,:) = max(0.0,psnowtemp(:,:)-xtt)*zscap(:,:)*psnowdz(:,:)/(xlmtt*xrholw)
735 psnowtemp(:,:) = min(xtt,psnowtemp(:,:))
757 pdelheatn(ji) = pdelheatn(ji) + (psnowheat(ji,jj)-zsnowheat0(ji,jj))
760 pdelheatn(:) = pdelheatn(:) /ptstep
761 pdelheatn_sfc(:) = (psnowheat(:,1)-zsnowheat0(:,1))/ptstep
768 psnowsfch(:) = pdelheatn_sfc(:) - (pswnetsnows(:) +plwnetsnow(:) - phsnow(:) -ples3l(:)-plel3l(:)) &
769 + psnowflux(:) - psnowhmass(:)/ptstep
771 IF (lhook) CALL dr_hook(
'SNOW3L',1,zhook_handle)
781 SUBROUTINE snow3lfall(PTSTEP,PSR,PTA,PVMOD,PSNOW,PSNOWRHO,PSNOWDZ, &
782 psnowheat,psnowhmass,psnowage,ppermsnowfrac)
802 REAL,
INTENT(IN) :: ptstep
804 REAL,
DIMENSION(:),
INTENT(IN) :: psr, pta, pvmod, ppermsnowfrac
806 REAL,
DIMENSION(:),
INTENT(INOUT) :: psnow
808 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowrho, psnowdz, psnowheat, psnowage
810 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowhmass
820 REAL,
DIMENSION(SIZE(PTA)) :: zsnowfall, zrhosnew, &
822 zsnowfall_delta, zscap, &
825 REAL(KIND=JPRB) :: zhook_handle
832 IF (lhook) CALL dr_hook(
'SNOW3LFALL',0,zhook_handle)
834 ini =
SIZE(psnowdz(:,:),1)
835 inlvls =
SIZE(psnowdz(:,:),2)
837 zrhosnew(:) = xrhosmin_es
860 WHERE (psr(:) > 0.0 .AND. psnowdz(:,1)>0.)
861 zsnowtemp(:) = xtt + (psnowheat(:,1) + &
862 xlmtt*psnowrho(:,1)*psnowdz(:,1))/ &
863 (zscap(:)*max(xsnowdmin/inlvls,psnowdz(:,1)))
864 zsnowtemp(:) = min(xtt, zsnowtemp(:))
869 psnowhmass(:) = psr(:)*(xci*(zsnowtemp(:)-xtt)-xlmtt)*ptstep
873 zrhosnew(:) = max(xrhosmin_es, xsnowfall_a_sn + xsnowfall_b_sn*(pta(:)-xtt)+ &
874 xsnowfall_c_sn*sqrt(pvmod(:)))
880 psnowage(:,1) = (psnowage(:,1)*psnowdz(:,1)*psnowrho(:,1)+zagenew(:)*psr(:)*ptstep) / &
881 (psnowdz(:,1)*psnowrho(:,1)+psr(:)*ptstep)
885 zsnowfall(:) = psr(:)*ptstep/zrhosnew(:)
887 psnow(:) = psnow(:) + zsnowfall(:)
893 psnowrho(:,1) = (psnowdz(:,1)*psnowrho(:,1) + zsnowfall(:)*zrhosnew(:))/ &
894 (psnowdz(:,1)+zsnowfall(:))
896 psnowdz(:,1) = psnowdz(:,1) + zsnowfall(:)
902 psnowheat(:,1) = psnowheat(:,1) + psnowhmass(:)
915 zsnowfall_delta(:) = 0.0
916 WHERE(zsnow(:) == 0.0 .AND. psr(:) > 0.0)
917 zsnowfall_delta(:) = 1.0
923 psnowdz(ji,jj) = zsnowfall_delta(ji)*(zsnowfall(ji) /inlvls) + &
924 (1.0-zsnowfall_delta(ji))*psnowdz(ji,jj)
926 psnowheat(ji,jj) = zsnowfall_delta(ji)*(psnowhmass(ji)/inlvls) + &
927 (1.0-zsnowfall_delta(ji))*psnowheat(ji,jj)
929 psnowrho(ji,jj) = zsnowfall_delta(ji)*zrhosnew(ji) + &
930 (1.0-zsnowfall_delta(ji))*psnowrho(ji,jj)
932 psnowage(ji,jj) = zsnowfall_delta(ji)*(zagenew(ji)/inlvls) + &
933 (1.0-zsnowfall_delta(ji))*psnowage(ji,jj)
938 IF (lhook) CALL dr_hook(
'SNOW3LFALL',1,zhook_handle)
945 SUBROUTINE snow3lcompactn(PTSTEP,PSNOWDZMIN,PSNOWRHO,PSNOWDZ,PSNOWTEMP,PSNOW,PSNOWLIQ)
961 xvvisc5,xvvisc6,xvro11
967 REAL,
INTENT(IN) :: ptstep
968 REAL,
INTENT(IN) :: psnowdzmin
970 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowtemp, psnowliq
972 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowrho, psnowdz
974 REAL,
DIMENSION(:),
INTENT(OUT) :: psnow
984 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowrho2, zviscocity, zf1, &
985 ztemp, zsmass, zsnowdz, &
989 REAL(KIND=JPRB) :: zhook_handle
996 IF (lhook) CALL dr_hook(
'SNOW3LCOMPACTN',0,zhook_handle)
998 ini =
SIZE(psnowdz(:,:),1)
999 inlvls =
SIZE(psnowdz(:,:),2)
1001 zsnowrho2(:,:) = psnowrho(:,:)
1002 zsnowdz(:,:) = max(psnowdzmin,psnowdz(:,:))
1003 zviscocity(:,:) = 0.0
1012 zsmass(ji,jj) = zsmass(ji,jj-1) + psnowdz(ji,jj-1)*psnowrho(ji,jj-1)
1016 zsmass(:,1) = 0.5 * psnowdz(:,1) * psnowrho(:,1)
1023 zwholdmax(:,:) =
snow3lhold(psnowrho,psnowdz)
1024 zf1(:,:) = 1.0/(xvvisc5+10.*min(1.0,psnowliq(:,:)/zwholdmax(:,:)))
1031 IF(psnowrho(ji,jj) < xrhosmax_es)
THEN
1034 ztemp(ji,jj) = xvvisc4*min(5.0,abs(xtt-psnowtemp(ji,jj)))
1037 zviscocity(ji,jj) = xvvisc1*zf1(ji,jj)*exp(xvvisc3*psnowrho(ji,jj)+ztemp(ji,jj))*psnowrho(ji,jj)/xvro11
1040 zsnowrho2(ji,jj) = psnowrho(ji,jj) + psnowrho(ji,jj)*ptstep &
1041 * ( (xg*zsmass(ji,jj)/zviscocity(ji,jj)) )
1044 psnowdz(ji,jj) = psnowdz(ji,jj)*(psnowrho(ji,jj)/zsnowrho2(ji,jj))
1059 psnow(ji) = psnow(ji) + psnowdz(ji,jj)
1065 psnowrho(:,:) = zsnowrho2(:,:)
1067 IF (lhook) CALL dr_hook(
'SNOW3LCOMPACTN',1,zhook_handle)
1076 psnowrho,psnowdz,psnow,osnowdrift_sublim,psndrift)
1080 USE modd_snow_par, ONLY : xvtime, xvromax, xvromin, xvmob1, &
1081 xvdrift1, xvdrift2, xvdrift3, &
1082 xcoef_ff, xcoef_effect, xqs_ref
1113 REAL,
INTENT(IN) :: ptstep
1115 REAL,
DIMENSION(:),
INTENT(IN) :: pforestfrac
1116 REAL,
DIMENSION(:),
INTENT(IN) :: pvmod
1117 REAL,
DIMENSION(:),
INTENT(IN) :: pta
1118 REAL,
DIMENSION(:),
INTENT(IN) :: pqa
1119 REAL,
DIMENSION(:),
INTENT(IN) :: pps
1120 REAL,
DIMENSION(:),
INTENT(IN) :: prhoa
1122 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowrho, psnowdz
1124 REAL,
DIMENSION(:),
INTENT(OUT) :: psnow
1126 LOGICAL,
INTENT(IN) :: osnowdrift_sublim
1127 REAL,
DIMENSION(:),
INTENT(OUT) :: psndrift
1131 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowrho2
1132 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zrmob
1133 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zrdrift
1134 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zrt
1135 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zdro
1136 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zqs_effect
1137 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zdrift_effect
1138 REAL,
DIMENSION(SIZE(PSNOWRHO,1) ) :: zprofequ
1139 REAL,
DIMENSION(SIZE(PSNOWRHO,1) ) :: zwind
1140 REAL,
DIMENSION(SIZE(PSNOWRHO,1) ) :: zqsati
1141 REAL,
DIMENSION(SIZE(PSNOWRHO,1) ) :: zvt
1142 REAL,
DIMENSION(SIZE(PSNOWRHO,1) ) :: zqs
1143 REAL,
DIMENSION(SIZE(PSNOWRHO,1) ) :: zw
1144 REAL,
DIMENSION(SIZE(PSNOWRHO,1) ) :: zt
1145 REAL,
DIMENSION(SIZE(PSNOWRHO,1) ) :: zsnowdz1
1146 REAL,
DIMENSION(SIZE(PSNOWRHO,1) ) :: zforest_effect
1148 LOGICAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: gdrift
1155 REAL(KIND=JPRB) :: zhook_handle
1159 IF (lhook) CALL dr_hook(
'SNOW3LDRIFT',0,zhook_handle)
1164 ini =
SIZE(psnowdz(:,:),1)
1165 inlvls =
SIZE(psnowdz(:,:),2)
1167 zsnowrho2(:,:) = psnowrho(:,:)
1168 zrdrift(:,:) = xundef
1171 zqs_effect(:,:) = 0.0
1172 zdrift_effect(:,:) = 0.0
1173 gdrift(:,:) = .false.
1177 zsnowdz1(:) = psnowdz(:,1)
1183 zforest_effect(:) = 1.0 - 0.85 * pforestfrac(:)
1185 zwind(:) = xcoef_ff * zforest_effect(:) * pvmod(:)
1191 zrmob(ji,jj)= 1.25-1.25e-3*(max(psnowrho(ji,jj),xvromin)-xvromin) / xvmob1
1194 zrdrift(ji,jj) = zrmob(ji,jj)-(xvdrift1*exp(-xvdrift2*zwind(ji))-1.0)
1201 gdrift(:,:) = (zrdrift(:,:)>0.0)
1204 IF(.NOT.gdrift(ji,jj))
THEN
1205 gdrift(ji,jj:inlvls)=.false.
1214 IF(osnowdrift_sublim)
THEN
1216 zqsati(:)=
qsati(pta(:),pps(:))
1220 zw(:)=max(-0.99,zrmob(:,1))
1221 zvt(:)=log(xvdrift1/(1.0+zw(:)))/xvdrift2
1224 zw(:)=log(zwind(:)/zvt(:))
1225 zw(:)=exp(3.6*zw(:))
1233 zt(:)=0.0018*(zt(:)**4)
1235 zqs(:)=zt(:)*zvt(:)*prhoa(:)*zqsati(:)*(1.-pqa(:)/zqsati(:))*zw(:)
1239 psnowdz(:,1)=max(0.5*psnowdz(:,1),psnowdz(:,1)-max(0.,zqs(:))*ptstep/(xcoef_ff*psnowrho(:,1)))
1241 psndrift(:) = (zsnowdz1(:)-psnowdz(:,1))*psnowrho(:,1)/ptstep
1243 zqs_effect(:,1)=min(3.,max(0.,zqs(:))/xqs_ref)
1254 zprofequ(ji) = zprofequ(ji) + 0.5 * psnowdz(ji,jj) * 0.1 * (xvdrift3-zrdrift(ji,jj))
1256 IF(gdrift(ji,jj).AND.psnowrho(ji,jj)<xvromax)
THEN
1259 zrt(ji,jj) = max(0.0,zrdrift(ji,jj)*exp(-zprofequ(ji)*100.0))
1261 zdrift_effect(ji,jj) = (zqs_effect(ji,jj)+xcoef_effect)*zrt(ji,jj)/(xvtime*xcoef_ff)
1264 zdro(ji,jj) = (xvromax - psnowrho(ji,jj)) * zdrift_effect(ji,jj) * ptstep
1267 zsnowrho2(ji,jj) = min(xvromax,psnowrho(ji,jj)+zdro(ji,jj))
1270 psnowdz(ji,jj) = psnowdz(ji,jj)*(psnowrho(ji,jj)/zsnowrho2(ji,jj))
1275 zprofequ(ji) = zprofequ(ji) + 0.5 * psnowdz(ji,jj) * 0.1 * (xvdrift3-zrdrift(ji,jj))
1288 psnow(ji) = psnow(ji) + psnowdz(ji,jj)
1294 psnowrho(:,:) = zsnowrho2(:,:)
1296 IF (lhook) CALL dr_hook(
'SNOW3LDRIFT',1,zhook_handle)
1305 psnowrho,psnowheat,psnowage)
1321 REAL,
DIMENSION(: ),
INTENT(IN) :: psnow
1323 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowdzn
1324 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowheat
1325 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowrho
1326 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowdz
1327 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowage
1331 INTEGER :: ji, jl, jlo
1336 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowrhon
1337 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowheatn
1338 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowagen
1339 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowztop_new
1340 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowzbot_new
1341 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowrhoo
1342 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowheato
1343 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowageo
1344 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowdzo
1345 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowztop_old
1346 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowzbot_old
1347 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowhean
1348 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowagn
1349 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zmastotn
1350 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zmassdzo
1352 REAL,
DIMENSION(SIZE(PSNOW)) :: zpsnow_old, zpsnow_new
1353 REAL,
DIMENSION(SIZE(PSNOW)) :: zsumheat, zsumswe, zsumage, zsnowmix_delta
1357 REAL(KIND=JPRB) :: zhook_handle
1365 IF (lhook) CALL dr_hook(
'SNOW3LTRANSF',0,zhook_handle)
1367 ini =
SIZE(psnowrho,1)
1368 inlvls =
SIZE(psnowrho,2)
1371 zpsnow_old(:) = psnow(:)
1375 zpsnow_new(ji)=zpsnow_new(ji)+psnowdzn(ji,jl)
1381 zsnowdzo(:,:) = psnowdz(:,:)
1382 zsnowrhoo(:,:) = psnowrho(:,:)
1383 zsnowheato(:,:) = psnowheat(:,:)
1384 zsnowageo(:,:) = psnowage(:,:)
1385 zmassdzo(:,:) = xundef
1390 zsnowztop_old(:,1) = zpsnow_old(:)
1391 zsnowztop_new(:,1) = zpsnow_new(:)
1392 zsnowzbot_old(:,1) = zsnowztop_old(:,1)-zsnowdzo(:,1)
1393 zsnowzbot_new(:,1) = zsnowztop_new(:,1)-psnowdzn(:,1)
1397 zsnowztop_old(ji,jl) = zsnowzbot_old(ji,jl-1)
1398 zsnowztop_new(ji,jl) = zsnowzbot_new(ji,jl-1)
1399 zsnowzbot_old(ji,jl) = zsnowztop_old(ji,jl )-zsnowdzo(ji,jl)
1400 zsnowzbot_new(ji,jl) = zsnowztop_new(ji,jl )-psnowdzn(ji,jl)
1403 zsnowzbot_old(:,inlvls)=0.0
1404 zsnowzbot_new(:,inlvls)=0.0
1421 IF((zsnowztop_old(ji,jlo)>zsnowzbot_new(ji,jl)).AND.(zsnowzbot_old(ji,jlo)<zsnowztop_new(ji,jl)))
THEN
1423 zpropor = (min(zsnowztop_old(ji,jlo), zsnowztop_new(ji,jl)) &
1424 - max(zsnowzbot_old(ji,jlo), zsnowzbot_new(ji,jl)))&
1427 zmassdzo(ji,jlo)=zsnowrhoo(ji,jlo)*zsnowdzo(ji,jlo)*zpropor
1429 zmastotn(ji,jl)=zmastotn(ji,jl)+zmassdzo(ji,jlo)
1430 zsnowagn(ji,jl)=zsnowagn(ji,jl)+zsnowageo(ji,jlo)*zmassdzo(ji,jlo)
1432 zsnowhean(ji,jl)=zsnowhean(ji,jl)+zsnowheato(ji,jlo)*zpropor
1442 zsnowheatn(:,:)= zsnowhean(:,:)
1443 zsnowagen(:,:)= zsnowagn(:,:)/zmastotn(:,:)
1444 zsnowrhon(:,:)= zmastotn(:,:)/psnowdzn(:,:)
1458 zsnowmix_delta(:) = 0.0
1462 IF(psnow(ji) < xsnowcritd)
THEN
1463 zsumheat(ji) = zsumheat(ji) + psnowheat(ji,jl)
1464 zsumswe(ji) = zsumswe(ji) + psnowrho(ji,jl)*psnowdz(ji,jl)
1465 zsumage(ji) = zsumage(ji) + psnowage(ji,jl)
1466 zsnowmix_delta(ji) = 1.0
1478 zsnowheatn(ji,jl) = zsnowmix_delta(ji)*(zsumheat(ji)/inlvls) + &
1479 (1.0-zsnowmix_delta(ji))*zsnowheatn(ji,jl)
1481 psnowdzn(ji,jl) = zsnowmix_delta(ji)*(psnow(ji)/inlvls) + &
1482 (1.0-zsnowmix_delta(ji))*psnowdzn(ji,jl)
1484 zsnowrhon(ji,jl) = zsnowmix_delta(ji)*(zsumswe(ji)/psnow(ji)) + &
1485 (1.0-zsnowmix_delta(ji))*zsnowrhon(ji,jl)
1487 zsnowagen(ji,jl) = zsnowmix_delta(ji)*(zsumage(ji)/inlvls) + &
1488 (1.0-zsnowmix_delta(ji))*zsnowagen(ji,jl)
1496 psnowdz(:,:) = psnowdzn(:,:)
1497 psnowrho(:,:) = zsnowrhon(:,:)
1498 psnowheat(:,:) = zsnowheatn(:,:)
1499 psnowage(:,:) = zsnowagen(:,:)
1501 IF (lhook) CALL dr_hook(
'SNOW3LTRANSF',1,zhook_handle)
1511 pspectralalbedo, psnowdz, psnowrho, palb, &
1512 ppermsnowfrac, pzenith, pswnetsnow, &
1513 pswnetsnows, pradsink, pradxs, psnowage )
1521 USE modd_snow_par, ONLY : xvspec1,xvspec2,xvspec3,xvbeta1,xvbeta2, &
1522 xvbeta4,xvbeta3,xvbeta5, xmincoszen
1531 LOGICAL,
INTENT(IN) :: omeb
1534 REAL,
INTENT(IN) :: psnowdzmin
1536 REAL,
DIMENSION(:),
INTENT(IN) :: psw_rad
1537 REAL,
DIMENSION(:),
INTENT(IN) :: psnowalb
1538 REAL,
DIMENSION(:),
INTENT(IN) :: palb
1539 REAL,
DIMENSION(:),
INTENT(IN) :: ppermsnowfrac
1540 REAL,
DIMENSION(:),
INTENT(IN) :: pzenith
1542 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowrho, psnowdz, psnowage
1543 REAL,
DIMENSION(:,:),
INTENT(IN) :: pspectralalbedo
1545 REAL,
DIMENSION(:),
INTENT(INOUT) :: pswnetsnow, pswnetsnows
1547 REAL,
DIMENSION(:),
INTENT(OUT) :: pradxs
1549 REAL,
DIMENSION(:,:),
INTENT(OUT) :: pradsink
1559 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zradtot, zprojlat, zcoszen
1560 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zopticalpath1, zopticalpath2, zopticalpath3
1562 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zdsgrain, zcoef, zsnowdz, zage
1563 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zbeta1, zbeta2, zbeta3, zwork
1564 REAL,
DIMENSION(SIZE(PSPECTRALALBEDO,1),SIZE(PSPECTRALALBEDO,2)) :: zspectralalbedo
1566 REAL(KIND=JPRB) :: zhook_handle
1572 IF (lhook) CALL dr_hook(
'SNOW3LRAD',0,zhook_handle)
1574 ini =
SIZE(psnowdz(:,:),1)
1575 inlvls =
SIZE(psnowdz(:,:),2)
1577 zspectralalbedo(:,:) = 0.
1587 zsnowdz(:,:) = max(psnowdzmin, psnowdz(:,:))
1599 zcoszen(:)=max(xmincoszen,cos(pzenith(:)))
1605 zprojlat(:)=(1.0-ppermsnowfrac(:))+ppermsnowfrac(:)/zcoszen(:)
1611 zage(ji,jj) = (1.0-ppermsnowfrac(ji))*psnowage(ji,jj)
1619 zwork(:,:)=sqrt(zdsgrain(:,:))
1621 zbeta1(:,:)=max(xvbeta1*psnowrho(:,:)/zwork(:,:),xvbeta2)
1622 zbeta2(:,:)=max(xvbeta3*psnowrho(:,:)/zwork(:,:),xvbeta4)
1625 zopticalpath1(:) = 0.0
1626 zopticalpath2(:) = 0.0
1627 zopticalpath3(:) = 0.0
1635 zspectralalbedo(:,1) = pspectralalbedo(:,1)
1636 zspectralalbedo(:,2) = (psnowalb(:) - xsw_wght_vis*zspectralalbedo(:,1))/xsw_wght_nir
1641 zopticalpath1(ji) = zopticalpath1(ji) + zbeta1(ji,jj)*zsnowdz(ji,jj)
1642 zopticalpath2(ji) = zopticalpath2(ji) + zbeta2(ji,jj)*zsnowdz(ji,jj)
1644 zcoef(ji,jj) = xsw_wght_vis*(1.0-zspectralalbedo(ji,1))*exp(-zopticalpath1(ji)*zprojlat(ji)) &
1645 + xsw_wght_nir*(1.0-zspectralalbedo(ji,2))*exp(-zopticalpath2(ji)*zprojlat(ji))
1652 zcoef(:,1) = 1.0 - pswnetsnows(:)/max(1.e-4,pswnetsnow(:))
1659 zopticalpath1(ji) = zopticalpath1(ji) + zbeta1(ji,jj)*zsnowdz(ji,jj)
1660 zopticalpath2(ji) = zopticalpath2(ji) + zbeta2(ji,jj)*zsnowdz(ji,jj)
1661 zopticalpath3(ji) = zopticalpath3(ji) + zbeta3(ji,jj)*zsnowdz(ji,jj)
1663 zcoef(ji,jj) = xvspec1*(1.0-pspectralalbedo(ji,1))*exp(-zopticalpath1(ji)*zprojlat(ji)) &
1664 + xvspec2*(1.0-pspectralalbedo(ji,2))*exp(-zopticalpath2(ji)*zprojlat(ji)) &
1665 + xvspec3*(1.0-pspectralalbedo(ji,3))*exp(-zopticalpath3(ji)*zprojlat(ji))
1670 pswnetsnow(:) = psw_rad(:)*(1.-psnowalb(:))
1671 pswnetsnows(:) = pswnetsnow(:)*(1.0-zcoef(:,1))
1682 pradsink(ji,jj) = -psw_rad(ji)*zcoef(ji,jj)
1691 pradsink(:,inlvls) = pradsink(:,inlvls)*(1.0-palb(:))
1696 zradtot(:) = pradsink(:,1) + (1.-psnowalb(:))*psw_rad(:)
1699 zradtot(ji) = zradtot(ji) + pradsink(ji,jj)-pradsink(ji,jj-1)
1703 pradxs(:) = (1.-psnowalb(:))*psw_rad(:) - zradtot(:)
1705 IF (lhook) CALL dr_hook(
'SNOW3LRAD',1,zhook_handle)
1714 ppew_a_coef, ppew_b_coef, &
1715 ppet_a_coef, ppeq_a_coef, ppet_b_coef, ppeq_b_coef, &
1717 pzref,pts,psnowrho,psnowliq,pscap,pscond1,pscond2, &
1718 puref,pexns,pexna,pdircoszw,pvmod, &
1719 plw_rad,psw_rad,pta,pqa,pps,ptstep, &
1720 psnowdz1,psnowdz2,palbt,pz0,pz0eff,pz0h, &
1721 psfcfrz,pradsink,phpsnow, &
1722 pct,pemist,prhoa,ptsterm1,ptsterm2,pra,pcdsnow,pchsnow, &
1723 pqsat,pdqsat,prsra,pustar2_ic,pri, &
1724 ppet_a_coef_t,ppeq_a_coef_t,ppet_b_coef_t,ppeq_b_coef_t )
1732 USE modd_csts, ONLY : xcpd, xrholw, xstefan, xlvtt, xlstt
1738 USE modi_surface_aero_cond
1746 REAL,
INTENT(IN) :: ptstep, psnowdzmin
1748 CHARACTER(LEN=*),
INTENT(IN) :: hsnowres
1753 CHARACTER(LEN=*),
INTENT(IN) :: himplicit_wind
1757 REAL,
DIMENSION(:),
INTENT(IN) :: ppew_a_coef, ppew_b_coef, &
1758 ppet_a_coef, ppeq_a_coef, ppet_b_coef, &
1767 REAL,
DIMENSION(:),
INTENT(IN) :: pzref, pts, psnowdz1, psnowdz2, &
1768 pradsink, psnowrho, psnowliq, pscap, &
1773 REAL,
DIMENSION(:),
INTENT(IN) :: psw_rad, plw_rad, pta, pqa, pps, prhoa
1775 REAL,
DIMENSION(:),
INTENT(IN) :: puref, pexns, pexna, pdircoszw, pvmod
1777 REAL,
DIMENSION(:),
INTENT(OUT) :: ptsterm1, ptsterm2, pemist, pra, &
1778 pct, psfcfrz, pcdsnow, pchsnow, &
1779 pqsat, pdqsat, prsra
1781 REAL,
DIMENSION(:),
INTENT(OUT) :: pustar2_ic, &
1782 ppet_a_coef_t, ppeq_a_coef_t, &
1783 ppet_b_coef_t, ppeq_b_coef_t
1785 REAL,
DIMENSION(:),
INTENT(OUT) :: pri
1789 REAL,
DIMENSION(SIZE(PTS)) :: zac, zri, zcond1, zcond2, &
1790 zsconda, za, zb, zc, &
1791 zcdn, zsnowdzm1, zsnowdzm2, &
1792 zvmod, zustar2, zts3, zlvt, &
1794 REAL(KIND=JPRB) :: zhook_handle
1801 IF (lhook) CALL dr_hook(
'SNOW3LEBUD',0,zhook_handle)
1805 pqsat(:) =
qsati(pts(:),pps(:))
1806 pdqsat(:) =
dqsati(pts(:),pps(:),pqsat(:))
1820 CALL
surface_ri(pts, pqsat, pexns, pexna, pta, pqa, &
1821 pzref, puref, pdircoszw, pvmod, zri )
1828 IF(hsnowres==
'RIL')
THEN
1830 zri(jj) = min(x_ri_max,zri(jj))
1842 CALL
surface_cd(zri, pzref, puref, pz0eff, pz0h, pcdsnow, zcdn)
1844 prsra(:) = prhoa(:) / pra(:)
1850 IF(himplicit_wind==
'OLD')
THEN
1852 zustar2(:) = ( pcdsnow(:)*pvmod(:)*ppew_b_coef(:)) / &
1853 (1.0-prhoa(:)*pcdsnow(:)*pvmod(:)*ppew_a_coef(:))
1856 zustar2(:) = (pcdsnow(:)*pvmod(:)*(2.*ppew_b_coef(:)-pvmod(:))) &
1857 / (1.0-2.0*prhoa(:)*pcdsnow(:)*pvmod(:)*ppew_a_coef(:))
1860 zvmod(:) = prhoa(:)*ppew_a_coef(:)*zustar2(:) + ppew_b_coef(:)
1861 zvmod(:) = max(zvmod(:),0.)
1863 WHERE(ppew_a_coef(:)/= 0.)
1864 zustar2(:) = max( ( zvmod(:) - ppew_b_coef(:) ) / (prhoa(:)*ppew_a_coef(:)), 0.)
1868 zustar2(:) = max(zustar2(:),0.)
1870 pustar2_ic(:) = zustar2(:)
1878 zsnowdzm1(:) = max(psnowdz1(:), psnowdzmin)
1879 zsnowdzm2(:) = max(psnowdz2(:), psnowdzmin)
1883 pct(:) = 1.0/(pscap(:)*zsnowdzm1(:))
1894 zcond1(:) = zsnowdzm1(:)/((zsnowdzm1(:)+zsnowdzm2(:))*pscond1(:))
1895 zcond2(:) = zsnowdzm2(:)/((zsnowdzm1(:)+zsnowdzm2(:))*pscond2(:))
1897 zsconda(:) = 1.0/(zcond1(:)+zcond2(:))
1904 z_ccoef(:) = 1.0 - ppeq_a_coef(:)*prsra(:)
1906 ppeq_a_coef_t(:) = - ppeq_a_coef(:)*prsra(:)*pdqsat(:)/z_ccoef(:)
1908 ppeq_b_coef_t(:) = ( ppeq_b_coef(:) - ppeq_a_coef(:)*prsra(:)*(pqsat(:) - &
1909 pdqsat(:)*pts(:)) )/z_ccoef(:)
1914 z_ccoef(:) = (1.0 - ppet_a_coef(:)*prsra(:))/pexna(:)
1916 ppet_a_coef_t(:) = - ppet_a_coef(:)*prsra(:)/(pexns(:)*z_ccoef(:))
1918 ppet_b_coef_t(:) = ppet_b_coef(:)/z_ccoef(:)
1923 zts3(:) = pemist(:) * xstefan * pts(:)**3
1924 zlvt(:) = (1.-psfcfrz(:))*xlvtt + psfcfrz(:)*xlstt
1926 za(:) = 1. / ptstep + pct(:) * (4. * zts3(:) + &
1927 prsra(:) * zlvt(:) * (pdqsat(:) - ppeq_a_coef_t(:)) &
1928 + prsra(:) * xcpd * ( (1./pexns(:))-(ppet_a_coef_t(:)/pexna(:)) ) &
1929 + (2.*zsconda(:)/(zsnowdzm2(:)+zsnowdzm1(:))) )
1931 zb(:) = 1. / ptstep + pct(:) * (3. * zts3(:) + &
1932 prsra(:) * pdqsat(:) * zlvt(:) )
1934 zc(:) = pct(:) * (prsra(:) * xcpd * ppet_b_coef_t(:)/pexna(:) + psw_rad(:) * &
1935 (1. - palbt(:)) + pemist(:)*plw_rad(:) - prsra(:) * &
1936 zlvt(:) * (pqsat(:)-ppeq_b_coef_t(:)) &
1937 + phpsnow(:) + pradsink(:) )
1943 ptsterm2(:) = 2.*zsconda(:)*pct(:)/(za(:)*(zsnowdzm2(:)+zsnowdzm1(:)))
1945 ptsterm1(:) = (pts(:)*zb(:) + zc(:))/za(:)
1946 IF (lhook) CALL dr_hook(
'SNOW3LEBUD',1,zhook_handle)
1955 psnowdz,pscond,pscap,ptg, &
1957 pradsink,pct,pterm1,pterm2, &
1958 ppet_a_coef_t,ppeq_a_coef_t, &
1959 ppet_b_coef_t,ppeq_b_coef_t, &
1961 pgrndflux,pgrndfluxo,psnowtemp, &
1986 USE modi_tridiag_ground
1992 LOGICAL,
INTENT(IN) :: omeb
1994 REAL,
INTENT(IN) :: ptstep, psnowdzmin
1996 REAL,
DIMENSION(:),
INTENT(IN) :: ptg, psoilcond, pd_g, &
2000 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowdz, pscond, pscap, &
2003 REAL,
DIMENSION(:),
INTENT(IN) :: ppet_a_coef_t, ppeq_a_coef_t, &
2004 ppet_b_coef_t, ppeq_b_coef_t
2006 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowtemp
2008 REAL,
DIMENSION(:),
INTENT(OUT) :: pgrndflux, pgrndfluxo, psnowflux, &
2020 REAL,
DIMENSION(SIZE(PTG)) :: zsnowtemp_delta
2022 REAL,
DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)) :: zsnowtemp, zdterm, zcterm, &
2023 zfrcv, zamtrx, zbmtrx, &
2026 REAL,
DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)) :: zwork1, zwork2, zdzdif, &
2029 REAL,
DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)-1) :: zsnowtemp_m, &
2030 zfrcv_m, zamtrx_m, &
2032 REAL(KIND=JPRB) :: zhook_handle
2038 IF (lhook) CALL dr_hook(
'SNOW3LSOLVT',0,zhook_handle)
2039 zsnowtemp(:,:) = psnowtemp(:,:)
2040 ini =
SIZE(psnowdz(:,:),1)
2041 inlvls =
SIZE(psnowdz(:,:),2)
2050 zsnowdzm(:,:) = max(psnowdz(:,:), psnowdzmin)
2054 zdzdif(ji,jj) = 0.5*(zsnowdzm(ji,jj)+zsnowdzm(ji,jj+1))
2055 zwork1(ji,jj) = zsnowdzm(ji,jj )/(2.0*zdzdif(ji,jj)*pscond(ji,jj ))
2056 zwork2(ji,jj) = zsnowdzm(ji,jj+1)/(2.0*zdzdif(ji,jj)*pscond(ji,jj+1))
2060 zdzdif(:,inlvls) = 0.5*(zsnowdzm(:,inlvls)+pd_g(:))
2061 zwork1(:,inlvls) = zsnowdzm(:,inlvls)/(2.0*zdzdif(:,inlvls)*pscond(:,inlvls))
2062 zwork2(:,inlvls) = pd_g(: )/(2.0*zdzdif(:,inlvls)*psoilcond(: ))
2064 zdterm(:,:) = 1.0/(zdzdif(:,:)*(zwork1(:,:)+zwork2(:,:)))
2066 zcterm(:,:) = pscap(:,:)*zsnowdzm(:,:)/ptstep
2074 zbmtrx(:,1) = 1./(pct(:)*ptstep)
2075 zcmtrx(:,1) = -pterm2(:)*zbmtrx(:,1)
2076 zfrcv(:,1) = pterm1(:)*zbmtrx(:,1)
2083 zamtrx(ji,jj) = -zdterm(ji,jj-1)
2084 zbmtrx(ji,jj) = zcterm(ji,jj) + zdterm(ji,jj-1) + zdterm(ji,jj)
2085 zcmtrx(ji,jj) = -zdterm(ji,jj)
2086 zfrcv(ji,jj) = zcterm(ji,jj)*psnowtemp(ji,jj) - (pradsink(ji,jj-1)-pradsink(ji,jj))
2092 zamtrx(:,inlvls) = -zdterm(:,inlvls-1)
2093 zbmtrx(:,inlvls) = zcterm(:,inlvls) + zdterm(:,inlvls-1) + &
2095 zcmtrx(:,inlvls) = 0.0
2096 zfrcv(:,inlvls) = zcterm(:,inlvls)*psnowtemp(:,inlvls) + &
2097 zdterm(:,inlvls)*ptg(:) &
2098 - (pradsink(:,inlvls-1)-pradsink(:,inlvls))
2109 psnowflux(:) = zdterm(:,1)*(zsnowtemp(:,1) - zsnowtemp(:,2))
2130 zbmtrx_m(:,1) = zcterm(:,2) + zdterm(:,1) + zdterm(:,2)
2131 zcmtrx_m(:,1) = -zdterm(:,2)
2132 zfrcv_m(:,1) = zcterm(:,2)*psnowtemp(:,2) + xtt*zdterm(:,1) - &
2133 (pradsink(:,1)-pradsink(:,2))
2137 zamtrx_m(ji,jj) = zamtrx(ji,jj+1)
2138 zbmtrx_m(ji,jj) = zbmtrx(ji,jj+1)
2139 zcmtrx_m(ji,jj) = zcmtrx(ji,jj+1)
2140 zfrcv_m(ji,jj) = zfrcv(ji,jj+1)
2141 zsnowtemp_m(ji,jj) = psnowtemp(ji,jj+1)
2145 CALL
tridiag_ground(zamtrx_m,zbmtrx_m,zcmtrx_m,zfrcv_m,zsnowtemp_m)
2150 zsnowtemp_delta(:) = 0.0
2152 WHERE(zsnowtemp(:,1) > xtt .AND. psnowtemp(:,1) == xtt)
2153 psnowflux(:) = zdterm(:,1)*(xtt - zsnowtemp_m(:,1))
2154 zsnowtemp_delta(:) = 1.0
2159 zsnowtemp(ji,jj) = zsnowtemp_delta(ji)*zsnowtemp_m(ji,jj-1) &
2160 + (1.0-zsnowtemp_delta(ji))*zsnowtemp(ji,jj)
2174 pgrndfluxo(:) = zdterm(:,inlvls)*(zsnowtemp(:,inlvls) -ptg(:))
2175 pgrndflux(:) = zdterm(:,inlvls)*(min(xtt,zsnowtemp(:,inlvls))-ptg(:))
2177 zsnowtemp(:,inlvls) = zsnowtemp(:,inlvls) + (pgrndfluxo(:)-pgrndflux(:))/zcterm(:,inlvls)
2182 psnowtemp(:,:) = zsnowtemp(:,:)
2190 pta_ic(:) = ppet_b_coef_t(:) + ppet_a_coef_t(:)* psnowtemp(:,1)
2192 pqa_ic(:) = ppeq_b_coef_t(:) + ppeq_a_coef_t(:)* psnowtemp(:,1)
2196 IF (lhook) CALL dr_hook(
'SNOW3LSOLVT',1,zhook_handle)
2204 psnowrho,psnowliq,pmeltxs )
2216 USE modd_csts,ONLY : xtt, xlmtt, xrholw, xrholi
2224 REAL,
INTENT(IN) :: ptstep
2226 REAL,
DIMENSION(:,:),
INTENT(IN) :: pscap
2228 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowdz, psnowtemp, psnowrho, &
2231 REAL,
DIMENSION(:),
INTENT(OUT) :: pmeltxs
2236 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zphase, zcmprsfact, &
2237 zsnowlwe, zwholdmax, &
2238 zsnowmelt, zsnowtemp, &
2242 REAL(KIND=JPRB) :: zhook_handle
2248 IF (lhook) CALL dr_hook(
'SNOW3LMELT',0,zhook_handle)
2250 zcmprsfact(:,:) = 0.0
2252 zwholdmax(:,:) = 0.0
2253 zsnowmelt(:,:) = 0.0
2254 zsnowtemp(:,:) = 0.0
2260 WHERE(psnowdz > 0.0)
2264 zsnowlwe(:,:) = psnowrho(:,:)*psnowdz(:,:)/xrholw
2269 zphase(:,:) = min(pscap(:,:)*max(0.0, psnowtemp(:,:) - xtt)* &
2271 max(0.0,zsnowlwe(:,:)-psnowliq(:,:))*xlmtt*xrholw)
2278 zsnowmelt(:,:) = zphase(:,:)/(xlmtt*xrholw)
2282 zsnowtemp(:,:) = psnowtemp(:,:) - zphase(:,:)/(pscap(:,:)*psnowdz(:,:))
2284 psnowtemp(:,:) = min(xtt, zsnowtemp(:,:))
2286 zmeltxs(:,:) = (zsnowtemp(:,:)-psnowtemp(:,:))*pscap(:,:)*psnowdz(:,:)
2299 zwholdmax(:,:) =
snow3lhold(psnowrho,psnowdz)
2301 WHERE(psnowdz > 0.0)
2303 zcmprsfact(:,:) = (zsnowlwe(:,:)-min(psnowliq(:,:)+zsnowmelt(:,:), &
2305 (zsnowlwe(:,:)-min(psnowliq(:,:),zwholdmax(:,:)))
2307 psnowdz(:,:) = psnowdz(:,:)*zcmprsfact(:,:)
2308 psnowrho(:,:) = zsnowlwe(:,:)*xrholw/psnowdz(:,:)
2313 zcmprsfact(:,:) = max(xrholi, psnowrho(:,:))/xrholi
2314 psnowdz(:,:) = psnowdz(:,:)*zcmprsfact(:,:)
2315 psnowrho(:,:) = zsnowlwe(:,:)*xrholw/psnowdz(:,:)
2321 psnowliq(:,:) = psnowliq(:,:) + zsnowmelt(:,:)
2330 DO jwrk = 1,
SIZE(zmeltxs,2)
2331 DO ji = 1,
SIZE(zmeltxs,1)
2332 pmeltxs(ji) = pmeltxs(ji) + zmeltxs(ji,jwrk)
2335 pmeltxs(:) = pmeltxs(:) / ptstep
2337 IF (lhook) CALL dr_hook(
'SNOW3LMELT',1,zhook_handle)
2346 psnowrho,psnowtemp,psnowdz,psnowliq, &
2358 USE modd_csts, ONLY : xtt, xlmtt, xrholw
2367 REAL,
INTENT(IN) :: ptstep
2369 REAL,
DIMENSION(:),
INTENT(IN) :: prr
2371 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowdz, psnowtemp, psnowliq, psnowrho
2373 REAL,
DIMENSION(:),
INTENT(INOUT) :: pthrufal
2384 REAL,
DIMENSION(SIZE(PRR)) :: zpcpxs, ztotwcap, zrainfall
2386 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zflowliq, zwork, &
2387 zsnowliq, zsnowrho, &
2388 zwholdmax, zsnowdz, &
2392 REAL,
DIMENSION(SIZE(PSNOWRHO,1),0:SIZE(PSNOWRHO,2)):: zflowliqt
2394 REAL(KIND=JPRB) :: zhook_handle
2401 IF (lhook) CALL dr_hook(
'SNOW3LREFRZ',0,zhook_handle)
2403 zsnowrho(:,:) = psnowrho(:,:)
2404 zsnowliq(:,:) = psnowliq(:,:)
2405 zsnowtemp(:,:) = psnowtemp(:,:)
2406 ini =
SIZE(psnowdz(:,:),1)
2407 inlvls =
SIZE(psnowdz(:,:),2)
2417 zsnowheat(:,:) = psnowdz(:,:)*( zscap(:,:)*(zsnowtemp(:,:)-xtt) &
2418 - xlmtt*zsnowrho(:,:) ) + xlmtt*xrholw*zsnowliq(:,:)
2420 zsnowtemp(:,:) = xtt + ( ((zsnowheat(:,:)/max(psnowdz(:,:),xsnowdmin/inlvls)) &
2421 + xlmtt*zsnowrho(:,:))/zscap(:,:) )
2423 zsnowliq(:,:) = max(0.0,zsnowtemp(:,:)-xtt)*zscap(:,:)*psnowdz(:,:)/(xlmtt*xrholw)
2425 zsnowtemp(:,:) = min(xtt,zsnowtemp(:,:))
2438 zwholdmax(:,:) =
snow3lhold(psnowrho,psnowdz)
2440 zflowliq(:,:) = max(0.,zsnowliq(:,:)-zwholdmax(:,:))
2442 zsnowliq(:,:) = zsnowliq(:,:) - zflowliq(:,:)
2444 zsnowdz(:,:) = psnowdz(:,:) - zflowliq(:,:)*xrholw/zsnowrho(:,:)
2446 zsnowdz(:,:) = max(0.0, zsnowdz(:,:))
2462 ztotwcap(ji) = ztotwcap(ji) + zwholdmax(ji,jj)
2468 zrainfall(:) = prr(:)*ptstep/xrholw
2470 zflowliqt(:,0)= min(zrainfall(:),ztotwcap(:))
2474 zpcpxs(:) = zrainfall(:) - zflowliqt(:,0)
2478 zflowliqt(ji,jj) = zflowliq(ji,jj)
2495 psnowliq(:,:) = zsnowliq(:,:)
2499 zsnowliq(ji,jj) = zsnowliq(ji,jj) + zflowliqt(ji,jj-1)
2500 zflowliq(ji,jj) = max(0.0, zsnowliq(ji,jj)-zwholdmax(ji,jj))
2501 zsnowliq(ji,jj) = zsnowliq(ji,jj) - zflowliq(ji,jj)
2502 zflowliqt(ji,jj) = zflowliqt(ji,jj) + zflowliq(ji,jj)
2506 zwork(:,:) = max(xsnowdmin/inlvls,zsnowdz(:,:))
2507 zsnowrho(:,:) = zsnowrho(:,:)+(zsnowliq(:,:)-psnowliq(:,:))*xrholw/zwork(:,:)
2509 zsnowtemp(:,:) = xtt +(((zsnowheat(:,:)/zwork(:,:))+xlmtt*zsnowrho(:,:))/zscap(:,:))
2510 zsnowliq(:,:) = max(0.0,zsnowtemp(:,:)-xtt)*zscap(:,:)*zsnowdz(:,:)/(xlmtt*xrholw)
2511 zsnowtemp(:,:) = min(xtt,zsnowtemp(:,:))
2518 pthrufal(:) = pthrufal(:) + zflowliqt(:,inlvls)
2523 pthrufal(:) = (pthrufal(:) + zpcpxs(:))*xrholw/ptstep
2528 psnowtemp(:,:)= zsnowtemp(:,:)
2529 psnowdz(:,:) = zsnowdz(:,:)
2530 psnowrho(:,:) = zsnowrho(:,:)
2531 psnowliq(:,:) = zsnowliq(:,:)
2533 IF (lhook) CALL dr_hook(
'SNOW3LREFRZ',1,zhook_handle)
2543 ptstep,palbt,psw_rad,pemist,plwupsnow, &
2544 plw_rad,plwnetsnow, &
2545 pta,psfcfrz,pqa,phpsnow, &
2546 psnowtempo1,psnowflux,pct,pradsink, &
2547 pqsat,pdqsat,prsra, &
2548 prn,ph,pgflux,ples3l,plel3l,pevap, &
2558 USE modd_csts,ONLY : xstefan, xcpd, xlstt, xlvtt, xtt
2566 REAL,
INTENT(IN) :: ptstep
2568 REAL,
DIMENSION(:),
INTENT(IN) :: psnowdz, psnowtempo1, psnowflux, pct, &
2569 pradsink, pexns, pexna
2571 REAL,
DIMENSION(:),
INTENT(IN) :: palbt, psw_rad, pemist, plw_rad, &
2572 pta, psfcfrz, pqa, &
2573 phpsnow, pqsat, pdqsat, prsra, &
2576 REAL,
DIMENSION(:),
INTENT(INOUT) :: psnowtemp
2578 REAL,
DIMENSION(:),
INTENT(OUT) :: prn, ph, pgflux, ples3l, plel3l, &
2579 pevap, plwupsnow, pustar, &
2582 LOGICAL,
DIMENSION(:),
INTENT(OUT) :: osfcmelt
2587 REAL,
DIMENSION(SIZE(PSNOWDZ)) :: zevapc, zle, zsnowtemp, zsmsnow, zgflux, &
2589 REAL(KIND=JPRB) :: zhook_handle
2596 IF (lhook) CALL dr_hook(
'SNOW3LFLUX',0,zhook_handle)
2597 zsnowtemp(:) = psnowtemp(:)
2602 osfcmelt(:) = .false.
2604 zsnowto3(:) = psnowtempo1(:) ** 3
2610 zdeltat(:) = psnowtemp(:) - psnowtempo1(:)
2612 plwupsnow(:) = pemist(:) * xstefan * zsnowto3(:)*( psnowtempo1(:) + 4.* zdeltat(:) )
2614 plwnetsnow(:)= pemist(:) * plw_rad(:) - plwupsnow(:)
2616 prn(:) = (1. - palbt(:)) * psw_rad(:) + plwnetsnow(:)
2618 ph(:) = prsra(:) * xcpd * (psnowtemp(:)/pexns(:) - pta(:)/pexna(:))
2620 zevapc(:) = prsra(:) * ( (pqsat(:) - pqa(:)) + pdqsat(:)*zdeltat(:) )
2622 ples3l(:) = psfcfrz(:) * xlstt * zevapc(:)
2624 plel3l(:) = (1.-psfcfrz(:))* xlvtt * zevapc(:)
2626 zle(:) = ples3l(:) + plel3l(:)
2628 pgflux(:) = prn(:) - ph(:) - zle(:) + phpsnow(:)
2641 WHERE (psnowtemp > xtt .AND. psnowtempo1 < xtt)
2645 zdeltat(:) = xtt - psnowtempo1(:)
2647 plwupsnow(:) = pemist(:) * xstefan * zsnowto3(:)*( psnowtempo1(:) + 4.* zdeltat(:) )
2649 plwnetsnow(:)= pemist(:) * plw_rad(:) - plwupsnow(:)
2651 prn(:) = (1. - palbt(:)) * psw_rad(:) + plwnetsnow(:)
2653 ph(:) = prsra(:) * xcpd * (xtt/pexns(:) - pta(:)/pexna(:))
2655 zevapc(:) = prsra(:) * ( (pqsat(:) - pqa(:)) + pdqsat(:)*zdeltat(:) )
2657 ples3l(:) = psfcfrz(:) * xlstt * zevapc(:)
2659 plel3l(:) = (1.-psfcfrz(:))* xlvtt * zevapc(:)
2661 zle(:) = ples3l(:) + plel3l(:)
2663 zgflux(:) = prn(:) - ph(:) - zle(:) + phpsnow(:)
2665 zsmsnow(:) = pgflux(:) - zgflux(:)
2667 pgflux(:) = zgflux(:)
2671 zsnowtemp(:) = psnowtemp(:) - zsmsnow(:)*ptstep*pct(:)
2681 WHERE(psnowtemp(:) > xtt .AND. psnowtempo1(:) >= xtt)
2683 osfcmelt(:) = .true.
2685 plwupsnow(:) = pemist(:) * xstefan * (xtt ** 4)
2687 plwnetsnow(:)= pemist(:) * plw_rad(:) - plwupsnow(:)
2689 prn(:) = (1. - palbt(:)) * psw_rad(:) + plwnetsnow(:)
2691 ph(:) = prsra(:) * xcpd * (xtt/pexns(:) - pta(:)/pexna(:))
2693 zevapc(:) = prsra(:) * (pqsat(:) - pqa(:))
2695 ples3l(:) = psfcfrz(:) * xlstt * zevapc(:)
2697 plel3l(:) = (1.-psfcfrz(:))* xlvtt * zevapc(:)
2699 zle(:) = ples3l(:) + plel3l(:)
2701 pgflux(:) = prn(:) - ph(:) - zle(:) + phpsnow(:)
2703 zsnowtemp(:) = xtt + ptstep*pct(:)*(pgflux(:) + pradsink(:) - psnowflux(:))
2710 psnowtemp(:) = zsnowtemp(:)
2714 pevap(:) = zevapc(:)
2719 pustar(:) = sqrt(pustar2_ic(:))
2721 IF (lhook) CALL dr_hook(
'SNOW3LFLUX',1,zhook_handle)
2730 psnowrho,psnowdz,psnowliq,pta, &
2731 plvtt,plstt,psnowheat,psoilcor )
2740 USE modd_csts, ONLY : xrholw, xlmtt, xci, xtt
2747 REAL,
INTENT(IN) :: ptstep
2749 REAL,
DIMENSION(:),
INTENT(IN) :: ppsn3l
2751 REAL,
DIMENSION(:),
INTENT(IN) :: ples3l, plel3l
2753 REAL,
DIMENSION(:),
INTENT(IN) :: pta, plvtt, plstt
2755 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowheat, psnowdz
2757 REAL,
DIMENSION(:),
INTENT(INOUT) :: psnowrho, psnowliq, &
2760 REAL,
DIMENSION(:),
INTENT(OUT) :: psoilcor
2764 INTEGER :: ini, inlvls, jj, ji
2766 REAL,
DIMENSION(SIZE(PLES3L)) :: zsnowevaps, zsnowevap, zsnowevapx, &
2767 zsnowdz, zsnowheat, zscap, zsnowtemp
2769 REAL,
DIMENSION(SIZE(PLES3L)) :: zxse, zisnowd
2773 REAL,
PARAMETER :: zsnowdemin = 1.e-4
2774 REAL,
PARAMETER :: ztdif = 15.
2780 REAL(KIND=JPRB) :: zhook_handle
2788 IF (lhook) CALL dr_hook(
'SNOW3LEVAPN',0,zhook_handle)
2801 ini =
SIZE(psnowdz(:,:),1)
2802 inlvls =
SIZE(psnowdz(:,:),2)
2816 WHERE(psnowdz(:,1) > 0.0)
2821 zsnowevap(:) = ppsn3l(:)*plel3l(:)*ptstep/(plvtt(:)*xrholw)
2822 zsnowevapx(:) = min(zsnowevap(:),psnowliq(:))
2827 psnowliq(:) = psnowliq(:) - zsnowevapx(:)
2828 psnowrho(:) = (psnowheat(:,1)-xlmtt*xrholw*psnowliq(:))/ &
2829 (psnowdz(:,1)*(xci*(psnowtemp(:)-xtt)-xlmtt))
2834 psoilcor(:) = max(0.0,xrhosmin_es-psnowrho(:))*psnowdz(:,1)/ptstep
2835 psnowrho(:) = max(xrhosmin_es,psnowrho(:))
2848 WHERE(psnowdz(:,1) > 0.0)
2855 zsnowevapx(:) = max(0.0, zsnowevap(:) - zsnowevapx(:))
2856 zsnowdz(:) = psnowdz(:,1) - zsnowevapx(:)*xrholw/psnowrho(:)
2857 psnowdz(:,1) = max(0.0, zsnowdz(:))
2858 psoilcor(:) = psoilcor(:) + max(0.0,-zsnowdz(:))*psnowrho(:)/ptstep
2864 zsnowevaps(:) = ppsn3l(:)*ples3l(:)*ptstep/(plstt(:)*psnowrho(:))
2865 zsnowdz(:) = psnowdz(:,1) - zsnowevaps(:)
2866 psnowdz(:,1) = max(0.0, zsnowdz(:))
2867 psoilcor(:) = psoilcor(:) + max(0.0,-zsnowdz(:))*psnowrho(:)/ptstep
2874 psnowtemp(:) = xtt + ( ((psnowheat(:,1)/max(zsnowdemin,psnowdz(:,1))) &
2875 + xlmtt*psnowrho(:))/zscap(:) )
2877 psnowliq(:) = max(0.0,psnowtemp(:)-xtt)*zscap(:)* &
2878 psnowdz(:,1)/(xlmtt*xrholw)
2880 psnowtemp(:) = min(xtt,psnowtemp(:))
2886 psnowtemp(:) = max(min(xtt,pta(:)-ztdif), psnowtemp(:))
2890 zsnowheat(:) = psnowheat(:,1)
2891 psnowheat(:,1) = psnowdz(:,1)*( zscap(:)*(psnowtemp(:)-xtt) &
2892 - xlmtt*psnowrho(:) ) + xlmtt*xrholw*psnowliq(:)
2894 zxse(:) = psnowheat(:,1) - zsnowheat(:)
2906 zisnowd(ji) = zisnowd(ji) + psnowdz(ji,jj)
2909 zisnowd(:) = zxse(:)/max(zisnowd(:),zsnowdemin)
2913 psnowheat(ji,jj) = psnowheat(ji,jj) - psnowdz(ji,jj)*zisnowd(ji)
2917 IF (lhook) CALL dr_hook(
'SNOW3LEVAPN',1,zhook_handle)
2926 psnowheat,pradsink,pevapcor,pthrufal,pgrndflux, &
2927 pgfluxsnow,pgrndfluxo,psnowdz,psnowliq,psnowtemp, &
2946 REAL,
INTENT(IN) :: ptstep
2948 REAL,
DIMENSION(:),
INTENT(IN) :: plel3l, ples3l, pgfluxsnow, &
2949 pradsink, pgrndfluxo, &
2952 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowrho, psnowheat
2954 REAL,
DIMENSION(:),
INTENT(INOUT) :: pgrndflux, pradxs
2956 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowdz, psnowliq, psnowtemp
2958 REAL,
DIMENSION(:),
INTENT(OUT) :: pthrufal
2960 REAL,
DIMENSION(:),
INTENT(OUT) :: pevapcor
2974 REAL,
DIMENSION(SIZE(PLES3L)) :: zsnowheatc, zsnowgone_delta, zsnow
2975 REAL(KIND=JPRB) :: zhook_handle
2982 IF (lhook) CALL dr_hook(
'SNOW3LGONE',0,zhook_handle)
2984 ini =
SIZE(psnowdz(:,:),1)
2985 inlvls =
SIZE(psnowdz(:,:),2)
2994 zsnowheatc(ji) = zsnowheatc(ji) + psnowheat(ji,jj)
2995 zsnow(ji) = zsnow(ji) + psnowdz(ji,jj)
2998 zsnowgone_delta(:) = 1.0
3008 WHERE(pgfluxsnow(:) + pradsink(:) >= (-zsnowheatc(:)/ptstep) )
3009 pgrndflux(:) = pgfluxsnow(:) + (zsnowheatc(:)/ptstep)
3010 pevapcor(:) = (plel3l(:)/plvtt(:)) + (ples3l(:)/plstt(:))
3012 zsnowgone_delta(:) = 0.0
3017 pthrufal(ji) = pthrufal(ji) + (1.0-zsnowgone_delta(ji))*psnowrho(ji,jj)*psnowdz(ji,jj)/ptstep
3027 psnowdz(ji,jj) = psnowdz(ji,jj)*zsnowgone_delta(ji)
3028 psnowliq(ji,jj) = psnowliq(ji,jj)*zsnowgone_delta(ji)
3029 psnowtemp(ji,jj) = (1.0-zsnowgone_delta(ji))*xtt + psnowtemp(ji,jj)*zsnowgone_delta(ji)
3032 IF (lhook) CALL dr_hook(
'SNOW3LGONE',1,zhook_handle)
3049 USE modd_csts, ONLY : xtt, xrholw, xlmtt
3050 USE modd_snow_par, ONLY : xrhosmin_es, xsnowdmin, xrhosmax_es
3056 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowrho
3057 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowdz
3058 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowheat
3059 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowtemp
3060 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowliq
3069 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: zsnowheat_1d
3070 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: zsnow
3071 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: zmass
3073 REAL,
DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)) :: zscap
3075 REAL(KIND=JPRB) :: zhook_handle
3081 IF (lhook) CALL dr_hook(
'SNOW3LEVAPGONE',0,zhook_handle)
3082 ini =
SIZE(psnowdz,1)
3083 inlvls =
SIZE(psnowdz,2)
3088 zsnowheat_1d(:) = 0.
3096 IF(psnowdz(ji,1) == 0.0)
THEN
3097 zsnowheat_1d(ji) = zsnowheat_1d(ji) + xlmtt*xrholw*psnowliq(ji,jj) &
3098 + psnowdz(ji,jj)*(zscap(ji,jj)*(psnowtemp(ji,jj)-xtt) &
3099 - xlmtt*psnowrho(ji,jj) )
3100 zsnow(ji) = zsnow(ji) + psnowdz(ji,jj)
3101 zmass(ji) = zmass(ji) + psnowdz(ji,jj)*psnowrho(ji,jj)
3111 IF(zsnow(ji)/= 0.0)
THEN
3112 zsnow(ji) = max(0.5*xsnowdmin,zsnow(ji))
3113 psnowdz(ji,jj) = zsnow(ji)/
REAL(inlvls)
3114 psnowheat(ji,jj) = zsnowheat_1d(ji)/
REAL(inlvls)
3115 psnowrho(ji,jj) = zmass(ji)/zsnow(ji)
3124 IF(zsnow(ji)/= 0.0)
THEN
3125 psnowtemp(ji,jj) = xtt + ( ((psnowheat(ji,jj)/psnowdz(ji,jj)) &
3126 + xlmtt*psnowrho(ji,jj))/zscap(ji,jj) )
3127 psnowliq(ji,jj) = max(0.0,psnowtemp(ji,jj)-xtt)*zscap(ji,jj)* &
3128 psnowdz(ji,jj)/(xlmtt*xrholw)
3129 psnowtemp(ji,jj) = min(xtt,psnowtemp(ji,jj))
3133 IF (lhook) CALL dr_hook(
'SNOW3LEVAPGONE',1,zhook_handle)
3140 pts, psnowdz1, psnowdz2, pscond1, pscond2, pscap, &
3141 pswnetsnows, plwnetsnow, &
3142 phsnow, ples3l, plel3l, phpsnow, &
3143 pct, ptsterm1, ptsterm2, pgfluxsnow )
3153 REAL,
INTENT(IN) :: ptstep, psnowdzmin
3155 REAL,
DIMENSION(:),
INTENT(IN) :: pts, psnowdz1, psnowdz2, pscond1, pscond2, pscap, &
3156 phsnow, ples3l, plel3l, phpsnow, &
3157 pswnetsnows, plwnetsnow
3159 REAL,
DIMENSION(:),
INTENT(OUT) :: pct, ptsterm1, ptsterm2, pgfluxsnow
3163 REAL,
DIMENSION(SIZE(PTS)) :: zsconda, za, zb, zc, &
3164 zsnowdzm1, zsnowdzm2
3166 REAL(KIND=JPRB) :: zhook_handle
3169 IF (lhook) CALL dr_hook(
'SNOW3LEBUDMEB',0,zhook_handle)
3177 zsnowdzm1(:) = max(psnowdz1(:), psnowdzmin)
3178 zsnowdzm2(:) = max(psnowdz2(:), psnowdzmin)
3182 pct(:) = 1.0/(pscap(:)*zsnowdzm1(:))
3186 pgfluxsnow(:) = pswnetsnows(:) + plwnetsnow(:) - phsnow(:) - ples3l(:) - plel3l(:)
3190 zsconda(:) = (zsnowdzm1(:)+zsnowdzm2(:))/ &
3191 ((zsnowdzm1(:)/pscond1(:)) + (zsnowdzm2(:)/pscond2(:)))
3198 za(:) = zb(:) + pct(:)*(2*zsconda(:)/(zsnowdzm2(:)+zsnowdzm1(:)))
3200 zc(:) = pct(:)*( pgfluxsnow(:) + phpsnow(:) )
3205 ptsterm2(:) = 2*zsconda(:)*pct(:)/(za(:)*(zsnowdzm2(:)+zsnowdzm1(:)))
3207 ptsterm1(:) = (pts(:)*zb(:) + zc(:))/za(:)
3210 IF (lhook) CALL dr_hook(
'SNOW3LEBUDMEB',1,zhook_handle)
subroutine snow3lrad(OMEB, PSNOWDZMIN, PSW_RAD, PSNOWALB, PSPECTRALALBEDO, PSNOWDZ, PSNOWRHO, PALB, PPERMSNOWFRAC, PZENITH, PSWNETSNOW, PSWNETSNOWS, PRADSINK, PRADXS, PSNOWAGE)
subroutine snow3ldrift(PTSTEP, PFORESTFRAC, PVMOD, PTA, PQA, PPS, PRHOA, PSNOWRHO, PSNOWDZ, PSNOW, OSNOWDRIFT_SUBLIM, PSNDRIFT)
subroutine tridiag_ground(PA, PB, PC, PY, PX)
subroutine surface_ri(PTG, PQS, PEXNS, PEXNA, PTA, PQA, PZREF, PUREF, PDIRCOSZW, PVMOD, PRI)
subroutine snow3lrefrz(PTSTEP, PRR, PSNOWRHO, PSNOWTEMP, PSNOWDZ, PSNOWLIQ, PTHRUFAL)
subroutine snow3levapgone(PSNOWHEAT, PSNOWDZ, PSNOWRHO, PSNOWTEMP, PSNOWLIQ)
subroutine snow3lebud(HSNOWRES, HIMPLICIT_WIND, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PSNOWDZMIN, PZREF, PTS, PSNOWRHO, PSNOWLIQ, PSCAP, PSCOND1, PSCOND2, PUREF, PEXNS, PEXNA, PDIRCOSZW, PVMOD, PLW_RAD, PSW_RAD, PTA, PQA, PPS, PTSTEP, PSNOWDZ1, PSNOWDZ2, PALBT, PZ0, PZ0EFF, PZ0H, PSFCFRZ, PRADSINK, PHPSNOW, PCT, PEMIST, PRHOA, PTSTERM1, PTSTERM2, PRA, PCDSNOW, PCHSNOW, PQSAT, PDQSAT, PRSRA, PUSTAR2_IC, PRI, PPET_A_COEF_T, PPEQ_A_COEF_T, PPET_B_COEF_T, PPEQ_B_COEF_T)
subroutine snow3lgone(PTSTEP, PLEL3L, PLES3L, PSNOWRHO, PSNOWHEAT, PRADSINK, PEVAPCOR, PTHRUFAL, PGRNDFLUX, PGFLUXSNOW, PGRNDFLUXO, PSNOWDZ, PSNOWLIQ, PSNOWTEMP, PLVTT, PLSTT, PRADXS)
subroutine snow3levapn(PPSN3L, PLES3L, PLEL3L, PTSTEP, PSNOWTEMP, PSNOWRHO, PSNOWDZ, PSNOWLIQ, PTA, PLVTT, PLSTT, PSNOWHEAT, PSOILCOR)
subroutine snow3lebudmeb(PTSTEP, PSNOWDZMIN, PTS, PSNOWDZ1, PSNOWDZ2, PSCOND1, PSCOND2, PSCAP, PSWNETSNOWS, PLWNETSNOW, PHSNOW, PLES3L, PLEL3L, PHPSNOW, PCT, PTSTERM1, PTSTERM2, PGFLUXSNOW)
subroutine snow3lsolvt(OMEB, PTSTEP, PSNOWDZMIN, PSNOWDZ, PSCOND, PSCAP, PTG, PSOILCOND, PD_G, PRADSINK, PCT, PTERM1, PTERM2, PPET_A_COEF_T, PPEQ_A_COEF_T, PPET_B_COEF_T, PPEQ_B_COEF_T, PTA_IC, PQA_IC, PGRNDFLUX, PGRNDFLUXO, PSNOWTEMP, PSNOWFLUX)
subroutine snow3lmelt(PTSTEP, PSCAP, PSNOWTEMP, PSNOWDZ, PSNOWRHO, PSNOWLIQ, PMELTXS)
subroutine snow3lcompactn(PTSTEP, PSNOWDZMIN, PSNOWRHO, PSNOWDZ, PSNOWTEMP, PSNOW, PSNOWLIQ)
subroutine surface_aero_cond(PRI, PZREF, PUREF, PVMOD, PZ0, PZ0H, PAC, PRA, PCH)
subroutine snow3lflux(PSNOWTEMP, PSNOWDZ, PEXNS, PEXNA, PUSTAR2_IC, PTSTEP, PALBT, PSW_RAD, PEMIST, PLWUPSNOW, PLW_RAD, PLWNETSNOW, PTA, PSFCFRZ, PQA, PHPSNOW, PSNOWTEMPO1, PSNOWFLUX, PCT, PRADSINK, PQSAT, PDQSAT, PRSRA, PRN, PH, PGFLUX, PLES3L, PLEL3L, PEVAP, PUSTAR, OSFCMELT)
subroutine surface_cd(PRI, PZREF, PUREF, PZ0EFF, PZ0H, PCD, PCDN)
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)
subroutine snow3lfall(PTSTEP, PSR, PTA, PVMOD, PSNOW, PSNOWRHO, PSNOWDZ, PSNOWHEAT, PSNOWHMASS, PSNOWAGE, PPERMSNOWFRAC)
subroutine snow3ltransf(PSNOW, PSNOWDZ, PSNOWDZN, PSNOWRHO, PSNOWHEAT, PSNOWAGE)