6 SUBROUTINE snowcro(HSNOWRES, TPTIME, OGLACIER, 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, &
16 psnowliq,psnowtemp,psnowdz, &
17 pthrufal,pgrndflux,pevapcor,prnsnow,phsnow,pgfluxsnow, &
18 phpsnow,ples3l,plel3l,pevap,psndrift,pri, &
19 pemisnow,pcdsnow,pustar,pchsnow,psnowhmass,pqs, &
20 ppermsnowfrac,pzenith,pxlat,pxlon, &
21 osnowdrift,osnowdrift_sublim,osnow_abs_zenith, &
133 USE modd_csts, ONLY : xtt, xrholw, xlmtt,xlstt,xlvtt, xcl, xci, xpi, xrholi
145 USE yomhook
,ONLY : lhook, dr_hook
146 USE parkind1
,ONLY : jprb
156 REAL,
INTENT(IN) :: ptstep
160 CHARACTER(LEN=*),
INTENT(IN) :: hsnowres
165 LOGICAL,
INTENT(IN) :: oglacier
170 CHARACTER(LEN=*),
INTENT(IN) :: himplicit_wind
174 REAL,
DIMENSION(:),
INTENT(IN) :: pps, pta, psw_rad, pqa, pvmod, plw_rad, psr, prr
185 REAL,
DIMENSION(:),
INTENT(IN) :: ptg, psoilcond, pd_g, ppsn3l
193 REAL,
DIMENSION(:),
INTENT(IN) :: pzref, puref, pexns, pexna, pdircoszw, prhoa, pz0, pz0eff, &
194 palb, pz0h, ppermsnowfrac
209 REAL,
DIMENSION(:),
INTENT(IN) :: ppew_a_coef, ppew_b_coef, &
210 ppet_a_coef, ppeq_a_coef, ppet_b_coef, &
219 REAL,
DIMENSION(:),
INTENT(INOUT) :: psnowalb
224 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowheat, psnowrho, psnowswe
229 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowgran1, psnowgran2, psnowhist
235 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowage
237 REAL,
DIMENSION(:,:),
INTENT(OUT) :: psnowliq, psnowtemp, psnowdz
242 REAL,
DIMENSION(:),
INTENT(OUT) :: pthrufal, pgrndflux, pevapcor
253 REAL,
DIMENSION(:),
INTENT(OUT) :: prnsnow, phsnow, pgfluxsnow, ples3l, plel3l, &
254 phpsnow, pcdsnow, pustar, pevap, psndrift
266 REAL,
DIMENSION(:),
INTENT(OUT) :: pchsnow, pemisnow, psnowhmass
273 REAL,
DIMENSION(:),
INTENT(OUT) :: pri, pqs
277 REAL,
DIMENSION(:),
INTENT(IN) :: pzenith
278 REAL,
DIMENSION(:),
INTENT(IN) :: pxlat,pxlon
280 LOGICAL,
INTENT(IN) :: osnowdrift, osnowdrift_sublim
281 LOGICAL,
INTENT(IN) :: osnow_abs_zenith
282 CHARACTER(3),
INTENT(IN) :: hsnowmetamo, hsnowrad
298 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),NPNIMP) :: zsnowimp_density
299 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),NPNIMP) :: zsnowimp_content
301 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowtemp, zscap, zsnowdzn, zscond, zradsink
308 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zwholdmax
311 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowg0
312 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowy0
313 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnoww0
314 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowb0
317 REAL,
DIMENSION(SIZE(PSNOWRHO,1),3) :: zspectralalbedo
319 REAL,
DIMENSION(SIZE(PTA)) :: zsnowbis
322 REAL,
DIMENSION(SIZE(PTA)) :: zsnow, zsfcfrz, ztsterm1, ztsterm2, zct, zra, zsnowflux, zsnowtempo1
333 REAL,
DIMENSION(SIZE(PTA)) :: zrsra, zdqsat, zqsat, zradxs, zliqheatxs, zlwupsnow
344 REAL,
DIMENSION(SIZE(PTA)) :: zustar2_ic, zta_ic, zqa_ic, &
345 zpet_a_coef_t, zpeq_a_coef_t, zpet_b_coef_t, zpeq_b_coef_t
354 REAL,
DIMENSION(SIZE(PTA)) :: zsnowrhof, zsnowdzf, zsnowgran1f, zsnowgran2f, zsnowhistf
355 REAL,
DIMENSION(SIZE(PTA)) :: zsnowagef
358 REAL,
DIMENSION(SIZE(PTA)) :: zz0_snowice, zz0h_snowice, zz0eff_snowice
361 REAL ,
DIMENSION(SIZE(PTA)) :: zsummass_ini,zsumheat_ini,zsummass_fin,zsumheat_fin
363 REAL,
DIMENSION(SIZE(PTA)) :: zmassbalance, zenergybalance, zevapcor2
365 INTEGER,
DIMENSION(SIZE(PTA)) :: inlvls_use
367 LOGICAL,
DIMENSION(SIZE(PTA)) :: gsnowfall,gmodif_maillage
373 LOGICAL :: gcond_grain, gcond_yen
375 LOGICAL :: gcroinfoprint
376 LOGICAL :: gcrodebugprint, gcrodebugdetailsprint, gcrodebugprintatm
377 LOGICAL :: gcrodebugprintbalance
383 REAL(KIND=JPRB) :: zhook_handle
385 IF (lhook) CALL dr_hook(
'SNOWCRO',0,zhook_handle)
389 gcroinfoprint = lcrodailyinfo .AND. (tptime%TIME ==0.0)
392 gcrodebugprintbalance = ( tptime%TDATE%YEAR*10000 + tptime%TDATE%MONTH*100 + tptime%TDATE%DAY &
393 >= ntimecrodebug ) .AND. &
394 ( tptime%TIME/3600. >= nhourcrodebug ) .AND. &
395 ( tptime%TDATE%YEAR*10000 + tptime%TDATE%MONTH*100 + tptime%TDATE%DAY &
399 gcrodebugprint = gcrodebugprintbalance
400 gcrodebugdetailsprint = lcrodebugdetails .AND. gcrodebugprint
401 gcrodebugprintatm = lcrodebugatm .AND. gcrodebugprint
403 gcrodebugprint = .false.
404 gcrodebugdetailsprint = .false.
405 gcrodebugprintatm = .false.
410 gcrodebugprintbalance = lcontrolbalance .AND. gcrodebugprintbalance
412 IF ( lcrodebug .OR. gcroinfoprint .OR. gcrodebugprintbalance )
THEN
414 IF ( xlatcrodebug >= -90 .AND. xloncrodebug >= -180. )
THEN
417 idebug = npointcrodebug
421 IF ( xlatcrodebug >= -90 .AND. xloncrodebug >= -180. )
THEN
422 IF ( abs( pxlat(idebug)-xlatcrodebug ) + abs(pxlon(idebug) - xloncrodebug) > 0.1 )
THEN
423 gcrodebugprint = .false.
424 gcrodebugdetailsprint = .false.
425 gcrodebugprintatm = .false.
432 IF ( hsnowrad==
"TAR" .OR. hsnowrad==
"TA1" .OR. hsnowrad==
"TA2" )
THEN
439 zsnowimp_density = 1500.
478 gsnowfall(:) = .false.
480 DO jst = 1,
SIZE(psnowswe(:,:),2)
481 DO jj = 1,
SIZE(zsnow)
482 IF ( psnowswe(jj,jst)>0. )
THEN
483 psnowdz(jj,jst) = psnowswe(jj,jst) / psnowrho(jj,jst)
491 ztstepdays = ptstep/86400.
492 WHERE ( psnowswe>0 ) psnowage = psnowage + ztstepdays
497 IF ( gcrodebugprintbalance )
THEN
498 DO jj = 1,
SIZE(zsnow)
499 zsummass_ini(jj) = sum(psnowswe(jj,1:inlvls_use(jj)))
500 zsumheat_ini(jj) = sum(psnowheat(jj,1:inlvls_use(jj)))
505 IF(gcroinfoprint)
THEN
507 WRITE(*,fmt=
"(A12,I3,A12,I4)")
'nlayer:',inlvls_use(idebug),
' nbpoints:',
SIZE(zsnow)
509 WRITE(*,*)
'Snow fraction =',ppsn3l(idebug)
514 IF (gcrodebugprint)
THEN
517 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
518 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:),&
519 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:),&
523 IF (gcrodebugprintatm)
THEN
524 CALL
snowcroprintatm(
"forcing data :",pta(idebug),pqa(idebug),pvmod(idebug), &
525 prr(idebug),psr(idebug),psw_rad(idebug),plw_rad(idebug), &
526 ptg(idebug),psoilcond(idebug),pd_g(idebug),ppsn3l(idebug) )
534 DO jj = 1,
SIZE(zsnow)
535 zsnow(jj) = sum(psnowdz(jj,1:inlvls_use(jj)))
538 zsnowbis(:) = zsnow(:)
546 ptstep,psr,pta,pvmod,zsnowbis,psnowrho,psnowdz, &
547 psnowheat,psnowhmass,psnowalb,ppermsnowfrac, &
548 psnowgran1,psnowgran2,gsnowfall,zsnowdzn, &
549 zsnowrhof,zsnowdzf,zsnowgran1f,zsnowgran2f, zsnowhistf, &
550 zsnowagef,gmodif_maillage,inlvls_use,osnowdrift,pz0eff,puref,&
554 IF (gcrodebugdetailsprint)
THEN
556 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
557 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:),&
558 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:),&
563 zsnow(:) = zsnowbis(:)
571 IF ( gmodif_maillage(jj) )
THEN
573 psnowheat(jj,:),psnowgran1(jj,:),psnowgran2(jj,:), &
574 psnowhist(jj,:),psnowage(jj,:),gsnowfall(jj),zsnowrhof(jj), &
575 zsnowdzf(jj),psnowhmass(jj),zsnowgran1f(jj),zsnowgran2f(jj), &
576 zsnowhistf(jj),zsnowagef(jj),inlvls_use(jj),hsnowmetamo )
582 IF (gcrodebugdetailsprint)
THEN
584 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
585 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:),&
586 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:),&
598 DO jj = 1,
SIZE(zsnow)
601 DO jst=1,inlvls_use(jj)
602 psnowswe(jj,jst) = psnowdz(jj,jst) * psnowrho(jj,jst)
604 zscap(jj,jst) = psnowrho(jj,jst) * xci
606 zsnowtemp(jj,jst) = xtt + &
607 ( ( psnowheat(jj,jst)/psnowdz(jj,jst) + xlmtt*psnowrho(jj,jst) )/zscap(jj,jst) )
609 psnowliq(jj,jst) = max( 0.0, zsnowtemp(jj,jst)-xtt ) * zscap(jj,jst) * &
610 psnowdz(jj,jst) / (xlmtt*xrholw)
612 zsnowtemp(jj,jst) = min( xtt, zsnowtemp(jj,jst) )
616 DO jst = inlvls_use(jj)+1,
SIZE(psnowswe,2)
617 psnowswe(jj,jst) = 0.0
618 psnowrho(jj,jst) = 999.
620 psnowgran1(jj,jst) = 0.
621 psnowgran2(jj,jst) = 0.
622 psnowhist(jj,jst) = 0.
623 psnowage(jj,jst) = 0.
624 psnowheat(jj,jst) = 0.
625 zsnowtemp(jj,jst) = xtt
626 psnowliq(jj,jst) = 0.
632 IF (gcrodebugdetailsprint)
THEN
634 inlvls_use(idebug),lprintgran, &
635 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
636 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:),&
637 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:),&
645 CALL
snowcrometamo(psnowdz,psnowgran1,psnowgran2,psnowhist,zsnowtemp, &
646 psnowliq,ptstep,psnowswe,inlvls_use,psnowage,hsnowmetamo )
649 IF (gcrodebugdetailsprint)
THEN
651 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
652 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:),&
653 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:),&
663 psnowgran1,psnowgran2,psnowhist,psnowliq,inlvls_use,pdircoszw,&
667 IF (gcrodebugdetailsprint)
THEN
669 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
670 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:),&
671 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:),&
680 CALL
snowdrift(ptstep, pvmod, psnowrho,psnowdz, zsnow, &
681 psnowgran1,psnowgran2,psnowhist,inlvls_use,pta,pqa,pps,prhoa,&
682 pz0eff,puref,osnowdrift_sublim,hsnowmetamo,psndrift)
685 IF (gcrodebugdetailsprint)
THEN
687 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
688 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:),&
689 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:),&
696 DO jj = 1,
SIZE(zsnow)
697 DO jst = 1,inlvls_use(jj)
698 zscap(jj,jst) = ( psnowrho(jj,jst) - &
699 psnowliq(jj,jst) * xrholw / max( psnowdz(jj,jst),xsnowdzmin) ) * xci
700 psnowheat(jj,jst) = psnowdz(jj,jst) * &
701 ( zscap(jj,jst)*(zsnowtemp(jj,jst)-xtt) - xlmtt*psnowrho(jj,jst) ) + &
702 xlmtt * xrholw * psnowliq(jj,jst)
707 IF (gcrodebugdetailsprint)
THEN
709 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
710 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:), &
711 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:), &
722 SELECT CASE (hsnowrad)
724 zsnowimp_content(:,:,1) = 0.0
726 zsnowimp_content(:,:,1) = 100.0e-9
728 zsnowimp_content(:,:,1) = 2. * psnowage(:,:) * 1e-9
732 SELECT CASE (hsnowrad)
735 psw_rad,psnowalb,psnowdz,psnowrho, &
736 palb,zradsink,zradxs, &
737 psnowgran1, psnowgran2, psnowage,pps, &
738 pzenith, ppermsnowfrac,inlvls_use, &
739 osnow_abs_zenith,hsnowmetamo)
741 CASE (
"TAR",
"TA1",
"TA2")
742 CALL
snowcro_tartes(psnowgran1,psnowgran2,psnowrho,psnowdz,zsnowg0,zsnowy0,zsnoww0, &
743 zsnowb0,zsnowimp_density,zsnowimp_content,palb,psw_rad,pzenith, &
744 inlvls_use,psnowalb,zradsink,zradxs,gcrodebugdetailsprint,hsnowmetamo)
747 CALL
abor1_sfx(
"UNKNOWN CSNOWRAD OPTION")
752 IF (gcrodebugdetailsprint)
THEN
754 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
755 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:), &
756 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:), &
765 CALL
snowcrothrm(psnowrho,zscond,zsnowtemp,pps,psnowliq,gcond_grain,gcond_yen)
768 IF (gcrodebugdetailsprint)
THEN
770 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
771 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:), &
772 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:), &
781 phpsnow(:) = prr(:) * xcl * ( max( xtt,pta(:) ) - xtt )
786 IF ( all(ppew_a_coef==0.) )
THEN
792 WHERE( psnowrho(:,1)>xrhothreshold_ice )
793 zz0_snowice = pz0 * xz0icez0snow
794 zz0h_snowice = pz0h * xz0icez0snow
795 zz0eff_snowice = pz0eff * xz0icez0snow
799 zz0eff_snowice = pz0eff
805 zz0eff_snowice = pz0eff
809 ppew_a_coef, ppew_b_coef, &
810 ppet_a_coef, ppeq_a_coef, ppet_b_coef, ppeq_b_coef, &
812 pzref,zsnowtemp(:,1),psnowrho(:,1),psnowliq(:,1),zscap(:,1), &
813 zscond(:,1),zscond(:,2), &
814 puref,pexns,pexna,pdircoszw,pvmod, &
815 plw_rad,psw_rad,pta,pqa,pps,ptstep, &
816 psnowdz(:,1),psnowdz(:,2),psnowalb,zz0_snowice, &
817 zz0eff_snowice,zz0h_snowice, &
818 zsfcfrz,zradsink(:,1),phpsnow, &
819 zct,pemisnow,prhoa,ztsterm1,ztsterm2,zra,pcdsnow,pchsnow, &
820 zqsat, zdqsat, zrsra, zustar2_ic, pri, &
821 zpet_a_coef_t,zpeq_a_coef_t,zpet_b_coef_t,zpeq_b_coef_t )
824 IF (gcrodebugdetailsprint)
THEN
826 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
827 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:), &
828 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:), &
835 zsnowtempo1(:) = zsnowtemp(:,1)
837 CALL
snowcrosolvt(ptstep,xsnowdzmin,psnowdz,zscond,zscap,ptg, &
838 psoilcond,pd_g,zradsink,zct,ztsterm1,ztsterm2, &
839 zpet_a_coef_t,zpeq_a_coef_t,zpet_b_coef_t,zpeq_b_coef_t, &
840 zta_ic,zqa_ic,pgrndflux, zsnowtemp ,zsnowflux, &
844 IF (gcrodebugdetailsprint)
THEN
846 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
847 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:), &
848 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:), &
856 CALL
snowcroflux(zsnowtemp(:,1),psnowdz(:,1),pexns,pexna, &
858 ptstep,psnowalb,psw_rad,pemisnow,zlwupsnow,plw_rad, &
859 zta_ic,zsfcfrz,zqa_ic,phpsnow, &
860 zsnowtempo1,zsnowflux,zct,zradsink(:,1), &
861 zqsat,zdqsat,zrsra, &
862 prnsnow,phsnow,pgfluxsnow,ples3l,plel3l,pevap, &
866 IF (gcrodebugdetailsprint)
THEN
868 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
869 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:), &
870 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:), &
881 psnowheat,zradsink,pevapcor,pthrufal,pgrndflux, &
882 pgfluxsnow,psnowdz,psnowliq,zsnowtemp,zradxs, &
886 IF (gcrodebugdetailsprint)
THEN
888 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
889 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:), &
890 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:), &
898 pgrndflux(:) = pgrndflux(:) + zradxs(:)
904 psnowrho,psnowliq,psnowgran1,psnowgran2, &
905 psnowhist,psnowage,ples3l, inlvls_use )
908 IF (gcrodebugdetailsprint)
THEN
910 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
911 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:), &
912 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:), &
919 CALL
snowcromelt(zscap,zsnowtemp,psnowdz,psnowrho,psnowliq,inlvls_use)
922 IF (gcrodebugdetailsprint)
THEN
924 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
925 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:), &
926 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:), &
936 CALL
snowcrorefrz(ptstep,prr,psnowrho,zsnowtemp,psnowdz,psnowliq,pthrufal, &
937 zscap,plel3l,inlvls_use )
940 IF (gcrodebugdetailsprint)
THEN
942 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
943 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:), &
944 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:), &
952 CALL
snowcroevapn(ples3l,ptstep,zsnowtemp(:,1),psnowrho(:,1), &
953 psnowdz(:,1),pevapcor,psnowhmass )
956 IF (gcrodebugdetailsprint)
THEN
958 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
959 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:), &
960 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:), &
968 CALL
snowcroevapgone(psnowheat,psnowdz,psnowrho,zsnowtemp,psnowliq,psnowgran1, &
969 psnowgran2,psnowhist,psnowage,inlvls_use,hsnowmetamo )
972 IF (gcrodebugdetailsprint)
THEN
974 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:), &
975 psnowliq(idebug,:),psnowheat(idebug,:),psnowgran1(idebug,:), &
976 psnowgran2(idebug,:),psnowhist(idebug,:),psnowage(idebug,:), &
985 IF ( hsnowrad==
'B92' )
THEN
987 psnowalb,zspectralalbedo,psnowdz(:,1),psnowrho(:,1:2), &
988 ppermsnowfrac,psnowgran1(:,1),psnowgran2(:,1), &
989 psnowage(:,1),psnowgran1(:,2),psnowgran2(:,2),psnowage(:,2), &
990 pps, pzenith, inlvls_use, hsnowmetamo)
1003 DO jj = 1,
SIZE(zsnow)
1005 DO jst = 1,inlvls_use(jj)
1006 zwholdmax(jj,jst) =
snowcrohold( psnowrho(jj,jst),psnowliq(jj,jst),psnowdz(jj,jst) )
1007 zliqheatxs(jj) = max( 0.0, (psnowliq(jj,jst) - zwholdmax(jj,jst)) * xrholw ) * xlmtt/ptstep
1008 psnowliq(jj,jst) = psnowliq(jj,jst) - zliqheatxs(jj)*ptstep/(xrholw*xlmtt)
1009 psnowliq(jj,jst) = max( 0.0, psnowliq(jj,jst) )
1010 pgrndflux(jj) = pgrndflux(jj) + zliqheatxs(jj)
1011 psnowtemp(jj,jst) = zsnowtemp(jj,jst)
1013 zscap(jj,jst) = psnowrho(jj,jst) * xci
1014 psnowheat(jj,jst) = psnowdz(jj,jst) * &
1015 ( zscap(jj,jst)*(psnowtemp(jj,jst)-xtt) - xlmtt*psnowrho(jj,jst) ) + &
1016 xlmtt * xrholw * psnowliq(jj,jst)
1018 psnowswe(jj,jst) = psnowdz(jj,jst) * psnowrho(jj,jst)
1022 DO jst = inlvls_use(jj)+1,
SIZE(psnowswe,2)
1023 psnowswe(jj,jst) = 0.
1024 psnowheat(jj,jst) = 0.
1025 psnowrho(jj,jst) = 999.
1026 psnowtemp(jj,jst) = 0.
1027 psnowdz(jj,jst) = 0.
1041 IF (gcrodebugprint)
THEN
1044 psnowdz(idebug,:),psnowrho(idebug,:),psnowtemp(idebug,:),psnowliq(idebug,:), &
1045 psnowheat(idebug,:),psnowgran1(idebug,:),psnowgran2(idebug,:), &
1046 psnowhist(idebug,:),psnowage(idebug,:), hsnowmetamo)
1051 DO jj = 1,
SIZE(zsnow)
1054 DO jst = 1,inlvls_use(jj)
1055 IF ( psnowtemp(jj,jst) < 100. )
THEN
1056 WRITE(*,*)
'pb tempe snow :',psnowtemp(jj,jst)
1057 WRITE(*,fmt=
'("DATE:",2(I2.2,"/"),I4.4,F3.0)') &
1058 tptime%TDATE%DAY,tptime%TDATE%MONTH,tptime%TDATE%YEAR,tptime%TIME/3600.
1059 WRITE(*,*)
'point',jj,
"/",
SIZE(zsnow)
1060 WRITE(*,*)
'layer',jst
1061 WRITE(*,*)
'pressure',pps(jj)
1062 WRITE(*,*)
'slope',acos(pdircoszw(jj))*(180./xpi),
"deg"
1063 WRITE(*,*)
'XLAT=',pxlat(jj),
'XLON=',pxlon(jj)
1064 WRITE(*,*)
'solar radiation=',psw_rad(jj)
1065 WRITE(*,*)
'INLVLS_USE(JJ):',inlvls_use(jj)
1066 WRITE(*,*) psnowdz(jj,1:inlvls_use(jj))
1067 WRITE(*,*) psnowrho(jj,1:inlvls_use(jj))
1068 WRITE(*,*) psnowtemp(jj,1:inlvls_use(jj))
1069 CALL
abor1_sfx(
'SNOWCRO: erreur tempe snow')
1076 IF (gcrodebugprintbalance)
THEN
1078 zsummass_fin(idebug) = sum( psnowswe(idebug,1:inlvls_use(idebug)) )
1079 zsumheat_fin(idebug) = sum( psnowheat(idebug,1:inlvls_use(idebug)) )
1081 CALL
get_balance(zsummass_ini(idebug),zsumheat_ini(idebug),zsummass_fin(idebug), &
1082 zsumheat_fin(idebug),psr(idebug),prr(idebug),pthrufal(idebug), &
1083 pevap(idebug),pevapcor(idebug),pgrndflux(idebug),phsnow(idebug),&
1084 prnsnow(idebug),plel3l(idebug),ples3l(idebug),phpsnow(idebug), &
1085 psnowhmass(idebug),psnowdz(idebug,1),ptstep, &
1086 zmassbalance(idebug),zenergybalance(idebug),zevapcor2(idebug) )
1088 CALL
snowcroprintbalance(zsummass_ini(idebug),zsumheat_ini(idebug),zsummass_fin(idebug), &
1089 zsumheat_fin(idebug),psr(idebug),prr(idebug),pthrufal(idebug), &
1090 pevap(idebug),pevapcor(idebug),pgrndflux(idebug),phsnow(idebug),&
1091 prnsnow(idebug),plel3l(idebug),ples3l(idebug),phpsnow(idebug), &
1092 psnowhmass(idebug),psnowdz(idebug,1),ptstep, &
1093 zmassbalance(idebug),zenergybalance(idebug),zevapcor2(idebug))
1097 IF (lpstopbalance)
THEN
1100 DO jj=1,
SIZE(zsnow)
1102 zsummass_fin(jj) = sum( psnowswe(jj,1:inlvls_use(jj)) )
1103 zsumheat_fin(jj) = sum( psnowheat(jj,1:inlvls_use(jj)) )
1105 CALL
get_balance(zsummass_ini(jj),zsumheat_ini(jj),zsummass_fin(jj), &
1106 zsumheat_fin(jj),psr(jj),prr(jj),pthrufal(jj), &
1107 pevap(jj),pevapcor(jj),pgrndflux(jj),phsnow(jj), &
1108 prnsnow(jj),plel3l(jj),ples3l(jj),phpsnow(jj), &
1109 psnowhmass(jj),psnowdz(jj,1),ptstep, &
1110 zmassbalance(jj),zenergybalance(jj),zevapcor2(jj) )
1121 IF (lhook) CALL dr_hook(
'SNOWCRO',1,zhook_handle)
1129 psnowtemp,psnow,psnowgran1,psnowgran2,psnowhist, &
1130 psnowliq,inlvls_use,pdircoszw,hsnowmetamo )
1167 REAL,
INTENT(IN) :: ptstep
1168 REAL,
DIMENSION(:),
INTENT(IN) :: pdircoszw
1170 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowtemp
1172 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowrho, psnowdz
1174 REAL,
DIMENSION(:),
INTENT(OUT) :: psnow
1176 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowgran1, psnowgran2, psnowhist, &
1178 INTEGER,
DIMENSION(:),
INTENT(IN) :: inlvls_use
1179 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
1183 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowrho2, &
1190 REAL(KIND=JPRB) :: zhook_handle
1197 IF (lhook) CALL dr_hook(
'SNOWCROCOMPACTN',0,zhook_handle)
1199 DO jj = 1,
SIZE(psnow)
1201 DO jst = 2,inlvls_use(jj)
1202 zsmass(jj,jst) = zsmass(jj,jst-1) + psnowdz(jj,jst-1) * psnowrho(jj,jst-1)
1204 zsmass(jj,1) = 0.5 * psnowdz(jj,1) * psnowrho(jj,1)
1211 DO jj = 1,
SIZE(psnow)
1213 DO jst = 1,inlvls_use(jj)
1216 zviscosity(jj,jst) = xvvisc1 * &
1217 exp( xvvisc3*psnowrho(jj,jst) + xvvisc4*abs(xtt-psnowtemp(jj,jst)) ) * &
1218 psnowrho(jj,jst) / xvro11
1221 IF ( psnowliq(jj,jst)>0.0 )
THEN
1222 zviscosity(jj,jst) = zviscosity(jj,jst) / &
1223 ( xvvisc5 + xvvisc6*psnowliq(jj,jst)/psnowdz(jj,jst) )
1226 IF( psnowliq(jj,jst)/psnowdz(jj,jst)<=0.01 .AND. psnowhist(jj,jst)>=nvhis2 )
THEN
1227 zviscosity(jj,jst) = zviscosity(jj,jst) * xvvisc7
1230 IF ( psnowhist(jj,jst)==nvhis1 )
THEN
1232 IF ( hsnowmetamo==
"B92" )
THEN
1234 IF ( psnowgran1(jj,jst)>=0. .AND. psnowgran1(jj,jst)<xvgran6 )
THEN
1235 zviscosity(jj,jst) = zviscosity(jj,jst) * &
1236 min( 4., exp( min( xvdiam1, &
1237 psnowgran2(jj,jst) -xvdiam4 ) / xvdiam6 ) )
1240 ELSEIF ( psnowgran1(jj,jst)>=xvdiam6*(4.-psnowgran2(jj,jst)) .AND. psnowgran2(jj,jst)<xvgran6/xvgran1 )
THEN
1241 zviscosity(jj,jst) = zviscosity(jj,jst) * &
1242 min( 4., exp( min( xvdiam1, &
1243 (xvdiam6*(4.-psnowgran2(jj,jst)))-xvdiam4 ) / xvdiam6 ) )
1249 zsnowrho2(jj,jst) = psnowrho(jj,jst) + psnowrho(jj,jst) * ptstep * &
1250 ( xg*pdircoszw(jj)*zsmass(jj,jst)/zviscosity(jj,jst) )
1253 psnowdz(jj,jst) = psnowdz(jj,jst) * ( psnowrho(jj,jst)/zsnowrho2(jj,jst) )
1256 psnowrho(jj,jst) = zsnowrho2(jj,jst)
1266 DO jj = 1,
SIZE(psnowdz,1)
1267 psnow(jj) = sum( psnowdz(jj,1:inlvls_use(jj)) )
1270 IF (lhook) CALL dr_hook(
'SNOWCROCOMPACTN',1,zhook_handle)
1282 psnowhist, psnowtemp, psnowliq, ptstep, &
1283 psnowswe,inlvls_use, psnowage, hsnowmetamo)
1450 USE modd_csts, ONLY : xtt, xpi, xrholw, xrholi
1459 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowdz, psnowtemp, psnowliq, psnowswe
1461 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowgran1, psnowgran2, psnowhist
1463 REAL,
INTENT(IN) :: ptstep
1465 INTEGER,
DIMENSION(:),
INTENT(IN) :: inlvls_use
1467 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowage
1469 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
1473 REAL :: zgradt, ztelm, zvdent, zdent, zsphe, zvap, zdangl, &
1474 zsize, zssa, zssa0, zssa_t, zssa_t_dt, za, zb, zc, &
1475 za2, zb2, zc2, zoptd, zoptr, zoptr0, zdrdt
1476 REAL :: zvdent1, zvdent2, zvsphe, zcoef_sph
1477 REAL :: zdenom1, zdenom2, zfact1, zfact2
1480 INTEGER :: idrho, idgrad, idtemp
1481 LOGICAL :: gnondendritic ,gfaceted, gsphe_lw
1482 LOGICAL :: gcond_b92, gcond_c13, gcond_sph
1484 REAL(KIND=JPRB) :: zhook_handle
1489 IF (lhook) CALL dr_hook(
'SNOWCROMETAMO',0,zhook_handle)
1491 inlvls =
SIZE(psnowgran1(:,:),2)
1495 DO jj = 1,
SIZE(psnowrho,1)
1497 DO jst = 1,inlvls_use(jj)
1500 IF ( jst==inlvls_use(jj) )
THEN
1501 zgradt = abs(psnowtemp(jj,jst) - psnowtemp(jj,jst-1))*2. / (psnowdz(jj,jst-1) + psnowdz(jj,jst))
1502 ELSEIF ( jst==1 )
THEN
1503 zgradt = abs(psnowtemp(jj,jst+1) - psnowtemp(jj,jst) )*2. / (psnowdz(jj,jst) + psnowdz(jj,jst+1))
1505 zgradt = abs(psnowtemp(jj,jst+1) - psnowtemp(jj,jst-1))*2. / &
1506 (psnowdz(jj,jst-1) + psnowdz(jj,jst)*2. + psnowdz(jj,jst+1))
1509 IF ( psnowliq(jj,jst)>xuepsi )
THEN
1513 ztelm = xupourc * psnowliq(jj,jst) * xrholw / psnowswe(jj,jst)
1516 zvdent1 = max( xvdent2 * ztelm**nvdent1, xvdent1 * exp(xvvap1/xtt) )
1519 gcond_b92 = ( psnowgran1(jj,jst)<xvgran1-xuepsi )
1526 ELSEIF ( zgradt<xvgrat1 )
THEN
1529 zvap = exp( xvvap1/psnowtemp(jj,jst) )
1532 zvdent1 = xvdent1 * zvap
1533 zvdent2 = xvsphe2 * zvap
1535 gcond_b92 = ( psnowhist(jj,jst)/=nvhis1 .OR. psnowgran2(jj,jst)<xvdiam2 )
1536 gcond_c13 = ( hsnowmetamo==
'C13' )
1546 zvap = exp( xvvap1/psnowtemp(jj,jst) ) * (zgradt)**xvvap2
1549 zvdent1 = xvdent1 * zvap
1550 zvdent2 = - xvdent1 * zvap
1552 gcond_b92 = ( zgradt<xvgrat2 .OR. psnowgran1(jj,jst)>0. )
1553 gcond_c13 = ( hsnowmetamo==
'C13' )
1561 IF ( hsnowmetamo==
"B92" )
THEN
1570 IF ( psnowgran1(jj,jst)<-xuepsi )
THEN
1574 zdent = - psnowgran1(jj,jst)/xvgran1 - zvdent1 * ptstep
1575 zsphe = psnowgran2(jj,jst)/xvgran1 + zvdent2 * ptstep
1576 CALL
set_thresh(zgradt,psnowliq(jj,jst),zsphe)
1577 IF( zdent<=xuepsi )
THEN
1579 psnowgran1(jj,jst) = zsphe * xvgran1
1580 psnowgran2(jj,jst) = xvdiam1 - xvdiam5 * min( zsphe, zvsphe )
1582 psnowgran1(jj,jst) = -zdent * xvgran1
1583 psnowgran2(jj,jst) = zsphe * xvgran1
1586 ELSEIF ( gcond_b92 )
THEN
1593 zsphe = psnowgran1(jj,jst)/xvgran1 + zvdent2 * ptstep
1594 CALL
set_thresh(zgradt,psnowliq(jj,jst),zsphe)
1595 psnowgran1(jj,jst) = zsphe * xvgran1
1597 ELSEIF ( psnowliq(jj,jst)>xuepsi )
THEN
1601 CALL
get_gran(ptstep,ztelm,psnowgran2(jj,jst))
1603 ELSEIF ( zgradt<xvgrat1 )
THEN
1606 zsphe = psnowgran1(jj,jst)/xvgran1 + &
1607 zvdent2 * ptstep * exp( min( 0., xvdiam3-psnowgran2(jj,jst) ) / xvdiam6 )
1608 zsphe = min( zsphe, xvsphe3 )
1609 CALL
set_thresh(zgradt,psnowliq(jj,jst),zsphe)
1610 psnowgran1(jj,jst) = zsphe * xvgran1
1616 psnowgran2(jj,jst) = psnowgran2(jj,jst) + zdangl * xvfi * ptstep
1630 zsphe = psnowgran2(jj,jst) + zvdent2 * ptstep
1631 CALL
set_thresh(zgradt,psnowliq(jj,jst),zsphe)
1632 IF ( psnowliq(jj,jst)>xuepsi .OR. zgradt<xvgrat1 )
THEN
1633 gcond_sph = ( zsphe < 1.-xuepsi )
1635 gcond_sph = ( zsphe > xuepsi )
1638 IF ( gcond_c13 .AND. psnowgran1(jj,jst)<xvdiam6*(4.-zsphe)-xuepsi )
THEN
1641 IF ( gcond_sph )
THEN
1642 psnowgran1(jj,jst) = psnowgran1(jj,jst) + xvdiam6 * ptstep * &
1643 ( zvdent2*(psnowgran1(jj,jst)/xvdiam6-1.)/(zsphe-3.) - &
1644 zvdent1*(zsphe-3.) )
1646 psnowgran1(jj,jst) = psnowgran1(jj,jst) + xvdiam6 * ptstep * zvdent1 * zcoef_sph
1649 ELSEIF ( gcond_c13 .AND. gcond_sph )
THEN
1654 psnowgran1(jj,jst) = psnowgran1(jj,jst) - xvdiam6 * ptstep * zvdent2 * 2.* zsphe
1656 ELSEIF ( psnowliq(jj,jst)>xuepsi )
THEN
1660 CALL
get_gran(ptstep,ztelm,psnowgran1(jj,jst))
1662 ELSEIF ( gcond_c13 .AND. zgradt>=xvgrat2 )
THEN
1665 psnowgran1(jj,jst) = psnowgran1(jj,jst) + 0.5 * zdangl * xvfi * ptstep
1669 psnowgran2(jj,jst) = zsphe
1678 IF ( psnowliq(jj,jst)<=xuepsi .AND. hsnowmetamo==
'T07' )
THEN
1680 !
WRITE(*,*) csnowmetamo,
': you are using T07 formulation!!'
1683 zssa0 = 6./( xrholi*xvdiam6 ) * 10.
1685 za = 0.659*zssa0 - 27.2 * ( psnowtemp(jj,jst)-273.15-2.03 )
1686 zb = 0.0961*zssa0 - 3.44 * ( psnowtemp(jj,jst)-273.15+1.90 )
1687 zc = -0.341*zssa0 - 27.2 * ( psnowtemp(jj,jst)-273.15-2.03 )
1688 za2 = 0.629*zssa0 - 15.0 * ( psnowtemp(jj,jst)-273.15-11.2 )
1689 zb2 = 0.0760*zssa0 - 1.76 * ( psnowtemp(jj,jst)-273.15-2.96 )
1690 zc2 = -0.371*zssa0 - 15.0 * ( psnowtemp(jj,jst)-273.15-11.2 )
1707 zssa = 6./( xrholi*psnowgran1(jj,jst) ) * 10.
1709 zdenom1 = (psnowage(jj,jst)*24.) + exp(zc/zb)
1710 zdenom2 = (psnowage(jj,jst)*24.) + exp(zc2/zb2)
1711 zfact1 = 0.5 + 0.5*tanh( 0.5*(zgradt-10.) )
1712 zfact2 = 0.5 - 0.5*tanh( 0.5*(zgradt-10.) )
1713 zssa = zssa + (ptstep/3600.) * ( zfact1 * (-zb/zdenom1) + zfact2 * (-zb2/zdenom2) + &
1714 (ptstep/3600.) * ( zfact1 * (zb/zdenom1**2.) + zfact2 * (zb2/zdenom2**2.) ) * 1./2. )
1718 zssa = max( zssa, 8.*10. )
1720 psnowgran1(jj,jst) = 6./( xrholi*zssa ) * 10.
1728 ELSEIF ( psnowliq(jj,jst)<=xuepsi .AND. hsnowmetamo==
'F06' )
THEN
1738 idrho = min( abs( int( (psnowrho(jj,jst)-25.)/50. ) + 1 ), 8 )
1739 idgrad = min( abs( int( (zgradt-5.)/10.+2. ) ), 31 )
1740 idtemp = min( abs( int( (psnowtemp(jj,jst)-225.65 )/5.+2. ) ), 11 )
1741 IF ( psnowtemp(jj,jst)<221. ) idtemp = 1
1744 zoptr0 = xvdiam6/2. * 10.**6.
1745 zoptr = psnowgran1(jj,jst)/2. * 10.**6.
1746 zdrdt = xdrdt0(idrho,idgrad,idtemp) * &
1747 ( xtau(idrho,idgrad,idtemp) / &
1748 ( zoptr - zoptr0 + xtau(idrho,idgrad,idtemp) ) )**(1./xkappa(idrho,idgrad,idtemp))
1749 zoptr = zoptr + zdrdt * ptstep/3600.
1750 zoptr = min( zoptr, 3./(xrholi*2.) * 10.**6.)
1752 psnowgran1(jj,jst) = zoptr * 2./10.**6.
1765 DO jj = 1,
SIZE(psnowrho,1)
1767 DO jst = 1,inlvls_use(jj)
1769 IF ( hsnowmetamo==
'B92' )
THEN
1772 gnondendritic = ( psnowgran1(jj,jst)>=0. )
1773 IF ( gnondendritic )
THEN
1775 gfaceted = ( psnowgran1(jj,jst)<xvsphe4 .AND. psnowhist(jj,jst)==0. )
1777 gsphe_lw = ( xvgran1-psnowgran1(jj,jst)<xvsphe4 .AND. psnowliq(jj,jst)/psnowdz(jj,jst)>xvtelv1 )
1783 gnondendritic = ( psnowgran1(jj,jst)>=xvdiam6*(4.-psnowgran2(jj,jst))-xuepsi )
1784 IF ( gnondendritic )
THEN
1786 gfaceted = ( psnowgran2(jj,jst)<xvsphe4/xvgran1 .AND. psnowhist(jj,jst)==0. )
1788 gsphe_lw = ( xvsphe1-psnowgran2(jj,jst)<xvsphe4/xvgran1 .AND. psnowliq(jj,jst)/psnowdz(jj,jst)>xvtelv1 )
1793 IF ( gnondendritic )
THEN
1795 IF ( gfaceted )
THEN
1797 psnowhist(jj,jst) = nvhis1
1799 ELSEIF ( gsphe_lw )
THEN
1801 IF (psnowhist(jj,jst)==0.) psnowhist(jj,jst) = nvhis2
1802 IF (psnowhist(jj,jst)==nvhis1) psnowhist(jj,jst) = nvhis3
1804 ELSEIF ( psnowtemp(jj,jst) < xtt )
THEN
1806 IF(psnowhist(jj,jst)==nvhis2) psnowhist(jj,jst) = nvhis4
1807 IF(psnowhist(jj,jst)==nvhis3) psnowhist(jj,jst) = nvhis5
1817 IF (lhook) CALL dr_hook(
'SNOWCROMETAMO',1,zhook_handle)
1829 REAL,
INTENT(IN) :: pgradt
1830 REAL,
INTENT(IN) :: psnowliq
1831 REAL,
INTENT(INOUT) :: psphe
1833 IF ( psnowliq>xuepsi .OR. pgradt<xvgrat1 )
THEN
1834 psphe = min(1.,psphe)
1836 psphe = max(0.,psphe)
1849 REAL,
INTENT(IN) :: ptstep, ptelm
1850 REAL,
INTENT(INOUT) :: pgran
1852 REAL(KIND=JPRB) :: zhook_handle
1854 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_GRAN',0,zhook_handle)
1856 pgran = 2. * ( 3./(4.*xpi) * &
1857 ( 4. * xpi/3. * (pgran/2.)**3 + &
1858 ( xvtail1 + xvtail2 * ptelm**nvdent1 ) * ptstep ) )**(1./3.)
1860 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_GRAN',1,zhook_handle)
1869 palbedosc,pspectralalbedo,psnowdz, &
1870 psnowrho,ppermsnowfrac, &
1871 psnowgran1_top,psnowgran2_top,psnowage_top, &
1872 psnowgran1_bot,psnowgran2_bot,psnowage_bot, &
1873 pps, pzenith, knlvls_use ,hsnowmetamo )
1885 USE modd_snow_par, ONLY : xansmax, xansmin,xaglamin, xaglamax, &
1886 xvrpre1,xvrpre2,xvaging_noglacier, &
1887 xvaging_glacier, xvspec1,xvspec2, &
1888 xvspec3, xvw1,xvw2,xvd1,xvd2
1899 LOGICAL,
INTENT(IN) :: oglacier
1903 REAL,
DIMENSION(:),
INTENT(IN) :: psnowdz,ppermsnowfrac
1905 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowrho
1907 REAL,
DIMENSION(:),
INTENT(INOUT) :: palbedosc
1909 REAL,
DIMENSION(:,:),
INTENT(OUT) :: pspectralalbedo
1911 REAL,
DIMENSION(:),
INTENT(IN) :: psnowgran1_top,psnowgran2_top,psnowage_top, &
1912 psnowgran1_bot,psnowgran2_bot,psnowage_bot, pps
1913 INTEGER,
DIMENSION(:),
INTENT(IN) :: knlvls_use
1915 REAL,
DIMENSION(:),
INTENT(IN) :: pzenith
1917 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
1921 REAL,
DIMENSION(SIZE(PSNOWRHO,1),3) :: zalb_top, zalb_bot
1923 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zansmin, zansmax, zmin, zmax
1924 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zfac_top, zfac_bot
1926 REAL,
DIMENSION(SIZE(PALBEDOSC)) :: zvage1
1932 REAL(KIND=JPRB) :: zhook_handle
1935 IF (lhook) CALL dr_hook(
'SNOWCROALB',0,zhook_handle)
1941 IF ( oglacier )
THEN
1942 zansmin(:) = xaglamin * ppermsnowfrac(:) + xansmin * (1.0-ppermsnowfrac(:))
1943 zansmax(:) = xaglamax * ppermsnowfrac(:) + xansmax * (1.0-ppermsnowfrac(:))
1944 zvage1(:) = xvaging_glacier * ppermsnowfrac(:) + xvaging_noglacier * (1.0-ppermsnowfrac(:))
1946 zansmin(:) = xansmin
1947 zansmax(:) = xansmax
1948 zvage1(:) = xvaging_noglacier
1957 IF ( minval(psnowage_bot)<0. )
THEN
1958 CALL
abor1_sfx(
'FATAL ERROR in SNOWCRO: Snow layer age inconsistent : check initialization routine. !')
1969 DO jj=1,
SIZE(palbedosc)
1971 IF ( knlvls_use(jj)==0 )
THEN
1973 palbedosc(jj) = zansmin(jj)
1976 CALL
get_alb(jj,psnowrho(jj,1),pps(jj),zvage1(jj),psnowgran1_top(jj),&
1977 psnowgran2_top(jj),psnowage_top(jj),zalb_top(jj,:),hsnowmetamo)
1980 IF ( knlvls_use(jj)>=2 )
THEN
1983 CALL
get_alb(jj,psnowrho(jj,2),pps(jj),zvage1(jj),psnowgran1_bot(jj),&
1984 psnowgran2_bot(jj),min(365.,psnowage_bot(jj)),zalb_bot(jj,:),hsnowmetamo)
1988 zalb_bot(jj,1) = zalb_top(jj,1)
1989 zalb_bot(jj,2) = zalb_top(jj,2)
1990 zalb_bot(jj,3) = zalb_top(jj,3)
1995 zmin(jj) = min( 1., psnowdz(jj)/xvd1 )
1996 zmax(jj) = max( 0., (psnowdz(jj)-xvd1)/xvd2 )
1997 zfac_top(jj) = xvw1 * zmin(jj) + xvw2 * min( 1., zmax(jj) )
1998 zfac_bot(jj) = xvw1 * ( 1. - zmin(jj) ) + xvw2 * ( 1. - min( 1., zmax(jj) ) )
1999 pspectralalbedo(jj,1) = zfac_top(jj) * zalb_top(jj,1) + zfac_bot(jj) * zalb_bot(jj,1)
2000 pspectralalbedo(jj,2) = zfac_top(jj) * zalb_top(jj,2) + zfac_bot(jj) * zalb_bot(jj,2)
2001 pspectralalbedo(jj,3) = zfac_top(jj) * zalb_top(jj,3) + zfac_bot(jj) * zalb_bot(jj,3)
2005 palbedosc(jj) = xvspec1 * pspectralalbedo(jj,1) + &
2006 xvspec2 * pspectralalbedo(jj,2) + &
2007 xvspec3 * pspectralalbedo(jj,3)
2013 IF (lhook) CALL dr_hook(
'SNOWCROALB',1,zhook_handle)
2018 SUBROUTINE get_alb(KJ,PSNOWRHO_IN,PPS_IN,PVAGE1,PSNOWGRAN1,PSNOWGRAN2,PSNOWAGE,PALB,&
2022 xrhothreshold_ice, &
2023 xvalb2, xvalb3, xvalb4, xvalb5, &
2024 xvalb6, xvalb7, xvalb8, xvalb9, &
2025 xvalb10, xvalb11, xvdiop1, &
2026 xvrpre1, xvrpre2, xvpres1
2032 INTEGER,
INTENT(IN) :: kj
2033 REAL,
INTENT(IN) :: psnowrho_in, pps_in
2034 REAL,
INTENT(IN) :: pvage1
2035 REAL,
INTENT(IN) :: psnowgran1, psnowgran2, psnowage
2036 REAL,
DIMENSION(3),
INTENT(OUT) :: palb
2038 CHARACTER(3),
INTENT(IN)::hsnowmetamo
2040 REAL :: zdiam, zdiam_sqrt
2042 REAL(KIND=JPRB) :: zhook_handle
2044 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_ALB',0,zhook_handle)
2046 IF ( psnowrho_in<xrhothreshold_ice )
THEN
2048 CALL
get_diam(psnowgran1,psnowgran2,zdiam,hsnowmetamo)
2049 zdiam_sqrt = sqrt(zdiam)
2050 palb(1) = min( xvalb2 - xvalb3*zdiam_sqrt, xvalb4 )
2051 palb(2) = max( 0.3, xvalb5 - xvalb6*zdiam_sqrt )
2052 zdiam = min( zdiam, xvdiop1 )
2053 zdiam_sqrt = sqrt(zdiam)
2054 palb(3) = max( 0., xvalb7*zdiam - xvalb8*zdiam_sqrt + xvalb9 )
2060 palb(1) = max( xvalb11, palb(1) - min( max(pps_in/xvpres1,xvrpre1), xvrpre2 ) * &
2061 xvalb10 * psnowage / pvage1 )
2069 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_ALB',1,zhook_handle)
2076 psw_rad, psnowalb, psnowdz, &
2077 psnowrho, palb, pradsink, pradxs, &
2078 psnowgran1, psnowgran2, psnowage,pps, &
2079 pzenith, ppermsnowfrac,knlvls_use, &
2080 osnow_abs_zenith,hsnowmetamo)
2090 USE modd_snow_par, ONLY : xwcrn, xansmax, xansmin, xans_todry, &
2091 xsnowdmin, xans_t, xaglamin, xaglamax, &
2092 xd1, xd2, xd3, xx, xvspec1, xvspec2, xvspec3, &
2093 xvbeta1, xvbeta2, xvbeta3, xvbeta4, xvbeta5
2103 LOGICAL,
INTENT(IN) :: oglacier
2108 REAL,
DIMENSION(:),
INTENT(IN) :: psw_rad, psnowalb, palb,ppermsnowfrac
2110 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowrho, psnowdz
2112 LOGICAL,
INTENT(IN) :: osnow_abs_zenith
2114 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
2116 REAL,
DIMENSION(:),
INTENT(OUT) :: pradxs
2118 REAL,
DIMENSION(:,:),
INTENT(OUT) :: pradsink
2120 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowgran1, psnowgran2, psnowage
2121 REAL,
DIMENSION(:),
INTENT(IN) :: pps
2122 INTEGER,
DIMENSION(:),
INTENT(IN) :: knlvls_use
2123 REAL,
DIMENSION(:),
INTENT(IN) :: pzenith
2127 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zradtot
2128 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zalb_new
2129 REAL,
DIMENSION(SIZE(PSNOWRHO,1),3) :: zalb
2130 REAL,
DIMENSION(SIZE(PSNOWRHO,2)) :: zdiam
2131 REAL,
DIMENSION(SIZE(PSNOWRHO,2),3) :: zbeta
2132 REAL,
DIMENSION(3) :: zopticalpath, zfact
2135 INTEGER :: jj,jst,jb
2137 REAL(KIND=JPRB) :: zhook_handle
2139 IF (lhook) CALL dr_hook(
'SNOWCRORAD',0,zhook_handle)
2150 zalb_new,zalb,psnowdz(:,1),psnowrho(:,1:2), &
2151 ppermsnowfrac,psnowgran1(:,1),psnowgran2(:,1), &
2152 psnowage(:,1),psnowgran1(:,2),psnowgran2(:,2),psnowage(:,2), &
2153 pps, pzenith, knlvls_use, hsnowmetamo )
2155 DO jj = 1,
SIZE(psw_rad)
2157 DO jst = 1,knlvls_use(jj)
2158 CALL
get_diam(psnowgran1(jj,jst),psnowgran2(jj,jst),zdiam(jst),hsnowmetamo)
2168 zprojlat = 1. / max( xuepsi, cos(pzenith(jj)) )
2170 pradsink(jj,:) = -psw_rad(jj) * ( 1.-psnowalb(jj) ) / ( 1.-zalb_new(jj) )
2173 zopticalpath(1) = 0.
2174 zopticalpath(2) = 0.
2175 zopticalpath(3) = 0.
2177 DO jst = 1,knlvls_use(jj)
2179 zbeta(jst,1) = max( xvbeta1 * psnowrho(jj,jst) / sqrt(zdiam(jst)), xvbeta2 )
2180 zbeta(jst,2) = max( xvbeta3 * psnowrho(jj,jst) / sqrt(zdiam(jst)), xvbeta4 )
2181 zbeta(jst,3) = xvbeta5
2185 zopticalpath(jb) = zopticalpath(jb) + zbeta(jst,jb) * psnowdz(jj,jst)
2186 IF (osnow_abs_zenith)
THEN
2188 zfact(jb) = (1.-zalb(jj,jb)) * exp( -zopticalpath(jb)*zprojlat)
2190 zfact(jb) = (1.-zalb(jj,jb)) * exp( -zopticalpath(jb) )
2194 pradsink(jj,jst) = pradsink(jj,jst) * &
2195 ( xvspec1*zfact(1) + xvspec2*zfact(2) + xvspec3*zfact(3) )
2206 pradxs(jj) = -pradsink( jj,knlvls_use(jj) )
2210 IF (lhook) CALL dr_hook(
'SNOWCRORAD',1,zhook_handle)
2218 ocond_grain,ocond_yen )
2229 USE modd_csts, ONLY : xp00, xcondi, xrholw
2230 USE modd_snow_par, ONLY : xsnowthrmcond1, xsnowthrmcond2, xsnowthrmcond_avap, &
2231 xsnowthrmcond_bvap, xsnowthrmcond_cvap, xvrkz6
2237 REAL,
DIMENSION(:),
INTENT(IN) :: pps
2238 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowtemp, psnowrho, psnowliq
2239 REAL,
DIMENSION(:,:),
INTENT(OUT) :: pscond
2240 LOGICAL,
INTENT(IN) :: ocond_grain, ocond_yen
2246 REAL(KIND=JPRB) :: zhook_handle
2248 IF (lhook) CALL dr_hook(
'SNOWCROTHRM',0,zhook_handle)
2253 DO jst = 1,
SIZE(psnowrho(:,:),2)
2255 DO jj = 1,
SIZE(psnowrho(:,:),1)
2257 IF ( ocond_yen )
THEN
2258 pscond(jj,jst) = xcondi * exp( xvrkz6 * log( psnowrho(jj,jst)/xrholw ) )
2260 pscond(jj,jst) = ( xsnowthrmcond1 + &
2261 xsnowthrmcond2 * psnowrho(jj,jst) * psnowrho(jj,jst) ) + &
2262 max( 0.0, ( xsnowthrmcond_avap + &
2263 ( xsnowthrmcond_bvap/(psnowtemp(jj,jst) + xsnowthrmcond_cvap) ) ) &
2268 IF ( ocond_grain )
THEN
2269 pscond(jj,jst) = max( 0.04, pscond(jj,jst) )
2271 IF( psnowliq(jj,jst)>xuepsi ) pscond(jj,jst) = 0.01 * pscond(jj,jst)
2278 IF (lhook) CALL dr_hook(
'SNOWCROTHRM',1,zhook_handle)
2285 ppew_a_coef, ppew_b_coef, &
2286 ppet_a_coef, ppeq_a_coef, ppet_b_coef, ppeq_b_coef, &
2288 pzref,pts,psnowrho,psnowliq,pscap,pscond1,pscond2, &
2289 puref,pexns,pexna,pdircoszw,pvmod, &
2290 plw_rad,psw_rad,pta,pqa,pps,ptstep, &
2291 psnowdz1,psnowdz2,palbt,pz0,pz0eff,pz0h, &
2292 psfcfrz,pradsink,phpsnow, &
2293 pct,pemist,prhoa,ptsterm1,ptsterm2,pra,pcdsnow,pchsnow, &
2294 pqsat,pdqsat,prsra,pustar2_ic, pri, &
2295 ppet_a_coef_t,ppeq_a_coef_t,ppet_b_coef_t,ppeq_b_coef_t )
2312 USE modd_csts, ONLY : xcpd, xrholw, xstefan, xlvtt, xlstt, xrholw
2318 USE modi_surface_aero_cond
2325 REAL,
INTENT(IN) :: ptstep, psnowdzmin
2327 CHARACTER(LEN=*),
INTENT(IN) :: hsnowres
2332 CHARACTER(LEN=*),
INTENT(IN) :: himplicit_wind
2336 REAL,
DIMENSION(:),
INTENT(IN) :: ppew_a_coef, ppew_b_coef, &
2337 ppet_a_coef, ppeq_a_coef, ppet_b_coef, &
2346 REAL,
DIMENSION(:),
INTENT(IN) :: pzref, pts, psnowdz1, psnowdz2, &
2347 pradsink, psnowrho, psnowliq, pscap, &
2352 REAL,
DIMENSION(:),
INTENT(IN) :: psw_rad, plw_rad, pta, pqa, pps, prhoa
2354 REAL,
DIMENSION(:),
INTENT(IN) :: puref, pexns, pexna, pdircoszw, pvmod
2356 REAL,
DIMENSION(:),
INTENT(OUT) :: ptsterm1, ptsterm2, pemist, pra, &
2357 pct, psfcfrz, pcdsnow, pchsnow, &
2358 pqsat, pdqsat, prsra
2360 REAL,
DIMENSION(:),
INTENT(OUT) :: pustar2_ic, &
2361 ppet_a_coef_t, ppeq_a_coef_t, &
2362 ppet_b_coef_t, ppeq_b_coef_t
2364 REAL,
DIMENSION(:),
INTENT(OUT) :: pri
2368 REAL,
DIMENSION(SIZE(PTS)) :: zac, zri, &
2369 zsconda, za, zb, zc, &
2370 zcdn, zsnowdzm1, zsnowdzm2, &
2371 zvmod, zustar2, zts3, zlvt, &
2373 REAL,
DIMENSION(SIZE(PTS)) :: zsnowevapx, zdenom, znumer
2377 REAL(KIND=JPRB) :: zhook_handle
2383 IF (lhook) CALL dr_hook(
'SNOWCROEBUD',0,zhook_handle)
2387 pqsat(:) =
qsati(pts(:),pps(:))
2388 pdqsat(:) =
dqsati(pts(:),pps(:),pqsat(:))
2401 CALL
surface_ri(pts, pqsat, pexns, pexna, pta, pqa, &
2402 pzref, puref, pdircoszw, pvmod, zri )
2409 IF ( hsnowres==
'RIL' )
THEN
2411 zri(jj) = min( x_ri_max, zri(jj) )
2421 prsra(:) = prhoa(:) / pra(:)
2425 CALL
surface_cd(zri, pzref, puref, pz0eff, pz0h, pcdsnow, zcdn)
2431 znumer(:) = pcdsnow(:)*pvmod(:)
2432 zdenom(:) = prhoa(:) * pcdsnow(:) * pvmod(:) * ppew_a_coef(:)
2433 IF(himplicit_wind==
'OLD')
THEN
2435 zustar2(:) = ( znumer(:) * ppew_b_coef(:) ) / ( 1.0 - zdenom(:) )
2438 zustar2(:) = ( znumer(:) * ( 2.*ppew_b_coef(:) - pvmod(:) ) ) / ( 1.0 - 2.0*zdenom(:) )
2441 zvmod(:) = prhoa(:)*ppew_a_coef(:)*zustar2(:) + ppew_b_coef(:)
2442 zvmod(:) = max( zvmod(:),0. )
2444 WHERE ( ppew_a_coef(:)/= 0. )
2445 zustar2(:) = max( ( zvmod(:) - ppew_b_coef(:) ) / (prhoa(:)*ppew_a_coef(:)), 0. )
2449 zustar2(:) = max( zustar2(:),0. )
2451 pustar2_ic(:) = zustar2(:)
2459 zsnowdzm1(:) = max( psnowdz1(:), psnowdzmin )
2460 zsnowdzm2(:) = max( psnowdz2(:), psnowdzmin )
2464 pct(:) = 1.0 / ( pscap(:)*zsnowdzm1(:) )
2473 zsconda(:) = ( zsnowdzm1(:)*pscond1(:) + zsnowdzm2(:)*pscond2(:) ) / &
2474 ( zsnowdzm1(:) + zsnowdzm2(:) )
2481 z_ccoef(:) = 1.0 - ppeq_a_coef(:) * prsra(:)
2483 ppeq_a_coef_t(:) = - ppeq_a_coef(:) * prsra(:) * pdqsat(:) / z_ccoef(:)
2485 ppeq_b_coef_t(:) = ( ppeq_b_coef(:) &
2486 - ppeq_a_coef(:) * prsra(:) * (pqsat(:) - pdqsat(:)*pts(:)) ) / z_ccoef(:)
2491 z_ccoef(:) = ( 1.0 - ppet_a_coef(:) * prsra(:) ) / pexna(:)
2493 ppet_a_coef_t(:) = - ppet_a_coef(:) * prsra(:) / ( pexns(:) * z_ccoef(:) )
2495 ppet_b_coef_t(:) = ppet_b_coef(:) / z_ccoef(:)
2500 zts3(:) = pemist(:) * xstefan * pts(:)**3
2501 zlvt(:) = (1.-psfcfrz(:))*xlvtt + psfcfrz(:)*xlstt
2503 za(:) = 1./ptstep + pct(:) * &
2504 ( 4. * zts3(:) + prsra(:) * zlvt(:) * ( pdqsat(:) - ppeq_a_coef_t(:) ) &
2505 + prsra(:) * xcpd * ( (1./pexns(:))-(ppet_a_coef_t(:)/pexna(:)) ) &
2506 + ( 2*zsconda(:) / ( zsnowdzm2(:)+zsnowdzm1(:) ) ) )
2508 zb(:) = 1./ptstep + pct(:) * &
2509 ( 3. * zts3(:) + prsra(:) * zlvt(:) * pdqsat(:) )
2511 zc(:) = pct(:) * ( - prsra(:) * zlvt(:) * ( pqsat(:) - ppeq_b_coef_t(:) ) &
2512 + prsra(:) * xcpd * ppet_b_coef_t(:) / pexna(:) &
2513 + psw_rad(:) * (1. - palbt(:)) + pemist(:) * plw_rad(:) &
2514 + phpsnow(:) + pradsink(:) )
2520 ptsterm2(:) = 2. * zsconda(:) * pct(:) / ( za(:) * (zsnowdzm2(:)+zsnowdzm1(:) ) )
2522 ptsterm1(:) = ( pts(:)*zb(:) + zc(:) ) / za(:)
2524 IF (lhook) CALL dr_hook(
'SNOWCROEBUD',1,zhook_handle)
2531 psnowdz,pscond,pscap,ptg, &
2533 pradsink,pct,pterm1,pterm2, &
2534 ppet_a_coef_t,ppeq_a_coef_t, &
2535 ppet_b_coef_t,ppeq_b_coef_t, &
2537 pgbas,psnowtemp,psnowflux, &
2573 REAL,
INTENT(IN) :: ptstep, psnowdzmin
2575 REAL,
DIMENSION(:),
INTENT(IN) :: ptg, psoilcond, pd_g, &
2579 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowdz, pscond, pscap, &
2582 REAL,
DIMENSION(:),
INTENT(IN) :: ppet_a_coef_t, ppeq_a_coef_t, &
2583 ppet_b_coef_t, ppeq_b_coef_t
2585 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowtemp
2587 REAL,
DIMENSION(:),
INTENT(OUT) :: pgbas, psnowflux, pta_ic, pqa_ic
2589 INTEGER,
DIMENSION(:),
INTENT(IN) :: knlvls_use
2593 REAL,
DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)) :: zsnowtemp, zdterm, zcterm, &
2594 zfrcv, zamtrx, zbmtrx, &
2597 REAL,
DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)) :: zwork1, zwork2, zdzdif, &
2600 REAL,
DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)-1) :: zsnowtemp_m, &
2601 zfrcv_m, zamtrx_m, &
2604 REAL,
DIMENSION(SIZE(PTG)) :: zgbas, zsnowtemp_delta
2609 REAL(KIND=JPRB) :: zhook_handle
2611 IF (lhook) CALL dr_hook(
'SNOWCROSOLVT',0,zhook_handle)
2616 zsnowtemp(:,:) = psnowtemp(:,:)
2617 inlvls =
SIZE(psnowdz(:,:),2)
2627 DO jst = knlvls_use(jj),1,-1
2629 zsnowdzm(jj,jst) = max( psnowdz(jj,jst), psnowdzmin )
2631 zwork1(jj,jst) = zsnowdzm(jj,jst) * pscond(jj,jst)
2633 IF ( jst<knlvls_use(jj) )
THEN
2635 zdzdif(jj,jst) = zsnowdzm(jj,jst) + zsnowdzm(jj,jst+1)
2637 zwork2(jj,jst) = zsnowdzm(jj,jst+1) * pscond(jj,jst+1)
2641 zdzdif(jj,jst) = zsnowdzm(jj,jst) + pd_g(jj)
2643 zwork2(jj,jst) = pd_g(jj) * psoilcond(jj)
2647 zdterm(jj,jst) = 2.0 * ( zwork1(jj,jst) + zwork2(jj,jst) ) / zdzdif(jj,jst)**2
2649 zcterm(jj,jst) = pscap(jj,jst) * zsnowdzm(jj,jst) / ptstep
2665 zbmtrx(:,1) = 1. / ( pct(:)*ptstep )
2666 zcmtrx(:,1) = - pterm2(:) * zbmtrx(:,1)
2667 zfrcv(:,1) = pterm1(:) * zbmtrx(:,1)
2671 DO jst = 2,knlvls_use(jj)
2674 zamtrx(jj,jst) = -zdterm(jj,jst-1)
2675 zbmtrx(jj,jst) = zcterm(jj,jst) + zdterm(jj,jst-1) + zdterm(jj,jst)
2676 zfrcv(jj,jst) = zcterm(jj,jst)*psnowtemp(jj,jst) - (pradsink(jj,jst-1)-pradsink(jj,jst))
2678 IF ( jst<knlvls_use(jj) )
THEN
2679 zcmtrx(jj,jst) = -zdterm(jj,jst)
2681 zcmtrx(jj,jst) = 0.0
2682 zfrcv(jj,jst) = zfrcv(jj,jst) + zdterm(jj,jst)*ptg(jj)
2696 psnowflux(:) = zdterm(:,1) * ( zsnowtemp(:,1) - zsnowtemp(:,2) )
2708 zbmtrx_m(:,1) = zcterm(:,2) + zdterm(:,1) + zdterm(:,2)
2709 zcmtrx_m(:,1) = -zdterm(:,2)
2710 zfrcv_m(:,1) = zcterm(:,2)*psnowtemp(:,2) - (pradsink(:,1)-pradsink(:,2)) + zdterm(:,1)*xtt
2713 DO jst = 2,knlvls_use(jj)-1
2714 zamtrx_m(jj,jst) = zamtrx(jj,jst+1)
2715 zbmtrx_m(jj,jst) = zbmtrx(jj,jst+1)
2716 zcmtrx_m(jj,jst) = zcmtrx(jj,jst+1)
2717 zfrcv_m(jj,jst) = zfrcv(jj,jst+1)
2718 zsnowtemp_m(jj,jst) = psnowtemp(jj,jst+1)
2727 zsnowtemp_delta(:) = 0.0
2729 WHERE( zsnowtemp(:,1)>xtt .AND. psnowtemp(:,1)>=xtt )
2730 psnowflux(:) = zdterm(:,1) * ( xtt-zsnowtemp_m(:,1) )
2731 zsnowtemp_delta(:) = 1.0
2735 DO jst = 2,knlvls_use(jj)
2736 zsnowtemp(jj,jst) = zsnowtemp_delta(jj) * zsnowtemp_m(jj,jst-1) + &
2737 (1.0-zsnowtemp_delta(jj)) * zsnowtemp(jj,jst)
2749 zgbas(jj) = zdterm(jj,knlvls_use(jj)) * ( zsnowtemp(jj,knlvls_use(jj)) - ptg(jj) )
2750 pgbas(jj) = zdterm(jj,knlvls_use(jj)) * ( min( xtt, zsnowtemp(jj,knlvls_use(jj)) ) - ptg(jj) )
2751 zsnowtemp(jj,knlvls_use(jj)) = zsnowtemp(jj,knlvls_use(jj)) + &
2752 ( zgbas(jj)-pgbas(jj) ) / zcterm(jj,knlvls_use(jj))
2759 psnowtemp(jj,1:knlvls_use(jj)) = zsnowtemp(jj,1:knlvls_use(jj))
2766 pta_ic(:) = ppet_b_coef_t(:) + ppet_a_coef_t(:) * psnowtemp(:,1)
2768 pqa_ic(:) = ppeq_b_coef_t(:) + ppeq_a_coef_t(:) * psnowtemp(:,1)
2770 IF (lhook) CALL dr_hook(
'SNOWCROSOLVT',1,zhook_handle)
2777 psnowrho,psnowliq,knlvls_use )
2787 USE modd_csts,ONLY : xtt, xlmtt, xrholw, xrholi
2795 REAL,
DIMENSION(:,:),
INTENT(IN) :: pscap
2797 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowdz, psnowtemp, psnowrho, &
2800 INTEGER,
DIMENSION(:),
INTENT(IN) :: knlvls_use
2804 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zphase, zcmprsfact, &
2806 zsnowmelt, zsnowtemp
2810 REAL(KIND=JPRB) :: zhook_handle
2812 IF (lhook) CALL dr_hook(
'SNOWCROMELT',0,zhook_handle)
2817 DO jj = 1,
SIZE(psnowdz,1)
2818 DO jst = 1,knlvls_use(jj)
2819 zphase(jj,jst) = 0.0
2820 zcmprsfact(jj,jst) = 0.0
2821 zsnowlwe(jj,jst) = 0.0
2822 zsnowmelt(jj,jst) = 0.0
2823 zsnowtemp(jj,jst) = 0.0
2830 DO jj = 1,
SIZE(psnowdz,1)
2832 DO jst = 1,knlvls_use(jj)
2834 ! total liquid equivalent water content of snow(m):
2835 zsnowlwe(jj,jst) = psnowrho(jj,jst) * psnowdz(jj,jst) / xrholw
2837 ! melt snow
if excess energy and snow available:
2838 ! phase change(j/m2)
2839 zphase(jj,jst) = min( pscap(jj,jst) * max(0.0,psnowtemp(jj,jst)-xtt) * psnowdz(jj,jst), &
2840 max(0.0,zsnowlwe(jj,jst)-psnowliq(jj,jst)) * xlmtt * xrholw )
2842 ! update snow liq water content and temperature
if melting:
2843 ! liquid water available for next layer from melting of snow
2844 ! which is assumed to be leaving the current layer(m):
2845 zsnowmelt(jj,jst) = zphase(jj,jst) / (xlmtt*xrholw)
2847 ! cool off snow layer temperature due to melt:
2848 zsnowtemp(jj,jst) = psnowtemp(jj,jst) - zphase(jj,jst) / (pscap(jj,jst)*psnowdz(jj,jst))
2850 ! difference with isba_es: zmeltxs should never be different of 0.
2851 ! because of the introduction of the tests in llayergone
2852 psnowtemp(jj,jst) = zsnowtemp(jj,jst)
2854 ! the control below should be suppressed after further tests
2855 IF (psnowtemp(jj,jst)-xtt > xuepsi)
THEN
2856 WRITE(*,*)
'pb dans MELT PSNOWTEMP(JJ,JST) >XTT:', jj,jst, psnowtemp(jj,jst)
2868 zcmprsfact(jj,jst) = ( zsnowlwe(jj,jst) - (psnowliq(jj,jst)+zsnowmelt(jj,jst)) ) &
2869 / ( zsnowlwe(jj,jst) - psnowliq(jj,jst) )
2870 psnowdz(jj,jst) = psnowdz(jj,jst) * zcmprsfact(jj,jst)
2871 psnowrho(jj,jst) = zsnowlwe(jj,jst) * xrholw / psnowdz(jj,jst)
2876 psnowliq(jj,jst) = psnowliq(jj,jst) + zsnowmelt(jj,jst)
2881 IF (lhook) CALL dr_hook(
'SNOWCROMELT',1,zhook_handle)
2888 psnowrho,psnowtemp,psnowdz,psnowliq, &
2889 pthrufal, pscap, plel3l,knlvls_use )
2897 USE modd_csts, ONLY : xtt, xlmtt, xrholw, xci,xrholi
2906 REAL,
INTENT(IN) :: ptstep
2908 REAL,
DIMENSION(:),
INTENT(IN) :: prr
2910 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowdz, psnowtemp, psnowliq, psnowrho
2912 REAL,
DIMENSION(:),
INTENT(INOUT) :: pthrufal
2915 INTEGER,
DIMENSION(:),
INTENT(IN) :: knlvls_use
2916 REAL,
DIMENSION(:,:),
INTENT(IN) :: pscap
2917 REAL,
DIMENSION(:),
INTENT(IN) :: plel3l
2921 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zphase, &
2922 zsnowliq, zsnowrho, &
2923 zwholdmax, zsnowdz, &
2926 REAL,
DIMENSION(SIZE(PSNOWRHO,1),0:SIZE(PSNOWRHO,2)) :: zflowliq
2928 REAL :: zdenom, znumer
2933 REAL(KIND=JPRB) :: zhook_handle
2936 IF (lhook) CALL dr_hook(
'SNOWCROREFRZ',0,zhook_handle)
2941 inlvls =
SIZE(psnowdz,2)
2943 DO jj=1,
SIZE(psnowdz,1)
2944 DO jst=1,knlvls_use(jj)
2945 zsnowrho(jj,jst) = psnowrho(jj,jst)
2946 zsnowtemp(jj,jst) = psnowtemp(jj,jst)
2947 zwholdmax(jj,jst) =
snowcrohold( psnowrho(jj,jst),psnowliq(jj,jst),psnowdz(jj,jst) )
2951 DO jj = 1,
SIZE(psnowdz,1)
2959 IF ( knlvls_use(jj)>0. )
THEN
2960 zflowliq(jj,0) = prr(jj) * ptstep / xrholw
2961 zflowliq(jj,0) = max(0., zflowliq(jj,0) - plel3l(jj)*ptstep/(xlvtt*xrholw))
2966 DO jst=1,knlvls_use(jj)
2970 psnowliq(jj,jst) = psnowliq(jj,jst) + zflowliq(jj,jst-1)
2976 zphase(jj,jst) = min( pscap(jj,jst)* max(0.0, xtt - zsnowtemp(jj,jst)) * psnowdz(jj,jst), &
2977 psnowliq(jj,jst) * xlmtt * xrholw )
2980 zsnowliq(jj,jst) = psnowliq(jj,jst) - zphase(jj,jst)/(xlmtt*xrholw)
2983 zsnowdz(jj,jst) = max(xsnowdmin/inlvls, psnowdz(jj,jst))
2988 znumer = ( zsnowrho(jj,jst) * zsnowdz(jj,jst) - ( psnowliq(jj,jst) - zflowliq(jj,jst-1) ) * xrholw )
2989 zdenom = ( zsnowrho(jj,jst) * zsnowdz(jj,jst) - ( zsnowliq(jj,jst) - zflowliq(jj,jst-1) ) * xrholw )
2991 psnowtemp(jj,jst) = xtt + ( zsnowtemp(jj,jst)-xtt )*znumer/zdenom + zphase(jj,jst)/( xci*zdenom )
2998 zflowliq(jj,jst) = max( 0., zsnowliq(jj,jst)-zwholdmax(jj,jst) )
3000 zsnowliq(jj,jst) = zsnowliq(jj,jst) - zflowliq(jj,jst)
3004 znumer = ( zsnowrho(jj,jst) * psnowdz(jj,jst) - ( zflowliq(jj,jst) - zflowliq(jj,jst-1) ) * xrholw )
3006 zsnowrho(jj,jst) = znumer / zsnowdz(jj,jst)
3009 IF ( zsnowrho(jj,jst)>xrholi )
THEN
3010 psnowdz(jj,jst) = psnowdz(jj,jst) * zsnowrho(jj,jst) / xrholi
3011 zsnowrho(jj,jst) = xrholi
3016 psnowrho(jj,jst) = zsnowrho(jj,jst)
3017 psnowliq(jj,jst) = zsnowliq(jj,jst)
3026 pthrufal(jj) = pthrufal(jj) + zflowliq(jj,knlvls_use(jj)) * xrholw / ptstep
3030 IF (lhook) CALL dr_hook(
'SNOWCROREFRZ',1,zhook_handle)
3034 SUBROUTINE get_rho(PRHO_IN,PDZ,PSNOWLIQ,PFLOWLIQ,PRHO_OUT)
3040 REAL,
INTENT(IN) :: prho_in, pdz, psnowliq,pflowliq
3041 REAL,
INTENT(OUT) :: prho_out
3043 REAL(KIND=JPRB) :: zhook_handle
3045 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_RHO',0,zhook_handle)
3047 prho_out = ( prho_in * pdz - ( psnowliq - pflowliq ) * xrholw )
3049 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_RHO',1,zhook_handle)
3056 ptstep,palbt,psw_rad,pemist,plwupsnow, &
3057 plw_rad,pta,psfcfrz,pqa,phpsnow, &
3058 psnowtempo1,psnowflux,pct,pradsink, &
3059 pqsat,pdqsat,prsra, &
3060 prn,ph,pgflux,ples3l,plel3l,pevap, &
3076 REAL,
INTENT(IN) :: ptstep
3078 REAL,
DIMENSION(:),
INTENT(IN) :: psnowdz, psnowtempo1, psnowflux, pct, &
3079 pradsink, pexns, pexna
3081 REAL,
DIMENSION(:),
INTENT(IN) :: palbt, psw_rad, pemist, plw_rad, &
3082 pta, psfcfrz, pqa, &
3083 phpsnow, pqsat, pdqsat, prsra, &
3086 REAL,
DIMENSION(:),
INTENT(INOUT) :: psnowtemp
3088 REAL,
DIMENSION(:),
INTENT(OUT) :: prn, ph, pgflux, ples3l, plel3l, &
3089 pevap, plwupsnow, pustar
3093 REAL,
DIMENSION(SIZE(PSNOWDZ)) :: zevapc, zsnowtemp
3094 REAL :: zsmsnow, zgflux
3098 REAL(KIND=JPRB) :: zhook_handle
3100 IF (lhook) CALL dr_hook(
'SNOWCROFLUX',0,zhook_handle)
3108 DO jj = 1,
SIZE(palbt)
3110 CALL
get_flux(palbt(jj),pemist(jj),psw_rad(jj),plw_rad(jj), &
3111 pexns(jj),pexna(jj),pta(jj),pqa(jj),prsra(jj), &
3112 pqsat(jj),pdqsat(jj),psfcfrz(jj),phpsnow(jj), &
3113 psnowtemp(jj),psnowtempo1(jj), &
3114 prn(jj),ph(jj),zevapc(jj), &
3115 ples3l(jj),plel3l(jj),zgflux )
3117 IF ( psnowtemp(jj)>xtt )
THEN
3119 IF ( psnowtempo1(jj)<xtt )
THEN
3133 CALL
get_flux(palbt(jj),pemist(jj),psw_rad(jj),plw_rad(jj), &
3134 pexns(jj),pexna(jj), pta(jj),pqa(jj),prsra(jj), &
3135 pqsat(jj),pdqsat(jj),psfcfrz(jj),phpsnow(jj), &
3136 xtt,psnowtempo1(jj), &
3137 prn(jj),ph(jj),zevapc(jj), &
3138 ples3l(jj),plel3l(jj),pgflux(jj) )
3140 zsmsnow = zgflux - pgflux(jj)
3143 zsnowtemp(jj) = psnowtemp(jj) - zsmsnow * ptstep * pct(jj)
3153 CALL
get_flux(palbt(jj),pemist(jj),psw_rad(jj),plw_rad(jj), &
3154 pexns(jj),pexna(jj), pta(jj),pqa(jj),prsra(jj), &
3155 pqsat(jj),pdqsat(jj),psfcfrz(jj),phpsnow(jj), &
3157 prn(jj),ph(jj),zevapc(jj), &
3158 ples3l(jj),plel3l(jj),pgflux(jj) )
3160 zsnowtemp(jj) = xtt + ptstep * pct(jj) * ( pgflux(jj) + pradsink(jj) - psnowflux(jj) )
3166 zsnowtemp(jj) = psnowtemp(jj)
3177 psnowtemp(:) = zsnowtemp(:)
3181 pevap(:) = zevapc(:)
3187 pustar(:) = sqrt(pustar2_ic(:))
3189 IF (lhook) CALL dr_hook(
'SNOWCROFLUX',1,zhook_handle)
3193 SUBROUTINE get_flux(PALBT,PEMIST,PSW_RAD,PLW_RAD,PEXNS,PEXNA, &
3194 pta,pqa,prsra,pqsat,pdqsat,psfcfrz,phpsnow, &
3195 psnowtemp,psnowtempo1, &
3196 prn,ph,pevapc,ples3l,plel3l,pgflux )
3198 USE modd_csts,ONLY : xstefan, xcpd, xlstt, xlvtt
3202 REAL,
INTENT(IN) :: palbt, pemist
3203 REAL,
INTENT(IN) :: psw_rad, plw_rad
3204 REAL,
INTENT(IN) :: pexns, pexna
3205 REAL,
INTENT(IN) :: pta, pqa, prsra, pqsat, pdqsat, psfcfrz, phpsnow
3206 REAL,
INTENT(IN) :: psnowtemp,psnowtempo1
3207 REAL,
INTENT(OUT):: prn, ph, pevapc, ples3l, plel3l, pgflux
3209 REAL :: zle, zdeltat, zlwupsnow, zsnowto3
3211 REAL(KIND=JPRB) :: zhook_handle
3213 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_FLUX',0,zhook_handle)
3215 zsnowto3 = psnowtempo1**3
3217 zdeltat = psnowtemp - psnowtempo1
3219 zlwupsnow = pemist * xstefan * zsnowto3 * ( psnowtempo1 + 4.*zdeltat )
3221 prn = ( 1.-palbt )*psw_rad + pemist*plw_rad - zlwupsnow
3223 ph = prsra * xcpd * ( psnowtemp/pexns - pta/pexna )
3225 pevapc = prsra * ( (pqsat - pqa) + pdqsat*zdeltat )
3227 ples3l = psfcfrz * xlstt * pevapc
3229 plel3l = (1.-psfcfrz) * xlvtt * pevapc
3231 zle = ples3l + plel3l
3233 pgflux = prn - ph - zle + phpsnow
3235 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_FLUX',1,zhook_handle)
3242 psnowdz,pevapcor,psnowhmass )
3256 USE modd_csts, ONLY : xlstt, xlmtt, xci, xtt
3262 REAL,
INTENT(IN) :: ptstep
3264 REAL,
DIMENSION(:),
INTENT(IN) :: psnowtemp
3266 REAL,
DIMENSION(:),
INTENT(IN) :: ples3l
3268 REAL,
DIMENSION(:),
INTENT(INOUT) :: psnowrho, psnowdz, psnowhmass, &
3273 REAL,
DIMENSION(SIZE(PLES3L)) :: zsnowevaps, zsnowevap, zsnowevapx, &
3281 REAL(KIND=JPRB) :: zhook_handle
3283 IF (lhook) CALL dr_hook(
'SNOWCROEVAPN',0,zhook_handle)
3294 WHERE ( psnowdz>0.0 )
3302 zsnowevaps(:) = ples3l(:) * ptstep / ( xlstt*psnowrho(:) )
3303 zsnowdz(:) = psnowdz(:) - zsnowevaps(:)
3304 psnowdz(:) = max( 0.0, zsnowdz(:) )
3305 zevapcor(:) = zevapcor(:) + max(0.0,-zsnowdz(:)) * psnowrho(:) / ptstep
3310 psnowhmass(:) = psnowhmass(:) &
3311 - ples3l(:) * (ptstep/xlstt) * ( xci * (psnowtemp(:)-xtt) - xlmtt )
3318 pevapcor(:) = pevapcor(:) + zevapcor(:)
3320 IF (lhook) CALL dr_hook(
'SNOWCROEVAPN',1,zhook_handle)
3329 psnowheat,pradsink_2d,pevapcor,pthrufal,pgrndflux, &
3330 pgfluxsnow,psnowdz,psnowliq,psnowtemp,pradxs, &
3349 REAL,
INTENT(IN) :: ptstep
3351 REAL,
DIMENSION(:),
INTENT(IN) :: plel3l, ples3l, pgfluxsnow,prr
3353 REAL,
DIMENSION(:,:),
INTENT(IN) :: pradsink_2d
3355 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowrho, psnowheat
3357 REAL,
DIMENSION(:),
INTENT(INOUT) :: pgrndflux, pradxs
3359 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowdz, psnowliq, psnowtemp
3361 REAL,
DIMENSION(:),
INTENT(OUT) :: pthrufal
3363 REAL,
DIMENSION(:),
INTENT(OUT) :: pevapcor
3370 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: knlvls_use
3374 REAL,
DIMENSION(SIZE(PLES3L)) :: zradsink
3375 REAL,
DIMENSION(SIZE(PLES3L)) :: zsnowheatc
3376 INTEGER,
DIMENSION(SIZE(PLES3L)) :: isnowgone_delta
3380 REAL(KIND=JPRB) :: zhook_handle
3382 IF (lhook) CALL dr_hook(
'SNOWCROGONE',0,zhook_handle)
3390 DO jj = 1,
SIZE(zradsink)
3391 zradsink(jj) = pradsink_2d(jj,inlvls_use(jj))
3392 zsnowheatc(jj) = sum(psnowheat(jj,1:inlvls_use(jj)))
3395 isnowgone_delta(:) = 1
3406 zsnowheatc(:) = zsnowheatc(:) + max( 0., ples3l(:)*ptstep/xlstt ) * xlmtt
3408 WHERE ( pgfluxsnow(:)+zradsink(:)-pgrndflux(:) >= (-zsnowheatc(:)/ptstep) )
3409 pgrndflux(:) = pgfluxsnow(:) + (zsnowheatc(:)/ptstep)
3410 pevapcor(:) = ples3l(:)/xlstt
3412 isnowgone_delta(:) = 0
3421 DO jj=1,
SIZE(zradsink)
3423 IF(isnowgone_delta(jj) == 0 )
THEN
3424 pthrufal(jj) = pthrufal(jj) + &
3425 sum( psnowrho(jj,1:inlvls_use(jj))*psnowdz(jj,1:inlvls_use(jj)) ) / ptstep
3427 pthrufal(jj) = pthrufal(jj) + prr(jj) - plel3l(jj)/xlvtt
3428 psnowtemp(jj,:) = xtt
3436 IF (lhook) CALL dr_hook(
'SNOWCROGONE',1,zhook_handle)
3443 psnowgran1,psnowgran2,psnowhist,psnowage,knlvls_use,&
3457 USE modd_csts, ONLY : xtt, xrholw, xlmtt, xci
3458 USE modd_snow_par, ONLY : xrhosmin_es, xsnowdmin, xrhosmax_es
3467 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowrho
3468 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowdz
3469 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowheat
3470 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowgran1
3471 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowgran2
3472 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowhist
3473 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowage
3475 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowtemp
3476 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowliq
3478 INTEGER,
DIMENSION(:),
INTENT(IN) :: knlvls_use
3479 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
3483 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: zsnowheat_1d
3484 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: zsnowrho_1d
3485 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: zsnow
3486 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: zscap
3487 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: zndent
3488 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: znvieu
3489 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: zsnowage_1d
3491 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowgran1n, &
3492 zsnowgran2n,zsnowhistn
3494 LOGICAL :: gdendritic
3498 REAL(KIND=JPRB) :: zhook_handle
3500 IF (lhook) CALL dr_hook(
'SNOWCROEVAPGONE',0,zhook_handle)
3504 zsnowheat_1d(:) = 0.
3514 DO jj = 1,
SIZE(psnowrho,1)
3516 IF ( psnowdz(jj,1)==0.0 )
THEN
3518 DO jst = 2,knlvls_use(jj)
3520 zsnowheat_1d(jj) = zsnowheat_1d(jj) + psnowdz(jj,jst) * &
3521 ( psnowrho(jj,jst)*xci * (zsnowtemp(jj,jst)-xtt) &
3522 - xlmtt * psnowrho(jj,jst) ) &
3523 + xlmtt * xrholw * psnowliq(jj,jst)
3524 zsnow(jj) = zsnow(jj) + psnowdz(jj,jst)
3525 zsnowrho_1d(jj) = zsnowrho_1d(jj) + psnowdz(jj,jst) * psnowrho(jj,jst)
3526 zsnowage_1d(jj) = zsnowage_1d(jj) + psnowdz(jj,jst) * psnowrho(jj,jst) * psnowage(jj,jst)
3529 IF ( hsnowmetamo==
'B92' )
THEN
3530 gdendritic = ( psnowgran1(jj,jst)<-xepsi )
3532 gdendritic = ( psnowgran1(jj,jst)<xvdiam6*(4.-psnowgran2(jj,jst))-xuepsi )
3535 IF ( gdendritic )
THEN
3536 zndent(jj) = zndent(jj) + 1.0
3538 znvieu(jj) = znvieu(jj) + 1.0
3547 zsnowrho_1d(:) = zsnowrho_1d(:) / max( xsnowdmin, zsnow(:) )
3548 zsnowage_1d(:) = zsnowage_1d(:) / max( xsnowdmin, zsnow(:) * zsnowrho_1d(:) )
3549 zsnowrho_1d(:) = max( xrhosmin_es, min( xrhosmax_es, zsnowrho_1d(:) ) )
3555 zsnowgran1n,zsnowgran2n,zsnowhistn,zndent,znvieu,&
3558 DO jj=1,
SIZE(psnowrho,1)
3560 IF( zsnow(jj)/=0.0 )
THEN
3562 psnowdz(jj,1:knlvls_use(jj)) = zsnow(jj) / knlvls_use(jj)
3563 psnowheat(jj,1:knlvls_use(jj)) = zsnowheat_1d(jj) / knlvls_use(jj)
3564 psnowrho(jj,1:knlvls_use(jj)) = zsnowrho_1d(jj)
3566 zscap(jj) = zsnowrho_1d(jj) * xci
3568 DO jst = 1,knlvls_use(jj)
3570 psnowtemp(jj,jst) = xtt + ( ( (psnowheat(jj,jst)/psnowdz(jj,jst)) &
3571 + xlmtt*psnowrho(jj,jst) ) / zscap(jj) )
3572 psnowtemp(jj,jst) = min( xtt, psnowtemp(jj,jst) )
3574 psnowliq(jj,jst) = max( 0.0, psnowtemp(jj,jst)-xtt ) * zscap(jj) * &
3575 psnowdz(jj,jst) / (xlmtt*xrholw)
3583 IF (lhook) CALL dr_hook(
'SNOWCROEVAPGONE',1,zhook_handle)
3591 psnow,psnowrho,psnowdz,psnowheat,psnowhmass, &
3592 psnowalb,ppermsnowfrac,psnowgran1,psnowgran2, &
3593 gsnowfall,psnowdzn,psnowrhof,psnowdzf, &
3594 psnowgran1f,psnowgran2f,psnowhistf,psnowagef, &
3595 omodif_grid,knlvls_use,osnowdrift,pz0eff,puref,&
3620 xnsph1, xnsph2, xnsph3, xnsph4
3622 USE modd_snow_par, ONLY : xrhosmin_es, xsnowdmin, xansmax, xaglamax, xsnowcritd, &
3623 xdzmin_top, xdzmin_top_bis, xdzmin_bot, xsplit_coef, &
3624 xagreg_coef_1, xagreg_coef_2, xdz1, xdz2, xdz3, xdz3_bis,&
3625 xdz4, xdz5, xdz_base, xdz_internal, xscale_cm, &
3626 xdzmax_internal, xdzmin_top_extrem, xsnowfall_threshold, &
3627 xratio_newlayer, xdepth_threshold1, xdepth_threshold2, &
3628 xdepth_surface, xdiff_1, xdiff_max, xscale_diff, &
3629 xsnowfall_a_sn, xsnowfall_b_sn, xsnowfall_c_sn
3638 LOGICAL,
INTENT(IN) :: oglacier
3643 REAL,
INTENT(IN) :: ptstep
3645 REAL,
DIMENSION(:),
INTENT(IN) :: psr, pta, pvmod, ppermsnowfrac
3647 REAL,
DIMENSION(:),
INTENT(IN) :: pz0eff,puref
3649 REAL,
DIMENSION(:),
INTENT(INOUT) :: psnow, psnowalb
3651 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowrho, psnowdz, psnowheat
3653 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowhmass
3655 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowgran1, psnowgran2
3657 LOGICAL,
DIMENSION(:),
INTENT(INOUT) :: gsnowfall
3660 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowrhof, psnowdzf
3661 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowgran1f, psnowgran2f, psnowhistf
3662 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowagef
3664 REAL,
DIMENSION(:,:),
INTENT(OUT) :: psnowdzn
3666 LOGICAL,
DIMENSION(:),
INTENT(OUT) :: omodif_grid
3668 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: knlvls_use
3670 LOGICAL,
INTENT(IN) :: osnowdrift
3671 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
3675 LOGICAL,
DIMENSION(SIZE(PTA)) :: gagreg_surf
3677 REAL,
DIMENSION(SIZE(PTA)) :: zsnowfall, zsnowtemp, zscap, zansmax
3679 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zdzopt
3684 REAL :: zsnow_upper, zsnow_upper2
3686 REAL :: zthickness_intermediate, zthickness2
3687 REAL :: zpenalty, zdiftype_inf, zdiftype_sup, zcritsize, zcritsize_inf, zcritsize_sup
3688 REAL :: zsnow2l, zcoef
3690 INTEGER :: inb_deep_layer, inb_upper_layer
3692 INTEGER :: inb_min_layers
3693 INTEGER :: inb_intermediate
3694 INTEGER :: iend_intermediate
3695 INTEGER :: jstdeep, jstend
3696 INTEGER :: jst_1, jj_a_agreg_sup, jj_a_agreg_inf, jj_a_dedoub
3697 INTEGER :: inlvls, inlvlsmin, inlvlsmax, jj, jst
3705 REAL,
PARAMETER :: pphref_wind_rho = 10.
3706 REAL,
PARAMETER :: pphref_wind_grain = 5.
3707 REAL,
PARAMETER :: pphref_wind_min = min(pphref_wind_rho,pphref_wind_grain)*0.5
3708 REAL,
DIMENSION(SIZE(PTA)) :: zwind_rho
3709 REAL,
DIMENSION(SIZE(PTA)) :: zwind_grain
3711 REAL(KIND=JPRB) :: zhook_handle
3715 IF (lhook) CALL dr_hook(
'SNOWNLFALL_UPGRID',0,zhook_handle)
3717 inlvls =
SIZE (psnowrho(:,:),2)
3718 inlvlsmax =
SIZE (psnowrho(:,:),2)
3724 gsnowfall(:) =.false.
3725 gagreg_surf(:) =.false.
3730 psnowgran1f(:) = 0.0
3731 psnowgran2f(:) = 0.0
3733 psnowdzn(:,:) = psnowdz(:,:)
3735 omodif_grid(:) = .false.
3746 inb_min_layers = 2 + inlvlsmax/3
3748 DO jj = 1,
SIZE(psnow(:))
3750 IF ( psnow(jj)>xdepth_threshold2 .AND. knlvls_use(jj)>inb_min_layers )
THEN
3757 inb_deep_layer = ( knlvls_use(jj) + inlvlsmax ) / 6
3760 inb_upper_layer = knlvls_use(jj) - inb_deep_layer
3763 zsnow_upper = xdepth_surface
3766 zcoef_depth = ( psnow(jj) - xdepth_surface ) * 2. / ( (inb_deep_layer+1) * inb_deep_layer )
3770 DO jstdeep = 1,inb_deep_layer
3771 jst = inb_upper_layer + jstdeep
3772 zdzopt(jj,jst) = zcoef_depth * jstdeep
3778 inb_upper_layer = knlvls_use(jj)
3780 zsnow_upper = psnow(jj)
3788 zsnow_upper2 = zsnow_upper / max( inlvlsmin, inb_upper_layer )
3790 zdzopt(jj,1) = min( xdz1, zsnow_upper2 )
3791 IF ( knlvls_use(jj)>=2 ) zdzopt(jj,2) = min( xdz2, zsnow_upper2 )
3792 IF ( knlvls_use(jj)>=3 ) zdzopt(jj,3) = min( xdz3, zsnow_upper2 )
3794 IF ( inb_upper_layer>0 )
THEN
3796 zsnow_upper2 = zsnow_upper / inb_upper_layer
3802 IF ( inb_upper_layer>=3 ) zdzopt(jj,3) = min( xdz3_bis, zsnow_upper2 )
3803 IF ( inb_upper_layer>=4 ) zdzopt(jj,4) = min( xdz4 , zsnow_upper2 )
3804 IF ( inb_upper_layer>=5 ) zdzopt(jj,5) = min( xdz5 , zsnow_upper2 )
3806 IF ( inb_upper_layer==knlvls_use(jj) )
THEN
3812 zdzopt(jj,inb_upper_layer) = min( xdz_base, zsnow_upper/max(inlvlsmin,inb_upper_layer) )
3817 zthickness_intermediate = zsnow_upper - sum(zdzopt(jj,1:5)) - zdzopt(jj,inb_upper_layer)
3819 IF ( zsnow_upper<=xdepth_threshold1 .OR. inb_upper_layer<8 )
THEN
3820 inb_intermediate = inb_upper_layer - 6
3821 iend_intermediate = inb_upper_layer - 1
3825 inb_intermediate = inb_upper_layer - 8
3826 iend_intermediate = inb_upper_layer - 3
3828 IF ( inb_intermediate>0 )
THEN
3829 zthickness_intermediate = zthickness_intermediate * inb_intermediate / float(inb_intermediate+1)
3839 zthickness_intermediate = zsnow_upper - sum(zdzopt(jj,1:5))
3840 inb_intermediate = inb_upper_layer - 5
3841 iend_intermediate = inb_upper_layer
3847 IF ( inb_intermediate>0 )
THEN
3849 zthickness2 = max( xdz_internal, zthickness_intermediate/inb_intermediate )
3851 jstend = min( iend_intermediate,10 )
3853 zdzopt(jj,jst) = min( xdzmax_internal(jst-5), zthickness2 )
3856 IF ( iend_intermediate>10 )
THEN
3857 DO jst = 11,iend_intermediate
3858 zdzopt(jj,jst) = zthickness2
3864 IF ( zsnow_upper>=xdepth_threshold1 .AND. inb_upper_layer>=8 )
THEN
3866 zdzopt(jj,inb_upper_layer-2) = 0.34*zdzopt(jj,inb_upper_layer) + &
3867 0.66*zdzopt(jj,inb_upper_layer-3)
3868 zdzopt(jj,inb_upper_layer-1) = 0.66*zdzopt(jj,inb_upper_layer) + &
3869 0.34*zdzopt(jj,inb_upper_layer-3)
3915 DO jj = 1,
SIZE(psnow(:))
3917 IF ( psr(jj)>0.0 )
THEN
3920 IF ( knlvls_use(jj)>0 )
THEN
3921 zscap(jj) = xci*psnowrho(jj,1)
3922 zsnowtemp(jj) = xtt + ( psnowheat(jj,1) + xlmtt*psnowrho(jj,1)*psnowdz(jj,1) ) / &
3923 ( zscap(jj) * max( xsnowdmin/inlvls, psnowdz(jj,1) ) )
3925 zsnowtemp(jj) = pta(jj)
3927 zsnowtemp(jj) = min( xtt, zsnowtemp(jj) )
3935 zz0eff=min(pz0eff(jj),puref(jj)*0.5,pphref_wind_min)
3937 zwind_rho(jj) = pvmod(jj)*log(pphref_wind_rho/zz0eff)/ &
3938 log(puref(jj)/zz0eff)
3939 zwind_grain(jj) = pvmod(jj)*log(pphref_wind_grain/zz0eff)/ &
3940 log(puref(jj)/zz0eff)
3942 psnowhmass(jj) = psr(jj) * ( xci * ( zsnowtemp(jj)-xtt ) - xlmtt ) * ptstep
3944 psnowrhof(jj) = max( xrhosmin_es, xsnowfall_a_sn + &
3945 xsnowfall_b_sn * ( pta(jj)-xtt ) + &
3946 xsnowfall_c_sn * min( pvmod(jj), sqrt(zwind_rho(jj) ) ) )
3947 zsnowfall(jj) = psr(jj) * ptstep / psnowrhof(jj)
3948 psnow(jj) = psnow(jj) + zsnowfall(jj)
3949 psnowdzf(jj) = zsnowfall(jj)
3951 IF ( hsnowmetamo==
'B92' )
THEN
3953 IF ( osnowdrift )
THEN
3954 psnowgran1f(jj) = -xgran
3955 psnowgran2f(jj) = xnsph3
3957 psnowgran1f(jj) = max( min( xnden1*zwind_grain(jj)-xnden2, xnden3 ), -xgran )
3958 psnowgran2f(jj) = min( max( xnsph1*zwind_grain(jj)+xnsph2, xnsph3 ), xnsph4 )
3963 IF ( osnowdrift )
THEN
3964 psnowgran1f(jj) = xvdiam6
3965 psnowgran2f(jj) = xnsph3/xgran
3967 psnowgran2f(jj) = min( max( xnsph1*zwind_grain(jj)+xnsph2, xnsph3 ), xnsph4 ) / xgran
3968 zcoef = max( min( xnden1*zwind_grain(jj)-xnden2, xnden3 ), -xgran ) / ( -xgran )
3969 psnowgran1f(jj) = xvdiam6 * &
3970 ( zcoef + ( 1.- zcoef ) * &
3971 ( 3.*psnowgran2f(jj) + 4.*(1.-psnowgran2f(jj)) ) )
3976 psnowhistf(jj) = 0.0
3978 gsnowfall(jj) = .true.
3979 omodif_grid(jj) = .true.
3988 zansmax(:) = xaglamax * ppermsnowfrac(:) + xansmax * (1.0-ppermsnowfrac(:))
3990 zansmax(:) = xansmax
3993 WHERE( gsnowfall(:) .AND. abs(psnow(:)-zsnowfall(:))< 0.000001 )
3994 psnowalb(:) = zansmax(:)
4003 DO jj=1,
SIZE(psnow(:))
4005 IF( .NOT.gsnowfall(jj) .AND. psnow(jj)>=xsnowcritd .AND. knlvls_use(jj)>=inlvlsmin )
THEN
4009 ELSEIF( psnow(jj)<xsnowcritd .OR. knlvls_use(jj)<inlvlsmin .OR. psnow(jj)==zsnowfall(jj) )
THEN
4013 omodif_grid(jj) = .true.
4014 knlvls_use(jj) = max( inlvlsmin, min( inlvlsmax, int(psnow(jj)*xscale_cm) ) )
4015 psnowdzn(jj,1:knlvls_use(jj)) = psnow(jj) / knlvls_use(jj)
4020 omodif_grid(jj) = .true.
4021 zdiftype_sup =
snow3ldiftyp( psnowgran1(jj,1),psnowgran1f(jj), &
4022 psnowgran2(jj,1),psnowgran2f(jj),hsnowmetamo )
4024 IF ( ( zdiftype_sup<xdiff_1 .AND. psnowdz(jj,1)< zdzopt(jj,1) ) .OR. &
4025 ( psr(jj)<xsnowfall_threshold .AND. psnowdz(jj,1)<2.*zdzopt(jj,1) ) .OR. &
4026 psnowdz(jj,1)<xdzmin_top_extrem )
THEN
4034 psnowdzn(jj,1) = psnowdz(jj,1) + psnowdzf(jj)
4035 DO jst = knlvls_use(jj),2,-1
4036 psnowdzn(jj,jst) = psnowdz(jj,jst)
4039 ELSEIF ( knlvls_use(jj)<inlvlsmax )
THEN
4043 knlvls_use(jj)=knlvls_use(jj)+1
4045 IF ( psnowdzf(jj)>xratio_newlayer*psnowdz(jj,2) )
THEN
4048 psnowdzn(jj,1) = psnowdzf(jj)
4049 DO jst = knlvls_use(jj),2,-1
4050 psnowdzn(jj, jst) = psnowdz(jj,jst-1)
4056 zsnow2l = psnowdzf(jj) + psnowdz(jj,1)
4057 psnowdzn(jj,1) = xratio_newlayer * zsnow2l
4058 psnowdzn(jj,2) = (1.-xratio_newlayer) * zsnow2l
4059 DO jst = knlvls_use(jj),3,-1
4060 psnowdzn(jj,jst) = psnowdz(jj,jst-1)
4073 DO jst = 1,knlvls_use(jj)
4077 zcritsize_sup = xscale_diff * ( psnowdz(jj,jst) /zdzopt(jj,jst) + &
4078 psnowdz(jj,jst-1)/zdzopt(jj,jst-1) )
4079 zdiftype_sup =
snow3ldiftyp( psnowgran1(jj,jst-1),psnowgran1(jj,jst), &
4080 psnowgran2(jj,jst-1),psnowgran2(jj,jst), &
4083 IF ( zdiftype_sup+zcritsize_sup<zpenalty )
THEN
4084 zpenalty = zdiftype_sup + zcritsize_sup
4085 jj_a_agreg_sup = jst - 1
4086 jj_a_agreg_inf = jst
4091 IF ( jst<knlvls_use(jj) )
THEN
4093 zcritsize_inf = xscale_diff * ( psnowdz(jj,jst) /zdzopt(jj,jst) + &
4094 psnowdz(jj,jst+1)/zdzopt(jj,jst+1) )
4097 zdiftype_inf =
snow3ldiftyp( psnowgran1(jj,1),psnowgran1f(jj), &
4098 psnowgran2(jj,1),psnowgran2f(jj), &
4101 zpenalty = zdiftype_inf + zcritsize_inf
4103 zdiftype_inf =
snow3ldiftyp( psnowgran1(jj,jst+1),psnowgran1(jj,jst), &
4104 psnowgran2(jj,jst+1),psnowgran2(jj,jst), &
4107 IF ( zdiftype_inf+zcritsize_inf<zpenalty )
THEN
4108 zpenalty = zdiftype_inf + zcritsize_inf
4109 jj_a_agreg_sup = jst
4110 jj_a_agreg_inf = jst + 1
4119 psnowdzn(jj,jj_a_agreg_inf) = psnowdz(jj,jj_a_agreg_inf) + psnowdz(jj,jj_a_agreg_sup)
4120 DO jst = jj_a_agreg_sup,2,-1
4121 psnowdzn(jj,jst) = psnowdz(jj,jst-1)
4123 psnowdzn(jj,1) = psnowdzf(jj)
4127 IF( psnowdzn(jj,1)<xratio_newlayer*psnowdzn(jj,2) )
THEN
4128 zsnow2l = psnowdzn(jj,1) + psnowdzn(jj,2)
4129 psnowdzn(jj,1) = xratio_newlayer * zsnow2l
4130 psnowdzn(jj,2) = (1.-xratio_newlayer) * zsnow2l
4141 IF ( inlvlsmin==inlvlsmax )
THEN
4145 DO jj = 1,
SIZE(psnow(:))
4147 IF ( .NOT.omodif_grid(jj) .AND. psnowdz(jj,1)<xdzmin_top )
THEN
4148 omodif_grid(jj) = .true.
4149 CALL
get_snowdzn_deb(inlvls,psnowdz(jj,:),zdzopt(jj,:),psnowdzn(jj,:))
4150 gagreg_surf(jj) = .true.
4155 IF( .NOT.omodif_grid(jj) .AND. psnowdz(jj,inlvls)<xdzmin_top )
THEN
4156 omodif_grid(jj) = .true.
4157 CALL
get_snowdzn_end(inlvls,psnowdz(jj,:),zdzopt(jj,:),psnowdzn(jj,:))
4166 DO jj=1,
SIZE(psnow(:))
4171 IF( .NOT.gsnowfall(jj) .AND. psnow(jj)>xsnowcritd .AND. &
4172 .NOT.omodif_grid(jj) .AND. psnowdz(jj,1)<xdzmin_top_bis )
THEN
4174 omodif_grid(jj) = .true.
4176 IF( knlvls_use(jj)>inlvlsmin )
THEN
4177 knlvls_use(jj) = knlvls_use(jj) - 1
4178 psnowdzn(jj,1) = psnowdz(jj,1) + psnowdz(jj,2)
4179 DO jst = 2,knlvls_use(jj)
4180 psnowdzn(jj,jst) = psnowdz(jj,jst+1)
4183 CALL
get_snowdzn_deb(knlvls_use(jj),psnowdz(jj,:),zdzopt(jj,:),psnowdzn(jj,:))
4186 gagreg_surf(jj) = .true.
4194 IF( .NOT.gsnowfall(jj) .AND. psnow(jj)> xsnowcritd .AND. &
4195 .NOT.omodif_grid(jj) .AND. psnowdz(jj,knlvls_use(jj))<xdzmin_top .AND. &
4196 .NOT.gagreg_surf(jj) )
THEN
4198 omodif_grid(jj) = .true.
4200 IF ( knlvls_use(jj)>inlvlsmin )
THEN
4201 knlvls_use(jj) = knlvls_use(jj) - 1
4202 psnowdzn(jj,knlvls_use(jj)) = psnowdz(jj,knlvls_use(jj)) + psnowdz(jj,knlvls_use(jj)+1)
4204 CALL
get_snowdzn_end(knlvls_use(jj),psnowdz(jj,:),zdzopt(jj,:),psnowdzn(jj,:))
4214 DO jj = 1,
SIZE(psnow(:))
4216 IF ( .NOT.omodif_grid(jj) .AND. inlvls_use(jj)<inlvls-3 )
THEN
4220 IF ( jst<=knlvls_use(jj) .AND. .NOT.omodif_grid(jj) )
THEN
4222 IF( psnowdz(jj,jst) > &
4223 ( xsplit_coef - float( inlvls-knlvls_use(jj) )/max( 1., float( inlvls-inlvlsmin ) ) ) &
4224 * zdzopt(jj,jst) )
THEN
4226 DO jst_1 = knlvls_use(jj)+1,jst+2,-1
4227 psnowdzn(jj,jst_1) = psnowdz(jj,jst_1-1)
4228 zdzopt(jj,jst_1) = zdzopt(jj,jst_1-1)
4232 IF ( jst/=1 .OR. psnowdz(jj,jst)<3.*zdzopt(jj,1) )
THEN
4233 psnowdzn(jj,jst+1) = 0.5*psnowdz(jj,jst)
4234 psnowdzn(jj,jst) = psnowdzn(jj,jst+1)
4238 psnowdzn(jj,1) = 1.5 * zdzopt(jj,1)
4239 psnowdzn(jj,2) = psnowdz(jj,jst) - psnowdzn(jj,1)
4242 knlvls_use(jj) = knlvls_use(jj) + 1
4243 omodif_grid(jj) = .true.
4261 DO jj = 1,
SIZE(psnow(:))
4263 IF ( .NOT.omodif_grid(jj) )
THEN
4267 IF ( jst<=knlvls_use(jj)-1 .AND. knlvls_use(jj)>inlvlsmin+1 .AND. .NOT.omodif_grid(jj) )
THEN
4269 zdiftype_inf =
snow3ldiftyp( psnowgran1(jj,jst+1),psnowgran1(jj, jst), &
4270 psnowgran2(jj,jst+1),psnowgran2(jj, jst), &
4272 zdiftype_inf = max( xdiff_1, min( xdiff_max, zdiftype_inf ) )
4274 IF( psnowdz(jj,jst) < zdzopt(jj,jst) * xagreg_coef_1 / zdiftype_inf .AND. &
4275 psnowdz(jj,jst) + psnowdz(jj,jst+1) < &
4276 xagreg_coef_2 * max( zdzopt(jj,jst),zdzopt(jj,jst+1) ) )
THEN
4278 psnowdzn(jj,jst) = psnowdz(jj,jst) + psnowdz(jj,jst+1)
4279 zdzopt(jj,jst) = zdzopt(jj,jst+1)
4280 DO jst_1 = jst+1,knlvls_use(jj)-1
4281 psnowdzn(jj,jst_1) = psnowdz(jj,jst_1+1)
4282 zdzopt(jj,jst_1) = zdzopt(jj,jst_1+1)
4284 knlvls_use(jj) = knlvls_use(jj)-1
4285 omodif_grid(jj)=.true.
4301 DO jj = 1,
SIZE(psnow(:))
4303 IF ( .NOT.gsnowfall(jj) .OR. knlvls_use(jj)<inlvlsmin+3 ) cycle
4305 IF( abs( psnowdzn(jj,knlvls_use(jj)) - psnowdz(jj,knlvls_use(jj)) ) > xuepsi ) cycle
4308 IF( psnowdzn(jj,knlvls_use(jj))<xdzmin_top )
THEN
4310 knlvls_use(jj) = knlvls_use(jj)-1
4311 psnowdzn(jj,knlvls_use(jj)) = psnowdzn(jj,knlvls_use(jj)) + psnowdzn(jj,knlvls_use(jj)+1)
4312 psnowdzn(jj,knlvls_use(jj)+1) = 0.
4317 DO jst = knlvls_use(jj)-1,4,-1
4319 IF ( abs( psnowdzn(jj,jst) - psnowdz(jj,jst) ) > xuepsi )
EXIT
4321 IF ( psnowdzn(jj,jst)> 0.001 ) cycle
4324 psnowdzn(jj,jst-1) = psnowdzn(jj,jst) + psnowdzn(jj,jst-1)
4325 knlvls_use(jj) = knlvls_use(jj) - 1
4328 DO jst_1 = jst,inlvls_use(jj)
4329 psnowdzn(jj,jst_1) = psnowdz(jj,jst_1+1)
4330 zdzopt(jj,jst_1) = zdzopt(jj,jst_1+1)
4332 psnowdzn(jj,inlvls_use(jj)+1) = 0.
4344 DO jj = 1,
SIZE(psnow(:))
4346 IF ( abs( sum( psnowdzn(jj,1:knlvls_use(jj)) ) - psnow(jj) ) > xuepsi )
THEN
4348 WRITE(*,*)
'error in grid resizing', jj, knlvls_use(jj), sum( psnowdzn(jj,1:knlvls_use(jj)) ), &
4349 psnow(jj), sum( psnowdzn(jj,1:inlvls_use(jj)) )-psnow(jj), &
4351 WRITE( *,*)
'JJ , PSNOWDZ(JJ):',jj , psnowdz(jj,:)
4352 WRITE( *,*)
'JJ , PSNOWDZN(JJ):',jj , psnowdzn(jj,:)
4354 CALL
abor1_sfx(
"SNOWCRO: error in grid resizing")
4360 IF (lhook) CALL dr_hook(
'SNOWNLFALL_UPGRID',1,zhook_handle)
4371 INTEGER,
INTENT(IN) :: knlvls
4372 REAL,
DIMENSION(:),
INTENT(IN) :: psnowdz, pdzopt
4373 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowdzn
4375 REAL :: zpenalty, zcritsize
4376 INTEGER :: jj_a_dedoub, jst
4378 REAL(KIND=JPRB) :: zhook_handle
4380 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_SNOWDZN_DEB',0,zhook_handle)
4382 zpenalty = psnowdz(2) / pdzopt(2)
4383 IF( psnowdz(2)<xdzmin_top ) zpenalty = 0.
4387 zcritsize = psnowdz(jst) / pdzopt(jst)
4388 IF ( jst==knlvls .AND. psnowdz(jst)<xdzmin_bot ) zcritsize = 0.
4389 IF ( zcritsize>zpenalty )
THEN
4390 zpenalty = zcritsize
4395 IF ( jj_a_dedoub==2 )
THEN
4396 psnowdzn(1) = 0.5 * ( psnowdz(1) + psnowdz(2) )
4397 psnowdzn(2) = psnowdzn(1)
4398 ELSE !
case splitted layer =/ 2
4399 psnowdzn(1) = psnowdz(1) + psnowdz(2)
4400 DO jst = 2,jj_a_dedoub-2
4401 psnowdzn(jst) = psnowdz(jst+1)
4403 psnowdzn(jj_a_dedoub-1) = 0.5 * psnowdz(jj_a_dedoub)
4404 psnowdzn(jj_a_dedoub) = psnowdzn(jj_a_dedoub-1)
4407 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_SNOWDZN_DEB',1,zhook_handle)
4418 INTEGER,
INTENT(IN) :: knlvls
4419 REAL,
DIMENSION(:),
INTENT(IN) :: psnowdz, pdzopt
4420 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowdzn
4422 REAL :: zpenalty, zcritsize
4423 INTEGER :: jj_a_dedoub, jst
4425 REAL(KIND=JPRB) :: zhook_handle
4427 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_SNOWDZN_END',0,zhook_handle)
4429 zpenalty = psnowdz(knlvls-2) / pdzopt(knlvls-2)
4430 jj_a_dedoub = knlvls - 2
4432 DO jst = max(1,knlvls-3),1,-1
4433 zcritsize = psnowdz(jst) / pdzopt(jst)
4434 IF ( jst==1 .AND. psnowdz(jst)<xdzmin_bot ) zcritsize = 0.
4435 IF ( zcritsize>zpenalty )
THEN
4436 zpenalty = zcritsize
4441 IF ( jj_a_dedoub==knlvls-1 )
THEN
4442 psnowdzn(knlvls) = 0.5 * (psnowdz(knlvls-1)+psnowdz(knlvls))
4443 psnowdzn(knlvls-1) = psnowdzn(knlvls)
4444 ELSE !
case splitted layer =/ 2
4445 psnowdzn(knlvls) = psnowdz(knlvls-1) + psnowdz(knlvls)
4446 DO jst = knlvls-1,jj_a_dedoub+2,-1
4447 psnowdzn(jst) = psnowdz(jst-1)
4449 psnowdzn(jj_a_dedoub+1) = 0.5 * psnowdz(jj_a_dedoub)
4450 psnowdzn(jj_a_dedoub ) = psnowdzn(jj_a_dedoub+1)
4453 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_SNOWDZN_END',1,zhook_handle)
4462 psnowrho,psnowheat,psnowgran1,psnowgran2, &
4463 psnowhist,psnowage,gsnowfall, &
4464 psnowrhof, psnowdzf,psnowheatf,psnowgran1f, &
4465 psnowgran2f, psnowhistf,psnowagef, &
4466 knlvls_use, hsnowmetamo )
4489 INTEGER,
INTENT(IN) :: kj
4490 REAL,
INTENT(IN) :: psnow
4492 REAL,
DIMENSION(:),
INTENT(INOUT) :: psnowheat, psnowrho, psnowdz, &
4493 psnowdzn, psnowgran1, psnowgran2, &
4495 REAL,
DIMENSION(:),
INTENT(INOUT) :: psnowage
4496 REAL,
INTENT(IN) :: psnowrhof, psnowdzf,psnowheatf, &
4497 psnowgran1f,psnowgran2f, psnowhistf
4498 REAL,
INTENT(IN) :: psnowagef
4500 INTEGER,
INTENT(IN) :: knlvls_use
4502 LOGICAL,
INTENT(IN) :: gsnowfall
4504 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
4508 REAL,
DIMENSION(SIZE(PSNOWRHO,1)+1) :: zsnowrhoo,zsnowgran1o,zsnowgran2o, &
4509 zsnowheato,zsnowhisto,zsnowdzo, &
4510 zsnowztop_old,zsnowzbot_old
4511 REAL,
DIMENSION(SIZE(PSNOWRHO,1)+1) :: zsnowageo
4513 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zsnowrhon,zsnowgran1n,zsnowgran2n, &
4514 zsnowheatn,zsnowhistn, &
4515 zsnowztop_new,zsnowzbot_new
4516 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) ::zsnowagen
4518 REAL :: zmastotn, zmastoto, zsnowhean, zsnowheao
4519 REAL :: zpsnow_old, zpsnow_new
4521 INTEGER :: inlvls_old, inlvls_new
4526 REAL(KIND=JPRB) :: zhook_handle
4528 IF (lhook) CALL dr_hook(
'SNOWNLGRIDFRESH_1D',0,zhook_handle)
4534 inlvls_new = knlvls_use
4540 DO jst = 1,inlvls_new
4541 zpsnow_new = zpsnow_new + psnowdzn(jst)
4544 IF ( abs( zpsnow_new - psnowdzf )<xuepsi )
THEN
4547 DO jst = 1,
SIZE(psnowrho)
4548 IF ( psnowdz(jst)>=xuepsi )
THEN
4549 zpsnow_old = zpsnow_old + psnowdz(jst)
4550 IF ( abs( zpsnow_new - psnowdzf - zpsnow_old )<xuepsi )
THEN
4555 IF ( inlvls_old==-1 )
THEN
4556 WRITE(*,*)
'pb INLVLS_OLD INLVLS_NEW=',inlvls_new
4557 WRITE(*,*)
'pb INLVLS_OLD',psnowdzf
4558 WRITE(*,*)
'pb INLVLS_OLD',psnowdzn
4559 WRITE(*,*)
'pb INLVLS_OLD',psnowdz
4560 CALL
abor1_sfx(
'SNOWCRO: Error INLVLS_OLD')
4564 IF ( gsnowfall ) inlvls_old = inlvls_old + 1
4567 zpsnow_new = zpsnow_old
4571 IF ( gsnowfall )
THEN
4572 DO jst = 2,inlvls_old
4573 zsnowdzo(jst) = psnowdz(jst-1)
4574 zsnowrhoo(jst) = psnowrho(jst-1)
4575 zsnowheato(jst) = psnowheat(jst-1)
4576 zsnowgran1o(jst) = psnowgran1(jst-1)
4577 zsnowgran2o(jst) = psnowgran2(jst-1)
4578 zsnowhisto(jst) = psnowhist(jst-1)
4579 zsnowageo(jst) = psnowage(jst-1)
4581 zsnowdzo(1) = psnowdzf
4582 zsnowrhoo(1) = psnowrhof
4583 zsnowheato(1) = psnowheatf
4584 zsnowgran1o(1) = psnowgran1f
4585 zsnowgran2o(1) = psnowgran2f
4586 zsnowhisto(1) = psnowhistf
4587 zsnowageo(1) = psnowagef
4589 DO jst = 1,inlvls_old
4590 zsnowdzo(jst) = psnowdz(jst)
4591 zsnowrhoo(jst) = psnowrho(jst)
4592 zsnowheato(jst) = psnowheat(jst)
4593 zsnowgran1o(jst) = psnowgran1(jst)
4594 zsnowgran2o(jst) = psnowgran2(jst)
4595 zsnowhisto(jst) = psnowhist(jst)
4596 zsnowageo(jst) = psnowage(jst)
4603 zsnowztop_old(1) = zpsnow_old
4604 zsnowztop_new(1) = zpsnow_new
4606 DO jst = 1,inlvls_old
4607 IF ( jst>1 ) zsnowztop_old(jst) = zsnowzbot_old(jst-1)
4608 zsnowzbot_old(jst) = zsnowztop_old(jst) - zsnowdzo(jst)
4611 DO jst = 1,inlvls_new
4612 IF ( jst>1 ) zsnowztop_new(jst) = zsnowzbot_new(jst-1)
4613 zsnowzbot_new(jst) = zsnowztop_new(jst) - psnowdzn(jst)
4617 IF ( abs(zsnowzbot_old(inlvls_old)) > 0.00001 )
WRITE (*,*)
'Error bottom OLD'
4619 zsnowzbot_old(inlvls_old) = 0.
4622 if ( abs(zsnowzbot_new(inlvls_new)) > 0.00001 )
WRITE (*,*)
'Error bottom NEW'
4624 zsnowzbot_new(inlvls_new) = 0.
4633 zsnowztop_old,zsnowztop_new,zsnowzbot_old,zsnowzbot_new, &
4634 zsnowrhoo,zsnowdzo,zsnowgran1o,zsnowgran2o,zsnowhisto, &
4635 zsnowageo,zsnowheato, &
4636 zsnowrhon,psnowdzn,zsnowgran1n,zsnowgran2n,zsnowhistn, &
4637 zsnowagen,zsnowheatn,hsnowmetamo )
4647 DO jst = 1,inlvls_new
4648 zsnowhean = zsnowhean + zsnowheatn(jst)
4649 zmastotn = zmastotn + zsnowrhon(jst) * psnowdzn(jst)
4650 zpsnow_new = zpsnow_new + psnowdzn(jst)
4653 DO jst = 1,inlvls_old
4654 zsnowheao = zsnowheao + zsnowheato(jst)
4655 zmastoto = zmastoto + zsnowrhoo(jst) * zsnowdzo(jst)
4656 zpsnow_old = zpsnow_old + zsnowdzo(jst)
4659 IF ( abs( zsnowhean-zsnowheao )>0.0001 .OR. abs( zmastotn-zmastoto )>0.0001 .OR. &
4660 abs( zpsnow_new-zpsnow_old )> 0.0001 )
THEN
4661 WRITE(*,*)
'Warning diff', zsnowhean-zsnowheao,zmastotn-zmastoto,zpsnow_new-zpsnow_old
4667 psnowdz(:) = psnowdzn(:)
4669 psnowrho(:) = zsnowrhon(:)
4670 psnowheat(:) = zsnowheatn(:)
4671 psnowgran1(:) = zsnowgran1n(:)
4672 psnowgran2(:) = zsnowgran2n(:)
4673 psnowhist(:) = zsnowhistn(:)
4675 psnowage(:) = zsnowagen(:)
4677 IF (lhook) CALL dr_hook(
'SNOWNLGRIDFRESH_1D',1,zhook_handle)
4684 psnowgran1,psnowgran2,psnowhist,knlvls_use, &
4685 pta,pqa,pps,prhoa,pz0eff,puref, &
4686 osnowdrift_sublim,hsnowmetamo,psndrift )
4716 USE modd_snow_par, ONLY : xvtime, xvromax, xvromin, xvmob1, &
4717 xvmob2, xvmob3, xvmob4, xvdrift1, xvdrift2, xvdrift3, &
4718 xvsizemin, xcoef_ff, xcoef_effect, xqs_ref
4724 REAL,
INTENT(IN) :: ptstep
4726 REAL,
DIMENSION(:),
INTENT(IN) :: pta, pqa, pps, prhoa
4728 REAL,
DIMENSION(:),
INTENT(IN) :: pvmod
4730 INTEGER,
DIMENSION(:),
INTENT(IN) :: knlvls_use
4732 REAL,
DIMENSION(:),
INTENT(IN) :: pz0eff,puref
4734 LOGICAL,
INTENT(IN) :: osnowdrift_sublim
4736 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
4738 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowrho, psnowdz,psnowgran1, &
4739 psnowgran2,psnowhist
4740 REAL,
DIMENSION(:),
INTENT(OUT) :: psnow
4741 REAL,
DIMENSION(:),
INTENT(OUT) :: psndrift
4745 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowrho2
4746 REAL,
DIMENSION(SIZE(PSNOWRHO,1) ) :: zsnowdz1
4748 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zqsati, zff
4752 REAL :: zprofequ, zrmob, zrdrift, zrt, zdro, zdgr1, zdgr2
4756 REAL :: zwind_effect
4757 REAL :: zdrift_effect
4764 REAL(KIND=JPRB) :: zhook_handle
4767 REAL,
PARAMETER :: pphref_wind=5.
4768 REAL,
PARAMETER :: pphref_min=pphref_wind/2.
4771 IF (lhook) CALL dr_hook(
'SNOWDRIFT',0,zhook_handle)
4776 zsnowdz1(:) = psnowdz(:,1)
4778 DO jj = 1,
SIZE(psnow)
4779 DO jst = 1,knlvls_use(jj)
4780 zsnowrho2(jj,jst) = psnowrho(jj,jst)
4784 IF ( osnowdrift_sublim )
THEN
4785 zqsati(:) =
qsati( pta(:),pps(:) )
4791 DO jj=1,
SIZE(psnow)
4796 zz0eff=min(pz0eff(jj),puref(jj)*0.5,pphref_min)
4797 zff(jj) = xcoef_ff*pvmod(jj)*log(pphref_wind/zz0eff)/log(puref(jj)/zz0eff)
4802 DO jst = 1,knlvls_use(jj)
4804 zfact = 1.25 - 1.25 * ( max( psnowrho(jj,jst), xvromin ) - xvromin )/1000./xvmob1
4806 IF ( hsnowmetamo==
'B92' )
THEN
4809 IF( psnowgran1(jj,jst)<0. )
THEN
4811 zrmob = 0.34 * ( 0.5 - ( 0.75*psnowgran1(jj,jst) + 0.5*psnowgran2(jj,jst) )/99. ) + &
4815 zrmob = 0.34 * ( xvmob2 - xvmob2*psnowgran1(jj,jst)/99. - xvmob3*psnowgran2(jj,jst)*1000. ) + &
4821 IF ( psnowgran1(jj,jst)<xvdiam6*(4.-psnowgran2(jj,jst))-xuepsi )
THEN
4823 zrmob = 0.34 * ( 0.5 + 0.75 * &
4824 ( psnowgran1(jj,jst)/xvdiam6-4.+psnowgran2(jj,jst) )/( psnowgran2(jj,jst)-3. ) &
4825 - 0.5 * psnowgran2(jj,jst) ) + &
4829 zrmob = 0.34 * ( xvmob2 - xvmob2 * psnowgran2(jj,jst) &
4830 - xvmob3 * (4.-psnowgran2(jj,jst))*xvdiam6*1000. ) + &
4837 IF ( psnowhist(jj,jst) >= 2. ) zrmob = min(zrmob, xvmob4)
4840 zrdrift = zrmob - ( xvdrift1 * exp( -xvdrift2*zff(jj) ) - 1.)
4842 IF ( zrdrift<=0. )
EXIT
4845 zprofequ = zprofequ + 0.5 * psnowdz(jj,jst) * 0.1 * ( xvdrift3 - zrdrift )
4847 zrt = max( 0., zrdrift * exp( -zprofequ*100 ) )
4849 IF ( osnowdrift_sublim .AND. jst==1 )
THEN
4852 zvt = -log( (zrmob+1.)/xvdrift1 ) / xvdrift2
4853 zrhi = pqa(jj) / zqsati(jj)
4855 zqs = 0.0018 * (xtt/pta(jj))**4 * zvt * prhoa(jj) * zqsati(jj) * &
4856 (1.-zrhi) * (zff(jj)/zvt)**3.6
4864 psnowdz(jj,jst) = max( 0.5*psnowdz(jj,jst), &
4865 psnowdz(jj,jst) - max(0.,zqs) * ptstep/xcoef_ff/psnowrho(jj,jst) )
4866 psndrift(jj) = (zsnowdz1(jj)-psnowdz(jj,jst))*psnowrho(jj,jst)/ptstep
4871 zqs_effect = min( 3., max( 0.,zqs )/xqs_ref ) * zrt
4872 zwind_effect = xcoef_effect * zrt
4873 zdrift_effect = ( zqs_effect + zwind_effect ) * ptstep / xcoef_ff / xvtime
4877 IF( psnowrho(jj,jst) < xvromax )
THEN
4878 zdro = zdrift_effect * ( xvromax - psnowrho(jj,jst) )
4879 psnowrho(jj,jst) = min( xvromax , psnowrho(jj,jst) + zdro )
4880 psnowdz(jj,jst) = psnowdz(jj,jst) * zsnowrho2(jj,jst) / psnowrho(jj,jst)
4883 IF ( hsnowmetamo==
'B92' )
THEN
4886 IF ( psnowgran1(jj,jst)<0. )
THEN
4888 zdgr1 = zdrift_effect * ( -psnowgran1(jj,jst) ) * 0.5
4889 psnowgran1(jj,jst) = psnowgran1(jj,jst) + min( zdgr1, -0.99 * psnowgran1(jj,jst) )
4891 zdgr2 = zdrift_effect * ( 99. - psnowgran2(jj,jst) )
4892 psnowgran2(jj,jst) = min( 99., psnowgran2(jj,jst) + zdgr2 )
4896 zdgr1 = zdrift_effect * ( 99. - psnowgran1(jj,jst) )
4897 zdgr2 = zdrift_effect * 5. / 10000.
4898 psnowgran1(jj,jst) = min( 99., psnowgran1(jj,jst) + zdgr1 )
4899 psnowgran2(jj,jst) = max( xvsizemin, psnowgran2(jj,jst) - zdgr2 )
4905 IF ( psnowgran1(jj,jst)<xvdiam6*(4.-psnowgran2(jj,jst))-xuepsi )
THEN
4907 zdgr1 = min( zdrift_effect * ( ( psnowgran1(jj,jst)/xvdiam6-4.+psnowgran2(jj,jst) )/ &
4908 (psnowgran2(jj,jst)-3.) ) * 0.5, &
4909 0.99 * ( ( psnowgran1(jj,jst)/xvdiam6-4.+ psnowgran2(jj,jst))/ &
4910 (psnowgran2(jj,jst)-3.) ) )
4911 zdgr2 = zdrift_effect * ( 1.-psnowgran2(jj,jst) )
4913 psnowgran1(jj,jst) = psnowgran1(jj,jst) + xvdiam6 * &
4914 ( zdgr2 * ( (psnowgran1(jj,jst)/xvdiam6-1.)/(psnowgran2(jj,jst)-3.) ) - &
4915 zdgr1 * ( psnowgran2(jj,jst)-3. ) )
4916 psnowgran2(jj,jst) = min(1.,psnowgran2(jj,jst)+zdgr2)
4920 zdgr1 = zdrift_effect * 5./10000.
4921 zdgr2 = zdrift_effect * (1.-psnowgran2(jj,jst))
4923 psnowgran1(jj,jst) = psnowgran1(jj,jst) - 2. * xvdiam6 * psnowgran2(jj,jst) * zdgr2
4924 psnowgran2(jj,jst) = min( 1., psnowgran2(jj,jst)+zdgr2 )
4931 zprofequ = zprofequ + 0.5 * psnowdz(jj,jst) * 0.1 * ( xvdrift3 - zrdrift )
4942 DO jj = 1,
SIZE(psnowdz,1)
4943 psnow(jj) = sum( psnowdz(jj,1:knlvls_use(jj)) )
4946 IF (lhook) CALL dr_hook(
'SNOWDRIFT',1,zhook_handle)
4954 psnowrho,psnowliq,psnowgran1,psnowgran2, &
4955 psnowhist,psnowage,ples3l,knlvls_use )
4967 USE modd_csts,ONLY : xtt, xlmtt, xrholw, xrholi, xlvtt, xci
4975 REAL,
INTENT(IN) :: ptstep
4977 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: pscap
4979 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowdz, psnowtemp, psnowrho, psnowliq
4980 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowgran1,psnowgran2,psnowhist,psnowage
4982 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: knlvls_use
4984 REAL,
DIMENSION(:),
INTENT(IN) :: ples3l
4988 REAL :: zheat, zmass, zdz, zliq, zsnowlwe
4990 INTEGER :: jj,jst,jst_1, jst_2, jst_max, idiff_layer
4991 INTEGER :: id_1, id_2
4993 REAL(KIND=JPRB) :: zhook_handle
4996 IF (lhook) CALL dr_hook(
'SNOWCROLAYER_GONE',0,zhook_handle)
4998 DO jj=1,
SIZE(psnowrho,1)
5000 jst_max = knlvls_use(jj)
5004 DO jst_1 = jst_max,1-jst_max,-1
5006 jst = jst_1 + idiff_layer
5009 IF ( jst>=1 .AND. knlvls_use(jj)>1 )
THEN
5012 zsnowlwe = psnowrho(jj,jst) * psnowdz(jj,jst) / xrholw
5015 IF ( jst==1 ) zsnowlwe = zsnowlwe - max( 0., ples3l(jj)*ptstep/(xlstt*xrholw) )
5018 IF ( pscap(jj,jst) * max( 0.0, psnowtemp(jj,jst)-xtt ) * psnowdz(jj,jst) >= &
5019 ( ( zsnowlwe-psnowliq(jj,jst) ) * xlmtt * xrholw ) - xuepsi )
THEN
5021 IF ( jst==knlvls_use(jj) )
THEN
5035 DO jst_2 = id_1,id_2
5037 psnowdz(jj,jst_2) * &
5038 ( pscap(jj,jst_2)*( psnowtemp(jj,jst_2)-xtt ) - xlmtt*psnowrho(jj,jst_2) ) + &
5039 xlmtt * xrholw * psnowliq(jj,jst_2)
5040 zmass = zmass + psnowdz(jj,jst_2) * psnowrho(jj,jst_2)
5041 zdz = zdz + psnowdz(jj,jst_2)
5042 zliq = zliq + psnowliq(jj,jst_2)
5045 psnowdz(jj,id_1) = zdz
5046 psnowrho(jj,id_1) = zmass / zdz
5047 psnowliq(jj,id_1) = zliq
5050 pscap(jj,id_1) = ( psnowrho(jj,id_1) - &
5051 psnowliq(jj,id_1) * xrholw / &
5052 max( psnowdz(jj,id_1),xsnowdzmin ) ) * xci
5053 psnowtemp(jj,id_1) = xtt + &
5054 ( ( ( ( zheat - xlmtt*xrholw*psnowliq(jj,id_1) ) / psnowdz(jj,id_1) ) + &
5055 xlmtt*psnowrho(jj,id_1) ) &
5058 IF( jst/=knlvls_use(jj) )
THEN
5060 psnowgran1(jj,jst) = psnowgran1(jj,jst+1)
5061 psnowgran2(jj,jst) = psnowgran2(jj,jst+1)
5062 psnowhist(jj,jst) = psnowhist(jj,jst+1)
5063 psnowage(jj,jst) = psnowage(jj,jst+1)
5066 DO jst_2 = jst+1,knlvls_use(jj)-1
5067 psnowtemp(jj,jst_2) = psnowtemp(jj,jst_2+1)
5068 pscap(jj,jst_2) = pscap(jj,jst_2+1)
5069 psnowdz(jj,jst_2) = psnowdz(jj,jst_2+1)
5070 psnowrho(jj,jst_2) = psnowrho(jj,jst_2+1)
5071 psnowliq(jj,jst_2) = psnowliq(jj,jst_2+1)
5072 psnowgran1(jj,jst_2) = psnowgran1(jj,jst_2+1)
5073 psnowgran2(jj,jst_2) = psnowgran2(jj,jst_2+1)
5074 psnowhist(jj,jst_2) = psnowhist(jj,jst_2+1)
5075 psnowage(jj,jst_2) = psnowage(jj,jst_2+1)
5079 idiff_layer = idiff_layer + 1
5084 knlvls_use(jj) = knlvls_use(jj) - 1
5094 IF (lhook) CALL dr_hook(
'SNOWCROLAYER_GONE',1,zhook_handle)
5102 psnowtemp,psnowliq,psnowheat,psnowgran1, &
5103 psnowgran2,psnowhist,psnowage,hsnowmetamo )
5114 CHARACTER(*),
INTENT(IN) :: hinfo
5115 LOGICAL,
INTENT(IN) :: oprintgran
5116 INTEGER,
INTENT(IN) :: klayers
5117 REAL,
DIMENSION(:),
INTENT(IN) :: psnowdz,psnowrho,psnowtemp,psnowliq, &
5118 psnowheat,psnowgran1,psnowgran2, &
5120 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
5122 REAL,
DIMENSION(KLAYERS) :: zsnowssa
5127 REAL(KIND=JPRB) :: zhook_handle
5129 IF (lhook) CALL dr_hook(
'SNOWCROPRINTPROFILE',0,zhook_handle)
5132 WRITE(*,*)trim(hinfo)
5134 IF (oprintgran)
THEN
5137 IF ( hsnowmetamo==
'B92' )
THEN
5141 IF ( psnowgran1(jst)<0. )
THEN
5142 zdiam = -psnowgran1(jst)*xd1/xx + (1.+psnowgran1(jst)/xx) * &
5143 ( psnowgran2(jst)*xd2/xx + (1.-psnowgran2(jst)/xx) * xd3 )
5144 zdiam = zdiam/10000.
5146 zdiam = psnowgran2(jst)*psnowgran1(jst)/xx + &
5147 max( 0.0004, 0.5*psnowgran2(jst) ) * ( 1.-psnowgran1(jst)/xx )
5149 zsnowssa(jst) = 6. / (xrholi*zdiam)
5155 zsnowssa = 6. / (xrholi*psnowgran1)
5159 WRITE(*,
'(9(A12,"|"))')
"-------------",
"-------------",
"-------------",&
5160 "-------------",
"-------------",
"-------------",
"-------------",&
5161 "-------------",
"-------------"
5162 WRITE(*,
'(9(A12,"|"))')
"PSNOWDZ",
"PSNOWRHO",
"PSNOWTEMP",
"PSNOWLIQ",
"PSNOWHEAT",&
5163 "PSNOWGRAN1",
"PSNOWGRAN2",
"PSNOWHIST",
"PSNOWAGE"
5164 WRITE(*,
'(9(A12,"|"))')
"-------------",
"-------------",
"-------------",&
5165 "-------------",
"-------------",
"-------------",
"-------------",&
5166 "-------------",
"-------------"
5168 WRITE(*,
'(9(ES12.3,"|")," L",I2.2)') psnowdz(jst),psnowrho(jst),psnowtemp(jst), &
5169 psnowliq(jst),psnowheat(jst),psnowgran1(jst), &
5170 psnowgran2(jst),psnowhist(jst),psnowage(jst),jst
5172 WRITE(*,
'(9(A12,"|"))')
"-------------",
"-------------",
"-------------",&
5173 "-------------",
"-------------",
"-------------",
"-------------",&
5174 "-------------",
"-------------"
5178 WRITE(*,
'(5(A12,"|"))')
"------------",
"------------",
"------------",&
5179 "------------",
"------------"
5180 WRITE(*,
'(5(A12,"|"))')
"PSNOWDZ",
"PSNOWRHO",
"PSNOWTEMP",
"PSNOWLIQ",
"PSNOWHEAT"
5181 WRITE(*,
'(5(A12,"|"))')
"------------",
"------------",
"------------",&
5182 "------------",
"------------"
5184 WRITE(*,
'(5(ES12.3,"|")," L",I2.2)') psnowdz(jst),psnowrho(jst),psnowtemp(jst),&
5185 psnowliq(jst),psnowheat(jst),jst
5187 WRITE(*,
'(5(A12,"|"))')
"------------",
"------------",
"------------",&
5188 "------------",
"------------"
5194 IF (lhook) CALL dr_hook(
'SNOWCROPRINTPROFILE',1,zhook_handle)
5200 ptg, psoilcond,pd_g,ppsn3l )
5208 CHARACTER(*),
INTENT(IN) :: cinfo
5209 REAL,
INTENT(IN) :: pta,pqa,pvmod,prr,psr,psw_rad,plw_rad
5210 REAL,
INTENT(IN) :: ptg, psoilcond, pd_g, ppsn3l
5214 REAL(KIND=JPRB) :: zhook_handle
5216 IF (lhook) CALL dr_hook(
'SNOWCROPRINTATM',0,zhook_handle)
5221 WRITE(*,*)trim(cinfo)
5222 WRITE(*,
'(4(A12,"|"))')
"------------",
"------------",
"------------",&
5224 WRITE(*,
'(4(A12,"|"))')
"PTA",
"PQA",
"PRR",
"PSR"
5225 WRITE(*,
'(4(A12,"|"))')
"------------",
"------------",
"------------",&
5227 WRITE(*,
'(4(ES12.3,"|")," meteo1")')pta,pqa,prr,psr
5228 WRITE(*,
'(4(A12,"|"))')
"------------",
"------------",
"------------",&
5230 WRITE(*,
'(3(A12,"|"))')
"------------",
"------------",
"------------"
5231 WRITE(*,
'(3(A12,"|"))')
"PSW_RAD",
"PLW_RAD",
"PVMOD"
5232 WRITE(*,
'(3(A12,"|"))')
"------------",
"------------",
"------------"
5233 WRITE(*,
'(3(ES12.3,"|")," meteo2")')psw_rad,plw_rad,pvmod
5234 WRITE(*,
'(3(A12,"|"))')
"------------",
"------------",
"------------"
5236 WRITE(*,*)
"Ground :"
5237 WRITE(*,
'(4(A12,"|"))')
"------------",
"------------",
"------------",&
5239 WRITE(*,
'(4(A12,"|"))')
"PTG",
"PSOILCOND",
"PD_G",
"PPSN3L"
5240 WRITE(*,
'(4(A12,"|"))')
"------------",
"------------",
"------------",&
5242 WRITE(*,
'(4(ES12.3,"|")," soil")')ptg,psoilcond,pd_g,ppsn3l
5243 WRITE(*,
'(4(A12,"|"))')
"------------",
"------------",
"------------",&
5246 IF (lhook) CALL dr_hook(
'SNOWCROPRINTATM',1,zhook_handle)
5253 USE mode_crodebug, ONLY : xwarning_massbalance, xwarning_energybalance
5261 REAL ,
DIMENSION(:),
INTENT(IN) :: pmassbalance, penergybalance
5263 REAL,
DIMENSION(SIZE(PSR)) :: zmassbalance,zenergybalance
5265 REAL(KIND=JPRB) :: zhook_handle
5267 IF (lhook) CALL dr_hook(
'SNOWCROSTOPBALANCE',0,zhook_handle)
5269 IF ( any( pmassbalance > xwarning_massbalance ) ) &
5270 CALL
abor1_sfx(
"SNOWCRO: WARNING MASS BALANCE !")
5271 IF ( any( penergybalance > xwarning_energybalance ) ) &
5272 CALL
abor1_sfx(
"SNOWCRO: WARNING ENERGY BALANCE !")
5274 IF (lhook) CALL dr_hook(
'SNOWCROSTOPBALANCE',1,zhook_handle)
5280 psr,prr,pthrufal,pevap,pevapcor,pgrndflux,phsnow, &
5281 prnsnow,plel3l,ples3l,phpsnow,psnowhmass,psnowdz, &
5282 ptstep,pmassbalance,penergybalance,pevapcor2 )
5289 REAL,
INTENT(IN) :: psummass_ini,psumheat_ini,psummass_fin,psumheat_fin
5290 REAL,
INTENT(IN) :: psr,prr,pthrufal,pevap,pevapcor
5291 REAL,
INTENT(IN) :: pgrndflux,phsnow,prnsnow,plel3l,ples3l,phpsnow,psnowhmass
5292 REAL,
INTENT(IN) :: psnowdz
5293 REAL,
INTENT(IN) :: ptstep
5294 REAL,
INTENT(IN) :: pmassbalance, penergybalance, pevapcor2
5296 REAL(KIND=JPRB) :: zhook_handle
5298 IF (lhook) CALL dr_hook(
'SNOWCROPRINTBALANCE',0,zhook_handle)
5301 WRITE(*,fmt=
'(A1,67("+"),A1)')
"+",
"+"
5308 WRITE (*,fmt=
"(A25,1x,E17.10)")
'final mass (kg/m2) =' , psummass_fin
5309 WRITE (*,fmt=
"(A25,1x,E17.10)")
'final energy (J/m2) =', zsumheat_fin
5312 WRITE(*,fmt=
"(A25,1x,E17.10)")
'mass balance (kg/m2) =', pmassbalance
5315 WRITE(*,fmt=
"(A35)")
'mass balance contribution (kg/m2) '
5316 WRITE(*,fmt=
"(A51,1x,E17.10)")
'delta mass:', (psummass_fin-psummass_ini)
5317 WRITE(*,fmt=
"(A51,1x,E17.10)")
'hoar or condensation (>0 towards snow):', -pevap * ptstep
5318 WRITE(*,fmt=
"(A51,1x,E17.10)")
'rain:', prr * ptstep
5319 WRITE(*,fmt=
"(A51,1x,E17.10)")
'snow:', psr * ptstep
5320 WRITE(*,fmt=
"(A51,1x,E17.10)")
'run-off:', pthrufal * ptstep
5321 WRITE(*,fmt=
"(A51,1x,E17.10)")
'evapcor:', pevapcor * ptstep
5323 WRITE(*,fmt=
'(A1,55("-"),A1)')
"+",
"+"
5326 WRITE(*,fmt=
"(A25,4(1x,E17.10))")
'energy balance (W/m2)=',penergybalance
5329 WRITE(*,fmt=
"(A55)")
'energy balance contribution (W/m2) >0 towards snow :'
5330 WRITE(*,fmt=
"(A51,1x,E17.10)")
'delta heat:', (zsumheat_fin-zsumheat_ini)/ptstep
5331 WRITE(*,fmt=
"(A51,1x,E17.10)")
'radiation (LW + SW):', prnsnow
5332 WRITE(*,fmt=
"(A51,1x,E17.10)")
'sensible flux :', -phsnow
5333 WRITE(*,fmt=
"(A51,1x,E17.10)")
'ground heat flux :', -pgrndflux
5334 WRITE(*,fmt=
"(A51,1x,E17.10)")
'liquid latent flux:', -plel3l
5335 WRITE(*,fmt=
"(A51,1x,E17.10)")
'solid latent flux:', -ples3l
5336 WRITE(*,fmt=
"(A51,1x,E17.10)")
'rain sensible heat:', phpsnow
5337 WRITE(*,fmt=
"(A51,1x,E17.10)")
'snowfall/hoar heat (sensible + melt heat):', psnowhmass/ptstep
5338 WRITE(*,fmt=
"(A51,1x,E17.10)")
'evapcor:', pevapcor2
5339 WRITE(*,fmt=
'(A1,67("+"),A1)')
"+",
"+"
5341 IF (lhook) CALL dr_hook(
'SNOWCROPRINTBALANCE',1,zhook_handle)
5346 SUBROUTINE get_balance(PSUMMASS_INI,PSUMHEAT_INI,PSUMMASS_FIN,PSUMHEAT_FIN, &
5347 psr,prr,pthrufal,pevap,pevapcor,pgrndflux,phsnow, &
5348 prnsnow,plel3l,ples3l,phpsnow,psnowhmass,psnowdz, &
5349 ptstep,pmassbalance,penergybalance,pevapcor2 )
5353 REAL,
INTENT(IN) :: psummass_ini,psumheat_ini,psummass_fin,psumheat_fin
5354 REAL,
INTENT(IN) :: psr,prr,pthrufal,pevap,pevapcor
5355 REAL,
INTENT(IN) :: pgrndflux,phsnow,prnsnow,plel3l,ples3l,phpsnow,psnowhmass
5356 REAL,
INTENT(IN) :: psnowdz
5357 REAL,
INTENT(IN) :: ptstep
5359 REAL,
INTENT(OUT) :: pmassbalance, penergybalance, pevapcor2
5361 REAL(KIND=JPRB) :: zhook_handle
5363 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_BALANCE',0,zhook_handle)
5365 pmassbalance = psummass_fin - psummass_ini - &
5366 ( psr + prr - pthrufal - pevap + pevapcor ) * ptstep
5368 pevapcor2 = pevapcor * psnowdz / max( xuepsi,psnowdz ) * &
5369 ( abs(plel3l) * xlvtt / max( xuepsi,abs(plel3l) ) + &
5370 abs(ples3l) * xlstt / max( xuepsi,abs(ples3l) ) )
5372 penergybalance = ( psumheat_fin-psumheat_ini ) / ptstep - &
5373 ( -pgrndflux - phsnow + prnsnow - plel3l - ples3l + phpsnow ) - &
5374 psnowhmass / ptstep - pevapcor2
5376 IF (lhook) CALL dr_hook(
'SNOWCRO:GET_BALANCE',1,zhook_handle)
5385 REAL(KIND=JPRB) :: zhook_handle
5387 IF (lhook) CALL dr_hook(
'SNOWCROPRINTDATE',0,zhook_handle)
5389 WRITE(*,fmt=
'(I4.4,2("-",I2.2)," Hour=",F5.2)') &
5390 tptime%TDATE%YEAR, tptime%TDATE%MONTH, tptime%TDATE%DAY, tptime%TIME/3600.
5392 IF (lhook) CALL dr_hook(
'SNOWCROPRINTDATE',1,zhook_handle)
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)
subroutine snowcrogone(PTSTEP, PLEL3L, PLES3L, PSNOWRHO, PSNOWHEAT, PRADSINK_2D, PEVAPCOR, PTHRUFAL, PGRNDFLUX, PGFLUXSNOW, PSNOWDZ, PSNOWLIQ, PSNOWTEMP, PRADXS, PRR, KNLVLS_USE)
subroutine snowcroprintatm(CINFO, PTA, PQA, PVMOD, PRR, PSR, PSW_RAD, PLW_RAD, PTG, PSOILCOND, PD_G, PPSN3L)
subroutine snowcroevapn(PLES3L, PTSTEP, PSNOWTEMP, PSNOWRHO, PSNOWDZ, PEVAPCOR, PSNOWHMASS)
subroutine surface_ri(PTG, PQS, PEXNS, PEXNA, PTA, PQA, PZREF, PUREF, PDIRCOSZW, PVMOD, PRI)
subroutine snowcroprintbalance(PSUMMASS_INI, PSUMHEAT_INI, PSUMMASS_FIN, PSUMHEAT_FIN, PSR, PRR, PTHRUFAL, PEVAP, PEVAPCOR, PGRNDFLUX, PHSNOW, PRNSNOW, PLEL3L, PLES3L, PHPSNOW, PSNOWHMASS, PSNOWDZ, PTSTEP, PMASSBALANCE, PENERGYBALANCE, PEVAPCOR2)
subroutine get_alb(KJ, PSNOWRHO_IN, PPS_IN, PVAGE1, PSNOWGRAN1, PSNOWGRAN2, PSNOWAGE, PALB, HSNOWMETAMO)
subroutine snowcroevapgone(PSNOWHEAT, PSNOWDZ, PSNOWRHO, PSNOWTEMP, PSNOWLIQ, PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, PSNOWAGE, KNLVLS_USE, HSNOWMETAMO)
subroutine snowcrostopbalance(PMASSBALANCE, PENERGYBALANCE)
subroutine snowcrolayer_gone(PTSTEP, PSCAP, PSNOWTEMP, PSNOWDZ, PSNOWRHO, PSNOWLIQ, PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, PSNOWAGE, PLES3L, KNLVLS_USE)
subroutine snowcroflux(PSNOWTEMP, PSNOWDZ, PEXNS, PEXNA, PUSTAR2_IC, PTSTEP, PALBT, PSW_RAD, PEMIST, PLWUPSNOW, PLW_RAD, PTA, PSFCFRZ, PQA, PHPSNOW, PSNOWTEMPO1, PSNOWFLUX, PCT, PRADSINK, PQSAT, PDQSAT, PRSRA, PRN, PH, PGFLUX, PLES3L, PLEL3L, PEVAP, PUSTAR)
subroutine snowcroprintprofile(HINFO, KLAYERS, OPRINTGRAN, PSNOWDZ, PSNOWRHO, PSNOWTEMP, PSNOWLIQ, PSNOWHEAT, PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, PSNOWAGE, HSNOWMETAMO)
subroutine get_gran(PTSTEP, PTELM, PGRAN)
subroutine abor1_sfx(YTEXT)
subroutine surface_aero_cond(PRI, PZREF, PUREF, PVMOD, PZ0, PZ0H, PAC, PRA, PCH)
subroutine snowcrorad(TPTIME, OGLACIER, PSW_RAD, PSNOWALB, PSNOWDZ, PSNOWRHO, PALB, PRADSINK, PRADXS, PSNOWGRAN1, PSNOWGRAN2, PSNOWAGE, PPS, PZENITH, PPERMSNOWFRAC, KNLVLS_USE, OSNOW_ABS_ZENITH, HSNOWMETAMO)
subroutine snownlgridfresh_1d(KJ, PSNOW, PSNOWDZ, PSNOWDZN, PSNOWRHO, PSNOWHEAT, PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, PSNOWAGE, GSNOWFALL, PSNOWRHOF, PSNOWDZF, PSNOWHEATF, PSNOWGRAN1F, PSNOWGRAN2F, PSNOWHISTF, PSNOWAGEF, KNLVLS_USE, HSNOWMETAMO)
subroutine snowcrometamo(PSNOWDZ, PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, PSNOWTEMP, PSNOWLIQ, PTSTEP, PSNOWSWE, INLVLS_USE, PSNOWAGE, HSNOWMETAMO)
subroutine get_snowdzn_end(KNLVLS, PSNOWDZ, PDZOPT, PSNOWDZN)
subroutine snowcrothrm(PSNOWRHO, PSCOND, PSNOWTEMP, PPS, PSNOWLIQ, OCOND_GRAIN, OCOND_YEN)
subroutine get_rho(PRHO_IN, PDZ, PSNOWLIQ, PFLOWLIQ, PRHO_OUT)
subroutine snowcroebud(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 snowcrocompactn(PTSTEP, PSNOWRHO, PSNOWDZ, PSNOWTEMP, PSNOW, PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, PSNOWLIQ, INLVLS_USE, PDIRCOSZW, HSNOWMETAMO)
subroutine snowcroalb(TPTIME, OGLACIER, PALBEDOSC, PSPECTRALALBEDO, PSNOWDZ, PSNOWRHO, PPERMSNOWFRAC, PSNOWGRAN1_TOP, PSNOWGRAN2_TOP, PSNOWAGE_TOP, PSNOWGRAN1_BOT, PSNOWGRAN2_BOT, PSNOWAGE_BOT, PPS, PZENITH, KNLVLS_USE, HSNOWMETAMO)
subroutine get_snowdzn_deb(KNLVLS, PSNOWDZ, PDZOPT, PSNOWDZN)
subroutine get_balance(PSUMMASS_INI, PSUMHEAT_INI, PSUMMASS_FIN, PSUMHEAT_FIN, PSR, PRR, PTHRUFAL, PEVAP, PEVAPCOR, PGRNDFLUX, PHSNOW, PRNSNOW, PLEL3L, PLES3L, PHPSNOW, PSNOWHMASS, PSNOWDZ, PTSTEP, PMASSBALANCE, PENERGYBALANCE, PEVAPCOR2)
subroutine getpoint_crodebug(PLAT, PLON, KDEBUG)
subroutine get_flux(PALBT, PEMIST, PSW_RAD, PLW_RAD, PEXNS, PEXNA, PTA, PQA, PRSRA, PQSAT, PDQSAT, PSFCFRZ, PHPSNOW, PSNOWTEMP, PSNOWTEMPO1, PRN, PH, PEVAPC, PLES3L, PLEL3L, PGFLUX)
subroutine surface_cd(PRI, PZREF, PUREF, PZ0EFF, PZ0H, PCD, PCDN)
subroutine snowcroprintdate()
subroutine snowcrorefrz(PTSTEP, PRR, PSNOWRHO, PSNOWTEMP, PSNOWDZ, PSNOWLIQ, PTHRUFAL, PSCAP, PLEL3L, KNLVLS_USE)
subroutine snowcrosolvt(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, PGBAS, PSNOWTEMP, PSNOWFLUX, KNLVLS_USE)
subroutine snowcromelt(PSCAP, PSNOWTEMP, PSNOWDZ, PSNOWRHO, PSNOWLIQ, KNLVLS_USE)
subroutine snownlfall_upgrid(TPTIME, OGLACIER, PTSTEP, PSR, PTA, PVMOD, PSNOW, PSNOWRHO, PSNOWDZ, PSNOWHEAT, PSNOWHMASS, PSNOWALB, PPERMSNOWFRAC, PSNOWGRAN1, PSNOWGRAN2, GSNOWFALL, PSNOWDZN, PSNOWRHOF, PSNOWDZF, PSNOWGRAN1F, PSNOWGRAN2F, PSNOWHISTF, PSNOWAGEF, OMODIF_GRID, KNLVLS_USE, OSNOWDRIFT, PZ0EFF, PUREF, HSNOWMETAMO)
subroutine snowcro_tartes(PSNOWGRAN1, PSNOWGRAN2, PSNOWRHO, PSNOWDZ, PSNOWG0, PSNOWY0, PSNOWW0, PSNOWB0, PSNOWIMP_DENSITY, PSNOWIMP_CONTENT, PALB, PSW_RAD, PZENITH, KNLVLS_USE, PSNOWALB, PRADSINK, PRADXS, ODEBUG, HSNOWMETAMO)
subroutine set_thresh(PGRADT, PSNOWLIQ, PSPHE)
subroutine snowdrift(PTSTEP, PVMOD, PSNOWRHO, PSNOWDZ, PSNOW, PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, KNLVLS_USE, PTA, PQA, PPS, PRHOA, PZ0EFF, PUREF, OSNOWDRIFT_SUBLIM, HSNOWMETAMO, PSNDRIFT)