56 USE yomhook
,ONLY : lhook, dr_hook
57 USE parkind1
,ONLY : jprb
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)
66 USE modd_const_tartes, ONLY: npnbands,xpwavelengths,xrefice_r,xrefice_i,xrefimp_i,xp_mudiff
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
126 IF (lhook) CALL dr_hook(
'TARTES',0,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
221 IF (lhook) CALL dr_hook(
'TARTES',1,zhook_handle)
232 REAL(KIND=JPRB) :: zhook_handle
234 IF (lhook) CALL dr_hook(
'INIT_TARTES',0,zhook_handle)
239 IF (lhook) CALL dr_hook(
'INIT_TARTES',1,zhook_handle)
248 USE modd_const_tartes, ONLY: npnbands,xpwavelengths,xpwavelengths_m,xrefice_r,xrefice_i, &
249 npnbands_ref,xpwavelengths_ref,xprefice_r,xprefice_i, &
250 xrefice_norm,xginf,xconst_c
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
268 IF (lhook) CALL dr_hook(
'REFICE',0,zhook_handle)
270 zlog_wl = log(xpwavelengths)
271 zlog_wl_ref = log(xpwavelengths_ref)
272 zlog_refice_i = log(xprefice_i)
279 DO jbref = 1,npnbands_ref
281 IF ( xpwavelengths_ref(jbref)>xpwavelengths(jb) )
THEN
283 IF ( jbref<2 ) CALL
abor1_sfx(
"FATAL ERROR INIT_TARTES (interpolation of refractive indexs)")
287 xrefice_r(jb) = ( (xpwavelengths(jb) - xpwavelengths_ref(jbref-1)) * xprefice_r(jbref) + &
288 (xpwavelengths_ref(jbref) - xpwavelengths(jb) ) * xprefice_r(jbref-1) ) / &
289 ( xpwavelengths_ref(jbref) - xpwavelengths_ref(jbref-1) )
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) ) )
294 xrefice_norm(jb) = xrefice_r(jb) - 1.3
295 xginf(jb) = 0.9751 - 0.105 * xrefice_norm(jb)
296 xconst_c(jb) = 24. * xpi * xrefice_i(jb) / ( xrholi * xpwavelengths_m(jb) )
304 IF ( ginf ) CALL
abor1_sfx(
"FATAL ERROR INIT_TARTES (interpolation of refractive indexs)")
308 IF (lhook) CALL dr_hook(
'REFICE',1,zhook_handle)
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
329 IF (lhook) CALL dr_hook(
'REFSOOT_IMAG',0,zhook_handle)
331 zwl_um = xpwavelengths / 1000.
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.) )
341 IF (lhook) CALL dr_hook(
'REFSOOT_IMAG',1,zhook_handle)
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)
375 psnowb(:,:,jb) = psnowb0(:,:) + 0.4 * xrefice_norm(jb)
376 psnoww(:,:,jb) = psnoww0(:,:) + 0.17 * 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
421 zabs_imp(jj,jl) = -xrefimp_i(jb,jimp)
422 pcossalb(jj,jl,jb) = pcossalb(jj,jl,jb) + &
423 12. * xpi / ( xpwavelengths_m(jb)*psnowssa(jj,jl) ) * &
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 ), &
618 xpmax_opticaldepth / pkestar(:,jl,jb) )
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)
676 WHERE ( ztau(:,jl,jb)>xptaumax )
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
720 IF (lhook) CALL dr_hook(
'GP_GM_VECTORS',0,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 )
748 IF (lhook) CALL dr_hook(
'GP_GM_VECTORS',1,zhook_handle)
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)
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 :: zdexp, zfdu, zfdd, zstar
1036 REAL(KIND=JPRB) :: zhook_handle
1038 IF (lhook) CALL dr_hook(
'ENERGY_PROFILE',0,zhook_handle)
1042 DO jj =1,
SIZE(peprofile,1)
1044 zstar = pkestar(jj,1,jb) * pdtaustar(jj,1,jb)
1047 peprofile(jj,1,jb) = ( pcoszen(jj) - ( pxc(jj,1,jb)+pxd(jj,1,jb)+pgp(jj,1,jb) ) ) + &
1048 ( pxc(jj,1,jb) * exp(-zstar) + pxd(jj,1,jb) * exp(zstar) + &
1049 pgp(jj,1,jb) * exp( -pdtaustar(jj,1,jb)/pcoszen(jj)) ) - &
1050 ( pxa(jj,1,jb) * exp(-zstar) + pxb(jj,1,jb) * exp(zstar) + &
1051 pgm(jj,1,jb) * exp( -pdtaustar(jj,1,jb)/pcoszen(jj)) + &
1052 pcoszen(jj) * exp( -ptaustar(jj,1,jb)/pcoszen(jj)) )
1056 DO jl = 2,kmax_eff(jb)
1058 zstar = pkestar(jj,jl,jb) * pdtaustar(jj,jl,jb)
1060 IF ( jl<=knlvls_eff(jj,jb) )
THEN
1063 zdexp = exp( -ptaustar(jj,jl ,jb)/pcoszen(jj) ) - exp( -ptaustar(jj,jl-1,jb)/pcoszen(jj) )
1066 zfdu = pxc(jj,jl,jb) * ( exp(-zstar) -1. ) + &
1067 pxd(jj,jl,jb) * ( exp( zstar) -1. ) + pgp(jj,jl,jb) * zdexp
1070 zfdd = pxa(jj,jl,jb) * ( exp(-zstar) -1. ) + &
1071 pxb(jj,jl,jb) * ( exp( zstar) -1. ) + ( pgm(jj,jl,jb) + pcoszen(jj) ) * zdexp
1073 peprofile(jj,jl,jb) = zfdu - zfdd
1077 peprofile(jj,jl,jb) = 0.
1087 IF (lhook) CALL dr_hook(
'ENERGY_PROFILE',1,zhook_handle)
1092 SUBROUTINE soil_absorption(PXA,PXB,PKESTAR,PDTAUSTAR,PTAUSTAR,PGM,PCOSZEN,PALB,KNLVLS_EFF,PSOILENERGY)
1099 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: pxa,pxb
1100 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: pkestar
1101 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: pdtaustar
1102 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: ptaustar
1103 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: pgm
1104 REAL,
DIMENSION(:),
INTENT(IN) :: pcoszen
1105 REAL,
DIMENSION(:,:),
INTENT(IN) :: palb
1106 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: knlvls_eff
1107 REAL,
DIMENSION(:,:),
INTENT(OUT) :: psoilenergy
1110 REAL(KIND=JPRB) :: zhook_handle
1112 IF (lhook) CALL dr_hook(
'SOIL_ABSORPTION',0,zhook_handle)
1119 psoilenergy(ji,jb) = ( 1.-palb(ji,jb) ) * &
1120 ( pxa(ji,knlvls_eff(ji,jb),jb) * &
1121 exp( -pkestar(ji,knlvls_eff(ji,jb),jb) * pdtaustar(ji,knlvls_eff(ji,jb),jb) ) + &
1122 pxb(ji,knlvls_eff(ji,jb),jb) * &
1123 exp( pkestar(ji,knlvls_eff(ji,jb),jb) * pdtaustar(ji,knlvls_eff(ji,jb),jb) ) + &
1124 ( pgm(ji,knlvls_eff(ji,jb),jb)+pcoszen(ji) ) * &
1125 exp( -ptaustar(ji,knlvls_eff(ji,jb),jb)/pcoszen(ji) ) )
1131 IF (lhook) CALL dr_hook(
'SOIL_ABSORPTION',1,zhook_handle)
1138 USE modd_const_tartes, ONLY : npnbands,xpratio_dir,xpratio_dif,xpcoefnir_dir,xpcoefnir_dif,xp_mudiff
1142 REAL,
DIMENSION(:),
INTENT(IN) :: psw_rad
1143 REAL,
DIMENSION(:),
INTENT(IN) :: pcoszen
1144 REAL,
DIMENSION(:,:),
INTENT(OUT) :: psw_rad_dif
1145 REAL,
DIMENSION(:,:),
INTENT(OUT) :: psw_rad_dir
1146 REAL,
DIMENSION(:),
INTENT(OUT) :: pnir_abs
1148 REAL,
DIMENSION(SIZE(PSW_RAD)) :: zsw_rad_broaddir,zsw_rad_broaddif
1151 REAL(KIND=JPRB) :: zhook_handle
1153 IF (lhook) CALL dr_hook(
'SPECTRAL_REPARTITION',0,zhook_handle)
1157 zsw_rad_broaddif = min( exp( - 1.54991930344*pcoszen**3 + 3.73535795329*pcoszen**2 &
1158 - 3.52421131883*pcoszen + 0.0299111951172 ), 1. ) * psw_rad
1159 zsw_rad_broaddir = psw_rad - zsw_rad_broaddif
1163 psw_rad_dif(:,jb) = xpratio_dif(jb) * zsw_rad_broaddif / xp_mudiff
1164 psw_rad_dir(:,jb) = xpratio_dir(jb) * zsw_rad_broaddir / pcoszen(:)
1167 pnir_abs = zsw_rad_broaddif*xpcoefnir_dif + zsw_rad_broaddir*xpcoefnir_dir
1169 IF (lhook) CALL dr_hook(
'SPECTRAL_REPARTITION',1,zhook_handle)
1174 SUBROUTINE snowcro_tartes(PSNOWGRAN1,PSNOWGRAN2,PSNOWRHO,PSNOWDZ,PSNOWG0,PSNOWY0,PSNOWW0,PSNOWB0, &
1175 psnowimp_density,psnowimp_content,palb,psw_rad,pzenith,knlvls_use, &
1176 psnowalb,pradsink,pradxs,odebug,hsnowmetamo)
1186 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowgran1,psnowgran2
1187 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowrho
1188 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowg0
1189 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowy0
1190 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnoww0
1191 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowb0
1192 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowdz
1193 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: psnowimp_density
1194 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: psnowimp_content
1196 REAL,
DIMENSION(:),
INTENT(IN) :: palb
1198 REAL,
DIMENSION(:),
INTENT(IN) :: psw_rad
1199 REAL,
DIMENSION(:),
INTENT(IN) :: pzenith
1201 INTEGER,
DIMENSION(:),
INTENT(IN) :: knlvls_use
1204 REAL,
DIMENSION(:,:),
INTENT(OUT) :: pradsink
1205 REAL,
DIMENSION(:),
INTENT(OUT) :: pradxs
1206 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowalb
1208 LOGICAL,
INTENT(IN) :: odebug
1209 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
1212 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),NPNIMP) :: zsnowimp_density_p
1213 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),NPNIMP) :: zsnowimp_content_p
1215 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowgran1_p,zsnowgran2_p
1216 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowrho_p
1217 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowg0_p
1218 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowy0_p
1219 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnoww0_p
1220 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowb0_p
1221 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowdz_p
1223 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zradsink_p
1225 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zalb_p
1226 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zsw_rad_p
1227 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zzenith_p
1230 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zradxs_p
1231 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zsnowalb_p
1233 INTEGER,
DIMENSION(SIZE(PSNOWRHO,1)) :: inlvls_use_p
1235 INTEGER,
DIMENSION(SIZE(PSNOWRHO,1)) :: idaymask
1238 INTEGER :: jl,jimp,jj,jj_p
1239 INTEGER :: ipointday
1242 REAL(KIND=JPRB) :: zhook_handle
1244 IF (lhook) CALL dr_hook(
'SNOWCRO_TARTES',0,zhook_handle)
1251 inpoints =
SIZE(psnowrho,1)
1256 IF ( cos(pzenith(jj))>xuepsi .AND. psw_rad(jj)>xuepsi )
THEN
1258 ipointday = ipointday + 1
1259 idaymask(ipointday) = jj
1263 IF ( ipointday>=1 )
THEN
1266 DO jj_p = 1,ipointday
1270 zalb_p(jj_p) = palb(jj)
1271 zsw_rad_p(jj_p) = psw_rad(jj)
1272 zzenith_p(jj_p) = pzenith(jj)
1273 inlvls_use_p(jj_p) = knlvls_use(jj)
1277 imax_use = maxval(knlvls_use)
1282 DO jj_p = 1,ipointday
1286 zsnowgran1_p(jj_p,jl) = psnowgran1(jj,jl)
1287 zsnowgran2_p(jj_p,jl) = psnowgran2(jj,jl)
1288 zsnowrho_p(jj_p,jl) = psnowrho(jj,jl)
1289 zsnowg0_p(jj_p,jl) = psnowg0(jj,jl)
1290 zsnowy0_p(jj_p,jl) = psnowy0(jj,jl)
1291 zsnoww0_p(jj_p,jl) = psnoww0(jj,jl)
1292 zsnowb0_p(jj_p,jl) = psnowb0(jj,jl)
1293 zsnowdz_p(jj_p,jl) = psnowdz(jj,jl)
1304 DO jj_p = 1,ipointday
1308 zsnowimp_density_p(jj_p,jl,jimp) = psnowimp_density(jj,jl,jimp)
1309 zsnowimp_content_p(jj_p,jl,jimp) = psnowimp_content(jj,jl,jimp)
1320 CALL
snowcro_call_tartes(zsnowgran1_p(1:ipointday,1:imax_use),zsnowgran2_p(1:ipointday,1:imax_use), &
1321 zsnowrho_p(1:ipointday,1:imax_use),zsnowdz_p(1:ipointday,1:imax_use), &
1322 zsnowg0_p(1:ipointday,1:imax_use),zsnowy0_p(1:ipointday,1:imax_use), &
1323 zsnoww0_p(1:ipointday,1:imax_use),zsnowb0_p(1:ipointday,1:imax_use), &
1324 zsnowimp_density_p(1:ipointday,1:imax_use,1:npnimp), &
1325 zsnowimp_content_p(1:ipointday,1:imax_use,1:npnimp), &
1326 zalb_p(1:ipointday),zsw_rad_p(1:ipointday), &
1327 zzenith_p(1:ipointday),inlvls_use_p(1:ipointday),zsnowalb_p(1:ipointday), &
1328 zradsink_p(1:ipointday,1:imax_use),zradxs_p(1:ipointday),odebug,hsnowmetamo)
1330 CALL
snowcro_call_tartes(zsnowgran1_p(1:ipointday,:),zsnowgran2_p(1:ipointday,:),zsnowrho_p(1:ipointday,:), &
1331 zsnowdz_p(1:ipointday,:),zsnowg0_p(1:ipointday,:),zsnowy0_p(1:ipointday,:), &
1332 zsnoww0_p(1:ipointday,:),zsnowb0_p(1:ipointday,:),zsnowimp_density_p(1:ipointday,:,:), &
1333 zsnowimp_content_p(1:ipointday,:,:),zalb_p(1:ipointday),zsw_rad_p(1:ipointday), &
1334 zzenith_p(1:ipointday),inlvls_use_p(1:ipointday),zsnowalb_p(1:ipointday), &
1335 zradsink_p(1:ipointday,:),zradxs_p(1:ipointday),odebug,hsnowmetamo)
1340 DO jj_p = 1,ipointday
1344 pradxs(jj) = zradxs_p(jj_p)
1345 psnowalb(jj) = zsnowalb_p(jj_p)
1352 DO jj_p = 1,ipointday
1356 pradsink(jj,jl) = zradsink_p(jj_p,jl)
1364 IF (lhook) CALL dr_hook(
'SNOWCRO_TARTES',1,zhook_handle)
1372 psnowimp_density,psnowimp_content,palb,psw_rad,pzenith,knlvls_use, &
1373 psnowalb,pradsink,pradxs,odebug,hsnowmetamo)
1385 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowgran1,psnowgran2
1386 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowrho
1387 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowg0
1388 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowy0
1389 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnoww0
1390 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowb0
1391 REAL,
DIMENSION(:,:),
INTENT(IN) :: psnowdz
1392 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: psnowimp_density
1393 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: psnowimp_content
1395 REAL,
DIMENSION(:),
INTENT(IN) :: palb
1397 REAL,
DIMENSION(:),
INTENT(IN) :: psw_rad
1398 REAL,
DIMENSION(:),
INTENT(IN) :: pzenith
1400 INTEGER,
DIMENSION(:),
INTENT(IN) :: knlvls_use
1403 REAL,
DIMENSION(:,:),
INTENT(OUT) :: pradsink
1404 REAL,
DIMENSION(:),
INTENT(OUT) :: pradxs
1405 REAL,
DIMENSION(:),
INTENT(OUT) :: psnowalb
1407 LOGICAL,
INTENT(IN) :: odebug
1408 CHARACTER(3),
INTENT(IN) :: hsnowmetamo
1411 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),NPNBANDS) :: zsnowenergy
1413 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowssa
1414 REAL,
DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: zsnowenergy_bb
1416 REAL,
DIMENSION(SIZE(PSNOWRHO,1),NPNBANDS) :: zsw_rad_dif
1417 REAL,
DIMENSION(SIZE(PSNOWRHO,1),NPNBANDS) :: zsw_rad_dir
1419 REAL,
DIMENSION(SIZE(PSNOWRHO,1),NPNBANDS) :: zsnowalb
1420 REAL,
DIMENSION(SIZE(PSNOWRHO,1),NPNBANDS) :: zalb
1421 REAL,
DIMENSION(SIZE(PSNOWRHO,1),NPNBANDS) :: zsoilenergy
1423 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: znir_abs
1426 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: ztotsnowenergy
1427 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zsoilenergy_bb
1428 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zreflected_bb
1430 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zsnowenergy_cum,zsnowenergy_upper
1431 REAL,
DIMENSION(SIZE(PSNOWRHO,1)) :: zmax
1437 REAL(KIND=JPRB) :: zhook_handle
1439 IF (lhook) CALL dr_hook(
'SNOWCRO_CALL_TARTES',0,zhook_handle)
1442 DO jl = 1,
SIZE(psnowrho,2)
1444 DO jj = 1,
SIZE(psnowrho,1)
1446 IF ( jl<=knlvls_use(jj) )
THEN
1448 CALL
get_diam(psnowgran1(jj,jl),psnowgran2(jj,jl),zdiam,hsnowmetamo)
1449 zsnowssa(jj,jl) = 6. / (xrholi*zdiam)
1459 zalb(:,jb) = palb(:)
1466 WRITE(*,*)
"ZSW_RAD_DIF=",zsw_rad_dif
1467 WRITE(*,*)
"ZSW_RAD_DIR=",zsw_rad_dir
1468 WRITE(*,*)
"PZENITH=",pzenith
1474 CALL
tartes(zsnowssa,psnowrho,psnowdz,psnowg0,psnowy0,psnoww0,psnowb0,psnowimp_density,psnowimp_content,zalb,&
1475 zsw_rad_dif,zsw_rad_dir,cos(pzenith),knlvls_use,zsnowalb,zsnowenergy,zsoilenergy)
1550 zsnowenergy_bb(:,:) = zsnowenergy_bb(:,:) + zsnowenergy(:,:,jb)
1551 zsoilenergy_bb(:) = zsoilenergy_bb(:) + zsoilenergy(:,jb)
1555 zsnowenergy_bb(:,1) = zsnowenergy_bb(:,1) + znir_abs
1559 DO jl = 1,
SIZE(psnowrho,2)
1560 DO jj = 1,
SIZE(psnowrho,1)
1561 IF ( jl<=knlvls_use(jj) )
THEN
1562 ztotsnowenergy(jj) = ztotsnowenergy(jj) + zsnowenergy_bb(jj,jl)
1568 zreflected_bb = psw_rad - ztotsnowenergy - zsoilenergy_bb
1572 psnowalb = zreflected_bb / psw_rad
1575 pradsink(:,1) = -psw_rad(:) + zreflected_bb + zsnowenergy_bb(:,1)
1577 DO jl = 2,
SIZE(psnowrho,2)
1578 pradsink(:,jl) = pradsink(:,jl-1) + zsnowenergy_bb(:,jl)
1582 pradxs = psw_rad - ztotsnowenergy - zreflected_bb
1584 IF (lhook) CALL dr_hook(
'SNOWCRO_CALL_TARTES',1,zhook_handle)
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 taustar_vector(PSNOWSSA, PSNOWRHO, PSNOWDZ, PSNOWSSALB, PSNOWG, PKESTAR, KNLVLS_USE, KMAX_USE, PDTAUSTAR, PTAUSTAR)
subroutine shape_parameter_variations(PSNOWG0, PSNOWY0, PSNOWW0, PSNOWB0, PSNOWG00, PSNOWY, PSNOWW, PSNOWB)
subroutine energy_profile(PXA, PXB, PXC, PXD, PKESTAR, PDTAUSTAR, PTAUSTAR, PGM, PGP, PCOSZEN, KNLVLS_EFF, KMAX_EFF, PEPROFILE)
subroutine estimate_effective_layer_number(PKESTAR, PDTAUSTAR, KNLVLS_USE, KMAX_USE, KNLVLS_EFF, KMAX_EFF)
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)
subroutine abor1_sfx(YTEXT)
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 impurities_co_single_scattering_albedo(PSNOWSSA, PSNOWIMP_DENSITY, PSNOWIMP_CONTENT, KNLVLS_USE, KMAX_USE, PCOSSALB)
subroutine two_stream_vector(PSNOWALBEDO, PSOILALBEDO, PDTAUSTAR, PTAUSTAR, PGM, PGP, PCOSZEN, KNLVLS_EFF, KMAX_EFF, PVECTOR)
subroutine two_stream_matrix(PSNOWALBEDO, PSOILALBEDO, PKESTAR, PDTAUSTAR, KNLVLS_EFF, KMAX_EFF, PDM, PD, PDP)
subroutine snowcro_tartes(PSNOWGRAN1, PSNOWGRAN2, PSNOWRHO, PSNOWDZ, PSNOWG0, PSNOWY0, PSNOWW0, PSNOWB0, PSNOWIMP_DENSITY, PSNOWIMP_CONTENT, PALB, PSW_RAD, PZENITH, KNLVLS_USE, PSNOWALB, PRADSINK, PRADXS, ODEBUG, HSNOWMETAMO)
subroutine spectral_repartition(PSW_RAD, PCOSZEN, PSW_RAD_DIF, PSW_RAD_DIR, PNIR_ABS)
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)
subroutine soil_absorption(PXA, PXB, PKESTAR, PDTAUSTAR, PTAUSTAR, PGM, PCOSZEN, PALB, KNLVLS_EFF, PSOILENERGY)
subroutine infinite_medium_optical_parameters(PSNOWSSALB, PSNOWG, KNLVLS_USE, KMAX_USE, PSNOWALBEDO, PKESTAR, PG_STAR, PSSALB_STAR, PGAMMA1, PGAMMA2)
subroutine gp_gm_vectors(PSNOWSSALB, PKESTAR, PG_STAR, PSSALB_STAR, PGAMMA1, PGAMMA2, PCOSZEN, PSW_RAD, KNLVLS_EFF, KMAX_EFF, PGP, PGM)
subroutine single_scattering_optical_parameters(PSNOWSSA, PSNOWRHO, PSNOWG0, PSNOWY0, PSNOWW0, PSNOWB0, PSNOWIMP_DENSITY, PSNOWIMP_CONTENT, KNLVLS_USE, KMAX_USE, PSNOWSSALB, PSNOWG)
subroutine refsoot_imag()