ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/restraints/RestraintForceManager.cpp
(Generate patch)

Comparing trunk/src/restraints/RestraintForceManager.cpp (file contents):
Revision 1442 by gezelter, Mon May 10 17:28:26 2010 UTC vs.
Revision 2020 by gezelter, Mon Sep 22 19:18:35 2014 UTC

# Line 35 | Line 35
35   *                                                                      
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).                        
38 > * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).          
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 + #ifdef IS_MPI
44 + #include <mpi.h>
45 + #endif
46 +
47 + #include "config.h"
48   #include <cmath>
49 +
50   #include "restraints/RestraintForceManager.hpp"
51   #include "restraints/MolecularRestraint.hpp"
52   #include "restraints/ObjectRestraint.hpp"
# Line 49 | Line 56
56   #include "utils/StringUtils.hpp"
57   #include "selection/SelectionEvaluator.hpp"
58   #include "selection/SelectionManager.hpp"
52 #ifdef IS_MPI
53 #include <mpi.h>
54 #endif
59  
56
60   namespace OpenMD {
61  
62    RestraintForceManager::RestraintForceManager(SimInfo* info): ForceManager(info) {
# Line 98 | Line 101 | namespace OpenMD {
101        if (myType.compare("MOLECULAR")==0){
102  
103          int molIndex;
101        std::vector<Vector3d> ref;
104          Vector3d refCom;
105  
106          if (!stamp[i]->haveMolIndex()) {
# Line 134 | Line 136 | namespace OpenMD {
136            // this proc doesn't have the molecule.  Do a quick check to
137            // make sure another processor is supposed to have it.
138          
139 <          int myrank = MPI::COMM_WORLD.Get_rank();
139 >          int myrank;
140 >          MPI_Comm_rank( MPI_COMM_WORLD, &myrank);
141 >
142            if (info_->getMolToProc(molIndex) == myrank) {
143          
144              // If we were supposed to have it but got a null, then freak out.
# Line 156 | Line 160 | namespace OpenMD {
160   #ifdef IS_MPI
161          // only handle this molecular restraint if this processor owns the
162          // molecule
163 <        int myrank = MPI::COMM_WORLD.Get_rank();
163 >        int myrank;
164 >        MPI_Comm_rank( MPI_COMM_WORLD, &myrank);
165          if (info_->getMolToProc(molIndex) == myrank) {
166  
167   #endif
# Line 220 | Line 225 | namespace OpenMD {
225          evaluator.loadScriptString(objectSelection);
226          seleMan.setSelectionSet(evaluator.evaluate());        
227          int selectionCount = seleMan.getSelectionCount();
228 <        
228 >
229 > #ifdef IS_MPI    
230 >        MPI_Allreduce(MPI_IN_PLACE, &selectionCount, 1, MPI_INT, MPI_SUM,
231 >                      MPI_COMM_WORLD);
232 > #endif
233 >                
234          sprintf(painCave.errMsg,
235                  "Restraint Info: The specified restraint objectSelection,\n"
236                  "\t\t%s\n"
237                  "\twill result in %d integrable objects being\n"
238                  "\trestrained.\n", objectSelection.c_str(), selectionCount);
239 +        painCave.severity = OPENMD_INFO;
240          painCave.isFatal = 0;
241          simError();                    
242  
# Line 305 | Line 316 | namespace OpenMD {
316      currRestTime_ = currSnapshot_->getTime();
317    }
318  
319 <  void RestraintForceManager::calcForces(bool needPotential, bool needStress){
319 >  void RestraintForceManager::calcForces(){
320  
321 <    ForceManager::calcForces(needPotential, needStress);    
322 <    RealType restPot_local, restPot;
321 >    ForceManager::calcForces();    
322 >    RealType restPot(0.0);
323  
324 <    restPot_local = doRestraints(1.0);
324 >    restPot = doRestraints(1.0);
325  
326   #ifdef IS_MPI    
327 <    MPI::COMM_WORLD.Allreduce(&restPot_local, &restPot, 1,
328 <                              MPI::REALTYPE, MPI::SUM);
318 < #else
319 <    restPot = restPot_local;
327 >    MPI_Allreduce(MPI_IN_PLACE, &restPot, 1, MPI_REALTYPE, MPI_SUM,
328 >                  MPI_COMM_WORLD);
329   #endif
330 +
331      currSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
332 <    currSnapshot_->statData[Stats::LONG_RANGE_POTENTIAL] += restPot;
333 <    currSnapshot_->statData[Stats::VHARM] = restPot;
332 >    RealType pot = currSnapshot_->getLongRangePotential();
333 >    pot += restPot;
334 >    currSnapshot_->setLongRangePotential(pot);
335 >    currSnapshot_->setRestraintPotential(restPot);
336  
337      //write out forces and current positions of restrained molecules    
338      if (currSnapshot_->getTime() >= currRestTime_){
# Line 335 | Line 347 | namespace OpenMD {
347      Molecule::IntegrableObjectIterator ioi;
348      MolecularRestraint* mRest;
349      StuntDouble* sd;
338    RealType pTot;
350  
351      std::vector<StuntDouble*>::const_iterator ro;
352      ObjectRestraint* oRest;
# Line 385 | Line 396 | namespace OpenMD {
396  
397        std::vector<Vector3d> struc;
398        std::vector<Vector3d> forces;
399 +
400        
401        for(sd = (*rm)->beginIntegrableObject(ioi); sd != NULL;
402            sd = (*rm)->nextIntegrableObject(ioi)) {
# Line 403 | Line 415 | namespace OpenMD {
415          index++;
416        }
417        
418 <      unscaledPotential_ += mRest->getUnscaledPotential();
418 >      unscaledPotential_ += mRest->getUnscaledPotential();      
419  
408      restInfo = mRest->getRestraintInfo();
409
420        // only collect data on restraints that we're going to print:
421        if (mRest->getPrintRestraint())
422 +        restInfo = mRest->getRestraintInfo();
423          restInfo_.push_back(restInfo);
424      }
425  
# Line 445 | Line 456 | namespace OpenMD {
456        
457        // phew.  At this point, we should have the pointer to the
458        // correct Object restraint in the variable oRest.
448
459        oRest->setScaleFactor(scalingFactor);
460        
461        Vector3d pos = (*ro)->getPos();
# Line 469 | Line 479 | namespace OpenMD {
479  
480        unscaledPotential_ += oRest->getUnscaledPotential();
481  
472      restInfo = oRest->getRestraintInfo();
473
482        // only collect data on restraints that we're going to print:
483        if (oRest->getPrintRestraint())
484 +        restInfo = oRest->getRestraintInfo();      
485          restInfo_.push_back(restInfo);
486      }
487  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines