2020-08-21 17:03:33 +02:00
# This file is part of monofonIC (MUSIC2)
# A software package to generate ICs for cosmological simulations
# Copyright (C) 2020 by Oliver Hahn
#
# monofonIC 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 3 of the License, or
# (at your option) any later version.
#
# monofonIC 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 this program. If not, see <http://www.gnu.org/licenses/>.
2020-08-27 18:09:21 +02:00
cmake_minimum_required ( VERSION 3.11 )
2019-09-04 12:07:40 +02:00
set ( PRGNAME monofonIC )
2020-04-02 19:57:41 +02:00
project ( monofonIC C CXX )
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -march=native -Wall -fno-omit-frame-pointer -g -fsanitize=address")
set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -march=native -Wall -pedantic" CACHE STRING "Flags used by the compiler during Release builds." FORCE )
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -march=native -fno-omit-frame-pointer -Wall -pedantic" CACHE STRING "Flags used by the compiler during RelWithDebInfo builds." FORCE )
2020-04-04 06:07:12 +02:00
set ( CMAKE_CXX_FLAGS_DEBUG "-g -O1 -march=native -DDEBUG -fno-omit-frame-pointer -Wall -pedantic" CACHE STRING "Flags used by the compiler during Debug builds." FORCE )
2020-04-02 19:57:41 +02:00
set ( CMAKE_CXX_FLAGS_DEBUGSANADD "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address " CACHE STRING "Flags used by the compiler during Debug builds with Sanitizer for address." FORCE )
set ( CMAKE_CXX_FLAGS_DEBUGSANUNDEF "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=undefined" CACHE STRING "Flags used by the compiler during Debug builds with Sanitizer for undefineds." FORCE )
2020-04-04 06:07:12 +02:00
set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "Flags used by the compiler during Release builds." FORCE )
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" CACHE STRING "Flags used by the compiler during RelWithDebInfo builds." FORCE )
set ( CMAKE_C_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING "Flags used by the compiler during Debug builds." FORCE )
set ( CMAKE_C_FLAGS_DEBUGSANADD "${CMAKE_CXX_FLAGS_DEBUGSANADD}" CACHE STRING "Flags used by the compiler during Debug builds with Sanitizer for address." FORCE )
set ( CMAKE_C_FLAGS_DEBUGSANUNDEF "${CMAKE_CXX_FLAGS_DEBUGSANUNDEF}" CACHE STRING "Flags used by the compiler during Debug builds with Sanitizer for undefineds." FORCE )
2020-08-27 18:09:21 +02:00
set ( default_build_type "RelWithDebInfo" )
2020-04-02 19:57:41 +02:00
if ( NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES )
message ( STATUS "Setting build type to '${default_build_type}' as none was specified." )
set ( CMAKE_BUILD_TYPE "${default_build_type}" CACHE
S T R I N G " C h o o s e t h e t y p e o f b u i l d . " F O R C E )
# Set the possible values of build type for cmake-gui
set_property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
" D e b u g " " R e l e a s e " " R e l W i t h D e b I n f o " " D e b u g S a n A d d " " D e b u g S a n U n d e f " )
endif ( )
2020-04-04 06:07:12 +02:00
mark_as_advanced ( CMAKE_CXX_FLAGS_DEBUGSANADD CMAKE_CXX_FLAGS_DEBUGSANUNDEF )
mark_as_advanced ( CMAKE_C_FLAGS_DEBUGSANADD CMAKE_C_FLAGS_DEBUGSANUNDEF )
mark_as_advanced ( CMAKE_EXECUTABLE_FORMAT CMAKE_OSX_ARCHITECTURES CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT )
2020-04-02 19:57:41 +02:00
2019-05-07 01:05:16 +02:00
find_package ( PkgConfig REQUIRED )
2020-04-02 19:57:41 +02:00
set ( CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${PROJECT_SOURCE_DIR}" )
2019-05-07 01:05:16 +02:00
2019-09-04 12:07:40 +02:00
########################################################################################################################
# Add a custom command that produces version.cc, plus
# a dummy output that's not actually produced, in order
# to force version.cmake to always be re-run before the build
ADD_CUSTOM_COMMAND (
O U T P U T $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / v e r s i o n . c c
$ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / _ v e r s i o n . c c
C O M M A N D $ { C M A K E _ C O M M A N D } - P
$ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / v e r s i o n . c m a k e )
2019-05-07 01:05:16 +02:00
########################################################################################################################
# OpenMP
find_package ( OpenMP REQUIRED )
if ( OPENMP_FOUND )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}" )
endif ( )
2019-09-25 21:17:39 +02:00
########################################################################################################################
# Pthreads
find_package ( Threads REQUIRED )
2019-05-07 01:05:16 +02:00
########################################################################################################################
# mpi support
option ( ENABLE_MPI "Enable MPI support" ON )
if ( ENABLE_MPI )
find_package ( MPI )
if ( MPI_CXX_FOUND )
message ( STATUS "MPI_CXX_COMPILER = ${MPI_CXX_COMPILER}" )
message ( STATUS "MPI_CXX_INCLUDE_PATH = ${MPI_CXX_INCLUDE_PATH}" )
message ( STATUS "MPI_CXX_LIBRARIES = ${MPI_CXX_LIBRARIES}" )
endif ( MPI_CXX_FOUND )
endif ( ENABLE_MPI )
2020-04-02 19:57:41 +02:00
########################################################################################################################
# floating point precision
set (
C O D E _ P R E C I S I O N " D O U B L E "
C A C H E S T R I N G " F l o a t i n g p o i n t t y p e u s e d f o r i n t e r n a l c o m p u t a t i o n s a n d F F T s "
)
set_property (
C A C H E C O D E _ P R E C I S I O N
P R O P E R T Y S T R I N G S F L O A T D O U B L E L O N G D O U B L E
)
2019-05-07 01:05:16 +02:00
2020-04-03 00:39:28 +02:00
########################################################################################################################
# convolver type, right now only orszag or naive
set (
C O N V O L V E R _ T Y P E " O R S Z A G "
C A C H E S T R I N G " C o n v o l u t i o n a l g o r i t h m t o b e used ( Naive=no dealiasing, Orszag=dealiased ) "
)
set_property (
C A C H E C O N V O L V E R _ T Y P E
P R O P E R T Y S T R I N G S O R S Z A G N A I V E
)
########################################################################################################################
# PLT options, right now only on/off
option ( ENABLE_PLT "Enable PLT (particle linear theory) corrections" OFF )
2019-11-03 17:05:28 +01:00
########################################################################################################################
2019-05-07 01:05:16 +02:00
# FFTW
2019-12-19 14:08:35 +01:00
if ( POLICY CMP0074 )
cmake_policy ( SET CMP0074 NEW )
endif ( )
2019-10-08 20:21:28 +02:00
if ( ENABLE_MPI )
2020-04-02 19:57:41 +02:00
find_package ( FFTW3 COMPONENTS SINGLE DOUBLE LONGDOUBLE OPENMP THREADS MPI )
2019-10-08 20:21:28 +02:00
else ( )
2020-04-02 19:57:41 +02:00
find_package ( FFTW3 COMPONENTS SINGLE DOUBLE LONGDOUBLE OPENMP THREADS )
2019-10-08 20:21:28 +02:00
endif ( ENABLE_MPI )
2020-04-02 19:57:41 +02:00
mark_as_advanced ( FFTW3_SINGLE_MPI_LIBRARY FFTW3_SINGLE_OPENMP_LIBRARY FFTW3_SINGLE_SERIAL_LIBRARY FFTW3_SINGLE_THREADS_LIBRARY )
mark_as_advanced ( FFTW3_DOUBLE_MPI_LIBRARY FFTW3_DOUBLE_OPENMP_LIBRARY FFTW3_DOUBLE_SERIAL_LIBRARY FFTW3_DOUBLE_THREADS_LIBRARY )
mark_as_advanced ( FFTW3_LONGDOUBLE_MPI_LIBRARY FFTW3_LONGDOUBLE_OPENMP_LIBRARY FFTW3_LONGDOUBLE_SERIAL_LIBRARY FFTW3_LONGDOUBLE_THREADS_LIBRARY )
mark_as_advanced ( FFTW3_INCLUDE_DIR FFTW3_MPI_INCLUDE_DIR )
mark_as_advanced ( pkgcfg_lib_PC_FFTW_fftw3 )
2019-05-07 01:05:16 +02:00
2019-11-03 17:05:28 +01:00
########################################################################################################################
2019-05-07 01:05:16 +02:00
# GSL
find_package ( GSL REQUIRED )
2020-04-02 19:57:41 +02:00
mark_as_advanced ( pkgcfg_lib_GSL_gsl pkgcfg_lib_GSL_gslcblas pkgcfg_lib_GSL_m )
2019-05-07 01:05:16 +02:00
2019-11-03 17:05:28 +01:00
########################################################################################################################
2019-05-07 01:05:16 +02:00
# HDF5
find_package ( HDF5 REQUIRED )
2020-04-02 19:57:41 +02:00
mark_as_advanced ( HDF5_C_LIBRARY_dl HDF5_C_LIBRARY_hdf5 HDF5_C_LIBRARY_m HDF5_C_LIBRARY_pthread HDF5_C_LIBRARY_z HDF5_C_LIBRARY_sz )
2019-05-07 01:05:16 +02:00
2020-05-02 15:03:43 +02:00
########################################################################################################################
# PANPHASIA
option ( ENABLE_PANPHASIA "Enable PANPHASIA random number generator" ON )
if ( ENABLE_PANPHASIA )
enable_language ( Fortran )
if ( "${CMAKE_Fortran_COMPILER_ID}" MATCHES "Intel" )
set ( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -132 -implicit-none" )
elseif ( "${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU" )
set ( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -ffixed-line-length-132 -fimplicit-none" )
endif ( )
endif ( ENABLE_PANPHASIA )
2019-05-07 01:05:16 +02:00
########################################################################################################################
2021-05-02 22:52:21 +02:00
# PANPHASIA HO (High-Order, new version)
option ( ENABLE_PANPHASIA_HO "Enable PANPHASIA-HO random number generator" ON )
########################################################################################################################
2019-05-07 01:05:16 +02:00
# INCLUDES
include_directories ( ${ PROJECT_SOURCE_DIR } /include )
# SOURCES
# get all the *.cc files in the subfolders
file ( GLOB SOURCES
$ { P R O J E C T _ S O U R C E _ D I R } / s r c / * . c c
)
2019-09-04 12:07:40 +02:00
# add the auto generated version file
list ( APPEND SOURCES "${CMAKE_CURRENT_BINARY_DIR}/version.cc" )
2019-05-07 01:05:16 +02:00
# PLUGINS
# get all the *.cc files in the plugin subfolder
file ( GLOB PLUGINS
$ { P R O J E C T _ S O U R C E _ D I R } / s r c / p l u g i n s / * . c c
)
2020-05-02 15:03:43 +02:00
if ( ENABLE_PANPHASIA )
list ( APPEND SOURCES
$ { P R O J E C T _ S O U R C E _ D I R } / e x t e r n a l / p a n p h a s i a / p a n p h a s i a _ r o u t i n e s . f
$ { P R O J E C T _ S O U R C E _ D I R } / e x t e r n a l / p a n p h a s i a / g e n e r i c _ l e c u y e r . f 9 0
)
endif ( )
2021-05-02 22:52:21 +02:00
if ( ENABLE_PANPHASIA_HO )
list ( APPEND SOURCES
$ { P R O J E C T _ S O U R C E _ D I R } / e x t e r n a l / p a n p h a s i a _ h o / m a i n . c
$ { P R O J E C T _ S O U R C E _ D I R } / e x t e r n a l / p a n p h a s i a _ h o / h i g h _ o r d e r _ p a n p h a s i a _ r o u t i n e s . c
$ { P R O J E C T _ S O U R C E _ D I R } / e x t e r n a l / p a n p h a s i a _ h o / p a n _ m p i _ r o u t i n e s . c
$ { P R O J E C T _ S O U R C E _ D I R } / e x t e r n a l / p a n p h a s i a _ h o / u n i f o r m _ r a n d _ t h r e e f r y 4 x 6 4 . c
)
# target_include_directories(${PRGNAME} PRIVATE ${PROJECT_SOURCE_DIR}/external/panphasia_ho)
endif ( )
2020-04-02 19:57:41 +02:00
# project configuration header
configure_file (
$ { P R O J E C T _ S O U R C E _ D I R } / i n c l u d e / c m a k e _ c o n f i g . h h . i n
$ { P R O J E C T _ S O U R C E _ D I R } / i n c l u d e / c m a k e _ c o n f i g . h h
)
2019-05-07 01:05:16 +02:00
add_executable ( ${ PRGNAME } ${ SOURCES } ${ PLUGINS } )
2020-08-27 18:09:21 +02:00
# target_setup_class(${PRGNAME})
2019-05-07 01:05:16 +02:00
2019-10-24 17:12:43 +02:00
set_target_properties ( ${ PRGNAME } PROPERTIES CXX_STANDARD 14 )
2019-05-07 01:05:16 +02:00
2020-04-02 19:57:41 +02:00
2019-05-07 01:05:16 +02:00
# mpi flags
if ( MPI_CXX_FOUND )
2020-04-02 19:57:41 +02:00
if ( CODE_PRECISION STREQUAL "FLOAT" )
if ( FFTW3_SINGLE_MPI_FOUND )
2020-08-13 00:52:02 +02:00
target_link_libraries ( ${ PRGNAME } PRIVATE FFTW3::FFTW3_SINGLE_MPI )
target_compile_definitions ( ${ PRGNAME } PRIVATE "USE_FFTW_MPI" )
2020-04-02 19:57:41 +02:00
else ( )
message ( SEND_ERROR "MPI enabled but FFTW3 library not found with MPI support for single precision!" )
endif ( )
elseif ( CODE_PRECISION STREQUAL "DOUBLE" )
if ( FFTW3_DOUBLE_MPI_FOUND )
2020-08-13 00:52:02 +02:00
target_link_libraries ( ${ PRGNAME } PRIVATE FFTW3::FFTW3_DOUBLE_MPI )
target_compile_definitions ( ${ PRGNAME } PRIVATE "USE_FFTW_MPI" )
2020-04-02 19:57:41 +02:00
else ( )
message ( SEND_ERROR "MPI enabled but FFTW3 library not found with MPI support for double precision!" )
endif ( )
elseif ( CODE_PRECISION STREQUAL "LONGDOUBLE" )
if ( FFTW3_LONGDOUBLE_MPI_FOUND )
2020-08-13 00:52:02 +02:00
target_link_libraries ( ${ PRGNAME } PRIVATE FFTW3::FFTW3_LONGDOUBLE_MPI )
target_compile_definitions ( ${ PRGNAME } PRIVATE "USE_FFTW_MPI" )
2020-04-02 19:57:41 +02:00
else ( )
message ( SEND_ERROR "MPI enabled but FFTW3 library not found with MPI support for long double precision!" )
endif ( )
endif ( )
2019-05-07 01:05:16 +02:00
2020-08-13 00:52:02 +02:00
target_link_libraries ( ${ PRGNAME } PRIVATE MPI::MPI_CXX )
target_compile_definitions ( ${ PRGNAME } PRIVATE "USE_MPI" )
2019-05-07 01:05:16 +02:00
endif ( MPI_CXX_FOUND )
2020-08-13 00:52:02 +02:00
# else()
if ( CODE_PRECISION STREQUAL "FLOAT" )
if ( FFTW3_SINGLE_THREADS_FOUND )
target_link_libraries ( ${ PRGNAME } PRIVATE FFTW3::FFTW3_SINGLE_THREADS )
2020-09-03 16:28:11 +02:00
target_compile_definitions ( ${ PRGNAME } PRIVATE "USE_FFTW_THREADS" )
2020-08-13 00:52:02 +02:00
endif ( )
target_link_libraries ( ${ PRGNAME } PRIVATE FFTW3::FFTW3_SINGLE_SERIAL )
elseif ( CODE_PRECISION STREQUAL "DOUBLE" )
if ( FFTW3_DOUBLE_THREADS_FOUND )
target_link_libraries ( ${ PRGNAME } PRIVATE FFTW3::FFTW3_DOUBLE_THREADS )
2020-09-03 16:28:11 +02:00
target_compile_definitions ( ${ PRGNAME } PRIVATE "USE_FFTW_THREADS" )
2020-08-13 00:52:02 +02:00
endif ( )
target_link_libraries ( ${ PRGNAME } PRIVATE FFTW3::FFTW3_DOUBLE_SERIAL )
elseif ( CODE_PRECISION STREQUAL "LONGDOUBLE" )
if ( FFTW3_LONGDOUBLE_THREADS_FOUND )
target_link_libraries ( ${ PRGNAME } PRIVATE FFTW3::FFTW3_LONGDOUBLE_THREADS )
2020-09-03 16:28:11 +02:00
target_compile_definitions ( ${ PRGNAME } PRIVATE "USE_FFTW_THREADS" )
2020-08-13 00:52:02 +02:00
endif ( )
target_link_libraries ( ${ PRGNAME } PRIVATE FFTW3::FFTW3_LONGDOUBLE_SERIAL )
2020-04-02 19:57:41 +02:00
endif ( )
2019-05-07 01:05:16 +02:00
2020-08-13 00:52:02 +02:00
2019-07-31 18:36:37 +02:00
if ( HDF5_FOUND )
# target_link_libraries(${PRGNAME} ${HDF5_C_LIBRARY_DIRS})
2020-08-13 00:52:02 +02:00
target_link_libraries ( ${ PRGNAME } PRIVATE ${ HDF5_LIBRARIES } )
2019-07-31 18:36:37 +02:00
target_include_directories ( ${ PRGNAME } PRIVATE ${ HDF5_INCLUDE_DIRS } )
2020-08-13 00:52:02 +02:00
target_compile_definitions ( ${ PRGNAME } PRIVATE "USE_HDF5" )
2019-07-31 18:36:37 +02:00
endif ( HDF5_FOUND )
2020-05-02 15:03:43 +02:00
if ( ENABLE_PANPHASIA )
2020-08-13 00:52:02 +02:00
target_compile_definitions ( ${ PRGNAME } PRIVATE "USE_PANPHASIA" )
2020-05-02 15:03:43 +02:00
endif ( ENABLE_PANPHASIA )
2021-05-02 22:52:21 +02:00
if ( ENABLE_PANPHASIA_HO )
target_compile_definitions ( ${ PRGNAME } PRIVATE "USE_PANPHASIA_HO" )
endif ( ENABLE_PANPHASIA_HO )
2020-05-06 20:53:57 +02:00
if ( ENABLE_PLT )
2020-08-13 00:52:02 +02:00
target_compile_definitions ( ${ PRGNAME } PRIVATE "ENABLE_PLT" )
2020-05-06 20:53:57 +02:00
endif ( ENABLE_PLT )
2020-08-13 00:52:02 +02:00
target_link_libraries ( ${ PRGNAME } PRIVATE GSL::gsl )
2019-05-07 01:05:16 +02:00
2020-08-27 18:09:21 +02:00
########################################################################################################################
# include CLASS
option ( ENABLE_CLASS "Enable CLASS support (as a submodule)." ON )
if ( ENABLE_CLASS )
include ( ${ CMAKE_CURRENT_SOURCE_DIR } /external/class.cmake )
target_link_libraries ( ${ PRGNAME } PRIVATE class::libclass_cpp )
target_compile_definitions ( ${ PRGNAME } PRIVATE "USE_CLASS" )
endif ( )
########################################################################################################################
# include GenericIO (only if MPI available)
2020-08-13 00:52:02 +02:00
include ( CMakeDependentOption )
cmake_dependent_option ( ENABLE_GENERICIO "Enable GenericIO (HACC) output support" off "ENABLE_MPI;MPI_CXX_FOUND" off )
2019-05-07 01:05:16 +02:00
2020-08-13 00:52:02 +02:00
if ( ENABLE_GENERICIO )
include ( ${ CMAKE_CURRENT_SOURCE_DIR } /external/genericio.cmake )
target_link_libraries ( ${ PRGNAME } PRIVATE genericio::genericio_mpi )
target_compile_definitions ( ${ PRGNAME } PRIVATE "ENABLE_GENERICIO" )
endif ( )