SURFEX v8.1
General documentation of Surfex
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 (IO, S, KK, PK, PEK, KPATCH, PZENITH, PSW_BANDS, &
7  PDIR_ALB_WITH_SNOW,PSCA_ALB_WITH_SNOW, PEMIST, &
8  PDIR_SW, PSCA_SW )
9 ! ####################################################################
10 !
11 !!**** *UPDATE_RAD_ISBA_n * - Calculate snow/flood fraction, dir/dif albedo
12 !! and emissivity at t+1 in order to close the
13 !! energy budget between the atmospheric model
14 !! and surfex
15 !!
16 !! PURPOSE
17 !! -------
18 !
19 !!** METHOD
20 !! ------
21 !!
22 !! REFERENCE
23 !! ---------
24 !!
25 !,ZEMIST,PEMIST,ZPUT0)!
26 !! AUTHOR
27 !! ------
28 !! B. Decharme
29 !!
30 !! MODIFICATIONS
31 !! -------------
32 !! Original 09/2009
33 !! P. Samuelsson 02/2012 MEB
34 !! A. Boone 03/2015 MEB-use TR_ML scheme for SW radiation
35 !!------------------------------------------------------------------
36 !
37 !
40 !
42 !
43 USE modd_csts, ONLY : xtt
44 USE modd_surf_par, ONLY : xundef
45 USE modd_snow_par, ONLY : xrhosmin_es,xrhosmax_es,xsnowdmin,xemissn
48 !
52 !
53 USE modi_albedo_ta96
54 USE modi_albedo_from_nir_vis
57 USE modi_isba_snow_frac
58 USE modi_isba_emis_meb
59 USE modi_radiative_transfert
60 !
61 !
62 USE yomhook ,ONLY : lhook, dr_hook
63 USE parkind1 ,ONLY : jprb
64 !
65 IMPLICIT NONE
66 !
67 !* 0.1 declarations of arguments
68 !
69 !
70 TYPE(isba_options_t), INTENT(INOUT) :: IO
71 TYPE(isba_s_t), INTENT(INOUT) :: S
72 TYPE(isba_k_t), INTENT(INOUT) :: KK
73 TYPE(isba_p_t), INTENT(INOUT) :: PK
74 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
75 !
76 INTEGER, INTENT(IN) :: KPATCH
77 !
78 REAL, DIMENSION(:), INTENT(IN) :: PZENITH ! Zenithal angle at t+1
79 REAL, DIMENSION(:), INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m)
80 !
81 REAL, DIMENSION(:,:), INTENT(OUT) :: PDIR_ALB_WITH_SNOW ! Total direct albedo at t+1
82 REAL, DIMENSION(:,:), INTENT(OUT) :: PSCA_ALB_WITH_SNOW ! Total diffuse albedo at t+1
83 REAL, DIMENSION(:), INTENT(OUT) :: PEMIST ! Total emissivity at t+1
84 !
85 REAL, DIMENSION(:,:), INTENT(IN), OPTIONAL :: PDIR_SW ! direct solar radiation (on horizontal surf.)
86 REAL, DIMENSION(:,:), INTENT(IN), OPTIONAL :: PSCA_SW ! diffuse solar radiation (on horizontal surf.)
87 !
88 !* 0.2 declarations of local variables
89 !
90 REAL, DIMENSION(PK%NSIZE_P) :: ZVEG
91 REAL, DIMENSION(PK%NSIZE_P) :: ZPSNV_A
92 REAL, DIMENSION(PK%NSIZE_P) :: ZALBF_DIR
93 REAL, DIMENSION(PK%NSIZE_P) :: ZALBF_SCA
94 REAL, DIMENSION(PK%NSIZE_P) :: ZEMISF
95 REAL, DIMENSION(PK%NSIZE_P) :: ZFF
96 REAL, DIMENSION(PK%NSIZE_P) :: ZALBNIR_WITH_SNOW
97 REAL, DIMENSION(PK%NSIZE_P) :: ZALBVIS_WITH_SNOW
98 REAL, DIMENSION(PK%NSIZE_P) :: ZALBUV_WITH_SNOW
99 REAL, DIMENSION(PK%NSIZE_P) :: ZZENITH
100 REAL, DIMENSION(PK%NSIZE_P) :: ZSNOWDEPTH, ZPALPHAN
101 REAL, DIMENSION(PK%NSIZE_P) :: ZSWUP
102 REAL, DIMENSION(PK%NSIZE_P) :: ZGLOBAL_SW
103 REAL, DIMENSION(PK%NSIZE_P) :: ZALBT, ZEMIST
104 REAL, DIMENSION(PK%NSIZE_P) :: ZPSNA, ZSIGMA_F, ZSIGMA_FN, ZEMISSN
105 REAL, DIMENSION(PK%NSIZE_P,SIZE(PSW_BANDS)) :: ZDIR_SW, ZSCA_SW
106 REAL, DIMENSION(PK%NSIZE_P) :: ZLAIN, ZALBVIS_TSOIL, ZALBNIR_TSOIL
107 REAL, DIMENSION(PK%NSIZE_P) :: ZFAPIR, ZFAPAR, ZFAPIR_BS, ZFAPAR_BS
108 REAL, DIMENSION(PK%NSIZE_P,SIZE(S%XABC)) :: ZIACAN_SUNLIT, ZIACAN_SHADE, ZFRAC_SUN, ZIACAN
109 LOGICAL, DIMENSION(PK%NSIZE_P) :: GSHADE
110 !
111 REAL, PARAMETER :: ZPUT0 = 0.0
112 INTEGER :: ISWB
113 INTEGER :: JSWB
114 REAL(KIND=JPRB) :: ZHOOK_HANDLE
115 !
116 !-------------------------------------------------------------------------------------
117 ! Initialization
118 !-------------------------------------------------------------------------------------
119 
120 IF (lhook) CALL dr_hook('UPDATE_RAD_ISBA_N',0,zhook_handle)
121 iswb = SIZE(psw_bands)
122 !
123 !-------------------------------------------------------------------------------------
124 !
125 zveg(:) = pek%XVEG(:)
126 !
127 IF(io%LMEB_PATCH(kpatch).OR.io%LFLOOD)THEN
128  !
129  CALL pack_same_rank(pk%NR_P,pzenith(:),zzenith(:))
130  !
131  IF(io%LMEB_PATCH(kpatch))THEN
132  !
133  zveg(:)=0. ! Set veg=0 for MEB to get bare soil conditions for snow cover and
134  ! ! flood fraction
135  !
136  IF(PRESENT(pdir_sw))THEN
137  !
138  CALL pack_same_rank(pk%NR_P,pdir_sw(:,:), zdir_sw(:,:))
139  CALL pack_same_rank(pk%NR_P,psca_sw(:,:), zsca_sw(:,:))
140  !
141  ENDIF
142  !
143  ENDIF
144  !
145 ENDIF
146 !
147 !-------------------------------------------------------------------------------
148 !
149  CALL isba_snow_frac(pek%TSNOW%SCHEME, pek%TSNOW%WSNOW, pek%TSNOW%RHO, pek%TSNOW%ALB, &
150  zveg, pek%XLAI, pek%XZ0, pek%XPSN, zpsnv_a, pek%XPSNG, pek%XPSNV )
151 !
152 IF ( pek%TSNOW%SCHEME=='EBA' ) pek%XPSNV_A(:) = zpsnv_a(:)
153 !
154 !-------------------------------------------------------------------------------
155 !
156 ! Flood fractions and properties
157 !
158 IF(io%LFLOOD)THEN
159  !
160  kk%XFFG(:) = flood_frac_ground(pek%XPSNG,kk%XFFLOOD)
161  kk%XFFV(:) = flood_frac_veg(pek%XLAI,pek%XPSNV,kk%XFFLOOD)
162  kk%XFF (:) = flood_frac_nat(pek%XVEG,kk%XFFG,kk%XFFV,kk%XFFLOOD)
163  !
164  WHERE(kk%XFFLOOD(:)==0.0)
165  zalbf_dir(:) = xundef
166  zalbf_sca(:) = xundef
167  kk%XALBF (:) = xundef
168  kk%XEMISF (:) = xundef
169  kk%XFFROZEN(:) = 0.0
170  ELSEWHERE
171  WHERE(pek%XTG(:,1)>=xtt)
172  zalbf_dir(:) = albedo_ta96(zzenith(:))
173  zalbf_sca(:) = xalbsca_wat
174  kk%XEMISF (:) = xemiswat
175  kk%XFFROZEN(:) = 0.0
176  ELSEWHERE
177  zalbf_dir(:) = xalbwatice
178  zalbf_sca(:) = xalbwatice
179  kk%XEMISF (:) = xemiswatice
180  kk%XFFROZEN(:) = 1.0
181  END WHERE
182  kk%XALBF(:)=0.5*(zalbf_dir(:)+zalbf_sca(:))
183  ENDWHERE
184  !
185  zemisf(:) = kk%XEMISF(:)
186  zff(:) = kk%XFF(:)
187  !
188 ELSE
189  zalbf_dir(:)=0.0
190  zalbf_sca(:)=0.0
191  zemisf(:)=0.0
192  zff(:)=0.0
193 ENDIF
194 !-------------------------------------------------------------------------------
195 !
196 IF(io%LMEB_PATCH(kpatch))THEN
197  !
198  zsnowdepth(:) = sum(pek%TSNOW%WSNOW(:,:)/pek%TSNOW%RHO(:,:),2)
199  zpalphan(:) = mebpalphan(zsnowdepth,pek%XH_VEG)
200  !
201  kk%XDIR_ALB_WITH_SNOW(:,:) = xundef
202  kk%XSCA_ALB_WITH_SNOW(:,:) = xundef
203  !
204  IF(PRESENT(pdir_sw))THEN
205  !
206  ! Albedo
207  !
208  ! - just extract some parameters for call, but no need to update
209  ! the cummulative variables in this routine:
210  !
211  DO jswb=1,iswb
212  zglobal_sw(:) = zdir_sw(:,jswb) + zsca_sw(:,jswb)
213  !
214  WHERE(pek%TSNOW%ALB(:)/=xundef .AND. pek%TSNOW%ALBVIS(:)/=xundef .AND. pek%TSNOW%ALBNIR(:)/=xundef)
215  zlain(:) = pek%XLAI(:)*(1.0-zpalphan(:))
216  zalbvis_tsoil(:) = pek%XALBVIS_SOIL(:)*(1.-pek%XPSN(:)) + pek%XPSN(:)*pek%TSNOW%ALBVIS(:)
217  zalbnir_tsoil(:) = pek%XALBNIR_SOIL(:)*(1.-pek%XPSN(:)) + pek%XPSN(:)*pek%TSNOW%ALBNIR(:)
218  ELSEWHERE
219  zlain(:) = pek%XLAI(:)
220  zalbvis_tsoil(:) = pek%XALBVIS_SOIL(:)
221  zalbnir_tsoil(:) = pek%XALBNIR_SOIL(:)
222  END WHERE
223  !
224  CALL radiative_transfert(io%LAGRI_TO_GRASS, kk%XVEGTYPE, &
225  pek%XALBVIS_VEG, zalbvis_tsoil, pek%XALBNIR_VEG, zalbnir_tsoil, &
226  zglobal_sw, zlain, zzenith, s%XABC, &
227  pek%XFAPARC, pek%XFAPIRC, pek%XMUS, pek%XLAI_EFFC, gshade, ziacan, &
228  ziacan_sunlit, ziacan_shade, zfrac_sun, &
229  zfapar, zfapir, zfapar_bs, zfapir_bs )
230 
231  ! Total effective surface (canopy, ground/flooded zone, snow) all-wavelength
232  ! albedo: diagnosed from shortwave energy budget closure.
233  ! Final note: purely diagnostic - apply limits for night time
234 
235  zalbt(:) = 1. - (xsw_wght_vis*(zfapar(:)+zfapar_bs(:)) + xsw_wght_nir*(zfapir(:)+zfapir_bs(:)))
236  zswup(:) = zglobal_sw(:)*zalbt(:)
237  zalbt(:) = zswup(:)/max(1.e-5, zglobal_sw(:))
238  !
239  kk%XDIR_ALB_WITH_SNOW(:,jswb)=zalbt(:)
240  kk%XSCA_ALB_WITH_SNOW(:,jswb)=zalbt(:)
241  !
242  END DO
243  !
244  ENDIF
245  !
246  ! Emissivity
247  !
248  zemissn(:) = xemissn
249  zpsna(:) = 0.
250  zsigma_f(:) = 1.0 - meb_shield_factor(pek%XLAI,zpsna)
251  zsigma_fn(:) = 1.0 - meb_shield_factor(pek%XLAI,zpalphan)
252  !
253  CALL isba_emis_meb(pek%XPSN, zpalphan, zsigma_f, zsigma_fn, zemissn, zemist )
254  !
255 ELSE
256  !
257  ! * albedo for near-infra-red and visible over snow-covered and snow-flood-free surface
258  !
259  zalbnir_with_snow(:) = pek%XALBNIR(:) * (1.-pek%XPSN(:)-zff(:)) + pek%TSNOW%ALB (:) * pek%XPSN(:)
260  zalbvis_with_snow(:) = pek%XALBVIS(:) * (1.-pek%XPSN(:)-zff(:)) + pek%TSNOW%ALB (:) * pek%XPSN(:)
261  zalbuv_with_snow(:) = pek%XALBUV (:) * (1.-pek%XPSN(:)-zff(:)) + pek%TSNOW%ALB (:) * pek%XPSN(:)
262  !
263  ! * snow-flood-covered surface albedo for each wavelength (needed for outputs)
264  !
265  CALL albedo_from_nir_vis(psw_bands, &
266  zalbnir_with_snow, zalbvis_with_snow, zalbuv_with_snow,&
267  kk%XDIR_ALB_WITH_SNOW, kk%XSCA_ALB_WITH_SNOW )
268  !
269  DO jswb=1,iswb
270  kk%XDIR_ALB_WITH_SNOW(:,jswb)=kk%XDIR_ALB_WITH_SNOW(:,jswb) + zff(:)*zalbf_dir(:)
271  kk%XSCA_ALB_WITH_SNOW(:,jswb)=kk%XSCA_ALB_WITH_SNOW(:,jswb) + zff(:)*zalbf_sca(:)
272  ENDDO
273  !
274  !-------------------------------------------------------------------------------
275  !
276  ! longwave computations for outputs (emissivity for radiative scheme)
277  !
278  zemist(:) = (1.-pek%XPSN(:)-zff(:))*pek%XEMIS(:) + pek%XPSN(:) * xemissn + zff(:)*zemisf(:)
279  !
280 ENDIF
281 !
282 !Update albedo with snow for the next time step
283 !
284  CALL unpack_same_rank(pk%NR_P,kk%XDIR_ALB_WITH_SNOW, pdir_alb_with_snow,zput0)
285  CALL unpack_same_rank(pk%NR_P,kk%XSCA_ALB_WITH_SNOW, psca_alb_with_snow,zput0)
286  CALL unpack_same_rank(pk%NR_P,zemist,pemist,zput0)
287 !
288 !-------------------------------------------------------------------------------
289 IF (lhook) CALL dr_hook('UPDATE_RAD_ISBA_N',1,zhook_handle)
290 !
291 END SUBROUTINE update_rad_isba_n
real function, dimension(size(ppsnv)) flood_frac_veg(PLAI, PPSNV, PFFLOOD)
real, parameter xsw_wght_vis
real function, dimension(size(pveg)) flood_frac_nat(PVEG, PFFG, PFFV, PFFLOOD)
subroutine isba_snow_frac(HSNOW, PWSNOW, PRSNOW, PASNOW, PVEG, PLAI, PZ0, PPSN, PPSNV_A, PPSNG, P
real, save xemiswatice
real function, dimension(size(ppsng)) flood_frac_ground(PPSNG, PFFLOOD)
real, parameter xundef
real, save xalbsca_wat
real function, dimension(size(pzenith)) albedo_ta96(PZENITH)
Definition: albedo_ta96.F90:7
integer, parameter jprb
Definition: parkind1.F90:32
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
logical lhook
Definition: yomhook.F90:15
real, save xalbwatice
subroutine isba_emis_meb(PPSN, PPSNA, PSIGMA_F, PSIGMA_FN, PEMIS_N, PEMIS)
subroutine albedo_from_nir_vis(PSW_BANDS, PALBNIR, PALBVIS, PALBUV, PD
real, save xtt
Definition: modd_csts.F90:66
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)
real, save xemiswat
subroutine update_rad_isba_n(IO, S, KK, PK, PEK, KPATCH, PZENITH, PSW_BANDS, PDIR_ALB_WITH_SNOW, PSCA_ALB_WITH_SNOW, PEMIST, PDIR_SW, PSCA_SW)
real, parameter xsw_wght_nir