File: module_netcdf_nc_data.F90

package info (click to toggle)
netcdf-fortran 4.5.3%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 7,456 kB
  • sloc: fortran: 25,848; f90: 20,793; sh: 4,609; ansic: 1,729; makefile: 585; pascal: 292; xml: 173
file content (411 lines) | stat: -rwxr-xr-x 16,367 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
Module netcdf_nc_data

! Data types and flags for Fortran2003 interfaces to NetCDF C routines
!
! Written by: Richard Weed, Ph.D.
!             Center for Advanced Vehicular Systems     
!             Mississippi State University
!             rweed@cavs.msstate.edu


! License (and other Lawyer Language)
 
! This software is released under the Apache 2.0 Open Source License. The
! full text of the License can be viewed at :
!
!   http:www.apache.org/licenses/LICENSE-2.0.html
!
! The author grants to the University Corporation for Atmospheric Research
! (UCAR), Boulder, CO, USA the right to revise and extend the software
! without restriction. However, the author retains all copyrights and
! intellectual property rights explicitly stated in or implied by the
! Apache license

! Version 1.:  Sept. 2005 - Initial Cray X1 version
! Version 2.:  May 2006   - Updated to support g95
! Version 3.:  June 2006  - Updated to include netCDF 4 functions
! Version 4.:  July 2007  - Modified to work with 3.6.2 build system
! Version 5.:  April 2009 - Updated to NetCDF 4.0.1
! Version 6.:  April 2010 - Updated to NetCDF 4.1.1
! Version 7.:  Feb.  2012 - Added support for F2008 Intrinsic kinds
! Version 8.:  Feb.  2013 - Updated for netcdf fortran-4.4
! Version 9.:  April 2014 - Changed C_PTRDIFF_T to UCAR definitions
! Version 10.: Jan.  2016 - General code cleanup. Added a definition
!                           for a C_ENUM kind paramater for future
!                           code mods. Added several new parameters
!                           to include all of the values supported
!                           in netcdf_constant.f90

 USE ISO_C_BINDING ! All subsequent USE associations of netcdf_nc_data
                   ! will inherit ISO_C_BINDING data

! The following will allow us to use the Fortran 2008 default intrinsic
! kind variables contained in Fortran 2008 ISO_FORTRAN_ENV module when
! compilers support it. Actually most of the major compilers (and even
! the latest gfortran) support these now (Feb. 2012)
 
#ifdef HAVE_F2008
 USE ISO_FORTRAN_ENV, ONLY: REAL32, REAL64, INT8, INT16, INT32, INT64
#endif
 Implicit NONE

! All of the stuff inside this ifndef black needs to be moved to a
! stantdalone module and combined with the f90 interfaces typesizes
! module

#ifndef HAVE_F2008
 
! Create our own REAL32, REAL64, INT8, INT16, INT32, INT64 if we don't have F2008
! ISO_FORTRAN_ENV module

 Integer, Parameter, PRIVATE :: REAL32 = SELECTED_REAL_KIND(P=6,  R=37)   ! float 
 Integer, Parameter, PRIVATE :: REAL64 = SELECTED_REAL_KIND(P=13, R=307)  ! double
 Integer, Parameter, PRIVATE :: INT8   = SELECTED_INT_KIND( 2)
 Integer, Parameter, PRIVATE :: INT16  = SELECTED_INT_KIND( 4)
 Integer, Parameter, PRIVATE :: INT32  = SELECTED_INT_KIND( 9)            ! int
 Integer, Parameter, PRIVATE :: INT64  = SELECTED_INT_KIND(18)            ! long long
#endif

! Set KIND parameters to shorter names used in f03 interface routines etc.

 Integer, Parameter :: RK4 = REAL32
 Integer, Parameter :: RK8 = REAL64
 Integer, Parameter :: IK1 = INT8
 Integer, Parameter :: IK2 = INT16
 Integer, Parameter :: IK4 = INT32
 Integer, Parameter :: IK8 = INT64
 
! Define processor/compiler dependent parameters for ptrdiff_t, signed char,
! and short types. Note prtdiff_t was not defined in the FORTRAN 2003
! standard as an interoperable type in ISO_C_BINDING but was added as part of
! the recent TS29113 Technical Specification "Futher Interoperability with C" 
! passed in 2012. For now we will make our own using C_INT32_T or C_INT64_T
! but allow users to use the default definition for compilers that support 
! TS29113 (like gfortran 4.8). Default will be C_INTPTR_T 

#ifndef HAVE_TS29113_SUPPORT
#if (SIZEOF_PTRDIFF_T == 4)
 Integer, Parameter :: C_PTRDIFF_T = C_INT32_T
#elif (SIZEOF_PTRDIFF_T == 8)
 Integer, Parameter :: C_PTRDIFF_T = C_INT64_T
#else
 Integer, Parameter :: C_PTRDIFF_T = C_INTPTR_T
#endif
#endif

! Set KIND parameters for 1 and 2 byte integers if the system 
! supports them based on what is set by configure in nfconfig.inc.
! The routines that use these values will issue an EBADTYPE error
! and exit if C_SIGNED_CHAR and C_SHORT are not supported in
! ISO_C_BINDING

! Set the KINDs to default integers otherwise.

! INT1 KINDs

#ifdef NF_INT1_IS_C_SIGNED_CHAR
 Integer, Parameter :: CINT1 = C_SIGNED_CHAR
 Integer, Parameter :: NFINT1 = IK1
#elif NF_INT1_IS_C_SHORT
 Integer, Parameter :: CINT1 = C_SHORT
 Integer, Parameter :: NFINT1 = IK2
#elif NF_INT1_IS_C_INT
 Integer, Parameter :: CINT1 = C_INT
 Integer, Parameter :: NFINT1 = IK4
#elif NF_INT1_IS_C_LONG
 Integer, Parameter :: CINT1 = C_LONG
 Integer, Parameter :: NFINT1 = IK8
#else
 Integer, Parameter :: CINT1 = C_SIGNED_CHAR
 Integer, Parameter :: NFINT1 = IK1
#endif

! INT2 KINDs

#ifdef NF_INT2_IS_C_SHORT
 Integer, Parameter :: CINT2 = C_SHORT
 Integer, Parameter :: NFINT2 = IK2
#elif NF_INT2_IS_C_INT
 Integer, Parameter :: CINT2 = C_INT
 Integer, Parameter :: NFINT2 = IK4
#elif NF_INT2_IS_C_LONG
 Integer, Parameter :: CINT2 = C_LONG
 Integer, Parameter :: NFINT2 = IK8
#else
 Integer, Parameter :: CINT2 = C_SHORT
 Integer, Parameter :: NFINT2 = IK2
#endif

! Set Fortran default integer kind. This
! should take care of the case were default
! integer is a 64 bit int (ala prehistoric
! CRAYS) 

#ifdef NF_INT_IS_C_LONG
 Integer, Parameter :: CINT = C_LONG
 Integer, Parameter :: NFINT = IK8 
#else
 Integer, Parameter :: CINT = C_INT
 Integer, Parameter :: NFINT = IK4
#endif

! INT8 KINDs

#ifdef NF_INT8_IS_C_SHORT
 Integer, Parameter :: CINT8 = C_SHORT
 Integer, Parameter :: NFINT8 = IK2
#elif NF_INT8_IS_C_INT
 Integer, Parameter :: CINT8 = C_INT
 Integer, Parameter :: NFINT8 = IK4
#else
 Integer, Parameter :: CINT8 = C_LONG_LONG
 Integer, Parameter :: NFINT8 = IK8
#endif

! Set Fortran default real kind. This should
! take care of the case were the default real
! type is a 64 bit real (ala prehistoric CRAYs) 

#ifdef NF_REAL_IS_C_DOUBLE
  Integer, Parameter :: NFREAL = RK8
#else
  Integer, Parameter :: NFREAL = RK4
#endif

! Create a C_ENUM kind which should be just C_INT (but you never know).
! Don't know why this wasn't included in the C Interop standard but it
! would have been nice to have.

! This will eventually be used to replace the current integer values in the
! interfaces with something that should be consistent with C enum data
! types. Mostly this is cosmetic to identify in the code that we are 
! passing something that is a enumerator member in C. 

 Enum, BIND(C)
   Enumerator :: dummy
 End Enum

 Private :: dummy

 Integer, Parameter :: C_ENUM = KIND(dummy)

 
!--------- Define default C interface parameters from netcdf.h   ---------------

! This is not a complete impementation of the C header files but 
! defines NC_ values equivalent to the values in the netcdf.inc files
! excluding the V2 values

!                     NETCDF3 data
!               
! Define enumerator nc_type data as integers

 Integer(C_INT), Parameter :: NC_NAT    = 0
 Integer(C_INT), Parameter :: NC_BYTE   = 1
 Integer(C_INT), Parameter :: NC_CHAR   = 2
 Integer(C_INT), Parameter :: NC_SHORT  = 3
 Integer(C_INT), Parameter :: NC_INT    = 4
 Integer(C_INT), Parameter :: NC_FLOAT  = 5
 Integer(C_INT), Parameter :: NC_DOUBLE = 6

! Default fill values

 Character(KIND=C_CHAR), Parameter :: NC_FILL_CHAR   = C_NULL_CHAR 
 Integer(C_SIGNED_CHAR), Parameter :: NC_FILL_BYTE   = -127_C_SIGNED_CHAR
 Integer(C_SHORT),       Parameter :: NC_FILL_SHORT  = -32767_C_SHORT
 Integer(C_INT),         Parameter :: NC_FILL_INT    = -2147483647_C_INT
 Real(C_FLOAT),          Parameter :: NC_FILL_FLOAT  = 9.9692099683868690E+36
 Real(C_DOUBLE),         Parameter :: NC_FILL_DOUBLE = 9.9692099683868690D+36

! Mode flags for opening and creating datasets

 Integer(C_INT), Parameter :: NC_NOWRITE          = 0
 Integer(C_INT), Parameter :: NC_WRITE            = 1
 Integer(C_INT), Parameter :: NC_CLOBBER          = 0
 Integer(C_INT), Parameter :: NC_NOCLOBBER        = 4
 Integer(C_INT), Parameter :: NC_FILL             = 0
 Integer(C_INT), Parameter :: NC_NOFILL           = 256
 Integer(C_INT), Parameter :: NC_LOCK             = 1024
 Integer(C_INT), Parameter :: NC_SHARE            = 2048
 Integer(C_INT), Parameter :: NC_STRICT_NC3       = 8
 Integer(C_INT), Parameter :: NC_64BIT_OFFSET     = 512
 Integer(C_INT), Parameter :: NC_64BIT_DATA       = 32
 Integer(C_INT), Parameter :: NC_CDF5             = NC_64BIT_DATA
 Integer(C_INT), Parameter :: NC_SIZEHINT_DEFAULT = 0
 Integer(C_INT), Parameter :: NC_ALIGN_CHUNK      = -1
 Integer(C_INT), Parameter :: NC_FORMAT_CLASSIC   = 1
 Integer(C_INT), Parameter :: NC_FORMAT_64BIT     = 2
 Integer(C_INT), Parameter :: NC_FORMAT_64BIT_OFFSET = NC_FORMAT_64BIT
 Integer(C_INT), Parameter :: NC_FORMAT_64BIT_DATA   = 5
 Integer(C_INT), Parameter :: NC_FORMAT_CDF5         = NC_FORMAT_64BIT_DATA
 Integer(C_INT), Parameter :: NC_DISKLESS         = 8
 Integer(C_INT), Parameter :: NC_MMAP             = 16
 Integer(C_INT), Parameter :: NC_INMEMORY         = 32768

! Unlimited dimension size argument and global attibute ID

 Integer(C_INT),  Parameter :: NC_UNLIMITED = 0
 Integer(C_INT),  Parameter :: NC_GLOBAL    = 0 

! Implementation limits (WARNING!  SHOULD BE THE SAME AS C INTERFACE)

 Integer(C_INT), Parameter :: NC_MAX_DIMS     = 1024 
 Integer(C_INT), Parameter :: NC_MAX_ATTRS    = 8192 
 Integer(C_INT), Parameter :: NC_MAX_VARS     = 8192 
 Integer(C_INT), Parameter :: NC_MAX_NAME     = 256 
 Integer(C_INT), Parameter :: NC_MAX_VAR_DIMS = NC_MAX_DIMS

! Error codes

 Integer(C_INT), Parameter :: NC_NOERR        =  0
 Integer(C_INT), Parameter :: NC2_ERR         = -1
 Integer(C_INT), Parameter :: NC_SYSERR       = -31
 Integer(C_INT), Parameter :: NC_EXDR         = -32
 Integer(C_INT), Parameter :: NC_EBADID       = -33
 Integer(C_INT), Parameter :: NC_EBFILE       = -34
 Integer(C_INT), Parameter :: NC_EEXIST       = -35
 Integer(C_INT), Parameter :: NC_EINVAL       = -36
 Integer(C_INT), Parameter :: NC_EPERM        = -37
 Integer(C_INT), Parameter :: NC_ENOTINDEFINE = -38
 Integer(C_INT), Parameter :: NC_EINDEFINE    = -39
 Integer(C_INT), Parameter :: NC_EINVALCOORDS = -40
 Integer(C_INT), Parameter :: NC_EMAXDIMS     = -41
 Integer(C_INT), Parameter :: NC_ENAMEINUSE   = -42
 Integer(C_INT), Parameter :: NC_ENOTATT      = -43
 Integer(C_INT), Parameter :: NC_EMAXATTS     = -44
 Integer(C_INT), Parameter :: NC_EBADTYPE     = -45
 Integer(C_INT), Parameter :: NC_EBADDIM      = -46
 Integer(C_INT), Parameter :: NC_EUNLIMPOS    = -47
 Integer(C_INT), Parameter :: NC_EMAXVARS     = -48
 Integer(C_INT), Parameter :: NC_ENOTVAR      = -49
 Integer(C_INT), Parameter :: NC_EGLOBAL      = -50
 Integer(C_INT), Parameter :: NC_ENOTNC       = -51
 Integer(C_INT), Parameter :: NC_ESTS         = -52
 Integer(C_INT), Parameter :: NC_EMAXNAME     = -53
 Integer(C_INT), Parameter :: NC_EUNLIMIT     = -54
 Integer(C_INT), Parameter :: NC_ENORECVARS   = -55
 Integer(C_INT), Parameter :: NC_ECHAR        = -56
 Integer(C_INT), Parameter :: NC_EEDGE        = -57
 Integer(C_INT), Parameter :: NC_ESTRIDE      = -58
 Integer(C_INT), Parameter :: NC_EBADNAME     = -59
 Integer(C_INT), Parameter :: NC_ERANGE       = -60
 Integer(C_INT), Parameter :: NC_ENOMEM       = -61
 Integer(C_INT), Parameter :: NC_EVARSIZE     = -62
 Integer(C_INT), Parameter :: NC_EDIMSIZE     = -63
 Integer(C_INT), Parameter :: NC_ETRUNC       = -64
 Integer(C_INT), Parameter :: NC_EAXISTYPE    = -65

! DAP error codes

 Integer(C_INT), Parameter :: NC_EDAP           = -66
 Integer(C_INT), Parameter :: NC_ECURL          = -67
 Integer(C_INT), Parameter :: NC_EIO            = -68
 Integer(C_INT), Parameter :: NC_ENODATA        = -69
 Integer(C_INT), Parameter :: NC_EDAPSVC        = -70
 Integer(C_INT), Parameter :: NC_EDAS           = -71
 Integer(C_INT), Parameter :: NC_EDDS           = -72
 Integer(C_INT), Parameter :: NC_EDATADDS       = -73
 Integer(C_INT), Parameter :: NC_EDAPURL        = -74
 Integer(C_INT), Parameter :: NC_EDAPCONSTRAINT = -75
 Integer(C_INT), Parameter :: NC_ETRANSLATION   = -76

! Error handling codes

 Integer(C_INT), Parameter :: NC_FATAL   = 1
 Integer(C_INT), Parameter :: NC_VERBOSE = 2

#ifdef USE_NETCDF4

!                          NETCDF4 data

 Integer(C_INT), Parameter :: NC_FORMAT_NETCDF4         = 3
 Integer(C_INT), Parameter :: NC_FORMAT_NETCDF4_CLASSIC = 4
 Integer(C_INT), Parameter :: NC_NETCDF4                = 4096
 Integer(C_INT), Parameter :: NC_CLASSIC_MODEL          = 256

! extra netcdf4 types

 Integer(C_INT), Parameter :: NC_LONG     = NC_INT
 Integer(C_INT), Parameter :: NC_UBYTE    = 7
 Integer(C_INT), Parameter :: NC_USHORT   = 8 
 Integer(C_INT), Parameter :: NC_UINT     = 9
 Integer(C_INT), Parameter :: NC_INT64    = 10 
 Integer(C_INT), Parameter :: NC_UINT64   = 11 
 Integer(C_INT), Parameter :: NC_STRING   = 12
 Integer(C_INT), Parameter :: NC_VLEN     = 13
 Integer(C_INT), Parameter :: NC_OPAQUE   = 14
 Integer(C_INT), Parameter :: NC_ENUM     = 15
 Integer(C_INT), Parameter :: NC_COMPOUND = 16

! extra netcd4 fill values

 Integer(C_INT),       Parameter :: NC_FILL_UBYTE  = 255
 Integer(C_INT),       Parameter :: NC_FILL_USHORT = 65535
 Integer(C_LONG_LONG), Parameter :: NC_FILL_UINT   = 4294967295_C_LONG_LONG
 Integer(C_LONG_LONG), Parameter :: NC_FILL_INT64  = -9223372036854775806_C_LONG_LONG

! extra netcdf4 variable flags 

 Integer(C_INT), Parameter :: NC_CHUNK_SEQ      = 0 
 Integer(C_INT), Parameter :: NC_CHUNK_SUB      = 1 
 Integer(C_INT), Parameter :: NC_CHUNK_SIZES    = 2 
 Integer(C_INT), Parameter :: NC_ENDIAN_NATIVE  = 0 
 Integer(C_INT), Parameter :: NC_ENDIAN_LITTLE  = 1 
 Integer(C_INT), Parameter :: NC_ENDIAN_BIG     = 2 
 Integer(C_INT), Parameter :: NC_CHUNKED        = 0
 Integer(C_INT), Parameter :: NC_NOTCONTIGUOUS  = 0
 Integer(C_INT), Parameter :: NC_CONTIGUOUS     = 1
 Integer(C_INT), Parameter :: NC_NOCHECKSUM     = 0
 Integer(C_INT), Parameter :: NC_FLETCHER32     = 1
 Integer(C_INT), Parameter :: NC_NOSHUFFLE      = 0
 Integer(C_INT), Parameter :: NC_SHUFFLE        = 1
 Integer(C_INT), Parameter :: NC_INDEPENDENT    = 0
 Integer(C_INT), Parameter :: NC_COLLECTIVE     = 1

! flags for parallel i/o

 Integer(C_INT), Parameter :: NC_MPIIO          = 8192
 Integer(C_INT), Parameter :: NC_MPIPOSIX       = 16384
 Integer(C_INT), Parameter :: NC_PNETCDF        = NC_MPIIO 

 Integer(C_INT), Parameter :: NC_SZIP_EC_OPTION_MASK = 4
 Integer(C_INT), Parameter :: NC_SZIP_NN_OPTION_MASK = 32

! extra netcdf4 error flags

 Integer(C_INT), Parameter :: NC_EHDFERR        = -101
 Integer(C_INT), Parameter :: NC_ECANTREAD      = -102
 Integer(C_INT), Parameter :: NC_ECANTWRITE     = -103
 Integer(C_INT), Parameter :: NC_ECANTCREATE    = -104
 Integer(C_INT), Parameter :: NC_EFILEMETA      = -105
 Integer(C_INT), Parameter :: NC_EDIMMETA       = -106
 Integer(C_INT), Parameter :: NC_EATTMETA       = -107
 Integer(C_INT), Parameter :: NC_EVARMETA       = -108
 Integer(C_INT), Parameter :: NC_ENOCOMPOUND    = -109
 Integer(C_INT), Parameter :: NC_EATTEXISTS     = -110
 Integer(C_INT), Parameter :: NC_ENOTNC4        = -111
 Integer(C_INT), Parameter :: NC_ESTRICTNC3     = -112
 Integer(C_INT), Parameter :: NC_ENOTNC3        = -113
 Integer(C_INT), Parameter :: NC_ENOPAR         = -114
 Integer(C_INT), Parameter :: NC_EPARINIT       = -115
 Integer(C_INT), Parameter :: NC_EBADGRPID      = -116
 Integer(C_INT), Parameter :: NC_EBADTYPID      = -117
 Integer(C_INT), Parameter :: NC_ETYPDEFINED    = -118
 Integer(C_INT), Parameter :: NC_EBADFIELD      = -119
 Integer(C_INT), Parameter :: NC_EBADCLASS      = -120
 Integer(C_INT), Parameter :: NC_EMAPTYPE       = -121
 Integer(C_INT), Parameter :: NC_ELATEFILL      = -122
 Integer(C_INT), Parameter :: NC_ELATEDEF       = -123
 Integer(C_INT), Parameter :: NC_EDIMSCALE      = -124
 Integer(C_INT), Parameter :: NC_ENOGRP         = -125
 Integer(C_INT), Parameter :: NC_ESTORAGE       = -126
 Integer(C_INT), Parameter :: NC_EBADCHUNK      = -127
 Integer(C_INT), Parameter :: NC_ENOTBUILT      = -128
 Integer(C_INT), Parameter :: NC_EDISKLESS      = -129
 Integer(C_INT), Parameter :: NC_ECANTEXTEND    = -130
 Integer(C_INT), Parameter :: NC_EMPI           = -131

#endif

!------------------------------------------------------------------------------
End Module netcdf_nc_data