/* * Project: MoleCuilder * Description: creates and alters molecular systems * Copyright (C) 2014 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 . */ /* * SphericalPointDistribution_getPoints.cpp * * Created on: Jul 12, 2014 * Author: heber */ // include config.h #ifdef HAVE_CONFIG_H #include #endif #include "CodePatterns/MemDebug.hpp" #include "SphericalPointDistribution.hpp" #include "CodePatterns/Assert.hpp" #include "LinearAlgebra/Vector.hpp" template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<0>() const { Polygon_t polygon; ASSERT( polygon.size() == 0, "SphericalPointDistribution::get<0>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<1>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); ASSERT( polygon.size() == 1, "SphericalPointDistribution::get<1>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<2>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); polygon.push_back( Vector(-Bondlength,0.,0.)); ASSERT( polygon.size() == 2, "SphericalPointDistribution::get<2>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<3>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); polygon.push_back( Vector(-Bondlength*0.5, SQRT_3*0.5,0.)); polygon.push_back( Vector(-Bondlength*0.5, -SQRT_3*0.5,0.)); ASSERT( polygon.size() == 3, "SphericalPointDistribution::get<3>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<4>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); polygon.push_back( Vector(-Bondlength/3.0, Bondlength*2.0*M_SQRT2/3.0,0.)); polygon.push_back( Vector(-Bondlength/3.0, -Bondlength*M_SQRT2/3.0, Bondlength*M_SQRT2/SQRT_3)); polygon.push_back( Vector(-Bondlength/3.0, -Bondlength*M_SQRT2/3.0, -Bondlength*M_SQRT2/SQRT_3)); ASSERT( polygon.size() == 4, "SphericalPointDistribution::get<4>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<5>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); polygon.push_back( Vector(-Bondlength, 0.0, 0.0)); polygon.push_back( Vector(0.0, Bondlength, 0.0)); polygon.push_back( Vector(0.0, -Bondlength*0.5, Bondlength*SQRT_3*0.5)); polygon.push_back( Vector(0.0, -Bondlength*0.5, -Bondlength*SQRT_3*0.5)); ASSERT( polygon.size() == 5, "SphericalPointDistribution::get<5>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<6>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); polygon.push_back( Vector(-Bondlength, 0.0, 0.0)); polygon.push_back( Vector(0.0, Bondlength, 0.0)); polygon.push_back( Vector(0.0, -Bondlength, 0.0)); polygon.push_back( Vector(0.0, 0.0, Bondlength)); polygon.push_back( Vector(0.0, 0.0, -Bondlength)); ASSERT( polygon.size() == 6, "SphericalPointDistribution::get<6>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<7>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); polygon.push_back( Vector(-Bondlength, 0.0, 0.0)); polygon.push_back( Vector(0.0, Bondlength, 0.0)); polygon.push_back( Vector(0.0, Bondlength*cos(M_PI*0.4), Bondlength*sin(M_PI*0.4))); polygon.push_back( Vector(0.0, Bondlength*cos(M_PI*0.8), Bondlength*sin(M_PI*0.8))); polygon.push_back( Vector(0.0, Bondlength*cos(M_PI*1.2), Bondlength*sin(M_PI*1.2))); polygon.push_back( Vector(0.0, Bondlength*cos(M_PI*1.6), Bondlength*sin(M_PI*1.6))); ASSERT( polygon.size() == 7, "SphericalPointDistribution::get<7>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<8>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); polygon.push_back( Vector(-Bondlength, 0.0, 0.0)); polygon.push_back( Vector(-Bondlength/3.0, Bondlength*2.0*M_SQRT2/3.0, 0.0)); polygon.push_back( Vector(-Bondlength/3.0, -Bondlength*M_SQRT2/3.0, Bondlength*M_SQRT2/SQRT_3)); polygon.push_back( Vector(-Bondlength/3.0, -Bondlength*M_SQRT2/3.0, -Bondlength*M_SQRT2/SQRT_3)); polygon.push_back( Vector(Bondlength/3.0, -Bondlength*2.0*M_SQRT2/3.0, 0.0)); polygon.push_back( Vector(Bondlength/3.0, Bondlength*M_SQRT2/3.0, -Bondlength*M_SQRT2/SQRT_3)); polygon.push_back( Vector(Bondlength/3.0, Bondlength*M_SQRT2/3.0, Bondlength*M_SQRT2/SQRT_3)); ASSERT( polygon.size() == 8, "SphericalPointDistribution::get<8>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<9>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); polygon.push_back( Vector(Bondlength*cos(0.4*M_PI), Bondlength*sin(0.4*M_PI), 0.0)); polygon.push_back( Vector(Bondlength*cos(0.4*M_PI), -Bondlength*sin(0.4*M_PI), 0.0)); polygon.push_back( Vector(Bondlength*cos(0.4*M_PI), 0.0, Bondlength*sin(0.4*M_PI))); polygon.push_back( Vector(Bondlength*cos(0.4*M_PI), 0.0, -Bondlength*sin(0.4*M_PI))); polygon.push_back( Vector(Bondlength*cos(0.8*M_PI), Bondlength*sin(0.8*M_PI)*sin(0.25*M_PI), Bondlength*sin(0.8*M_PI)*cos(0.25*M_PI))); polygon.push_back( Vector(Bondlength*cos(0.8*M_PI), Bondlength*sin(0.8*M_PI)*sin(0.75*M_PI), Bondlength*sin(0.8*M_PI)*cos(0.75*M_PI))); polygon.push_back( Vector(Bondlength*cos(0.8*M_PI), Bondlength*sin(0.8*M_PI)*sin(1.25*M_PI), Bondlength*sin(0.8*M_PI)*cos(1.25*M_PI))); polygon.push_back( Vector(Bondlength*cos(0.8*M_PI), Bondlength*sin(0.8*M_PI)*sin(1.75*M_PI), Bondlength*sin(0.8*M_PI)*cos(1.75*M_PI))); ASSERT( polygon.size() == 9, "SphericalPointDistribution::get<9>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<10>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); polygon.push_back( Vector(-Bondlength, 0.0, 0.0)); const double temp_Bondlength = Bondlength*0.5*SQRT_3; polygon.push_back( Vector(temp_Bondlength/SQRT_3, temp_Bondlength, 0.0)); polygon.push_back( Vector(temp_Bondlength/SQRT_3, -temp_Bondlength, 0.0)); polygon.push_back( Vector(temp_Bondlength/SQRT_3, 0.0, temp_Bondlength)); polygon.push_back( Vector(temp_Bondlength/SQRT_3, 0.0, -temp_Bondlength)); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, temp_Bondlength*sin(0.25*M_PI), temp_Bondlength*cos(0.25*M_PI))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, temp_Bondlength*sin(0.75*M_PI), temp_Bondlength*cos(0.75*M_PI))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, temp_Bondlength*sin(1.25*M_PI), temp_Bondlength*cos(1.25*M_PI))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, temp_Bondlength*sin(1.75*M_PI), temp_Bondlength*cos(1.75*M_PI))); ASSERT( polygon.size() == 10, "SphericalPointDistribution::get<10>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<11>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); { const double temp_Bondlength = Bondlength*sin(0.4*M_PI); polygon.push_back( Vector(Bondlength*cos(0.4*M_PI), temp_Bondlength, 0.0)); polygon.push_back( Vector(Bondlength*cos(0.4*M_PI), temp_Bondlength*cos(0.4*M_PI), temp_Bondlength*sin(0.4*M_PI))); polygon.push_back( Vector(Bondlength*cos(0.4*M_PI), temp_Bondlength*cos(0.8*M_PI), temp_Bondlength*sin(0.8*M_PI))); polygon.push_back( Vector(Bondlength*cos(0.4*M_PI), temp_Bondlength*cos(1.2*M_PI), temp_Bondlength*sin(1.2*M_PI))); polygon.push_back( Vector(Bondlength*cos(0.4*M_PI), temp_Bondlength*cos(1.6*M_PI), temp_Bondlength*sin(1.6*M_PI))); } { const double temp_Bondlength = Bondlength*sin(0.8*M_PI); polygon.push_back( Vector(Bondlength*cos(0.8*M_PI), temp_Bondlength*cos(0.2*M_PI), temp_Bondlength*sin(0.2*M_PI))); polygon.push_back( Vector(Bondlength*cos(0.8*M_PI), temp_Bondlength*cos(0.6*M_PI), temp_Bondlength*sin(0.6*M_PI))); polygon.push_back( Vector(Bondlength*cos(0.8*M_PI), temp_Bondlength*cos(1.0*M_PI), temp_Bondlength*sin(1.0*M_PI))); polygon.push_back( Vector(Bondlength*cos(0.8*M_PI), temp_Bondlength*cos(1.4*M_PI), temp_Bondlength*sin(1.4*M_PI))); polygon.push_back( Vector(Bondlength*cos(0.8*M_PI), temp_Bondlength*cos(1.8*M_PI), temp_Bondlength*sin(1.8*M_PI))); } ASSERT( polygon.size() == 11, "SphericalPointDistribution::get<11>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<12>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); polygon.push_back( Vector(-Bondlength, 0.0, 0.0)); const double temp_Bondlength = Bondlength*0.5*SQRT_3; polygon.push_back( Vector(temp_Bondlength/SQRT_3, temp_Bondlength, 0.0)); polygon.push_back( Vector(temp_Bondlength/SQRT_3, temp_Bondlength*cos(0.4*M_PI), temp_Bondlength*sin(0.4*M_PI))); polygon.push_back( Vector(temp_Bondlength/SQRT_3, temp_Bondlength*cos(0.8*M_PI), temp_Bondlength*sin(0.8*M_PI))); polygon.push_back( Vector(temp_Bondlength/SQRT_3, temp_Bondlength*cos(1.2*M_PI), temp_Bondlength*sin(1.2*M_PI))); polygon.push_back( Vector(temp_Bondlength/SQRT_3, temp_Bondlength*cos(1.6*M_PI), temp_Bondlength*sin(1.6*M_PI))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, -temp_Bondlength, 0.0)); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, -temp_Bondlength*cos(0.4*M_PI), -temp_Bondlength*sin(0.4*M_PI))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, -temp_Bondlength*cos(0.8*M_PI), -temp_Bondlength*sin(0.8*M_PI))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, -temp_Bondlength*cos(1.2*M_PI), -temp_Bondlength*sin(1.2*M_PI))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, -temp_Bondlength*cos(1.6*M_PI), -temp_Bondlength*sin(1.6*M_PI))); ASSERT( polygon.size() == 12, "SphericalPointDistribution::get<12>() - polygon has wrong size."); return polygon; } template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<14>() const { Polygon_t polygon; polygon.push_back( Vector(Bondlength,0.,0.)); polygon.push_back( Vector(-Bondlength, 0.0, 0.0)); const double temp_Bondlength = Bondlength*0.5*SQRT_3; polygon.push_back( Vector(temp_Bondlength/SQRT_3, temp_Bondlength, 0.0)); polygon.push_back( Vector(temp_Bondlength/SQRT_3, temp_Bondlength*cos(M_PI/3.0), temp_Bondlength*sin(M_PI/3.0))); polygon.push_back( Vector(temp_Bondlength/SQRT_3, temp_Bondlength*cos(2.0*M_PI/3.0), temp_Bondlength*sin(2.0*M_PI/3.0))); polygon.push_back( Vector(temp_Bondlength/SQRT_3, -temp_Bondlength, 0.0)); polygon.push_back( Vector(temp_Bondlength/SQRT_3, temp_Bondlength*cos(4.0*M_PI/3.0), temp_Bondlength*sin(4.0*M_PI/3.0))); polygon.push_back( Vector(temp_Bondlength/SQRT_3, temp_Bondlength*cos(5.0*M_PI/3.0), temp_Bondlength*sin(5.0*M_PI/3.0))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, temp_Bondlength*cos(M_PI/6.0), temp_Bondlength*sin(M_PI/6.0))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, temp_Bondlength*cos(M_PI/3.0 +M_PI/6.0), temp_Bondlength*sin(M_PI/3.0+M_PI/6.0))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, temp_Bondlength*cos(2.0*M_PI/3.0 +M_PI/6.0), temp_Bondlength*sin(2.0*M_PI/3.0 +M_PI/6.0))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, temp_Bondlength*cos(3.0*M_PI/3.0 +M_PI/6.0), temp_Bondlength*sin(3.0*M_PI/3.0 +M_PI/6.0))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, temp_Bondlength*cos(4.0*M_PI/3.0 +M_PI/6.0), temp_Bondlength*sin(4.0*M_PI/3.0 +M_PI/6.0))); polygon.push_back( Vector(-temp_Bondlength/SQRT_3, temp_Bondlength*cos(5.0*M_PI/3.0 +M_PI/6.0), temp_Bondlength*sin(5.0*M_PI/3.0 +M_PI/6.0))); ASSERT( polygon.size() == 14, "SphericalPointDistribution::get<14>() - polygon has wrong size."); return polygon; }