Changeset b119a0 for src/Atom/atom_atominfo.cpp
- Timestamp:
- Oct 19, 2014, 5:10:16 PM (11 years ago)
- Branches:
- Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
- Children:
- 5c8807
- Parents:
- 9e1bfb (diff), 46ce1c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Atom/atom_atominfo.cpp
r9e1bfb rb119a0 3 3 * Description: creates and alters molecular systems 4 4 * Copyright (C) 2010-2012 University of Bonn. All rights reserved. 5 * Copyright (C) 2014 Frederik Heber. All rights reserved. 5 6 * 6 7 * … … 55 56 charge(0.) 56 57 { 57 AtomicPosition.reserve(1); 58 AtomicPosition.push_back(zeroVec); 59 AtomicVelocity.reserve(1); 60 AtomicVelocity.push_back(zeroVec); 61 AtomicForce.reserve(1); 62 AtomicForce.push_back(zeroVec); 63 64 }; 58 AtomicPosition.insert( std::make_pair(0, zeroVec) ); 59 AtomicVelocity.insert( std::make_pair(0, zeroVec) ); 60 AtomicForce.insert( std::make_pair(0, zeroVec) ); 61 } 65 62 66 63 /** Copy constructor of class AtomInfo. … … 68 65 AtomInfo::AtomInfo(const AtomInfo &_atom) : 69 66 AtomicPosition(_atom.AtomicPosition), 67 AtomicVelocity(_atom.AtomicVelocity), 68 AtomicForce(_atom.AtomicForce), 70 69 AtomicElement(_atom.AtomicElement), 71 70 FixedIon(_atom.FixedIon), 72 71 charge(_atom.charge) 73 72 { 74 AtomicVelocity.reserve(1); 75 AtomicVelocity.push_back(zeroVec); 76 AtomicForce.reserve(1); 77 AtomicForce.push_back(zeroVec); 78 }; 73 } 79 74 80 75 AtomInfo::AtomInfo(const VectorInterface &_v) : … … 83 78 charge(0.) 84 79 { 85 if (AtomicPosition.size() < 1) 86 AtomicPosition.resize(1); 87 AtomicPosition[0] = _v.getPosition(); 88 AtomicVelocity.reserve(1); 89 AtomicVelocity.push_back(zeroVec); 90 AtomicForce.reserve(1); 91 AtomicForce.push_back(zeroVec); 80 AtomicPosition.insert( std::make_pair(0, _v.getPosition()) ); 81 AtomicVelocity.insert( std::make_pair(0, zeroVec) ); 82 AtomicForce.insert( std::make_pair(0, zeroVec) ); 92 83 }; 93 84 … … 98 89 }; 99 90 100 void AtomInfo::AppendTrajectoryStep() 101 { 102 NOTIFY(TrajectoryChanged); 103 AtomicPosition.push_back(zeroVec); 104 AtomicVelocity.push_back(zeroVec); 105 AtomicForce.push_back(zeroVec); 91 void AtomInfo::AppendTrajectoryStep(const unsigned int _step) 92 { 93 if (WorldTime::getTime() == _step) 94 NOTIFY(TrajectoryChanged); 95 AtomicPosition.insert( std::make_pair(_step, zeroVec) ); 96 AtomicVelocity.insert( std::make_pair(_step, zeroVec) ); 97 AtomicForce.insert( std::make_pair(_step, zeroVec) ); 106 98 LOG(5,"AtomInfo::AppendTrajectoryStep() called, size is (" 107 99 << AtomicPosition.size() << "," … … 110 102 } 111 103 112 void AtomInfo::removeTrajectoryStep() 113 { 114 NOTIFY(TrajectoryChanged); 115 AtomicPosition.pop_back(); 116 AtomicVelocity.pop_back(); 117 AtomicForce.pop_back(); 104 void AtomInfo::removeTrajectoryStep(const unsigned int _step) 105 { 106 if (WorldTime::getTime() == _step) 107 NOTIFY(TrajectoryChanged); 108 AtomicPosition.erase(_step); 109 AtomicVelocity.erase(_step); 110 AtomicForce.erase(_step); 118 111 LOG(5,"AtomInfo::removeTrajectoryStep() called, size is (" 119 112 << AtomicPosition.size() << "," … … 141 134 const double& AtomInfo::operator[](size_t i) const 142 135 { 143 ASSERT(AtomicPosition.size() > WorldTime::getTime(), 144 "AtomInfo::operator[]() - Access out of range: " 145 +toString(WorldTime::getTime()) 146 +" not in [0,"+toString(AtomicPosition.size())+")."); 147 return AtomicPosition[WorldTime::getTime()][i]; 136 return atStep(i, WorldTime::getTime()); 148 137 } 149 138 150 139 const double& AtomInfo::at(size_t i) const 151 140 { 152 ASSERT(AtomicPosition.size() > WorldTime::getTime(), 153 "AtomInfo::at() - Access out of range: " 154 +toString(WorldTime::getTime()) 155 +" not in [0,"+toString(AtomicPosition.size())+")."); 156 return AtomicPosition[WorldTime::getTime()].at(i); 141 return atStep(i, WorldTime::getTime()); 157 142 } 158 143 159 144 const double& AtomInfo::atStep(size_t i, unsigned int _step) const 160 145 { 161 ASSERT( AtomicPosition.size() > _step,162 "AtomInfo:: atStep() - Access out of range: "163 +toString(_step)164 +" not in [0,"+toString(AtomicPosition.size())+").");165 return AtomicPosition[_step].at(i);146 ASSERT(!AtomicPosition.empty(), 147 "AtomInfo::operator[]() - AtomicPosition is empty."); 148 VectorTrajectory_t::const_iterator iter = 149 AtomicPosition.lower_bound(_step); 150 return iter->second[i]; 166 151 } 167 152 … … 170 155 OBSERVE; 171 156 NOTIFY(AtomObservable::PositionChanged); 172 ASSERT(AtomicPosition.size() > WorldTime::getTime(), 173 "AtomInfo::set() - Access out of range: " 174 +toString(WorldTime::getTime()) 175 +" not in [0,"+toString(AtomicPosition.size())+")."); 176 AtomicPosition[WorldTime::getTime()].at(i) = value; 157 VectorTrajectory_t::iterator iter = AtomicPosition.find(WorldTime::getTime()); 158 if (iter != AtomicPosition.end()) { 159 iter->second[i] = value; 160 } else { 161 Vector newPos; 162 newPos[i] = value; 163 #ifndef NDEBUG 164 std::pair<VectorTrajectory_t::iterator, bool> inserter = 165 #endif 166 AtomicPosition.insert( std::make_pair(WorldTime::getTime(), newPos) ); 167 ASSERT( inserter.second, 168 "AtomInfo::set() - time step "+toString(WorldTime::getTime()) 169 +" present after all?"); 170 } 171 } 172 173 /** Helps to determine whether the current step really exists or getPosition() has just 174 * delivered the one closest to it in the past. 175 * 176 * \param _step step to check 177 * \param true - step exists, false - step does not exist, getPosition() delivers closest 178 */ 179 bool AtomInfo::isStepPresent(const unsigned int _step) const 180 { 181 VectorTrajectory_t::const_iterator iter = 182 AtomicPosition.find(_step); 183 return iter != AtomicPosition.end(); 177 184 } 178 185 179 186 const Vector& AtomInfo::getPosition() const 180 187 { 181 ASSERT(AtomicPosition.size() > WorldTime::getTime(), 182 "AtomInfo::getPosition() - Access out of range: " 183 +toString(WorldTime::getTime()) 184 +" not in [0,"+toString(AtomicPosition.size())+")."); 185 return AtomicPosition[WorldTime::getTime()]; 188 return getPositionAtStep(WorldTime::getTime()); 186 189 } 187 190 188 191 const Vector& AtomInfo::getPositionAtStep(const unsigned int _step) const 189 192 { 190 ASSERT( _step < AtomicPosition.size(),191 "AtomInfo:: getPositionAtStep() - Access out of range: "192 +toString(_step)193 +" not in [0,"+toString(AtomicPosition.size())+").");194 return AtomicPosition[_step];193 ASSERT(!AtomicPosition.empty(), 194 "AtomInfo::operator[]() - AtomicPosition is empty."); 195 VectorTrajectory_t::const_iterator iter = 196 AtomicPosition.lower_bound(_step); 197 return iter->second; 195 198 } 196 199 … … 207 210 { 208 211 const element *elem = World::getInstance().getPeriode()->FindElement(Z); 209 if (elem != NULL) { 210 OBSERVE; 211 NOTIFY(AtomObservable::ElementChanged); 212 AtomicElement = Z; 213 } 214 } 215 216 //Vector& AtomInfo::getAtomicVelocity() 217 //{ 218 // return AtomicVelocity[0]; 219 //} 220 221 //Vector& AtomInfo::getAtomicVelocity(const int _step) 222 //{ 223 // ASSERT(_step < AtomicVelocity.size(), 224 // "AtomInfo::getAtomicVelocity() - Access out of range."); 225 // return AtomicVelocity[_step]; 226 //} 212 setType(elem); 213 } 227 214 228 215 const Vector& AtomInfo::getAtomicVelocity() const 229 216 { 230 ASSERT(AtomicVelocity.size() > 0, 231 "AtomInfo::getAtomicVelocity() - Access out of range: " 232 +toString(WorldTime::getTime()) 233 +" not in [0,"+toString(AtomicPosition.size())+")."); 234 return AtomicVelocity[WorldTime::getTime()]; 217 return getAtomicVelocityAtStep(WorldTime::getTime()); 235 218 } 236 219 237 220 const Vector& AtomInfo::getAtomicVelocityAtStep(const unsigned int _step) const 238 221 { 239 ASSERT(_step < AtomicVelocity.size(), 240 "AtomInfo::getAtomicVelocity() - Access out of range: " 241 +toString(_step) 242 +" not in [0,"+toString(AtomicPosition.size())+")."); 243 return AtomicVelocity[_step]; 222 ASSERT(!AtomicVelocity.empty(), 223 "AtomInfo::operator[]() - AtomicVelocity is empty."); 224 VectorTrajectory_t::const_iterator iter = 225 AtomicVelocity.lower_bound(_step); 226 // special, we only interpolate between present time steps not into the future 227 if (_step > AtomicVelocity.begin()->first) 228 return zeroVec; 229 else 230 return iter->second; 244 231 } 245 232 246 233 void AtomInfo::setAtomicVelocity(const Vector &_newvelocity) 247 234 { 235 setAtomicVelocityAtStep(WorldTime::getTime(), _newvelocity); 236 } 237 238 void AtomInfo::setAtomicVelocityAtStep(const unsigned int _step, const Vector &_newvelocity) 239 { 248 240 OBSERVE; 249 NOTIFY(AtomObservable::VelocityChanged); 250 ASSERT(WorldTime::getTime() < AtomicVelocity.size(), 251 "AtomInfo::setAtomicVelocity() - Access out of range: " 252 +toString(WorldTime::getTime()) 253 +" not in [0,"+toString(AtomicPosition.size())+")."); 254 AtomicVelocity[WorldTime::getTime()] = _newvelocity; 255 } 256 257 void AtomInfo::setAtomicVelocityAtStep(const unsigned int _step, const Vector &_newvelocity) 258 { 259 OBSERVE; 241 VectorTrajectory_t::iterator iter = AtomicVelocity.find(_step); 242 if (iter != AtomicVelocity.end()) { 243 iter->second = _newvelocity; 244 } else { 245 #ifndef NDEBUG 246 std::pair<VectorTrajectory_t::iterator, bool> inserter = 247 #endif 248 AtomicVelocity.insert( std::make_pair(_step, _newvelocity) ); 249 ASSERT( inserter.second, 250 "AtomInfo::set() - time step "+toString(_step) 251 +" present after all?"); 252 } 260 253 if (WorldTime::getTime() == _step) 261 254 NOTIFY(AtomObservable::VelocityChanged); 262 const unsigned int size = AtomicVelocity.size();263 ASSERT(_step <= size,264 "AtomInfo::setAtomicVelocityAtStep() - Access out of range: "265 +toString(_step)266 +" not in [0,"+toString(size)+"].");267 if(_step < size) {268 AtomicVelocity[_step] = _newvelocity;269 } else if (_step == size) {270 UpdateSteps();271 AtomicVelocity[_step] = _newvelocity;272 }273 255 } 274 256 275 257 const Vector& AtomInfo::getAtomicForce() const 276 258 { 277 ASSERT(WorldTime::getTime() < AtomicForce.size(), 278 "AtomInfo::getAtomicForce() - Access out of range: " 279 +toString(WorldTime::getTime()) 280 +" not in [0,"+toString(AtomicPosition.size())+")."); 281 return AtomicForce[WorldTime::getTime()]; 259 return getAtomicForceAtStep(WorldTime::getTime()); 282 260 } 283 261 284 262 const Vector& AtomInfo::getAtomicForceAtStep(const unsigned int _step) const 285 263 { 286 ASSERT(_step < AtomicForce.size(), 287 "AtomInfo::getAtomicForce() - Access out of range: " 288 +toString(_step) 289 +" not in [0,"+toString(AtomicPosition.size())+")."); 290 return AtomicForce[_step]; 264 ASSERT(!AtomicForce.empty(), 265 "AtomInfo::operator[]() - AtomicForce is empty."); 266 VectorTrajectory_t::const_iterator iter = 267 AtomicForce.lower_bound(_step); 268 // special, we only interpolate between present time steps not into the future 269 if (_step > AtomicForce.begin()->first) 270 return zeroVec; 271 else 272 return iter->second; 291 273 } 292 274 293 275 void AtomInfo::setAtomicForce(const Vector &_newforce) 294 276 { 277 setAtomicForceAtStep(WorldTime::getTime(), _newforce); 278 } 279 280 void AtomInfo::setAtomicForceAtStep(const unsigned int _step, const Vector &_newforce) 281 { 295 282 OBSERVE; 296 NOTIFY(AtomObservable::ForceChanged); 297 ASSERT(WorldTime::getTime() < AtomicForce.size(), 298 "AtomInfo::setAtomicForce() - Access out of range: " 299 +toString(WorldTime::getTime()) 300 +" not in [0,"+toString(AtomicPosition.size())+")."); 301 AtomicForce[WorldTime::getTime()] = _newforce; 302 } 303 304 void AtomInfo::setAtomicForceAtStep(const unsigned int _step, const Vector &_newforce) 305 { 306 OBSERVE; 283 VectorTrajectory_t::iterator iter = AtomicForce.find(_step); 284 if (iter != AtomicForce.end()) { 285 iter->second = _newforce; 286 } else { 287 #ifndef NDEBUG 288 std::pair<VectorTrajectory_t::iterator, bool> inserter = 289 #endif 290 AtomicForce.insert( std::make_pair(_step, _newforce) ); 291 ASSERT( inserter.second, 292 "AtomInfo::set() - time step "+toString(_step) 293 +" present after all?"); 294 } 307 295 if (WorldTime::getTime() == _step) 308 296 NOTIFY(AtomObservable::ForceChanged); 309 const unsigned int size = AtomicForce.size();310 ASSERT(_step <= size,311 "AtomInfo::setAtomicForce() - Access out of range: "312 +toString(_step)313 +" not in [0,"+toString(AtomicPosition.size())+"].");314 if(_step < size) {315 AtomicForce[_step] = _newforce;316 } else if (_step == size) {317 UpdateSteps();318 AtomicForce[_step] = _newforce;319 }320 297 } 321 298 … … 334 311 void AtomInfo::setPosition(const Vector& _vector) 335 312 { 313 setPositionAtStep(WorldTime::getTime(), _vector); 314 } 315 316 void AtomInfo::setPositionAtStep(unsigned int _step, const Vector& _vector) 317 { 336 318 OBSERVE; 337 NOTIFY(AtomObservable::PositionChanged);338 ASSERT(WorldTime::getTime() < AtomicPosition.size(),339 "AtomInfo::setPosition() - Access out of range: "340 +toString(WorldTime::getTime())341 +" not in [0,"+toString(AtomicPosition.size())+")."); 342 AtomicPosition[WorldTime::getTime()] = _vector;343 //cout << "AtomInfo::setPosition: " << getType()->symbol << " at " << getPosition() << endl; 344 } 345 346 void AtomInfo::setPositionAtStep(unsigned int _step, const Vector& _vector)347 { 348 OBSERVE;319 VectorTrajectory_t::iterator iter = AtomicPosition.find(_step); 320 if (iter != AtomicPosition.end()) { 321 iter->second = _vector; 322 } else { 323 #ifndef NDEBUG 324 std::pair<VectorTrajectory_t::iterator, bool> inserter = 325 #endif 326 AtomicPosition.insert( std::make_pair(_step, _vector) ); 327 ASSERT( inserter.second, 328 "AtomInfo::set() - time step "+toString(_step) 329 +" present after all?"); 330 } 349 331 if (WorldTime::getTime() == _step) 350 332 NOTIFY(AtomObservable::PositionChanged); 351 const unsigned int size = AtomicPosition.size();352 ASSERT(_step <= size,353 "AtomInfo::setPosition() - Access out of range: "354 +toString(_step)355 +" not in [0,"+toString(size)+"].");356 if(_step < size) {357 AtomicPosition[_step] = _vector;358 } else if (_step == size) {359 UpdateSteps();360 AtomicPosition[_step] = _vector;361 }362 //cout << "AtomInfo::setPosition: " << getType()->symbol << " at " << getPosition() << endl;363 333 } 364 334 365 335 const VectorInterface& AtomInfo::operator+=(const Vector& b) 366 336 { 367 OBSERVE; 368 NOTIFY(AtomObservable::PositionChanged); 369 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 370 "AtomInfo::operator+=() - Access out of range: " 371 +toString(WorldTime::getTime()) 372 +" not in [0,"+toString(AtomicPosition.size())+")."); 373 AtomicPosition[WorldTime::getTime()] += b; 337 setPosition(getPosition()+b); 374 338 return *this; 375 339 } … … 377 341 const VectorInterface& AtomInfo::operator-=(const Vector& b) 378 342 { 379 OBSERVE; 380 NOTIFY(AtomObservable::PositionChanged); 381 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 382 "AtomInfo::operator-=() - Access out of range: " 383 +toString(WorldTime::getTime()) 384 +" not in [0,"+toString(AtomicPosition.size())+")."); 385 AtomicPosition[WorldTime::getTime()] -= b; 343 setPosition(getPosition()-b); 386 344 return *this; 387 345 } … … 389 347 Vector const AtomInfo::operator+(const Vector& b) const 390 348 { 391 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 392 "AtomInfo::operator+() - Access out of range: " 393 +toString(WorldTime::getTime()) 394 +" not in [0,"+toString(AtomicPosition.size())+")."); 395 Vector a(AtomicPosition[WorldTime::getTime()]); 349 Vector a(getPosition()); 396 350 a += b; 397 351 return a; … … 400 354 Vector const AtomInfo::operator-(const Vector& b) const 401 355 { 402 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 403 "AtomInfo::operator-() - Access out of range: " 404 +toString(WorldTime::getTime()) 405 +" not in [0,"+toString(AtomicPosition.size())+")."); 406 Vector a(AtomicPosition[WorldTime::getTime()]); 356 Vector a(getPosition()); 407 357 a -= b; 408 358 return a; … … 411 361 double AtomInfo::distance(const Vector &point) const 412 362 { 413 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 414 "AtomInfo::distance() - Access out of range: " 415 +toString(WorldTime::getTime()) 416 +" not in [0,"+toString(AtomicPosition.size())+")."); 417 return AtomicPosition[WorldTime::getTime()].distance(point); 363 return getPosition().distance(point); 418 364 } 419 365 420 366 double AtomInfo::DistanceSquared(const Vector &y) const 421 367 { 422 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 423 "AtomInfo::DistanceSquared() - Access out of range: " 424 +toString(WorldTime::getTime()) 425 +" not in [0,"+toString(AtomicPosition.size())+")."); 426 return AtomicPosition[WorldTime::getTime()].DistanceSquared(y); 368 return getPosition().DistanceSquared(y); 427 369 } 428 370 429 371 double AtomInfo::distance(const VectorInterface &_atom) const 430 372 { 431 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 432 "AtomInfo::distance() - Access out of range: " 433 +toString(WorldTime::getTime()) 434 +" not in [0,"+toString(AtomicPosition.size())+")."); 435 return _atom.distance(AtomicPosition[WorldTime::getTime()]); 373 return _atom.distance(getPosition()); 436 374 } 437 375 438 376 double AtomInfo::DistanceSquared(const VectorInterface &_atom) const 439 377 { 440 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 441 "AtomInfo::DistanceSquared() - Access out of range: " 442 +toString(WorldTime::getTime()) 443 +" not in [0,"+toString(AtomicPosition.size())+")."); 444 return _atom.DistanceSquared(AtomicPosition[WorldTime::getTime()]); 378 return _atom.DistanceSquared(getPosition()); 445 379 } 446 380 447 381 VectorInterface &AtomInfo::operator=(const Vector& _vector) 448 382 { 449 OBSERVE; 450 NOTIFY(AtomObservable::PositionChanged); 451 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 452 "AtomInfo::operator=() - Access out of range: " 453 +toString(WorldTime::getTime()) 454 +" not in [0,"+toString(AtomicPosition.size())+")."); 455 AtomicPosition[WorldTime::getTime()] = _vector; 383 setPosition(_vector); 456 384 return *this; 457 385 } … … 459 387 void AtomInfo::ScaleAll(const double *factor) 460 388 { 461 OBSERVE; 462 NOTIFY(AtomObservable::PositionChanged); 463 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 464 "AtomInfo::ScaleAll() - Access out of range: " 465 +toString(WorldTime::getTime()) 466 +" not in [0,"+toString(AtomicPosition.size())+")."); 467 AtomicPosition[WorldTime::getTime()].ScaleAll(factor); 389 Vector temp(getPosition()); 390 temp.ScaleAll(factor); 391 setPosition(temp); 468 392 } 469 393 470 394 void AtomInfo::ScaleAll(const Vector &factor) 471 395 { 472 OBSERVE; 473 NOTIFY(AtomObservable::PositionChanged); 474 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 475 "AtomInfo::ScaleAll() - Access out of range: " 476 +toString(WorldTime::getTime()) 477 +" not in [0,"+toString(AtomicPosition.size())+")."); 478 AtomicPosition[WorldTime::getTime()].ScaleAll(factor); 396 Vector temp(getPosition()); 397 temp.ScaleAll(factor); 398 setPosition(temp); 479 399 } 480 400 481 401 void AtomInfo::Scale(const double factor) 482 402 { 483 OBSERVE; 484 NOTIFY(AtomObservable::PositionChanged); 485 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 486 "AtomInfo::Scale() - Access out of range: " 487 +toString(WorldTime::getTime()) 488 +" not in [0,"+toString(AtomicPosition.size())+")."); 489 AtomicPosition[WorldTime::getTime()].Scale(factor); 403 Vector temp(getPosition()); 404 temp.Scale(factor); 405 setPosition(temp); 490 406 } 491 407 492 408 void AtomInfo::Zero() 493 409 { 494 OBSERVE; 495 NOTIFY(AtomObservable::PositionChanged); 496 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 497 "AtomInfo::Zero() - Access out of range: " 498 +toString(WorldTime::getTime()) 499 +" not in [0,"+toString(AtomicPosition.size())+")."); 500 AtomicPosition[WorldTime::getTime()].Zero(); 410 setPosition(zeroVec); 501 411 } 502 412 503 413 void AtomInfo::One(const double one) 504 414 { 505 OBSERVE; 506 NOTIFY(AtomObservable::PositionChanged); 507 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 508 "AtomInfo::One() - Access out of range: " 509 +toString(WorldTime::getTime()) 510 +" not in [0,"+toString(AtomicPosition.size())+")."); 511 AtomicPosition[WorldTime::getTime()].One(one); 415 setPosition(Vector(one,one,one)); 512 416 } 513 417 514 418 void AtomInfo::LinearCombinationOfVectors(const Vector &x1, const Vector &x2, const Vector &x3, const double * const factors) 515 419 { 516 OBSERVE; 517 NOTIFY(AtomObservable::PositionChanged); 518 ASSERT(WorldTime::getTime() < AtomicPosition.size(), 519 "AtomInfo::LinearCombinationOfVectors() - Access out of range: " 520 +toString(WorldTime::getTime()) 521 +" not in [0,"+toString(AtomicPosition.size())+")."); 522 AtomicPosition[WorldTime::getTime()].LinearCombinationOfVectors(x1,x2,x3,factors); 420 Vector newPos; 421 newPos.LinearCombinationOfVectors(x1,x2,x3,factors); 422 setPosition(newPos); 523 423 } 524 424 … … 528 428 double AtomInfo::getKineticEnergy(const unsigned int _step) const 529 429 { 530 ASSERT(_step < AtomicPosition.size(), 531 "AtomInfo::getKineticEnergy() - Access out of range: " 532 +toString(WorldTime::getTime()) 533 +" not in [0,"+toString(AtomicPosition.size())+")."); 534 return getMass() * AtomicVelocity[_step].NormSquared(); 430 return getMass() * getAtomicVelocityAtStep(_step).NormSquared(); 535 431 } 536 432 537 433 Vector AtomInfo::getMomentum(const unsigned int _step) const 538 434 { 539 ASSERT(_step < AtomicPosition.size(), 540 "AtomInfo::getMomentum() - Access out of range: " 541 +toString(WorldTime::getTime()) 542 +" not in [0,"+toString(AtomicPosition.size())+")."); 543 return getMass()*AtomicVelocity[_step]; 544 } 545 546 /** Extends the trajectory STL vector to the new size. 547 * Does nothing if \a MaxSteps is smaller than current size. 435 return getMass() * getAtomicVelocityAtStep(_step); 436 } 437 438 /** Decrease the trajectory if given \a MaxSteps is smaller. 439 * Does nothing if \a MaxSteps is larger than current size. 440 * 548 441 * \param MaxSteps 549 442 */ 550 443 void AtomInfo::ResizeTrajectory(size_t MaxSteps) 551 444 { 552 for (;AtomicPosition.size() <= (unsigned int)(MaxSteps);) 553 UpdateSteps(); 445 // mind the reverse ordering due to std::greater, latest time steps are at beginning 446 VectorTrajectory_t::iterator positer = AtomicPosition.lower_bound(MaxSteps); 447 if (positer != AtomicPosition.begin()) { 448 if (positer->first == MaxSteps) 449 --positer; 450 AtomicPosition.erase(AtomicPosition.begin(), positer); 451 } 452 VectorTrajectory_t::iterator veliter = AtomicVelocity.lower_bound(MaxSteps); 453 if (veliter != AtomicVelocity.begin()) { 454 if (veliter->first == MaxSteps) 455 --veliter; 456 AtomicVelocity.erase(AtomicVelocity.begin(), veliter); 457 } 458 VectorTrajectory_t::iterator forceiter = AtomicForce.lower_bound(MaxSteps); 459 if (forceiter != AtomicForce.begin()) { 460 if (forceiter->first == MaxSteps) 461 --forceiter; 462 AtomicForce.erase(AtomicForce.begin(), forceiter); 463 } 554 464 } 555 465 556 466 size_t AtomInfo::getTrajectorySize() const 557 467 { 558 return AtomicPosition.size(); 468 // mind greater comp for map here: first element is latest in time steps! 469 return AtomicPosition.begin()->first+1; 559 470 } 560 471 … … 562 473 { 563 474 return getType()->getMass(); 475 } 476 477 /** Helper function to either insert or assign, depending on the element being 478 * present already. 479 * 480 * \param _trajectory vector of Vectors to assign 481 * \param dest step to insert/assign to 482 * \param _newvalue new Vector value 483 */ 484 void assignTrajectoryElement( 485 std::map<unsigned int, Vector, std::greater<unsigned int> > &_trajectory, 486 const unsigned int dest, 487 const Vector &_newvalue) 488 { 489 std::pair<std::map<unsigned int, Vector, std::greater<unsigned int> >::iterator, bool> inserter = 490 _trajectory.insert( std::make_pair(dest, _newvalue) ); 491 if (!inserter.second) 492 inserter.first->second = _newvalue; 564 493 } 565 494 … … 579 508 } 580 509 581 ASSERT(dest < AtomicPosition.size(), 582 "AtomInfo::CopyStepOnStep() - destination outside of current trajectory array: " 583 +toString(dest) 584 +" not in [0,"+toString(AtomicPosition.size())+")."); 585 ASSERT(src < AtomicPosition.size(), 586 "AtomInfo::CopyStepOnStep() - source outside of current trajectory array: " 587 +toString(src) 588 +" not in [0,"+toString(AtomicPosition.size())+")."); 589 for (int n=NDIM;n--;) { 590 AtomicPosition.at(dest)[n] = AtomicPosition.at(src)[n]; 591 AtomicVelocity.at(dest)[n] = AtomicVelocity.at(src)[n]; 592 AtomicForce.at(dest)[n] = AtomicForce.at(src)[n]; 593 } 510 VectorTrajectory_t::iterator positer = AtomicPosition.find(src); 511 ASSERT( positer != AtomicPosition.end(), 512 "AtomInfo::CopyStepOnStep() - step " 513 +toString(src)+" to copy from not present in AtomicPosition."); 514 VectorTrajectory_t::iterator veliter = AtomicVelocity.find(src); 515 ASSERT( veliter != AtomicVelocity.end(), 516 "AtomInfo::CopyStepOnStep() - step " 517 +toString(src)+" to copy from not present in AtomicVelocity."); 518 VectorTrajectory_t::iterator forceiter = AtomicForce.find(src); 519 ASSERT( forceiter != AtomicForce.end(), 520 "AtomInfo::CopyStepOnStep() - step " 521 +toString(src)+" to copy from not present in AtomicForce."); 522 assignTrajectoryElement(AtomicPosition, dest, positer->second); 523 assignTrajectoryElement(AtomicVelocity, dest, veliter->second); 524 assignTrajectoryElement(AtomicForce, dest, forceiter->second); 594 525 }; 595 526 … … 656 587 }; 657 588 658 //const AtomInfo& operator*=(AtomInfo& a, const double m)659 //{660 // a.Scale(m);661 // return a;662 //}663 //664 //AtomInfo const operator*(const AtomInfo& a, const double m)665 //{666 // AtomInfo copy(a);667 // copy *= m;668 // return copy;669 //}670 //671 //AtomInfo const operator*(const double m, const AtomInfo& a)672 //{673 // AtomInfo copy(a);674 // copy *= m;675 // return copy;676 //}677 678 589 std::ostream & AtomInfo::operator << (std::ostream &ost) const 679 590 {
Note:
See TracChangeset
for help on using the changeset viewer.