SURFEX v8.1
General documentation of Surfex
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 (DGO, D, DC, ND, NDC, NP, KNPATCH, OSURF_BUDGETC, &
7  OCANOPY, 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 !
53 USE modd_isba_n, ONLY : isba_np_t
54 !
55 USE modd_surf_par, ONLY : xundef
56 !
57 USE yomhook ,ONLY : lhook, dr_hook
58 USE parkind1 ,ONLY : jprb
59 !
60 IMPLICIT NONE
61 !
62 !* 0.1 declarations of arguments
63 !
64 !
65 TYPE(diag_options_t), INTENT(INOUT) :: DGO
66 TYPE(diag_t), INTENT(INOUT) :: D
67 TYPE(diag_t), INTENT(INOUT) :: DC
68 TYPE(diag_np_t), INTENT(INOUT) :: ND
69 TYPE(diag_np_t), INTENT(INOUT) :: NDC
70 TYPE(isba_np_t), INTENT(INOUT) :: NP
71 INTEGER, INTENT(IN) :: KNPATCH
72 !
73 LOGICAL, INTENT(IN) :: OSURF_BUDGETC
74 LOGICAL, INTENT(IN) :: OCANOPY
75 !
76 REAL, DIMENSION(:), INTENT(IN) :: PHW ! atmospheric level height for wind (m)
77 REAL, DIMENSION(:), INTENT(IN) :: PHT ! atmospheric level height (m)
78 REAL, DIMENSION(:), INTENT(IN) :: PSFCO2 ! CO2 flux (m/s*kg_CO2/kg_air)
79 REAL, DIMENSION(:), INTENT(IN) :: PTRAD ! Radiative temperature (K)
80 !
81 !* 0.2 declarations of local variables
82 !
83 INTEGER :: JP, JI, IMASK ! tile loop counter
84 INTEGER :: JSWB ! band loop counter
85 REAL(KIND=JPRB) :: ZHOOK_HANDLE
86 !
87 !-------------------------------------------------------------------------------
88 !
89 ! 0. Initialization
90 ! --------------
91 !
92 IF (lhook) CALL dr_hook('AVERAGE_DIAG_ISBA_N',0,zhook_handle)
93 !
94 ! 1. Energy fluxes
95 ! -------------
96 !
97 IF (dgo%LSURF_BUDGET) THEN
98  !
99  CALL make_average(d,nd)
100  !
101  d%XSWBD(:,:) = 0.
102  d%XSWBU(:,:) = 0.
103  !
104  DO jp=1,knpatch
105  DO ji = 1,np%AL(jp)%NSIZE_P
106  imask = np%AL(jp)%NR_P(ji)
107 
108  DO jswb =1,SIZE(d%XSWBD,2)
109  !
110  ! Downwards SW radiation for each spectral band
111  d%XSWBD(imask,jswb) = d%XSWBD(imask,jswb) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XSWBD(ji,jswb)
112  !
113  ! Upwards SW radiation for each spectral band
114  d%XSWBU(imask,jswb) = d%XSWBU(imask,jswb) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XSWBU(ji,jswb)
115  !
116  END DO
117 
118  ENDDO
119  END DO
120  !
121 END IF
122 !
123 IF (osurf_budgetc) THEN
124  !
125  CALL make_average(dc,ndc)
126  !
127 ENDIF
128 !
129 ! 2. surface temperature and 2 meters parameters
130 ! -------------------------------------------
131 !
132 d%XTS (:) = 0.0
133 d%XALBT(:) = 0.0
134 DO jp=1,knpatch
135  DO ji = 1,np%AL(jp)%NSIZE_P
136  imask = np%AL(jp)%NR_P(ji)
137 
138  d%XTS(imask) = d%XTS(imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XTS(ji)
139  ! Total albedo
140  d%XALBT(imask) = d%XALBT(imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XALBT(ji)
141 
142  ENDDO
143 END DO
144 !
145 IF (.NOT. ocanopy .AND. dgo%N2M>=1) THEN
146 
147  d%XT2M(:) = 0.
148  d%XQ2M(:) = 0.
149  d%XHU2M(:) = 0.
150  !
151  DO jp=1,knpatch
152  DO ji = 1,np%AL(jp)%NSIZE_P
153  imask = np%AL(jp)%NR_P(ji)
154  !
155  ! 2 meters temperature
156  d%XT2M(imask) = d%XT2M(imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XT2M(ji)
157  !
158  ! 2 meters humidity
159  d%XQ2M(imask) = d%XQ2M(imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XQ2M(ji)
160  !
161  ! 2 meters relative humidity
162  d%XHU2M(imask) = d%XHU2M(imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XHU2M(ji)
163  !
164  ENDDO
165  END DO
166  !
167  ! 10 meters wind
168  !
169  d%XZON10M (:) = 0.
170  d%XMER10M (:) = 0.
171  d%XWIND10M(:) = 0.
172  DO jp=1,knpatch
173  DO ji = 1,np%AL(jp)%NSIZE_P
174  imask = np%AL(jp)%NR_P(ji)
175 
176  d%XZON10M(imask) = d%XZON10M (imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XZON10M (ji)
177  d%XMER10M(imask) = d%XMER10M (imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XMER10M (ji)
178  d%XWIND10M(imask) = d%XWIND10M(imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XWIND10M(ji)
179  ENDDO
180  ENDDO
181  !
182  ! min and max of XT2M
183  !
184  DO jp=1,knpatch
185  nd%AL(jp)%XT2M_MIN(:) = min(nd%AL(jp)%XT2M_MIN(:),nd%AL(jp)%XT2M(:))
186  nd%AL(jp)%XT2M_MAX(:) = max(nd%AL(jp)%XT2M_MAX(:),nd%AL(jp)%XT2M(:))
187  ENDDO
188  !
189  d%XT2M_MIN(:) = min(d%XT2M_MIN(:),d%XT2M(:))
190  d%XT2M_MAX(:) = max(d%XT2M_MAX(:),d%XT2M(:))
191  !
192  d%XHU2M_MIN(:) = min(d%XHU2M_MIN(:),d%XHU2M(:))
193  d%XHU2M_MAX(:) = max(d%XHU2M_MAX(:),d%XHU2M(:))
194  !
195  d%XWIND10M_MAX(:) = max(d%XWIND10M_MAX(:),d%XWIND10M(:))
196  !
197 END IF
198 !
199 ! Richardson number
200 !
201 IF (dgo%N2M>=1) THEN
202 
203  d%XRI(:) = 0.
204  d%XSFCO2(:) = psfco2(:)
205  DO jp=1,knpatch
206  DO ji = 1,np%AL(jp)%NSIZE_P
207  imask = np%AL(jp)%NR_P(ji)
208  d%XRI(imask) = d%XRI(imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XRI(ji)
209  ENDDO
210  END DO
211  !
212 END IF
213 !
214 ! 3. Transfer coefficients
215 ! ---------------------
216 !
217 IF (dgo%LCOEF) THEN
218  !
219  d%XCD (:) = 0.
220  d%XCH (:) = 0.
221  d%XCE (:) = 0.
222  d%XZ0 (:) = 0.
223  d%XZ0H (:) = 0.
224  d%XZ0EFF(:) = 0.
225  !
226  DO jp=1,knpatch
227  DO ji = 1,np%AL(jp)%NSIZE_P
228  imask = np%AL(jp)%NR_P(ji)
229  !
230  d%XCD(imask) = d%XCD(imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XCD(ji)
231  d%XCH(imask) = d%XCH(imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XCH(ji)
232  d%XCE(imask) = d%XCE(imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XCE(ji)
233  !
234  d%XZ0(imask) = d%XZ0(imask) + np%AL(jp)%XPATCH(ji) * &
235  1./(log(phw(imask)/nd%AL(jp)%XZ0 (ji)))**2
236  d%XZ0H(imask) = d%XZ0H(imask) + np%AL(jp)%XPATCH(ji) * &
237  1./(log(pht(imask)/nd%AL(jp)%XZ0H(ji)))**2
238  d%XZ0EFF(imask) = d%XZ0EFF(imask) + np%AL(jp)%XPATCH(ji) * &
239  1./(log(phw(imask)/nd%AL(jp)%XZ0EFF(ji)))**2
240  !
241  ENDDO
242  END DO
243  !
244  d%XZ0(:) = phw(:) * exp( - sqrt(1./d%XZ0(:)) )
245  !
246  d%XZ0H(:) = pht(:) * exp( - sqrt(1./d%XZ0H(:)) )
247  !
248  d%XZ0EFF(:) = phw(:) * exp( - sqrt(1./d%XZ0EFF(:)) )
249  !
250 END IF
251 !
252 IF (dgo%LSURF_VARS) THEN
253  d%XQS(:) = 0.
254  !
255  DO jp=1,knpatch
256  DO ji = 1,np%AL(jp)%NSIZE_P
257  imask = np%AL(jp)%NR_P(ji)
258  !
259  ! specific humidity at surface
260  d%XQS(imask) = d%XQS(imask) + np%AL(jp)%XPATCH(ji) * nd%AL(jp)%XQS(ji)
261  !
262  ENDDO
263  END DO
264 END IF
265 !
266 IF (lhook) CALL dr_hook('AVERAGE_DIAG_ISBA_N',1,zhook_handle)
267 !-------------------------------------------------------------------------------
268 CONTAINS
269 !
270 SUBROUTINE make_average(DA,NDA)
271 !
272 TYPE(diag_t), INTENT(INOUT) :: DA
273 TYPE(diag_np_t), INTENT(INOUT) :: NDA
274 !
275 REAL(KIND=JPRB) :: ZHOOK_HANDLE
276 IF (lhook) CALL dr_hook('AVERAGE_DIAG_ISBA_N:MAKE_AVERAGE',0,zhook_handle)
277 !
278 da%XRN (:) = 0.
279 da%XH (:) = 0.
280 da%XLE (:) = 0.
281 da%XLEI (:) = 0.
282 da%XGFLUX(:) = 0.
283 !
284 da%XSWD(:) = 0.
285 da%XSWU(:) = 0.
286 da%XLWD(:) = 0.
287 da%XLWU(:) = 0.
288 da%XFMU(:) = 0.
289 da%XFMV(:) = 0.
290 !
291 da%XEVAP (:) = 0.
292 da%XSUBL (:) = 0.
293 !
294 DO jp=1,knpatch
295  DO ji = 1,np%AL(jp)%NSIZE_P
296  imask = np%AL(jp)%NR_P(ji)
297  !
298  ! Net radiation
299  da%XRN (imask) = da%XRN (imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XRN(ji)
300  !
301  ! Sensible heat flux
302  da%XH (imask) = da%XH (imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XH(ji)
303  !
304  ! Total latent heat flux
305  da%XLE (imask) = da%XLE (imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XLE(ji)
306  !
307  ! Storage flux
308  da%XGFLUX(imask) = da%XGFLUX(imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XGFLUX(ji)
309  !
310  ! Total surface sublimation
311  da%XLEI (imask) = da%XLEI (imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XLEI(ji)
312  !
313  ! Evapotranspiration
314  da%XEVAP (imask) = da%XEVAP (imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XEVAP(ji)
315  !
316  ! Sublimation
317  da%XSUBL (imask) = da%XSUBL (imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XSUBL(ji)
318  !
319  ! Downwards SW radiation
320  da%XSWD (imask) = da%XSWD (imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XSWD(ji)
321  !
322  ! Upwards SW radiation
323  da%XSWU (imask) = da%XSWU (imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XSWU(ji)
324  !
325  ! Downwards LW radiation
326  da%XLWD (imask) = da%XLWD (imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XLWD(ji)
327  !
328  ! Upwards LW radiation
329  da%XLWU (imask) = da%XLWU (imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XLWU(ji)
330  !
331  ! Zonal wind stress
332  da%XFMU (imask) = da%XFMU (imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XFMU(ji)
333  !
334  ! Meridian wind stress
335  da%XFMV (imask) = da%XFMV (imask) + np%AL(jp)%XPATCH(ji) * nda%AL(jp)%XFMV(ji)
336  !
337  ENDDO
338 END DO
339 !
340 IF (lhook) CALL dr_hook('AVERAGE_DIAG_ISBA_N:MAKE_AVERAGE',1,zhook_handle)
341 !
342 END SUBROUTINE make_average
343 !
344 !
345 END SUBROUTINE average_diag_isba_n
real, parameter xundef
subroutine make_average(PFRAC, PFIELD_IN, PFIELD_OUT, KTILE)
subroutine average_diag_isba_n(DGO, D, DC, ND, NDC, NP, KNPATCH,
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15