VAPoR  0.1
DataMgr.h
Go to the documentation of this file.
1 //
2 // $Id$
3 //
4 
5 #ifndef _DataMgr_h_
6 #define _DataMgr_h_
7 
8 #include <list>
9 #include <map>
10 #include <string>
11 #include <vector>
12 #include <iostream>
13 #include <vapor/MyBase.h>
14 #include <vapor/BlkMemMgr.h>
15 #include <vapor/common.h>
16 #include <vapor/RegularGrid.h>
17 #include <vapor/LayeredGrid.h>
18 #include <vapor/SphericalGrid.h>
19 #include <vapor/StretchedGrid.h>
20 
21 namespace VAPoR {
22 class PipeLine;
23 
24 
25 //
31 
39 //
41 
42 public:
43 
50  enum VarType_T {
51  VARUNKNOWN = -1,
52  VAR3D, VAR2D_XY, VAR2D_XZ, VAR2D_YZ
53  };
54 
64  //
65  DataMgr(
66  size_t mem_size
67  );
68 
69  virtual ~DataMgr();
70 
72  //
73  virtual void GetDim(size_t dim[3], int reflevel = 0) const {
74  return(_GetDim(dim, reflevel));
75  }
76 
78  //
79  int GetNumTransforms() const { return(_GetNumTransforms()); };
80 
82  //
83  virtual vector <size_t> GetCRatios() const { return( _GetCRatios()); }
84 
86  //
87  virtual string GetCoordSystemType() const {
88  return(_GetCoordSystemType());
89  }
90 
92  //
93  virtual string GetGridType() const { return(_GetGridType()); };
94 
96  //
97  virtual vector<double> GetExtents(size_t ts = 0);
98 
100  //
101  virtual long GetNumTimeSteps() const { return(_GetNumTimeSteps()); };
102 
103 
105  //
106  virtual string GetMapProjection() const {
107  return(_GetMapProjection());
108  }
109 
110  virtual vector <string> GetVariableNames() const;
111 
113  //
114  virtual vector <string> GetVariables3D() const;
115 
117  //
118  virtual vector <string> GetVariables2DXY() const;
119 
121  //
122  virtual vector <string> GetVariables2DXZ() const;
123 
125  //
126  virtual vector <string> GetVariables2DYZ() const;
127 
129  //
130  virtual vector <string> GetCoordinateVariables() const {
131  return(_GetCoordinateVariables());
132  };
133 
135  //
136  virtual vector<long> GetPeriodicBoundary() const {
137  return(_GetPeriodicBoundary());
138  };
139 
141  //
142  virtual vector<long> GetGridPermutation() const {
143  return(_GetGridPermutation());
144  };
145 
147  //
148  virtual double GetTSUserTime(size_t ts) const {
149  return(_GetTSUserTime(ts));
150  };
151 
153  //
154  virtual void GetTSUserTimeStamp(size_t ts, string &s) const {
155  return(_GetTSUserTimeStamp(ts, s));
156  };
157 
212  //
213  RegularGrid *GetGrid(
214  size_t ts,
215  string varname,
216  int reflevel,
217  int lod,
218  const size_t min[3],
219  const size_t max[3],
220  bool lock = false
221  );
222 
237  //
238  void UnlockGrid(const RegularGrid *rg);
239 
241  //
242  int UnlockRegion(const float *) {return(-1);};
243 
247  //
248  void Clear();
249 
264  //
265  int GetDataRange(
266  size_t ts, const char *varname, float range[2],
267  int reflevel = 0, int lod = 0
268  );
269 
286  //
287  int GetValidRegion(
288  size_t ts,
289  const char *varname,
290  int reflevel,
291  size_t min[3],
292  size_t max[3]
293  );
294 
295 
297  //
298  virtual int VariableExists(
299  size_t ts,
300  const char *varname,
301  int reflevel = 0,
302  int lod = 0
303  ) ;
304 
305  bool BestMatch(
306  size_t ts, const char *varname, int req_reflevel, int req_lod,
307  int &reflevel, int &lod
308  );
309 
310 
330  int NewPipeline(PipeLine *pipeline);
331 
339  void RemovePipeline(string name);
340 
348  //
349  bool IsVariableDerived(string varname) const;
350 
359  //
360  bool IsVariableNative(string varname) const;
361 
362  virtual VarType_T GetVarType(const string &varname) const;
363 
364  bool GetMissingValue(string varname, float &value) const;
365 
366 
367 
372  void PurgeVariable(string varname);
373 
402  //
403  virtual void MapUserToVox(
404  size_t timestep,
405  const double vcoord0[3], size_t vcoord1[3], int reflevel = 0, int lod = 0
406  );
407 
431  //
432  virtual void MapVoxToUser(
433  size_t timestep,
434  const size_t vcoord0[3], double vcoord1[3], int ref_level = 0, int lod=0
435  );
436 
454  virtual void GetEnclosingRegion(
455  size_t ts, const double minu[3], const double maxu[3],
456  size_t min[3], size_t max[3],
457  int reflevel = 0, int lod = 0
458  );
459 
469  //
470  virtual bool IsCoordinateVariable(string varname) const;
471 
476  void PrintCache(std::ostream &o);
477 
478 protected:
479 
480 
481  const vector<string> emptyVec;
482 
483  // The protected methods below are pure virtual and must be implemented by any
484  // child class of the DataMgr.
485 
502  //
503  virtual void _GetDim(size_t dim[3], int reflevel = 0) const = 0;
504 
505 
520  //
521  virtual void _GetBlockSize(size_t bs[3], int reflevel) const = 0;
522 
531  //
532  virtual int _GetNumTransforms() const = 0;
533 
544  //
545  virtual vector <size_t> _GetCRatios() const {
546  vector <size_t> cr; cr.push_back(1); return(cr);
547  }
548 
552  //
553  virtual string _GetCoordSystemType() const { return("cartesian"); };
554 
560  //
561  virtual string _GetGridType() const { return("regular"); };
562 
581  //
582  virtual vector<double> _GetExtents(size_t ts = 0) const = 0;
583 
598  //
599  virtual vector <double> _GetTSXCoords(size_t ts) const {
600  vector <double> empty; return(empty);
601  }
602 
605  virtual vector <double> _GetTSYCoords(size_t ts) const {
606  vector <double> empty; return(empty);
607  }
608 
611  virtual vector <double> _GetTSZCoords(size_t ts) const {
612  vector <double> empty; return(empty);
613  }
614 
619  //
620  virtual long _GetNumTimeSteps() const = 0;
621 
622 
629  //
630  virtual string _GetMapProjection() const {string empty; return (empty); };
631 
636  //
637  virtual vector <string> _GetVariables3D() const = 0;
638 
644  //
645  virtual vector <string> _GetVariables2DXY() const = 0;
646 
652  //
653  virtual vector <string> _GetVariables2DXZ() const = 0;
654 
660  //
661  virtual vector <string> _GetVariables2DYZ() const = 0;
662 
675  //
676  virtual vector <string> _GetCoordinateVariables() const {
677  vector <string> v;
678  v.push_back("NONE"); v.push_back("NONE"); v.push_back("ELEVATION");
679  return(v);
680  }
681 
682 
688  //
689  virtual vector<long> _GetPeriodicBoundary() const = 0;
690 
691 
697  virtual vector<long> _GetGridPermutation() const {
698  vector <long> v; v.push_back(0); v.push_back(1); v.push_back(2); return(v);
699  };
700 
715  //
716  virtual double _GetTSUserTime(size_t ts) const = 0;
717 
718 
731  //
732  virtual void _GetTSUserTimeStamp(size_t ts, string &s) const = 0;
733 
734 
749  //
750  virtual int _VariableExists(
751  size_t ts,
752  const char *varname,
753  int reflevel = 0,
754  int lod = 0
755  ) const = 0;
756 
757 
795  virtual int _OpenVariableRead(
796  size_t timestep,
797  const char *varname,
798  int reflevel = 0,
799  int lod = 0
800  ) = 0;
801 
819  //
820  virtual void _GetValidRegion(
821  size_t min[3], size_t max[3], int reflevel
822  ) const = 0;
823 
835  virtual const float *_GetDataRange() const { return(NULL);};
836 
847  //
848  virtual bool _GetMissingValue(string varname, float &value) const {
849  return(false);
850  };
851 
852 
866  //
867  virtual int _BlockReadRegion(
868  const size_t bmin[3], const size_t bmax[3],
869  float *region
870  ) = 0;
871 
875  //
876  virtual int _CloseVariable() = 0;
877 
878 private:
879 
880  size_t _mem_size;
881 
882  typedef struct {
883  size_t ts;
884  string varname;
885  int reflevel;
886  int lod;
887  size_t min[3];
888  size_t max[3];
889  int lock_counter;
890  float *blks;
891  } region_t;
892 
893  // a list of all allocated regions
894  list <region_t> _regionsList;
895 
896  BlkMemMgr *_blk_mem_mgr;
897 
898  vector <PipeLine *> _PipeLines;
899 
900 
901  //
902  // Cache for various metadata attributes
903  //
904  class VarInfoCache {
905  public:
906 
907  //
908  // min and max variable value range
909  //
910  bool GetRange(
911  size_t ts, string varname, int ref, int lod, float range[2]
912  ) const;
913  void SetRange(
914  size_t ts, string varname, int ref, int lod, const float range[2]
915  );
916  void PurgeRange(
917  size_t ts, string varname, int ref, int lod
918  );
919 
920  //
921  // min and max region extents
922  //
923  bool GetRegion(
924  size_t ts, string varname, int ref, size_t min[3], size_t max[3]
925  ) const;
926  void SetRegion(
927  size_t ts, string varname, int ref, const size_t min[3],
928  const size_t max[3]
929  );
930  void PurgeRegion(
931  size_t ts, string varname, int ref
932  );
933 
934  //
935  // does the variable exist?
936  //
937  bool GetExist(
938  size_t ts, string varname, int ref, int lod, bool &exist
939  ) const;
940  void SetExist(size_t ts, string varname, int ref, int lod, bool exist);
941  void PurgeExist(size_t ts, string varname, int ref, int lod);
942 
943  void PurgeVariable(string varname);
944  void Clear() {_cache.clear(); }
945 
946 
947  private:
948 
949  class var_info {
950  public:
951  map <size_t, bool> exist;
952  map <size_t, vector <size_t> > region;
953  map <size_t, vector <float> > range;
954  };
955 
956  var_info *get_var_info(size_t ts, string varname) const;
957 
958  map <size_t, map <string, var_info> > _cache;
959  };
960 
961  VarInfoCache _VarInfoCache;
962  std::map <size_t, vector <double> > _extentsCache;
963 
964  float *get_region_from_cache(
965  size_t ts,
966  string varname,
967  int reflevel,
968  int lod,
969  const size_t min[3],
970  const size_t max[3],
971  bool lock
972  );
973 
974  float *get_region_from_fs(
975  size_t ts,
976  string varname,
977  int reflevel,
978  int lod,
979  const size_t min[3],
980  const size_t max[3],
981  bool lock
982  );
983 
984  float *get_region(
985  size_t ts, string varname, int reflevel, int lod,
986  const size_t min[3], const size_t max[3], bool lock, bool *ondisk
987  );
988 
989  void unlock_blocks(const float *blks);
990 
991  float *alloc_region(
992  size_t ts,
993  const char *varname,
994  VarType_T vtype,
995  int reflevel,
996  int lod,
997  const size_t min[3],
998  const size_t max[3],
999  bool lock,
1000  bool fill
1001  );
1002 
1003  void free_region(
1004  size_t ts,
1005  string varname,
1006  int reflevel,
1007  int lod,
1008  const size_t min[3],
1009  const size_t max[3]
1010  );
1011 
1012  void free_var(const string &, int do_native);
1013 
1014  int free_lru();
1015 
1016  int _DataMgr(size_t mem_size);
1017 
1018  RegularGrid *execute_pipeline(
1019  size_t ts, string varname, int reflevel, int lod,
1020  const size_t min[3], const size_t max[3], bool lock,
1021  float *xcblks, float *ycblks, float *zcblks
1022  );
1023 
1024  // Check for circular dependencies in a pipeline
1025  //
1026  bool cycle_check(
1027  const map <string, vector <string> > &graph,
1028  const string &node,
1029  const vector <string> &depends
1030  ) const;
1031 
1032  // Return true if the inputs of a require the outputs of b
1033  //
1034  bool depends_on(
1035  const PipeLine *a, const PipeLine *b
1036  ) const;
1037 
1038  vector <string> get_native_variables() const;
1039  vector <string> get_derived_variables() const;
1040 
1041  PipeLine *get_pipeline_for_var(string varname) const;
1042 
1043  void coord_array(
1044  const vector <double> &xin, vector <double> &xout, size_t ldelta
1045  ) const;
1046 
1047  void map_vox_to_user_regular(
1048  size_t timestep, const size_t vcoord0[3], double vcoord1[3], int reflevel
1049  ) const;
1050 
1051  void map_vox_to_blk(
1052  const size_t vcoord[3], size_t bcoord[3], int reflevel = -1
1053  ) const;
1054 
1055  void get_dim_blk( size_t bdim[3], int reflevel) const;
1056 
1057  RegularGrid *make_grid(
1058  size_t ts, string varname, int reflevel, int lod,
1059  const size_t bmin[3], const size_t bmax[3],
1060  float *blocks, float *xcblocks, float *ycblocks, float *zcblocks
1061  );
1062 
1063 
1064 
1065 
1066 
1067 };
1068 
1076  public:
1077 
1086  string name,
1087  vector <string> inputs,
1088  vector <pair <string, DataMgr::VarType_T> > outputs
1089  ) {
1090  _name = name;
1091  _inputs = inputs;
1092  _outputs = outputs;
1093  }
1094  virtual ~PipeLine(){
1095  }
1096 
1104  //
1105  virtual int Calculate (
1106  vector <const RegularGrid *> input_grids,
1107  vector <RegularGrid *> output_grids, // space for the output variables
1108  size_t ts, // current time step
1109  int reflevel, // refinement level
1110  int lod //
1111  ) = 0;
1112 
1114  //
1115  const string &GetName() const {return (_name); };
1116 
1118  //
1119  const vector <string> &GetInputs() const {return (_inputs); };
1120 
1122  //
1123  const vector <pair <string, DataMgr::VarType_T> > &GetOutputs() const {
1124  return (_outputs);
1125  };
1126 
1127 
1128 private:
1129  string _name;
1130  vector <string> _inputs;
1131  vector<pair<string, DataMgr::VarType_T> > _outputs;
1132 };
1133 
1134 
1135 };
1136 
1137 #endif // _DataMgr_h_
virtual string GetGridType() const
Definition: DataMgr.h:93
int GetNumTransforms() const
Definition: DataMgr.h:79
#define VDF_API
Definition: common.h:61
const vector< string > emptyVec
Definition: DataMgr.h:481
virtual void GetDim(size_t dim[3], int reflevel=0) const
Definition: DataMgr.h:73
const vector< pair< string, DataMgr::VarType_T > > & GetOutputs() const
Returns the PipeLine outputs.
Definition: DataMgr.h:1123
virtual double GetTSUserTime(size_t ts) const
Definition: DataMgr.h:148
A cache based data reader.
Definition: DataMgr.h:40
virtual vector< double > _GetTSXCoords(size_t ts) const
Definition: DataMgr.h:599
const vector< string > & GetInputs() const
Returns the PipeLine inputs.
Definition: DataMgr.h:1119
virtual string GetCoordSystemType() const
Definition: DataMgr.h:87
This class implements a 2D or 3D regular grid: a tessellation of Euculidean space by rectangles (2D) ...
virtual string GetMapProjection() const
Definition: DataMgr.h:106
int UnlockRegion(const float *)
Definition: DataMgr.h:242
virtual vector< long > GetGridPermutation() const
Definition: DataMgr.h:142
virtual string _GetMapProjection() const
Definition: DataMgr.h:630
virtual string _GetGridType() const
Definition: DataMgr.h:561
virtual string _GetCoordSystemType() const
Definition: DataMgr.h:553
virtual vector< long > GetPeriodicBoundary() const
Definition: DataMgr.h:136
virtual vector< size_t > _GetCRatios() const
Definition: DataMgr.h:545
virtual bool _GetMissingValue(string varname, float &value) const
Definition: DataMgr.h:848
virtual ~PipeLine()
Definition: DataMgr.h:1094
VetsUtil base class.
Definition: MyBase.h:68
PipeLine(string name, vector< string > inputs, vector< pair< string, DataMgr::VarType_T > > outputs)
Definition: DataMgr.h:1085
const string & GetName() const
Returns the PipeLine stages name.
Definition: DataMgr.h:1115
virtual vector< long > _GetGridPermutation() const
Definition: DataMgr.h:697
virtual vector< double > _GetTSZCoords(size_t ts) const
Definition: DataMgr.h:611
virtual const float * _GetDataRange() const
Definition: DataMgr.h:835
virtual vector< size_t > GetCRatios() const
Definition: DataMgr.h:83
virtual vector< string > _GetCoordinateVariables() const
Definition: DataMgr.h:676
virtual void GetTSUserTimeStamp(size_t ts, string &s) const
Definition: DataMgr.h:154
virtual vector< string > GetCoordinateVariables() const
Definition: DataMgr.h:130
virtual long GetNumTimeSteps() const
Definition: DataMgr.h:101
virtual vector< double > _GetTSYCoords(size_t ts) const
Definition: DataMgr.h:605