General Purpose Geodetic Library
SgNetCdf.h
Go to the documentation of this file.
1 /*
2  *
3  * This file is a part of Space Geodetic Library. The library is used by
4  * nuSolve, a part of CALC/SOLVE system, and designed to make analysis of
5  * geodetic VLBI observations.
6  * Copyright (C) 2010-2020 Sergei Bolotin.
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program. If not, see <http://www.gnu.org/licenses/>.
20  *
21  */
22 
23 
24 #ifndef SG_NET_CDF_H
25 #define SG_NET_CDF_H
26 
27 
28 #ifdef HAVE_CONFIG_H
29 # include <config.h>
30 #endif
31 
32 
33 #include <netcdf.h>
34 
35 
36 #include <QtCore/QList>
37 #include <QtCore/QMap>
38 #include <QtCore/QString>
39 
40 
41 
42 #include <SgAttribute.h>
43 #include <SgMatrix.h>
44 #include <SgVector.h>
45 
46 
47 
48 class SgNcdfDimension;
49 extern const SgNcdfDimension dUnity;
50 
51 
52 
53 /***===================================================================================================*/
58 /*=====================================================================================================*/
60 {
61 public:
62  //
63  // Constructors/destructors:
64  //
68  inline SgNcdfDimension() : name_("") {n_=-1; id_=-1;};
69 
70  inline SgNcdfDimension(const QString& name, int n, int id) : name_(name) {n_=n; id_=id;};
71 
72  inline SgNcdfDimension(const SgNcdfDimension& d) : name_(d.getName())
73  {setN(d.getN()); setId(d.getId());};
74 
78  inline ~SgNcdfDimension(){};
79 
80  //
81  // Interfaces:
82  //
86  {setName(d.getName()); setN(d.getN()); setId(d.getId()); return *this;};
87 
90  inline const QString& getName() const {return name_;};
91 
94  inline int getN() const {return n_;};
95 
98  inline int getId() const {return id_;};
99 
100  inline void setName(const QString& name) {name_ = name;};
101 
102  inline void setN(int n) {n_ = n;};
103 
104  inline void setId(int id) {id_ = id;};
105 
106  //
107  // Functions:
108  //
111  static const QString className();
112 
113  void debug_output();
114 
115 private:
116  QString name_;
117  int n_;
118  int id_;
119 };
120 /*=====================================================================================================*/
121 
122 
123 
124 
125 
126 
127 /***===================================================================================================*/
132 /*=====================================================================================================*/
134 {
135 public:
136  //
137  // Constructors/destructors:
138  //
142  SgNcdfAttribute();
143 
144  SgNcdfAttribute(const QString name, nc_type typeOfData, size_t numOfElements, void *data);
145 
147 
152 
153  //
154  // Interfaces:
155  //
156  inline const QString& getName() const {return name_;};
157  inline nc_type getTypeOfData() const {return typeOfData_;};
158  inline size_t getNumOfElements() const {return numOfElements_;};
159  inline const void* getData() const {return data_;};
160  //
161  inline void setName(const QString& str) {name_ = str;};
162  inline void setTypeOfData(nc_type type) {typeOfData_ = type;};
163  inline void setNumOfElements(size_t num) {numOfElements_ = num;};
164  void setData(const void*, size_t);
165 
166  //
167  // Functions:
168  //
171  static const QString className();
172 
173  //
174  // Friends:
175  //
176 
177  //
178  // I/O:
179  //
180  int nc_get_attr(int ncid, int varid);
181  int nc_put_attr(int ncid, int varid);
182  void debug_output();
183 
184 private:
185  QString name_;
186  nc_type typeOfData_;
188  void *data_;
189 };
190 /*=====================================================================================================*/
191 
192 
193 
194 
195 /***===================================================================================================*/
200 /*=====================================================================================================*/
202 {
203 public:
204  //
205  // Constructors/destructors:
206  //
210  SgNcdfVariable();
211 
215  ~SgNcdfVariable();
216 
217  //
218  // Interfaces:
219  //
220  inline const QString& getName() const {return name_;};
221  inline int getId() const {return id_;};
222  inline nc_type getTypeOfData() const {return typeOfData_;};
223  inline const void* getData() const {return data_;};
224 
225  const char* data2char() const;
226  char* data2char();
227  const short* data2short() const;
228  short* data2short();
229  const int* data2int() const;
230  int* data2int();
231  const double* data2double() const;
232  double* data2double();
233 
236  inline void*& data() {return data_;};
237 
238  inline size_t numOfElements() const {return numOfElements_;};
239 
240  inline void setName(const QString& name) {name_ = name;};
241  inline void setId(int id) {id_ = id;};
242  inline void setTypeOfData(nc_type type) {typeOfData_ = type;};
243  // inline void setNumOfElements(size_t num) {numOfElements_ = num;};
244  inline void setData(void* d) {data_ = d;};
245 
246  inline const QMap<QString, SgNcdfDimension*>&dimensionByName() const {return dimensionByName_;};
247  inline const QList<SgNcdfDimension*>& dimensions() const {return dimensions_;};
248  inline const QMap<QString, SgNcdfAttribute*>&attributeByName() const {return attributeByName_;};
249 
250  //
251  // Functions:
252  //
255  static const QString className();
256 
259  inline void addDimension(const SgNcdfDimension& d, int idx=-1)
260  {addDimension(d.getName(), d.getN(), d.getId(), idx);};
261  void addDimension(const QString& name, int n, int id, int idx=-1);
262  void delDimension(const QString&);
263 
266  void addAttribute(const SgNcdfAttribute&);
268  void delAttribute(const QString&);
272  //
273  // Friends:
274  //
275 
276  //
277  // I/O:
278  //
279  int nc_get_var(int ncid);
280  int nc_put_var(int ncid);
281  void debug_output();
282 
283  int sizeOfData() const;
284 
285  void allocateData();
286  void multiplyData(int);
287  void check4multiplication();
288 
289 private:
290  QString name_;
291  int id_;
292  QMap<QString, SgNcdfDimension*> dimensionByName_;
293  QList<SgNcdfDimension*> dimensions_; // to keep the order of dimensions
294  QMap<QString, SgNcdfAttribute*> attributeByName_;
295  nc_type typeOfData_;
297  void *data_;
298 
299  void calcNumOfElements();
300 };
301 /*=====================================================================================================*/
302 
303 
304 
305 
306 class SgIdentities;
307 /***===================================================================================================*/
312 /*=====================================================================================================*/
313 class SgNetCdf
314 {
315 public:
316  enum DataType
317  {
320  DT_STR
321  };
323  {
326  };
327 
328  static const QString svcStub;
329  static const QString svcCreateTime;
330  static const QString svcCreatedBy;
331  static const QString svcProgram;
332  static const QString svcSubroutine;
333  static const QString svcVgosDbVersion;
334  static const QString svcDataOrigin;
335  static const QString svcTimeTag;
336  static const QString svcTimeTagFile;
337  static const QString svcSession;
338  static const QString svcStation;
339  static const QString svcBand;
340 
341  //
342  // Constructors/destructors:
343  //
347  SgNetCdf();
348 
352  SgNetCdf(const QString& fileName, const SgIdentities* ids=NULL,
353  const QString& fmtVerId=QString(""), const QString& sessionId=QString(""),
354  const QString& stationId=QString(""), const QString& bandId=QString(""));
355 
359  ~SgNetCdf();
360 
361  //
362  // Interfaces:
363  //
364  // gets:
365  inline const QString& getFileName() const;
366 
367  inline const QString& getFmtVerId() const {return fmtVerId_;};
368  inline const QString& getSessionId() const {return sessionId_;};
369  inline const QString& getStationId() const {return stationId_;};
370  inline const QString& getBandId() const {return bandId_;};
372 
373  // sets:
374  inline void setFileName(const QString&);
375 
376  inline void setIdentities(const SgIdentities*);
377  inline void setFmtVerId(const QString& str) {fmtVerId_ = str;};
378  inline void setSessionId(const QString& str) {sessionId_ = str;};
379  inline void setStationId(const QString& str) {stationId_ = str;};
380  inline void setBandId(const QString& str) {bandId_ = str;};
382 
383  //
384  // Functions:
385  //
388  static const QString className();
389 
390  // can be NULL in return:
391  inline SgNcdfVariable* lookupServiceVar(const QString& name) const
392  {return serviceVars_.contains(name.toUpper())?serviceVars_.value(name.toUpper()):NULL;};
393 
394  // can be NULL in return:
395  inline SgNcdfVariable* lookupVar(const QString& name) const
396  {return contentVars_.contains(name.toUpper())?contentVars_.value(name.toUpper()):NULL;};
397 
400  inline const char* lookupData2char(const QString& name) const
401  {return contentVars_.contains(name.toUpper())?contentVars_.value(name.toUpper())->data2char():NULL;};
402  inline char* lookupData2char(const QString& name)
403  {return contentVars_.contains(name.toUpper())?contentVars_.value(name.toUpper())->data2char():NULL;};
406  inline const short* lookupData2short(const QString& name) const
407  {return contentVars_.contains(name.toUpper())?contentVars_.value(name.toUpper())->data2short():NULL;};
408  inline short* lookupData2short(const QString& name)
409  {return contentVars_.contains(name.toUpper())?contentVars_.value(name.toUpper())->data2short():NULL;};
412  inline const int* lookupData2int(const QString& name) const
413  {return contentVars_.contains(name.toUpper())?contentVars_.value(name.toUpper())->data2int():NULL;};
414  inline int* lookupData2int(const QString& name)
415  {return contentVars_.contains(name.toUpper())?contentVars_.value(name.toUpper())->data2int():NULL;};
418  inline const double* lookupData2double(const QString& name) const
419  {return contentVars_.contains(name.toUpper())?contentVars_.value(name.toUpper())->data2double():NULL;};
420  inline double* lookupData2double(const QString& name)
421  {return contentVars_.contains(name.toUpper())?contentVars_.value(name.toUpper())->data2double():NULL;};
422 
423 
426  void registerVariable(SgNcdfVariable*, bool is4Service=false);
427 
430  void setServiceVars(const QString& stub, const QString& dataOrigin,
431  const QString& timeTag, const QString& timeTagFile);
432 
435  void reset();
436 
439  bool getData();
440 
443  bool putData();
444 
445 
446  //
447  // Friends:
448  //
449 
450  //
451  // I/O:
452  //
453 
454 private:
456  QString fileName_;
457  QMap<QString, SgNcdfDimension*> dimensionByName_;
458  QMap<QString, SgNcdfVariable*> serviceVars_;
459  QMap<QString, SgNcdfVariable*> contentVars_;
460 
461  //
462  QString fmtVerId_;
463  QString sessionId_;
464  QString stationId_;
465  QString bandId_;
467 
470  bool setServiceVar(const QString& varName, const QString& varValue);
471 };
472 /*=====================================================================================================*/
473 
474 
475 
476 
477 
478 
479 /*=====================================================================================================*/
480 /* */
481 /* SgNetCdf inline members: */
482 /* */
483 /*=====================================================================================================*/
484 //
485 //
486 // CONSTRUCTORS:
487 //
488 // An empty constructor:
489 
490 
491 
492 
493 //
494 // INTERFACES:
495 //
496 //
497 inline const QString& SgNetCdf::getFileName() const
498 {
499  return fileName_;
500 };
501 
502 
503 
504 // sets:
505 inline void SgNetCdf::setFileName(const QString& fileName)
506 {
507  fileName_ = fileName;
508 };
509 
510 
511 
512 //
513 inline void SgNetCdf::setIdentities(const SgIdentities *ids)
514 {
515  identities_ = ids;
516 };
517 
518 
519 //
520 // FRIENDS:
521 //
522 //
523 //
524 /*=====================================================================================================*/
525 
526 
527 
528 
529 
530 /*=====================================================================================================*/
531 //
532 // aux functions:
533 //
534 
535 
536 
537 
538 /*=====================================================================================================*/
539 #endif //SG_NET_CDF_H
const SgNcdfDimension dUnity
static const QString className()
Definition: SgNetCdf.cpp:269
nc_type getTypeOfData() const
Definition: SgNetCdf.h:157
void setNumOfElements(size_t num)
Definition: SgNetCdf.h:163
void setData(const void *, size_t)
Definition: SgNetCdf.cpp:322
size_t numOfElements_
Definition: SgNetCdf.h:187
void setTypeOfData(nc_type type)
Definition: SgNetCdf.h:162
size_t getNumOfElements() const
Definition: SgNetCdf.h:158
int nc_put_attr(int ncid, int varid)
Definition: SgNetCdf.cpp:369
void setName(const QString &str)
Definition: SgNetCdf.h:161
nc_type typeOfData_
Definition: SgNetCdf.h:186
const void * getData() const
Definition: SgNetCdf.h:159
void debug_output()
Definition: SgNetCdf.cpp:403
int nc_get_attr(int ncid, int varid)
Definition: SgNetCdf.cpp:332
void * data_
Definition: SgNetCdf.h:188
const QString & getName() const
Definition: SgNetCdf.h:156
QString name_
Definition: SgNetCdf.h:185
SgNcdfDimension & operator=(const SgNcdfDimension &d)
Definition: SgNetCdf.h:85
void setId(int id)
Definition: SgNetCdf.h:104
SgNcdfDimension(const QString &name, int n, int id)
Definition: SgNetCdf.h:70
int getN() const
Definition: SgNetCdf.h:94
const QString & getName() const
Definition: SgNetCdf.h:90
int getId() const
Definition: SgNetCdf.h:98
SgNcdfDimension(const SgNcdfDimension &d)
Definition: SgNetCdf.h:72
void setN(int n)
Definition: SgNetCdf.h:102
void debug_output()
Definition: SgNetCdf.cpp:239
static const QString className()
Definition: SgNetCdf.cpp:231
void setName(const QString &name)
Definition: SgNetCdf.h:100
QString name_
Definition: SgNetCdf.h:116
void multiplyData(int)
Definition: SgNetCdf.cpp:750
void delAttribute(const QString &)
Definition: SgNetCdf.cpp:641
QMap< QString, SgNcdfAttribute * > attributeByName_
Definition: SgNetCdf.h:294
nc_type getTypeOfData() const
Definition: SgNetCdf.h:222
int getId() const
Definition: SgNetCdf.h:221
int nc_put_var(int ncid)
Definition: SgNetCdf.cpp:709
QMap< QString, SgNcdfDimension * > dimensionByName_
Definition: SgNetCdf.h:292
const QMap< QString, SgNcdfDimension * > & dimensionByName() const
Definition: SgNetCdf.h:246
size_t numOfElements_
Definition: SgNetCdf.h:296
void setId(int id)
Definition: SgNetCdf.h:241
void setData(void *d)
Definition: SgNetCdf.h:244
const char * data2char() const
Definition: SgNetCdf.cpp:459
void setName(const QString &name)
Definition: SgNetCdf.h:240
int nc_get_var(int ncid)
Definition: SgNetCdf.cpp:672
void addAttribute(const SgNcdfAttribute &)
Definition: SgNetCdf.cpp:612
void setTypeOfData(nc_type type)
Definition: SgNetCdf.h:242
const int * data2int() const
Definition: SgNetCdf.cpp:503
QString name_
Definition: SgNetCdf.h:290
void allocateData()
Definition: SgNetCdf.cpp:837
const short * data2short() const
Definition: SgNetCdf.cpp:481
const QList< SgNcdfDimension * > & dimensions() const
Definition: SgNetCdf.h:247
int sizeOfData() const
Definition: SgNetCdf.cpp:855
const double * data2double() const
Definition: SgNetCdf.cpp:525
void addDimension(const SgNcdfDimension &d, int idx=-1)
Definition: SgNetCdf.h:259
const QString & getName() const
Definition: SgNetCdf.h:220
void debug_output()
Definition: SgNetCdf.cpp:863
void delDimension(const QString &)
Definition: SgNetCdf.cpp:568
size_t numOfElements() const
Definition: SgNetCdf.h:238
void * data_
Definition: SgNetCdf.h:297
QList< SgNcdfDimension * > dimensions_
Definition: SgNetCdf.h:293
const void * getData() const
Definition: SgNetCdf.h:223
void check4multiplication()
Definition: SgNetCdf.cpp:778
static const QString className()
Definition: SgNetCdf.cpp:419
nc_type typeOfData_
Definition: SgNetCdf.h:295
const QMap< QString, SgNcdfAttribute * > & attributeByName() const
Definition: SgNetCdf.h:248
void *& data()
Definition: SgNetCdf.h:236
void calcNumOfElements()
Definition: SgNetCdf.cpp:657
bool setServiceVar(const QString &varName, const QString &varValue)
Definition: SgNetCdf.cpp:1244
double * lookupData2double(const QString &name)
Definition: SgNetCdf.h:420
static const QString svcSubroutine
Definition: SgNetCdf.h:332
short * lookupData2short(const QString &name)
Definition: SgNetCdf.h:408
void setFileName(const QString &)
Definition: SgNetCdf.h:505
SgNcdfVariable * lookupVar(const QString &name) const
Definition: SgNetCdf.h:395
void setSessionId(const QString &str)
Definition: SgNetCdf.h:378
const QString & getSessionId() const
Definition: SgNetCdf.h:368
void reset()
Definition: SgNetCdf.cpp:1031
void setServiceVars(const QString &stub, const QString &dataOrigin, const QString &timeTag, const QString &timeTagFile)
Definition: SgNetCdf.cpp:1263
static const QString svcCreatedBy
Definition: SgNetCdf.h:330
void setIdentities(const SgIdentities *)
Definition: SgNetCdf.h:513
const short * lookupData2short(const QString &name) const
Definition: SgNetCdf.h:406
OperationMode getOperationMode() const
Definition: SgNetCdf.h:371
static const QString svcDataOrigin
Definition: SgNetCdf.h:334
bool putData()
Definition: SgNetCdf.cpp:1357
const QString & getStationId() const
Definition: SgNetCdf.h:369
const double * lookupData2double(const QString &name) const
Definition: SgNetCdf.h:418
const QString & getBandId() const
Definition: SgNetCdf.h:370
QString stationId_
Definition: SgNetCdf.h:464
const QString & getFmtVerId() const
Definition: SgNetCdf.h:367
QMap< QString, SgNcdfDimension * > dimensionByName_
Definition: SgNetCdf.h:457
static const QString svcProgram
Definition: SgNetCdf.h:331
QString fileName_
Definition: SgNetCdf.h:456
static const QString svcTimeTag
Definition: SgNetCdf.h:335
static const QString svcStation
Definition: SgNetCdf.h:338
const SgIdentities * identities_
Definition: SgNetCdf.h:455
QString fmtVerId_
Definition: SgNetCdf.h:462
void registerVariable(SgNcdfVariable *, bool is4Service=false)
Definition: SgNetCdf.cpp:1317
static const QString svcVgosDbVersion
Definition: SgNetCdf.h:333
QMap< QString, SgNcdfVariable * > serviceVars_
Definition: SgNetCdf.h:458
static const QString svcSession
Definition: SgNetCdf.h:337
void setFmtVerId(const QString &str)
Definition: SgNetCdf.h:377
const QString & getFileName() const
Definition: SgNetCdf.h:497
QMap< QString, SgNcdfVariable * > contentVars_
Definition: SgNetCdf.h:459
QString bandId_
Definition: SgNetCdf.h:465
@ DT_STR
Definition: SgNetCdf.h:320
@ DT_DBL
Definition: SgNetCdf.h:319
@ DT_INT
Definition: SgNetCdf.h:318
static const QString svcCreateTime
Definition: SgNetCdf.h:329
OperationMode
Definition: SgNetCdf.h:323
@ OM_DRY_RUN
Definition: SgNetCdf.h:325
@ OM_REGULAR
Definition: SgNetCdf.h:324
static const QString className()
Definition: SgNetCdf.cpp:970
QString sessionId_
Definition: SgNetCdf.h:463
void setBandId(const QString &str)
Definition: SgNetCdf.h:380
char * lookupData2char(const QString &name)
Definition: SgNetCdf.h:402
OperationMode operationMode_
Definition: SgNetCdf.h:466
int * lookupData2int(const QString &name)
Definition: SgNetCdf.h:414
void setOperationMode(OperationMode om)
Definition: SgNetCdf.h:381
static const QString svcTimeTagFile
Definition: SgNetCdf.h:336
const char * lookupData2char(const QString &name) const
Definition: SgNetCdf.h:400
static const QString svcBand
Definition: SgNetCdf.h:339
static const QString svcStub
Definition: SgNetCdf.h:328
void setStationId(const QString &str)
Definition: SgNetCdf.h:379
SgNcdfVariable * lookupServiceVar(const QString &name) const
Definition: SgNetCdf.h:391
const int * lookupData2int(const QString &name) const
Definition: SgNetCdf.h:412
bool getData()
Definition: SgNetCdf.cpp:1053