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 1390 by gezelter, Wed Nov 25 20:02:06 2009 UTC vs.
Revision 1973 by gezelter, Thu Mar 6 19:34:22 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 89 | Line 92 | namespace OpenMD {
92      int nRestraintStamps = simParam->getNRestraintStamps();
93      std::vector<RestraintStamp*> stamp = simParam->getRestraintStamps();
94  
95 +    std::vector<int> stuntDoubleIndex;
96 +
97      for (int i = 0; i < nRestraintStamps; i++){
98  
99        std::string myType = toUpperCopy(stamp[i]->getType());
# Line 96 | Line 101 | namespace OpenMD {
101        if (myType.compare("MOLECULAR")==0){
102  
103          int molIndex;
99        std::vector<Vector3d> ref;
104          Vector3d refCom;
105  
106          if (!stamp[i]->haveMolIndex()) {
# Line 132 | 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.
145   #endif
146  
# Line 149 | Line 156 | namespace OpenMD {
156   #endif
157          }
158          
159 +
160 + #ifdef IS_MPI
161 +        // only handle this molecular restraint if this processor owns the
162 +        // molecule
163 +        int myrank;
164 +        MPI_Comm_rank( MPI_COMM_WORLD, &myrank);
165 +        if (info_->getMolToProc(molIndex) == myrank) {
166 +
167 + #endif
168 +
169          MolecularRestraint* rest = new MolecularRestraint();
170  
171          std::string restPre("mol_");
# Line 184 | Line 201 | namespace OpenMD {
201          restraints_.push_back(rest);
202          mol->addProperty(new RestraintData("Restraint", rest));
203          restrainedMols_.push_back(mol);
204 <        
204 > #ifdef IS_MPI
205 >        }
206 > #endif        
207        } else if (myType.compare("OBJECT") == 0) {
208          
209          std::string objectSelection;
# Line 212 | Line 231 | namespace OpenMD {
231                  "\t\t%s\n"
232                  "\twill result in %d integrable objects being\n"
233                  "\trestrained.\n", objectSelection.c_str(), selectionCount);
234 +        painCave.severity = OPENMD_INFO;
235          painCave.isFatal = 0;
236          simError();                    
237  
# Line 220 | Line 240 | namespace OpenMD {
240  
241          for (sd = seleMan.beginSelected(selei); sd != NULL;
242               sd = seleMan.nextSelected(selei)) {
243 <          
243 >          stuntDoubleIndex.push_back(sd->getGlobalIntegrableObjectIndex());
244 >
245            ObjectRestraint* rest = new ObjectRestraint();
246            
247            if (stamp[i]->haveDisplacementSpringConstant()) {
# Line 260 | Line 281 | namespace OpenMD {
281      // are times when it won't use restraints at all, so only open the
282      // restraint file if we are actually using restraints:
283  
284 <    if (simParam->getUseRestraints()) {
284 >    if (simParam->getUseRestraints()) {
285        std::string refFile = simParam->getRestraint_file();
286 <      RestReader* rr = new RestReader(info, refFile);
266 <
286 >      RestReader* rr = new RestReader(info, refFile, stuntDoubleIndex);
287        rr->readReferenceStructure();
288      }
289  
290      restOutput_ = getPrefix(info_->getFinalConfigFileName()) + ".rest";
291      restOut = new RestWriter(info_, restOutput_.c_str(), restraints_);
272    
292      if(!restOut){
293        sprintf(painCave.errMsg, "Restraint error: Failed to create RestWriter\n");
294        painCave.isFatal = 1;
# Line 292 | Line 311 | namespace OpenMD {
311      currRestTime_ = currSnapshot_->getTime();
312    }
313  
314 <  void RestraintForceManager::calcForces(bool needPotential, bool needStress){
314 >  void RestraintForceManager::calcForces(){
315  
316 <    ForceManager::calcForces(needPotential, needStress);    
316 >    ForceManager::calcForces();    
317      RealType restPot_local, restPot;
318  
319      restPot_local = doRestraints(1.0);
320  
321   #ifdef IS_MPI    
322 <    MPI::COMM_WORLD.Allreduce(&restPot_local, &restPot, 1,
323 <                              MPI::REALTYPE, MPI::SUM);
322 >    MPI_Allreduce(&restPot_local, &restPot, 1,
323 >                  MPI_REALTYPE, MPI_SUM, MPI_COMM_WORLD);
324   #else
325      restPot = restPot_local;
326   #endif
327      currSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
328 <    currSnapshot_->statData[Stats::LONG_RANGE_POTENTIAL] += restPot;
329 <    currSnapshot_->statData[Stats::VHARM] = restPot;
328 >    RealType pot = currSnapshot_->getLongRangePotential();
329 >    pot += restPot;
330 >    currSnapshot_->setLongRangePotential(pot);
331 >    currSnapshot_->setRestraintPotential(restPot);
332  
333      //write out forces and current positions of restrained molecules    
334      if (currSnapshot_->getTime() >= currRestTime_){
# Line 322 | Line 343 | namespace OpenMD {
343      Molecule::IntegrableObjectIterator ioi;
344      MolecularRestraint* mRest;
345      StuntDouble* sd;
325    RealType pTot;
346  
347      std::vector<StuntDouble*>::const_iterator ro;
348      ObjectRestraint* oRest;
# Line 372 | Line 392 | namespace OpenMD {
392  
393        std::vector<Vector3d> struc;
394        std::vector<Vector3d> forces;
395 +
396        
397        for(sd = (*rm)->beginIntegrableObject(ioi); sd != NULL;
398 <          sd = (*rm)->nextIntegrableObject(ioi)) {        
398 >          sd = (*rm)->nextIntegrableObject(ioi)) {
399          struc.push_back(sd->getPos());
400        }
401  
# Line 432 | Line 453 | namespace OpenMD {
453        
454        // phew.  At this point, we should have the pointer to the
455        // correct Object restraint in the variable oRest.
435
456        oRest->setScaleFactor(scalingFactor);
457        
458        Vector3d pos = (*ro)->getPos();

Comparing trunk/src/restraints/RestraintForceManager.cpp (property svn:keywords):
Revision 1390 by gezelter, Wed Nov 25 20:02:06 2009 UTC vs.
Revision 1973 by gezelter, Thu Mar 6 19:34:22 2014 UTC

# Line 0 | Line 1
1 + Author Id Revision Date

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines