# | Line 92 | Line 92 | namespace oopse { | |
---|---|---|
92 | nGlobalIntegrableObjects_(0), nGlobalRigidBodies_(0), | |
93 | nAtoms_(0), nBonds_(0), nBends_(0), nTorsions_(0), nRigidBodies_(0), | |
94 | nIntegrableObjects_(0), nCutoffGroups_(0), nConstraints_(0), | |
95 | < | sman_(NULL), fortranInitialized_(false), calcBoxDipole_(false) { |
95 | > | sman_(NULL), fortranInitialized_(false), calcBoxDipole_(false), |
96 | > | useAtomicVirial_(true) { |
97 | ||
98 | MoleculeStamp* molStamp; | |
99 | int nMolWithSameStamp; | |
# | Line 666 | Line 667 | namespace oopse { | |
667 | int useSF; | |
668 | int useSP; | |
669 | int useBoxDipole; | |
670 | + | |
671 | std::string myMethod; | |
672 | ||
673 | // set the useRF logical | |
# | Line 689 | Line 691 | namespace oopse { | |
691 | if (simParams_->haveAccumulateBoxDipole()) | |
692 | if (simParams_->getAccumulateBoxDipole()) | |
693 | useBoxDipole = 1; | |
694 | + | |
695 | + | useAtomicVirial_ = simParams_->getUseAtomicVirial(); |
696 | ||
697 | //loop over all of the atom types | |
698 | for (i = atomTypes.begin(); i != atomTypes.end(); ++i) { | |
# | Line 767 | Line 771 | namespace oopse { | |
771 | temp = useBoxDipole; | |
772 | MPI_Allreduce(&temp, &useBoxDipole, 1, MPI_INT, MPI_LOR, MPI_COMM_WORLD); | |
773 | ||
774 | + | temp = useAtomicVirial_; |
775 | + | MPI_Allreduce(&temp, &useAtomicVirial_, 1, MPI_INT, MPI_LOR, MPI_COMM_WORLD); |
776 | + | |
777 | #endif | |
778 | ||
779 | fInfo_.SIM_uses_PBC = usePBC; | |
# | Line 786 | Line 793 | namespace oopse { | |
793 | fInfo_.SIM_uses_SF = useSF; | |
794 | fInfo_.SIM_uses_SP = useSP; | |
795 | fInfo_.SIM_uses_BoxDipole = useBoxDipole; | |
796 | + | fInfo_.SIM_uses_AtomicVirial = useAtomicVirial_; |
797 | } | |
798 | ||
799 | void SimInfo::setupFortranSim() { | |
# | Line 873 | Line 881 | namespace oopse { | |
881 | ||
882 | // Setup number of neighbors in neighbor list if present | |
883 | if (simParams_->haveNeighborListNeighbors()) { | |
884 | < | setNeighbors(simParams_->getNeighborListNeighbors()); |
884 | > | int nlistNeighbors = simParams_->getNeighborListNeighbors(); |
885 | > | setNeighbors(&nlistNeighbors); |
886 | } | |
887 | ||
888 | ||
# | Line 946 | Line 955 | namespace oopse { | |
955 | // Check the cutoff policy | |
956 | int cp = TRADITIONAL_CUTOFF_POLICY; // Set to traditional by default | |
957 | ||
958 | + | // Set LJ shifting bools to false |
959 | + | ljsp_ = false; |
960 | + | ljsf_ = false; |
961 | + | |
962 | std::string myPolicy; | |
963 | if (forceFieldOptions_.haveCutoffPolicy()){ | |
964 | myPolicy = forceFieldOptions_.getCutoffPolicy(); | |
# | Line 1009 | Line 1022 | namespace oopse { | |
1022 | simError(); | |
1023 | } | |
1024 | } | |
1025 | < | |
1026 | < | notifyFortranCutoffs(&rcut_, &rsw_); |
1025 | > | |
1026 | > | if (simParams_->haveElectrostaticSummationMethod()) { |
1027 | > | std::string myMethod = simParams_->getElectrostaticSummationMethod(); |
1028 | > | toUpper(myMethod); |
1029 | > | |
1030 | > | if (myMethod == "SHIFTED_POTENTIAL") { |
1031 | > | ljsp_ = true; |
1032 | > | } else if (myMethod == "SHIFTED_FORCE") { |
1033 | > | ljsf_ = true; |
1034 | > | } |
1035 | > | } |
1036 | > | notifyFortranCutoffs(&rcut_, &rsw_, &ljsp_, &ljsf_); |
1037 | ||
1038 | } else { | |
1039 | ||
# | Line 1027 | Line 1050 | namespace oopse { | |
1050 | if (simParams_->haveElectrostaticSummationMethod()) { | |
1051 | std::string myMethod = simParams_->getElectrostaticSummationMethod(); | |
1052 | toUpper(myMethod); | |
1053 | < | if (myMethod == "SHIFTED_POTENTIAL" || myMethod == "SHIFTED_FORCE") { |
1053 | > | |
1054 | > | // For the time being, we're tethering the LJ shifted behavior to the |
1055 | > | // electrostaticSummationMethod keyword options |
1056 | > | if (myMethod == "SHIFTED_POTENTIAL") { |
1057 | > | ljsp_ = true; |
1058 | > | } else if (myMethod == "SHIFTED_FORCE") { |
1059 | > | ljsf_ = true; |
1060 | > | } |
1061 | > | if (myMethod == "SHIFTED_POTENTIAL" || myMethod == "SHIFTED_FORCE") { |
1062 | if (simParams_->haveSwitchingRadius()){ | |
1063 | sprintf(painCave.errMsg, | |
1064 | "SimInfo Warning: A value was set for the switchingRadius\n" | |
# | Line 1050 | Line 1081 | namespace oopse { | |
1081 | simError(); | |
1082 | rsw_ = 0.85 * rcut_; | |
1083 | } | |
1084 | < | notifyFortranCutoffs(&rcut_, &rsw_); |
1084 | > | |
1085 | > | notifyFortranCutoffs(&rcut_, &rsw_, &ljsp_, &ljsf_); |
1086 | > | |
1087 | } else { | |
1088 | // We didn't set rcut explicitly, and we don't have electrostatic atoms, so | |
1089 | // We'll punt and let fortran figure out the cutoffs later. | |
# | Line 1454 | Line 1487 | namespace oopse { | |
1487 | void SimInfo::setIOIndexToIntegrableObject(const std::vector<StuntDouble*>& v) { | |
1488 | IOIndexToIntegrableObject= v; | |
1489 | } | |
1490 | + | |
1491 | + | /* Returns the Volume of the simulation based on a ellipsoid with semi-axes |
1492 | + | based on the radius of gyration V=4/3*Pi*R_1*R_2*R_3 |
1493 | + | where R_i are related to the principle inertia moments R_i = sqrt(C*I_i/N), this reduces to |
1494 | + | V = 4/3*Pi*(C/N)^3/2*sqrt(det(I)). See S.E. Baltazar et. al. Comp. Mat. Sci. 37 (2006) 526-536. |
1495 | + | */ |
1496 | + | void SimInfo::getGyrationalVolume(RealType &volume){ |
1497 | + | Mat3x3d intTensor; |
1498 | + | RealType det; |
1499 | + | Vector3d dummyAngMom; |
1500 | + | RealType sysconstants; |
1501 | + | RealType geomCnst; |
1502 | ||
1503 | + | geomCnst = 3.0/2.0; |
1504 | + | /* Get the inertial tensor and angular momentum for free*/ |
1505 | + | getInertiaTensor(intTensor,dummyAngMom); |
1506 | + | |
1507 | + | det = intTensor.determinant(); |
1508 | + | sysconstants = geomCnst/(RealType)nGlobalIntegrableObjects_; |
1509 | + | volume = 4.0/3.0*NumericConstant::PI*pow(sysconstants,3.0/2.0)*sqrt(det); |
1510 | + | return; |
1511 | + | } |
1512 | + | |
1513 | + | void SimInfo::getGyrationalVolume(RealType &volume, RealType &detI){ |
1514 | + | Mat3x3d intTensor; |
1515 | + | Vector3d dummyAngMom; |
1516 | + | RealType sysconstants; |
1517 | + | RealType geomCnst; |
1518 | + | |
1519 | + | geomCnst = 3.0/2.0; |
1520 | + | /* Get the inertial tensor and angular momentum for free*/ |
1521 | + | getInertiaTensor(intTensor,dummyAngMom); |
1522 | + | |
1523 | + | detI = intTensor.determinant(); |
1524 | + | sysconstants = geomCnst/(RealType)nGlobalIntegrableObjects_; |
1525 | + | volume = 4.0/3.0*NumericConstant::PI*pow(sysconstants,3.0/2.0)*sqrt(detI); |
1526 | + | return; |
1527 | + | } |
1528 | /* | |
1529 | void SimInfo::setStuntDoubleFromGlobalIndex(std::vector<StuntDouble*> v) { | |
1530 | assert( v.size() == nAtoms_ + nRigidBodies_); |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |