62 SUBROUTINE tartes(PSNOWSSA,PSNOWRHO,PSNOWDZ,PSNOWG0,PSNOWY0,PSNOWW0,PSNOWB0,PSNOWIMP_DENSITY,&
63 PSNOWIMP_CONTENT,PALB,PSW_RAD_DIF,PSW_RAD_DIR,PCOSZEN,KNLVLS_USE,PSNOWALB, &
64 PSNOWENERGY,PSOILENERGY)
70 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWSSA
71 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO
72 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWG0
73 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWY0
74 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWW0
75 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWB0
76 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWDZ
77 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWIMP_DENSITY
78 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWIMP_CONTENT
80 REAL,
DIMENSION(:,:),
INTENT(IN) :: PALB
82 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSW_RAD_DIF
83 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSW_RAD_DIR
84 REAL,
DIMENSION(:),
INTENT(IN) :: PCOSZEN
86 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
88 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PSNOWALB
89 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PSNOWENERGY
90 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PSOILENERGY
92 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2)*2,NPNBANDS) :: ZDM,ZD,ZDP
93 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2)*2,NPNBANDS) :: ZVECTOR_DIR,ZVECTOR_DIF
95 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZSNOWSSALB
96 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZSNOWG
97 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZSNOWALBEDO
98 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZKESTAR
99 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZG_STAR,ZSSALB_STAR,ZGAMMA1,ZGAMMA2
101 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZDTAUSTAR
102 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZTAUSTAR
104 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZGP_DIR,ZGM_DIR
105 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZGP_DIF,ZGM_DIF
107 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZXA_DIR,ZXA_DIF,ZXB_DIR,ZXB_DIF,ZXC_DIR,ZXC_DIF,ZXD_DIR,ZXD_DIF
109 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZEPROFILE_DIR,ZEPROFILE_DIF
111 REAL,
DIMENSION(SIZE(PSNOWSSA,1),NPNBANDS) :: ZSOILABS_DIR,ZSOILABS_DIF
113 REAL,
DIMENSION(SIZE(PSNOWSSA,1),NPNBANDS) :: ZALB
115 REAL,
DIMENSION(SIZE(PSNOWSSA,1))::ZMUDIFF
117 INTEGER,
DIMENSION(SIZE(PSNOWSSA,1),NPNBANDS) :: INLVLS_EFF
119 INTEGER,
DIMENSION(NPNBANDS) :: IMAX_EFF
124 REAL(KIND=JPRB) :: ZHOOK_HANDLE
136 imax_use = maxval(knlvls_use)
140 psnowimp_density,psnowimp_content,knlvls_use,imax_use, &
144 zg_star,zssalb_star,zgamma1,zgamma2)
147 CALL taustar_vector(psnowssa,psnowrho,psnowdz,zsnowssalb,zsnowg,zkestar,knlvls_use,imax_use, &
155 CALL gp_gm_vectors(zsnowssalb,zkestar,zg_star,zssalb_star,zgamma1,zgamma2,pcoszen,psw_rad_dir, &
156 inlvls_eff,imax_eff,zgp_dir,zgm_dir)
157 CALL gp_gm_vectors(zsnowssalb,zkestar,zg_star,zssalb_star,zgamma1,zgamma2,zmudiff,psw_rad_dif, &
158 inlvls_eff,imax_eff,zgp_dif,zgm_dif)
162 DO ji = 1,
SIZE(knlvls_use)
163 IF ( inlvls_eff(ji,jb)<knlvls_use(ji) )
THEN 164 zdtaustar(ji,inlvls_eff(ji,jb)+1,jb) = 30. / zkestar(ji,inlvls_eff(ji,jb)+1,jb)
171 CALL two_stream_matrix(zsnowalbedo,zalb,zkestar,zdtaustar,inlvls_eff,imax_eff,zdm,zd,zdp)
172 CALL two_stream_vector(zsnowalbedo,zalb,zdtaustar,ztaustar,zgm_dir,zgp_dir,pcoszen,inlvls_eff,imax_eff,zvector_dir)
173 CALL two_stream_vector(zsnowalbedo,zalb,zdtaustar,ztaustar,zgm_dif,zgp_dif,zmudiff,inlvls_eff,imax_eff,zvector_dif)
185 CALL solves_two_stream2(zdm,zd,zdp,zvector_dir,zvector_dif,zsnowalbedo,psw_rad_dir,psw_rad_dif,inlvls_eff, &
186 imax_eff,zxa_dir,zxa_dif,zxb_dir,zxb_dif,zxc_dir,zxc_dif,zxd_dir,zxd_dif)
196 CALL snowpack_albedo(zxc_dir(:,1,:),zxc_dif(:,1,:),zxd_dir(:,1,:),zxd_dif(:,1,:), &
197 zgp_dir(:,1,:),zgp_dif(:,1,:),pcoszen,zmudiff,psw_rad_dir, &
198 psw_rad_dif,psnowalb)
201 CALL energy_profile(zxa_dir,zxb_dir,zxc_dir,zxd_dir,zkestar,zdtaustar,ztaustar,zgm_dir,zgp_dir,pcoszen, &
202 inlvls_eff,imax_eff,zeprofile_dir)
203 CALL energy_profile(zxa_dif,zxb_dif,zxc_dif,zxd_dif,zkestar,zdtaustar,ztaustar,zgm_dif,zgp_dif,zmudiff, &
204 inlvls_eff,imax_eff,zeprofile_dif)
207 DO jl = 1,
SIZE(psnowssa,2)
208 WHERE ( jl<=inlvls_eff(:,jb) )
209 psnowenergy(:,jl,jb) = psw_rad_dir(:,jb) * zeprofile_dir(:,jl,jb) + &
210 psw_rad_dif(:,jb) * zeprofile_dif(:,jl,jb)
216 CALL soil_absorption(zxa_dir,zxb_dir,zkestar,zdtaustar,ztaustar,zgm_dir,pcoszen,palb,inlvls_eff,zsoilabs_dir)
217 CALL soil_absorption(zxa_dif,zxb_dif,zkestar,zdtaustar,ztaustar,zgm_dif,zmudiff,palb,inlvls_eff,zsoilabs_dif)
219 psoilenergy = psw_rad_dir * zsoilabs_dir + psw_rad_dif * zsoilabs_dif
232 REAL(KIND=JPRB) :: ZHOOK_HANDLE
258 REAL,
DIMENSION(NPNBANDS) :: ZLOG_WL
259 REAL,
DIMENSION(NPNBANDS_REF) :: ZLOG_WL_REF
260 REAL,
DIMENSION(NPNBANDS_REF) :: ZLOG_REFICE_I
266 REAL(KIND=JPRB) :: ZHOOK_HANDLE
283 IF ( jbref<2 )
CALL abor1_sfx(
"FATAL ERROR INIT_TARTES (interpolation of refractive indexs)")
290 xrefice_i(jb) = exp( ( (zlog_wl(jb) - zlog_wl_ref(jbref-1)) * zlog_refice_i(jbref) + &
291 (zlog_wl_ref(jbref) - zlog_wl(jb) ) * zlog_refice_i(jbref-1) ) / &
292 ( zlog_wl_ref(jbref) - zlog_wl_ref(jbref-1) ) )
304 IF ( ginf )
CALL abor1_sfx(
"FATAL ERROR INIT_TARTES (interpolation of refractive indexs)")
323 REAL,
DIMENSION (NPNBANDS) :: ZWL_UM
324 REAL,
DIMENSION (NPNBANDS) :: ZINDEX_SOOT_REAL,ZINDEX_SOOT_IMAG
325 COMPLEX,
DIMENSION(NPNBANDS) :: ZINDEX_SOOT
327 REAL(KIND=JPRB) :: ZHOOK_HANDLE
333 zindex_soot_real = 1.811 + 0.1263*log(zwl_um) + 0.027 *log(zwl_um)**2 + 0.0417*log(zwl_um)**3
334 zindex_soot_imag = 0.5821 + 0.1213*log(zwl_um) + 0.2309*log(zwl_um)**2 - 0.01 *log(zwl_um)**3
336 zindex_soot = zindex_soot_real - cmplx(0,1) * zindex_soot_imag
339 xrefimp_i(:,1) = aimag( (zindex_soot**2-1.) / (zindex_soot**2 + 2.) )
356 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWG0
357 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWY0
358 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWW0
359 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWB0
362 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PSNOWG00
363 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PSNOWY
364 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PSNOWW
365 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PSNOWB
369 REAL(KIND=JPRB) :: ZHOOK_HANDLE
371 IF (
lhook)
CALL dr_hook(
'SHAPE_PARAMETER_VARIATIONS',0,zhook_handle)
374 psnowg00(:,:,jb) = psnowg0(:,:) - 0.38 *
xrefice_norm(jb)
377 psnowy(:,:,jb) = psnowy0(:,:) + 0.752 *
xrefice_norm(jb)
380 IF (
lhook)
CALL dr_hook(
'SHAPE_PARAMETER_VARIATIONS',1,zhook_handle)
386 KNLVLS_USE,KMAX_USE,PCOSSALB)
396 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWSSA
397 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWIMP_DENSITY
398 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWIMP_CONTENT
399 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
400 INTEGER,
INTENT(IN) :: KMAX_USE
401 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PCOSSALB
403 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2)) :: ZABS_IMP
408 REAL(KIND=JPRB) :: ZHOOK_HANDLE
410 IF (
lhook)
CALL dr_hook(
'IMPURITIES_CO_SINGLE_SCATTERING_ALBEDO',0,zhook_handle)
417 DO jj = 1,
SIZE(knlvls_use)
419 IF ( knlvls_use(jj)>=jl )
THEN 422 pcossalb(jj,jl,jb) = pcossalb(jj,jl,jb) + &
424 psnowimp_content(jj,jl,jimp) / psnowimp_density(jj,jl,jimp) * &
434 IF (
lhook)
CALL dr_hook(
'IMPURITIES_CO_SINGLE_SCATTERING_ALBEDO',1,zhook_handle)
440 PSNOWIMP_DENSITY,PSNOWIMP_CONTENT,KNLVLS_USE,KMAX_USE, &
448 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWSSA
449 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO
450 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWG0
451 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWY0
452 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWW0
453 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWB0
454 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWIMP_DENSITY
455 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWIMP_CONTENT
456 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
457 INTEGER,
INTENT(IN) :: KMAX_USE
458 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PSNOWSSALB
459 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PSNOWG
462 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZSNOWG00,ZSNOWY,ZSNOWW,ZSNOWB
463 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZSNOWCOSSALB
464 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2),NPNBANDS) :: ZIMPCOSSALB
466 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2)) :: ZC,ZPHI
470 REAL(KIND=JPRB) :: ZHOOK_HANDLE
472 IF (
lhook)
CALL dr_hook(
'SINGLE_SCATTERING_OPTICAL_PARAMETERS',0,zhook_handle)
478 DO jj =1,
SIZE(psnowssa,1)
480 IF ( knlvls_use(jj)>=jl )
THEN 485 zc(jj,jl) =
xconst_c(jb) / psnowssa(jj,jl)
487 psnowg(jj,jl,jb) =
xginf(jb) - (
xginf(jb)-zsnowg00(jj,jl,jb) ) * exp( -zsnowy(jj,jl,jb)*zc(jj,jl) )
490 zphi(jj,jl) = 2./3. * zsnowb(jj,jl,jb) / ( 1.-zsnoww(jj,jl,jb) )
491 zsnowcossalb(jj,jl,jb) = 0.5 * ( 1.-zsnoww(jj,jl,jb) ) * ( 1.-exp( -zphi(jj,jl)*zc(jj,jl) ) )
503 knlvls_use,kmax_use,zimpcossalb)
505 zsnowcossalb = zsnowcossalb + zimpcossalb
508 psnowssalb = 1.-zsnowcossalb
510 IF (
lhook)
CALL dr_hook(
'SINGLE_SCATTERING_OPTICAL_PARAMETERS',1,zhook_handle)
516 PG_STAR,PSSALB_STAR,PGAMMA1,PGAMMA2)
526 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWSSALB
527 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWG
528 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
529 INTEGER,
INTENT(IN) :: KMAX_USE
530 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PSNOWALBEDO
531 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PKESTAR
532 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PG_STAR,PSSALB_STAR,PGAMMA1,PGAMMA2
536 REAL(KIND=JPRB) :: ZHOOK_HANDLE
538 IF (
lhook)
CALL dr_hook(
'INFINITE_MEDIUM_OPTICAL_PARAMETERS',0,zhook_handle)
544 DO jj =1,
SIZE(psnowg,1)
546 IF ( knlvls_use(jj)>=jl )
THEN 548 pg_star(jj,jl,jb) = psnowg(jj,jl,jb) / ( 1. + psnowg(jj,jl,jb) )
549 pssalb_star(jj,jl,jb) = psnowssalb(jj,jl,jb) * ( 1. - psnowg(jj,jl,jb)**2 ) / &
550 ( 1. - psnowg(jj,jl,jb)**2 * psnowssalb(jj,jl,jb) )
553 pgamma1(jj,jl,jb) = 0.25 * ( 7. - pssalb_star(jj,jl,jb)*(4.+3.*pg_star(jj,jl,jb)) )
554 pgamma2(jj,jl,jb) = -0.25 * ( 1. - pssalb_star(jj,jl,jb)*(4.-3.*pg_star(jj,jl,jb)) )
556 pkestar(jj,jl,jb) = sqrt( pgamma1(jj,jl,jb)**2 - pgamma2(jj,jl,jb)**2 )
557 psnowalbedo(jj,jl,jb) = ( pgamma1(jj,jl,jb)-pkestar(jj,jl,jb) ) / pgamma2(jj,jl,jb)
561 IF ( abs(psnowalbedo(jj,jl,jb))<
xuepsi )
THEN 562 psnowalbedo(jj,jl,jb) = sign(
xuepsi, psnowalbedo(jj,jl,jb) )
573 IF (
lhook)
CALL dr_hook(
'INFINITE_MEDIUM_OPTICAL_PARAMETERS',1,zhook_handle)
579 SUBROUTINE taustar_vector(PSNOWSSA,PSNOWRHO,PSNOWDZ,PSNOWSSALB,PSNOWG,PKESTAR,KNLVLS_USE,KMAX_USE,&
588 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWSSA
589 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO
590 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWDZ
591 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWSSALB
592 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWG
593 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PKESTAR
594 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
595 INTEGER,
INTENT(IN) :: KMAX_USE
596 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PDTAUSTAR
597 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PTAUSTAR
599 REAL,
DIMENSION(SIZE(PSNOWSSA,1),SIZE(PSNOWSSA,2)) :: ZSIGEXT
603 REAL(KIND=JPRB) :: ZHOOK_HANDLE
605 IF (
lhook)
CALL dr_hook(
'TAUSTAR_VECTOR',0,zhook_handle)
608 zsigext = psnowrho*psnowssa/2.
614 WHERE ( knlvls_use>=jl )
617 pdtaustar(:,jl,jb) = min( zsigext(:,jl) * psnowdz(:,jl) * ( 1.- psnowssalb(:,jl,jb)*psnowg(:,jl,jb)**2 ), &
625 ptaustar(:,1,jb) = pdtaustar(:,1,jb)
628 WHERE ( knlvls_use>=jl )
629 ptaustar(:,jl,jb) = ptaustar(:,jl-1,jb) + pdtaustar(:,jl,jb)
635 IF (
lhook)
CALL dr_hook(
'TAUSTAR_VECTOR',1,zhook_handle)
648 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PKESTAR
649 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PDTAUSTAR
650 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
651 INTEGER,
INTENT(IN) :: KMAX_USE
652 INTEGER,
DIMENSION(:,:),
INTENT(OUT) :: KNLVLS_EFF
653 INTEGER,
DIMENSION(:),
INTENT(OUT) :: KMAX_EFF
655 REAL,
DIMENSION(SIZE(PKESTAR,1),SIZE(PKESTAR,2),NPNBANDS) :: ZTAU
656 LOGICAL,
DIMENSION(SIZE(PKESTAR,1)) :: GEFF
659 REAL(KIND=JPRB) :: ZHOOK_HANDLE
661 IF (
lhook)
CALL dr_hook(
'ESTIMATE_EFFECTIVE_LAYER_NUMBER',0,zhook_handle)
665 knlvls_eff(:,jb) = knlvls_use
666 ztau(:,1,jb) = pkestar(:,1,jb) * pdtaustar(:,1,jb)
671 WHERE ( (knlvls_use>=jl) .AND. geff )
672 ztau(:,jl,jb) = ztau(:,jl-1,jb) + pkestar(:,jl,jb) * pdtaustar(:,jl,jb)
677 knlvls_eff(:,jb) = max(1,jl-1)
683 kmax_eff(jb) = maxval(knlvls_eff(:,jb))
687 IF (
lhook)
CALL dr_hook(
'ESTIMATE_EFFECTIVE_LAYER_NUMBER',1,zhook_handle)
693 SUBROUTINE gp_gm_vectors(PSNOWSSALB,PKESTAR,PG_STAR,PSSALB_STAR,PGAMMA1,PGAMMA2,PCOSZEN,PSW_RAD,KNLVLS_EFF,KMAX_EFF,PGP,PGM)
702 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWSSALB
703 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PKESTAR
704 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PG_STAR
705 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSSALB_STAR
706 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PGAMMA1,PGAMMA2
707 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSW_RAD
708 REAL,
DIMENSION(:),
INTENT(IN) :: PCOSZEN
709 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: KNLVLS_EFF
710 INTEGER,
DIMENSION(:),
INTENT(IN) :: KMAX_EFF
711 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PGP
712 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PGM
714 REAL :: ZGAMMA3,ZGAMMA4,ZG
718 REAL(KIND=JPRB) :: ZHOOK_HANDLE
728 DO jl = 1,kmax_eff(jb)
730 DO jj =1,
SIZE(psw_rad,1)
732 IF ( psw_rad(jj,jb)>0. .AND. knlvls_eff(jj,jb)>=jl )
THEN 734 zgamma3 = 0.25 * ( 2. - 3.*pg_star(jj,jl,jb)*pcoszen(jj) )
735 zgamma4 = 0.25 * ( 2. + 3.*pg_star(jj,jl,jb)*pcoszen(jj) )
736 zg = pcoszen(jj)**2 * pssalb_star(jj,jl,jb) / ( (pkestar(jj,jl,jb)*pcoszen(jj))**2 - 1. )
737 pgp(jj,jl,jb) = zg * ( (pgamma1(jj,jl,jb)-1./pcoszen(jj))*zgamma3 + pgamma2(jj,jl,jb)*zgamma4 )
738 pgm(jj,jl,jb) = zg * ( (pgamma1(jj,jl,jb)+1./pcoszen(jj))*zgamma4 + pgamma2(jj,jl,jb)*zgamma3 )
753 SUBROUTINE two_stream_matrix(PSNOWALBEDO,PSOILALBEDO,PKESTAR,PDTAUSTAR,KNLVLS_EFF,KMAX_EFF,PDM,PD,PDP)
761 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWALBEDO
762 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSOILALBEDO
763 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PKESTAR
764 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PDTAUSTAR
765 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: KNLVLS_EFF
766 INTEGER,
DIMENSION(:),
INTENT(IN) :: KMAX_EFF
767 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PDM,PD,PDP
769 REAL,
DIMENSION(SIZE(PSNOWALBEDO,1)) :: ZFDIAG
775 REAL(KIND=JPRB) :: ZHOOK_HANDLE
777 IF (
lhook)
CALL dr_hook(
'TWO_STREAM_MATRIX',0,zhook_handle)
786 DO jl = 1,kmax_eff(jb)-1
797 DO ji =1,
SIZE(knlvls_eff,1)
799 IF ( jl<=knlvls_eff(ji,jb)-1 )
THEN 802 zfdiag(ji) = exp( -pkestar(ji,jl,jb)*pdtaustar(ji,jl,jb) )
805 pdm(ji,jl*2,jb) = ( 1. - psnowalbedo(ji,jl,jb)*psnowalbedo(ji,jl+1,jb) ) * zfdiag(ji)
806 pdm(ji,jl*2+1,jb) = ( 1./psnowalbedo(ji,jl,jb) - psnowalbedo(ji,jl,jb) ) * 1./zfdiag(ji)
808 pd(ji,jl*2,jb) = ( 1. - psnowalbedo(ji,jl+1,jb)/psnowalbedo(ji,jl,jb) ) * 1./zfdiag(ji)
809 pd(ji,jl*2+1,jb) = psnowalbedo(ji,jl,jb) - psnowalbedo(ji,jl+1,jb)
812 pdp(ji,jl*2,jb) = psnowalbedo(ji,jl+1,jb) * psnowalbedo(ji,jl+1,jb) - 1.
813 pdp(ji,jl*2+1,jb) = psnowalbedo(ji,jl,jb) - 1./psnowalbedo(ji,jl+1,jb)
824 DO ji=1,
SIZE(psnowalbedo,1)
826 zfdiag2 = exp( -pkestar(ji,knlvls_eff(ji,jb),jb) * pdtaustar(ji,knlvls_eff(ji,jb),jb) )
829 pdm(ji,2*knlvls_eff(ji,jb),jb) = zfdiag2 * &
830 ( psnowalbedo(ji,knlvls_eff(ji,jb),jb) - psoilalbedo(ji,jb) )
832 pd(ji,2*knlvls_eff(ji,jb),jb) = 1./zfdiag2 * &
833 ( 1./psnowalbedo(ji,knlvls_eff(ji,jb),jb) - psoilalbedo(ji,jb) )
838 IF (
lhook)
CALL dr_hook(
'TWO_STREAM_MATRIX',1,zhook_handle)
843 SUBROUTINE two_stream_vector(PSNOWALBEDO,PSOILALBEDO,PDTAUSTAR,PTAUSTAR,PGM,PGP,PCOSZEN,KNLVLS_EFF,KMAX_EFF,PVECTOR)
851 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWALBEDO
852 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSOILALBEDO
853 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PDTAUSTAR
854 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PTAUSTAR
855 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PGP
856 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PGM
857 REAL,
DIMENSION(:),
INTENT(IN) :: PCOSZEN
858 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: KNLVLS_EFF
859 INTEGER,
DIMENSION(:),
INTENT(IN) :: KMAX_EFF
860 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PVECTOR
862 REAL :: ZDGP,ZDGM,ZEXP
866 REAL(KIND=JPRB) :: ZHOOK_HANDLE
868 IF (
lhook)
CALL dr_hook(
'TWO_STREAM_VECTOR',0,zhook_handle)
870 pvector(:,1,:) = -pgm(:,1,:)
874 DO ji = 1,
SIZE(psnowalbedo,1)
876 DO jl = 1,kmax_eff(jb)
878 IF ( jl<=knlvls_eff(ji,jb)-1 )
THEN 880 zdgp = pgp(ji,jl+1,jb) - pgp(ji,jl,jb)
881 zdgm = pgm(ji,jl+1,jb) - pgm(ji,jl,jb)
883 zexp = exp( -ptaustar(ji,jl,jb)/pcoszen(ji) )
885 pvector(ji,2*jl,jb) = ( zdgm - psnowalbedo(ji,jl+1,jb) * zdgp ) * zexp
886 pvector(ji,2*jl+1,jb) = ( zdgp - psnowalbedo(ji,jl,jb) * zdgm ) * zexp
892 pvector(ji,2*knlvls_eff(ji,jb),jb) = ( psoilalbedo(ji,jb) * &
893 ( pgm(ji,knlvls_eff(ji,jb),jb) + pcoszen(ji) ) - &
894 pgp(ji,knlvls_eff(ji,jb),jb) ) * &
895 exp( -ptaustar(ji,knlvls_eff(ji,jb),jb) / pcoszen(ji) )
901 IF (
lhook)
CALL dr_hook(
'TWO_STREAM_VECTOR',1,zhook_handle)
906 SUBROUTINE solves_two_stream2(PDM,PD,PDP,PVECT_DIR,PVECT_DIF,PSNOWALBEDO,PSW_RAD_DIR,PSW_RAD_DIF,KNLVLS_EFF, &
907 KMAX_EFF,PXA_DIR,PXA_DIF,PXB_DIR,PXB_DIF,PXC_DIR,PXC_DIF,PXD_DIR,PXD_DIF)
916 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PDM,PD,PDP
917 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PVECT_DIR,PVECT_DIF
918 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWALBEDO
919 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSW_RAD_DIR,PSW_RAD_DIF
920 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: KNLVLS_EFF
921 INTEGER,
DIMENSION(:),
INTENT(IN) :: KMAX_EFF
922 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PXA_DIR,PXA_DIF,PXB_DIR,PXB_DIF,PXC_DIR,PXC_DIF,PXD_DIR,PXD_DIF
924 REAL,
DIMENSION(SIZE(PDM,1),2*SIZE(PSNOWALBEDO,2),NPNBANDS) :: ZX0_DIR,ZX0_DIF
927 REAL(KIND=JPRB) :: ZHOOK_HANDLE
929 IF (
lhook)
CALL dr_hook(
'SOLVES_TWO_STREAM2',0,zhook_handle)
934 pvect_dir(:,:,:),zx0_dir(:,:,:), &
938 pvect_dif(:,:,:),zx0_dif(:,:,:), &
948 IF ( jl<=knlvls_eff(ji,jb) )
THEN 949 pxa_dir(ji,jl,jb) = zx0_dir(ji,jl*2-1,jb)
950 pxa_dif(ji,jl,jb) = zx0_dif(ji,jl*2-1,jb)
951 pxb_dir(ji,jl,jb) = zx0_dir(ji,jl*2,jb)
952 pxb_dif(ji,jl,jb) = zx0_dif(ji,jl*2,jb)
954 pxc_dir(ji,jl,jb) = pxa_dir(ji,jl,jb) * psnowalbedo(ji,jl,jb)
955 pxc_dif(ji,jl,jb) = pxa_dif(ji,jl,jb) * psnowalbedo(ji,jl,jb)
956 pxd_dir(ji,jl,jb) = pxb_dir(ji,jl,jb) / psnowalbedo(ji,jl,jb)
957 pxd_dif(ji,jl,jb) = pxb_dif(ji,jl,jb) / psnowalbedo(ji,jl,jb)
966 IF (
lhook)
CALL dr_hook(
'SOLVES_TWO_STREAM2',1,zhook_handle)
971 SUBROUTINE snowpack_albedo(PXC_DIR,PXC_DIF,PXD_DIR,PXD_DIF,PGP_DIR,PGP_DIF,&
972 PCOSZEN_DIR,PCOSZEN_DIF,PSW_RAD_DIR,PSW_RAD_DIF,PSNOWALB)
979 REAL,
DIMENSION(:,:),
INTENT(IN) :: PXC_DIR,PXC_DIF,PXD_DIR,PXD_DIF
980 REAL,
DIMENSION(:,:),
INTENT(IN) :: PGP_DIR,PGP_DIF
981 REAL,
DIMENSION(:),
INTENT(IN) :: PCOSZEN_DIR,PCOSZEN_DIF
982 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSW_RAD_DIR,PSW_RAD_DIF
983 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PSNOWALB
985 REAL,
DIMENSION(SIZE(PSW_RAD_DIR,1)) :: ZREF_DIR,ZREF_DIF
987 REAL,
DIMENSION(SIZE(PSW_RAD_DIR,1)) :: ZINC
991 REAL(KIND=JPRB) :: ZHOOK_HANDLE
993 IF (
lhook)
CALL dr_hook(
'SNOWPACK_ALBEDO',0,zhook_handle)
998 zref_dir = ( pxc_dir(:,jb)+pxd_dir(:,jb)+pgp_dir(:,jb) ) * psw_rad_dir(:,jb)
999 zref_dif = ( pxc_dif(:,jb)+pxd_dif(:,jb)+pgp_dif(:,jb) ) * psw_rad_dif(:,jb)
1000 zinc = psw_rad_dir(:,jb)*pcoszen_dir + psw_rad_dif(:,jb)*pcoszen_dif
1002 psnowalb(:,jb) = (zref_dir+zref_dif) / zinc
1009 IF (
lhook)
CALL dr_hook(
'SNOWPACK_ALBEDO',1,zhook_handle)
1014 SUBROUTINE energy_profile(PXA,PXB,PXC,PXD,PKESTAR,PDTAUSTAR,PTAUSTAR,PGM,PGP,PCOSZEN,KNLVLS_EFF,KMAX_EFF,PEPROFILE)
1021 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PXA,PXB,PXC,PXD
1022 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PKESTAR
1023 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PDTAUSTAR
1024 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PTAUSTAR
1025 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PGP
1026 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PGM
1027 REAL,
DIMENSION(:),
INTENT(IN) :: PCOSZEN
1028 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: KNLVLS_EFF
1029 INTEGER,
DIMENSION(:),
INTENT(IN) :: KMAX_EFF
1030 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PEPROFILE
1032 REAL :: ZINT1, ZINT2, ZINT3, ZINT4, ZINT5
1033 REAL :: ZDEXP, ZFDU, ZFDD, ZSTAR
1037 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1039 IF (
lhook)
CALL dr_hook(
'ENERGY_PROFILE',0,zhook_handle)
1043 DO jj =1,
SIZE(peprofile,1)
1045 DO jl = 1,kmax_eff(jb)
1047 IF (jl==1.OR.jl<=knlvls_eff(jj,jb))
THEN 1049 zstar = pkestar(jj,jl,jb) * pdtaustar(jj,jl,jb)
1055 zint3 = exp( -pdtaustar(jj,jl,jb)/pcoszen(jj))
1056 zint4 = exp( -ptaustar(jj,jl,jb)/pcoszen(jj))
1059 peprofile(jj,1,jb) = ( pcoszen(jj) - ( pxc(jj,1,jb)+pxd(jj,1,jb)+pgp(jj,1,jb) ) ) + &
1060 ( pxc(jj,1,jb) * zint1 + pxd(jj,1,jb) * zint2 + &
1061 pgp(jj,1,jb) * zint3 ) - &
1062 ( pxa(jj,1,jb) * zint1 + pxb(jj,1,jb) * zint2 + &
1063 pgm(jj,1,jb) * zint3 + &
1064 pcoszen(jj) * zint4 )
1068 zint5 = exp( -ptaustar(jj,jl ,jb)/pcoszen(jj) )
1070 zdexp = zint5 - zint4
1074 zfdu = pxc(jj,jl,jb) * ( zint1 -1. ) + &
1075 pxd(jj,jl,jb) * ( zint2 -1. ) + pgp(jj,jl,jb) * zdexp
1078 zfdd = pxa(jj,jl,jb) * ( zint1 -1. ) + &
1079 pxb(jj,jl,jb) * ( zint2 -1. ) + ( pgm(jj,jl,jb) + pcoszen(jj) ) * zdexp
1081 peprofile(jj,jl,jb) = zfdu - zfdd
1087 peprofile(jj,jl,jb) = 0.
1097 IF (
lhook)
CALL dr_hook(
'ENERGY_PROFILE',1,zhook_handle)
1102 SUBROUTINE soil_absorption(PXA,PXB,PKESTAR,PDTAUSTAR,PTAUSTAR,PGM,PCOSZEN,PALB,KNLVLS_EFF,PSOILENERGY)
1109 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PXA,PXB
1110 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PKESTAR
1111 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PDTAUSTAR
1112 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PTAUSTAR
1113 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PGM
1114 REAL,
DIMENSION(:),
INTENT(IN) :: PCOSZEN
1115 REAL,
DIMENSION(:,:),
INTENT(IN) :: PALB
1116 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: KNLVLS_EFF
1117 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PSOILENERGY
1120 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1122 IF (
lhook)
CALL dr_hook(
'SOIL_ABSORPTION',0,zhook_handle)
1129 psoilenergy(ji,jb) = ( 1.-palb(ji,jb) ) * &
1130 ( pxa(ji,knlvls_eff(ji,jb),jb) * &
1131 exp( -pkestar(ji,knlvls_eff(ji,jb),jb) * pdtaustar(ji,knlvls_eff(ji,jb),jb) ) + &
1132 pxb(ji,knlvls_eff(ji,jb),jb) * &
1133 exp( pkestar(ji,knlvls_eff(ji,jb),jb) * pdtaustar(ji,knlvls_eff(ji,jb),jb) ) + &
1134 ( pgm(ji,knlvls_eff(ji,jb),jb)+pcoszen(ji) ) * &
1135 exp( -ptaustar(ji,knlvls_eff(ji,jb),jb)/pcoszen(ji) ) )
1141 IF (
lhook)
CALL dr_hook(
'SOIL_ABSORPTION',1,zhook_handle)
1152 REAL,
DIMENSION(:),
INTENT(IN) :: PSW_RAD
1153 REAL,
DIMENSION(:),
INTENT(IN) :: PCOSZEN
1154 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PSW_RAD_DIF
1155 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PSW_RAD_DIR
1156 REAL,
DIMENSION(:),
INTENT(OUT) :: PNIR_ABS
1158 REAL,
DIMENSION(SIZE(PSW_RAD)) :: ZSW_RAD_BROADDIR,ZSW_RAD_BROADDIF
1161 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1163 IF (
lhook)
CALL dr_hook(
'SPECTRAL_REPARTITION',0,zhook_handle)
1167 zsw_rad_broaddif = min( exp( - 1.54991930344*pcoszen**3 + 3.73535795329*pcoszen**2 &
1168 - 3.52421131883*pcoszen + 0.0299111951172 ), 1. ) * psw_rad
1169 zsw_rad_broaddir = psw_rad - zsw_rad_broaddif
1174 psw_rad_dir(:,jb) =
xpratio_dir(jb) * zsw_rad_broaddir / pcoszen(:)
1179 IF (
lhook)
CALL dr_hook(
'SPECTRAL_REPARTITION',1,zhook_handle)
1184 SUBROUTINE snowcro_tartes(PSNOWGRAN1,PSNOWGRAN2,PSNOWRHO,PSNOWDZ,PSNOWG0,PSNOWY0,PSNOWW0,PSNOWB0, &
1185 PSNOWIMP_DENSITY,PSNOWIMP_CONTENT,PALB,PSW_RAD,PZENITH,KNLVLS_USE, &
1186 PSNOWALB,PRADSINK,PRADXS,ODEBUG,HSNOWMETAMO)
1196 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWGRAN1,PSNOWGRAN2
1197 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO
1198 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWG0
1199 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWY0
1200 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWW0
1201 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWB0
1202 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWDZ
1203 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWIMP_DENSITY
1204 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWIMP_CONTENT
1206 REAL,
DIMENSION(:),
INTENT(IN) :: PALB
1208 REAL,
DIMENSION(:),
INTENT(IN) :: PSW_RAD
1209 REAL,
DIMENSION(:),
INTENT(IN) :: PZENITH
1211 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
1214 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PRADSINK
1215 REAL,
DIMENSION(:),
INTENT(OUT) :: PRADXS
1216 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOWALB
1218 LOGICAL,
INTENT(IN) :: ODEBUG
1219 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
1222 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),NPNIMP) :: ZSNOWIMP_DENSITY_P
1223 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),NPNIMP) :: ZSNOWIMP_CONTENT_P
1225 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWGRAN1_P,ZSNOWGRAN2_P
1226 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWRHO_P
1227 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWG0_P
1228 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWY0_P
1229 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWW0_P
1230 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWB0_P
1231 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWDZ_P
1233 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZRADSINK_P
1235 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZALB_P
1236 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZSW_RAD_P
1237 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZZENITH_P
1240 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZRADXS_P
1241 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZSNOWALB_P
1243 INTEGER,
DIMENSION(SIZE(PSNOWRHO,1)) :: INLVLS_USE_P
1245 INTEGER,
DIMENSION(SIZE(PSNOWRHO,1)) :: IDAYMASK
1248 INTEGER :: JL,JIMP,JJ,JJ_P
1249 INTEGER :: IPOINTDAY
1252 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1254 IF (
lhook)
CALL dr_hook(
'SNOWCRO_TARTES',0,zhook_handle)
1261 inpoints =
SIZE(psnowrho,1)
1266 IF ( cos(pzenith(jj))>
xuepsi .AND. psw_rad(jj)>
xuepsi )
THEN 1268 ipointday = ipointday + 1
1269 idaymask(ipointday) = jj
1273 IF ( ipointday>=1 )
THEN 1276 DO jj_p = 1,ipointday
1280 zalb_p(jj_p) = palb(jj)
1281 zsw_rad_p(jj_p) = psw_rad(jj)
1282 zzenith_p(jj_p) = pzenith(jj)
1283 inlvls_use_p(jj_p) = knlvls_use(jj)
1287 imax_use = maxval(knlvls_use)
1292 DO jj_p = 1,ipointday
1296 zsnowgran1_p(jj_p,jl) = psnowgran1(jj,jl)
1297 zsnowgran2_p(jj_p,jl) = psnowgran2(jj,jl)
1298 zsnowrho_p(jj_p,jl) = psnowrho(jj,jl)
1299 zsnowg0_p(jj_p,jl) = psnowg0(jj,jl)
1300 zsnowy0_p(jj_p,jl) = psnowy0(jj,jl)
1301 zsnoww0_p(jj_p,jl) = psnoww0(jj,jl)
1302 zsnowb0_p(jj_p,jl) = psnowb0(jj,jl)
1303 zsnowdz_p(jj_p,jl) = psnowdz(jj,jl)
1314 DO jj_p = 1,ipointday
1318 zsnowimp_density_p(jj_p,jl,jimp) = psnowimp_density(jj,jl,jimp)
1319 zsnowimp_content_p(jj_p,jl,jimp) = psnowimp_content(jj,jl,jimp)
1330 CALL snowcro_call_tartes(zsnowgran1_p(1:ipointday,1:imax_use),zsnowgran2_p(1:ipointday,1:imax_use), &
1331 zsnowrho_p(1:ipointday,1:imax_use),zsnowdz_p(1:ipointday,1:imax_use), &
1332 zsnowg0_p(1:ipointday,1:imax_use),zsnowy0_p(1:ipointday,1:imax_use), &
1333 zsnoww0_p(1:ipointday,1:imax_use),zsnowb0_p(1:ipointday,1:imax_use), &
1334 zsnowimp_density_p(1:ipointday,1:imax_use,1:
npnimp), &
1335 zsnowimp_content_p(1:ipointday,1:imax_use,1:
npnimp), &
1336 zalb_p(1:ipointday),zsw_rad_p(1:ipointday), &
1337 zzenith_p(1:ipointday),inlvls_use_p(1:ipointday),zsnowalb_p(1:ipointday), &
1338 zradsink_p(1:ipointday,1:imax_use),zradxs_p(1:ipointday),odebug,hsnowmetamo)
1340 CALL snowcro_call_tartes(zsnowgran1_p(1:ipointday,:),zsnowgran2_p(1:ipointday,:),zsnowrho_p(1:ipointday,:), &
1341 zsnowdz_p(1:ipointday,:),zsnowg0_p(1:ipointday,:),zsnowy0_p(1:ipointday,:), &
1342 zsnoww0_p(1:ipointday,:),zsnowb0_p(1:ipointday,:),zsnowimp_density_p(1:ipointday,:,:), &
1343 zsnowimp_content_p(1:ipointday,:,:),zalb_p(1:ipointday),zsw_rad_p(1:ipointday), &
1344 zzenith_p(1:ipointday),inlvls_use_p(1:ipointday),zsnowalb_p(1:ipointday), &
1345 zradsink_p(1:ipointday,:),zradxs_p(1:ipointday),odebug,hsnowmetamo)
1350 DO jj_p = 1,ipointday
1354 pradxs(jj) = zradxs_p(jj_p)
1355 psnowalb(jj) = zsnowalb_p(jj_p)
1362 DO jj_p = 1,ipointday
1366 pradsink(jj,jl) = zradsink_p(jj_p,jl)
1374 IF (
lhook)
CALL dr_hook(
'SNOWCRO_TARTES',1,zhook_handle)
1381 SUBROUTINE snowcro_call_tartes(PSNOWGRAN1,PSNOWGRAN2,PSNOWRHO,PSNOWDZ,PSNOWG0,PSNOWY0,PSNOWW0,PSNOWB0, &
1382 PSNOWIMP_DENSITY,PSNOWIMP_CONTENT,PALB,PSW_RAD,PZENITH,KNLVLS_USE, &
1383 PSNOWALB,PRADSINK,PRADXS,ODEBUG,HSNOWMETAMO)
1395 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWGRAN1,PSNOWGRAN2
1396 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWRHO
1397 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWG0
1398 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWY0
1399 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWW0
1400 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWB0
1401 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSNOWDZ
1402 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWIMP_DENSITY
1403 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: PSNOWIMP_CONTENT
1405 REAL,
DIMENSION(:),
INTENT(IN) :: PALB
1407 REAL,
DIMENSION(:),
INTENT(IN) :: PSW_RAD
1408 REAL,
DIMENSION(:),
INTENT(IN) :: PZENITH
1410 INTEGER,
DIMENSION(:),
INTENT(IN) :: KNLVLS_USE
1413 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PRADSINK
1414 REAL,
DIMENSION(:),
INTENT(OUT) :: PRADXS
1415 REAL,
DIMENSION(:),
INTENT(OUT) :: PSNOWALB
1417 LOGICAL,
INTENT(IN) :: ODEBUG
1418 CHARACTER(3),
INTENT(IN) :: HSNOWMETAMO
1421 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),NPNBANDS) :: ZSNOWENERGY
1423 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWSSA
1424 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWENERGY_BB
1426 REAL,
DIMENSION(SIZE(PSNOWRHO,1),NPNBANDS) :: ZSW_RAD_DIF
1427 REAL,
DIMENSION(SIZE(PSNOWRHO,1),NPNBANDS) :: ZSW_RAD_DIR
1429 REAL,
DIMENSION(SIZE(PSNOWRHO,1),NPNBANDS) :: ZSNOWALB
1430 REAL,
DIMENSION(SIZE(PSNOWRHO,1),NPNBANDS) :: ZALB
1431 REAL,
DIMENSION(SIZE(PSNOWRHO,1),NPNBANDS) :: ZSOILENERGY
1433 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZNIR_ABS
1436 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZTOTSNOWENERGY
1437 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZSOILENERGY_BB
1438 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZREFLECTED_BB
1440 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZSNOWENERGY_CUM,ZSNOWENERGY_UPPER
1441 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ZMAX
1447 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1449 IF (
lhook)
CALL dr_hook(
'SNOWCRO_CALL_TARTES',0,zhook_handle)
1452 DO jl = 1,
SIZE(psnowrho,2)
1454 DO jj = 1,
SIZE(psnowrho,1)
1456 IF ( jl<=knlvls_use(jj) )
THEN 1458 CALL get_diam(psnowgran1(jj,jl),psnowgran2(jj,jl),zdiam,hsnowmetamo)
1459 zsnowssa(jj,jl) = 6. / (
xrholi*zdiam)
1469 zalb(:,jb) = palb(:)
1476 WRITE(*,*)
"ZSW_RAD_DIF=",zsw_rad_dif
1477 WRITE(*,*)
"ZSW_RAD_DIR=",zsw_rad_dir
1478 WRITE(*,*)
"PZENITH=",pzenith
1484 CALL tartes(zsnowssa,psnowrho,psnowdz,psnowg0,psnowy0,psnoww0,psnowb0,psnowimp_density,psnowimp_content,zalb,&
1485 zsw_rad_dif,zsw_rad_dir,cos(pzenith),knlvls_use,zsnowalb,zsnowenergy,zsoilenergy)
1560 zsnowenergy_bb(:,:) = zsnowenergy_bb(:,:) + zsnowenergy(:,:,jb)
1561 zsoilenergy_bb(:) = zsoilenergy_bb(:) + zsoilenergy(:,jb)
1565 zsnowenergy_bb(:,1) = zsnowenergy_bb(:,1) + znir_abs
1569 DO jl = 1,
SIZE(psnowrho,2)
1570 DO jj = 1,
SIZE(psnowrho,1)
1571 IF ( jl<=knlvls_use(jj) )
THEN 1572 ztotsnowenergy(jj) = ztotsnowenergy(jj) + zsnowenergy_bb(jj,jl)
1578 zreflected_bb = psw_rad - ztotsnowenergy - zsoilenergy_bb
1582 psnowalb = zreflected_bb / psw_rad
1585 pradsink(:,1) = -psw_rad(:) + zreflected_bb + zsnowenergy_bb(:,1)
1587 DO jl = 2,
SIZE(psnowrho,2)
1588 pradsink(:,jl) = pradsink(:,jl-1) + zsnowenergy_bb(:,jl)
1592 pradxs = psw_rad - ztotsnowenergy - zreflected_bb
1594 IF (
lhook)
CALL dr_hook(
'SNOWCRO_CALL_TARTES',1,zhook_handle)
real, dimension(npnbands) xrefice_r
real, dimension(npnbands) xconst_c
real, parameter xp_mudiff
real, dimension(npnbands_ref), parameter xpwavelengths_ref
subroutine single_scattering_optical_parameters(PSNOWSSA, PSNOWRHO, PSNOWG0, PSNOWY0, PSNOWW0, PSNOWB0, PSNOWIMP_DENSITY, PSNOWIMP_CONTENT, KNLVLS_USE, KMAX_USE, PSNOWSSALB, PSNOWG)
subroutine spectral_repartition(PSW_RAD, PCOSZEN, PSW_RAD_DIF, PSW_RAD_DIR, PNIR_ABS)
subroutine two_stream_vector(PSNOWALBEDO, PSOILALBEDO, PDTAUSTAR, PTAUSTAR, PGM, PGP, PCOSZEN, KNLVLS_EFF, KMAX_EFF, PVECTOR)
subroutine gp_gm_vectors(PSNOWSSALB, PKESTAR, PG_STAR, PSSALB_STAR, PGAMMA1, PGAMMA2, PCOSZEN, PSW_RAD, KNLVLS_EFF, KMAX_EFF, PGP, PGM)
real, dimension(npnbands) xginf
real, dimension(npnbands) xrefice_norm
subroutine two_stream_matrix(PSNOWALBEDO, PSOILALBEDO, PKESTAR, PDTAUSTAR, KNLVLS_EFF, KMAX_EFF, PDM, PD, PDP)
subroutine snowpack_albedo(PXC_DIR, PXC_DIF, PXD_DIR, PXD_DIF, PGP_DIR, PGP_DIF, PCOSZEN_DIR, PCOSZEN_DIF, PSW_RAD_DIR, PSW_RAD_DIF, PSNOWALB)
real, parameter xpcoefnir_dif
subroutine refsoot_imag()
real, dimension(npnbands_ref), save xprefice_r
integer, parameter npnbands
subroutine solves_two_stream2(PDM, PD, PDP, PVECT_DIR, PVECT_DIF, PSNOWALBEDO, PSW_RAD_DIR, PSW_RAD_DIF, KNLVLS_EFF, KMAX_EFF, PXA_DIR, PXA_DIF, PXB_DIR, PXB_DIF, PXC_DIR, PXC_DIF, PXD_DIR, PXD_DIF)
subroutine abor1_sfx(YTEXT)
subroutine shape_parameter_variations(PSNOWG0, PSNOWY0, PSNOWW0, PSNOWB0, PSNOWG00, PSNOWY, PSNOWW, PSNOWB)
integer, dimension(nvegtype_old), parameter npnimp
subroutine impurities_co_single_scattering_albedo(PSNOWSSA, PSNOWIMP_DENSITY, PSNOWIMP_CONTENT, KNLVLS_USE, KMAX_USE, PCOSSALB)
real, dimension(npnbands) xrefice_i
real, dimension(npnbands), parameter xpwavelengths_m
real, dimension(npnbands), parameter xpratio_dir
subroutine energy_profile(PXA, PXB, PXC, PXD, PKESTAR, PDTAUSTAR, PTAUSTAR, PGM, PGP, PCOSZEN, KNLVLS_EFF, KMAX_EFF, PEPROFILE)
real, dimension(npnbands, npnimp) xrefimp_i
real, dimension(npnbands), parameter xpwavelengths
subroutine snowcro_call_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 infinite_medium_optical_parameters(PSNOWSSALB, PSNOWG, KNLVLS_USE, KMAX_USE, PSNOWALBEDO, PKESTAR, PG_STAR, PSSALB_STAR, PGAMMA1, PGAMMA2)
real, parameter xpcoefnir_dir
subroutine tartes(PSNOWSSA, PSNOWRHO, PSNOWDZ, PSNOWG0, PSNOWY0, PSNOWW0, PSNOWB0, PSNOWIMP_DENSITY, PSNOWIMP_CONTENT, PALB, PSW_RAD_DIF, PSW_RAD_DIR, PCOSZEN, KNLVLS_USE, PSNOWALB, PSNOWENERGY, PSOILENERGY)
integer, parameter npnbands_ref
subroutine soil_absorption(PXA, PXB, PKESTAR, PDTAUSTAR, PTAUSTAR, PGM, PCOSZEN, PALB, KNLVLS_EFF, PSOILENERGY)
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)
real, parameter xpmax_opticaldepth
subroutine taustar_vector(PSNOWSSA, PSNOWRHO, PSNOWDZ, PSNOWSSALB, PSNOWG, PKESTAR, KNLVLS_USE, KMAX_USE, PDTAUSTAR, PTAUSTAR)
real, dimension(npnbands_ref), save xprefice_i
subroutine estimate_effective_layer_number(PKESTAR, PDTAUSTAR, KNLVLS_USE, KMAX_USE, KNLVLS_EFF, KMAX_EFF)
real, dimension(npnbands), parameter xpratio_dif