forked from lijiext/lammps
159 lines
4.5 KiB
C++
159 lines
4.5 KiB
C++
// A class for managing the data associated with sets of molecules
|
|
|
|
#ifndef PER_MOLECULE_SET_H
|
|
#define PER_MOLECULE_SET_H
|
|
|
|
// ATC_Method headers
|
|
#include "LammpsInterface.h"
|
|
#include "DependencyManager.h"
|
|
#include <map>
|
|
#include <set>
|
|
#include <vector>
|
|
|
|
namespace ATC {
|
|
|
|
// forward declarations
|
|
class ATC_Method;
|
|
template <typename T> class PerAtomQuantity;
|
|
|
|
/**
|
|
* @class MoleculeSet
|
|
* @brief A class for handling all the data associated with sets of molecules
|
|
*/
|
|
|
|
class MoleculeSet : public DependencyManager {
|
|
|
|
public:
|
|
|
|
MoleculeSet(ATC_Method * atc, int groupBit);
|
|
|
|
virtual ~MoleculeSet();
|
|
|
|
/** reset all data */
|
|
virtual void clear();
|
|
|
|
/** initialize global data */
|
|
virtual void initialize(std::map<int, double> * globalAtomsPerMolecule = NULL);
|
|
|
|
/** reset the number of atoms/molecules on this processor */
|
|
void reset_nlocal() {this->set_reset();};
|
|
|
|
/** recompute data when atoms cross processors */
|
|
void post_exchange() {this->set_reset();};
|
|
|
|
/** access the number of total molecules */
|
|
int global_molecule_count() const {return nMoleculesTotal_;};
|
|
|
|
/** access the number of local molecules */
|
|
int local_molecule_count() const {if (need_reset()) reset(); return moleculeToAtoms_.size();};
|
|
|
|
/** access molecule atoms by lammps id */
|
|
std::set<int> atoms_by_global_molecule(int id) const;
|
|
|
|
/** access molecules by local indexing */
|
|
const std::set<int> & atoms_by_local_molecule(int id) const;
|
|
|
|
/** access fraction of a locally indexed molecule on this processor */
|
|
virtual double local_fraction(int id) const = 0;
|
|
|
|
/** use global index to get local index */
|
|
//int global_to_local(int id) const;
|
|
|
|
/** use local index to get global index */
|
|
int local_to_global(int id) const {return (*localMoleculeToAtoms_[id]).first;};
|
|
|
|
protected:
|
|
|
|
/** pointer for access to atc data */
|
|
ATC_Method * atc_;
|
|
|
|
/** lammps group bit corresponding to desired molecules */
|
|
int groupBit_;
|
|
|
|
/** pointer to lammps interface */
|
|
const LammpsInterface * lammps_;
|
|
|
|
/** total number of molecules in this group */
|
|
// see Compute::molecules_in_group
|
|
int nMoleculesTotal_;
|
|
|
|
/** multimap from lammps molecule id to ids of consituent atoms, all atoms are real */
|
|
// multiple map to account for periodic images
|
|
mutable std::multimap<int, std::set<int> > moleculeToAtoms_;
|
|
|
|
/** vector in processor-local molecule order to constituent atom sets, atoms include ghosts */
|
|
mutable std::vector< std::map<int, std::set<int> >::const_iterator > localMoleculeToAtoms_;
|
|
|
|
/** resets the quantity based on the latest data */
|
|
virtual void reset() const = 0;
|
|
|
|
/** creates the ordered list of local molecules */
|
|
void set_local_molecules_to_atoms() const;
|
|
|
|
private:
|
|
|
|
// do not define this
|
|
MoleculeSet();
|
|
|
|
};
|
|
|
|
|
|
/**
|
|
* @class SmallMoleculeSet
|
|
* @brief A class for handling data for small molecules, i.e., molecules with maximum distance between atoms less than the lammps cutoff radius. Atom ids are in [0,nlocalTotal-1].
|
|
*/
|
|
|
|
class SmallMoleculeSet : public MoleculeSet {
|
|
|
|
public:
|
|
|
|
SmallMoleculeSet(ATC_Method * atc, int groupBit,
|
|
PerAtomQuantity<int> * bondList = NULL,
|
|
PerAtomQuantity<int> * numBond = NULL);
|
|
|
|
virtual ~SmallMoleculeSet();
|
|
|
|
/** reset all data */
|
|
virtual void clear();
|
|
|
|
/** initialize global data */
|
|
virtual void initialize(std::map<int, double> * globalAtomsPerMolecule = NULL);
|
|
|
|
/** access molecule atoms by lammps id */
|
|
std::set<int> atoms_by_global_molecule(int id) const;
|
|
|
|
/** access fraction of a locally indexed molecule on this processor */
|
|
virtual double local_fraction(int id) const;
|
|
|
|
protected:
|
|
|
|
/** store the number of atoms in a molecule on this processor */
|
|
//std::map<int, int> localAtomsPerMolecule_;
|
|
|
|
/** resets the quantity based on the latest data */
|
|
virtual void reset() const;
|
|
|
|
/** data structure containing bond list information, forces parallel communication of bond lists */
|
|
PerAtomQuantity<int> * bondList_;
|
|
|
|
/** data structure containing bond list information, forces parallel communication of bond lists */
|
|
PerAtomQuantity<int> * numBond_;
|
|
|
|
/** removes processor ghosts from a set of atom ids */
|
|
void remove_proc_ghosts(std::set<int> & atomSet) const;
|
|
|
|
// workspace variable for determining if we've hit an internal atom already
|
|
mutable Array<bool> _atomFound_;
|
|
|
|
private:
|
|
|
|
// do not define this
|
|
SmallMoleculeSet();
|
|
|
|
};
|
|
|
|
|
|
};
|
|
|
|
#endif
|