00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef LATTICE_HPP
00020 #define LATTICE_HPP
00021
00022 #include <algorithm>
00023 #include <tr1/functional>
00024 #include "Site.hpp"
00025
00027 namespace Surface {
00028
00032
00033 extern unsigned temperature_;
00034
00036 inline unsigned temperature()
00037 { return temperature_; }
00038
00040 inline void set_temperature(unsigned temperature)
00041 { temperature_ = temperature; }
00043
00047
00048 extern std::vector<Site::Name> name_set_;
00049 extern Site::Name fcc;
00050 extern Site::Name hcp;
00051 extern Site::Name bridge;
00052 extern Site::Name any;
00053
00055 inline std::vector<Site::Name> name_set()
00056 { return name_set_; }
00057
00059 inline std::vector<Site::Name>::size_type multiplicity()
00060 { return name_set_.size(); }
00062
00063
00084 class Lattice {
00085
00086 typedef std::vector<Site*> SiteContainer;
00087
00088 public:
00089
00090
00091
00092
00093
00095 typedef SiteContainer::iterator iterator;
00096
00098 typedef SiteContainer::const_iterator const_iterator;
00099
00101 typedef SiteContainer::size_type size_type;
00102
00105 Lattice(const size_type length_side):
00106 length_side_(length_side), site_container_() {
00107 name_set_.push_back(fcc);
00108 name_set_.push_back(hcp);
00109
00110
00111 const size_type sz = length_side*length_side;
00112 site_container_.reserve(sz);
00113 for (size_type i = 0; i != sz; ++i) {
00114 const Site::Name
00115 name = name_set()[i % multiplicity()];
00116 site_container_.push_back(new Site(name, i, no_species));
00117 }
00118 }
00119
00121 ~Lattice() {
00122 for (iterator iter = begin(), last = end();
00123 iter != last; ++iter)
00124 { delete *iter; *iter = NULL; }
00125 }
00126
00130 void Populate(double coverage, const Species& species);
00131
00135 void Clean();
00136
00140 void set_bridge(const Bridge& bridge);
00141
00145
00146
00148 size_type width()
00149 { return length_side_; }
00150
00152 size_type height()
00153 { return length_side_; }
00154
00156
00161
00162
00163 iterator begin()
00164 { return site_container_.begin(); }
00165
00166 iterator end()
00167 { return site_container_.end(); }
00168
00169 const_iterator begin() const
00170 { return site_container_.begin(); }
00171
00172 const_iterator end() const
00173 { return site_container_.end(); }
00174
00175 size_type size() const
00176 { return site_container_.size(); }
00177
00178 bool empty() const
00179 { return site_container_.empty(); }
00180
00181 Site* operator[](size_type n)
00182 { return site_container_[n]; }
00183
00184 const Site* const operator[](size_type n) const
00185 { return site_container_[n]; }
00186
00187 Site* at(size_type n)
00188 { return site_container_.at(n); }
00189
00190 const Site* const at(size_type n) const
00191 { return site_container_.at(n); }
00192
00194
00195 private:
00196 Lattice (const Lattice&);
00197 void operator= (const Lattice&);
00198
00199 const size_type length_side_;
00200 SiteContainer site_container_;
00201 };
00202
00206
00207
00213 void Populate(Lattice::iterator first, Lattice::iterator last,
00214 double coverage, const Species& species);
00215
00219 void Clean(Lattice::iterator first, Lattice::iterator last);
00220
00225 void SetBridge(Lattice::iterator first, Lattice::iterator last,
00226 const Bridge& bridge);
00227
00229
00233 class HelicalBoundaryConditions:
00234 public std::tr1::function<Site*(Site*, Interactions::TwoBody::RelativeIndexContainer::value_type)> {
00235 public:
00239 HelicalBoundaryConditions(Surface::Lattice::iterator first,
00240 Surface::Lattice::size_type size):
00241 first_(first), size_lattice_(size)
00242 { };
00243
00248 Site* operator()(const Site* site_ptr,
00249 Interactions::TwoBody::RelativeIndexContainer::value_type offset);
00250
00251 private:
00252 Surface::Lattice::iterator first_;
00253 Surface::Lattice::size_type size_lattice_;
00254 };
00255
00256 }
00257
00258
00260 #include <ostream>
00261 inline std::ostream&
00262 operator<< (std::ostream& os, const Surface::Lattice& lattice) {
00263 for (Surface::Lattice::const_iterator iter = lattice.begin(),
00264 last = lattice.end(); iter != last; ++iter)
00265 { os << **iter << "\n"; }
00266 return os;
00267 }
00268
00269 #endif