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 1782 by gezelter, Wed Aug 22 02:28:28 2012 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, 24107 (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 + #include "config.h"
44   #include <cmath>
45 +
46   #include "restraints/RestraintForceManager.hpp"
47   #include "restraints/MolecularRestraint.hpp"
48   #include "restraints/ObjectRestraint.hpp"
49   #include "io/RestReader.hpp"
50   #include "utils/simError.h"
51 < #include "utils/OOPSEConstant.hpp"
51 > #include "utils/PhysicalConstants.hpp"
52   #include "utils/StringUtils.hpp"
53   #include "selection/SelectionEvaluator.hpp"
54   #include "selection/SelectionManager.hpp"
# Line 54 | Line 57
57   #endif
58  
59  
60 < namespace oopse {
60 > namespace OpenMD {
61  
62    RestraintForceManager::RestraintForceManager(SimInfo* info): ForceManager(info) {
63  
# 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 134 | Line 139 | namespace oopse {
139          
140            int myrank = MPI::COMM_WORLD.Get_rank();
141            if (info_->getMolToProc(molIndex) == myrank) {
142 +        
143              // If we were supposed to have it but got a null, then freak out.
144   #endif
145  
# Line 149 | Line 155 | namespace oopse {
155   #endif
156          }
157          
158 +
159 + #ifdef IS_MPI
160 +        // only handle this molecular restraint if this processor owns the
161 +        // molecule
162 +        int myrank = MPI::COMM_WORLD.Get_rank();
163 +        if (info_->getMolToProc(molIndex) == myrank) {
164 +
165 + #endif
166 +
167          MolecularRestraint* rest = new MolecularRestraint();
168  
169          std::string restPre("mol_");
# Line 184 | Line 199 | namespace oopse {
199          restraints_.push_back(rest);
200          mol->addProperty(new RestraintData("Restraint", rest));
201          restrainedMols_.push_back(mol);
202 <        
202 > #ifdef IS_MPI
203 >        }
204 > #endif        
205        } else if (myType.compare("OBJECT") == 0) {
206          
207          std::string objectSelection;
# Line 220 | Line 237 | namespace oopse {
237  
238          for (sd = seleMan.beginSelected(selei); sd != NULL;
239               sd = seleMan.nextSelected(selei)) {
240 <          
240 >          stuntDoubleIndex.push_back(sd->getGlobalIntegrableObjectIndex());
241 >
242            ObjectRestraint* rest = new ObjectRestraint();
243            
244            if (stamp[i]->haveDisplacementSpringConstant()) {
# Line 260 | Line 278 | namespace oopse {
278      // are times when it won't use restraints at all, so only open the
279      // restraint file if we are actually using restraints:
280  
281 <    if (simParam->getUseRestraints()) {
281 >    if (simParam->getUseRestraints()) {
282        std::string refFile = simParam->getRestraint_file();
283 <      RestReader* rr = new RestReader(info, refFile);
266 <
283 >      RestReader* rr = new RestReader(info, refFile, stuntDoubleIndex);
284        rr->readReferenceStructure();
285      }
286  
287      restOutput_ = getPrefix(info_->getFinalConfigFileName()) + ".rest";
288      restOut = new RestWriter(info_, restOutput_.c_str(), restraints_);
272    
289      if(!restOut){
290        sprintf(painCave.errMsg, "Restraint error: Failed to create RestWriter\n");
291        painCave.isFatal = 1;
# Line 292 | Line 308 | namespace oopse {
308      currRestTime_ = currSnapshot_->getTime();
309    }
310  
311 <  void RestraintForceManager::calcForces(bool needPotential, bool needStress){
311 >  void RestraintForceManager::calcForces(){
312  
313 <    ForceManager::calcForces(needPotential, needStress);    
313 >    ForceManager::calcForces();    
314      RealType restPot_local, restPot;
315  
316      restPot_local = doRestraints(1.0);
# Line 306 | Line 322 | namespace oopse {
322      restPot = restPot_local;
323   #endif
324      currSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
325 <    currSnapshot_->statData[Stats::LONG_RANGE_POTENTIAL] += restPot;
326 <    currSnapshot_->statData[Stats::VHARM] = restPot;
325 >    RealType pot = currSnapshot_->getLongRangePotential();
326 >    pot += restPot;
327 >    currSnapshot_->setLongRangePotential(pot);
328 >    currSnapshot_->setRestraintPotential(restPot);
329  
330      //write out forces and current positions of restrained molecules    
331      if (currSnapshot_->getTime() >= currRestTime_){
# Line 322 | Line 340 | namespace oopse {
340      Molecule::IntegrableObjectIterator ioi;
341      MolecularRestraint* mRest;
342      StuntDouble* sd;
325    RealType pTot;
343  
344      std::vector<StuntDouble*>::const_iterator ro;
345      ObjectRestraint* oRest;
# Line 347 | Line 364 | namespace oopse {
364            if (mRest == NULL) {
365              sprintf( painCave.errMsg,
366                       "Can not cast RestraintData to MolecularRestraint\n");
367 <            painCave.severity = OOPSE_ERROR;
367 >            painCave.severity = OPENMD_ERROR;
368              painCave.isFatal = 1;
369              simError();                      
370            }
371          } else {
372            sprintf( painCave.errMsg,
373                     "Can not cast GenericData to RestraintData\n");
374 <          painCave.severity = OOPSE_ERROR;
374 >          painCave.severity = OPENMD_ERROR;
375            painCave.isFatal = 1;
376            simError();      
377          }
378        } else {
379          sprintf( painCave.errMsg, "Can not find Restraint for RestrainedObject\n");
380 <        painCave.severity = OOPSE_ERROR;
380 >        painCave.severity = OPENMD_ERROR;
381          painCave.isFatal = 1;
382          simError();          
383        }
# Line 374 | Line 391 | namespace oopse {
391        std::vector<Vector3d> forces;
392        
393        for(sd = (*rm)->beginIntegrableObject(ioi); sd != NULL;
394 <          sd = (*rm)->nextIntegrableObject(ioi)) {        
394 >          sd = (*rm)->nextIntegrableObject(ioi)) {
395          struc.push_back(sd->getPos());
396        }
397  
# Line 412 | Line 429 | namespace oopse {
429            if (oRest == NULL) {
430              sprintf( painCave.errMsg,
431                       "Can not cast RestraintData to ObjectRestraint\n");
432 <            painCave.severity = OOPSE_ERROR;
432 >            painCave.severity = OPENMD_ERROR;
433              painCave.isFatal = 1;
434              simError();                      
435            }
436          } else {
437            sprintf( painCave.errMsg,
438                     "Can not cast GenericData to RestraintData\n");
439 <          painCave.severity = OOPSE_ERROR;
439 >          painCave.severity = OPENMD_ERROR;
440            painCave.isFatal = 1;
441            simError();      
442          }
443        } else {
444          sprintf( painCave.errMsg, "Can not find Restraint for RestrainedObject\n");
445 <        painCave.severity = OOPSE_ERROR;
445 >        painCave.severity = OPENMD_ERROR;
446          painCave.isFatal = 1;
447          simError();          
448        }

Comparing trunk/src/restraints/RestraintForceManager.cpp (property svn:keywords):
Revision 1366 by gezelter, Fri Oct 16 20:42:29 2009 UTC vs.
Revision 1782 by gezelter, Wed Aug 22 02:28:28 2012 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines