| 36 |  | * [1]  Meineke, et al., J. Comp. Chem. 26, 252-271 (2005). | 
| 37 |  | * [2]  Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006). | 
| 38 |  | * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008). | 
| 39 | < | * [4]  Vardeman & Gezelter, in progress (2009). | 
| 39 | > | * [4]  Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010). | 
| 40 | > | * [5]  Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011). | 
| 41 |  | */ | 
| 42 |  |  | 
| 43 |  | /** | 
| 59 |  | #include "utils/simError.h" | 
| 60 |  | #include "selection/SelectionManager.hpp" | 
| 61 |  | #include "io/ForceFieldOptions.hpp" | 
| 62 | < | #include "UseTheForce/ForceField.hpp" | 
| 62 | > | #include "brains/ForceField.hpp" | 
| 63 |  | #include "nonbonded/SwitchingFunction.hpp" | 
| 64 | + | #ifdef IS_MPI | 
| 65 | + | #include <mpi.h> | 
| 66 | + | #endif | 
| 67 |  |  | 
| 68 |  | using namespace std; | 
| 69 |  | namespace OpenMD { | 
| 72 |  | forceField_(ff), simParams_(simParams), | 
| 73 |  | ndf_(0), fdf_local(0), ndfRaw_(0), ndfTrans_(0), nZconstraint_(0), | 
| 74 |  | nGlobalMols_(0), nGlobalAtoms_(0), nGlobalCutoffGroups_(0), | 
| 75 | < | nGlobalIntegrableObjects_(0), nGlobalRigidBodies_(0), | 
| 75 | > | nGlobalIntegrableObjects_(0), nGlobalRigidBodies_(0), nGlobalFluctuatingCharges_(0), | 
| 76 |  | nAtoms_(0), nBonds_(0),  nBends_(0), nTorsions_(0), nInversions_(0), | 
| 77 |  | nRigidBodies_(0), nIntegrableObjects_(0), nCutoffGroups_(0), | 
| 78 | < | nConstraints_(0), sman_(NULL), topologyDone_(false), | 
| 78 | > | nConstraints_(0), nFluctuatingCharges_(0), sman_(NULL), topologyDone_(false), | 
| 79 |  | calcBoxDipole_(false), useAtomicVirial_(true) { | 
| 80 |  |  | 
| 81 |  | MoleculeStamp* molStamp; | 
| 225 |  |  | 
| 226 |  |  | 
| 227 |  | void SimInfo::calcNdf() { | 
| 228 | < | int ndf_local; | 
| 228 | > | int ndf_local, nfq_local; | 
| 229 |  | MoleculeIterator i; | 
| 230 |  | vector<StuntDouble*>::iterator j; | 
| 231 | + | vector<Atom*>::iterator k; | 
| 232 | + |  | 
| 233 |  | Molecule* mol; | 
| 234 |  | StuntDouble* integrableObject; | 
| 235 | + | Atom* atom; | 
| 236 |  |  | 
| 237 |  | ndf_local = 0; | 
| 238 | + | nfq_local = 0; | 
| 239 |  |  | 
| 240 |  | for (mol = beginMolecule(i); mol != NULL; mol = nextMolecule(i)) { | 
| 241 |  | for (integrableObject = mol->beginIntegrableObject(j); integrableObject != NULL; | 
| 250 |  | ndf_local += 3; | 
| 251 |  | } | 
| 252 |  | } | 
| 245 | – |  | 
| 253 |  | } | 
| 254 | + | for (atom = mol->beginFluctuatingCharge(k); atom != NULL; | 
| 255 | + | atom = mol->nextFluctuatingCharge(k)) { | 
| 256 | + | if (atom->isFluctuatingCharge()) { | 
| 257 | + | nfq_local++; | 
| 258 | + | } | 
| 259 | + | } | 
| 260 |  | } | 
| 261 |  |  | 
| 262 | + | ndfLocal_ = ndf_local; | 
| 263 | + |  | 
| 264 |  | // n_constraints is local, so subtract them on each processor | 
| 265 |  | ndf_local -= nConstraints_; | 
| 266 |  |  | 
| 267 |  | #ifdef IS_MPI | 
| 268 |  | MPI_Allreduce(&ndf_local,&ndf_,1,MPI_INT,MPI_SUM, MPI_COMM_WORLD); | 
| 269 | + | MPI_Allreduce(&nfq_local,&nGlobalFluctuatingCharges_,1, MPI_INT, MPI_SUM, MPI_COMM_WORLD); | 
| 270 |  | #else | 
| 271 |  | ndf_ = ndf_local; | 
| 272 | + | nGlobalFluctuatingCharges_ = nfq_local; | 
| 273 |  | #endif | 
| 274 |  |  | 
| 275 |  | // nZconstraints_ is global, as are the 3 COM translations for the | 
| 793 |  | int usesElectrostatic = 0; | 
| 794 |  | int usesMetallic = 0; | 
| 795 |  | int usesDirectional = 0; | 
| 796 | + | int usesFluctuatingCharges =  0; | 
| 797 |  | //loop over all of the atom types | 
| 798 |  | for (i = atomTypes.begin(); i != atomTypes.end(); ++i) { | 
| 799 |  | usesElectrostatic |= (*i)->isElectrostatic(); | 
| 800 |  | usesMetallic |= (*i)->isMetal(); | 
| 801 |  | usesDirectional |= (*i)->isDirectional(); | 
| 802 | + | usesFluctuatingCharges |= (*i)->isFluctuatingCharge(); | 
| 803 |  | } | 
| 804 |  |  | 
| 805 |  | #ifdef IS_MPI | 
| 812 |  |  | 
| 813 |  | temp = usesElectrostatic; | 
| 814 |  | MPI_Allreduce(&temp, &usesElectrostaticAtoms_, 1, MPI_INT, MPI_LOR, MPI_COMM_WORLD); | 
| 815 | + |  | 
| 816 | + | temp = usesFluctuatingCharges; | 
| 817 | + | MPI_Allreduce(&temp, &usesFluctuatingCharges_, 1, MPI_INT, MPI_LOR, MPI_COMM_WORLD); | 
| 818 |  | #else | 
| 819 |  |  | 
| 820 |  | usesDirectionalAtoms_ = usesDirectional; | 
| 821 |  | usesMetallicAtoms_ = usesMetallic; | 
| 822 |  | usesElectrostaticAtoms_ = usesElectrostatic; | 
| 823 | + | usesFluctuatingCharges_ = usesFluctuatingCharges; | 
| 824 |  |  | 
| 825 |  | #endif | 
| 826 |  |  | 
| 1213 |  |  | 
| 1214 |  | det = intTensor.determinant(); | 
| 1215 |  | sysconstants = geomCnst/(RealType)nGlobalIntegrableObjects_; | 
| 1216 | < | volume = 4.0/3.0*NumericConstant::PI*pow(sysconstants,3.0/2.0)*sqrt(det); | 
| 1216 | > | volume = 4.0/3.0*NumericConstant::PI*pow(sysconstants,geomCnst)*sqrt(det); | 
| 1217 |  | return; | 
| 1218 |  | } | 
| 1219 |  |  | 
| 1229 |  |  | 
| 1230 |  | detI = intTensor.determinant(); | 
| 1231 |  | sysconstants = geomCnst/(RealType)nGlobalIntegrableObjects_; | 
| 1232 | < | volume = 4.0/3.0*NumericConstant::PI*pow(sysconstants,3.0/2.0)*sqrt(detI); | 
| 1232 | > | volume = 4.0/3.0*NumericConstant::PI*pow(sysconstants,geomCnst)*sqrt(detI); | 
| 1233 |  | return; | 
| 1234 |  | } | 
| 1235 |  | /* |