/*
* 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 .
*/
/*
* ExportGraph_ToJobsUnitTest.cpp
*
* Created on: Mar 10, 2016
* Author: heber
*/
// include config.h
#ifdef HAVE_CONFIG_H
#include
#endif
using namespace std;
#include
#include
#include
#include "ExportGraph_ToJobsUnitTest.hpp"
#include
#include
#include
#include "CodePatterns/Assert.hpp"
#include "Fragmentation/Exporters/ExportGraph_ToJobs.hpp"
#include "World.hpp"
#ifdef HAVE_TESTRUNNER
#include "UnitTestMain.hpp"
#endif /*HAVE_TESTRUNNER*/
/********************************************** Test classes **************************************/
// Registers the fixture into the 'registry'
CPPUNIT_TEST_SUITE_REGISTRATION( ExportGraph_ToJobsTest );
void ExportGraph_ToJobsTest::setUp()
{
// failing asserts should be thrown
ASSERT_DO(Assert::Throw);
// setVerbosity(6);
}
void ExportGraph_ToJobsTest::tearDown()
{
World::purgeInstance();
}
/** UnitTest for getGridExtentsForGivenBoundingBox().
*/
void ExportGraph_ToJobsTest::getGridExtentsForGivenBoundingBox_Test()
{
double begin[NDIM] = { 0., 0., 0. };
double end[NDIM] = { 40., 40., 40. };
double level = 5;
const SamplingGridProperties domain(begin, end, level);
double empty_boundary = 5.;
std::vector< Vector > fragment_extents =
boost::assign::list_of
( Vector( 5.2, 5.2, 5.2) ) // simple test
( Vector( 5., 5., 5.) ); // simple test: higher and lower center is same point
const double delta = 2.1;
for (std::vector< Vector >::const_iterator iter = fragment_extents.begin();
iter != fragment_extents.end(); ++iter)
{
const Vector &fragment_extent = *iter;
for (double x = 0.; x <= end[0]-fragment_extent[0]; x+= delta)
for (double y = 0.; y <= end[1]-fragment_extent[1]; y+= delta)
for (double z = 0.; z <= end[2]-fragment_extent[2]; z+= delta) {
Vector minimum( x, y, z);
Vector maximum = minimum+fragment_extent;
const SamplingGridProperties grid =
ExportGraph_ToJobs::getGridExtentsForGivenBoundingBox(
std::make_pair(minimum, maximum), domain, empty_boundary);
for (size_t i=0;i= domain.begin[i] );
CPPUNIT_ASSERT( grid.end[i] <= domain.end[i] );
// check the desired fragment extent plus boundary is contained
const double extent = grid.end[i] - grid.begin[i];
CPPUNIT_ASSERT (extent > (2.*empty_boundary+fragment_extent[i]));
// check the number of grid points of the grid is divisible integer and ...
const double delta = domain.getDeltaPerAxis(i); // grid would give a screwed delta that matches
const unsigned int gridpoints = extent/delta;
CPPUNIT_ASSERT ( fabs( extent/delta - (double)gridpoints) < std::numeric_limits::epsilon()*1e4 );
// ... divisible by 2
const double power = log(extent/delta)/log(2.);
const unsigned int power_of_two = power;
CPPUNIT_ASSERT_EQUAL( (int)power_of_two, grid.level );
CPPUNIT_ASSERT ( fabs( power - (double)power_of_two) < std::numeric_limits::epsilon()*1e4 );
CPPUNIT_ASSERT ( fabs( ::pow(2., power_of_two) - gridpoints) < std::numeric_limits::epsilon()*1e4);
// check that fragment grid's begin and end are on domain discrete points
const double lower_begin = domain.getNearestLowerGridPoint(grid.begin[i], i);
const double higher_begin = domain.getNearestHigherGridPoint(grid.begin[i], i);
CPPUNIT_ASSERT( fabs( lower_begin - higher_begin) < std::numeric_limits::epsilon()*1e4 );
const double lower_end = domain.getNearestLowerGridPoint(grid.end[i], i);
const double higher_end = domain.getNearestHigherGridPoint(grid.end[i], i);
CPPUNIT_ASSERT( fabs( lower_end - higher_end) < std::numeric_limits::epsilon()*1e4 );
}
}
}
}
/** UnitTest for setAcceptableFragmentLevel().
*/
void ExportGraph_ToJobsTest::setAcceptableFragmentLevel_Test()
{
double begin[NDIM] = { 0., 0., 0. };
double end[NDIM] = { 20., 20., 20. };
double level = 5;
const double min_meshwidth = 20./::pow(2., level);
const unsigned int threshold_level = 9;
const double threshold = 20./::pow(2., threshold_level);
const double delta = 0.05;
unsigned int oldlevel=0;
for (double max_meshwidth = min_meshwidth+1.; max_meshwidth >= threshold; max_meshwidth -= delta) {
SamplingGridProperties domain(begin, end, level);
ExportGraph_ToJobs::setAcceptableFragmentLevel(domain, max_meshwidth);
// must always be larger equal to old value
CPPUNIT_ASSERT( (unsigned int)domain.level >= oldlevel );
oldlevel = domain.level;
// may never get smaller than minimal value
CPPUNIT_ASSERT( (unsigned int)domain.level >= 1 );
// cannot get larger than upper most level
CPPUNIT_ASSERT( (unsigned int)domain.level <= threshold_level );
}
}