1!
2!  Copyright (C) 2013, Northwestern University and Argonne National Laboratory
3!  See COPYRIGHT notice in top-level directory.
4!
5! $Id: attributes.f90 2519 2016-10-06 00:41:33Z wkliao $
6!
7! This file is taken from netcdf_attributes.f90 with changes for PnetCDF use
8!
9!
10
11  !
12  ! Attribute routines:
13  !
14  ! -------
15  function nf90mpi_copy_att(ncid_in, varid_in, name, ncid_out, varid_out)
16    integer,             intent(in) :: ncid_in,  varid_in
17    character (len = *), intent(in) :: name
18    integer,             intent(in) :: ncid_out, varid_out
19    integer                         :: nf90mpi_copy_att
20
21    nf90mpi_copy_att = nfmpi_copy_att(ncid_in, varid_in, name, ncid_out, varid_out)
22  end function nf90mpi_copy_att
23  ! -------
24  function nf90mpi_rename_att(ncid, varid, curname, newname)
25    integer,             intent(in) :: ncid,  varid
26    character (len = *), intent(in) :: curname, newname
27    integer                         :: nf90mpi_rename_att
28
29    nf90mpi_rename_att = nfmpi_rename_att(ncid, varid, curname, newname)
30  end function nf90mpi_rename_att
31  ! -------
32  function nf90mpi_del_att(ncid, varid, name)
33    integer,             intent(in) :: ncid, varid
34    character (len = *), intent(in) :: name
35    integer                         :: nf90mpi_del_att
36
37    nf90mpi_del_att = nfmpi_del_att(ncid, varid, name)
38  end function nf90mpi_del_att
39  ! -------
40  ! Attribute inquiry functions
41  ! -------
42  function nf90mpi_inq_attname(ncid, varid, attnum, name)
43    integer,             intent( in) :: ncid, varid, attnum
44    character (len = *), intent(out) :: name
45    integer                          :: nf90mpi_inq_attname
46
47    nf90mpi_inq_attname = nfmpi_inq_attname(ncid, varid, attnum, name)
48  end function nf90mpi_inq_attname
49  ! -------
50  function nf90mpi_inquire_attribute(ncid, varid, name, xtype, len, attnum)
51    integer,                                  intent( in) :: ncid, varid
52    character (len = *),                      intent( in) :: name
53    integer,                        optional, intent(out) :: xtype, attnum
54    integer (kind=MPI_OFFSET_KIND), optional, intent(out) :: len
55    integer                                    :: nf90mpi_inquire_attribute
56
57    integer                                    :: local_xtype
58    integer (kind=MPI_OFFSET_KIND)             :: local_len
59
60    ! Do we need to worry about not saving the state from this call?
61    if(present(attnum)) &
62      nf90mpi_inquire_attribute = nfmpi_inq_attid(ncid, varid, name, attnum)
63
64    nf90mpi_inquire_attribute   = nfmpi_inq_att  (ncid, varid, name, local_xtype, local_len)
65
66    if(present(xtype)) xtype = local_xtype
67    if(present(len  )) len   = local_len
68  end function nf90mpi_inquire_attribute
69  ! -------
70  ! Put and get functions; these will get overloaded
71  ! -------
72  ! Text
73  ! -------
74  function nf90mpi_put_att_text(ncid, varid, name, values)
75    integer,                          intent(in) :: ncid, varid
76    character(len = *),               intent(in) :: name
77    character(len = *),               intent(in) :: values
78    integer                                      :: nf90mpi_put_att_text
79    integer (kind=MPI_OFFSET_KIND)               :: ilen
80
81    ilen = len_trim(values)
82    nf90mpi_put_att_text = nfmpi_put_att_text(ncid, varid, name, ilen, trim(values))
83  end function nf90mpi_put_att_text
84  ! -------
85  function nf90mpi_get_att_text(ncid, varid, name, values)
86    integer,                          intent( in) :: ncid, varid
87    character(len = *),               intent( in) :: name
88    character(len = *),               intent(out) :: values
89    integer                                       :: nf90mpi_get_att_text
90
91    values = ' '  !! make sure result will be blank padded
92    nf90mpi_get_att_text = nfmpi_get_att_text(ncid, varid, name, values)
93  end function nf90mpi_get_att_text
94  ! -------
95  ! Integer attributes
96  ! -------
97  function nf90mpi_put_att_OneByteInt(ncid, varid, name, values)
98    integer,                                    intent( in) :: ncid, varid
99    character(len = *),                         intent( in) :: name
100    integer (kind =  OneByteInt), dimension(:), intent( in) :: values
101    integer                                                 :: nf90mpi_put_att_OneByteInt
102    integer (kind=MPI_OFFSET_KIND)                          :: ilen
103
104    ilen = size(values)
105    nf90mpi_put_att_OneByteInt = nfmpi_put_att_int1(ncid, varid, name, nf90_int1, ilen, values)
106  end function nf90mpi_put_att_OneByteInt
107  ! -------
108  function nf90mpi_put_att_one_OneByteInt(ncid, varid, name, values)
109    integer,                                    intent( in) :: ncid, varid
110    character(len = *),                         intent( in) :: name
111    integer (kind =  OneByteInt),               intent( in) :: values
112    integer                                                 :: nf90mpi_put_att_one_OneByteInt
113    integer (kind =  OneByteInt), dimension(1)              :: valuesA
114
115    valuesA(1) = values
116    nf90mpi_put_att_one_OneByteInt = nfmpi_put_att_int1(ncid, varid, name, nf90_int1, 1_MPI_OFFSET_KIND, valuesA)
117  end function nf90mpi_put_att_one_OneByteInt
118  ! -------
119  function nf90mpi_get_att_OneByteInt(ncid, varid, name, values)
120    integer,                                    intent( in) :: ncid, varid
121    character(len = *),                         intent( in) :: name
122    integer (kind =  OneByteInt), dimension(:), intent(out) :: values
123    integer                                                 :: nf90mpi_get_att_OneByteInt
124
125    nf90mpi_get_att_OneByteInt = nfmpi_get_att_int1(ncid, varid, name, values)
126  end function nf90mpi_get_att_OneByteInt
127  ! -------
128  function nf90mpi_get_att_one_OneByteInt(ncid, varid, name, values)
129    integer,                                    intent( in) :: ncid, varid
130    character(len = *),                         intent( in) :: name
131    integer (kind =  OneByteInt),               intent(out) :: values
132    integer                                                 :: nf90mpi_get_att_one_OneByteInt
133    integer (kind =  OneByteInt), dimension(1)              :: valuesA
134
135    nf90mpi_get_att_one_OneByteInt = nfmpi_get_att_int1(ncid, varid, name, valuesA)
136    values = valuesA(1)
137  end function nf90mpi_get_att_one_OneByteInt
138  ! -------
139  function nf90mpi_put_att_TwoByteInt(ncid, varid, name, values)
140    integer,                                    intent(in)  :: ncid, varid
141    character(len = *),                         intent(in)  :: name
142    integer (kind =  TwoByteInt), dimension(:), intent(in)  :: values
143    integer                                                 :: nf90mpi_put_att_TwoByteInt
144    integer (kind=MPI_OFFSET_KIND)                          :: ilen
145
146    ilen = size(values)
147    nf90mpi_put_att_TwoByteInt = nfmpi_put_att_int2(ncid, varid, name, nf90_int2, ilen, values)
148  end function nf90mpi_put_att_TwoByteInt
149  ! -------
150  function nf90mpi_put_att_one_TwoByteInt(ncid, varid, name, values)
151    integer,                                    intent(in)  :: ncid, varid
152    character(len = *),                         intent(in)  :: name
153    integer (kind =  TwoByteInt),               intent(in)  :: values
154    integer                                                 :: nf90mpi_put_att_one_TwoByteInt
155    integer (kind =  TwoByteInt), dimension(1)              :: valuesA
156
157    valuesA(1) = values
158    nf90mpi_put_att_one_TwoByteInt = nfmpi_put_att_int2(ncid, varid, name, nf90_int2, 1_MPI_OFFSET_KIND, valuesA)
159  end function nf90mpi_put_att_one_TwoByteInt
160  ! -------
161  function nf90mpi_get_att_TwoByteInt(ncid, varid, name, values)
162    integer,                                    intent( in) :: ncid, varid
163    character(len = *),                         intent( in) :: name
164    integer (kind =  TwoByteInt), dimension(:), intent(out) :: values
165    integer                                                 :: nf90mpi_get_att_TwoByteInt
166
167    nf90mpi_get_att_TwoByteInt = nfmpi_get_att_int2(ncid, varid, name, values)
168  end function nf90mpi_get_att_TwoByteInt
169  ! -------
170  function nf90mpi_get_att_one_TwoByteInt(ncid, varid, name, values)
171    integer,                                    intent( in) :: ncid, varid
172    character(len = *),                         intent( in) :: name
173    integer (kind =  TwoByteInt),               intent(out) :: values
174    integer                                                 :: nf90mpi_get_att_one_TwoByteInt
175    integer (kind =  TwoByteInt), dimension(1)              :: valuesA
176
177    nf90mpi_get_att_one_TwoByteInt = nfmpi_get_att_int2(ncid, varid, name, valuesA)
178    values = valuesA(1)
179  end function nf90mpi_get_att_one_TwoByteInt
180  ! -------
181  function nf90mpi_put_att_FourByteInt(ncid, varid, name, values)
182    integer,                                    intent(in)  :: ncid, varid
183    character(len = *),                         intent(in)  :: name
184    integer (kind = FourByteInt), dimension(:), intent(in)  :: values
185    integer                                                 :: nf90mpi_put_att_FourByteInt
186    integer (kind=MPI_OFFSET_KIND)                          :: ilen
187
188    ilen = size(values)
189    nf90mpi_put_att_FourByteInt = nfmpi_put_att_int(ncid, varid, name, nf90_int, ilen, values)
190  end function nf90mpi_put_att_FourByteInt
191  ! -------
192  function nf90mpi_put_att_one_FourByteInt(ncid, varid, name, values)
193    integer,                                    intent(in)  :: ncid, varid
194    character(len = *),                         intent(in)  :: name
195    integer (kind = FourByteInt),               intent(in)  :: values
196    integer                                                 :: nf90mpi_put_att_one_FourByteInt
197    integer (kind = FourByteInt), dimension(1)              :: valuesA
198
199    valuesA(1) = int(values)
200    nf90mpi_put_att_one_FourByteInt = nfmpi_put_att_int(ncid, varid, name, nf90_int, 1_MPI_OFFSET_KIND, valuesA)
201  end function nf90mpi_put_att_one_FourByteInt
202  ! -------
203  function nf90mpi_get_att_FourByteInt(ncid, varid, name, values)
204    integer,                                    intent(in)  :: ncid, varid
205    character(len = *),                         intent(in)  :: name
206    integer (kind = FourByteInt), dimension(:), intent(out) :: values
207    integer                                                 :: nf90mpi_get_att_FourByteInt
208    integer, dimension(size(values))                        :: defaultInteger
209
210    nf90mpi_get_att_FourByteInt = nfmpi_get_att_int(ncid, varid, name, defaultInteger)
211    values(:) = defaultInteger(:)
212  end function nf90mpi_get_att_FourByteInt
213  ! -------
214  function nf90mpi_get_att_one_FourByteInt(ncid, varid, name, values)
215    integer,                                    intent(in)  :: ncid, varid
216    character(len = *),                         intent(in)  :: name
217    integer (kind = FourByteInt),               intent(out) :: values
218    integer                                                 :: nf90mpi_get_att_one_FourByteInt
219    integer, dimension(1)                                   :: defaultInteger
220
221    nf90mpi_get_att_one_FourByteInt = nfmpi_get_att_int(ncid, varid, name, defaultInteger)
222    values = defaultInteger(1)
223  end function nf90mpi_get_att_one_FourByteInt
224  ! -------
225  function nf90mpi_put_att_EightByteInt(ncid, varid, name, values)
226    integer,                                     intent(in) :: ncid, varid
227    character(len = *),                          intent(in) :: name
228    integer (kind = EightByteInt), dimension(:), intent(in) :: values
229    integer                                                 :: nf90mpi_put_att_EightByteInt
230    integer (kind=MPI_OFFSET_KIND)                          :: ilen
231
232    ilen = size(values)
233    nf90mpi_put_att_EightByteInt = nfmpi_put_att_int8(ncid, varid, name, nf90_int, ilen, values)
234  end function nf90mpi_put_att_EightByteInt
235  ! -------
236  function nf90mpi_put_att_one_EightByteInt(ncid, varid, name, values)
237    integer,                                     intent(in) :: ncid, varid
238    character(len = *),                          intent(in) :: name
239    integer (kind = EightByteInt),               intent(in) :: values
240    integer                                                 :: nf90mpi_put_att_one_EightByteInt
241
242    integer (kind = EightByteInt), dimension(1) :: valuesA
243    valuesA(1) = values
244    nf90mpi_put_att_one_EightByteInt = nfmpi_put_att_int8(ncid, varid, name, nf90_int, 1_MPI_OFFSET_KIND, valuesA)
245  end function nf90mpi_put_att_one_EightByteInt
246  ! -------
247  function nf90mpi_get_att_EightByteInt(ncid, varid, name, values)
248    integer,                                     intent(in)  :: ncid, varid
249    character(len = *),                          intent(in)  :: name
250    integer (kind = EightByteInt), dimension(:), intent(out) :: values
251    integer                                                  :: nf90mpi_get_att_EightByteInt
252
253    nf90mpi_get_att_EightByteInt = nfmpi_get_att_int8(ncid, varid, name, values)
254  end function nf90mpi_get_att_EightByteInt
255  ! -------
256  function nf90mpi_get_att_one_EightByteInt(ncid, varid, name, values)
257    integer,                                     intent(in)  :: ncid, varid
258    character(len = *),                          intent(in)  :: name
259    integer (kind = EightByteInt),               intent(out) :: values
260    integer                                                  :: nf90mpi_get_att_one_EightByteInt
261
262    integer (kind = EightByteInt), dimension(1) :: valuesA
263
264    nf90mpi_get_att_one_EightByteInt = nfmpi_get_att_int8(ncid, varid, name, valuesA)
265    values = valuesA(1)
266  end function nf90mpi_get_att_one_EightByteInt
267  ! -------
268  ! Real attributes
269  ! -------
270  function nf90mpi_put_att_FourByteReal(ncid, varid, name, values)
271    integer,                                   intent(in)  :: ncid, varid
272    character(len = *),                        intent(in)  :: name
273    real (kind =  FourByteReal), dimension(:), intent(in)  :: values
274    integer                                                :: nf90mpi_put_att_FourByteReal
275    integer (kind=MPI_OFFSET_KIND)                         :: ilen
276
277    ilen = size(values)
278    nf90mpi_put_att_FourByteReal = nfmpi_put_att_real(ncid, varid, name, nf90_real4, ilen, values)
279  end function nf90mpi_put_att_FourByteReal
280  ! -------
281  function nf90mpi_put_att_one_FourByteReal(ncid, varid, name, values)
282    integer,                                   intent(in)  :: ncid, varid
283    character(len = *),                        intent(in)  :: name
284    real (kind =  FourByteReal),               intent(in)  :: values
285    integer                                                :: nf90mpi_put_att_one_FourByteReal
286
287    real (kind =  FourByteReal), dimension(1) :: valuesA
288    valuesA(1) = values
289    nf90mpi_put_att_one_FourByteReal = nfmpi_put_att_real(ncid, varid, name, nf90_real4, 1_MPI_OFFSET_KIND, valuesA)
290  end function nf90mpi_put_att_one_FourByteReal
291  ! -------
292  function nf90mpi_get_att_FourByteReal(ncid, varid, name, values)
293    integer,                                   intent(in)  :: ncid, varid
294    character(len = *),                        intent(in)  :: name
295    real (kind =  FourByteReal), dimension(:), intent(out) :: values
296    integer                                                :: nf90mpi_get_att_FourByteReal
297
298    nf90mpi_get_att_FourByteReal = nfmpi_get_att_real(ncid, varid, name, values)
299  end function nf90mpi_get_att_FourByteReal
300  ! -------
301  function nf90mpi_get_att_one_FourByteReal(ncid, varid, name, values)
302    integer,                                   intent(in)  :: ncid, varid
303    character(len = *),                        intent(in)  :: name
304    real (kind =  FourByteReal),               intent(out) :: values
305    integer                                                :: nf90mpi_get_att_one_FourByteReal
306
307    real (kind =  FourByteReal), dimension(1) :: valuesA
308    nf90mpi_get_att_one_FourByteReal = nfmpi_get_att_real(ncid, varid, name, valuesA)
309    values = valuesA(1)
310  end function nf90mpi_get_att_one_FourByteReal
311  ! -------
312  function nf90mpi_put_att_EightByteReal(ncid, varid, name, values)
313    integer,                                   intent(in)  :: ncid, varid
314    character(len = *),                        intent(in)  :: name
315    real (kind = EightByteReal), dimension(:), intent(in)  :: values
316    integer                                                :: nf90mpi_put_att_EightByteReal
317    integer (kind=MPI_OFFSET_KIND)                         :: ilen
318
319    ilen = size(values)
320    nf90mpi_put_att_EightByteReal = nfmpi_put_att_double(ncid, varid, name, nf90_real8, ilen, values)
321  end function nf90mpi_put_att_EightByteReal
322  ! -------
323  function nf90mpi_put_att_one_EightByteReal(ncid, varid, name, values)
324    integer,                                   intent(in)  :: ncid, varid
325    character(len = *),                        intent(in)  :: name
326    real (kind = EightByteReal),               intent(in)  :: values
327    integer                                                :: nf90mpi_put_att_one_EightByteReal
328
329    real (kind = EightByteReal), dimension(1) :: valuesA
330    valuesA(1) = values
331    nf90mpi_put_att_one_EightByteReal = nfmpi_put_att_double(ncid, varid, name, nf90_real8, 1_MPI_OFFSET_KIND, valuesA)
332  end function nf90mpi_put_att_one_EightByteReal
333  ! -------
334  function nf90mpi_get_att_EightByteReal(ncid, varid, name, values)
335    integer,                                   intent(in)  :: ncid, varid
336    character(len = *),                        intent(in)  :: name
337    real (kind = EightByteReal), dimension(:), intent(out) :: values
338    integer                                                :: nf90mpi_get_att_EightByteReal
339
340    nf90mpi_get_att_EightByteReal = nfmpi_get_att_double(ncid, varid, name, values)
341  end function nf90mpi_get_att_EightByteReal
342  ! -------
343  function nf90mpi_get_att_one_EightByteReal(ncid, varid, name, values)
344    integer,                                   intent(in)  :: ncid, varid
345    character(len = *),                        intent(in)  :: name
346    real (kind = EightByteReal),               intent(out) :: values
347    integer                                                :: nf90mpi_get_att_one_EightByteReal
348
349    real (kind = EightByteReal), dimension(1) :: valuesA
350    nf90mpi_get_att_one_EightByteReal = nfmpi_get_att_double(ncid, varid, name, valuesA)
351    values = valuesA(1)
352  end function nf90mpi_get_att_one_EightByteReal
353  ! -------
354