SURFEX v8.1
General documentation of Surfex
write_diag_seb_surf_atmn.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 write_diag_seb_surf_atm_n (DTCO, DGO, D, DC, U, HGRID, HPROGRAM)
7 ! #################################
8 !
9 !!**** *WRITE_DIAG_SEB_SURF_ATM_n* - writes surface diagnostics
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !!
15 !!** METHOD
16 !! ------
17 !!
18 !!
19 !! REFERENCE
20 !! ---------
21 !!
22 !!
23 !! AUTHOR
24 !! ------
25 !! V. Masson *Meteo France*
26 !!
27 !! MODIFICATIONS
28 !! -------------
29 !! Original 01/2004
30 !! Modified 01/2006 : sea flux parameterization.
31 !! Modified 08/2009 : cumulated diag
32 !! Juan 6/12/2011: parallel bug , remove local ANY(XAVG_ZON10M) test
33 !! B. Decharme 06/13 Add QS, evap and sublimation diags
34 !-------------------------------------------------------------------------------
35 !
36 !* 0. DECLARATIONS
37 ! ------------
38 !
39 !
42 USE modd_surf_atm_n, ONLY : surf_atm_t
43 !
44 USE modd_surf_par, ONLY : xundef
45 !
47 !
48 USE modi_init_io_surf_n
50 USE modi_end_io_surf_n
51 USE modi_sum_on_all_procs
52 !
53 USE yomhook ,ONLY : lhook, dr_hook
54 USE parkind1 ,ONLY : jprb
55 !
56 IMPLICIT NONE
57 !
58 !* 0.1 Declarations of arguments
59 ! -------------------------
60 !
61 !
62 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
63 TYPE(diag_options_t), INTENT(INOUT) :: DGO
64 TYPE(diag_t), INTENT(INOUT) :: D
65 TYPE(diag_t), INTENT(INOUT) :: DC
66 TYPE(surf_atm_t), INTENT(INOUT) :: U
67  CHARACTER(LEN=*), INTENT(IN) :: HGRID
68 !
69  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling
70 !
71 !* 0.2 Declarations of local variables
72 ! -------------------------------
73 !
74 
75 INTEGER :: IRESP ! IRESP : return-code if a problem appears
76  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
77  CHARACTER(LEN=100):: YCOMMENT ! Comment string
78  CHARACTER(LEN=2) :: YNUM
79 !
80 INTEGER :: JSW
81 REAL(KIND=JPRB) :: ZHOOK_HANDLE
82 !
83 !-------------------------------------------------------------------------------
84 !
85 ! Initialisation for IO
86 !
87 IF (lhook) CALL dr_hook('WRITE_DIAG_SEB_SURF_ATM_N',0,zhook_handle)
88  CALL init_io_surf_n(dtco, u, hprogram,'FULL ','SURF ','WRITE','SURF_ATM_DIAGNOSTICS.OUT.nc')
89 !
90 !* 1. Richardson number :
91 ! -----------------
92 !
93 IF (dgo%N2M>=1) THEN
94  !
95  yrecfm='RI'
96  ycomment='X_Y_'//yrecfm
97  !
98  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XRI(:),iresp,hcomment=ycomment)
99  !
100 ENDIF
101 !
102 !* 2. parameters at surface, 2 and 10 meters :
103 ! ----------------------------------------
104 !
105 IF (dgo%N2M>=1.OR.dgo%LSURF_BUDGET.OR.dgo%LSURF_BUDGETC) THEN
106  !
107  yrecfm='TS'
108  ycomment='X_Y_'//yrecfm//' (K)'
109  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XTS(:),iresp,hcomment=ycomment)
110  !
111  yrecfm='TSRAD'
112  ycomment='X_Y_'//yrecfm//' (K)'
113  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XTRAD(:),iresp,hcomment=ycomment)
114  !
115  yrecfm='EMIS'
116  ycomment='X_Y_'//yrecfm//' (-)'
117  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XEMIS(:),iresp,hcomment=ycomment)
118  !
119  yrecfm='SFCO2'
120  ycomment='X_Y_'//yrecfm//' (M.kgCO2.S-1.kgAIR-1)'
121  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XSFCO2(:),iresp,hcomment=ycomment)
122  !
123 ENDIF
124 !
125 IF (dgo%N2M>=1) THEN
126  !
127  yrecfm='T2M'
128  ycomment='X_Y_'//yrecfm//' (K)'
129  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XT2M(:),iresp,hcomment=ycomment)
130  !
131  yrecfm='T2MMIN'
132  ycomment='X_Y_'//yrecfm//' (K)'
133  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XT2M_MIN(:),iresp,hcomment=ycomment)
134  !
135  yrecfm='T2MMAX'
136  ycomment='X_Y_'//yrecfm//' (K)'
137  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XT2M_MAX(:),iresp,hcomment=ycomment)
138  !
139  yrecfm='Q2M'
140  ycomment='X_Y_'//yrecfm//' (KG/KG)'
141  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XQ2M(:),iresp,hcomment=ycomment)
142  !
143  yrecfm='HU2M'
144  ycomment='X_Y_'//yrecfm//' (-)'
145  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XHU2M(:),iresp,hcomment=ycomment)
146  !
147  yrecfm='HU2MMIN'
148  ycomment='X_Y_'//yrecfm//' (-)'
149  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XHU2M_MIN(:),iresp,hcomment=ycomment)
150  !
151  yrecfm='HU2MMAX'
152  ycomment='X_Y_'//yrecfm//' (-)'
153  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XHU2M_MAX(:),iresp,hcomment=ycomment)
154  !
155  IF ( sum_on_all_procs(hprogram,hgrid,d%XZON10M(:)/= xundef) > 0. ) THEN
156  !
157  yrecfm='ZON10M'
158  ycomment='X_Y_'//yrecfm//' (M/S)'
159  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XZON10M(:),iresp,hcomment=ycomment)
160  !
161  yrecfm='MER10M'
162  ycomment='X_Y_'//yrecfm//' (M/S)'
163  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XMER10M(:),iresp,hcomment=ycomment)
164  !
165  yrecfm='W10M'
166  ycomment='X_Y_'//yrecfm//' (M/S)'
167  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XWIND10M(:),iresp,hcomment=ycomment)
168  !
169  yrecfm='W10MMAX'
170  ycomment='X_Y_'//yrecfm//' (M/S)'
171  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XWIND10M_MAX(:),iresp,hcomment=ycomment)
172  !
173  ENDIF
174  !
175  IF (dgo%L2M_MIN_ZS) THEN
176  !
177  yrecfm='T2M_MIN_ZS'
178  ycomment='X_Y_'//yrecfm//' (K)'
179  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XT2M_MIN_ZS(:),iresp,hcomment=ycomment)
180  !
181  yrecfm='Q2M_MIN_ZS'
182  ycomment='X_Y_'//yrecfm//' (KG/KG)'
183  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XQ2M_MIN_ZS(:),iresp,hcomment=ycomment)
184  !
185  yrecfm='HU2M_MIN_ZS'
186  ycomment='X_Y_'//yrecfm//' (KG/KG)'
187  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XHU2M_MIN_ZS(:),iresp,hcomment=ycomment)
188  !
189  END IF
190  !
191 END IF
192 !
193 !* 3. Energy fluxes :
194 ! -------------
195 !
196 IF (dgo%LSURF_BUDGET) THEN
197  !
198  yrecfm='RN'
199  ycomment='X_Y_'//yrecfm//' (W/m2)'
200  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XRN(:),iresp,hcomment=ycomment)
201  !
202  yrecfm='H'
203  ycomment='X_Y_'//yrecfm//' (W/m2)'
204  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XH(:),iresp,hcomment=ycomment)
205  !
206  yrecfm='LE'
207  ycomment='X_Y_'//yrecfm//' (W/m2)'
208  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XLE(:),iresp,hcomment=ycomment)
209  !
210  yrecfm='LEI'
211  ycomment='X_Y_'//yrecfm//' (W/m2)'
212  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XLEI(:),iresp,hcomment=ycomment)
213  !
214  yrecfm='GFLUX'
215  ycomment='X_Y_'//yrecfm//' (W/m2)'
216  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XGFLUX(:),iresp,hcomment=ycomment)
217  !
218  yrecfm='EVAP'
219  ycomment='X_Y_'//yrecfm//' (kg/m2/s)'
220  !
221  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XEVAP(:),iresp,hcomment=ycomment)
222  !
223  yrecfm='SUBL'
224  ycomment='X_Y_'//yrecfm//' (kg/m2/s)'
225  !
226  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XSUBL(:),iresp,hcomment=ycomment)
227  !
228  IF (dgo%LRAD_BUDGET) THEN
229  !
230  yrecfm='SWD'
231  ycomment='X_Y_'//yrecfm//' (W/m2)'
232  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XSWD(:),iresp,hcomment=ycomment)
233  !
234  yrecfm='SWU'
235  ycomment='X_Y_'//yrecfm//' (W/m2)'
236  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XSWU(:),iresp,hcomment=ycomment)
237  !
238  yrecfm='LWD'
239  ycomment='X_Y_'//yrecfm//' (W/m2)'
240  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XLWD(:),iresp,hcomment=ycomment)
241  !
242  yrecfm='LWU'
243  ycomment='X_Y_'//yrecfm//' (W/m2)'
244  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XLWU(:),iresp,hcomment=ycomment)
245  !
246  IF (lallow_add_dim) THEN
247  !
248  yrecfm='SWD_'
249  ycomment='X_Y_'//yrecfm//' (W/m2)'
250  CALL write_surf(dgo%CSELECT,&
251  hprogram,yrecfm,d%XSWBD(:,:),iresp,hcomment=ycomment, hnam_dim=yswband_dim_name)
252  !
253  yrecfm='SWU_'
254  ycomment='X_Y_'//yrecfm//' (W/m2)'
255  CALL write_surf(dgo%CSELECT,&
256  hprogram,yrecfm,d%XSWBD(:,:),iresp,hcomment=ycomment, hnam_dim=yswband_dim_name)
257  !
258  ELSE
259  !
260  DO jsw=1, SIZE(d%XSWBD,2)
261  ynum=achar(48+jsw)
262  !
263  yrecfm='SWD_'//ynum
264  ycomment='X_Y_'//yrecfm//' (W/m2)'
265  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XSWBD(:,jsw),iresp,hcomment=ycomment)
266  !
267  yrecfm='SWU_'//ynum
268  ycomment='X_Y_'//yrecfm//' (W/m2)'
269  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XSWBU(:,jsw),iresp,hcomment=ycomment)
270  !
271  ENDDO
272  !
273  ENDIF
274  !
275  ENDIF
276  !
277  yrecfm='FMUNOSSO'
278  ycomment='X_Y_'//yrecfm//' (kg/ms2)'
279  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XFMU(:),iresp,hcomment=ycomment)
280  !
281  yrecfm='FMVNOSSO'
282  ycomment='X_Y_'//yrecfm//' (kg/ms2)'
283  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XFMV(:),iresp,hcomment=ycomment)
284  !
285  yrecfm='FMU'
286  ycomment='X_Y_'//yrecfm//' (kg/ms2)'
287  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XSSO_FMU(:),iresp,hcomment=ycomment)
288  !
289  yrecfm='FMV'
290  ycomment='X_Y_'//yrecfm//' (kg/ms2)'
291  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XSSO_FMV(:),iresp,hcomment=ycomment)
292  !
293 END IF
294 !
295 ! * Cumulated diag
296 !
297 IF (dgo%LSURF_BUDGETC) THEN
298  !
299  yrecfm='RNC'
300  ycomment='X_Y_'//yrecfm//' (J/m2)'
301  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XRN(:),iresp,hcomment=ycomment)
302  !
303  yrecfm='HC'
304  ycomment='X_Y_'//yrecfm//' (J/m2)'
305  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XH(:),iresp,hcomment=ycomment)
306  !
307  yrecfm='LEC'
308  ycomment='X_Y_'//yrecfm//' (J/m2)'
309  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XLE(:),iresp,hcomment=ycomment)
310  !
311  yrecfm='LEIC'
312  ycomment='X_Y_'//yrecfm//' (J/m2)'
313  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XLEI(:),iresp,hcomment=ycomment)
314  !
315  yrecfm='GFLUXC'
316  ycomment='X_Y_'//yrecfm//' (J/m2)'
317  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XGFLUX(:),iresp,hcomment=ycomment)
318  !
319  yrecfm='EVAPC'
320  ycomment='X_Y_'//yrecfm//' (kg/m2)'
321  !
322  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XEVAP(:),iresp,hcomment=ycomment)
323  !
324  yrecfm='SUBLC'
325  ycomment='X_Y_'//yrecfm//' (kg/m2)'
326  !
327  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XSUBL(:),iresp,hcomment=ycomment)
328  !
329  IF (dgo%LRAD_BUDGET .OR. (dgo%LSURF_BUDGETC .AND. .NOT.dgo%LRESET_BUDGETC)) THEN
330  !
331  yrecfm='SWDC'
332  ycomment='X_Y_'//yrecfm//' (J/m2)'
333  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XSWD(:),iresp,hcomment=ycomment)
334  !
335  yrecfm='SWUC'
336  ycomment='X_Y_'//yrecfm//' (J/m2)'
337  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XSWU(:),iresp,hcomment=ycomment)
338  !
339  yrecfm='LWDC'
340  ycomment='X_Y_'//yrecfm//' (J/m2)'
341  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XLWD(:),iresp,hcomment=ycomment)
342  !
343  yrecfm='LWUC'
344  ycomment='X_Y_'//yrecfm//' (J/m2)'
345  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XLWU(:),iresp,hcomment=ycomment)
346  !
347  ENDIF
348  !
349  yrecfm='FMUC'
350  ycomment='X_Y_'//yrecfm//' (kg/ms)'
351  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XFMU(:),iresp,hcomment=ycomment)
352  !
353  yrecfm='FMVC'
354  ycomment='X_Y_'//yrecfm//' (kg/ms)'
355  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,dc%XFMV(:),iresp,hcomment=ycomment)
356  !
357 END IF
358 !
359 !
360 !* 4. Transfer coefficients
361 ! ---------------------
362 !
363 IF (dgo%LCOEF) THEN
364  !
365  yrecfm='CD'
366  ycomment='X_Y_'//yrecfm
367  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XCD(:),iresp,hcomment=ycomment)
368  !
369  yrecfm='CH'
370  ycomment='X_Y_'//yrecfm
371  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XCH(:),iresp,hcomment=ycomment)
372  !
373  yrecfm='CE'
374  ycomment='X_Y_'//yrecfm
375  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XCE(:),iresp,hcomment=ycomment)
376  !
377  yrecfm='Z0'
378  ycomment='X_Y_'//yrecfm
379  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XZ0(:),iresp,hcomment=ycomment)
380  !
381  yrecfm='Z0H'
382  ycomment='X_Y_'//yrecfm
383  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XZ0H(:),iresp,hcomment=ycomment)
384  !
385  yrecfm='UREF'
386  ycomment='X_Y_'//yrecfm
387  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XUREF(:),iresp,hcomment=ycomment)
388  !
389  yrecfm='ZREF'
390  ycomment='X_Y_'//yrecfm
391  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XZREF(:),iresp,hcomment=ycomment)
392  !
393 END IF
394 !
395 !
396 !* 5. Surface humidity
397 ! ----------------
398 !
399 IF (dgo%LSURF_VARS) THEN
400 !
401 yrecfm='QS'
402 ycomment='X_Y_'//yrecfm//' (kg/kg)'
403 !
404  CALL write_surf(dgo%CSELECT,hprogram,yrecfm,d%XQS(:),iresp,hcomment=ycomment)
405 !
406 ENDIF
407 !
408 !-------------------------------------------------------------------------------
409 !
410 ! End of IO
411 !
412  CALL end_io_surf_n(hprogram)
413 IF (lhook) CALL dr_hook('WRITE_DIAG_SEB_SURF_ATM_N',1,zhook_handle)
414 !
415 !
416 END SUBROUTINE write_diag_seb_surf_atm_n
subroutine write_diag_seb_surf_atm_n(DTCO, DGO, D, DC, U, HGRID,
integer function sum_on_all_procs(HPROGRAM, HGRID, OIN, HNAME)
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lallow_add_dim
Definition: modd_xios.F90:49
character(len=30) yswband_dim_name
Definition: modd_xios.F90:69
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:7
logical lhook
Definition: yomhook.F90:15
subroutine init_io_surf_n(DTCO, U, HPROGRAM, HMASK, HSCHEME, HACTION