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 1366 by gezelter, Fri Oct 16 20:42:29 2009 UTC vs.
Revision 2024 by gezelter, Thu Oct 16 19:13:51 2014 UTC

# Line 6 | Line 6
6   * redistribute this software in source and binary code form, provided
7   * that the following conditions are met:
8   *
9 < * 1. Acknowledgement of the program authors must be made in any
10 < *    publication of scientific results based in part on use of the
11 < *    program.  An acceptable form of acknowledgement is citation of
12 < *    the article in which the program was described (Matthew
13 < *    A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 < *    J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 < *    Parallel Simulation Engine for Molecular Dynamics,"
16 < *    J. Comput. Chem. 26, pp. 252-271 (2005))
17 < *
18 < * 2. Redistributions of source code must retain the above copyright
9 > * 1. Redistributions of source code must retain the above copyright
10   *    notice, this list of conditions and the following disclaimer.
11   *
12 < * 3. Redistributions in binary form must reproduce the above copyright
12 > * 2. Redistributions in binary form must reproduce the above copyright
13   *    notice, this list of conditions and the following disclaimer in the
14   *    documentation and/or other materials provided with the
15   *    distribution.
# Line 37 | Line 28
28   * arising out of the use of or inability to use software, even if the
29   * University of Notre Dame has been advised of the possibility of
30   * such damages.
31 + *
32 + * SUPPORT OPEN SCIENCE!  If you use OpenMD or its source code in your
33 + * research, please cite the appropriate papers when you publish your
34 + * work.  Good starting points are:
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, 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"
53   #include "io/RestReader.hpp"
54   #include "utils/simError.h"
55 < #include "utils/OOPSEConstant.hpp"
55 > #include "utils/PhysicalConstants.hpp"
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  
60 + namespace OpenMD {
61  
57 namespace oopse {
58
62    RestraintForceManager::RestraintForceManager(SimInfo* info): ForceManager(info) {
63  
64      // order of affairs:
# Line 89 | Line 92 | namespace oopse {
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 oopse {
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 oopse {
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 oopse {
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 oopse {
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 206 | Line 225 | namespace oopse {
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 220 | Line 245 | namespace oopse {
245  
246          for (sd = seleMan.beginSelected(selei); sd != NULL;
247               sd = seleMan.nextSelected(selei)) {
248 <          
248 >          stuntDoubleIndex.push_back(sd->getGlobalIntegrableObjectIndex());
249 >
250            ObjectRestraint* rest = new ObjectRestraint();
251            
252            if (stamp[i]->haveDisplacementSpringConstant()) {
# Line 260 | Line 286 | namespace oopse {
286      // are times when it won't use restraints at all, so only open the
287      // restraint file if we are actually using restraints:
288  
289 <    if (simParam->getUseRestraints()) {
289 >    if (simParam->getUseRestraints()) {
290        std::string refFile = simParam->getRestraint_file();
291 <      RestReader* rr = new RestReader(info, refFile);
266 <
291 >      RestReader* rr = new RestReader(info, refFile, stuntDoubleIndex);
292        rr->readReferenceStructure();
293      }
294  
295      restOutput_ = getPrefix(info_->getFinalConfigFileName()) + ".rest";
296      restOut = new RestWriter(info_, restOutput_.c_str(), restraints_);
272    
297      if(!restOut){
298        sprintf(painCave.errMsg, "Restraint error: Failed to create RestWriter\n");
299        painCave.isFatal = 1;
# Line 292 | Line 316 | namespace oopse {
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);
305 < #else
306 <    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;
310 <    currSnapshot_->statData[Stats::VHARM] = restPot;
332 >    currSnapshot_->setRestraintPotential(restPot);
333  
334      //write out forces and current positions of restrained molecules    
335      if (currSnapshot_->getTime() >= currRestTime_){
# Line 322 | Line 344 | namespace oopse {
344      Molecule::IntegrableObjectIterator ioi;
345      MolecularRestraint* mRest;
346      StuntDouble* sd;
325    RealType pTot;
347  
348      std::vector<StuntDouble*>::const_iterator ro;
349      ObjectRestraint* oRest;
# Line 347 | Line 368 | namespace oopse {
368            if (mRest == NULL) {
369              sprintf( painCave.errMsg,
370                       "Can not cast RestraintData to MolecularRestraint\n");
371 <            painCave.severity = OOPSE_ERROR;
371 >            painCave.severity = OPENMD_ERROR;
372              painCave.isFatal = 1;
373              simError();                      
374            }
375          } else {
376            sprintf( painCave.errMsg,
377                     "Can not cast GenericData to RestraintData\n");
378 <          painCave.severity = OOPSE_ERROR;
378 >          painCave.severity = OPENMD_ERROR;
379            painCave.isFatal = 1;
380            simError();      
381          }
382        } else {
383          sprintf( painCave.errMsg, "Can not find Restraint for RestrainedObject\n");
384 <        painCave.severity = OOPSE_ERROR;
384 >        painCave.severity = OPENMD_ERROR;
385          painCave.isFatal = 1;
386          simError();          
387        }
# Line 372 | Line 393 | namespace oopse {
393  
394        std::vector<Vector3d> struc;
395        std::vector<Vector3d> forces;
396 +
397        
398        for(sd = (*rm)->beginIntegrableObject(ioi); sd != NULL;
399 <          sd = (*rm)->nextIntegrableObject(ioi)) {        
399 >          sd = (*rm)->nextIntegrableObject(ioi)) {
400          struc.push_back(sd->getPos());
401        }
402  
# Line 390 | Line 412 | namespace oopse {
412          index++;
413        }
414        
415 <      unscaledPotential_ += mRest->getUnscaledPotential();
415 >      unscaledPotential_ += mRest->getUnscaledPotential();      
416  
395      restInfo = mRest->getRestraintInfo();
396
417        // only collect data on restraints that we're going to print:
418        if (mRest->getPrintRestraint())
419 +        restInfo = mRest->getRestraintInfo();
420          restInfo_.push_back(restInfo);
421      }
422  
# Line 412 | Line 433 | namespace oopse {
433            if (oRest == NULL) {
434              sprintf( painCave.errMsg,
435                       "Can not cast RestraintData to ObjectRestraint\n");
436 <            painCave.severity = OOPSE_ERROR;
436 >            painCave.severity = OPENMD_ERROR;
437              painCave.isFatal = 1;
438              simError();                      
439            }
440          } else {
441            sprintf( painCave.errMsg,
442                     "Can not cast GenericData to RestraintData\n");
443 <          painCave.severity = OOPSE_ERROR;
443 >          painCave.severity = OPENMD_ERROR;
444            painCave.isFatal = 1;
445            simError();      
446          }
447        } else {
448          sprintf( painCave.errMsg, "Can not find Restraint for RestrainedObject\n");
449 <        painCave.severity = OOPSE_ERROR;
449 >        painCave.severity = OPENMD_ERROR;
450          painCave.isFatal = 1;
451          simError();          
452        }
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();
# Line 456 | Line 476 | namespace oopse {
476  
477        unscaledPotential_ += oRest->getUnscaledPotential();
478  
459      restInfo = oRest->getRestraintInfo();
460
479        // only collect data on restraints that we're going to print:
480        if (oRest->getPrintRestraint())
481 +        restInfo = oRest->getRestraintInfo();      
482          restInfo_.push_back(restInfo);
483      }
484  

Comparing trunk/src/restraints/RestraintForceManager.cpp (property svn:keywords):
Revision 1366 by gezelter, Fri Oct 16 20:42:29 2009 UTC vs.
Revision 2024 by gezelter, Thu Oct 16 19:13:51 2014 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines