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

Comparing:
trunk/src/UseTheForce/ForceField.cpp (file contents), Revision 1390 by gezelter, Wed Nov 25 20:02:06 2009 UTC vs.
branches/development/src/UseTheForce/ForceField.cpp (file contents), Revision 1629 by gezelter, Wed Sep 14 21:15:17 2011 UTC

# Line 51 | Line 51
51   #include "UseTheForce/ForceField.hpp"
52   #include "utils/simError.h"
53   #include "utils/Tuple.hpp"
54 #include "UseTheForce/DarkSide/atype_interface.h"
55 #include "UseTheForce/DarkSide/fForceOptions_interface.h"
56 #include "UseTheForce/DarkSide/switcheroo_interface.h"
54   namespace OpenMD {
55  
56    ForceField::ForceField() {
57 +
58      char* tempPath;
59      tempPath = getenv("FORCE_PARAM_PATH");
60 <
60 >    
61      if (tempPath == NULL) {
62        //convert a macro from compiler to a string in c++
63        STR_DEFINE(ffPath_, FRC_PATH );
# Line 68 | Line 66 | namespace OpenMD {
66      }
67    }
68  
69 <
70 <  ForceField::~ForceField() {
71 <    deleteAtypes();
72 <    deleteSwitch();
73 <  }
74 <
69 >  /**
70 >   * getAtomType by string
71 >   *
72 >   * finds the requested atom type in this force field using the string
73 >   * name of the atom type.
74 >   */
75    AtomType* ForceField::getAtomType(const std::string &at) {
76      std::vector<std::string> keys;
77      keys.push_back(at);
78      return atomTypeCont_.find(keys);
79 +  }
80 +
81 +  /**
82 +   * getAtomType by ident
83 +   *
84 +   * finds the requested atom type in this force field using the
85 +   * integer ident instead of the string name of the atom type.
86 +   */
87 +  AtomType* ForceField::getAtomType(int ident) {  
88 +    std::string at = atypeIdentToName.find(ident)->second;
89 +    return getAtomType(at);
90    }
91  
92    BondType* ForceField::getBondType(const std::string &at1,
# Line 439 | Line 448 | namespace OpenMD {
448    }
449    
450    NonBondedInteractionType* ForceField::getNonBondedInteractionType(const std::string &at1, const std::string &at2) {
451 +    
452      std::vector<std::string> keys;
453      keys.push_back(at1);
454      keys.push_back(at2);    
# Line 448 | Line 458 | namespace OpenMD {
458      if (nbiType) {
459        return nbiType;
460      } else {
461 <      //if no exact match found, try wild card match
462 <      return nonBondedInteractionTypeCont_.find(keys, wildCardAtomTypeName_);
463 <    }    
461 >      AtomType* atype1;
462 >      AtomType* atype2;
463 >      std::vector<std::string> at1key;
464 >      at1key.push_back(at1);
465 >      atype1 = atomTypeCont_.find(at1key);
466 >      
467 >      std::vector<std::string> at2key;
468 >      at2key.push_back(at2);
469 >      atype2 = atomTypeCont_.find(at2key);
470 >      
471 >      // query atom types for their chains of responsibility
472 >      std::vector<AtomType*> at1Chain = atype1->allYourBase();
473 >      std::vector<AtomType*> at2Chain = atype2->allYourBase();
474 >      
475 >      std::vector<AtomType*>::iterator i;
476 >      std::vector<AtomType*>::iterator j;
477 >      
478 >      int ii = 0;
479 >      int jj = 0;
480 >      int nbiTypeScore;
481 >      
482 >      std::vector<std::pair<int, std::vector<std::string> > > foundNBI;
483 >      
484 >      for (i = at1Chain.begin(); i != at1Chain.end(); i++) {
485 >        jj = 0;
486 >        for (j = at2Chain.begin(); j != at2Chain.end(); j++) {
487 >          
488 >          nbiTypeScore = ii + jj;
489 >          
490 >          std::vector<std::string> myKeys;
491 >          myKeys.push_back((*i)->getName());
492 >          myKeys.push_back((*j)->getName());
493 >          
494 >          NonBondedInteractionType* nbiType = nonBondedInteractionTypeCont_.find(myKeys);
495 >          if (nbiType) {
496 >            foundNBI.push_back(std::make_pair(nbiTypeScore, myKeys));
497 >          }
498 >          jj++;
499 >        }
500 >        ii++;
501 >      }
502 >      
503 >      
504 >      if (foundNBI.size() > 0) {
505 >        // sort the foundNBI by the score:
506 >        std::sort(foundNBI.begin(), foundNBI.end());
507 >        
508 >        int bestScore = foundNBI[0].first;
509 >        std::vector<std::string> theKeys = foundNBI[0].second;
510 >        
511 >        NonBondedInteractionType* bestType = nonBondedInteractionTypeCont_.find(theKeys);        
512 >        return bestType;
513 >      } else {
514 >        //if no exact match found, try wild card match
515 >        return nonBondedInteractionTypeCont_.find(keys, wildCardAtomTypeName_);
516 >      }
517 >    }
518    }
519    
520    BondType* ForceField::getExactBondType(const std::string &at1,
# Line 506 | Line 570 | namespace OpenMD {
570    bool ForceField::addAtomType(const std::string &at, AtomType* atomType) {
571      std::vector<std::string> keys;
572      keys.push_back(at);
573 +    atypeIdentToName[atomType->getIdent()] = at;
574      return atomTypeCont_.add(keys, atomType);
575    }
576  
577    bool ForceField::replaceAtomType(const std::string &at, AtomType* atomType) {
578      std::vector<std::string> keys;
579      keys.push_back(at);
580 +    atypeIdentToName[atomType->getIdent()] = at;
581      return atomTypeCont_.replace(keys, atomType);
582    }
583  
# Line 630 | Line 696 | namespace OpenMD {
696      return ffStream;
697    }
698  
633  void ForceField::setFortranForceOptions(){
634    ForceOptions theseFortranOptions;
635    forceFieldOptions_.makeFortranOptions(theseFortranOptions);
636    setfForceOptions(&theseFortranOptions);
637  }
699   } //end namespace OpenMD

Comparing:
trunk/src/UseTheForce/ForceField.cpp (property svn:keywords), Revision 1390 by gezelter, Wed Nov 25 20:02:06 2009 UTC vs.
branches/development/src/UseTheForce/ForceField.cpp (property svn:keywords), Revision 1629 by gezelter, Wed Sep 14 21:15:17 2011 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines