diff options
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() |