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

Comparing:
trunk/src/restraints/RestraintForceManager.cpp (file contents), Revision 1360 by cli2, Mon Sep 7 16:31:51 2009 UTC vs.
branches/development/src/restraints/RestraintForceManager.cpp (file contents), Revision 1760 by gezelter, Thu Jun 21 19:26:46 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 <cmath>
# Line 45 | Line 46
46   #include "restraints/ObjectRestraint.hpp"
47   #include "io/RestReader.hpp"
48   #include "utils/simError.h"
49 < #include "utils/OOPSEConstant.hpp"
49 > #include "utils/PhysicalConstants.hpp"
50   #include "utils/StringUtils.hpp"
51   #include "selection/SelectionEvaluator.hpp"
52   #include "selection/SelectionManager.hpp"
# Line 54 | Line 55
55   #endif
56  
57  
58 < namespace oopse {
58 > namespace OpenMD {
59  
60    RestraintForceManager::RestraintForceManager(SimInfo* info): ForceManager(info) {
61  
# Line 78 | Line 79 | namespace oopse {
79        restTime_ = simParam->getStatusTime();
80      } else {
81        sprintf(painCave.errMsg,
82 <              "Restraint warning: If you use restraints without setting\n",
83 <              "\tstatusTime, no restraint data will be written to the rest\n",
82 >              "Restraint warning: If you use restraints without setting\n"
83 >              "\tstatusTime, no restraint data will be written to the rest\n"
84                "\tfile.\n");
85        painCave.isFatal = 0;
86        simError();
# Line 89 | Line 90 | namespace oopse {
90      int nRestraintStamps = simParam->getNRestraintStamps();
91      std::vector<RestraintStamp*> stamp = simParam->getRestraintStamps();
92  
93 +    std::vector<int> stuntDoubleIndex;
94 +
95      for (int i = 0; i < nRestraintStamps; i++){
96  
97        std::string myType = toUpperCopy(stamp[i]->getType());
# Line 109 | Line 112 | namespace oopse {
112            molIndex = stamp[i]->getMolIndex();
113          }
114          
115 <        Molecule* mol = info_->getMoleculeByGlobalIndex(molIndex);
113 <        
114 <        if (mol == NULL) {
115 >        if (molIndex < 0) {
116            sprintf(painCave.errMsg,
117 <                  "Restraint Error: A molecular restraint was specified, but\n"
118 <                  "\tno molecule was found with global index %d.\n",
118 <                  molIndex);
117 >                  "Restraint Error: A molecular restraint was specified\n"
118 >                  "\twith a molIndex that was less than 0\n");
119            painCave.isFatal = 1;
120            simError();      
121 +        }
122 +        if (molIndex >= info_->getNGlobalMolecules()) {
123 +          sprintf(painCave.errMsg,
124 +                  "Restraint Error: A molecular restraint was specified with\n"
125 +                  "\ta molIndex that was greater than the total number of molecules\n");
126 +          painCave.isFatal = 1;
127 +          simError();      
128 +        }
129 +      
130 +        Molecule* mol = info_->getMoleculeByGlobalIndex(molIndex);
131 +        
132 +        if (mol == NULL) {
133 + #ifdef IS_MPI
134 +          // getMoleculeByGlobalIndex returns a NULL in parallel if
135 +          // this proc doesn't have the molecule.  Do a quick check to
136 +          // make sure another processor is supposed to have it.
137 +        
138 +          int myrank = MPI::COMM_WORLD.Get_rank();
139 +          if (info_->getMolToProc(molIndex) == myrank) {
140 +        
141 +            // If we were supposed to have it but got a null, then freak out.
142 + #endif
143 +
144 +            sprintf(painCave.errMsg,
145 +                    "Restraint Error: A molecular restraint was specified, but\n"
146 +                    "\tno molecule was found with global index %d.\n",
147 +                    molIndex);
148 +            painCave.isFatal = 1;
149 +            simError();    
150 +
151 + #ifdef IS_MPI
152 +          }
153 + #endif
154          }
155          
156 +
157 + #ifdef IS_MPI
158 +        // only handle this molecular restraint if this processor owns the
159 +        // molecule
160 +        int myrank = MPI::COMM_WORLD.Get_rank();
161 +        if (info_->getMolToProc(molIndex) == myrank) {
162 +
163 + #endif
164 +
165          MolecularRestraint* rest = new MolecularRestraint();
166  
167          std::string restPre("mol_");
# Line 148 | Line 190 | namespace oopse {
190          if (stamp[i]->haveRestrainedSwingXAngle()) {
191            rest->setRestrainedSwingXAngle(stamp[i]->getRestrainedSwingXAngle() * M_PI/180.0);
192          }
193 +        if (stamp[i]->havePrint()) {
194 +          rest->setPrintRestraint(stamp[i]->getPrint());
195 +        }
196  
197          restraints_.push_back(rest);
198          mol->addProperty(new RestraintData("Restraint", rest));
199          restrainedMols_.push_back(mol);
200 <        
200 > #ifdef IS_MPI
201 >        }
202 > #endif        
203        } else if (myType.compare("OBJECT") == 0) {
204          
205          std::string objectSelection;
# Line 170 | Line 217 | namespace oopse {
217  
218          SelectionEvaluator evaluator(info);
219          SelectionManager seleMan(info);
220 <        
220 >                
221          evaluator.loadScriptString(objectSelection);
222          seleMan.setSelectionSet(evaluator.evaluate());        
223          int selectionCount = seleMan.getSelectionCount();
# Line 188 | Line 235 | namespace oopse {
235  
236          for (sd = seleMan.beginSelected(selei); sd != NULL;
237               sd = seleMan.nextSelected(selei)) {
238 <          
238 >          stuntDoubleIndex.push_back(sd->getGlobalIntegrableObjectIndex());
239 >
240            ObjectRestraint* rest = new ObjectRestraint();
241            
242            if (stamp[i]->haveDisplacementSpringConstant()) {
# Line 211 | Line 259 | namespace oopse {
259            }
260            if (stamp[i]->haveRestrainedSwingYAngle()) {
261              rest->setRestrainedSwingYAngle(stamp[i]->getRestrainedSwingYAngle());
262 <          }        
262 >          }    
263 >          if (stamp[i]->havePrint()) {
264 >            rest->setPrintRestraint(stamp[i]->getPrint());
265 >          }
266 >    
267            restraints_.push_back(rest);
268            sd->addProperty(new RestraintData("Restraint", rest));
269            restrainedObjs_.push_back(sd);                    
# Line 224 | Line 276 | namespace oopse {
276      // are times when it won't use restraints at all, so only open the
277      // restraint file if we are actually using restraints:
278  
279 <    if (simParam->getUseRestraints()) {
279 >    if (simParam->getUseRestraints()) {
280        std::string refFile = simParam->getRestraint_file();
281 <      RestReader* rr = new RestReader(info, refFile);
230 <
281 >      RestReader* rr = new RestReader(info, refFile, stuntDoubleIndex);
282        rr->readReferenceStructure();
283      }
284  
285      restOutput_ = getPrefix(info_->getFinalConfigFileName()) + ".rest";
286      restOut = new RestWriter(info_, restOutput_.c_str(), restraints_);
236    
287      if(!restOut){
288        sprintf(painCave.errMsg, "Restraint error: Failed to create RestWriter\n");
289        painCave.isFatal = 1;
# Line 256 | Line 306 | namespace oopse {
306      currRestTime_ = currSnapshot_->getTime();
307    }
308  
309 <  void RestraintForceManager::calcForces(bool needPotential, bool needStress){
309 >  void RestraintForceManager::calcForces(){
310  
311 <    ForceManager::calcForces(needPotential, needStress);    
311 >    ForceManager::calcForces();    
312      RealType restPot_local, restPot;
313  
314      restPot_local = doRestraints(1.0);
# Line 270 | Line 320 | namespace oopse {
320      restPot = restPot_local;
321   #endif
322      currSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
323 <    currSnapshot_->statData[Stats::LONG_RANGE_POTENTIAL] += restPot;
324 <    currSnapshot_->statData[Stats::VHARM] = restPot;
323 >    RealType pot = currSnapshot_->getLongRangePotential();
324 >    pot += restPot;
325 >    currSnapshot_->setLongRangePotential(pot);
326 >    currSnapshot_->setRestraintPotential(restPot);
327  
328      //write out forces and current positions of restrained molecules    
329      if (currSnapshot_->getTime() >= currRestTime_){
# Line 311 | Line 363 | namespace oopse {
363            if (mRest == NULL) {
364              sprintf( painCave.errMsg,
365                       "Can not cast RestraintData to MolecularRestraint\n");
366 <            painCave.severity = OOPSE_ERROR;
366 >            painCave.severity = OPENMD_ERROR;
367              painCave.isFatal = 1;
368              simError();                      
369            }
370          } else {
371            sprintf( painCave.errMsg,
372                     "Can not cast GenericData to RestraintData\n");
373 <          painCave.severity = OOPSE_ERROR;
373 >          painCave.severity = OPENMD_ERROR;
374            painCave.isFatal = 1;
375            simError();      
376          }
377        } else {
378          sprintf( painCave.errMsg, "Can not find Restraint for RestrainedObject\n");
379 <        painCave.severity = OOPSE_ERROR;
379 >        painCave.severity = OPENMD_ERROR;
380          painCave.isFatal = 1;
381          simError();          
382        }
# Line 338 | Line 390 | namespace oopse {
390        std::vector<Vector3d> forces;
391        
392        for(sd = (*rm)->beginIntegrableObject(ioi); sd != NULL;
393 <          sd = (*rm)->nextIntegrableObject(ioi)) {        
393 >          sd = (*rm)->nextIntegrableObject(ioi)) {
394          struc.push_back(sd->getPos());
395        }
396  
# Line 357 | Line 409 | namespace oopse {
409        unscaledPotential_ += mRest->getUnscaledPotential();
410  
411        restInfo = mRest->getRestraintInfo();
412 <      restInfo_.push_back(restInfo);
412 >
413 >      // only collect data on restraints that we're going to print:
414 >      if (mRest->getPrintRestraint())
415 >        restInfo_.push_back(restInfo);
416      }
417  
418      for(ro=restrainedObjs_.begin(); ro != restrainedObjs_.end(); ++ro){
# Line 373 | Line 428 | namespace oopse {
428            if (oRest == NULL) {
429              sprintf( painCave.errMsg,
430                       "Can not cast RestraintData to ObjectRestraint\n");
431 <            painCave.severity = OOPSE_ERROR;
431 >            painCave.severity = OPENMD_ERROR;
432              painCave.isFatal = 1;
433              simError();                      
434            }
435          } else {
436            sprintf( painCave.errMsg,
437                     "Can not cast GenericData to RestraintData\n");
438 <          painCave.severity = OOPSE_ERROR;
438 >          painCave.severity = OPENMD_ERROR;
439            painCave.isFatal = 1;
440            simError();      
441          }
442        } else {
443          sprintf( painCave.errMsg, "Can not find Restraint for RestrainedObject\n");
444 <        painCave.severity = OOPSE_ERROR;
444 >        painCave.severity = OPENMD_ERROR;
445          painCave.isFatal = 1;
446          simError();          
447        }
# Line 418 | Line 473 | namespace oopse {
473        unscaledPotential_ += oRest->getUnscaledPotential();
474  
475        restInfo = oRest->getRestraintInfo();
476 <      restInfo_.push_back(restInfo);
476 >
477 >      // only collect data on restraints that we're going to print:
478 >      if (oRest->getPrintRestraint())
479 >        restInfo_.push_back(restInfo);
480      }
481  
482      return unscaledPotential_ * scalingFactor;

Comparing:
trunk/src/restraints/RestraintForceManager.cpp (property svn:keywords), Revision 1360 by cli2, Mon Sep 7 16:31:51 2009 UTC vs.
branches/development/src/restraints/RestraintForceManager.cpp (property svn:keywords), Revision 1760 by gezelter, Thu Jun 21 19:26:46 2012 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines