diff --git a/HySoP/CMakeLists.txt b/HySoP/CMakeLists.txt index fb0578d86cb96f9521d135cd42d970e964e2405b..4273534d32521c094ae06936e25b5fa66e8d1003 100644 --- a/HySoP/CMakeLists.txt +++ b/HySoP/CMakeLists.txt @@ -244,7 +244,7 @@ endif() #C++ variables used by setup.py.in for swig -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wall -Wextra -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-parameter ${FFTW_COMPILE_FLAGS} -std=c++11") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wall -Wextra -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-parameter ${FFTW_COMPILE_FLAGS} -fPIC -std=c++11") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") @@ -292,14 +292,7 @@ endif() # Hysop C++ library is generated in setup.py by swig # --- C++ main and tests --- if(WITH_LIB_CXX) - set(HYSOP_CXX_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/build/libcpp2hysop.so") - set(HYSOP_CXX_LIBRARY_DEP "cpp2hysoplib") - add_custom_target(${HYSOP_CXX_LIBRARY_DEP} - DEPENDS python-build - COMMAND cp `find ${CMAKE_CURRENT_BINARY_DIR}/build -name _${CPP_2_HYSOP}.so` ${HYSOP_CXX_LIBRARY} - WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/build" - COMMENT "Copy swig c++ library to link") - + get_filename_component(CXX_DIR "${CMAKE_SOURCE_DIR}/src/hysop++" ABSOLUTE) get_filename_component(CXX_MAIN_DIR "${CXX_DIR}/main" ABSOLUTE) get_filename_component(CXX_TEST_DIR "${CXX_DIR}/tests" ABSOLUTE) @@ -310,6 +303,28 @@ if(WITH_LIB_CXX) link_directories(${CXX_EXT_LIB_DIRS}) add_definitions(${CXX_EXTRA_DEFINES}) + if(WITH_MAIN_CXX OR WITH_GOOGLE_TESTS) + if(APPLE) #swig only generates a bundle, need to generate another static library... + set(HYSOP_CXX_LIBRARY_DYLIB "cpp2hysop_dylib") + + file(GLOB_RECURSE source_files ${CXX_SOURCE_DIR}/*.cpp) + add_library(${HYSOP_CXX_LIBRARY_DYLIB} STATIC ${source_files}) + target_link_libraries(${HYSOP_CXX_LIBRARY_DYLIB} ${EXT_LIBRARIES}) + + set(HYSOP_CXX_LIBRARY ${HYSOP_CXX_LIBRARY_DYLIB}) + set(HYSOP_CXX_LIBRARY_DEP cpp2hysop_dylib) + else() #nothing to do on other platforms bundle <=> dynamic libraries, so just copy the swig generated one + set(HYSOP_CXX_LIBRARY_BUNDLE "${LIBRARY_OUTPUT_PATH}/libcpp2hysop_bundle.so") + add_custom_target(cpp2hysop_bundle + DEPENDS python-build + COMMAND cp `find ${CMAKE_CURRENT_BINARY_DIR}/build -name _${CPP_2_HYSOP}.so` ${HYSOP_CXX_LIBRARY_BUNDLE} + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + COMMENT "Copy swig c++ library to link") + set(HYSOP_CXX_LIBRARY ${HYSOP_CXX_LIBRARY_BUNDLE}) + set(HYSOP_CXX_LIBRARY_DEP cpp2hysop_bundle) + endif() + endif() + if(WITH_MAIN_CXX) list(APPEND cxx_executable_sources "${CXX_MAIN_DIR}/poissonSolver.cpp") list(APPEND cxx_executable_sources "${CXX_MAIN_DIR}/diffSolver.cpp") diff --git a/HySoP/setup.py.in b/HySoP/setup.py.in index 11d96582d35fc583c5d23e0073c6bffb655cc005..3f14efafa0e99cc8862e13c20b1bc435d9bba8bb 100644 --- a/HySoP/setup.py.in +++ b/HySoP/setup.py.in @@ -135,7 +135,7 @@ def create_swig_extension(name, inc_dirs, src_dirs=None, sources=None): #print "LIBRARY_DIRS=",library_dirs #print "EXTRA_COMPILE_ARGS=",extra_compile_args #print "EXTRA_LINK_ARGS=",extra_link_args - print "DEFINE_MACROS=",define_macros + #print "DEFINE_MACROS=",define_macros # To avoid -I -I in compiler call, which results in a bug: #while inc_dir.count('') > 0: # inc_dir.remove('') diff --git a/HySoP/src/hysop++/src/fft/fftwComplex.h b/HySoP/src/hysop++/src/fft/fftwComplex.h index e2fd44593400408297fc02f397575e16b753eab7..a28954a5f5af170f11ed2eb0a957fa95440cbfc9 100644 --- a/HySoP/src/hysop++/src/fft/fftwComplex.h +++ b/HySoP/src/hysop++/src/fft/fftwComplex.h @@ -9,7 +9,11 @@ namespace hysop { namespace fft { - template <typename T> struct fftw_complex_type {}; + template <typename T> struct fftw_complex_type { + typedef void value_type; + typedef void fftw_type; + typedef void std_type; + }; template <> struct fftw_complex_type<long double> { typedef long double value_type; diff --git a/HySoP/src/hysop++/src/fft/planner.h b/HySoP/src/hysop++/src/fft/planner.h index c80197cae16174063e69305367a73c65184ed13a..f9b5f9e0eacb9848993b65ebadca2988d182ac8c 100644 --- a/HySoP/src/hysop++/src/fft/planner.h +++ b/HySoP/src/hysop++/src/fft/planner.h @@ -316,6 +316,8 @@ namespace hysop { if(!inplace) std::copy(input_rdata.begin(), input_rdata.end(), output_rdata.begin()); this->reset(); + ss << m_plannedTransformStr << std::endl; + m_plannedTransformStr = ss.str(); return false; } diff --git a/HySoP/src/hysop++/src/maths/quad_maths.h b/HySoP/src/hysop++/src/maths/quad_maths.h index d02b3da6071af710ea9444c1fa9d892c28ce6712..9991df6a91e929831453170e8bde2cf487fdc107 100644 --- a/HySoP/src/hysop++/src/maths/quad_maths.h +++ b/HySoP/src/hysop++/src/maths/quad_maths.h @@ -144,21 +144,27 @@ namespace std { inline __complex128 tanh(__complex128 x) { return ctanhq(x); } inline std::ostream& operator<<(std::ostream& os, __float128 x) { - const int prec = (os.precision()==0 ? 42 : os.precision()); + const int prec = os.precision(); - char buf[128]; - int n = quadmath_snprintf(buf, 128, "%+-#46.*Qe", prec, x); - - if (n>128) { - char *str = new char[n+1]; - if (str) - quadmath_snprintf (str, n+1, "%+-#46.*Qe", prec, x); - os << str; - delete(str); + if(prec==0) { + os << static_cast<long long int>(x); } - else { - os << buf; + else { + char buf[128]; + const std::string format = "%+-#"+std::to_string(prec)+".*Qe"; + const int n = quadmath_snprintf(buf,128,format.c_str(),prec,x); + if(n>127) { + char *str = new char[n+1]; + if (str) + quadmath_snprintf (str,n+1,format.c_str(),prec,x); + os << str; + delete(str); + } + else { + os << buf; + } } + return os; } } diff --git a/HySoP/src/hysop++/tests/testDiffSolver/CMakeLists.txt b/HySoP/src/hysop++/tests/testDiffSolver/CMakeLists.txt index d97166f65e3fcad2a1bf8c6abe90628b971cad7b..6f3ddcdc849f9243ac45c15c400bebb3e95fef06 100644 --- a/HySoP/src/hysop++/tests/testDiffSolver/CMakeLists.txt +++ b/HySoP/src/hysop++/tests/testDiffSolver/CMakeLists.txt @@ -3,6 +3,7 @@ file(GLOB CPP_SRCS *.cpp) set(SRCS ${CPP_SRCS}) get_filename_component(test_name ${CMAKE_CURRENT_SOURCE_DIR} NAME) +add_definitions(${CXX_EXTRA_DEFINES}) add_executable(${test_name} ${SRCS}) add_dependencies(${test_name} ${HYSOP_CXX_LIBRARY_DEP}) diff --git a/HySoP/src/hysop++/tests/testPlanner/CMakeLists.txt b/HySoP/src/hysop++/tests/testPlanner/CMakeLists.txt index d97166f65e3fcad2a1bf8c6abe90628b971cad7b..6f3ddcdc849f9243ac45c15c400bebb3e95fef06 100644 --- a/HySoP/src/hysop++/tests/testPlanner/CMakeLists.txt +++ b/HySoP/src/hysop++/tests/testPlanner/CMakeLists.txt @@ -3,6 +3,7 @@ file(GLOB CPP_SRCS *.cpp) set(SRCS ${CPP_SRCS}) get_filename_component(test_name ${CMAKE_CURRENT_SOURCE_DIR} NAME) +add_definitions(${CXX_EXTRA_DEFINES}) add_executable(${test_name} ${SRCS}) add_dependencies(${test_name} ${HYSOP_CXX_LIBRARY_DEP}) diff --git a/HySoP/src/hysop++/tests/testPlanner/testPlanner.cpp b/HySoP/src/hysop++/tests/testPlanner/testPlanner.cpp index 539d03426795977061e005c8217e805240e6cdbc..09311df6a77acb1eb0e91574162ca69a60fc4e9b 100644 --- a/HySoP/src/hysop++/tests/testPlanner/testPlanner.cpp +++ b/HySoP/src/hysop++/tests/testPlanner/testPlanner.cpp @@ -1,4 +1,5 @@ +#include "maths/quad_maths.h" #include "testPlanner.h" #include "data/multi_array/multi_array.h" @@ -26,7 +27,8 @@ static constexpr std::pair<fft::Extension,fft::Extension> pext[nExtensionsPair] template <typename T, std::size_t Dim, bool verbose=false> void test(bool inplace, bool includePeriodicBds); - + +#ifdef FFTW_HAS_FFTW3F TEST_F(PlannerTest, InplaceFloatTransforms) { std::cout << std::endl; std::cout << "== TEST 1D - float ==\t"; @@ -36,7 +38,9 @@ TEST_F(PlannerTest, InplaceFloatTransforms) { std::cout << "== TEST 3D - float ==\t"; test<float,3>(false,true); } +#endif +#ifdef FFTW_HAS_FFTW3D TEST_F(PlannerTest, InplaceDoubleTransforms) { std::cout << std::endl; std::cout << "== TEST 1D - double ==\t"; @@ -46,7 +50,9 @@ TEST_F(PlannerTest, InplaceDoubleTransforms) { std::cout << "== TEST 3D - double ==\t"; test<double,3>(true,true); } +#endif +#ifdef FFTW_HAS_FFTW3L TEST_F(PlannerTest, InplaceLongDoubleTransforms) { std::cout << std::endl; std::cout << "== TEST 1D - long double ==\t"; @@ -56,6 +62,19 @@ TEST_F(PlannerTest, InplaceLongDoubleTransforms) { std::cout << "== TEST 3D - long double ==\t"; test<long double,3>(false,false); } +#endif + +#ifdef FFTW_HAS_FFTW3Q +TEST_F(PlannerTest, InplaceQuadDoubleTransforms) { + std::cout << std::endl; + std::cout << "== TEST 1D - __float128 ==\t"; + test<__float128,1>(false,false); + std::cout << "== TEST 2D - __float128 ==\t"; + test<__float128,2>(false,false); + std::cout << "== TEST 3D - __float128 ==\t"; + test<__float128,3>(false,false); +} +#endif template <typename T, std::size_t Dim, bool verbose> void test(bool inplace, bool includePeriodicBds) { @@ -125,8 +144,9 @@ void test(bool inplace, bool includePeriodicBds) { in = ref; /* plan transforms and check if planning succeeded */ - assert(planner.plan(in.data(), out.data(), domainConfig, order, domainSize, FFTW_MEASURE, - includePeriodicBds, includePeriodicBds) || testCaseId()==0); + bool status = planner.plan(in.data(), out.data(), domainConfig, order, domainSize, FFTW_MEASURE, + includePeriodicBds, includePeriodicBds); + assert(status || testCaseId()==0); /* execute forward and backward inplace transforms */ planner.executeForwardTransform(); @@ -176,5 +196,5 @@ void test(bool inplace, bool includePeriodicBds) { << testCaseId.maxId() << " testcases: " << meanDists; for (std::size_t k = 0; k < 3; k++) meanDists[k] = std::round(meanDists[k]/eps); - std::cout << " ~= " << std::fixed << std::setprecision(0) << meanDists << " eps" << std::endl; + std::cout << " ~= " << std::fixed << std::setprecision(0) << meanDists << " eps" << std::endl; } diff --git a/HySoP/src/hysop++/tests/testPoissonSolver/CMakeLists.txt b/HySoP/src/hysop++/tests/testPoissonSolver/CMakeLists.txt index d97166f65e3fcad2a1bf8c6abe90628b971cad7b..6f3ddcdc849f9243ac45c15c400bebb3e95fef06 100644 --- a/HySoP/src/hysop++/tests/testPoissonSolver/CMakeLists.txt +++ b/HySoP/src/hysop++/tests/testPoissonSolver/CMakeLists.txt @@ -3,6 +3,7 @@ file(GLOB CPP_SRCS *.cpp) set(SRCS ${CPP_SRCS}) get_filename_component(test_name ${CMAKE_CURRENT_SOURCE_DIR} NAME) +add_definitions(${CXX_EXTRA_DEFINES}) add_executable(${test_name} ${SRCS}) add_dependencies(${test_name} ${HYSOP_CXX_LIBRARY_DEP}) diff --git a/HySoP/src/hysop++/tests/testPolynoms/CMakeLists.txt b/HySoP/src/hysop++/tests/testPolynoms/CMakeLists.txt index eedc73c4a8b1417d9da0a9119334ea60326aace0..19cbe1e7480bc0b20e7cf62c96f01cffbd4d98dc 100644 --- a/HySoP/src/hysop++/tests/testPolynoms/CMakeLists.txt +++ b/HySoP/src/hysop++/tests/testPolynoms/CMakeLists.txt @@ -3,9 +3,9 @@ file(GLOB CPP_SRCS *.cpp) set(SRCS ${CPP_SRCS}) get_filename_component(test_name ${CMAKE_CURRENT_SOURCE_DIR} NAME) +add_definitions(${CXX_EXTRA_DEFINES}) add_executable(${test_name} ${SRCS}) add_dependencies(${test_name} ${HYSOP_CXX_LIBRARY_DEP}) - target_link_libraries(${test_name} ${HYSOP_LIBRARY}) target_link_libraries(${test_name} ${GTEST_LIBRARIES} ${EXT_LIBRARIES})