SpherePackingScenarioGenerator
|
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