--- trunk/OOPSE-2.0/src/types/ShapeAtomType.cpp 2005/04/15 22:04:00 2204 +++ trunk/OOPSE-2.0/src/types/ShapeAtomType.cpp 2005/04/21 14:12:19 2211 @@ -10,10 +10,10 @@ * publication of scientific results based in part on use of the * program. An acceptable form of acknowledgement is citation of * the article in which the program was described (Matthew - * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher - * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented + * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher + * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented * Parallel Simulation Engine for Molecular Dynamics," - * J. Comput. Chem. 26, pp. 252-271 (2005)) + * J. Comput. Chem. 26, pp. 252-271 (2005)) * * 2. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. @@ -38,63 +38,161 @@ * University of Notre Dame has been advised of the possibility of * such damages. */ - + #include "types/ShapeAtomType.hpp" +#include "UseTheForce/DarkSide/shapes_interface.h" -using namespace oopse; - -ShapeAtomType::~ShapeAtomType() { - std::vector::iterator iter; - for (iter = contactFuncs.begin(); iter != contactFuncs.end(); ++iter) - delete (*iter); - for (iter = rangeFuncs.begin(); iter != rangeFuncs.end(); ++iter) - delete (*iter); - for (iter = strengthFuncs.begin(); iter != strengthFuncs.end(); ++iter) - delete (*iter); - contactFuncs.clear(); - rangeFuncs.clear(); - strengthFuncs.clear(); -} - -double ShapeAtomType::getContactValueAt(double costheta, double phi) { +namespace oopse { - std::vector::iterator contactIter; - double contactVal; + ShapeAtomType::~ShapeAtomType() { + std::vector::iterator iter; + for (iter = contactFuncs.begin(); iter != contactFuncs.end(); ++iter) + delete (*iter); + for (iter = rangeFuncs.begin(); iter != rangeFuncs.end(); ++iter) + delete (*iter); + for (iter = strengthFuncs.begin(); iter != strengthFuncs.end(); ++iter) + delete (*iter); + contactFuncs.clear(); + rangeFuncs.clear(); + strengthFuncs.clear(); + } - contactVal = 0.0; + double ShapeAtomType::getContactValueAt(double costheta, double phi) { + + std::vector::iterator contactIter; + double contactVal; + + contactVal = 0.0; + + for(contactIter = contactFuncs.begin(); contactIter != contactFuncs.end(); + ++contactIter) + contactVal += (*contactIter)->getValueAt(costheta, phi); + + return contactVal; + } - for(contactIter = contactFuncs.begin(); contactIter != contactFuncs.end(); - ++contactIter) - contactVal += (*contactIter)->getValueAt(costheta, phi); - - return contactVal; -} - -double ShapeAtomType::getRangeValueAt(double costheta, double phi) { + double ShapeAtomType::getRangeValueAt(double costheta, double phi) { + + std::vector::iterator rangeIter; + double rangeVal; + + rangeVal = 0.0; + + for(rangeIter = rangeFuncs.begin(); rangeIter != rangeFuncs.end(); + ++rangeIter) + rangeVal += (*rangeIter)->getValueAt(costheta, phi); + + return rangeVal; + } - std::vector::iterator rangeIter; - double rangeVal; + double ShapeAtomType::getStrengthValueAt(double costheta, double phi) { + + std::vector::iterator strengthIter; + double strengthVal; + + strengthVal = 0.0; + + for(strengthIter = strengthFuncs.begin(); + strengthIter != strengthFuncs.end(); + ++strengthIter) + strengthVal += (*strengthIter)->getValueAt(costheta, phi); + + return strengthVal; + } - rangeVal = 0.0; - - for(rangeIter = rangeFuncs.begin(); rangeIter != rangeFuncs.end(); - ++rangeIter) - rangeVal += (*rangeIter)->getValueAt(costheta, phi); - - return rangeVal; -} + void ShapeAtomType::complete() { + + // first complete all the non-shape atomTypes + DirectionalAtomType::complete(); + + int isError = 0; + + //setup dipole atom type in fortran side + if (isShape()) { + // vectors for shape transfer to fortran + std::vector tempSHVector; + std::vector contactL; + std::vector contactM; + std::vector contactFunc; + std::vector contactCoeff; + std::vector rangeL; + std::vector rangeM; + std::vector rangeFunc; + std::vector rangeCoeff; + std::vector strengthL; + std::vector strengthM; + std::vector strengthFunc; + std::vector strengthCoeff; + + tempSHVector.clear(); + contactL.clear(); + contactM.clear(); + contactFunc.clear(); + contactCoeff.clear(); + + tempSHVector = getContactFuncs(); + + int nContact = tempSHVector.size(); + for (int i=0; igetL()); + contactM.push_back(tempSHVector[i]->getM()); + contactFunc.push_back(tempSHVector[i]->getFunctionType()); + contactCoeff.push_back(tempSHVector[i]->getCoefficient()); + } + + tempSHVector.clear(); + rangeL.clear(); + rangeM.clear(); + rangeFunc.clear(); + rangeCoeff.clear(); + + tempSHVector = getRangeFuncs(); + + int nRange = tempSHVector.size(); + for (int i=0; igetL()); + rangeM.push_back(tempSHVector[i]->getM()); + rangeFunc.push_back(tempSHVector[i]->getFunctionType()); + rangeCoeff.push_back(tempSHVector[i]->getCoefficient()); + } + + tempSHVector.clear(); + strengthL.clear(); + strengthM.clear(); + strengthFunc.clear(); + strengthCoeff.clear(); + + tempSHVector = getStrengthFuncs(); + + int nStrength = tempSHVector.size(); + for (int i=0; igetL()); + strengthM.push_back(tempSHVector[i]->getM()); + strengthFunc.push_back(tempSHVector[i]->getFunctionType()); + strengthCoeff.push_back(tempSHVector[i]->getCoefficient()); + } + + int myATID = getIdent(); + + + std::cout << "calling makeShape with myATID = " << myATID << "\n"; -double ShapeAtomType::getStrengthValueAt(double costheta, double phi) { - - std::vector::iterator strengthIter; - double strengthVal; - - strengthVal = 0.0; - - for(strengthIter = strengthFuncs.begin(); - strengthIter != strengthFuncs.end(); - ++strengthIter) - strengthVal += (*strengthIter)->getValueAt(costheta, phi); - - return strengthVal; + makeShape( &nContact, &contactL[0], &contactM[0], &contactFunc[0], + &contactCoeff[0], + &nRange, &rangeL[0], &rangeM[0], &rangeFunc[0], &rangeCoeff[0], + &nStrength, &strengthL[0], &strengthM[0], &strengthFunc[0], + &strengthCoeff[0], + &myATID, + &isError); + + if( isError ){ + sprintf( painCave.errMsg, + "Error initializing the \"%s\" shape in fortran\n", + (getName()).c_str() ); + painCave.severity = OOPSE_ERROR; + painCave.isFatal = 1; + simError(); + } + } + } }