source: src/atom.cpp@ 8aba3c

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 8aba3c was 1e6249, checked in by Frederik Heber <heber@…>, 14 years ago

BondedParticle has virtual UpdateSteps() to allow consistent extending of trajectories.

  • Property mode set to 100644
File size: 11.6 KB
RevLine 
[bcf653]1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010 University of Bonn. All rights reserved.
5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
6 */
7
[14de469]8/** \file atom.cpp
[1907a7]9 *
[14de469]10 * Function implementations for the class atom.
[1907a7]11 *
[14de469]12 */
13
[bf3817]14// include config.h
15#ifdef HAVE_CONFIG_H
16#include <config.h>
17#endif
18
[ad011c]19#include "CodePatterns/MemDebug.hpp"
[112b09]20
[357fba]21#include "atom.hpp"
[e41951]22#include "bond.hpp"
[e2373df]23#include "CodePatterns/Log.hpp"
[4a7776a]24#include "config.hpp"
[f66195]25#include "element.hpp"
[266237]26#include "lists.hpp"
[ccd9f5]27#include "parser.hpp"
[57f243]28#include "LinearAlgebra/Vector.hpp"
[d346b6]29#include "World.hpp"
[6cfa36]30#include "molecule.hpp"
[c550dd]31#include "Shapes/Shape.hpp"
[a0064e]32
[36166d]33#include <iomanip>
[0ba410]34#include <iostream>
[36166d]35
[14de469]36/************************************* Functions for class atom *************************************/
37
[70ff32]38
[14de469]39/** Constructor of class atom.
40 */
[46d958]41atom::atom() :
[97b825]42 father(this),
43 sort(&nr),
44 mol(0)
[d74077]45{};
[14de469]46
[2319ed]47/** Constructor of class atom.
48 */
[46d958]49atom::atom(atom *pointer) :
[97b825]50 ParticleInfo(pointer),
51 father(pointer),
[9df680]52 sort(&nr),
53 mol(0)
[2319ed]54{
[443547]55 setType(pointer->getType()); // copy element of atom
56 AtomicPosition = pointer->AtomicPosition; // copy trajectory of coordination
57 AtomicVelocity = pointer->AtomicVelocity; // copy trajectory of velocity
58 AtomicForce = pointer->AtomicForce;
[6625c3]59 setFixedIon(pointer->getFixedIon());
[b453f9]60};
[2319ed]61
[46d958]62atom *atom::clone(){
[68f03d]63 atom *res = new atom(this);
[23b547]64 World::getInstance().registerAtom(res);
[46d958]65 return res;
66}
67
[2319ed]68
[14de469]69/** Destructor of class atom.
70 */
[1907a7]71atom::~atom()
[14de469]72{
[6cfa36]73 removeFromMolecule();
[14de469]74};
[e2373df]75
76
77void atom::UpdateSteps()
78{
79 LOG(4,"atom::UpdateSteps() called.");
80 // append to position, velocity and force vector
81 AtomInfo::AppendTrajectoryStep();
[1e6249]82 // append to ListOfBonds vector
83 BondedParticleInfo::AppendTrajectoryStep();
[e2373df]84}
85
[14de469]86/** Climbs up the father list until NULL, last is returned.
87 * \return true father, i.e. whose father points to itself, NULL if it could not be found or has none (added hydrogen)
88 */
89atom *atom::GetTrueFather()
90{
[215df0]91 if(father == this){ // top most father is the one that points on itself
92 return this;
93 }
94 else if(!father) {
95 return 0;
96 }
97 else {
98 return father->GetTrueFather();
99 }
[14de469]100};
101
[e65246]102/** Sets father to itself or its father in case of copying a molecule.
103 */
104void atom::CorrectFather()
105{
106 if (father->father == father) // same atom in copy's father points to itself
107 father = this; // set father to itself (copy of a whole molecule)
108 else
109 father = father->father; // set father to original's father
110
111};
112
113/** Check whether father is equal to given atom.
114 * \param *ptr atom to compare father to
115 * \param **res return value (only set if atom::father is equal to \a *ptr)
116 */
[b453f9]117void atom::EqualsFather ( const atom *ptr, const atom **res ) const
[e65246]118{
119 if ( ptr == father )
120 *res = this;
121};
122
[00abfc]123bool atom::isFather(const atom *ptr){
124 return ptr==father;
125}
126
[e9f8f9]127/** Checks whether atom is within the given box.
128 * \param offset offset to box origin
129 * \param *parallelepiped box matrix
130 * \return true - is inside, false - is not
131 */
[c550dd]132bool atom::IsInShape(const Shape& shape) const
[e9f8f9]133{
[d74077]134 return shape.isInside(getPosition());
[e9f8f9]135};
136
[b453f9]137/** Output of a single atom with given numbering.
[14de469]138 * \param ElementNo cardinal number of the element
139 * \param AtomNo cardinal number among these atoms of the same element
140 * \param *out stream to output to
[1907a7]141 * \param *comment commentary after '#' sign
[e41951]142 * \return true - \a *out present, false - \a *out is NULL
[14de469]143 */
[e138de]144bool atom::OutputIndexed(ofstream * const out, const int ElementNo, const int AtomNo, const char *comment) const
[14de469]145{
146 if (out != NULL) {
147 *out << "Ion_Type" << ElementNo << "_" << AtomNo << "\t" << fixed << setprecision(9) << showpoint;
[d74077]148 *out << at(0) << "\t" << at(1) << "\t" << at(2);
[6625c3]149 *out << "\t" << (int)(getFixedIon());
[bce72c]150 if (getAtomicVelocity().Norm() > MYEPSILON)
151 *out << "\t" << scientific << setprecision(6) << getAtomicVelocity()[0] << "\t" << getAtomicVelocity()[1] << "\t" << getAtomicVelocity()[2] << "\t";
[437922]152 if (comment != NULL)
153 *out << " # " << comment << endl;
[e9f8f9]154 else
155 *out << " # molecule nr " << nr << endl;
156 return true;
157 } else
158 return false;
159};
[b453f9]160
161/** Output of a single atom with numbering from array according to atom::type.
162 * \param *ElementNo cardinal number of the element
163 * \param *AtomNo cardinal number among these atoms of the same element
164 * \param *out stream to output to
165 * \param *comment commentary after '#' sign
166 * \return true - \a *out present, false - \a *out is NULL
167 */
[0ba410]168bool atom::OutputArrayIndexed(ostream * const out,const enumeration<const element*> &elementLookup, int *AtomNo, const char *comment) const
[e9f8f9]169{
[83f176]170 AtomNo[getType()->getAtomicNumber()]++; // increment number
[e9f8f9]171 if (out != NULL) {
[8f4df1]172 const element *elemental = getType();
173 ASSERT(elementLookup.there.find(elemental)!=elementLookup.there.end(),"Type of this atom was not in the formula upon enumeration");
[83f176]174 *out << "Ion_Type" << elementLookup.there.find(elemental)->second << "_" << AtomNo[elemental->getAtomicNumber()] << "\t" << fixed << setprecision(9) << showpoint;
[d74077]175 *out << at(0) << "\t" << at(1) << "\t" << at(2);
[6625c3]176 *out << "\t" << getFixedIon();
[bce72c]177 if (getAtomicVelocity().Norm() > MYEPSILON)
178 *out << "\t" << scientific << setprecision(6) << getAtomicVelocity()[0] << "\t" << getAtomicVelocity()[1] << "\t" << getAtomicVelocity()[2] << "\t";
[e9f8f9]179 if (comment != NULL)
180 *out << " # " << comment << endl;
[437922]181 else
182 *out << " # molecule nr " << nr << endl;
[14de469]183 return true;
184 } else
185 return false;
186};
187
[6625c3]188/** Output of a single atom as one line in xyz file.
[14de469]189 * \param *out stream to output to
[e41951]190 * \return true - \a *out present, false - \a *out is NULL
[14de469]191 */
192bool atom::OutputXYZLine(ofstream *out) const
193{
194 if (out != NULL) {
[b5c53d]195 *out << getType()->getSymbol() << "\t" << at(0) << "\t" << at(1) << "\t" << at(2) << "\t" << endl;
[14de469]196 return true;
197 } else
198 return false;
199};
200
[6625c3]201/** Output of a single atom as one line in xyz file.
[fcd7b6]202 * \param *out stream to output to
[e41951]203 * \param *ElementNo array with ion type number in the config file this atom's element shall have
204 * \param *AtomNo array with atom number in the config file this atom shall have, is increase by one automatically
205 * \param step Trajectory time step to output
206 * \return true - \a *out present, false - \a *out is NULL
[fcd7b6]207 */
[882a8a]208bool atom::OutputTrajectory(ofstream * const out, const enumeration<const element*> &elementLookup, int *AtomNo, const int step) const
[fcd7b6]209{
[83f176]210 AtomNo[getType()->getAtomicNumber()]++;
[882a8a]211 if (out != NULL) {
212 const element *elemental = getType();
213 ASSERT(elementLookup.there.find(elemental)!=elementLookup.there.end(),"Type of this atom was not in the formula upon enumeration");
214 *out << "Ion_Type" << elementLookup.there.find(elemental)->second << "_" << AtomNo[getType()->getAtomicNumber()] << "\t" << fixed << setprecision(9) << showpoint;
[056e70]215 *out << getPositionAtStep(step)[0] << "\t" << getPositionAtStep(step)[1] << "\t" << getPositionAtStep(step)[2];
[6625c3]216 *out << "\t" << (int)(getFixedIon());
[056e70]217 if (getAtomicVelocityAtStep(step).Norm() > MYEPSILON)
218 *out << "\t" << scientific << setprecision(6) << getAtomicVelocityAtStep(step)[0] << "\t" << getAtomicVelocityAtStep(step)[1] << "\t" << getAtomicVelocityAtStep(step)[2] << "\t";
219 if (getAtomicForceAtStep(step).Norm() > MYEPSILON)
220 *out << "\t" << scientific << setprecision(6) << getAtomicForceAtStep(step)[0] << "\t" << getAtomicForceAtStep(step)[1] << "\t" << getAtomicForceAtStep(step)[2] << "\t";
[fcd7b6]221 *out << "\t# Number in molecule " << nr << endl;
222 return true;
223 } else
224 return false;
225};
226
[681a8a]227/** Output of a single atom as one lin in xyz file.
228 * \param *out stream to output to
[e41951]229 * \param step Trajectory time step to output
230 * \return true - \a *out present, false - \a *out is NULL
[681a8a]231 */
[e138de]232bool atom::OutputTrajectoryXYZ(ofstream * const out, const int step) const
[681a8a]233{
234 if (out != NULL) {
[b5c53d]235 *out << getType()->getSymbol() << "\t";
[056e70]236 *out << getPositionAtStep(step)[0] << "\t";
237 *out << getPositionAtStep(step)[1] << "\t";
238 *out << getPositionAtStep(step)[2] << endl;
[681a8a]239 return true;
240 } else
241 return false;
242};
243
[4455f4]244/** Outputs the MPQC configuration line for this atom.
245 * \param *out output stream
246 * \param *center center of molecule subtracted from position
247 * \param *AtomNo pointer to atom counter that is increased by one
248 */
[0dc86e2]249void atom::OutputMPQCLine(ostream * const out, const Vector *center) const
[4455f4]250{
[d74077]251 Vector recentered(getPosition());
252 recentered -= *center;
[b5c53d]253 *out << "\t\t" << getType()->getSymbol() << " [ " << recentered[0] << "\t" << recentered[1] << "\t" << recentered[2] << " ]" << endl;
[4455f4]254};
255
256/** Compares the indices of \a this atom with a given \a ptr.
257 * \param ptr atom to compare index against
258 * \return true - this one's is smaller, false - not
259 */
[b453f9]260bool atom::Compare(const atom &ptr) const
[4455f4]261{
262 if (nr < ptr.nr)
263 return true;
264 else
265 return false;
266};
267
268/** Returns squared distance to a given vector.
269 * \param origin vector to calculate distance to
270 * \return distance squared
271 */
[b453f9]272double atom::DistanceSquaredToVector(const Vector &origin) const
[4455f4]273{
[d74077]274 return DistanceSquared(origin);
[4455f4]275};
276
277/** Returns distance to a given vector.
278 * \param origin vector to calculate distance to
279 * \return distance
280 */
[b453f9]281double atom::DistanceToVector(const Vector &origin) const
[4455f4]282{
[d74077]283 return distance(origin);
[4455f4]284};
285
286/** Initialises the component number array.
287 * Size is set to atom::ListOfBonds.size()+1 (last is th encode end by -1)
288 */
289void atom::InitComponentNr()
290{
291 if (ComponentNr != NULL)
[920c70]292 delete[](ComponentNr);
[9d83b6]293 const BondList& ListOfBonds = getListOfBonds();
[920c70]294 ComponentNr = new int[ListOfBonds.size()+1];
[4455f4]295 for (int i=ListOfBonds.size()+1;i--;)
296 ComponentNr[i] = -1;
[14b65e]297};
298
299void atom::resetGraphNr(){
300 GraphNr=-1;
301}
[4455f4]302
[d74077]303std::ostream & atom::operator << (std::ostream &ost) const
304{
305 ParticleInfo::operator<<(ost);
306 ost << "," << getPosition();
307 return ost;
308}
309
310std::ostream & operator << (std::ostream &ost, const atom &a)
311{
312 a.ParticleInfo::operator<<(ost);
313 ost << "," << a.getPosition();
314 return ost;
315}
[4455f4]316
317bool operator < (atom &a, atom &b)
318{
319 return a.Compare(b);
320};
321
[46d958]322World *atom::getWorld(){
323 return world;
324}
325
326void atom::setWorld(World* _world){
327 world = _world;
328}
329
[88d586]330bool atom::changeId(atomId_t newId){
331 // first we move ourselves in the world
332 // the world lets us know if that succeeded
333 if(world->changeAtomId(id,newId,this)){
334 id = newId;
335 return true;
336 }
337 else{
338 return false;
339 }
340}
341
342void atom::setId(atomId_t _id) {
[46d958]343 id=_id;
344}
345
[ad2b411]346atomId_t atom::getId() const {
[46d958]347 return id;
348}
349
[fa7989]350/** Makes the atom be contained in the new molecule \a *_mol.
351 * Uses atom::removeFromMolecule() to delist from old molecule.
352 * \param *_mol pointer to new molecule
353 */
[6cfa36]354void atom::setMolecule(molecule *_mol){
355 // take this atom from the old molecule
356 removeFromMolecule();
357 mol = _mol;
358 if(!mol->containsAtom(this)){
[dddbfe]359 mol->insert(this);
[6cfa36]360 }
361}
362
[fa7989]363/** Returns pointer to the molecule which atom belongs to.
364 * \return containing molecule
365 */
[e41c48]366molecule* atom::getMolecule() const {
[c084cc]367 return mol;
368}
369
[fa7989]370/** Erases the atom in atom::mol's list of atoms and sets it to zero.
371 */
[6cfa36]372void atom::removeFromMolecule(){
373 if(mol){
374 if(mol->containsAtom(this)){
375 mol->erase(this);
376 }
377 mol=0;
378 }
[1f8337]379}
380
[e8a21f]381int atom::getNr() const{
382 return nr;
383}
[6cfa36]384
[88d586]385atom* NewAtom(atomId_t _id){
386 atom * res =new atom();
387 res->setId(_id);
388 return res;
[46d958]389}
390
[88d586]391void DeleteAtom(atom* atom){
[46d958]392 delete atom;
[e5f64de]393}
394
395bool compareAtomElements(atom* atom1,atom* atom2){
396 return atom1->getType()->getNumber() < atom2->getType()->getNumber();
[46d958]397}
Note: See TracBrowser for help on using the repository browser.