1  !
2  ! Attribute routines:
3  !
4  ! -------
5  function nf90_copy_att(ncid_in, varid_in, name, ncid_out, varid_out)
6    integer,             intent( in) :: ncid_in,  varid_in
7    character (len = *), intent( in) :: name
8    integer,             intent( in) :: ncid_out, varid_out
9    integer                          :: nf90_copy_att
10
11    nf90_copy_att = nf_copy_att(ncid_in, varid_in, name, ncid_out, varid_out)
12  end function nf90_copy_att
13  ! -------
14  function nf90_rename_att(ncid, varid, curname, newname)
15    integer,             intent( in) :: ncid,  varid
16    character (len = *), intent( in) :: curname, newname
17    integer                          :: nf90_rename_att
18
19    nf90_rename_att = nf_rename_att(ncid, varid, curname, newname)
20  end function nf90_rename_att
21  ! -------
22  function nf90_del_att(ncid, varid, name)
23    integer,             intent( in) :: ncid, varid
24    character (len = *), intent( in) :: name
25    integer                          :: nf90_del_att
26
27    nf90_del_att = nf_del_att(ncid, varid, name)
28  end function nf90_del_att
29  ! -------
30  ! Attribute inquiry functions
31  ! -------
32  function nf90_inq_attname(ncid, varid, attnum, name)
33    integer,             intent( in) :: ncid, varid, attnum
34    character (len = *), intent(out) :: name
35    integer                          :: nf90_inq_attname
36
37    nf90_inq_attname = nf_inq_attname(ncid, varid, attnum, name)
38  end function nf90_inq_attname
39  ! -------
40  function nf90_inquire_attribute(ncid, varid, name, xtype, len, attnum)
41    integer,             intent( in)           :: ncid, varid
42    character (len = *), intent( in)           :: name
43    integer,             intent(out), optional :: xtype, len, attnum
44    integer                                    :: nf90_inquire_attribute
45
46    integer                          :: local_xtype, local_len
47
48    ! Do we need to worry about not saving the state from this call?
49    if(present(attnum)) &
50      nf90_inquire_attribute = nf_inq_attid(ncid, varid, name, attnum)
51    nf90_inquire_attribute   = nf_inq_att  (ncid, varid, name, local_xtype, local_len)
52    if(present(xtype)) xtype = local_xtype
53    if(present(len  )) len   = local_len
54  end function nf90_inquire_attribute
55  ! -------
56  ! Put and get functions; these will get overloaded
57  ! -------
58  ! Text
59  ! -------
60  function nf90_put_att_text(ncid, varid, name, values)
61    integer,                          intent( in) :: ncid, varid
62    character(len = *),               intent( in) :: name
63    character(len = *),               intent( in) :: values
64    integer                                       :: nf90_put_att_text
65
66    nf90_put_att_text = nf_put_att_text(ncid, varid, name, len_trim(values), trim(values))
67  end function nf90_put_att_text
68  ! -------
69  function nf90_get_att_text(ncid, varid, name, values)
70    integer,                          intent( in) :: ncid, varid
71    character(len = *),               intent( in) :: name
72    character(len = *),               intent(out) :: values
73    integer                                       :: nf90_get_att_text
74
75    values = ' '  !! make sure result will be blank padded
76    nf90_get_att_text = nf_get_att_text(ncid, varid, name, values)
77  end function nf90_get_att_text
78  ! -------
79  ! Integer attributes
80  ! -------
81  function nf90_put_att_OneByteInt(ncid, varid, name, values)
82    integer,                                    intent( in) :: ncid, varid
83    character(len = *),                         intent( in) :: name
84    integer (kind =  OneByteInt), dimension(:), intent( in) :: values
85    integer                                                 :: nf90_put_att_OneByteInt
86
87    nf90_put_att_OneByteInt = nf_put_att_int1(ncid, varid, name, nf90_int1, size(values), values)
88  end function nf90_put_att_OneByteInt
89  ! -------
90  function nf90_put_att_one_OneByteInt(ncid, varid, name, values)
91    integer,                                    intent( in) :: ncid, varid
92    character(len = *),                         intent( in) :: name
93    integer (kind =  OneByteInt),               intent( in) :: values
94    integer                                                 :: nf90_put_att_one_OneByteInt
95
96    integer (kind =  OneByteInt), dimension(1)              :: valuesA
97    valuesA(1) = values
98    nf90_put_att_one_OneByteInt = nf_put_att_int1(ncid, varid, name, nf90_int1, 1, valuesA)
99  end function nf90_put_att_one_OneByteInt
100  ! -------
101  function nf90_get_att_OneByteInt(ncid, varid, name, values)
102    integer,                                    intent( in) :: ncid, varid
103    character(len = *),                         intent( in) :: name
104    integer (kind =  OneByteInt), dimension(:), intent(out) :: values
105    integer                                                 :: nf90_get_att_OneByteInt
106
107    nf90_get_att_OneByteInt = nf_get_att_int1(ncid, varid, name, values)
108  end function nf90_get_att_OneByteInt
109  ! -------
110  function nf90_get_att_one_OneByteInt(ncid, varid, name, values)
111    integer,                                    intent( in) :: ncid, varid
112    character(len = *),                         intent( in) :: name
113    integer (kind =  OneByteInt),               intent(out) :: values
114    integer                                                 :: nf90_get_att_one_OneByteInt
115
116    integer (kind =  OneByteInt), dimension(1)              :: valuesA
117    nf90_get_att_one_OneByteInt = nf_get_att_int1(ncid, varid, name, valuesA)
118    values = valuesA(1)
119  end function nf90_get_att_one_OneByteInt
120  ! -------
121  function nf90_put_att_TwoByteInt(ncid, varid, name, values)
122    integer,                                    intent( in) :: ncid, varid
123    character(len = *),                         intent( in) :: name
124    integer (kind =  TwoByteInt), dimension(:), intent( in) :: values
125    integer                                                 :: nf90_put_att_TwoByteInt
126
127    nf90_put_att_TwoByteInt = nf_put_att_int2(ncid, varid, name, nf90_int2, size(values), values)
128  end function nf90_put_att_TwoByteInt
129  ! -------
130  function nf90_put_att_one_TwoByteInt(ncid, varid, name, values)
131    integer,                                    intent( in) :: ncid, varid
132    character(len = *),                         intent( in) :: name
133    integer (kind =  TwoByteInt),               intent( in) :: values
134    integer                                                 :: nf90_put_att_one_TwoByteInt
135
136    integer (kind =  TwoByteInt), dimension(1)              :: valuesA
137    valuesA(1) = values
138    nf90_put_att_one_TwoByteInt = nf_put_att_int2(ncid, varid, name, nf90_int2, 1, valuesA)
139  end function nf90_put_att_one_TwoByteInt
140  ! -------
141  function nf90_get_att_TwoByteInt(ncid, varid, name, values)
142    integer,                                    intent( in) :: ncid, varid
143    character(len = *),                         intent( in) :: name
144    integer (kind =  TwoByteInt), dimension(:), intent(out) :: values
145    integer                                                 :: nf90_get_att_TwoByteInt
146
147    nf90_get_att_TwoByteInt = nf_get_att_int2(ncid, varid, name, values)
148  end function nf90_get_att_TwoByteInt
149  ! -------
150  function nf90_get_att_one_TwoByteInt(ncid, varid, name, values)
151    integer,                                    intent( in) :: ncid, varid
152    character(len = *),                         intent( in) :: name
153    integer (kind =  TwoByteInt),               intent(out) :: values
154    integer                                                 :: nf90_get_att_one_TwoByteInt
155
156    integer (kind =  TwoByteInt), dimension(1)              :: valuesA
157    nf90_get_att_one_TwoByteInt = nf_get_att_int2(ncid, varid, name, valuesA)
158    values = valuesA(1)
159  end function nf90_get_att_one_TwoByteInt
160  ! -------
161  function nf90_put_att_FourByteInt(ncid, varid, name, values)
162    integer,                                    intent( in) :: ncid, varid
163    character(len = *),                         intent( in) :: name
164    integer (kind = FourByteInt), dimension(:), intent( in) :: values
165    integer                                                 :: nf90_put_att_FourByteInt
166
167    nf90_put_att_FourByteInt = nf_put_att_int(ncid, varid, name, nf90_int, size(values), int(values))
168  end function nf90_put_att_FourByteInt
169  ! -------
170  function nf90_put_att_one_FourByteInt(ncid, varid, name, values)
171    integer,                                    intent( in) :: ncid, varid
172    character(len = *),                         intent( in) :: name
173    integer (kind = FourByteInt),               intent( in) :: values
174    integer                                                 :: nf90_put_att_one_FourByteInt
175
176    integer (kind = FourByteInt), dimension(1)              :: valuesA
177    valuesA(1) = int(values)
178    nf90_put_att_one_FourByteInt = nf_put_att_int(ncid, varid, name, nf90_int, 1, int(valuesA))
179  end function nf90_put_att_one_FourByteInt
180  ! -------
181  function nf90_get_att_FourByteInt(ncid, varid, name, values)
182    integer,                                    intent( in) :: ncid, varid
183    character(len = *),                         intent( in) :: name
184    integer (kind = FourByteInt), dimension(:), intent(out) :: values
185    integer                                                 :: nf90_get_att_FourByteInt
186
187    integer, dimension(size(values)) :: defaultInteger
188
189    nf90_get_att_FourByteInt = nf_get_att_int(ncid, varid, name, defaultInteger)
190    values(:) = defaultInteger(:)
191  end function nf90_get_att_FourByteInt
192  ! -------
193  function nf90_get_att_one_FourByteInt(ncid, varid, name, values)
194    integer,                                    intent( in) :: ncid, varid
195    character(len = *),                         intent( in) :: name
196    integer (kind = FourByteInt),               intent(out) :: values
197    integer                                                 :: nf90_get_att_one_FourByteInt
198
199    integer, dimension(1) :: defaultInteger
200
201    nf90_get_att_one_FourByteInt = nf_get_att_int(ncid, varid, name, defaultInteger)
202    values = defaultInteger(1)
203  end function nf90_get_att_one_FourByteInt
204  ! -------
205  function nf90_put_att_EightByteInt(ncid, varid, name, values)
206    integer,                                     intent( in) :: ncid, varid
207    character(len = *),                          intent( in) :: name
208    integer (kind = EightByteInt), dimension(:), intent( in) :: values
209    integer                                                  :: nf90_put_att_EightByteInt
210
211    nf90_put_att_EightByteInt = nf_put_att_int64(ncid, varid, name, nf90_int64, size(values), values)
212  end function nf90_put_att_EightByteInt
213  ! -------
214  function nf90_put_att_one_EightByteInt(ncid, varid, name, values)
215    integer,                                     intent( in) :: ncid, varid
216    character(len = *),                          intent( in) :: name
217    integer (kind = EightByteInt),               intent( in) :: values
218    integer                                                  :: nf90_put_att_one_EightByteInt
219
220    integer(kind=EightByteInt), dimension(1) :: valuesA
221    valuesA(1) = values
222    nf90_put_att_one_EightByteInt = nf_put_att_int64(ncid, varid, name, nf90_int64, 1, valuesA)
223  end function nf90_put_att_one_EightByteInt
224  ! -------
225  function nf90_get_att_EightByteInt(ncid, varid, name, values)
226    integer,                                     intent( in) :: ncid, varid
227    character(len = *),                          intent( in) :: name
228    integer (kind = EightByteInt), dimension(:), intent(out) :: values
229    integer                                                  :: nf90_get_att_EightByteInt
230
231    nf90_get_att_EightByteInt = nf_get_att_int64(ncid, varid, name, values)
232  end function nf90_get_att_EightByteInt
233  ! -------
234  function nf90_get_att_one_EightByteInt(ncid, varid, name, values)
235    integer,                                     intent( in) :: ncid, varid
236    character(len = *),                          intent( in) :: name
237    integer (kind = EightByteInt),               intent(out) :: values
238    integer                                                  :: nf90_get_att_one_EightByteInt
239
240    integer(kind=EightByteInt), dimension(1) :: valuesA
241
242    nf90_get_att_one_EightByteInt = nf_get_att_int64(ncid, varid, name, valuesA)
243    values = valuesA(1)
244  end function nf90_get_att_one_EightByteInt
245  ! -------
246  ! Real attributes
247  ! -------
248  function nf90_put_att_FourByteReal(ncid, varid, name, values)
249    integer,                                   intent( in) :: ncid, varid
250    character(len = *),                        intent( in) :: name
251    real (kind =  FourByteReal), dimension(:), intent( in) :: values
252    integer                                                :: nf90_put_att_FourByteReal
253
254    nf90_put_att_FourByteReal = nf_put_att_real(ncid, varid, name, nf90_real4, size(values), values)
255  end function nf90_put_att_FourByteReal
256  ! -------
257  function nf90_put_att_one_FourByteReal(ncid, varid, name, values)
258    integer,                                   intent( in) :: ncid, varid
259    character(len = *),                        intent( in) :: name
260    real (kind =  FourByteReal),               intent( in) :: values
261    integer                                                :: nf90_put_att_one_FourByteReal
262
263    real (kind =  FourByteReal), dimension(1) :: valuesA
264    valuesA(1) = values
265    nf90_put_att_one_FourByteReal = nf_put_att_real(ncid, varid, name, nf90_real4, 1, valuesA)
266  end function nf90_put_att_one_FourByteReal
267  ! -------
268  function nf90_get_att_FourByteReal(ncid, varid, name, values)
269    integer,                                   intent( in) :: ncid, varid
270    character(len = *),                        intent( in) :: name
271    real (kind =  FourByteReal), dimension(:), intent(out) :: values
272    integer                                                :: nf90_get_att_FourByteReal
273
274    nf90_get_att_FourByteReal = nf_get_att_real(ncid, varid, name, values)
275  end function nf90_get_att_FourByteReal
276  ! -------
277  function nf90_get_att_one_FourByteReal(ncid, varid, name, values)
278    integer,                                   intent( in) :: ncid, varid
279    character(len = *),                        intent( in) :: name
280    real (kind =  FourByteReal),               intent(out) :: values
281    integer                                                :: nf90_get_att_one_FourByteReal
282
283    real (kind =  FourByteReal), dimension(1) :: valuesA
284    nf90_get_att_one_FourByteReal = nf_get_att_real(ncid, varid, name, valuesA)
285    values = valuesA(1)
286  end function nf90_get_att_one_FourByteReal
287  ! -------
288  function nf90_put_att_EightByteReal(ncid, varid, name, values)
289    integer,                                   intent( in) :: ncid, varid
290    character(len = *),                        intent( in) :: name
291    real (kind = EightByteReal), dimension(:), intent( in) :: values
292    integer                                                :: nf90_put_att_EightByteReal
293
294    nf90_put_att_EightByteReal = nf_put_att_double(ncid, varid, name, nf90_real8, size(values), values)
295  end function nf90_put_att_EightByteReal
296  ! -------
297  function nf90_put_att_one_EightByteReal(ncid, varid, name, values)
298    integer,                                   intent( in) :: ncid, varid
299    character(len = *),                        intent( in) :: name
300    real (kind = EightByteReal),               intent( in) :: values
301    integer                                                :: nf90_put_att_one_EightByteReal
302
303    real (kind = EightByteReal), dimension(1) :: valuesA
304    valuesA(1) = values
305    nf90_put_att_one_EightByteReal = nf_put_att_double(ncid, varid, name, nf90_real8, 1, valuesA)
306  end function nf90_put_att_one_EightByteReal
307  ! -------
308  function nf90_get_att_EightByteReal(ncid, varid, name, values)
309    integer,                                   intent( in) :: ncid, varid
310    character(len = *),                        intent( in) :: name
311    real (kind = EightByteReal), dimension(:), intent(out) :: values
312    integer                                                :: nf90_get_att_EightByteReal
313
314    nf90_get_att_EightByteReal = nf_get_att_double(ncid, varid, name, values)
315  end function nf90_get_att_EightByteReal
316  ! -------
317  function nf90_get_att_one_EightByteReal(ncid, varid, name, values)
318    integer,                                   intent( in) :: ncid, varid
319    character(len = *),                        intent( in) :: name
320    real (kind = EightByteReal),               intent(out) :: values
321    integer                                                :: nf90_get_att_one_EightByteReal
322
323    real (kind = EightByteReal), dimension(1) :: valuesA
324    nf90_get_att_one_EightByteReal = nf_get_att_double(ncid, varid, name, valuesA)
325    values = valuesA(1)
326  end function nf90_get_att_one_EightByteReal
327  ! -------
328