SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
update_rad_isban.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6 SUBROUTINE update_rad_isba_n (I, &
7  oflood,hsnow,pzenith,psw_bands,pveg,plai,pz0, &
8  omeb_patch,plaigv,pgndlitter,pz0litter, ph_veg, &
9  palbnir,palbvis,palbuv,pemis, &
10  pdir_alb_with_snow,psca_alb_with_snow,pemist, &
11  pdir_sw,psca_sw, &
12  palbnir_veg, palbnir_soil, &
13  palbvis_veg, palbvis_soil )
14 ! ####################################################################
15 !
16 !!**** *UPDATE_RAD_ISBA_n * - Calculate snow/flood fraction, dir/dif albedo
17 !! and emissivity at t+1 in order to close the
18 !! energy budget between the atmospheric model
19 !! and surfex
20 !!
21 !! PURPOSE
22 !! -------
23 !
24 !!** METHOD
25 !! ------
26 !!
27 !! REFERENCE
28 !! ---------
29 !!
30 !!
31 !! AUTHOR
32 !! ------
33 !! B. Decharme
34 !!
35 !! MODIFICATIONS
36 !! -------------
37 !! Original 09/2009
38 !! P. Samuelsson 02/2012 MEB
39 !! A. Boone 03/2015 MEB-use TR_ML scheme for SW radiation
40 !!------------------------------------------------------------------
41 !
42 !
43 USE modd_isba_n, ONLY : isba_t
44 !
46 !
47 USE modd_data_cover_par, ONLY : nvt_snow
48 !
49 USE modd_csts, ONLY : xtt
50 USE modd_surf_par, ONLY : xundef
51 USE modd_snow_par, ONLY : xrhosmin_es,xrhosmax_es,xsnowdmin,xemissn
52 USE modd_water_par, ONLY : xalbsca_wat, xemiswat, xalbwatice, xemiswatice
53 USE modd_meb_par, ONLY : xsw_wght_vis, xsw_wght_nir
54 !
58 !
59 USE modi_albedo_ta96
60 USE modi_albedo_from_nir_vis
63 USE modi_isba_snow_frac
64 USE modi_isba_emis_meb
65 USE modi_radiative_transfert
66 !
67 !
68 USE yomhook ,ONLY : lhook, dr_hook
69 USE parkind1 ,ONLY : jprb
70 !
71 IMPLICIT NONE
72 !
73 !* 0.1 declarations of arguments
74 !
75 !
76 TYPE(isba_t), INTENT(INOUT) :: i
77 !
78 LOGICAL, INTENT(IN) :: oflood
79  CHARACTER(LEN=*), INTENT(IN) :: hsnow
80 !
81 REAL, DIMENSION(:), INTENT(IN) :: pzenith ! Zenithal angle at t+1
82 REAL, DIMENSION(:), INTENT(IN) :: psw_bands ! mean wavelength of each shortwave band (m)
83 REAL, DIMENSION(:,:), INTENT(IN) :: pveg ! Vegetation fraction at t+1
84 REAL, DIMENSION(:,:), INTENT(IN) :: plai ! leaf area index at t+1
85 REAL, DIMENSION(:,:), INTENT(IN) :: pz0 ! roughness length at t+1
86 REAL, DIMENSION(:,:), INTENT(IN) :: palbnir ! near-infra-red albedo (soil+vegetation) at t+1
87 REAL, DIMENSION(:,:), INTENT(IN) :: palbvis ! visible albedo (soil+vegetation) at t+1
88 REAL, DIMENSION(:,:), INTENT(IN) :: palbuv ! UV albedo (soil+vegetation) at t+1
89 REAL, DIMENSION(:,:), INTENT(IN) :: pemis ! emissivity (soil+vegetation) at t+1
90 LOGICAL, DIMENSION(:), INTENT(IN) :: omeb_patch ! multi-energy balance logical vector
91 REAL, DIMENSION(:,:), INTENT(IN) :: pgndlitter ! Ground litter fraction at t+1
92 REAL, DIMENSION(:,:), INTENT(IN) :: plaigv ! Understory leaf area index at t+1
93 REAL, DIMENSION(:,:), INTENT(IN) :: pz0litter ! Ground litter roughness length at t+1
94 REAL, DIMENSION(:,:), INTENT(IN) :: ph_veg
95 !
96 REAL, DIMENSION(:,:,:), INTENT(OUT) :: pdir_alb_with_snow ! Total direct albedo at t+1
97 REAL, DIMENSION(:,:,:), INTENT(OUT) :: psca_alb_with_snow ! Total diffuse albedo at t+1
98 REAL, DIMENSION(:,:), INTENT(OUT) :: pemist ! Total emissivity at t+1
99 !
100 REAL, DIMENSION(:,:), INTENT(IN), OPTIONAL :: pdir_sw ! direct solar radiation (on horizontal surf.)
101 REAL, DIMENSION(:,:), INTENT(IN), OPTIONAL :: psca_sw ! diffuse solar radiation (on horizontal surf.)
102 REAL, DIMENSION(:,:), INTENT(IN), OPTIONAL :: palbnir_veg ! near-infra-red albedo (vegetation) at t+1
103 REAL, DIMENSION(:,:), INTENT(IN), OPTIONAL :: palbnir_soil ! near-infra-red albedo (soil) at t+1
104 REAL, DIMENSION(:,:), INTENT(IN), OPTIONAL :: palbvis_veg ! visible albedo (vegetation) at t+1
105 REAL, DIMENSION(:,:), INTENT(IN), OPTIONAL :: palbvis_soil ! visible albedo (soil) at t+1
106 !
107 !* 0.2 declarations of local variables
108 !
109 REAL, DIMENSION(SIZE(I%XVEGTYPE,1),SIZE(I%XVEGTYPE,2)) :: zvegtype
110 !
111 INTEGER :: jpatch, iswb, jj
112 REAL(KIND=JPRB) :: zhook_handle
113 !
114 !-------------------------------------------------------------------------------------
115 ! Initialization
116 !-------------------------------------------------------------------------------------
117 
118 IF (lhook) CALL dr_hook('UPDATE_RAD_ISBA_N',0,zhook_handle)
119 iswb = SIZE(psw_bands)
120 !
121 ! Re-order VEGTYPE array to correspond with mask NR_NATURE_P:
122 !
123 zvegtype(:,:) = 0.
124 DO jpatch=1,i%NPATCH
125  DO jj=1,i%NSIZE_NATURE_P(jpatch)
126  zvegtype(jj,jpatch) = i%XVEGTYPE(i%NR_NATURE_P(jj,jpatch),jpatch)
127  ENDDO
128 ENDDO
129 !
130 !-------------------------------------------------------------------------------------
131 !Patch loop
132 !
133 DO jpatch=1,i%NPATCH
134  !
135  IF(i%NSIZE_NATURE_P(jpatch)>0) CALL treat_nature(i%NSIZE_NATURE_P(jpatch),jpatch)
136  !
137 ENDDO
138 !-------------------------------------------------------------------------------
139 !
140 !Update albedo with snow for the next time step
141 !
142 pdir_alb_with_snow(:,:,:)=i%XDIR_ALB_WITH_SNOW (:,:,:)
143 psca_alb_with_snow(:,:,:)=i%XSCA_ALB_WITH_SNOW (:,:,:)
144 !
145 IF (lhook) CALL dr_hook('UPDATE_RAD_ISBA_N',1,zhook_handle)
146 !
147  CONTAINS
148 !
149 SUBROUTINE treat_nature(KSIZE,KPATCH)
150 !
151 IMPLICIT NONE
152 !
153 INTEGER, INTENT(IN) :: ksize
154 INTEGER, INTENT(IN) :: kpatch
155 !
156 INTEGER :: jp
157 INTEGER, DIMENSION(KSIZE) :: imask
158 !
159 REAL, DIMENSION(KSIZE,SIZE(I%TSNOW%WSNOW,2)) :: zlayerswe
160 REAL, DIMENSION(KSIZE,SIZE(I%TSNOW%WSNOW,2)) :: zlayerrho
161 REAL, DIMENSION(KSIZE,SIZE(I%TSNOW%WSNOW,2)) :: zlayerage
162 !
163 REAL, DIMENSION(KSIZE,ISWB) :: zdir_alb_with_snow
164 REAL, DIMENSION(KSIZE,ISWB) :: zsca_alb_with_snow
165 !
166 REAL, DIMENSION(KSIZE) :: zsnowalb
167 REAL, DIMENSION(KSIZE) :: zsnowalbvis
168 REAL, DIMENSION(KSIZE) :: zsnowalbnir
169 REAL, DIMENSION(KSIZE) :: zlai
170 !REAL, DIMENSION(KSIZE) :: ZLAIV
171 REAL, DIMENSION(KSIZE) :: zz0
172 REAL, DIMENSION(KSIZE) :: zveg
173 REAL, DIMENSION(KSIZE) :: zemis
174 REAL, DIMENSION(KSIZE) :: zalbnir
175 REAL, DIMENSION(KSIZE) :: zalbvis
176 REAL, DIMENSION(KSIZE) :: zalbuv
177 REAL, DIMENSION(KSIZE) :: zalbnir_veg
178 REAL, DIMENSION(KSIZE) :: zalbnir_soil
179 REAL, DIMENSION(KSIZE) :: zalbvis_veg
180 REAL, DIMENSION(KSIZE) :: zalbvis_soil
181 !
182 REAL, DIMENSION(KSIZE) :: zpsn
183 REAL, DIMENSION(KSIZE) :: zpsnv_a
184 REAL, DIMENSION(KSIZE) :: zpsng
185 REAL, DIMENSION(KSIZE) :: zpsnv
186 !
187 REAL, DIMENSION(KSIZE) :: zalbf
188 REAL, DIMENSION(KSIZE) :: zalbf_dir
189 REAL, DIMENSION(KSIZE) :: zalbf_sca
190 REAL, DIMENSION(KSIZE) :: zemisf
191 REAL, DIMENSION(KSIZE) :: zff
192 !
193 REAL, DIMENSION(KSIZE) :: zalbnir_with_snow
194 REAL, DIMENSION(KSIZE) :: zalbvis_with_snow
195 REAL, DIMENSION(KSIZE) :: zalbuv_with_snow
196 !
197 REAL, DIMENSION(KSIZE) :: zemist
198 REAL, DIMENSION(KSIZE) :: zzenith
199 REAL, DIMENSION(KSIZE) :: zh_veg
200 REAL, DIMENSION(KSIZE) :: zsnowdepth, zpalphan
201 REAL, DIMENSION(KSIZE) :: zswup
202 REAL, DIMENSION(KSIZE) :: zglobal_sw
203 REAL, DIMENSION(KSIZE) :: zalbt
204 REAL, DIMENSION(KSIZE) :: zpsna, zsigma_f, zsigma_fn, zemissn
205 REAL, DIMENSION(KSIZE,ISWB) :: zdir_sw, zsca_sw
206 REAL, DIMENSION(KSIZE) :: zpermsnowfrac, zdsgrain
207 REAL, DIMENSION(KSIZE,3) :: zspectralalbedo
208 !
209 REAL, DIMENSION(KSIZE) :: zlain, zalbvis_tsoil, zalbnir_tsoil
210 REAL, DIMENSION(KSIZE) :: zfapir, zfapar, zfapir_bs, zfapar_bs
211 REAL, DIMENSION(KSIZE,SIZE(I%XABC)) :: ziacan_sunlit, ziacan_shade, zfrac_sun, ziacan
212 REAL, DIMENSION(KSIZE) :: zfaparc, zfapirc, zmus, zlai_effc
213 LOGICAL, DIMENSION(KSIZE) :: gshade
214 !
215 REAL, PARAMETER :: zput0 = 0.0
216 INTEGER :: jswb
217 REAL(KIND=JPRB) :: zhook_handle
218 !
219 IF (lhook) CALL dr_hook('UPDATE_RAD_ISBA_N:TREAT_NATURE',0,zhook_handle)
220 !
221 imask(:)=i%NR_NATURE_P(1:ksize,kpatch)
222 !
223  CALL pack_same_rank(imask(:),i%TSNOW%WSNOW(:,:,kpatch),zlayerswe(:,:))
224  CALL pack_same_rank(imask(:),i%TSNOW%RHO (:,:,kpatch),zlayerrho(:,:))
225 !
226  CALL pack_same_rank(imask(:),i%TSNOW%ALB (:,kpatch),zsnowalb(:))
227 !
228 IF(omeb_patch(kpatch))THEN
229 
230 ! IF(NPATCH==1)THEN
231 ! ZDIR_SW(:,:) = PDIR_SW(:,:)
232 ! ELSE
233 ! DO JK=1,SIZE(PDIR_SW,2)
234 ! DO JJ=1,KSIZE
235 ! JI=IMASK(JJ)
236 ! ZDIR_SW(JJ,JK) = PDIR_SW (JI,JK)
237 ! ZSCA_SW(JJ,JK) = PSCA_SW (JI,JK)
238 ! ENDDO
239 ! ENDDO
240 ! ENDIF
241 
242  CALL pack_same_rank(imask(:),pzenith(:), zzenith(:))
243 ! CALL PACK_SAME_RANK(IMASK(:),PLAIGV (:,KPATCH),ZLAI (:))
244 ! CALL PACK_SAME_RANK(IMASK(:),PLAI (:,KPATCH),ZLAIV (:))
245 ! CALL PACK_SAME_RANK(IMASK(:),PZ0LITTER (:,KPATCH),ZZ0 (:))
246 ! CALL PACK_SAME_RANK(IMASK(:),PGNDLITTER (:,KPATCH),ZVEG (:))
247  zveg(:)=0. ! Set veg=0 for MEB to get bare soil conditions for snow cover and
248 ! ! flood fraction
249  CALL pack_same_rank(imask(:),ph_veg(:,kpatch),zh_veg(:))
250 !
251  IF(present(pdir_sw))THEN
252 !
253  CALL pack_same_rank(imask(:),pdir_sw(:,:), zdir_sw(:,:))
254  CALL pack_same_rank(imask(:),psca_sw(:,:), zsca_sw(:,:))
255  CALL pack_same_rank(imask(:),palbnir_veg(:,kpatch),zalbnir_veg(:))
256  CALL pack_same_rank(imask(:),palbnir_soil(:,kpatch),zalbnir_soil(:))
257  CALL pack_same_rank(imask(:),palbvis_veg(:,kpatch),zalbvis_veg(:))
258  CALL pack_same_rank(imask(:),palbvis_soil(:,kpatch),zalbvis_soil(:))
259 !
260  CALL pack_same_rank(imask(:),i%TSNOW%AGE (:,:,kpatch),zlayerage(:,:))
261 !
262  CALL pack_same_rank(imask(:),i%XVEGTYPE_PATCH(:,nvt_snow,kpatch),zpermsnowfrac(:))
263 !
264  ENDIF
265 !
266 ELSE
267 ! CALL PACK_SAME_RANK(IMASK(:),PLAI (:,KPATCH),ZLAI (:))
268 ! CALL PACK_SAME_RANK(IMASK(:),PZ0 (:,KPATCH),ZZ0 (:))
269  CALL pack_same_rank(imask(:),pveg(:,kpatch),zveg(:))
270 ! ZALBNIR_VEG(:) = XUNDEF
271 ! ZALBNIR_SOIL(:) = XUNDEF
272 ! ZALBVIS_VEG(:) = XUNDEF
273 ! ZALBVIS_SOIL(:) = XUNDEF
274 ENDIF
275 !
276  CALL pack_same_rank(imask(:),plai(:,kpatch),zlai(:))
277  CALL pack_same_rank(imask(:),pz0(:,kpatch),zz0(:))
278  CALL pack_same_rank(imask(:),pemis(:,kpatch),zemis(:))
279  CALL pack_same_rank(imask(:),palbnir(:,kpatch),zalbnir(:))
280  CALL pack_same_rank(imask(:),palbvis(:,kpatch),zalbvis(:))
281  CALL pack_same_rank(imask(:),palbuv(:,kpatch),zalbuv(:))
282 !
283 IF (hsnow=='3-L' .OR. hsnow=='CRO') THEN
284  CALL pack_same_rank(imask(:),i%TSNOW%ALBVIS (:,kpatch),zsnowalbvis(:))
285  CALL pack_same_rank(imask(:),i%TSNOW%ALBNIR (:,kpatch),zsnowalbnir(:))
286 ENDIF
287 !
288 !-------------------------------------------------------------------------------
289 !
290  CALL isba_snow_frac(hsnow, zlayerswe, zlayerrho, zsnowalb, &
291  zveg, zlai, zz0,zpsn(:), zpsnv_a(:), zpsng(:), zpsnv(:) )
292 !
293 IF ( hsnow=='EBA' ) CALL unpack_same_rank(imask(:),zpsnv_a(:),i%XPSNV_A(:,kpatch),zput0)
294 !
295 !-------------------------------------------------------------------------------
296 !
297 ! Flood fractions and properties
298 !
299 IF(oflood)THEN
300  CALL treat_flood(ksize,kpatch,imask,zpsng,zpsnv,zlai,zveg,&
301  zalbf, zalbf_dir,zalbf_sca,zemisf,zff)
302 ELSE
303  zalbf(:)=0.0
304  zalbf_dir(:)=0.0
305  zalbf_sca(:)=0.0
306  zemisf(:)=0.0
307  zff(:)=0.0
308 ENDIF
309 !-------------------------------------------------------------------------------
310 !
311 zspectralalbedo(:,:) = 0.
312 zpermsnowfrac(:) = 0.
313 !
314 IF(omeb_patch(kpatch))THEN
315 !
316  zsnowdepth(:) = sum(zlayerswe(:,:)/zlayerrho(:,:),2)
317  zpalphan(:) = mebpalphan(zsnowdepth,zh_veg)
318 !
319  zdir_alb_with_snow(:,:)=xundef
320  zsca_alb_with_snow(:,:)=xundef
321 !
322  IF(present(pdir_sw))THEN
323 !
324 ! Albedo
325 !
326 ! - just extract some parameters for call, but no need to update
327 ! the cummulative variables in this routine:
328 !
329  CALL pack_same_rank(imask(:),i%XLAI_EFFC(:,kpatch),zlai_effc(:))
330  CALL pack_same_rank(imask(:),i%XFAPARC(:,kpatch), zfaparc(:) )
331  CALL pack_same_rank(imask(:),i%XFAPIRC(:,kpatch), zfapirc(:) )
332  CALL pack_same_rank(imask(:),i%XMUS(:,kpatch), zmus(:) )
333 !
334  zpermsnowfrac(:) = 0. ! assume no vegetation overlying permanent snow
335 
336  zspectralalbedo(:,1) = zsnowalbvis(:)
337  zspectralalbedo(:,2) = zsnowalbnir(:)
338  zspectralalbedo(:,3) = xundef ! Currently, MEB only considers 2 spectral bands
339 !
340  DO jswb=1,iswb
341  zglobal_sw(:) = zdir_sw(:,jswb) + zsca_sw(:,jswb)
342 
343  WHERE(zsnowalb(:)/=xundef .AND. zsnowalbvis(:)/=xundef .AND. zsnowalbnir(:)/=xundef)
344  zlain(:) = zlai(:)*(1.0-zpalphan(:))
345  zalbvis_tsoil(:) = zalbvis_soil(:)*(1.-zpsn(:)) + zpsn(:)*zsnowalbvis(:)
346  zalbnir_tsoil(:) = zalbnir_soil(:)*(1.-zpsn(:)) + zpsn(:)*zsnowalbnir(:)
347  ELSEWHERE
348  zlain(:) = zlai(:)
349  zalbvis_tsoil(:) = zalbvis_soil(:)
350  zalbnir_tsoil(:) = zalbnir_soil(:)
351  END WHERE
352  !
353  CALL radiative_transfert(i%LAGRI_TO_GRASS, zvegtype(1:ksize,:), &
354  zalbvis_veg, zalbvis_tsoil, zalbnir_veg, zalbnir_tsoil, &
355  zglobal_sw, zlain, zzenith, i%XABC, &
356  zfaparc, zfapirc, zmus, zlai_effc, gshade, ziacan, &
357  ziacan_sunlit, ziacan_shade, zfrac_sun, &
358  zfapar, zfapir, zfapar_bs, zfapir_bs )
359 
360 ! Total effective surface (canopy, ground/flooded zone, snow) all-wavelength
361 ! albedo: diagnosed from shortwave energy budget closure.
362 ! Final note: purely diagnostic - apply limits for night time
363 
364  zalbt(:) = 1. - (xsw_wght_vis*(zfapar(:)+zfapar_bs(:)) + &
365  xsw_wght_nir*(zfapir(:)+zfapir_bs(:)))
366  zswup(:) = zglobal_sw(:)*zalbt(:)
367  zalbt(:) = zswup(:)/max(1.e-5, zglobal_sw(:))
368 !
369  zdir_alb_with_snow(:,jswb)=zalbt(:)
370  zsca_alb_with_snow(:,jswb)=zalbt(:)
371 !
372  END DO
373 !
374  ENDIF
375 !
376 ! Emissivity
377 !
378  zemissn(:) = xemissn
379  zpsna(:) = 0.
380  zsigma_f(:) = 1.0 - meb_shield_factor(zlai,zpsna)
381  zsigma_fn(:) = 1.0 - meb_shield_factor(zlai,zpalphan)
382 !
383  CALL isba_emis_meb(zpsn, zpalphan, zsigma_f, zsigma_fn, &
384  zemissn, zemist )
385 
386 !
387 ELSE
388 !
389 ! * albedo for near-infra-red and visible over snow-covered and snow-flood-free surface
390 !
391  zalbnir_with_snow(:) = zalbnir(:) * (1.-zpsn(:)-zff(:)) + zsnowalb(:) * zpsn(:)
392  zalbvis_with_snow(:) = zalbvis(:) * (1.-zpsn(:)-zff(:)) + zsnowalb(:) * zpsn(:)
393  zalbuv_with_snow(:) = zalbuv(:) * (1.-zpsn(:)-zff(:)) + zsnowalb(:) * zpsn(:)
394 !
395 ! * snow-flood-covered surface albedo for each wavelength (needed for outputs)
396 !
397  CALL albedo_from_nir_vis(psw_bands, &
398  zalbnir_with_snow, zalbvis_with_snow, zalbuv_with_snow,&
399  zdir_alb_with_snow, zsca_alb_with_snow )
400 !
401  DO jswb=1,iswb
402  zdir_alb_with_snow(:,jswb)=zdir_alb_with_snow(:,jswb) + zff(:)*zalbf_dir(:)
403  zsca_alb_with_snow(:,jswb)=zsca_alb_with_snow(:,jswb) + zff(:)*zalbf_sca(:)
404  ENDDO
405 !
406 !-------------------------------------------------------------------------------
407 !
408 ! longwave computations for outputs (emissivity for radiative scheme)
409 !
410  zemist(:) = (1.-zpsn(:)-zff(:))*zemis(:) + zpsn(:) * xemissn + zff(:)*zemisf(:)
411 !
412 ENDIF
413 !
414 !-------------------------------------------------------------------------------
415 !
416 ! Unpack variable
417 !
418  CALL unpack_same_rank(imask(:),zpsng(:),i%XPSNG (:,kpatch),zput0)
419  CALL unpack_same_rank(imask(:),zpsnv(:),i%XPSNV (:,kpatch),zput0)
420  CALL unpack_same_rank(imask(:),zpsn(:),i%XPSN (:,kpatch),zput0)
421  CALL unpack_same_rank(imask(:),zemist(:),pemist(:,kpatch),zput0)
422  CALL unpack_same_rank(imask(:),zdir_alb_with_snow(:,:),i%XDIR_ALB_WITH_SNOW (:,:,kpatch),zput0)
423  CALL unpack_same_rank(imask(:),zsca_alb_with_snow(:,:),i%XSCA_ALB_WITH_SNOW (:,:,kpatch),zput0)
424 !
425 !-------------------------------------------------------------------------------
426 IF (lhook) CALL dr_hook('UPDATE_RAD_ISBA_N:TREAT_NATURE',1,zhook_handle)
427 !
428 END SUBROUTINE treat_nature
429 !
430 SUBROUTINE treat_flood(KSIZE,KPATCH,KMASK,PPSNG,PPSNV,PLAI,PVEG,&
431  palbf, palbf_dir,palbf_sca,pemisf,pff)
432 !
433 IMPLICIT NONE
434 !
435 INTEGER, INTENT(IN) :: ksize
436 INTEGER, INTENT(IN) :: kpatch
437 INTEGER, DIMENSION(:), INTENT(IN) :: kmask
438 REAL, DIMENSION(:), INTENT(IN) :: ppsng
439 REAL, DIMENSION(:), INTENT(IN) :: ppsnv
440 REAL, DIMENSION(:), INTENT(IN) :: plai
441 REAL, DIMENSION(:), INTENT(IN) :: pveg
442 REAL, DIMENSION(:), INTENT(OUT) :: palbf_dir
443 REAL, DIMENSION(:), INTENT(OUT) :: palbf_sca
444 REAL, DIMENSION(:), INTENT(OUT) :: palbf
445 REAL, DIMENSION(:), INTENT(OUT) :: pemisf
446 REAL, DIMENSION(:), INTENT(OUT) :: pff
447 !
448 REAL, DIMENSION(KSIZE) :: ztg
449 REAL, DIMENSION(KSIZE) :: zzenith
450 REAL, DIMENSION(KSIZE) :: zfflood
451 REAL, DIMENSION(KSIZE) :: zffg
452 REAL, DIMENSION(KSIZE) :: zffv
453 REAL, DIMENSION(KSIZE) :: zffrozen
454 REAL, DIMENSION(KSIZE) :: zalbedo
455 !
456 REAL, PARAMETER :: zput0 = 0.0
457 REAL(KIND=JPRB) :: zhook_handle
458 !
459 IF (lhook) CALL dr_hook('UPDATE_RAD_ISBA_N:TREAT_FLOOD',0,zhook_handle)
460 !
461  CALL pack_same_rank(kmask(:),i%XTG(:,1,kpatch),ztg(:))
462 !
463  CALL pack_same_rank(kmask(:),pzenith(:),zzenith(:))
464  CALL pack_same_rank(kmask(:),i%XFFLOOD(:),zfflood(:))
465 !
466 zffg(:) = flood_frac_ground(ppsng,zfflood)
467 zffv(:) = flood_frac_veg(plai,ppsnv,zfflood)
468 pff(:) = flood_frac_nat(pveg,zffg,zffv,zfflood)
469 !
470 zalbedo(:) = albedo_ta96(zzenith(:))
471 WHERE(zfflood==0.0)
472  palbf_dir(:) = xundef
473  palbf_sca(:) = xundef
474  palbf(:) = xundef
475  pemisf(:) = xundef
476  zffrozen(:) = 0.0
477 ELSEWHERE
478  WHERE(ztg(:)>=xtt)
479  palbf_dir(:) = zalbedo(:)
480  palbf_sca(:) = xalbsca_wat
481  pemisf(:) = xemiswat
482  zffrozen(:) = 0.0
483  ELSEWHERE
484  palbf_dir(:) = xalbwatice
485  palbf_sca(:) = xalbwatice
486  pemisf(:) = xemiswatice
487  zffrozen(:) = 1.0
488  END WHERE
489  palbf(:)=0.5*(palbf_dir(:)+palbf_sca(:))
490 ENDWHERE
491 !
492  CALL unpack_same_rank(kmask(:),zffg(:),i%XFFG (:,kpatch),zput0)
493  CALL unpack_same_rank(kmask(:),zffv(:),i%XFFV (:,kpatch),zput0)
494  CALL unpack_same_rank(kmask(:),zffrozen(:),i%XFFROZEN(:,kpatch),zput0)
495  CALL unpack_same_rank(kmask(:),pff(:),i%XFF (:,kpatch),zput0)
496  CALL unpack_same_rank(kmask(:),pemisf(:),i%XEMISF (:,kpatch),xundef)
497  CALL unpack_same_rank(kmask(:),palbf(:),i%XALBF (:,kpatch),xundef)
498 !
499 IF (lhook) CALL dr_hook('UPDATE_RAD_ISBA_N:TREAT_FLOOD',1,zhook_handle)
500 !
501 END SUBROUTINE treat_flood
502 !
503 END SUBROUTINE update_rad_isba_n
subroutine treat_flood(KSIZE, KPATCH, KMASK, PPSNG, PPSNV, PLAI, PVEG, PALBF, PALBF_DIR, PALBF_SCA, PEMISF, PFF)
subroutine treat_nature(KSIZE, KPATCH)
subroutine update_rad_isba_n(I, OFLOOD, HSNOW, PZENITH, PSW_BANDS, PVEG, PLAI, PZ0, OMEB_PATCH, PLAIGV, PGNDLITTER, PZ0LITTER, PH_VEG, PALBNIR, PALBVIS, PALBUV, PEMIS, PDIR_ALB_WITH_SNOW, PSCA_ALB_WITH_SNOW, PEMIST, PDIR_SW, PSCA_SW, PALBNIR_VEG, PALBNIR_SOIL, PALBVIS_VEG, PALBVIS_SOIL)
real function, dimension(size(pveg)) flood_frac_nat(PVEG, PFFG, PFFV, PFFLOOD)
real function, dimension(size(pzenith)) albedo_ta96(PZENITH)
Definition: albedo_ta96.F90:6
real function, dimension(size(ppsng)) flood_frac_ground(PPSNG, PFFLOOD)
subroutine albedo_from_nir_vis(PSW_BANDS, PALBNIR, PALBVIS, PALBUV, PDIR_ALB, PSCA_ALB)
subroutine isba_emis_meb(PPSN, PPSNA, PSIGMA_F, PSIGMA_FN, PEMIS_N, PEMIS)
real function, dimension(size(ppsnv)) flood_frac_veg(PLAI, PPSNV, PFFLOOD)
subroutine radiative_transfert(OAGRI_TO_GRASS, PVEGTYPE, PALBVIS_VEG, PALBVIS_SOIL, PALBNIR_VEG, PALBNIR_SOIL, PSW_RAD, PLAI, PZENITH, PABC, PFAPARC, PFAPIRC, PMUS, PLAI_EFFC, OSHADE, PIACAN, PIACAN_SUNLIT, PIACAN_SHADE, PFRAC_SUN, PFAPAR, PFAPIR, PFAPAR_BS, PFAPIR_BS)
subroutine isba_snow_frac(HSNOW, PWSNOW, PRSNOW, PASNOW, PVEG, PLAI, PZ0, PPSN, PPSNV_A, PPSNG, PPSNV)