| 91 |  | class ForceDecomposition { | 
| 92 |  | public: | 
| 93 |  |  | 
| 94 | < | ForceDecomposition(SimInfo* info); | 
| 94 | > | ForceDecomposition(SimInfo* info, InteractionManager* iMan); | 
| 95 |  | virtual ~ForceDecomposition() {} | 
| 96 |  |  | 
| 97 |  | virtual void distributeInitialData() = 0; | 
| 128 |  |  | 
| 129 |  | // atom bookkeeping | 
| 130 |  | virtual int getNAtomsInRow() = 0; | 
| 131 | < | virtual vector<int> getSkipsForRowAtom(int atom1) = 0; | 
| 131 | > | virtual vector<int> getSkipsForAtom(int atom1) = 0; | 
| 132 |  | virtual bool skipAtomPair(int atom1, int atom2) = 0; | 
| 133 |  | virtual void addForceToAtomRow(int atom1, Vector3d fg) = 0; | 
| 134 |  | virtual void addForceToAtomColumn(int atom2, Vector3d fg) = 0; | 
| 135 | + | virtual int getTopologicalDistance(int atom1, int atom2) = 0; | 
| 136 |  |  | 
| 137 |  | // filling interaction blocks with pointers | 
| 138 | < | virtual InteractionData fillInteractionData(int atom1, int atom2) = 0; | 
| 139 | < | virtual void unpackInteractionData(InteractionData idat, int atom1, int atom2) = 0; | 
| 140 | < | virtual InteractionData fillSkipData(int atom1, int atom2) = 0; | 
| 141 | < | virtual SelfData fillSelfData(int atom1); | 
| 138 | > | virtual void fillInteractionData(InteractionData &idat, int atom1, int atom2) = 0; | 
| 139 | > | virtual void unpackInteractionData(InteractionData &idat, int atom1, int atom2) = 0; | 
| 140 | > | virtual void fillSkipData(InteractionData &idat, int atom1, int atom2) = 0; | 
| 141 | > | virtual void fillSelfData(SelfData &sdat, int atom1); | 
| 142 |  |  | 
| 143 |  | protected: | 
| 144 |  | SimInfo* info_; | 
| 151 |  | RealType skinThickness_;   /**< Verlet neighbor list skin thickness */ | 
| 152 |  | RealType largestRcut_; | 
| 153 |  |  | 
| 154 | < | map<pair<int, int>, int> topoDist; //< topoDist gives the | 
| 155 | < | //topological distance between | 
| 156 | < | //two atomic sites.  This | 
| 157 | < | //declaration is agnostic | 
| 158 | < | //regarding the parallel | 
| 159 | < | //decomposition.  The two | 
| 160 | < | //indices could be local or row | 
| 161 | < | //& column.  It will be up to | 
| 162 | < | //the specific decomposition | 
| 163 | < | //method to fill this. | 
| 164 | < | map<pair<int, int>, bool> exclude; //< exclude is the set of pairs | 
| 164 | < | //to leave out of non-bonded | 
| 165 | < | //force evaluations.  This | 
| 166 | < | //declaration is agnostic | 
| 167 | < | //regarding the parallel | 
| 168 | < | //decomposition.  The two | 
| 169 | < | //indices could be local or row | 
| 170 | < | //& column.  It will be up to | 
| 171 | < | //the specific decomposition | 
| 172 | < | //method to fill this. | 
| 173 | < |  | 
| 154 | > | /** | 
| 155 | > | * The topological distance between two atomic sites is handled | 
| 156 | > | * via two vector structures for speed.  These structures agnostic | 
| 157 | > | * regarding the parallel decomposition.  The index for | 
| 158 | > | * toposForAtom could be local or row, while the values could be | 
| 159 | > | * local or column.  It will be up to the specific decomposition | 
| 160 | > | * method to fill these. | 
| 161 | > | */ | 
| 162 | > | vector<vector<int> > toposForAtom; | 
| 163 | > | vector<vector<int> > topoDist; | 
| 164 | > | vector<vector<int> > skipsForAtom; | 
| 165 |  | vector<vector<int> > groupList_; | 
| 166 | + | vector<RealType> massFactors; | 
| 167 |  |  | 
| 168 |  | vector<Vector3i> cellOffsets_; | 
| 169 |  | Vector3i nCells_; |