--- branches/development/src/parallel/ForceMatrixDecomposition.hpp 2011/05/24 21:24:45 1567 +++ trunk/src/parallel/ForceMatrixDecomposition.hpp 2013/08/19 13:12:00 1929 @@ -35,8 +35,9 @@ * * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005). * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006). - * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008). - * [4] Vardeman & Gezelter, in progress (2009). + * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008). + * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010). + * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011). */ #ifndef PARALLEL_FORCEMATRIXDECOMPOSITION_HPP @@ -55,56 +56,61 @@ namespace OpenMD { class ForceMatrixDecomposition : public ForceDecomposition { public: - ForceMatrixDecomposition(SimInfo* info) : ForceDecomposition(info) {sman_ = info_->getSnapshotManager();} + ForceMatrixDecomposition(SimInfo* info, InteractionManager* iMan); + void distributeInitialData(); + void zeroWorkArrays(); void distributeData(); void collectIntermediateData(); void distributeIntermediateData(); + void collectSelfData(); void collectData(); // neighbor list routines - bool checkNeighborList(); - vector > buildNeighborList(); + void buildNeighborList(vector >& neighborList); // group bookkeeping - pair getGroupTypes(int cg1, int cg2); + void getGroupCutoffs(int &cg1, int &cg2, RealType &rcut, RealType &rcutsq, RealType &rlistsq); + Vector3d& getGroupVelocityColumn(int cg2); // Group->atom bookkeeping - vector getAtomsInGroupRow(int cg1); - vector getAtomsInGroupColumn(int cg2); + vector& getAtomsInGroupRow(int cg1); + vector& getAtomsInGroupColumn(int cg2); Vector3d getAtomToGroupVectorRow(int atom1, int cg1); Vector3d getAtomToGroupVectorColumn(int atom2, int cg2); - RealType getMfactRow(int atom1); - RealType getMfactColumn(int atom2); + RealType& getMassFactorRow(int atom1); + RealType& getMassFactorColumn(int atom2); // spatial data Vector3d getIntergroupVector(int cg1, int cg2); Vector3d getInteratomicVector(int atom1, int atom2); // atom bookkeeping - vector getAtomList(); - vector getSkipsForAtom(int atom1); - bool skipAtomPair(int atom1, int atom2); + int& getNAtomsInRow(); + int getTopologicalDistance(int atom1, int atom2); + vector& getExcludesForAtom(int atom1); + bool skipAtomPair(int atom1, int atom2, int cg1, int cg2); + bool excludeAtomPair(int atom1, int atom2); void addForceToAtomRow(int atom1, Vector3d fg); void addForceToAtomColumn(int atom2, Vector3d fg); + Vector3d& getAtomVelocityColumn(int atom2); // filling interaction blocks with pointers - InteractionData fillInteractionData(int atom1, int atom2); - InteractionData fillSkipData(int atom1, int atom2); - SelfData fillSelfData(int atom1); + void fillInteractionData(InteractionData &idat, int atom1, int atom2); + void unpackInteractionData(InteractionData &idat, int atom1, int atom2); private: - SnapshotManager* sman_; - Snapshot* snap_; - int storageLayout_; - vector Cells; + void createGtypeCutoffMap(); int nLocal_; int nGroups_; + vector AtomLocalToGlobal; + vector cgLocalToGlobal; + vector groupCutoff; + vector groupToGtype; #ifdef IS_MPI - DataStorage atomRowData; - DataStorage atomColData; + DataStorage atomRowData; DataStorage atomColData; DataStorage cgRowData; DataStorage cgColData; @@ -113,39 +119,64 @@ namespace OpenMD { int nGroupsInRow_; int nGroupsInCol_; - Communicator* AtomCommIntRow; - Communicator* AtomCommRealRow; - Communicator* AtomCommVectorRow; - Communicator* AtomCommMatrixRow; + Communicator rowComm; + Communicator colComm; - Communicator* AtomCommIntColumn; - Communicator* AtomCommRealColumn; - Communicator* AtomCommVectorColumn; - Communicator* AtomCommMatrixColumn; + Plan* AtomPlanIntRow; + Plan* AtomPlanRealRow; + Plan* AtomPlanVectorRow; + Plan* AtomPlanMatrixRow; + Plan* AtomPlanPotRow; - Communicator* cgCommIntRow; - Communicator* cgCommVectorRow; - Communicator* cgCommIntColumn; - Communicator* cgCommVectorColumn; + Plan* AtomPlanIntColumn; + Plan* AtomPlanRealColumn; + Plan* AtomPlanVectorColumn; + Plan* AtomPlanMatrixColumn; + Plan* AtomPlanPotColumn; - vector > pot_row; - vector > pot_col; + Plan* cgPlanIntRow; + Plan* cgPlanVectorRow; + Plan* cgPlanIntColumn; + Plan* cgPlanVectorColumn; + + // work arrays for assembling potential energy + vector pot_row; + vector pot_col; + + vector expot_row; + vector expot_col; + vector identsRow; vector identsCol; - vector AtomLocalToGlobal; + vector regionsRow; + vector regionsCol; + + vector atypesRow; + vector atypesCol; + vector AtomRowToGlobal; vector AtomColToGlobal; - vector cgLocalToGlobal; + +public: vector cgRowToGlobal; vector cgColToGlobal; - vector > CellListRow; - vector > CellListCol; -#else - vector > CellList; +private: + vector groupCutoffRow; + vector groupCutoffCol; + vector groupColToGtype; + vector groupRowToGtype; + + vector > cellListRow_; + vector > cellListCol_; + + vector > groupListRow_; + vector > groupListCol_; + + vector massFactorsRow; + vector massFactorsCol; #endif - vector pot_local; };