From 6f151e79d650a5cf4889c774b3e316e76fbb7473 Mon Sep 17 00:00:00 2001 From: michael-petersen Date: Sat, 21 Dec 2024 13:44:51 +0000 Subject: [PATCH 1/6] Draft GitHub issue template --- .github/ISSUE_TEMPLATE/bug_report.yml | 52 +++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 000000000..722c267a3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,52 @@ +name: Bug report +description: Create a report describing unexpected or incorrect behavior in EXP. +labels: Bug +body: + - type: markdown + attributes: + value: >- + Thanks for taking the time to fill out this bug report! Please provide a clear and concise description of the bug you've encountered. + - type: dropdown + id: interface + attributes: + label: Interface + description: Which interface of EXP are you using? + options: + - pyEXP + - EXP N-body + default: 0 + validations: + required: true + - type: dropdown + id: version + attributes: + label: Version + description: How are you accessing EXP? + options: + - Docker + - Local compile + default: 0 + validations: + required: true + - type: textarea + id: exactversion + attributes: + label: Exact Version + description: Please provide the exact version of EXP you are using. If using pyEXP, please provide the output of `python -c "import pyEXP; pyEXP.util.getVersionInfo()"`; If using N-body, please provide the output of `exp -v`. + render: shell + - type: textarea + attributes: + label: Description + description: >- + A clear and concise description of what the bug is. + - type: textarea + attributes: + label: Expected behavior + description: >- + A clear and concise description of what you expected to happen. + - type: textarea + id: logs + attributes: + label: Relevant log output + description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. + render: shell \ No newline at end of file From 28d394484c6907fb2c280e6e5f4c4361de9183a2 Mon Sep 17 00:00:00 2001 From: michael-petersen Date: Sun, 22 Dec 2024 14:19:26 +0000 Subject: [PATCH 2/6] draft paper updates --- Paper/paper/paper.bib | 40 ++++++++++++++++++++++++++++++++++++++++ Paper/paper/paper.md | 19 ++++++++++++++++--- Paper/paper/paper.pdf | Bin 358193 -> 363396 bytes 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/Paper/paper/paper.bib b/Paper/paper/paper.bib index f6dedcf60..a352729c2 100644 --- a/Paper/paper/paper.bib +++ b/Paper/paper/paper.bib @@ -7,6 +7,46 @@ @book{Binney:2008 Year = 2008 } +@ARTICLE{Gadget4, + author = {{Springel}, Volker and {Pakmor}, R{\"u}diger and {Zier}, Oliver and {Reinecke}, Martin}, + title = "{Simulating cosmic structure formation with the GADGET-4 code}", + journal = {\mnras}, + keywords = {methods: numerical, galaxies: interactions, dark matter, Astrophysics - Instrumentation and Methods for Astrophysics, Astrophysics - Cosmology and Nongalactic Astrophysics}, + year = 2021, + month = sep, + volume = {506}, + number = {2}, + pages = {2871-2949}, + doi = {10.1093/mnras/stab1855}, +archivePrefix = {arXiv}, + eprint = {2010.03567}, + primaryClass = {astro-ph.IM}, + adsurl = {https://ui.adsabs.harvard.edu/abs/2021MNRAS.506.2871S}, + adsnote = {Provided by the SAO/NASA Astrophysics Data System} +} + + + +@ARTICLE{Wang:15, + author = {{Wang}, Long and {Spurzem}, Rainer and {Aarseth}, Sverre and {Nitadori}, Keigo and {Berczik}, Peter and {Kouwenhoven}, M.~B.~N. and {Naab}, Thorsten}, + title = "{NBODY6++GPU: ready for the gravitational million-body problem}", + journal = {\mnras}, + keywords = {methods: numerical, globular clusters: general, Astrophysics - Instrumentation and Methods for Astrophysics, Astrophysics - Solar and Stellar Astrophysics}, + year = 2015, + month = jul, + volume = {450}, + number = {4}, + pages = {4070-4080}, + doi = {10.1093/mnras/stv817}, +archivePrefix = {arXiv}, + eprint = {1504.03687}, + primaryClass = {astro-ph.IM}, + adsurl = {https://ui.adsabs.harvard.edu/abs/2015MNRAS.450.4070W}, + adsnote = {Provided by the SAO/NASA Astrophysics Data System} +} + + + @article{gaia, author = {{Gaia Collaboration}}, title = "{The Gaia mission}", diff --git a/Paper/paper/paper.md b/Paper/paper/paper.md index a593490bb..fe305e0ac 100644 --- a/Paper/paper/paper.md +++ b/Paper/paper/paper.md @@ -139,11 +139,21 @@ computed bases and resulting coefficient data are stored in HDF5 ## N-body simulation +Computing the gravitational potential and forces from a collection of +N particles is typically an expensive endeavour. EXP reduces the cost +by using BFE to compute the potential and forces such that computational +effort scales with the number of particles. Other modern N-body codes +use direct summation [@Wang:15] or tree-based solutions [@Gadget4], +which have computational effort that scales as N$^2$ and N log N, +respectively. The trade off for BFE solutions comes in the form of +restricted degrees of freedom; for many problems in near-equilibrium +galactic dynamics this is not a problem, but rather a feature. + Our design includes a wide choice of run-time summary diagnostics, phase-space output formats, dynamically loadable user libraries, and easy extensibility. Stand-alone routines include the EOF and mSSA methods described above, and the modular software architecture of -EXP enables users to easily build and maintain extensions. The `EXP` +`EXP` enables users to easily build and maintain extensions. The `EXP` code base is described in published papers [@Petersen:22; @Weinberg:23] and has been used, enhanced, and rigorously tested for nearly two decades. @@ -174,12 +184,15 @@ table above as well as coefficients for an input data set. Each of these tools are Python classes that accept `numpy` [@numpy] arrays for immediate interoperability with `matplotlib` [@matplotlib] and Astropy. We include a verified set of stand-alone routines that read -phase-space files from many major cosmological tree codes and produce +phase-space files from many major cosmological tree codes (for example, +@Gadget4) and produce BFE-based analyses. The code suite includes adapters for reading and writing phase space for many of the widely used cosmology codes, with a base class for developing new ones. There are multiple ways to use the versatile and modular tools in `pyEXP`, and we anticipate -pipelines that we have not yet imagined. +pipelines that we have not yet imagined. The flexibility of the basis +sets available in `EXP` greatly enhances the number of available basis +sets implemented in Python (see, e.g. @gala). ## Using pyEXP to analyze time series diff --git a/Paper/paper/paper.pdf b/Paper/paper/paper.pdf index 1f8072ec72e69ab4af5c85d18482b255a54432ef..fd52d8ad661ec0afe4b9ab7c5bf86aa408a5b70c 100644 GIT binary patch delta 23042 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 delta 19342 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 Aod5s; From 41a1161f933ecf654e1f9e05d3a9fcf45559c2ad Mon Sep 17 00:00:00 2001 From: michael-petersen Date: Thu, 23 Jan 2025 13:55:38 +0000 Subject: [PATCH 3/6] INSTALL.md updates [no CI] --- CMakeLists.txt | 2 +- INSTALL.md | 52 ++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 70a4dc531..df647b23c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,7 +68,7 @@ find_package(OpenMP) find_package(FFTW REQUIRED) find_package(HDF5 COMPONENTS C CXX HL REQUIRED) find_package(TIRPC) # Check for alternative Sun rpc support -find_package(Eigen3 REQUIRED) +find_package(Eigen3 3.4 REQUIRED) find_package(PNG) # Check for FE diff --git a/INSTALL.md b/INSTALL.md index 449daac4c..efaeef464 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,5 +1,28 @@ # Configuring and building EXP +EXP uses CMake for building a configuration. + +We recommend building "out of source" to allow for multiple +configurations. This allows one to have build various versions +available from the same source, such as `Release` and `Debug` (see below). + +## Required Libraries for installation + +Most required libraries will be available on HPC systems, but a local +user may need to install some libraries (e.g. using `apt-get` on linux, +and `homebrew` or `macports` on OSX). + +| Library | Version | +|---------|-----------| +| Eigen | >= 3.4 | +| FFTW | >= 2.0 | +| HDF5 | >=1.12 | +| OpenMPI | >=4.0 | + +Other libraries are automatically installed along with EXP using `git submodule` (see next step). + +### Obtaining Additional libraries + We are now using git submodules to provide `yaml-cpp`, which is not common in the HPC environments. So, from the top-level directory, do the following: @@ -12,18 +35,31 @@ This will install `yaml-cpp` in the `extern` directory. The png++ C++ wrappers to the png library are also installed in `extern`. Note: png support is optional. -## EXP uses CMake for building a configuration - -I recommend building "out of source" to allow for multiple -configurations. This allows one to have build various versions -available from the same source, such as `Release` and `Debug`. To -begin, make a build directory and change to that: +## Building using CMake +To begin the CMake configuration, make a build directory and change to that: ``` mkdir -p build cd build ``` +The next step is to create the CMake configuration, +``` + cmake .. +``` +build, +``` + make -j 4 +``` +and finally install. +``` + make install +``` + +More details are available below, and troubleshooting can be found in the GitHub discussions. + +## In more detail... + CMake is designed to detect commonly used utilities and libraries automatically, but sometimes needs help and hints. For example, if CMake does not find a library, you can add the location of the library @@ -48,7 +84,7 @@ Generally, the install location will need to be changed in the example below. E.g. I would use `-DCMAKE_INSTALL_PREFIX=/home/mdw_umass_edu` on the UMass Unity cluster to install in my home directory. -## EXP options +### EXP options There are a number of EXP-specific options that control the build. The most important of these are: @@ -114,7 +150,7 @@ Putting these together so far, your CMake call would be: ``` export CUDAARCHS="75;80;86" cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_CUDA=YES -DENABLE_USER=YES -DEigen3_DIR=$EIGEN_BASE/share/eigen3/cmake -DCMAKE_INSTALL_PREFIX=/home/user -Wno-dev .. -```` +``` ## Configuring without CUDA From 56f0e2b49185fa7016c170a2bfead0b6fb753b86 Mon Sep 17 00:00:00 2001 From: michael-petersen Date: Wed, 12 Mar 2025 06:55:02 +0000 Subject: [PATCH 4/6] add a bit mroe detail --- CMakeLists.txt | 2 +- INSTALL.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index df647b23c..531e012f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,7 +68,7 @@ find_package(OpenMP) find_package(FFTW REQUIRED) find_package(HDF5 COMPONENTS C CXX HL REQUIRED) find_package(TIRPC) # Check for alternative Sun rpc support -find_package(Eigen3 3.4 REQUIRED) +find_package(Eigen3 3.4...<3.5 REQUIRED) find_package(PNG) # Check for FE diff --git a/INSTALL.md b/INSTALL.md index efaeef464..768c24017 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -55,6 +55,7 @@ and finally install. ``` make install ``` +The `-j 4` flag allows up to 4 processes to compile simulateously. Change 4 to the number of cores you can allot to compiling. More details are available below, and troubleshooting can be found in the GitHub discussions. From 0ff50008f020ccae16efc09ca6947cce3ebb18df Mon Sep 17 00:00:00 2001 From: michael-petersen Date: Wed, 12 Mar 2025 10:44:36 +0000 Subject: [PATCH 5/6] add CITATIONS.bib --- CITATIONS.bib | 36 ++++++++++++++++++++++++++++++++++++ CONTRIBUTING.md | 3 ++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 CITATIONS.bib diff --git a/CITATIONS.bib b/CITATIONS.bib new file mode 100644 index 000000000..e1d9f90c2 --- /dev/null +++ b/CITATIONS.bib @@ -0,0 +1,36 @@ +@ARTICLE{2022MNRAS.510.6201P, + author = {{Petersen}, Michael S. and {Weinberg}, Martin D. and {Katz}, Neal}, + title = "{EXP: N-body integration using basis function expansions}", + journal = {\mnras}, + keywords = {methods: numerical, Galaxy: halo, galaxies: haloes, galaxies: kinematics and dynamics, galaxies: structure, Astrophysics - Astrophysics of Galaxies, Astrophysics - Instrumentation and Methods for Astrophysics}, + year = 2022, + month = mar, + volume = {510}, + number = {4}, + pages = {6201-6217}, + doi = {10.1093/mnras/stab3639}, +archivePrefix = {arXiv}, + eprint = {2104.14577}, + primaryClass = {astro-ph.GA}, + adsurl = {https://ui.adsabs.harvard.edu/abs/2022MNRAS.510.6201P}, + adsnote = {Provided by the SAO/NASA Astrophysics Data System} +} + +@ARTICLE{1999AJ....117..629W, + author = {{Weinberg}, Martin D.}, + title = "{An Adaptive Algorithm for N-Body Field Expansions}", + journal = {\aj}, + keywords = {CELESTIAL MECHANICS, STELLAR DYNAMICS, GALAXIES: STRUCTURE, GALAXY: STRUCTURE, METHODS: NUMERICAL, Astrophysics}, + year = 1999, + month = jan, + volume = {117}, + number = {1}, + pages = {629-637}, + doi = {10.1086/300669}, +archivePrefix = {arXiv}, + eprint = {astro-ph/9805357}, + primaryClass = {astro-ph}, + adsurl = {https://ui.adsabs.harvard.edu/abs/1999AJ....117..629W}, + adsnote = {Provided by the SAO/NASA Astrophysics Data System} +} + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3e5c6ac52..c83e44f23 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,7 +2,8 @@ There are many ways to contribute to EXP. Here are some of them: -- Blog about EXP. Cite the EXP published papers. Tell the world how +- Blog about EXP. Cite the EXP published papers (using + the papers in `CITATIONS.bib`). Tell the world how you're using EXP. This will help newcomers with more examples and will help the EXP project to increase its visibility. - Report bugs and request features in the [issue From 528248a6c3f6f3a9b40d266fa5f9c7132eb9cec0 Mon Sep 17 00:00:00 2001 From: michael-petersen Date: Wed, 12 Mar 2025 10:45:30 +0000 Subject: [PATCH 6/6] add link in CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c83e44f23..38986c8db 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,7 @@ There are many ways to contribute to EXP. Here are some of them: - Blog about EXP. Cite the EXP published papers (using - the papers in `CITATIONS.bib`). Tell the world how + the papers in [`CITATIONS.bib`](https://github.com/EXP-code/EXP/blob/main/CITATIONS.bib)). Tell the world how you're using EXP. This will help newcomers with more examples and will help the EXP project to increase its visibility. - Report bugs and request features in the [issue