| [c889b7] | 1 | /* | 
|---|
|  | 2 | * Project: MoleCuilder | 
|---|
|  | 3 | * Description: creates and alters molecular systems | 
|---|
|  | 4 | * Copyright (C)  2012 University of Bonn. All rights reserved. | 
|---|
| [5aaa43] | 5 | * Copyright (C)  2013 Frederik Heber. All rights reserved. | 
|---|
| [c889b7] | 6 | * | 
|---|
|  | 7 | * | 
|---|
|  | 8 | *   This file is part of MoleCuilder. | 
|---|
|  | 9 | * | 
|---|
|  | 10 | *    MoleCuilder is free software: you can redistribute it and/or modify | 
|---|
|  | 11 | *    it under the terms of the GNU General Public License as published by | 
|---|
|  | 12 | *    the Free Software Foundation, either version 2 of the License, or | 
|---|
|  | 13 | *    (at your option) any later version. | 
|---|
|  | 14 | * | 
|---|
|  | 15 | *    MoleCuilder is distributed in the hope that it will be useful, | 
|---|
|  | 16 | *    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
|  | 17 | *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
|  | 18 | *    GNU General Public License for more details. | 
|---|
|  | 19 | * | 
|---|
|  | 20 | *    You should have received a copy of the GNU General Public License | 
|---|
|  | 21 | *    along with MoleCuilder.  If not, see <http://www.gnu.org/licenses/>. | 
|---|
|  | 22 | */ | 
|---|
|  | 23 |  | 
|---|
|  | 24 | /* | 
|---|
|  | 25 | * SamplingGridUnitTest.cpp | 
|---|
|  | 26 | * | 
|---|
|  | 27 | *  Created on: Jul 29, 2012 | 
|---|
|  | 28 | *      Author: heber | 
|---|
|  | 29 | */ | 
|---|
|  | 30 |  | 
|---|
|  | 31 | // include config.h | 
|---|
|  | 32 | #ifdef HAVE_CONFIG_H | 
|---|
|  | 33 | #include <config.h> | 
|---|
|  | 34 | #endif | 
|---|
|  | 35 |  | 
|---|
|  | 36 | using namespace std; | 
|---|
|  | 37 |  | 
|---|
|  | 38 | #include <cppunit/CompilerOutputter.h> | 
|---|
|  | 39 | #include <cppunit/extensions/TestFactoryRegistry.h> | 
|---|
|  | 40 | #include <cppunit/ui/text/TestRunner.h> | 
|---|
|  | 41 |  | 
|---|
| [955051] | 42 | // include headers that implement a archive in simple text format | 
|---|
|  | 43 | #include <boost/archive/text_oarchive.hpp> | 
|---|
|  | 44 | #include <boost/archive/text_iarchive.hpp> | 
|---|
|  | 45 |  | 
|---|
| [c889b7] | 46 | #include "SamplingGridUnitTest.hpp" | 
|---|
|  | 47 |  | 
|---|
|  | 48 | #include "CodePatterns/Assert.hpp" | 
|---|
| [91e7658] | 49 | #include "CodePatterns/Log.hpp" | 
|---|
| [c889b7] | 50 |  | 
|---|
|  | 51 | #include <boost/assign.hpp> | 
|---|
| [06653a] | 52 |  | 
|---|
| [c6355f] | 53 | #include <cmath> | 
|---|
|  | 54 | #include <numeric> | 
|---|
| [c889b7] | 55 |  | 
|---|
|  | 56 | #ifdef HAVE_TESTRUNNER | 
|---|
|  | 57 | #include "UnitTestMain.hpp" | 
|---|
|  | 58 | #endif /*HAVE_TESTRUNNER*/ | 
|---|
|  | 59 |  | 
|---|
|  | 60 | using namespace boost::assign; | 
|---|
|  | 61 |  | 
|---|
|  | 62 | /********************************************** Test classes **************************************/ | 
|---|
|  | 63 |  | 
|---|
|  | 64 | const double grid_value=1.; | 
|---|
|  | 65 |  | 
|---|
| [5b1e5e] | 66 | #define NUMBEROFSAMPLES(n) (size_t)(pow(pow(2,n),(int)NDIM)) | 
|---|
|  | 67 | #define DOMAINVOLUME(l) (size_t)pow(l,(int)NDIM) | 
|---|
| [3d9a8d] | 68 |  | 
|---|
| [c889b7] | 69 | // Registers the fixture into the 'registry' | 
|---|
|  | 70 | CPPUNIT_TEST_SUITE_REGISTRATION( SamplingGridTest ); | 
|---|
|  | 71 |  | 
|---|
|  | 72 |  | 
|---|
|  | 73 | void SamplingGridTest::setUp() | 
|---|
|  | 74 | { | 
|---|
|  | 75 | // failing asserts should be thrown | 
|---|
|  | 76 | ASSERT_DO(Assert::Throw); | 
|---|
|  | 77 |  | 
|---|
|  | 78 | // create the grid | 
|---|
| [5b1e5e] | 79 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
|  | 80 | const double end[NDIM] = { 1., 1., 1. }; | 
|---|
| [c6355f] | 81 | for (size_t i=0; i< DOMAINVOLUME(1)*NUMBEROFSAMPLES(2); ++i) | 
|---|
| [c889b7] | 82 | values += grid_value; | 
|---|
| [3d9a8d] | 83 | grid = new SamplingGrid(begin, end, 2, values); | 
|---|
| [c889b7] | 84 | CPPUNIT_ASSERT_EQUAL( grid_value, *(grid->sampled_grid.begin()) ); | 
|---|
|  | 85 | } | 
|---|
|  | 86 |  | 
|---|
|  | 87 |  | 
|---|
|  | 88 | void SamplingGridTest::tearDown() | 
|---|
|  | 89 | { | 
|---|
|  | 90 | delete grid; | 
|---|
|  | 91 | } | 
|---|
|  | 92 |  | 
|---|
| [cb30d9] | 93 | /** UnitTest on equivalent combination of props and values | 
|---|
| [c889b7] | 94 | */ | 
|---|
| [cb30d9] | 95 | void SamplingGridTest::equivalentGrids_Test() | 
|---|
| [c889b7] | 96 | { | 
|---|
|  | 97 | // check illegal grid | 
|---|
| [5b1e5e] | 98 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
| [cb30d9] | 99 | const double end[NDIM] = { 1., 1., 1. }; | 
|---|
| [c6355f] | 100 | SamplingGridProperties illegal_props(begin, end, 5); | 
|---|
| [1a00bb] | 101 | SamplingGridProperties legal_props(begin, end, 2); | 
|---|
| [cb30d9] | 102 | CPPUNIT_ASSERT( !grid->isEquivalent(illegal_props) ); | 
|---|
|  | 103 | CPPUNIT_ASSERT( grid->isEquivalent(legal_props) ); | 
|---|
|  | 104 | SamplingGrid::sampledvalues_t illegal_values; | 
|---|
|  | 105 | for (size_t i=0; i< NUMBEROFSAMPLES(1); ++i) | 
|---|
|  | 106 | illegal_values += 1.5; | 
|---|
|  | 107 | SamplingGrid::sampledvalues_t legal_values; | 
|---|
|  | 108 | for (size_t i=0; i< NUMBEROFSAMPLES(2); ++i) | 
|---|
|  | 109 | legal_values += 1.5; | 
|---|
|  | 110 | #ifndef NDEBUG | 
|---|
|  | 111 | // throws because props and size of illegal_values don't match | 
|---|
|  | 112 | std::cout << "The following assertion is intended and does not indicate a failure of the test." << std::endl; | 
|---|
|  | 113 | CPPUNIT_ASSERT_THROW( SamplingGrid illegal_grid(illegal_props, illegal_values), Assert::AssertionFailure ); | 
|---|
|  | 114 | std::cout << "The following assertion is intended and does not indicate a failure of the test." << std::endl; | 
|---|
|  | 115 | CPPUNIT_ASSERT_THROW( SamplingGrid illegal_grid(legal_props, illegal_values), Assert::AssertionFailure ); | 
|---|
|  | 116 | std::cout << "The following assertion is intended and does not indicate a failure of the test." << std::endl; | 
|---|
|  | 117 | CPPUNIT_ASSERT_THROW( SamplingGrid illegal_grid(illegal_props, legal_values), Assert::AssertionFailure ); | 
|---|
|  | 118 | #endif | 
|---|
|  | 119 | // check that grid is still the same | 
|---|
|  | 120 | for (SamplingGrid::sampledvalues_t::const_iterator iter = grid->sampled_grid.begin(); | 
|---|
|  | 121 | iter != grid->sampled_grid.end(); ++iter) | 
|---|
|  | 122 | CPPUNIT_ASSERT_EQUAL( grid_value, *iter ); | 
|---|
|  | 123 | } | 
|---|
|  | 124 |  | 
|---|
|  | 125 | /** UnitTest on compatible combination of props and values | 
|---|
|  | 126 | */ | 
|---|
|  | 127 | void SamplingGridTest::compatibleGrids_Test() | 
|---|
|  | 128 | { | 
|---|
|  | 129 | // check illegal grid | 
|---|
|  | 130 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
|  | 131 | const double end[NDIM] = { 1., 1., 1. }; | 
|---|
|  | 132 | const double otherend[NDIM] = { 2.5, 2.5, 2.5 }; | 
|---|
|  | 133 | SamplingGridProperties illegal_props(begin, otherend, 5); | 
|---|
|  | 134 | SamplingGridProperties legal_props(begin, end, 3); | 
|---|
| [c889b7] | 135 | CPPUNIT_ASSERT( !grid->isCompatible(illegal_props) ); | 
|---|
| [1a00bb] | 136 | CPPUNIT_ASSERT( grid->isCompatible(legal_props) ); | 
|---|
| [c889b7] | 137 | SamplingGrid::sampledvalues_t illegal_values; | 
|---|
|  | 138 | for (size_t i=0; i< NUMBEROFSAMPLES(1); ++i) | 
|---|
|  | 139 | illegal_values += 1.5; | 
|---|
| [1a00bb] | 140 | SamplingGrid::sampledvalues_t legal_values; | 
|---|
|  | 141 | for (size_t i=0; i< NUMBEROFSAMPLES(2); ++i) | 
|---|
| [c6355f] | 142 | legal_values += 1.5; | 
|---|
| [c889b7] | 143 | #ifndef NDEBUG | 
|---|
| [1a00bb] | 144 | // throws because props and size of illegal_values don't match | 
|---|
|  | 145 | std::cout << "The following assertion is intended and does not indicate a failure of the test." << std::endl; | 
|---|
|  | 146 | CPPUNIT_ASSERT_THROW( SamplingGrid illegal_grid(illegal_props, illegal_values), Assert::AssertionFailure ); | 
|---|
| [3d9a8d] | 147 | std::cout << "The following assertion is intended and does not indicate a failure of the test." << std::endl; | 
|---|
| [1a00bb] | 148 | CPPUNIT_ASSERT_THROW( SamplingGrid illegal_grid(legal_props, illegal_values), Assert::AssertionFailure ); | 
|---|
|  | 149 | std::cout << "The following assertion is intended and does not indicate a failure of the test." << std::endl; | 
|---|
|  | 150 | CPPUNIT_ASSERT_THROW( SamplingGrid illegal_grid(illegal_props, legal_values), Assert::AssertionFailure ); | 
|---|
| [c889b7] | 151 | #endif | 
|---|
|  | 152 | // check that grid is still the same | 
|---|
|  | 153 | for (SamplingGrid::sampledvalues_t::const_iterator iter = grid->sampled_grid.begin(); | 
|---|
|  | 154 | iter != grid->sampled_grid.end(); ++iter) | 
|---|
|  | 155 | CPPUNIT_ASSERT_EQUAL( grid_value, *iter ); | 
|---|
|  | 156 | } | 
|---|
|  | 157 |  | 
|---|
| [c0e8fb] | 158 | /** UnitTest for isCongruent() | 
|---|
|  | 159 | */ | 
|---|
|  | 160 | void SamplingGridTest::isCongruent_Test() | 
|---|
|  | 161 | { | 
|---|
| [5b1e5e] | 162 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
|  | 163 | const double end[NDIM] = { 2., 2., 2. }; | 
|---|
|  | 164 | const double otherbegin[NDIM] = { 0.1, 0.1, 0.1 }; | 
|---|
|  | 165 | const double otherend[NDIM] = { 1., 1., 1. }; | 
|---|
| [c0e8fb] | 166 | SamplingGridProperties illegal_begin_props(otherbegin, end, 5); | 
|---|
|  | 167 | SamplingGridProperties illegal_end_props(begin, otherend, 5); | 
|---|
|  | 168 | SamplingGridProperties illegal_level_props(begin, end, 5); | 
|---|
|  | 169 | SamplingGridProperties legal_props(begin, end, 2); | 
|---|
|  | 170 |  | 
|---|
|  | 171 | // differing windows | 
|---|
| [5b1e5e] | 172 | //  const double begin_window[NDIM] = { 0.5, 0.5, 0.5 }; | 
|---|
|  | 173 | //  const double end_window[NDIM] = { 1., 1., 1. }; | 
|---|
|  | 174 | const double otherbegin_window[NDIM] = { 0.45, 0.45, 0.45 }; | 
|---|
|  | 175 | const double otherend_window[NDIM] = { 1.05, 1.05, 1.05 }; | 
|---|
| [c0e8fb] | 176 |  | 
|---|
|  | 177 | // check that incompatible grid are also incongruent | 
|---|
|  | 178 | SamplingGrid default_grid(legal_props); | 
|---|
|  | 179 | // note that we always construct a temporary SamplingGrid from given props | 
|---|
| [cb30d9] | 180 | CPPUNIT_ASSERT( default_grid.isEquivalent(illegal_begin_props) == default_grid.isCongruent(illegal_begin_props)); | 
|---|
|  | 181 | CPPUNIT_ASSERT( default_grid.isEquivalent(illegal_end_props) == default_grid.isCongruent(illegal_end_props)); | 
|---|
|  | 182 | CPPUNIT_ASSERT( default_grid.isEquivalent(illegal_level_props) == default_grid.isCongruent(illegal_level_props)); | 
|---|
|  | 183 | CPPUNIT_ASSERT( default_grid.isEquivalent(legal_props) == default_grid.isCongruent(legal_props) ); | 
|---|
| [c0e8fb] | 184 |  | 
|---|
|  | 185 | default_grid.setWindowSize(begin, end); | 
|---|
|  | 186 | // same window | 
|---|
|  | 187 | { | 
|---|
|  | 188 | SamplingGrid illegal_begin_grid(illegal_begin_props); | 
|---|
|  | 189 | SamplingGrid illegal_end_grid(illegal_end_props); | 
|---|
|  | 190 | SamplingGrid illegal_level_grid(illegal_level_props); | 
|---|
|  | 191 | SamplingGrid legal_grid(legal_props); | 
|---|
|  | 192 | illegal_begin_grid.setWindowSize(begin, end); | 
|---|
|  | 193 | illegal_end_grid.setWindowSize(begin, end); | 
|---|
|  | 194 | illegal_level_grid.setWindowSize(begin, end); | 
|---|
|  | 195 | legal_grid.setWindowSize(begin, end); | 
|---|
|  | 196 | CPPUNIT_ASSERT( !illegal_begin_grid.isCongruent(default_grid) ); | 
|---|
|  | 197 | CPPUNIT_ASSERT( !illegal_end_grid.isCongruent(default_grid) ); | 
|---|
|  | 198 | CPPUNIT_ASSERT( !illegal_level_grid.isCongruent(default_grid) ); | 
|---|
|  | 199 | CPPUNIT_ASSERT( legal_grid.isCongruent(default_grid) ); | 
|---|
|  | 200 | } | 
|---|
|  | 201 |  | 
|---|
|  | 202 | // different begin | 
|---|
|  | 203 | { | 
|---|
|  | 204 | SamplingGrid illegal_begin_grid(illegal_begin_props); | 
|---|
|  | 205 | SamplingGrid illegal_end_grid(illegal_end_props); | 
|---|
|  | 206 | SamplingGrid illegal_level_grid(illegal_level_props); | 
|---|
|  | 207 | SamplingGrid legal_grid(legal_props); | 
|---|
|  | 208 | illegal_begin_grid.setWindowSize(otherbegin_window, end); | 
|---|
|  | 209 | illegal_end_grid.setWindowSize(otherbegin_window, end); | 
|---|
|  | 210 | illegal_level_grid.setWindowSize(otherbegin_window, end); | 
|---|
|  | 211 | legal_grid.setWindowSize(begin, end); | 
|---|
|  | 212 | CPPUNIT_ASSERT( !illegal_begin_grid.isCongruent(legal_grid) ); | 
|---|
|  | 213 | CPPUNIT_ASSERT( !illegal_end_grid.isCongruent(legal_grid) ); | 
|---|
|  | 214 | CPPUNIT_ASSERT( !illegal_level_grid.isCongruent(legal_grid) ); | 
|---|
|  | 215 | CPPUNIT_ASSERT( legal_grid.isCongruent(default_grid) ); | 
|---|
|  | 216 | } | 
|---|
|  | 217 |  | 
|---|
|  | 218 | // different end | 
|---|
|  | 219 | { | 
|---|
|  | 220 | SamplingGrid illegal_begin_grid(illegal_begin_props); | 
|---|
|  | 221 | SamplingGrid illegal_end_grid(illegal_end_props); | 
|---|
|  | 222 | SamplingGrid illegal_level_grid(illegal_level_props); | 
|---|
|  | 223 | SamplingGrid legal_grid(legal_props); | 
|---|
|  | 224 | illegal_begin_grid.setWindowSize(begin, otherend_window); | 
|---|
|  | 225 | illegal_end_grid.setWindowSize(begin, otherend_window); | 
|---|
|  | 226 | illegal_level_grid.setWindowSize(begin, otherend_window); | 
|---|
|  | 227 | legal_grid.setWindowSize(begin, end); | 
|---|
|  | 228 | CPPUNIT_ASSERT( !illegal_begin_grid.isCongruent(legal_grid) ); | 
|---|
|  | 229 | CPPUNIT_ASSERT( !illegal_end_grid.isCongruent(legal_grid) ); | 
|---|
|  | 230 | CPPUNIT_ASSERT( !illegal_level_grid.isCongruent(legal_grid) ); | 
|---|
|  | 231 | CPPUNIT_ASSERT( legal_grid.isCongruent(default_grid) ); | 
|---|
|  | 232 | } | 
|---|
|  | 233 |  | 
|---|
|  | 234 | // different begin and end | 
|---|
|  | 235 | { | 
|---|
|  | 236 | SamplingGrid illegal_begin_grid(illegal_begin_props); | 
|---|
|  | 237 | SamplingGrid illegal_end_grid(illegal_end_props); | 
|---|
|  | 238 | SamplingGrid illegal_level_grid(illegal_level_props); | 
|---|
|  | 239 | SamplingGrid legal_grid(legal_props); | 
|---|
|  | 240 | illegal_begin_grid.setWindowSize(otherbegin_window, otherend_window); | 
|---|
|  | 241 | illegal_end_grid.setWindowSize(otherbegin_window, otherend_window); | 
|---|
|  | 242 | illegal_level_grid.setWindowSize(otherbegin_window, otherend_window); | 
|---|
|  | 243 | legal_grid.setWindowSize(begin, end); | 
|---|
|  | 244 | CPPUNIT_ASSERT( !illegal_begin_grid.isCongruent(legal_grid) ); | 
|---|
|  | 245 | CPPUNIT_ASSERT( !illegal_end_grid.isCongruent(legal_grid) ); | 
|---|
|  | 246 | CPPUNIT_ASSERT( !illegal_level_grid.isCongruent(legal_grid) ); | 
|---|
|  | 247 | CPPUNIT_ASSERT( legal_grid.isCongruent(default_grid) ); | 
|---|
|  | 248 | } | 
|---|
|  | 249 | } | 
|---|
|  | 250 |  | 
|---|
| [c6355f] | 251 | /** UnitTest for integral() | 
|---|
|  | 252 | */ | 
|---|
|  | 253 | void SamplingGridTest::integral_Test() | 
|---|
|  | 254 | { | 
|---|
|  | 255 | double sum = 0.; | 
|---|
|  | 256 | sum = std::accumulate( grid->sampled_grid.begin(), grid->sampled_grid.end(), sum ); | 
|---|
|  | 257 | CPPUNIT_ASSERT_EQUAL( sum*grid->getVolume()/grid->getWindowGridPoints(), grid->integral() ); | 
|---|
|  | 258 | } | 
|---|
|  | 259 |  | 
|---|
|  | 260 | /** UnitTest for getVolume() | 
|---|
| [3d9a8d] | 261 | */ | 
|---|
|  | 262 | void SamplingGridTest::getVolume_Test() | 
|---|
|  | 263 | { | 
|---|
|  | 264 | CPPUNIT_ASSERT_EQUAL( 1., grid->getVolume() ); | 
|---|
|  | 265 | } | 
|---|
|  | 266 |  | 
|---|
| [c6355f] | 267 | /** UnitTest for getWindowSize() | 
|---|
| [1a00bb] | 268 | */ | 
|---|
|  | 269 | void SamplingGridTest::getWindowSize_Test() | 
|---|
|  | 270 | { | 
|---|
|  | 271 | // check size of default grid | 
|---|
| [e2404f] | 272 | CPPUNIT_ASSERT_EQUAL( (size_t)(NUMBEROFSAMPLES(grid->level)), grid->getWindowGridPoints() ); | 
|---|
| [1a00bb] | 273 |  | 
|---|
|  | 274 | // create another one and check its size, too | 
|---|
| [5b1e5e] | 275 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
|  | 276 | const double end[NDIM] = { 1., 1., 1. }; | 
|---|
| [1a00bb] | 277 | for (size_t level = 3; level<=6; ++level) { | 
|---|
|  | 278 | values.clear(); | 
|---|
|  | 279 | for (size_t i=0; i< NUMBEROFSAMPLES(level); ++i) | 
|---|
|  | 280 | values += grid_value; | 
|---|
|  | 281 | delete grid; | 
|---|
| [e2404f] | 282 | // use other pointer in case something fails | 
|---|
|  | 283 | SamplingGrid *tmpgrid = new SamplingGrid(begin, end, level, values); | 
|---|
|  | 284 | grid = tmpgrid; | 
|---|
| [1a00bb] | 285 | CPPUNIT_ASSERT_EQUAL( (size_t)NUMBEROFSAMPLES(level), grid->getWindowGridPoints() ); | 
|---|
|  | 286 | } | 
|---|
|  | 287 | } | 
|---|
|  | 288 |  | 
|---|
|  | 289 | /** UnitTest for extendWindow() | 
|---|
|  | 290 | */ | 
|---|
|  | 291 | void SamplingGridTest::extendWindow_Test() | 
|---|
|  | 292 | { | 
|---|
| [c6355f] | 293 | // we have a grid with size of one, extend to twice the size and check | 
|---|
| [5b1e5e] | 294 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
| [de6dfb] | 295 | const double size = 2.; | 
|---|
| [5b1e5e] | 296 | const double end[NDIM] = { size, size, size }; | 
|---|
|  | 297 | double offset[NDIM]; | 
|---|
| [c6355f] | 298 | for (offset[0] = 0.; offset[0] <= 1.; offset[0] += .5) | 
|---|
|  | 299 | for (offset[1] = 0.; offset[1] <= 1.; offset[1] += .5) | 
|---|
|  | 300 | for (offset[2] = 0.; offset[2] <= 1.; offset[2] += .5) { | 
|---|
| [5b1e5e] | 301 | const double window_begin[NDIM] = { 0.+offset[0], 0.+offset[1], 0.+offset[2]}; | 
|---|
|  | 302 | const double window_end[NDIM] = { 1.+offset[0], 1.+offset[1], 1.+offset[2]}; | 
|---|
| [c6355f] | 303 | SamplingGrid newgrid(begin, end, 2); | 
|---|
|  | 304 | newgrid.setWindowSize(window_begin, window_end); | 
|---|
|  | 305 | // resize values by hand to new window size. Otherwise they get zero'd. | 
|---|
|  | 306 | newgrid.sampled_grid = values; | 
|---|
|  | 307 | newgrid.sampled_grid.resize(NUMBEROFSAMPLES(1)); | 
|---|
|  | 308 | newgrid.extendWindow(begin, end); | 
|---|
|  | 309 |  | 
|---|
|  | 310 | // check integral | 
|---|
|  | 311 | CPPUNIT_ASSERT_EQUAL( | 
|---|
|  | 312 | grid_value/(NUMBEROFSAMPLES(grid->level)/NUMBEROFSAMPLES(grid->level)), | 
|---|
|  | 313 | grid->integral() | 
|---|
|  | 314 | ); | 
|---|
|  | 315 |  | 
|---|
|  | 316 | // check number of points | 
|---|
|  | 317 | CPPUNIT_ASSERT_EQUAL( | 
|---|
|  | 318 | (size_t)NUMBEROFSAMPLES(grid->level), | 
|---|
|  | 319 | grid->getWindowGridPoints() | 
|---|
|  | 320 | ); | 
|---|
|  | 321 | } | 
|---|
| [de6dfb] | 322 | } | 
|---|
|  | 323 |  | 
|---|
|  | 324 | /** UnitTest for extendWindow() with asymmetric values | 
|---|
|  | 325 | */ | 
|---|
|  | 326 | void SamplingGridTest::extendWindow_asymmetric_Test() | 
|---|
|  | 327 | { | 
|---|
| [c6355f] | 328 | std::cout << "SamplingGridTest::extendWindow_asymmetric_Test()" << std::endl; | 
|---|
| [5b1e5e] | 329 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
|  | 330 | const double end[NDIM] = { 2., 2., 2. }; | 
|---|
|  | 331 | double offset[NDIM]; | 
|---|
| [c6355f] | 332 | for (offset[0] = 0.; offset[0] <= 1.; offset[0] += .5) | 
|---|
|  | 333 | for (offset[1] = 0.; offset[1] <= 1.; offset[1] += .5) | 
|---|
|  | 334 | for (offset[2] = 0.; offset[2] <= 1.; offset[2] += .5) { | 
|---|
| [5b1e5e] | 335 | const double window_begin[NDIM] = { 0.+offset[0], 0.+offset[1], 0.+offset[2]}; | 
|---|
|  | 336 | const double window_end[NDIM] = { 1.+offset[0], 1.+offset[1], 1.+offset[2]}; | 
|---|
| [c6355f] | 337 | SamplingGrid newgrid(begin, end, 2); | 
|---|
|  | 338 | CPPUNIT_ASSERT_EQUAL( (size_t)0, newgrid.getWindowGridPoints() ); | 
|---|
|  | 339 | newgrid.setWindowSize(window_begin, window_end); | 
|---|
|  | 340 | // window size is only half of domain size | 
|---|
| [5b1e5e] | 341 | const size_t max_samples = NUMBEROFSAMPLES(newgrid.level)*pow(0.5,(int)NDIM); | 
|---|
| [c6355f] | 342 | for (size_t i=0; i< max_samples; ++i) | 
|---|
|  | 343 | newgrid.sampled_grid += grid_value*i; | 
|---|
|  | 344 | const size_t sum_weight = (max_samples)*(max_samples-1)/2; | 
|---|
|  | 345 | const double integral = newgrid.integral(); | 
|---|
|  | 346 | newgrid.extendWindow(begin, end); | 
|---|
|  | 347 |  | 
|---|
|  | 348 | // check that integral has remained the same | 
|---|
|  | 349 | CPPUNIT_ASSERT_EQUAL( integral, newgrid.integral() ); | 
|---|
|  | 350 | CPPUNIT_ASSERT_EQUAL( grid_value*sum_weight/DOMAINVOLUME(2), newgrid.integral() ); | 
|---|
|  | 351 | } | 
|---|
| [1a00bb] | 352 | } | 
|---|
|  | 353 |  | 
|---|
|  | 354 | /** UnitTest for addOntoWindow() | 
|---|
|  | 355 | */ | 
|---|
|  | 356 | void SamplingGridTest::addOntoWindow_Test() | 
|---|
|  | 357 | { | 
|---|
|  | 358 | // first window is from (0,0,0) to (1,1,1) | 
|---|
|  | 359 | CPPUNIT_ASSERT_EQUAL( 1.*grid_value, grid->integral() ); | 
|---|
|  | 360 |  | 
|---|
| [c6355f] | 361 | // create values for half-sized window | 
|---|
| [1a00bb] | 362 | values.clear(); | 
|---|
| [5b1e5e] | 363 | for (size_t i=0; i< (size_t)pow(.5*pow(2,2),(int)NDIM); ++i) | 
|---|
| [1a00bb] | 364 | values += grid_value; | 
|---|
| [c6355f] | 365 |  | 
|---|
| [1a00bb] | 366 | // check that too large a window throws | 
|---|
|  | 367 | #ifndef NDEBUG | 
|---|
| [5b1e5e] | 368 | const double begin[NDIM] = { .5, .5, .5 }; | 
|---|
|  | 369 | const double wrongend[NDIM] = { 1.5, 1.5, 1.5 }; | 
|---|
| [1a00bb] | 370 | std::cout << "The following assertion is intended and does not indicate a failure of the test." << std::endl; | 
|---|
| [de6dfb] | 371 | CPPUNIT_ASSERT_THROW( grid->addOntoWindow(begin, wrongend, values, +1.), Assert::AssertionFailure ); | 
|---|
| [1a00bb] | 372 | #endif | 
|---|
|  | 373 |  | 
|---|
| [c6355f] | 374 | // create another window from (.5,.5,.5) to (1., 1., 1.) | 
|---|
| [5b1e5e] | 375 | double offset[NDIM]; | 
|---|
| [c6355f] | 376 | for (offset[0] = 0.; offset[0] <= .5; offset[0] += .5) | 
|---|
|  | 377 | for (offset[1] = 0.; offset[1] <= .5; offset[1] += .5) | 
|---|
|  | 378 | for (offset[2] = 0.; offset[2] <= .5; offset[2] += .5) { | 
|---|
| [5b1e5e] | 379 | const double window_begin[NDIM] = { 0.+offset[0], 0.+offset[1], 0.+offset[2]}; | 
|---|
|  | 380 | const double window_end[NDIM] = { .5+offset[0], .5+offset[1], .5+offset[2]}; | 
|---|
| [c6355f] | 381 |  | 
|---|
|  | 382 | SamplingGrid newgrid(*grid); | 
|---|
|  | 383 | // now perform working operation | 
|---|
|  | 384 | newgrid.addOntoWindow(window_begin, window_end, values, +1.); | 
|---|
|  | 385 |  | 
|---|
|  | 386 | // check integral to be one and one eighth times the old value | 
|---|
| [5b1e5e] | 387 | CPPUNIT_ASSERT_EQUAL( (1.+pow(.5,(int)NDIM))*grid_value, newgrid.integral() ); | 
|---|
| [c6355f] | 388 | } | 
|---|
| [1a00bb] | 389 | } | 
|---|
|  | 390 |  | 
|---|
| [de6dfb] | 391 | /** UnitTest for addOntoWindow() with asymmetric values | 
|---|
|  | 392 | */ | 
|---|
|  | 393 | void SamplingGridTest::addOntoWindow_asymmetric_Test() | 
|---|
|  | 394 | { | 
|---|
| [c6355f] | 395 | const size_t size = grid->end[0]-grid->begin[0]; | 
|---|
| [de6dfb] | 396 | // check with asymmetric values | 
|---|
|  | 397 | grid->sampled_grid.clear(); | 
|---|
| [c6355f] | 398 | grid->sampled_grid.resize(DOMAINVOLUME(size)*NUMBEROFSAMPLES(grid->level), 0.); | 
|---|
| [de6dfb] | 399 |  | 
|---|
|  | 400 | for (size_t i=0;i<grid->level*(grid->end[0]-grid->begin[0]);++i) | 
|---|
|  | 401 | grid->sampled_grid[(i*2+0)*2+0] += .5*grid_value; | 
|---|
|  | 402 | for (size_t i=0;i<grid->level*(grid->end[1]-grid->begin[1]);++i) | 
|---|
|  | 403 | grid->sampled_grid[(0*2+i)*2+0] += 1.*grid_value; | 
|---|
|  | 404 | for (size_t i=0;i<grid->level*(grid->end[2]-grid->begin[2]);++i) | 
|---|
|  | 405 | grid->sampled_grid[(0*2+0)*2+i] += 1.5*grid_value; | 
|---|
|  | 406 |  | 
|---|
|  | 407 | const double integral = grid->integral(); | 
|---|
| [c6355f] | 408 |  | 
|---|
|  | 409 | // now perform working operation | 
|---|
|  | 410 | grid->addOntoWindow(grid->begin, grid->end, values, +1.); | 
|---|
|  | 411 | // values is equal to integral of 1. | 
|---|
|  | 412 | CPPUNIT_ASSERT_EQUAL( 1.+integral, grid->integral() ); | 
|---|
| [de6dfb] | 413 | } | 
|---|
|  | 414 |  | 
|---|
| [c889b7] | 415 | /** UnitTest for operator+=() | 
|---|
|  | 416 | */ | 
|---|
|  | 417 | void SamplingGridTest::operatorPlusEqual_Test() | 
|---|
|  | 418 | { | 
|---|
|  | 419 | // create other grid | 
|---|
| [5b1e5e] | 420 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
|  | 421 | const double end[NDIM] = { 1., 1., 1. }; | 
|---|
| [c889b7] | 422 | SamplingGrid::sampledvalues_t othervalues; | 
|---|
|  | 423 | const double othergrid_value = 1.5; | 
|---|
|  | 424 | for (size_t i=0; i< NUMBEROFSAMPLES(2); ++i) | 
|---|
|  | 425 | othervalues += othergrid_value; | 
|---|
| [3d9a8d] | 426 | SamplingGrid othergrid(begin, end, 2, othervalues); | 
|---|
| [c889b7] | 427 | CPPUNIT_ASSERT_EQUAL( othergrid_value, *(othergrid.sampled_grid.begin()) ); | 
|---|
|  | 428 |  | 
|---|
|  | 429 | // perform operation | 
|---|
|  | 430 | CPPUNIT_ASSERT_NO_THROW( *grid += othergrid ); | 
|---|
|  | 431 |  | 
|---|
|  | 432 | // check the contents of the grid | 
|---|
|  | 433 | const double sum = grid_value+othergrid_value; | 
|---|
|  | 434 | for (SamplingGrid::sampledvalues_t::const_iterator iter = grid->sampled_grid.begin(); | 
|---|
|  | 435 | iter != grid->sampled_grid.end(); ++iter) | 
|---|
|  | 436 | CPPUNIT_ASSERT_EQUAL( sum, *iter ); | 
|---|
|  | 437 | } | 
|---|
|  | 438 |  | 
|---|
|  | 439 | /** UnitTest for operator-=() | 
|---|
|  | 440 | */ | 
|---|
|  | 441 | void SamplingGridTest::operatorMinusEqual_Test() | 
|---|
|  | 442 | { | 
|---|
|  | 443 | // create other grid | 
|---|
| [5b1e5e] | 444 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
|  | 445 | const double end[NDIM] = { 1., 1., 1. }; | 
|---|
| [c889b7] | 446 | SamplingGrid::sampledvalues_t othervalues; | 
|---|
|  | 447 | const double othergrid_value = 1.5; | 
|---|
|  | 448 | for (size_t i=0; i< NUMBEROFSAMPLES(2); ++i) | 
|---|
|  | 449 | othervalues += othergrid_value; | 
|---|
| [3d9a8d] | 450 | SamplingGrid othergrid(begin, end, 2, othervalues); | 
|---|
| [c889b7] | 451 | CPPUNIT_ASSERT_EQUAL( othergrid_value, *(othergrid.sampled_grid.begin()) ); | 
|---|
|  | 452 |  | 
|---|
|  | 453 | // perform operation | 
|---|
|  | 454 | CPPUNIT_ASSERT_NO_THROW( *grid -= othergrid ); | 
|---|
|  | 455 |  | 
|---|
|  | 456 | // check the contents of the grid | 
|---|
|  | 457 | const double difference = grid_value-othergrid_value; | 
|---|
|  | 458 | for (SamplingGrid::sampledvalues_t::const_iterator iter = grid->sampled_grid.begin(); | 
|---|
|  | 459 | iter != grid->sampled_grid.end(); ++iter) | 
|---|
|  | 460 | CPPUNIT_ASSERT_EQUAL( difference, *iter ); | 
|---|
|  | 461 | } | 
|---|
|  | 462 |  | 
|---|
| [955051] | 463 |  | 
|---|
|  | 464 | /** UnitTest for operator==() | 
|---|
|  | 465 | */ | 
|---|
|  | 466 | void SamplingGridTest::equality_Test() | 
|---|
|  | 467 | { | 
|---|
| [5b1e5e] | 468 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
|  | 469 | const double otherbegin[NDIM] = { .5, 0.1, -0.5 }; | 
|---|
|  | 470 | const double end[NDIM] = { 1., 1., 1. }; | 
|---|
|  | 471 | const double otherend[NDIM] = { 2., 2., 2. }; | 
|---|
|  | 472 | const double begin_window[NDIM] = { 0., 0., 0. }; | 
|---|
|  | 473 | const double otherbegin_window[NDIM] = { .75, 0.1, 0. }; | 
|---|
|  | 474 | const double end_window[NDIM] = { 1., 1., 1. }; | 
|---|
|  | 475 | const double otherend_window[NDIM] = { .9, .9, .9 }; | 
|---|
| [955051] | 476 |  | 
|---|
|  | 477 | // create other grid | 
|---|
|  | 478 | SamplingGrid samegrid(begin, end, 2, values); | 
|---|
|  | 479 | SamplingGrid differentbegin(otherbegin, end, 2, values); | 
|---|
|  | 480 | SamplingGrid differentend(begin, otherend, 2, values); | 
|---|
|  | 481 | SamplingGrid::sampledvalues_t morevalues; | 
|---|
|  | 482 | { | 
|---|
|  | 483 | const double othergrid_value = 1.5; | 
|---|
|  | 484 | for (size_t i=0; i< NUMBEROFSAMPLES(4); ++i) | 
|---|
|  | 485 | morevalues += othergrid_value; | 
|---|
|  | 486 | } | 
|---|
|  | 487 | SamplingGrid differentlevel(begin, end, 4, morevalues); | 
|---|
|  | 488 | SamplingGrid::sampledvalues_t othervalues; | 
|---|
|  | 489 | { | 
|---|
|  | 490 | const double othergrid_value = 1.5; | 
|---|
|  | 491 | for (size_t i=0; i< NUMBEROFSAMPLES(2); ++i) | 
|---|
|  | 492 | othervalues += othergrid_value; | 
|---|
|  | 493 | } | 
|---|
|  | 494 | SamplingGrid differentvalues(begin, end, 2, othervalues); | 
|---|
|  | 495 |  | 
|---|
|  | 496 | // check for same level, begin, and end | 
|---|
|  | 497 | CPPUNIT_ASSERT( *grid == *grid ); | 
|---|
|  | 498 | CPPUNIT_ASSERT( *grid == samegrid ); | 
|---|
|  | 499 | CPPUNIT_ASSERT( samegrid == *grid); | 
|---|
|  | 500 | CPPUNIT_ASSERT( *grid != differentbegin); | 
|---|
|  | 501 | CPPUNIT_ASSERT( differentbegin != *grid); | 
|---|
|  | 502 | CPPUNIT_ASSERT( *grid != differentend ); | 
|---|
|  | 503 | CPPUNIT_ASSERT( differentend != *grid ); | 
|---|
|  | 504 | CPPUNIT_ASSERT( *grid != differentlevel ); | 
|---|
|  | 505 | CPPUNIT_ASSERT( differentlevel != *grid ); | 
|---|
|  | 506 |  | 
|---|
|  | 507 | // check for all but differing values | 
|---|
|  | 508 | CPPUNIT_ASSERT( *grid != differentvalues ); | 
|---|
|  | 509 | CPPUNIT_ASSERT( differentvalues != *grid ); | 
|---|
|  | 510 |  | 
|---|
|  | 511 | // check for different windows | 
|---|
|  | 512 | SamplingGrid differentwindowbegin(begin, end, 2); | 
|---|
|  | 513 | differentwindowbegin.setWindow(otherbegin_window, end_window); | 
|---|
|  | 514 | SamplingGrid differentwindowend(begin, end, 2); | 
|---|
|  | 515 | differentwindowend.setWindow(begin_window, otherend_window); | 
|---|
|  | 516 | CPPUNIT_ASSERT( *grid != differentwindowbegin ); | 
|---|
|  | 517 | CPPUNIT_ASSERT( differentwindowbegin != *grid ); | 
|---|
|  | 518 | CPPUNIT_ASSERT( *grid != differentwindowend ); | 
|---|
|  | 519 | CPPUNIT_ASSERT( differentwindowend != *grid ); | 
|---|
|  | 520 |  | 
|---|
|  | 521 | // check against ZeroInstance | 
|---|
|  | 522 | CPPUNIT_ASSERT( *grid != ZeroInstance<SamplingGrid>() ); | 
|---|
|  | 523 | CPPUNIT_ASSERT( samegrid != ZeroInstance<SamplingGrid>() ); | 
|---|
|  | 524 | CPPUNIT_ASSERT( differentbegin != ZeroInstance<SamplingGrid>() ); | 
|---|
|  | 525 | CPPUNIT_ASSERT( differentend != ZeroInstance<SamplingGrid>() ); | 
|---|
|  | 526 | CPPUNIT_ASSERT( differentlevel != ZeroInstance<SamplingGrid>() ); | 
|---|
|  | 527 | CPPUNIT_ASSERT( differentvalues != ZeroInstance<SamplingGrid>() ); | 
|---|
|  | 528 | CPPUNIT_ASSERT( differentwindowbegin != ZeroInstance<SamplingGrid>() ); | 
|---|
|  | 529 | CPPUNIT_ASSERT( differentwindowend != ZeroInstance<SamplingGrid>() ); | 
|---|
|  | 530 | } | 
|---|
|  | 531 |  | 
|---|
|  | 532 | /** UnitTest for serialization | 
|---|
|  | 533 | */ | 
|---|
|  | 534 | void SamplingGridTest::serializeTest() | 
|---|
|  | 535 | { | 
|---|
|  | 536 | // serialize | 
|---|
|  | 537 | std::stringstream outputstream; | 
|---|
|  | 538 | boost::archive::text_oarchive oa(outputstream); | 
|---|
|  | 539 | oa << grid; | 
|---|
|  | 540 |  | 
|---|
|  | 541 | // deserialize | 
|---|
|  | 542 | SamplingGrid *samegrid = NULL; | 
|---|
|  | 543 | std::stringstream returnstream(outputstream.str()); | 
|---|
|  | 544 | boost::archive::text_iarchive ia(returnstream); | 
|---|
|  | 545 | ia >> samegrid; | 
|---|
|  | 546 |  | 
|---|
|  | 547 | CPPUNIT_ASSERT( samegrid != NULL ); | 
|---|
|  | 548 | CPPUNIT_ASSERT( *grid == *samegrid ); | 
|---|
|  | 549 |  | 
|---|
|  | 550 | delete samegrid; | 
|---|
|  | 551 | } | 
|---|
| [5b1e5e] | 552 |  | 
|---|
| [06653a] | 553 | #ifdef HAVE_INLINE | 
|---|
|  | 554 | inline | 
|---|
|  | 555 | #endif | 
|---|
|  | 556 | static int calculateIndex(const int N[NDIM], const int &_length) | 
|---|
|  | 557 | { | 
|---|
|  | 558 | return N[2] + N[1]*_length + N[0]*_length*_length; | 
|---|
|  | 559 | } | 
|---|
|  | 560 |  | 
|---|
|  | 561 | #ifdef HAVE_INLINE | 
|---|
|  | 562 | inline | 
|---|
|  | 563 | #endif | 
|---|
|  | 564 | static double calculateDistanceSquared(const int N[NDIM], const int &_length) | 
|---|
|  | 565 | { | 
|---|
|  | 566 | return | 
|---|
|  | 567 | ::pow(N[0]/(double)_length-.5,2) | 
|---|
|  | 568 | + ::pow(N[1]/(double)_length-.5,2) | 
|---|
|  | 569 | + ::pow(N[2]/(double)_length-.5,2); | 
|---|
|  | 570 | } | 
|---|
| [91e7658] | 571 |  | 
|---|
|  | 572 | #ifdef HAVE_INLINE | 
|---|
|  | 573 | inline | 
|---|
|  | 574 | #endif | 
|---|
|  | 575 | static double getBoundaryCaseFactor(const int N[NDIM], const int &_length) | 
|---|
|  | 576 | { | 
|---|
|  | 577 | static double third_two=::pow(4., 1./3.); | 
|---|
|  | 578 | double returnthreshold = 1.; | 
|---|
|  | 579 | for (size_t i=0;i<NDIM;++i) | 
|---|
|  | 580 | if ((N[i] == 0) || (N[i] == _length-1)) | 
|---|
|  | 581 | returnthreshold *= third_two; | 
|---|
|  | 582 | return returnthreshold; | 
|---|
|  | 583 | } | 
|---|
|  | 584 |  | 
|---|
| [d56e21] | 585 | /** UnitTest for padWithZerosForEvenNumberedSamples() | 
|---|
|  | 586 | * | 
|---|
|  | 587 | */ | 
|---|
|  | 588 | void SamplingGridTest::padWithZerosForEvenNumberedSamplesTest() | 
|---|
|  | 589 | { | 
|---|
|  | 590 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
|  | 591 | const double end[NDIM] = { 2., 2., 2. }; | 
|---|
|  | 592 |  | 
|---|
|  | 593 | // we check for window of odd numbers | 
|---|
|  | 594 | { | 
|---|
|  | 595 | //    LOG(2, "Checking with difference " << grid_difference); | 
|---|
|  | 596 | const int gridpoints = 1*2*2; | 
|---|
|  | 597 | const int extended_gridpoints = 2*4*4; | 
|---|
|  | 598 | SamplingGrid::sampledvalues_t values(gridpoints, 1.); // length in one axis is odd | 
|---|
|  | 599 | SamplingGrid::sampledvalues_t checkvalues(extended_gridpoints, 0.); | 
|---|
|  | 600 | { | 
|---|
|  | 601 | int N[NDIM]; | 
|---|
|  | 602 | int index = 0; | 
|---|
|  | 603 | for (N[0]=2;N[0]<3;++N[0]) { | 
|---|
|  | 604 | for (N[1]=0;N[1]<1;++N[1]) { | 
|---|
|  | 605 | for (N[2]=0;N[2]<4;++N[2]) { | 
|---|
|  | 606 | checkvalues[index++] = 0.; | 
|---|
|  | 607 | } | 
|---|
|  | 608 | } | 
|---|
|  | 609 | for (N[1]=1;N[1]<3;++N[1]) { | 
|---|
|  | 610 | checkvalues[index++] = 0.; | 
|---|
|  | 611 | for (N[2]=1;N[2]<3;++N[2]) { | 
|---|
|  | 612 | checkvalues[index++] = 1.; | 
|---|
|  | 613 | } | 
|---|
|  | 614 | checkvalues[index++] = 0.; | 
|---|
|  | 615 | } | 
|---|
|  | 616 | for (N[1]=3;N[1]<4;++N[1]) { | 
|---|
|  | 617 | for (N[2]=0;N[2]<4;++N[2]) { | 
|---|
|  | 618 | checkvalues[index++] = 0.; | 
|---|
|  | 619 | } | 
|---|
|  | 620 | } | 
|---|
|  | 621 | } | 
|---|
|  | 622 | for (N[0]=3;N[0]<4;++N[0]) { | 
|---|
|  | 623 | for (N[1]=0;N[1]<4;++N[1]) { | 
|---|
|  | 624 | for (N[2]=0;N[2]<4;++N[2]) { | 
|---|
|  | 625 | checkvalues[index++] = 0.; | 
|---|
|  | 626 | } | 
|---|
|  | 627 | } | 
|---|
|  | 628 | } | 
|---|
|  | 629 | } | 
|---|
|  | 630 |  | 
|---|
|  | 631 | /** Here, we must initialize the larger grid with zero window first and | 
|---|
|  | 632 | * then add the values into the smaller window. | 
|---|
|  | 633 | */ | 
|---|
|  | 634 | SamplingGrid grid(begin, end, 2); | 
|---|
|  | 635 | const double window_begin[NDIM] = { | 
|---|
|  | 636 | grid.getNearestHigherGridPoint(1.0, 0), // index 2 | 
|---|
|  | 637 | grid.getNearestHigherGridPoint(0.5, 1), // index 1 -> 0 | 
|---|
|  | 638 | grid.getNearestHigherGridPoint(0.5, 2) }; // index 1 -> 0 | 
|---|
|  | 639 | const double window_end[NDIM] = { | 
|---|
|  | 640 | grid.getNearestLowerGridPoint(1.5, 0), // index 3 -> 4 | 
|---|
|  | 641 | grid.getNearestLowerGridPoint(1.5, 1), // index 3 -> 4 | 
|---|
|  | 642 | grid.getNearestLowerGridPoint(1.5, 2) }; // index 3 -> 4 | 
|---|
|  | 643 | grid.setWindow(window_begin, window_end); | 
|---|
|  | 644 | grid.addOntoWindow(window_begin, window_end, values, +1.); | 
|---|
|  | 645 | grid.padWithZerosForEvenNumberedSamples(); | 
|---|
|  | 646 |  | 
|---|
|  | 647 | SamplingGrid checkgrid(begin, end, 2); | 
|---|
|  | 648 | const double check_window_begin[NDIM] = { | 
|---|
|  | 649 | checkgrid.getNearestHigherGridPoint(1., 0), | 
|---|
|  | 650 | checkgrid.getNearestHigherGridPoint(0., 1), | 
|---|
|  | 651 | checkgrid.getNearestHigherGridPoint(0., 2) }; | 
|---|
|  | 652 | const double check_window_end[NDIM] = { | 
|---|
|  | 653 | checkgrid.getNearestHigherGridPoint(2., 0), | 
|---|
|  | 654 | checkgrid.getNearestHigherGridPoint(2., 1), | 
|---|
|  | 655 | checkgrid.getNearestHigherGridPoint(2., 2) }; | 
|---|
|  | 656 | checkgrid.setWindow(check_window_begin, check_window_end); | 
|---|
|  | 657 | checkgrid.addOntoWindow(check_window_begin, check_window_end, checkvalues, +1.); | 
|---|
|  | 658 |  | 
|---|
|  | 659 | std::cout << " grid value " << grid.sampled_grid << std::endl; | 
|---|
|  | 660 | std::cout << " checkgrid value " << checkgrid.sampled_grid << std::endl; | 
|---|
|  | 661 | CPPUNIT_ASSERT_EQUAL( checkgrid.sampled_grid.size(), grid.sampled_grid.size()); | 
|---|
|  | 662 | CPPUNIT_ASSERT_EQUAL( checkgrid, grid ); | 
|---|
|  | 663 | } | 
|---|
|  | 664 | } | 
|---|
|  | 665 |  | 
|---|
| [06653a] | 666 | /** UnitTest for downsample() | 
|---|
|  | 667 | */ | 
|---|
| [91e7658] | 668 | void SamplingGridTest::downsample_gridTest() | 
|---|
| [06653a] | 669 | { | 
|---|
|  | 670 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
|  | 671 | const double end[NDIM] = { 1., 1., 1. }; | 
|---|
|  | 672 |  | 
|---|
|  | 673 | // simple test, one level difference, same value everywhere | 
|---|
|  | 674 | { | 
|---|
|  | 675 | SamplingGrid::sampledvalues_t checkvalues; | 
|---|
|  | 676 | SamplingGrid::sampledvalues_t othervalues; | 
|---|
|  | 677 | const double othergrid_value = 1.5; | 
|---|
|  | 678 | for (size_t i=0; i< NUMBEROFSAMPLES(2); ++i) | 
|---|
|  | 679 | checkvalues += othergrid_value; | 
|---|
|  | 680 | for (size_t i=0; i< NUMBEROFSAMPLES(3); ++i) | 
|---|
|  | 681 | othervalues += othergrid_value; | 
|---|
|  | 682 |  | 
|---|
|  | 683 | SamplingGrid largegrid(begin, end, 3, othervalues); | 
|---|
|  | 684 | //    std::cout << " largegrid value " << largegrid.sampled_grid << std::endl; | 
|---|
|  | 685 | SamplingGrid smallgrid(begin, end, 2); | 
|---|
|  | 686 | SamplingGrid::downsample(smallgrid, largegrid, 2); | 
|---|
|  | 687 | SamplingGrid checkgrid(begin, end, 2, checkvalues); | 
|---|
|  | 688 | //    std::cout << " smallgrid value " << smallgrid.sampled_grid << std::endl; | 
|---|
|  | 689 | //    std::cout << " checkgrid value " << checkgrid.sampled_grid << std::endl; | 
|---|
|  | 690 | CPPUNIT_ASSERT_EQUAL( smallgrid, checkgrid ); | 
|---|
|  | 691 | } | 
|---|
|  | 692 |  | 
|---|
|  | 693 | // simple test, two level difference, same value everywhere | 
|---|
|  | 694 | { | 
|---|
|  | 695 | SamplingGrid::sampledvalues_t checkvalues; | 
|---|
|  | 696 | SamplingGrid::sampledvalues_t othervalues; | 
|---|
|  | 697 | const double othergrid_value = 1.5; | 
|---|
|  | 698 | for (size_t i=0; i< NUMBEROFSAMPLES(2); ++i) | 
|---|
|  | 699 | checkvalues += othergrid_value; | 
|---|
|  | 700 | for (size_t i=0; i< NUMBEROFSAMPLES(4); ++i) | 
|---|
|  | 701 | othervalues += othergrid_value; | 
|---|
|  | 702 |  | 
|---|
|  | 703 | SamplingGrid largegrid(begin, end, 4, othervalues); | 
|---|
|  | 704 | //    std::cout << " largegrid value " << largegrid.sampled_grid << std::endl; | 
|---|
|  | 705 | SamplingGrid smallgrid(begin, end, 2); | 
|---|
|  | 706 | SamplingGrid::downsample(smallgrid, largegrid, 2); | 
|---|
|  | 707 | SamplingGrid checkgrid(begin, end, 2, checkvalues); | 
|---|
|  | 708 | //    std::cout << " smallgrid value " << smallgrid.sampled_grid << std::endl; | 
|---|
|  | 709 | //    std::cout << " checkgrid value " << checkgrid.sampled_grid << std::endl; | 
|---|
|  | 710 | CPPUNIT_ASSERT_EQUAL( smallgrid, checkgrid ); | 
|---|
|  | 711 | } | 
|---|
|  | 712 |  | 
|---|
| [91e7658] | 713 | // same grid, window equals grids, ever larger largegrids | 
|---|
|  | 714 | const int base_level = 2; | 
|---|
|  | 715 | for (int grid_difference = 1; grid_difference <= 3; ++grid_difference) { | 
|---|
|  | 716 | //    LOG(2, "Checking with difference " << grid_difference); | 
|---|
|  | 717 | const int length_c = ::pow(2, base_level); | 
|---|
|  | 718 | const int length_f = ::pow(2, base_level+grid_difference); | 
|---|
|  | 719 | SamplingGrid::sampledvalues_t checkvalues((int)::pow(length_c, (int)NDIM), 0.); | 
|---|
|  | 720 | SamplingGrid::sampledvalues_t othervalues((int)::pow(length_f, (int)NDIM), 0.); | 
|---|
| [06653a] | 721 | int N[NDIM]; | 
|---|
|  | 722 | for (N[0]=0; N[0]< length_f; ++N[0]) { | 
|---|
|  | 723 | for (N[1]=0; N[1]< length_f; ++N[1]) { | 
|---|
|  | 724 | for (N[2]=0; N[2]< length_f; ++N[2]) { | 
|---|
|  | 725 | const int index = calculateIndex(N, length_f); | 
|---|
|  | 726 | const double dist = calculateDistanceSquared(N, length_f); | 
|---|
|  | 727 | othervalues[index] = cos(M_PI*dist/1.5); | 
|---|
|  | 728 | } | 
|---|
|  | 729 | } | 
|---|
|  | 730 | } | 
|---|
|  | 731 | for (N[0]=0; N[0]< length_c; ++N[0]) { | 
|---|
|  | 732 | for (N[1]=0; N[1]< length_c; ++N[1]) { | 
|---|
|  | 733 | for (N[2]=0; N[2]< length_c; ++N[2]) { | 
|---|
|  | 734 | const int index = calculateIndex(N, length_c); | 
|---|
|  | 735 | const double dist = calculateDistanceSquared(N, length_c); | 
|---|
|  | 736 | checkvalues[index] = cos(M_PI*dist/1.5); | 
|---|
|  | 737 | } | 
|---|
|  | 738 | } | 
|---|
|  | 739 | } | 
|---|
|  | 740 |  | 
|---|
| [91e7658] | 741 | SamplingGrid largegrid(begin, end, base_level+grid_difference, othervalues); | 
|---|
| [06653a] | 742 | //    std::cout << " largegrid value " << largegrid.sampled_grid << std::endl; | 
|---|
| [91e7658] | 743 | SamplingGrid smallgrid(begin, end, base_level); | 
|---|
|  | 744 | SamplingGrid::downsample(smallgrid, largegrid, base_level); | 
|---|
|  | 745 | SamplingGrid checkgrid(begin, end, base_level, checkvalues); | 
|---|
| [06653a] | 746 | //    std::cout << " smallgrid value " << smallgrid.sampled_grid << std::endl; | 
|---|
|  | 747 | //    std::cout << " checkgrid value " << checkgrid.sampled_grid << std::endl; | 
|---|
| [91e7658] | 748 | const double threshold = 3.2e-2; | 
|---|
|  | 749 | // we skip the first value as checkvalues[0] is always zero, hard to get from downsampling | 
|---|
|  | 750 | for (N[0]=1; N[0]< length_c; ++N[0]) | 
|---|
| [06653a] | 751 | for (N[1]=0; N[1]< length_c; ++N[1]) | 
|---|
|  | 752 | for (N[2]=0; N[2]< length_c; ++N[2]) { | 
|---|
|  | 753 | const double check_threshold = | 
|---|
| [91e7658] | 754 | threshold*(1.+grid_difference/4.)*getBoundaryCaseFactor(N, length_c); | 
|---|
| [06653a] | 755 | const int index = calculateIndex(N, length_c); | 
|---|
|  | 756 | //          std::cout << "Comparing " | 
|---|
|  | 757 | //              << fabs((smallgrid.sampled_grid[index] - checkgrid.sampled_grid[index])) | 
|---|
| [91e7658] | 758 | //              << " < " << check_threshold << std::endl; | 
|---|
| [06653a] | 759 | CPPUNIT_ASSERT( | 
|---|
|  | 760 | fabs((smallgrid.sampled_grid[index] - checkgrid.sampled_grid[index])) < check_threshold); | 
|---|
| [91e7658] | 761 | //          if (fabs(checkgrid.sampled_grid[index]) > 1e-10) { | 
|---|
|  | 762 | //            std::cout << "Comparing " | 
|---|
|  | 763 | //                << fabs((smallgrid.sampled_grid[index] - checkgrid.sampled_grid[index])/checkgrid.sampled_grid[index]) | 
|---|
|  | 764 | //                << " < " << check_threshold << std::endl; | 
|---|
|  | 765 | //            CPPUNIT_ASSERT( | 
|---|
|  | 766 | //                fabs((smallgrid.sampled_grid[index] - checkgrid.sampled_grid[index])/checkgrid.sampled_grid[index]) < check_threshold); | 
|---|
|  | 767 | //          } | 
|---|
|  | 768 | } | 
|---|
|  | 769 | } | 
|---|
|  | 770 | } | 
|---|
|  | 771 |  | 
|---|
|  | 772 | /** UnitTest for downsample() | 
|---|
|  | 773 | */ | 
|---|
|  | 774 | void SamplingGridTest::downsample_smallerwindowTest() | 
|---|
|  | 775 | { | 
|---|
|  | 776 | const double begin[NDIM] = { 0., 0., 0. }; | 
|---|
|  | 777 | const double end[NDIM] = { 2., 2., 2. }; | 
|---|
|  | 778 |  | 
|---|
|  | 779 | // same grid, window is half of grid, different level by one | 
|---|
|  | 780 | const int base_level = 3; | 
|---|
|  | 781 | for (int grid_difference = 1; grid_difference <= 3; ++grid_difference) { | 
|---|
|  | 782 | //    LOG(2, "Checking with difference " << grid_difference); | 
|---|
|  | 783 | const int window_length_c = ::pow(2, base_level-1); | 
|---|
|  | 784 | const int window_length_f = ::pow(2, base_level+grid_difference-1); | 
|---|
|  | 785 | SamplingGrid::sampledvalues_t checkvalues((int)::pow(window_length_c, (int)NDIM), 0.); | 
|---|
|  | 786 | SamplingGrid::sampledvalues_t othervalues((int)::pow(window_length_f, (int)NDIM), 0.); | 
|---|
|  | 787 | int N[NDIM]; | 
|---|
|  | 788 | for (N[0]=0; N[0]< window_length_f; ++N[0]) { | 
|---|
|  | 789 | for (N[1]=0; N[1]< window_length_f; ++N[1]) { | 
|---|
|  | 790 | for (N[2]=0; N[2]< window_length_f; ++N[2]) { | 
|---|
|  | 791 | const int index = calculateIndex(N, window_length_f); | 
|---|
|  | 792 | const double dist = calculateDistanceSquared(N, window_length_f); | 
|---|
|  | 793 | othervalues[index] = cos(M_PI*dist/1.5); | 
|---|
|  | 794 | } | 
|---|
|  | 795 | } | 
|---|
|  | 796 | } | 
|---|
|  | 797 | for (N[0]=0; N[0]< window_length_c; ++N[0]) { | 
|---|
|  | 798 | for (N[1]=0; N[1]< window_length_c; ++N[1]) { | 
|---|
|  | 799 | for (N[2]=0; N[2]< window_length_c; ++N[2]) { | 
|---|
|  | 800 | const int index = calculateIndex(N, window_length_c); | 
|---|
|  | 801 | const double dist = calculateDistanceSquared(N, window_length_c); | 
|---|
|  | 802 | checkvalues[index] = cos(M_PI*dist/1.5); | 
|---|
|  | 803 | } | 
|---|
|  | 804 | } | 
|---|
|  | 805 | } | 
|---|
|  | 806 |  | 
|---|
|  | 807 | /** Here, we must initialize the larger grid with zero window first and | 
|---|
|  | 808 | * then add the values into the smaller window. | 
|---|
|  | 809 | */ | 
|---|
|  | 810 | SamplingGrid largegrid(begin, end, base_level+grid_difference); | 
|---|
|  | 811 | const double window_begin[NDIM] = { | 
|---|
|  | 812 | largegrid.getNearestHigherGridPoint(0.5, 0), | 
|---|
|  | 813 | largegrid.getNearestHigherGridPoint(0.5, 1), | 
|---|
|  | 814 | largegrid.getNearestHigherGridPoint(0.5, 2) }; | 
|---|
|  | 815 | const double window_end[NDIM] = { | 
|---|
|  | 816 | largegrid.getNearestLowerGridPoint(1.5, 0), | 
|---|
|  | 817 | largegrid.getNearestLowerGridPoint(1.5, 1), | 
|---|
|  | 818 | largegrid.getNearestLowerGridPoint(1.5, 2) }; | 
|---|
|  | 819 | largegrid.setWindow(window_begin, window_end); | 
|---|
|  | 820 | largegrid.addOntoWindow(window_begin, window_end, othervalues, +1.); | 
|---|
|  | 821 | //    std::cout << " largegrid value " << largegrid.sampled_grid << std::endl; | 
|---|
|  | 822 |  | 
|---|
|  | 823 | // smallgrid is downsample from full large grid | 
|---|
|  | 824 | SamplingGrid smallgrid(begin, end, base_level); | 
|---|
|  | 825 | SamplingGrid::downsample(smallgrid, largegrid, base_level); | 
|---|
|  | 826 | //    std::cout << " smallgrid value " << smallgrid.sampled_grid << std::endl; | 
|---|
|  | 827 |  | 
|---|
|  | 828 | // checkgrid is created in the same way as the large grid (only with smaller level) | 
|---|
|  | 829 | SamplingGrid checkgrid(begin, end, base_level); | 
|---|
|  | 830 | checkgrid.setWindow(window_begin, window_end); | 
|---|
|  | 831 | checkgrid.addOntoWindow(window_begin, window_end, checkvalues, +1.); | 
|---|
|  | 832 | //    std::cout << " checkgrid value " << checkgrid.sampled_grid << std::endl; | 
|---|
|  | 833 |  | 
|---|
|  | 834 | // then we compare over the full length | 
|---|
|  | 835 | /** Note that the threshold does not get better with increasing grid_difference, | 
|---|
|  | 836 | * on the contrary! For a grid_difference of 1, the finer grid is exact as it | 
|---|
|  | 837 | * directly sampled from the function. For a larger grid_difference, the finer | 
|---|
|  | 838 | * grid (being one level away from the desired coarse grid) is just an | 
|---|
|  | 839 | * approximation although obtained from a finer sampling. Hence, the larger the | 
|---|
|  | 840 | * grid_difference, the worse is the smallgrid with respect to checkgrid. | 
|---|
|  | 841 | */ | 
|---|
|  | 842 | const double threshold = 3.2e-2; | 
|---|
|  | 843 | // we skip the first value as checkvalues[0] is always zero, hard to get from downsampling | 
|---|
|  | 844 | for (N[0]=1; N[0]< window_length_c; ++N[0]) | 
|---|
|  | 845 | for (N[1]=0; N[1]< window_length_c; ++N[1]) | 
|---|
|  | 846 | for (N[2]=0; N[2]< window_length_c; ++N[2]) { | 
|---|
|  | 847 | const double check_threshold = | 
|---|
|  | 848 | threshold*(1.+grid_difference/4.)*getBoundaryCaseFactor(N, window_length_c); | 
|---|
|  | 849 | const int index = calculateIndex(N, window_length_c); | 
|---|
|  | 850 | const double difference = fabs((smallgrid.sampled_grid[index] - checkgrid.sampled_grid[index])); | 
|---|
|  | 851 | //          std::cout << "Comparing |" | 
|---|
|  | 852 | //              << scientific | 
|---|
|  | 853 | //              << smallgrid.sampled_grid[index] << " - " | 
|---|
|  | 854 | //              << checkgrid.sampled_grid[index] << "| = " | 
|---|
|  | 855 | //              << fabs((smallgrid.sampled_grid[index] - checkgrid.sampled_grid[index])) | 
|---|
|  | 856 | //              << " < " << check_threshold << " => " | 
|---|
|  | 857 | //              << fixed << setprecision(2) | 
|---|
|  | 858 | //              << 100*difference/threshold | 
|---|
|  | 859 | //              << " %, compare to " << 100*(1.+grid_difference/4.)*getBoundaryCaseFactor(N, window_length_c) | 
|---|
|  | 860 | //              << " %" << std::endl; | 
|---|
|  | 861 | CPPUNIT_ASSERT( difference < check_threshold ); | 
|---|
| [06653a] | 862 | } | 
|---|
|  | 863 | } | 
|---|
|  | 864 | } | 
|---|