![]() |
![]() |
00001 #ifndef Grid3D_h 00002 #define Grid3D_h 00003 00014 #include <vector> 00015 00016 template <class Value, class T> 00017 class Grid3D { 00018 public: 00019 00020 typedef Value ValueType; 00021 typedef T Scalar; 00022 00023 Grid3D() {} 00024 00025 Grid3D( const Grid1D<T>& ga, const Grid1D<T>& gb, const Grid1D<T>& gc, 00026 const std::vector<Value>& data) : 00027 grida_(ga), gridb_(gb), gridc_(gc), data_(data) { 00028 stride1_ = gridb_.nodes() * gridc_.nodes(); 00029 stride2_ = gridc_.nodes(); 00030 } 00031 00032 const Value& operator()( int i, int j, int k) const { 00033 return data_[index(i,j,k)]; 00034 } 00035 00036 const Grid1D<T>& grida() const {return grida_;} 00037 const Grid1D<T>& gridb() const {return gridb_;} 00038 const Grid1D<T>& gridc() const {return gridc_;} 00039 00040 const std::vector<Value>& data() const {return data_;} 00041 00042 void dump() const; 00043 00044 private: 00045 00046 Grid1D<T> grida_; 00047 Grid1D<T> gridb_; 00048 Grid1D<T> gridc_; 00049 00050 std::vector<Value> data_; 00051 00052 int stride1_; 00053 int stride2_; 00054 00055 int index(int i, int j, int k) const {return i*stride1_ + j*stride2_ + k;} 00056 00057 }; 00058 00059 #include <iostream> 00060 template <class Value, class T> 00061 void Grid3D<Value,T>::dump() const 00062 { 00063 for (int j=0; j<gridb().nodes(); ++j) { 00064 for (int k=0; k<gridc().nodes(); ++k) { 00065 for (int i=0; i<grida().nodes(); ++i) { 00066 std::cout << grida().node(i) << " " << gridb().node(j) << " " << gridc().node(k) << " " << operator()(i,j,k) << std::endl; 00067 } 00068 } 00069 } 00070 } 00071 00072 #endif