Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/atom.cpp

    • Property mode changed from 100644 to 100755
    rd3dfe18 r49f802c  
    66
    77#include "atom.hpp"
     8#include "bond.hpp"
     9#include "element.hpp"
    810#include "memoryallocator.hpp"
     11#include "vector.hpp"
    912
    1013/************************************* Functions for class atom *************************************/
     
    6265atom::~atom()
    6366{
    64   Free(&ComponentNr);
     67  Free<int>(&ComponentNr, "atom::~atom: *ComponentNr");
     68  Free<char>(&Name, "atom::~atom: *Name");
     69  Trajectory.R.clear();
     70  Trajectory.U.clear();
     71  Trajectory.F.clear();
    6572};
    6673
     
    8087};
    8188
     89/** Sets father to itself or its father in case of copying a molecule.
     90 */
     91void atom::CorrectFather()
     92{
     93  if (father->father == father)   // same atom in copy's father points to itself
     94    father = this;  // set father to itself (copy of a whole molecule)
     95  else
     96   father = father->father;  // set father to original's father
     97
     98};
     99
     100/** Check whether father is equal to given atom.
     101 * \param *ptr atom to compare father to
     102 * \param **res return value (only set if atom::father is equal to \a *ptr)
     103 */
     104void atom::EqualsFather ( atom *ptr, atom **res )
     105{
     106  if ( ptr == father )
     107    *res = this;
     108};
     109
     110/** Checks whether atom is within the given box.
     111 * \param offset offset to box origin
     112 * \param *parallelepiped box matrix
     113 * \return true - is inside, false - is not
     114 */
     115bool atom::IsInParallelepiped(Vector offset, double *parallelepiped)
     116{
     117  return (node->IsInParallelepiped(offset, parallelepiped));
     118};
     119
    82120/** Output of a single atom.
    83121 * \param ElementNo cardinal number of the element
     
    85123 * \param *out stream to output to
    86124 * \param *comment commentary after '#' sign
    87  */
    88 bool atom::Output(int ElementNo, int AtomNo, ofstream *out, const char *comment) const
     125  * \return true - \a *out present, false - \a *out is NULL
     126 */
     127bool atom::Output(ofstream *out, int ElementNo, int AtomNo, const char *comment) const
    89128{
    90129  if (out != NULL) {
     
    102141    return false;
    103142};
     143bool atom::Output(ofstream *out, int *ElementNo, int *AtomNo, const char *comment)
     144{
     145  AtomNo[type->Z]++;  // increment number
     146  if (out != NULL) {
     147    *out << "Ion_Type" << ElementNo[type->Z] << "_" << AtomNo[type->Z] << "\t"  << fixed << setprecision(9) << showpoint;
     148    *out << x.x[0] << "\t" << x.x[1] << "\t" << x.x[2];
     149    *out << "\t" << FixedIon;
     150    if (v.Norm() > MYEPSILON)
     151      *out << "\t" << scientific << setprecision(6) << v.x[0] << "\t" << v.x[1] << "\t" << v.x[2] << "\t";
     152    if (comment != NULL)
     153      *out << " # " << comment << endl;
     154    else
     155      *out << " # molecule nr " << nr << endl;
     156    return true;
     157  } else
     158    return false;
     159};
    104160
    105161/** Output of a single atom as one lin in xyz file.
    106162 * \param *out stream to output to
     163  * \return true - \a *out present, false - \a *out is NULL
    107164 */
    108165bool atom::OutputXYZLine(ofstream *out) const
     
    110167  if (out != NULL) {
    111168    *out << type->symbol << "\t" << x.x[0] << "\t" << x.x[1] << "\t" << x.x[2] << "\t" << endl;
     169    return true;
     170  } else
     171    return false;
     172};
     173
     174/** Output of a single atom as one lin in xyz file.
     175 * \param *out stream to output to
     176 * \param *ElementNo array with ion type number in the config file this atom's element shall have
     177 * \param *AtomNo array with atom number in the config file this atom shall have, is increase by one automatically
     178 * \param step Trajectory time step to output
     179  * \return true - \a *out present, false - \a *out is NULL
     180 */
     181bool atom::OutputTrajectory(ofstream *out, int *ElementNo, int *AtomNo, int step) const
     182{
     183  AtomNo[type->Z]++;
     184  if (out != NULL) {
     185    *out << "Ion_Type" << ElementNo[type->Z] << "_" << AtomNo[type->Z] << "\t"  << fixed << setprecision(9) << showpoint;
     186    *out << Trajectory.R.at(step).x[0] << "\t" << Trajectory.R.at(step).x[1] << "\t" << Trajectory.R.at(step).x[2];
     187    *out << "\t" << FixedIon;
     188    if (Trajectory.U.at(step).Norm() > MYEPSILON)
     189      *out << "\t" << scientific << setprecision(6) << Trajectory.U.at(step).x[0] << "\t" << Trajectory.U.at(step).x[1] << "\t" << Trajectory.U.at(step).x[2] << "\t";
     190    if (Trajectory.F.at(step).Norm() > MYEPSILON)
     191      *out << "\t" << scientific << setprecision(6) << Trajectory.F.at(step).x[0] << "\t" << Trajectory.F.at(step).x[1] << "\t" << Trajectory.F.at(step).x[2] << "\t";
     192    *out << "\t# Number in molecule " << nr << endl;
     193    return true;
     194  } else
     195    return false;
     196};
     197
     198/** Output of a single atom as one lin in xyz file.
     199 * \param *out stream to output to
     200 * \param step Trajectory time step to output
     201 * \return true - \a *out present, false - \a *out is NULL
     202 */
     203bool atom::OutputTrajectoryXYZ(ofstream *out, int step) const
     204{
     205  if (out != NULL) {
     206    *out << type->symbol << "\t";
     207    *out << Trajectory.R.at(step).x[0] << "\t";
     208    *out << Trajectory.R.at(step).x[1] << "\t";
     209    *out << Trajectory.R.at(step).x[2] << endl;
     210    return true;
     211  } else
     212    return false;
     213};
     214
     215/** Prints all bonds of this atom from given global lists.
     216 * \param *out stream to output to
     217 * \param *NumberOfBondsPerAtom array with number of bonds per atomic index
     218 * \param ***ListOfBondsPerAtom array per atomic index of array with pointer to bond
     219 * \return true - \a *out present, false - \a *out is NULL
     220 */
     221bool atom::OutputBondOfAtom(ofstream *out, int *NumberOfBondsPerAtom, bond ***ListOfBondsPerAtom) const
     222{
     223  if (out != NULL) {
     224#ifdef ADDHYDROGEN
     225    if (type->Z != 1) {   // regard only non-hydrogen
     226#endif
     227      *out << Verbose(4) << "Atom " << Name << "/" << nr << " with " << NumberOfBondsPerAtom[nr] << " bonds: ";
     228      int TotalDegree = 0;
     229      for (int j=0;j<NumberOfBondsPerAtom[nr];j++) {
     230        *out << *ListOfBondsPerAtom[nr][j] << "\t";
     231        TotalDegree += ListOfBondsPerAtom[nr][j]->BondDegree;
     232      }
     233      *out << " -- TotalDegree: " << TotalDegree << endl;
     234#ifdef ADDHYDROGEN
     235    }
     236#endif
    112237    return true;
    113238  } else
     
    139264};
    140265
     266/** Returns squared distance to a given vector.
     267 * \param origin vector to calculate distance to
     268 * \return distance squared
     269 */
     270double atom::DistanceSquaredToVector(Vector &origin)
     271{
     272  return origin.DistanceSquared(&x);
     273};
     274
     275/** Adds kinetic energy of this atom to given temperature value.
     276 * \param *temperature add on this value
     277 * \param step given step of trajectory to add
     278 */
     279void atom::AddKineticToTemperature(double *temperature, int step) const
     280{
     281  for (int i=NDIM;i--;)
     282    *temperature += type->mass * Trajectory.U.at(step).x[i]* Trajectory.U.at(step).x[i];
     283};
     284
     285/** Returns distance to a given vector.
     286 * \param origin vector to calculate distance to
     287 * \return distance
     288 */
     289double atom::DistanceToVector(Vector &origin)
     290{
     291  return origin.Distance(&x);
     292};
     293
    141294bool operator < (atom &a, atom &b)
    142295{
Note: See TracChangeset for help on using the changeset viewer.