SURFEX v8.1
General documentation of Surfex
sfx_xios_declare_field.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 SUBROUTINE sfx_xios_declare_field(HREC, HDOMAIN, HAXIS, KLEV, HAXIS2, KLEV2, HCOMMENT ,KFREQOP)
6 !!
7 !!
8 !! PURPOSE
9 !! --------
10 !!
11 !! Declare field HREC and some attributes to XIOS if needed
12 
13 !! If 'units' or 'long_name' attribute is not defined using XIOS
14 !! config files , use HCOMMENT to declare it. Same for domain and
15 !! other axis, either using relevant args or with default values
16 !!
17 !! If haxis si provided and is the name of dimension 'patch' and
18 !! haxis2 is not provided, rather proceed by a loop of 2D
19 !! fields declarations
20 !!
21 !! IMPLICIT ARGUMENTS :
22 !! --------------------
23 !!
24 !! EXTERNAL
25 !! --------
26 !!
27 !! XIOS LIBRARY
28 !!
29 !! REFERENCE
30 !! ---------
31 !!
32 !! XIOS Reference guide - Yann Meurdesoif - 10/10/2014 -
33 !! svn co -r 515 http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0 <dir>
34 !! cd <dir>/doc ; ....
35 !!
36 !! AUTHOR
37 !! ------
38 !!
39 !! S.Sénési, CNRM
40 !!
41 !! MODIFICATION
42 !! --------------
43 !!
44 !! Original 03/2016
45 !!
46 !-------------------------------------------------------------------------------
47 !
48 !* 0. DECLARATIONS
49 ! ------------
50 !
52 USE modd_surf_par, ONLY : xundef
53 
54 #ifdef WXIOS
55 USE xios
56 #endif
57 !
58 USE modi_set_axis
59 USE modi_abor1_sfx
60 !
61 USE yomhook, ONLY : lhook, dr_hook
62 USE parkind1, ONLY : jprb, jpim
63 !
64 IMPLICIT NONE
65 
66 !
67 ! Arguments
68 !
69  CHARACTER(LEN=*) ,INTENT(IN) :: HREC ! field id
70  CHARACTER(LEN=*) ,INTENT(IN), OPTIONAL :: HDOMAIN ! name of the horiz domain
71  CHARACTER(LEN=*) ,INTENT(IN), OPTIONAL :: HAXIS ! name of the additional axis
72 INTEGER ,INTENT(IN), OPTIONAL :: KLEV ! Axis size
73  CHARACTER(LEN=*) ,INTENT(IN), OPTIONAL :: HAXIS2 ! name of second additional axis
74 INTEGER ,INTENT(IN), OPTIONAL :: KLEV2 ! Second axis size
75  CHARACTER(LEN=*) ,INTENT(IN), OPTIONAL :: HCOMMENT ! Comment string a la Surfex
76 INTEGER(KIND=JPIM) ,INTENT(IN), OPTIONAL :: KFREQOP ! Sampling frequency, in minutes
77 !
78  CHARACTER(1000) :: YLDOMAIN
79  CHARACTER(1000) :: YLCOMMENT
80  CHARACTER(1000) :: YAXIS,YAXIS2
81  CHARACTER(3) :: YIDIM
82 !
83 INTEGER(KIND=JPIM) :: IFREQOP ! Sampling frequency, in minutes
84 INTEGER(KIND=JPIM) :: IIDIM, ILEV, ILEV2
85 LOGICAL :: GGRIDDEF
86 !
87 REAL(KIND=JPRB) :: ZHOOK_HANDLE
88 !
89 IF (lhook) CALL dr_hook('SFX_XIOS_DECLARE_FIELD',0,zhook_handle)
90 !
91 #ifdef WXIOS
92 !
93 ! ----------------------------------------------------------------------
94 ! If XIOS init phase is over, just returns
95 ! ----------------------------------------------------------------------
96 !
97 IF (lxios_def_closed) THEN
98  IF (lhook) CALL dr_hook('SFX_XIOS_DECLARE_FIELD_INTERNAL',1,zhook_handle)
99  RETURN
100 ENDIF
101 !
102 yldomain='FULL'
103 IF (PRESENT(hdomain)) yldomain=trim(hdomain)
104 ylcomment=''
105 IF (PRESENT(hcomment)) ylcomment=trim(hcomment)
106 ifreqop=0
107 IF (PRESENT(kfreqop)) ifreqop=kfreqop
108 ilev=0
109 IF (PRESENT(klev)) ilev=klev
110 ilev2=0
111 IF (PRESENT(klev2)) ilev2=klev2
112 yaxis=''
113 IF (PRESENT(haxis)) yaxis=trim(haxis)
114 yaxis2=''
115 IF (PRESENT(haxis2)) yaxis2=trim(haxis2)
116 !
117 IF (PRESENT(haxis) .AND. (yaxis==trim(ypatch_dim_name)) .AND. .NOT. PRESENT(haxis2)) THEN
118  ! For historical reason, in that case, a special treatment for
119  ! avoiding that 'patch' dimension (provided as 1st dimension) is
120  ! actually used : proceed by declaring a set of individual arrays
121  IF ( ilev == 0 ) CALL xios_get_axis_attr(haxis, n_glo=ilev)
122  DO iidim=1,ilev
123  IF ( iidim < 10 ) THEN
124  WRITE(yidim,'(I1)') iidim
125  ELSE
126  IF ( iidim < 100 ) THEN
127  WRITE(yidim,'(I2)') iidim
128  ELSE
129  WRITE(yidim,'(I2)') iidim
130  ENDIF
131  ENDIF
132  !write(0,*) '<field id="'//trim(HREC)//'_'//TRIM(YIDIM)//'", domain_ref="'//trim(CLDOMAIN)//'" />'
133  CALL sfx_xios_declare_field_internal(trim(hrec)//'_'//trim(yidim), yldomain, ylcomment, ifreqop)
134  END DO
135  !
136 ELSE
137  !
138  ! Standard case
139  !
140  CALL sfx_xios_declare_field_internal(hrec, yldomain, ylcomment, ifreqop)
141  IF (PRESENT(haxis)) CALL sfx_xios_declare_axis_internal(hrec,yaxis,ilev)
142  IF (PRESENT(haxis2)) CALL sfx_xios_declare_axis_internal(hrec,yaxis2,ilev2,osecond=.true.)
143 ENDIF
144 #endif
145 !
146 IF (lhook) CALL dr_hook('SFX_XIOS_DECLARE_FIELD',1,zhook_handle)
147 !
148 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
149 
150 
151 CONTAINS
152 
153 SUBROUTINE sfx_xios_declare_field_internal(HREC, HDOMAIN, HCOMMENT , KFREQOP)
155 USE modd_surf_par, ONLY : xundef
156 USE yomhook , ONLY : lhook, dr_hook
157 USE parkind1 , ONLY : jprb, jpim
158 !
159 #ifdef WXIOS
160 USE xios
161 #endif
162 !
163 USE modi_abor1_sfx
164 !
165 IMPLICIT NONE
166 !
167 ! Arguments
168 !
169  CHARACTER(LEN=*) ,INTENT(IN) :: HREC ! field id
170  CHARACTER(LEN=*) ,INTENT(IN) :: HDOMAIN ! name of the horiz domain
171  CHARACTER(LEN=*) ,INTENT(IN) :: HCOMMENT ! Comment string a la Surfex
172 INTEGER(KIND=JPIM) ,INTENT(IN) :: KFREQOP ! Sampling frequency, in minutes
173 !
174 ! Local variables
175 !
176 LOGICAL :: GISDEF, GGRIDDEF
177 INTEGER :: IPO,IPF
178 !
179 REAL(KIND=JPRB) :: ZHOOK_HANDLE
180 !
181 #ifdef WXIOS
182 TYPE(xios_field) :: field_hdl, other_field_hdl
183 TYPE(xios_fieldgroup) :: fieldgroup_hdl
184 TYPE(xios_file) :: file_hdl
185 #endif
186 !
187 IF (lhook) CALL dr_hook('SFX_XIOS_DECLARE_FIELD',0,zhook_handle)
188 !
189 #ifdef WXIOS
190 !
191 !$OMP SINGLE
192 !
193 ! ----------------------------------------------------------------------
194 ! We are still in the XIOS init phase => Define field if necessary
195 ! ----------------------------------------------------------------------
196 !
197 IF (.NOT. xios_is_valid_field(hrec)) THEN
198 
199  CALL xios_get_handle("field_definition",fieldgroup_hdl)
200  CALL xios_add_child(fieldgroup_hdl,field_hdl,hrec)
201  !IF (.NOT. XIOS_IS_VALID_FIELD("default_field")) &
202  ! CALL ABOR1_SFX('sfx_xios_check_field:cannot output field '//HREC//' : no default_field is defined')
203  CALL xios_set_attr(field_hdl,name=hrec)
204  !
205  ! ----------------------------------------------------------------------
206  ! If default_ouput file is defined, add this field to it
207  ! ----------------------------------------------------------------------
208  !
209  IF ( xios_is_valid_file(coutput_default)) THEN
210  CALL xios_get_handle(coutput_default,file_hdl)
211  CALL xios_add_child(file_hdl,field_hdl)
212  CALL xios_set_attr(field_hdl,field_ref=hrec)
213  ENDIF
214 
215 ENDIF
216 !
217 ! ----------------------------------------------------------------------
218 ! If field attribute 'domain' is not defined, set it
219 ! ----------------------------------------------------------------------
220 !
221  CALL xios_is_defined_field_attr(hrec,grid_ref=ggriddef)
222  CALL xios_is_defined_field_attr(hrec,domain_ref=gisdef)
223 !
224 IF ( .NOT. gisdef .AND. .NOT. ggriddef ) THEN
225  IF (trim(hdomain)=='') &
226  CALL abor1_sfx('SFX_XIOS_DECLARE_FIELD_INTERNAL : MUST PROVIDE HDOMAIN '//hrec)
227  !if (trim(hrec)=='PFRSO1') write(0,*) 'Setting domain for PFRSO1 !!!'
228  CALL xios_set_field_attr(hrec, domain_ref=trim(hdomain))
229  !CALL XIOS_SET_FIELD_ATTR(HREC, grid_ref=TRIM(HDOMAIN))
230 ELSE
231  !write(0,*) 'Field '//trim(hrec)//' already has a grid or domain:',GGRIDDEF,GISDEF
232 ENDIF
233 !
234 ! ----------------------------------------------------------------------
235 ! If prec is not defined , set it to the provided value (def : timestep)
236 ! ----------------------------------------------------------------------
237 !
238 ! CALL XIOS_IS_DEFINED_FIELD_ATTR(HREC,name=GISDEF)
239 !IF ( .NOT. GISDEF ) THEN
240 ! CALL XIOS_SET_FIELD_ATTR(HREC, name=trim(HREC))
241 !ENDIF
242 !
243 ! ------------------------------------------------------------------------
244 ! If field attribute 'unit' is not defined or empty, try to guess a value
245 ! from HCOMMENT (using rightmost string between parenthesis)
246 ! ------------------------------------------------------------------------
247 !
248  CALL xios_is_defined_field_attr(hrec,unit=gisdef)
249 IF ( .NOT. gisdef ) THEN
250  ipo=index(hcomment,"(",.true.)
251  ipf=index(hcomment,")",.true.)
252  IF ( (ipo > 0) .AND. (ipf>ipo+1) ) THEN
253  CALL xios_set_field_attr(hrec,unit=hcomment(ipo+1:ipf-1))
254  ENDIF
255 ENDIF
256 !
257 ! ----------------------------------------------------------------------
258 ! If field attribute 'long_name' is not defined or empty, set it
259 ! ----------------------------------------------------------------------
260 !
261  CALL xios_is_defined_field_attr(hrec,long_name=gisdef)
262 IF ( .NOT. gisdef .AND. (trim(hcomment) /= '') ) THEN
263  IF (ipo > 1) THEN
264  CALL xios_set_field_attr(hrec,long_name=trim(hcomment(1:ipo-1)))
265  ELSE
266  CALL xios_set_field_attr(hrec,long_name=trim(hcomment(:)))
267  ENDIF
268 ENDIF
269 !
270 ! ----------------------------------------------------------------------
271 ! Set default value to Surfex's one
272 ! ----------------------------------------------------------------------
273 !
274  CALL xios_set_field_attr(hrec,default_value=xundef)
275 !
276 !$OMP END SINGLE
277 #endif
278 !
279 IF (lhook) CALL dr_hook('SFX_XIOS_DECLARE_FIELD_INTERNAL',1,zhook_handle)
280 ! ----------------------------------------------------------------------
281 !
282 END SUBROUTINE sfx_xios_declare_field_internal
283 
284 SUBROUTINE sfx_xios_declare_axis_internal(HREC, HAXIS, KLEV, OSECOND)
285 !
286 USE yomhook , ONLY : lhook, dr_hook
287 USE parkind1 , ONLY : jprb
288 !
289 #ifdef WXIOS
290 USE xios
291 #endif
292 !
293 USE modi_abor1_sfx
294 !
295 !
296 IMPLICIT NONE
297 !
298 ! Arguments
299 !
300  CHARACTER(LEN=*) ,INTENT(IN) :: HREC ! field id
301  CHARACTER(LEN=*) ,INTENT(IN) :: HAXIS ! axis name
302 INTEGER ,INTENT(IN) :: KLEV ! axis size
303 LOGICAL ,INTENT(IN),OPTIONAL :: OSECOND ! Is it a second axis
304 !
305 ! Local variables
306 !
307 LOGICAL :: GISDEF, GGRIDDEF, GVALID_AXIS
308  CHARACTER(1000) :: YAXIS
309 INTEGER :: INGLO
310 REAL(KIND=JPRB) :: ZHOOK_HANDLE
311 !
312 IF (lhook) CALL dr_hook('SFX_XIOS_DECLARE_AXIS_INTERNAL',0,zhook_handle)
313 !
314 #ifdef WXIOS
315  CALL xios_is_defined_field_attr(hrec,grid_ref=ggriddef)
316 IF (.NOT. ggriddef ) THEN
317  ! If an axis is already declared, just do nothing, except
318  ! if it is second call
319  CALL xios_is_defined_field_attr(hrec,axis_ref=gisdef)
320  IF ( .NOT. gisdef .OR. PRESENT(osecond)) THEN
321  IF ( trim(haxis) == '') THEN
322  gvalid_axis=.false.
323  IF (PRESENT(osecond)) THEN
324  yaxis='dim2_for_'//trim(hrec)
325  ELSE
326  yaxis='dim_for_'//trim(hrec)
327  ENDIF
328  ELSE
329  gvalid_axis=xios_is_valid_axis(trim(haxis))
330  yaxis=trim(haxis)
331  ENDIF
332  IF (.NOT. gvalid_axis) THEN
333  IF ( klev /= 0) THEN
334  CALL set_axis(trim(haxis),ksize=klev)
335  !write(0,*) 'calling set_axis for '//trim(yaxis)//" "//HREC ; call flush(0)
336  ELSE
337  CALL abor1_sfx('SFX_XIOS_DECLARE_FIELD:SFX_XIOS_DECLARE_AXIS_INTERNAL'//&
338  ': MUST PROVIDE KLEV OR AN ALREADY DECLARED HAXIS for '//hrec)
339  ENDIF
340  ENDIF
341  CALL xios_set_field_attr(hrec, axis_ref=trim(yaxis))
342  ELSE
343  !write(0,*) 'An axis is already defined for '//HREC ; call flush(0)
344  ENDIF
345 ELSE
346  !write(0,*) 'A grid is already defined for '//HREC ; call flush(0)
347 ENDIF
348 #endif
349 !
350 IF (lhook) CALL dr_hook('SFX_XIOS_DECLARE_AXIS_INTERNAL',1,zhook_handle)
351 !
352 END SUBROUTINE sfx_xios_declare_axis_internal
353 
354 END SUBROUTINE sfx_xios_declare_field
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
integer, parameter jpim
Definition: parkind1.F90:13
subroutine set_axis(HNAME, PVALUE, CDPOSITIVE, KSIZE, CDUNITS, PBOUNDS)
Definition: set_axis.F90:6
quick &counting sorts only inumt inumt name
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
logical lxios_def_closed
Definition: modd_xios.F90:54
integer, parameter jprb
Definition: parkind1.F90:32
subroutine sfx_xios_declare_field_internal(HREC, HDOMAIN, HCOMMENT, KFREQOP)
character(len=30) ypatch_dim_name
Definition: modd_xios.F90:63
logical lhook
Definition: yomhook.F90:15
subroutine sfx_xios_declare_field(HREC, HDOMAIN, HAXIS, KLEV, HAXIS2, KLEV2, HCOMMENT, KFREQOP)
subroutine sfx_xios_declare_axis_internal(HREC, HAXIS, KLEV, OSECOND)
ERROR in index
Definition: ecsort_shared.h:90
character(len=14) coutput_default
Definition: modd_xios.F90:47
integer nbase_xios_freq
Definition: modd_xios.F90:50