source: src/atom_bondedparticle.cpp@ 88104f

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 88104f was 8de375, checked in by Frederik Heber <heber@…>, 15 years ago

Merge branch 'StructureRefactoring' into CommandLineActionMapping

Conflicts:

molecuilder/src/atom_particleinfo.cpp
molecuilder/src/builder.cpp

The following conflicts were solved:

  • in atom_particleinfo constructor the bugfix could not be merged automatically
  • in builder.cpp at the end of main() cleanup and memory:getstate() were still present.
  • Property mode set to 100644
File size: 5.9 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 DoLog(4) && (Log() << Verbose(4) << "Atom " << getName() << "/" << nr << " with " << ListOfBonds.size() << " bonds: " << endl);
47 int TotalDegree = 0;
48 for (BondList::const_iterator Runner = ListOfBonds.begin(); Runner != ListOfBonds.end(); ++Runner) {
49 DoLog(4) && (Log() << Verbose(4) << **Runner << endl);
50 TotalDegree += (*Runner)->BondDegree;
51 }
52 DoLog(4) && (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 * const 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/** Output of atom::nr along each bond partner per line.
67 * Only bonds are printed where atom::nr is smaller than the one of the bond partner.
68 * \param *AdjacencyFile output stream
69 */
70void BondedParticle::OutputBonds(ofstream * const BondFile) const
71{
72 for (BondList::const_iterator Runner = ListOfBonds.begin(); Runner != ListOfBonds.end(); (++Runner))
73 if (nr < (*Runner)->GetOtherAtom(this)->nr)
74 *BondFile << nr << "\t" << (*Runner)->GetOtherAtom(this)->nr << "\n";
75};
76
77/**
78 * Adds a bond between this bonded particle and another. Does nothing if this
79 * bond already exists.
80 *
81 * \param bonding partner
82 */
83void BondedParticle::addBond(BondedParticle* Partner) {
84 if (IsBondedTo(Partner)) {
85 return;
86 }
87
88 bond* newBond = new bond((atom*) this, (atom*) Partner, 1, 0);
89 RegisterBond(newBond);
90 Partner->RegisterBond(newBond);
91}
92
93/** Puts a given bond into atom::ListOfBonds.
94 * \param *Binder bond to insert
95 */
96bool BondedParticle::RegisterBond(bond *Binder)
97{
98 bool status = false;
99 if (Binder != NULL) {
100 if (Binder->Contains(this)) {
101 ListOfBonds.push_back(Binder);
102 status = true;
103 } else {
104 DoeLog(1) && (eLog()<< Verbose(1) << *Binder << " does not contain " << *this << "." << endl);
105 }
106 } else {
107 DoeLog(1) && (eLog()<< Verbose(1) << "Binder is " << Binder << "." << endl);
108 }
109 return status;
110};
111
112/** Removes a given bond from atom::ListOfBonds.
113 * \param *Binder bond to remove
114 */
115bool BondedParticle::UnregisterBond(bond *Binder)
116{
117 bool status = false;
118 if (Binder != NULL) {
119 if (Binder->Contains(this)) {
120 ListOfBonds.remove(Binder);
121 status = true;
122 } else {
123 DoeLog(1) && (eLog()<< Verbose(1) << *Binder << " does not contain " << *this << "." << endl);
124 }
125 } else {
126 DoeLog(1) && (eLog()<< Verbose(1) << "Binder is " << Binder << "." << endl);
127 }
128 return status;
129};
130
131/** Removes all bonds from atom::ListOfBonds.
132 * \note Does not do any memory de-allocation.
133 */
134void BondedParticle::UnregisterAllBond()
135{
136 ListOfBonds.clear();
137};
138
139/** Corrects the bond degree by one at most if necessary.
140 * \param *out output stream for debugging
141 */
142int BondedParticle::CorrectBondDegree()
143{
144 int NoBonds = 0;
145 int OtherNoBonds = 0;
146 int FalseBondDegree = 0;
147 atom *OtherWalker = NULL;
148 bond *CandidateBond = NULL;
149
150 NoBonds = CountBonds();
151 //Log() << Verbose(3) << "Walker " << *this << ": " << (int)this->type->NoValenceOrbitals << " > " << NoBonds << "?" << endl;
152 if ((int)(type->NoValenceOrbitals) > NoBonds) { // we have a mismatch, check all bonding partners for mismatch
153 for (BondList::const_iterator Runner = ListOfBonds.begin(); Runner != ListOfBonds.end(); (++Runner)) {
154 OtherWalker = (*Runner)->GetOtherAtom(this);
155 OtherNoBonds = OtherWalker->CountBonds();
156 //Log() << Verbose(3) << "OtherWalker " << *OtherWalker << ": " << (int)OtherWalker->type->NoValenceOrbitals << " > " << OtherNoBonds << "?" << endl;
157 if ((int)(OtherWalker->type->NoValenceOrbitals) > OtherNoBonds) { // check if possible candidate
158 if ((CandidateBond == NULL) || (ListOfBonds.size() > OtherWalker->ListOfBonds.size())) { // pick the one with fewer number of bonds first
159 CandidateBond = (*Runner);
160 //Log() << Verbose(3) << "New candidate is " << *CandidateBond << "." << endl;
161 }
162 }
163 }
164 if ((CandidateBond != NULL)) {
165 CandidateBond->BondDegree++;
166 //Log() << Verbose(2) << "Increased bond degree for bond " << *CandidateBond << "." << endl;
167 } else {
168 DoeLog(2) && (eLog()<< Verbose(2) << "Could not find correct degree for atom " << *this << "." << endl);
169 FalseBondDegree++;
170 }
171 }
172 return FalseBondDegree;
173};
174
175/** Checks whether there is a bond between \a this atom and the given \a *BondPartner.
176 * \param *BondPartner atom to check for
177 * \return true - bond exists, false - bond does not exist
178 */
179bool BondedParticle::IsBondedTo(BondedParticle * const BondPartner)
180{
181 bool status = false;
182
183 for (BondList::iterator runner = ListOfBonds.begin(); runner != ListOfBonds.end(); runner++) {
184 status = status || ((*runner)->Contains(BondPartner));
185 }
186 return status;
187};
188
Note: See TracBrowser for help on using the repository browser.