Skip to content

Commit

Permalink
Add basic CMake capabilities (#183)
Browse files Browse the repository at this point in the history
* Add source (sub-)folders CMakeLists.

* Add CMakeLists to FlameSheet case.

* First pass at setting CMake framework.
(using initCMake branch out of PelePhysics).

* Add Utils/CMake, mostly pulling from PeleC.

* Missing files in sources.

* Pass precision to PelePhysics CMake.

* Add CMakeLists.txt in Cases folders.

* CMakeLists in RegTests.

* Fix preprocessor in PeleLMInit.cpp.

* Update base CMakeLists.txt.
  • Loading branch information
esclapez authored Mar 16, 2023
1 parent bfe83cf commit 0aff5bb
Show file tree
Hide file tree
Showing 33 changed files with 692 additions and 12 deletions.
207 changes: 207 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
cmake_minimum_required(VERSION 3.23)

project( PeleLMeX
DESCRIPTION "An AMR Low Mach Number Reactive Flow Simulation Code Without Level Sub-cycling"
HOMEPAGE_URL "https://github.com/AMReX-Combustion/PeleLMeX"
VERSION 23.03
LANGUAGES CXX
)

message(STATUS "CMake version: ${CMAKE_VERSION}")

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/Utils/CMake")

#
# Base options
#
set(PELELMEX_DIM "3" CACHE STRING "Number of physical dimensions")
set(PELELMEX_PRECISION "DOUBLE" CACHE STRING "Floating point precision SINGLE or DOUBLE")
set(PELELMEX_CHEMISTRY_MODEL drm19 CACHE STRING "Chemical mechanism")
set(PELELMEX_EOS_MODEL Fuego CACHE STRING "Equation of state model")
set(PELELMEX_TRANSPORT_MODEL Simple CACHE STRING "Transport model")
set(PELELMEX_CASE FlameSheet CACHE STRING "Case folder")

#
# Physics options
#
option(PELELMEX_USE_EB "Enable Embedded Boundary" OFF)
option(PELELMEX_USE_EFIELD "Enable Electric field module" OFF)
option(PELELMEX_USE_PARTICLES "Enable Spray module" OFF)
option(PELELMEX_USE_SOOT "Enable Soot module" OFF)

#
# Misc options
#
option(PELELMEX_ENABLE_HYPRE "Enable Offload to Hypre" OFF)
option(PELELMEX_ENABLE_TINY_PROFILE "Enable AMReX tiny profiler" OFF)
option(PELELMEX_ENABLE_HDF5 "Enable HDF5 PlotFiles" OFF)

#
# HPC options
#
option(PELELMEX_MPI "Enable MPI" OFF)
option(PELELMEX_OPENMP "Enable OpenMP" OFF)
option(PELELMEX_CUDA "Enable CUDA" OFF)
option(PELELMEX_HIP "Enable HIP" OFF)
option(PELELMEX_SYCL "Enable SyCL" OFF)

# C++ Options
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#
# Setup Languages
#
if (PELELMEX_CUDA)
enable_language(CUDA)
endif ()
if (PELELMEX_HIP)
enable_language(HIP)
endif ()

# Checks
if(PELELMEX_DIM EQUAL 1)
message(FATAL_ERROR "PeleLMeX does not support 1D.")
endif()

#
# Cases
#
set(PELELMEX_EXEC_SUBDIRS Exec/RegTests Exec/Cases)
list(TRANSFORM PELELMEX_EXEC_SUBDIRS PREPEND "${CMAKE_CURRENT_LIST_DIR}/")
set(EXEC_DIR "")
foreach(subdir ${PELELMEX_EXEC_SUBDIRS})
FILE(GLOB caselist ${subdir}/*)
foreach(case ${caselist})
if(IS_DIRECTORY ${case})
get_filename_component( case_dir ${case} NAME)
LIST(APPEND PELELMEX_CASE_LIST ${case_dir})
if( ${PELELMEX_CASE} STREQUAL ${case_dir})
set(EXEC_DIR ${case})
endif()
endif()
endforeach()
endforeach()
if (NOT EXEC_DIR)
message(FATAL_ERROR "PELELMEX_CASE=${PELELMEX_CASE} is not a valid case !")
endif()

########################### PeleLMeX ##################################
add_executable(pelelmex "")
set_target_properties(pelelmex PROPERTIES OUTPUT_NAME "PeleLMeX${PELELMEX_DIM}d.exe")

set(SRC_DIR ${CMAKE_SOURCE_DIR}/Source)
add_subdirectory(${SRC_DIR})
add_subdirectory(${EXEC_DIR})
set(PELEPHYSICS_LIB PelePhysics-${PELELMEX_CHEMISTRY_MODEL}-${PELELMEX_EOS_MODEL}-${PELELMEX_TRANSPORT_MODEL})
include(SetRpath)

if ( NOT CMAKE_CXX_FLAGS )
target_link_libraries(pelelmex PUBLIC AMReX::Flags_CXX)
endif ()

########################### AMReX #####################################

message(STATUS "AMReX Configure Section")
set(AMREX_SUBMOD_LOCATION "${CMAKE_SOURCE_DIR}/Submodules/amrex")
include(SetAMReXOptions)
list(APPEND CMAKE_MODULE_PATH "${AMREX_SUBMOD_LOCATION}/Tools/CMake")
add_subdirectory(${AMREX_SUBMOD_LOCATION})
include(AMReXBuildInfo)
generate_buildinfo(pelelmex ${CMAKE_SOURCE_DIR})
target_include_directories(pelelmex SYSTEM PUBLIC ${AMREX_SUBMOD_LOCATION}/Tools/C_scripts)
# NOTE: the amrex lib link is already provided through PelePhysics dependence on amrex.

########################### AMReX-Hydro ###############################

message(STATUS "AMReX-Hydro Configure Section")
set(AMREX_HYDRO_SUBMOD_LOCATION "${CMAKE_SOURCE_DIR}/Submodules/AMReX-Hydro")
include(SetAmrexHydroOptions)
add_subdirectory(${AMREX_HYDRO_SUBMOD_LOCATION})
target_link_libraries(pelelmex
PUBLIC
amrex_hydro)

########################### SUNDIALS ##################################

message(STATUS "Sundials Configure Section")
set(SUNDIALS_SUBMOD_LOCATION "${CMAKE_SOURCE_DIR}/Submodules/sundials")
include(SetSundialsOptions)
add_subdirectory(${SUNDIALS_SUBMOD_LOCATION})
target_link_libraries(pelelmex
PUBLIC
SUNDIALS::cvode
SUNDIALS::arkode)
if (PELELMEX_CUDA)
target_link_libraries(pelelmex
PUBLIC
SUNDIALS::nveccuda
SUNDIALS::sunlinsolcusolversp
SUNDIALS::sunmatrixcusparse)
endif ()

########################### PelePhysics ###############################

message(STATUS "PelePhysics Configure Section")
set(PELE_PHYSICS_SUBMOD_LOCATION "${CMAKE_SOURCE_DIR}/Submodules/PelePhysics")
include(SetPelePhysicsOptions)
add_subdirectory(${PELE_PHYSICS_SUBMOD_LOCATION})
target_link_libraries(pelelmex
PUBLIC
${PELEPHYSICS_LIB})

if (PELELMEX_CUDA)
setup_target_for_cuda_compilation(pelelmex)
target_compile_features(pelelmex PUBLIC cuda_std_17)
set_target_properties(pelelmex PROPERTIES
CUDA_EXTENSIONS OFF
CUDA_STANDARD_REQUIRED ON
)
endif ()

########################### Summary ##################################
include(AMReXGenexHelpers)
include(AMReXTargetHelpers)

get_target_properties_flattened(pelelmex _includes _defines _flags _link_line)
set(_lang CXX)
set(_prop _includes _defines _flags _link_line)

# Loop over all combinations of language and property and extract
# what you need
foreach( _p IN LISTS _prop )
foreach( _l IN LISTS _lang )

string(TOLOWER ${_l} _ll) # Lower case language name

# _${_ll}${_p} is a variable named as _lang_property,
# both lower case.
set(_${_ll}${_p} "${${_p}}")
eval_genex( _${_ll}${_p} ${_l} ${CMAKE_${_l}_COMPILER_ID}
COMP_VERSION ${CMAKE_${_l}_COMPILER_VERSION}
CONFIG ${CMAKE_BUILD_TYPE}
INTERFACE BUILD)

if (_${_ll}${_p})

list(REMOVE_DUPLICATES _${_ll}${_p})

if ("${_p}" STREQUAL "_defines")
string(REPLACE ";" " -D" _${_ll}${_p} "-D${_${_ll}${_p}}")
elseif ("${_p}" STREQUAL "_includes")
string(REPLACE ";" " -I" _${_ll}${_p} "-I${_${_ll}${_p}}")
else()
string(REPLACE ";" " " _${_ll}${_p} "${_${_ll}${_p}}")
endif ()

endif ()

endforeach()
endforeach ()

string ( TOUPPER "${CMAKE_BUILD_TYPE}" AMREX_BUILD_TYPE )
set(_cxx_flags "${CMAKE_CXX_FLAGS_${AMREX_BUILD_TYPE}} ${CMAKE_CXX_FLAGS} ${_cxx_flags}")
message( STATUS " C++ flags = ${_cxx_flags}")
message( STATUS " Link line = ${_cxx_link_line}")
message( STATUS " C++ include paths = ${_cxx_includes}")
14 changes: 14 additions & 0 deletions Exec/Cases/CounterFlow/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
target_include_directories(pelelmex PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)

set(PELELMEX_CHEMISTRY_MODEL drm19 PARENT_SCOPE)
set(PELELMEX_EOS_MODEL Fuego PARENT_SCOPE)
set(PELELMEX_TRANSPORT_MODEL Simple PARENT_SCOPE)
set(PELELMEX_DIM "2" PARENT_SCOPE)
set(PELELMEX_MPI ON PARENT_SCOPE)

target_sources(pelelmex
PRIVATE
pelelm_prob.cpp
pelelm_prob.H
pelelm_prob_parm.H
)
14 changes: 14 additions & 0 deletions Exec/Cases/DiffBunsen2D/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
target_include_directories(pelelmex PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)

set(PELELMEX_CHEMISTRY_MODEL drm19 PARENT_SCOPE)
set(PELELMEX_EOS_MODEL Fuego PARENT_SCOPE)
set(PELELMEX_TRANSPORT_MODEL Simple PARENT_SCOPE)
set(PELELMEX_DIM "2" PARENT_SCOPE)
set(PELELMEX_MPI ON PARENT_SCOPE)

target_sources(pelelmex
PRIVATE
pelelm_prob.cpp
pelelm_prob.H
pelelm_prob_parm.H
)
14 changes: 14 additions & 0 deletions Exec/Cases/JetInCrossflow/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
target_include_directories(pelelmex PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)

set(PELELMEX_CHEMISTRY_MODEL LiDryer PARENT_SCOPE)
set(PELELMEX_EOS_MODEL Fuego PARENT_SCOPE)
set(PELELMEX_TRANSPORT_MODEL Simple PARENT_SCOPE)
set(PELELMEX_DIM "3" PARENT_SCOPE)
set(PELELMEX_MPI ON PARENT_SCOPE)

target_sources(pelelmex
PRIVATE
pelelm_prob.cpp
pelelm_prob.H
pelelm_prob_parm.H
)
23 changes: 13 additions & 10 deletions Exec/Cases/NormalJet_OpenDomain/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
#set(PELELM_ENABLE_PARTICLES OFF)
set(PELELM_EOS_MODEL Fuego)
set(PELELM_CHEMISTRY_MODEL drm19)
set(PELELM_TRANSPORT_MODEL Simple)
set(PELELM_REACTOR_MODEL cvode)
target_include_directories(pelelmex PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)

#Generic stuff for every executable
get_filename_component(DIR_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
set(pelelm_exe_name PeleLM-${DIR_NAME})
include(BuildPeleLMExe)
build_pelelm_exe(${pelelm_exe_name})
set(PELELMEX_CHEMISTRY_MODEL dodecane_lu PARENT_SCOPE)
set(PELELMEX_EOS_MODEL Fuego PARENT_SCOPE)
set(PELELMEX_TRANSPORT_MODEL Simple PARENT_SCOPE)
set(PELELMEX_DIM "3" PARENT_SCOPE)
set(PELELMEX_MPI ON PARENT_SCOPE)

target_sources(pelelmex
PRIVATE
pelelm_prob.cpp
pelelm_prob.H
pelelm_prob_parm.H
)
14 changes: 14 additions & 0 deletions Exec/Cases/PremBunsen2D/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
target_include_directories(pelelmex PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)

set(PELELMEX_CHEMISTRY_MODEL drm19 PARENT_SCOPE)
set(PELELMEX_EOS_MODEL Fuego PARENT_SCOPE)
set(PELELMEX_TRANSPORT_MODEL Simple PARENT_SCOPE)
set(PELELMEX_DIM "2" PARENT_SCOPE)
set(PELELMEX_MPI ON PARENT_SCOPE)

target_sources(pelelmex
PRIVATE
pelelm_prob.cpp
pelelm_prob.H
pelelm_prob_parm.H
)
14 changes: 14 additions & 0 deletions Exec/Cases/PremBunsen3D/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
target_include_directories(pelelmex PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)

set(PELELMEX_CHEMISTRY_MODEL drm19 PARENT_SCOPE)
set(PELELMEX_EOS_MODEL Fuego PARENT_SCOPE)
set(PELELMEX_TRANSPORT_MODEL Simple PARENT_SCOPE)
set(PELELMEX_DIM "3" PARENT_SCOPE)
set(PELELMEX_MPI ON PARENT_SCOPE)

target_sources(pelelmex
PRIVATE
pelelm_prob.cpp
pelelm_prob.H
pelelm_prob_parm.H
)
15 changes: 15 additions & 0 deletions Exec/Cases/SwirlFlowWallInteractions/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
target_include_directories(pelelmex PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)

set(PELELMEX_CHEMISTRY_MODEL drm19 PARENT_SCOPE)
set(PELELMEX_EOS_MODEL Fuego PARENT_SCOPE)
set(PELELMEX_TRANSPORT_MODEL Simple PARENT_SCOPE)
set(PELELMEX_DIM "3" PARENT_SCOPE)
set(PELELMEX_MPI ON PARENT_SCOPE)
set(PELELMEX_USE_EB ON PARENT_SCOPE)

target_sources(pelelmex
PRIVATE
pelelm_prob.cpp
pelelm_prob.H
pelelm_prob_parm.H
)
14 changes: 14 additions & 0 deletions Exec/RegTests/EB_EnclosedFlame/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
target_include_directories(pelelmex PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)

set(PELELMEX_EOS_MODEL Fuego PARENT_SCOPE)
set(PELELMEX_CHEMISTRY_MODEL drm19 PARENT_SCOPE)
set(PELELMEX_TRANSPORT_MODEL Simple PARENT_SCOPE)
set(PELELMEX_DIM "2" PARENT_SCOPE)
set(PELELMEX_USE_EB ON PARENT_SCOPE)

target_sources(pelelmex
PRIVATE
pelelm_prob.cpp
pelelm_prob.H
pelelm_prob_parm.H
)
14 changes: 14 additions & 0 deletions Exec/RegTests/EB_EnclosedVortex/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
target_include_directories(pelelmex PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)

set(PELELMEX_EOS_MODEL Fuego PARENT_SCOPE)
set(PELELMEX_CHEMISTRY_MODEL air PARENT_SCOPE)
set(PELELMEX_TRANSPORT_MODEL Constant PARENT_SCOPE)
set(PELELMEX_DIM "2" PARENT_SCOPE)
set(PELELMEX_USE_EB ON PARENT_SCOPE)

target_sources(pelelmex
PRIVATE
pelelm_prob.cpp
pelelm_prob.H
pelelm_prob_parm.H
)
14 changes: 14 additions & 0 deletions Exec/RegTests/EB_FlowPastCylinder/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
target_include_directories(pelelmex PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)

set(PELELMEX_EOS_MODEL Fuego PARENT_SCOPE)
set(PELELMEX_CHEMISTRY_MODEL air PARENT_SCOPE)
set(PELELMEX_TRANSPORT_MODEL Constant PARENT_SCOPE)
set(PELELMEX_DIM "2" PARENT_SCOPE)
set(PELELMEX_USE_EB ON PARENT_SCOPE)

target_sources(pelelmex
PRIVATE
pelelm_prob.cpp
pelelm_prob.H
pelelm_prob_parm.H
)
14 changes: 14 additions & 0 deletions Exec/RegTests/EB_PipeFlow/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
target_include_directories(pelelmex PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)

set(PELELMEX_EOS_MODEL Fuego PARENT_SCOPE)
set(PELELMEX_CHEMISTRY_MODEL air PARENT_SCOPE)
set(PELELMEX_TRANSPORT_MODEL Simple PARENT_SCOPE)
set(PELELMEX_DIM "3" PARENT_SCOPE)
set(PELELMEX_USE_EB ON PARENT_SCOPE)

target_sources(pelelmex
PRIVATE
pelelm_prob.cpp
pelelm_prob.H
pelelm_prob_parm.H
)
13 changes: 13 additions & 0 deletions Exec/RegTests/EnclosedFlame/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
target_include_directories(pelelmex PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>)

set(PELELMEX_EOS_MODEL Fuego PARENT_SCOPE)
set(PELELMEX_CHEMISTRY_MODEL drm19 PARENT_SCOPE)
set(PELELMEX_TRANSPORT_MODEL Simple PARENT_SCOPE)
set(PELELMEX_DIM "2" PARENT_SCOPE)

target_sources(pelelmex
PRIVATE
pelelm_prob.cpp
pelelm_prob.H
pelelm_prob_parm.H
)
Loading

0 comments on commit 0aff5bb

Please sign in to comment.