ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-2.0/src/brains/MoleculeCreator.cpp
(Generate patch)

Comparing branches/new_design/OOPSE-2.0/src/brains/MoleculeCreator.cpp (file contents):
Revision 1804 by tim, Tue Nov 30 19:58:25 2004 UTC vs.
Revision 1805 by tim, Tue Nov 30 20:50:47 2004 UTC

# Line 31 | Line 31
31    * @version 1.0
32    */
33  
34 #include "brains/MoleculeCreator.hpp"
34   #include <cassert>
35  
36 + #include "brains/MoleculeCreator.hpp"
37 + #include "primitives/GhostBend.hpp"
38 + #include "utils/simError.h"
39 + #include "utils/StringUtils.hpp"
40 +
41   namespace oopse {
42  
43 < Molecule* MoleculeCreator::createMolecule(ForceField* ff, MoleculeStamp *molStamp, int stampId, int globalIndex) {
43 > Molecule* MoleculeCreator::createMolecule(ForceField* ff, MoleculeStamp *molStamp,
44 >    int stampId, int globalIndex, LocalIndexManager* localIndexMan) {
45 >
46      Molecule* mol = new Molecule(stampId, globalIndex, molStamp->getID());
47      
48      //create atoms
# Line 45 | Line 51 | Molecule* MoleculeCreator::createMolecule(ForceField*
51      int nAtom = molStamp->getNAtoms();
52      for (int i = 0; i < nAtom; ++i) {
53          currentAtomStamp = molStamp->getAtom(i);
54 <        atom = createAtom(ff, currentAtomStamp);
54 >        atom = createAtom(ff, mol, currentAtomStamp, localIndexMan);
55          mol->addAtom(atom);
56      }
57  
# Line 56 | Line 62 | Molecule* MoleculeCreator::createMolecule(ForceField*
62  
63      for (int i = 0; i < nRigidbodies; ++i) {
64          currentRigidBodyStamp = molStamp->getRigidBody(i);
65 <        rb = createRigidBody(ff, mol, currentRigidBodyStamp);
65 >        rb = createRigidBody(molStamp, mol, currentRigidBodyStamp, localIndexMan);
66          mol->addRigidBody(rb);
67      }
68  
# Line 66 | Line 72 | Molecule* MoleculeCreator::createMolecule(ForceField*
72      int nBonds = molStamp->getNBends();
73  
74      for (int i = 0; i < nBonds; ++i) {
75 <        currentBondStamp = molStamp->getBend(i);
75 >        currentBondStamp = molStamp->getBond(i);
76          bond = createBond(ff, mol, currentBondStamp);
77          mol->addBond(bond);
78      }
# Line 97 | Line 103 | Molecule* MoleculeCreator::createMolecule(ForceField*
103      int nCutoffGroups = molStamp->getNCutoffGroups();
104      for (int i = 0; i < nCutoffGroups; ++i) {
105          currentCutoffGroupStamp = molStamp->getCutoffGroup(i);
106 <        cutoffGroup = createCutoffGroup(ff, mol, currentCutoffGroupStamp);
106 >        cutoffGroup = createCutoffGroup(mol, currentCutoffGroupStamp);
107          mol->addCutoffGroup(cutoffGroup);
108      }
109  
110      //every free atom is a cutoff group    
111      std::set<Atom*> allAtoms;
112 <    typename  Molecule::AtomIterator ai;
112 >     Molecule::AtomIterator ai;
113  
114      //add all atoms into allAtoms set
115      for(atom = mol->beginAtom(ai); atom != NULL; atom = mol->nextAtom(ai)) {
116          allAtoms.insert(atom);
117      }
118  
119 <    typename Molecule::CutoffGroupIterator ci;
119 >    Molecule::CutoffGroupIterator ci;
120      CutoffGroup* cg;
121      std::set<Atom*> cutoffAtoms;    
122      
# Line 129 | Line 135 | Molecule* MoleculeCreator::createMolecule(ForceField*
135      //[cutoffAtoms.begin(), cutoffAtoms.end()).
136      std::vector<Atom*> freeAtoms;    
137      std::set_difference(allAtoms.begin(), allAtoms.end(), cutoffAtoms.begin(), cutoffAtoms.end(),
138 <                            std::back_inserter(freeAtoms.end()));
138 >                            std::back_inserter(freeAtoms));
139  
140      if (freeAtoms.size() != allAtoms.size() - cutoffAtoms.size()) {
141          //Some atoms in rigidAtoms are not in allAtoms, something must be wrong
# Line 203 | Line 209 | Atom* MoleculeCreator::createAtom(ForceField* ff, Mole
209      }
210  
211      atom->setLocalIndex(localIndexMan->getNextAtomIndex());
212 +
213 +    return atom;
214   }
215  
216   RigidBody* MoleculeCreator::createRigidBody(MoleculeStamp *molStamp, Molecule* mol,
# Line 213 | Line 221 | RigidBody* MoleculeCreator::createRigidBody(MoleculeSt
221      Vector3d refCoor;
222      AtomStamp* atomStamp;
223      
216    nAtoms = molStamp->getNMembers();
217
224      RigidBody* rb = new RigidBody();
225 <    
225 >    nAtoms = rbStamp->getNMembers();    
226      for (int i = 0; i < nAtoms; ++i) {
227          //rbStamp->getMember(i) return the local index of current atom inside the molecule.
228          //It is not the same as local index of atom which is the index of atom at DataStorage class
229          atom = mol->getAtomAt(rbStamp->getMember(i));
230 <        atomStamp= molStamp->molStamp->getAtom(rbStamp->getMember(i));    
230 >        atomStamp= molStamp->getAtom(rbStamp->getMember(i));    
231          rb->addAtom(atom, atomStamp);
232      }
233  
# Line 236 | Line 242 | RigidBody* MoleculeCreator::createRigidBody(MoleculeSt
242      //The second part is alway fixed as "RB"
243      //The third part is the index of the rigidbody defined in meta-data file
244      //For example, Butane_RB_0 is a valid rigid body name of butane molecule
245 <    rb->setType(mol->getType() + "_RB_" + itoa(mol.getNRigidBodies()));
245 >    /**@todo replace itoa by lexi_cast */
246 >    rb->setType(mol->getType() + "_RB_" + toString(mol->getNRigidBodies()));
247      
248      return rb;
249   }    
# Line 251 | Line 258 | Bond* MoleculeCreator::createBond(ForceField* ff, Mole
258  
259      assert( atomA && atomB);
260      
261 <    bondType = ff->getBondType(atomA, atomB);
261 >    bondType = ff->getBondType(atomA->getType(), atomB->getType());
262  
263      if (bondType == NULL) {
264          sprintf(painCave.errMsg, "Can not find Matching Bond Type for[%s, %s]",
# Line 271 | Line 278 | Bend* MoleculeCreator::createBend(ForceField* ff, Mole
278      
279      //
280      if (stamp->haveExtras()){
281 <        LinkedAssign* extras = currentBend->getExtras();
281 >        LinkedAssign* extras = stamp->getExtras();
282          LinkedAssign* currentExtra = extras;
283  
284          while (currentExtra != NULL){
# Line 313 | Line 320 | Bend* MoleculeCreator::createBend(ForceField* ff, Mole
320              normalIndex = indexA;
321          }
322          
323 <        Atom* normalAtom = mol->getAtomAt(normalIndex) ;
324 <        Atom* ghostAtom = mol->getAtomAt(ghostIndex);
325 <        
323 >        Atom* normalAtom = mol->getAtomAt(normalIndex) ;        
324 >        DirectionalAtom* ghostAtom = dynamic_cast<DirectionalAtom*>(mol->getAtomAt(ghostIndex));
325 >        if (ghostAtom == NULL) {
326 >            sprintf(painCave.errMsg, "Can not cast Atom to DirectionalAtom");
327 >            painCave.isFatal = 1;
328 >            simError();
329 >        }
330 >                
331          BendType* bendType = ff->getBendType(normalAtom->getType(), ghostAtom->getType(), "GHOST");
332  
333          if (bendType == NULL) {
# Line 327 | Line 339 | Bend* MoleculeCreator::createBend(ForceField* ff, Mole
339              painCave.isFatal = 1;
340              simError();
341          }
342 <
342 >        
343          return new GhostBend(normalAtom, ghostAtom, bendType);      
344  
345      } else {
# Line 368 | Line 380 | Torsion* MoleculeCreator::createTorsion(ForceField* ff
380  
381      assert(atomA && atomB && atomC && atomD);
382      
383 <    torsionType = ff->getTosionType(atomA->getType(), atomB->getType(),
383 >    torsionType = ff->getTorsionType(atomA->getType(), atomB->getType(),
384                                                         atomC->getType(), atomD->getType());
385  
386      if (torsionType == NULL) {
# Line 382 | Line 394 | Torsion* MoleculeCreator::createTorsion(ForceField* ff
394          simError();
395      }
396      
397 <    return new Torsion(atomA, atomB, torsionType);      
397 >    return new Torsion(atomA, atomB, atomC, atomD, torsionType);      
398   }    
399  
400   CutoffGroup* MoleculeCreator::createCutoffGroup(Molecule* mol, CutoffGroupStamp* stamp) {
# Line 404 | Line 416 | CutoffGroup* MoleculeCreator::createCutoffGroup(Molecu
416   CutoffGroup* MoleculeCreator::createCutoffGroup(Molecule * mol, Atom* atom) {
417      CutoffGroup* cg;
418      cg  = new CutoffGroup();
419 <    cg->addAtom();
419 >    cg->addAtom(atom);
420      return cg;
421   }
422   //Constraint* MoleculeCreator::createConstraint() {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines