Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
cmake_minimum_required(VERSION 3.18)
project(MicroSim VERSION 1.0 LANGUAGES C CXX)

# Global options
option(BUILD_GRAND_POTENTIAL_SERIAL "Build the Grand-Potential Serial solver" ON)
option(BUILD_GRAND_POTENTIAL_MPI "Build the Grand-Potential MPI solver" ON)
option(BUILD_KKS_CUFFT "Build the KKS cuFFT (CUDA) solver" ON)
option(BUILD_KKS_FD_CUDA_MPI "Build the KKS FD CUDA MPI solver" ON)
option(BUILD_KKS_OPENCL "Build the KKS OpenCL solver" ON)
option(BUILD_CAHN_HILLIARD_FFT_2D "Build the Cahn-Hilliard FFT 2D solver" ON)

# Append local cmake/ directory to the module search path
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

if(BUILD_GRAND_POTENTIAL_SERIAL)
add_subdirectory(Grand_Potential_Serial)
endif()

if(BUILD_GRAND_POTENTIAL_MPI)
add_subdirectory(Grand_Potential_MPI)
endif()

if(BUILD_KKS_CUFFT)
add_subdirectory(KKS_CuFFT)
endif()

if(BUILD_KKS_FD_CUDA_MPI)
add_subdirectory(KKS_FD_CUDA_MPI)
endif()

if(BUILD_KKS_OPENCL)
add_subdirectory(KKS_OpenCl)
endif()

if(BUILD_CAHN_HILLIARD_FFT_2D)
add_subdirectory(Cahn_Hilliard_FFT_2D)
endif()
27 changes: 27 additions & 0 deletions Cahn_Hilliard_FFT_2D/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
cmake_minimum_required(VERSION 3.18)
project(microsim_ch_fft LANGUAGES C)

# Add the top-level cmake/ directory to the module path so that
# FindFFTW3.cmake is found whether this is built stand-alone or as part
# of the top-level project.
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")

# ── Dependencies ────────────────────────────────────────────────────────────
find_package(FFTW3 REQUIRED) # provided by cmake/FindFFTW3.cmake

# ── Main solver target ───────────────────────────────────────────────────────
add_executable(microsim_ch_fft microsim_ch_fft.c)

target_include_directories(microsim_ch_fft PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/functions
${CMAKE_CURRENT_SOURCE_DIR}/solverloop
${FFTW3_INCLUDE_DIRS}
)

target_link_libraries(microsim_ch_fft PRIVATE
FFTW3::fftw3
m
)

install(TARGETS microsim_ch_fft RUNTIME DESTINATION bin)
56 changes: 56 additions & 0 deletions Grand_Potential_MPI/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
cmake_minimum_required(VERSION 3.18)
project(microsim_gp_mpi LANGUAGES C)

# ── Dependencies ────────────────────────────────────────────────────────────
find_package(MPI REQUIRED COMPONENTS C)
find_package(HDF5 REQUIRED COMPONENTS C HL)
find_package(GSL REQUIRED)

# ── Main solver target ───────────────────────────────────────────────────────
# The build consists of a single .c translation unit; all other files
# in functions/, solverloop/ and tdbs/ are header-only includes.
add_executable(microsim_gp microsim_gp.c)

target_include_directories(microsim_gp PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/functions
${CMAKE_CURRENT_SOURCE_DIR}/solverloop
${CMAKE_CURRENT_SOURCE_DIR}/tdbs
${HDF5_INCLUDE_DIRS}
${GSL_INCLUDE_DIRS}
)

target_compile_definitions(microsim_gp PRIVATE ${HDF5_DEFINITIONS})

target_link_libraries(microsim_gp PRIVATE
MPI::MPI_C
${HDF5_C_LIBRARIES}
GSL::gsl
GSL::gslcblas
m
)

# ── write_xdmf utility ───────────────────────────────────────────────────────
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/write_xdmf.c")
add_executable(write_xdmf write_xdmf.c)

target_include_directories(write_xdmf PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/functions
${CMAKE_CURRENT_SOURCE_DIR}/solverloop
${HDF5_INCLUDE_DIRS}
${GSL_INCLUDE_DIRS}
)

target_compile_definitions(write_xdmf PRIVATE ${HDF5_DEFINITIONS})

target_link_libraries(write_xdmf PRIVATE
MPI::MPI_C
${HDF5_C_LIBRARIES}
GSL::gsl
GSL::gslcblas
m
)
endif()

install(TARGETS microsim_gp RUNTIME DESTINATION bin)
10 changes: 5 additions & 5 deletions Grand_Potential_MPI/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ FDIR=functions
SDIR=solverloop
TDIR=tdbs
CC=h5pcc #-O3
# CFLAGS=-I.
#LDIR=$(GSL_ROOT_DIR)/lib
#IDIR=$(GSL_ROOT_DIR)/include

LDIR=/share/apps/gsl/lib
IDIR=/share/apps/gsl/include
# GSL paths: set GSL_ROOT_DIR to your GSL installation prefix.
# If unset, the build tries to locate GSL via gsl-config.
GSL_ROOT_DIR ?= $(shell gsl-config --prefix 2>/dev/null)
LDIR=$(GSL_ROOT_DIR)/lib
IDIR=$(GSL_ROOT_DIR)/include
CFLAGS=-I $(IDIR)

_FUNCTION_DEPS = global_vars.h functions.h matrix.h utility_functions.h functionH.h functionF_01.h functionF_02.h functionF_03.h functionF_04.h functionF_05.h functionF_06.h functionQ.h \
Expand Down
16 changes: 16 additions & 0 deletions Grand_Potential_Serial/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
cmake_minimum_required(VERSION 3.18)
project(microsim_gp_serial LANGUAGES C)

# Source files – the solver is a single translation unit; all other files
# are header-only and referenced via include paths.
add_executable(microsim_gp microsim_gp.c)

target_include_directories(microsim_gp PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/functions
${CMAKE_CURRENT_SOURCE_DIR}/solverloop
)

target_link_libraries(microsim_gp PRIVATE m)

install(TARGETS microsim_gp RUNTIME DESTINATION bin)
36 changes: 36 additions & 0 deletions KKS_CuFFT/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
cmake_minimum_required(VERSION 3.18)
project(microsim_kks_cufft LANGUAGES CUDA)

# ── Dependencies ────────────────────────────────────────────────────────────
find_package(CUDAToolkit REQUIRED)

# ── Target ───────────────────────────────────────────────────────────────────
add_executable(microsim_kks_cufft KKS_cuFFT.cu)

# Optimisation flags passed through to ptxas (matches -Xptxas -O3 in Makefile)
target_compile_options(microsim_kks_cufft PRIVATE
$<$<COMPILE_LANGUAGE:CUDA>:-Xptxas -O3>
)

# GPU architecture – default sm_70; override via -DCUDA_ARCH=<arch>
if(NOT DEFINED CUDA_ARCH)
set(CUDA_ARCH "70")
endif()
set_target_properties(microsim_kks_cufft PROPERTIES
CUDA_ARCHITECTURES ${CUDA_ARCH}
)

target_include_directories(microsim_kks_cufft PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/functions
)

target_link_libraries(microsim_kks_cufft PRIVATE
CUDA::cufft
CUDA::cuda_driver
CUDA::cudart
)

# Create DATA output directory expected by the solver at run-time
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/DATA")

install(TARGETS microsim_kks_cufft RUNTIME DESTINATION bin)
183 changes: 183 additions & 0 deletions KKS_FD_CUDA_MPI/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
cmake_minimum_required(VERSION 3.18)
project(microsim_kks_fd_cuda_mpi LANGUAGES C CXX CUDA)

# ── Dependencies ────────────────────────────────────────────────────────────
find_package(MPI REQUIRED COMPONENTS C CXX)
find_package(HDF5 REQUIRED COMPONENTS C HL)
find_package(GSL REQUIRED)
find_package(CUDAToolkit REQUIRED)

# ── Build options ─────────────────────────────────────────────────────────────
option(ENABLE_HDF5 "Enable HDF5 output" ON)
option(ENABLE_CUFFTMP "Enable multi-GPU cuFFTMp" OFF)

# GPU architecture – default sm_70; override via -DCUDA_ARCH=<arch>
if(NOT DEFINED CUDA_ARCH)
set(CUDA_ARCH "70")
endif()

# ── Helper: convenience path variables ───────────────────────────────────────
set(FUNCTIONS ${CMAKE_CURRENT_SOURCE_DIR}/functions)
set(SOLVERLOOP ${CMAKE_CURRENT_SOURCE_DIR}/solverloop)
set(TDBS ${CMAKE_CURRENT_SOURCE_DIR}/tdbs)

# ── Sources ──────────────────────────────────────────────────────────────────
set(HOST_SOURCES
microsim_kks_fd_cuda_mpi.c
${SOLVERLOOP}/fileWriter.c
${FUNCTIONS}/utilityFunctions.c
${FUNCTIONS}/initialize_variables.c
${FUNCTIONS}/filling.c
${FUNCTIONS}/reading_input_parameters.c
${FUNCTIONS}/fill_domain.c
${FUNCTIONS}/read_boundary_conditions.c
${FUNCTIONS}/calc_bn.c
${FUNCTIONS}/box_iterator.cpp
${FUNCTIONS}/error_checks.cpp
)

set(DEVICE_SOURCES
${TDBS}/Thermo.cu
${FUNCTIONS}/functionF.cu
${FUNCTIONS}/functionH.cu
${FUNCTIONS}/functionTau.cu
${FUNCTIONS}/functionW_02.cu
${FUNCTIONS}/anisotropy_01.cu
${FUNCTIONS}/functionA_01.cu
${FUNCTIONS}/functionA_02.cu
${FUNCTIONS}/matrix.cu
${SOLVERLOOP}/utilityKernels.cu
${SOLVERLOOP}/boundary.cu
${SOLVERLOOP}/calcPhaseComp.cu
${SOLVERLOOP}/smooth.cu
${SOLVERLOOP}/computeDrivingForce.cu
${SOLVERLOOP}/computeElastic.cu
${SOLVERLOOP}/updateComposition.cu
${SOLVERLOOP}/updatePhi.cu
)

# ── Target ───────────────────────────────────────────────────────────────────
add_executable(microsim_kks_fd_cuda_mpi
${HOST_SOURCES}
${DEVICE_SOURCES}
)

# CUDA separable compilation handles the -dc / device-link steps automatically.
set_target_properties(microsim_kks_fd_cuda_mpi PROPERTIES
CUDA_SEPARABLE_COMPILATION ON
CUDA_ARCHITECTURES ${CUDA_ARCH}
)

# computeElastic requires C++17
set_source_files_properties(${SOLVERLOOP}/computeElastic.cu
PROPERTIES COMPILE_OPTIONS "$<$<COMPILE_LANGUAGE:CUDA>:-std=c++17>"
)

# ── Include directories ──────────────────────────────────────────────────────
target_include_directories(microsim_kks_fd_cuda_mpi PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${FUNCTIONS}
${SOLVERLOOP}
${TDBS}
${HDF5_INCLUDE_DIRS}
${GSL_INCLUDE_DIRS}
${CUDAToolkit_INCLUDE_DIRS}
)

if(ENABLE_CUFFTMP)
# cuFFTMp headers are shipped with the HPC SDK; users can override the path.
if(NOT DEFINED CUFFTMP_INCLUDE_DIR)
message(WARNING "ENABLE_CUFFTMP=ON but CUFFTMP_INCLUDE_DIR is not set. "
"Provide -DCUFFTMP_INCLUDE_DIR=<path> to the cuFFTMp headers.")
else()
target_include_directories(microsim_kks_fd_cuda_mpi PRIVATE ${CUFFTMP_INCLUDE_DIR})
endif()
endif()

# ── Compile definitions ───────────────────────────────────────────────────────
target_compile_definitions(microsim_kks_fd_cuda_mpi PRIVATE
ENABLE_HDF5=$<BOOL:${ENABLE_HDF5}>
ENABLE_CUFFTMP=$<BOOL:${ENABLE_CUFFTMP}>
${HDF5_DEFINITIONS}
)

# Suppress common NVHPC/nvcc diagnostic noise
target_compile_options(microsim_kks_fd_cuda_mpi PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:
--diag_suppress=declared_but_not_referenced
--diag_suppress=set_but_not_used>
$<$<COMPILE_LANGUAGE:C>:
--diag_suppress=declared_but_not_referenced
--diag_suppress=set_but_not_used>
)

# ── Link libraries ────────────────────────────────────────────────────────────
target_link_libraries(microsim_kks_fd_cuda_mpi PRIVATE
MPI::MPI_CXX
GSL::gsl
GSL::gslcblas
CUDA::cudart
m
)

if(ENABLE_HDF5)
target_link_libraries(microsim_kks_fd_cuda_mpi PRIVATE ${HDF5_C_LIBRARIES})
endif()

if(ENABLE_CUFFTMP)
# cuFFTMp – library location can be overridden with -DCUFFTMP_LIB_DIR=<path>
if(DEFINED CUFFTMP_LIB_DIR)
target_link_directories(microsim_kks_fd_cuda_mpi PRIVATE ${CUFFTMP_LIB_DIR})
endif()
target_link_libraries(microsim_kks_fd_cuda_mpi PRIVATE cufftMp)
else()
target_link_libraries(microsim_kks_fd_cuda_mpi PRIVATE CUDA::cufft)
endif()

# ── Utility: write_xdmf ──────────────────────────────────────────────────────
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/write_xdmf.c")
add_executable(write_xdmf_kks write_xdmf.c)

target_include_directories(write_xdmf_kks PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${FUNCTIONS}
${SOLVERLOOP}
${HDF5_INCLUDE_DIRS}
${CUDAToolkit_INCLUDE_DIRS}
)

target_compile_definitions(write_xdmf_kks PRIVATE
THERMO=0
ENABLE_HDF5=$<BOOL:${ENABLE_HDF5}>
${HDF5_DEFINITIONS}
)

target_link_libraries(write_xdmf_kks PRIVATE
MPI::MPI_CXX
${HDF5_C_LIBRARIES}
CUDA::cudart
m
)
endif()

# ── Utility: reconstruct ──────────────────────────────────────────────────────
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/reconstruct.c")
add_executable(reconstruct_kks reconstruct.c)

target_include_directories(reconstruct_kks PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${FUNCTIONS}
${SOLVERLOOP}
${CUDAToolkit_INCLUDE_DIRS}
)

target_compile_definitions(reconstruct_kks PRIVATE THERMO=0)

target_link_libraries(reconstruct_kks PRIVATE
MPI::MPI_CXX
CUDA::cudart
m
)
endif()

install(TARGETS microsim_kks_fd_cuda_mpi RUNTIME DESTINATION bin)
Loading