source: src/Dynamics/unittests/BondVectorsUnitTest.cpp@ c1c6cb

AutomationFragmentation_failures Candidate_v1.6.1 ChemicalSpaceEvaluator Exclude_Hydrogens_annealWithBondGraph ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_contraction-expansion Gui_displays_atomic_force_velocity PythonUI_with_named_parameters StoppableMakroAction TremoloParser_IncreasedPrecision
Last change on this file since c1c6cb was c1c6cb, checked in by Frederik Heber <frederik.heber@…>, 7 years ago

Added unit tests for BondVectors.

  • Added tests on up-to-date internal map and calculating weights.
  • Property mode set to 100644
File size: 8.5 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2017 Frederik Heber. All rights reserved.
5 *
6 *
7 * This file is part of MoleCuilder.
8 *
9 * MoleCuilder is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * MoleCuilder is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23/*
24 * BondVectorsUnitTest.cpp
25 *
26 * Created on: Jun 29, 2017
27 * Author: heber
28 */
29
30// include config.h
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34
35#include <cppunit/CompilerOutputter.h>
36#include <cppunit/extensions/TestFactoryRegistry.h>
37#include <cppunit/ui/text/TestRunner.h>
38
39#include "CodePatterns/Assert.hpp"
40#include "CodePatterns/Log.hpp"
41
42#include <boost/assign.hpp>
43
44#include "BondVectorsUnitTest.hpp"
45
46#include "Atom/atom.hpp"
47#include "Bond/bond.hpp"
48#include "Dynamics/BondVectors.hpp"
49#include "Element/periodentafel.hpp"
50#include "World.hpp"
51#include "WorldTime.hpp"
52
53#ifdef HAVE_TESTRUNNER
54#include "UnitTestMain.hpp"
55#endif /*HAVE_TESTRUNNER*/
56
57using namespace boost::assign;
58
59/********************************************** Test classes **************************************/
60
61// Registers the fixture into the 'registry'
62CPPUNIT_TEST_SUITE_REGISTRATION( BondVectorsTest );
63
64
65void BondVectorsTest::setUp()
66{
67 // failing asserts should be thrown
68 ASSERT_DO(Assert::Throw);
69
70 // create an atom
71 carbon = World::getInstance().getPeriode()->FindElement(6);
72 CPPUNIT_ASSERT(carbon != NULL);
73
74 _atom = World::getInstance().createAtom();
75 _atom->setType(carbon);
76 _atom->setPosition( zeroVec );
77 atoms.push_back(_atom);
78 _atom = World::getInstance().createAtom();
79 _atom->setType(carbon);
80 _atom->setPosition( Vector(1.6,0.,0.) );
81 atoms.push_back(_atom);
82 _atom = World::getInstance().createAtom();
83 _atom->setType(carbon);
84 _atom->setPosition( Vector(3.2,0.,0.) );
85 atoms.push_back(_atom);
86 _atom = World::getInstance().createAtom();
87 _atom->setType(carbon);
88 _atom->setPosition( Vector(1.6,1.6,0.) );
89 atoms.push_back(_atom);
90 _atom = World::getInstance().createAtom();
91 _atom->setType(carbon);
92 _atom->setPosition( Vector(2.8,2.8,0.) );
93 atoms.push_back(_atom);
94 _atom = World::getInstance().createAtom();
95 _atom->setType(carbon);
96 _atom->setPosition( Vector(1.6,-1.6,0.) );
97 atoms.push_back(_atom);
98 _atom = World::getInstance().createAtom();
99 _atom->setType(carbon);
100 _atom->setPosition( Vector(2.8,-1.2,0.) );
101 atoms.push_back(_atom);
102
103 bv = new BondVectors;
104}
105
106static void clearbondvector(
107 std::vector<bond::ptr> &_bondvector)
108{
109 // remove bonds
110 for (std::vector<bond::ptr>::iterator iter = _bondvector.begin();
111 !_bondvector.empty(); iter = _bondvector.begin()) {
112 (*iter)->leftatom->removeBond((*iter)->rightatom);
113 _bondvector.erase(iter);
114 }
115}
116
117
118void BondVectorsTest::tearDown()
119{
120 delete bv;
121
122 atoms.clear();
123 atomvector.clear();
124 clearbondvector(bondvector);
125 carbon = NULL;
126
127 World::purgeInstance();
128 WorldTime::purgeInstance();
129}
130
131/** Test whether current_mapped is kept up-to-date
132 *
133 */
134void BondVectorsTest::current_mappedTest()
135{
136 {
137 // gather atoms
138 atomvector += atoms[center], atoms[left];
139 // create bonds
140 bondvector += atoms[center]->addBond(atoms[left]);
141 // prepare bondvectors
142 bv->setFromAtomRange< std::vector<atom *> >(atomvector.begin(), atomvector.end(), WorldTime::getTime());
143 // get bond vectors
144 const std::vector<Vector> Bondvectors =
145 bv->getAtomsBondVectorsAtStep(*atoms[center], WorldTime::getTime());
146 // check number of bond vectors
147 CPPUNIT_ASSERT_EQUAL( Bondvectors.size(), (size_t)1 );
148 // check norm of bond vector
149 CPPUNIT_ASSERT( fabs(Bondvectors[0].Norm() - 1.) < MYEPSILON );
150
151 // clear set of atoms and use a different one
152 clearbondvector(bondvector);
153 atomvector.clear();
154 }
155
156 {
157 // gather atoms
158 atomvector += atoms[center], atoms[left], atoms[right], atoms[top];
159 // create bonds
160 bondvector +=
161 atoms[center]->addBond(atoms[left]),
162 atoms[center]->addBond(atoms[right]),
163 atoms[center]->addBond(atoms[top]);
164 // prepare bondvectors
165 bv->setFromAtomRange< std::vector<atom *> >(atomvector.begin(), atomvector.end(), WorldTime::getTime());
166 // get bond vectors
167 const std::vector<Vector> Bondvectors =
168 bv->getAtomsBondVectorsAtStep(*atoms[center], WorldTime::getTime());
169 // check number of bond vectors
170 CPPUNIT_ASSERT_EQUAL( Bondvectors.size(), (size_t)3 );
171 // check norm of bond vector
172 for (size_t i=0;i<3;++i)
173 CPPUNIT_ASSERT( fabs(Bondvectors[i].Norm() - 1.) < MYEPSILON );
174 }
175}
176
177/** Test whether calculating weights works on single bond
178 *
179 */
180void BondVectorsTest::weights_singlebondTest()
181{
182 // gather atoms
183 atomvector += atoms[center], atoms[left];
184 // create bonds
185 bondvector += atoms[center]->addBond(atoms[left]);
186 // prepare bondvectors
187 bv->setFromAtomRange< std::vector<atom *> >(atomvector.begin(), atomvector.end(), WorldTime::getTime());
188 // calculate weights
189 BondVectors::weights_t weights = bv->getWeightsForAtomAtStep(*atoms[center], WorldTime::getTime());
190 LOG(2, "DEBUG: Single bond weights are " << weights);
191 // check number of weights
192 CPPUNIT_ASSERT_EQUAL( weights.size(), (size_t)1 );
193 // check sum of weights
194 const double weight_sum = std::accumulate(weights.begin(), weights.end(), 0.);
195 CPPUNIT_ASSERT( fabs(weight_sum - 1.) < MYEPSILON );
196 // check weight
197 CPPUNIT_ASSERT_EQUAL( weights[0], 1. );
198}
199
200/** Test whether calculating weights works on linear chain config
201 *
202 */
203void BondVectorsTest::weights_linearchainTest()
204{
205 // gather atoms
206 atomvector += atoms[center], atoms[left], atoms[right];
207 // create bonds
208 bondvector += atoms[center]->addBond(atoms[left]), atoms[center]->addBond(atoms[right]);
209 // prepare bondvectors
210 bv->setFromAtomRange< std::vector<atom *> >(atomvector.begin(), atomvector.end(), WorldTime::getTime());
211 // calculate weights
212 BondVectors::weights_t weights = bv->getWeightsForAtomAtStep(*atoms[center], WorldTime::getTime());
213 LOG(2, "DEBUG: Linear chain weights are " << weights);
214 // check number of weights
215 CPPUNIT_ASSERT_EQUAL( weights.size(), (size_t)2 );
216 // check sum of weights
217 const double weight_sum = std::accumulate(weights.begin(), weights.end(), 0.);
218 CPPUNIT_ASSERT( fabs(weight_sum - 1.) < 1e-10 );
219}
220
221/** Test whether calculating weights works on right angle config
222 *
223 */
224void BondVectorsTest::weights_rightangleTest()
225{
226 // gather atoms
227 atomvector += atoms[center], atoms[left], atoms[top];
228 // create bonds
229 bondvector +=
230 atoms[center]->addBond(atoms[left]),
231 atoms[center]->addBond(atoms[top]);
232 // prepare bondvectors
233 bv->setFromAtomRange< std::vector<atom *> >(atomvector.begin(), atomvector.end(), WorldTime::getTime());
234 // calculate weights
235 BondVectors::weights_t weights = bv->getWeightsForAtomAtStep(*atoms[center], WorldTime::getTime());
236 LOG(2, "DEBUG: Right angle weights are " << weights);
237 // check number of weights
238 CPPUNIT_ASSERT_EQUAL( weights.size(), (size_t)2 );
239 // check sum of weights: two independent vectors == 1+1
240 const double weight_sum = std::accumulate(weights.begin(), weights.end(), 0.);
241 CPPUNIT_ASSERT( fabs(weight_sum - 2.) < 1e-10 );
242}
243
244/** Test whether calculating weights works on triangle config
245 *
246 */
247void BondVectorsTest::weights_triangleTest()
248{
249 // gather atoms
250 atomvector += atoms[center], atoms[left], atoms[right], atoms[top];
251 // create bonds
252 bondvector +=
253 atoms[center]->addBond(atoms[left]),
254 atoms[center]->addBond(atoms[right]),
255 atoms[center]->addBond(atoms[top]);
256 // prepare bondvectors
257 bv->setFromAtomRange< std::vector<atom *> >(atomvector.begin(), atomvector.end(), WorldTime::getTime());
258 // calculate weights
259 BondVectors::weights_t weights = bv->getWeightsForAtomAtStep(*atoms[center], WorldTime::getTime());
260 LOG(2, "DEBUG: triangle weights are " << weights);
261 // check number of weights
262 CPPUNIT_ASSERT_EQUAL( weights.size(), (size_t)3 );
263 // check sum of weights: one linear independent, two dependent vectors = 1 + 2*0.5
264 const double weight_sum = std::accumulate(weights.begin(), weights.end(), 0.);
265 CPPUNIT_ASSERT( fabs(weight_sum - 2.) < 1e-10 );
266}
Note: See TracBrowser for help on using the repository browser.