SURFEX v8.1
General documentation of Surfex
averaged_albedo_emis_isba.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 averaged_albedo_emis_isba (IO, S, NK, NP, NPE, &
7  PZENITH, PTG1, PSW_BANDS, PDIR_ALB, PSCA_ALB, &
8  PEMIS, PTSRAD, PTSURF, PDIR_SW, PSCA_SW )
9 ! ###################################################
10 !
11 !!**** ** computes radiative fields used in ISBA
12 !!
13 !! PURPOSE
14 !! -------
15 !!
16 !! METHOD
17 !! ------
18 !!
19 !! EXTERNAL
20 !! --------
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !! AUTHOR
29 !! ------
30 !!
31 !! V. Masson Meteo-France
32 !!
33 !! MODIFICATION
34 !! ------------
35 !!
36 !! Original 01/2004
37 !! A. Bogatchev 09/2005 EBA snow option
38 !! B. Decharme 2008 The fraction of vegetation covered by snow must be
39 ! <= to ZSNG
40 !! B. Decharme 2013 new coupling variable and optimization
41 !! P. Samuelsson 10/2014 MEB
42 !----------------------------------------------------------------------------
43 !
44 !* 0. DECLARATION
45 ! -----------
46 !
47 !
51 !
52 USE modd_surf_par, ONLY : xundef
53 !
55 !
56 USE modd_csts, ONLY : xstefan
57 USE mode_meb, ONLY : mebpalphan
58 !
59 USE modi_albedo
60 USE modi_average_rad
61 USE modi_update_rad_isba_n
62 USE modi_isba_lwnet_meb
64 !
65 USE yomhook ,ONLY : lhook, dr_hook
66 USE parkind1 ,ONLY : jprb
67 !
68 IMPLICIT NONE
69 !
70 !* 0.1 Declaration of arguments
71 ! ------------------------
72 !
73 !
74 TYPE(isba_options_t), INTENT(INOUT) :: IO
75 TYPE(isba_s_t), INTENT(INOUT) :: S
76 TYPE(isba_nk_t), INTENT(INOUT) :: NK
77 TYPE(isba_np_t), INTENT(INOUT) :: NP
78 TYPE(isba_npe_t), INTENT(INOUT) :: NPE
79 !
80 REAL, DIMENSION(:,:), INTENT(IN) :: PTG1 ! soil surface temperature
81 REAL, DIMENSION(:), INTENT(IN) :: PZENITH
82 REAL, DIMENSION(:), INTENT(IN) :: PSW_BANDS ! middle wavelength of each band
83 !
84 REAL, DIMENSION(:,:), INTENT(OUT) :: PDIR_ALB ! averaged direct albedo (per wavelength)
85 REAL, DIMENSION(:,:), INTENT(OUT) :: PSCA_ALB ! averaged diffuse albedo (per wavelength)
86 REAL, DIMENSION(:), INTENT(OUT) :: PEMIS ! averaged emissivity
87 REAL, DIMENSION(:), INTENT(OUT) :: PTSRAD ! averaged radiaitve temp.
88 REAL, DIMENSION(:), INTENT(OUT) :: PTSURF ! surface effective temperature (K)
89 !
90 REAL, DIMENSION(:,:), INTENT(IN), OPTIONAL :: PDIR_SW ! Downwelling direct SW radiation
91 REAL, DIMENSION(:,:), INTENT(IN), OPTIONAL :: PSCA_SW ! Downwelling diffuse SW radiation
92 !
93 !
94 !* 0.2 Declaration of local variables
95 ! ------------------------------
96 !
97 !
98 TYPE(isba_k_t), POINTER :: KK
99 TYPE(isba_p_t), POINTER :: PK
100 TYPE(isba_pe_t), POINTER :: PEK
101 !
102 REAL, DIMENSION(SIZE(PZENITH),SIZE(PSW_BANDS),IO%NPATCH) :: ZDIR_ALB_PATCH
103 ! ! direct albedo
104 REAL, DIMENSION(SIZE(PZENITH),SIZE(PSW_BANDS),IO%NPATCH) :: ZSCA_ALB_PATCH
105 ! ! diffuse albedo
106 REAL, DIMENSION(SIZE(PZENITH),IO%NPATCH) :: ZEMIS_PATCH ! emissivity with snow-flood
107 REAL, DIMENSION(SIZE(PZENITH),IO%NPATCH) :: ZTSRAD_PATCH ! Tsrad
108 REAL, DIMENSION(SIZE(PZENITH),IO%NPATCH) :: ZTSURF_PATCH ! Tsurf
109 REAL, DIMENSION(SIZE(PTG1,1)) :: ZEMIS ! emissivity with flood
110 !
111 REAL, DIMENSION(SIZE(PTG1,1)) :: ZSNOWDEPTH ! Total snow depth
112 REAL, DIMENSION(SIZE(PTG1,1)) :: ZPALPHAN ! Snow/canopy ratio factor
113 REAL, DIMENSION(SIZE(PTG1,1)) :: ZLW_RAD ! Fake downwelling LW rad
114 REAL, DIMENSION(SIZE(PTG1,1)) :: ZLW_UP ! Upwelling LW rad
115 REAL, DIMENSION(SIZE(PTG1,1)) :: ZLWNET_N ! LW net for snow surface
116 REAL, DIMENSION(SIZE(PTG1,1)) :: ZLWNET_V ! LW net for canopy veg
117 REAL, DIMENSION(SIZE(PTG1,1)) :: ZLWNET_G ! LW net for ground
118 REAL, DIMENSION(SIZE(PTG1,1)) :: ZDUMMY
119 REAL, DIMENSION(SIZE(PTG1,1)) :: ZEMISF
120 REAL, DIMENSION(SIZE(PTG1,1)) :: ZFF
121 !
122 LOGICAL :: LEXPLICIT_SNOW ! snow scheme key
123 !
124 INTEGER :: JP, JI,ISIZE ! loop on patches
125 INTEGER :: IMASK ! loop on patches
126 !
127 REAL(KIND=JPRB) :: ZHOOK_HANDLE
128 !-------------------------------------------------------------------------------
129 !
130 !* 0. Init
131 ! ----
132 !
133 IF (lhook) CALL dr_hook('AVERAGED_ALBEDO_EMIS_ISBA',0,zhook_handle)
134 !
135 pdir_alb(:,:)=0.
136 psca_alb(:,:)=0.
137 pemis(:) =0.
138 ptsrad(:) =0.
139 ptsurf(:) =0.
140 !
141 zdir_alb_patch(:,:,:)=0.
142 zsca_alb_patch(:,:,:)=0.
143 zemis_patch(:,: )=0.
144 !
145 lexplicit_snow = (npe%AL(1)%TSNOW%SCHEME=='3-L'.OR.npe%AL(1)%TSNOW%SCHEME=='CRO')
146 !
147 ztsrad_patch(:,:) = 0.
148 ztsurf_patch(:,:) = 0.
149 DO jp = 1,io%NPATCH
150  DO ji = 1,np%AL(jp)%NSIZE_P
151  imask = np%AL(jp)%NR_P(ji)
152  ztsrad_patch(imask,jp) = ptg1(ji,jp)
153  ztsurf_patch(imask,jp) = ptg1(ji,jp)
154  ENDDO
155 ENDDO
156 !
157 !
158 !* 1. averaged albedo on natural continental surfaces (except prognostic snow)
159 ! -----------------------------------------------
160 !
161 DO jp = 1,io%NPATCH
162  CALL albedo(io%CALBEDO, npe%AL(jp) )
163 ENDDO
164 !
165 !* 2. averaged albedo and emis. on natural continental surfaces (with prognostic snow)
166 ! ---------------------------------------------------------
167 !
168 ! A dummy downwelling LW radiation can be used for calculation of radiative surface temp
169 !
170 zlw_rad(:) = 300.0
171 !
172 !* Initialization of albedo for each wavelength, emissivity and snow/flood fractions
173 !
174 DO jp = 1,io%NPATCH
175  !
176  IF(PRESENT(pdir_sw))THEN
177  !
178  ! For the case when MEB patch albedo is requested downweeling SW is needed
179  !
180  CALL update_rad_isba_n(io, s, nk%AL(jp), np%AL(jp), npe%AL(jp), jp, pzenith, psw_bands, &
181  zdir_alb_patch(:,:,jp), zsca_alb_patch(:,:,jp), zemis_patch(:,jp), &
182  pdir_sw, psca_sw )
183  ELSE
184  !
185  ! For cases when MEB patch albedo is not requested no downweeling SW is needed
186  !
187  CALL update_rad_isba_n(io, s, nk%AL(jp), np%AL(jp), npe%AL(jp), jp, pzenith, psw_bands, &
188  zdir_alb_patch(:,:,jp), zsca_alb_patch(:,:,jp), zemis_patch(:,jp))
189  !
190  ENDIF
191  !
192 ENDDO
193 !
194 !
195 !* radiative surface temperature
196 !
197 DO jp = 1,io%NPATCH
198  !
199  pek => npe%AL(jp)
200  pk => np%AL(jp)
201  kk => nk%AL(jp)
202  !
203  isize = pk%NSIZE_P
204  !
205  IF(io%LMEB_PATCH(jp))THEN ! MEB patches
206  !
207  ! ZPALPHAN is needed as input to ISBA_LWNET_MEB
208  !
209  zsnowdepth(1:isize) = sum(pek%TSNOW%WSNOW(:,:)/pek%TSNOW%RHO(:,:),2)
210  zpalphan(1:isize) = mebpalphan(zsnowdepth(1:isize),pek%XH_VEG(:))
211  !
212  ! ZLWNET_N,ZLWNET_V,ZLWNET_G are needed for ZLW_UP and ZTSRAD_PATCH
213  !
214  IF(io%LFLOOD)THEN
215  zemisf(1:isize) = kk%XEMISF(:)
216  zff(1:isize) = kk%XFF (:)
217  ELSE
218  zemisf(1:isize) = xundef
219  zff(1:isize) = 0.0
220  ENDIF
221  !
222  CALL isba_lwnet_meb(pek%XLAI, pek%XPSN, zpalphan(1:isize), pek%TSNOW%EMIS, &
223  zemisf(1:isize), zff(1:isize), &
224  pek%XTV, ptg1(1:isize,jp), pek%TSNOW%TS, &
225  zlw_rad(1:isize), zlwnet_n(1:isize), zlwnet_v(1:isize), zlwnet_g(1:isize), &
226  zdummy(1:isize), zdummy(1:isize), zdummy(1:isize), zdummy(1:isize), &
227  zdummy(1:isize), zdummy(1:isize), zdummy(1:isize), zdummy(1:isize), &
228  zdummy(1:isize), zdummy(1:isize), zdummy(1:isize), zdummy(1:isize) )
229  !
230  zlw_up(1:isize) = zlw_rad(1:isize) - (zlwnet_v(1:isize) + zlwnet_g(1:isize) + zlwnet_n(1:isize))
231  !
232  ! MEB patch radiative temperature
233  !
234  DO ji = 1,pk%NSIZE_P
235  imask = pk%NR_P(ji)
236  IF (zemis_patch(imask,jp)/=0.) THEN
237  ztsrad_patch(imask,jp) = ((zlw_up(ji) - zlw_rad(ji)*(1.0-zemis_patch(imask,jp)))/ &
238  (xstefan*zemis_patch(imask,jp)))**0.25
239  ENDIF
240  END DO
241  !
242  ELSE ! Non-MEB patches
243  !
244  zemis(1:isize) = pek%XEMIS(:)
245  !
246  IF(io%LFLOOD.AND.lexplicit_snow)THEN
247  WHERE(pek%XPSN(:)<1.0.AND.pek%XEMIS(:)/=xundef)
248  zemis(1:isize) = ((1.-kk%XFF(:)-pek%XPSN(:))*pek%XEMIS(:) + kk%XFF(:)*kk%XEMISF(:)) /(1.-pek%XPSN(:))
249  ENDWHERE
250  ENDIF
251  !
252  IF (.NOT.lexplicit_snow) THEN
253  CALL unpack_same_rank(pk%NR_P,ptg1(1:pk%NSIZE_P,jp),ztsrad_patch(:,jp),0.)
254  ELSE IF (lexplicit_snow) THEN
255  DO ji = 1,pk%NSIZE_P
256  imask = pk%NR_P(ji)
257  IF (pek%XEMIS(ji)/=xundef .AND. zemis_patch(imask,jp)/=0.) THEN
258  ztsrad_patch(imask,jp) =( ( (1.-pek%XPSN(ji)) * zemis(ji)*ptg1(ji,jp)**4 &
259  + pek%XPSN(ji) *pek%TSNOW%EMIS(ji)*pek%TSNOW%TS(ji)**4 ) )**0.25 &
260  / zemis_patch(imask,jp)**0.25
261  END IF
262  ENDDO
263  END IF
264 
265  ENDIF
266 !
267 END DO
268 !
269 !* averaged radiative fields
270 !
271  CALL average_rad(s%XPATCH, &
272  zdir_alb_patch, zsca_alb_patch, zemis_patch, ztsrad_patch, &
273  pdir_alb, psca_alb, pemis, ptsrad )
274 !
275 !* averaged effective temperature
276 !
277 IF(lexplicit_snow)THEN
278  DO jp = 1,io%NPATCH
279  pek => npe%AL(jp)
280  pk => np%AL(jp)
281  DO ji = 1,pk%NSIZE_P
282  imask = pk%NR_P(ji)
283  ztsurf_patch(imask,jp) = ptg1(ji,jp)*(1.-pek%XPSN(ji)) + pek%TSNOW%TS(ji)*pek%XPSN(ji)
284  ENDDO
285  ENDDO
286 ENDIF
287 !
288 DO jp=1,io%NPATCH
289  DO ji=1,np%AL(jp)%NSIZE_P
290  imask = np%AL(jp)%NR_P(ji)
291  ptsurf(imask) = ptsurf(imask) + np%AL(jp)%XPATCH(ji) * ztsurf_patch(imask,jp)
292  ENDDO
293 ENDDO
294 !
295 IF (lhook) CALL dr_hook('AVERAGED_ALBEDO_EMIS_ISBA',1,zhook_handle)
296 !
297 !-------------------------------------------------------------------------------
298 !
299 END SUBROUTINE averaged_albedo_emis_isba
real, save xstefan
Definition: modd_csts.F90:59
real, parameter xundef
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
subroutine averaged_albedo_emis_isba(IO, S, NK, NP, NPE, PZENITH, PTG1, PSW_BANDS, PDIR_ALB, PSC
subroutine albedo(HALBEDO, PEK, PSNOW, OMASK)
Definition: albedo.F90:7
subroutine average_rad(PFRAC_TILE, PDIR_ALB_TILE, PSCA_ALB_TILE, PEMIS_TILE, PTRAD_TILE,
Definition: average_rad.F90:8
subroutine isba_lwnet_meb(PLAI, PPSN, PPSNA, PEMIS_N, PEMIS_F, PFF,
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)