Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

Tensor.h

Go to the documentation of this file.
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.