Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/molecule.hpp

    re4afb4 raf2c424  
    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
    83 {
     82class molecule : public PointCloud , public Observable {
    8483  friend molecule *NewMolecule();
    8584  friend void DeleteMolecule(molecule *);
    8685
    87 public:
    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 
    111 private:
    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
    117 protected:
    118   //void CountAtoms();
    119   /**
    120    * this iterator type should be used for internal variables, \
     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, \
    121120     * since it will not lock
    122    */
    123   typedef atomSet::iterator internal_iterator;
    124 
    125   molecule(const periodentafel * const teil);
    126   virtual ~molecule();
     121     */
     122    typedef atomSet::iterator internal_iterator;
     123
     124
     125    molecule(const periodentafel * const teil);
     126    virtual ~molecule();
     127
    127128
    128129public:
     
    150151  bool empty() const;
    151152  size_t size() const;
    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);
     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 );
    156157  bool containsAtom(atom* key);
     158
    157159
    158160  // re-definition of virtual functions from PointCloud
    159161  const char * const GetName() const;
    160   Vector *GetCenter() const;
    161   TesselPoint *GetPoint() const;
     162  Vector *GetCenter() const ;
     163  TesselPoint *GetPoint() const ;
    162164  int GetMaxId() const;
    163   void GoToNext() const;
    164   void GoToFirst() const;
    165   bool IsEmpty() const;
    166   bool IsEnd() 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;
    167229
    168230  /// remove atoms from molecule.
     
    179241  bool RemoveBond(bond *pointer);
    180242  bool RemoveBonds(atom *BondPartner);
    181   bool hasBondStructure() const;
     243  bool hasBondStructure();
    182244  unsigned int CountBonds() const;
    183245
     
    206268  void ScanForPeriodicCorrection();
    207269  bool VerletForceIntegration(char *file, config &configuration, const size_t offset);
     270  void Thermostats(config &configuration, double ActualTemp, int Thermostat);
    208271  double VolumeOfConvexEnvelope(bool IsAngstroem);
    209272
     
    211274  double MinimiseConstrainedPotential(atom **&permutation, int startstep, int endstep, bool IsAngstroem);
    212275  void EvaluateConstrainedForces(int startstep, int endstep, atom **PermutationMap, ForceMatrix *Force);
    213   bool LinearInterpolationBetweenConfiguration(int startstep, int endstep, std::string prefix, config &configuration, bool MapByIdentity);
    214 
     276  bool LinearInterpolationBetweenConfiguration(int startstep, int endstep, std::string &prefix, config &configuration, bool MapByIdentity);
     277       
    215278  bool CheckBounds(const Vector *x) const;
    216279  void GetAlignvector(struct lsq_params * par) const;
     
    218281  /// Initialising routines in fragmentation
    219282  void CreateAdjacencyListFromDbondFile(ifstream *output);
    220   void CreateAdjacencyList(double bonddistance, bool IsAngstroem, void(BondGraph::*f)(BondedParticle * const , BondedParticle * const , double &, double &, bool), BondGraph *BG = NULL);
     283  void CreateAdjacencyList(double bonddistance, bool IsAngstroem, void (BondGraph::*f)(BondedParticle * const , BondedParticle * const , double &, double &, bool), BondGraph *BG = NULL);
    221284  int CorrectBondDegree() const;
    222285  void OutputBondsList() const;
     
    224287  void OutputGraphInfoPerAtom() const;
    225288  void OutputGraphInfoPerBond() const;
     289
    226290
    227291  // Graph analysis
     
    237301  bond * CopyBond(atom *left, atom *right, bond *CopyBond);
    238302
    239   molecule *CopyMolecule() const;
     303
     304  molecule *CopyMolecule();
    240305  molecule* CopyMoleculeFromSubRegion(const Shape&) const;
    241306
     
    243308  int FragmentMolecule(int Order, std::string &prefix);
    244309  bool CheckOrderAtSite(bool *AtomMask, Graph *GlobalKeySetList, int Order, int *MinimumRingSize, std::string path = "");
    245   bool StoreBondsToFile(std::string filename, std::string path = "");
    246   bool StoreAdjacencyToFile(std::string filename, std::string path = "");
     310  bool StoreBondsToFile(std::string &filename, std::string path = "");
     311  bool StoreAdjacencyToFile(std::string &filename, std::string path = "");
    247312  bool CheckAdjacencyFileAgainstMolecule(std::string &path, atom **ListOfAtoms);
    248313  bool ParseOrderAtSiteFromFile(std::string &path);
     
    265330
    266331  // Output routines.
    267   bool Output(std::ostream * const output) const;
    268   bool OutputTrajectories(ofstream * const output) const;
     332  bool Output(std::ostream * const output);
     333  bool OutputTrajectories(ofstream * const output);
    269334  void OutputListOfBonds() const;
    270335  bool OutputXYZ(ofstream * const output) const;
     
    276341  void flipActiveFlag();
    277342
    278 private:
    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
     343  private:
     344  int last_atom;      //!< number given to last atom
     345  mutable internal_iterator InternalPointer;  //!< internal pointer for PointCloud
    282346};
    283347
     
    285349void DeleteMolecule(molecule* mol);
    286350
     351#include "molecule_template.hpp"
     352
    287353/** A list of \a molecule classes.
    288354 */
    289 class MoleculeListClass : public Observable
    290 {
    291 public:
    292   MoleculeList ListOfMolecules; //!< List of the contained molecules
    293   int MaxIndex;
     355class MoleculeListClass : public Observable {
     356  public:
     357    MoleculeList ListOfMolecules; //!< List of the contained molecules
     358    int MaxIndex;
    294359
    295360  MoleculeListClass(World *world);
     
    315380  void eraseMolecule();
    316381
    317 private:
     382  private:
    318383  World *world; //!< The world this List belongs to. Needed to avoid deadlocks in the destructor
    319384};
     385
    320386
    321387/** A leaf for a tree of \a molecule class
    322388 * Wraps molecules in a tree structure
    323389 */
    324 class MoleculeLeafClass
    325 {
    326 public:
    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
     390class 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
    332397
    333398  //MoleculeLeafClass(MoleculeLeafClass *Up, MoleculeLeafClass *Previous);
     
    344409};
    345410
     411
    346412#endif /*MOLECULES_HPP_*/
    347413
Note: See TracChangeset for help on using the changeset viewer.