Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/molecule.hpp

    raf2c424 re4afb4  
    6666struct EvaluatePotential
    6767{
    68   int startstep;              //!< start configuration (MDStep in atom::trajectory)
    69   int endstep;                //!< end configuration (MDStep in atom::trajectory)
    70   atom **PermutationMap;      //!< gives target ptr for each atom, array of size molecule::AtomCount (this is "x" in \f$ V^{con}(x) \f$ )
     68  int startstep; //!< start configuration (MDStep in atom::trajectory)
     69  int endstep; //!< end configuration (MDStep in atom::trajectory)
     70  atom **PermutationMap; //!< gives target ptr for each atom, array of size molecule::AtomCount (this is "x" in \f$ V^{con}(x) \f$ )
    7171  DistanceMap **DistanceList; //!< distance list of each atom to each atom
    7272  DistanceMap::iterator *StepList; //!< iterator to ascend through NearestNeighbours \a **DistanceList
    73   int *DoubleList;            //!< count of which sources want to move to this target, basically the injective measure (>1 -> not injective)
     73  int *DoubleList; //!< count of which sources want to move to this target, basically the injective measure (>1 -> not injective)
    7474  DistanceMap::iterator *DistanceIterators; //!< marks which was the last picked target as injective candidate with smallest distance
    75   bool IsAngstroem;           //!< whether coordinates are in angstroem (true) or bohrradius (false)
    76   double *PenaltyConstants;   //!<  penalty constant in front of each term
     75  bool IsAngstroem; //!< whether coordinates are in angstroem (true) or bohrradius (false)
     76  double *PenaltyConstants; //!<  penalty constant in front of each term
    7777};
    7878
     
    8080 * Class incorporates number of types
    8181 */
    82 class molecule : public PointCloud , public Observable {
     82class molecule : public PointCloud, public Observable
     83{
    8384  friend molecule *NewMolecule();
    8485  friend void DeleteMolecule(molecule *);
    8586
    86   public:
    87     typedef ATOMSET(std::list) atomSet;
    88     typedef std::set<atomId_t> atomIdSet;
    89     typedef ObservedIterator<atomSet> iterator;
    90     typedef atomSet::const_iterator const_iterator;
    91 
    92     const periodentafel * const elemente; //!< periodic table with each element
    93     // old deprecated atom handling
    94     //atom *start;        //!< start of atom list
    95     //atom *end;          //!< end of atom list
    96     //bond *first;        //!< start of bond list
    97     //bond *last;         //!< end of bond list
    98     int MDSteps;        //!< The number of MD steps in Trajectories
    99     //int AtomCount;          //!< number of atoms, brought up-to-date by CountAtoms()
    100     int BondCount;          //!< number of atoms, brought up-to-date by CountBonds()
    101     mutable int NoNonHydrogen; //!< number of non-hydrogen atoms in molecule
    102     mutable int NoNonBonds;    //!< number of non-hydrogen bonds in molecule
    103     mutable int NoCyclicBonds; //!< number of cyclic bonds in molecule, by DepthFirstSearchAnalysis()
    104     double BondDistance; //!< typical bond distance used in CreateAdjacencyList() and furtheron
    105     bool ActiveFlag;    //!< in a MoleculeListClass used to discern active from inactive molecules
    106     //Vector Center;      //!< Center of molecule in a global box
    107     int IndexNr;        //!< index of molecule in a MoleculeListClass
    108     char name[MAXSTRINGSIZE];        //!< arbitrary name
    109 
    110   private:
    111     Formula formula;
    112     Cacheable<int>    AtomCount;
    113     moleculeId_t id;
    114     atomSet atoms; //<!list of atoms
    115     atomIdSet atomIds; //<!set of atomic ids to check uniqueness of atoms
    116   protected:
    117     //void CountAtoms();
    118     /**
    119      * this iterator type should be used for internal variables, \
     87public:
     88  typedef ATOMSET(std::list) atomSet;
     89  typedef std::set<atomId_t> atomIdSet;
     90  typedef ObservedIterator<atomSet> iterator;
     91  typedef atomSet::const_iterator const_iterator;
     92
     93  const periodentafel * const elemente; //!< periodic table with each element
     94  // old deprecated atom handling
     95  //atom *start;        //!< start of atom list
     96  //atom *end;          //!< end of atom list
     97  //bond *first;        //!< start of bond list
     98  //bond *last;         //!< end of bond list
     99  int MDSteps; //!< The number of MD steps in Trajectories
     100  //int AtomCount;          //!< number of atoms, brought up-to-date by CountAtoms()
     101  int BondCount; //!< number of atoms, brought up-to-date by CountBonds()
     102  mutable int NoNonHydrogen; //!< number of non-hydrogen atoms in molecule
     103  mutable int NoNonBonds; //!< number of non-hydrogen bonds in molecule
     104  mutable int NoCyclicBonds; //!< number of cyclic bonds in molecule, by DepthFirstSearchAnalysis()
     105  double BondDistance; //!< typical bond distance used in CreateAdjacencyList() and furtheron
     106  bool ActiveFlag; //!< in a MoleculeListClass used to discern active from inactive molecules
     107  //Vector Center;      //!< Center of molecule in a global box
     108  int IndexNr; //!< index of molecule in a MoleculeListClass
     109  char name[MAXSTRINGSIZE]; //!< arbitrary name
     110
     111private:
     112  Formula formula;
     113  Cacheable<int> AtomCount;
     114  moleculeId_t id;
     115  atomSet atoms; //<!list of atoms
     116  atomIdSet atomIds; //<!set of atomic ids to check uniqueness of atoms
     117protected:
     118  //void CountAtoms();
     119  /**
     120   * this iterator type should be used for internal variables, \
    120121     * since it will not lock
    121      */
    122     typedef atomSet::iterator internal_iterator;
    123 
    124 
    125     molecule(const periodentafel * const teil);
    126     virtual ~molecule();
    127 
     122   */
     123  typedef atomSet::iterator internal_iterator;
     124
     125  molecule(const periodentafel * const teil);
     126  virtual ~molecule();
    128127
    129128public:
     
    151150  bool empty() const;
    152151  size_t size() const;
    153   const_iterator erase( const_iterator loc );
    154   const_iterator erase( atom * key );
    155   const_iterator find (  atom * key ) const;
    156   pair<iterator,bool> insert ( atom * const key );
     152  const_iterator erase(const_iterator loc);
     153  const_iterator erase(atom * key);
     154  const_iterator find(atom * key) const;
     155  pair<iterator, bool> insert(atom * const key);
    157156  bool containsAtom(atom* key);
    158 
    159157
    160158  // re-definition of virtual functions from PointCloud
    161159  const char * const GetName() const;
    162   Vector *GetCenter() const ;
    163   TesselPoint *GetPoint() const ;
     160  Vector *GetCenter() const;
     161  TesselPoint *GetPoint() const;
    164162  int GetMaxId() const;
    165   void GoToNext() const ;
    166   void GoToFirst() const ;
    167   bool IsEmpty() const ;
    168   bool IsEnd() const ;
    169 
    170   // templates for allowing global manipulation of molecule with each atom as single argument
    171   template <typename res> void ActWithEachAtom( res (molecule::*f)(atom *) ) const;
    172   template <typename res> void ActWithEachAtom( res (molecule::*f)(atom *) const) const;
    173 
    174   // templates for allowing global copying of molecule with each atom as single argument
    175   template <typename res> void ActOnCopyWithEachAtom( res (molecule::*f)(atom *) , molecule *copy) const;
    176   template <typename res> void ActOnCopyWithEachAtom( res (molecule::*f)(atom *) const, molecule *copy) const;
    177 
    178   // templates for allowing global manipulation of all atoms
    179   template <typename res, typename typ> void ActOnAllAtoms( res (typ::*f)() ) const;
    180   template <typename res, typename typ> void ActOnAllAtoms( res (typ::*f)() const) const;
    181   template <typename res, typename typ, typename T> void ActOnAllAtoms( res (typ::*f)(T), T t ) const;
    182   template <typename res, typename typ, typename T> void ActOnAllAtoms( res (typ::*f)(T) const, T t ) const;
    183   template <typename res, typename typ, typename T, typename U> void ActOnAllAtoms( res (typ::*f)(T, U), T t, U u ) const;
    184   template <typename res, typename typ, typename T, typename U> void ActOnAllAtoms( res (typ::*f)(T, U) const, T t, U u ) const;
    185   template <typename res, typename typ, typename T, typename U, typename V> void ActOnAllAtoms( res (typ::*f)(T, U, V), T t, U u, V v) const;
    186   template <typename res, typename typ, typename T, typename U, typename V> void ActOnAllAtoms( res (typ::*f)(T, U, V) const, T t, U u, V v) const;
    187   template <typename res, typename typ, typename T, typename U, typename V, typename W> void ActOnAllAtoms( res (typ::*f)(T, U, V, W), T t, U u, V v, W w) const;
    188   template <typename res, typename typ, typename T, typename U, typename V, typename W> void ActOnAllAtoms( res (typ::*f)(T, U, V, W) const, T t, U u, V v, W w) const;
    189 
    190   // templates for allowing conditional global copying of molecule with each atom as single argument
    191   template <typename res> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) () ) const;
    192   template <typename res> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) () const ) const;
    193   template <typename res> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) const , molecule *copy, bool (atom::*condition) () ) const;
    194   template <typename res> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) const , molecule *copy, bool (atom::*condition) () const ) const;
    195   template <typename res, typename T> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) (T), T t ) const;
    196   template <typename res, typename T> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) (T) const, T t ) const;
    197   template <typename res, typename T> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) const , molecule *copy, bool (atom::*condition) (T), T t ) const;
    198   template <typename res, typename T> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) const , molecule *copy, bool (atom::*condition) (T) const, T t ) const;
    199   template <typename res, typename T, typename U> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) (T, U), T t, U u ) const;
    200   template <typename res, typename T, typename U> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) (T, U) const, T t, U u ) const;
    201   template <typename res, typename T, typename U> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) const , molecule *copy, bool (atom::*condition) (T, U), T t, U u ) const;
    202   template <typename res, typename T, typename U> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) const , molecule *copy, bool (atom::*condition) (T, U) const, T t, U u ) const;
    203   template <typename res, typename T, typename U, typename V> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) (T, U, V), T t, U u, V v ) const;
    204   template <typename res, typename T, typename U, typename V> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) (T, U, V) const, T t, U u, V v ) const;
    205   template <typename res, typename T, typename U, typename V> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) const , molecule *copy, bool (atom::*condition) (T, U, V), T t, U u, V v ) const;
    206   template <typename res, typename T, typename U, typename V> void ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) const , molecule *copy, bool (atom::*condition) (T, U, V) const, T t, U u, V v ) const;
    207 
    208   // templates for allowing global manipulation of an array with one entry per atom
    209   void SetIndexedArrayForEachAtomTo ( atom **array, int ParticleInfo::* index) const;
    210   template <typename T> void SetIndexedArrayForEachAtomTo ( T *array, int ParticleInfo::* index, void (*Setor)(T *, T *)) const;
    211   template <typename T> void SetIndexedArrayForEachAtomTo ( T *array, int ParticleInfo::* index, void (*Setor)(T *, T *), T t) const;
    212   template <typename T> void SetIndexedArrayForEachAtomTo ( T *array, int ParticleInfo::* index, void (*Setor)(T *, T *), T *t) const;
    213   template <typename T> void SetIndexedArrayForEachAtomTo ( T *array, int element::* index, void (*Setor)(T *, T *)) const;
    214   template <typename T> void SetIndexedArrayForEachAtomTo ( T *array, int element::* index, void (*Setor)(T *, T *), T t) const;
    215   template <typename T> void SetIndexedArrayForEachAtomTo ( T *array, int element::* index, void (*Setor)(T *, T *), T *t) const;
    216   template <typename T, typename typ> void SetIndexedArrayForEachAtomTo ( T *array, int ParticleInfo::*index, T (atom::*Setor)(typ &), typ atom::*value) const;
    217   template <typename T, typename typ> void SetIndexedArrayForEachAtomTo ( T *array, int ParticleInfo::*index, T (atom::*Setor)(typ &) const, typ atom::*value) const;
    218   template <typename T, typename typ> void SetIndexedArrayForEachAtomTo ( T *array, int ParticleInfo::*index, T (atom::*Setor)(typ &), typ &vect ) const;
    219   template <typename T, typename typ> void SetIndexedArrayForEachAtomTo ( T *array, int ParticleInfo::*index, T (atom::*Setor)(typ &) const, typ &vect ) const;
    220 
    221   // templates for allowing global manipulation of each atom by entries in an array
    222   template <typename T, typename typ, typename typ2> void SetAtomValueToIndexedArray ( T *array, int typ::*index, T typ2::*value ) const;
    223   template <typename T, typename typ> void SetAtomValueToValue ( T value, T typ::*ptr ) const;
    224 
    225   template <typename res, typename typ> res SumPerAtom(res (typ::*f)() ) const;
    226   template <typename res, typename typ> res SumPerAtom(res (typ::*f)() const ) const;
    227   template <typename res, typename typ, typename T> res SumPerAtom(res (typ::*f)(T) , T t ) const;
    228   template <typename res, typename typ, typename T> res SumPerAtom(res (typ::*f)(T) const, T t ) const;
     163  void GoToNext() const;
     164  void GoToFirst() const;
     165  bool IsEmpty() const;
     166  bool IsEnd() const;
    229167
    230168  /// remove atoms from molecule.
     
    241179  bool RemoveBond(bond *pointer);
    242180  bool RemoveBonds(atom *BondPartner);
    243   bool hasBondStructure();
     181  bool hasBondStructure() const;
    244182  unsigned int CountBonds() const;
    245183
     
    268206  void ScanForPeriodicCorrection();
    269207  bool VerletForceIntegration(char *file, config &configuration, const size_t offset);
    270   void Thermostats(config &configuration, double ActualTemp, int Thermostat);
    271208  double VolumeOfConvexEnvelope(bool IsAngstroem);
    272209
     
    274211  double MinimiseConstrainedPotential(atom **&permutation, int startstep, int endstep, bool IsAngstroem);
    275212  void EvaluateConstrainedForces(int startstep, int endstep, atom **PermutationMap, ForceMatrix *Force);
    276   bool LinearInterpolationBetweenConfiguration(int startstep, int endstep, std::string &prefix, config &configuration, bool MapByIdentity);
    277        
     213  bool LinearInterpolationBetweenConfiguration(int startstep, int endstep, std::string prefix, config &configuration, bool MapByIdentity);
     214
    278215  bool CheckBounds(const Vector *x) const;
    279216  void GetAlignvector(struct lsq_params * par) const;
     
    281218  /// Initialising routines in fragmentation
    282219  void CreateAdjacencyListFromDbondFile(ifstream *output);
    283   void CreateAdjacencyList(double bonddistance, bool IsAngstroem, void (BondGraph::*f)(BondedParticle * const , BondedParticle * const , double &, double &, bool), BondGraph *BG = NULL);
     220  void CreateAdjacencyList(double bonddistance, bool IsAngstroem, void(BondGraph::*f)(BondedParticle * const , BondedParticle * const , double &, double &, bool), BondGraph *BG = NULL);
    284221  int CorrectBondDegree() const;
    285222  void OutputBondsList() const;
     
    287224  void OutputGraphInfoPerAtom() const;
    288225  void OutputGraphInfoPerBond() const;
    289 
    290226
    291227  // Graph analysis
     
    301237  bond * CopyBond(atom *left, atom *right, bond *CopyBond);
    302238
    303 
    304   molecule *CopyMolecule();
     239  molecule *CopyMolecule() const;
    305240  molecule* CopyMoleculeFromSubRegion(const Shape&) const;
    306241
     
    308243  int FragmentMolecule(int Order, std::string &prefix);
    309244  bool CheckOrderAtSite(bool *AtomMask, Graph *GlobalKeySetList, int Order, int *MinimumRingSize, std::string path = "");
    310   bool StoreBondsToFile(std::string &filename, std::string path = "");
    311   bool StoreAdjacencyToFile(std::string &filename, std::string path = "");
     245  bool StoreBondsToFile(std::string filename, std::string path = "");
     246  bool StoreAdjacencyToFile(std::string filename, std::string path = "");
    312247  bool CheckAdjacencyFileAgainstMolecule(std::string &path, atom **ListOfAtoms);
    313248  bool ParseOrderAtSiteFromFile(std::string &path);
     
    330265
    331266  // Output routines.
    332   bool Output(std::ostream * const output);
    333   bool OutputTrajectories(ofstream * const output);
     267  bool Output(std::ostream * const output) const;
     268  bool OutputTrajectories(ofstream * const output) const;
    334269  void OutputListOfBonds() const;
    335270  bool OutputXYZ(ofstream * const output) const;
     
    341276  void flipActiveFlag();
    342277
    343   private:
    344   int last_atom;      //!< number given to last atom
    345   mutable internal_iterator InternalPointer;  //!< internal pointer for PointCloud
     278private:
     279  void init_DFS(struct DFSAccounting&) const;
     280  int last_atom; //!< number given to last atom
     281  mutable internal_iterator InternalPointer; //!< internal pointer for PointCloud
    346282};
    347283
     
    349285void DeleteMolecule(molecule* mol);
    350286
    351 #include "molecule_template.hpp"
    352 
    353287/** A list of \a molecule classes.
    354288 */
    355 class MoleculeListClass : public Observable {
    356   public:
    357     MoleculeList ListOfMolecules; //!< List of the contained molecules
    358     int MaxIndex;
     289class MoleculeListClass : public Observable
     290{
     291public:
     292  MoleculeList ListOfMolecules; //!< List of the contained molecules
     293  int MaxIndex;
    359294
    360295  MoleculeListClass(World *world);
     
    380315  void eraseMolecule();
    381316
    382   private:
     317private:
    383318  World *world; //!< The world this List belongs to. Needed to avoid deadlocks in the destructor
    384319};
    385320
    386 
    387321/** A leaf for a tree of \a molecule class
    388322 * Wraps molecules in a tree structure
    389323 */
    390 class MoleculeLeafClass {
    391   public:
    392     molecule *Leaf;                   //!< molecule of this leaf
    393     //MoleculeLeafClass *UpLeaf;        //!< Leaf one level up
    394     //MoleculeLeafClass *DownLeaf;      //!< First leaf one level down
    395     MoleculeLeafClass *previous;  //!< Previous leaf on this level
    396     MoleculeLeafClass *next;      //!< Next leaf on this level
     324class MoleculeLeafClass
     325{
     326public:
     327  molecule *Leaf; //!< molecule of this leaf
     328  //MoleculeLeafClass *UpLeaf;        //!< Leaf one level up
     329  //MoleculeLeafClass *DownLeaf;      //!< First leaf one level down
     330  MoleculeLeafClass *previous; //!< Previous leaf on this level
     331  MoleculeLeafClass *next; //!< Next leaf on this level
    397332
    398333  //MoleculeLeafClass(MoleculeLeafClass *Up, MoleculeLeafClass *Previous);
     
    409344};
    410345
    411 
    412346#endif /*MOLECULES_HPP_*/
    413347
Note: See TracChangeset for help on using the changeset viewer.