--- trunk/src/UseTheForce/ForceField.cpp 2006/05/17 21:51:42 963 +++ trunk/src/UseTheForce/ForceField.cpp 2007/12/06 20:04:02 1195 @@ -78,7 +78,8 @@ namespace oopse { return atomTypeCont_.find(keys); } - BondType* ForceField::getBondType(const std::string &at1, const std::string &at2) { + BondType* ForceField::getBondType(const std::string &at1, + const std::string &at2) { std::vector keys; keys.push_back(at1); keys.push_back(at2); @@ -91,10 +92,10 @@ namespace oopse { //if no exact match found, try wild card match return bondTypeCont_.find(keys, wildCardAtomTypeName_); } - } - BendType* ForceField::getBendType(const std::string &at1, const std::string &at2, + BendType* ForceField::getBendType(const std::string &at1, + const std::string &at2, const std::string &at3) { std::vector keys; keys.push_back(at1); @@ -111,8 +112,10 @@ namespace oopse { } } - TorsionType* ForceField::getTorsionType(const std::string &at1, const std::string &at2, - const std::string &at3, const std::string &at4) { + TorsionType* ForceField::getTorsionType(const std::string &at1, + const std::string &at2, + const std::string &at3, + const std::string &at4) { std::vector keys; keys.push_back(at1); keys.push_back(at2); @@ -128,17 +131,33 @@ namespace oopse { } return torsionTypeCont_.find(keys, wildCardAtomTypeName_); - } - BondType* ForceField::getExactBondType(const std::string &at1, const std::string &at2){ + NonBondedInteractionType* ForceField::getNonBondedInteractionType(const std::string &at1, const std::string &at2) { std::vector keys; keys.push_back(at1); keys.push_back(at2); + + //try exact match first + NonBondedInteractionType* nbiType = nonBondedInteractionTypeCont_.find(keys); + if (nbiType) { + return nbiType; + } else { + //if no exact match found, try wild card match + return nonBondedInteractionTypeCont_.find(keys, wildCardAtomTypeName_); + } + } + + BondType* ForceField::getExactBondType(const std::string &at1, + const std::string &at2){ + std::vector keys; + keys.push_back(at1); + keys.push_back(at2); return bondTypeCont_.find(keys); } - - BendType* ForceField::getExactBendType(const std::string &at1, const std::string &at2, + + BendType* ForceField::getExactBendType(const std::string &at1, + const std::string &at2, const std::string &at3){ std::vector keys; keys.push_back(at1); @@ -146,9 +165,11 @@ namespace oopse { keys.push_back(at3); return bendTypeCont_.find(keys); } - - TorsionType* ForceField::getExactTorsionType(const std::string &at1, const std::string &at2, - const std::string &at3, const std::string &at4){ + + TorsionType* ForceField::getExactTorsionType(const std::string &at1, + const std::string &at2, + const std::string &at3, + const std::string &at4){ std::vector keys; keys.push_back(at1); keys.push_back(at2); @@ -156,20 +177,29 @@ namespace oopse { keys.push_back(at4); return torsionTypeCont_.find(keys); } + + NonBondedInteractionType* ForceField::getExactNonBondedInteractionType(const std::string &at1, const std::string &at2){ + std::vector keys; + keys.push_back(at1); + keys.push_back(at2); + return nonBondedInteractionTypeCont_.find(keys); + } + + bool ForceField::addAtomType(const std::string &at, AtomType* atomType) { std::vector keys; keys.push_back(at); return atomTypeCont_.add(keys, atomType); } - bool ForceField::addBondType(const std::string &at1, const std::string &at2, BondType* bondType) { + bool ForceField::addBondType(const std::string &at1, const std::string &at2, + BondType* bondType) { std::vector keys; keys.push_back(at1); keys.push_back(at2); - return bondTypeCont_.add(keys, bondType); - + return bondTypeCont_.add(keys, bondType); } - + bool ForceField::addBendType(const std::string &at1, const std::string &at2, const std::string &at3, BendType* bendType) { std::vector keys; @@ -178,9 +208,12 @@ namespace oopse { keys.push_back(at3); return bendTypeCont_.add(keys, bendType); } - - bool ForceField::addTorsionType(const std::string &at1, const std::string &at2, - const std::string &at3, const std::string &at4, TorsionType* torsionType) { + + bool ForceField::addTorsionType(const std::string &at1, + const std::string &at2, + const std::string &at3, + const std::string &at4, + TorsionType* torsionType) { std::vector keys; keys.push_back(at1); keys.push_back(at2); @@ -189,22 +222,31 @@ namespace oopse { return torsionTypeCont_.add(keys, torsionType); } + bool ForceField::addNonBondedInteractionType(const std::string &at1, + const std::string &at2, + NonBondedInteractionType* nbiType) { + std::vector keys; + keys.push_back(at1); + keys.push_back(at2); + return nonBondedInteractionTypeCont_.add(keys, nbiType); + } + RealType ForceField::getRcutFromAtomType(AtomType* at) { /**@todo */ GenericData* data; RealType rcut = 0.0; - + if (at->isLennardJones()) { data = at->getPropertyByName("LennardJones"); if (data != NULL) { LJParamGenericData* ljData = dynamic_cast(data); - + if (ljData != NULL) { LJParam ljParam = ljData->getData(); - + //by default use 2.5*sigma as cutoff radius rcut = 2.5 * ljParam.sigma; - + } else { sprintf( painCave.errMsg, "Can not cast GenericData to LJParam\n"); @@ -219,11 +261,10 @@ namespace oopse { simError(); } } - return rcut; } + - ifstrstream* ForceField::openForceFieldFile(const std::string& filename) { std::string forceFieldFilename(filename); ifstrstream* ffStream = new ifstrstream(); @@ -250,9 +291,7 @@ namespace oopse { simError(); } } - return ffStream; - } void ForceField::setFortranForceOptions(){