| 1 |  | /* | 
| 2 | < | * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved. | 
| 2 | > | * Copyright (c) 2011 The University of Notre Dame. All Rights Reserved. | 
| 3 |  | * | 
| 4 |  | * The University of Notre Dame grants you ("Licensee") a | 
| 5 |  | * non-exclusive, royalty free, license to use, modify and | 
| 39 |  | * [4]  Vardeman & Gezelter, in progress (2009). | 
| 40 |  | */ | 
| 41 |  |  | 
| 42 | < | #ifndef PARALLEL_DECOMPOSITION_HPP | 
| 43 | < | #define PARALLEL_DECOMPOSITION_HPP | 
| 42 | > | #ifndef PARALLEL_FORCEDECOMPOSITION_HPP | 
| 43 | > | #define PARALLEL_FORCEDECOMPOSITION_HPP | 
| 44 |  |  | 
| 45 |  | #include "brains/SimInfo.hpp" | 
| 46 | + | #include "brains/SnapshotManager.hpp" | 
| 47 |  | #include "nonbonded/NonBondedInteraction.hpp" | 
| 48 |  |  | 
| 49 |  | using namespace std; | 
| 50 |  | namespace OpenMD { | 
| 51 |  |  | 
| 52 |  | /** | 
| 53 | < | * @class Decomposition | 
| 53 | < | * Decomposition is an interface for passing out and collecting information | 
| 54 | < | * from many processors at various stages of the main non-bonded ForceLoop. | 
| 53 | > | * @class ForceDecomposition | 
| 54 |  | * | 
| 55 | + | * ForceDecomposition is an interface for passing out and collecting | 
| 56 | + | * information from many processors at various stages of the main | 
| 57 | + | * non-bonded ForceLoop. | 
| 58 | + | * | 
| 59 |  | * The pairwise force calculation has an outer-running loop (the "I" | 
| 60 |  | * loop) and an inner-running loop (the "J" loop).  In parallel | 
| 61 |  | * decompositions, these loop over different groups of atoms on | 
| 79 |  | *  end | 
| 80 |  | * collectData                        (parallel communication) | 
| 81 |  | * | 
| 82 | < | * Decomposition provides the interface for ForceLoop to do the | 
| 82 | > | * ForceDecomposition provides the interface for ForceLoop to do the | 
| 83 |  | * communication steps and to iterate using the correct set of atoms | 
| 84 |  | * and cutoff groups. | 
| 85 |  | */ | 
| 86 | < | class Decomposition { | 
| 86 | > | class ForceDecomposition { | 
| 87 |  | public: | 
| 88 |  |  | 
| 89 | < | Decomposition(SimInfo* info) : info_(info) {} | 
| 90 | < | virtual ~Decomposition() {} | 
| 89 | > | ForceDecomposition(SimInfo* info); | 
| 90 | > | virtual ~ForceDecomposition() {} | 
| 91 |  |  | 
| 92 |  | virtual void distributeInitialData() = 0; | 
| 93 |  | virtual void distributeData() = 0; | 
| 94 | + | virtual void zeroWorkArrays() = 0; | 
| 95 |  | virtual void collectIntermediateData() = 0; | 
| 96 |  | virtual void distributeIntermediateData() = 0; | 
| 97 |  | virtual void collectData() = 0; | 
| 98 | + | virtual potVec getLongRangePotential() { return longRangePot_; } | 
| 99 |  |  | 
| 100 |  | // neighbor list routines | 
| 101 | < | virtual bool checkNeighborList() = 0; | 
| 101 | > | virtual bool checkNeighborList(); | 
| 102 |  | virtual vector<pair<int, int> >  buildNeighborList() = 0; | 
| 103 |  |  | 
| 104 |  | // group bookkeeping | 
| 105 |  | virtual pair<int, int> getGroupTypes(int cg1, int cg2) = 0; | 
| 106 |  |  | 
| 107 |  | // Group->atom bookkeeping | 
| 108 | < | virtual vector<int> getAtomsInGroupI(int cg1) = 0; | 
| 109 | < | virtual vector<int> getAtomsInGroupJ(int cg2) = 0; | 
| 105 | < | virtual Vector3d getAtomToGroupVectorI(int atom1, int cg1) = 0; | 
| 106 | < | virtual Vector3d getAtomToGroupVectorJ(int atom2, int cg2) = 0; | 
| 107 | < | virtual RealType getMfactI(int atom1) = 0; | 
| 108 | < | virtual RealType getMfactJ(int atom2) = 0; | 
| 108 | > | virtual vector<int> getAtomsInGroupRow(int cg1) = 0; | 
| 109 | > | virtual vector<int> getAtomsInGroupColumn(int cg2) = 0; | 
| 110 |  |  | 
| 111 | + | virtual Vector3d getAtomToGroupVectorRow(int atom1, int cg1) = 0; | 
| 112 | + | virtual Vector3d getAtomToGroupVectorColumn(int atom2, int cg2) = 0; | 
| 113 | + | virtual RealType getMassFactorRow(int atom1) = 0; | 
| 114 | + | virtual RealType getMassFactorColumn(int atom2) = 0; | 
| 115 | + |  | 
| 116 |  | // spatial data | 
| 117 |  | virtual Vector3d getIntergroupVector(int cg1, int cg2) = 0; | 
| 118 |  | virtual Vector3d getInteratomicVector(int atom1, int atom2) = 0; | 
| 119 |  |  | 
| 120 |  | // atom bookkeeping | 
| 121 | < | virtual vector<int> getAtomList() = 0; | 
| 122 | < | virtual vector<int> getSkipsForAtom(int atom1) = 0 | 
| 121 | > | virtual int getNAtomsInRow() = 0; | 
| 122 | > | virtual vector<int> getSkipsForRowAtom(int atom1) = 0; | 
| 123 |  | virtual bool skipAtomPair(int atom1, int atom2) = 0; | 
| 124 | < | virtual void addForceToAtomI(int atom1, Vector3d fg) = 0; | 
| 125 | < | virtual void addForceToAtomJ(int atom2, Vector3d fg) = 0; | 
| 124 | > | virtual void addForceToAtomRow(int atom1, Vector3d fg) = 0; | 
| 125 | > | virtual void addForceToAtomColumn(int atom2, Vector3d fg) = 0; | 
| 126 |  |  | 
| 127 |  | // filling interaction blocks with pointers | 
| 128 |  | virtual InteractionData fillInteractionData(int atom1, int atom2) = 0; | 
| 129 | + | virtual void unpackInteractionData(InteractionData idat, int atom1, int atom2) = 0; | 
| 130 |  | virtual InteractionData fillSkipData(int atom1, int atom2) = 0; | 
| 131 | < | virtual SelfData fillSelfData(int atom1) = 0; | 
| 131 | > | virtual SelfData fillSelfData(int atom1); | 
| 132 |  |  | 
| 133 |  | protected: | 
| 134 |  | SimInfo* info_; | 
| 135 | + | SnapshotManager* sman_; | 
| 136 | + | Snapshot* snap_; | 
| 137 | + | ForceField* ff_; | 
| 138 | + | int storageLayout_; | 
| 139 | + | RealType skinThickness_;   /**< Verlet neighbor list skin thickness */ | 
| 140 | + |  | 
| 141 |  | map<pair<int, int>, int> topoDist; //< topoDist gives the | 
| 142 |  | //topological distance between | 
| 143 |  | //two atomic sites.  This | 
| 158 |  | //& column.  It will be up to | 
| 159 |  | //the specific decomposition | 
| 160 |  | //method to fill this. | 
| 161 | + |  | 
| 162 | + | vector<vector<int> > groupList_; | 
| 163 | + | vector<Vector3i> cellOffsets_; | 
| 164 | + | Vector3i nCells_; | 
| 165 | + | vector<vector<int> > cellList_; | 
| 166 | + | vector<Vector3d> saved_CG_positions_; | 
| 167 | + | potVec longRangePot_; | 
| 168 | + |  | 
| 169 |  | }; | 
| 170 |  | } | 
| 171 |  | #endif |