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

Comparing trunk/src/utils/MoLocator.cpp (file contents):
Revision 501 by gezelter, Thu Apr 14 21:20:36 2005 UTC vs.
Revision 1879 by gezelter, Sun Jun 16 15:15:42 2013 UTC

# Line 1 | Line 1
1 < /*
1 > /*
2   * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3   *
4   * The University of Notre Dame grants you ("Licensee") a
# 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   #include <iostream>
# Line 48 | Line 49
49   #include "utils/MoLocator.hpp"
50   #include "types/AtomType.hpp"
51  
52 < namespace oopse {
52 > namespace OpenMD {
53    MoLocator::MoLocator( MoleculeStamp* theStamp, ForceField* theFF){
54      
55      myStamp = theStamp;
# Line 57 | Line 58 | namespace oopse {
58      calcRef();
59    }
60    
61 <  void MoLocator::placeMol( const Vector3d& offset, const Vector3d& ort, Molecule* mol){
61 >  void MoLocator::placeMol( const Vector3d& offset, const Vector3d& ort,
62 >                            Molecule* mol) {
63 >
64      Vector3d newCoor;
65      Vector3d curRefCoor;  
66      RotMat3x3d rotMat = latVec2RotMat(ort);
67      
68      if(mol->getNIntegrableObjects() != nIntegrableObjects){
69        sprintf( painCave.errMsg,
70 <               "MoLocator error.\n"
71 <               "  The number of integrable objects of MoleculeStamp is not the same as  that of Molecule\n");
70 >               "MoLocator::placeMol error.\n"
71 >               "\tThe number of integrable objects of MoleculeStamp is not\n"
72 >               "\tthe same as that of Molecule\n");
73        painCave.isFatal = 1;
74        simError();
75      }
76      
77      Molecule::IntegrableObjectIterator ii;
78 <    StuntDouble* integrableObject;
78 >    StuntDouble* sd;
79      int i;
80 <    for (integrableObject = mol->beginIntegrableObject(ii), i = 0; integrableObject != NULL;
81 <         integrableObject = mol->nextIntegrableObject(ii), ++i) {
80 >    for (sd = mol->beginIntegrableObject(ii), i = 0; sd != NULL;
81 >         sd = mol->nextIntegrableObject(ii), ++i) {
82        
83        newCoor = rotMat * refCoords[i];
84        newCoor += offset;
85 +    
86 +      sd->setPos(newCoor);
87 +      sd->setVel(V3Zero);
88        
89 <      integrableObject->setPos( newCoor);
90 <      integrableObject->setVel(V3Zero);
91 <      
85 <      if(integrableObject->isDirectional()){
86 <        integrableObject->setA(rotMat * integrableObject->getA());
87 <        integrableObject->setJ(V3Zero);  
89 >      if(sd->isDirectional()){
90 >        sd->setA(rotMat * sd->getA());
91 >        sd->setJ(V3Zero);  
92        }        
93      }
94    }
# Line 92 | Line 96 | namespace oopse {
96    void MoLocator::calcRef( void ){
97      AtomStamp* currAtomStamp;
98      RigidBodyStamp* rbStamp;
99 <    int nAtoms;
99 >    unsigned int nAtoms;
100      int nRigidBodies;
101 <    std::vector<double> mass;
101 >    std::vector<RealType> mass;
102      Vector3d coor;
103      Vector3d refMolCom;  
104      int nAtomsInRb;
105 <    double totMassInRb;
106 <    double currAtomMass;
107 <    double molMass;
105 >    RealType totMassInRb;
106 >    RealType currAtomMass;
107 >    RealType molMass;
108      
109      nAtoms= myStamp->getNAtoms();
110      nRigidBodies = myStamp->getNRigidBodies();
111      
112 <    for(size_t i=0; i<nAtoms; i++){
112 >    for(unsigned int i = 0; i < nAtoms; i++){
113        
114 <      currAtomStamp = myStamp->getAtom(i);
114 >      currAtomStamp = myStamp->getAtomStamp(i);
115        
116        if( !currAtomStamp->havePosition() ){
117          sprintf( painCave.errMsg,
118 <                 "MoLocator error.\n"
119 <                 "  Component %s, atom %s does not have a position specified.\n"
120 <                 "  This means MoLocator cannot initalize it's position.\n",
121 <                 myStamp->getID(),
122 <                 currAtomStamp->getType() );
118 >                 "MoLocator::calcRef error.\n"
119 >                 "\tComponent %s, atom %s does not have a position specified.\n"
120 >                 "\tThis means MoLocator cannot initalize it's position.\n",
121 >                 myStamp->getName().c_str(),
122 >                 currAtomStamp->getType().c_str());
123          
124          painCave.isFatal = 1;
125          simError();
# Line 138 | Line 142 | namespace oopse {
142      
143      for(int i = 0; i < nRigidBodies; i++){
144        
145 <      rbStamp = myStamp->getRigidBody(i);
145 >      rbStamp = myStamp->getRigidBodyStamp(i);
146        nAtomsInRb = rbStamp->getNMembers();
147        
148        coor.x() = 0.0;
# Line 148 | Line 152 | namespace oopse {
152        
153        for(int j = 0; j < nAtomsInRb; j++){
154          
155 <        currAtomStamp = myStamp->getAtom(rbStamp->getMember(j));
155 >        currAtomStamp = myStamp->getAtomStamp(rbStamp->getMemberAt(j));
156          currAtomMass = getAtomMass(currAtomStamp->getType(), myFF);
157          totMassInRb +=  currAtomMass;
158          
# Line 176 | Line 180 | namespace oopse {
180      
181      refMolCom /= molMass;
182      
183 <    //move the reference center of mass to (0,0,0) and adjust the reference coordinate
184 <    //of the integrabel objects
185 <  for(int i = 0; i < nIntegrableObjects; i++)
186 <    refCoords[i] -= refMolCom;
183 >    //move the reference center of mass to (0,0,0) and adjust the
184 >    //reference coordinate of the integrabel objects
185 >    for(int i = 0; i < nIntegrableObjects; i++)
186 >      refCoords[i] -= refMolCom;
187    }
188    
189 <  double getAtomMass(const std::string& at, ForceField* myFF) {
190 <    double mass;
189 >  RealType MoLocator::getAtomMass(const std::string& at, ForceField* myFF) {
190 >    RealType mass;
191      AtomType* atomType= myFF->getAtomType(at);
192      if (atomType != NULL) {
193        mass =     atomType->getMass();
# Line 194 | Line 198 | namespace oopse {
198      return mass;
199    }
200    
201 <  double getMolMass(MoleculeStamp *molStamp, ForceField *myFF) {
202 <    int nAtoms;
203 <    double totMass = 0;
201 >  RealType MoLocator::getMolMass(MoleculeStamp *molStamp, ForceField *myFF) {
202 >    unsigned int nAtoms;
203 >    RealType totMass = 0;
204      nAtoms = molStamp->getNAtoms();
205      
206 <    for(size_t i = 0; i < nAtoms; i++) {
207 <      AtomStamp *currAtomStamp = molStamp->getAtom(i);
206 >    for(unsigned int i = 0; i < nAtoms; i++) {
207 >      AtomStamp *currAtomStamp = molStamp->getAtomStamp(i);
208        totMass += getAtomMass(currAtomStamp->getType(), myFF);        
209      }
210      return totMass;
211    }
212 <  RotMat3x3d latVec2RotMat(const Vector3d& lv){
212 >
213 >  RotMat3x3d MoLocator::latVec2RotMat(const Vector3d& lv){
214      
215 <    double theta =acos(lv[2]);
216 <    double phi = atan2(lv[1], lv[0]);
217 <    double psi = 0;
215 >    RealType theta =acos(lv[2]);
216 >    RealType phi = atan2(lv[1], lv[0]);
217 >    RealType psi = 0;
218      
219 <    return RotMat3x3d(phi, theta, psi);
215 <    
219 >    return RotMat3x3d(phi, theta, psi);    
220    }
221   }
222  

Comparing trunk/src/utils/MoLocator.cpp (property svn:keywords):
Revision 501 by gezelter, Thu Apr 14 21:20:36 2005 UTC vs.
Revision 1879 by gezelter, Sun Jun 16 15:15:42 2013 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines