/*! \file DivConInterface.h \brief A bunch of routines to deal with DivCon \author Martin B. Peters \author Duane Williams \todo include dcParser ... $Date: 2010/03/29 20:33:22 $ $Revision: 1.7 $ ---------------------------------------------------------------------------- MTK++ - C++ package of modeling libraries. Copyright (C) 2005-2006 (see AUTHORS file for a list of contributors) This file is part of MTK++. MTK++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. MTK++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lessser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . ---------------------------------------------------------------------------- */ #ifndef DIVCONINTERFACE_H #define DIVCONINTERFACE_H #include #include #include #include #include #include namespace MTKpp { // ============================================================ // Class : DivConInterface() // ------------------------------------------------------------ /*! \class DivConInterface \brief A class to interface with DivCon \author Martin Peters \author Duane Williams \version 0.1 \date 2005 */ // ============================================================ class DivConInterface { public: /*! \brief DivConInterface Constructor */ inline DivConInterface() {}; /*! \brief run a DivCon calculation */ inline int runDivCon(std::string divConInput) { std::string DivCon = getenv("DIVCON"); int iDivCon = -1; std::string runDivCon = DivCon + " -i " + divConInput; iDivCon = system(runDivCon.c_str()); if (iDivCon != 0 ) { std::cout << " DivConInterface:Error executing DivCon for " << divConInput << std::endl; return 1; } else { std::cout << " DivConInterface:Divcon Successful: " << divConInput << std::endl; } return 0; } /*! \brief Minimize all molecule in a collection */ inline int Minimize(std::string hamiltonian, std::string chargeModel, std::string optScheme, int maxOpt, collection* pCollection) { molecule* pMolecule = 0; dcParser* pDcParser = new dcParser(); pDcParser->setHamiltonian(hamiltonian); pDcParser->setChargeModel(chargeModel); pDcParser->setOptimizer(optScheme); pDcParser->setMaxOpt(maxOpt); pDcParser->setDirect(1); std::vector molList = pCollection->getMoleculeList(); std::string dcFileName = ""; std::string dcOutFileName = ""; for (unsigned int i = 0; i < molList.size(); i++) { pMolecule = molList[i]; if (molList.size() > 1) { std::stringstream ss1; ss1 << i+1; std::string num = ss1.str().c_str(); dcFileName = "dcMin_" + num + ".in"; dcOutFileName = "dcMin_" + num + ".out"; } else { dcFileName = "dcMin_1.in"; } int nAtoms = pMolecule->getNumAtoms(); if (nAtoms == 1) { pDcParser->setOptimizer(""); pDcParser->setMaxOpt(0); } else { pDcParser->setOptimizer(optScheme); pDcParser->setMaxOpt(maxOpt); } pMolecule->setTotalCharge(pMolecule->getFormalCharge()); // pMolecule->setTotalCharge(0); bool success = true; pDcParser->Write(dcFileName, pMolecule, success); if (!success) return 1; int failure = runDivCon(dcFileName); if (failure) { delete pDcParser; return 1; } } // - Clean up - // delete pDcParser; return 0; } /*! \brief Minimize all molecule in a collection */ inline int Minimize(std::string hamiltonian, std::string chargeModel, std::string optScheme, int maxOpt, molecule* pMolecule, int num = 1) { dcParser* pDcParser = new dcParser(); pDcParser->setHamiltonian(hamiltonian); pDcParser->setChargeModel(chargeModel); pDcParser->setOptimizer(optScheme); pDcParser->setMaxOpt(maxOpt); pDcParser->setDirect(1); std::string dcFileName = ""; std::string dcOutFileName = ""; std::stringstream ss1; ss1 << num; std::string numStr = ss1.str().c_str(); dcFileName = "dcMin_" + numStr + ".in"; dcOutFileName = "dcMin_" + numStr + ".out"; int nAtoms = pMolecule->getNumAtoms(); if (nAtoms == 1) { pDcParser->setOptimizer(""); pDcParser->setMaxOpt(0); } else { pDcParser->setOptimizer(optScheme); pDcParser->setMaxOpt(maxOpt); } pMolecule->setTotalCharge(pMolecule->getFormalCharge()); // pMolecule->setTotalCharge(0); bool success = true; pDcParser->Write(dcFileName, pMolecule, success); if (!success) return 1; int failure = runDivCon(dcFileName); if (failure) { delete pDcParser; return 1; } // - Clean up - // delete pDcParser; return 0; } /*! \brief Run nmr on all molecules in a collection */ inline int runNMR(std::string hamiltonian, int nuclei, collection* pCollection) { molecule* pMolecule = 0; dcParser* pDcParser = new dcParser(); pDcParser->setHamiltonian(hamiltonian); pDcParser->setDirect(1); pDcParser->setCalNuc(nuclei); std::string dcFileName = ""; std::vector molList = pCollection->getMoleculeList(); for (unsigned int i = 0; i < molList.size(); i++) { pMolecule = molList[i]; std::stringstream ss1; ss1 << i+1; std::string i_str = ss1.str().c_str(); dcFileName = "dcMin_" + i_str + ".out"; // test if file is there std::ifstream inputStream; inputStream.open(dcFileName.c_str()); if (!inputStream) { std::cerr << "Error opening DivCon output file, please run minimization first" << std::endl; return 1; } pDcParser->Read(dcFileName, pMolecule); std::string dcFileName2 = "dcNmr_" + i_str + ".in"; std::string dcOutFileName = "dcNmr_" + i_str + ".out"; bool success = true; pDcParser->Write(dcFileName2, pMolecule, success); if (!success) return 1; int failure = runDivCon(dcFileName2); if (failure) { delete pDcParser; return 1; } pDcParser->Read(dcOutFileName, pMolecule); } // - Clean up - // delete pDcParser; return 0; } /*! \brief Run nmr on all molecules in a collection */ inline int runNMR(dcParser* pDcParser, collection* pCollection) { molecule* pMolecule = 0; std::string dcFileName = ""; std::vector molList = pCollection->getMoleculeList(); for (unsigned int i = 0; i < molList.size(); i++) { pMolecule = molList[i]; std::stringstream ss1; ss1 << i+1; std::string i_str = ss1.str().c_str(); dcFileName = "dcMin_" + i_str + ".out"; // test if file is there std::ifstream inputStream; inputStream.open(dcFileName.c_str()); if (!inputStream) { std::cerr << "Error opening DivCon output file, please run minimization first" << std::endl; return 1; } pDcParser->Read(dcFileName, pMolecule); std::string dcFileName2 = "dcNmr_" + i_str + ".in"; std::string dcOutFileName = "dcNmr_" + i_str + ".out"; bool success = true; pDcParser->Write(dcFileName2, pMolecule, success); if (!success) return 1; int failure = runDivCon(dcFileName2); if (failure) { delete pDcParser; return 1; } pDcParser->Read(dcOutFileName, pMolecule); } return 0; } /*! \brief Run nmr on all molecules in a collection */ inline int runNMR(std::string hamiltonian, int nuclei, molecule* pMolecule, int n) { dcParser* pDcParser = new dcParser(); pDcParser->setHamiltonian(hamiltonian); pDcParser->setDirect(1); pDcParser->setCalNuc(nuclei); std::string dcFileName = ""; std::stringstream ss1; ss1 << n; std::string i_str = ss1.str().c_str(); dcFileName = "dcMin_" + i_str + ".out"; // test if file is there std::ifstream inputStream; inputStream.open(dcFileName.c_str()); if (!inputStream) { std::cerr << "Error opening DivCon output file, please run minimization first" << std::endl; return 1; } pDcParser->Read(dcFileName, pMolecule); std::string dcFileName2 = "dcNmr_" + i_str + ".in"; std::string dcOutFileName = "dcNmr_" + i_str + ".out"; bool success = true; pDcParser->Write(dcFileName2, pMolecule, success); if (!success) return 1; int failure = runDivCon(dcFileName2); if (failure) { delete pDcParser; return 1; } pDcParser->Read(dcOutFileName, pMolecule); // - Clean up - // delete pDcParser; return 0; } protected: //! }; } // MTKpp namespace #endif // DIVCONINTERFACE_H