root/src/misc/test/unit/meshlessadaptertest.h @ 185:33ee25e05181

Revision 185:33ee25e05181, 4.7 KB (checked in by Andreas Schaefer <gentryx@…>, 14 months ago)

stripped FixedCoord? from out of place ID

Line 
1#include <cxxtest/TestSuite.h>
2#include "../../meshlessadapter.h"
3#include "../../testhelper.h"
4
5using namespace LibGeoDecomp; 
6
7namespace LibGeoDecomp {
8
9class MeshlessAdapterTest : public CxxTest::TestSuite
10{
11public:
12
13    void test1d()
14    {
15        typedef MeshlessAdapter<Topologies::Torus<2>::Topology> MyAdapter;
16
17        FloatCoord<2> dim(6.5, 1);
18        double boxSize = 2;
19        MyAdapter adapter(dim, boxSize);
20
21        // test posToCoord()
22        Coord<2> actual;
23        actual = adapter.posToCoord(FloatCoord<2>(0.5, 0.5));
24        TS_ASSERT_EQUALS(Coord<2>(0, 0), actual);
25        actual = adapter.posToCoord(FloatCoord<2>(1.5, 0.5));
26        TS_ASSERT_EQUALS(Coord<2>(0, 0), actual);
27        actual = adapter.posToCoord(FloatCoord<2>(2.5, 0.5));
28        TS_ASSERT_EQUALS(Coord<2>(1, 0), actual);
29        actual = adapter.posToCoord(FloatCoord<2>(5.5, 0.5));
30        TS_ASSERT_EQUALS(Coord<2>(2, 0), actual);
31        actual = adapter.posToCoord(FloatCoord<2>(6.1, 0.5));
32        TS_ASSERT_EQUALS(Coord<2>(2, 0), actual);
33       
34        // test distance2()
35        double dist;
36        FloatCoord<2> pos1(0.5, 0.5);
37        FloatCoord<2> pos2(2.1, 0.5);
38        dist = adapter.distance2(pos1, pos2);
39        TS_ASSERT_EQUALS_DOUBLE(2.56, dist);
40
41        FloatCoord<2> pos3(6.0, 0.5);
42        dist = adapter.distance2(pos1, pos3);
43        TS_ASSERT_EQUALS_DOUBLE(1.0, dist);
44
45        FloatCoord<2> pos4(1.0, 0.1);
46        FloatCoord<2> pos5(1.0, 0.9);
47        dist = adapter.distance2(pos4, pos5);
48        TS_ASSERT_EQUALS_DOUBLE(0.04, dist);
49
50        // manhattanDistance()
51        int distNY;
52        distNY = adapter.manhattanDistance(FloatCoord<2>(0.2, 0.4), 
53                                           FloatCoord<2>(1.8, 0.9));
54        TS_ASSERT_EQUALS(distNY, 0);
55        distNY = adapter.manhattanDistance(FloatCoord<2>(0.2, 0.4), 
56                                           FloatCoord<2>(2.1, 0.9));
57        TS_ASSERT_EQUALS(distNY, 1);
58        distNY = adapter.manhattanDistance(FloatCoord<2>(0.2, 0.4), 
59                                           FloatCoord<2>(6.1, 0.9));
60        TS_ASSERT_EQUALS(distNY, 1);
61
62        // test grid(), insert() and search()
63        MyAdapter::CoordListGrid grid = adapter.grid();
64        TS_ASSERT_EQUALS(Coord<2>(3, 1), grid.getDimensions());
65
66        for (int i = 0; i < 6; ++i) 
67            adapter.insert(&grid, FloatCoord<2>(i + 0.5, 0.5), i);
68
69        std::set<int> coords;
70        std::set<int> expected;
71        expected.insert(0);
72        expected.insert(1);
73        expected.insert(2);
74        expected.insert(3);
75        bool res = adapter.search(grid, FloatCoord<2>(2.1, 0.5), &coords);
76        TS_ASSERT_EQUALS(true, res);
77        TS_ASSERT_EQUALS(expected, coords);
78    }
79
80    void test1dCube()
81    {
82        typedef MeshlessAdapter<Topologies::Cube<2>::Topology> MyAdapter;
83
84        FloatCoord<2> dim(6.5, 1);
85        double boxSize = 2;
86        MyAdapter adapter(dim, boxSize);
87
88        double dist;
89        FloatCoord<2> pos1(0.5, 0.5);
90        FloatCoord<2> pos2(6.0, 0.5);
91        dist = adapter.distance2(pos1, pos2);
92        TS_ASSERT_EQUALS_DOUBLE(5.5 * 5.5, dist);
93
94        FloatCoord<2> pos3(1.0, 0.1);
95        FloatCoord<2> pos4(1.0, 0.9);
96        dist = adapter.distance2(pos3, pos4);
97        TS_ASSERT_EQUALS_DOUBLE(0.8 * 0.8, dist);
98
99        // manhattanDistance()
100        int distNY;
101        distNY = adapter.manhattanDistance(FloatCoord<2>(0.2, 0.4), 
102                                           FloatCoord<2>(1.8, 0.9));
103        TS_ASSERT_EQUALS(distNY, 0);
104        distNY = adapter.manhattanDistance(FloatCoord<2>(0.2, 0.4), 
105                                           FloatCoord<2>(2.1, 0.9));
106        TS_ASSERT_EQUALS(distNY, 1);
107        distNY = adapter.manhattanDistance(FloatCoord<2>(0.2, 0.4), 
108                                           FloatCoord<2>(6.1, 0.9));
109        TS_ASSERT_EQUALS(distNY, 2);
110
111       
112    }
113
114    void testBoxSizeDetermination()
115    {
116        typedef MeshlessAdapter<Topologies::Torus<2>::Topology> MyAdapter;
117
118        int width = 20;
119        FloatCoord<2> dim(width * 0.5, 1);
120        double boxSize = 0.5;
121        MyAdapter adapter(dim, boxSize);
122
123        MyAdapter::CoordVec positions;
124        MyAdapter::Graph graph;
125        for (int i = 0; i < width; ++i) {
126            positions.push_back(std::make_pair(FloatCoord<2>(i * 0.5, 0.5), i));
127            SuperVector<int> neighbors;
128            neighbors << ((i + width - 1) % width)
129                      << ((i + width + 1) % width);
130            graph << neighbors;
131        }
132
133        TS_ASSERT(adapter.checkBoxSize(positions, graph));
134        TS_ASSERT_EQUALS_DOUBLE(0.5, adapter.findOptimumBoxSize(positions, graph));
135
136        adapter.resetBoxSize(0.47);
137        TS_ASSERT_EQUALS_DOUBLE(0.5, adapter.findOptimumBoxSize(positions, graph));
138    }
139};
140
141}
Note: See TracBrowser for help on using the browser.