SpherePackingScenarioGenerator
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
GridField.h
Go to the documentation of this file.
00001 /* 
00002    Packing of hard spheres via molecular dynamics
00003    Developed by Monica Skoge, 2006, Princeton University
00004    Contact: Aleksandar Donev (adonev@math.princeton.edu) with questions
00005    This code may be used, modified and distributed freely.
00006    Please cite:
00007    
00008    "Packing Hyperspheres in High-Dimensional Euclidean Spaces"
00009         M. Skoge, A. Donev, F. H. Stillinger and S. Torquato, 2006
00010         
00011    if you use these codes.      
00012 */
00013 
00014 
00015 #ifndef GridField_H
00016 #define GridField_H
00017 
00018 #include "Vector.h"
00019 namespace algorithms{
00020 namespace ls{
00025 template<int D, class T>
00026 class GridField {
00027  
00028  public:
00032   GridField();
00036   GridField(const Vector<D, int>&);
00040   ~GridField();
00044   T& get(const Vector<D, int>&);
00048   Vector<D, int> get_size() const;
00052   void set_size(const Vector<D, int>&);
00056   void set_size(const int);
00060   void initialize(const int i);
00061 
00062 
00063 
00064  private:
00065   int elements;
00066   T* f;
00067   Vector<D, int> size;           // number of grid points for each dimension
00068   Vector<D, int> offset;
00069 };
00070 
00071 
00072 // GridField
00073 // ~~~~~~~~~~~~
00074 template<int D, class T>
00075 GridField<D, T>::GridField()
00076   :  elements(0),f(0)
00077 {
00078 }
00079 
00080 
00081 // GridField
00082 // ~~~~~~~~~~~~
00083 template<int D, class T>
00084 GridField<D, T>::GridField(const Vector<D, int>& s)
00085   : f(0)
00086 {
00087   set_size(s);
00088 }
00089 
00090 
00091 // ~GridField
00092 // ~~~~~~~~~~~~~
00093 template <int D, class T>
00094 GridField<D, T>::~GridField()
00095 {
00096   if(f != 0)
00097     delete[] f;
00098 }
00099 
00100 
00101 // get_size
00102 // ~~~~~~~~
00103 template<int D, class T>
00104 inline Vector<D, int> GridField<D, T>::get_size() const
00105 {
00106   return size;
00107 }
00108 
00109 
00110 // set_size
00111 // ~~~~~~~~
00112 template<int D, class T>
00113 void GridField<D, T>::set_size(const Vector<D, int>& s)
00114 {
00115   if(f != 0)
00116     delete[] f;
00117 
00118   size = s;
00119 
00120   elements = 1;
00121   for(int i=0; i<D; i++) {
00122     offset[i] = elements;
00123     elements *= size.x[i];
00124   }
00125 
00126   f = new T[elements];
00127 }
00128 
00129 
00130 // set_size
00131 // ~~~~~~~~
00132 template<int D, class T>
00133 void GridField<D, T>::set_size(const int s)
00134 {
00135   Vector<D, int> square;
00136 
00137   for(int k=0; k<D; k++)
00138     square[k] = s;
00139 
00140   set_size(square);
00141 }
00142 
00143 
00144 // get
00145 // ~~~
00146 template<int D, class T>
00147 inline T& GridField<D, T>::get(const Vector<D, int>& pos)
00148 {
00149   int p=0;
00150   for(int i=0; i<D; i++)
00151     p += pos.x[i]*offset[i];
00152 
00153   return f[p];
00154 }
00155 
00156 
00157 // initialize
00158 // ~~~
00159 template<int D, class T>
00160 void GridField<D, T>::initialize(const int value)
00161 {
00162   for(int i=0; i<elements; i++)
00163     f[i] = value;
00164 }
00165 
00166 }/* close namespace ls */
00167 }/* close namespace algorithms */
00168 
00169 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines