![]() |
00001 // Copyright (C) 2003 Johan Hoffman and Anders Logg. 00002 // Licensed under the GNU GPL Version 2. 00003 00004 #ifndef __TENSOR_H 00005 #define __TENSOR_H 00006 00007 namespace dolfin { 00008 00024 00025 template <class T> class Tensor { 00026 public: 00027 00029 Tensor(); 00030 00032 Tensor(int order, int dim); 00033 00035 Tensor(const Tensor& t); 00036 00038 ~Tensor(); 00039 00041 void init(int order, int dim); 00042 00044 void clear(); 00045 00047 T& operator() (int i0); 00048 00050 T& operator() (int i0, int i1); 00051 00053 T& operator() (int i0, int i1, int i2); 00054 00056 T& operator() (int* i); 00057 00059 void operator=(const Tensor<T>& t); 00060 00061 private: 00062 00063 int order; // Order of tensor (number of indices) 00064 int dim; // Dimension 00065 int size; // Total number of elements (dim^order) 00066 int *index; // Powers of dim 00067 00068 T *data; 00069 00070 }; 00071 00072 //--------------------------------------------------------------------------- 00073 // Implementation of Tensor 00074 //--------------------------------------------------------------------------- 00075 template <class T> Tensor<T>::Tensor() 00076 { 00077 order = 0; 00078 dim = 0; 00079 size = 0; 00080 index = 0; 00081 data = 0; 00082 } 00083 //--------------------------------------------------------------------------- 00084 template <class T> Tensor<T>::Tensor(int order, int dim) 00085 { 00086 dolfin_assert(order > 0); 00087 dolfin_assert(dim > 0); 00088 00089 this->order = 0; 00090 this->dim = 0; 00091 size = 0; 00092 index = 0; 00093 data = 0; 00094 00095 init(order, dim); 00096 } 00097 //--------------------------------------------------------------------------- 00098 template <class T> Tensor<T>::Tensor(const Tensor& t) 00099 { 00100 order = 0; 00101 dim = 0; 00102 size = 0; 00103 index = 0; 00104 data = 0; 00105 00106 *this = t; 00107 } 00108 //--------------------------------------------------------------------------- 00109 template <class T> Tensor<T>::~Tensor() 00110 { 00111 clear(); 00112 } 00113 //--------------------------------------------------------------------------- 00114 template <class T> void Tensor<T>::init(int order, int dim) 00115 { 00116 dolfin_assert(order > 0); 00117 dolfin_assert(dim > 0); 00118 00119 clear(); 00120 00121 this->order = order; 00122 this->dim = dim; 00123 00124 // Initialise the powers of dim: index = [ dim^(order-1) ... 1 ] 00125 index = new int[order]; 00126 for (int i = order - 1; i >= 0; i--) { 00127 if ( i == (order - 1) ) 00128 index[i] = 1; 00129 else 00130 index[i] = index[i+1] * dim; 00131 } 00132 00133 // Initialise the tensor 00134 size = index[0] * dim; 00135 data = new T[size]; 00136 for (int i = 0; i < size; i++) 00137 data[i] = 0; 00138 00139 } 00140 //--------------------------------------------------------------------------- 00141 template <class T> void Tensor<T>::clear() 00142 { 00143 order = 0; 00144 dim = 0; 00145 size = 0; 00146 00147 if ( index ) 00148 delete [] index; 00149 index = 0; 00150 00151 if ( data ) 00152 delete [] data; 00153 data = 0; 00154 } 00155 //--------------------------------------------------------------------------- 00156 template <class T> T& Tensor<T>::operator() (int i0) 00157 { 00158 return data[i0]; 00159 } 00160 //--------------------------------------------------------------------------- 00161 template <class T> T& Tensor<T>::operator() (int i0, int i1) 00162 { 00163 return data[i0*index[0] + i1]; 00164 } 00165 //--------------------------------------------------------------------------- 00166 template <class T> T& Tensor<T>::operator() (int i0, int i1, int i2) 00167 { 00168 return data[i0*index[0] + i1*index[1] + i2]; 00169 } 00170 //--------------------------------------------------------------------------- 00171 template <class T> T& Tensor<T>::operator() (int* i) 00172 { 00173 int ii = 0; 00174 for (int j = 0; j < order; j++) 00175 ii += i[j] * index[j]; 00176 return data[ii]; 00177 } 00178 //--------------------------------------------------------------------------- 00179 template <class T> void Tensor<T>::operator= (const Tensor<T>& t) 00180 { 00181 clear(); 00182 init(t.order, t.dim); 00183 00184 for (int i = 0; i < size; i++) 00185 data[i] = t.data[i]; 00186 } 00187 //--------------------------------------------------------------------------- 00188 00189 } 00190 00191 #endif
Documentation automatically generated with Doxygen on 10 Sep 2004.