VAPoR  0.1
NetCDFCFCollection.h
Go to the documentation of this file.
1 //
2 // $Id$
3 //
4 
5 
6 #ifndef _NetCDFCFCollection_h_
7 #define _NetCDFCFCollection_h_
8 
9 #include <vector>
10 #include <map>
11 #include <algorithm>
12 
13 #include <sstream>
14 #include <vapor/MyBase.h>
15 #include <vapor/UDUnitsClass.h>
16 #include <vapor/NetCDFCollection.h>
17 
18 union ut_unit;
19 struct ut_system;
20 
21 namespace VAPoR {
22 
23 //
33 //
34 
36 public:
37 
39  virtual ~NetCDFCFCollection();
40 
41  virtual int Initialize(
42  const std::vector <string> &files
43  );
44 
45 
60  //
61  virtual bool IsCoordVarCF(string var) const {
62  return(std::find( _coordinateVars.begin(), _coordinateVars.end(), var) != _coordinateVars.end());
63  }
64 
80  //
81  virtual bool IsAuxCoordVarCF(string var) const {
82  return(std::find( _auxCoordinateVars.begin(),
83  _auxCoordinateVars.end(), var) != _auxCoordinateVars.end());
84  }
85 
86 
94  //
95  virtual bool IsLatCoordVar(string var) const {
96  return(std::find( _latCoordVars.begin(),
97  _latCoordVars.end(), var) != _latCoordVars.end());
98  }
99 
107  //
108  virtual bool IsLonCoordVar(string var) const {
109  return(std::find( _lonCoordVars.begin(),
110  _lonCoordVars.end(), var) != _lonCoordVars.end());
111  }
112 
120  //
121  virtual bool IsTimeCoordVar(string var) const {
122  return(std::find( _timeCoordVars.begin(),
123  _timeCoordVars.end(), var) != _timeCoordVars.end());
124  }
125 
134  //
135  virtual bool IsVertCoordVar(string var) const {
136  return(std::find( _vertCoordVars.begin(),
137  _vertCoordVars.end(), var) != _vertCoordVars.end());
138  }
139 
155  virtual bool IsVertCoordVarUp(string var) const;
156 
157 
158 
161  virtual std::vector <string> GetLatCoordVars() const {return(_latCoordVars); };
162 
165  virtual std::vector <string> GetLonCoordVars() const {return(_lonCoordVars); };
166 
169  virtual std::vector <string> GetTimeCoordVars() const {return(_timeCoordVars); };
170 
173  virtual std::vector <string> GetVertCoordVars() const {return(_vertCoordVars); };
174 
175 
198  //
199  virtual std::vector <string> GetDataVariableNames(int ndim, bool spatial)const;
200 
233  //
234  virtual int GetVarCoordVarNames(string var, std::vector <string> &cvars) const;
235 
249  virtual int GetVarUnits(string var, string &units) const;
250 
254  const UDUnits *GetUDUnits() const {return(_udunit); };
255 
256 
275  virtual int Convert(
276  const string from,
277  const string to,
278  const double *src,
279  double *dst,
280  size_t n
281  ) const;
282 
283 
300  virtual bool GetMissingValue(string varname, double &mv) const;
301 
304  virtual int OpenRead(size_t ts, string varname);
305 
313  virtual bool IsVertDimensionless(string cvar) const;
314 
341  virtual int InstallStandardVerticalConverter(
342  string cvar, string newvar, string units = "meters"
343  );
344 
352  //
353  virtual void UninstallStandardVerticalConverter(string cvar) ;
354 
355 
363  //
364  bool GetMapProjectionProj4(
365  string varname, string &proj4string
366  ) const ;
367 
368  void FormatTimeStr(double time, string &str) const;
369 
370  friend std::ostream &operator<<(
371  std::ostream &o, const NetCDFCFCollection &ncdfc
372  );
373 
374 private:
375 
376  class DerivedVar_ocean_s_coordinate_g1 : public NetCDFCollection::DerivedVar {
377  public:
378  DerivedVar_ocean_s_coordinate_g1(
379  NetCDFCFCollection *ncdfcf,
380  const std::map <string, string> &formula_map
381  );
382  virtual ~DerivedVar_ocean_s_coordinate_g1();
383 
384  virtual int Open(size_t ts);
385  virtual int ReadSlice(float *slice, int);
386  virtual int Read(float *buf, int);
387  virtual int SeekSlice(int offset, int whence, int fd);
388  virtual int Close(int) {_is_open = false; return(0); };
389  virtual bool TimeVarying() const {return(false); };
390  virtual std::vector <size_t> GetSpatialDims() const { return(_dims); }
391  virtual std::vector <string> GetSpatialDimNames() const { return(_dimnames); }
392  virtual size_t GetTimeDim() const { return(0); }
393  virtual string GetTimeDimName() const { return(""); };
394  virtual bool GetMissingValue(double &mv) const {mv=0.0; return(false); }
395 
396  private:
397  std::vector <size_t> _dims;
398  std::vector <string> _dimnames;
399  size_t _slice_num;
400  float *_s;
401  float *_C;
402  float *_eta;
403  float *_depth;
404  float _depth_c;
405  string _svar;
406  string _Cvar;
407  string _etavar;
408  string _depthvar;
409  string _depth_cvar;
410  bool _is_open;
411  bool _ok;
412  };
413 
414  class DerivedVar_ocean_s_coordinate_g2 : public NetCDFCollection::DerivedVar {
415 
416  public:
417  DerivedVar_ocean_s_coordinate_g2(
418  NetCDFCFCollection *ncdfcf,
419  const std::map <string, string> &formula_map
420  );
421  virtual ~DerivedVar_ocean_s_coordinate_g2();
422 
423  virtual int Open(size_t ts);
424  virtual int ReadSlice(float *slice, int);
425  virtual int Read(float *buf, int);
426  virtual int SeekSlice(int offset, int whence, int fd);
427  virtual int Close(int) {_is_open = false; return(0); };
428  virtual bool TimeVarying() const {return(false); };
429  virtual std::vector <size_t> GetSpatialDims() const { return(_dims); }
430  virtual std::vector <string> GetSpatialDimNames() const { return(_dimnames); }
431  virtual size_t GetTimeDim() const { return(0); }
432  virtual string GetTimeDimName() const { return(""); };
433  virtual bool GetMissingValue(double &mv) const {mv=0.0; return(false); }
434 
435  private:
436  std::vector <size_t> _dims;
437  std::vector <string> _dimnames;
438  size_t _slice_num;
439  float *_s;
440  float *_C;
441  float *_eta;
442  float *_depth;
443  float _depth_c;
444  string _svar;
445  string _Cvar;
446  string _etavar;
447  string _depthvar;
448  string _depth_cvar;
449  bool _is_open;
450  bool _ok;
451  };
452 
453 
454 class DerivedVar_AHSPC : public NetCDFCollection::DerivedVar {
455 
456 public:
457  DerivedVar_AHSPC(
458  NetCDFCFCollection *ncdfcf,
459  const std::map <string, string> &formula_map
460  );
461  virtual ~DerivedVar_AHSPC();
462  virtual float GetMax() { return _max; }
463  virtual float GetMin() { return _min; }
464  virtual void SetMax(float val) { _max = val; }
465  virtual void SetMin(float val) { _min = val; }
466  virtual int Open(size_t ts);
467  virtual int ReadSlice(float *slice, int);
468  virtual int Read(float *buf, int);
469  virtual int SeekSlice(int offset, int whence, int fd);
470  virtual int Close(int) {_is_open = false; return(0); };
471  virtual bool TimeVarying() const {return(false); };
472  virtual std::vector <size_t> GetSpatialDims() const { return(_dims); }
473  virtual std::vector <string> GetSpatialDimNames() const { return(_dimnames); }
474  virtual size_t GetTimeDim() const { return(0); }
475  virtual string GetTimeDimName() const { return(""); };
476  virtual bool GetMissingValue(double &mv) const {mv=0.0; return(false); }
477 
478  private:
479  virtual int CalculateElevation();
480  virtual int DCZ2(const float* PS1, const float* PHIS1,
481  float** TV2, const int NL,
482  const float P0, float** HYBA, float** HYBB,
483  const int KLEV, const int MLON, const int MLON2,
484  float** HYPDLN, float** HYALPH, float** PTERM,
485  float** ZSLICE);
486  std::vector <size_t> _dims;
487  std::vector <string> _dimnames;
488  size_t _slice_num;
489  float *PS1;
490  float *PHIS1;
491  float *PS;
492  float *PHIS;
493  float *TV;
494  float P0;
495  float *HYAM;
496  float *HYBM;
497  float *HYAI;
498  float *HYBI;
499  float *_Z3;
500  bool _is_open;
501  bool _ok;
502  float _min;
503  float _max;
504  };
505 
506  class DerivedVar_noop : public NetCDFCollection::DerivedVar {
507 
508  public:
509  DerivedVar_noop(
510  NetCDFCFCollection *ncdfcf,
511  const std::map <string, string> &formula_map
512  );
513  virtual ~DerivedVar_noop() {}
514 
515  virtual int Open(size_t ts);
516  virtual int ReadSlice(float *slice, int fd);
517  virtual int Read(float *buf, int fd);
518  virtual int SeekSlice(int offset, int whence, int fd);
519  virtual int Close(int fd) {return(_ncdfc->Close(fd)); };
520  virtual bool TimeVarying() const {return(_ncdfc->IsTimeVarying(_zvar)); };
521  virtual std::vector <size_t> GetSpatialDims() const {
522  return(_ncdfc->GetSpatialDims(_zvar));
523  };
524  virtual std::vector <string> GetSpatialDimNames() const {
525  return(_ncdfc->GetSpatialDimNames(_zvar));
526  };
527  virtual size_t GetTimeDim() const {
528  return(_ncdfc->GetTimeDim(_zvar));
529  };
530  virtual string GetTimeDimName() const {
531  return(_ncdfc->GetTimeDimName(_zvar));
532  };
533 
534  virtual bool GetMissingValue(double &mv) const {
535  return(_ncdfc->GetMissingValue(_zvar, mv));
536  };
537 
538 
539  private:
540  string _zvar;
541  };
542 
543  std::map <string, DerivedVar *> _derivedVarsMap;
544  std::vector <std::string> _coordinateVars;
545  std::vector <std::string> _auxCoordinateVars;
546  std::vector <std::string> _lonCoordVars;
547  std::vector <std::string> _latCoordVars;
548  std::vector <std::string> _vertCoordVars;
549  std::vector <std::string> _timeCoordVars;
550 
551  UDUnits *_udunit;
552 
553  //
554  // Map a variable name to it's missing value (if any)
555  //
556  std::map <string, double> _missingValueMap;
557 
558  std::vector <std::string> _GetCoordAttrs(
559  const NetCDFSimple::Variable &varinfo
560  ) const;
561 
562  int _Initialize(const std::vector <string> &files);
563 
571  //
572  bool _IsCoordinateVar(const NetCDFSimple::Variable &varinfo) const;
573 
590 
591  bool _IsLonCoordVar(
592  const NetCDFSimple::Variable &varinfo
593  ) const;
594 
605  bool _IsLatCoordVar(
606  const NetCDFSimple::Variable &varinfo
607  ) const;
608 
622  bool _IsVertCoordVar(
623  const NetCDFSimple::Variable &varinfo
624  ) const;
625 
636  bool _IsTimeCoordVar(
637  const NetCDFSimple::Variable &varinfo
638  ) const;
639 
640  bool _GetMissingValue(string varname, string &attname, double &mv) const;
641  void _GetMissingValueMap(map <string, double> &missingValueMap) const;
642 
643  int _parse_formula(
644  string formula_terms, map <string, string> &parsed_terms
645  ) const;
646 
647 
648 
649 };
650 };
651 
652 
653 #endif
const UDUnits * GetUDUnits() const
#define VDF_API
Definition: common.h:61
virtual std::vector< string > GetVertCoordVars() const
virtual std::vector< string > GetLonCoordVars() const
Wrapper for a collection of netCDF files.
virtual bool IsAuxCoordVarCF(string var) const
virtual bool IsLonCoordVar(string var) const
virtual bool IsVertCoordVar(string var) const
virtual bool IsTimeCoordVar(string var) const
virtual bool IsLatCoordVar(string var) const
virtual std::vector< string > GetTimeCoordVars() const
virtual std::vector< string > GetLatCoordVars() const
virtual bool IsCoordVarCF(string var) const
Wrapper for a collection of netCDF files.