00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef NETCDF_HH
00011 #define NETCDF_HH
00012
00013 extern "C" {
00014 #include "netcdf.h"
00015 }
00016 #include "ncvalues.h"
00017
00018 typedef const char* NcToken;
00019 typedef unsigned int NcBool;
00020
00021 class NcDim;
00022 class NcVar;
00023 class NcAtt;
00024
00025
00026
00027
00028
00029
00030
00031 class NcFile
00032 {
00033 public:
00034
00035 virtual ~NcFile( void );
00036
00037 enum FileMode {
00038 ReadOnly,
00039 Write,
00040 Replace,
00041 New
00042 };
00043
00044 enum FileFormat {
00045 Classic,
00046 Offset64Bits,
00047 Netcdf4,
00048 Netcdf4Classic,
00049 BadFormat
00050 };
00051
00052 NcFile( const char * path, FileMode = ReadOnly ,
00053 size_t *chunksizeptr = NULL,
00054 size_t initialsize = 0,
00055 FileFormat = Classic );
00056
00057 NcBool is_valid( void ) const;
00058
00059 int num_dims( void ) const;
00060 int num_vars( void ) const;
00061 int num_atts( void ) const;
00062
00063 NcDim* get_dim( NcToken ) const;
00064 NcVar* get_var( NcToken ) const;
00065 NcAtt* get_att( NcToken ) const;
00066
00067 NcDim* get_dim( int ) const;
00068 NcVar* get_var( int ) const;
00069 NcAtt* get_att( int ) const;
00070 NcDim* rec_dim( void ) const;
00071
00072
00073
00074 NcDim* add_dim( NcToken dimname, long dimsize );
00075 NcDim* add_dim( NcToken dimname );
00076
00077 NcVar* add_var( NcToken varname, NcType type,
00078 const NcDim* dim0=0,
00079 const NcDim* dim1=0,
00080 const NcDim* dim2=0,
00081 const NcDim* dim3=0,
00082 const NcDim* dim4=0 );
00083 NcVar* add_var( NcToken varname, NcType type,
00084 int ndims, const NcDim** dims );
00085
00086 NcBool add_att( NcToken attname, char );
00087 NcBool add_att( NcToken attname, ncbyte );
00088 NcBool add_att( NcToken attname, short );
00089 NcBool add_att( NcToken attname, long );
00090 NcBool add_att( NcToken attname, int );
00091 NcBool add_att( NcToken attname, float );
00092 NcBool add_att( NcToken attname, double );
00093 NcBool add_att( NcToken attname, const char*);
00094 NcBool add_att( NcToken attname, int, const char* );
00095 NcBool add_att( NcToken attname, int, const ncbyte* );
00096 NcBool add_att( NcToken attname, int, const short* );
00097 NcBool add_att( NcToken attname, int, const long* );
00098 NcBool add_att( NcToken attname, int, const int* );
00099 NcBool add_att( NcToken attname, int, const float* );
00100 NcBool add_att( NcToken attname, int, const double* );
00101
00102 enum FillMode {
00103 Fill = NC_FILL,
00104 NoFill = NC_NOFILL,
00105 Bad
00106 };
00107
00108 NcBool set_fill( FillMode = Fill );
00109 FillMode get_fill( void ) const;
00110 FileFormat get_format( void ) const;
00111
00112 NcBool sync( void );
00113 NcBool close( void );
00114 NcBool abort( void );
00115
00116
00117 NcBool define_mode( void );
00118 NcBool data_mode( void );
00119 int id( void ) const;
00120
00121 protected:
00122 int the_id;
00123 int in_define_mode;
00124 FillMode the_fill_mode;
00125 NcDim** dimensions;
00126 NcVar** variables;
00127 NcVar* globalv;
00128 };
00129
00130
00131
00132
00133
00134 #define NcOldFile NcFile
00135 #define NcNewFile NcFile
00136 #define Clobber Replace
00137 #define NoClobber New
00138
00139
00140
00141
00142
00143
00144
00145
00146 class NcDim
00147 {
00148 public:
00149 NcToken name( void ) const;
00150 long size( void ) const;
00151 NcBool is_valid( void ) const;
00152 NcBool is_unlimited( void ) const;
00153 NcBool rename( NcToken newname );
00154 int id( void ) const;
00155 NcBool sync( void );
00156
00157 private:
00158 NcFile *the_file;
00159 int the_id;
00160 char *the_name;
00161
00162 NcDim(NcFile*, int num);
00163 NcDim(NcFile*, NcToken name, long sz);
00164 virtual ~NcDim( void );
00165
00166
00167 friend class NcFile;
00168 };
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 class NcTypedComponent
00179 {
00180 public:
00181 virtual NcToken name( void ) const = 0;
00182 virtual NcType type( void ) const = 0;
00183 virtual NcBool is_valid( void ) const = 0;
00184 virtual long num_vals( void ) const = 0;
00185 virtual NcBool rename( NcToken newname ) = 0;
00186 virtual NcValues* values( void ) const = 0;
00187
00188
00189
00190
00191
00192 virtual ncbyte as_ncbyte( long n ) const;
00193 virtual char as_char( long n ) const;
00194 virtual short as_short( long n ) const;
00195 virtual int as_int( long n ) const;
00196 virtual int as_nclong( long n ) const;
00197 virtual long as_long( long n ) const;
00198 virtual float as_float( long n ) const;
00199 virtual double as_double( long n ) const;
00200 virtual char* as_string( long n ) const;
00201
00202 protected:
00203 NcFile *the_file;
00204 NcTypedComponent( NcFile* );
00205 virtual NcValues* get_space( long numVals = 0 ) const;
00206 };
00207
00208
00209
00210
00211
00212
00213
00214
00215 class NcVar : public NcTypedComponent
00216 {
00217 public:
00218 virtual ~NcVar( void );
00219 NcToken name( void ) const;
00220 NcType type( void ) const;
00221 NcBool is_valid( void ) const;
00222 int num_dims( void ) const;
00223 NcDim* get_dim( int ) const;
00224 long* edges( void ) const;
00225 int num_atts( void ) const;
00226 NcAtt* get_att( NcToken ) const;
00227 NcAtt* get_att( int ) const;
00228 long num_vals( void ) const;
00229 NcValues* values( void ) const;
00230
00231
00232
00233
00234
00235
00236 NcBool put( const ncbyte* vals,
00237 long c0=0, long c1=0, long c2=0, long c3=0, long c4=0 );
00238 NcBool put( const char* vals,
00239 long c0=0, long c1=0, long c2=0, long c3=0, long c4=0 );
00240 NcBool put( const short* vals,
00241 long c0=0, long c1=0, long c2=0, long c3=0, long c4=0 );
00242 NcBool put( const int* vals,
00243 long c0=0, long c1=0, long c2=0, long c3=0, long c4=0 );
00244 NcBool put( const long* vals,
00245 long c0=0, long c1=0, long c2=0, long c3=0, long c4=0 );
00246 NcBool put( const float* vals,
00247 long c0=0, long c1=0, long c2=0, long c3=0, long c4=0 );
00248 NcBool put( const double* vals,
00249 long c0=0, long c1=0, long c2=0, long c3=0, long c4=0 );
00250
00251
00252
00253 NcBool put( const ncbyte* vals, const long* counts );
00254 NcBool put( const char* vals, const long* counts );
00255 NcBool put( const short* vals, const long* counts );
00256 NcBool put( const int* vals, const long* counts );
00257 NcBool put( const long* vals, const long* counts );
00258 NcBool put( const float* vals, const long* counts );
00259 NcBool put( const double* vals, const long* counts );
00260
00261
00262
00263
00264
00265 NcBool get( ncbyte* vals, long c0=0, long c1=0,
00266 long c2=0, long c3=0, long c4=0 ) const;
00267 NcBool get( char* vals, long c0=0, long c1=0,
00268 long c2=0, long c3=0, long c4=0 ) const;
00269 NcBool get( short* vals, long c0=0, long c1=0,
00270 long c2=0, long c3=0, long c4=0 ) const;
00271 NcBool get( int* vals, long c0=0, long c1=0,
00272 long c2=0, long c3=0, long c4=0 ) const;
00273 NcBool get( long* vals, long c0=0, long c1=0,
00274 long c2=0, long c3=0, long c4=0 ) const;
00275 NcBool get( float* vals, long c0=0, long c1=0,
00276 long c2=0, long c3=0, long c4=0 ) const;
00277 NcBool get( double* vals, long c0=0, long c1=0,
00278 long c2=0, long c3=0, long c4=0 ) const;
00279
00280
00281
00282 NcBool get( ncbyte* vals, const long* counts ) const;
00283 NcBool get( char* vals, const long* counts ) const;
00284 NcBool get( short* vals, const long* counts ) const;
00285 NcBool get( int* vals, const long* counts ) const;
00286 NcBool get( long* vals, const long* counts ) const;
00287 NcBool get( float* vals, const long* counts ) const;
00288 NcBool get( double* vals, const long* counts ) const;
00289
00290 NcBool set_cur(long c0=-1, long c1=-1, long c2=-1,
00291 long c3=-1, long c4=-1);
00292 NcBool set_cur(long* cur);
00293
00294
00295 NcBool add_att( NcToken, char );
00296 NcBool add_att( NcToken, ncbyte );
00297 NcBool add_att( NcToken, short );
00298 NcBool add_att( NcToken, int );
00299 NcBool add_att( NcToken, long );
00300 NcBool add_att( NcToken, float );
00301 NcBool add_att( NcToken, double );
00302 NcBool add_att( NcToken, const char* );
00303 NcBool add_att( NcToken, int, const char* );
00304 NcBool add_att( NcToken, int, const ncbyte* );
00305 NcBool add_att( NcToken, int, const short* );
00306 NcBool add_att( NcToken, int, const int* );
00307 NcBool add_att( NcToken, int, const long* );
00308 NcBool add_att( NcToken, int, const float* );
00309 NcBool add_att( NcToken, int, const double* );
00310
00311 NcBool rename( NcToken newname );
00312
00313 long rec_size ( void );
00314 long rec_size ( NcDim* );
00315
00316
00317
00318
00319
00320 NcValues *get_rec(void);
00321 NcValues *get_rec(long rec);
00322 NcValues *get_rec(NcDim* d);
00323 NcValues *get_rec(NcDim* d, long slice);
00324
00325
00326 NcBool put_rec( const ncbyte* vals );
00327 NcBool put_rec( const char* vals );
00328 NcBool put_rec( const short* vals );
00329 NcBool put_rec( const int* vals );
00330 NcBool put_rec( const long* vals );
00331 NcBool put_rec( const float* vals );
00332 NcBool put_rec( const double* vals );
00333
00334
00335 NcBool put_rec( NcDim* d, const ncbyte* vals );
00336 NcBool put_rec( NcDim* d, const char* vals );
00337 NcBool put_rec( NcDim* d, const short* vals );
00338 NcBool put_rec( NcDim* d, const int* vals );
00339 NcBool put_rec( NcDim* d, const long* vals );
00340 NcBool put_rec( NcDim* d, const float* vals );
00341 NcBool put_rec( NcDim* d, const double* vals );
00342
00343
00344 NcBool put_rec( const ncbyte* vals, long rec );
00345 NcBool put_rec( const char* vals, long rec );
00346 NcBool put_rec( const short* vals, long rec );
00347 NcBool put_rec( const int* vals, long rec );
00348 NcBool put_rec( const long* vals, long rec );
00349 NcBool put_rec( const float* vals, long rec );
00350 NcBool put_rec( const double* vals, long rec );
00351
00352
00353 NcBool put_rec( NcDim* d, const ncbyte* vals, long slice );
00354 NcBool put_rec( NcDim* d, const char* vals, long slice );
00355 NcBool put_rec( NcDim* d, const short* vals, long slice );
00356 NcBool put_rec( NcDim* d, const int* vals, long slice );
00357 NcBool put_rec( NcDim* d, const long* vals, long slice );
00358 NcBool put_rec( NcDim* d, const float* vals, long slice );
00359 NcBool put_rec( NcDim* d, const double* vals, long slice );
00360
00361
00362 long get_index( const ncbyte* vals );
00363 long get_index( const char* vals );
00364 long get_index( const short* vals );
00365 long get_index( const int* vals );
00366 long get_index( const long* vals );
00367 long get_index( const float* vals );
00368 long get_index( const double* vals );
00369
00370
00371 long get_index( NcDim* d, const ncbyte* vals );
00372 long get_index( NcDim* d, const char* vals );
00373 long get_index( NcDim* d, const short* vals );
00374 long get_index( NcDim* d, const int* vals );
00375 long get_index( NcDim* d, const long* vals );
00376 long get_index( NcDim* d, const float* vals );
00377 long get_index( NcDim* d, const double* vals );
00378
00379
00380 void set_rec ( long rec );
00381
00382 void set_rec ( NcDim* d, long slice );
00383
00384 int id( void ) const;
00385 NcBool sync( void );
00386
00387 private:
00388 int dim_to_index(NcDim* rdim);
00389 int the_id;
00390 long* the_cur;
00391 char* the_name;
00392 long* cur_rec;
00393
00394
00395 NcVar( void );
00396 NcVar(NcFile*, int);
00397
00398 int attnum( NcToken attname ) const;
00399 NcToken attname( int attnum ) const;
00400 void init_cur( void );
00401
00402
00403 friend class NcFile;
00404 };
00405
00406
00407
00408
00409
00410
00411
00412
00413 class NcAtt : public NcTypedComponent
00414 {
00415 public:
00416 virtual ~NcAtt( void );
00417 NcToken name( void ) const;
00418 NcType type( void ) const;
00419 NcBool is_valid( void ) const;
00420 long num_vals( void ) const;
00421 NcValues* values( void ) const;
00422 NcBool rename( NcToken newname );
00423 NcBool remove( void );
00424
00425 private:
00426 const NcVar* the_variable;
00427 char* the_name;
00428
00429
00430 NcAtt( NcFile*, const NcVar*, NcToken);
00431 NcAtt( NcFile*, NcToken);
00432
00433
00434 friend class NcFile;
00435 friend NcAtt* NcVar::get_att( NcToken ) const;
00436 };
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446 class NcError {
00447 public:
00448 enum Behavior {
00449 silent_nonfatal = 0,
00450 verbose_nonfatal = NC_VERBOSE,
00451 silent_fatal = NC_FATAL,
00452 verbose_fatal = NC_FATAL | NC_VERBOSE
00453 };
00454
00455
00456 NcError( Behavior b = verbose_fatal );
00457
00458
00459 virtual ~NcError( void );
00460
00461 int get_err( void );
00462
00463 private:
00464 int the_old_state;
00465 int the_old_err;
00466 };
00467
00468 #endif