cmake_minimum_required(VERSION 3.13)

project(amun
	VERSION 1.0
	DESCRIPTION "AMUN Code - a code to perform numerical simulations in astrophysics"
	HOMEPAGE_URL "https://amuncode.org"
	LANGUAGES Fortran
)

enable_language(Fortran)

set(default_build_type "Release")

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
		STRING "Choose the type of build." FORCE)
	set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release")
endif()

if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
	add_compile_options("$<$<CONFIG:RELEASE>:-pipe;-fno-tree-vectorize;-fno-unsafe-math-optimizations;-frounding-math;-fsignaling-nans;-finline-limit=10000;-fdiagnostics-color=always>")
	add_compile_options("$<$<CONFIG:DEBUG>:-Og;-pedantic;-fcheck=all;-W;-Wall;-Wno-unused-dummy-argument>")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES "Intel")
	add_compile_options("$<$<CONFIG:RELEASE>:-fp-model=source;-heap-arrays;-ip;-unroll-aggressive;-simd;-qopt-prefetch;-use-intel-optimized-headers;-finline-limit=1000;-fno-omit-frame-pointer>")
	add_compile_options("$<$<CONFIG:DEBUG>:-O>")
	add_compile_options("-assume byterecl")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES "PGI")
	add_compile_options("$<$<CONFIG:RELEASE>:-fastsse;-O4;-Mvect=simd;-Minline=maxsize:1000>")
	add_compile_options("$<$<CONFIG:DEBUG>:-O;-Minfo=all>")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES "NVHPC")
	add_compile_options("$<$<CONFIG:RELEASE>:-fast;-O4;-Minline>")
	add_compile_options("$<$<CONFIG:DEBUG>:-Mbounds;-Mchkptr;-Minfo=all>")
endif()

file(GLOB_RECURSE sources  sources/*.F90)
add_executable(amun.x ${sources})

option(ENABLE_3D "Enables 3D domains." OFF)
if(ENABLE_3D)
	target_compile_definitions(amun.x PRIVATE NDIMS=3)
else()
	target_compile_definitions(amun.x PRIVATE NDIMS=2)
endif()

option(ENABLE_HDF5 "Enable HDF5 support." OFF)
if(ENABLE_HDF5)
	find_package(HDF5 COMPONENTS Fortran)
	if(HDF5_Fortran_FOUND)
		include_directories(${HDF5_Fortran_INCLUDE_DIRS})
		target_compile_definitions(amun.x PRIVATE HDF5)
		target_link_libraries(amun.x ${HDF5_Fortran_LIBRARIES})
	endif()
endif()

option(ENABLE_MPI "Enable MPI support." ON)
if(ENABLE_MPI)
	find_package(MPI COMPONENTS Fortran)
	if(MPI_Fortran_FOUND)
		include_directories(${MPI_Fortran_INCLUDE_DIRS})
		target_compile_definitions(amun.x PRIVATE MPI)
		target_link_libraries(amun.x ${MPI_Fortran_LIBRARIES})
	endif()
endif()

option(ENABLE_OPENMP "Enable OpenMP support." OFF)
if(ENABLE_OPENMP)
	find_package(OpenMP COMPONENTS Fortran)
	if(OpenMP_Fortran_FOUND)
		include_directories(${OpenMP_Fortran_INCLUDE_DIRS})
		target_compile_options(amun.x PRIVATE "${OpenMP_Fortran_FLAGS}")
		target_link_libraries(amun.x ${OpenMP_Fortran_LIBRARIES})
	endif()
endif()

if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
option(DISABLE_FMA "Disable FMA operations for slightly slower, but symmetric floating-point arithmetics." ON)
if(DISABLE_FMA)
if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
	target_compile_options(amun.x PRIVATE "-mno-fma;-mno-fma4")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES "Intel")
	target_compile_options(amun.x PRIVATE "-no-fma")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES "PGI")
	target_compile_options(amun.x PRIVATE "-Mnofma")
endif()
if(CMAKE_Fortran_COMPILER_ID MATCHES "NVHPC")
	target_compile_options(amun.x PRIVATE "-Mnofma")
endif()
endif()
endif()

option(ENABLE_SIGNALS "Enables signal handler support." ON)
if(ENABLE_SIGNALS)
	target_compile_definitions(amun.x PRIVATE SIGNALS)
endif()

option(ENABLE_ZSTD "Enable Zstandard compression support." ON)
if(ENABLE_ZSTD)
	include(FindPkgConfig)
	pkg_search_module(ZSTD QUIET libzstd)
	if(ZSTD_FOUND)
		target_compile_definitions(amun.x PRIVATE ZSTD)
		target_link_libraries(amun.x ${ZSTD_LIBRARIES})
	endif()
endif()

option(ENABLE_LZ4 "Enable LZ4 compression support." ON)
if(ENABLE_LZ4)
	include(FindPkgConfig)
	pkg_search_module(LZ4 QUIET liblz4)
	if(LZ4_FOUND)
		target_compile_definitions(amun.x PRIVATE LZ4)
		target_link_libraries(amun.x ${LZ4_LIBRARIES})
	endif()
endif()

option(ENABLE_LZMA "Enable LZMA compression support." ON)
if(ENABLE_LZMA)
	include(FindPkgConfig)
	pkg_search_module(LZMA QUIET liblzma)
	if(LZMA_FOUND)
		target_compile_definitions(amun.x PRIVATE LZMA)
		target_link_libraries(amun.x ${LZMA_LIBRARIES})
	endif()
endif()

option(ENABLE_XXHASH "Enable system's XXHASH library." ON)
if(ENABLE_XXHASH)
	include(FindPkgConfig)
	pkg_search_module(XXHASH QUIET libxxhash)
	if(XXHASH_FOUND)
		target_compile_definitions(amun.x PRIVATE XXHASH)
		target_link_libraries(amun.x ${XXHASH_LIBRARIES})
	endif()
endif()