tTests incorporated with CMake - sphere - GPU-based 3D discrete element method algorithm with optional fluid coupling
 (HTM) git clone git://src.adamsgaard.dk/sphere
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit 5d7e811dcb4c7226689594b13015a7aa466e7d03
 (DIR) parent 38656ba76b71da03143f5195572cf5df4f0c7aae
 (HTM) Author: Anders Damsgaard <adc@geo.au.dk>
       Date:   Fri, 25 Jan 2013 15:21:07 +0100
       
       Tests incorporated with CMake
       
       Diffstat:
         M CMakeLists.txt                      |      31 +++++++++++++++++++------------
         A tests/CMakeLists.txt                |       8 ++++++++
         A tests/io_tests.py                   |      40 +++++++++++++++++++++++++++++++
         A tests/porosity_tests.py             |      62 +++++++++++++++++++++++++++++++
         A tests/pytestutils.py                |      30 ++++++++++++++++++++++++++++++
         R python/tests.py -> tests/tests.py   |       0 
       
       6 files changed, 159 insertions(+), 12 deletions(-)
       ---
 (DIR) diff --git a/CMakeLists.txt b/CMakeLists.txt
       t@@ -1,28 +1,35 @@
        # Create input/output folders
       -FILE(MAKE_DIRECTORY input)
       -FILE(MAKE_DIRECTORY output)
       -FILE(MAKE_DIRECTORY img_out)
       -FILE(MAKE_DIRECTORY gnuplot/data)
       +file(MAKE_DIRECTORY input)
       +file(MAKE_DIRECTORY output)
       +file(MAKE_DIRECTORY img_out)
       +file(MAKE_DIRECTORY gnuplot/data)
        
        # The name of the project.
       -PROJECT(sphere_CUDA)
       +project(sphere_CUDA)
        
        # CMake minimum version required
        # FindCUDA script is distributed since version 2.8
       -CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
       +cmake_minimum_required(VERSION 2.8)
        
        # Find CUDA
       -FIND_PACKAGE(CUDA REQUIRED)
       +find_package(CUDA REQUIRED)
        
        # Find OpenMP
       -FIND_PACKAGE(OpenMP)
       +find_package(OpenMP)
        
        # Find Boost components
        #find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
        
       -#SET(CMAKE_BUILD_TYPE Debug)
       -SET(CMAKE_BUILD_TYPE Release)
       +# Uncomment to enable testing
       +enable_testing()
        
       +# Set build type
       +#set(CMAKE_BUILD_TYPE Debug)
       +set(CMAKE_BUILD_TYPE Release)
        
       -#Add source directory to project.
       -ADD_SUBDIRECTORY(src)
       +
       +# Add source directory to project.
       +add_subdirectory(src)
       +
       +# Add tests
       +add_subdirectory(tests)
 (DIR) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
       t@@ -0,0 +1,8 @@
       +
       +find_package(PythonInterp REQUIRED)
       +
       +add_test(io_tests ${PYTHON_EXECUTABLE} 
       +    ${CMAKE_CURRENT_BINARY_DIR}/io_tests.py)
       +
       +add_test(porosity_tests ${PYTHON_EXECUTABLE} 
       +    ${CMAKE_CURRENT_BINARY_DIR}/porosity_tests.py)
 (DIR) diff --git a/tests/io_tests.py b/tests/io_tests.py
       t@@ -0,0 +1,40 @@
       +#!/usr/bin/env python
       +from pytestutils import *
       +
       +#### Input/output tests ####
       +print("### Input/output tests ###")
       +
       +# Generate data in python
       +orig = Spherebin(np = 100, nw = 1, sid = "test-initgrid")
       +orig.generateRadii(histogram = False)
       +orig.defaultParams()
       +orig.initRandomGridPos(g = numpy.zeros(orig.nd))
       +orig.initTemporal(current = 0.0, total = 0.0)
       +orig.time_total = 2.0*orig.time_dt;
       +orig.time_file_dt = orig.time_dt;
       +orig.writebin(verbose=False)
       +
       +# Test Python IO routines
       +py = Spherebin()
       +py.readbin("../input/" + orig.sid + ".bin", verbose=False)
       +compare(orig, py, "Python IO:")
       +
       +# Test C++ IO routines
       +orig.run(verbose=False, hideinputfile=True)
       +#orig.run()
       +cpp = Spherebin()
       +cpp.readbin("../output/" + orig.sid + ".output00000.bin", verbose=False)
       +compare(orig, cpp, "C++ IO:   ")
       +
       +# Test CUDA IO routines
       +cuda = Spherebin()
       +cuda.readbin("../output/" + orig.sid + ".output00001.bin", verbose=False)
       +cuda.time_current = orig.time_current
       +cuda.time_step_count = orig.time_step_count
       +compare(orig, cuda, "CUDA IO:  ")
       +
       +# Remove temporary files
       +cleanup(orig)
       +
       +
       +
 (DIR) diff --git a/tests/porosity_tests.py b/tests/porosity_tests.py
       t@@ -0,0 +1,62 @@
       +#!/usr/bin/env python
       +from pytestutils import *
       +
       +#### Porosity tests ####
       +print("### porosity tests ###")
       +
       +# Generate data in python
       +orig = Spherebin(np = 100, nw = 1, sid = "test-initgrid")
       +orig.generateRadii(histogram = False)
       +orig.defaultParams()
       +orig.initRandomGridPos(g = numpy.zeros(orig.nd))
       +orig.initTemporal(current = 0.0, total = 0.0)
       +orig.time_total = 2.0*orig.time_dt;
       +orig.time_file_dt = orig.time_dt;
       +orig.writebin(verbose=False)
       +
       +def testPorosities(spherebin):
       +
       +    # Number of vertical slices
       +    slicevals = [1, 2, 4]
       +    i = 1   # iterator var
       +    for slices in slicevals:
       +
       +        # Find correct value of bulk porosity
       +        n_bulk = spherebin.bulkPorosity()
       +        #print("Bulk: " + str(n_bulk))
       +
       +        porosity = spherebin.porosity(slices = slices)[0]
       +        #print("Avg: " + str(numpy.average(porosity)))
       +        #print(porosity)
       +
       +        # Check if average of porosity function values matches the bulk porosity
       +        compareFloats(n_bulk, numpy.average(porosity), \
       +                spherebin.sid + ": Porosity average to bulk porosity ("\
       +                + str(i) + "/" + str(len(slicevals)) + "):")
       +        i += 1
       +
       +# Test data from previous test
       +testPorosities(orig)
       +
       +# Simple cubic packing of uniform spheres
       +# The theoretical porosity is (4/3*pi*r^3)/(2r)^3 = 0.476
       +sidelen = 10
       +cubic = Spherebin(np = sidelen**3, sid='cubic')
       +radius = 1.0
       +cubic.generateRadii(psd='uni', radius_mean=radius, radius_variance=0.0, histogram=False)
       +for ix in range(sidelen):
       +    for iy in range(sidelen):
       +        for iz in range(sidelen):
       +            i = ix + sidelen * (iy + sidelen * iz) # linear index
       +            cubic.x[i,0] = ix*radius*2.0 + radius
       +            cubic.x[i,1] = iy*radius*2.0 + radius
       +            cubic.x[i,2] = iz*radius*2.0 + radius
       +cubic.L[:] = 2.0 * radius * sidelen
       +
       +cubic.initTemporal(0.2)
       +cubic.initGrid()
       +
       +testPorosities(cubic)
       +
       +cleanup(cubic)
       +
 (DIR) diff --git a/tests/pytestutils.py b/tests/pytestutils.py
       t@@ -0,0 +1,30 @@
       +#!/usr/bin/env python
       +
       +from sphere import *
       +import subprocess
       +
       +def passed():
       +    return "\tPassed"
       +
       +def failed():
       +    return "\tFailed"
       +
       +def compare(first, second, string):
       +  if (first == second):
       +    print(string + passed())
       +  else:
       +    print(string + failed())
       +
       +def compareFloats(first, second, string, criterion=1e-5):
       +    if abs(first-second) < criterion:
       +        print(string + passed())
       +    else :
       +        print(string + failed())
       +
       +def cleanup(spherebin):
       +    'Remove temporary files'
       +    subprocess.call("rm -f ../input/" + spherebin.sid + ".bin", shell=True)
       +    subprocess.call("rm -f ../output/" + spherebin.sid + ".*.bin", shell=True)
       +    print("")
       +
       +
 (DIR) diff --git a/python/tests.py b/tests/tests.py