SURFEX v8.1
General documentation of Surfex
write_surf_xios.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 write_surf_xios(HREC, HCOMMENT, KFIELD, PFIELD, OFIELD, HFIELD, PFIELD1, PFIELD2, PFIELD3, HAXIS, HAXIS2)
6 !!
7 !!
8 !! PURPOSE
9 !! --------
10 !!
11 !! Use XIOS API to provide usual behaviour for write_surf_xx routines, namely either :
12 !! - 'write' a scalar , here by defining a NetCDF global attribute in
13 !! default Surfex diags file (be it a real, double, integer or string)
14 !! - or 'write' a field, here using sfx_xios_send_block
15 !!
16 !! Thanks to the routine called (sfx_xios_send_block) this routine can be called
17 !! both during XIOS context intialization phase (it will declare the field to XIOS
18 !! if needed) and afterwrads, for actual output
19 !!
20 !! This routine will not work properly if more (or less) than one of the optional
21 !! field args is actually provided
22 !!
23 !! EXTERNAL
24 !! --------
25 !!
26 !! XIOS LIBRARY
27 !!
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 08/2015
45 !!
46 !-------------------------------------------------------------------------------
47 !
48 !* 0. DECLARATIONS
49 ! ------------
50 !
51 #ifdef WXIOS
53 USE xios
54 !
55 USE modi_sfx_xios_declare_field
56 USE modi_sfx_xios_send_block
57 #endif
58 !
59 USE modd_surf_par, ONLY : xundef
60 !
61 USE yomhook ,ONLY : lhook, dr_hook
62 USE parkind1 ,ONLY : jprb
63 !
64 USE modi_abor1_sfx
65 !
66 IMPLICIT NONE
67 !
68 ! Arguments
69 !
70  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the field
71  CHARACTER(LEN=*), INTENT(IN) :: HCOMMENT !
72 !
73 INTEGER , INTENT(IN), OPTIONAL :: KFIELD ! value
74 REAL , INTENT(IN), OPTIONAL :: PFIELD ! value
75 REAL,DIMENSION(:), INTENT(IN), OPTIONAL :: PFIELD1 ! value
76 REAL,DIMENSION(:,:) ,INTENT(IN), OPTIONAL :: PFIELD2 ! value
77 REAL,DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PFIELD3 ! value
78 LOGICAL , INTENT(IN), OPTIONAL :: OFIELD ! value
79  CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HFIELD ! value
80  CHARACTER(LEN=*) , INTENT(IN), OPTIONAL :: HAXIS ! Name of 2nd dimension. Not necessary even for a 2d field
81  CHARACTER(LEN=*) , INTENT(IN) , OPTIONAL :: HAXIS2 ! Name of 3rd dimension
82 !
83 ! Local variables
84 !
85  CHARACTER(LEN=1000) :: YAXIS, YAXIS2
86  CHARACTER(LEN=1000) :: YNAME
87  CHARACTER(LEN=10) :: YLVL
88 LOGICAL :: GRET
89 INTEGER :: JI
90 !
91 REAL(KIND=JPRB) :: ZHOOK_HANDLE
92 !
93 #ifdef WXIOS
94 TYPE(xios_variable) :: var_hdl
95 TYPE(xios_file) :: file_hdl
96 #endif
97 !
98 IF (lhook) CALL dr_hook('WRITE_SURF_XIOS',0,zhook_handle)
99 !
100 #ifdef WXIOS
101 !$OMP SINGLE
102 !
103 IF (PRESENT(kfield) .OR. PRESENT(pfield) .OR. PRESENT(hfield) .OR. PRESENT(ofield)) THEN
104  !
105  ! Case of writing a scalar
106  !
107  IF (.NOT. lxios_def_closed) THEN
108  !
109  ! ----------------------------------------------------------------------
110  ! We are still in the XIOS init phase ->
111  ! Create a NetCDF file attribute using an XIOS variable , in default
112  ! output file (if it is a valid file) , and set the value
113  ! ----------------------------------------------------------------------
114  !
115 !doesn't work for the moment
116 ! IF ( XIOS_IS_VALID_FILE(COUTPUT_DEFAULT)) THEN
117 !
118 ! CALL XIOS_GET_HANDLE(COUTPUT_DEFAULT,file_hdl)
119 ! CALL XIOS_ADD_CHILD(file_hdl,var_hdl,HREC)
120 !
121 ! IF (PRESENT(KFIELD) ) THEN
122 ! CALL XIOS_SET_ATTR(var_hdl,type="int")
123 ! GRET = XIOS_SETVAR(HREC,KFIELD)
124 ! ENDIF
125 ! IF (PRESENT(PFIELD)) THEN
126 ! CALL XIOS_SET_ATTR(var_hdl,type="float")
127 ! GRET = XIOS_SETVAR(HREC,PFIELD)
128 ! ENDIF
129 ! IF (PRESENT(OFIELD)) THEN
130 ! CALL XIOS_SET_ATTR(var_hdl,type="bool")
131 ! GRET = XIOS_SETVAR(HREC,OFIELD)
132 ! ENDIF
133 ! IF (PRESENT(HFIELD)) THEN
134 ! CALL XIOS_SET_ATTR(var_hdl,type="string")
135 ! GRET = XIOS_SETVAR(HREC,HFIELD)
136 ! ENDIF
137 !
138 ! ENDIF
139 
140  ENDIF
141  !
142 ELSE
143  !
144  ! The data is not a scalar, but a field.
145  !
146  IF (PRESENT(pfield1)) THEN
147 
148  IF (.NOT. lxios_def_closed ) THEN
149 
150  CALL sfx_xios_declare_field(hrec, yxios_domain, hcomment=hcomment)
151 
152  ELSE
153 
154 ! IF (XIOS_IS_VALID_FIELD(HREC)) THEN
155 ! IF (XIOS_FIELD_IS_ACTIVE(HREC)) THEN
156  CALL sfx_xios_send_block(hrec,pfield=pfield1)
157 ! ENDIF
158 ! ENDIF
159 
160  ENDIF
161  !
162  ELSE IF (PRESENT(pfield2)) THEN
163 
164  yaxis=''
165  IF (PRESENT(haxis)) yaxis = trim(haxis)
166  !
167  ! Patch dimension is never used in output files
168  !
169  IF (trim(yaxis) /= trim(ypatch_dim_name)) THEN
170 
171  IF (.NOT. lxios_def_closed ) THEN
172  CALL sfx_xios_declare_field(hrec, yxios_domain, haxis=yaxis, klev=SIZE(pfield2,2), hcomment=hcomment)
173  ELSE
174  CALL sfx_xios_send_block(hrec,pfield2=pfield2)
175  ENDIF
176 
177  ELSE ! Per-patch fields are written through a loop, and with patch number suffix
178 
179  DO ji=1,SIZE(pfield2,2)
180 
181  IF (ji < 10) THEN
182  WRITE(ylvl,'(I1)') ji
183  ELSE
184  WRITE(ylvl,'(I2)') ji
185  ENDIF
186  yname=hrec//'_'//trim(ylvl)
187 
188  IF (.NOT. lxios_def_closed ) THEN
189  CALL sfx_xios_declare_field(trim(yname), yxios_domain, hcomment=hcomment)
190  ELSE
191  CALL sfx_xios_send_block(trim(yname),pfield=pfield2(:,ji))
192  ENDIF
193 
194  ENDDO
195 
196  ENDIF
197  !
198  ELSE IF (PRESENT(pfield3)) THEN
199 
200  yaxis=''
201  IF (PRESENT(haxis)) yaxis=trim(haxis)
202 
203  IF (trim(yaxis) /= trim(ypatch_dim_name)) THEN
204 
205  ! Assume that dimension 2 is patch number and iterate on it
206  DO ji=1,SIZE(pfield3,2)
207  IF (ji < 10) THEN
208  WRITE(ylvl,'(I1)') ji
209  ELSE
210  WRITE(ylvl,'(I2)') ji
211  ENDIF
212  yname=hrec//'_'//trim(ylvl)
213 
214  IF (.NOT. lxios_def_closed ) THEN
215  CALL sfx_xios_declare_field(yname, yxios_domain, hcomment=hcomment)
216  ELSE
217  CALL sfx_xios_send_block(yname,pfield2=pfield3(:,ji,:))
218  ENDIF
219 
220  ENDDO
221 
222  ELSE
223 
224  IF (.NOT. lxios_def_closed ) THEN
225 
226  yaxis2=''
227  IF (PRESENT(haxis2)) yaxis2=haxis2
228  CALL sfx_xios_declare_field(hrec, yxios_domain, haxis=yaxis, haxis2=yaxis2, hcomment=hcomment,&
229  klev=SIZE(pfield2,2), klev2=SIZE(pfield3,3))
230  ELSE
231  CALL sfx_xios_send_block(yname,pfield3=pfield3)
232  ENDIF
233 
234  ENDIF
235 
236  ENDIF
237 
238 ENDIF
239 !
240 !$OMP END SINGLE
241 #endif
242 !
243 IF (lhook) CALL dr_hook('WRITE_SURF_XIOS',1,zhook_handle)
244 ! ----------------------------------------------------------------------
245 !
246 END SUBROUTINE write_surf_xios
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine write_surf_xios(HREC, HCOMMENT, KFIELD, PFIELD, OFIELD, HFIELD, PFIELD1, PFIELD2, PFIELD3, HAXIS, HAXIS2)
real, parameter xundef
logical lxios_def_closed
Definition: modd_xios.F90:54
integer, parameter jprb
Definition: parkind1.F90:32
subroutine sfx_xios_send_block(HDTAG, PFIELD, PFIELD2, PFIELD3, HDOMAIN, HAXIS, HAXIS2, HDCOMMENT, 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)
character(len=6) yxios_domain
Definition: modd_xios.F90:55
character(len=14) coutput_default
Definition: modd_xios.F90:47