SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
average_diag_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 average_diag_isba_n (DGEI, DGI, I, &
7  phw,pht,psfco2,ptrad)
8 ! #######################################
9 !
10 !
11 !!**** *AVERAGE_DIAG_ISBA_n*
12 !!
13 !! PURPOSE
14 !! -------
15 ! Average the diagnostics from all ISBA tiles
16 !
17 !!** METHOD
18 !! ------
19 !
20 !! EXTERNAL
21 !! --------
22 !!
23 !! IMPLICIT ARGUMENTS
24 !! ------------------
25 !!
26 !!
27 !! REFERENCE
28 !! ---------
29 !!
30 !! AUTHOR
31 !! ------
32 !! S. Belair * Meteo-France *
33 !!
34 !! MODIFICATIONS
35 !! -------------
36 !! Original 10/03/95
37 !! V.Masson 20/03/96 remove abnormal averages and average TS**4 instead
38 !! of TS
39 !! (J.Stein) 27/03/96 use only H and LE in the soil scheme
40 !! A. Boone 27/11/02 revised to output ALMA variables, and general applications
41 !! B. Decharme 17/08/09 cumulative radiatif budget
42 !! V. Masson 10/2013 coherence between canopy and min/max T2M diagnostics
43 !! B. Decharme 04/13 Averaged Trad already done in average_diag.F90
44 !! Good dimension for CO2 flux
45 !! P. Samuelsson 10/13 Added min max for XT2M
46 !! B. Decharme 02/15 No dependence on HW for 10M Wind diags
47 !-------------------------------------------------------------------------------
48 !
49 !* 0. DECLARATIONS
50 ! ------------
51 !
52 !
53 !
55 USE modd_diag_isba_n, ONLY : diag_isba_t
56 USE modd_isba_n, ONLY : isba_t
57 !
58 USE modd_surf_par, ONLY : xundef
59 !
60 USE yomhook ,ONLY : lhook, dr_hook
61 USE parkind1 ,ONLY : jprb
62 !
63 IMPLICIT NONE
64 !
65 !* 0.1 declarations of arguments
66 !
67 !
68 !
69 TYPE(diag_evap_isba_t), INTENT(INOUT) :: dgei
70 TYPE(diag_isba_t), INTENT(INOUT) :: dgi
71 TYPE(isba_t), INTENT(INOUT) :: i
72 !
73 REAL, DIMENSION(:), INTENT(IN) :: phw ! atmospheric level height for wind (m)
74 REAL, DIMENSION(:), INTENT(IN) :: pht ! atmospheric level height (m)
75 REAL, DIMENSION(:), INTENT(IN) :: psfco2 ! CO2 flux (m/s*kg_CO2/kg_air)
76 REAL, DIMENSION(:), INTENT(IN) :: ptrad ! Radiative temperature (K)
77 !
78 !* 0.2 declarations of local variables
79 !
80 INTEGER :: jpatch ! tile loop counter
81 INTEGER :: jswb ! band loop counter
82 REAL, DIMENSION(SIZE(I%XPATCH,1)) :: zsumpatch
83 REAL(KIND=JPRB) :: zhook_handle
84 !
85 !-------------------------------------------------------------------------------
86 !
87 ! 0. Initialization
88 ! --------------
89 !
90 IF (lhook) CALL dr_hook('AVERAGE_DIAG_ISBA_N',0,zhook_handle)
91 zsumpatch(:) = 0.
92 DO jpatch=1,SIZE(i%XPATCH,2)
93  zsumpatch(:) = zsumpatch(:) + i%XPATCH(:,jpatch)
94 END DO
95 !
96 ! 1. Energy fluxes
97 ! -------------
98 !
99 IF (dgi%LSURF_BUDGET) THEN
100  dgi%XAVG_RN(:) = 0.
101  dgi%XAVG_H (:) = 0.
102  dgi%XAVG_LE(:) = 0.
103  dgi%XAVG_LEI(:) = 0.
104  dgi%XAVG_GFLUX(:) = 0.
105  dgi%XAVG_SWD(:) = 0.
106  dgi%XAVG_SWU(:) = 0.
107  dgi%XAVG_LWD(:) = 0.
108  dgi%XAVG_LWU(:) = 0.
109  dgi%XAVG_FMU(:) = 0.
110  dgi%XAVG_FMV(:) = 0.
111  dgi%XAVG_SWBD(:,:) = 0.
112  dgi%XAVG_SWBU(:,:) = 0.
113  !
114  DO jpatch=1,SIZE(i%XPATCH,2)
115  WHERE (zsumpatch(:) > 0.)
116 !
117 ! Net radiation
118 !
119  dgi%XAVG_RN(:) = dgi%XAVG_RN(:) +i%XPATCH(:,jpatch) * dgi%XRN(:,jpatch)
120 !
121 ! Sensible heat flux
122 !
123  dgi%XAVG_H (:) = dgi%XAVG_H (:) +i%XPATCH(:,jpatch) * dgi%XH (:,jpatch)
124 !
125 ! Total latent heat flux
126 !
127  dgi%XAVG_LE(:) = dgi%XAVG_LE(:) +i%XPATCH(:,jpatch) * i%XLE(:,jpatch)
128 !
129 ! Sublimation latent heat flux
130 !
131  dgi%XAVG_LEI(:) = dgi%XAVG_LEI(:) +i%XPATCH(:,jpatch) * dgi%XLEI(:,jpatch)
132 !
133 ! Storage flux
134 !
135  dgi%XAVG_GFLUX(:) = dgi%XAVG_GFLUX(:) +i%XPATCH(:,jpatch) * dgi%XGFLUX(:,jpatch)
136 !
137 ! Downwards SW radiation
138 !
139  dgi%XAVG_SWD(:) = dgi%XAVG_SWD(:) +i%XPATCH(:,jpatch) * dgi%XSWD(:,jpatch)
140 !
141 ! Upwards SW radiation
142 !
143  dgi%XAVG_SWU(:) = dgi%XAVG_SWU(:) +i%XPATCH(:,jpatch) * dgi%XSWU(:,jpatch)
144 !
145 ! Downwards LW radiation
146 !
147  dgi%XAVG_LWD(:) = dgi%XAVG_LWD(:) +i%XPATCH(:,jpatch) * dgi%XLWD(:,jpatch)
148 !
149 ! Upwards LW radiation
150 !
151  dgi%XAVG_LWU(:) = dgi%XAVG_LWU(:) +i%XPATCH(:,jpatch) * dgi%XLWU(:,jpatch)
152 !
153 ! Zonal wind stress
154 !
155  dgi%XAVG_FMU(:) = dgi%XAVG_FMU(:) +i%XPATCH(:,jpatch) * dgi%XFMU(:,jpatch)
156 !
157 ! Meridian wind stress
158 !
159  dgi%XAVG_FMV(:) = dgi%XAVG_FMV(:) +i%XPATCH(:,jpatch) * dgi%XFMV(:,jpatch)
160 !
161  END WHERE
162  END DO
163 !
164  DO jpatch=1,SIZE(i%XPATCH,2)
165  DO jswb=1,SIZE(dgi%XSWBD,2)
166  WHERE (zsumpatch(:) > 0.)
167 !
168 ! Downwards SW radiation for each spectral band
169 !
170  dgi%XAVG_SWBD(:,jswb) = dgi%XAVG_SWBD(:,jswb) +i%XPATCH(:,jpatch) * dgi%XSWBD(:,jswb,jpatch)
171 !
172 ! Upwards SW radiation for each spectral band
173 !
174  dgi%XAVG_SWBU(:,jswb) = dgi%XAVG_SWBU(:,jswb) +i%XPATCH(:,jpatch) * dgi%XSWBU(:,jswb,jpatch)
175 !
176  END WHERE
177  END DO
178  END DO
179 END IF
180 !
181 IF (dgei%LSURF_BUDGETC) THEN
182  dgi%XAVG_SWDC(:) = 0.
183  dgi%XAVG_SWUC(:) = 0.
184  dgi%XAVG_LWDC(:) = 0.
185  dgi%XAVG_LWUC(:) = 0.
186  dgi%XAVG_FMUC(:) = 0.
187  dgi%XAVG_FMVC(:) = 0.
188  DO jpatch=1,SIZE(i%XPATCH,2)
189  WHERE (zsumpatch(:) > 0.)
190 !
191 ! Downwards SW radiation
192 !
193  dgi%XAVG_SWDC(:) = dgi%XAVG_SWDC(:) + i%XPATCH(:,jpatch) * dgi%XSWDC(:,jpatch)
194 !
195 ! Upwards SW radiation
196 !
197  dgi%XAVG_SWUC(:) = dgi%XAVG_SWUC(:) + i%XPATCH(:,jpatch) * dgi%XSWUC(:,jpatch)
198 !
199 ! Downwards LW radiation
200 !
201  dgi%XAVG_LWDC(:) = dgi%XAVG_LWDC(:) + i%XPATCH(:,jpatch) * dgi%XLWDC(:,jpatch)
202 !
203 ! Upwards LW radiation
204 !
205  dgi%XAVG_LWUC(:) = dgi%XAVG_LWUC(:) + i%XPATCH(:,jpatch) * dgi%XLWUC(:,jpatch)
206 !
207 ! Zonal wind stress
208 !
209  dgi%XAVG_FMUC(:) = dgi%XAVG_FMUC(:) + i%XPATCH(:,jpatch) * dgi%XFMUC(:,jpatch)
210 !
211 ! Meridian wind stress
212 !
213  dgi%XAVG_FMVC(:) = dgi%XAVG_FMVC(:) + i%XPATCH(:,jpatch) * dgi%XFMVC(:,jpatch)
214 !
215  END WHERE
216  END DO
217 ENDIF
218 !
219 !
220 ! 2. surface temperature and 2 meters parameters
221 ! -------------------------------------------
222 !
223 dgi%XAVG_TS(:) = 0.0
224 DO jpatch=1,SIZE(i%XPATCH,2)
225  WHERE (zsumpatch(:) > 0.)
226  dgi%XAVG_TS(:) = dgi%XAVG_TS(:) + i%XPATCH(:,jpatch) * dgi%XTS(:,jpatch)
227  END WHERE
228 END DO
229 !
230 IF (.NOT. i%LCANOPY .AND. dgi%N2M>=1) THEN
231 
232  dgi%XAVG_T2M(:) = 0.
233  dgi%XAVG_Q2M(:) = 0.
234  dgi%XAVG_HU2M(:) = 0.
235  !
236  DO jpatch=1,SIZE(i%XPATCH,2)
237  WHERE (zsumpatch(:) > 0.)
238 !
239 ! 2 meters temperature
240 !
241  dgi%XAVG_T2M(:) = dgi%XAVG_T2M(:) + i%XPATCH(:,jpatch) * dgi%XT2M(:,jpatch)
242 !
243 ! 2 meters humidity
244 !
245  dgi%XAVG_Q2M(:) = dgi%XAVG_Q2M(:) + i%XPATCH(:,jpatch) * dgi%XQ2M(:,jpatch)
246 !
247 ! 2 meters relative humidity
248 !
249  dgi%XAVG_HU2M(:) = dgi%XAVG_HU2M(:) + i%XPATCH(:,jpatch) * dgi%XHU2M(:,jpatch)
250 !
251  END WHERE
252  END DO
253 !
254 ! 10 meters wind
255 !
256  dgi%XAVG_ZON10M (:) = 0.
257  dgi%XAVG_MER10M (:) = 0.
258  dgi%XAVG_WIND10M(:) = 0.
259  DO jpatch=1,SIZE(i%XPATCH,2)
260  WHERE (zsumpatch(:) > 0.)
261  dgi%XAVG_ZON10M(:) = dgi%XAVG_ZON10M (:) + i%XPATCH(:,jpatch) * dgi%XZON10M (:,jpatch)
262  dgi%XAVG_MER10M(:) = dgi%XAVG_MER10M (:) + i%XPATCH(:,jpatch) * dgi%XMER10M (:,jpatch)
263  dgi%XAVG_WIND10M(:) = dgi%XAVG_WIND10M(:) + i%XPATCH(:,jpatch) * dgi%XWIND10M(:,jpatch)
264  END WHERE
265  ENDDO
266 !
267  dgi%XAVG_T2M_MIN(:) = min(dgi%XAVG_T2M_MIN(:),dgi%XAVG_T2M(:))
268  dgi%XAVG_T2M_MAX(:) = max(dgi%XAVG_T2M_MAX(:),dgi%XAVG_T2M(:))
269 !
270  dgi%XAVG_HU2M_MIN(:) = min(dgi%XAVG_HU2M_MIN(:),dgi%XAVG_HU2M(:))
271  dgi%XAVG_HU2M_MAX(:) = max(dgi%XAVG_HU2M_MAX(:),dgi%XAVG_HU2M(:))
272 !
273  dgi%XAVG_WIND10M_MAX(:) = max(dgi%XAVG_WIND10M_MAX(:),dgi%XAVG_WIND10M(:))
274 !
275 END IF
276 !
277 ! Richardson number
278 !
279 IF (dgi%N2M>=1) THEN
280 
281  dgi%XAVG_RI(:) = 0.
282  !
283  dgi%XAVG_SFCO2(:) = psfco2(:)
284  !
285  DO jpatch=1,SIZE(i%XPATCH,2)
286  WHERE (zsumpatch(:) > 0.)
287  dgi%XAVG_RI(:) = dgi%XAVG_RI(:) + i%XPATCH(:,jpatch) * dgi%XRI(:,jpatch)
288  END WHERE
289  END DO
290 !
291 ! min and max of XT2M
292 !
293  dgi%XT2M_MIN(:,:) = min(dgi%XT2M_MIN(:,:),dgi%XT2M(:,:))
294  dgi%XT2M_MAX(:,:) = max(dgi%XT2M_MAX(:,:),dgi%XT2M(:,:))
295 !
296 END IF
297 !
298 ! 3. Transfer coefficients
299 ! ---------------------
300 !
301 IF (dgi%LCOEF) THEN
302  !
303  dgi%XAVG_CD (:) = 0.
304  dgi%XAVG_CH (:) = 0.
305  dgi%XAVG_CE (:) = 0.
306  dgi%XAVG_Z0 (:) = 0.
307  dgi%XAVG_Z0H (:) = 0.
308  dgi%XAVG_Z0EFF(:) = 0.
309  !
310  DO jpatch=1,SIZE(i%XPATCH,2)
311  WHERE (zsumpatch(:) > 0.)
312  !
313  dgi%XAVG_CD(:) = dgi%XAVG_CD(:) + i%XPATCH(:,jpatch) * dgi%XCD(:,jpatch)
314  !
315  dgi%XAVG_CH(:) = dgi%XAVG_CH(:) + i%XPATCH(:,jpatch) * dgi%XCH(:,jpatch)
316  !
317  dgi%XAVG_CE(:) = dgi%XAVG_CE(:) + i%XPATCH(:,jpatch) * dgi%XCE(:,jpatch)
318  !
319  !
320  dgi%XAVG_Z0(:) = dgi%XAVG_Z0(:) + i%XPATCH(:,jpatch) * 1./(log(phw(:)/dgi%XZ0_WITH_SNOW (:,jpatch)))**2
321  !
322  dgi%XAVG_Z0H(:) = dgi%XAVG_Z0H(:) + i%XPATCH(:,jpatch) * 1./(log(pht(:)/dgi%XZ0H_WITH_SNOW(:,jpatch)))**2
323  !
324  dgi%XAVG_Z0EFF(:) = dgi%XAVG_Z0EFF(:) + i%XPATCH(:,jpatch) * 1./(log(phw(:)/dgi%XZ0EFF (:,jpatch)))**2
325  !
326  END WHERE
327  END DO
328  !
329  dgi%XAVG_Z0(:) = phw(:) * exp( - sqrt(1./dgi%XAVG_Z0(:)) )
330  !
331  dgi%XAVG_Z0H(:) = pht(:) * exp( - sqrt(1./dgi%XAVG_Z0H(:)) )
332  !
333  dgi%XAVG_Z0EFF(:) = phw(:) * exp( - sqrt(1./dgi%XAVG_Z0EFF(:)) )
334  !
335 END IF
336 !
337 IF (dgi%LSURF_VARS) THEN
338  dgi%XAVG_QS(:) = 0.
339  !
340  DO jpatch=1,SIZE(i%XPATCH,2)
341  WHERE (zsumpatch(:) > 0.)
342 !
343 ! specific humidity at surface
344 !
345  dgi%XAVG_QS(:) = dgi%XAVG_QS(:) + i%XPATCH(:,jpatch) * dgi%XQS(:,jpatch)
346 !
347  END WHERE
348  END DO
349 END IF
350 !
351 IF (lhook) CALL dr_hook('AVERAGE_DIAG_ISBA_N',1,zhook_handle)
352 !-------------------------------------------------------------------------------
353 !
354 END SUBROUTINE average_diag_isba_n
subroutine average_diag_isba_n(DGEI, DGI, I, PHW, PHT, PSFCO2, PTRAD)