source: src/atom_bondedparticle.cpp@ 8725ed

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
Last change on this file since 8725ed was 791138, checked in by Frederik Heber <heber@…>, 15 years ago

BUGFIX atom::CorrectBonDegree() wrongly increased bond degrees.

  • Property mode set to 100644
File size: 5.0 KB
Line 
1/*
2 * atom_bondedparticle.cpp
3 *
4 * Created on: Oct 19, 2009
5 * Author: heber
6 */
7
8#include "atom.hpp"
9#include "atom_bondedparticle.hpp"
10#include "bond.hpp"
11#include "element.hpp"
12#include "lists.hpp"
13#include "log.hpp"
14#include "verbose.hpp"
15
16/** Constructor of class BondedParticle.
17 */
18BondedParticle::BondedParticle()
19{
20};
21
22/** Destructor of class BondedParticle.
23 */
24BondedParticle::~BondedParticle()
25{
26 BondList::const_iterator Runner;
27 while (!ListOfBonds.empty()) {
28 Runner = ListOfBonds.begin();
29 removewithoutcheck(*Runner);
30 }
31};
32
33/** Outputs the current atom::AdaptiveOrder and atom::MaxOrder to \a *file.
34 * \param *file output stream
35 */
36void BondedParticle::OutputOrder(ofstream *file) const
37{
38 *file << nr << "\t" << (int)AdaptiveOrder << "\t" << (int)MaxOrder << endl;
39 //Log() << Verbose(2) << "Storing: " << nr << "\t" << (int)AdaptiveOrder << "\t" << (int)MaxOrder << "." << endl;
40};
41
42/** Prints all bonds of this atom with total degree.
43 */
44void BondedParticle::OutputBondOfAtom() const
45{
46 Log() << Verbose(4) << "Atom " << Name << "/" << nr << " with " << ListOfBonds.size() << " bonds: " << endl;
47 int TotalDegree = 0;
48 for (BondList::const_iterator Runner = ListOfBonds.begin(); Runner != ListOfBonds.end(); ++Runner) {
49 Log() << Verbose(4) << **Runner << endl;
50 TotalDegree += (*Runner)->BondDegree;
51 }
52 Log() << Verbose(4) << " -- TotalDegree: " << TotalDegree << endl;
53};
54
55/** Output of atom::nr along with all bond partners.
56 * \param *AdjacencyFile output stream
57 */
58void BondedParticle::OutputAdjacency(ofstream *AdjacencyFile) const
59{
60 *AdjacencyFile << nr << "\t";
61 for (BondList::const_iterator Runner = ListOfBonds.begin(); Runner != ListOfBonds.end(); (++Runner))
62 *AdjacencyFile << (*Runner)->GetOtherAtom(this)->nr << "\t";
63 *AdjacencyFile << endl;
64};
65
66/** Puts a given bond into atom::ListOfBonds.
67 * \param *Binder bond to insert
68 */
69bool BondedParticle::RegisterBond(bond *Binder)
70{
71 bool status = false;
72 if (Binder != NULL) {
73 if (Binder->Contains(this)) {
74 ListOfBonds.push_back(Binder);
75 status = true;
76 } else {
77 eLog() << Verbose(1) << *Binder << " does not contain " << *this << "." << endl;
78 }
79 } else {
80 eLog() << Verbose(1) << "Binder is " << Binder << "." << endl;
81 }
82 return status;
83};
84
85/** Removes a given bond from atom::ListOfBonds.
86 * \param *Binder bond to remove
87 */
88bool BondedParticle::UnregisterBond(bond *Binder)
89{
90 bool status = false;
91 if (Binder != NULL) {
92 if (Binder->Contains(this)) {
93 ListOfBonds.remove(Binder);
94 status = true;
95 } else {
96 eLog() << Verbose(1) << *Binder << " does not contain " << *this << "." << endl;
97 }
98 } else {
99 eLog() << Verbose(1) << "Binder is " << Binder << "." << endl;
100 }
101 return status;
102};
103
104/** Removes all bonds from atom::ListOfBonds.
105 * \note Does not do any memory de-allocation.
106 */
107void BondedParticle::UnregisterAllBond()
108{
109 ListOfBonds.clear();
110};
111
112/** Corrects the bond degree by one at most if necessary.
113 * \param *out output stream for debugging
114 */
115int BondedParticle::CorrectBondDegree()
116{
117 int NoBonds = 0;
118 int OtherNoBonds = 0;
119 int FalseBondDegree = 0;
120 atom *OtherWalker = NULL;
121 bond *CandidateBond = NULL;
122
123 NoBonds = CountBonds();
124 //Log() << Verbose(3) << "Walker " << *this << ": " << (int)this->type->NoValenceOrbitals << " > " << NoBonds << "?" << endl;
125 if ((int)(type->NoValenceOrbitals) > NoBonds) { // we have a mismatch, check all bonding partners for mismatch
126 for (BondList::const_iterator Runner = ListOfBonds.begin(); Runner != ListOfBonds.end(); (++Runner)) {
127 OtherWalker = (*Runner)->GetOtherAtom(this);
128 OtherNoBonds = OtherWalker->CountBonds();
129 //Log() << Verbose(3) << "OtherWalker " << *OtherWalker << ": " << (int)OtherWalker->type->NoValenceOrbitals << " > " << OtherNoBonds << "?" << endl;
130 if ((int)(OtherWalker->type->NoValenceOrbitals) > OtherNoBonds) { // check if possible candidate
131 if ((CandidateBond == NULL) || (ListOfBonds.size() > OtherWalker->ListOfBonds.size())) { // pick the one with fewer number of bonds first
132 CandidateBond = (*Runner);
133 //Log() << Verbose(3) << "New candidate is " << *CandidateBond << "." << endl;
134 }
135 }
136 }
137 if ((CandidateBond != NULL)) {
138 CandidateBond->BondDegree++;
139 //Log() << Verbose(2) << "Increased bond degree for bond " << *CandidateBond << "." << endl;
140 } else {
141 eLog() << Verbose(2) << "Could not find correct degree for atom " << *this << "." << endl;
142 FalseBondDegree++;
143 }
144 }
145 return FalseBondDegree;
146};
147
148/** Checks whether there is a bond between \a this atom and the given \a *BondPartner.
149 * \param *BondPartner atom to check for
150 * \return true - bond exists, false - bond does not exist
151 */
152bool BondedParticle::IsBondedTo(BondedParticle * const BondPartner)
153{
154 bool status = false;
155
156 for (BondList::iterator runner = ListOfBonds.begin(); runner != ListOfBonds.end(); runner++) {
157 status = status || ((*runner)->Contains(BondPartner));
158 }
159 return status;
160};
161
Note: See TracBrowser for help on using the repository browser.