SURFEX v8.1
General documentation of Surfex
write_diag_seb_watfluxn.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_watflux_n (DTCO, DUO, U, CHW, DWO, D, DC, HPROGRAM)
7 ! #################################
8 !
9 !!**** *WRITE_DIAG_SEB_WATFLUX_n* - writes WATFLUX diagnostics
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !!
15 !!** METHOD
16 !! ------
17 !!
18 !! REFERENCE
19 !! ---------
20 !!
21 !!
22 !! AUTHOR
23 !! ------
24 !! V. Masson *Meteo France*
25 !!
26 !! MODIFICATIONS
27 !! -------------
28 !! Original 01/2004
29 !! Modified 01/2006 : sea flux parameterization.
30 !! S.Bielli 11/2012 : write HU2M_WAT mis placed
31 !! B. Decharme 06/13 Add evap and sublimation diag
32 !! Delete LPROVAR_TO_DIAG here
33 !! S. Belamari 06/2014 : Introduce GRESET to avoid errors due to NBLOCK=0
34 !! when coupled with ARPEGE/ALADIN/AROME
35 !! B. Decharme 02/2016 : NBLOCK instead of LCOUNTW for compilation in AAA
36 !-------------------------------------------------------------------------------
37 !
38 !* 0. DECLARATIONS
39 ! ------------
40 !
41 !
42 !
45 USE modd_surf_atm_n, ONLY : surf_atm_t
47 !
48 USE modd_surf_par, ONLY : xundef
49 !
51 !
52 #ifdef SFX_ARO
53 USE modd_io_surf_aro, ONLY : nblock
54 #endif
55 !
56 #ifdef SFX_OL
57 USE modd_io_surf_ol, ONLY : ldef
58 #endif
59 !
60 USE modi_init_io_surf_n
62 USE modi_end_io_surf_n
63 !
64 USE yomhook ,ONLY : lhook, dr_hook
65 USE parkind1 ,ONLY : jprb
66 !
67 IMPLICIT NONE
68 !
69 !* 0.1 Declarations of arguments
70 ! -------------------------
71 !
72 !
73 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
74 TYPE(diag_options_t), INTENT(INOUT) :: DUO
75 TYPE(surf_atm_t), INTENT(INOUT) :: U
76 TYPE(ch_watflux_t), INTENT(INOUT) :: CHW
77 TYPE(diag_options_t), INTENT(INOUT) :: DWO
78 TYPE(diag_t), INTENT(INOUT) :: D
79 TYPE(diag_t), INTENT(INOUT) :: DC
80 !
81  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling
82 !
83 !* 0.2 Declarations of local variables
84 ! -------------------------------
85 !
86 INTEGER :: IRESP ! IRESP : return-code if a problem appears
87  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be written
88  CHARACTER(LEN=100):: YCOMMENT ! Comment string
89  CHARACTER(LEN=2) :: YNUM
90 !
91 LOGICAL :: GRESET
92 INTEGER :: JSV, JSW
93 REAL(KIND=JPRB) :: ZHOOK_HANDLE
94 !-------------------------------------------------------------------------------
95 !
96 ! Initialisation for IO
97 !
98 IF (lhook) CALL dr_hook('WRITE_DIAG_SEB_WATFLUX_N',0,zhook_handle)
99 !
100 greset=.true.
101 #ifdef SFX_ARO
102 greset=(nblock>0)
103 #endif
104 #ifdef SFX_OL
105 IF (ldef) greset = .false.
106 #endif
107 !
108  CALL init_io_surf_n(dtco, u, hprogram,'WATER ','WATFLX','WRITE','WATFLUX_DIAGNOSTICS.OUT.nc')
109 !
110 !
111 !* 2. Richardson number :
112 ! -----------------
113 !
114 IF (dwo%N2M>=1) THEN
115 
116  yrecfm='RI_WAT'
117  ycomment='X_Y_'//yrecfm
118  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XRI(:),iresp,hcomment=ycomment)
119  !
120 END IF
121 !
122 !* 3. Energy fluxes :
123 ! -------------
124 !
125 IF (dwo%LSURF_BUDGET) THEN
126 
127  yrecfm='RN_WAT'
128  ycomment='X_Y_'//yrecfm//' (W/m2)'
129  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XRN(:),iresp,hcomment=ycomment)
130  !
131  yrecfm='H_WAT'
132  ycomment='X_Y_'//yrecfm//' (W/m2)'
133  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XH(:),iresp,hcomment=ycomment)
134  !
135  yrecfm='LE_WAT'
136  ycomment='X_Y_'//yrecfm//' (W/m2)'
137  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XLE(:),iresp,hcomment=ycomment)
138  !
139  yrecfm='LEI_WAT'
140  ycomment='X_Y_'//yrecfm//' (W/m2)'
141  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XLEI(:),iresp,hcomment=ycomment)
142  !
143  yrecfm='GFLUX_WAT'
144  ycomment='X_Y_'//yrecfm//' (W/m2)'
145  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XGFLUX(:),iresp,hcomment=ycomment)
146  !
147  yrecfm='EVAP_WAT'
148  ycomment='X_Y_'//yrecfm//' (kg/m2/s)'
149  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XEVAP(:),iresp,hcomment=ycomment)
150  !
151  yrecfm='SUBL_WAT'
152  ycomment='X_Y_'//yrecfm//' (kg/m2/s)'
153  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XSUBL(:),iresp,hcomment=ycomment)
154  !
155  IF (dwo%LRAD_BUDGET) THEN
156  !
157  yrecfm='SWD_WAT'
158  ycomment='X_Y_'//yrecfm//' (W/m2)'
159  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XSWD(:),iresp,hcomment=ycomment)
160  !
161  yrecfm='SWU_WAT'
162  ycomment='X_Y_'//yrecfm//' (W/m2)'
163  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XSWU(:),iresp,hcomment=ycomment)
164  !
165  yrecfm='LWD_WAT'
166  ycomment='X_Y_'//yrecfm//' (W/m2)'
167  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XLWD(:),iresp,hcomment=ycomment)
168  !
169  yrecfm='LWU_WAT'
170  ycomment='X_Y_'//yrecfm//' (W/m2)'
171  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XLWU(:),iresp,hcomment=ycomment)
172  !
173  IF (lallow_add_dim) THEN
174  !
175  yrecfm='SWD_WAT'
176  ycomment='X_Y_'//yrecfm//' (W/m2)'
177  CALL write_surf(duo%CSELECT,&
178  hprogram,yrecfm,d%XSWBD(:,:),iresp,hcomment=ycomment, hnam_dim=yswband_dim_name)
179  !
180  yrecfm='SWU_WAT'
181  ycomment='X_Y_'//yrecfm//' (W/m2)'
182  CALL write_surf(duo%CSELECT,&
183  hprogram,yrecfm,d%XSWBD(:,:),iresp,hcomment=ycomment, hnam_dim=yswband_dim_name)
184  !
185  ELSE
186  !
187  DO jsw=1, SIZE(d%XSWBD,2)
188  ynum=achar(48+jsw)
189  !
190  yrecfm='SWD_WAT_'//ynum
191  ycomment='X_Y_'//yrecfm//' (W/m2)'
192  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XSWBD(:,jsw),iresp,hcomment=ycomment)
193  !
194  yrecfm='SWU_WAT_'//ynum
195  ycomment='X_Y_'//yrecfm//' (W/m2)'
196  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XSWBU(:,jsw),iresp,hcomment=ycomment)
197  !
198  ENDDO
199  !
200  ENDIF
201  !
202  ENDIF
203  !
204  yrecfm='FMU_WAT'
205  ycomment='X_Y_'//yrecfm//' (kg/ms2)'
206  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XFMU(:),iresp,hcomment=ycomment)
207  !
208  yrecfm='FMV_WAT'
209  ycomment='X_Y_'//yrecfm//' (kg/ms2)'
210  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XFMV(:),iresp,hcomment=ycomment)
211  !
212 END IF
213 !
214 !
215 !* 4. Transfer coefficients
216 ! ---------------------
217 !
218 IF (dwo%LCOEF) THEN
219 
220  yrecfm='CD_WAT'
221  ycomment='X_Y_'//yrecfm
222  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XCD(:),iresp,hcomment=ycomment)
223  !
224  yrecfm='CH_WAT'
225  ycomment='X_Y_'//yrecfm
226  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XCH(:),iresp,hcomment=ycomment)
227  !
228  yrecfm='CE_WAT'
229  ycomment='X_Y_'//yrecfm
230  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XCE(:),iresp,hcomment=ycomment)
231  !
232  yrecfm='Z0_WAT'
233  ycomment='X_Y_'//yrecfm
234  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XZ0(:),iresp,hcomment=ycomment)
235  !
236  yrecfm='Z0H_WAT'
237  ycomment='X_Y_'//yrecfm
238  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XZ0H(:),iresp,hcomment=ycomment)
239  !
240 END IF
241 !
242 !
243 !* 5. Surface humidity
244 ! ----------------
245 !
246 IF (dwo%LSURF_VARS) THEN
247 
248  yrecfm='QS_WAT'
249  ycomment='X_Y_'//yrecfm//' (KG/KG)'
250  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XQS(:),iresp,hcomment=ycomment)
251  !
252 ENDIF
253 !
254 !
255 !* 6. parameters at 2 and 10 meters :
256 ! -----------------------------
257 !
258 IF (dwo%N2M>=1) THEN
259  !
260  yrecfm='T2M_WAT'
261  ycomment='X_Y_'//yrecfm//' (K)'
262  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XT2M(:),iresp,hcomment=ycomment)
263  !
264  yrecfm='T2MMIN_WAT'
265  ycomment='X_Y_'//yrecfm//' (K)'
266  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XT2M_MIN(:),iresp,hcomment=ycomment)
267  IF(greset)d%XT2M_MIN(:)=xundef
268  !
269  yrecfm='T2MMAX_WAT'
270  ycomment='X_Y_'//yrecfm//' (K)'
271  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XT2M_MAX(:),iresp,hcomment=ycomment)
272  IF(greset)d%XT2M_MAX(:)=0.0
273  !
274  yrecfm='Q2M_WAT'
275  ycomment='X_Y_'//yrecfm//' (KG/KG)'
276  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XQ2M(:),iresp,hcomment=ycomment)
277  !
278  yrecfm='HU2M_WAT'
279  ycomment='X_Y_'//yrecfm//' (-)'
280  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XHU2M(:),iresp,hcomment=ycomment)
281  !
282  yrecfm='HU2MMIN_WAT'
283  ycomment='X_Y_'//yrecfm//' (-)'
284  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XHU2M_MIN(:),iresp,hcomment=ycomment)
285  IF(greset)d%XHU2M_MIN(:)=xundef
286  !
287  yrecfm='HU2MMAX_WAT'
288  ycomment='X_Y_'//yrecfm//' (-)'
289  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XHU2M_MAX(:),iresp,hcomment=ycomment)
290  IF(greset)d%XHU2M_MAX(:)=-xundef
291  !
292  yrecfm='ZON10M_WAT'
293  ycomment='X_Y_'//yrecfm//' (M/S)'
294  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XZON10M(:),iresp,hcomment=ycomment)
295  !
296  yrecfm='MER10M_WAT'
297  ycomment='X_Y_'//yrecfm//' (M/S)'
298  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XMER10M(:),iresp,hcomment=ycomment)
299  !
300  yrecfm='W10M_WAT'
301  ycomment='X_Y_'//yrecfm//' (M/S)'
302  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XWIND10M(:),iresp,hcomment=ycomment)
303  !
304  yrecfm='W10MMAX_WAT'
305  ycomment='X_Y_'//yrecfm//' (M/S)'
306  CALL write_surf(duo%CSELECT,hprogram,yrecfm,d%XWIND10M_MAX(:),iresp,hcomment=ycomment)
307  IF(greset)d%XWIND10M_MAX(:)=0.0
308  !
309 END IF
310 !
311 !
312 !* 7. chemical diagnostics:
313 ! --------------------
314 !
315 IF (chw%SVW%NBEQ>0 .AND. chw%CCH_DRY_DEP=="WES89 ") THEN
316  DO jsv = 1,SIZE(chw%CCH_NAMES,1)
317  yrecfm='DVWT'//trim(chw%CCH_NAMES(jsv))
318  WRITE(ycomment,'(A13,I3.3)')'(m/s) DV_WAT_',jsv
319  CALL write_surf(duo%CSELECT,hprogram,yrecfm,chw%XDEP(:,jsv),iresp,hcomment=ycomment)
320  END DO
321 ENDIF
322 !
323 IF (dwo%LSURF_BUDGETC) THEN
324 
325  CALL end_io_surf_n(hprogram)
326  CALL init_io_surf_n(dtco, u, hprogram,'WATER ','WATFLX','WRITE','WATFLUX_DIAG_CUMUL.OUT.nc')
327 
328  yrecfm='RNC_WAT'
329  ycomment='X_Y_'//yrecfm//' (J/m2)'
330  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XRN(:),iresp,hcomment=ycomment)
331  !
332  yrecfm='HC_WAT'
333  ycomment='X_Y_'//yrecfm//' (J/m2)'
334  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XH(:),iresp,hcomment=ycomment)
335  !
336  yrecfm='LEC_WAT'
337  ycomment='X_Y_'//yrecfm//' (J/m2)'
338  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XLE(:),iresp,hcomment=ycomment)
339  !
340  yrecfm='LEIC_WAT'
341  ycomment='X_Y_'//yrecfm//' (J/m2)'
342  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XLEI(:),iresp,hcomment=ycomment)
343  !
344  yrecfm='GFLUXC_WAT'
345  ycomment='X_Y_'//yrecfm//' (J/m2)'
346  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XGFLUX(:),iresp,hcomment=ycomment)
347  !
348  yrecfm='EVAPC_WAT'
349  ycomment='X_Y_'//yrecfm//' (kg/m2)'
350  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XEVAP(:),iresp,hcomment=ycomment)
351  !
352  yrecfm='SUBLC_WAT'
353  ycomment='X_Y_'//yrecfm//' (kg/m2)'
354  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XSUBL(:),iresp,hcomment=ycomment)
355  !
356  IF (dwo%LRAD_BUDGET .OR. (dwo%LSURF_BUDGETC .AND. .NOT.duo%LRESET_BUDGETC)) THEN
357  !
358  yrecfm='SWDC_WAT'
359  ycomment='X_Y_'//yrecfm//' (J/m2)'
360  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XSWD(:),iresp,hcomment=ycomment)
361  !
362  yrecfm='SWUC_WAT'
363  ycomment='X_Y_'//yrecfm//' (J/m2)'
364  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XSWU(:),iresp,hcomment=ycomment)
365  !
366  yrecfm='LWDC_WAT'
367  ycomment='X_Y_'//yrecfm//' (J/m2)'
368  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XLWD(:),iresp,hcomment=ycomment)
369  !
370  yrecfm='LWUC_WAT'
371  ycomment='X_Y_'//yrecfm//' (J/m2)'
372  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XLWU(:),iresp,hcomment=ycomment)
373  !
374  ENDIF
375  !
376  yrecfm='FMUC_WAT'
377  ycomment='X_Y_'//yrecfm//' (kg/ms)'
378  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XFMU(:),iresp,hcomment=ycomment)
379  !
380  yrecfm='FMVC_WAT'
381  ycomment='X_Y_'//yrecfm//' (kg/ms)'
382  CALL write_surf(duo%CSELECT,hprogram,yrecfm,dc%XFMV(:),iresp,hcomment=ycomment)
383  !
384 END IF
385 !
386 !-------------------------------------------------------------------------------
387 !
388 ! End of IO
389 !
390  CALL end_io_surf_n(hprogram)
391 IF (lhook) CALL dr_hook('WRITE_DIAG_SEB_WATFLUX_N',1,zhook_handle)
392 !
393 !
394 END SUBROUTINE write_diag_seb_watflux_n
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine write_diag_seb_watflux_n(DTCO, DUO, U, CHW, DWO, D, DC
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