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 //
30 
38 //
40 
41 public:
42 
49  enum VarType_T {
50  VARUNKNOWN = -1,
51  VAR3D, VAR2D_XY, VAR2D_XZ, VAR2D_YZ
52  };
53 
63  //
64  DataMgr(
65  size_t mem_size
66  );
67 
68  virtual ~DataMgr();
69 
71  //
72  virtual void GetDim(size_t dim[3], int reflevel = 0) const {
73  return(_GetDim(dim, reflevel));
74  }
75 
77  //
78  int GetNumTransforms() const { return(_GetNumTransforms()); };
79 
81  //
82  virtual vector <size_t> GetCRatios() const { return( _GetCRatios()); }
83 
85  //
86  virtual string GetCoordSystemType() const {
87  return(_GetCoordSystemType());
88  }
89 
91  //
92  virtual string GetGridType() const { return(_GetGridType()); };
93 
95  //
96  virtual vector<double> GetExtents(size_t ts = 0);
97 
99  //
100  virtual long GetNumTimeSteps() const { return(_GetNumTimeSteps()); };
101 
102 
104  //
105  virtual string GetMapProjection() const {
106  return(_GetMapProjection());
107  }
108 
109  virtual vector <string> GetVariableNames() const;
110 
112  //
113  virtual vector <string> GetVariables3D() const;
114 
116  //
117  virtual vector <string> GetVariables2DXY() const;
118 
120  //
121  virtual vector <string> GetVariables2DXZ() const;
122 
124  //
125  virtual vector <string> GetVariables2DYZ() const;
126 
128  //
129  virtual vector <string> GetCoordinateVariables() const {
130  return(_GetCoordinateVariables());
131  };
132 
134  //
135  virtual vector<long> GetPeriodicBoundary() const {
136  return(_GetPeriodicBoundary());
137  };
138 
140  //
141  virtual vector<long> GetGridPermutation() const {
142  return(_GetGridPermutation());
143  };
144 
146  //
147  virtual double GetTSUserTime(size_t ts) const {
148  return(_GetTSUserTime(ts));
149  };
150 
152  //
153  virtual void GetTSUserTimeStamp(size_t ts, string &s) const {
154  return(_GetTSUserTimeStamp(ts, s));
155  };
156 
211  //
212 virtual RegularGrid *GetGrid(
213  size_t ts,
214  string varname,
215  int reflevel,
216  int lod,
217  const size_t min[3],
218  const size_t max[3],
219  bool lock = false
220  );
221 
236  //
237  void UnlockGrid(const RegularGrid *rg);
238 
240  //
241  int UnlockRegion(const float *) {return(-1);};
242 
246  //
247  void Clear();
248 
263  //
264  int GetDataRange(
265  size_t ts, const char *varname, float range[2],
266  int reflevel = 0, int lod = 0
267  );
268 
285  //
286  int GetValidRegion(
287  size_t ts,
288  const char *varname,
289  int reflevel,
290  size_t min[3],
291  size_t max[3]
292  );
293 
294 
296  //
297  virtual int VariableExists(
298  size_t ts,
299  const char *varname,
300  int reflevel = 0,
301  int lod = 0
302  ) ;
303 
304  bool BestMatch(
305  size_t ts, const char *varname, int req_reflevel, int req_lod,
306  int &reflevel, int &lod
307  );
308 
309 
329  int NewPipeline(PipeLine *pipeline);
330 
338  void RemovePipeline(string name);
339 
347  //
348  bool IsVariableDerived(string varname) const;
349 
358  //
359  bool IsVariableNative(string varname) const;
360 
361  virtual VarType_T GetVarType(const string &varname) const;
362 
363  bool GetMissingValue(string varname, float &value) const;
364 
365 
366 
371  void PurgeVariable(string varname);
372 
401  //
402  virtual void MapUserToVox(
403  size_t timestep,
404  const double vcoord0[3], size_t vcoord1[3], int reflevel = 0, int lod = 0
405  );
406 
430  //
431  virtual void MapVoxToUser(
432  size_t timestep,
433  const size_t vcoord0[3], double vcoord1[3], int ref_level = 0, int lod=0
434  );
435 
453  virtual void GetEnclosingRegion(
454  size_t ts, const double minu[3], const double maxu[3],
455  size_t min[3], size_t max[3],
456  int reflevel = 0, int lod = 0
457  );
458 
468  //
469  virtual bool IsCoordinateVariable(string varname) const;
470 
475  void PrintCache(std::ostream &o);
476 
489  void SetInterpolationOrder(int order) {_interpolationOrder = order;}
490 
494  int GetInterpolationOrder() const {return(_interpolationOrder); }
495 
496 protected:
497 
498 
499  const vector<string> emptyVec;
500 
501  // The protected methods below are pure virtual and must be implemented by any
502  // child class of the DataMgr.
503 
520  //
521  virtual void _GetDim(size_t dim[3], int reflevel = 0) const = 0;
522 
523 
538  //
539  virtual void _GetBlockSize(size_t bs[3], int reflevel) const = 0;
540 
549  //
550  virtual int _GetNumTransforms() const = 0;
551 
562  //
563  virtual vector <size_t> _GetCRatios() const {
564  vector <size_t> cr; cr.push_back(1); return(cr);
565  }
566 
570  //
571  virtual string _GetCoordSystemType() const { return("cartesian"); };
572 
578  //
579  virtual string _GetGridType() const { return("regular"); };
580 
599  //
600  virtual vector<double> _GetExtents(size_t ts = 0) const = 0;
601 
616  //
617  virtual vector <double> _GetTSXCoords(size_t ts) const {
618  vector <double> empty; return(empty);
619  }
620 
623  virtual vector <double> _GetTSYCoords(size_t ts) const {
624  vector <double> empty; return(empty);
625  }
626 
629  virtual vector <double> _GetTSZCoords(size_t ts) const {
630  vector <double> empty; return(empty);
631  }
632 
637  //
638  virtual long _GetNumTimeSteps() const = 0;
639 
640 
647  //
648  virtual string _GetMapProjection() const {string empty; return (empty); };
649 
654  //
655  virtual vector <string> _GetVariables3D() const = 0;
656 
662  //
663  virtual vector <string> _GetVariables2DXY() const = 0;
664 
670  //
671  virtual vector <string> _GetVariables2DXZ() const = 0;
672 
678  //
679  virtual vector <string> _GetVariables2DYZ() const = 0;
680 
693  //
694  virtual vector <string> _GetCoordinateVariables() const {
695  vector <string> v;
696  v.push_back("NONE"); v.push_back("NONE"); v.push_back("ELEVATION");
697  return(v);
698  }
699 
700 
706  //
707  virtual vector<long> _GetPeriodicBoundary() const = 0;
708 
709 
715  virtual vector<long> _GetGridPermutation() const {
716  vector <long> v; v.push_back(0); v.push_back(1); v.push_back(2); return(v);
717  };
718 
733  //
734  virtual double _GetTSUserTime(size_t ts) const = 0;
735 
736 
749  //
750  virtual void _GetTSUserTimeStamp(size_t ts, string &s) const = 0;
751 
752 
767  //
768  virtual int _VariableExists(
769  size_t ts,
770  const char *varname,
771  int reflevel = 0,
772  int lod = 0
773  ) const = 0;
774 
775 
813  virtual int _OpenVariableRead(
814  size_t timestep,
815  const char *varname,
816  int reflevel = 0,
817  int lod = 0
818  ) = 0;
819 
837  //
838  virtual void _GetValidRegion(
839  size_t min[3], size_t max[3], int reflevel
840  ) const = 0;
841 
853  virtual const float *_GetDataRange() const { return(NULL);};
854 
865  //
866  virtual bool _GetMissingValue(string varname, float &value) const {
867  return(false);
868  };
869 
870 
884  //
885  virtual int _BlockReadRegion(
886  const size_t bmin[3], const size_t bmax[3],
887  float *region
888  ) = 0;
889 
893  //
894  virtual int _CloseVariable() = 0;
895 
896 private:
897  int _interpolationOrder;
898 
899  size_t _mem_size;
900 
901  typedef struct {
902  size_t ts;
903  string varname;
904  int reflevel;
905  int lod;
906  size_t min[3];
907  size_t max[3];
908  int lock_counter;
909  float *blks;
910  } region_t;
911 
912  // a list of all allocated regions
913  list <region_t> _regionsList;
914 
915  BlkMemMgr *_blk_mem_mgr;
916 
917  vector <PipeLine *> _PipeLines;
918 
919 
920  //
921  // Cache for various metadata attributes
922  //
923  class VarInfoCache {
924  public:
925 
926  //
927  // min and max variable value range
928  //
929  bool GetRange(
930  size_t ts, string varname, int ref, int lod, float range[2]
931  ) const;
932  void SetRange(
933  size_t ts, string varname, int ref, int lod, const float range[2]
934  );
935  void PurgeRange(
936  size_t ts, string varname, int ref, int lod
937  );
938 
939  //
940  // min and max region extents
941  //
942  bool GetRegion(
943  size_t ts, string varname, int ref, size_t min[3], size_t max[3]
944  ) const;
945  void SetRegion(
946  size_t ts, string varname, int ref, const size_t min[3],
947  const size_t max[3]
948  );
949  void PurgeRegion(
950  size_t ts, string varname, int ref
951  );
952 
953  //
954  // does the variable exist?
955  //
956  bool GetExist(
957  size_t ts, string varname, int ref, int lod, bool &exist
958  ) const;
959  void SetExist(size_t ts, string varname, int ref, int lod, bool exist);
960  void PurgeExist(size_t ts, string varname, int ref, int lod);
961 
962  void PurgeVariable(string varname);
963  void Clear() {_cache.clear(); }
964 
965 
966 
967  private:
968 
969  class var_info {
970  public:
971  map <size_t, bool> exist;
972  map <size_t, vector <size_t> > region;
973  map <size_t, vector <float> > range;
974  };
975 
976  var_info *get_var_info(size_t ts, string varname) const;
977 
978  map <size_t, map <string, var_info> > _cache;
979  };
980 
981  VarInfoCache _VarInfoCache;
982  std::map <size_t, vector <double> > _extentsCache;
983 
984  float *get_region_from_cache(
985  size_t ts,
986  string varname,
987  int reflevel,
988  int lod,
989  const size_t min[3],
990  const size_t max[3],
991  bool lock
992  );
993 
994  float *get_region_from_fs(
995  size_t ts,
996  string varname,
997  int reflevel,
998  int lod,
999  const size_t min[3],
1000  const size_t max[3],
1001  bool lock
1002  );
1003 
1004  float *get_region(
1005  size_t ts, string varname, int reflevel, int lod,
1006  const size_t min[3], const size_t max[3], bool lock, bool *ondisk
1007  );
1008 
1009  void unlock_blocks(const float *blks);
1010 
1011  float *alloc_region(
1012  size_t ts,
1013  const char *varname,
1014  VarType_T vtype,
1015  int reflevel,
1016  int lod,
1017  const size_t min[3],
1018  const size_t max[3],
1019  bool lock,
1020  bool fill
1021  );
1022 
1023  void free_region(
1024  size_t ts,
1025  string varname,
1026  int reflevel,
1027  int lod,
1028  const size_t min[3],
1029  const size_t max[3]
1030  );
1031 
1032  void free_var(const string &, int do_native);
1033 
1034  int free_lru();
1035 
1036  int _DataMgr(size_t mem_size);
1037 
1038  RegularGrid *execute_pipeline(
1039  size_t ts, string varname, int reflevel, int lod,
1040  const size_t min[3], const size_t max[3], bool lock,
1041  float *xcblks, float *ycblks, float *zcblks
1042  );
1043 
1044  // Check for circular dependencies in a pipeline
1045  //
1046  bool cycle_check(
1047  const map <string, vector <string> > &graph,
1048  const string &node,
1049  const vector <string> &depends
1050  ) const;
1051 
1052  // Return true if the inputs of a require the outputs of b
1053  //
1054  bool depends_on(
1055  const PipeLine *a, const PipeLine *b
1056  ) const;
1057 
1058  vector <string> get_native_variables() const;
1059  vector <string> get_derived_variables() const;
1060 
1061  PipeLine *get_pipeline_for_var(string varname) const;
1062 
1063  void coord_array(
1064  const vector <double> &xin, vector <double> &xout, size_t ldelta
1065  ) const;
1066 
1067  void map_vox_to_user_regular(
1068  size_t timestep, const size_t vcoord0[3], double vcoord1[3], int reflevel
1069  ) const;
1070 
1071  void map_vox_to_blk(
1072  const size_t vcoord[3], size_t bcoord[3], int reflevel = -1
1073  ) const;
1074 
1075  void get_dim_blk( size_t bdim[3], int reflevel) const;
1076 
1077  RegularGrid *make_grid(
1078  size_t ts, string varname, int reflevel, int lod,
1079  const size_t bmin[3], const size_t bmax[3],
1080  float *blocks, float *xcblocks, float *ycblocks, float *zcblocks
1081  );
1082 
1083 
1084 
1085 
1086 
1087 };
1088 
1096  public:
1097 
1106  string name,
1107  vector <string> inputs,
1108  vector <pair <string, DataMgr::VarType_T> > outputs
1109  ) {
1110  _name = name;
1111  _inputs = inputs;
1112  _outputs = outputs;
1113  }
1114  virtual ~PipeLine(){
1115  }
1116 
1124  //
1125  virtual int Calculate (
1126  vector <const RegularGrid *> input_grids,
1127  vector <RegularGrid *> output_grids, // space for the output variables
1128  size_t ts, // current time step
1129  int reflevel, // refinement level
1130  int lod //
1131  ) = 0;
1132 
1134  //
1135  const string &GetName() const {return (_name); };
1136 
1138  //
1139  const vector <string> &GetInputs() const {return (_inputs); };
1140 
1142  //
1143  const vector <pair <string, DataMgr::VarType_T> > &GetOutputs() const {
1144  return (_outputs);
1145  };
1146 
1147 
1148 private:
1149  string _name;
1150  vector <string> _inputs;
1151  vector<pair<string, DataMgr::VarType_T> > _outputs;
1152 };
1153 
1154 
1155 };
1156 
1157 #endif // _DataMgr_h_
virtual string GetGridType() const
Definition: DataMgr.h:92
int GetNumTransforms() const
Definition: DataMgr.h:78
int GetInterpolationOrder() const
Definition: DataMgr.h:494
#define VDF_API
Definition: common.h:61
const vector< string > emptyVec
Definition: DataMgr.h:499
virtual void GetDim(size_t dim[3], int reflevel=0) const
Definition: DataMgr.h:72
const vector< pair< string, DataMgr::VarType_T > > & GetOutputs() const
Returns the PipeLine outputs.
Definition: DataMgr.h:1143
virtual double GetTSUserTime(size_t ts) const
Definition: DataMgr.h:147
A cache based data reader.
Definition: DataMgr.h:39
virtual vector< double > _GetTSXCoords(size_t ts) const
Definition: DataMgr.h:617
const vector< string > & GetInputs() const
Returns the PipeLine inputs.
Definition: DataMgr.h:1139
virtual string GetCoordSystemType() const
Definition: DataMgr.h:86
This class implements a 2D or 3D regular grid: a tessellation of Euculidean space by rectangles (2D) ...
virtual string GetMapProjection() const
Definition: DataMgr.h:105
int UnlockRegion(const float *)
Definition: DataMgr.h:241
virtual vector< long > GetGridPermutation() const
Definition: DataMgr.h:141
virtual string _GetMapProjection() const
Definition: DataMgr.h:648
virtual string _GetGridType() const
Definition: DataMgr.h:579
virtual string _GetCoordSystemType() const
Definition: DataMgr.h:571
virtual vector< long > GetPeriodicBoundary() const
Definition: DataMgr.h:135
virtual vector< size_t > _GetCRatios() const
Definition: DataMgr.h:563
virtual bool _GetMissingValue(string varname, float &value) const
Definition: DataMgr.h:866
virtual ~PipeLine()
Definition: DataMgr.h:1114
VetsUtil base class.
Definition: MyBase.h:68
PipeLine(string name, vector< string > inputs, vector< pair< string, DataMgr::VarType_T > > outputs)
Definition: DataMgr.h:1105
const string & GetName() const
Returns the PipeLine stages name.
Definition: DataMgr.h:1135
virtual vector< long > _GetGridPermutation() const
Definition: DataMgr.h:715
virtual vector< double > _GetTSZCoords(size_t ts) const
Definition: DataMgr.h:629
virtual const float * _GetDataRange() const
Definition: DataMgr.h:853
virtual vector< size_t > GetCRatios() const
Definition: DataMgr.h:82
virtual vector< string > _GetCoordinateVariables() const
Definition: DataMgr.h:694
virtual void GetTSUserTimeStamp(size_t ts, string &s) const
Definition: DataMgr.h:153
virtual vector< string > GetCoordinateVariables() const
Definition: DataMgr.h:129
void SetInterpolationOrder(int order)
Definition: DataMgr.h:489
virtual long GetNumTimeSteps() const
Definition: DataMgr.h:100
virtual vector< double > _GetTSYCoords(size_t ts) const
Definition: DataMgr.h:623