Changeset 735b1c for src/molecule_dynamics.cpp
- Timestamp:
- Mar 1, 2011, 10:16:39 AM (14 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:
- 5309ba
- Parents:
- a479fa
- git-author:
- Frederik Heber <heber@…> (02/22/11 00:15:33)
- git-committer:
- Frederik Heber <heber@…> (03/01/11 10:16:39)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/molecule_dynamics.cpp ¶
ra479fa r735b1c 59 59 break; 60 60 // determine normalized trajectories direction vector (n1, n2) 61 Sprinter = Params.PermutationMap[Walker-> ParticleInfo_nr]; // find first target point61 Sprinter = Params.PermutationMap[Walker->getNr()]; // find first target point 62 62 trajectory1 = Sprinter->getPositionAtStep(Params.endstep) - Walker->getPositionAtStep(Params.startstep); 63 63 trajectory1.Normalize(); 64 64 Norm1 = trajectory1.Norm(); 65 Sprinter = Params.PermutationMap[(*iter)-> ParticleInfo_nr]; // find second target point65 Sprinter = Params.PermutationMap[(*iter)->getNr()]; // find second target point 66 66 trajectory2 = Sprinter->getPositionAtStep(Params.endstep) - (*iter)->getPositionAtStep(Params.startstep); 67 67 trajectory2.Normalize(); … … 71 71 tmp = Walker->getPositionAtStep(Params.startstep).distance((*iter)->getPositionAtStep(Params.startstep)); 72 72 } else if (Norm1 < MYEPSILON) { 73 Sprinter = Params.PermutationMap[Walker-> ParticleInfo_nr]; // find first target point73 Sprinter = Params.PermutationMap[Walker->getNr()]; // find first target point 74 74 trajectory1 = Sprinter->getPositionAtStep(Params.endstep) - (*iter)->getPositionAtStep(Params.startstep); 75 75 trajectory2 *= trajectory1.ScalarProduct(trajectory2); // trajectory2 is scaled to unity, hence we don't need to divide by anything … … 77 77 tmp = trajectory1.Norm(); // remaining norm is distance 78 78 } else if (Norm2 < MYEPSILON) { 79 Sprinter = Params.PermutationMap[(*iter)-> ParticleInfo_nr]; // find second target point79 Sprinter = Params.PermutationMap[(*iter)->getNr()]; // find second target point 80 80 trajectory2 = Sprinter->getPositionAtStep(Params.endstep) - Walker->getPositionAtStep(Params.startstep); // copy second offset 81 81 trajectory1 *= trajectory2.ScalarProduct(trajectory1); // trajectory1 is scaled to unity, hence we don't need to divide by anything … … 147 147 double result = 0.; 148 148 for (molecule::const_iterator iter = mol->begin(); iter != mol->end(); ++iter) { 149 if ((Params.PermutationMap[Walker-> ParticleInfo_nr] == Params.PermutationMap[(*iter)->ParticleInfo_nr]) && (Walker->ParticleInfo_nr < (*iter)->ParticleInfo_nr)) {150 // atom *Sprinter = PermutationMap[Walker-> ParticleInfo_nr];149 if ((Params.PermutationMap[Walker->getNr()] == Params.PermutationMap[(*iter)->getNr()]) && (Walker->getNr() < (*iter)->getNr())) { 150 // atom *Sprinter = PermutationMap[Walker->getNr()]; 151 151 // Log() << Verbose(0) << *Walker << " and " << *(*iter) << " are heading to the same target at "; 152 152 // Log() << Verbose(0) << Sprinter->getPosition(endstep); … … 182 182 for (molecule::const_iterator iter = begin(); iter != end(); ++iter) { 183 183 // first term: distance to target 184 Runner = Params.PermutationMap[(*iter)-> ParticleInfo_nr]; // find target point184 Runner = Params.PermutationMap[(*iter)->getNr()]; // find target point 185 185 tmp = ((*iter)->getPositionAtStep(Params.startstep).distance(Runner->getPositionAtStep(Params.endstep))); 186 186 tmp *= Params.IsAngstroem ? 1. : 1./AtomicLengthToAngstroem; … … 213 213 zeile2 << " "; 214 214 for (int i=0;i<AtomCount;i++) { 215 Params.DoubleList[Params.PermutationMap[i]-> ParticleInfo_nr]++;215 Params.DoubleList[Params.PermutationMap[i]->getNr()]++; 216 216 zeile1 << i << " "; 217 zeile2 << Params.PermutationMap[i]-> ParticleInfo_nr<< " ";217 zeile2 << Params.PermutationMap[i]->getNr() << " "; 218 218 } 219 219 for (int i=0;i<AtomCount;i++) … … 239 239 for (molecule::const_iterator iter = mol->begin(); iter != mol->end(); ++iter) { 240 240 for (molecule::const_iterator runner = mol->begin(); runner != mol->end(); ++runner) { 241 Params.DistanceList[(*iter)-> ParticleInfo_nr]->insert( DistancePair((*iter)->getPositionAtStep(Params.startstep).distance((*runner)->getPositionAtStep(Params.endstep)), (*runner)) );241 Params.DistanceList[(*iter)->getNr()]->insert( DistancePair((*iter)->getPositionAtStep(Params.startstep).distance((*runner)->getPositionAtStep(Params.endstep)), (*runner)) ); 242 242 } 243 243 } … … 252 252 { 253 253 for (molecule::const_iterator iter = mol->begin(); iter != mol->end(); ++iter) { 254 Params.StepList[(*iter)-> ParticleInfo_nr] = Params.DistanceList[(*iter)->ParticleInfo_nr]->begin(); // stores the step to the next iterator that could be a possible next target255 Params.PermutationMap[(*iter)-> ParticleInfo_nr] = Params.DistanceList[(*iter)->ParticleInfo_nr]->begin()->second; // always pick target with the smallest distance256 Params.DoubleList[Params.DistanceList[(*iter)-> ParticleInfo_nr]->begin()->second->ParticleInfo_nr]++; // increase this target's source count (>1? not injective)257 Params.DistanceIterators[(*iter)-> ParticleInfo_nr] = Params.DistanceList[(*iter)->ParticleInfo_nr]->begin(); // and remember which one we picked258 DoLog(2) && (Log() << Verbose(2) << **iter << " starts with distance " << Params.DistanceList[(*iter)-> ParticleInfo_nr]->begin()->first << "." << endl);254 Params.StepList[(*iter)->getNr()] = Params.DistanceList[(*iter)->getNr()]->begin(); // stores the step to the next iterator that could be a possible next target 255 Params.PermutationMap[(*iter)->getNr()] = Params.DistanceList[(*iter)->getNr()]->begin()->second; // always pick target with the smallest distance 256 Params.DoubleList[Params.DistanceList[(*iter)->getNr()]->begin()->second->getNr()]++; // increase this target's source count (>1? not injective) 257 Params.DistanceIterators[(*iter)->getNr()] = Params.DistanceList[(*iter)->getNr()]->begin(); // and remember which one we picked 258 DoLog(2) && (Log() << Verbose(2) << **iter << " starts with distance " << Params.DistanceList[(*iter)->getNr()]->begin()->first << "." << endl); 259 259 } 260 260 }; … … 270 270 { 271 271 double Potential = 0; 272 DistanceMap::iterator NewBase = Params.DistanceIterators[Walker-> ParticleInfo_nr]; // store old base272 DistanceMap::iterator NewBase = Params.DistanceIterators[Walker->getNr()]; // store old base 273 273 do { 274 274 NewBase++; // take next further distance in distance to targets list that's a target of no one 275 } while ((Params.DoubleList[NewBase->second-> ParticleInfo_nr] != 0) && (NewBase != Params.DistanceList[Walker->ParticleInfo_nr]->end()));276 if (NewBase != Params.DistanceList[Walker-> ParticleInfo_nr]->end()) {277 Params.PermutationMap[Walker-> ParticleInfo_nr] = NewBase->second;275 } while ((Params.DoubleList[NewBase->second->getNr()] != 0) && (NewBase != Params.DistanceList[Walker->getNr()]->end())); 276 if (NewBase != Params.DistanceList[Walker->getNr()]->end()) { 277 Params.PermutationMap[Walker->getNr()] = NewBase->second; 278 278 Potential = fabs(mol->ConstrainedPotential(Params)); 279 279 if (Potential > OldPotential) { // undo 280 Params.PermutationMap[Walker-> ParticleInfo_nr] = Params.DistanceIterators[Walker->ParticleInfo_nr]->second;280 Params.PermutationMap[Walker->getNr()] = Params.DistanceIterators[Walker->getNr()]->second; 281 281 } else { // do 282 Params.DoubleList[Params.DistanceIterators[Walker-> ParticleInfo_nr]->second->ParticleInfo_nr]--; // decrease the old entry in the doubles list283 Params.DoubleList[NewBase->second-> ParticleInfo_nr]++; // increase the old entry in the doubles list284 Params.DistanceIterators[Walker-> ParticleInfo_nr] = NewBase;282 Params.DoubleList[Params.DistanceIterators[Walker->getNr()]->second->getNr()]--; // decrease the old entry in the doubles list 283 Params.DoubleList[NewBase->second->getNr()]++; // increase the old entry in the doubles list 284 Params.DistanceIterators[Walker->getNr()] = NewBase; 285 285 OldPotential = Potential; 286 286 DoLog(3) && (Log() << Verbose(3) << "Found a new permutation, new potential is " << OldPotential << "." << endl); … … 310 310 if (iter == mol->end()) // round-robin at the end 311 311 iter = mol->begin(); 312 if (Params.DoubleList[Params.DistanceIterators[(*iter)-> ParticleInfo_nr]->second->ParticleInfo_nr] <= 1) // no need to make those injective that aren't312 if (Params.DoubleList[Params.DistanceIterators[(*iter)->getNr()]->second->getNr()] <= 1) // no need to make those injective that aren't 313 313 continue; 314 314 // now, try finding a new one … … 398 398 for (; iter != end(); ++iter) { 399 399 PrintPermutationMap(getAtomCount(), Params); 400 Sprinter = Params.DistanceIterators[(*iter)-> ParticleInfo_nr]->second; // store initial partner401 Strider = Params.DistanceIterators[(*iter)-> ParticleInfo_nr]; //remember old iterator402 Params.DistanceIterators[(*iter)-> ParticleInfo_nr] = Params.StepList[(*iter)->ParticleInfo_nr];403 if (Params.DistanceIterators[(*iter)-> ParticleInfo_nr] == Params.DistanceList[(*iter)->ParticleInfo_nr]->end()) {// stop, before we run through the list and still on404 Params.DistanceIterators[(*iter)-> ParticleInfo_nr] == Params.DistanceList[(*iter)->ParticleInfo_nr]->begin();400 Sprinter = Params.DistanceIterators[(*iter)->getNr()]->second; // store initial partner 401 Strider = Params.DistanceIterators[(*iter)->getNr()]; //remember old iterator 402 Params.DistanceIterators[(*iter)->getNr()] = Params.StepList[(*iter)->getNr()]; 403 if (Params.DistanceIterators[(*iter)->getNr()] == Params.DistanceList[(*iter)->getNr()]->end()) {// stop, before we run through the list and still on 404 Params.DistanceIterators[(*iter)->getNr()] == Params.DistanceList[(*iter)->getNr()]->begin(); 405 405 break; 406 406 } 407 //Log() << Verbose(2) << "Current Walker: " << *(*iter) << " with old/next candidate " << *Sprinter << "/" << *DistanceIterators[(*iter)-> ParticleInfo_nr]->second << "." << endl;407 //Log() << Verbose(2) << "Current Walker: " << *(*iter) << " with old/next candidate " << *Sprinter << "/" << *DistanceIterators[(*iter)->getNr()]->second << "." << endl; 408 408 // find source of the new target 409 409 molecule::const_iterator runner = begin(); 410 410 for (; runner != end(); ++runner) { // find the source whose toes we might be stepping on (Walker's new target should be in use by another already) 411 if (Params.PermutationMap[(*runner)-> ParticleInfo_nr] == Params.DistanceIterators[(*iter)->ParticleInfo_nr]->second) {412 //Log() << Verbose(2) << "Found the corresponding owner " << *(*runner) << " to " << *PermutationMap[(*runner)-> ParticleInfo_nr] << "." << endl;411 if (Params.PermutationMap[(*runner)->getNr()] == Params.DistanceIterators[(*iter)->getNr()]->second) { 412 //Log() << Verbose(2) << "Found the corresponding owner " << *(*runner) << " to " << *PermutationMap[(*runner)->getNr()] << "." << endl; 413 413 break; 414 414 } … … 416 416 if (runner != end()) { // we found the other source 417 417 // then look in its distance list for Sprinter 418 Rider = Params.DistanceList[(*runner)-> ParticleInfo_nr]->begin();419 for (; Rider != Params.DistanceList[(*runner)-> ParticleInfo_nr]->end(); Rider++)418 Rider = Params.DistanceList[(*runner)->getNr()]->begin(); 419 for (; Rider != Params.DistanceList[(*runner)->getNr()]->end(); Rider++) 420 420 if (Rider->second == Sprinter) 421 421 break; 422 if (Rider != Params.DistanceList[(*runner)-> ParticleInfo_nr]->end()) { // if we have found one423 //Log() << Verbose(2) << "Current Other: " << *(*runner) << " with old/next candidate " << *PermutationMap[(*runner)-> ParticleInfo_nr] << "/" << *Rider->second << "." << endl;422 if (Rider != Params.DistanceList[(*runner)->getNr()]->end()) { // if we have found one 423 //Log() << Verbose(2) << "Current Other: " << *(*runner) << " with old/next candidate " << *PermutationMap[(*runner)->getNr()] << "/" << *Rider->second << "." << endl; 424 424 // exchange both 425 Params.PermutationMap[(*iter)-> ParticleInfo_nr] = Params.DistanceIterators[(*iter)->ParticleInfo_nr]->second; // put next farther distance into PermutationMap426 Params.PermutationMap[(*runner)-> ParticleInfo_nr] = Sprinter; // and hand the old target to its respective owner425 Params.PermutationMap[(*iter)->getNr()] = Params.DistanceIterators[(*iter)->getNr()]->second; // put next farther distance into PermutationMap 426 Params.PermutationMap[(*runner)->getNr()] = Sprinter; // and hand the old target to its respective owner 427 427 PrintPermutationMap(getAtomCount(), Params); 428 428 // calculate the new potential … … 431 431 if (Potential > OldPotential) { // we made everything worse! Undo ... 432 432 //Log() << Verbose(3) << "Nay, made the potential worse: " << Potential << " vs. " << OldPotential << "!" << endl; 433 //Log() << Verbose(3) << "Setting " << *(*runner) << "'s source to " << *Params.DistanceIterators[(*runner)-> ParticleInfo_nr]->second << "." << endl;433 //Log() << Verbose(3) << "Setting " << *(*runner) << "'s source to " << *Params.DistanceIterators[(*runner)->getNr()]->second << "." << endl; 434 434 // Undo for Runner (note, we haven't moved the iteration yet, we may use this) 435 Params.PermutationMap[(*runner)-> ParticleInfo_nr] = Params.DistanceIterators[(*runner)->ParticleInfo_nr]->second;435 Params.PermutationMap[(*runner)->getNr()] = Params.DistanceIterators[(*runner)->getNr()]->second; 436 436 // Undo for Walker 437 Params.DistanceIterators[(*iter)-> ParticleInfo_nr] = Strider; // take next farther distance target438 //Log() << Verbose(3) << "Setting " << *(*iter) << "'s source to " << *Params.DistanceIterators[(*iter)-> ParticleInfo_nr]->second << "." << endl;439 Params.PermutationMap[(*iter)-> ParticleInfo_nr] = Params.DistanceIterators[(*iter)->ParticleInfo_nr]->second;437 Params.DistanceIterators[(*iter)->getNr()] = Strider; // take next farther distance target 438 //Log() << Verbose(3) << "Setting " << *(*iter) << "'s source to " << *Params.DistanceIterators[(*iter)->getNr()]->second << "." << endl; 439 Params.PermutationMap[(*iter)->getNr()] = Params.DistanceIterators[(*iter)->getNr()]->second; 440 440 } else { 441 Params.DistanceIterators[(*runner)-> ParticleInfo_nr] = Rider; // if successful also move the pointer in the iterator list441 Params.DistanceIterators[(*runner)->getNr()] = Rider; // if successful also move the pointer in the iterator list 442 442 DoLog(3) && (Log() << Verbose(3) << "Found a better permutation, new potential is " << Potential << " vs." << OldPotential << "." << endl); 443 443 OldPotential = Potential; … … 453 453 } 454 454 } else { 455 Params.PermutationMap[(*iter)-> ParticleInfo_nr] = Params.DistanceIterators[(*iter)->ParticleInfo_nr]->second; // new target has no source!455 Params.PermutationMap[(*iter)->getNr()] = Params.DistanceIterators[(*iter)->getNr()]->second; // new target has no source! 456 456 } 457 Params.StepList[(*iter)-> ParticleInfo_nr]++; // take next farther distance target457 Params.StepList[(*iter)->getNr()]++; // take next farther distance target 458 458 } 459 459 } while (++iter != end()); … … 486 486 DoLog(1) && (Log() << Verbose(1) << "Calculating forces and adding onto ForceMatrix ... " << endl); 487 487 BOOST_FOREACH(atom *_atom, atoms) { 488 atom *Sprinter = PermutationMap[_atom-> ParticleInfo_nr];488 atom *Sprinter = PermutationMap[_atom->getNr()]; 489 489 // set forces 490 490 for (int i=NDIM;i++;) 491 Force->Matrix[0][_atom-> ParticleInfo_nr][5+i] += 2.*constant*sqrt(_atom->getPositionAtStep(startstep).distance(Sprinter->getPositionAtStep(endstep)));491 Force->Matrix[0][_atom->getNr()][5+i] += 2.*constant*sqrt(_atom->getPositionAtStep(startstep).distance(Sprinter->getPositionAtStep(endstep))); 492 492 } 493 493 DoLog(1) && (Log() << Verbose(1) << "done." << endl); … … 520 520 PermutationMap = new atom *[getAtomCount()]; 521 521 for(internal_iterator iter = atoms.begin(); iter != atoms.end();++iter){ 522 PermutationMap[(*iter)-> ParticleInfo_nr] = (*iter);522 PermutationMap[(*iter)->getNr()] = (*iter); 523 523 } 524 524 } … … 540 540 Sprinter = mol->AddCopyAtom((*iter)); 541 541 // add to Trajectories 542 Vector temp = (*iter)->getPositionAtStep(startstep) + (PermutationMap[(*iter)-> ParticleInfo_nr]->getPositionAtStep(endstep) - (*iter)->getPositionAtStep(startstep))*((double)step/(double)MaxSteps);542 Vector temp = (*iter)->getPositionAtStep(startstep) + (PermutationMap[(*iter)->getNr()]->getPositionAtStep(endstep) - (*iter)->getPositionAtStep(startstep))*((double)step/(double)MaxSteps); 543 543 Sprinter->setPosition(temp); 544 544 (*iter)->setAtomicVelocityAtStep(step, zeroVec); … … 618 618 // check size of vectors 619 619 BOOST_FOREACH(atom *_atom, atoms) { 620 _atom->VelocityVerletUpdate(_atom-> ParticleInfo_nr, MDSteps+1, &configuration, &Force, (const size_t) 0);620 _atom->VelocityVerletUpdate(_atom->getNr(), MDSteps+1, &configuration, &Force, (const size_t) 0); 621 621 } 622 622
Note:
See TracChangeset
for help on using the changeset viewer.