/* * Project: MoleCuilder * Description: creates and alters molecular systems * Copyright (C) 2012 University of Bonn. 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 . */ /* * IndexedVectors.cpp * * Created on: 29.07.2012 * Author: heber */ // include config.h #ifdef HAVE_CONFIG_H #include #endif #include "CodePatterns/MemDebug.hpp" #include "Fragmentation/SetValues/IndexedVectors.hpp" #include #include "CodePatterns/Assert.hpp" // static member variables const size_t IndexedVectors::FixedSize = 3; const IndexedVectors::vector_t IndexedVectors::nullvector( FixedSize, 0.); IndexedVectors::IndexedVectors(const indices_t &_indices, const vectors_t &_vectors) { ASSERT(_indices.size() == _vectors.size(), "IndexedVectors::IndexedVectors() - vector of indices and vectors don't match in size."); indices_t::const_iterator indexiter = _indices.begin(); vectors_t::const_iterator vectoriter = _vectors.begin(); for (; vectoriter != _vectors.end(); ++indexiter, ++vectoriter) { ASSERT( vectoriter->size() == FixedSize, "IndexedVectors::IndexedVectors() - vector to instance " +toString(*indexiter)+" has size " +toString(vectoriter->size())+" different to FixedSize " +toString(FixedSize)+"."); if (*indexiter != (size_t)DropIndex) { // skip all force vectors associated to -1 #ifndef NDEBUG std::pair inserter = #endif vectors.insert( std::make_pair( *indexiter, *vectoriter) ); ASSERT( inserter.second, "IndexedVectors::IndexedVectors() - index " +toString(inserter.first->first)+" already present with vector " +toString(inserter.first->second)+"."); } } } IndexedVectors& IndexedVectors::operator=(const IndexedVectors &other) { // check for self-assignment if (this != &other) { vectors.clear(); vectors = other.vectors; } return *this; } void IndexedVectors::superposeOtherIndexedVectors(const IndexedVectors &other, const double prefactor) { for (indexedvectors_t::const_iterator otheriter = other.vectors.begin(); otheriter != other.vectors.end(); ++otheriter) { indexedvectors_t::iterator iter = vectors.find(otheriter->first); if (iter == vectors.end()) { // index does not exist std::pair inserter = vectors.insert( std::make_pair( otheriter->first, nullvector) ); ASSERT( inserter.second, "IndexedVectors::superposeOtherIndexedVectors() - index is present though unfound before?"); iter = inserter.first; } // now simply vector to index from other instance add with prefactor vector_t::iterator vectoriter = iter->second.begin(); vector_t::const_iterator othervectoriter = otheriter->second.begin(); for (;vectoriter != iter->second.end(); ++vectoriter, ++othervectoriter) { *vectoriter += prefactor * (*othervectoriter); } } } std::ostream & operator<<(std::ostream &ost, const IndexedVectors &other) { for (IndexedVectors::indexedvectors_t::const_iterator iter = other.vectors.begin(); iter != other.vectors.end(); ++iter) ost << "(" << iter->first << "," << iter->second << ") "; return ost; } template<> IndexedVectors ZeroInstance() { IndexedVectors returnvalue; return returnvalue; }