--- branches/development/src/parallel/ForceDecomposition.cpp 2011/01/14 22:31:31 1539 +++ branches/development/src/parallel/ForceDecomposition.cpp 2011/03/18 19:31:52 1544 @@ -39,28 +39,71 @@ * [4] Vardeman & Gezelter, in progress (2009). */ #include "parallel/ForceDecomposition.hpp" -#include "parallel/Communicator.hpp" #include "math/SquareMatrix3.hpp" +#include "nonbonded/NonBondedInteraction.hpp" +#include "brains/SnapshotManager.hpp" +using namespace std; namespace OpenMD { + /** + * distributeInitialData is essentially a copy of the older fortran + * SimulationSetup + */ + void ForceDecomposition::distributeInitialData() { -#ifdef IS_MPI +#ifdef IS_MPI + Snapshot* snap = sman_->getCurrentSnapshot(); + int nLocal = snap->getNumberOfAtoms(); + int nGroups = snap->getNumberOfCutoffGroups(); - int nAtoms; - int nGroups; + AtomCommIntI = new Communicator(nLocal); + AtomCommRealI = new Communicator(nLocal); + AtomCommVectorI = new Communicator(nLocal); + AtomCommMatrixI = new Communicator(nLocal); - AtomCommRealI = new Comm(nAtoms); - AtomCommVectorI = new Comm(nAtoms); - AtomCommMatrixI = new Comm(nAtoms); + AtomCommIntJ = new Communicator(nLocal); + AtomCommRealJ = new Communicator(nLocal); + AtomCommVectorJ = new Communicator(nLocal); + AtomCommMatrixJ = new Communicator(nLocal); - AtomCommRealJ = new Comm(nAtoms); - AtomCommVectorJ = new Comm(nAtoms); - AtomCommMatrixJ = new Comm(nAtoms); + cgCommIntI = new Communicator(nGroups); + cgCommVectorI = new Communicator(nGroups); + cgCommIntJ = new Communicator(nGroups); + cgCommVectorJ = new Communicator(nGroups); - cgCommVectorI = new Comm(nGroups); - cgCommVectorJ = new Comm(nGroups); - // more to come + int nAtomsInRow = AtomCommIntI->getSize(); + int nAtomsInCol = AtomCommIntJ->getSize(); + int nGroupsInRow = cgCommIntI->getSize(); + int nGroupsInCol = cgCommIntJ->getSize(); + + vector > pot_row(N_INTERACTION_FAMILIES, + vector (nAtomsInRow, 0.0)); + vector > pot_col(N_INTERACTION_FAMILIES, + vector (nAtomsInCol, 0.0)); + + vector pot_local(N_INTERACTION_FAMILIES, 0.0); + + // gather the information for atomtype IDs (atids): + AtomCommIntI->gather(info_->getIdentArray(), identsRow); + AtomCommIntJ->gather(info_->getIdentArray(), identsCol); + + AtomLocalToGlobal = info_->getLocalToGlobalAtomIndex(); + AtomCommIntI->gather(AtomLocalToGlobal, AtomRowToGlobal); + AtomCommIntJ->gather(AtomLocalToGlobal, AtomColToGlobal); + + cgLocalToGlobal = info_->getLocalToGlobalCutoffGroupIndex(); + cgCommIntI->gather(cgLocalToGlobal, cgRowToGlobal); + cgCommIntJ->gather(cgLocalToGlobal, cgColToGlobal); + + + + + + + // still need: + // topoDist + // exclude #endif } @@ -69,33 +112,33 @@ namespace OpenMD { void ForceDecomposition::distributeData() { #ifdef IS_MPI Snapshot* snap = sman_->getCurrentSnapshot(); - + // gather up the atomic positions AtomCommVectorI->gather(snap->atomData.position, snap->atomIData.position); AtomCommVectorJ->gather(snap->atomData.position, - snap->atomJData.position); + snap->atomJData.position); // gather up the cutoff group positions cgCommVectorI->gather(snap->cgData.position, - snap->cgIData.position); + snap->cgIData.position); cgCommVectorJ->gather(snap->cgData.position, - snap->cgJData.position); + snap->cgJData.position); // if needed, gather the atomic rotation matrices if (snap->atomData.getStorageLayout() & DataStorage::dslAmat) { AtomCommMatrixI->gather(snap->atomData.aMat, - snap->atomIData.aMat); + snap->atomIData.aMat); AtomCommMatrixJ->gather(snap->atomData.aMat, - snap->atomJData.aMat); + snap->atomJData.aMat); } // if needed, gather the atomic eletrostatic frames if (snap->atomData.getStorageLayout() & DataStorage::dslElectroFrame) { AtomCommMatrixI->gather(snap->atomData.electroFrame, - snap->atomIData.electroFrame); + snap->atomIData.electroFrame); AtomCommMatrixJ->gather(snap->atomData.electroFrame, - snap->atomJData.electroFrame); + snap->atomJData.electroFrame); } #endif } @@ -103,14 +146,14 @@ namespace OpenMD { void ForceDecomposition::collectIntermediateData() { #ifdef IS_MPI Snapshot* snap = sman_->getCurrentSnapshot(); - // gather up the atomic positions if (snap->atomData.getStorageLayout() & DataStorage::dslDensity) { + AtomCommRealI->scatter(snap->atomIData.density, - snap->atomData.density); - std::vector rho_tmp; - int n = snap->getNumberOfAtoms(); - rho_tmp.reserve( n ); + snap->atomData.density); + + int n = snap->atomData.density.size(); + std::vector rho_tmp(n, 0.0); AtomCommRealJ->scatter(snap->atomJData.density, rho_tmp); for (int i = 0; i < n; i++) snap->atomData.density[i] += rho_tmp[i]; @@ -123,16 +166,16 @@ namespace OpenMD { Snapshot* snap = sman_->getCurrentSnapshot(); if (snap->atomData.getStorageLayout() & DataStorage::dslFunctional) { AtomCommRealI->gather(snap->atomData.functional, - snap->atomIData.functional); + snap->atomIData.functional); AtomCommRealJ->gather(snap->atomData.functional, - snap->atomJData.functional); + snap->atomJData.functional); } if (snap->atomData.getStorageLayout() & DataStorage::dslFunctionalDerivative) { AtomCommRealI->gather(snap->atomData.functionalDerivative, - snap->atomIData.functionalDerivative); + snap->atomIData.functionalDerivative); AtomCommRealJ->gather(snap->atomData.functionalDerivative, - snap->atomJData.functionalDerivative); + snap->atomJData.functionalDerivative); } #endif } @@ -140,6 +183,49 @@ namespace OpenMD { void ForceDecomposition::collectData() { #ifdef IS_MPI + Snapshot* snap = sman_->getCurrentSnapshot(); + + int n = snap->atomData.force.size(); + vector frc_tmp(n, V3Zero); + + AtomCommVectorI->scatter(snap->atomIData.force, frc_tmp); + for (int i = 0; i < n; i++) { + snap->atomData.force[i] += frc_tmp[i]; + frc_tmp[i] = 0.0; + } + + AtomCommVectorJ->scatter(snap->atomJData.force, frc_tmp); + for (int i = 0; i < n; i++) + snap->atomData.force[i] += frc_tmp[i]; + + + if (snap->atomData.getStorageLayout() & DataStorage::dslTorque) { + + int nt = snap->atomData.force.size(); + vector trq_tmp(nt, V3Zero); + + AtomCommVectorI->scatter(snap->atomIData.torque, trq_tmp); + for (int i = 0; i < n; i++) { + snap->atomData.torque[i] += trq_tmp[i]; + trq_tmp[i] = 0.0; + } + + AtomCommVectorJ->scatter(snap->atomJData.torque, trq_tmp); + for (int i = 0; i < n; i++) + snap->atomData.torque[i] += trq_tmp[i]; + } + + int nLocal = snap->getNumberOfAtoms(); + + vector > pot_temp(N_INTERACTION_FAMILIES, + vector (nLocal, 0.0)); + + for (int i = 0; i < N_INTERACTION_FAMILIES; i++) { + AtomCommRealI->scatter(pot_row[i], pot_temp[i]); + for (int ii = 0; ii < pot_temp[i].size(); ii++ ) { + pot_local[i] += pot_temp[i][ii]; + } + } #endif }