148 xwsnowholdmax2, xwsnowholdmax1
150 USE yomhook
,ONLY : lhook, dr_hook
151 USE parkind1
,ONLY : jprb
157 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: psnowrho
159 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: pwliqmax
163 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: zholdmaxr, zsnowrho
164 REAL(KIND=JPRB) :: zhook_handle
168 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LWLIQMAX_3D',0,zhook_handle)
169 zsnowrho(:,:,:) = min(xrhosmax_es, psnowrho(:,:,:))
173 zholdmaxr(:,:,:) = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1)* &
174 max(0.,xsnowrhohold-zsnowrho(:,:,:))/xsnowrhohold
178 pwliqmax(:,:,:) = zholdmaxr(:,:,:)*zsnowrho(:,:,:)
179 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LWLIQMAX_3D',1,zhook_handle)
191 xwsnowholdmax2, xwsnowholdmax1
193 USE yomhook
,ONLY : lhook, dr_hook
194 USE parkind1
,ONLY : jprb
200 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowrho
202 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: pwliqmax
206 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zholdmaxr, zsnowrho
207 REAL(KIND=JPRB) :: zhook_handle
211 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LWLIQMAX_2D',0,zhook_handle)
212 zsnowrho(:,:) = min(xrhosmax_es, psnowrho(:,:))
216 zholdmaxr(:,:) = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1)* &
217 max(0.,xsnowrhohold-zsnowrho(:,:))/xsnowrhohold
221 pwliqmax(:,:) = zholdmaxr(:,:)*zsnowrho(:,:)
222 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LWLIQMAX_2D',1,zhook_handle)
234 xwsnowholdmax2, xwsnowholdmax1
236 USE yomhook
,ONLY : lhook, dr_hook
237 USE parkind1
,ONLY : jprb
243 REAL,
DIMENSION(:),
INTENT(IN) :: psnowrho
245 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: pwliqmax
249 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: zholdmaxr, zsnowrho
250 REAL(KIND=JPRB) :: zhook_handle
254 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LWLIQMAX_1D',0,zhook_handle)
255 zsnowrho(:) = min(xrhosmax_es, psnowrho(:))
259 zholdmaxr(:) = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1)* &
260 max(0.,xsnowrhohold-zsnowrho(:))/xsnowrhohold
264 pwliqmax(:) = zholdmaxr(:)*zsnowrho(:)
265 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LWLIQMAX_1D',1,zhook_handle)
281 xwsnowholdmax2, xwsnowholdmax1
283 USE yomhook
,ONLY : lhook, dr_hook
284 USE parkind1
,ONLY : jprb
290 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: psnowdz, psnowrho
292 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: pwholdmax
296 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: zholdmaxr, zsnowrho
297 REAL(KIND=JPRB) :: zhook_handle
301 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_3D',0,zhook_handle)
302 zsnowrho(:,:,:) = min(xrhosmax_es, psnowrho(:,:,:))
306 zholdmaxr(:,:,:) = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1)* &
307 max(0.,xsnowrhohold-zsnowrho(:,:,:))/xsnowrhohold
311 pwholdmax(:,:,:) = zholdmaxr(:,:,:)*psnowdz(:,:,:)*zsnowrho(:,:,:)/xrholw
312 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_3D',1,zhook_handle)
325 xwsnowholdmax2, xwsnowholdmax1
327 USE yomhook
,ONLY : lhook, dr_hook
328 USE parkind1
,ONLY : jprb
334 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowdz, psnowrho
336 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: pwholdmax
340 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zholdmaxr, zsnowrho
341 REAL(KIND=JPRB) :: zhook_handle
345 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_2D',0,zhook_handle)
346 zsnowrho(:,:) = min(xrhosmax_es, psnowrho(:,:))
350 zholdmaxr(:,:) = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1)* &
351 max(0.,xsnowrhohold-zsnowrho(:,:))/xsnowrhohold
355 pwholdmax(:,:) = zholdmaxr(:,:)*psnowdz(:,:)*zsnowrho(:,:)/xrholw
356 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_2D',1,zhook_handle)
369 xwsnowholdmax2, xwsnowholdmax1
371 USE yomhook
,ONLY : lhook, dr_hook
372 USE parkind1
,ONLY : jprb
378 REAL,
DIMENSION(:),
INTENT(IN) :: psnowdz, psnowrho
380 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: pwholdmax
384 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: zholdmaxr, zsnowrho
385 REAL(KIND=JPRB) :: zhook_handle
389 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_1D',0,zhook_handle)
390 zsnowrho(:) = min(xrhosmax_es, psnowrho(:))
394 zholdmaxr(:) = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1)* &
395 max(0.,xsnowrhohold-zsnowrho(:))/xsnowrhohold
399 pwholdmax(:) = zholdmaxr(:)*psnowdz(:)*zsnowrho(:)/xrholw
400 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_1D',1,zhook_handle)
413 xwsnowholdmax2, xwsnowholdmax1
415 USE yomhook
,ONLY : lhook, dr_hook
416 USE parkind1
,ONLY : jprb
422 REAL,
INTENT(IN) :: psnowdz, psnowrho
428 REAL :: zholdmaxr, zsnowrho
429 REAL(KIND=JPRB) :: zhook_handle
433 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_0D',0,zhook_handle)
434 zsnowrho = min(xrhosmax_es, psnowrho)
438 zholdmaxr = xwsnowholdmax1 + (xwsnowholdmax2-xwsnowholdmax1) * &
439 max(0.,xsnowrhohold-zsnowrho)/xsnowrhohold
443 pwholdmax = zholdmaxr*psnowdz*zsnowrho/xrholw
444 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LHOLD_0D',1,zhook_handle)
458 USE yomhook
,ONLY : lhook, dr_hook
459 USE parkind1
,ONLY : jprb
465 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: psnowdz, psnowliq, psnowrho
467 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: pwholdmax
468 REAL(KIND=JPRB) :: zhook_handle
487 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_3D',0,zhook_handle)
488 pwholdmax(:,:,:) = xpercentagepore/xrholi * (psnowdz * (xrholi-psnowrho) + psnowliq*xrholw)
489 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_3D',1,zhook_handle)
503 USE yomhook
,ONLY : lhook, dr_hook
504 USE parkind1
,ONLY : jprb
510 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowdz, psnowrho, psnowliq
512 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: pwholdmax
513 REAL(KIND=JPRB) :: zhook_handle
531 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_2D',0,zhook_handle)
532 pwholdmax(:,:) = xpercentagepore/xrholi * (psnowdz * (xrholi-psnowrho) + psnowliq*xrholw)
533 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_2D',1,zhook_handle)
549 USE yomhook
,ONLY : lhook, dr_hook
550 USE parkind1
,ONLY : jprb
556 REAL,
DIMENSION(:),
INTENT(IN) :: psnowdz, psnowrho, psnowliq
558 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: pwholdmax
559 REAL(KIND=JPRB) :: zhook_handle
577 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_1D',0,zhook_handle)
578 pwholdmax(:) = xpercentagepore/xrholi * (psnowdz * (xrholi-psnowrho) + psnowliq*xrholw)
579 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_1D',1,zhook_handle)
593 USE yomhook
,ONLY : lhook, dr_hook
594 USE parkind1
,ONLY : jprb
600 REAL,
INTENT(IN) :: psnowdz, psnowrho, psnowliq
603 REAL(KIND=JPRB) :: zhook_handle
621 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_0D',0,zhook_handle)
622 pwholdmax = xpercentagepore/xrholi * (psnowdz * (xrholi-psnowrho) + psnowliq*xrholw)
623 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOWCROHOLD_0D',1,zhook_handle)
637 USE yomhook
,ONLY : lhook, dr_hook
638 USE parkind1
,ONLY : jprb
644 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: psnowrho
646 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: pscap
647 REAL(KIND=JPRB) :: zhook_handle
651 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_3D',0,zhook_handle)
652 pscap(:,:,:) = psnowrho(:,:,:)*xci
653 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_3D',1,zhook_handle)
665 USE yomhook
,ONLY : lhook, dr_hook
666 USE parkind1
,ONLY : jprb
672 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowrho
674 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: pscap
675 REAL(KIND=JPRB) :: zhook_handle
679 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_2D',0,zhook_handle)
680 pscap(:,:) = psnowrho(:,:)*xci
681 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_2D',1,zhook_handle)
693 USE yomhook
,ONLY : lhook, dr_hook
694 USE parkind1
,ONLY : jprb
700 REAL,
DIMENSION(:),
INTENT(IN) :: psnowrho
702 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: pscap
703 REAL(KIND=JPRB) :: zhook_handle
707 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_1D',0,zhook_handle)
708 pscap(:) = psnowrho(:)*xci
709 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_1D',1,zhook_handle)
721 USE yomhook
,ONLY : lhook, dr_hook
722 USE parkind1
,ONLY : jprb
728 REAL,
INTENT(IN) :: psnowrho
731 REAL(KIND=JPRB) :: zhook_handle
735 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_0D',0,zhook_handle)
737 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LSCAP_0D',1,zhook_handle)
789 USE yomhook
,ONLY : lhook, dr_hook
790 USE parkind1
,ONLY : jprb
797 REAL ,
INTENT(IN) :: psnowtemp, psnowrho, pgradt
800 REAL(KIND=JPRB) :: zhook_handle
802 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3L_MARBOUTY',0,zhook_handle)
807 IF( psnowtemp>=xtt-xvtang1 )
THEN
809 IF ( psnowtemp>=xtt-xvtang2 )
THEN
810 pdangl = xvtang4 + xvtang5 * (xtt-psnowtemp) / xvtang6
811 ELSEIF( psnowtemp>=xtt-xvtang3 )
THEN
812 pdangl = xvtang7 - xvtang8 * (xtt-xvtang2-psnowtemp) / xvtang9
814 pdangl = xvtanga - xvtangb * (xtt-xvtang3-psnowtemp) / xvtangc
818 IF ( psnowrho<=xvrang1 )
THEN
820 IF ( psnowrho>xvrang2 )
THEN
821 pdangl = pdangl * ( 1. - (psnowrho-xvrang2)/(xvrang1-xvrang2) )
825 IF ( pgradt<=xvgang1 )
THEN
827 IF ( pgradt<=xvgang2 )
THEN
828 pdangl = pdangl * xvgang5 * (pgradt-xvgang6)/(xvgang2-xvgang6)
829 ELSEIF( pgradt<=xvgang3 )
THEN
830 pdangl = pdangl * ( xvgang7 + xvgang8 * (pgradt-xvgang2)/(xvgang3-xvgang2) )
831 ELSEIF( pgradt<=xvgang4 )
THEN
832 pdangl = pdangl * ( xvgang9 + xvganga * (pgradt-xvgang3)/(xvgang4-xvgang3) )
834 pdangl = pdangl * ( xvgangb + xvgangc * (pgradt-xvgang4)/(xvgang1-xvgang4) )
851 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3L_MARBOUTY',1,zhook_handle)
880 USE yomhook
,ONLY : lhook, dr_hook
881 USE parkind1
,ONLY : jprb
887 REAL,
DIMENSION(: ),
INTENT(IN ) :: psnow
888 REAL,
DIMENSION(:,:),
INTENT(OUT) :: psnowdz
889 REAL,
DIMENSION(:,:),
INTENT(IN ),
OPTIONAL :: psnowdz_old
895 INTEGER :: inlvls, ini
897 REAL,
DIMENSION(SIZE(PSNOW)) :: zwork
899 LOGICAL ,
DIMENSION(SIZE(PSNOW)) :: gregrid
903 REAL,
PARAMETER,
DIMENSION(3) :: zsgcoef1 = (/0.25, 0.50, 0.25/)
904 REAL,
PARAMETER,
DIMENSION(2) :: zsgcoef2 = (/0.05, 0.34/)
906 REAL,
PARAMETER,
DIMENSION(3) :: zsgcoef = (/0.3, 0.4, 0.3/)
910 REAL,
PARAMETER :: zsnowtrans = 0.20
914 REAL,
PARAMETER :: zdz1=0.01
915 REAL,
PARAMETER :: zdz2=0.05
916 REAL,
PARAMETER :: zdz3=0.15
917 REAL,
PARAMETER :: zdz4=0.50
918 REAL,
PARAMETER :: zdz5=1.00
919 REAL,
PARAMETER :: zdzn0=0.02
920 REAL,
PARAMETER :: zdzn1=0.1
921 REAL,
PARAMETER :: zdzn2=0.5
922 REAL,
PARAMETER :: zdzn3=1.0
924 REAL,
PARAMETER :: zcoef1 = 0.5
925 REAL,
PARAMETER :: zcoef2 = 1.5
927 REAL(KIND=JPRB) :: zhook_handle
934 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LGRID_2D',0,zhook_handle)
936 inlvls =
SIZE(psnowdz(:,:),2)
937 ini =
SIZE(psnowdz(:,:),1)
953 psnowdz(ji,1) = psnow(ji)
956 ELSEIF(inlvls == 3)
THEN
958 WHERE(psnow <= xsnowcritd+0.01)
959 psnowdz(:,1) = min(0.01, psnow(:)/inlvls)
960 psnowdz(:,3) = min(0.01, psnow(:)/inlvls)
961 psnowdz(:,2) = psnow(:) - psnowdz(:,1) - psnowdz(:,3)
964 WHERE(psnow <= zsnowtrans .AND. psnow > xsnowcritd+0.01)
965 psnowdz(:,1) = psnow(:)*zsgcoef1(1)
966 psnowdz(:,2) = psnow(:)*zsgcoef1(2)
967 psnowdz(:,3) = psnow(:)*zsgcoef1(3)
970 WHERE(psnow > zsnowtrans)
971 psnowdz(:,1) = zsgcoef2(1)
972 psnowdz(:,2) = (psnow(:)-zsgcoef2(1))*zsgcoef2(2) + zsgcoef2(1)
977 psnowdz(:,2) = min(10*zsgcoef2(1), psnowdz(:,2))
978 psnowdz(:,3) = psnow(:) - psnowdz(:,2) - psnowdz(:,1)
985 ELSEIF(inlvls == 6)
THEN
989 IF(present(psnowdz_old))
THEN
990 gregrid(:) = psnowdz_old(:,1) < zcoef1 * min(zdz1 ,psnow(:)/inlvls) .OR. &
991 & psnowdz_old(:,1) > zcoef2 * min(zdz1 ,psnow(:)/inlvls) .OR. &
992 & psnowdz_old(:,2) < zcoef1 * min(zdz2 ,psnow(:)/inlvls) .OR. &
993 & psnowdz_old(:,2) > zcoef2 * min(zdz2 ,psnow(:)/inlvls) .OR. &
994 & psnowdz_old(:,6) < zcoef1 * min(zdzn1,psnow(:)/inlvls) .OR. &
995 & psnowdz_old(:,6) > zcoef2 * min(zdzn1,psnow(:)/inlvls)
1000 psnowdz(:,1) = min(zdz1,psnow(:)/inlvls)
1001 psnowdz(:,2) = min(zdz2,psnow(:)/inlvls)
1003 psnowdz(:,6) = min(zdzn1,psnow(:)/inlvls)
1005 zwork(:) = psnow(:) - psnowdz(:,1) - psnowdz(:,2) - psnowdz(:,6)
1006 psnowdz(:,3) = zwork(:)*zsgcoef(1)
1007 psnowdz(:,4) = zwork(:)*zsgcoef(2)
1008 psnowdz(:,5) = zwork(:)*zsgcoef(3)
1010 zwork(:)=min(0.0,psnowdz(:,3)-psnowdz(:,2))
1011 psnowdz(:,3)=psnowdz(:,3)-zwork(:)
1012 psnowdz(:,4)=psnowdz(:,4)+zwork(:)
1014 zwork(:)=min(0.0,psnowdz(:,5)-psnowdz(:,6))
1015 psnowdz(:,5)=psnowdz(:,5)-zwork(:)
1016 psnowdz(:,4)=psnowdz(:,4)+zwork(:)
1022 ELSEIF(inlvls == 9)
THEN
1026 IF(present(psnowdz_old))
THEN
1027 gregrid(:) = psnowdz_old(:,1) < zcoef1 * min(zdz1 ,psnow(:)/inlvls) .OR. &
1028 & psnowdz_old(:,1) > zcoef2 * min(zdz1 ,psnow(:)/inlvls) .OR. &
1029 & psnowdz_old(:,2) < zcoef1 * min(zdz2 ,psnow(:)/inlvls) .OR. &
1030 & psnowdz_old(:,2) > zcoef2 * min(zdz2 ,psnow(:)/inlvls) .OR. &
1031 & psnowdz_old(:,9) < zcoef1 * min(zdzn0,psnow(:)/inlvls) .OR. &
1032 & psnowdz_old(:,9) > zcoef2 * min(zdzn0,psnow(:)/inlvls)
1037 psnowdz(:,1) = min(zdz1,psnow(:)/inlvls)
1038 psnowdz(:,2) = min(zdz2,psnow(:)/inlvls)
1039 psnowdz(:,3) = min(zdz3,psnow(:)/inlvls)
1041 psnowdz(:,9)= min(zdzn0,psnow(:)/inlvls)
1042 psnowdz(:,8)= min(zdzn1,psnow(:)/inlvls)
1043 psnowdz(:,7)= min(zdzn2,psnow(:)/inlvls)
1045 zwork(:) = psnow(:) - psnowdz(:, 1) - psnowdz(:, 2) - psnowdz(:, 3) &
1046 - psnowdz(:, 7) - psnowdz(:, 8) - psnowdz(:, 9)
1047 psnowdz(:,4) = zwork(:)*zsgcoef(1)
1048 psnowdz(:,5) = zwork(:)*zsgcoef(2)
1049 psnowdz(:,6) = zwork(:)*zsgcoef(3)
1051 zwork(:)=min(0.0,psnowdz(:,4)-psnowdz(:,3))
1052 psnowdz(:,4)=psnowdz(:,4)-zwork(:)
1053 psnowdz(:,5)=psnowdz(:,5)+zwork(:)
1055 zwork(:)=min(0.0,psnowdz(:,6)-psnowdz(:,7))
1056 psnowdz(:,6)=psnowdz(:,6)-zwork(:)
1057 psnowdz(:,5)=psnowdz(:,5)+zwork(:)
1063 ELSEIF(inlvls == 12)
THEN
1067 IF(present(psnowdz_old))
THEN
1068 gregrid(:) = psnowdz_old(:, 1) < zcoef1 * min(zdz1 ,psnow(:)/inlvls) .OR. &
1069 & psnowdz_old(:, 1) > zcoef2 * min(zdz1 ,psnow(:)/inlvls) .OR. &
1070 & psnowdz_old(:, 2) < zcoef1 * min(zdz2 ,psnow(:)/inlvls) .OR. &
1071 & psnowdz_old(:, 2) > zcoef2 * min(zdz2 ,psnow(:)/inlvls) .OR. &
1072 & psnowdz_old(:,12) < zcoef1 * min(zdzn0,psnow(:)/inlvls) .OR. &
1073 & psnowdz_old(:,12) > zcoef2 * min(zdzn0,psnow(:)/inlvls)
1078 psnowdz(:,1) = min(zdz1,psnow(:)/inlvls)
1079 psnowdz(:,2) = min(zdz2,psnow(:)/inlvls)
1080 psnowdz(:,3) = min(zdz3,psnow(:)/inlvls)
1081 psnowdz(:,4) = min(zdz4,psnow(:)/inlvls)
1082 psnowdz(:,5) = min(zdz5,psnow(:)/inlvls)
1084 psnowdz(:,12)= min(zdzn0,psnow(:)/inlvls)
1085 psnowdz(:,11)= min(zdzn1,psnow(:)/inlvls)
1086 psnowdz(:,10)= min(zdzn2,psnow(:)/inlvls)
1087 psnowdz(:, 9)= min(zdzn3,psnow(:)/inlvls)
1089 zwork(:) = psnow(:) - psnowdz(:, 1) - psnowdz(:, 2) - psnowdz(:, 3) &
1090 - psnowdz(:, 4) - psnowdz(:, 5) - psnowdz(:, 9) &
1091 - psnowdz(:,10) - psnowdz(:,11) - psnowdz(:,12)
1092 psnowdz(:,6) = zwork(:)*zsgcoef(1)
1093 psnowdz(:,7) = zwork(:)*zsgcoef(2)
1094 psnowdz(:,8) = zwork(:)*zsgcoef(3)
1096 zwork(:)=min(0.0,psnowdz(:,6)-psnowdz(:,5))
1097 psnowdz(:,6)=psnowdz(:,6)-zwork(:)
1098 psnowdz(:,7)=psnowdz(:,7)+zwork(:)
1100 zwork(:)=min(0.0,psnowdz(:,8)-psnowdz(:,9))
1101 psnowdz(:,8)=psnowdz(:,8)-zwork(:)
1102 psnowdz(:,7)=psnowdz(:,7)+zwork(:)
1108 ELSEIF(inlvls<10.AND.inlvls/=3.AND.inlvls/=6.AND.inlvls/=9)
THEN
1112 psnowdz(ji,jj) = psnow(ji)/inlvls
1116 psnowdz(:,inlvls) = psnowdz(:,inlvls) + (psnowdz(:,1) - min(0.05, psnowdz(:,1)))
1117 psnowdz(:,1) = min(0.05, psnowdz(:,1))
1119 ELSE !(inlvls>=10 and /=12)
1123 IF(present(psnowdz_old))
THEN
1124 gregrid(:) = psnowdz_old(:, 1) < zcoef1 * min(zdz1 ,psnow(:)/inlvls) .OR. &
1125 & psnowdz_old(:, 1) > zcoef2 * min(zdz1 ,psnow(:)/inlvls) .OR. &
1126 & psnowdz_old(:, 2) < zcoef1 * min(zdz2 ,psnow(:)/inlvls) .OR. &
1127 & psnowdz_old(:, 2) > zcoef2 * min(zdz2 ,psnow(:)/inlvls) .OR. &
1128 & psnowdz_old(:,inlvls) < zcoef1 * min(0.05*psnow(:),psnow(:)/inlvls) .OR. &
1129 & psnowdz_old(:,inlvls) > zcoef2 * min(0.05*psnow(:),psnow(:)/inlvls)
1133 psnowdz(:,1 ) = min(zdz1 ,psnow(:)/inlvls)
1134 psnowdz(:,2 ) = min(zdz2 ,psnow(:)/inlvls)
1135 psnowdz(:,3 ) = min(zdz3 ,psnow(:)/inlvls)
1136 psnowdz(:,4 ) = min(zdz4 ,psnow(:)/inlvls)
1137 psnowdz(:,5 ) = min(zdz5 ,psnow(:)/inlvls)
1138 psnowdz(:,inlvls) = min(0.05*psnow(:),psnow(:)/inlvls)
1144 zwork(ji) = psnowdz(ji,1)+psnowdz(ji,2)+psnowdz(ji,3)+psnowdz(ji,4)+psnowdz(ji,5)
1145 psnowdz(ji,jj) = (psnow(ji)-zwork(ji)-psnowdz(ji,inlvls))/(inlvls-6)
1154 IF(psnow(ji)==xundef)
THEN
1155 psnowdz(ji,jj) = xundef
1156 ELSEIF(.NOT.gregrid(ji))
THEN
1157 psnowdz(ji,jj)=psnowdz_old(ji,jj)
1162 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LGRID_2D',1,zhook_handle)
1190 USE yomhook
,ONLY : lhook, dr_hook
1191 USE parkind1
,ONLY : jprb
1197 REAL,
INTENT(IN ) :: psnow
1198 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowdz
1199 REAL,
DIMENSION(:),
INTENT(IN ),
OPTIONAL :: psnowdz_old
1214 REAL,
PARAMETER,
DIMENSION(3) :: zsgcoef1 = (/0.25, 0.50, 0.25/)
1215 REAL,
PARAMETER,
DIMENSION(2) :: zsgcoef2 = (/0.05, 0.34/)
1217 REAL,
PARAMETER,
DIMENSION(3) :: zsgcoef = (/0.3, 0.4, 0.3/)
1221 REAL,
PARAMETER :: zsnowtrans = 0.20
1225 REAL,
PARAMETER :: zdz1=0.01
1226 REAL,
PARAMETER :: zdz2=0.05
1227 REAL,
PARAMETER :: zdz3=0.15
1228 REAL,
PARAMETER :: zdz4=0.50
1229 REAL,
PARAMETER :: zdz5=1.00
1230 REAL,
PARAMETER :: zdzn0=0.02
1231 REAL,
PARAMETER :: zdzn1=0.1
1232 REAL,
PARAMETER :: zdzn2=0.5
1233 REAL,
PARAMETER :: zdzn3=1.0
1235 REAL,
PARAMETER :: zcoef1 = 0.5
1236 REAL,
PARAMETER :: zcoef2 = 1.5
1238 REAL(KIND=JPRB) :: zhook_handle
1245 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LGRID_1D',0,zhook_handle)
1247 inlvls =
SIZE(psnowdz(:),1)
1263 ELSEIF(inlvls == 3)
THEN
1265 IF(psnow <= xsnowcritd+0.01)
THEN
1266 psnowdz(1) = min(0.01, psnow/inlvls)
1267 psnowdz(3) = min(0.01, psnow/inlvls)
1268 psnowdz(2) = psnow - psnowdz(1) - psnowdz(3)
1271 IF(psnow <= zsnowtrans .AND. psnow > xsnowcritd+0.01)
THEN
1272 psnowdz(1) = psnow*zsgcoef1(1)
1273 psnowdz(2) = psnow*zsgcoef1(2)
1274 psnowdz(3) = psnow*zsgcoef1(3)
1277 IF(psnow > zsnowtrans)
THEN
1278 psnowdz(1) = zsgcoef2(1)
1279 psnowdz(2) = (psnow-zsgcoef2(1))*zsgcoef2(2) + zsgcoef2(1)
1284 psnowdz(2) = min(10*zsgcoef2(1), psnowdz(2))
1285 psnowdz(3) = psnow - psnowdz(2) - psnowdz(1)
1292 ELSEIF(inlvls == 6)
THEN
1296 IF(present(psnowdz_old))
THEN
1297 gregrid = psnowdz_old(1) < zcoef1 * min(zdz1 ,psnow/inlvls) .OR. &
1298 & psnowdz_old(1) > zcoef2 * min(zdz1 ,psnow/inlvls) .OR. &
1299 & psnowdz_old(2) < zcoef1 * min(zdz2 ,psnow/inlvls) .OR. &
1300 & psnowdz_old(2) > zcoef2 * min(zdz2 ,psnow/inlvls) .OR. &
1301 & psnowdz_old(6) < zcoef1 * min(zdzn1,psnow/inlvls) .OR. &
1302 & psnowdz_old(6) > zcoef2 * min(zdzn1,psnow/inlvls)
1307 psnowdz(1) = min(zdz1,psnow/inlvls)
1308 psnowdz(2) = min(zdz2,psnow/inlvls)
1310 psnowdz(6) = min(zdzn1,psnow/inlvls)
1312 zwork = psnow - psnowdz(1) - psnowdz(2) - psnowdz(6)
1313 psnowdz(3) = zwork*zsgcoef(1)
1314 psnowdz(4) = zwork*zsgcoef(2)
1315 psnowdz(5) = zwork*zsgcoef(3)
1317 zwork=min(0.0,psnowdz(3)-psnowdz(2))
1318 psnowdz(3)=psnowdz(3)-zwork
1319 psnowdz(4)=psnowdz(4)+zwork
1321 zwork=min(0.0,psnowdz(5)-psnowdz(6))
1322 psnowdz(5)=psnowdz(5)-zwork
1323 psnowdz(4)=psnowdz(4)+zwork
1329 ELSEIF(inlvls == 9)
THEN
1333 IF(present(psnowdz_old))
THEN
1334 gregrid = psnowdz_old(1) < zcoef1 * min(zdz1 ,psnow/inlvls) .OR. &
1335 & psnowdz_old(1) > zcoef2 * min(zdz1 ,psnow/inlvls) .OR. &
1336 & psnowdz_old(2) < zcoef1 * min(zdz2 ,psnow/inlvls) .OR. &
1337 & psnowdz_old(2) > zcoef2 * min(zdz2 ,psnow/inlvls) .OR. &
1338 & psnowdz_old(9) < zcoef1 * min(zdzn0,psnow/inlvls) .OR. &
1339 & psnowdz_old(9) > zcoef2 * min(zdzn0,psnow/inlvls)
1344 psnowdz(1) = min(zdz1,psnow/inlvls)
1345 psnowdz(2) = min(zdz2,psnow/inlvls)
1346 psnowdz(3) = min(zdz3,psnow/inlvls)
1348 psnowdz(9)= min(zdzn0,psnow/inlvls)
1349 psnowdz(8)= min(zdzn1,psnow/inlvls)
1350 psnowdz(7)= min(zdzn2,psnow/inlvls)
1352 zwork = psnow - psnowdz( 1) - psnowdz( 2) - psnowdz( 3) &
1353 - psnowdz( 7) - psnowdz( 8) - psnowdz( 9)
1354 psnowdz(4) = zwork*zsgcoef(1)
1355 psnowdz(5) = zwork*zsgcoef(2)
1356 psnowdz(6) = zwork*zsgcoef(3)
1358 zwork=min(0.0,psnowdz(4)-psnowdz(3))
1359 psnowdz(4)=psnowdz(4)-zwork
1360 psnowdz(5)=psnowdz(5)+zwork
1362 zwork=min(0.0,psnowdz(6)-psnowdz(7))
1363 psnowdz(6)=psnowdz(6)-zwork
1364 psnowdz(5)=psnowdz(5)+zwork
1370 ELSEIF(inlvls == 12)
THEN
1374 IF(present(psnowdz_old))
THEN
1375 gregrid = psnowdz_old(1) < zcoef1 * min(zdz1 ,psnow/inlvls) .OR. &
1376 & psnowdz_old(1) > zcoef2 * min(zdz1 ,psnow/inlvls) .OR. &
1377 & psnowdz_old(2) < zcoef1 * min(zdz2 ,psnow/inlvls) .OR. &
1378 & psnowdz_old(2) > zcoef2 * min(zdz2 ,psnow/inlvls) .OR. &
1379 & psnowdz_old(12) < zcoef1 * min(zdzn0,psnow/inlvls) .OR. &
1380 & psnowdz_old(12) > zcoef2 * min(zdzn0,psnow/inlvls)
1385 psnowdz(1) = min(zdz1,psnow/inlvls)
1386 psnowdz(2) = min(zdz2,psnow/inlvls)
1387 psnowdz(3) = min(zdz3,psnow/inlvls)
1388 psnowdz(4) = min(zdz4,psnow/inlvls)
1389 psnowdz(5) = min(zdz5,psnow/inlvls)
1391 psnowdz(12)= min(zdzn0,psnow/inlvls)
1392 psnowdz(11)= min(zdzn1,psnow/inlvls)
1393 psnowdz(10)= min(zdzn2,psnow/inlvls)
1394 psnowdz( 9)= min(zdzn3,psnow/inlvls)
1396 zwork = psnow - psnowdz( 1) - psnowdz( 2) - psnowdz( 3) &
1397 - psnowdz( 4) - psnowdz( 5) - psnowdz( 9) &
1398 - psnowdz(10) - psnowdz(11) - psnowdz(12)
1399 psnowdz(6) = zwork*zsgcoef(1)
1400 psnowdz(7) = zwork*zsgcoef(2)
1401 psnowdz(8) = zwork*zsgcoef(3)
1403 zwork=min(0.0,psnowdz(6)-psnowdz(5))
1404 psnowdz(6)=psnowdz(6)-zwork
1405 psnowdz(7)=psnowdz(7)+zwork
1407 zwork=min(0.0,psnowdz(8)-psnowdz(9))
1408 psnowdz(8)=psnowdz(8)-zwork
1409 psnowdz(7)=psnowdz(7)+zwork
1415 ELSE IF(inlvls<10.AND.inlvls/=3.AND.inlvls/=6.AND.inlvls/=9)
THEN
1418 psnowdz(jj) = psnow/inlvls
1421 psnowdz(inlvls) = psnowdz(inlvls) + (psnowdz(1) - min(0.05, psnowdz(1)))
1422 psnowdz(1) = min(0.05, psnowdz(1))
1426 IF(present(psnowdz_old))
THEN
1427 gregrid = psnowdz_old( 1) < zcoef1 * min(zdz1 ,psnow/inlvls) .OR. &
1428 & psnowdz_old( 1) > zcoef2 * min(zdz1 ,psnow/inlvls) .OR. &
1429 & psnowdz_old( 2) < zcoef1 * min(zdz2 ,psnow/inlvls) .OR. &
1430 & psnowdz_old( 2) > zcoef2 * min(zdz2 ,psnow/inlvls) .OR. &
1431 & psnowdz_old(inlvls) < zcoef1 * min(0.05*psnow,psnow/inlvls) .OR. &
1432 & psnowdz_old(inlvls) > zcoef2 * min(0.05*psnow,psnow/inlvls)
1436 psnowdz( 1) = min(zdz1 ,psnow/inlvls)
1437 psnowdz( 2) = min(zdz2 ,psnow/inlvls)
1438 psnowdz( 3) = min(zdz3 ,psnow/inlvls)
1439 psnowdz( 4) = min(zdz4 ,psnow/inlvls)
1440 psnowdz( 5) = min(zdz5 ,psnow/inlvls)
1441 psnowdz(inlvls) = min(0.05*psnow,psnow/inlvls)
1442 zwork = sum(psnowdz(1:5))
1444 psnowdz(jj) = (psnow - zwork -psnowdz(inlvls))/(inlvls-6)
1451 IF(psnow==xundef)
THEN
1452 psnowdz(jj) = xundef
1453 ELSEIF(.NOT.gregrid)
THEN
1454 psnowdz(jj) = psnowdz_old(jj)
1458 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LGRID_1D',1,zhook_handle)
1464 SUBROUTINE snow3lagreg(PSNOWDZN,PSNOWDZ,PSNOWRHO,PSNOWGRAN1, PSNOWGRAN2, &
1465 psnowhist,psnowgran1n,psnowgran2n,psnowhistn, &
1470 USE yomhook
,ONLY : lhook, dr_hook
1471 USE parkind1
,ONLY : jprb
1477 REAL,
DIMENSION(:),
INTENT(IN) :: psnowdzn,psnowdz,psnowrho,psnowddz
1479 REAL,
DIMENSION(:),
INTENT(IN) :: psnowgran1,psnowgran2,psnowhist
1480 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowgran1n,psnowgran2n,psnowhistn
1482 INTEGER,
INTENT(IN) :: kl1
1483 INTEGER,
INTENT(IN) :: kl2
1488 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zsnowrho
1489 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zdiamd,zdiamv,zspherd,zspherv,&
1490 zdiamn,zsphern,zdent
1492 REAL :: zdelta, zcomp
1494 INTEGER :: ident, ivieu, il
1496 REAL(KIND=JPRB) :: zhook_handle
1498 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LAGREG',0,zhook_handle)
1512 IF ( psnowhist(kl1)/=psnowhist(kl2) )
THEN
1513 psnowhistn(kl1) = 0.0
1520 IF ( psnowgran1(kl1)*psnowgran1(kl2)>0.0 .OR. &
1521 ( psnowgran1(kl1)==0.0 .AND. psnowgran1(kl2)>=0.0 ) .OR. &
1522 ( psnowgran1(kl2)==0.0 .AND. psnowgran1(kl1)>=0.0 ) )
THEN
1543 CALL
get_agreg(kl1,kl2,psnowgran1(kl1),psnowgran1(kl2),psnowgran1n(kl1))
1545 CALL
get_agreg(kl1,kl2,psnowgran2(kl1),psnowgran2(kl2),psnowgran2n(kl1))
1553 IF ( psnowgran1(kl1)<0.0 )
THEN
1561 zdiamd(kl1) = - psnowgran1(ident)/xgran * xdiaet + ( 1.0 + psnowgran1(ident)/xgran ) * &
1562 ( psnowgran2(ident)/xgran * xdiagf + ( 1.0 - psnowgran2(ident)/xgran ) * xdiafp )
1564 zspherd(kl1) = psnowgran2(ident)/xgran
1565 zdiamv(kl1) = psnowgran2(ivieu)
1566 zspherv(kl1) = psnowgran1(ivieu)/xgran
1572 IF ( ident==kl1 )
THEN
1583 CALL
get_agreg(ident,ivieu,zdiamd(kl1),zdiamv(kl1),zdiamn(kl1))
1597 CALL
get_agreg(ident,ivieu,zspherd(kl1),zspherv(kl1),zsphern(kl1))
1620 CALL
get_agreg(ivieu,ident,zdiamv(kl1),zdiamd(kl1),zdiamn(kl1))
1622 CALL
get_agreg(ivieu,ident,zspherv(kl1),zspherd(kl1),zsphern(kl1))
1627 zcomp = zsphern(kl1) * xdiagf + ( 1.-zsphern(kl1) ) * xdiafp
1628 IF( zdiamn(kl1) < zcomp )
THEN
1630 zdent(kl1) = ( zdiamn(kl1) - zcomp ) / ( xdiaet - zcomp )
1632 psnowgran1n(kl1) = - xgran * zdent(kl1)
1633 psnowgran2n(kl1) = xgran * zsphern(kl1)
1637 psnowgran1n(kl1) = xgran * zsphern(kl1)
1638 psnowgran2n(kl1) = zdiamn(kl1)
1644 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LAGREG',1,zhook_handle)
1654 INTEGER,
INTENT(IN) :: kid1, kid2
1655 REAL,
INTENT(IN) :: pfield1, pfield2
1656 REAL,
INTENT(OUT) :: pfield
1658 REAL(KIND=JPRB) :: zhook_handle
1660 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LAGREG:GET_AGREG',0,zhook_handle)
1662 pfield = ( pfield1 * psnowrho(kid1) * ( psnowdzn(kid1) - abs(psnowddz(il)) ) &
1663 + pfield2 * psnowrho(kid2) * abs(psnowddz(il)) ) / &
1664 ( psnowrho(kl1) * ( psnowdzn(kl1) - abs(psnowddz(il)) ) + &
1665 psnowrho(kl2) * abs(psnowddz(il)) )
1667 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LAGREG:GET_AGREG',1,zhook_handle)
1678 psnowgran1n,psnowgran2n,psnowhistn,pndent,pnvieu,&
1683 USE yomhook
,ONLY : lhook, dr_hook
1684 USE parkind1
,ONLY : jprb
1690 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowgran1,psnowgran2,psnowhist
1692 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psnowgran1n,psnowgran2n,psnowhistn
1694 REAL,
DIMENSION(:),
INTENT(IN) :: pndent, pnvieu
1696 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
1699 REAL,
DIMENSION(SIZE(PSNOWGRAN1,1)) :: zgran1, zgran2, zhist
1701 LOGICAL,
DIMENSION(SIZE(PSNOWGRAN1,1),SIZE(PSNOWGRAN1,2)) :: gdendritic
1704 INTEGER :: inlvls, ini
1706 REAL(KIND=JPRB) :: zhook_handle
1710 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LAVGRAIN',0,zhook_handle)
1712 inlvls =
SIZE(psnowgran1,2)
1713 ini =
SIZE(psnowgran1,1)
1721 IF ( pndent(ji)==0.0 .AND. pnvieu(ji)==0.0 )
THEN
1730 IF ( hsnowmetamo==
'B92' )
THEN
1731 gdendritic(ji,jl) = ( psnowgran1(ji,jl) < 0.0 )
1733 gdendritic(ji,jl) = ( psnowgran1(ji,jl) < xvdiam6*(4.-psnowgran2(ji,jl)) - xuepsi )
1737 IF ( pndent(ji)>=pnvieu(ji) )
THEN
1740 IF ( gdendritic(ji,jl) )
THEN
1741 zgran1(ji) = zgran1(ji) + psnowgran1(ji,jl)
1742 zgran2(ji) = zgran2(ji) + psnowgran2(ji,jl)
1746 psnowgran1n(ji,:) = zgran1(ji) / pndent(ji)
1747 psnowgran2n(ji,:) = zgran2(ji) / pndent(ji)
1748 psnowhistn(ji,:) = 0.0
1753 IF ( .NOT.gdendritic(ji,jl) )
THEN
1754 zgran1(ji) = zgran1(ji) + psnowgran1(ji,jl)
1755 zgran2(ji) = zgran2(ji) + psnowgran2(ji,jl)
1756 zhist(ji) = zhist(ji) + psnowhist(ji,jl)
1760 psnowgran1n(ji,:) = zgran1(ji) / pnvieu(ji)
1761 psnowgran2n(ji,:) = zgran2(ji) / pnvieu(ji)
1762 psnowhistn(ji,:) = zhist(ji) / pnvieu(ji)
1773 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LAVGRAIN',1,zhook_handle)
1780 FUNCTION snow3ldiftyp(PGRAIN1,PGRAIN2,PGRAIN3,PGRAIN4,HSNOWMETAMO) RESULT(ZDIFTYPE)
1788 USE yomhook
,ONLY : lhook, dr_hook
1789 USE parkind1
,ONLY : jprb
1793 REAL,
INTENT(IN) :: pgrain1, pgrain2, pgrain3, pgrain4
1794 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
1795 REAL :: zdiftype, zcoef3, zcoef4
1796 REAL(KIND=JPRB) :: zhook_handle
1799 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LDIFTYP',0,zhook_handle)
1801 IF ( hsnowmetamo==
'B92' )
THEN
1803 IF ( ( pgrain1<0. .AND. pgrain2>=0.) .OR. ( pgrain1>=0. .AND. pgrain2<0. ) )
THEN
1805 ELSEIF ( pgrain1<0. )
THEN
1806 zdiftype = abs( pgrain1-pgrain2 ) * .5 + abs( pgrain3-pgrain4 ) * .5
1808 zdiftype = abs( pgrain1-pgrain2 ) + abs( pgrain3-pgrain4 ) * 5. * 10000.
1813 zcoef3 = xvdiam6 * (4.-pgrain3) - xuepsi
1814 zcoef4 = xvdiam6 * (4.-pgrain4) - xuepsi
1815 IF ( ( pgrain1<zcoef3 .AND. pgrain2>=zcoef4 ) .OR. ( pgrain1>=zcoef3 .AND. pgrain2<zcoef4 ) )
THEN
1817 ELSEIF ( pgrain1<zcoef3 )
THEN
1818 zdiftype = abs( (pgrain3-pgrain4)*xgran ) * .5 + &
1819 abs( ( (pgrain1/xvdiam6 - 4. + pgrain3) / (pgrain3 - 3.) - &
1820 (pgrain2/xvdiam6 - 4. + pgrain4) / (pgrain4 - 3.) ) * xgran ) * .5
1823 zdiftype = abs( (pgrain3-pgrain4)*xgran ) + abs( zcoef3-zcoef4 ) * 5. * 10000.
1828 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LDIFTYP',1,zhook_handle)
1834 psnowztop_old,psnowztop_new,psnowzbot_old,psnowzbot_new, &
1835 psnowrhoo,psnowdzo,psnowgran1o,psnowgran2o,psnowhisto, &
1836 psnowageo,psnowheato, &
1837 psnowrhon,psnowdzn,psnowgran1n,psnowgran2n,psnowhistn, &
1838 psnowagen, psnowheatn,hsnowmetamo )
1840 USE modd_snow_par, ONLY : xsnowcritd, xd1, xd2, xd3, xx, xvalb5, xvalb6
1842 USE yomhook
,ONLY : lhook, dr_hook
1843 USE parkind1
,ONLY : jprb
1847 INTEGER,
INTENt(IN) :: kj
1848 INTEGER,
INTENT(IN) :: knlvls_new, knlvls_old
1849 REAL,
DIMENSION(:),
INTENT(IN) :: psnowztop_old, psnowzbot_old
1850 REAL,
DIMENSION(:),
INTENT(IN) :: psnowztop_new, psnowzbot_new
1851 REAL,
DIMENSION(:),
INTENT(IN) :: psnowrhoo, psnowdzo, psnowgran1o, psnowgran2o, &
1852 psnowhisto, psnowageo, psnowheato
1853 REAL,
DIMENSION(:),
INTENT(IN) :: psnowdzn
1854 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
1855 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowrhon, psnowgran1n, psnowgran2n, &
1856 psnowhistn, psnowagen, psnowheatn
1858 REAL :: zpropor, zmasdz_old, zdiam, zmastot_t07
1859 REAL :: zsnowhean, zmastotn, zdentmoyn, zsphermoyn, zalbmoyn, zhistmoyn
1862 INTEGER :: jst_new, jst_old
1864 REAL(KIND=JPRB) :: zhook_handle
1866 IF (lhook) CALL dr_hook(
'GET_MASS_HEAT',0,zhook_handle)
1875 DO jst_new = 1,knlvls_new
1888 DO jst_old = 1,knlvls_old
1890 IF( psnowztop_old(jst_old)<=psnowzbot_new(jst_new) )
THEN
1892 ELSEIF ( psnowzbot_old(jst_old)>=psnowztop_new(jst_new) )
THEN
1897 zpropor = ( min( psnowztop_old(jst_old), psnowztop_new(jst_new) ) &
1898 - max( psnowzbot_old(jst_old), psnowzbot_new(jst_new) ) ) &
1900 zmasdz_old = zpropor * psnowrhoo(jst_old) * psnowdzo(jst_old)
1902 zmastotn = zmastotn + zmasdz_old
1903 zmastot_t07 = zmastot_t07 + 1.
1905 zsnowhean = zsnowhean + zpropor * psnowheato(jst_old)
1907 IF ( hsnowmetamo==
'B92' )
THEN
1910 IF ( psnowgran1o(jst_old)<0. )
THEN
1911 zdiam = -psnowgran1o(jst_old)*xd1/xx + (1.+psnowgran1o(jst_old)/xx) * &
1912 ( psnowgran2o(jst_old)*xd2/xx + (1.-psnowgran2o(jst_old)/xx)*xd3 )
1913 zdiam = zdiam/10000.
1914 zdentmoyn = zdentmoyn - zmasdz_old * psnowgran1o(jst_old) / xx
1915 zsphermoyn = zsphermoyn + zmasdz_old * psnowgran2o(jst_old) / xx
1917 zdiam = psnowgran2o(jst_old)
1918 zdentmoyn = zdentmoyn + zmasdz_old * 0.
1919 zsphermoyn = zsphermoyn + zmasdz_old * psnowgran1o(jst_old) / xx
1924 zdiam = psnowgran1o(jst_old)
1925 zsphermoyn = zsphermoyn + zmasdz_old * psnowgran2o(jst_old)
1929 zalbmoyn = zalbmoyn + max( 0., zmasdz_old * (xvalb5-xvalb6*sqrt(zdiam)) )
1930 zhistmoyn = zhistmoyn + zmasdz_old * psnowhisto(jst_old)
1931 zagemoyn = zagemoyn + zmasdz_old * psnowageo(jst_old)
1939 psnowheatn(jst_new) = zsnowhean
1940 psnowrhon(jst_new) = zmastotn / psnowdzn(jst_new)
1942 zalbmoyn = zalbmoyn / zmastotn
1943 zsphermoyn = max( 0., zsphermoyn/zmastotn )
1944 zdentmoyn = max( 0., zdentmoyn /zmastotn )
1945 zdiam = ( (xvalb5-zalbmoyn)/xvalb6 )**2
1947 IF ( hsnowmetamo==
'B92' )
THEN
1952 psnowgran1n(jst_new) = -xx * zdentmoyn
1954 IF ( zdentmoyn/=1.)
THEN
1955 psnowgran2n(jst_new) = xx * ( ( zdiam*10000. + psnowgran1n(jst_new)*xd1/xx ) &
1956 / ( 1. + psnowgran1n(jst_new)/xx ) - xd3 ) &
1961 IF ( zdiam < xd2/10000. - 0.0000001 )
THEN
1963 IF ( abs( psnowgran1n(jst_new)+xx ) < 0.01 )
THEN
1965 psnowgran2n(jst_new) = xx * zsphermoyn
1967 ELSEIF ( abs( psnowgran1n(jst_new) ) < 0.0001 )
THEN
1969 psnowgran1n(jst_new) = xx * zsphermoyn
1970 psnowgran2n(jst_new) = zdiam
1972 ELSEIF ( psnowgran2n(jst_new) < 0. )
THEN
1974 psnowgran2n(jst_new) = 0.
1976 ELSEIF ( psnowgran2n(jst_new) > xx + 0.0000001 )
THEN
1978 psnowgran2n(jst_new) = xx
1982 ELSEIF ( zdiam > xd3/10000. .OR. zdentmoyn <= 0. + 0.0000001 .OR. &
1983 psnowgran2n(jst_new) < 0. .OR. psnowgran2n(jst_new) > xx )
THEN
1988 psnowgran1n(jst_new) = xx * zsphermoyn
1989 psnowgran2n(jst_new) = zdiam
1995 psnowgran1n(jst_new) = zdiam
1996 psnowgran2n(jst_new) = min( 1., zsphermoyn )
2000 psnowhistn(jst_new) = nint( zhistmoyn/zmastotn )
2001 psnowagen(jst_new) = zagemoyn / zmastotn
2005 IF (lhook) CALL dr_hook(
'GET_MASS_HEAT',1,zhook_handle)
2009 SUBROUTINE get_diam(PSNOWGRAN1,PSNOWGRAN2,PDIAM,HSNOWMETAMO)
2013 USE yomhook
,ONLY : lhook, dr_hook
2014 USE parkind1
,ONLY : jprb
2018 REAL,
INTENT(IN) :: psnowgran1
2019 REAL,
INTENT(IN) :: psnowgran2
2020 REAL,
INTENT(OUT) :: pdiam
2022 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
2024 REAL(KIND=JPRB) :: zhook_handle
2026 IF (lhook) CALL dr_hook(
'GET_DIAM',0,zhook_handle)
2028 IF ( hsnowmetamo==
'B92' )
THEN
2030 IF( psnowgran1<0. )
THEN
2031 pdiam = -psnowgran1*xd1/xx + (1.+psnowgran1/xx) * &
2032 ( psnowgran2*xd2/xx + (1.-psnowgran2/xx) * xd3 )
2033 pdiam = pdiam/10000.
2035 pdiam = psnowgran2*psnowgran1/xx + &
2036 max( 0.0004, 0.5*psnowgran2 ) * ( 1.-psnowgran1/xx )
2045 IF (lhook) CALL dr_hook(
'GET_DIAM',1,zhook_handle)
2051 FUNCTION snow3lradabs_0d(PSNOWRHO,PSNOWDZ,PSPECTRALALBEDO,PZENITH,PPERMSNOWFRAC,PDSGRAIN) RESULT(PCOEF)
2063 USE modd_snow_par, ONLY : xvspec1,xvspec2,xvspec3,xvbeta1,xvbeta2, &
2064 xvbeta4,xvbeta3,xvbeta5, xmincoszen
2066 USE yomhook
,ONLY : lhook, dr_hook
2067 USE parkind1
,ONLY : jprb
2073 REAL,
INTENT(IN) :: psnowrho
2074 REAL,
INTENT(IN) :: psnowdz
2075 REAL,
INTENT(IN) :: pzenith
2076 REAL,
INTENT(IN) :: ppermsnowfrac
2077 REAL,
DIMENSION(:),
INTENT(IN) :: pspectralalbedo
2078 REAL,
INTENT(IN) :: pdsgrain
2084 REAL :: zwork, zprojlat, &
2085 zbeta1, zbeta2, zbeta3, &
2086 zopticalpath1, zopticalpath2, &
2089 REAL(KIND=JPRB) :: zhook_handle
2092 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_0D',0,zhook_handle)
2097 zprojlat = (1.0-ppermsnowfrac)+ppermsnowfrac/ &
2098 max(xmincoszen,cos(pzenith))
2102 zwork = sqrt(pdsgrain)
2103 zbeta1 = max(xvbeta1*psnowrho/zwork,xvbeta2)
2104 zbeta2 = max(xvbeta3*psnowrho/zwork,xvbeta4)
2107 zopticalpath1 = zbeta1*psnowdz
2108 zopticalpath2 = zbeta2*psnowdz
2109 zopticalpath3 = xundef
2111 IF(pspectralalbedo(3)==xundef)
THEN
2112 pcoef = xsw_wght_vis*(1.0-pspectralalbedo(1))*exp(-zopticalpath1*zprojlat) &
2113 + xsw_wght_nir*(1.0-pspectralalbedo(2))*exp(-zopticalpath2*zprojlat)
2115 zopticalpath3 = zbeta3*psnowdz
2116 pcoef = xvspec1*(1.0-pspectralalbedo(1))*exp(-zopticalpath1*zprojlat) &
2117 + xvspec2*(1.0-pspectralalbedo(2))*exp(-zopticalpath2*zprojlat) &
2118 + xvspec3*(1.0-pspectralalbedo(3))*exp(-zopticalpath3*zprojlat)
2121 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_0D',1,zhook_handle)
2128 FUNCTION snow3lradabs_1d(PSNOWRHO,PSNOWDZ,PSPECTRALALBEDO,PZENITH,PPERMSNOWFRAC,PDSGRAIN) RESULT(PCOEF)
2140 USE modd_snow_par, ONLY : xvspec1,xvspec2,xvspec3,xvbeta1,xvbeta2, &
2141 xvbeta4,xvbeta3,xvbeta5, xmincoszen
2143 USE yomhook
,ONLY : lhook, dr_hook
2144 USE parkind1
,ONLY : jprb
2150 REAL,
DIMENSION(:),
INTENT(IN) :: psnowrho
2151 REAL,
DIMENSION(:),
INTENT(IN) :: psnowdz
2152 REAL,
DIMENSION(:),
INTENT(IN) :: pzenith
2153 REAL,
DIMENSION(:),
INTENT(IN) :: ppermsnowfrac
2154 REAL,
DIMENSION(:,:),
INTENT(IN) :: pspectralalbedo
2155 REAL,
DIMENSION(:),
INTENT(IN) :: pdsgrain
2157 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: pcoef
2161 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: zwork, zprojlat, &
2162 zbeta1, zbeta2, zbeta3, &
2163 zopticalpath1, zopticalpath2, &
2166 REAL(KIND=JPRB) :: zhook_handle
2169 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_1D',0,zhook_handle)
2174 zprojlat(:) = (1.0-ppermsnowfrac(:))+ppermsnowfrac(:)/ &
2175 max(xmincoszen,cos(pzenith(:)))
2179 zwork(:) = sqrt(pdsgrain(:))
2180 zbeta1(:) = max(xvbeta1*psnowrho(:)/zwork(:),xvbeta2)
2181 zbeta2(:) = max(xvbeta3*psnowrho(:)/zwork(:),xvbeta4)
2184 zopticalpath1(:) = zbeta1(:)*psnowdz(:)
2185 zopticalpath2(:) = zbeta2(:)*psnowdz(:)
2186 zopticalpath3(:) = xundef
2188 WHERE(pspectralalbedo(:,3)==xundef)
2189 pcoef(:) = xsw_wght_vis*(1.0-pspectralalbedo(:,1))*exp(-zopticalpath1(:)*zprojlat(:)) &
2190 + xsw_wght_nir*(1.0-pspectralalbedo(:,2))*exp(-zopticalpath2(:)*zprojlat(:))
2192 zopticalpath3(:) = zbeta3(:)*psnowdz(:)
2193 pcoef(:) = xvspec1*(1.0-pspectralalbedo(:,1))*exp(-zopticalpath1(:)*zprojlat(:)) &
2194 + xvspec2*(1.0-pspectralalbedo(:,2))*exp(-zopticalpath2(:)*zprojlat(:)) &
2195 + xvspec3*(1.0-pspectralalbedo(:,3))*exp(-zopticalpath3(:)*zprojlat(:))
2198 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_1D',1,zhook_handle)
2205 FUNCTION snow3lradabs_2d(PSNOWRHO,PSNOWDZ,PSPECTRALALBEDO,PZENITH,PPERMSNOWFRAC,PDSGRAIN) RESULT(PCOEF)
2217 USE modd_snow_par, ONLY : xvspec1,xvspec2,xvspec3,xvbeta1,xvbeta2, &
2218 xvbeta4,xvbeta3,xvbeta5, xmincoszen
2220 USE yomhook
,ONLY : lhook, dr_hook
2221 USE parkind1
,ONLY : jprb
2227 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowrho
2228 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowdz
2229 REAL,
DIMENSION(:,:),
INTENT(IN) :: pzenith
2230 REAL,
DIMENSION(:,:),
INTENT(IN) :: ppermsnowfrac
2231 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: pspectralalbedo
2232 REAL,
DIMENSION(:,:),
INTENT(IN) :: pdsgrain
2234 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: pcoef
2238 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zwork, zprojlat, &
2239 zbeta1, zbeta2, zbeta3, &
2240 zopticalpath1, zopticalpath2, &
2243 REAL(KIND=JPRB) :: zhook_handle
2246 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_2D',0,zhook_handle)
2251 zprojlat(:,:) = (1.0-ppermsnowfrac(:,:))+ppermsnowfrac(:,:)/ &
2252 max(xmincoszen,cos(pzenith(:,:)))
2256 zwork(:,:) = sqrt(pdsgrain(:,:))
2257 zbeta1(:,:) = max(xvbeta1*psnowrho(:,:)/zwork(:,:),xvbeta2)
2258 zbeta2(:,:) = max(xvbeta3*psnowrho(:,:)/zwork(:,:),xvbeta4)
2259 zbeta3(:,:) = xvbeta5
2261 zopticalpath1(:,:) = zbeta1(:,:)*psnowdz(:,:)
2262 zopticalpath2(:,:) = zbeta2(:,:)*psnowdz(:,:)
2263 zopticalpath3(:,:) = xundef
2265 WHERE(pspectralalbedo(:,:,3)==xundef)
2266 pcoef(:,:) = xsw_wght_vis*(1.0-pspectralalbedo(:,:,1))*exp(-zopticalpath1(:,:)*zprojlat(:,:)) &
2267 + xsw_wght_nir*(1.0-pspectralalbedo(:,:,2))*exp(-zopticalpath2(:,:)*zprojlat(:,:))
2269 zopticalpath3(:,:) = zbeta3(:,:)*psnowdz(:,:)
2270 pcoef(:,:) = xvspec1*(1.0-pspectralalbedo(:,:,1))*exp(-zopticalpath1(:,:)*zprojlat(:,:)) &
2271 + xvspec2*(1.0-pspectralalbedo(:,:,2))*exp(-zopticalpath2(:,:)*zprojlat(:,:)) &
2272 + xvspec3*(1.0-pspectralalbedo(:,:,3))*exp(-zopticalpath3(:,:)*zprojlat(:,:))
2275 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LRADABS_2D',1,zhook_handle)
2292 USE modd_csts, ONLY : xp00, xcondi, xrholw
2296 xsnowthrmcond_avap, &
2297 xsnowthrmcond_bvap, &
2300 USE yomhook
,ONLY : lhook, dr_hook
2301 USE parkind1
,ONLY : jprb
2307 REAL,
DIMENSION(:),
INTENT(IN) :: pps
2309 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowtemp, psnowrho
2311 REAL,
DIMENSION(:,:),
INTENT(OUT) :: pscond
2321 CHARACTER(LEN=5) :: ysnowcond
2323 REAL(KIND=JPRB) :: zhook_handle
2326 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LTHRM',0,zhook_handle)
2328 ini =
SIZE(psnowrho(:,:),1)
2329 inlvls =
SIZE(psnowrho(:,:),2)
2336 IF(ysnowcond==
'AND76')
THEN
2338 pscond(:,:) = (xsnowthrmcond1 + xsnowthrmcond2*psnowrho(:,:)*psnowrho(:,:))
2341 pscond(:,:) = xcondi * exp(xvrkz6*log(psnowrho(:,:)/xrholw))
2349 pscond(ji,jj) = pscond(ji,jj) + max(0.0,(xsnowthrmcond_avap+(xsnowthrmcond_bvap/(psnowtemp(ji,jj) &
2350 + xsnowthrmcond_cvap)))*(xp00/pps(ji)))
2354 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LTHRM',1,zhook_handle)
2369 xsnow_bgrain,xsnow_cgrain
2371 USE yomhook
,ONLY : lhook, dr_hook
2372 USE parkind1
,ONLY : jprb
2378 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowrho,psnowage
2380 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: pdopt
2381 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zage
2382 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsrho4
2384 REAL(KIND=JPRB) :: zhook_handle
2387 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LDOPT_2D',0,zhook_handle)
2389 zage(:,:) = min(15.,psnowage(:,:))
2391 zsrho4(:,:) = psnowrho(:,:)*psnowrho(:,:)*psnowrho(:,:)*psnowrho(:,:)
2393 pdopt(:,:) = min(xdsgrain_max,xsnow_agrain+xsnow_bgrain*zsrho4(:,:)+xsnow_cgrain*zage(:,:))
2395 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LDOPT_2D',1,zhook_handle)
2406 xsnow_bgrain,xsnow_cgrain
2408 USE yomhook
,ONLY : lhook, dr_hook
2409 USE parkind1
,ONLY : jprb
2415 REAL,
DIMENSION(:),
INTENT(IN) :: psnowrho,psnowage
2417 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: pdopt
2418 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: zage
2419 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: zsrho4
2421 REAL(KIND=JPRB) :: zhook_handle
2424 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LDOPT_1D',0,zhook_handle)
2426 zage(:) = min(15.,psnowage(:))
2428 zsrho4(:) = psnowrho(:)*psnowrho(:)*psnowrho(:)*psnowrho(:)
2430 pdopt(:) = min(xdsgrain_max,xsnow_agrain+xsnow_bgrain*zsrho4(:)+xsnow_cgrain*zage(:))
2432 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LDOPT_1D',1,zhook_handle)
2443 xsnow_bgrain,xsnow_cgrain
2445 USE yomhook
,ONLY : lhook, dr_hook
2446 USE parkind1
,ONLY : jprb
2452 REAL,
INTENT(IN) :: psnowrho,psnowage
2458 REAL(KIND=JPRB) :: zhook_handle
2461 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LDOPT_0D',0,zhook_handle)
2463 zage = min(15.,psnowage)
2465 zsrho4 = psnowrho*psnowrho*psnowrho*psnowrho
2467 pdopt = min(xdsgrain_max,xsnow_agrain+xsnow_bgrain*zsrho4+xsnow_cgrain*zage)
2469 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LDOPT_0D',1,zhook_handle)
2475 SUBROUTINE snow3lalb(PALBEDOSC,PSPECTRALALBEDO,PSNOWRHO,PSNOWAGE, &
2485 USE modd_snow_par, ONLY : xvaging_glacier, xvaging_noglacier, &
2486 xvalb2,xvalb3,xvalb4,xvalb5,xvalb6, &
2487 xvalb7,xvalb8,xvalb9,xvalb10,xvalb11, &
2488 xvdiop1,xvrpre1,xvrpre2,xvpres1, &
2489 xvw1,xvw2,xvspec1,xvspec2,xvspec3
2491 USE yomhook
,ONLY : lhook, dr_hook
2492 USE parkind1
,ONLY : jprb
2498 REAL,
DIMENSION(:),
INTENT(IN) :: psnowrho
2499 REAL,
DIMENSION(:),
INTENT(IN) :: psnowage
2500 REAL,
DIMENSION(:),
INTENT(IN) :: ppermsnowfrac
2501 REAL,
DIMENSION(:),
INTENT(IN) :: pps
2503 REAL,
DIMENSION(:),
INTENT(INOUT) :: palbedosc
2504 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: pspectralalbedo
2508 REAL,
PARAMETER :: zalbnir1 = 0.3
2509 REAL,
PARAMETER :: zalbnir2 = 0.0
2511 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: zvaging, zdiam, zage, &
2514 REAL,
DIMENSION(SIZE(PSNOWRHO)) :: zalb1, zalb2, zalb3
2516 REAL(KIND=JPRB) :: zhook_handle
2520 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LALB',0,zhook_handle)
2526 zvaging(:)=xvaging_glacier*ppermsnowfrac(:) + xvaging_noglacier*(1.0-ppermsnowfrac(:))
2529 zpres_effect(:) = xvalb10*min(max(pps(:)/xvpres1,xvrpre1),xvrpre2)
2535 zage(:) = (1.0-ppermsnowfrac(:))*psnowage(:)
2543 zage(:) = min(365.,psnowage(:))
2545 zwork(:)=sqrt(zdiam(:))
2548 zalb1(:)=min(xvalb4,xvalb2-xvalb3*zwork(:))
2549 zalb1(:)=max(xvalb11,zalb1(:)-zpres_effect(:)*zage(:)/zvaging(:))
2552 zalb2(:)=xvalb5-xvalb6*zwork(:)
2553 zalb2(:)=max(zalbnir1,zalb2(:))
2556 zdiam(:)=min(xvdiop1,zdiam(:))
2557 zwork(:)=sqrt(zdiam(:))
2558 zalb3(:)=xvalb7*zdiam(:)-xvalb8*zwork(:)+xvalb9
2559 zalb3(:)=max(zalbnir2,zalb3(:))
2561 pspectralalbedo(:,1)=zalb1(:)
2562 pspectralalbedo(:,2)=zalb2(:)
2563 pspectralalbedo(:,3)=zalb3(:)
2568 palbedosc(:)=xvspec1*zalb1(:)+xvspec2*zalb2(:)+xvspec3*zalb3(:)
2570 IF (lhook) CALL dr_hook(
'MODE_SNOW3L:SNOW3LALB',1,zhook_handle)
real function, dimension(size(psnowrho)) snow3lscap_1d(PSNOWRHO)
real function snow3lscap_0d(PSNOWRHO)
real function, dimension(size(psnowrho)) snow3lhold_1d(PSNOWRHO, PSNOWDZ)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2), size(psnowrho, 3)) snowcrohold_3d(PSNOWRHO, PSNOWLIQ, PSNOWDZ)
real function, dimension(size(psnowrho)) snow3lradabs_1d(PSNOWRHO, PSNOWDZ, PSPECTRALALBEDO, PZENITH, PPERMSNOWFRAC, PDSGRAIN)
real function snowcrohold_0d(PSNOWRHO, PSNOWLIQ, PSNOWDZ)
subroutine snow3lgrid_2d(PSNOWDZ, PSNOW, PSNOWDZ_OLD)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2), size(psnowrho, 3)) snow3lhold_3d(PSNOWRHO, PSNOWDZ)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2)) snow3lhold_2d(PSNOWRHO, PSNOWDZ)
subroutine get_agreg(KID1, KID2, PFIELD1, PFIELD2, PFIELD)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2), size(psnowrho, 3)) snow3lwliqmax_3d(PSNOWRHO)
subroutine snow3lgrid_1d(PSNOWDZ, PSNOW, PSNOWDZ_OLD)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2), size(psnowrho, 3)) snow3lscap_3d(PSNOWRHO)
real function, dimension(size(psnowrho)) snow3ldopt_1d(PSNOWRHO, PSNOWAGE)
real function snow3ldopt_0d(PSNOWRHO, PSNOWAGE)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2)) snow3lradabs_2d(PSNOWRHO, PSNOWDZ, PSPECTRALALBEDO, PZENITH, PPERMSNOWFRAC, PDSGRAIN)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2)) snow3lscap_2d(PSNOWRHO)
real function snow3lhold_0d(PSNOWRHO, PSNOWDZ)
real function, dimension(size(psnowrho)) snow3lwliqmax_1d(PSNOWRHO)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2)) snow3ldopt_2d(PSNOWRHO, PSNOWAGE)
real function snow3lradabs_0d(PSNOWRHO, PSNOWDZ, PSPECTRALALBEDO, PZENITH, PPERMSNOWFRAC, PDSGRAIN)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2)) snow3lwliqmax_2d(PSNOWRHO)
real function, dimension(size(psnowrho)) snowcrohold_1d(PSNOWRHO, PSNOWLIQ, PSNOWDZ)
real function, dimension(size(psnowrho, 1), size(psnowrho, 2)) snowcrohold_2d(PSNOWRHO, PSNOWLIQ, PSNOWDZ)