163 USE modd_snow_par
, ONLY : xrhosmax_es, xsnowrhohold, &
164 xwsnowholdmax2, xwsnowholdmax1
173 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWRHO
175 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: PWLIQMAX
179 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: ZHOLDMAXR
180 REAL(KIND=JPRB) :: ZHOOK_HANDLE
184 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LWLIQMAX_3D',0,zhook_handle)
185 zsnowrho(:,:,:) = min(xrhosmax_es, psnowrho(:,:,:))
189 zholdmaxr(:,:,:) = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1)*
194 pwliqmax(:,:,:) = zholdmaxr(:,:,:)*zsnowrho(:,:,:)
195 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LWLIQMAX_3D',1,zhook_handle)
206 USE modd_snow_par
, ONLY : xrhosmax_es, xsnowrhohold, &
207 xwsnowholdmax2, xwsnowholdmax1
216 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO
218 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: PWLIQMAX
222 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZHOLDMAXR, ZSNOWRHO
223 REAL(KIND=JPRB) :: ZHOOK_HANDLE
227 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LWLIQMAX_2D',0,zhook_handle)
228 zsnowrho(:,:) = min(xrhosmax_es, psnowrho(:,:))
232 zholdmaxr(:,:) = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1)* &
233 max(0.,xsnowrhohold-zsnowrho(:,:))/xsnowrhohold
237 pwliqmax(:,:) = zholdmaxr(:,:)*zsnowrho(:,:)
238 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LWLIQMAX_2D',1,zhook_handle)
249 USE modd_snow_par
, ONLY : xrhosmax_es, xsnowrhohold, &
250 xwsnowholdmax2, xwsnowholdmax1
259 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWRHO
261 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: PWLIQMAX
265 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: ZHOLDMAXR, ZSNOWRHO
266 REAL(KIND=JPRB) :: ZHOOK_HANDLE
270 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LWLIQMAX_1D',0,zhook_handle)
271 zsnowrho(:) = min(xrhosmax_es, psnowrho(:))
275 zholdmaxr(:) = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1)* &
276 max(0.,xsnowrhohold-zsnowrho(:))/xsnowrhohold
280 pwliqmax(:) = zholdmaxr(:)*zsnowrho(:)
281 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LWLIQMAX_1D',1,zhook_handle)
296 USE modd_snow_par
, ONLY : xrhosmax_es, xsnowrhohold, &
297 xwsnowholdmax2, xwsnowholdmax1
306 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWDZ, PSNOWRHO
308 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: PWHOLDMAX
312 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: ZHOLDMAXR
313 REAL(KIND=JPRB) :: ZHOOK_HANDLE
317 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_3D',0,zhook_handle)
318 zsnowrho(:,:,:) = min(xrhosmax_es, psnowrho(:,:,:))
322 zholdmaxr(:,:,:) = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1)*
327 pwholdmax(:,:,:) = zholdmaxr(:,:,:)*psnowdz(:,:,:)*zsnowrho(:,:,:)/
xrholw 328 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_3D',1,zhook_handle)
340 USE modd_snow_par
, ONLY : xrhosmax_es, xsnowrhohold, &
341 xwsnowholdmax2, xwsnowholdmax1
350 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWDZ, PSNOWRHO
352 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: PWHOLDMAX
356 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZHOLDMAXR, ZSNOWRHO
357 REAL(KIND=JPRB) :: ZHOOK_HANDLE
361 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_2D',0,zhook_handle)
362 zsnowrho(:,:) = min(xrhosmax_es, psnowrho(:,:))
366 zholdmaxr(:,:) = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1)* &
367 max(0.,xsnowrhohold-zsnowrho(:,:))/xsnowrhohold
371 pwholdmax(:,:) = zholdmaxr(:,:)*psnowdz(:,:)*zsnowrho(:,:)/
xrholw 372 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_2D',1,zhook_handle)
384 USE modd_snow_par
, ONLY : xrhosmax_es, xsnowrhohold, &
385 xwsnowholdmax2, xwsnowholdmax1
394 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWDZ, PSNOWRHO
396 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: PWHOLDMAX
400 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: ZHOLDMAXR, ZSNOWRHO
401 REAL(KIND=JPRB) :: ZHOOK_HANDLE
405 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_1D',0,zhook_handle)
406 zsnowrho(:) = min(xrhosmax_es, psnowrho(:))
410 zholdmaxr(:) = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1)* &
411 max(0.,xsnowrhohold-zsnowrho(:))/xsnowrhohold
415 pwholdmax(:) = zholdmaxr(:)*psnowdz(:)*zsnowrho(:)/
xrholw 416 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_1D',1,zhook_handle)
428 USE modd_snow_par
, ONLY : xrhosmax_es, xsnowrhohold, &
429 xwsnowholdmax2, xwsnowholdmax1
438 REAL,
INTENT(IN) :: PSNOWDZ, PSNOWRHO
444 REAL :: ZHOLDMAXR, ZSNOWRHO
445 REAL(KIND=JPRB) :: ZHOOK_HANDLE
449 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_0D',0,zhook_handle)
450 zsnowrho = min(xrhosmax_es, psnowrho)
454 zholdmaxr = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1) * &
455 max(0.,xsnowrhohold-zsnowrho)/xsnowrhohold
459 pwholdmax = zholdmaxr*psnowdz*zsnowrho/
xrholw 460 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_0D',1,zhook_handle)
464 FUNCTION snowcrohold_3d(PSNOWRHO,PSNOWLIQ,PSNOWDZ)
RESULT(PWHOLDMAX)
472 USE modd_snow_par
, ONLY : xpercentagepore
481 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWDZ, PSNOWLIQ,
483 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: PWHOLDMAX
484 REAL(KIND=JPRB) :: ZHOOK_HANDLE
503 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_3D',0,zhook_handle)
504 pwholdmax(:,:,:) = xpercentagepore/
xrholi * (psnowdz * (
xrholi-psnowrho)
505 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_3D',1,zhook_handle)
509 FUNCTION snowcrohold_2d(PSNOWRHO,PSNOWLIQ,PSNOWDZ)
RESULT(PWHOLDMAX)
517 USE modd_snow_par
, ONLY : xpercentagepore
526 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWDZ, PSNOWRHO,
528 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: PWHOLDMAX
529 REAL(KIND=JPRB) :: ZHOOK_HANDLE
547 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_2D',0,zhook_handle)
548 pwholdmax(:,:) = xpercentagepore/
xrholi * (psnowdz * (
xrholi-psnowrho) +
549 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_2D',1,zhook_handle)
555 FUNCTION snowcrohold_1d(PSNOWRHO,PSNOWLIQ,PSNOWDZ)
RESULT(PWHOLDMAX)
563 USE modd_snow_par
, ONLY : xpercentagepore
572 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWDZ, PSNOWRHO,
574 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: PWHOLDMAX
575 REAL(KIND=JPRB) :: ZHOOK_HANDLE
593 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_1D',0,zhook_handle)
594 pwholdmax(:) = xpercentagepore/
xrholi * (psnowdz * (
xrholi-psnowrho) + psnowliq
595 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_1D',1,zhook_handle)
599 FUNCTION snowcrohold_0d(PSNOWRHO,PSNOWLIQ,PSNOWDZ)
RESULT(PWHOLDMAX)
607 USE modd_snow_par
, ONLY : xpercentagepore
616 REAL,
INTENT(IN) :: PSNOWDZ, PSNOWRHO, PSNOWLIQ
619 REAL(KIND=JPRB) :: ZHOOK_HANDLE
637 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_0D',0,zhook_handle)
638 pwholdmax = xpercentagepore/
xrholi * (psnowdz * (
xrholi-psnowrho) + psnowliq
639 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_0D',1,zhook_handle)
660 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWRHO
662 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: PSCAP
663 REAL(KIND=JPRB) :: ZHOOK_HANDLE
667 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_3D',0,zhook_handle)
668 pscap(:,:,:) = psnowrho(:,:,:)*
xci 669 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_3D',1,zhook_handle)
688 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO
690 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: PSCAP
691 REAL(KIND=JPRB) :: ZHOOK_HANDLE
695 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_2D',0,zhook_handle)
696 pscap(:,:) = psnowrho(:,:)*
xci 697 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_2D',1,zhook_handle)
716 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWRHO
718 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: PSCAP
719 REAL(KIND=JPRB) :: ZHOOK_HANDLE
723 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_1D',0,zhook_handle)
724 pscap(:) = psnowrho(:)*
xci 725 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_1D',1,zhook_handle)
744 REAL,
INTENT(IN) :: PSNOWRHO
747 REAL(KIND=JPRB) :: ZHOOK_HANDLE
751 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_0D',0,zhook_handle)
753 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_0D',1,zhook_handle)
813 REAL ,
INTENT(IN) :: PSNOWTEMP, PSNOWRHO, PGRADT
816 REAL(KIND=JPRB) :: ZHOOK_HANDLE
818 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3L_MARBOUTY',0,zhook_handle)
867 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3L_MARBOUTY',1,zhook_handle)
894 USE modd_snow_par
, ONLY : xsnowcritd
903 REAL,
DIMENSION(: ),
INTENT(IN ) :: PSNOW
904 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PSNOWDZ
905 REAL,
DIMENSION(:,:),
INTENT(IN ),
OPTIONAL :: PSNOWDZ_OLD
911 INTEGER :: INLVLS, INI
913 REAL,
DIMENSION(SIZE(PSNOW)) :: ZWORK
915 LOGICAL ,
DIMENSION(SIZE(PSNOW)) :: GREGRID
919 REAL,
PARAMETER,
DIMENSION(3) :: ZSGCOEF1 = (/0.25, 0.50, 0.25/)
920 REAL,
PARAMETER,
DIMENSION(2) :: ZSGCOEF2 = (/0.05, 0.34/)
922 REAL,
PARAMETER,
DIMENSION(3) :: ZSGCOEF = (/0.3, 0.4, 0.3/)
926 REAL,
PARAMETER :: ZSNOWTRANS = 0.20
930 REAL,
PARAMETER :: ZDZ1=0.01
931 REAL,
PARAMETER :: ZDZ2=0.05
932 REAL,
PARAMETER :: ZDZ3=0.15
933 REAL,
PARAMETER :: ZDZ4=0.50
934 REAL,
PARAMETER :: ZDZ5=1.00
935 REAL,
PARAMETER :: ZDZN0=0.02
936 REAL,
PARAMETER :: ZDZN1=0.1
937 REAL,
PARAMETER :: ZDZN2=0.5
938 REAL,
PARAMETER :: ZDZN3=1.0
940 REAL,
PARAMETER :: ZCOEF1 = 0.5
941 REAL,
PARAMETER :: ZCOEF2 = 1.5
943 REAL(KIND=JPRB) :: ZHOOK_HANDLE
950 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LGRID_2D',0,zhook_handle)
952 inlvls =
SIZE(psnowdz(:,:),2)
953 ini =
SIZE(psnowdz(:,:),1)
969 psnowdz(ji,1) = psnow(ji)
972 ELSEIF(inlvls == 3)
THEN 974 WHERE(psnow <= xsnowcritd+0.01)
975 psnowdz(:,1) = min(0.01, psnow(:)/inlvls)
976 psnowdz(:,3) = min(0.01, psnow(:)/inlvls)
977 psnowdz(:,2) = psnow(:) - psnowdz(:,1) - psnowdz(:,3)
980 WHERE(psnow <= zsnowtrans .AND. psnow > xsnowcritd+0.01)
981 psnowdz(:,1) = psnow(:)*zsgcoef1(1)
982 psnowdz(:,2) = psnow(:)*zsgcoef1(2)
983 psnowdz(:,3) = psnow(:)*zsgcoef1(3)
986 WHERE(psnow > zsnowtrans)
987 psnowdz(:,1) = zsgcoef2(1)
988 psnowdz(:,2) = (psnow(:)-zsgcoef2(1))*zsgcoef2(2) + zsgcoef2(1)
993 psnowdz(:,2) = min(10*zsgcoef2(1), psnowdz(:,2))
994 psnowdz(:,3) = psnow(:) - psnowdz(:,2) - psnowdz(:,1)
1001 ELSEIF(inlvls == 6)
THEN 1005 IF(
PRESENT(psnowdz_old))
THEN 1006 gregrid(:) = psnowdz_old(:,1) < zcoef1 * min(zdz1 ,psnow(:)/inlvls) .OR.
1016 psnowdz(:,1) = min(zdz1,psnow(:)/inlvls)
1017 psnowdz(:,2) = min(zdz2,psnow(:)/inlvls)
1019 psnowdz(:,6) = min(zdzn1,psnow(:)/inlvls)
1021 zwork(:) = psnow(:) - psnowdz(:,1) - psnowdz(:,2) - psnowdz(:
1026 zwork(:)=min(0.0,psnowdz(:,3)-psnowdz(:,2))
1027 psnowdz(:,3)=psnowdz(:,3)-zwork(:)
1028 psnowdz(:,4)=psnowdz(:,4)+zwork(:)
1030 zwork(:)=min(0.0,psnowdz(:,5)-psnowdz(:,6))
1031 psnowdz(:,5)=psnowdz(:,5)-zwork(:)
1032 psnowdz(:,4)=psnowdz(:,4)+zwork(:)
1038 ELSEIF(inlvls == 9)
THEN 1042 IF(
PRESENT(psnowdz_old))
THEN 1043 gregrid(:) = psnowdz_old(:,1) < zcoef1 * min(zdz1 ,psnow(:)/inlvls) .OR.
1053 psnowdz(:,1) = min(zdz1,psnow(:)/inlvls)
1054 psnowdz(:,2) = min(zdz2,psnow(:)/inlvls)
1055 psnowdz(:,3) = min(zdz3,psnow(:)/inlvls)
1057 psnowdz(:,9)= min(zdzn0,psnow(:)/inlvls)
1058 psnowdz(:,8)= min(zdzn1,psnow(:)/inlvls)
1059 psnowdz(:,7)= min(zdzn2,psnow(:)/inlvls)
1061 zwork(:) = psnow(:) - psnowdz(:, 1) - psnowdz(:, 2) - psnowdz(:,
1067 zwork(:)=min(0.0,psnowdz(:,4)-psnowdz(:,3))
1068 psnowdz(:,4)=psnowdz(:,4)-zwork(:)
1069 psnowdz(:,5)=psnowdz(:,5)+zwork(:)
1071 zwork(:)=min(0.0,psnowdz(:,6)-psnowdz(:,7))
1072 psnowdz(:,6)=psnowdz(:,6)-zwork(:)
1073 psnowdz(:,5)=psnowdz(:,5)+zwork(:)
1079 ELSEIF(inlvls == 12)
THEN 1083 IF(
PRESENT(psnowdz_old))
THEN 1084 gregrid(:) = psnowdz_old(:, 1) < zcoef1 * min(zdz1 ,psnow(:)/inlvls)
1094 psnowdz(:,1) = min(zdz1,psnow(:)/inlvls)
1095 psnowdz(:,2) = min(zdz2,psnow(:)/inlvls)
1096 psnowdz(:,3) = min(zdz3,psnow(:)/inlvls)
1097 psnowdz(:,4) = min(zdz4,psnow(:)/inlvls)
1098 psnowdz(:,5) = min(zdz5,psnow(:)/inlvls)
1100 psnowdz(:,12)= min(zdzn0,psnow(:)/inlvls)
1101 psnowdz(:,11)= min(zdzn1,psnow(:)/inlvls)
1102 psnowdz(:,10)= min(zdzn2,psnow(:)/inlvls)
1103 psnowdz(:, 9)= min(zdzn3,psnow(:)/inlvls)
1105 zwork(:) = psnow(:) - psnowdz(:, 1) - psnowdz(:, 2) - psnowdz(:,
1112 zwork(:)=min(0.0,psnowdz(:,6)-psnowdz(:,5))
1113 psnowdz(:,6)=psnowdz(:,6)-zwork(:)
1114 psnowdz(:,7)=psnowdz(:,7)+zwork(:)
1116 zwork(:)=min(0.0,psnowdz(:,8)-psnowdz(:,9))
1117 psnowdz(:,8)=psnowdz(:,8)-zwork(:)
1118 psnowdz(:,7)=psnowdz(:,7)+zwork(:)
1124 ELSEIF(inlvls<10.AND.inlvls/=3.AND.inlvls/=6.AND.inlvls/=9)
THEN 1128 psnowdz(ji,jj) = psnow(ji)/inlvls
1132 psnowdz(:,inlvls) = psnowdz(:,inlvls) + (psnowdz(:,1) - min(0.05, psnowdz
1135 ELSE !(inlvls>=10 and /=12)
1139 IF(
PRESENT(psnowdz_old))
THEN 1140 gregrid(:) = psnowdz_old(:, 1) < zcoef1 * min(zdz1 ,psnow
1149 psnowdz(:,1 ) = min(zdz1 ,psnow(:)/inlvls)
1150 psnowdz(:,2 ) = min(zdz2 ,psnow(:)/inlvls)
1151 psnowdz(:,3 ) = min(zdz3 ,psnow(:)/inlvls)
1152 psnowdz(:,4 ) = min(zdz4 ,psnow(:)/inlvls)
1153 psnowdz(:,5 ) = min(zdz5 ,psnow(:)/inlvls)
1154 psnowdz(:,inlvls) = min(0.05*psnow(:),psnow(:)/inlvls)
1160 zwork(ji) = psnowdz(ji,1)+psnowdz(ji,2)+psnowdz(ji,3)+psnowdz(ji
1170 IF(psnow(ji)==
xundef)
THEN 1172 ELSEIF(.NOT.gregrid(ji))
THEN 1173 psnowdz(ji,jj)=psnowdz_old(ji,jj)
1178 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LGRID_2D',1,zhook_handle)
1204 USE modd_snow_par
, ONLY : xsnowcritd
1213 REAL,
INTENT(IN ) :: PSNOW
1214 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOWDZ
1215 REAL,
DIMENSION(:),
INTENT(IN ),
OPTIONAL :: PSNOWDZ_OLD
1230 REAL,
PARAMETER,
DIMENSION(3) :: ZSGCOEF1 = (/0.25, 0.50, 0.25/)
1231 REAL,
PARAMETER,
DIMENSION(2) :: ZSGCOEF2 = (/0.05, 0.34/)
1233 REAL,
PARAMETER,
DIMENSION(3) :: ZSGCOEF = (/0.3, 0.4, 0.3/)
1237 REAL,
PARAMETER :: ZSNOWTRANS = 0.20
1241 REAL,
PARAMETER :: ZDZ1=0.01
1242 REAL,
PARAMETER :: ZDZ2=0.05
1243 REAL,
PARAMETER :: ZDZ3=0.15
1244 REAL,
PARAMETER :: ZDZ4=0.50
1245 REAL,
PARAMETER :: ZDZ5=1.00
1246 REAL,
PARAMETER :: ZDZN0=0.02
1247 REAL,
PARAMETER :: ZDZN1=0.1
1248 REAL,
PARAMETER :: ZDZN2=0.5
1249 REAL,
PARAMETER :: ZDZN3=1.0
1251 REAL,
PARAMETER :: ZCOEF1 = 0.5
1252 REAL,
PARAMETER :: ZCOEF2 = 1.5
1254 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1261 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LGRID_1D',0,zhook_handle)
1263 inlvls =
SIZE(psnowdz(:),1)
1279 ELSEIF(inlvls == 3)
THEN 1281 IF(psnow <= xsnowcritd+0.01)
THEN 1282 psnowdz(1) = min(0.01, psnow/inlvls)
1283 psnowdz(3) = min(0.01, psnow/inlvls)
1284 psnowdz(2) = psnow - psnowdz(1) - psnowdz(3)
1287 IF(psnow <= zsnowtrans .AND. psnow > xsnowcritd+0.01)
THEN 1288 psnowdz(1) = psnow*zsgcoef1(1)
1289 psnowdz(2) = psnow*zsgcoef1(2)
1290 psnowdz(3) = psnow*zsgcoef1(3)
1293 IF(psnow > zsnowtrans)
THEN 1294 psnowdz(1) = zsgcoef2(1)
1295 psnowdz(2) = (psnow-zsgcoef2(1))*zsgcoef2(2) + zsgcoef2(1)
1300 psnowdz(2) = min(10*zsgcoef2(1), psnowdz(2))
1301 psnowdz(3) = psnow - psnowdz(2) - psnowdz(1)
1308 ELSEIF(inlvls == 6)
THEN 1312 IF(
PRESENT(psnowdz_old))
THEN 1313 gregrid = psnowdz_old(1) < zcoef1 * min(zdz1 ,psnow/inlvls) .OR.
1323 psnowdz(1) = min(zdz1,psnow/inlvls)
1324 psnowdz(2) = min(zdz2,psnow/inlvls)
1326 psnowdz(6) = min(zdzn1,psnow/inlvls)
1328 zwork = psnow - psnowdz(1) - psnowdz(2) - psnowdz(6)
1329 psnowdz(3) = zwork*zsgcoef(1)
1330 psnowdz(4) = zwork*zsgcoef(2)
1331 psnowdz(5) = zwork*zsgcoef(3)
1333 zwork=min(0.0,psnowdz(3)-psnowdz(2))
1334 psnowdz(3)=psnowdz(3)-zwork
1335 psnowdz(4)=psnowdz(4)+zwork
1337 zwork=min(0.0,psnowdz(5)-psnowdz(6))
1338 psnowdz(5)=psnowdz(5)-zwork
1339 psnowdz(4)=psnowdz(4)+zwork
1345 ELSEIF(inlvls == 9)
THEN 1349 IF(
PRESENT(psnowdz_old))
THEN 1350 gregrid = psnowdz_old(1) < zcoef1 * min(zdz1 ,psnow/inlvls) .OR.
1360 psnowdz(1) = min(zdz1,psnow/inlvls)
1361 psnowdz(2) = min(zdz2,psnow/inlvls)
1362 psnowdz(3) = min(zdz3,psnow/inlvls)
1364 psnowdz(9)= min(zdzn0,psnow/inlvls)
1365 psnowdz(8)= min(zdzn1,psnow/inlvls)
1366 psnowdz(7)= min(zdzn2,psnow/inlvls)
1368 zwork = psnow - psnowdz( 1) - psnowdz( 2) - psnowdz( 3) &
1369 - psnowdz( 7) - psnowdz( 8) - psnowdz( 9)
1370 psnowdz(4) = zwork*zsgcoef(1)
1371 psnowdz(5) = zwork*zsgcoef(2)
1372 psnowdz(6) = zwork*zsgcoef(3)
1374 zwork=min(0.0,psnowdz(4)-psnowdz(3))
1375 psnowdz(4)=psnowdz(4)-zwork
1376 psnowdz(5)=psnowdz(5)+zwork
1378 zwork=min(0.0,psnowdz(6)-psnowdz(7))
1379 psnowdz(6)=psnowdz(6)-zwork
1380 psnowdz(5)=psnowdz(5)+zwork
1386 ELSEIF(inlvls == 12)
THEN 1390 IF(
PRESENT(psnowdz_old))
THEN 1391 gregrid = psnowdz_old(1) < zcoef1 * min(zdz1 ,psnow/inlvls) .OR.
1401 psnowdz(1) = min(zdz1,psnow/inlvls)
1402 psnowdz(2) = min(zdz2,psnow/inlvls)
1403 psnowdz(3) = min(zdz3,psnow/inlvls)
1404 psnowdz(4) = min(zdz4,psnow/inlvls)
1405 psnowdz(5) = min(zdz5,psnow/inlvls)
1407 psnowdz(12)= min(zdzn0,psnow/inlvls)
1408 psnowdz(11)= min(zdzn1,psnow/inlvls)
1409 psnowdz(10)= min(zdzn2,psnow/inlvls)
1410 psnowdz( 9)= min(zdzn3,psnow/inlvls)
1412 zwork = psnow - psnowdz( 1) - psnowdz( 2) - psnowdz( 3) &
1413 - psnowdz( 4) - psnowdz( 5) - psnowdz( 9) &
1414 - psnowdz(10) - psnowdz(11) - psnowdz(12)
1415 psnowdz(6) = zwork*zsgcoef(1)
1416 psnowdz(7) = zwork*zsgcoef(2)
1417 psnowdz(8) = zwork*zsgcoef(3)
1419 zwork=min(0.0,psnowdz(6)-psnowdz(5))
1420 psnowdz(6)=psnowdz(6)-zwork
1421 psnowdz(7)=psnowdz(7)+zwork
1423 zwork=min(0.0,psnowdz(8)-psnowdz(9))
1424 psnowdz(8)=psnowdz(8)-zwork
1425 psnowdz(7)=psnowdz(7)+zwork
1431 ELSE IF(inlvls<10.AND.inlvls/=3.AND.inlvls/=6.AND.inlvls/=9)
THEN 1434 psnowdz(jj) = psnow/inlvls
1437 psnowdz(inlvls) = psnowdz(inlvls) + (psnowdz(1) - min(0.05, psnowdz(1)
1442 IF(
PRESENT(psnowdz_old))
THEN 1443 gregrid = psnowdz_old( 1) < zcoef1 * min(zdz1 ,psnow/inlvls
1452 psnowdz( 1) = min(zdz1 ,psnow/inlvls)
1453 psnowdz( 2) = min(zdz2 ,psnow/inlvls)
1454 psnowdz( 3) = min(zdz3 ,psnow/inlvls)
1455 psnowdz( 4) = min(zdz4 ,psnow/inlvls)
1456 psnowdz( 5) = min(zdz5 ,psnow/inlvls)
1457 psnowdz(inlvls) = min(0.05*psnow,psnow/inlvls)
1458 zwork =
sum(psnowdz(1:5))
1460 psnowdz(jj) = (psnow - zwork -psnowdz(inlvls))/(inlvls-6)
1469 ELSEIF(.NOT.gregrid)
THEN 1470 psnowdz(jj) = psnowdz_old(jj)
1474 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LGRID_1D',1,zhook_handle)
1480 SUBROUTINE snow3lagreg(PSNOWDZN,PSNOWDZ,PSNOWRHO,PSNOWGRAN1, PSNOWGRAN2, &
1481 PSNOWHIST,PSNOWGRAN1N,PSNOWGRAN2N,PSNOWHISTN, &
1493 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWDZN,PSNOWDZ,PSNOWRHO,PSNOWDDZ
1495 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST
1496 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOWGRAN1N,PSNOWGRAN2N,PSNOWHISTN
1498 INTEGER,
INTENT(IN) :: KL1
1499 INTEGER,
INTENT(IN) :: KL2
1504 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZSNOWRHO
1505 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZDIAMD,ZDIAMV,ZSPHERD,ZSPHERV,&
1506 ZDIAMN,ZSPHERN,ZDENT
1508 REAL :: ZDELTA, ZCOMP
1510 INTEGER :: IDENT, IVIEU, IL
1512 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1514 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LAGREG',0,zhook_handle)
1528 IF ( psnowhist(kl1)/=psnowhist(kl2) )
THEN 1529 psnowhistn(kl1) = 0.0
1536 IF ( psnowgran1(kl1)*psnowgran1(kl2)>0.0 .OR. &
1537 ( psnowgran1(kl1)==0.0 .AND. psnowgran1(kl2)>=0.0 ) .OR. &
1538 ( psnowgran1(kl2)==0.0 .AND. psnowgran1(kl1)>=0.0 ) )
THEN 1559 CALL get_agreg(kl1,kl2,psnowgran1(kl1),psnowgran1(kl2),psnowgran1n(kl1
1561 CALL get_agreg(kl1,kl2,psnowgran2(kl1),psnowgran2(kl2),psnowgran2n(kl1
1569 IF ( psnowgran1(kl1)<0.0 )
THEN 1577 zdiamd(kl1) = - psnowgran1(ident)/
xgran *
xdiaet + ( 1.0 + psnowgran1
1580 zspherd(kl1) = psnowgran2(ident)/
xgran 1581 zdiamv(kl1) = psnowgran2(ivieu)
1582 zspherv(kl1) = psnowgran1(ivieu)/
xgran 1588 IF ( ident==kl1 )
THEN 1599 CALL get_agreg(ident,ivieu,zdiamd(kl1),zdiamv(kl1),zdiamn(kl1))
1613 CALL get_agreg(ident,ivieu,zspherd(kl1),zspherv(kl1),zsphern(kl1))
1636 CALL get_agreg(ivieu,ident,zdiamv(kl1),zdiamd(kl1),zdiamn(kl1))
1638 CALL get_agreg(ivieu,ident,zspherv(kl1),zspherd(kl1),zsphern(kl1))
1643 zcomp = zsphern(kl1) *
xdiagf + ( 1.-zsphern(kl1) ) *
xdiafp 1644 IF( zdiamn(kl1) < zcomp )
THEN 1646 zdent(kl1) = ( zdiamn(kl1) - zcomp ) / (
xdiaet - zcomp )
1648 psnowgran1n(kl1) = -
xgran * zdent(kl1)
1649 psnowgran2n(kl1) =
xgran * zsphern(kl1)
1653 psnowgran1n(kl1) =
xgran * zsphern(kl1)
1654 psnowgran2n(kl1) = zdiamn(kl1)
1660 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LAGREG',1,zhook_handle)
1668 SUBROUTINE get_agreg(KID1,KID2,PFIELD1,PFIELD2,PFIELD)
1670 INTEGER,
INTENT(IN) :: KID1, KID2
1671 REAL,
INTENT(IN) :: PFIELD1, PFIELD2
1672 REAL,
INTENT(OUT) :: PFIELD
1674 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1676 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LAGREG:GET_AGREG',0,zhook_handle
1678 pfield = ( pfield1 * psnowrho(kid1) * ( psnowdzn(kid1) - abs(psnowddz(il
1683 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LAGREG:GET_AGREG',1,zhook_handle
1694 PSNOWGRAN1N,PSNOWGRAN2N,PSNOWHISTN,PNDENT,PNVIEU,&
1706 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST
1708 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWGRAN1N,PSNOWGRAN2N,PSNOWHISTN
1710 REAL,
DIMENSION(:),
INTENT(IN) :: PNDENT, PNVIEU
1712 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
1715 REAL,
DIMENSION(SIZE(PSNOWGRAN1,1)) :: ZGRAN1, ZGRAN2, ZHIST
1717 LOGICAL,
DIMENSION(SIZE(PSNOWGRAN1,1),SIZE(PSNOWGRAN1,2)) :: GDENDRITIC
1720 INTEGER :: INLVLS, INI
1722 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1726 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LAVGRAIN',0,zhook_handle)
1728 inlvls =
SIZE(psnowgran1,2)
1729 ini =
SIZE(psnowgran1,1)
1737 IF ( pndent(ji)==0.0 .AND. pnvieu(ji)==0.0 )
THEN 1746 IF ( hsnowmetamo==
'B92' )
THEN 1747 gdendritic(ji,jl) = ( psnowgran1(ji,jl) < 0.0 )
1749 gdendritic(ji,jl) = ( psnowgran1(ji,jl) <
xvdiam6*(4.-psnowgran2
1753 IF ( pndent(ji)>=pnvieu(ji) )
THEN 1756 IF ( gdendritic(ji,jl) )
THEN 1757 zgran1(ji) = zgran1(ji) + psnowgran1(ji,jl)
1758 zgran2(ji) = zgran2(ji) + psnowgran2(ji,jl)
1762 psnowgran1n(ji,:) = zgran1(ji) / pndent(ji)
1763 psnowgran2n(ji,:) = zgran2(ji) / pndent(ji)
1764 psnowhistn(ji,:) = 0.0
1769 IF ( .NOT.gdendritic(ji,jl) )
THEN 1770 zgran1(ji) = zgran1(ji) + psnowgran1(ji,jl)
1771 zgran2(ji) = zgran2(ji) + psnowgran2(ji,jl)
1772 zhist(ji) = zhist(ji) + psnowhist(ji,jl)
1776 psnowgran1n(ji,:) = zgran1(ji) / pnvieu(ji)
1777 psnowgran2n(ji,:) = zgran2(ji) / pnvieu(ji)
1778 psnowhistn(ji,:) = zhist(ji) / pnvieu(ji)
1789 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LAVGRAIN',1,zhook_handle)
1796 FUNCTION snow3ldiftyp(PGRAIN1,PGRAIN2,PGRAIN3,PGRAIN4,HSNOWMETAMO)
RESULT(ZDIFTYPE)
1809 REAL,
INTENT(IN) :: PGRAIN1, PGRAIN2, PGRAIN3, PGRAIN4
1810 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
1811 REAL :: ZDIFTYPE, ZCOEF3, ZCOEF4
1812 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1815 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LDIFTYP',0,zhook_handle)
1817 IF ( hsnowmetamo==
'B92' )
THEN 1819 IF ( ( pgrain1<0. .AND. pgrain2>=0.) .OR. ( pgrain1>=0. .AND. pgrain2
THEN 1821 ELSEIF ( pgrain1<0. )
THEN 1822 zdiftype = abs( pgrain1-pgrain2 ) * .5 + abs( pgrain3-pgrain4 ) * .5
1824 zdiftype = abs( pgrain1-pgrain2 ) + abs( pgrain3-pgrain4 ) * 5.
1831 IF ( ( pgrain1<zcoef3 .AND. pgrain2>=zcoef4 ) .OR. ( pgrain1>=zcoef3 .AND.
THEN 1833 ELSEIF ( pgrain1<zcoef3 )
THEN 1834 zdiftype = abs( (pgrain3-pgrain4)*
xgran ) * .5 + &
1835 abs( ( (pgrain1/
xvdiam6 - 4. + pgrain3) / (pgrain3 - 3.)
1839 zdiftype = abs( (pgrain3-pgrain4)*
xgran ) + abs( zcoef3-zcoef4
1844 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LDIFTYP',1,zhook_handle)
1850 PSNOWZTOP_OLD,PSNOWZTOP_NEW,PSNOWZBOT_OLD,PSNOWZBOT_NEW, &
1851 PSNOWRHOO,PSNOWDZO,PSNOWGRAN1O,PSNOWGRAN2O,PSNOWHISTO, &
1852 PSNOWAGEO,PSNOWHEATO, &
1853 PSNOWRHON,PSNOWDZN,PSNOWGRAN1N,PSNOWGRAN2N,PSNOWHISTN, &
1854 PSNOWAGEN, PSNOWHEATN,HSNOWMETAMO )
1856 USE modd_snow_par
, ONLY : xsnowcritd, xd1, xd2, xd3, xx, xvalb5, xvalb6
1863 INTEGER,
INTENt(IN) :: KJ
1864 INTEGER,
INTENT(IN) :: KNLVLS_NEW, KNLVLS_OLD
1865 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWZTOP_OLD, PSNOWZBOT_OLD
1866 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWZTOP_NEW, PSNOWZBOT_NEW
1867 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWRHOO, PSNOWDZO, PSNOWGRAN1O, PSNOWGRAN2O
1869 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWDZN
1870 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
1871 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOWRHON, PSNOWGRAN1N, PSNOWGRAN2N, &
1872 PSNOWHISTN, PSNOWAGEN, PSNOWHEATN
1874 REAL :: ZPROPOR, ZMASDZ_OLD, ZDIAM, ZMASTOT_T07
1875 REAL :: ZSNOWHEAN, ZMASTOTN, ZDENTMOYN, ZSPHERMOYN, ZALBMOYN, ZHISTMOYN
1878 INTEGER :: JST_NEW, JST_OLD
1880 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1882 IF (
lhook)
CALL dr_hook(
'GET_MASS_HEAT',0,zhook_handle)
1891 DO jst_new = 1,knlvls_new
1904 DO jst_old = 1,knlvls_old
1906 IF( psnowztop_old(jst_old)<=psnowzbot_new(jst_new) )
THEN 1908 ELSEIF ( psnowzbot_old(jst_old)>=psnowztop_new(jst_new) )
THEN 1913 zpropor = ( min( psnowztop_old(jst_old), psnowztop_new(jst_new) )
1918 zmastotn = zmastotn + zmasdz_old
1919 zmastot_t07 = zmastot_t07 + 1.
1921 zsnowhean = zsnowhean + zpropor * psnowheato(jst_old)
1923 IF ( hsnowmetamo==
'B92' )
THEN 1926 IF ( psnowgran1o(jst_old)<0. )
THEN 1927 zdiam = -psnowgran1o(jst_old)*xd1/xx + (1.+psnowgran1o(jst_old
1933 zdiam = psnowgran2o(jst_old)
1934 zdentmoyn = zdentmoyn + zmasdz_old * 0.
1935 zsphermoyn = zsphermoyn + zmasdz_old * psnowgran1o(jst_old) / xx
1940 zdiam = psnowgran1o(jst_old)
1941 zsphermoyn = zsphermoyn + zmasdz_old * psnowgran2o(jst_old)
1945 zalbmoyn = zalbmoyn + max( 0., zmasdz_old * (xvalb5-xvalb6*sqrt(zdiam
1955 psnowheatn(jst_new) = zsnowhean
1956 psnowrhon(jst_new) = zmastotn / psnowdzn(jst_new)
1958 zalbmoyn = zalbmoyn / zmastotn
1959 zsphermoyn = max( 0., zsphermoyn/zmastotn )
1960 zdentmoyn = max( 0., zdentmoyn /zmastotn )
1961 zdiam = ( (xvalb5-zalbmoyn)/xvalb6 )**2
1963 IF ( hsnowmetamo==
'B92' )
THEN 1968 psnowgran1n(jst_new) = -xx * zdentmoyn
1970 IF ( zdentmoyn/=1.)
THEN 1971 psnowgran2n(jst_new) = xx * ( ( zdiam*10000. + psnowgran1n(jst_new
1977 IF ( zdiam < xd2/10000. - 0.0000001 )
THEN 1979 IF ( abs( psnowgran1n(jst_new)+xx ) < 0.01 )
THEN 1981 psnowgran2n(jst_new) = xx * zsphermoyn
1983 ELSEIF ( abs( psnowgran1n(jst_new) ) < 0.0001 )
THEN 1985 psnowgran1n(jst_new) = xx * zsphermoyn
1986 psnowgran2n(jst_new) = zdiam
1988 ELSEIF ( psnowgran2n(jst_new) < 0. )
THEN 1990 psnowgran2n(jst_new) = 0.
1992 ELSEIF ( psnowgran2n(jst_new) > xx + 0.0000001 )
THEN 1994 psnowgran2n(jst_new) = xx
1998 ELSEIF ( zdiam > xd3/10000. .OR. zdentmoyn <= 0. + 0.0000001 .OR. &
1999 psnowgran2n(jst_new) < 0. .OR. psnowgran2n(jst_new) > xx )
THEN 2004 psnowgran1n(jst_new) = xx * zsphermoyn
2005 psnowgran2n(jst_new) = zdiam
2011 psnowgran1n(jst_new) = zdiam
2012 psnowgran2n(jst_new) = min( 1., zsphermoyn )
2016 psnowhistn(jst_new) = nint( zhistmoyn/zmastotn )
2017 psnowagen(jst_new) = zagemoyn / zmastotn
2021 IF (
lhook)
CALL dr_hook(
'GET_MASS_HEAT',1,zhook_handle)
2025 SUBROUTINE get_diam(PSNOWGRAN1,PSNOWGRAN2,PDIAM,HSNOWMETAMO)
2027 USE modd_snow_par
, ONLY : xd1, xd2, xd3, xx
2034 REAL,
INTENT(IN) :: PSNOWGRAN1
2035 REAL,
INTENT(IN) :: PSNOWGRAN2
2036 REAL,
INTENT(OUT) :: PDIAM
2038 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
2040 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2044 IF ( hsnowmetamo==
'B92' )
THEN 2046 IF( psnowgran1<0. )
THEN 2047 pdiam = -psnowgran1*xd1/xx + (1.+psnowgran1/xx) * &
2048 ( psnowgran2*xd2/xx + (1.-psnowgran2/xx) * xd3 )
2049 pdiam = pdiam/10000.
2051 pdiam = psnowgran2*psnowgran1/xx + &
2052 max( 0.0004, 0.5*psnowgran2 ) * ( 1.-psnowgran1/xx )
2067 FUNCTION snow3lradabs_0d(PSNOWRHO,PSNOWDZ,PSPECTRALALBEDO,PZENITH,PPERMSNOWFRAC,PDSGRAIN)
RESULT(PCOEF)
2079 USE modd_snow_par
, ONLY : xvspec1,xvspec2,xvspec3,xvbeta1,xvbeta2, &
2080 xvbeta4,xvbeta3,xvbeta5, xmincoszen
2089 REAL,
INTENT(IN) :: PSNOWRHO
2090 REAL,
INTENT(IN) :: PSNOWDZ
2091 REAL,
INTENT(IN) :: PZENITH
2092 REAL,
INTENT(IN) :: PPERMSNOWFRAC
2093 REAL,
DIMENSION(:),
INTENT(IN) :: PSPECTRALALBEDO
2094 REAL,
INTENT(IN) :: PDSGRAIN
2100 REAL :: ZWORK, ZPROJLAT,
2105 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2108 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_0D',0,zhook_handle)
2113 zprojlat = (1.0-ppermsnowfrac)+ppermsnowfrac/ &
2114 max(xmincoszen,cos(pzenith))
2118 zwork = sqrt(pdsgrain)
2119 zbeta1 = max(xvbeta1*psnowrho/zwork,xvbeta2)
2120 zbeta2 = max(xvbeta3*psnowrho/zwork,xvbeta4)
2123 zopticalpath1 = zbeta1*psnowdz
2124 zopticalpath2 = zbeta2*psnowdz
2127 IF(pspectralalbedo(3)==
xundef)
THEN 2128 pcoef =
xsw_wght_vis*(1.0-pspectralalbedo(1))*exp(-zopticalpath1
2131 zopticalpath3 = zbeta3*psnowdz
2132 pcoef = xvspec1*(1.0-pspectralalbedo(1))*exp(-zopticalpath1*zprojlat
2137 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_0D',1,zhook_handle)
2144 FUNCTION snow3lradabs_1d(PSNOWRHO,PSNOWDZ,PSPECTRALALBEDO,PZENITH,PPERMSNOWFRAC,PDSGRAIN)
RESULT(PCOEF)
2156 USE modd_snow_par
, ONLY : xvspec1,xvspec2,xvspec3,xvbeta1,xvbeta2, &
2157 xvbeta4,xvbeta3,xvbeta5, xmincoszen
2166 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWRHO
2167 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWDZ
2168 REAL,
DIMENSION(:),
INTENT(IN) :: PZENITH
2169 REAL,
DIMENSION(:),
INTENT(IN) :: PPERMSNOWFRAC
2170 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSPECTRALALBEDO
2171 REAL,
DIMENSION(:),
INTENT(IN) :: PDSGRAIN
2173 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: PCOEF
2177 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: ZWORK, ZPROJLAT,
2182 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2185 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_1D',0,zhook_handle)
2190 zprojlat(:) = (1.0-ppermsnowfrac(:))+ppermsnowfrac(:)/ &
2191 max(xmincoszen,cos(pzenith(:)))
2195 zwork(:) = sqrt(pdsgrain(:))
2196 zbeta1(:) = max(xvbeta1*psnowrho(:)/zwork(:),xvbeta2)
2197 zbeta2(:) = max(xvbeta3*psnowrho(:)/zwork(:),xvbeta4)
2200 zopticalpath1(:) = zbeta1(:)*psnowdz(:)
2201 zopticalpath2(:) = zbeta2(:)*psnowdz(:)
2202 zopticalpath3(:) =
xundef 2204 WHERE(pspectralalbedo(:,3)==
xundef)
2205 pcoef(:) =
xsw_wght_vis*(1.0-pspectralalbedo(:,1))*exp(-zopticalpath1
2208 zopticalpath3(:) = zbeta3(:)*psnowdz(:)
2209 pcoef(:) = xvspec1*(1.0-pspectralalbedo(:,1))*exp(-zopticalpath1
2214 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_1D',1,zhook_handle)
2221 FUNCTION snow3lradabs_2d(PSNOWRHO,PSNOWDZ,PSPECTRALALBEDO,PZENITH,PPERMSNOWFRAC,PDSGRAIN)
RESULT(PCOEF)
2233 USE modd_snow_par
, ONLY : xvspec1,xvspec2,xvspec3,xvbeta1,xvbeta2, &
2234 xvbeta4,xvbeta3,xvbeta5, xmincoszen
2243 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO
2244 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWDZ
2245 REAL,
DIMENSION(:,:),
INTENT(IN) :: PZENITH
2246 REAL,
DIMENSION(:,:),
INTENT(IN) :: PPERMSNOWFRAC
2247 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSPECTRALALBEDO
2248 REAL,
DIMENSION(:,:),
INTENT(IN) :: PDSGRAIN
2250 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: PCOEF
2254 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZWORK, ZPROJLAT,
2259 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2262 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_2D',0,zhook_handle)
2267 zprojlat(:,:) = (1.0-ppermsnowfrac(:,:))+ppermsnowfrac(:,:)/ &
2268 max(xmincoszen,cos(pzenith(:,:)))
2272 zwork(:,:) = sqrt(pdsgrain(:,:))
2273 zbeta1(:,:) = max(xvbeta1*psnowrho(:,:)/zwork(:,:),xvbeta2)
2274 zbeta2(:,:) = max(xvbeta3*psnowrho(:,:)/zwork(:,:),xvbeta4)
2275 zbeta3(:,:) = xvbeta5
2277 zopticalpath1(:,:) = zbeta1(:,:)*psnowdz(:,:)
2278 zopticalpath2(:,:) = zbeta2(:,:)*psnowdz(:,:)
2279 zopticalpath3(:,:) =
xundef 2281 WHERE(pspectralalbedo(:,:,3)==
xundef)
2282 pcoef(:,:) =
xsw_wght_vis*(1.0-pspectralalbedo(:,:,1))*exp(-zopticalpath1
2285 zopticalpath3(:,:) = zbeta3(:,:)*psnowdz(:,:)
2286 pcoef(:,:) = xvspec1*(1.0-pspectralalbedo(:,:,1))*exp(-zopticalpath1
2291 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_2D',1,zhook_handle)
2298 FUNCTION snow3lradabs_sfc(PSNOWRHO,PSNOWDZ,PSPECTRALALBEDO,PZENITH,PPERMSNOWFRAC,PDSGRAIN)
RESULT(PCOEF)
2310 USE modd_snow_par
, ONLY : xvspec1,xvspec2,xvspec3,xvbeta1,xvbeta2, &
2311 xvbeta4,xvbeta3,xvbeta5, xmincoszen
2321 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO
2322 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWDZ
2323 REAL,
DIMENSION(:),
INTENT(IN) :: PZENITH
2324 REAL,
DIMENSION(:),
INTENT(IN) :: PPERMSNOWFRAC
2325 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSPECTRALALBEDO
2326 REAL,
DIMENSION(:,:),
INTENT(IN) :: PDSGRAIN
2328 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: PCOEF
2332 INTEGER :: JJ, JI, INLVLS, INI
2333 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZPROJLAT, ZOPTICALPATH1
2335 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZWORK, ZBETA1, ZBETA2
2337 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2340 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_SFC',0,zhook_handle)
2342 ini =
SIZE(psnowdz(:,:),1)
2343 inlvls =
SIZE(psnowdz(:,:),2)
2348 zprojlat(:) = (1.0-ppermsnowfrac(:))+ppermsnowfrac(:)/ &
2349 max(xmincoszen,cos(pzenith(:)))
2353 zwork(:,:) = sqrt(pdsgrain(:,:))
2354 zbeta1(:,:) = max(xvbeta1*psnowrho(:,:)/zwork(:,:),xvbeta2)
2355 zbeta2(:,:) = max(xvbeta3*psnowrho(:,:)/zwork(:,:),xvbeta4)
2356 zbeta3(:,:) = xvbeta5
2358 zopticalpath1(:) = 0.0
2359 zopticalpath2(:) = 0.0
2360 zopticalpath3(:) = 0.0
2364 zopticalpath1(ji) = zopticalpath1(ji) + zbeta1(ji,jj)*psnowdz(ji,jj
2367 IF(pspectralalbedo(ji,3)==
xundef)
THEN 2369 pcoef(ji,jj) =
xsw_wght_vis*(1.0-pspectralalbedo(ji,1))*exp
2373 zopticalpath3(ji) = zopticalpath3(ji) + zbeta3(ji,jj)*psnowdz(ji
2384 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_SFC',1,zhook_handle)
2391 SUBROUTINE snow3lthrm(PSNOWRHO,PSCOND,PSNOWTEMP,PPS)
2403 USE modd_snow_par
, ONLY : xvrkz6, xsnowthrmcond1, &
2405 xsnowthrmcond_avap, &
2406 xsnowthrmcond_bvap, &
2416 REAL,
DIMENSION(:),
INTENT(IN) :: PPS
2418 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWTEMP, PSNOWRHO
2420 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PSCOND
2430 CHARACTER(LEN=5) :: YSNOWCOND
2432 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2435 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LTHRM',0,zhook_handle)
2437 ini =
SIZE(psnowrho(:,:),1)
2438 inlvls =
SIZE(psnowrho(:,:),2)
2445 IF(ysnowcond==
'AND76')
THEN 2447 pscond(:,:) = (xsnowthrmcond1 + xsnowthrmcond2*psnowrho(:,:)*psnowrho(
2450 pscond(:,:) =
xcondi * exp(xvrkz6*log(psnowrho(:,:)/
xrholw))
2458 pscond(ji,jj) = pscond(ji,jj) + max(0.0,(xsnowthrmcond_avap+(xsnowthrmcond_bvap
2463 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LTHRM',1,zhook_handle)
2477 USE modd_snow_par
, ONLY : xdsgrain_max,xsnow_agrain, &
2478 xsnow_bgrain,xsnow_cgrain
2487 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO,PSNOWAGE
2489 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: PDOPT
2490 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZAGE
2491 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSRHO4
2493 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2496 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LDOPT_2D',0,zhook_handle)
2498 zage(:,:) = min(15.,psnowage(:,:))
2500 zsrho4(:,:) = psnowrho(:,:)*psnowrho(:,:)*psnowrho(:,:)*psnowrho(:,:)
2502 pdopt(:,:) = min(xdsgrain_max,xsnow_agrain+xsnow_bgrain*zsrho4(:,:)+xsnow_cgrain
2504 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LDOPT_2D',1,zhook_handle)
2514 USE modd_snow_par
, ONLY : xdsgrain_max,xsnow_agrain, &
2515 xsnow_bgrain,xsnow_cgrain
2524 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWRHO,PSNOWAGE
2526 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: PDOPT
2527 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: ZAGE
2528 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: ZSRHO4
2530 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2533 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LDOPT_1D',0,zhook_handle)
2535 zage(:) = min(15.,psnowage(:))
2537 zsrho4(:) = psnowrho(:)*psnowrho(:)*psnowrho(:)*psnowrho(:)
2539 pdopt(:) = min(xdsgrain_max,xsnow_agrain+xsnow_bgrain*zsrho4(:)+xsnow_cgrain
2541 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LDOPT_1D',1,zhook_handle)
2551 USE modd_snow_par
, ONLY : xdsgrain_max,xsnow_agrain, &
2552 xsnow_bgrain,xsnow_cgrain
2561 REAL,
INTENT(IN) :: PSNOWRHO,PSNOWAGE
2567 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2570 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LDOPT_0D',0,zhook_handle)
2572 zage = min(15.,psnowage)
2574 zsrho4 = psnowrho*psnowrho*psnowrho*psnowrho
2576 pdopt = min(xdsgrain_max,xsnow_agrain+xsnow_bgrain*zsrho4+xsnow_cgrain*zage
2578 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LDOPT_0D',1,zhook_handle)
2584 SUBROUTINE snow3lalb(PALBEDOSC,PSPECTRALALBEDO,PSNOWRHO,PSNOWAGE, &
2594 USE modd_snow_par
, ONLY : xvaging_glacier, xvaging_noglacier, &
2595 xvalb2,xvalb3,xvalb4,xvalb5,xvalb6, &
2596 xvalb7,xvalb8,xvalb9,xvalb10,xvalb11, &
2597 xvdiop1,xvrpre1,xvrpre2,xvpres1, &
2598 xvw1,xvw2,xvspec1,xvspec2,xvspec3
2607 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWRHO
2608 REAL,
DIMENSION(:),
INTENT(IN) :: PSNOWAGE
2609 REAL,
DIMENSION(:),
INTENT(IN) :: PPERMSNOWFRAC
2610 REAL,
DIMENSION(:),
INTENT(IN) :: PPS
2612 REAL,
DIMENSION(:),
INTENT(INOUT) :: PALBEDOSC
2613 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSPECTRALALBEDO
2617 REAL,
PARAMETER :: ZALBNIR1 = 0.3
2618 REAL,
PARAMETER :: ZALBNIR2 = 0.0
2620 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: ZVAGING, ZDIAM, ZAGE, &
2623 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: ZALB1, ZALB2, ZALB3
2625 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2629 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LALB',0,zhook_handle)
2635 zvaging(:)=xvaging_glacier*ppermsnowfrac(:) + xvaging_noglacier*(1.0-ppermsnowfrac
2638 zpres_effect(:) = xvalb10*min(max(pps(:)/xvpres1,xvrpre1),xvrpre2)
2644 zage(:) = (1.0-ppermsnowfrac(:))*psnowage(:)
2652 zage(:) = min(365.,psnowage(:))
2654 zwork(:)=sqrt(zdiam(:))
2657 zalb1(:)=min(xvalb4,xvalb2-xvalb3*zwork(:))
2658 zalb1(:)=max(xvalb11,zalb1(:)-zpres_effect(:)*zage(:)/zvaging(:))
2661 zalb2(:)=xvalb5-xvalb6*zwork(:)
2662 zalb2(:)=max(zalbnir1,zalb2(:))
2665 zdiam(:)=min(xvdiop1,zdiam(:))
2666 zwork(:)=sqrt(zdiam(:))
2667 zalb3(:)=xvalb7*zdiam(:)-xvalb8*zwork(:)+xvalb9
2668 zalb3(:)=max(zalbnir2,zalb3(:))
2670 pspectralalbedo(:,1)=zalb1(:)
2671 pspectralalbedo(:,2)=zalb2(:)
2672 pspectralalbedo(:,3)=zalb3(:)
2677 palbedosc(:)=xvspec1*zalb1(:)+xvspec2*zalb2(:)+xvspec3*zalb3(:)
2679 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LALB',1,zhook_handle)
2687 SUBROUTINE snow3lfall(PTSTEP,PSR,PTA,PVMOD,PSNOW,PSNOWRHO,PSNOWDZ, &
2688 PSNOWHEAT,PSNOWHMASS,PSNOWAGE,PPERMSNOWFRAC)
2697 USE modd_snow_par
, ONLY : xrhosmin_es, xsnowdmin, &
2709 REAL,
INTENT(IN) :: PTSTEP
2711 REAL,
DIMENSION(:),
INTENT(IN) :: PSR, PTA, PVMOD, PPERMSNOWFRAC
2713 REAL,
DIMENSION(:),
INTENT(INOUT) :: PSNOW
2715 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWRHO, PSNOWDZ, PSNOWHEAT, PSNOWAGE
2717 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOWHMASS
2727 REAL,
DIMENSION(SIZE(PTA)) :: ZSNOWFALL, ZRHOSNEW, &
2729 ZSNOWFALL_DELTA, ZSCAP, &
2732 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2739 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LFALL',0,zhook_handle)
2741 ini =
SIZE(psnowdz(:,:),1)
2742 inlvls =
SIZE(psnowdz(:,:),2)
2744 zrhosnew(:) = xrhosmin_es
2767 WHERE (psr(:) > 0.0 .AND. psnowdz(:,1)>0.)
2768 zsnowtemp(:) =
xtt + (psnowheat(:,1) + &
2769 xlmtt*psnowrho(:,1)*psnowdz(:,1))/
2774 WHERE (psr(:) > 0.0)
2776 psnowhmass(:) = psr(:)*(
xci*(zsnowtemp(:)-
xtt)-
xlmtt)*ptstep
2780 zrhosnew(:) = max(xrhosmin_es, xsnowfall_a_sn + xsnowfall_b_sn*(pta
2787 psnowage(:,1) = (psnowage(:,1)*psnowdz(:,1)*psnowrho(:,1)+zagenew(:)*psr
2792 zsnowfall(:) = psr(:)*ptstep/zrhosnew(:)
2794 psnow(:) = psnow(:) + zsnowfall(:)
2800 psnowrho(:,1) = (psnowdz(:,1)*psnowrho(:,1) + zsnowfall(:)*zrhosnew(:
2803 psnowdz(:,1) = psnowdz(:,1) + zsnowfall(:)
2809 psnowheat(:,1) = psnowheat(:,1) + psnowhmass(:)
2822 zsnowfall_delta(:) = 0.0
2823 WHERE(zsnow(:) == 0.0 .AND. psr(:) > 0.0)
2824 zsnowfall_delta(:) = 1.0
2830 psnowdz(ji,jj) = zsnowfall_delta(ji)*(zsnowfall(ji) /inlvls) + &
2831 (1.0-zsnowfall_delta(ji))*psnowdz(ji,jj)
2833 psnowheat(ji,jj) = zsnowfall_delta(ji)*(psnowhmass(ji)/inlvls) + &
2834 (1.0-zsnowfall_delta(ji))*psnowheat(ji,jj)
2836 psnowrho(ji,jj) = zsnowfall_delta(ji)*zrhosnew(ji) + &
2837 (1.0-zsnowfall_delta(ji))*psnowrho(ji,jj)
2839 psnowage(ji,jj) = zsnowfall_delta(ji)*(zagenew(ji)/inlvls) + &
2840 (1.0-zsnowfall_delta(ji))*psnowage(ji,jj)
2845 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LFALL',1,zhook_handle)
2852 SUBROUTINE snow3lcompactn(PTSTEP,PSNOWDZMIN,PSNOWRHO,PSNOWDZ,PSNOWTEMP,PSNOW,PSNOWLIQ)
2865 USE modd_snow_par
, ONLY : xrhosmax_es
2877 REAL,
INTENT(IN) :: PTSTEP
2878 REAL,
INTENT(IN) :: PSNOWDZMIN
2880 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWTEMP, PSNOWLIQ
2882 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWRHO, PSNOWDZ
2884 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOW
2894 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWRHO2, ZVISCOCITY
2899 REAL(KIND=JPRB) :: ZHOOK_HANDLE
2906 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LCOMPACTN',0,zhook_handle)
2908 ini =
SIZE(psnowdz(:,:),1)
2909 inlvls =
SIZE(psnowdz(:,:),2)
2911 zsnowrho2(:,:) = psnowrho(:,:)
2912 zsnowdz(:,:) = max(psnowdzmin,psnowdz(:,:))
2913 zviscocity(:,:) = 0.0
2922 zsmass(ji,jj) = zsmass(ji,jj-1) + psnowdz(ji,jj-1)*psnowrho(ji,jj-
2926 zsmass(:,1) = 0.5 * psnowdz(:,1) * psnowrho(:,1)
2933 zwholdmax(:,:) =
snow3lhold(psnowrho,psnowdz)
2934 zwholdmax(:,:) = max(1.e-10, zwholdmax(:,:))
2935 zf1(:,:) = 1.0/(
xvvisc5+10.*min(1.0,psnowliq(:,:)/zwholdmax(:,:)))
2942 IF(psnowrho(ji,jj) < xrhosmax_es)
THEN 2945 ztemp(ji,jj) =
xvvisc4*min(5.0,abs(
xtt-psnowtemp(ji,jj)))
2948 zviscocity(ji,jj) =
xvvisc1*zf1(ji,jj)*exp(
xvvisc3*psnowrho(ji,jj
2951 zsnowrho2(ji,jj) = psnowrho(ji,jj) + psnowrho(ji,jj)*ptstep &
2952 * ( (
xg*zsmass(ji,jj)/zviscocity(ji,jj)) )
2955 psnowdz(ji,jj) = psnowdz(ji,jj)*(psnowrho(ji,jj)/zsnowrho2(ji,jj
2970 psnow(ji) = psnow(ji) + psnowdz(ji,jj)
2976 psnowrho(:,:) = zsnowrho2(:,:)
2978 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LCOMPACTN',1,zhook_handle)
2987 PSNOWRHO,PSNOWHEAT,PSNOWAGE)
2997 USE modd_snow_par
, ONLY : xsnowcritd
3007 REAL,
DIMENSION(: ),
INTENT(IN) :: PSNOW
3009 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWDZN
3010 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWHEAT
3011 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWRHO
3012 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWDZ
3013 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSNOWAGE
3017 INTEGER :: JI, JL, JLO
3022 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWRHON
3023 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWHEATN
3024 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWAGEN
3025 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWZTOP_NEW
3026 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWZBOT_NEW
3027 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWRHOO
3028 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWHEATO
3029 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWAGEO
3030 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWDZO
3031 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWZTOP_OLD
3032 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWZBOT_OLD
3033 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWHEAN
3034 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWAGN
3035 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZMASTOTN
3036 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZMASSDZO
3038 REAL,
DIMENSION(SIZE(PSNOW)) :: ZPSNOW_OLD, ZPSNOW_NEW
3039 REAL,
DIMENSION(SIZE(PSNOW)) :: ZSUMHEAT, ZSUMSWE, ZSUMAGE, ZSNOWMIX_DELTA
3043 REAL(KIND=JPRB) :: ZHOOK_HANDLE
3051 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LTRANSF',0,zhook_handle)
3053 ini =
SIZE(psnowrho,1)
3054 inlvls =
SIZE(psnowrho,2)
3057 zpsnow_old(:) = psnow(:)
3061 zpsnow_new(ji)=zpsnow_new(ji)+psnowdzn(ji,jl)
3067 zsnowdzo(:,:) = psnowdz(:,:)
3068 zsnowrhoo(:,:) = psnowrho(:,:)
3069 zsnowheato(:,:) = psnowheat(:,:)
3070 zsnowageo(:,:) = psnowage(:,:)
3076 zsnowztop_old(:,1) = zpsnow_old(:)
3077 zsnowztop_new(:,1) = zpsnow_new(:)
3078 zsnowzbot_old(:,1) = zsnowztop_old(:,1)-zsnowdzo(:,1)
3079 zsnowzbot_new(:,1) = zsnowztop_new(:,1)-psnowdzn(:,1)
3083 zsnowztop_old(ji,jl) = zsnowzbot_old(ji,jl-1)
3084 zsnowztop_new(ji,jl) = zsnowzbot_new(ji,jl-1)
3085 zsnowzbot_old(ji,jl) = zsnowztop_old(ji,jl )-zsnowdzo(ji,jl)
3086 zsnowzbot_new(ji,jl) = zsnowztop_new(ji,jl )-psnowdzn(ji,jl)
3089 zsnowzbot_old(:,inlvls)=0.0
3090 zsnowzbot_new(:,inlvls)=0.0
3107 IF((zsnowztop_old(ji,jlo)>zsnowzbot_new(ji,jl)).AND.(zsnowzbot_old
THEN 3109 zpropor = (min(zsnowztop_old(ji,jlo), zsnowztop_new(ji,jl)) &
3110 - max(zsnowzbot_old(ji,jlo), zsnowzbot_new(ji,jl)))&
3113 zmassdzo(ji,jlo)=zsnowrhoo(ji,jlo)*zsnowdzo(ji,jlo)*zpropor
3115 zmastotn(ji,jl)=zmastotn(ji,jl)+zmassdzo(ji,jlo)
3116 zsnowagn(ji,jl)=zsnowagn(ji,jl)+zsnowageo(ji,jlo)*zmassdzo(ji
3118 zsnowhean(ji,jl)=zsnowhean(ji,jl)+zsnowheato(ji,jlo)*zpropor
3128 zsnowheatn(:,:)= zsnowhean(:,:)
3129 zsnowagen(:,:)= zsnowagn(:,:)/zmastotn(:,:)
3130 zsnowrhon(:,:)= zmastotn(:,:)/psnowdzn(:,:)
3145 zsnowmix_delta(:) = 0.0
3149 IF(psnow(ji) < xsnowcritd)
THEN 3150 zsumheat(ji) = zsumheat(ji) + psnowheat(ji,jl)
3151 zsumswe(ji) = zsumswe(ji) + psnowrho(ji,jl)*psnowdz(ji
3165 zsnowheatn(ji,jl) = zsnowmix_delta(ji)*(zsumheat(ji)/inlvls) + &
3166 (1.0-zsnowmix_delta(ji))*zsnowheatn(ji,jl)
3168 psnowdzn(ji,jl) = zsnowmix_delta(ji)*(psnow(ji)/inlvls) + &
3169 (1.0-zsnowmix_delta(ji))*psnowdzn(ji,jl)
3171 zsnowrhon(ji,jl) = zsnowmix_delta(ji)*(zsumswe(ji)/psnow(ji)) + &
3172 (1.0-zsnowmix_delta(ji))*zsnowrhon(ji,jl)
3174 zsnowagen(ji,jl) = zsnowmix_delta(ji)*(zsumage(ji)/inlvls) + &
3175 (1.0-zsnowmix_delta(ji))*zsnowagen(ji,jl)
3183 psnowdz(:,:) = psnowdzn(:,:)
3184 psnowrho(:,:) = zsnowrhon(:,:)
3185 psnowheat(:,:) = zsnowheatn(:,:)
3186 psnowage(:,:) = zsnowagen(:,:)
3188 IF (
lhook)
CALL dr_hook(
'MODE_SNOW3L:SNOW3LTRANSF',1,zhook_handle)
real, parameter xsw_wght_vis
real function, dimension(size(psnowrho, 1), size(psnowrho, 2)) snow3lhold_2d(PSNOWRHO, PSNOWDZ)
real function snow3lhold_0d(PSNOWRHO, PSNOWDZ)
function snowcrohold_3d(PSNOWRHO, PSNOWLIQ, PSNOWDZ)
function snowcrohold_1d(PSNOWRHO, PSNOWLIQ, PSNOWDZ)
real function snow3lscap_0d(PSNOWRHO)
function snowcrohold_2d(PSNOWRHO, PSNOWLIQ, PSNOWDZ)
subroutine get_agreg(KID1, KID2, PFIELD1, PFIELD2, PFIELD)
function snow3lradabs_2d(PSNOWRHO, PSNOWDZ, PSPECTRALALBEDO, PZENITH, PPERMS
real function, dimension(size(psnowrho)) snow3ldopt_1d(PSNOWRHO, PSNOWAGE)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2)) snow3lscap_2d(PSNOWRHO)
function snow3lwliqmax_3d(PSNOWRHO)
function snow3lhold_3d(PSNOWRHO, PSNOWDZ)
function snow3lradabs_1d(PSNOWRHO, PSNOWDZ, PSPECTRALALBEDO, PZENITH, PPERMS
function snow3lscap_3d(PSNOWRHO)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2)) snow3lwliqmax_2d(PSNOWRHO)
real function, dimension(size(psnowrho)) snow3lhold_1d(PSNOWRHO, PSNOWDZ)
real function, dimension(size(psnowrho)) snow3lscap_1d(PSNOWRHO)
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
subroutine snow3lgrid_2d(PSNOWDZ, PSNOW, PSNOWDZ_OLD)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2)) snow3ldopt_2d(PSNOWRHO, PSNOWAGE)
real function snow3ldopt_0d(PSNOWRHO, PSNOWAGE)
function snowcrohold_0d(PSNOWRHO, PSNOWLIQ, PSNOWDZ)
function snow3lradabs_0d(PSNOWRHO, PSNOWDZ, PSPECTRALALBEDO, PZENITH, PPERMS
real function, dimension(size(psnowrho)) snow3lwliqmax_1d(PSNOWRHO)
subroutine snow3lgrid_1d(PSNOWDZ, PSNOW, PSNOWDZ_OLD)
real, parameter xsw_wght_nir