/* * Project: MoleCuilder * Description: creates and alters molecular systems * Copyright (C) 2011 University of Bonn. All rights reserved. * Copyright (C) 2013 Frederik Heber. All rights reserved. * * * This file is part of MoleCuilder. * * MoleCuilder is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * MoleCuilder 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MoleCuilder. If not, see . */ /* * ExportGraph_ToJobs.cpp * * Created on: 08.03.2012 * Author: heber */ // include config.h #ifdef HAVE_CONFIG_H #include #endif // boost asio required before MemDebug due to placement new #include #include "CodePatterns/MemDebug.hpp" #include "Fragmentation/Exporters/ExportGraph_ToJobs.hpp" #include #include "Box.hpp" #include "Fragmentation/KeySet.hpp" #include "Fragmentation/Automation/FragmentJobQueue.hpp" #include "Helpers/defs.hpp" #ifdef HAVE_JOBMARKET #include "Jobs/MPQCJob.hpp" #else #include "Jobs/MPQCCommandJob.hpp" #endif #include "LinearAlgebra/RealSpaceMatrix.hpp" #include "Parser/FormatParserStorage.hpp" #include "World.hpp" ExportGraph_ToJobs::ExportGraph_ToJobs( const Graph &_graph, const enum HydrogenTreatment _treatment, const enum HydrogenSaturation _saturation, const SaturatedFragment::GlobalSaturationPositions_t &_globalsaturationpositions) : ExportGraph(_graph, _treatment, _saturation,_globalsaturationpositions), level(5) {} ExportGraph_ToJobs::~ExportGraph_ToJobs() {} void ExportGraph_ToJobs::operator()() { std::vector jobs; KeySetsContainer KeySets; KeySetsContainer FullKeySets; jobs.reserve(TotalGraph.size()); LOG(1, "INFO: Creating " << TotalGraph.size() << " possible bond fragmentation jobs."); // gather info about the domain double begin[NDIM] = { 0., 0., 0. }; RealSpaceMatrix M = World::getInstance().getDomain().getM(); M *= 1./AtomicLengthToAngstroem; // scale to atomic length units const double size = std::max( std::max(M.at(0,0), M.at(1,1)), M.at(2,2)); double end[NDIM] = { size, size, size }; const ParserTypes jobtype = FormatParserStorage::getInstance().getTypeFromName("mpqc"); // go through all fragments, output to stream and create job therefrom ExportGraph::SaturatedFragment_ptr CurrentFragment = getNextFragment(); for (; (CurrentFragment != NULL) && (CurrentFragment->getKeySet() != ExportGraph::EmptySet); CurrentFragment = getNextFragment()) { const KeySet &set = CurrentFragment->getKeySet(); LOG(2, "INFO: Creating bond fragment job for set " << set << "."); // store config in stream { std::stringstream output; // save to stream CurrentFragment->OutputConfig(output, jobtype); // create job and insert FragmentJob::ptr testJob( #ifdef HAVE_JOBMARKET new MPQCJob(JobId::IllegalJob, output.str(), begin, end, level) #else new MPQCCommandJob(output.str(), JobId::IllegalJob) #endif ); testJob->setPriority(CurrentFragment->getKeySet().size()); jobs.push_back(testJob); // order is the same as the number of non-hydrogen atoms const KeySet &keyset = CurrentFragment->getKeySet(); const size_t order = keyset.size(); const KeySet &fullmolecule = CurrentFragment->getFullMolecule(); const KeySet &saturationhydrogens = CurrentFragment->getSaturationHydrogens(); KeySetsContainer::IntVector indices(keyset.begin(), keyset.end()); KeySetsContainer::IntVector forceindices(fullmolecule.begin(), fullmolecule.end()); { // replace all saturated hydrogen indices by "-1" for (KeySetsContainer::IntVector::iterator iter = forceindices.begin(); iter != forceindices.end(); ++iter) if (saturationhydrogens.find(*iter) != saturationhydrogens.end()) *iter = -1; } KeySets.insert(indices, order); FullKeySets.insert(forceindices, order); } // store force index reference file // explicitly release fragment CurrentFragment.reset(); } if (CurrentFragment == NULL) { ELOG(1, "Some error while obtaining the next fragment occured."); return; } // push final jobs FragmentJobQueue::getInstance().addJobs(jobs, KeySets, FullKeySets); }