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, &
134 USE modd_snow_par
, ONLY : xz0icez0snow, xrhothreshold_ice, xpercentagepore
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
185 REAL,
DIMENSION(:),
INTENT(IN) :: PTG, PSOILCOND, PD_G, PPSN3L
193 REAL,
DIMENSION(:),
INTENT(IN) :: PZREF, PUREF, PEXNS, PEXNA, PDIRCOSZW
209 REAL,
DIMENSION(:),
INTENT(IN) :: PPEW_A_COEF, PPEW_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
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
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
333 REAL,
DIMENSION(SIZE(PTA)) :: ZRSRA, ZDQSAT, ZQSAT, ZRADXS, ZLIQHEATXS
344 REAL,
DIMENSION(SIZE(PTA)) :: ZUSTAR2_IC, ZTA_IC, ZQA_IC, &
345 ZPET_A_COEF_T, ZPEQ_A_COEF_T, ZPET_B_COEF_T
354 REAL,
DIMENSION(SIZE(PTA)) :: ZSNOWRHOF, ZSNOWDZF, ZSNOWGRAN1F,
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
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
392 gcrodebugprintbalance = ( tptime%TDATE%YEAR*10000 + tptime%TDATE%MONTH*1
399 gcrodebugprint = gcrodebugprintbalance
403 gcrodebugprint = .false.
404 gcrodebugdetailsprint = .false.
405 gcrodebugprintatm = .false.
412 IF (
lcrodebug .OR. gcroinfoprint .OR. gcrodebugprintbalance )
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 509 WRITE(*,*)
'Snow fraction =',ppsn3l(idebug)
514 IF (gcrodebugprint)
THEN 523 IF (gcrodebugprintatm)
THEN 524 CALL snowcroprintatm(
"forcing data :",pta(idebug),pqa(idebug),pvmod(idebug
534 DO jj = 1,
SIZE(zsnow)
535 zsnow(jj) =
sum(psnowdz(jj,1:inlvls_use(jj)))
538 zsnowbis(:) = zsnow(:)
554 IF (gcrodebugdetailsprint)
THEN 563 zsnow(:) = zsnowbis(:)
571 IF ( gmodif_maillage(jj) )
THEN 582 IF (gcrodebugdetailsprint)
THEN 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
609 psnowliq(jj,jst) = max( 0.0, zsnowtemp(jj,jst)-
xtt ) * zscap(jj,jst
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 645 CALL snowcrometamo(psnowdz,psnowgran1,psnowgran2,psnowhist,zsnowtemp, &
646 psnowliq,ptstep,psnowswe,inlvls_use,psnowage,hsnowmetamo
649 IF (gcrodebugdetailsprint)
THEN 667 IF (gcrodebugdetailsprint)
THEN 680 CALL snowdrift(ptstep, pvmod, psnowrho,psnowdz, zsnow,
685 IF (gcrodebugdetailsprint)
THEN 696 DO jj = 1,
SIZE(zsnow)
697 DO jst = 1,inlvls_use(jj)
698 zscap(jj,jst) = ( psnowrho(jj,jst) - &
707 IF (gcrodebugdetailsprint)
THEN 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
747 CALL abor1_sfx(
"UNKNOWN CSNOWRAD OPTION")
752 IF (gcrodebugdetailsprint)
THEN 765 CALL snowcrothrm(psnowrho,zscond,zsnowtemp,pps,psnowliq,gcond_grain,gcond_yen
768 IF (gcrodebugdetailsprint)
THEN 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
824 IF (gcrodebugdetailsprint)
THEN 835 zsnowtempo1(:) = zsnowtemp(:,1)
844 IF (gcrodebugdetailsprint)
THEN 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 881 psnowheat,zradsink,pevapcor,pthrufal,pgrndflux, &
882 pgfluxsnow,psnowdz,psnowliq,zsnowtemp,zradxs, &
886 IF (gcrodebugdetailsprint)
THEN 898 pgrndflux(:) = pgrndflux(:) + zradxs(:)
904 psnowrho,psnowliq,psnowgran1,psnowgran2, &
905 psnowhist,psnowage,ples3l, inlvls_use )
908 IF (gcrodebugdetailsprint)
THEN 919 CALL snowcromelt(zscap,zsnowtemp,psnowdz,psnowrho,psnowliq,inlvls_use)
922 IF (gcrodebugdetailsprint)
THEN 936 CALL snowcrorefrz(ptstep,prr,psnowrho,zsnowtemp,psnowdz,psnowliq,pthrufal
940 IF (gcrodebugdetailsprint)
THEN 952 CALL snowcroevapn(ples3l,ptstep,zsnowtemp(:,1),psnowrho(:,1), &
953 psnowdz(:,1),pevapcor,psnowhmass )
956 IF (gcrodebugdetailsprint)
THEN 968 CALL snowcroevapgone(psnowheat,psnowdz,psnowrho,zsnowtemp,psnowliq,psnowgran1
972 IF (gcrodebugdetailsprint)
THEN 985 IF ( hsnowrad==
'B92' )
THEN 1003 DO jj = 1,
SIZE(zsnow)
1005 DO jst = 1,inlvls_use(jj)
1006 zwholdmax(jj,jst) = xpercentagepore/
xrholi * (psnowdz(jj,jst) * &
1008 zliqheatxs(jj) = max( 0.0, (psnowliq(jj,jst) - zwholdmax(jj,jst)
1014 zscap(jj,jst) = psnowrho(jj,jst) *
xci 1015 psnowheat(jj,jst) = psnowdz(jj,jst) * &
1016 ( zscap(jj,jst)*(psnowtemp(jj,jst)-
xtt) -
xlmtt*psnowrho
1019 psnowswe(jj,jst) = psnowdz(jj,jst) * psnowrho(jj,jst)
1023 DO jst = inlvls_use(jj)+1,
SIZE(psnowswe,2)
1024 psnowswe(jj,jst) = 0.
1025 psnowheat(jj,jst) = 0.
1026 psnowrho(jj,jst) = 999.
1027 psnowtemp(jj,jst) = 0.
1028 psnowdz(jj,jst) = 0.
1042 IF (gcrodebugprint)
THEN 1052 DO jj = 1,
SIZE(zsnow)
1055 DO jst = 1,inlvls_use(jj)
1056 IF ( psnowtemp(jj,jst) < 100. )
THEN 1057 WRITE(*,*)
'pb tempe snow :',psnowtemp(jj,jst)
1058 WRITE(*,fmt=
'("DATE:",2(I2.2,"/"),I4.4,F3.0)') &
1059 tptime%TDATE%DAY,tptime%TDATE%MONTH,tptime%TDATE%YEAR,tptime%TIME
1060 WRITE(*,*)
'point',jj,
"/",
SIZE(zsnow)
1061 WRITE(*,*)
'layer',jst
1062 WRITE(*,*)
'pressure',pps(jj)
1063 WRITE(*,*)
'slope',acos(pdircoszw(jj))*(180./
xpi),
"deg" 1064 WRITE(*,*)
'XLAT=',pxlat(jj),
'XLON=',pxlon(jj)
1065 WRITE(*,*)
'solar radiation=',psw_rad(jj)
1066 WRITE(*,*)
'INLVLS_USE(JJ):',inlvls_use(jj)
1067 WRITE(*,*) psnowdz(jj,1:inlvls_use(jj))
1068 WRITE(*,*) psnowrho(jj,1:inlvls_use(jj))
1069 WRITE(*,*) psnowtemp(jj,1:inlvls_use(jj))
1070 CALL abor1_sfx(
'SNOWCRO: erreur tempe snow')
1077 IF (gcrodebugprintbalance)
THEN 1079 zsummass_fin(idebug) =
sum( psnowswe(idebug,1:inlvls_use(idebug)) )
1080 zsumheat_fin(idebug) =
sum( psnowheat(idebug,1:inlvls_use(idebug)) )
1082 CALL get_balance(zsummass_ini(idebug),zsumheat_ini(idebug),zsummass_fin
1101 DO jj=1,
SIZE(zsnow)
1103 zsummass_fin(jj) =
sum( psnowswe(jj,1:inlvls_use(jj)) )
1104 zsumheat_fin(jj) =
sum( psnowheat(jj,1:inlvls_use(jj)) )
1106 CALL get_balance(zsummass_ini(jj),zsumheat_ini(jj),zsummass_fin(jj),
1130 PSNOWTEMP,PSNOW,PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST, &
1131 PSNOWLIQ,INLVLS_USE,PDIRCOSZW,HSNOWMETAMO )
1161 USE modd_snow_par
, ONLY : xrhosmax_es
1168 REAL,
INTENT(IN) :: PTSTEP
1169 REAL,
DIMENSION(:),
INTENT(IN) :: PDIRCOSZW
1171 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWTEMP
1173 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWRHO, PSNOWDZ
1175 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOW
1177 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST
1179 INTEGER,
DIMENSION(:),
INTENT(IN) :: INLVLS_USE
1180 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
1184 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWRHO2, &
1191 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1198 IF (
lhook)
CALL dr_hook(
'SNOWCROCOMPACTN',0,zhook_handle)
1200 DO jj = 1,
SIZE(psnow)
1202 DO jst = 2,inlvls_use(jj)
1203 zsmass(jj,jst) = zsmass(jj,jst-1) + psnowdz(jj,jst-1) * psnowrho(jj,jst
1205 zsmass(jj,1) = 0.5 * psnowdz(jj,1) * psnowrho(jj,1)
1212 DO jj = 1,
SIZE(psnow)
1214 DO jst = 1,inlvls_use(jj)
1217 zviscosity(jj,jst) =
xvvisc1 * &
1222 IF ( psnowliq(jj,jst)>0.0 )
THEN 1223 zviscosity(jj,jst) = zviscosity(jj,jst) / &
1227 IF( psnowliq(jj,jst)/psnowdz(jj,jst)<=0.01 .AND. psnowhist(jj,jst)>=
nvhis2THEN 1231 IF ( psnowhist(jj,jst)==
nvhis1 )
THEN 1233 IF ( hsnowmetamo==
"B92" )
THEN 1235 IF ( psnowgran1(jj,jst)>=0. .AND. psnowgran1(jj,jst)<
xvgran6 )
THEN 1241 ELSEIF ( psnowgran1(jj,jst)>=
xvdiam6*(4.-psnowgran2(jj,jst)) .AND.
THEN 1250 zsnowrho2(jj,jst) = psnowrho(jj,jst) + psnowrho(jj,jst) * ptstep * &
1251 (
xg*pdircoszw(jj)*zsmass(jj,jst
1254 psnowdz(jj,jst) = psnowdz(jj,jst) * ( psnowrho(jj,jst)/zsnowrho2(jj,jst
1257 psnowrho(jj,jst) = zsnowrho2(jj,jst)
1267 DO jj = 1,
SIZE(psnowdz,1)
1268 psnow(jj) =
sum( psnowdz(jj,1:inlvls_use(jj)) )
1271 IF (
lhook)
CALL dr_hook(
'SNOWCROCOMPACTN',1,zhook_handle)
1283 PSNOWHIST, PSNOWTEMP, PSNOWLIQ, PTSTEP, &
1284 PSNOWSWE,INLVLS_USE, PSNOWAGE, HSNOWMETAMO)
1460 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWDZ, PSNOWTEMP, PSNOWLIQ, PSNOWSWE
1462 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST
1464 REAL,
INTENT(IN) :: PTSTEP
1466 INTEGER,
DIMENSION(:),
INTENT(IN) :: INLVLS_USE
1468 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWAGE
1470 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
1474 REAL :: ZGRADT, ZTELM, ZVDENT, ZDENT, ZSPHE, ZVAP, ZDANGL, &
1475 ZSIZE, ZSSA, ZSSA0, ZSSA_T, ZSSA_T_DT, ZA, ZB, ZC, &
1476 ZA2, ZB2, ZC2, ZOPTD, ZOPTR, ZOPTR0, ZDRDT
1477 REAL :: ZVDENT1, ZVDENT2, ZVSPHE, ZCOEF_SPH
1478 REAL :: ZDENOM1, ZDENOM2, ZFACT1, ZFACT2
1481 INTEGER :: IDRHO, IDGRAD, IDTEMP
1482 LOGICAL :: GNONDENDRITIC ,GFACETED, GSPHE_LW
1483 LOGICAL :: GCOND_B92, GCOND_C13, GCOND_SPH
1485 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1490 IF (
lhook)
CALL dr_hook(
'SNOWCROMETAMO',0,zhook_handle)
1492 inlvls =
SIZE(psnowgran1(:,:),2)
1496 DO jj = 1,
SIZE(psnowrho,1)
1498 DO jst = 1,inlvls_use(jj)
1501 IF ( jst==inlvls_use(jj) )
THEN 1502 zgradt = abs(psnowtemp(jj,jst) - psnowtemp(jj,jst-1))*2. / (psnowdz
1503 ELSEIF ( jst==1 )
THEN 1504 zgradt = abs(psnowtemp(jj,jst+1) - psnowtemp(jj,jst) )*2. / (psnowdz
1506 zgradt = abs(psnowtemp(jj,jst+1) - psnowtemp(jj,jst-1))*2. / &
1507 (psnowdz(jj,jst-1) + psnowdz
1510 IF ( psnowliq(jj,jst)>
xuepsi )
THEN 1514 ztelm =
xupourc * psnowliq(jj,jst) *
xrholw / psnowswe(jj,jst)
1527 ELSEIF ( zgradt<
xvgrat1 )
THEN 1530 zvap = exp(
xvvap1/psnowtemp(jj,jst) )
1536 gcond_b92 = ( psnowhist(jj,jst)/=
nvhis1 .OR. psnowgran2(jj,jst)<
xvdiam2 1547 zvap = exp(
xvvap1/psnowtemp(jj,jst) ) * (zgradt)**
xvvap2 1553 gcond_b92 = ( zgradt<
xvgrat2 .OR. psnowgran1(jj,jst)>0. )
1554 gcond_c13 = ( hsnowmetamo==
'C13' )
1562 IF ( hsnowmetamo==
"B92" )
THEN 1571 IF ( psnowgran1(jj,jst)<-
xuepsi )
THEN 1575 zdent = - psnowgran1(jj,jst)/
xvgran1 - zvdent1 * ptstep
1576 zsphe = psnowgran2(jj,jst)/
xvgran1 + zvdent2 * ptstep
1577 CALL set_thresh(zgradt,psnowliq(jj,jst),zsphe)
1580 psnowgran1(jj,jst) = zsphe *
xvgran1 1583 psnowgran1(jj,jst) = -zdent *
xvgran1 1584 psnowgran2(jj,jst) = zsphe *
xvgran1 1587 ELSEIF ( gcond_b92 )
THEN 1594 zsphe = psnowgran1(jj,jst)/
xvgran1 + zvdent2 * ptstep
1595 CALL set_thresh(zgradt,psnowliq(jj,jst),zsphe)
1596 psnowgran1(jj,jst) = zsphe *
xvgran1 1598 ELSEIF ( psnowliq(jj,jst)>
xuepsi )
THEN 1602 CALL get_gran(ptstep,ztelm,psnowgran2(jj,jst))
1604 ELSEIF ( zgradt<
xvgrat1 )
THEN 1607 zsphe = psnowgran1(jj,jst)/
xvgran1 + &
1608 zvdent2 * ptstep * exp( min( 0.,
xvdiam3-psnowgran2(jj,jst
1610 CALL set_thresh(zgradt,psnowliq(jj,jst),zsphe)
1611 psnowgran1(jj,jst) = zsphe *
xvgran1 1631 zsphe = psnowgran2(jj,jst) + zvdent2 * ptstep
1632 CALL set_thresh(zgradt,psnowliq(jj,jst),zsphe)
1634 gcond_sph = ( zsphe < 1.-
xuepsi )
1636 gcond_sph = ( zsphe >
xuepsi )
1639 IF ( gcond_c13 .AND. psnowgran1(jj,jst)<
xvdiam6*(4.-zsphe)-
xuepsi THEN 1642 IF ( gcond_sph )
THEN 1643 psnowgran1(jj,jst) = psnowgran1(jj,jst) +
xvdiam6 * ptstep * &
1644 ( zvdent2*(psnowgran1(jj,jst)/
xvdiam6-1.)
1647 psnowgran1(jj,jst) = psnowgran1(jj,jst) +
xvdiam6 * ptstep *
1650 ELSEIF ( gcond_c13 .AND. gcond_sph )
THEN 1655 psnowgran1(jj,jst) = psnowgran1(jj,jst) -
xvdiam6 * ptstep * zvdent2
1657 ELSEIF ( psnowliq(jj,jst)>
xuepsi )
THEN 1661 CALL get_gran(ptstep,ztelm,psnowgran1(jj,jst))
1663 ELSEIF ( gcond_c13 .AND. zgradt>=
xvgrat2 )
THEN 1670 psnowgran2(jj,jst) = zsphe
1679 IF ( psnowliq(jj,jst)<=
xuepsi .AND. hsnowmetamo==
'T07' )
THEN 1681 !
WRITE(*,*) csnowmetamo,
': you are using T07 formulation!!' 1686 za = 0.659*zssa0 - 27.2 * ( psnowtemp(jj,jst)-273.15-2.03 )
1687 zb = 0.0961*zssa0 - 3.44 * ( psnowtemp(jj,jst)-273.15+1.90 )
1688 zc = -0.341*zssa0 - 27.2 * ( psnowtemp(jj,jst)-273.15-2.03 )
1689 za2 = 0.629*zssa0 - 15.0 * ( psnowtemp(jj,jst)-273.15-11.2 )
1690 zb2 = 0.0760*zssa0 - 1.76 * ( psnowtemp(jj,jst)-273.15-2.96 )
1691 zc2 = -0.371*zssa0 - 15.0 * ( psnowtemp(jj,jst)-273.15-11.2 )
1708 zssa = 6./(
xrholi*psnowgran1(jj,jst) ) * 10.
1710 zdenom1 = (psnowage(jj,jst)*24.) + exp(zc/zb)
1711 zdenom2 = (psnowage(jj,jst)*24.) + exp(zc2/zb2)
1712 zfact1 = 0.5 + 0.5*tanh( 0.5*(zgradt-10.) )
1713 zfact2 = 0.5 - 0.5*tanh( 0.5*(zgradt-10.) )
1714 zssa = zssa + (ptstep/3600.) * ( zfact1 * (-zb
1719 zssa = max( zssa, 8.*10. )
1721 psnowgran1(jj,jst) = 6./(
xrholi*zssa ) * 10.
1729 ELSEIF ( psnowliq(jj,jst)<=
xuepsi .AND. hsnowmetamo==
'F06' )
THEN 1739 idrho = min( abs( int( (psnowrho(jj,jst)-25.)/50. ) + 1
1742 IF ( psnowtemp(jj,jst)<221. ) idtemp = 1
1746 zoptr = psnowgran1(jj,jst)/2. * 10.**6.
1747 zdrdt =
xdrdt0(idrho,idgrad,idtemp) * &
1748 (
xtau(idrho,idgrad,idtemp) / &
1749 ( zoptr - zoptr0 +
xtau(idrho,idgrad,idtemp) ) )**(1.
1753 psnowgran1(jj,jst) = zoptr * 2./10.**6.
1766 DO jj = 1,
SIZE(psnowrho,1)
1768 DO jst = 1,inlvls_use(jj)
1770 IF ( hsnowmetamo==
'B92' )
THEN 1773 gnondendritic = ( psnowgran1(jj,jst)>=0. )
1774 IF ( gnondendritic )
THEN 1776 gfaceted = ( psnowgran1(jj,jst)<
xvsphe4 .AND. psnowhist(jj,jst)=
1778 gsphe_lw = (
xvgran1-psnowgran1(jj,jst)<
xvsphe4 .AND. psnowliq(jj
1784 gnondendritic = ( psnowgran1(jj,jst)>=
xvdiam6*(4.-psnowgran2(jj,jst
1785 IF ( gnondendritic )
THEN 1787 gfaceted = ( psnowgran2(jj,jst)<
xvsphe4/
xvgran1 .AND. psnowhist(jj
1794 IF ( gnondendritic )
THEN 1796 IF ( gfaceted )
THEN 1798 psnowhist(jj,jst) =
nvhis1 1800 ELSEIF ( gsphe_lw )
THEN 1802 IF (psnowhist(jj,jst)==0.) psnowhist(jj,jst) =
nvhis2 1803 IF (psnowhist(jj,jst)==
nvhis1) psnowhist(jj,jst) =
nvhis3 1805 ELSEIF ( psnowtemp(jj,jst) <
xtt )
THEN 1807 IF(psnowhist(jj,jst)==
nvhis2) psnowhist(jj,jst) =
nvhis4 1808 IF(psnowhist(jj,jst)==
nvhis3) psnowhist(jj,jst) =
nvhis5 1818 IF (
lhook)
CALL dr_hook(
'SNOWCROMETAMO',1,zhook_handle)
1830 REAL,
INTENT(IN) :: PGRADT
1831 REAL,
INTENT(IN) :: PSNOWLIQ
1832 REAL,
INTENT(INOUT) :: PSPHE
1835 psphe = min(1.,psphe)
1837 psphe = max(0.,psphe)
1843 SUBROUTINE get_gran(PTSTEP,PTELM,PGRAN)
1850 REAL,
INTENT(IN) :: PTSTEP, PTELM
1851 REAL,
INTENT(INOUT) :: PGRAN
1853 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1855 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_GRAN',0,zhook_handle)
1857 pgran = 2. * ( 3./(4.*
xpi) * &
1858 ( 4. *
xpi/3. * (pgran/2.)**3 + &
1861 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_GRAN',1,zhook_handle)
1870 PALBEDOSC,PSPECTRALALBEDO,PSNOWDZ, &
1871 PSNOWRHO,PPERMSNOWFRAC, &
1872 PSNOWGRAN1_TOP,PSNOWGRAN2_TOP,PSNOWAGE_TOP, &
1873 PSNOWGRAN1_BOT,PSNOWGRAN2_BOT,PSNOWAGE_BOT, &
1874 PPS, PZENITH, KNLVLS_USE ,HSNOWMETAMO )
1886 USE modd_snow_par
, ONLY : xansmax, xansmin,xaglamin, xaglamax, &
1887 xvrpre1,xvrpre2,xvaging_noglacier, &
1888 xvaging_glacier, xvspec1,xvspec2, &
1889 xvspec3, xvw1,xvw2,xvd1,xvd2
1900 LOGICAL,
INTENT(IN) :: OGLACIER
1904 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWDZ,PPERMSNOWFRAC
1906 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO
1908 REAL,
DIMENSION(:),
INTENT(INOUT) :: PALBEDOSC
1910 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PSPECTRALALBEDO
1912 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWGRAN1_TOP,PSNOWGRAN2_TOP,PSNOWAGE_TOP
1914 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
1916 REAL,
DIMENSION(:),
INTENT(IN) :: PZENITH
1918 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
1922 REAL,
DIMENSION(SIZE(PSNOWRHO,1),3) :: ZALB_TOP, ZALB_BOT
1924 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZANSMIN, ZANSMAX, ZMIN, ZMAX
1925 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZFAC_TOP, ZFAC_BOT
1927 REAL,
DIMENSION(SIZE(PALBEDOSC)) :: ZVAGE1
1933 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1942 IF ( oglacier )
THEN 1943 zansmin(:) = xaglamin * ppermsnowfrac(:) + xansmin * (1.0-ppermsnowfrac
1947 zansmin(:) = xansmin
1948 zansmax(:) = xansmax
1949 zvage1(:) = xvaging_noglacier
1958 IF ( minval(psnowage_bot)<0. )
THEN 1959 CALL abor1_sfx(
'FATAL ERROR in SNOWCRO: Snow layer age inconsistent : check initialization routine. !' 1970 DO jj=1,
SIZE(palbedosc)
1972 IF ( knlvls_use(jj)==0 )
THEN 1974 palbedosc(jj) = zansmin(jj)
1977 CALL get_alb(jj,psnowrho(jj,1),pps(jj),zvage1(jj),psnowgran1_top(jj)
1981 IF ( knlvls_use(jj)>=2 )
THEN 1984 CALL get_alb(jj,psnowrho(jj,2),pps(jj),zvage1(jj),psnowgran1_bot(jj
1989 zalb_bot(jj,1) = zalb_top(jj,1)
1990 zalb_bot(jj,2) = zalb_top(jj,2)
1991 zalb_bot(jj,3) = zalb_top(jj,3)
1996 zmin(jj) = min( 1., psnowdz(jj)/xvd1 )
1997 zmax(jj) = max( 0., (psnowdz(jj)-xvd1)/xvd2 )
1998 zfac_top(jj) = xvw1 * zmin(jj) + xvw2 * min( 1., zmax(jj) )
1999 zfac_bot(jj) = xvw1 * ( 1. - zmin(jj) ) + xvw2 * ( 1. - min( 1., zmax
2006 palbedosc(jj) = xvspec1 * pspectralalbedo(jj,1) + &
2007 xvspec2 * pspectralalbedo(jj,2) + &
2008 xvspec3 * pspectralalbedo(jj,3)
2019 SUBROUTINE get_alb(KJ,PSNOWRHO_IN,PPS_IN,PVAGE1,PSNOWGRAN1,PSNOWGRAN2,PSNOWAGE,PALB,&
2022 USE modd_snow_par
, ONLY : xalbice1, xalbice2, xalbice3, &
2023 xrhothreshold_ice, &
2024 xvalb2, xvalb3, xvalb4, xvalb5, &
2025 xvalb6, xvalb7, xvalb8, xvalb9, &
2026 xvalb10, xvalb11, xvdiop1, &
2027 xvrpre1, xvrpre2, xvpres1
2033 INTEGER,
INTENT(IN) :: KJ
2034 REAL,
INTENT(IN) :: PSNOWRHO_IN, PPS_IN
2035 REAL,
INTENT(IN) :: PVAGE1
2036 REAL,
INTENT(IN) :: PSNOWGRAN1, PSNOWGRAN2, PSNOWAGE
2037 REAL,
DIMENSION(3),
INTENT(OUT) :: PALB
2039 CHARACTER(3),
INTENT(IN)::HSNOWMETAMO
2041 REAL :: ZDIAM, ZDIAM_SQRT
2043 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2045 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_ALB',0,zhook_handle)
2047 IF ( psnowrho_in<xrhothreshold_ice )
THEN 2049 CALL get_diam(psnowgran1,psnowgran2,zdiam,hsnowmetamo)
2050 zdiam_sqrt = sqrt(zdiam)
2051 palb(1) = min( xvalb2 - xvalb3*zdiam_sqrt, xvalb4 )
2052 palb(2) = max( 0.3, xvalb5 - xvalb6*zdiam_sqrt )
2053 zdiam = min( zdiam, xvdiop1 )
2054 zdiam_sqrt = sqrt(zdiam)
2055 palb(3) = max( 0., xvalb7*zdiam - xvalb8*zdiam_sqrt + xvalb9 )
2061 palb(1) = max( xvalb11, palb(1) - min( max(pps_in/xvpres1,xvrpre1), xvrpre2
2070 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_ALB',1,zhook_handle)
2077 PSW_RAD, PSNOWALB, PSNOWDZ, &
2078 PSNOWRHO, PALB, PRADSINK, PRADXS, &
2079 PSNOWGRAN1, PSNOWGRAN2, PSNOWAGE,PPS, &
2080 PZENITH, PPERMSNOWFRAC,KNLVLS_USE, &
2081 OSNOW_ABS_ZENITH,HSNOWMETAMO)
2091 USE modd_snow_par
, ONLY : xwcrn, xansmax, xansmin, xans_todry, &
2092 xsnowdmin, xans_t, xaglamin, xaglamax, &
2093 xd1, xd2, xd3, xx, xvspec1, xvspec2, xvspec3, &
2094 xvbeta1, xvbeta2, xvbeta3, xvbeta4, xvbeta5
2104 LOGICAL,
INTENT(IN) :: OGLACIER
2109 REAL,
DIMENSION(:),
INTENT(IN) :: PSW_RAD, PSNOWALB, PALB,PPERMSNOWFRAC
2111 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO, PSNOWDZ
2113 LOGICAL,
INTENT(IN) :: OSNOW_ABS_ZENITH
2115 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
2117 REAL,
DIMENSION(:),
INTENT(OUT) :: PRADXS
2119 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PRADSINK
2121 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWGRAN1, PSNOWGRAN2, PSNOWAGE
2122 REAL,
DIMENSION(:),
INTENT(IN) :: PPS
2123 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
2124 REAL,
DIMENSION(:),
INTENT(IN) :: PZENITH
2128 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZRADTOT
2129 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZALB_NEW
2130 REAL,
DIMENSION(SIZE(PSNOWRHO,1),3) :: ZALB
2131 REAL,
DIMENSION(SIZE(PSNOWRHO,2)) :: ZDIAM
2132 REAL,
DIMENSION(SIZE(PSNOWRHO,2),3) :: ZBETA
2133 REAL,
DIMENSION(3) :: ZOPTICALPATH, ZFACT
2136 INTEGER :: JJ,JST,JB
2138 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2156 DO jj = 1,
SIZE(psw_rad)
2158 DO jst = 1,knlvls_use(jj)
2159 CALL get_diam(psnowgran1(jj,jst),psnowgran2(jj,jst),zdiam(jst),hsnowmetamo
2169 zprojlat = 1. / max(
xuepsi, cos(pzenith(jj)) )
2171 pradsink(jj,:) = -psw_rad(jj) * ( 1.-psnowalb(jj) ) / ( 1.-zalb_new(jj
2174 zopticalpath(1) = 0.
2175 zopticalpath(2) = 0.
2176 zopticalpath(3) = 0.
2178 DO jst = 1,knlvls_use(jj)
2180 zbeta(jst,1) = max( xvbeta1 * psnowrho(jj,jst) / sqrt(zdiam(jst)), xvbeta2
2186 zopticalpath(jb) = zopticalpath(jb) + zbeta(jst,jb) * psnowdz(jj,jst
2187 IF (osnow_abs_zenith)
THEN 2189 zfact(jb) = (1.-zalb(jj,jb)) * exp( -zopticalpath(jb)*zprojlat)
2191 zfact(jb) = (1.-zalb(jj,jb)) * exp( -zopticalpath(jb) )
2195 pradsink(jj,jst) = pradsink(jj,jst) * &
2196 ( xvspec1*zfact(1) + xvspec2*zfact(2) + xvspec3*zfact
2207 pradxs(jj) = -pradsink( jj,knlvls_use(jj) )
2218 SUBROUTINE snowcrothrm(PSNOWRHO,PSCOND,PSNOWTEMP,PPS,PSNOWLIQ, &
2219 OCOND_GRAIN,OCOND_YEN )
2231 USE modd_snow_par
, ONLY : xsnowthrmcond1, xsnowthrmcond2, xsnowthrmcond_avap, &
2232 xsnowthrmcond_bvap, xsnowthrmcond_cvap, xvrkz6
2238 REAL,
DIMENSION(:),
INTENT(IN) :: PPS
2239 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWTEMP, PSNOWRHO, PSNOWLIQ
2240 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PSCOND
2241 LOGICAL,
INTENT(IN) :: OCOND_GRAIN, OCOND_YEN
2247 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2254 DO jst = 1,
SIZE(psnowrho(:,:),2)
2256 DO jj = 1,
SIZE(psnowrho(:,:),1)
2258 IF ( ocond_yen )
THEN 2259 pscond(jj,jst) =
xcondi * exp( xvrkz6 * log( psnowrho(jj,jst)/
xrholw 2261 pscond(jj,jst) = ( xsnowthrmcond1 + &
2262 xsnowthrmcond2 * psnowrho(jj,jst) * psnowrho(jj
2269 IF ( ocond_grain )
THEN 2270 pscond(jj,jst) = max( 0.04, pscond(jj,jst) )
2272 IF( psnowliq(jj,jst)>
xuepsi ) pscond(jj,jst) = 0.01 * pscond(jj,jst
2285 SUBROUTINE snowcroebud(HSNOWRES, HIMPLICIT_WIND, &
2286 PPEW_A_COEF, PPEW_B_COEF, &
2287 PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, &
2289 PZREF,PTS,PSNOWRHO,PSNOWLIQ,PSCAP,PSCOND1,PSCOND2, &
2290 PUREF,PEXNS,PEXNA,PDIRCOSZW,PVMOD, &
2291 PLW_RAD,PSW_RAD,PTA,PQA,PPS,PTSTEP, &
2292 PSNOWDZ1,PSNOWDZ2,PALBT,PZ0,PZ0EFF,PZ0H, &
2293 PSFCFRZ,PRADSINK,PHPSNOW, &
2294 PCT,PEMIST,PRHOA,PTSTERM1,PTSTERM2,PRA,PCDSNOW,PCHSNOW, &
2295 PQSAT,PDQSAT,PRSRA,PUSTAR2_IC, PRI, &
2296 PPET_A_COEF_T,PPEQ_A_COEF_T,PPET_B_COEF_T,PPEQ_B_COEF_T )
2314 USE modd_snow_par
, ONLY : x_ri_max, xemissn
2319 USE modi_surface_aero_cond
2326 REAL,
INTENT(IN) :: PTSTEP, PSNOWDZMIN
2328 CHARACTER(LEN=*),
INTENT(IN) :: HSNOWRES
2333 CHARACTER(LEN=*),
INTENT(IN) :: HIMPLICIT_WIND
2337 REAL,
DIMENSION(:),
INTENT(IN) :: PPEW_A_COEF, PPEW_B_COEF,
2347 REAL,
DIMENSION(:),
INTENT(IN) :: PZREF, PTS, PSNOWDZ1, PSNOWDZ2,
2353 REAL,
DIMENSION(:),
INTENT(IN) :: PSW_RAD, PLW_RAD, PTA, PQA, PPS, PRHOA
2355 REAL,
DIMENSION(:),
INTENT(IN) :: PUREF, PEXNS, PEXNA, PDIRCOSZW, PVMOD
2357 REAL,
DIMENSION(:),
INTENT(OUT) :: PTSTERM1, PTSTERM2, PEMIST, PRA,
2361 REAL,
DIMENSION(:),
INTENT(OUT) :: PUSTAR2_IC, &
2362 PPET_A_COEF_T, PPEQ_A_COEF_T, &
2363 PPET_B_COEF_T, PPEQ_B_COEF_T
2365 REAL,
DIMENSION(:),
INTENT(OUT) :: PRI
2369 REAL,
DIMENSION(SIZE(PTS)) :: ZAC, ZRI, &
2370 ZSCONDA, ZA, ZB, ZC, &
2371 ZCDN, ZSNOWDZM1, ZSNOWDZM2, &
2372 ZVMOD, ZUSTAR2, ZTS3, ZLVT, &
2374 REAL,
DIMENSION(SIZE(PTS)) :: ZSNOWEVAPX, ZDENOM, ZNUMER
2378 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2388 pqsat(:) =
qsati(pts(:),pps(:))
2389 pdqsat(:) =
dqsati(pts(:),pps(:),pqsat(:))
2402 CALL surface_ri(pts, pqsat, pexns, pexna, pta, pqa, &
2403 pzref, puref, pdircoszw, pvmod, zri )
2410 IF ( hsnowres==
'RIL' )
THEN 2412 zri(jj) = min( x_ri_max, zri(jj) )
2422 prsra(:) = prhoa(:) / pra(:)
2426 CALL surface_cd(zri, pzref, puref, pz0eff, pz0h, pcdsnow, zcdn)
2432 znumer(:) = pcdsnow(:)*pvmod(:)
2433 zdenom(:) = prhoa(:) * pcdsnow(:) * pvmod(:) * ppew_a_coef(:)
2434 IF(himplicit_wind==
'OLD')
THEN 2436 zustar2(:) = ( znumer(:) * ppew_b_coef(:) ) / ( 1.0 - zdenom(:) )
2439 zustar2(:) = ( znumer(:) * ( 2.*ppew_b_coef(:) - pvmod(:) ) ) / ( 1.0
2442 zvmod(:) = prhoa(:)*ppew_a_coef(:)*zustar2(:) + ppew_b_coef(:)
2443 zvmod(:) = max( zvmod(:),0. )
2445 WHERE ( ppew_a_coef(:)/= 0. )
2446 zustar2(:) = max( ( zvmod(:) - ppew_b_coef(:) ) / (prhoa(:)*ppew_a_coef
2450 zustar2(:) = max( zustar2(:),0. )
2452 pustar2_ic(:) = zustar2(:)
2460 zsnowdzm1(:) = max( psnowdz1(:), psnowdzmin )
2461 zsnowdzm2(:) = max( psnowdz2(:), psnowdzmin )
2465 pct(:) = 1.0 / ( pscap(:)*zsnowdzm1(:) )
2474 zsconda(:) = ( zsnowdzm1(:)*pscond1(:) + zsnowdzm2(:)*pscond2(:) ) / &
2475 ( zsnowdzm1(:) + zsnowdzm2(:) )
2482 z_ccoef(:) = 1.0 - ppeq_a_coef(:) * prsra(:)
2484 ppeq_a_coef_t(:) = - ppeq_a_coef(:) * prsra(:) * pdqsat(:) / z_ccoef(:)
2486 ppeq_b_coef_t(:) = ( ppeq_b_coef(:) &
2487 - ppeq_a_coef(:) * prsra(:) * (pqsat(:) - pdqsat(:)*pts
2492 z_ccoef(:) = ( 1.0 - ppet_a_coef(:) * prsra(:) ) / pexna(:)
2494 ppet_a_coef_t(:) = - ppet_a_coef(:) * prsra(:) / ( pexns(:) * z_ccoef(:)
2496 ppet_b_coef_t(:) = ppet_b_coef(:) / z_ccoef(:)
2501 zts3(:) = pemist(:) *
xstefan * pts(:)**3
2502 zlvt(:) = (1.-psfcfrz(:))*
xlvtt + psfcfrz(:)*
xlstt 2504 za(:) = 1./ptstep + pct(:) * &
2505 ( 4. * zts3(:) + prsra(:) * zlvt(:) * ( pdqsat(:) - ppeq_a_coef_t
2509 zb(:) = 1./ptstep + pct(:) * &
2510 ( 3. * zts3(:) + prsra(:) * zlvt(:) * pdqsat(:) )
2512 zc(:) = pct(:) * ( - prsra(:) * zlvt(:) * ( pqsat(:) - ppeq_b_coef_t(:)
2521 ptsterm2(:) = 2. * zsconda(:) * pct(:) / ( za(:) * (zsnowdzm2(:)+zsnowdzm1
2523 ptsterm1(:) = ( pts(:)*zb(:) + zc(:) ) / za(:)
2532 PSNOWDZ,PSCOND,PSCAP,PTG, &
2534 PRADSINK,PCT,PTERM1,PTERM2, &
2535 PPET_A_COEF_T,PPEQ_A_COEF_T, &
2536 PPET_B_COEF_T,PPEQ_B_COEF_T, &
2538 PGBAS,PSNOWTEMP,PSNOWFLUX, &
2574 REAL,
INTENT(IN) :: PTSTEP, PSNOWDZMIN
2576 REAL,
DIMENSION(:),
INTENT(IN) :: PTG, PSOILCOND, PD_G, &
2580 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWDZ, PSCOND, PSCAP, &
2583 REAL,
DIMENSION(:),
INTENT(IN) :: PPET_A_COEF_T, PPEQ_A_COEF_T, &
2584 PPET_B_COEF_T, PPEQ_B_COEF_T
2586 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWTEMP
2588 REAL,
DIMENSION(:),
INTENT(OUT) :: PGBAS, PSNOWFLUX, PTA_IC, PQA_IC
2590 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
2594 REAL,
DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)) :: ZSNOWTEMP, ZDTERM, ZCTERM
2598 REAL,
DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)) :: ZWORK1, ZWORK2, ZDZDIF
2601 REAL,
DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)-1) :: ZSNOWTEMP_M,
2605 REAL,
DIMENSION(SIZE(PTG)) :: ZGBAS, ZSNOWTEMP_DELTA
2610 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2617 zsnowtemp(:,:) = psnowtemp(:,:)
2618 inlvls =
SIZE(psnowdz(:,:),2)
2628 DO jst = knlvls_use(jj),1,-1
2630 zsnowdzm(jj,jst) = max( psnowdz(jj,jst), psnowdzmin )
2632 zwork1(jj,jst) = zsnowdzm(jj,jst) * pscond(jj,jst)
2634 IF ( jst<knlvls_use(jj) )
THEN 2636 zdzdif(jj,jst) = zsnowdzm(jj,jst) + zsnowdzm(jj,jst+1)
2638 zwork2(jj,jst) = zsnowdzm(jj,jst+1) * pscond(jj,jst+1)
2642 zdzdif(jj,jst) = zsnowdzm(jj,jst) + pd_g(jj)
2644 zwork2(jj,jst) = pd_g(jj) * psoilcond(jj)
2648 zdterm(jj,jst) = 2.0 * ( zwork1(jj,jst) + zwork2(jj,jst) ) / zdzdif(jj
2650 zcterm(jj,jst) = pscap(jj,jst) * zsnowdzm(jj,jst) / ptstep
2666 zbmtrx(:,1) = 1. / ( pct(:)*ptstep )
2667 zcmtrx(:,1) = - pterm2(:) * zbmtrx(:,1)
2668 zfrcv(:,1) = pterm1(:) * zbmtrx(:,1)
2672 DO jst = 2,knlvls_use(jj)
2675 zamtrx(jj,jst) = -zdterm(jj,jst-1)
2676 zbmtrx(jj,jst) = zcterm(jj,jst) + zdterm(jj,jst-1) + zdterm(jj,jst)
2679 IF ( jst<knlvls_use(jj) )
THEN 2680 zcmtrx(jj,jst) = -zdterm(jj,jst)
2682 zcmtrx(jj,jst) = 0.0
2683 zfrcv(jj,jst) = zfrcv(jj,jst) + zdterm(jj,jst)*ptg(jj)
2697 psnowflux(:) = zdterm(:,1) * ( zsnowtemp(:,1) - zsnowtemp(:,2) )
2709 zbmtrx_m(:,1) = zcterm(:,2) + zdterm(:,1) + zdterm(:,2)
2710 zcmtrx_m(:,1) = -zdterm(:,2)
2711 zfrcv_m(:,1) = zcterm(:,2)*psnowtemp(:,2) - (pradsink(:,1)-pradsink(:,
2714 DO jst = 2,knlvls_use(jj)-1
2715 zamtrx_m(jj,jst) = zamtrx(jj,jst+1)
2716 zbmtrx_m(jj,jst) = zbmtrx(jj,jst+1)
2717 zcmtrx_m(jj,jst) = zcmtrx(jj,jst+1)
2718 zfrcv_m(jj,jst) = zfrcv(jj,jst+1)
2719 zsnowtemp_m(jj,jst) = psnowtemp(jj,jst+1)
2728 zsnowtemp_delta(:) = 0.0
2730 WHERE( zsnowtemp(:,1)>
xtt .AND. psnowtemp(:,1)>=
xtt )
2731 psnowflux(:) = zdterm(:,1) * (
xtt-zsnowtemp_m(:,1) )
2732 zsnowtemp_delta(:) = 1.0
2736 DO jst = 2,knlvls_use(jj)
2737 zsnowtemp(jj,jst) = zsnowtemp_delta(jj) * zsnowtemp_m(jj,jst-1
2750 zgbas(jj) = zdterm(jj,knlvls_use(jj)) * ( zsnowtemp(jj,knlvls_use(jj))
2760 psnowtemp(jj,1:knlvls_use(jj)) = zsnowtemp(jj,1:knlvls_use(jj))
2767 pta_ic(:) = ppet_b_coef_t(:) + ppet_a_coef_t(:) * psnowtemp(:,1)
2769 pqa_ic(:) = ppeq_b_coef_t(:) + ppeq_a_coef_t(:) * psnowtemp(:,1)
2778 PSNOWRHO,PSNOWLIQ,KNLVLS_USE )
2796 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSCAP
2798 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWDZ, PSNOWTEMP, PSNOWRHO, &
2801 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
2805 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZPHASE, ZCMPRSFACT
2811 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2818 DO jj = 1,
SIZE(psnowdz,1)
2819 DO jst = 1,knlvls_use(jj)
2820 zphase (jj,jst) = 0.0
2821 zcmprsfact(jj,jst) = 0.0
2822 zsnowlwe (jj,jst) = 0.0
2823 zsnowmelt (jj,jst) = 0.0
2824 zsnowtemp (jj,jst) = 0.0
2831 DO jj = 1,
SIZE(psnowdz,1)
2833 DO jst = 1,knlvls_use(jj)
2835 ! total liquid equivalent water content of snow(m):
2836 zsnowlwe(jj,jst) = psnowrho(jj,jst) * psnowdz(jj,jst) /
xrholw 2838 ! melt snow
if excess energy and snow available:
2839 ! phase change(j/m2)
2840 zphase(jj,jst) = min( pscap(jj,jst) * max(0.0,psnowtemp(jj,jst)-
xtt 2844 ! liquid water available for next layer from melting of snow
2845 ! which is assumed to be leaving the current layer(m):
2846 zsnowmelt(jj,jst) = zphase(jj,jst) / (
xlmtt*
xrholw)
2848 ! cool off snow layer temperature due to melt:
2849 zsnowtemp(jj,jst) = psnowtemp(jj,jst) - zphase(jj,jst) / (pscap(jj,jst
2856 IF (psnowtemp(jj,jst)-
xtt >
xuepsi)
THEN 2857 WRITE(*,*)
'pb dans MELT PSNOWTEMP(JJ,JST) >XTT:', jj,jst, psnowtemp
2869 zcmprsfact(jj,jst) = ( zsnowlwe(jj,jst) - (psnowliq(jj,jst)+zsnowmelt
2877 psnowliq(jj,jst) = psnowliq(jj,jst) + zsnowmelt(jj,jst)
2889 PSNOWRHO,PSNOWTEMP,PSNOWDZ,PSNOWLIQ, &
2890 PTHRUFAL, PSCAP, PLEL3L,KNLVLS_USE )
2899 USE modd_snow_par
, ONLY : xsnowdmin
2907 REAL,
INTENT(IN) :: PTSTEP
2909 REAL,
DIMENSION(:),
INTENT(IN) :: PRR
2911 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWDZ, PSNOWTEMP, PSNOWLIQ, PSNOWRHO
2913 REAL,
DIMENSION(:),
INTENT(INOUT) :: PTHRUFAL
2916 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
2917 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSCAP
2918 REAL,
DIMENSION(:),
INTENT(IN) :: PLEL3L
2922 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZPHASE,
2927 REAL,
DIMENSION(SIZE(PSNOWRHO,1),0:SIZE(PSNOWRHO,2)) :: ZFLOWLIQ
2929 REAL :: ZDENOM, ZNUMER
2934 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2942 inlvls =
SIZE(psnowdz,2)
2944 DO jj=1,
SIZE(psnowdz,1)
2945 DO jst=1,knlvls_use(jj)
2946 zsnowrho(jj,jst) = psnowrho(jj,jst)
2947 zsnowtemp(jj,jst) = psnowtemp(jj,jst)
2948 zwholdmax(jj,jst) = xpercentagepore/
xrholi * (psnowdz(jj,jst) * &
2953 DO jj = 1,
SIZE(psnowdz,1)
2961 IF ( knlvls_use(jj)>0. )
THEN 2962 zflowliq(jj,0) = prr(jj) * ptstep /
xrholw 2963 zflowliq(jj,0) = max(0., zflowliq(jj,0) - plel3l(jj)*ptstep/(xlvtt*
xrholw 2968 DO jst=1,knlvls_use(jj)
2972 psnowliq(jj,jst) = psnowliq(jj,jst) + zflowliq(jj,jst-1)
2978 zphase(jj,jst) = min( pscap(jj,jst)* max(0.0,
xtt - zsnowtemp(jj,jst
2982 zsnowliq(jj,jst) = psnowliq(jj,jst) - zphase(jj,jst)/(
xlmtt*
xrholw)
2985 zsnowdz(jj,jst) = max(xsnowdmin/inlvls, psnowdz(jj,jst))
2990 znumer = ( zsnowrho(jj,jst) * zsnowdz(jj,jst) - ( psnowliq(jj,jst)
2993 psnowtemp(jj,jst) =
xtt + ( zsnowtemp(jj,jst)-
xtt )*znumer/zdenom + zphase
3000 zflowliq(jj,jst) = max( 0., zsnowliq(jj,jst)-zwholdmax(jj,jst) )
3002 zsnowliq(jj,jst) = zsnowliq(jj,jst) - zflowliq(jj,jst)
3006 znumer = ( zsnowrho(jj,jst) * psnowdz(jj,jst) - ( zflowliq(jj,jst)
3008 zsnowrho(jj,jst) = znumer / zsnowdz(jj,jst)
3011 IF ( zsnowrho(jj,jst)>
xrholi )
THEN 3012 psnowdz(jj,jst) = psnowdz(jj,jst) * zsnowrho(jj,jst) /
xrholi 3013 zsnowrho(jj,jst) =
xrholi 3018 psnowrho(jj,jst) = zsnowrho(jj,jst)
3019 psnowliq(jj,jst) = zsnowliq(jj,jst)
3028 pthrufal(jj) = pthrufal(jj) + zflowliq(jj,knlvls_use(jj)) *
xrholw / ptstep
3036 SUBROUTINE get_rho(PRHO_IN,PDZ,PSNOWLIQ,PFLOWLIQ,PRHO_OUT)
3042 REAL,
INTENT(IN) :: PRHO_IN, PDZ, PSNOWLIQ,PFLOWLIQ
3043 REAL,
INTENT(OUT) :: PRHO_OUT
3045 REAL(KIND=JPRB) :: ZHOOK_HANDLE
3047 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_RHO',0,zhook_handle)
3049 prho_out = ( prho_in * pdz - ( psnowliq - pflowliq ) *
xrholw )
3051 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_RHO',1,zhook_handle)
3056 SUBROUTINE snowcroflux(PSNOWTEMP,PSNOWDZ,PEXNS,PEXNA, &
3058 PTSTEP,PALBT,PSW_RAD,PEMIST,PLWUPSNOW, &
3059 PLW_RAD,PTA,PSFCFRZ,PQA,PHPSNOW, &
3060 PSNOWTEMPO1,PSNOWFLUX,PCT,PRADSINK, &
3061 PQSAT,PDQSAT,PRSRA, &
3062 PRN,PH,PGFLUX,PLES3L,PLEL3L,PEVAP, &
3078 REAL,
INTENT(IN) :: PTSTEP
3080 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWDZ, PSNOWTEMPO1, PSNOWFLUX, PCT
3083 REAL,
DIMENSION(:),
INTENT(IN) :: PALBT, PSW_RAD, PEMIST, PLW_RAD,
3088 REAL,
DIMENSION(:),
INTENT(INOUT) :: PSNOWTEMP
3090 REAL,
DIMENSION(:),
INTENT(OUT) :: PRN, PH, PGFLUX, PLES3L, PLEL3L,
3095 REAL,
DIMENSION(SIZE(PSNOWDZ)) :: ZEVAPC, ZSNOWTEMP
3096 REAL :: ZSMSNOW, ZGFLUX
3100 REAL(KIND=JPRB) :: ZHOOK_HANDLE
3110 DO jj = 1,
SIZE(palbt)
3112 CALL get_flux(palbt(jj),pemist(jj),psw_rad(jj),plw_rad(jj), &
3113 pexns(jj),pexna(jj),pta(jj),pqa(jj),prsra(jj), &
3114 pqsat(jj),pdqsat(jj),psfcfrz(jj),phpsnow(jj), &
3115 psnowtemp(jj),psnowtempo1(jj), &
3116 prn(jj),ph(jj),zevapc(jj), &
3117 ples3l(jj),plel3l(jj),zgflux )
3119 IF ( psnowtemp(jj)>
xtt )
THEN 3121 IF ( psnowtempo1(jj)<
xtt )
THEN 3135 CALL get_flux(palbt(jj),pemist(jj),psw_rad(jj),plw_rad(jj), &
3136 pexns(jj),pexna(jj), pta(jj),pqa(jj),prsra(jj), &
3137 pqsat(jj),pdqsat(jj),psfcfrz(jj),phpsnow(jj), &
3138 xtt,psnowtempo1(jj), &
3139 prn(jj),ph(jj),zevapc(jj), &
3140 ples3l(jj),plel3l(jj),pgflux(jj) )
3142 zsmsnow = zgflux - pgflux(jj)
3145 zsnowtemp(jj) = psnowtemp(jj) - zsmsnow * ptstep * pct(jj)
3155 CALL get_flux(palbt(jj),pemist(jj),psw_rad(jj),plw_rad(jj), &
3156 pexns(jj),pexna(jj), pta(jj),pqa(jj),prsra(jj), &
3157 pqsat(jj),pdqsat(jj),psfcfrz(jj),phpsnow(jj), &
3159 prn(jj),ph(jj),zevapc(jj), &
3160 ples3l(jj),plel3l(jj),pgflux(jj) )
3162 zsnowtemp(jj) =
xtt + ptstep * pct(jj) * ( pgflux(jj) + pradsink(jj
3168 zsnowtemp(jj) = psnowtemp(jj)
3179 psnowtemp(:) = zsnowtemp(:)
3183 pevap(:) = zevapc(:)
3189 pustar(:) = sqrt(pustar2_ic(:))
3195 SUBROUTINE get_flux(PALBT,PEMIST,PSW_RAD,PLW_RAD,PEXNS,PEXNA, &
3196 PTA,PQA,PRSRA,PQSAT,PDQSAT,PSFCFRZ,PHPSNOW, &
3197 PSNOWTEMP,PSNOWTEMPO1, &
3198 PRN,PH,PEVAPC,PLES3L,PLEL3L,PGFLUX )
3204 REAL,
INTENT(IN) :: PALBT, PEMIST
3205 REAL,
INTENT(IN) :: PSW_RAD, PLW_RAD
3206 REAL,
INTENT(IN) :: PEXNS, PEXNA
3207 REAL,
INTENT(IN) :: PTA, PQA, PRSRA, PQSAT, PDQSAT, PSFCFRZ, PHPSNOW
3208 REAL,
INTENT(IN) :: PSNOWTEMP,PSNOWTEMPO1
3209 REAL,
INTENT(OUT):: PRN, PH, PEVAPC, PLES3L, PLEL3L, PGFLUX
3211 REAL :: ZLE, ZDELTAT, ZLWUPSNOW, ZSNOWTO3
3213 REAL(KIND=JPRB) :: ZHOOK_HANDLE
3215 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_FLUX',0,zhook_handle)
3217 zsnowto3 = psnowtempo1**3
3219 zdeltat = psnowtemp - psnowtempo1
3221 zlwupsnow = pemist *
xstefan * zsnowto3 * ( psnowtempo1 + 4.*zdeltat )
3223 prn = ( 1.-palbt )*psw_rad + pemist*plw_rad - zlwupsnow
3225 ph = prsra *
xcpd * ( psnowtemp/pexns - pta/pexna )
3227 pevapc = prsra * ( (pqsat - pqa) + pdqsat*zdeltat )
3229 ples3l = psfcfrz *
xlstt * pevapc
3231 plel3l = (1.-psfcfrz) *
xlvtt * pevapc
3233 zle = ples3l + plel3l
3235 pgflux = prn - ph - zle + phpsnow
3237 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_FLUX',1,zhook_handle)
3243 SUBROUTINE snowcroevapn(PLES3L,PTSTEP,PSNOWTEMP,PSNOWRHO, &
3244 PSNOWDZ,PEVAPCOR,PSNOWHMASS )
3264 REAL,
INTENT(IN) :: PTSTEP
3266 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWTEMP
3268 REAL,
DIMENSION(:),
INTENT(IN) :: PLES3L
3270 REAL,
DIMENSION(:),
INTENT(INOUT) :: PSNOWRHO, PSNOWDZ, PSNOWHMASS, &
3275 REAL,
DIMENSION(SIZE(PLES3L)) :: ZSNOWEVAPS, ZSNOWEVAP, ZSNOWEVAPX
3283 REAL(KIND=JPRB) :: ZHOOK_HANDLE
3296 WHERE ( psnowdz>0.0 )
3304 zsnowevaps(:) = ples3l(:) * ptstep / (
xlstt*psnowrho(:) )
3305 zsnowdz(:) = psnowdz(:) - zsnowevaps(:)
3306 psnowdz(:) = max( 0.0, zsnowdz(:) )
3307 zevapcor(:) = zevapcor(:) + max(0.0,-zsnowdz(:)) * psnowrho(:) / ptstep
3312 psnowhmass(:) = psnowhmass(:) &
3313 - ples3l(:) * (ptstep/
xlstt) * (
xci * (psnowtemp(:)-
xtt 3320 pevapcor(:) = pevapcor(:) + zevapcor(:)
3330 SUBROUTINE snowcrogone(PTSTEP,PLEL3L,PLES3L,PSNOWRHO, &
3331 PSNOWHEAT,PRADSINK_2D,PEVAPCOR,PTHRUFAL,PGRNDFLUX, &
3332 PGFLUXSNOW,PSNOWDZ,PSNOWLIQ,PSNOWTEMP,PRADXS, &
3351 REAL,
INTENT(IN) :: PTSTEP
3353 REAL,
DIMENSION(:),
INTENT(IN) :: PLEL3L, PLES3L, PGFLUXSNOW,PRR
3355 REAL,
DIMENSION(:,:),
INTENT(IN) :: PRADSINK_2D
3357 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO, PSNOWHEAT
3359 REAL,
DIMENSION(:),
INTENT(INOUT) :: PGRNDFLUX, PRADXS
3361 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWDZ, PSNOWLIQ, PSNOWTEMP
3363 REAL,
DIMENSION(:),
INTENT(OUT) :: PTHRUFAL
3365 REAL,
DIMENSION(:),
INTENT(OUT) :: PEVAPCOR
3372 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: KNLVLS_USE
3376 REAL,
DIMENSION(SIZE(PLES3L)) :: ZRADSINK
3377 REAL,
DIMENSION(SIZE(PLES3L)) :: ZSNOWHEATC
3378 INTEGER,
DIMENSION(SIZE(PLES3L)) :: ISNOWGONE_DELTA
3382 REAL(KIND=JPRB) :: ZHOOK_HANDLE
3392 DO jj = 1,
SIZE(zradsink)
3393 zradsink(jj) = pradsink_2d(jj,inlvls_use(jj))
3394 zsnowheatc(jj) =
sum(psnowheat(jj,1:inlvls_use(jj)))
3397 isnowgone_delta(:) = 1
3408 zsnowheatc(:) = zsnowheatc(:) + max( 0., ples3l(:)*ptstep/
xlstt ) * xlmtt
3410 WHERE ( pgfluxsnow(:)+zradsink(:)-pgrndflux(:) >= (-zsnowheatc(:)/ptstep
3423 DO jj=1,
SIZE(zradsink)
3425 IF(isnowgone_delta(jj) == 0 )
THEN 3426 pthrufal(jj) = pthrufal(jj) + &
3427 sum( psnowrho(jj,1:inlvls_use(jj))*psnowdz(jj,1:inlvls_use
3429 pthrufal(jj) = pthrufal(jj) + prr(jj) - plel3l(jj)/
xlvtt 3430 psnowtemp(jj,:) =
xtt 3444 SUBROUTINE snowcroevapgone(PSNOWHEAT,PSNOWDZ,PSNOWRHO,PSNOWTEMP,PSNOWLIQ, &
3445 PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST,PSNOWAGE,KNLVLS_USE,&
3460 USE modd_snow_par
, ONLY : xrhosmin_es, xsnowdmin, xrhosmax_es
3469 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWRHO
3470 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWDZ
3471 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWHEAT
3472 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWGRAN1
3473 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWGRAN2
3474 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWHIST
3475 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWAGE
3477 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWTEMP
3478 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWLIQ
3480 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
3481 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
3485 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: ZSNOWHEAT_1D
3486 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: ZSNOWRHO_1D
3487 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: ZSNOW
3488 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: ZSCAP
3489 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: ZNDENT
3490 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: ZNVIEU
3491 REAL,
DIMENSION(SIZE(PSNOWDZ,1)) :: ZSNOWAGE_1D
3493 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWGRAN1N,
3496 LOGICAL :: GDENDRITIC
3500 REAL(KIND=JPRB) :: ZHOOK_HANDLE
3502 IF (
lhook)
CALL dr_hook(
'SNOWCROEVAPGONE',0,zhook_handle)
3506 zsnowheat_1d(:) = 0.
3516 DO jj = 1,
SIZE(psnowrho,1)
3518 IF ( psnowdz(jj,1)==0.0 )
THEN 3520 DO jst = 2,knlvls_use(jj)
3522 zsnowheat_1d(jj) = zsnowheat_1d(jj) + psnowdz(jj,jst) * &
3523 ( psnowrho(jj,jst)*
xci * (zsnowtemp(jj,jst)-
xtt 3531 IF ( hsnowmetamo==
'B92' )
THEN 3532 gdendritic = ( psnowgran1(jj,jst)<-
xepsi )
3534 gdendritic = ( psnowgran1(jj,jst)<
xvdiam6*(4.-psnowgran2(jj,jst
3537 IF ( gdendritic )
THEN 3538 zndent(jj) = zndent(jj) + 1.0
3540 znvieu(jj) = znvieu(jj) + 1.0
3549 zsnowrho_1d(:) = zsnowrho_1d(:) / max( xsnowdmin, zsnow(:) )
3550 zsnowage_1d(:) = zsnowage_1d(:) / max( xsnowdmin, zsnow(:) * zsnowrho_1d
3557 zsnowgran1n,zsnowgran2n,zsnowhistn,zndent,znvieu,&
3560 DO jj=1,
SIZE(psnowrho,1)
3562 IF( zsnow(jj)/=0.0 )
THEN 3564 psnowdz(jj,1:knlvls_use(jj)) = zsnow(jj) / knlvls_use(jj)
3565 psnowheat(jj,1:knlvls_use(jj)) = zsnowheat_1d(jj) / knlvls_use(jj)
3566 psnowrho(jj,1:knlvls_use(jj)) = zsnowrho_1d(jj)
3568 zscap(jj) = zsnowrho_1d(jj) *
xci 3570 DO jst = 1,knlvls_use(jj)
3572 psnowtemp(jj,jst) =
xtt + ( ( (psnowheat(jj,jst)/psnowdz(jj,jst))
3576 psnowliq(jj,jst) = max( 0.0, psnowtemp(jj,jst)-
xtt ) * zscap(jj)
3585 IF (
lhook)
CALL dr_hook(
'SNOWCROEVAPGONE',1,zhook_handle)
3593 PSNOW,PSNOWRHO,PSNOWDZ,PSNOWHEAT,PSNOWHMASS, &
3594 PSNOWALB,PPERMSNOWFRAC,PSNOWGRAN1,PSNOWGRAN2, &
3595 GSNOWFALL,PSNOWDZN,PSNOWRHOF,PSNOWDZF, &
3596 PSNOWGRAN1F,PSNOWGRAN2F,PSNOWHISTF,PSNOWAGEF, &
3597 OMODIF_GRID,KNLVLS_USE,OSNOWDRIFT,PZ0EFF,PUREF,&
3624 USE modd_snow_par
, ONLY : xrhosmin_es, xsnowdmin, xansmax, xaglamax, xsnowcritd, &
3625 xdzmin_top, xdzmin_top_bis, xdzmin_bot, xsplit_coef, &
3626 xagreg_coef_1, xagreg_coef_2, xdz1, xdz2, xdz3, xdz3_bis,&
3627 xdz4, xdz5, xdz_base, xdz_internal, xscale_cm, &
3628 xdzmax_internal, xdzmin_top_extrem, xsnowfall_threshold, &
3629 xratio_newlayer, xdepth_threshold1, xdepth_threshold2, &
3630 xdepth_surface, xdiff_1, xdiff_max, xscale_diff, &
3631 xsnowfall_a_sn, xsnowfall_b_sn, xsnowfall_c_sn
3640 LOGICAL,
INTENT(IN) :: OGLACIER
3645 REAL,
INTENT(IN) :: PTSTEP
3647 REAL,
DIMENSION(:),
INTENT(IN) :: PSR, PTA, PVMOD, PPERMSNOWFRAC
3649 REAL,
DIMENSION(:),
INTENT(IN) :: PZ0EFF,PUREF
3651 REAL,
DIMENSION(:),
INTENT(INOUT) :: PSNOW, PSNOWALB
3653 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO, PSNOWDZ, PSNOWHEAT
3655 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOWHMASS
3657 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWGRAN1, PSNOWGRAN2
3659 LOGICAL,
DIMENSION(:),
INTENT(INOUT) :: GSNOWFALL
3662 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOWRHOF, PSNOWDZF
3663 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOWGRAN1F, PSNOWGRAN2F, PSNOWHISTF
3664 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOWAGEF
3666 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PSNOWDZN
3668 LOGICAL,
DIMENSION(:),
INTENT(OUT) :: OMODIF_GRID
3670 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: KNLVLS_USE
3672 LOGICAL,
INTENT(IN) :: OSNOWDRIFT
3673 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
3677 LOGICAL,
DIMENSION(SIZE(PTA)) :: GAGREG_SURF
3679 REAL,
DIMENSION(SIZE(PTA)) :: ZSNOWFALL, ZSNOWTEMP, ZSCAP, ZANSMAX
3681 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZDZOPT
3686 REAL :: ZSNOW_UPPER, ZSNOW_UPPER2
3688 REAL :: ZTHICKNESS_INTERMEDIATE, ZTHICKNESS2
3689 REAL :: ZPENALTY, ZDIFTYPE_INF, ZDIFTYPE_SUP, ZCRITSIZE, ZCRITSIZE_INF, ZCRITSIZE_SUP
3690 REAL :: ZSNOW2L, ZCOEF
3692 INTEGER :: INB_DEEP_LAYER, INB_UPPER_LAYER
3694 INTEGER :: INB_MIN_LAYERS
3695 INTEGER :: INB_INTERMEDIATE
3696 INTEGER :: IEND_INTERMEDIATE
3697 INTEGER :: JSTDEEP, JSTEND
3698 INTEGER :: JST_1, JJ_A_AGREG_SUP, JJ_A_AGREG_INF, JJ_A_DEDOUB
3699 INTEGER :: INLVLS, INLVLSMIN, INLVLSMAX, JJ, JST
3707 REAL,
PARAMETER :: PPHREF_WIND_RHO = 10.
3708 REAL,
PARAMETER :: PPHREF_WIND_GRAIN = 5.
3709 REAL,
PARAMETER :: PPHREF_WIND_MIN = min(pphref_wind_rho
3710 REAL,
DIMENSION(SIZE(PTA)) :: ZWIND_RHO
3711 REAL,
DIMENSION(SIZE(PTA)) :: ZWIND_GRAIN
3713 REAL(KIND=JPRB) :: ZHOOK_HANDLE
3717 IF (
lhook)
CALL dr_hook(
'SNOWNLFALL_UPGRID',0,zhook_handle)
3719 inlvls =
SIZE (psnowrho(:,:),2)
3720 inlvlsmax =
SIZE (psnowrho(:,:),2)
3726 gsnowfall(:) =.false.
3727 gagreg_surf(:) =.false.
3732 psnowgran1f(:) = 0.0
3733 psnowgran2f(:) = 0.0
3735 psnowdzn(:,:) = psnowdz(:,:)
3737 omodif_grid(:) = .false.
3748 inb_min_layers = 2 + inlvlsmax/3
3750 DO jj = 1,
SIZE(psnow(:))
3752 IF ( psnow(jj)>xdepth_threshold2 .AND. knlvls_use(jj)>inb_min_layers )
THEN 3759 inb_deep_layer = ( knlvls_use(jj) + inlvlsmax ) / 6
3762 inb_upper_layer = knlvls_use(jj) - inb_deep_layer
3765 zsnow_upper = xdepth_surface
3768 zcoef_depth = ( psnow(jj) - xdepth_surface ) * 2. / ( (inb_deep_layer
3772 DO jstdeep = 1,inb_deep_layer
3773 jst = inb_upper_layer + jstdeep
3774 zdzopt(jj,jst) = zcoef_depth * jstdeep
3780 inb_upper_layer = knlvls_use(jj)
3782 zsnow_upper = psnow(jj)
3790 zsnow_upper2 = zsnow_upper / max( inlvlsmin, inb_upper_layer )
3792 zdzopt(jj,1) = min( xdz1, zsnow_upper2 )
3793 IF ( knlvls_use(jj)>=2 ) zdzopt(jj,2) = min( xdz2, zsnow_upper2 )
3794 IF ( knlvls_use(jj)>=3 ) zdzopt(jj,3) = min( xdz3, zsnow_upper2 )
3796 IF ( inb_upper_layer>0 )
THEN 3798 zsnow_upper2 = zsnow_upper / inb_upper_layer
3804 IF ( inb_upper_layer>=3 ) zdzopt(jj,3) = min( xdz3_bis, zsnow_upper2
3805 IF ( inb_upper_layer>=4 ) zdzopt(jj,4) = min( xdz4 , zsnow_upper2
3806 IF ( inb_upper_layer>=5 ) zdzopt(jj,5) = min( xdz5 , zsnow_upper2
3808 IF ( inb_upper_layer==knlvls_use(jj) )
THEN 3814 zdzopt(jj,inb_upper_layer) = min( xdz_base, zsnow_upper/max(inlvlsmin
3819 zthickness_intermediate = zsnow_upper -
sum(zdzopt(jj,1:5)) - zdzopt
3821 IF ( zsnow_upper<=xdepth_threshold1 .OR. inb_upper_layer<8 )
THEN 3827 inb_intermediate = inb_upper_layer - 8
3828 iend_intermediate = inb_upper_layer - 3
3830 IF ( inb_intermediate>0 )
THEN 3831 zthickness_intermediate = zthickness_intermediate * inb_intermediate
3841 zthickness_intermediate = zsnow_upper -
sum(zdzopt(jj,1:5))
3842 inb_intermediate = inb_upper_layer - 5
3843 iend_intermediate = inb_upper_layer
3849 IF ( inb_intermediate>0 )
THEN 3851 zthickness2 = max( xdz_internal, zthickness_intermediate/inb_intermediate
3853 jstend = min( iend_intermediate,10 )
3855 zdzopt(jj,jst) = min( xdzmax_internal(jst-5), zthickness2 )
3858 IF ( iend_intermediate>10 )
THEN 3859 DO jst = 11,iend_intermediate
3860 zdzopt(jj,jst) = zthickness2
3866 IF ( zsnow_upper>=xdepth_threshold1 .AND. inb_upper_layer>=8 )
THEN 3868 zdzopt(jj,inb_upper_layer-2) = 0.34*zdzopt(jj,inb_upper_layer) + &
3869 0.66*zdzopt(jj,inb_upper_layer-3)
3870 zdzopt(jj,inb_upper_layer-1) = 0.66*zdzopt(jj,inb_upper_layer) + &
3871 0.34*zdzopt(jj,inb_upper_layer-3)
3917 DO jj = 1,
SIZE(psnow(:))
3919 IF ( psr(jj)>0.0 )
THEN 3922 IF ( knlvls_use(jj)>0 )
THEN 3923 zscap(jj) =
xci*psnowrho(jj,1)
3924 zsnowtemp(jj) =
xtt + ( psnowheat(jj,1) +
xlmtt*psnowrho(jj,1)*psnowdz
3927 zsnowtemp(jj) = pta(jj)
3929 zsnowtemp(jj) = min(
xtt, zsnowtemp(jj) )
3937 zz0eff=min(pz0eff(jj),puref(jj)*0.5,pphref_wind_min)
3939 zwind_rho(jj) = pvmod(jj)*log(pphref_wind_rho/zz0eff)/ &
3940 log(puref(jj)/zz0eff)
3941 zwind_grain(jj) = pvmod(jj)*log(pphref_wind_grain/zz0eff)/ &
3942 log(puref(jj)/zz0eff)
3944 psnowhmass(jj) = psr(jj) * (
xci * ( zsnowtemp(jj)-
xtt ) -
xlmtt ) *
3946 psnowrhof(jj) = max( xrhosmin_es, xsnowfall_a_sn + &
3947 xsnowfall_b_sn * ( pta(jj)-
xtt )
3950 psnow(jj) = psnow(jj) + zsnowfall(jj)
3951 psnowdzf(jj) = zsnowfall(jj)
3953 IF ( hsnowmetamo==
'B92' )
THEN 3955 IF ( osnowdrift )
THEN 3956 psnowgran1f(jj) = -
xgran 3965 IF ( osnowdrift )
THEN 3966 psnowgran1f(jj) = xvdiam6
3978 psnowhistf(jj) = 0.0
3980 gsnowfall(jj) = .true.
3981 omodif_grid(jj) = .true.
3990 zansmax(:) = xaglamax * ppermsnowfrac(:) + xansmax * (1.0-ppermsnowfrac
3992 zansmax(:) = xansmax
3995 WHERE( gsnowfall(:) .AND. abs(psnow(:)-zsnowfall(:))< 0.000001 )
3996 psnowalb(:) = zansmax(:)
4005 DO jj=1,
SIZE(psnow(:))
4007 IF( .NOT.gsnowfall(jj) .AND. psnow(jj)>=xsnowcritd .AND. knlvls_use(jj
THEN 4011 ELSEIF( psnow(jj)<xsnowcritd .OR. knlvls_use(jj)<inlvlsmin .OR. psnow(jj
THEN 4015 omodif_grid(jj) = .true.
4016 knlvls_use(jj) = max( inlvlsmin, min( inlvlsmax, int(psnow(jj)*xscale_cm
4022 omodif_grid(jj) = .true.
4023 zdiftype_sup =
snow3ldiftyp( psnowgran1(jj,1),psnowgran1f(jj), &
4024 psnowgran2(jj,1),psnowgran2f(jj),hsnowmetamo
4026 IF ( ( zdiftype_sup<xdiff_1 .AND. psnowdz(jj,1)< zdzopt(jj,
4036 psnowdzn(jj,1) = psnowdz(jj,1) + psnowdzf(jj)
4037 DO jst = knlvls_use(jj),2,-1
4038 psnowdzn(jj,jst) = psnowdz(jj,jst)
4041 ELSEIF ( knlvls_use(jj)<inlvlsmax )
THEN 4045 knlvls_use(jj)=knlvls_use(jj)+1
4047 IF ( psnowdzf(jj)>xratio_newlayer*psnowdz(jj,2) )
THEN 4050 psnowdzn(jj,1) = psnowdzf(jj)
4051 DO jst = knlvls_use(jj),2,-1
4052 psnowdzn(jj, jst) = psnowdz(jj,jst-1)
4058 zsnow2l = psnowdzf(jj) + psnowdz(jj,1)
4059 psnowdzn(jj,1) = xratio_newlayer * zsnow2l
4060 psnowdzn(jj,2) = (1.-xratio_newlayer) * zsnow2l
4061 DO jst = knlvls_use(jj),3,-1
4062 psnowdzn(jj,jst) = psnowdz(jj,jst-1)
4075 DO jst = 1,knlvls_use(jj)
4079 zcritsize_sup = xscale_diff * ( psnowdz(jj,jst) /zdzopt(jj,jst
4085 IF ( zdiftype_sup+zcritsize_sup<zpenalty )
THEN 4086 zpenalty = zdiftype_sup + zcritsize_sup
4087 jj_a_agreg_sup = jst - 1
4088 jj_a_agreg_inf = jst
4093 IF ( jst<knlvls_use(jj) )
THEN 4095 zcritsize_inf = xscale_diff * ( psnowdz(jj,jst) /zdzopt(jj,jst
4099 zdiftype_inf =
snow3ldiftyp( psnowgran1(jj,1),psnowgran1f(jj
4103 zpenalty = zdiftype_inf + zcritsize_inf
4105 zdiftype_inf =
snow3ldiftyp( psnowgran1(jj,jst+1),psnowgran1
4109 IF ( zdiftype_inf+zcritsize_inf<zpenalty )
THEN 4110 zpenalty = zdiftype_inf + zcritsize_inf
4111 jj_a_agreg_sup = jst
4112 jj_a_agreg_inf = jst + 1
4121 psnowdzn(jj,jj_a_agreg_inf) = psnowdz(jj,jj_a_agreg_inf) + psnowdz
4122 DO jst = jj_a_agreg_sup,2,-1
4123 psnowdzn(jj,jst) = psnowdz(jj,jst-1)
4125 psnowdzn(jj,1) = psnowdzf(jj)
4129 IF( psnowdzn(jj,1)<xratio_newlayer*psnowdzn(jj,2) )
THEN 4130 zsnow2l = psnowdzn(jj,1) + psnowdzn(jj,2)
4131 psnowdzn(jj,1) = xratio_newlayer * zsnow2l
4132 psnowdzn(jj,2) = (1.-xratio_newlayer) * zsnow2l
4143 IF ( inlvlsmin==inlvlsmax )
THEN 4147 DO jj = 1,
SIZE(psnow(:))
4149 IF ( .NOT.omodif_grid(jj) .AND. psnowdz(jj,1)<xdzmin_top )
THEN 4150 omodif_grid(jj) = .true.
4157 IF( .NOT.omodif_grid(jj) .AND. psnowdz(jj,inlvls)<xdzmin_top )
THEN 4158 omodif_grid(jj) = .true.
4168 DO jj=1,
SIZE(psnow(:))
4173 IF( .NOT.gsnowfall(jj) .AND. psnow(jj)>xsnowcritd .AND. &
4174 .NOT.omodif_grid(jj) .AND. psnowdz(jj,1)<xdzmin_top_bis )
THEN 4176 omodif_grid(jj) = .true.
4178 IF( knlvls_use(jj)>inlvlsmin )
THEN 4179 knlvls_use(jj) = knlvls_use(jj) - 1
4180 psnowdzn(jj,1) = psnowdz(jj,1) + psnowdz(jj,2)
4181 DO jst = 2,knlvls_use(jj)
4182 psnowdzn(jj,jst) = psnowdz(jj,jst+1)
4185 CALL get_snowdzn_deb(knlvls_use(jj),psnowdz(jj,:),zdzopt(jj,:),psnowdzn
4188 gagreg_surf(jj) = .true.
4196 IF( .NOT.gsnowfall(jj) .AND. psnow(jj)> xsnowcritd .AND.
4200 omodif_grid(jj) = .true.
4202 IF ( knlvls_use(jj)>inlvlsmin )
THEN 4203 knlvls_use(jj) = knlvls_use(jj) - 1
4204 psnowdzn(jj,knlvls_use(jj)) = psnowdz(jj,knlvls_use(jj)) + psnowdz
4206 CALL get_snowdzn_end(knlvls_use(jj),psnowdz(jj,:),zdzopt(jj,:),psnowdzn
4216 DO jj = 1,
SIZE(psnow(:))
4218 IF ( .NOT.omodif_grid(jj) .AND. inlvls_use(jj)<inlvls-3 )
THEN 4222 IF ( jst<=knlvls_use(jj) .AND. .NOT.omodif_grid(jj) )
THEN 4224 IF( psnowdz(jj,jst) > &
4225 ( xsplit_coef - float( inlvls-knlvls_use(jj) )/max( 1., float
4228 DO jst_1 = knlvls_use(jj)+1,jst+2,-1
4229 psnowdzn(jj,jst_1) = psnowdz(jj,jst_1-1)
4230 zdzopt(jj,jst_1) = zdzopt(jj,jst_1-1)
4234 IF ( jst/=1 .OR. psnowdz(jj,jst)<3.*zdzopt(jj,1) )
THEN 4235 psnowdzn(jj,jst+1) = 0.5*psnowdz(jj,jst)
4236 psnowdzn(jj,jst) = psnowdzn(jj,jst+1)
4240 psnowdzn(jj,1) = 1.5 * zdzopt(jj,1)
4241 psnowdzn(jj,2) = psnowdz(jj,jst) - psnowdzn(jj,1)
4244 knlvls_use(jj) = knlvls_use(jj) + 1
4245 omodif_grid(jj) = .true.
4263 DO jj = 1,
SIZE(psnow(:))
4265 IF ( .NOT.omodif_grid(jj) )
THEN 4269 IF ( jst<=knlvls_use(jj)-1 .AND. knlvls_use(jj)>inlvlsmin+1 .AND. .NOT.omodif_grid
THEN 4271 zdiftype_inf =
snow3ldiftyp( psnowgran1(jj,jst+1),psnowgran1(jj,
4276 IF( psnowdz(jj,jst) < zdzopt(jj,jst) * xagreg_coef_1 / zdiftype_inf
4280 psnowdzn(jj,jst) = psnowdz(jj,jst) + psnowdz(jj,jst+1)
4281 zdzopt(jj,jst) = zdzopt(jj,jst+1)
4282 DO jst_1 = jst+1,knlvls_use(jj)-1
4283 psnowdzn(jj,jst_1) = psnowdz(jj,jst_1+1)
4284 zdzopt(jj,jst_1) = zdzopt(jj,jst_1+1)
4286 knlvls_use(jj) = knlvls_use(jj)-1
4287 omodif_grid(jj)=.true.
4303 DO jj = 1,
SIZE(psnow(:))
4305 IF ( .NOT.gsnowfall(jj) .OR. knlvls_use(jj)<inlvlsmin+3 ) cycle
4307 IF( abs( psnowdzn(jj,knlvls_use(jj)) - psnowdz(jj,knlvls_use(jj)) ) > xuepsi
4310 IF( psnowdzn(jj,knlvls_use(jj))<xdzmin_top )
THEN 4312 knlvls_use(jj) = knlvls_use(jj)-1
4313 psnowdzn(jj,knlvls_use(jj)) = psnowdzn(jj,knlvls_use(jj)) + psnowdzn
4319 DO jst = knlvls_use(jj)-1,4,-1
4321 IF ( abs( psnowdzn(jj,jst) - psnowdz(jj,jst) ) > xuepsi )
EXIT 4323 IF ( psnowdzn(jj,jst)> 0.001 ) cycle
4326 psnowdzn(jj,jst-1) = psnowdzn(jj,jst) + psnowdzn(jj,jst-1)
4327 knlvls_use(jj) = knlvls_use(jj) - 1
4330 DO jst_1 = jst,inlvls_use(jj)
4331 psnowdzn(jj,jst_1) = psnowdz(jj,jst_1+1)
4332 zdzopt(jj,jst_1) = zdzopt(jj,jst_1+1)
4334 psnowdzn(jj,inlvls_use(jj)+1) = 0.
4346 DO jj = 1,
SIZE(psnow(:))
4348 IF ( abs(
sum( psnowdzn(jj,1:knlvls_use(jj)) ) - psnow(jj) ) > xuepsi
THEN 4350 WRITE(*,*)
'error in grid resizing', jj, knlvls_use(jj),
sum( psnowdzn
4353 WRITE( *,*)
'JJ , PSNOWDZ(JJ):',jj , psnowdz(jj,:)
4354 WRITE( *,*)
'JJ , PSNOWDZN(JJ):',jj , psnowdzn(jj,:)
4356 CALL abor1_sfx(
"SNOWCRO: error in grid resizing")
4362 IF (
lhook)
CALL dr_hook(
'SNOWNLFALL_UPGRID',1,zhook_handle)
4369 USE modd_snow_par
, ONLY : xdzmin_top, xdzmin_bot
4373 INTEGER,
INTENT(IN) :: KNLVLS
4374 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWDZ, PDZOPT
4375 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOWDZN
4377 REAL :: ZPENALTY, ZCRITSIZE
4378 INTEGER :: JJ_A_DEDOUB, JST
4380 REAL(KIND=JPRB) :: ZHOOK_HANDLE
4382 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_SNOWDZN_DEB',0,zhook_handle)
4384 zpenalty = psnowdz(2) / pdzopt(2)
4385 IF( psnowdz(2)<xdzmin_top ) zpenalty = 0.
4389 zcritsize = psnowdz(jst) / pdzopt(jst)
4390 IF ( jst==knlvls .AND. psnowdz(jst)<xdzmin_bot ) zcritsize = 0.
4391 IF ( zcritsize>zpenalty )
THEN 4392 zpenalty = zcritsize
4397 IF ( jj_a_dedoub==2 )
THEN 4398 psnowdzn(1) = 0.5 * ( psnowdz(1) + psnowdz(2) )
4399 psnowdzn(2) = psnowdzn(1)
4400 ELSE !
case splitted layer =/ 2
4401 psnowdzn(1) = psnowdz(1) + psnowdz(2)
4402 DO jst = 2,jj_a_dedoub-2
4403 psnowdzn(jst) = psnowdz(jst+1)
4405 psnowdzn(jj_a_dedoub-1) = 0.5 * psnowdz(jj_a_dedoub)
4406 psnowdzn(jj_a_dedoub) = psnowdzn(jj_a_dedoub-1)
4409 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_SNOWDZN_DEB',1,zhook_handle)
4416 USE modd_snow_par
, ONLY : xdzmin_top, xdzmin_bot
4420 INTEGER,
INTENT(IN) :: KNLVLS
4421 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWDZ, PDZOPT
4422 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOWDZN
4424 REAL :: ZPENALTY, ZCRITSIZE
4425 INTEGER :: JJ_A_DEDOUB, JST
4427 REAL(KIND=JPRB) :: ZHOOK_HANDLE
4429 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_SNOWDZN_END',0,zhook_handle)
4431 zpenalty = psnowdz(knlvls-2) / pdzopt(knlvls-2)
4432 jj_a_dedoub = knlvls - 2
4434 DO jst = max(1,knlvls-3),1,-1
4435 zcritsize = psnowdz(jst) / pdzopt(jst)
4436 IF ( jst==1 .AND. psnowdz(jst)<xdzmin_bot ) zcritsize = 0.
4437 IF ( zcritsize>zpenalty )
THEN 4438 zpenalty = zcritsize
4443 IF ( jj_a_dedoub==knlvls-1 )
THEN 4444 psnowdzn(knlvls) = 0.5 * (psnowdz(knlvls-1)+psnowdz(knlvls))
4445 psnowdzn(knlvls-1) = psnowdzn(knlvls)
4446 ELSE !
case splitted layer =/ 2
4447 psnowdzn(knlvls) = psnowdz(knlvls-1) + psnowdz(knlvls)
4448 DO jst = knlvls-1,jj_a_dedoub+2,-1
4449 psnowdzn(jst) = psnowdz(jst-1)
4451 psnowdzn(jj_a_dedoub+1) = 0.5 * psnowdz(jj_a_dedoub)
4452 psnowdzn(jj_a_dedoub ) = psnowdzn(jj_a_dedoub+1)
4455 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_SNOWDZN_END',1,zhook_handle)
4464 PSNOWRHO,PSNOWHEAT,PSNOWGRAN1,PSNOWGRAN2, &
4465 PSNOWHIST,PSNOWAGE,GSNOWFALL, &
4466 PSNOWRHOF, PSNOWDZF,PSNOWHEATF,PSNOWGRAN1F, &
4467 PSNOWGRAN2F, PSNOWHISTF,PSNOWAGEF, &
4468 KNLVLS_USE, HSNOWMETAMO )
4483 USE modd_snow_par
, ONLY : xd1,xd2,xd3,xx,xvalb5,xvalb6
4491 INTEGER,
INTENT(IN) :: KJ
4492 REAL,
INTENT(IN) :: PSNOW
4494 REAL,
DIMENSION(:),
INTENT(INOUT) :: PSNOWHEAT, PSNOWRHO, PSNOWDZ, &
4495 PSNOWDZN, PSNOWGRAN1, PSNOWGRAN2, &
4497 REAL,
DIMENSION(:),
INTENT(INOUT) :: PSNOWAGE
4498 REAL,
INTENT(IN) :: PSNOWRHOF, PSNOWDZF,PSNOWHEATF, &
4499 PSNOWGRAN1F,PSNOWGRAN2F, PSNOWHISTF
4500 REAL,
INTENT(IN) :: PSNOWAGEF
4502 INTEGER,
INTENT(IN) :: KNLVLS_USE
4504 LOGICAL,
INTENT(IN) :: GSNOWFALL
4506 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
4510 REAL,
DIMENSION(SIZE(PSNOWRHO,1)+1) :: ZSNOWRHOO,ZSNOWGRAN1O,ZSNOWGRAN2O
4513 REAL,
DIMENSION(SIZE(PSNOWRHO,1)+1) :: ZSNOWAGEO
4515 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZSNOWRHON,ZSNOWGRAN1N,ZSNOWGRAN2N,
4518 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) ::ZSNOWAGEN
4520 REAL :: ZMASTOTN, ZMASTOTO, ZSNOWHEAN, ZSNOWHEAO
4521 REAL :: ZPSNOW_OLD, ZPSNOW_NEW
4523 INTEGER :: INLVLS_OLD, INLVLS_NEW
4528 REAL(KIND=JPRB) :: ZHOOK_HANDLE
4530 IF (
lhook)
CALL dr_hook(
'SNOWNLGRIDFRESH_1D',0,zhook_handle)
4536 inlvls_new = knlvls_use
4542 DO jst = 1,inlvls_new
4543 zpsnow_new = zpsnow_new + psnowdzn(jst)
4546 IF ( abs( zpsnow_new - psnowdzf )<
xuepsi )
THEN 4549 DO jst = 1,
SIZE(psnowrho)
4550 IF ( psnowdz(jst)>=
xuepsi )
THEN 4551 zpsnow_old = zpsnow_old + psnowdz(jst)
4552 IF ( abs( zpsnow_new - psnowdzf - zpsnow_old )<
xuepsi )
THEN 4557 IF ( inlvls_old==-1 )
THEN 4558 WRITE(*,*)
'pb INLVLS_OLD INLVLS_NEW=',inlvls_new
4559 WRITE(*,*)
'pb INLVLS_OLD',psnowdzf
4560 WRITE(*,*)
'pb INLVLS_OLD',psnowdzn
4561 WRITE(*,*)
'pb INLVLS_OLD',psnowdz
4562 CALL abor1_sfx(
'SNOWCRO: Error INLVLS_OLD')
4566 IF ( gsnowfall ) inlvls_old = inlvls_old + 1
4569 zpsnow_new = zpsnow_old
4573 IF ( gsnowfall )
THEN 4574 DO jst = 2,inlvls_old
4575 zsnowdzo(jst) = psnowdz(jst-1)
4576 zsnowrhoo(jst) = psnowrho(jst-1)
4577 zsnowheato(jst) = psnowheat(jst-1)
4578 zsnowgran1o(jst) = psnowgran1(jst-1)
4579 zsnowgran2o(jst) = psnowgran2(jst-1)
4580 zsnowhisto(jst) = psnowhist(jst-1)
4581 zsnowageo(jst) = psnowage(jst-1)
4583 zsnowdzo(1) = psnowdzf
4584 zsnowrhoo(1) = psnowrhof
4585 zsnowheato(1) = psnowheatf
4586 zsnowgran1o(1) = psnowgran1f
4587 zsnowgran2o(1) = psnowgran2f
4588 zsnowhisto(1) = psnowhistf
4589 zsnowageo(1) = psnowagef
4591 DO jst = 1,inlvls_old
4592 zsnowdzo(jst) = psnowdz(jst)
4593 zsnowrhoo(jst) = psnowrho(jst)
4594 zsnowheato(jst) = psnowheat(jst)
4595 zsnowgran1o(jst) = psnowgran1(jst)
4596 zsnowgran2o(jst) = psnowgran2(jst)
4597 zsnowhisto(jst) = psnowhist(jst)
4598 zsnowageo(jst) = psnowage(jst)
4605 zsnowztop_old(1) = zpsnow_old
4606 zsnowztop_new(1) = zpsnow_new
4608 DO jst = 1,inlvls_old
4609 IF ( jst>1 ) zsnowztop_old(jst) = zsnowzbot_old(jst-1)
4610 zsnowzbot_old(jst) = zsnowztop_old(jst) - zsnowdzo(jst)
4613 DO jst = 1,inlvls_new
4614 IF ( jst>1 ) zsnowztop_new(jst) = zsnowzbot_new(jst-1)
4615 zsnowzbot_new(jst) = zsnowztop_new(jst) - psnowdzn(jst)
4619 IF ( abs(zsnowzbot_old(inlvls_old)) > 0.00001 )
WRITE (*,*)
'Error bottom OLD' 4621 zsnowzbot_old(inlvls_old) = 0.
4624 if ( abs(zsnowzbot_new(inlvls_new)) > 0.00001 )
WRITE (*,*)
'Error bottom NEW' 4626 zsnowzbot_new(inlvls_new) = 0.
4649 DO jst = 1,inlvls_new
4650 zsnowhean = zsnowhean + zsnowheatn(jst)
4651 zmastotn = zmastotn + zsnowrhon(jst) * psnowdzn(jst)
4652 zpsnow_new = zpsnow_new + psnowdzn(jst)
4655 DO jst = 1,inlvls_old
4656 zsnowheao = zsnowheao + zsnowheato(jst)
4657 zmastoto = zmastoto + zsnowrhoo(jst) * zsnowdzo(jst)
4658 zpsnow_old = zpsnow_old + zsnowdzo(jst)
4661 IF ( abs( zsnowhean-zsnowheao )>0.0001 .OR. abs( zmastotn-zmastoto )>0.0
4663 WRITE(*,*)
'Warning diff', zsnowhean-zsnowheao,zmastotn-zmastoto,zpsnow_new
4669 psnowdz(:) = psnowdzn(:)
4671 psnowrho(:) = zsnowrhon(:)
4672 psnowheat(:) = zsnowheatn(:)
4673 psnowgran1(:) = zsnowgran1n(:)
4674 psnowgran2(:) = zsnowgran2n(:)
4675 psnowhist(:) = zsnowhistn(:)
4677 psnowage(:) = zsnowagen(:)
4679 IF (
lhook)
CALL dr_hook(
'SNOWNLGRIDFRESH_1D',1,zhook_handle)
4685 SUBROUTINE snowdrift(PTSTEP,PVMOD,PSNOWRHO,PSNOWDZ,PSNOW, &
4686 PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST,KNLVLS_USE, &
4687 PTA,PQA,PPS,PRHOA,PZ0EFF,PUREF, &
4688 OSNOWDRIFT_SUBLIM,HSNOWMETAMO,PSNDRIFT )
4718 USE modd_snow_par
, ONLY : xvtime, xvromax, xvromin, xvmob1, &
4719 xvmob2, xvmob3, xvmob4, xvdrift1, xvdrift2, xvdrift3, &
4720 xvsizemin, xcoef_ff, xcoef_effect, xqs_ref
4726 REAL,
INTENT(IN) :: PTSTEP
4728 REAL,
DIMENSION(:),
INTENT(IN) :: PTA, PQA, PPS, PRHOA
4730 REAL,
DIMENSION(:),
INTENT(IN) :: PVMOD
4732 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
4734 REAL,
DIMENSION(:),
INTENT(IN) :: PZ0EFF,PUREF
4736 LOGICAL,
INTENT(IN) :: OSNOWDRIFT_SUBLIM
4738 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
4740 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWRHO, PSNOWDZ,PSNOWGRAN1, &
4741 PSNOWGRAN2,PSNOWHIST
4742 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOW
4743 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNDRIFT
4747 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWRHO2
4748 REAL,
DIMENSION(SIZE(PSNOWRHO,1) ) :: ZSNOWDZ1
4750 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZQSATI, ZFF
4754 REAL :: ZPROFEQU, ZRMOB, ZRDRIFT, ZRT, ZDRO, ZDGR1, ZDGR2
4758 REAL :: ZWIND_EFFECT
4759 REAL :: ZDRIFT_EFFECT
4766 REAL(KIND=JPRB) :: ZHOOK_HANDLE
4769 REAL,
PARAMETER :: PPHREF_WIND=5.
4770 REAL,
PARAMETER :: PPHREF_MIN=pphref_wind/2.
4778 zsnowdz1(:) = psnowdz(:,1)
4780 DO jj = 1,
SIZE(psnow)
4781 DO jst = 1,knlvls_use(jj)
4782 zsnowrho2(jj,jst) = psnowrho(jj,jst)
4786 IF ( osnowdrift_sublim )
THEN 4787 zqsati(:) =
qsati( pta(:),pps(:) )
4793 DO jj=1,
SIZE(psnow)
4798 zz0eff=min(pz0eff(jj),puref(jj)*0.5,pphref_min)
4799 zff(jj) = xcoef_ff*pvmod(jj)*log(pphref_wind/zz0eff)/log(puref(jj)/zz0eff
4804 DO jst = 1,knlvls_use(jj)
4806 zfact = 1.25 - 1.25 * ( max( psnowrho(jj,jst), xvromin ) - xvromin )
4808 IF ( hsnowmetamo==
'B92' )
THEN 4811 IF( psnowgran1(jj,jst)<0. )
THEN 4813 zrmob = 0.34 * ( 0.5 - ( 0.75*psnowgran1(jj,jst) + 0.5*psnowgran2
4817 zrmob = 0.34 * ( xvmob2 - xvmob2*psnowgran1(jj,jst)/99. - xvmob3
4823 IF ( psnowgran1(jj,jst)<
xvdiam6*(4.-psnowgran2(jj,jst))-
xuepsi )
THEN 4825 zrmob = 0.34 * ( 0.5 + 0.75 * &
4826 ( psnowgran1(jj,jst)/
xvdiam6-4.+psnowgran2(jj,jst) )/( psnowgran2
4831 zrmob = 0.34 * ( xvmob2 - xvmob2 * psnowgran2(jj,jst) &
4832 - xvmob3 * (4.-psnowgran2(jj,jst))*
xvdiam6 4839 IF ( psnowhist(jj,jst) >= 2. ) zrmob = min(zrmob, xvmob4)
4842 zrdrift = zrmob - ( xvdrift1 * exp( -xvdrift2*zff(jj) ) - 1.)
4844 IF ( zrdrift<=0. )
EXIT 4847 zprofequ = zprofequ + 0.5 * psnowdz(jj,jst) * 0.1 * ( xvdrift3 - zrdrift
4849 zrt = max( 0., zrdrift * exp( -zprofequ*100 ) )
4851 IF ( osnowdrift_sublim .AND. jst==1 )
THEN 4854 zvt = -log( (zrmob+1.)/xvdrift1 ) / xvdrift2
4855 zrhi = pqa(jj) / zqsati(jj)
4857 zqs = 0.0018 * (
xtt/pta(jj))**4 * zvt * prhoa(jj) * zqsati(jj) * &
4858 (1.-zrhi) * (zff(jj)/zvt)**3.6
4866 psnowdz(jj,jst) = max( 0.5*psnowdz(jj,jst), &
4867 psnowdz(jj,jst) - max(0.,zqs) * ptstep/xcoef_ff
4873 zqs_effect = min( 3., max( 0.,zqs )/xqs_ref ) * zrt
4874 zwind_effect = xcoef_effect * zrt
4875 zdrift_effect = ( zqs_effect + zwind_effect ) * ptstep / xcoef_ff / xvtime
4879 IF( psnowrho(jj,jst) < xvromax )
THEN 4880 zdro = zdrift_effect * ( xvromax - psnowrho(jj,jst) )
4881 psnowrho(jj,jst) = min( xvromax , psnowrho(jj,jst) + zdro )
4882 psnowdz(jj,jst) = psnowdz(jj,jst) * zsnowrho2(jj,jst) / psnowrho(jj
4885 IF ( hsnowmetamo==
'B92' )
THEN 4888 IF ( psnowgran1(jj,jst)<0. )
THEN 4890 zdgr1 = zdrift_effect * ( -psnowgran1(jj,jst) ) * 0.5
4891 psnowgran1(jj,jst) = psnowgran1(jj,jst) + min( zdgr1, -0.99 * psnowgran1
4893 zdgr2 = zdrift_effect * ( 99. - psnowgran2(jj,jst) )
4894 psnowgran2(jj,jst) = min( 99., psnowgran2(jj,jst) + zdgr2 )
4898 zdgr1 = zdrift_effect * ( 99. - psnowgran1(jj,jst) )
4899 zdgr2 = zdrift_effect * 5. / 10000.
4900 psnowgran1(jj,jst) = min( 99., psnowgran1(jj,jst) + zdgr1 )
4901 psnowgran2(jj,jst) = max( xvsizemin, psnowgran2(jj,jst) - zdgr2
4907 IF ( psnowgran1(jj,jst)<
xvdiam6*(4.-psnowgran2(jj,jst))-
xuepsi )
THEN 4909 zdgr1 = min( zdrift_effect * ( ( psnowgran1(jj,jst)/
xvdiam6-4.+psnowgran2
4915 psnowgran1(jj,jst) = psnowgran1(jj,jst) +
xvdiam6 * &
4916 ( zdgr2 * ( (psnowgran1(jj,jst)/
xvdiam6-1.)
4922 zdgr1 = zdrift_effect * 5./10000.
4923 zdgr2 = zdrift_effect * (1.-psnowgran2(jj,jst))
4925 psnowgran1(jj,jst) = psnowgran1(jj,jst) - 2. *
xvdiam6 * psnowgran2
4933 zprofequ = zprofequ + 0.5 * psnowdz(jj,jst) * 0.1 * ( xvdrift3 - zrdrift
4944 DO jj = 1,
SIZE(psnowdz,1)
4945 psnow(jj) =
sum( psnowdz(jj,1:knlvls_use(jj)) )
4956 PSNOWRHO,PSNOWLIQ,PSNOWGRAN1,PSNOWGRAN2, &
4957 PSNOWHIST,PSNOWAGE,PLES3L,KNLVLS_USE )
4977 REAL,
INTENT(IN) :: PTSTEP
4979 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSCAP
4981 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWDZ, PSNOWTEMP, PSNOWRHO, PSNOWLIQ
4982 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST,PSNOWAGE
4984 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: KNLVLS_USE
4986 REAL,
DIMENSION(:),
INTENT(IN) :: PLES3L
4990 REAL :: ZHEAT, ZMASS, ZDZ, ZLIQ, ZSNOWLWE
4992 INTEGER :: JJ,JST,JST_1, JST_2, JST_MAX, IDIFF_LAYER
4993 INTEGER :: ID_1, ID_2
4995 REAL(KIND=JPRB) :: ZHOOK_HANDLE
4998 IF (
lhook)
CALL dr_hook(
'SNOWCROLAYER_GONE',0,zhook_handle)
5000 DO jj=1,
SIZE(psnowrho,1)
5002 jst_max = knlvls_use(jj)
5006 DO jst_1 = jst_max,1-jst_max,-1
5008 jst = jst_1 + idiff_layer
5011 IF ( jst>=1 .AND. knlvls_use(jj)>1 )
THEN 5014 zsnowlwe = psnowrho(jj,jst) * psnowdz(jj,jst) /
xrholw 5017 IF ( jst==1 ) zsnowlwe = zsnowlwe - max( 0., ples3l(jj)*ptstep/(xlstt
5020 IF ( pscap(jj,jst) * max( 0.0, psnowtemp(jj,jst)-
xtt ) * psnowdz(jj
5023 IF ( jst==knlvls_use(jj) )
THEN 5037 DO jst_2 = id_1,id_2
5039 psnowdz(jj,jst_2) * &
5040 ( pscap(jj,jst_2)*( psnowtemp(jj,jst_2)-
xtt ) -
xlmtt*psnowrho
5047 psnowdz(jj,id_1) = zdz
5048 psnowrho(jj,id_1) = zmass / zdz
5049 psnowliq(jj,id_1) = zliq
5052 pscap(jj,id_1) = ( psnowrho(jj,id_1) - &
5053 psnowliq(jj,id_1) *
xrholw / &
5055 psnowtemp(jj,id_1) =
xtt + &
5056 ( ( ( ( zheat -
xlmtt*
xrholw*psnowliq(jj,id_1) ) / psnowdz(jj,id_1
5060 IF( jst/=knlvls_use(jj) )
THEN 5062 psnowgran1(jj,jst) = psnowgran1(jj,jst+1)
5063 psnowgran2(jj,jst) = psnowgran2(jj,jst+1)
5064 psnowhist(jj,jst) = psnowhist(jj,jst+1)
5065 psnowage(jj,jst) = psnowage(jj,jst+1)
5068 DO jst_2 = jst+1,knlvls_use(jj)-1
5069 psnowtemp(jj,jst_2) = psnowtemp(jj,jst_2+1)
5070 pscap(jj,jst_2) = pscap(jj,jst_2+1)
5071 psnowdz(jj,jst_2) = psnowdz(jj,jst_2+1)
5072 psnowrho(jj,jst_2) = psnowrho(jj,jst_2+1)
5073 psnowliq(jj,jst_2) = psnowliq(jj,jst_2+1)
5074 psnowgran1(jj,jst_2) = psnowgran1(jj,jst_2+1)
5075 psnowgran2(jj,jst_2) = psnowgran2(jj,jst_2+1)
5076 psnowhist(jj,jst_2) = psnowhist(jj,jst_2+1)
5077 psnowage(jj,jst_2) = psnowage(jj,jst_2+1)
5081 idiff_layer = idiff_layer + 1
5086 knlvls_use(jj) = knlvls_use(jj) - 1
5096 IF (
lhook)
CALL dr_hook(
'SNOWCROLAYER_GONE',1,zhook_handle)
5104 PSNOWTEMP,PSNOWLIQ,PSNOWHEAT,PSNOWGRAN1, &
5105 PSNOWGRAN2,PSNOWHIST,PSNOWAGE,HSNOWMETAMO )
5112 USE modd_snow_par
, ONLY : xd1, xd2, xd3, xx
5116 CHARACTER(*),
INTENT(IN) :: HINFO
5117 LOGICAL,
INTENT(IN) :: OPRINTGRAN
5118 INTEGER,
INTENT(IN) :: KLAYERS
5119 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWDZ,PSNOWRHO,PSNOWTEMP,PSNOWLIQ, &
5120 PSNOWHEAT,PSNOWGRAN1,PSNOWGRAN2, &
5122 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
5124 REAL,
DIMENSION(KLAYERS) :: ZSNOWSSA
5129 REAL(KIND=JPRB) :: ZHOOK_HANDLE
5131 IF (
lhook)
CALL dr_hook(
'SNOWCROPRINTPROFILE',0,zhook_handle)
5134 WRITE(*,*)
trim(hinfo)
5136 IF (oprintgran)
THEN 5139 IF ( hsnowmetamo==
'B92' )
THEN 5143 IF ( psnowgran1(jst)<0. )
THEN 5144 zdiam = -psnowgran1(jst)*xd1/xx + (1.+psnowgran1(jst)/xx) * &
5145 ( psnowgran2(jst)*xd2/xx + (1.-psnowgran2(jst)/xx) * xd3
5148 zdiam = psnowgran2(jst)*psnowgran1(jst)/xx + &
5149 max( 0.0004, 0.5*psnowgran2(jst) ) * ( 1.-psnowgran1(jst
5151 zsnowssa(jst) = 6. / (
xrholi*zdiam)
5157 zsnowssa = 6. / (
xrholi*psnowgran1)
5161 WRITE(*,
'(9(A12,"|"))')
"-------------",
"-------------",
"-------------" 5162 "-------------",
"-------------",
"-------------",
"-------------",
5163 "-------------",
"-------------" 5164 WRITE(*,
'(9(A12,"|"))')
"PSNOWDZ",
"PSNOWRHO",
"PSNOWTEMP",
"PSNOWLIQ",
"PSNOWHEAT" 5165 "PSNOWGRAN1",
"PSNOWGRAN2",
"PSNOWHIST",
"PSNOWAGE" 5166 WRITE(*,
'(9(A12,"|"))')
"-------------",
"-------------",
"-------------" 5167 "-------------",
"-------------",
"-------------",
"-------------",
5168 "-------------",
"-------------" 5170 WRITE(*,
'(9(ES12.3,"|")," L",I2.2)') psnowdz(jst),psnowrho(jst),psnowtemp
5174 WRITE(*,
'(9(A12,"|"))')
"-------------",
"-------------",
"-------------" 5175 "-------------",
"-------------",
"-------------",
"-------------",
5176 "-------------",
"-------------" 5180 WRITE(*,
'(5(A12,"|"))')
"------------",
"------------",
"------------",&
5181 "------------",
"------------" 5182 WRITE(*,
'(5(A12,"|"))')
"PSNOWDZ",
"PSNOWRHO",
"PSNOWTEMP",
"PSNOWLIQ",
"PSNOWHEAT" 5183 WRITE(*,
'(5(A12,"|"))')
"------------",
"------------",
"------------",&
5184 "------------",
"------------" 5186 WRITE(*,
'(5(ES12.3,"|")," L",I2.2)') psnowdz(jst),psnowrho(jst),psnowtemp
5189 WRITE(*,
'(5(A12,"|"))')
"------------",
"------------",
"------------",&
5190 "------------",
"------------" 5196 IF (
lhook)
CALL dr_hook(
'SNOWCROPRINTPROFILE',1,zhook_handle)
5201 SUBROUTINE snowcroprintatm(CINFO,PTA,PQA,PVMOD,PRR,PSR,PSW_RAD,PLW_RAD, &
5202 PTG, PSOILCOND,PD_G,PPSN3L )
5210 CHARACTER(*),
INTENT(IN) :: CINFO
5211 REAL,
INTENT(IN) :: PTA,PQA,PVMOD,PRR,PSR,PSW_RAD,PLW_RAD
5212 REAL,
INTENT(IN) :: PTG, PSOILCOND, PD_G, PPSN3L
5216 REAL(KIND=JPRB) :: ZHOOK_HANDLE
5218 IF (
lhook)
CALL dr_hook(
'SNOWCROPRINTATM',0,zhook_handle)
5223 WRITE(*,*)
trim(cinfo)
5224 WRITE(*,
'(4(A12,"|"))')
"------------",
"------------",
"------------",&
5226 WRITE(*,
'(4(A12,"|"))')
"PTA",
"PQA",
"PRR",
"PSR" 5227 WRITE(*,
'(4(A12,"|"))')
"------------",
"------------",
"------------",&
5229 WRITE(*,
'(4(ES12.3,"|")," meteo1")')pta,pqa,prr,psr
5230 WRITE(*,
'(4(A12,"|"))')
"------------",
"------------",
"------------",&
5232 WRITE(*,
'(3(A12,"|"))')
"------------",
"------------",
"------------" 5233 WRITE(*,
'(3(A12,"|"))')
"PSW_RAD",
"PLW_RAD",
"PVMOD" 5234 WRITE(*,
'(3(A12,"|"))')
"------------",
"------------",
"------------" 5235 WRITE(*,
'(3(ES12.3,"|")," meteo2")')psw_rad,plw_rad,pvmod
5236 WRITE(*,
'(3(A12,"|"))')
"------------",
"------------",
"------------" 5238 WRITE(*,*)
"Ground :" 5239 WRITE(*,
'(4(A12,"|"))')
"------------",
"------------",
"------------",&
5241 WRITE(*,
'(4(A12,"|"))')
"PTG",
"PSOILCOND",
"PD_G",
"PPSN3L" 5242 WRITE(*,
'(4(A12,"|"))')
"------------",
"------------",
"------------",&
5244 WRITE(*,
'(4(ES12.3,"|")," soil")')ptg,psoilcond,pd_g,ppsn3l
5245 WRITE(*,
'(4(A12,"|"))')
"------------",
"------------",
"------------",&
5248 IF (
lhook)
CALL dr_hook(
'SNOWCROPRINTATM',1,zhook_handle)
5263 REAL ,
DIMENSION(:),
INTENT(IN) :: PMASSBALANCE, PENERGYBALANCE
5265 REAL,
DIMENSION(SIZE(PSR)) :: ZMASSBALANCE,ZENERGYBALANCE
5267 REAL(KIND=JPRB) :: ZHOOK_HANDLE
5269 IF (
lhook)
CALL dr_hook(
'SNOWCROSTOPBALANCE',0,zhook_handle)
5272 CALL abor1_sfx(
"SNOWCRO: WARNING MASS BALANCE !")
5274 CALL abor1_sfx(
"SNOWCRO: WARNING ENERGY BALANCE !")
5276 IF (
lhook)
CALL dr_hook(
'SNOWCROSTOPBALANCE',1,zhook_handle)
5282 PSR,PRR,PTHRUFAL,PEVAP,PEVAPCOR,PGRNDFLUX,PHSNOW, &
5283 PRNSNOW,PLEL3L,PLES3L,PHPSNOW,PSNOWHMASS,PSNOWDZ, &
5284 PTSTEP,PMASSBALANCE,PENERGYBALANCE,PEVAPCOR2 )
5291 REAL,
INTENT(IN) :: PSUMMASS_INI,PSUMHEAT_INI,PSUMMASS_FIN,PSUMHEAT_FIN
5292 REAL,
INTENT(IN) :: PSR,PRR,PTHRUFAL,PEVAP,PEVAPCOR
5293 REAL,
INTENT(IN) :: PGRNDFLUX,PHSNOW,PRNSNOW,PLEL3L,PLES3L,PHPSNOW,PSNOWHMASS
5294 REAL,
INTENT(IN) :: PSNOWDZ
5295 REAL,
INTENT(IN) :: PTSTEP
5296 REAL,
INTENT(IN) :: PMASSBALANCE, PENERGYBALANCE, PEVAPCOR2
5298 REAL(KIND=JPRB) :: ZHOOK_HANDLE
5300 IF (
lhook)
CALL dr_hook(
'SNOWCROPRINTBALANCE',0,zhook_handle)
5303 WRITE(*,fmt=
'(A1,67("+"),A1)')
"+",
"+" 5310 WRITE (*,fmt=
"(A25,1x,E17.10)")
'final mass (kg/m2) =' , psummass_fin
5311 WRITE (*,fmt=
"(A25,1x,E17.10)")
'final energy (J/m2) =', zsumheat_fin
5314 WRITE(*,fmt=
"(A25,1x,E17.10)")
'mass balance (kg/m2) =', pmassbalance
5317 WRITE(*,fmt=
"(A35)")
'mass balance contribution (kg/m2) ' 5318 WRITE(*,fmt=
"(A51,1x,E17.10)")
'delta mass:', (psummass_fin-psummass_ini
5319 WRITE(*,fmt=
"(A51,1x,E17.10)")
'hoar or condensation (>0 towards snow):' 5320 WRITE(*,fmt=
"(A51,1x,E17.10)")
'rain:', prr * ptstep
5321 WRITE(*,fmt=
"(A51,1x,E17.10)")
'snow:', psr * ptstep
5322 WRITE(*,fmt=
"(A51,1x,E17.10)")
'run-off:', pthrufal * ptstep
5323 WRITE(*,fmt=
"(A51,1x,E17.10)")
'evapcor:', pevapcor * ptstep
5325 WRITE(*,fmt=
'(A1,55("-"),A1)')
"+",
"+" 5328 WRITE(*,fmt=
"(A25,4(1x,E17.10))")
'energy balance (W/m2)=',penergybalance
5331 WRITE(*,fmt=
"(A55)")
'energy balance contribution (W/m2) >0 towards snow :' 5332 WRITE(*,fmt=
"(A51,1x,E17.10)")
'delta heat:', (zsumheat_fin-zsumheat_ini
5333 WRITE(*,fmt=
"(A51,1x,E17.10)")
'radiation (LW + SW):', prnsnow
5334 WRITE(*,fmt=
"(A51,1x,E17.10)")
'sensible flux :', -phsnow
5335 WRITE(*,fmt=
"(A51,1x,E17.10)")
'ground heat flux :', -pgrndflux
5336 WRITE(*,fmt=
"(A51,1x,E17.10)")
'liquid latent flux:', -plel3l
5337 WRITE(*,fmt=
"(A51,1x,E17.10)")
'solid latent flux:', -ples3l
5338 WRITE(*,fmt=
"(A51,1x,E17.10)")
'rain sensible heat:', phpsnow
5339 WRITE(*,fmt=
"(A51,1x,E17.10)")
'snowfall/hoar heat (sensible + melt heat):' 5340 WRITE(*,fmt=
"(A51,1x,E17.10)")
'evapcor:', pevapcor2
5341 WRITE(*,fmt=
'(A1,67("+"),A1)')
"+",
"+" 5343 IF (
lhook)
CALL dr_hook(
'SNOWCROPRINTBALANCE',1,zhook_handle)
5348 SUBROUTINE get_balance(PSUMMASS_INI,PSUMHEAT_INI,PSUMMASS_FIN,PSUMHEAT_FIN, &
5349 PSR,PRR,PTHRUFAL,PEVAP,PEVAPCOR,PGRNDFLUX,PHSNOW, &
5350 PRNSNOW,PLEL3L,PLES3L,PHPSNOW,PSNOWHMASS,PSNOWDZ, &
5351 PTSTEP,PMASSBALANCE,PENERGYBALANCE,PEVAPCOR2 )
5355 REAL,
INTENT(IN) :: PSUMMASS_INI,PSUMHEAT_INI,PSUMMASS_FIN,PSUMHEAT_FIN
5356 REAL,
INTENT(IN) :: PSR,PRR,PTHRUFAL,PEVAP,PEVAPCOR
5357 REAL,
INTENT(IN) :: PGRNDFLUX,PHSNOW,PRNSNOW,PLEL3L,PLES3L,PHPSNOW,PSNOWHMASS
5358 REAL,
INTENT(IN) :: PSNOWDZ
5359 REAL,
INTENT(IN) :: PTSTEP
5361 REAL,
INTENT(OUT) :: PMASSBALANCE, PENERGYBALANCE, PEVAPCOR2
5363 REAL(KIND=JPRB) :: ZHOOK_HANDLE
5365 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_BALANCE',0,zhook_handle)
5367 pmassbalance = psummass_fin - psummass_ini - &
5368 ( psr + prr - pthrufal - pevap + pevapcor ) * ptstep
5370 pevapcor2 = pevapcor * psnowdz / max(
xuepsi,psnowdz ) * &
5371 ( abs(plel3l) *
xlvtt / max(
xuepsi,abs(plel3l) ) + &
5374 penergybalance = ( psumheat_fin-psumheat_ini ) / ptstep - &
5375 ( -pgrndflux - phsnow + prnsnow - plel3l - ples3l + phpsnow
5378 IF (
lhook)
CALL dr_hook(
'SNOWCRO:GET_BALANCE',1,zhook_handle)
5387 REAL(KIND=JPRB) :: ZHOOK_HANDLE
5389 IF (
lhook)
CALL dr_hook(
'SNOWCROPRINTDATE',0,zhook_handle)
5391 WRITE(*,fmt=
'(I4.4,2("-",I2.2)," Hour=",F5.2)') &
5392 tptime%TDATE%YEAR, tptime%TDATE%MONTH, tptime%TDATE%DAY, tptime%TIME/3
5394 IF (
lhook)
CALL dr_hook(
'SNOWCROPRINTDATE',1,zhook_handle)
static const char * trim(const char *name, int *n)
logical, parameter lpstopbalance
subroutine snowcroevapn(PLES3L, PTSTEP, PSNOWTEMP, PSNOWRHO, PSNOWDZ, PEVAPCOR, PSNOWHMASS)
subroutine surface_ri(PTG, PQS, PEXNS, PEXNA, PTA, PQA, PZREF, PUREF, PDIRCOSZW, PVMOD, PRI)
subroutine snowcrogone(PTSTEP, PLEL3L, PLES3L, PSNOWRHO,
subroutine snowcroprintatm(CINFO, PTA, PQA, PVMOD, PRR, PSR, PSW_RAD, PLW_RAD,
subroutine snowcroevapgone(PSNOWHEAT, PSNOWDZ, PSNOWRHO, PSNOWTEMP, PSNOWLIQ
subroutine snowcroprintprofile(HINFO, KLAYERS, OPRINTGRAN, PSNOWDZ, PSNOWRHO
subroutine snowcrostopbalance(PMASSBALANCE, PENERGYBALANCE)
subroutine snowcrolayer_gone(PTSTEP, PSCAP, PSNOWTEMP, PSNOWDZ, PSNOWRHO, PSNOWLIQ, PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, PSNOWAGE, PLES3L, KNLVLS_USE)
subroutine snownlfall_upgrid(TPTIME, OGLACIER, PTSTEP, PSR, PTA, PVMOD,
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 get_gran(PTSTEP, PTELM, PGRAN)
subroutine abor1_sfx(YTEXT)
subroutine snowcrocompactn(PTSTEP, PSNOWRHO, PSNOWDZ,
real xwarning_energybalance
subroutine surface_aero_cond(PRI, PZREF, PUREF, PVMOD, PZ0, PZ0H, PAC, PRA, PCH)
integer, dimension(nvegtype_old), parameter npnimp
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 snowcrometamo(PSNOWDZ, PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, PSNOWTEMP, PSNOWLIQ, PTSTEP, PSNOWSWE, INLVLS_USE, PSNOWAGE, HSNOWMETAMO)
subroutine getpoint_crodebug(PLAT, PLON, KDEBUG)
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)
real xwarning_massbalance
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 snowcroebud(HSNOWRES, HIMPLICIT_WIND,
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()
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
subroutine snowcrorefrz(PTSTEP, PRR, PSNOWRHO, PSNOWTEMP, PSNOWDZ, PSNOWLIQ, PTHRUFAL, PSCAP, PLEL3L, KNLVLS_USE)
subroutine snownlgridfresh_1d(KJ, PSNOW, PSNOWDZ, PSNOWDZN,
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 snowcro(HSNOWRES, TPTIME, OGLACIER, HIMPLICIT_WIND,
subroutine snowcromelt(PSCAP, PSNOWTEMP, PSNOWDZ, PSNOWRHO, PSNOWLIQ, KNLVLS_USE)
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)
subroutine get_alb(KJ, PSNOWRHO_IN, PPS_IN, PVAGE1, PSNOWGRAN1, PSNOWGRAN2, PS
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 get_balance(PSUMMASS_INI, PSUMHEAT_INI, PSUMMASS_FIN, PSUMHEAT_F
subroutine snowcroprintbalance(PSUMMASS_INI, PSUMHEAT_INI, PSUMMASS_FIN, PS