00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef DMCUT2_LATTICE_SITE_HPP
00020 #define DMCUT2_LATTICE_SITE_HPP
00021
00022 #include <set>
00023 #include <string>
00024 #include <string>
00025 #include <cassert>
00026 #include "Geometry.hpp"
00027 #include "SelfEnergy.hpp"
00028 #include "Species.hpp"
00029 #include "EventPtr.hpp"
00030 #include "Bridge.hpp"
00031
00032 namespace Surface {
00033
00034 namespace {
00035 #include <tr1/functional>
00036 struct sort_int_on_name: std::tr1::function<bool(Interactions::TwoBody::Geometry,
00037 Interactions::TwoBody::Geometry)> {
00038 bool operator()(const Interactions::TwoBody::Geometry& lhs,
00039 const Interactions::TwoBody::Geometry& rhs) const
00040 { return lhs.name() < rhs.name(); }
00041 };
00042
00043 struct sort_br_on_name: std::tr1::function<bool(Bridge, Bridge)> {
00044 bool operator()(const Bridge& lhs, const Bridge& rhs) const
00045 { return lhs.name() < rhs.name(); }
00046 };
00047 }
00048
00061 class Site
00062 {
00063 public:
00064 typedef std::string Name;
00065
00066 typedef std::size_t index_type;
00067
00068 typedef std::set<Interactions::TwoBody::Geometry, sort_int_on_name > TwoBodyInteractionsContainer;
00069
00070 typedef std::set<Bridge, sort_br_on_name > BridgeInteractionsContainer;
00071
00072 typedef std::vector<Reactions::EventPtr> EventContainer;
00073
00075 explicit
00076 Site(const Name& name, index_type index, const Species& species):
00077 two_body_interactions_container(),
00078 name_(name), index_(index), adsorbate_(species)
00079 { }
00080
00084
00085
00086 Site::Name name() const
00087 { return name_; }
00088
00089 Species species() const
00090 { return adsorbate_; }
00091
00093 bool empty() const
00094 { return adsorbate_.no_species(); }
00095
00096 index_type index() const
00097 { return index_; }
00098
00099 double self_energy() const
00100 { return species().no_species() ? 0.0 : self_energy_(*this); }
00101
00105 TwoBodyInteractionsContainer::const_reference
00106 two_body_interactions(const TwoBodyInteractionsContainer::value_type& two_body_interactions) const
00107 {
00108 assert (two_body_interactions_container.find(two_body_interactions)
00109 != two_body_interactions_container.end());
00110 return *two_body_interactions_container.find(two_body_interactions);
00111 }
00112
00113 std::pair<TwoBodyInteractionsContainer::const_iterator, TwoBodyInteractionsContainer::const_iterator>
00114 two_body_interactions_range()
00115 { return std::make_pair(two_body_interactions_container.begin(), two_body_interactions_container.end()); }
00116
00118
00122
00123
00124 void set_species(const Species& species)
00125 { adsorbate_ = species; }
00126
00127 void set_self_energy(const Interactions::SelfEnergy& self_energy)
00128 { self_energy_ = self_energy; }
00129
00132 void set_bridge_interactions(const Bridge& bridge)
00133 { bridge_interactions_container.insert(bridge); }
00134
00137 void set_two_body_interactions(const TwoBodyInteractionsContainer::value_type& two_body_interactions)
00138 { two_body_interactions_container.insert(two_body_interactions); }
00139
00141
00143 void Clear()
00144 { adsorbate_ = no_species; }
00145
00148 double InteractionEnergy() const;
00149
00153 double InteractionEnergyBridge(const Site* const other_site_ptr) const;
00154
00155 private:
00156 Site (const Site&);
00157 void operator= (const Site&);
00158
00159 Interactions::SelfEnergy self_energy_;
00160
00161 Site::Name name_;
00162
00163 index_type index_;
00164
00165 Species adsorbate_;
00166
00167 TwoBodyInteractionsContainer two_body_interactions_container;
00168
00169 BridgeInteractionsContainer bridge_interactions_container;
00170
00171 friend std::istream& operator>>(std::istream& is, Site& s);
00172 };
00173
00174 }
00175
00176 #include "Site-inl.hpp"
00177
00178 #endif