Changes in src/molecule.cpp [5be798:e39e7a]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/molecule.cpp
r5be798 re39e7a 36 36 37 37 #include <algorithm> 38 #include <boost/assign.hpp> 38 39 #include <boost/bind.hpp> 39 40 #include <boost/foreach.hpp> … … 50 51 #include "CodePatterns/enumeration.hpp" 51 52 #include "CodePatterns/Log.hpp" 53 #include "CodePatterns/Observer/Observable.hpp" 52 54 #include "CodePatterns/Observer/Notification.hpp" 53 55 #include "config.hpp" … … 67 69 #include "WorldTime.hpp" 68 70 71 using namespace boost::assign; 72 73 // static entities 74 static Observable::channels_t getBoundingBoxChannels() 75 { 76 Observable::channels_t channels; 77 channels += molecule::AtomInserted, molecule::AtomRemoved, molecule::AtomMoved; 78 return channels; 79 } 69 80 70 81 /************************************* Functions for class molecule *********************************/ … … 83 94 BondCount(this,boost::bind(&molecule::doCountBonds,this),"BondCount"), 84 95 atomIdPool(1, 20, 100), 96 BoundingBoxSweepingAxis(std::vector<AtomDistanceMap_t>(NDIM)), 85 97 _lastchangedatomid(-1), 86 98 last_atom(0) … … 92 104 OurChannel->addChannel(type); 93 105 106 // cannot initialize in initializer body as then channels have not been setup yet 107 BoundingBox.reset( 108 new Cacheable<BoundingBoxInfo>( 109 this, boost::bind(&molecule::updateBoundingBox, boost::cref(this)), "molecule_BoundingBox", getBoundingBoxChannels())); 110 94 111 strcpy(name,World::getInstance().getDefaultName().c_str()); 95 } ;112 } 96 113 97 114 molecule *NewMolecule(){ … … 170 187 } 171 188 189 bool molecule::changeAtomId(int oldId, int newId) 190 { 191 OBSERVE; 192 if ((!atomIds.contains( oldId )) || (atomIds.contains( newId ))) 193 return false; 194 atomIds.erase( oldId ); 195 atomIds.insert( newId ); 196 // also update BoundingBoxSweepingAxis 197 for (int i=0;i<NDIM;++i) { 198 AtomDistanceMap_t::left_iterator iter = BoundingBoxSweepingAxis[i].left.find(oldId); 199 ASSERT(iter != BoundingBoxSweepingAxis[i].left.end(), 200 "molecule::changeAtomId() - could not find atom "+toString(oldId) 201 +" in BoundingBoxSweepingAxis."); 202 const double component = iter->second; 203 BoundingBoxSweepingAxis[i].left.erase(iter); 204 BoundingBoxSweepingAxis[i].left.insert( std::make_pair(newId, component) ); 205 } 206 return true; 207 } 208 172 209 bool molecule::changeId(moleculeId_t newId){ 173 210 // first we move ourselves in the world … … 227 264 atomIds.erase( _atom->getId() ); 228 265 { 266 BoundingBoxInfo oldinfo = updateBoundingBox(); 267 for (int i=0;i<NDIM;++i) 268 BoundingBoxSweepingAxis[i].left.erase( _atom->getId() ); 269 BoundingBoxInfo newinfo = updateBoundingBox(); 270 if (oldinfo != newinfo) 271 NOTIFY(BoundingBoxChanged); 272 } 273 { 229 274 NOTIFY(AtomNrChanged); 230 275 atomIdPool.releaseId(_atom->getNr()); … … 240 285 molecule::const_iterator molecule::erase( atom * key ) 241 286 { 242 OBSERVE;243 {244 _lastchangedatomid = key->getId();245 NOTIFY(AtomRemoved);246 }247 287 const_iterator iter = const_cast<const molecule &>(*this).find(key); 248 if (iter != const_cast<const molecule &>(*this).end()){ 249 ++iter; 250 atomIds.erase( key->getId() ); 251 { 252 NOTIFY(AtomNrChanged); 253 atomIdPool.releaseId(key->getNr()); 254 LocalToGlobalId.erase(key->getNr()); 255 key->setNr(-1); 256 } 257 NOTIFY(FormulaChanged); 258 formula-=key->getType(); 259 key->removeFromMolecule(); 260 } 261 return iter; 288 if (iter != const_cast<const molecule &>(*this).end()) 289 return erase(iter); 290 else 291 return iter; 262 292 } 263 293 … … 269 299 std::pair<iterator,bool> res = atomIds.insert(key->getId()); 270 300 if (res.second) { // push atom if went well 301 { 302 BoundingBoxInfo oldinfo = updateBoundingBox(); 303 for (int i=0;i<NDIM;++i) 304 BoundingBoxSweepingAxis[i].left.insert( std::make_pair(key->getId(), key->getPosition()[i])); 305 BoundingBoxInfo newinfo = updateBoundingBox(); 306 if (oldinfo != newinfo) 307 NOTIFY(BoundingBoxChanged); 308 } 271 309 NOTIFY(AtomNrChanged); 272 310 key->setNr(atomIdPool.getNextId()); … … 1038 1076 } 1039 1077 1078 molecule::BoundingBoxInfo molecule::updateBoundingBox() const 1079 { 1080 BoundingBoxInfo info; 1081 Vector min = zeroVec; 1082 Vector max = zeroVec; 1083 for (int i=0;i<NDIM;++i) { 1084 if (!BoundingBoxSweepingAxis[i].right.empty()) { 1085 min[i] = BoundingBoxSweepingAxis[i].right.begin()->first; 1086 max[i] = BoundingBoxSweepingAxis[i].right.rbegin()->first; 1087 } 1088 } 1089 info.radius = (.5*(max-min)).Norm(); 1090 info.position = .5*(max+min); 1091 return info; 1092 } 1093 1094 molecule::BoundingBoxInfo molecule::getBoundingBox() const 1095 { 1096 return **BoundingBox; 1097 } 1098 1040 1099 void molecule::update(Observable *publisher) 1041 1100 { … … 1057 1116 // emit others about one of our atoms moved 1058 1117 _lastchangedatomid = _atom->getId(); 1118 // update entry in map 1119 BoundingBoxInfo oldinfo = updateBoundingBox(); 1120 for (int i=0;i<NDIM;++i) { 1121 AtomDistanceMap_t::left_iterator iter = BoundingBoxSweepingAxis[i].left.find(_atom->getId()); 1122 ASSERT(iter != BoundingBoxSweepingAxis[i].left.end(), 1123 "molecule::recieveNotification() - could not find atom "+toString(_atom->getId()) 1124 +" in BoundingBoxSweepingAxis."); 1125 BoundingBoxSweepingAxis[i].left.erase(iter); 1126 BoundingBoxSweepingAxis[i].left.insert( 1127 std::make_pair(_atom->getId(), _atom->getPosition()[i]) ); 1128 } 1129 BoundingBoxInfo newinfo = updateBoundingBox(); 1059 1130 OBSERVE; 1060 1131 NOTIFY(AtomMoved); 1132 if (oldinfo != newinfo) 1133 NOTIFY(BoundingBoxChanged); 1061 1134 break; 1062 1135 }
Note:
See TracChangeset
for help on using the changeset viewer.