| 62 | 
  | 
   | 
| 63 | 
  | 
  ForceManager::ForceManager(SimInfo * info) : info_(info),  | 
| 64 | 
  | 
                                               NBforcesInitialized_(false) { | 
| 65 | 
– | 
    lj_ = LJ::Instance(); | 
| 66 | 
– | 
    lj_->setForceField(info_->getForceField()); | 
| 67 | 
– | 
 | 
| 68 | 
– | 
    gb_ = GB::Instance(); | 
| 69 | 
– | 
    gb_->setForceField(info_->getForceField()); | 
| 70 | 
– | 
 | 
| 71 | 
– | 
    sticky_ = Sticky::Instance(); | 
| 72 | 
– | 
    sticky_->setForceField(info_->getForceField()); | 
| 73 | 
– | 
 | 
| 74 | 
– | 
    eam_ = EAM::Instance(); | 
| 75 | 
– | 
    eam_->setForceField(info_->getForceField()); | 
| 76 | 
– | 
 | 
| 77 | 
– | 
    sc_ = SC::Instance(); | 
| 78 | 
– | 
    sc_->setForceField(info_->getForceField()); | 
| 65 | 
  | 
  } | 
| 66 | 
  | 
  | 
| 67 | 
  | 
  void ForceManager::calcForces() { | 
| 68 | 
  | 
     | 
| 69 | 
+ | 
 | 
| 70 | 
  | 
    if (!info_->isFortranInitialized()) { | 
| 71 | 
  | 
      info_->update(); | 
| 72 | 
+ | 
      nbiMan_->setSimInfo(info_); | 
| 73 | 
+ | 
      nbiMan_->initialize();     | 
| 74 | 
+ | 
      info_->setupFortran(); | 
| 75 | 
  | 
    } | 
| 76 | 
  | 
     | 
| 77 | 
  | 
    preCalculation(); | 
| 91 | 
  | 
    Atom* atom; | 
| 92 | 
  | 
    Molecule::RigidBodyIterator rbIter; | 
| 93 | 
  | 
    RigidBody* rb; | 
| 94 | 
+ | 
    Molecule::CutoffGroupIterator ci; | 
| 95 | 
+ | 
    CutoffGroup* cg; | 
| 96 | 
  | 
     | 
| 97 | 
  | 
    // forces are zeroed here, before any are accumulated. | 
| 98 | 
  | 
    // NOTE: do not rezero the forces in Fortran. | 
| 108 | 
  | 
           rb = mol->nextRigidBody(rbIter)) { | 
| 109 | 
  | 
        rb->zeroForcesAndTorques(); | 
| 110 | 
  | 
      }         | 
| 111 | 
< | 
           | 
| 111 | 
> | 
 | 
| 112 | 
> | 
      if(info_->getNGlobalCutoffGroups() != info_->getNGlobalAtoms()){ | 
| 113 | 
> | 
        std::cerr << "should not see me \n"; | 
| 114 | 
> | 
        for(cg = mol->beginCutoffGroup(ci); cg != NULL;  | 
| 115 | 
> | 
            cg = mol->nextCutoffGroup(ci)) { | 
| 116 | 
> | 
          //calculate the center of mass of cutoff group | 
| 117 | 
> | 
          cg->updateCOM(); | 
| 118 | 
> | 
        } | 
| 119 | 
> | 
      }       | 
| 120 | 
  | 
    } | 
| 121 | 
< | 
     | 
| 121 | 
> | 
    | 
| 122 | 
  | 
    // Zero out the stress tensor | 
| 123 | 
  | 
    tau *= 0.0; | 
| 124 | 
  | 
     | 
| 245 | 
  | 
  void ForceManager::calcLongRangeInteraction() { | 
| 246 | 
  | 
    Snapshot* curSnapshot; | 
| 247 | 
  | 
    DataStorage* config; | 
| 248 | 
+ | 
    DataStorage* cgConfig; | 
| 249 | 
  | 
    RealType* frc; | 
| 250 | 
  | 
    RealType* pos; | 
| 251 | 
  | 
    RealType* trq; | 
| 259 | 
  | 
     | 
| 260 | 
  | 
    //get array pointers | 
| 261 | 
  | 
    config = &(curSnapshot->atomData); | 
| 262 | 
+ | 
    cgConfig = &(curSnapshot->cgData); | 
| 263 | 
  | 
    frc = config->getArrayPointer(DataStorage::dslForce); | 
| 264 | 
  | 
    pos = config->getArrayPointer(DataStorage::dslPosition); | 
| 265 | 
  | 
    trq = config->getArrayPointer(DataStorage::dslTorque); | 
| 267 | 
  | 
    electroFrame = config->getArrayPointer(DataStorage::dslElectroFrame); | 
| 268 | 
  | 
    particlePot = config->getArrayPointer(DataStorage::dslParticlePot); | 
| 269 | 
  | 
 | 
| 270 | 
< | 
    //calculate the center of mass of cutoff group | 
| 271 | 
< | 
    SimInfo::MoleculeIterator mi; | 
| 272 | 
< | 
    Molecule* mol; | 
| 271 | 
< | 
    Molecule::CutoffGroupIterator ci; | 
| 272 | 
< | 
    CutoffGroup* cg; | 
| 273 | 
< | 
    Vector3d com; | 
| 274 | 
< | 
    std::vector<Vector3d> rcGroup; | 
| 275 | 
< | 
     | 
| 276 | 
< | 
    if(info_->getNCutoffGroups() > 0){ | 
| 277 | 
< | 
       | 
| 278 | 
< | 
      for (mol = info_->beginMolecule(mi); mol != NULL;  | 
| 279 | 
< | 
           mol = info_->nextMolecule(mi)) { | 
| 280 | 
< | 
        for(cg = mol->beginCutoffGroup(ci); cg != NULL;  | 
| 281 | 
< | 
            cg = mol->nextCutoffGroup(ci)) { | 
| 282 | 
< | 
          cg->getCOM(com); | 
| 283 | 
< | 
          rcGroup.push_back(com); | 
| 284 | 
< | 
        } | 
| 285 | 
< | 
      }// end for (mol) | 
| 286 | 
< | 
        | 
| 287 | 
< | 
      rc = rcGroup[0].getArrayPointer(); | 
| 270 | 
> | 
    if(info_->getNGlobalCutoffGroups() != info_->getNGlobalAtoms()){ | 
| 271 | 
> | 
      std::cerr << "should not see me \n"; | 
| 272 | 
> | 
      rc = cgConfig->getArrayPointer(DataStorage::dslPosition); | 
| 273 | 
  | 
    } else { | 
| 274 | 
  | 
      // center of mass of the group is the same as position of the atom   | 
| 275 | 
  | 
      // if cutoff group does not exist | 
| 279 | 
  | 
    //initialize data before passing to fortran | 
| 280 | 
  | 
    RealType longRangePotential[LR_POT_TYPES]; | 
| 281 | 
  | 
    RealType lrPot = 0.0; | 
| 297 | 
– | 
    Vector3d totalDipole; | 
| 282 | 
  | 
    int isError = 0; | 
| 283 | 
  | 
 | 
| 284 | 
  | 
    for (int i=0; i<LR_POT_TYPES;i++){ | 
| 305 | 
  | 
    for (int i=0; i<LR_POT_TYPES;i++){ | 
| 306 | 
  | 
      lrPot += longRangePotential[i]; //Quick hack | 
| 307 | 
  | 
    } | 
| 308 | 
< | 
     | 
| 325 | 
< | 
    // grab the simulation box dipole moment if specified | 
| 326 | 
< | 
    if (info_->getCalcBoxDipole()){ | 
| 327 | 
< | 
      getAccumulatedBoxDipole(totalDipole.getArrayPointer()); | 
| 328 | 
< | 
       | 
| 329 | 
< | 
      curSnapshot->statData[Stats::BOX_DIPOLE_X] = totalDipole(0); | 
| 330 | 
< | 
      curSnapshot->statData[Stats::BOX_DIPOLE_Y] = totalDipole(1); | 
| 331 | 
< | 
      curSnapshot->statData[Stats::BOX_DIPOLE_Z] = totalDipole(2); | 
| 332 | 
< | 
    } | 
| 333 | 
< | 
     | 
| 308 | 
> | 
         | 
| 309 | 
  | 
    //store the tau and long range potential     | 
| 310 | 
  | 
    curSnapshot->statData[Stats::LONG_RANGE_POTENTIAL] = lrPot; | 
| 311 | 
  | 
    curSnapshot->statData[Stats::VANDERWAALS_POTENTIAL] = longRangePotential[VDW_POT]; |