--- branches/development/src/parallel/ForceDecomposition.cpp 2011/01/17 21:34:36 1540 +++ branches/development/src/parallel/ForceDecomposition.cpp 2011/02/04 20:04:56 1541 @@ -42,14 +42,15 @@ #include "parallel/Communicator.hpp" #include "math/SquareMatrix3.hpp" +using namespace std; namespace OpenMD { void ForceDecomposition::distributeInitialData() { #ifdef IS_MPI + Snapshot* snap = sman_->getCurrentSnapshot(); + int nAtoms = snap->getNumberOfAtoms(); + int nGroups = snap->getNumberOfCutoffGroups(); - int nAtoms; - int nGroups; - AtomCommRealI = new Communicator(nAtoms); AtomCommVectorI = new Communicator(nAtoms); AtomCommMatrixI = new Communicator(nAtoms); @@ -60,7 +61,18 @@ namespace OpenMD { cgCommVectorI = new Communicator(nGroups); cgCommVectorJ = new Communicator(nGroups); - // more to come + + int nInRow = AtomCommRealI.getSize(); + int nInCol = AtomCommRealJ.getSize(); + + vector > pot_row(LR_POT_TYPES, + vector (nInRow, 0.0)); + vector > pot_col(LR_POT_TYPES, + vector (nInCol, 0.0)); + + vector > pot_local(LR_POT_TYPES, + vector (nAtoms, 0.0)); + #endif } @@ -105,11 +117,12 @@ namespace OpenMD { Snapshot* snap = sman_->getCurrentSnapshot(); 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 ); + + 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]; @@ -140,14 +153,15 @@ namespace OpenMD { void ForceDecomposition::collectData() { #ifdef IS_MPI Snapshot* snap = sman_->getCurrentSnapshot(); - int n = snap->getNumberOfAtoms(); - - std::vector frc_tmp; - frc_tmp.reserve( n ); + int n = snap->atomData.force.size(); + std::vector frc_tmp(n, 0.0); + AtomCommVectorI->scatter(snap->atomIData.force, frc_tmp); - for (int i = 0; i < n; i++) + 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++) @@ -155,20 +169,32 @@ namespace OpenMD { if (snap->atomData.getStorageLayout() & DataStorage::dslTorque) { - std::vector trq_tmp; - trq_tmp.reserve( n ); - + + int nt = snap->atomData.force.size(); + std::vector trq_tmp(nt, 0.0); + AtomCommVectorI->scatter(snap->atomIData.torque, trq_tmp); - for (int i = 0; i < n; i++) + 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]; } - // Still need pot! + vector > pot_temp(LR_POT_TYPES, + vector (nAtoms, 0.0)); + + for (int i = 0; i < LR_POT_TYPES; 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