aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/macos.yml18
-rw-r--r--.github/workflows/ubuntu.yml20
-rw-r--r--CMakeLists.txt277
-rw-r--r--Source/BoundaryConditions/CMakeLists.txt5
-rw-r--r--Source/Diagnostics/CMakeLists.txt17
-rw-r--r--Source/Diagnostics/ComputeDiagFunctors/CMakeLists.txt8
-rw-r--r--Source/Diagnostics/FlushFormats/CMakeLists.txt13
-rw-r--r--Source/Diagnostics/ParticleDiag/CMakeLists.txt4
-rw-r--r--Source/Diagnostics/ReducedDiags/CMakeLists.txt10
-rw-r--r--Source/Evolve/CMakeLists.txt4
-rw-r--r--Source/FieldSolver/CMakeLists.txt11
-rw-r--r--Source/FieldSolver/FiniteDifferenceSolver/CMakeLists.txt14
-rw-r--r--Source/FieldSolver/FiniteDifferenceSolver/MacroscopicProperties/CMakeLists.txt4
-rw-r--r--Source/FieldSolver/SpectralSolver/CMakeLists.txt30
-rw-r--r--Source/FieldSolver/SpectralSolver/SpectralAlgorithms/CMakeLists.txt15
-rw-r--r--Source/FieldSolver/SpectralSolver/SpectralHankelTransform/CMakeLists.txt5
-rw-r--r--Source/FieldSolver/SpectralSolver/SpectralHankelTransform/Make.package8
-rw-r--r--Source/Filter/CMakeLists.txt6
-rw-r--r--Source/Initialization/CMakeLists.txt7
-rw-r--r--Source/Laser/CMakeLists.txt6
-rw-r--r--Source/Laser/LaserProfilesImpl/CMakeLists.txt7
-rw-r--r--Source/Parallelization/CMakeLists.txt6
-rw-r--r--Source/Parser/CMakeLists.txt8
-rw-r--r--Source/Particles/CMakeLists.txt16
-rw-r--r--Source/Particles/Collision/CMakeLists.txt4
-rw-r--r--Source/Particles/ElementaryProcess/CMakeLists.txt3
-rw-r--r--Source/Particles/ElementaryProcess/QEDInternals/CMakeLists.txt12
-rw-r--r--Source/Particles/ParticleCreation/CMakeLists.txt4
-rw-r--r--Source/Particles/Sorting/CMakeLists.txt4
-rw-r--r--Source/Python/CMakeLists.txt5
-rw-r--r--Source/Utils/CMakeLists.txt11
-rw-r--r--Source/Utils/WarpXUtil.H1
-rw-r--r--cmake/WarpXFunctions.cmake176
-rw-r--r--cmake/dependencies/AMReX.cmake110
-rw-r--r--cmake/dependencies/PICSAR.cmake54
-rw-r--r--cmake/dependencies/openPMD.cmake70
36 files changed, 950 insertions, 23 deletions
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index f7068a010..236554dc0 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -8,8 +8,6 @@ jobs:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- with:
- path: 'warpx_directory/WarpX'
- name: install dependencies
run: |
set +e
@@ -24,10 +22,12 @@ jobs:
brew install openpmd-api
- name: build WarpX
run: |
- cd warpx_directory
- git clone --depth 1 https://bitbucket.org/berkeleylab/picsar.git
- git clone --depth 1 --branch development https://github.com/AMReX-Codes/amrex.git
- cd WarpX
- export LDFLAGS="-lomp"
- make -j 2 COMP=llvm USE_OMP=FALSE USE_OPENPMD=TRUE XTRA_CXXFLAGS="-Xpreprocessor -fopenmp"
- make -j 2 COMP=llvm USE_OMP=FALSE USE_OPENPMD=TRUE XTRA_CXXFLAGS="-Xpreprocessor -fopenmp" PRECISION=FLOAT USE_SINGLE_PRECISION_PARTICLES=TRUE
+ mkdir build_dp && cd build_dp
+ cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DWarpX_COMPUTE=OMP -DWarpX_OPENPMD=ON -DWarpX_openpmd_internal=OFF
+ make -j 2
+
+ cd ..
+
+ mkdir build_sp && cd build_sp
+ cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DWarpX_COMPUTE=OMP -DWarpX_OPENPMD=ON -DWarpX_openpmd_internal=OFF -DENABLE_DP=OFF -DENABLE_DP_PARTICLES=OFF
+ make -j 2
diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml
index ce89ac3fa..7ea878edd 100644
--- a/.github/workflows/ubuntu.yml
+++ b/.github/workflows/ubuntu.yml
@@ -10,8 +10,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- with:
- path: 'warpx_directory/WarpX'
- name: install dependencies
run: |
export DEBIAN_FRONTEND=noninteractive
@@ -29,15 +27,19 @@ jobs:
CXX=$(which icpc) CC=$(which icc) cmake-easyinstall --prefix=/usr/local git+https://github.com/openPMD/openPMD-api.git -DopenPMD_USE_PYTHON=OFF -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF
- name: build WarpX
run: |
- cd warpx_directory
- git clone --depth 1 https://bitbucket.org/berkeleylab/picsar.git
- git clone --depth 1 --branch development https://github.com/AMReX-Codes/amrex.git
- cd WarpX
source /opt/intel/inteloneapi/setvars.sh
export CXX=$(which icpc)
export CC=$(which icc)
- make -j 2 COMP=intel USE_MPI=FALSE USE_OPENPMD=TRUE
- make -j 2 COMP=intel USE_MPI=FALSE USE_OPENPMD=TRUE PRECISION=FLOAT USE_SINGLE_PRECISION_PARTICLES=TRUE
+
+ mkdir build_dp && cd build_dp
+ cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_MPI=OFF -DWarpX_COMPUTE=OMP -DWarpX_OPENPMD=ON -DWarpX_openpmd_internal=OFF
+ make -j 2
+
+ cd ..
+
+ mkdir build_sp && cd build_sp
+ cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_MPI=OFF -DWarpX_COMPUTE=OMP -DWarpX_OPENPMD=ON -DWarpX_openpmd_internal=OFF -DENABLE_DP=OFF -DENABLE_DP_PARTICLES=OFF
+ make -j 2
build_dpcc:
name: oneAPI DPC++ SP [Linux]
@@ -66,7 +68,7 @@ jobs:
git clone https://github.com/openPMD/openPMD-api.git
mkdir openPMD-api/build
cd openPMD-api/build
- CXX=$(which dpcpp) CC=$(which clang) cmake .. -DopenPMD_USE_PYTHON=OFF -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF
+ CXX=$(which dpcpp) CC=$(which clang) cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DopenPMD_USE_PYTHON=OFF -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF
make -j 2
sudo make install
- name: build WarpX
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 000000000..6ed1c0a93
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,277 @@
+# Preamble ####################################################################
+#
+cmake_minimum_required(VERSION 3.14.0)
+project(WarpX VERSION 0.20.5)
+
+include(${WarpX_SOURCE_DIR}/cmake/WarpXFunctions.cmake)
+
+# In-source tree builds are messy and can screw up the build system.
+# Avoid building at least in the same dir as the root dir:
+if(CMAKE_BINARY_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
+ message(FATAL_ERROR "Building in-source is not supported! "
+ "Create a build directory and remove "
+ "${CMAKE_SOURCE_DIR}/CMakeCache.txt ${CMAKE_SOURCE_DIR}/CMakeFiles/")
+endif()
+
+
+# CCache Support ##############################################################
+#
+# this is an optional tool that stores compiled object files; allows fast
+# re-builds even with "make clean" in between. Mainly used to store AMReX
+# objects
+set_ccache()
+
+
+# Output Directories ##########################################################
+#
+# temporary build directories
+set_default_build_dirs()
+
+# install directories
+set_default_install_dirs()
+
+
+# Options and Variants ########################################################
+#
+option(WarpX_OPENPMD "openPMD I/O" OFF)
+option(WarpX_PSATD "spectral solver support" OFF)
+option(WarpX_QED "PICSAR QED (requires Boost)" OFF)
+# TODO: python, hdf5, sensei, conduit, ascent
+
+set(WarpX_DIMS_VALUES 2 3 RZ)
+set(WarpX_DIMS 3 CACHE STRING "Simulation dimensionality (2/3/RZ)")
+set_property(CACHE WarpX_DIMS PROPERTY STRINGS ${WarpX_DIMS_VALUES})
+if(NOT WarpX_DIMS IN_LIST WarpX_DIMS_VALUES)
+ message(FATAL_ERROR "WarpX_DIMS (${WarpX_DIMS}) must be one of ${WarpX_DIMS_VALUES}")
+endif()
+
+set(WarpX_PRECISION_VALUES double single)
+set(WarpX_PRECISION double CACHE STRING "Floating point precision (single/double)")
+set_property(CACHE WarpX_PRECISION PROPERTY STRINGS ${WarpX_PRECISION_VALUES})
+if(NOT WarpX_PRECISION IN_LIST WarpX_PRECISION_VALUES)
+ message(FATAL_ERROR "WarpX_PRECISION (${WarpX_PRECISION}) must be one of ${WarpX_PRECISION_VALUES}")
+endif()
+
+set(WarpX_COMPUTE_VALUES NONE CUDA OMP) # HIP DPCPP
+set(WarpX_COMPUTE NONE CACHE STRING "Parallel, on-node computing backend (NONE/CUDA/OMP)")
+set_property(CACHE WarpX_COMPUTE PROPERTY STRINGS ${WarpX_COMPUTE_VALUES})
+if(NOT WarpX_COMPUTE IN_LIST WarpX_COMPUTE_VALUES)
+ message(FATAL_ERROR "WarpX_PRECISION (${WarpX_COMPUTE}) must be one of ${WarpX_COMPUTE_VALUES}")
+endif()
+
+option(WarpX_amrex_internal "Download & build AMReX" ON)
+
+# change the default build type to RelWithDebInfo (or Release) instead of Debug
+set_default_build_type("RelWithDebInfo")
+
+# this defined the variable BUILD_TESTING which is ON by default
+include(CTest)
+
+
+# Dependencies ################################################################
+#
+
+# AMReX
+# builds AMReX from source (default) or finds an existing install
+include(${WarpX_SOURCE_DIR}/cmake/dependencies/AMReX.cmake)
+# suppress warnings in AMReX headers (use -isystem instead of -I)
+make_third_party_includes_system(AMReX::amrex AMReX)
+
+# PICSAR
+# builds PICSAR from source
+include(${WarpX_SOURCE_DIR}/cmake/dependencies/PICSAR.cmake)
+
+# openPMD
+# builds openPMD-api from source (default) or finds an existing install
+include(${WarpX_SOURCE_DIR}/cmake/dependencies/openPMD.cmake)
+
+# PSATD
+if(WarpX_PSATD)
+ # FFTW (non-GPU) and cuFFT (GPU)
+ if(NOT ENABLE_CUDA)
+ find_package(PkgConfig REQUIRED QUIET)
+ if(WarpX_PRECISION STREQUAL "double")
+ pkg_check_modules(fftw3 REQUIRED IMPORTED_TARGET fftw3)
+ else()
+ pkg_check_modules(fftw3f REQUIRED IMPORTED_TARGET fftw3f)
+ endif()
+ endif()
+ # BLASPP and LAPACKPP
+ if(WarpX_DIMS STREQUAL RZ)
+ # FIXME send a couple of upstream PRs to those repos...
+ find_package(blaspp REQUIRED)
+ find_package(lapackpp REQUIRED)
+ find_package(OpenMP REQUIRED) # pulled by the two above
+ endif()
+endif()
+
+
+# Targets #####################################################################
+#
+# executable
+add_executable(WarpX)
+add_executable(WarpX::WarpX ALIAS WarpX)
+
+# own headers
+target_include_directories(WarpX PRIVATE
+ $<BUILD_INTERFACE:${WarpX_SOURCE_DIR}/Source>
+)
+
+# if we include <AMReX_buildInfo.H> we will need to call:
+include(AMReXBuildInfo)
+generate_buildinfo(WarpX "${WarpX_SOURCE_DIR}")
+
+# add sources
+target_sources(WarpX
+ PRIVATE
+ Source/main.cpp
+ Source/WarpX.cpp
+)
+add_subdirectory(Source/BoundaryConditions)
+add_subdirectory(Source/Diagnostics)
+add_subdirectory(Source/Evolve)
+add_subdirectory(Source/FieldSolver)
+add_subdirectory(Source/Filter)
+add_subdirectory(Source/Initialization)
+add_subdirectory(Source/Laser)
+add_subdirectory(Source/Parallelization)
+add_subdirectory(Source/Parser)
+add_subdirectory(Source/Particles)
+#add_subdirectory(Source/Python)
+add_subdirectory(Source/Utils)
+
+# C++ properties: at least a C++14 capable compiler is needed
+target_compile_features(WarpX PUBLIC cxx_std_14)
+set_target_properties(WarpX PROPERTIES
+ CXX_EXTENSIONS OFF
+ CXX_STANDARD_REQUIRED ON
+)
+
+# link dependencies
+# FIXME use AMReX::thirdparty::AMReX as soon as
+# missing _deps/fetchedamrex-build/mod_files is solved
+target_link_libraries(WarpX PUBLIC AMReX::amrex)
+
+if(WarpX_PSATD)
+ if(ENABLE_CUDA)
+ # CUDA_ADD_CUFFT_TO_TARGET(WarpX)
+ target_link_libraries(WarpX PUBLIC cufft)
+ else()
+ if(WarpX_PRECISION STREQUAL "double")
+ target_link_libraries(WarpX PUBLIC PkgConfig::fftw3)
+ else()
+ target_link_libraries(WarpX PUBLIC PkgConfig::fftw3f)
+ endif()
+ endif()
+ if(WarpX_DIMS STREQUAL RZ)
+ # FIXME send a couple of upstream PRs to those repos...
+ target_link_libraries(WarpX PUBLIC blaspp)
+ target_link_libraries(WarpX PUBLIC lapackpp)
+ endif()
+endif()
+
+if(WarpX_OPENPMD)
+ target_compile_definitions(WarpX PUBLIC WARPX_USE_OPENPMD)
+ target_link_libraries(WarpX PUBLIC openPMD::openPMD)
+endif()
+
+if(WarpX_QED)
+ target_compile_definitions(WarpX PUBLIC WARPX_QED)
+ # FIXME WARPX_QED_TABLE_GEN
+ target_link_libraries(WarpX PUBLIC pxrmp_qed)
+endif()
+
+# AMReX helper function: propagate CUDA specific target & source properties
+if(ENABLE_CUDA)
+ setup_target_for_cuda_compilation(WarpX)
+ target_compile_features(WarpX PUBLIC cuda_std_14)
+ set_target_properties(WarpX PROPERTIES
+ CUDA_EXTENSIONS OFF
+ CUDA_STANDARD_REQUIRED ON
+ )
+endif()
+
+
+# Defines #####################################################################
+#
+if(WarpX_DIMS STREQUAL 3)
+ target_compile_definitions(WarpX PRIVATE WARPX_DIM_3D)
+elseif(WarpX_DIMS STREQUAL 2)
+ target_compile_definitions(WarpX PRIVATE WARPX_DIM_XZ)
+elseif(WarpX_DIMS STREQUAL RZ)
+ target_compile_definitions(WarpX PRIVATE WARPX_DIM_RZ)
+endif()
+
+if(WarpX_OPENPMD)
+ target_compile_definitions(WarpX PRIVATE WARPX_USE_OPENPMD)
+endif()
+
+if(WarpX_QED)
+ target_compile_definitions(WarpX PRIVATE WARPX_QED)
+ if(WarpX_QED_TABLE_GEN)
+ target_compile_definitions(WarpX PRIVATE WarpX_QED_TABLE_GEN)
+ endif()
+endif()
+
+if(WarpX_PSATD)
+ target_compile_definitions(WarpX PRIVATE WARPX_USE_PSATD)
+endif()
+
+
+# Warnings ####################################################################
+#
+set_cxx_warnings()
+
+
+# Generate Configuration and .pc Files ########################################
+#
+# these files are used if WarpX is installed and picked up by a downstream
+# project (not needed yet)
+
+#include(CMakePackageConfigHelpers)
+#write_basic_package_version_file("WarpXConfigVersion.cmake"
+# VERSION ${WarpX_VERSION}
+# COMPATIBILITY SameMajorVersion
+#)
+
+
+# Installs ####################################################################
+#
+# headers, libraries and executables
+set(WarpX_INSTALL_TARGET_NAMES WarpX)
+
+install(TARGETS ${WarpX_INSTALL_TARGET_NAMES}
+ EXPORT WarpXTargets
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+)
+
+# CMake package file for find_package(WarpX::WarpX) in depending projects
+#install(EXPORT WarpXTargets
+# FILE WarpXTargets.cmake
+# NAMESPACE WarpX::
+# DESTINATION ${CMAKE_INSTALL_CMAKEDIR}
+#)
+#install(
+# FILES
+# ${WarpX_BINARY_DIR}/WarpXConfig.cmake
+# ${WarpX_BINARY_DIR}/WarpXConfigVersion.cmake
+# DESTINATION ${CMAKE_INSTALL_CMAKEDIR}
+#)
+
+
+# Tests #######################################################################
+#
+
+#if(BUILD_TESTING)
+# enable_testing()
+#
+# add_test(...)
+#endif()
+
+
+# Status Summary for Build Options ############################################
+#
+warpx_print_summary()
diff --git a/Source/BoundaryConditions/CMakeLists.txt b/Source/BoundaryConditions/CMakeLists.txt
new file mode 100644
index 000000000..265f5c210
--- /dev/null
+++ b/Source/BoundaryConditions/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources(WarpX
+ PRIVATE
+ PML.cpp
+ WarpXEvolvePML.cpp
+)
diff --git a/Source/Diagnostics/CMakeLists.txt b/Source/Diagnostics/CMakeLists.txt
new file mode 100644
index 000000000..7651aa104
--- /dev/null
+++ b/Source/Diagnostics/CMakeLists.txt
@@ -0,0 +1,17 @@
+target_sources(WarpX
+ PRIVATE
+ BackTransformedDiagnostic.cpp
+ Diagnostics.cpp
+ FieldIO.cpp
+ FullDiagnostics.cpp
+ MultiDiagnostics.cpp
+ ParticleIO.cpp
+ SliceDiagnostic.cpp
+ WarpXIO.cpp
+ WarpXOpenPMD.cpp
+)
+
+add_subdirectory(ComputeDiagFunctors)
+add_subdirectory(FlushFormats)
+add_subdirectory(ParticleDiag)
+add_subdirectory(ReducedDiags)
diff --git a/Source/Diagnostics/ComputeDiagFunctors/CMakeLists.txt b/Source/Diagnostics/ComputeDiagFunctors/CMakeLists.txt
new file mode 100644
index 000000000..3fc2ca2c9
--- /dev/null
+++ b/Source/Diagnostics/ComputeDiagFunctors/CMakeLists.txt
@@ -0,0 +1,8 @@
+target_sources(WarpX
+ PRIVATE
+ CellCenterFunctor.cpp
+ DivBFunctor.cpp
+ DivEFunctor.cpp
+ PartPerCellFunctor.cpp
+ PartPerGridFunctor.cpp
+)
diff --git a/Source/Diagnostics/FlushFormats/CMakeLists.txt b/Source/Diagnostics/FlushFormats/CMakeLists.txt
new file mode 100644
index 000000000..478db3750
--- /dev/null
+++ b/Source/Diagnostics/FlushFormats/CMakeLists.txt
@@ -0,0 +1,13 @@
+target_sources(WarpX
+ PRIVATE
+ FlushFormatAscent.cpp
+ FlushFormatCheckpoint.cpp
+ FlushFormatPlotfile.cpp
+)
+
+if(WarpX_HAVE_OPENPMD)
+ target_sources(WarpX
+ PRIVATE
+ FlushFormatOpenPMD.cpp
+ )
+endif()
diff --git a/Source/Diagnostics/ParticleDiag/CMakeLists.txt b/Source/Diagnostics/ParticleDiag/CMakeLists.txt
new file mode 100644
index 000000000..e682608af
--- /dev/null
+++ b/Source/Diagnostics/ParticleDiag/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources(WarpX
+ PRIVATE
+ ParticleDiag.cpp
+)
diff --git a/Source/Diagnostics/ReducedDiags/CMakeLists.txt b/Source/Diagnostics/ReducedDiags/CMakeLists.txt
new file mode 100644
index 000000000..559cac5fb
--- /dev/null
+++ b/Source/Diagnostics/ReducedDiags/CMakeLists.txt
@@ -0,0 +1,10 @@
+target_sources(WarpX
+ PRIVATE
+ BeamRelevant.cpp
+ FieldEnergy.cpp
+ LoadBalanceCosts.cpp
+ MultiReducedDiags.cpp
+ ParticleEnergy.cpp
+ ParticleHistogram.cpp
+ ReducedDiags.cpp
+)
diff --git a/Source/Evolve/CMakeLists.txt b/Source/Evolve/CMakeLists.txt
new file mode 100644
index 000000000..fea38b47d
--- /dev/null
+++ b/Source/Evolve/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources(WarpX
+ PRIVATE
+ WarpXEvolve.cpp
+)
diff --git a/Source/FieldSolver/CMakeLists.txt b/Source/FieldSolver/CMakeLists.txt
new file mode 100644
index 000000000..210bfa1b2
--- /dev/null
+++ b/Source/FieldSolver/CMakeLists.txt
@@ -0,0 +1,11 @@
+target_sources(WarpX
+ PRIVATE
+ ElectrostaticSolver.cpp
+ WarpXPushFieldsEM.cpp
+ WarpX_QED_Field_Pushers.cpp
+)
+
+add_subdirectory(FiniteDifferenceSolver)
+if(WarpX_PSATD)
+ add_subdirectory(SpectralSolver)
+endif()
diff --git a/Source/FieldSolver/FiniteDifferenceSolver/CMakeLists.txt b/Source/FieldSolver/FiniteDifferenceSolver/CMakeLists.txt
new file mode 100644
index 000000000..93dbd7938
--- /dev/null
+++ b/Source/FieldSolver/FiniteDifferenceSolver/CMakeLists.txt
@@ -0,0 +1,14 @@
+target_sources(WarpX
+ PRIVATE
+ ComputeDivE.cpp
+ EvolveB.cpp
+ EvolveBPML.cpp
+ EvolveE.cpp
+ EvolveEPML.cpp
+ EvolveF.cpp
+ EvolveFPML.cpp
+ FiniteDifferenceSolver.cpp
+ MacroscopicEvolveE.cpp
+)
+
+add_subdirectory(MacroscopicProperties)
diff --git a/Source/FieldSolver/FiniteDifferenceSolver/MacroscopicProperties/CMakeLists.txt b/Source/FieldSolver/FiniteDifferenceSolver/MacroscopicProperties/CMakeLists.txt
new file mode 100644
index 000000000..3d3d56136
--- /dev/null
+++ b/Source/FieldSolver/FiniteDifferenceSolver/MacroscopicProperties/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources(WarpX
+ PRIVATE
+ MacroscopicProperties.cpp
+)
diff --git a/Source/FieldSolver/SpectralSolver/CMakeLists.txt b/Source/FieldSolver/SpectralSolver/CMakeLists.txt
new file mode 100644
index 000000000..34012aabd
--- /dev/null
+++ b/Source/FieldSolver/SpectralSolver/CMakeLists.txt
@@ -0,0 +1,30 @@
+target_sources(WarpX
+ PRIVATE
+ SpectralFieldData.cpp
+ SpectralKSpace.cpp
+ SpectralSolver.cpp
+)
+
+if(ENABLE_CUDA)
+ target_sources(WarpX
+ PRIVATE
+ WrapCuFFT.cpp
+ )
+else()
+ target_sources(WarpX
+ PRIVATE
+ WrapFFTW.cpp
+ )
+endif()
+
+if(WarpX_DIMS STREQUAL RZ)
+ target_sources(WarpX
+ PRIVATE
+ SpectralSolverRZ.cpp
+ SpectralFieldDataRZ.cpp
+ SpectralKSpaceRZ.cpp
+ )
+ add_subdirectory(SpectralHankelTransform)
+endif()
+
+add_subdirectory(SpectralAlgorithms)
diff --git a/Source/FieldSolver/SpectralSolver/SpectralAlgorithms/CMakeLists.txt b/Source/FieldSolver/SpectralSolver/SpectralAlgorithms/CMakeLists.txt
new file mode 100644
index 000000000..b80091aaf
--- /dev/null
+++ b/Source/FieldSolver/SpectralSolver/SpectralAlgorithms/CMakeLists.txt
@@ -0,0 +1,15 @@
+target_sources(WarpX
+ PRIVATE
+ GalileanAlgorithm.cpp
+ PMLPsatdAlgorithm.cpp
+ PsatdAlgorithm.cpp
+ SpectralBaseAlgorithm.cpp
+)
+
+if(WarpX_DIMS STREQUAL RZ)
+ target_sources(WarpX
+ PRIVATE
+ SpectralBaseAlgorithmRZ.cpp
+ PsatdAlgorithmRZ.cpp
+ )
+endif()
diff --git a/Source/FieldSolver/SpectralSolver/SpectralHankelTransform/CMakeLists.txt b/Source/FieldSolver/SpectralSolver/SpectralHankelTransform/CMakeLists.txt
new file mode 100644
index 000000000..858ffb137
--- /dev/null
+++ b/Source/FieldSolver/SpectralSolver/SpectralHankelTransform/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources(WarpX
+ PRIVATE
+ SpectralHankelTransformer.cpp
+ HankelTransform.cpp
+)
diff --git a/Source/FieldSolver/SpectralSolver/SpectralHankelTransform/Make.package b/Source/FieldSolver/SpectralSolver/SpectralHankelTransform/Make.package
index a3c22d64a..8bb1d7ef7 100644
--- a/Source/FieldSolver/SpectralSolver/SpectralHankelTransform/Make.package
+++ b/Source/FieldSolver/SpectralSolver/SpectralHankelTransform/Make.package
@@ -1,6 +1,4 @@
-ifeq ($(USE_RZ),TRUE)
- CEXE_sources += SpectralHankelTransformer.cpp
- CEXE_sources += HankelTransform.cpp
+CEXE_sources += SpectralHankelTransformer.cpp
+CEXE_sources += HankelTransform.cpp
- VPATH_LOCATIONS += $(WARPX_HOME)/Source/FieldSolver/SpectralSolver/SpectralHankelTransform
-endif
+VPATH_LOCATIONS += $(WARPX_HOME)/Source/FieldSolver/SpectralSolver/SpectralHankelTransform
diff --git a/Source/Filter/CMakeLists.txt b/Source/Filter/CMakeLists.txt
new file mode 100644
index 000000000..801e721dd
--- /dev/null
+++ b/Source/Filter/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources(WarpX
+ PRIVATE
+ BilinearFilter.cpp
+ Filter.cpp
+ NCIGodfreyFilter.cpp
+)
diff --git a/Source/Initialization/CMakeLists.txt b/Source/Initialization/CMakeLists.txt
new file mode 100644
index 000000000..b6cab076c
--- /dev/null
+++ b/Source/Initialization/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources(WarpX
+ PRIVATE
+ InjectorDensity.cpp
+ InjectorMomentum.cpp
+ PlasmaInjector.cpp
+ WarpXInitData.cpp
+)
diff --git a/Source/Laser/CMakeLists.txt b/Source/Laser/CMakeLists.txt
new file mode 100644
index 000000000..859b5b05a
--- /dev/null
+++ b/Source/Laser/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources(WarpX
+ PRIVATE
+ LaserParticleContainer.cpp
+)
+
+add_subdirectory(LaserProfilesImpl)
diff --git a/Source/Laser/LaserProfilesImpl/CMakeLists.txt b/Source/Laser/LaserProfilesImpl/CMakeLists.txt
new file mode 100644
index 000000000..f5ce9f5fb
--- /dev/null
+++ b/Source/Laser/LaserProfilesImpl/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources(WarpX
+ PRIVATE
+ LaserProfileFieldFunction.cpp
+ LaserProfileFromTXYEFile.cpp
+ LaserProfileGaussian.cpp
+ LaserProfileHarris.cpp
+)
diff --git a/Source/Parallelization/CMakeLists.txt b/Source/Parallelization/CMakeLists.txt
new file mode 100644
index 000000000..3588f6f31
--- /dev/null
+++ b/Source/Parallelization/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources(WarpX
+ PRIVATE
+ GuardCellManager.cpp
+ WarpXComm.cpp
+ WarpXRegrid.cpp
+)
diff --git a/Source/Parser/CMakeLists.txt b/Source/Parser/CMakeLists.txt
new file mode 100644
index 000000000..2c9a93942
--- /dev/null
+++ b/Source/Parser/CMakeLists.txt
@@ -0,0 +1,8 @@
+target_sources(WarpX
+ PRIVATE
+ WarpXParser.cpp
+ wp_parser_c.cpp
+ wp_parser.lex.cpp
+ wp_parser.tab.cpp
+ wp_parser_y.cpp
+)
diff --git a/Source/Particles/CMakeLists.txt b/Source/Particles/CMakeLists.txt
new file mode 100644
index 000000000..e4a665de5
--- /dev/null
+++ b/Source/Particles/CMakeLists.txt
@@ -0,0 +1,16 @@
+target_sources(WarpX
+ PRIVATE
+ MultiParticleContainer.cpp
+ PhotonParticleContainer.cpp
+ PhysicalParticleContainer.cpp
+ RigidInjectedParticleContainer.cpp
+ WarpXParticleContainer.cpp
+)
+
+add_subdirectory(Collision)
+#add_subdirectory(Deposition)
+add_subdirectory(ElementaryProcess)
+#add_subdirectory(Gather)
+add_subdirectory(ParticleCreation)
+#add_subdirectory(Pusher)
+add_subdirectory(Sorting)
diff --git a/Source/Particles/Collision/CMakeLists.txt b/Source/Particles/Collision/CMakeLists.txt
new file mode 100644
index 000000000..f77a13b2c
--- /dev/null
+++ b/Source/Particles/Collision/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources(WarpX
+ PRIVATE
+ CollisionType.cpp
+)
diff --git a/Source/Particles/ElementaryProcess/CMakeLists.txt b/Source/Particles/ElementaryProcess/CMakeLists.txt
new file mode 100644
index 000000000..1a4550a94
--- /dev/null
+++ b/Source/Particles/ElementaryProcess/CMakeLists.txt
@@ -0,0 +1,3 @@
+if(WarpX_HAVE_QED)
+ add_subdirectory(QEDInternals)
+endif()
diff --git a/Source/Particles/ElementaryProcess/QEDInternals/CMakeLists.txt b/Source/Particles/ElementaryProcess/QEDInternals/CMakeLists.txt
new file mode 100644
index 000000000..1bd803cde
--- /dev/null
+++ b/Source/Particles/ElementaryProcess/QEDInternals/CMakeLists.txt
@@ -0,0 +1,12 @@
+target_sources(WarpX
+ PRIVATE
+ BreitWheelerEngineWrapper.cpp
+ QuantumSyncEngineWrapper.cpp
+)
+
+#if(WARPX_QED_TABLE_GEN)
+# target_sources(WarpX
+# PRIVATE
+# BreitWheelerEngineTableBuilder.cpp
+# QuantumSyncEngineTableBuilder.cpp
+#endif()
diff --git a/Source/Particles/ParticleCreation/CMakeLists.txt b/Source/Particles/ParticleCreation/CMakeLists.txt
new file mode 100644
index 000000000..416691733
--- /dev/null
+++ b/Source/Particles/ParticleCreation/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources(WarpX
+ PRIVATE
+ SmartUtils.cpp
+)
diff --git a/Source/Particles/Sorting/CMakeLists.txt b/Source/Particles/Sorting/CMakeLists.txt
new file mode 100644
index 000000000..8b8ad199c
--- /dev/null
+++ b/Source/Particles/Sorting/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources(WarpX
+ PRIVATE
+ Partition.cpp
+)
diff --git a/Source/Python/CMakeLists.txt b/Source/Python/CMakeLists.txt
new file mode 100644
index 000000000..00c9e02f1
--- /dev/null
+++ b/Source/Python/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources(WarpX
+ PRIVATE
+ WarpX_py.cpp
+ WarpXWrappers.cpp
+)
diff --git a/Source/Utils/CMakeLists.txt b/Source/Utils/CMakeLists.txt
new file mode 100644
index 000000000..bd500e4e5
--- /dev/null
+++ b/Source/Utils/CMakeLists.txt
@@ -0,0 +1,11 @@
+target_sources(WarpX
+ PRIVATE
+ CoarsenIO.cpp
+ CoarsenMR.cpp
+ Interpolate.cpp
+ IntervalsParser.cpp
+ WarpXAlgorithmSelection.cpp
+ WarpXMovingWindow.cpp
+ WarpXTagging.cpp
+ WarpXUtil.cpp
+)
diff --git a/Source/Utils/WarpXUtil.H b/Source/Utils/WarpXUtil.H
index 6cdc71a0c..bb0a620fa 100644
--- a/Source/Utils/WarpXUtil.H
+++ b/Source/Utils/WarpXUtil.H
@@ -14,6 +14,7 @@
#include <AMReX_Vector.H>
#include <AMReX_MultiFab.H>
#include <AMReX_ParmParse.H>
+#include <AMReX_Utility.H>
#include <cstdint>
#include <string>
diff --git a/cmake/WarpXFunctions.cmake b/cmake/WarpXFunctions.cmake
new file mode 100644
index 000000000..ec4db7a17
--- /dev/null
+++ b/cmake/WarpXFunctions.cmake
@@ -0,0 +1,176 @@
+# find the CCache tool and use it if found
+#
+macro(set_ccache)
+ find_program(CCACHE_PROGRAM ccache)
+ if(CCACHE_PROGRAM)
+ set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
+ if(ENABLE_CUDA)
+ set(CMAKE_CUDA_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
+ endif()
+ endif()
+ mark_as_advanced(CCACHE_PROGRAM)
+endmacro()
+
+
+# set names and paths of temporary build directories
+# the defaults in CMake are sub-ideal for historic reasons, lets make them more
+# Unix-ish and portable.
+#
+macro(set_default_build_dirs)
+ if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
+ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
+ CACHE PATH "Build directory for archives")
+ mark_as_advanced(CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
+ endif()
+ if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
+ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
+ CACHE PATH "Build directory for libraries")
+ mark_as_advanced(CMAKE_LIBRARY_OUTPUT_DIRECTORY)
+ endif()
+ if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
+ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
+ CACHE PATH "Build directory for binaries")
+ mark_as_advanced(CMAKE_RUNTIME_OUTPUT_DIRECTORY)
+ endif()
+endmacro()
+
+
+# set names and paths of install directories
+# the defaults in CMake are sub-ideal for historic reasons, lets make them more
+# Unix-ish and portable.
+#
+macro(set_default_install_dirs)
+ include(GNUInstallDirs)
+ if(NOT CMAKE_INSTALL_CMAKEDIR)
+ set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/WarpX"
+ CACHE PATH "CMake config package location for installed targets")
+ if(WIN32)
+ set(CMAKE_INSTALL_LIBDIR Lib
+ CACHE PATH "Object code libraries")
+ set_property(CACHE CMAKE_INSTALL_CMAKEDIR PROPERTY VALUE "cmake")
+ endif()
+ mark_as_advanced(CMAKE_INSTALL_CMAKEDIR)
+ endif()
+endmacro()
+
+
+# change the default CMAKE_BUILD_TYPE
+# the default in CMake is Debug for historic reasons
+#
+macro(set_default_build_type default_build_type)
+ set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
+ if(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE ${default_build_type}
+ CACHE STRING
+ "Choose the build type, e.g. Release, Debug, or RelWithDebInfo." FORCE)
+ endif()
+endmacro()
+
+# Set CXX
+# Note: this is a bit legacy and one should use CMake TOOLCHAINS instead.
+#
+macro(set_cxx_warnings)
+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ # list(APPEND CMAKE_CXX_FLAGS "-fsanitize=address") # address, memory, undefined
+ # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
+ # set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")
+ # set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fsanitize=address")
+
+ # note: might still need a
+ # export LD_PRELOAD=libclang_rt.asan.so
+ # or on Debian 9 with Clang 6.0
+ # export LD_PRELOAD=/usr/lib/llvm-6.0/lib/clang/6.0.0/lib/linux/libclang_rt.asan-x86_64.so:
+ # /usr/lib/llvm-6.0/lib/clang/6.0.0/lib/linux/libclang_rt.ubsan_minimal-x86_64.so
+ # at runtime when used with symbol-hidden code (e.g. pybind11 module)
+
+ #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic -Wshadow -Woverloaded-virtual -Wextra-semi -Wunreachable-code")
+ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic -Wshadow -Woverloaded-virtual -Wunreachable-code")
+ elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
+ # Warning C4503: "decorated name length exceeded, name was truncated"
+ # Symbols longer than 4096 chars are truncated (and hashed instead)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4503")
+ # Yes, you should build against the same C++ runtime and with same
+ # configuration (Debug/Release). MSVC does inconvenient choices for their
+ # developers, so be it. (Our Windows-users use conda-forge builds, which
+ # are consistent.)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4251")
+ endif ()
+endmacro()
+
+# Take an <imported_target> and expose it as INTERFACE target with
+# WarpX::thirdparty::<propagated_name> naming and SYSTEM includes.
+#
+function(make_third_party_includes_system imported_target propagated_name)
+ add_library(WarpX::thirdparty::${propagated_name} INTERFACE IMPORTED)
+ target_link_libraries(WarpX::thirdparty::${propagated_name} INTERFACE AMReX::amrex)
+ get_target_property(ALL_INCLUDES ${imported_target} INCLUDE_DIRECTORIES)
+ set_target_properties(WarpX::thirdparty::${propagated_name} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "")
+ target_include_directories(WarpX::thirdparty::${propagated_name} SYSTEM INTERFACE ${ALL_INCLUDES})
+endfunction()
+
+
+# Set an MPI_TEST_EXE variable for test runs which runs num_ranks
+# ranks. On some systems, you might need to use the a specific
+# mpiexec wrapper, e.g. on Summit (ORNL) pass the hint
+# -DMPIEXEC_EXECUTABLE=$(which jsrun) to run ctest.
+#
+function(configure_mpiexec num_ranks)
+ # OpenMPI root guard: https://github.com/open-mpi/ompi/issues/4451
+ if("$ENV{USER}" STREQUAL "root")
+ # calling even --help as root will abort and warn on stderr
+ execute_process(COMMAND ${MPIEXEC_EXECUTABLE} --help
+ ERROR_VARIABLE MPIEXEC_HELP_TEXT
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if(${MPIEXEC_HELP_TEXT} MATCHES "^.*allow-run-as-root.*$")
+ set(MPI_ALLOW_ROOT --allow-run-as-root)
+ endif()
+ endif()
+ set(MPI_TEST_EXE
+ ${MPIEXEC_EXECUTABLE}
+ ${MPI_ALLOW_ROOT}
+ ${MPIEXEC_NUMPROC_FLAG} ${num_ranks}
+ PARENT_SCOPE
+ )
+endfunction()
+
+
+# Prints a summary of WarpX options at the end of the CMake configuration
+#
+function(warpx_print_summary)
+ message("")
+ message("WarpX build configuration:")
+ message(" Version: ${WarpX_VERSION}")
+ message(" C++ Compiler: ${CMAKE_CXX_COMPILER_ID} "
+ "${CMAKE_CXX_COMPILER_VERSION} "
+ "${CMAKE_CXX_COMPILER_WRAPPER}")
+ message(" ${CMAKE_CXX_COMPILER}")
+ message("")
+ message(" Installation prefix: ${CMAKE_INSTALL_PREFIX}")
+ message(" bin: ${CMAKE_INSTALL_BINDIR}")
+ message(" lib: ${CMAKE_INSTALL_LIBDIR}")
+ message(" include: ${CMAKE_INSTALL_INCLUDEDIR}")
+ message(" cmake: ${CMAKE_INSTALL_CMAKEDIR}")
+ if(WarpX_HAVE_PYTHON)
+ message(" python: ${CMAKE_INSTALL_PYTHONDIR}")
+ endif()
+ message("")
+ message(" Build type: ${CMAKE_BUILD_TYPE}")
+ #if(BUILD_SHARED_LIBS)
+ # message(" Library: shared")
+ #else()
+ # message(" Library: static")
+ #endif()
+ message(" Testing: ${BUILD_TESTING}")
+ #message(" Invasive Tests: ${WarpX_USE_INVASIVE_TESTS}")
+ #message(" Internal VERIFY: ${WarpX_USE_VERIFY}")
+ message(" Build options:")
+ message(" COMPUTE: ${WarpX_COMPUTE}")
+ message(" DIMS: ${WarpX_DIMS}")
+ message(" PSATD: ${WarpX_PSATD}")
+ message(" PRECISION: ${WarpX_PRECISION}")
+ message(" OPENPMD: ${WarpX_OPENPMD}")
+ message(" QED: ${WarpX_QED}")
+ message("")
+endfunction()
diff --git a/cmake/dependencies/AMReX.cmake b/cmake/dependencies/AMReX.cmake
new file mode 100644
index 000000000..c4a4fd240
--- /dev/null
+++ b/cmake/dependencies/AMReX.cmake
@@ -0,0 +1,110 @@
+macro(find_amrex)
+ if(WarpX_amrex_internal)
+ include(FetchContent)
+ set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
+
+ # see https://amrex-codes.github.io/amrex/docs_html/BuildingAMReX.html#customization-options
+ if(WarpX_COMPUTE STREQUAL CUDA)
+ set(ENABLE_ACC OFF CACHE INTERNAL "")
+ set(ENABLE_CUDA ON CACHE INTERNAL "")
+ #set(ENABLE_DPCPP OFF CACHE INTERNAL "")
+ set(ENABLE_OMP OFF CACHE INTERNAL "")
+ elseif(WarpX_COMPUTE STREQUAL OMP)
+ set(ENABLE_ACC OFF CACHE INTERNAL "")
+ set(ENABLE_CUDA OFF CACHE INTERNAL "")
+ #set(ENABLE_DPCPP OFF CACHE INTERNAL "")
+ set(ENABLE_OMP ON CACHE INTERNAL "")
+ else()
+ set(ENABLE_ACC OFF CACHE INTERNAL "")
+ set(ENABLE_CUDA OFF CACHE INTERNAL "")
+ #set(ENABLE_DPCPP OFF CACHE INTERNAL "")
+ set(ENABLE_OMP OFF CACHE INTERNAL "")
+ endif()
+
+ if(WarpX_PRECISION STREQUAL "double")
+ set(ENABLE_DP ON CACHE INTERNAL "")
+ set(ENABLE_DP_PARTICLES ON CACHE INTERNAL "")
+ else()
+ set(ENABLE_DP OFF CACHE INTERNAL "")
+ set(ENABLE_DP_PARTICLES OFF CACHE INTERNAL "")
+ endif()
+
+ enable_language(Fortran)
+ set(ENABLE_FORTRAN ON CACHE INTERNAL "")
+ set(ENABLE_FORTRAN_INTERFACES ON CACHE INTERNAL "")
+ set(ENABLE_TUTORIALS OFF CACHE INTERNAL "")
+ set(ENABLE_PARTICLES ON CACHE INTERNAL "")
+ set(ENABLE_TINY_PROFILE ON CACHE INTERNAL "")
+
+ # ENABLE_ASCENT
+ # ENABLE_CONDUIT
+ # ENABLE_SENSEI_IN_SITU
+ # we'll need this for Python bindings
+ #set(ENABLE_PIC ON CACHE INTERNAL "")
+
+ if(WarpX_DIMS STREQUAL RZ)
+ set(DIM 2 CACHE INTERNAL "")
+ else()
+ set(DIM ${WarpX_DIMS} CACHE INTERNAL "")
+ endif()
+
+ FetchContent_Declare(fetchedamrex
+ GIT_REPOSITORY ${WarpX_amrex_repo}
+ GIT_TAG ${WarpX_amrex_branch}
+ BUILD_IN_SOURCE 0
+ )
+ FetchContent_GetProperties(fetchedamrex)
+
+ if(NOT fetchedamrex_POPULATED)
+ FetchContent_Populate(fetchedamrex)
+ list(APPEND CMAKE_MODULE_PATH "${fetchedamrex_SOURCE_DIR}/Tools/CMake")
+ if(ENABLE_CUDA)
+ enable_language(CUDA)
+ include(AMReX_SetupCUDA)
+ endif()
+ add_subdirectory(${fetchedamrex_SOURCE_DIR} ${fetchedamrex_BINARY_DIR})
+ endif()
+
+ # advanced fetch options
+ mark_as_advanced(FETCHCONTENT_BASE_DIR)
+ mark_as_advanced(FETCHCONTENT_FULLY_DISCONNECTED)
+ mark_as_advanced(FETCHCONTENT_QUIET)
+ mark_as_advanced(FETCHCONTENT_SOURCE_DIR_FETCHEDAMREX)
+ mark_as_advanced(FETCHCONTENT_UPDATES_DISCONNECTED)
+ mark_as_advanced(FETCHCONTENT_UPDATES_DISCONNECTED_FETCHEDAMREX)
+
+ # AMReX options not relevant to WarpX users
+ mark_as_advanced(AMREX_BUILD_DATETIME)
+ mark_as_advanced(DIM)
+ mark_as_advanced(ENABLE_DP)
+ mark_as_advanced(ENABLE_DP_PARTICLES)
+ mark_as_advanced(ENABLE_FORTRAN)
+ mark_as_advanced(ENABLE_FORTRAN_INTERFACES)
+ mark_as_advanced(ENABLE_LINEAR_SOLVERS)
+ mark_as_advanced(ENABLE_PIC)
+ mark_as_advanced(USE_XSDK_DEFAULTS)
+ # ENABLE_ACC
+ # ENABLE_CUDA
+ # ENABLE_DPCPP
+ # ENABLE_OMP
+
+ message(STATUS "AMReX: Using INTERNAL version '${AMREX_PKG_VERSION}' (${AMREX_GIT_VERSION})")
+ else()
+ if(WarpX_DIMS STREQUAL RZ)
+ set(COMP_DIM 2D)
+ else()
+ set(COMP_DIM ${WarpX_DIMS}D)
+ endif()
+ find_package(AMReX 20.05 CONFIG REQUIRED COMPONENTS ${COMP_DIM} PARTICLES DPARTICLES DP TINYP LSOLVERS FINTERFACES)
+ message(STATUS "AMReX: Found version '${AMReX_VERSION}'")
+ endif()
+endmacro()
+
+set(WarpX_amrex_repo "https://github.com/AMReX-Codes/amrex.git"
+ CACHE STRING
+ "Repository URI to pull and build AMReX from if(WarpX_amrex_internal)")
+set(WarpX_amrex_branch "development"
+ CACHE STRING
+ "Repository branch for WarpX_amrex_repo if(WarpX_amrex_internal)")
+
+find_amrex()
diff --git a/cmake/dependencies/PICSAR.cmake b/cmake/dependencies/PICSAR.cmake
new file mode 100644
index 000000000..1e038a333
--- /dev/null
+++ b/cmake/dependencies/PICSAR.cmake
@@ -0,0 +1,54 @@
+function(find_picsar)
+ if(WarpX_picsar_internal)
+ include(FetchContent)
+ set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
+
+ # FIXME no option to control WarpX_QED_TABLE_GEN / Boost trigger yet
+
+ FetchContent_Declare(fetchedpicsar
+ GIT_REPOSITORY ${WarpX_picsar_repo}
+ GIT_TAG ${WarpX_picsar_branch}
+ BUILD_IN_SOURCE 0
+ )
+ FetchContent_GetProperties(fetchedpicsar)
+
+ if(NOT fetchedpicsar_POPULATED)
+ FetchContent_Populate(fetchedpicsar)
+ add_subdirectory(${fetchedpicsar_SOURCE_DIR}/src/multi_physics ${fetchedpicsar_BINARY_DIR})
+ endif()
+
+ # advanced fetch options
+ mark_as_advanced(FETCHCONTENT_BASE_DIR)
+ mark_as_advanced(FETCHCONTENT_FULLY_DISCONNECTED)
+ mark_as_advanced(FETCHCONTENT_QUIET)
+ mark_as_advanced(FETCHCONTENT_SOURCE_DIR_FETCHEDPICSAR)
+ mark_as_advanced(FETCHCONTENT_UPDATES_DISCONNECTED)
+ mark_as_advanced(FETCHCONTENT_UPDATES_DISCONNECTED_FETCHEDPICSAR)
+
+ # PICSAR options not relevant to WarpX users
+ mark_as_advanced(DIM)
+ mark_as_advanced(USE_XSDK_DEFAULTS)
+
+ message(STATUS "PICSAR: Using INTERNAL version '${PICSAR_VERSION}'")
+ else()
+ # not supported by PICSAR
+ # find_package(PICSAR 20.05 CONFIG REQUIRED QED)
+ # message(STATUS "PICSAR: Found version '${PICSAR_VERSION}'")
+ message(FATAL_ERROR "PICSAR: Cannot be used as externally installed library yet.")
+ endif()
+endfunction()
+
+if(WarpX_QED)
+ option(WarpX_picsar_internal "Download & build PICSAR" ON)
+ set(WarpX_picsar_repo "https://bitbucket.org/berkeleylab/picsar.git"
+ CACHE STRING
+ "Repository URI to pull and build PICSAR from if(WarpX_picsar_internal)")
+ set(WarpX_picsar_branch "master"
+ CACHE STRING
+ "Repository branch for WarpX_picsar_repo if(WarpX_picsar_internal)")
+
+ cmake_dependent_option(WarpX_QED_TABLE_GEN "generate QED lookup tables (requires boost)"
+ ON "WarpX_QED" OFF)
+
+ find_picsar()
+endif()
diff --git a/cmake/dependencies/openPMD.cmake b/cmake/dependencies/openPMD.cmake
new file mode 100644
index 000000000..2c28c4b07
--- /dev/null
+++ b/cmake/dependencies/openPMD.cmake
@@ -0,0 +1,70 @@
+function(find_openpmd)
+ if(WarpX_openpmd_internal)
+ include(FetchContent)
+ set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
+
+ # see https://openpmd-api.readthedocs.io/en/0.11.1-alpha/dev/buildoptions.html
+ set(openPMD_USE_MPI ${ENABLE_MPI} CACHE INTERNAL "")
+ set(openPMD_USE_PYTHON OFF CACHE INTERNAL "")
+ set(BUILD_CLI_TOOLS OFF CACHE INTERNAL "") # FIXME
+ set(BUILD_EXAMPLES OFF CACHE INTERNAL "") # FIXME
+ set(BUILD_TESTING OFF CACHE INTERNAL "") # FIXME
+ set(openPMD_INSTALL ${BUILD_SHARED_LIBS} CACHE INTERNAL "")
+
+ FetchContent_Declare(fetchedopenpmd
+ GIT_REPOSITORY ${WarpX_openpmd_repo}
+ GIT_TAG ${WarpX_openpmd_branch}
+ BUILD_IN_SOURCE 0
+ )
+ FetchContent_GetProperties(fetchedopenpmd)
+
+ if(NOT fetchedopenpmd_POPULATED)
+ FetchContent_Populate(fetchedopenpmd)
+ add_subdirectory(${fetchedopenpmd_SOURCE_DIR} ${fetchedopenpmd_BINARY_DIR})
+ endif()
+
+ # advanced fetch options
+ mark_as_advanced(FETCHCONTENT_BASE_DIR)
+ mark_as_advanced(FETCHCONTENT_FULLY_DISCONNECTED)
+ mark_as_advanced(FETCHCONTENT_QUIET)
+ mark_as_advanced(FETCHCONTENT_SOURCE_DIR_FETCHEDOPENPMD)
+ mark_as_advanced(FETCHCONTENT_UPDATES_DISCONNECTED)
+ mark_as_advanced(FETCHCONTENT_UPDATES_DISCONNECTED_FETCHEDOPENPMD)
+
+ # openPMD options not relevant to WarpX users
+ mark_as_advanced(openPMD_USE_INTERNAL_VARIANT)
+ mark_as_advanced(openPMD_USE_INTERNAL_CATCH)
+ mark_as_advanced(openPMD_USE_INTERNAL_PYBIND11)
+ mark_as_advanced(openPMD_USE_INTERNAL_JSON)
+ mark_as_advanced(openPMD_HAVE_PKGCONFIG)
+ mark_as_advanced(openPMD_USE_INVASIVE_TESTS)
+ mark_as_advanced(openPMD_USE_VERIFY)
+ mark_as_advanced(ADIOS2_DOR)
+ mark_as_advanced(ADIOS_CONFIG)
+ mark_as_advanced(HDF5_DIR)
+ mark_as_advanced(JSON_MultipleHeaders)
+
+ message(STATUS "openPMD-api: Using INTERNAL version '${WarpX_openpmd_branch}'")
+ else()
+ if(ENABLE_MPI)
+ set(COMPONENT_WMPI MPI)
+ else()
+ set(COMPONENT_WMPI NOMPI)
+ endif()
+ find_package(openPMD 0.11.1 CONFIG REQUIRED COMPONENTS ${COMPONENT_WMPI})
+ message(STATUS "openPMD-api: Found version '${openPMD_VERSION}'")
+ endif()
+endfunction()
+
+if(WarpX_OPENPMD)
+ option(WarpX_openpmd_internal "Download & build openPMD-api" ON)
+ set(WarpX_openpmd_repo "https://github.com/openPMD/openPMD-api.git"
+ CACHE STRING
+ "Repository URI to pull and build openPMD-api from if(WarpX_openpmd_internal)")
+ set(WarpX_openpmd_branch "dev"
+ CACHE STRING
+ "Repository branch for WarpX_openpmd_repo if(WarpX_openpmd_internal)")
+
+ set(WarpX_HAVE_OPENPMD TRUE)
+ find_openpmd()
+endif()