Skip to content

Commit 561708e

Browse files
committed
Merge pull request #3 from memmett/memmett/code-cleanup
Merge development into code-cleanup.
2 parents a4b737a + 6340d92 commit 561708e

File tree

18 files changed

+836
-134
lines changed

18 files changed

+836
-134
lines changed

.travis.yml

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
11
language:
22
- cpp
33

4-
compiler:
5-
- gcc
6-
- clang
7-
4+
# why does Travis not allow for multi-dimensional build matrices?!?
5+
# -> https://github.com/travis-ci/travis-ci/issues/1519
86
env:
9-
- CMAKE_BUILD_TYPE="Release"
10-
- CMAKE_BUILD_TYPE="Debug"
7+
matrix:
8+
- CMAKE_BUILD_TYPE="Release" WITH_MPI=OFF CXX=clang++
9+
- CMAKE_BUILD_TYPE="Release" WITH_MPI=OFF CXX=g++
10+
- CMAKE_BUILD_TYPE="Release" WITH_MPI=ON CXX=g++
11+
- CMAKE_BUILD_TYPE="Debug" WITH_MPI=OFF CXX=clang++
12+
- CMAKE_BUILD_TYPE="Debug" WITH_MPI=OFF CXX=g++
13+
- CMAKE_BUILD_TYPE="Debug" WITH_MPI=ON CXX=g++
1114

1215
before_install:
1316
- sudo add-apt-repository ppa:apokluda/boost1.53 --yes
1417
- sudo add-apt-repository ppa:ubuntu-toolchain-r/test --yes # libstdc++-4.8
15-
- if [ "${CXX}" == "clang++" ]; then sudo add-apt-repository --yes ppa:h-rayflood/llvm; fi # clang++-3.2
18+
- if [ "${CXX}" == "clang++" ]; then sudo add-apt-repository --yes ppa:h-rayflood/llvm; fi # clang++-3.2
1619
- sudo apt-get update
1720

21+
1822
install:
23+
# note: clang needs g++-4.8 it for libstdc++ update
1924
- if [ "${CXX}" == "clang++" ]; then sudo apt-get -qq install clang-3.2; fi
25+
- if [ "${WITH_MPI}" == "ON" ]; then sudo apt-get -qq install mpich2 libmpich2-dev; fi
2026
- sudo apt-get install g++-4.8 # clang need it for libstdc++ update
21-
- sudo apt-get install libboost1.53-all-dev
27+
- sudo apt-get install libboost1.53-all-dev libfftw3-3 libfftw3-dev
2228

2329
before_script:
2430
# update compilers
@@ -28,7 +34,7 @@ before_script:
2834
script:
2935
- mkdir build
3036
- cd build
31-
- cmake -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -Dpfasst_DISABLE_LIBCXX=ON -Dpfasst_BUILD_TESTS=ON -Dpfasst_BUILD_EXAMPLES=ON ..
37+
- cmake -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -Dpfasst_WITH_MPI=${WITH_MPI} -Dpfasst_DISABLE_LIBCXX=ON -Dpfasst_BUILD_TESTS=ON -Dpfasst_BUILD_EXAMPLES=ON ..
3238
- make
3339
- make test
34-
40+
- make run_example_all

3rdparty/CMakeLists.txt

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,40 @@ list(APPEND 3rdparty_INCLUDES ${Boost_INCLUDE_DIRS})
2121

2222

2323
if(pfasst_BUILD_EXAMPLES)
24-
message(STATUS "FFTW3")
25-
set(fftw3_SOURCE_DIR "${pfasst_BINARY_DIR}/3rdparty/src/fftw3")
26-
set(fftw3_INSTALL_DIR "${pfasst_BINARY_DIR}/3rdparty/src/fftw3-install")
24+
find_package(FFTW)
2725

28-
ExternalProject_Add(
29-
fftw3
30-
LIST_SEPARATOR " "
31-
URL http://fftw.org/fftw-3.3.4.tar.gz
32-
URL_MD5 2edab8c06b24feeb3b82bbb3ebf3e7b3
33-
TIMEOUT 30
34-
UPDATE_COMMAND ""
35-
PATCH_COMMAND ""
36-
BUILD_IN_SOURCE ON
37-
CONFIGURE_COMMAND ${fftw3_SOURCE_DIR}/configure CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} CXXFLAGS=${CMAKE_CXX_FLAGS} --prefix=${fftw3_INSTALL_DIR} --libdir=${fftw3_INSTALL_DIR}/lib
38-
BUILD_COMMAND make
39-
TEST_COMMAND ""
40-
INSTALL_DIR ${fftw3_SOURCE_DIR}-install
41-
INSTALL_COMMAND make install
42-
LOG_DOWNLOAD ON
43-
LOG_CONFIGURE ON
44-
LOG_BUILD ON
45-
)
46-
# Specify include dir
47-
set(fftw3_INCLUDES ${fftw3_INSTALL_DIR}/include PARENT_SCOPE)
48-
set(fftw3_LIBS ${fftw3_INSTALL_DIR}/lib/libfftw3.a PARENT_SCOPE)
26+
if(NOT FFTW_FOUND)
27+
message(STATUS "FFTW3 not found on your system.")
28+
message(STATUS "Going to download and compile it automatically.")
29+
set(fftw3_SOURCE_DIR "${pfasst_BINARY_DIR}/3rdparty/src/fftw3")
30+
set(fftw3_INSTALL_DIR "${pfasst_BINARY_DIR}/3rdparty/src/fftw3-install")
31+
32+
ExternalProject_Add(
33+
fftw3
34+
LIST_SEPARATOR " "
35+
URL http://fftw.org/fftw-3.3.4.tar.gz
36+
URL_MD5 2edab8c06b24feeb3b82bbb3ebf3e7b3
37+
TIMEOUT 30
38+
UPDATE_COMMAND ""
39+
PATCH_COMMAND ""
40+
BUILD_IN_SOURCE ON
41+
CONFIGURE_COMMAND ${fftw3_SOURCE_DIR}/configure CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} CXXFLAGS=${CMAKE_CXX_FLAGS} --prefix=${fftw3_INSTALL_DIR} --libdir=${fftw3_INSTALL_DIR}/lib
42+
BUILD_COMMAND make
43+
TEST_COMMAND ""
44+
INSTALL_DIR ${fftw3_SOURCE_DIR}-install
45+
INSTALL_COMMAND make install
46+
LOG_DOWNLOAD ON
47+
LOG_CONFIGURE ON
48+
LOG_BUILD ON
49+
)
50+
# Specify include dir
51+
set(FFTW_INCLUDE_PATH ${fftw3_INSTALL_DIR}/include PARENT_SCOPE)
52+
set(FFTW_LIBRARIES ${fftw3_INSTALL_DIR}/lib/libfftw3.a PARENT_SCOPE)
53+
else()
54+
set(FFTW_INCLUDE_PATH ${FFTW_INCLUDE_PATH} PARENT_SCOPE)
55+
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} PARENT_SCOPE)
56+
endif()
57+
set(FFTW_FOUND ${FFTW_FOUND} PARENT_SCOPE)
4958

5059
if(pfasst_BUILD_TESTS)
5160
message(STATUS "--------------------------------------------------------------------------------")

CMakeLists.txt

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
11
cmake_minimum_required(VERSION 2.8)
2-
3-
set(CMAKE_VERBOSE_MAKEFILE ON)
4-
52
project(pfasst)
63

4+
list(APPEND CMAKE_MODULE_PATH ${pfasst_SOURCE_DIR}/cmake)
75
include(cmake/utility_functions.cmake)
86
include(CheckCXXCompilerFlag)
97
include(ExternalProject)
108
# Set default ExternalProject root directory
119
set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/3rdparty)
1210

13-
option(pfasst_DISABLE_LIBCXX "Disable use of LLVM's libc++ when compiling with Clang." ON)
14-
option(pfasst_BUILD_EXAMPLES "Build example programs." ON)
15-
option(pfasst_BUILD_TESTS "Build test suite for PFASST." ON)
11+
option(pfasst_DISABLE_LIBCXX "Disable use of LLVM's libc++ when compiling with Clang." ON )
12+
option(pfasst_BUILD_EXAMPLES "Build example programs." ON )
13+
option(pfasst_BUILD_TESTS "Build test suite for PFASST." ON )
14+
option(pfasst_WITH_MPI "Build with MPI enabled." OFF)
1615

1716
# output directories
1817
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${pfasst_SOURCE_DIR}/dist/bin")
1918
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${pfasst_SOURCE_DIR}/dist/lib")
2019
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${pfasst_SOURCE_DIR}/dist/lib")
2120

21+
if(${pfasst_WITH_MPI})
22+
find_package(MPI REQUIRED)
23+
# set(CMAKE_C_COMPILER ${MPI_C_COMPILER})
24+
# set(CMAKE_CXX_COMPILER ${MPI_CXX_COMPILER})
25+
message(STATUS "Using MPI C++ Compiler: ${MPI_CXX_COMPILER}")
26+
endif()
27+
2228
# check for C++11 support
2329
if(${CMAKE_CXX_COMPILER_ID} MATCHES GNU)
2430
check_cxx_compiler_flag(-std=c++11 HAVE_STD11)
@@ -96,5 +102,7 @@ endif()
96102
message(STATUS "********************************************************************************")
97103

98104
message(STATUS "C++ Compiler ID: ${CMAKE_CXX_COMPILER_ID}")
105+
message(STATUS "C++ Compiler Names: ${CMAKE_CXX_COMPILER_NAMES}")
106+
message(STATUS "C++ Compiler Version: ${CMAKE_CXX_COMPILER_VERSION}")
99107
message(STATUS "C++ Flags: ${CMAKE_CXX_FLAGS}")
100108
message(STATUS "C++ link flags: ${CMAKE_CXX_LINK_FLAGS}")

cmake/FindFFTW.cmake

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# - Find FFTW
2+
# Find the native FFTW3 includes and library
3+
#
4+
# FFTW_INCLUDE_PATH - where to find fftw3.h
5+
# FFTW_LIBRARIES - List of libraries when using FFTW.
6+
# FFTW_FOUND - True if FFTW found.
7+
8+
if(FFTW_INCLUDE_PATH)
9+
# Already in cache, be silent
10+
set(FFTW_FIND_QUIETLY TRUE)
11+
endif(FFTW_INCLUDE_PATH)
12+
13+
find_path(FFTW_INCLUDE_PATH fftw3.h)
14+
15+
find_library(FFTW_LIBRARIES NAMES fftw3)
16+
17+
# handle the QUIETLY and REQUIRED arguments and set FFTW_FOUND to TRUE if
18+
# all listed variables are TRUE
19+
include(FindPackageHandleStandardArgs)
20+
find_package_handle_standard_args(FFTW DEFAULT_MSG FFTW_LIBRARIES FFTW_INCLUDE_PATH)
21+
22+
mark_as_advanced(FFTW_LIBRARIES FFTW_INCLUDE_PATH)

examples/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
1+
set(all_example_runs)
2+
13
add_subdirectory(advection_diffusion)
4+
5+
add_custom_target(run_example_all
6+
DEPENDS ${all_example_runs}
7+
COMMENT "Running all examples" VERBATIM
8+
)
9+
message(STATUS " - run_example_all")
Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
set(all_example_runs ${all_example_runs})
2+
set(all_advec_example_runs)
3+
14
message(STATUS " advection_diffusion")
25
include_directories(
36
${3rdparty_INCLUDES}
4-
${fftw3_INCLUDES}
7+
${FFTW_INCLUDE_PATH}
58
${pfasst_INCLUDES}
69
)
710

@@ -11,13 +14,72 @@ set(advec_examples
1114
serial_mlsdc_autobuild
1215
)
1316

14-
foreach(example ${advec_examples})
17+
set(advec_mpi_examples)
18+
19+
if(${pfasst_WITH_MPI})
20+
set(advec_mpi_examples
21+
mpi_pfasst
22+
)
23+
endif()
24+
25+
set(all_advec_examples
26+
${advec_examples}
27+
${advec_mpi_examples}
28+
)
29+
30+
foreach(example ${all_advec_examples})
1531
add_executable(${example} ${CMAKE_CURRENT_SOURCE_DIR}/${example}.cpp)
16-
add_dependencies(${example} fftw3)
32+
if(NOT FFTW_FOUND)
33+
add_dependencies(${example} fftw3)
34+
endif()
1735
target_link_libraries(${example}
18-
${fftw3_LIBS}
36+
${FFTW_LIBRARIES}
1937
)
2038
set_target_properties(${example}
2139
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/examples/advection_diffusion
2240
)
2341
endforeach(example)
42+
43+
message(STATUS " creating make targets to run examples")
44+
foreach(example ${advec_examples})
45+
add_custom_target(run_example_advec_${example}
46+
COMMAND ${example}
47+
DEPENDS ${example}
48+
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/examples/advection_diffusion
49+
COMMENT "Running Advection-Diffusion example: ${example}" VERBATIM
50+
)
51+
list(APPEND all_advec_example_runs run_example_advec_${example})
52+
message(STATUS " - run_example_advec_${example}")
53+
endforeach(example)
54+
55+
if(${pfasst_WITH_MPI})
56+
include_directories(${MPI_CXX_INCLUDE_PATH})
57+
foreach(example ${advec_mpi_examples})
58+
if(MPI_COMPILE_FLAGS)
59+
set_target_properties(${example} PROPERTIES COMPILE_FLAGS "${MPI_COMPILE_FLAGS}")
60+
endif()
61+
if(MPI_LINK_FLAGS)
62+
set_target_properties(${example} PROPERTIES LINK_FLAGS "${MPI_LINK_FLAGS}")
63+
endif()
64+
target_link_libraries(${example} ${MPI_CXX_LIBRARIES})
65+
endforeach(example)
66+
message(STATUS " creating make targets to run MPI examples")
67+
foreach(example ${advec_mpi_examples})
68+
add_custom_target(run_example_advec_${example}
69+
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 4 ${MPIEXEC_PREFLAGS} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/examples/advection_diffusion/${example} ${MPIEXEC_POSTFLAGS}
70+
DEPENDS ${example}
71+
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/examples/advection_diffusion
72+
COMMENT "Running Advection-Diffusion example: ${example}" VERBATIM
73+
)
74+
list(APPEND all_advec_example_runs run_example_advec_${example})
75+
message(STATUS " - run_example_advec_${example}")
76+
endforeach(example)
77+
endif()
78+
79+
add_custom_target(run_example_advec_all
80+
DEPENDS ${all_advec_example_runs}
81+
COMMENT "Running all Advection-Diffusion examples" VERBATIM
82+
)
83+
message(STATUS " - run_example_advec_all")
84+
85+
set(all_example_runs ${all_advec_example_runs} PARENT_SCOPE)
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* Advection/diffusion example using an encapsulated IMEX sweeper.
3+
*
4+
* This example uses MPI PFASST.
5+
*/
6+
7+
#include <memory>
8+
#include <cassert>
9+
10+
#include <mpi.h>
11+
#include <fftw3.h>
12+
13+
#include <pfasst.hpp>
14+
#include <pfasst/pfasst.hpp>
15+
#include <pfasst/mpi_communicator.hpp>
16+
#include <pfasst/encap/automagic.hpp>
17+
#include <pfasst/encap/mpi_vector.hpp>
18+
19+
#include "advection_diffusion_sweeper.hpp"
20+
#include "spectral_transfer_1d.hpp"
21+
22+
using namespace std;
23+
using namespace pfasst;
24+
using namespace pfasst::encap;
25+
using namespace pfasst::mpi;
26+
27+
int main(int argc, char** argv)
28+
{
29+
MPI_Init(&argc, &argv);
30+
31+
const size_t nsteps = 4;
32+
const double dt = 0.01;
33+
const size_t niters = 4;
34+
35+
vector<pair<size_t, string>> nodes = {
36+
{ 3, "gauss-lobatto" },
37+
{ 5, "gauss-lobatto" }
38+
};
39+
40+
vector<size_t> ndofs = { 64, 128 };
41+
42+
auto build_level = [ndofs](size_t level) {
43+
auto factory = make_shared<MPIVectorFactory<double>>(ndofs[level]);
44+
auto sweeper = make_shared<AdvectionDiffusionSweeper<>>(ndofs[level]);
45+
auto transfer = make_shared<SpectralTransfer1D<>>();
46+
47+
return AutoBuildTuple<>(sweeper, transfer, factory);
48+
};
49+
50+
auto initial = [](shared_ptr<EncapSweeper<>> sweeper, shared_ptr<Encapsulation<>> q0) {
51+
auto ad = dynamic_pointer_cast<AdvectionDiffusionSweeper<>>(sweeper);
52+
assert(ad);
53+
ad->exact(q0, 0.0);
54+
};
55+
56+
MPICommunicator comm(MPI_COMM_WORLD);
57+
PFASST<> pf;
58+
59+
auto_build(pf, nodes, build_level);
60+
auto_setup(pf, initial);
61+
62+
pf.set_comm(&comm);
63+
pf.set_duration(0.0, nsteps * dt, dt, niters);
64+
pf.set_nsweeps({2, 1});
65+
pf.run();
66+
67+
fftw_cleanup();
68+
69+
MPI_Finalize();
70+
}

0 commit comments

Comments
 (0)