/*
* Project: MoleCuilder
* Description: creates and alters molecular systems
* Copyright (C) 2016 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 .
*/
/*
* detail.cpp
*
* Created on: Jun 12, 2016
* Author: heber
*/
// include config.h
#ifdef HAVE_CONFIG_H
#include
#endif
#include "CodePatterns/MemDebug.hpp"
#include "Fragmentation/Summation/SetValues/detail.hpp"
#include "CodePatterns/Assert.hpp"
namespace detail {
// static member variables
const size_t force::FixedSize = 3;
const force::vector_t force::nullvector( force::FixedSize, 0.);
force::force(const vector_t &_components) :
std::vector(_components)
{
ASSERT( _components.size() == FixedSize,
"force::force() - we do not have "+toString(FixedSize)
+" in given components "+toString(_components));
}
force::force(const double &_c1, const double &_c2, const double &_c3) :
std::vector(FixedSize, 0.)
{
operator[](0) = _c1;
operator[](1) = _c2;
operator[](2) = _c3;
}
force& force::operator()(const double &_c1, const double &_c2, const double &_c3)
{
operator[](0) = _c1;
operator[](1) = _c2;
operator[](2) = _c3;
return *this;
}
force& force::operator()(const vector_t &_components)
{
ASSERT( _components.size() == FixedSize,
"force::operator() - we do not have "+toString(FixedSize)
+" in given components "+toString(_components));
static_cast(*this) = _components;
return *this;
}
force& force::operator+=(const vector_t &_components)
{
ASSERT( _components.size() == FixedSize,
"force::operator+=() - we do not have "+toString(FixedSize)
+" in given components "+toString(_components));
operator[](0) += _components[0];
operator[](1) += _components[1];
operator[](2) += _components[2];
return *this;
}
force& force::operator-=(const vector_t &_components)
{
ASSERT( _components.size() == FixedSize,
"force::operator-=() - we do not have "+toString(FixedSize)
+" in given components "+toString(_components));
operator[](0) -= _components[0];
operator[](1) -= _components[1];
operator[](2) -= _components[2];
return *this;
}
void force::superposeOtherIndexedVectors(const force &other, const double prefactor)
{
ASSERT( other.size() == FixedSize,
"force::superposeOtherIndexedVectors() - vector to other instance has size "
+toString(other.size())+" different to FixedSize "
+toString(FixedSize)+".");
vector_t::iterator vectoriter = begin();
vector_t::const_iterator othervectoriter = other.begin();
for (;vectoriter != end(); ++vectoriter, ++othervectoriter) {
*vectoriter += prefactor * (*othervectoriter);
}
}
}; /* end namespace detail */