diff --git a/docs/developer/guides/kaiju-cluster-setup.md b/docs/developer/guides/kaiju-cluster-setup.md new file mode 100644 index 00000000..760f7435 --- /dev/null +++ b/docs/developer/guides/kaiju-cluster-setup.md @@ -0,0 +1,302 @@ +# Kaiju Cluster Setup + +This guide covers installing and running Underworld3 on the **Kaiju** cluster — a Rocky Linux 8.10 HPC system using Spack for module management and Slurm for job scheduling. + +Python packages are managed by **pixi** (the same tool used for local development). MPI-dependent packages — `mpi4py`, PETSc+AMR tools, `petsc4py`, and `h5py` — are built from source against Spack's OpenMPI to ensure compatibility with Slurm's parallel interconnect. + +--- + +## Hardware Overview + +| Resource | Specification | +|----------|--------------| +| Head node | 1× Intel Xeon Silver 4210R, 40 CPUs @ 2.4 GHz | +| Compute nodes | 8× Intel Xeon Gold 6230R, 104 CPUs @ 2.1 GHz each | +| Shared storage | `/opt/cluster` via NFS (cluster-wide) | +| Scheduler | Slurm with Munge authentication | + +--- + +## Why pixi + spack? + +Pixi manages the Python environment consistently with the developer's local machine (same `pixi.toml`, same package versions). Spack provides the cluster's OpenMPI, which is what Slurm uses for inter-node communication. + +The key constraint is that **anything linked against MPI must use the same MPI as Slurm**. This means `mpi4py`, `h5py`, PETSc, and `petsc4py` are built from source against Spack's OpenMPI — not from conda-forge (which bundles MPICH). + +``` +pixi kaiju env → Python 3.12, sympy, scipy, pint, pydantic, ... (conda-forge, no MPI) +spack → openmpi@4.1.6 (cluster MPI) +source build → mpi4py, PETSc+AMR+petsc4py, h5py (linked to spack MPI) +``` + +--- + +## Prerequisites + +Spack must have OpenMPI available: + +```bash +spack find openmpi +# openmpi@4.1.6 +``` + +Pixi must be installed in your user space (no root needed): + +```bash +# Check if already installed +pixi --version + +# Install if missing +curl -fsSL https://pixi.sh/install.sh | bash +``` + +--- + +## Installation + +Use the install script at `uw3_install_kaiju_amr.sh` from the [kaiju-admin-notes](https://github.com/jcgraciosa/kaiju-admin-notes) repo. + +### Step 1: Edit configuration + +Open the script and set the variables at the top: + +```bash +SPACK_MPI_VERSION="openmpi@4.1.6" # Spack MPI module to load +INSTALL_PATH="${HOME}/uw3-installation" # Root directory for everything +UW3_BRANCH="development" # UW3 git branch +``` + +### Step 2: Run the full install + +```bash +source uw3_install_kaiju_amr.sh install +``` + +This runs the following steps in order: + +| Step | Function | Time | +|------|----------|------| +| Install pixi | `setup_pixi` | ~1 min | +| Clone Underworld3 | `clone_uw3` | ~1 min | +| Install pixi kaiju env | `install_pixi_env` | ~3 min | +| Build mpi4py from source | `install_mpi4py` | ~2 min | +| Build PETSc + AMR tools | `install_petsc` | ~1 hour | +| Build MPI-enabled h5py | `install_h5py` | ~2 min | +| Install Underworld3 | `install_uw3` | ~2 min | +| Verify | `verify_install` | ~1 min | + +You can also run individual steps after sourcing: + +```bash +source uw3_install_kaiju_amr.sh +install_petsc # run just one step +``` + +### What PETSc builds + +PETSc is compiled from source (`petsc-custom/build-petsc-kaiju.sh`) with: + +- **AMR tools**: mmg, parmmg, pragmatic, eigen, bison +- **Solvers**: mumps, scalapack, slepc +- **Partitioners**: metis, parmetis, ptscotch +- **MPI**: Spack's OpenMPI (`--with-mpi-dir`) +- **HDF5**: downloaded and built with MPI support +- **BLAS/LAPACK**: fblaslapack (Rocky Linux 8 has no guaranteed system BLAS) +- **cmake**: downloaded (not in Spack) +- **petsc4py**: built during configure (`--with-petsc4py=1`) + +--- + +## Activating the Environment + +In every new session (interactive or job), source the install script: + +```bash +source ~/install_scripts/uw3_install_kaiju_amr.sh +``` + +This: +1. Loads `spack openmpi@4.1.6` +2. Activates the pixi `kaiju` environment via `pixi shell-hook` +3. Sets `PETSC_DIR`, `PETSC_ARCH`, and `PYTHONPATH` for petsc4py +4. Sets `PMIX_MCA_psec=native` and `OMPI_MCA_btl_tcp_if_include=eno1` + +{note} +`pixi shell-hook` is used instead of `pixi shell` because it activates the environment in the current shell without spawning a new one. This is required for Slurm batch jobs. +{/note} + +--- + +## Running with Slurm + +Two job script templates are available in the [kaiju-admin-notes](https://github.com/jcgraciosa/kaiju-admin-notes) repo: + +| Script | Use when | +|--------|----------| +| `uw3_slurm_job.sh` | Per-user install (sources `uw3_install_kaiju_amr.sh`) | +| `uw3_slurm_job_shared.sh` | Shared install (`module load underworld3/...`) | + +### Submitting a job + +```bash +sbatch uw3_slurm_job.sh # per-user install +sbatch uw3_slurm_job_shared.sh # shared install +``` + +Monitor progress: + +```bash +squeue -u $USER +tail -f uw3_.out +``` + +### The `srun` invocation + +`--mpi=pmix` is **required** on Kaiju (Spack has `pmix@5.0.3`): + +```bash +srun --mpi=pmix python3 my_model.py +``` + +### Scaling examples + +```bash +# 1 node, 30 ranks +sbatch --nodes=1 --ntasks-per-node=30 uw3_slurm_job.sh + +# 4 nodes, 120 ranks +sbatch --nodes=4 --ntasks-per-node=30 uw3_slurm_job.sh +``` + +--- + +## Shared Installation (Admin) + +A system-wide installation can be deployed to `/opt/cluster/software/underworld3/` so all users access it via Environment Modules: + +```bash +module load underworld3/development-12Mar26 +``` + +Run as an admin with write access to `/opt/cluster/software`: + +```bash +source uw3_install_kaiju_shared.sh install +``` + +This script is identical to the per-user script except: +- `INSTALL_PATH=/opt/cluster/software` +- Adds `fix_permissions()` — sets world-readable permissions after install +- Adds `install_modulefile()` — copies the TCL modulefile with a date-stamped name to `/opt/cluster/modulefiles/underworld3/` + +The modulefile (`modulefiles/underworld3/development.tcl`) hardcodes the spack OpenMPI and pixi env paths. If spack is rebuilt (hash changes), update `mpi_root` in the modulefile. + +### Slurm job script (shared install) + +Users with the shared install should use `uw3_slurm_job_shared.sh`: + +```bash +# Edit UW3_MODULE and SCRIPT at the top, then: +sbatch uw3_slurm_job_shared.sh +``` + +The key difference from the per-user job script is environment setup: + +```bash +# Shared install: load module +module load underworld3/development-12Mar26 + +# Per-user install: source install script +source ~/install_scripts/uw3_install_kaiju_amr.sh +``` + +--- + +## Troubleshooting + +### `import underworld3` fails on compute nodes + +Sourcing the install script in the job script (not the login shell) ensures all paths propagate to compute nodes. The `uw3_slurm_job.sh` template does this correctly. + +### h5py HDF5 version mismatch + +h5py must be built against the same HDF5 that PETSc built. If you see HDF5 errors, rebuild: + +```bash +source uw3_install_kaiju_amr.sh +install_h5py +``` + +### PETSc needs rebuilding after Spack module update + +PETSc links against Spack's OpenMPI at build time. If `openmpi@4.1.6` is reinstalled or updated, rebuild PETSc: + +```bash +source uw3_install_kaiju_amr.sh +rm -rf ~/uw3-installation/underworld3/petsc-custom/petsc +install_petsc +install_h5py +``` + +### h5py replaces source-built mpi4py + +`pip install h5py` without `--no-deps` silently replaces the source-built mpi4py (spack OpenMPI) with a pre-built wheel linked to a different MPI. Always use `--no-deps` when installing h5py. The install script handles this correctly. + +If mpi4py was accidentally replaced, rebuild it from source: +```bash +source uw3_install_kaiju_amr.sh +pip install --no-binary :all: --no-cache-dir --force-reinstall "mpi4py>=4,<5" +``` + +Verify it links to spack OpenMPI: +```bash +ldd $(python3 -c "import mpi4py; print(mpi4py.__file__.replace('__init__.py',''))") \ + MPI*.so | grep mpi +# Should show: libmpi.so.40 => /opt/cluster/spack/.../openmpi-4.1.6-.../lib/libmpi.so.40 +``` + +### numpy ABI mismatch after h5py install + +If numpy is upgraded after petsc4py is compiled, `import petsc4py` fails with: +``` +ValueError: numpy.dtype size changed, may indicate binary incompatibility. +``` + +Fix: restore the numpy version used during the PETSc build, then rebuild h5py: +```bash +pip install --force-reinstall "numpy==1.26.4" +CC=mpicc HDF5_MPI="ON" HDF5_DIR="${PETSC_DIR}/${PETSC_ARCH}" \ + pip install --no-binary=h5py --no-cache-dir --force-reinstall --no-deps h5py +``` + +### PARMMG configure failure (pixi ld + spack transitive deps) + +pixi's conda linker (`ld` 14.x) requires transitive shared library dependencies to be explicitly linked. `libmmg.so` built with SCOTCH support causes PARMMG's `MMG_WORKS` link test to fail because `libscotch.so` is not explicitly passed. This is fixed in `petsc-custom/build-petsc-kaiju.sh` by building MMG without SCOTCH (`-DUSE_SCOTCH=OFF`). PARMMG uses ptscotch separately for parallel partitioning, which is unaffected. + +### Checking what's installed + +```bash +source uw3_install_kaiju_amr.sh +verify_install +``` + +--- + +## Rebuilding Underworld3 after source changes + +After pulling new UW3 code: + +```bash +source uw3_install_kaiju_amr.sh +cd ~/uw3-installation/underworld3 +git pull +pip install -e . +``` + +--- + +## Related + +- [Development Setup](development-setup.md) — local development with pixi +- [Branching Strategy](branching-strategy.md) — git workflow +- [Parallel Computing](../../advanced/parallel-computing.md) — writing parallel-safe UW3 code diff --git a/docs/developer/index.md b/docs/developer/index.md index 823ff7a2..faff147f 100644 --- a/docs/developer/index.md +++ b/docs/developer/index.md @@ -114,6 +114,7 @@ guides/SPELLING_CONVENTION guides/version-management guides/branching-strategy guides/BINDER_CONTAINER_SETUP +guides/kaiju-cluster-setup ``` ```{toctree} diff --git a/petsc-custom/build-petsc-gadi.sh b/petsc-custom/build-petsc-gadi.sh new file mode 100755 index 00000000..69f01784 --- /dev/null +++ b/petsc-custom/build-petsc-gadi.sh @@ -0,0 +1,288 @@ +#!/bin/bash +# +# Build PETSc with AMR tools for NCI Gadi (module OpenMPI + HDF5, PBS Pro) +# +# Differences from build-petsc.sh (local macOS/pixi): +# MPI auto-detected from PATH (module load puts mpicc in PATH) +# --with-hdf5-dir=$HDF5_DIR → uses Gadi's system HDF5 module (not pixi) +# No --download-fblaslapack → Gadi has system BLAS/LAPACK +# No --download-cmake → cmake loaded from Gadi module +# --with-petsc4py=1 → built during configure (not a separate step) +# +# This script builds the same AMR tool set as build-petsc.sh and build-petsc-kaiju.sh: +# pragmatic, mmg, parmmg, slepc, mumps, metis, parmetis, ptscotch, scalapack +# +# Applies the same UW3 patches as build-petsc.sh: +# plexfem-internal-boundary-ownership-fix.patch +# scotch-7.0.10-c23-fix.tar.gz +# +# Usage (must be inside pixi gadi env with Gadi modules loaded): +# module load openmpi/4.1.7 hdf5/1.12.2p cmake/3.31.6 +# source gadi_install_pixi.sh (activates pixi gadi env) +# ./build-petsc-gadi.sh # Full build +# ./build-petsc-gadi.sh configure # Just reconfigure +# ./build-petsc-gadi.sh build # Just make +# ./build-petsc-gadi.sh patch # Apply UW3 patches +# ./build-petsc-gadi.sh test # Run PETSc tests +# ./build-petsc-gadi.sh clean # Remove PETSc directory +# +# Build time: ~1 hour +# +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PETSC_DIR="${SCRIPT_DIR}/petsc" +PETSC_ARCH="arch-linux-c-opt" + +# Require Gadi OpenMPI to be loaded +if ! command -v mpicc &>/dev/null; then + echo "Error: mpicc not found. Load Gadi OpenMPI module first:" + echo " module load openmpi/4.1.7" + exit 1 +fi + +# Require HDF5_DIR to be set (from Gadi hdf5 module) +if [ -z "${HDF5_DIR}" ]; then + echo "Error: HDF5_DIR is not set. Load Gadi HDF5 module first:" + echo " module load hdf5/1.12.2p" + exit 1 +fi + +# Require pixi gadi environment +if ! echo "${PATH}" | tr ':' '\n' | grep -q "\.pixi/envs/gadi/bin"; then + echo "Error: must be run inside the pixi gadi environment" + echo " source gadi_install_pixi.sh (sets up env via pixi shell-hook)" + exit 1 +fi + +echo "==========================================" +echo "PETSc AMR Build Script (Gadi)" +echo "==========================================" +echo "PETSC_DIR: $PETSC_DIR" +echo "PETSC_ARCH: $PETSC_ARCH" +echo "mpicc: $(which mpicc)" +echo "HDF5_DIR: $HDF5_DIR" +echo "==========================================" + +clone_petsc() { + # Resolve symlink so git clone always writes to the real path. + # git clone can replace a symlink-to-empty-dir with a real directory, + # which defeats the gdata→scratch symlink approach. + local _clone_target + if [ -L "$PETSC_DIR" ]; then + _clone_target="$(readlink -f "$PETSC_DIR")" + else + _clone_target="$PETSC_DIR" + fi + + if [ -f "${_clone_target}/configure" ]; then + echo "PETSc directory already exists. Skipping clone." + echo "To force fresh clone, run: ./build-petsc-gadi.sh clean" + return 0 + fi + + echo "Cloning PETSc release branch..." + git clone -b release https://gitlab.com/petsc/petsc.git "${_clone_target}" + echo "Clone complete." +} + +apply_patches() { + echo "Applying UW3 patches to PETSc..." + cd "$PETSC_DIR" + + # Fix ghost facet ownership + part-consistent assembly in boundary + # residual/integral/Jacobian paths (plexfem.c). Without this, internal + # boundary natural BCs produce rank-dependent results in parallel. + local patch="${SCRIPT_DIR}/patches/plexfem-internal-boundary-ownership-fix.patch" + if [ -f "$patch" ]; then + if git apply --check "$patch" 2>/dev/null; then + git apply "$patch" + echo " Applied: plexfem-internal-boundary-ownership-fix.patch" + else + echo " Skipped: plexfem-internal-boundary-ownership-fix.patch (already applied or conflict)" + fi + fi + + echo "Patches complete." +} + +setup_gadi_build_env() { + # Shared environment setup required for both configure and build. + # Must be called before any compile/link step. + # + # MPI_DIR is set by load_env() via module load — trust it directly. + if [ -z "${MPI_DIR}" ]; then + echo "Error: MPI_DIR is not set. Source gadi_install_pixi.sh first." + exit 1 + fi + + # Create symlinks for Gadi's compiler-tagged Fortran MPI libs. + # mpifort --showme refers to libmpi_usempif08 etc. (no compiler tag), + # but Gadi only ships _GNU, _Intel, _nvidia variants. Symlink GNU → untagged. + local _mpi_gnu_dir="${SCRIPT_DIR}/mpi-gadi-gnu-libs" + mkdir -p "${_mpi_gnu_dir}" + for _lib in usempif08 usempi_ignore_tkr mpifh; do + [ ! -f "${_mpi_gnu_dir}/libmpi_${_lib}.so" ] && \ + ln -sf "${MPI_DIR}/lib/libmpi_${_lib}_GNU.so" "${_mpi_gnu_dir}/libmpi_${_lib}.so" + done + + # LD_LIBRARY_PATH = runtime search path (dynamic loader) + # LIBRARY_PATH = link-time search path (ld resolves -lmpi_usempif08 etc.) + export LD_LIBRARY_PATH="${_mpi_gnu_dir}:${MPI_DIR}/lib:/apps/ucc/1.3.0/lib:/usr/lib64:${LD_LIBRARY_PATH}" + export LIBRARY_PATH="${_mpi_gnu_dir}:${LIBRARY_PATH}" + + # Unset ALL conda/pixi compiler and build variables. + # The pixi gadi env ships a full conda toolchain (x86_64-conda-linux-gnu-*) + # that interferes with OpenMPI wrappers and PETSc configure/build. + unset CC CXX FC F77 F90 CPP AR RANLIB + unset CFLAGS CXXFLAGS FFLAGS CPPFLAGS LDFLAGS + + # Force mpicc/mpicxx/mpifort to use the system compilers, not conda's gcc. + export OMPI_CC=/usr/bin/gcc + export OMPI_CXX=/usr/bin/g++ + export OMPI_FC=/usr/bin/gfortran + # Gadi's OpenMPI puts Fortran headers in a compiler-tagged subdirectory + # (include/GNU/) rather than include/ directly. OMPI_FCFLAGS adds extra + # flags to the mpifort wrapper so mpif.h and mpi.mod are found. + export OMPI_FCFLAGS="-I${MPI_DIR}/include/GNU" + + # Put system bin dirs first so the system linker (/usr/bin/ld) is + # found before conda's ld — conda's ld cannot find Gadi-specific libs + # (hcoll, ucc, libnl) that OpenMPI was built against. + export PATH="/usr/bin:/usr/local/bin:${MPI_DIR}/bin:${PATH}" +} + +configure_petsc() { + echo "Configuring PETSc with AMR tools..." + cd "$PETSC_DIR" + + # Downloads and builds: + # AMR: mmg, parmmg, pragmatic, eigen + # Solvers: mumps, scalapack, slepc, superlu, superlu_dist, hypre + # Partitions: metis, parmetis, ptscotch (patched for C23) + # Mesh: ctetgen, triangle, zlib + # BLAS/LAPACK: fblaslapack (Gadi has system BLAS/LAPACK but auto-detection + # fails due to PATH/env manipulation required for OpenMPI) + # HDF5: from Gadi module (not downloaded) + # cmake: from Gadi module (not downloaded) + # MPI: from Gadi module — MPI_DIR derived from which mpicc + # petsc4py: built during configure + + # Capture pixi's python3 BEFORE setup_gadi_build_env reorders PATH. + _PIXI_PYTHON="$(which python3)" + setup_gadi_build_env + + "${_PIXI_PYTHON}" ./configure \ + --with-petsc-arch="${PETSC_ARCH}" \ + --with-cc="${MPI_DIR}/bin/mpicc" \ + --with-cxx="${MPI_DIR}/bin/mpicxx" \ + --with-fc="${MPI_DIR}/bin/mpifort" \ + --with-debugging=0 \ + --COPTFLAGS="-g -O3" --CXXOPTFLAGS="-g -O3" --FOPTFLAGS="-g -O3" \ + --with-shared-libraries=1 \ + --with-cxx-dialect=C++11 \ + --with-make-np=40 \ + --with-hdf5-dir="${HDF5_DIR}" \ + --with-hdf5=1 \ + --with-pragmatic=1 \ + --with-petsc4py=1 \ + --with-x=0 \ + --download-fblaslapack=1 \ + --download-zlib=1 \ + --download-eigen=1 \ + --download-metis=1 \ + --download-parmetis=1 \ + --download-mumps=1 \ + --download-scalapack=1 \ + --download-slepc=1 \ + --download-ptscotch="${SCRIPT_DIR}/patches/scotch-7.0.10-c23-fix.tar.gz" \ + --download-mmg=1 \ + --download-mmg-cmake-arguments="-DMMG_INSTALL_PRIVATE_HEADERS=ON -DUSE_SCOTCH=OFF" \ + --download-parmmg=1 \ + --download-pragmatic=1 \ + --download-superlu=1 \ + --download-superlu_dist=1 \ + --download-hypre=1 \ + --download-ctetgen=1 \ + --download-triangle=1 \ + --useThreads=0 + + echo "Configure complete." +} + +build_petsc() { + echo "Building PETSc..." + cd "$PETSC_DIR" + + export PETSC_DIR + export PETSC_ARCH + setup_gadi_build_env + + make all + echo "PETSc build complete." +} + +test_petsc() { + echo "Testing PETSc..." + cd "$PETSC_DIR" + + export PETSC_DIR + export PETSC_ARCH + setup_gadi_build_env + + make check + echo "PETSc tests complete." +} + +clean_petsc() { + echo "Removing PETSc directory..." + if [ -d "$PETSC_DIR" ]; then + rm -rf "$PETSC_DIR" + echo "Cleaned." + else + echo "Nothing to clean." + fi +} + +show_help() { + echo "Usage: $0 [command]" + echo "" + echo "Commands:" + echo " (none) Full build: clone, patch, configure, build" + echo " clone Clone PETSc repository" + echo " patch Apply UW3 patches to PETSc source" + echo " configure Configure PETSc with AMR tools" + echo " build Build PETSc" + echo " test Run PETSc tests" + echo " clean Remove PETSc directory" + echo " help Show this help" +} + +case "${1:-all}" in + all) + clone_petsc + apply_patches + configure_petsc + build_petsc + echo "" + echo "==========================================" + echo "PETSc AMR build complete! (Gadi)" + echo "Set these environment variables:" + echo " export PETSC_DIR=$PETSC_DIR" + echo " export PETSC_ARCH=$PETSC_ARCH" + echo " export PYTHONPATH=\$PETSC_DIR/\$PETSC_ARCH/lib:\$PYTHONPATH" + echo "==========================================" + ;; + clone) clone_petsc ;; + patch) apply_patches ;; + configure) configure_petsc ;; + build) build_petsc ;; + test) test_petsc ;; + clean) clean_petsc ;; + help|--help|-h) show_help ;; + *) + echo "Unknown command: $1" + show_help + exit 1 + ;; +esac diff --git a/petsc-custom/build-petsc-kaiju.sh b/petsc-custom/build-petsc-kaiju.sh new file mode 100644 index 00000000..d46852ba --- /dev/null +++ b/petsc-custom/build-petsc-kaiju.sh @@ -0,0 +1,181 @@ +#!/bin/bash +# +# Build PETSc with AMR tools for the Kaiju cluster (Rocky Linux 8, Spack OpenMPI) +# +# Differences from build-petsc.sh (local macOS/pixi): +# MPI auto-detected from PATH (spack load puts mpicc in PATH; no --with-mpi-dir needed) +# --download-hdf5 → PETSc downloads HDF5 (not provided by pixi) +# --download-fblaslapack → no guaranteed system BLAS on Rocky Linux 8 +# --download-cmake → spack does not have cmake +# --with-petsc4py → built during configure (not a separate step) +# +# This script builds the same AMR tool set as build-petsc.sh: +# pragmatic, mmg, parmmg, slepc, mumps, metis, parmetis, ptscotch, scalapack +# +# Usage (must be inside a pixi kaiju shell with spack OpenMPI loaded): +# spack load openmpi@4.1.6 +# pixi shell -e kaiju +# ./build-petsc-kaiju.sh # Full build +# ./build-petsc-kaiju.sh configure # Just reconfigure +# ./build-petsc-kaiju.sh build # Just make +# ./build-petsc-kaiju.sh clean # Remove PETSc directory +# +# Build time: ~1 hour +# +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PETSC_DIR="${SCRIPT_DIR}/petsc" +PETSC_ARCH="petsc-4-uw" + +# Require spack OpenMPI to be loaded +if ! command -v mpicc &>/dev/null; then + echo "Error: mpicc not found. Load spack OpenMPI first:" + echo " spack load openmpi@4.1.6" + exit 1 +fi + +# Require pixi kaiju environment +# Check PATH since PIXI_ENVIRONMENT is not set by pixi shell-hook (only by pixi shell) +if ! echo "$PATH" | tr ':' '\n' | grep -q "\.pixi/envs/kaiju/bin"; then + echo "Error: must be run inside the pixi kaiju environment" + echo " source uw3_install_kaiju_amr.sh (sets up env via pixi shell-hook)" + exit 1 +fi + +echo "==========================================" +echo "PETSc AMR Build Script (Kaiju)" +echo "==========================================" +echo "PETSC_DIR: $PETSC_DIR" +echo "PETSC_ARCH: $PETSC_ARCH" +echo "mpicc: $(which mpicc)" +echo "==========================================" + +clone_petsc() { + if [ -d "$PETSC_DIR" ]; then + echo "PETSc directory already exists. Skipping clone." + echo "To force fresh clone, run: ./build-petsc-kaiju.sh clean" + return 0 + fi + + echo "Cloning PETSc release branch..." + git clone -b release https://gitlab.com/petsc/petsc.git "$PETSC_DIR" + echo "Clone complete." +} + +configure_petsc() { + echo "Configuring PETSc with AMR tools..." + cd "$PETSC_DIR" + + # Downloads and builds: + # AMR: mmg, parmmg, pragmatic, eigen, bison + # Solvers: mumps, scalapack, slepc + # Partitions: metis, parmetis, ptscotch + # BLAS/LAPACK: fblaslapack (Rocky Linux 8 has no guaranteed system BLAS) + # HDF5: downloaded (not provided by pixi in kaiju env) + # cmake: downloaded (spack does not have cmake) + # MPI: spack OpenMPI (not downloaded) + # petsc4py: built during configure + # MPI_DIR is computed from `which mpicc` (spack OpenMPI in PATH). + # LD_LIBRARY_PATH must include $MPI_DIR/lib so PETSc configure test binaries + # can find libmpi.so at runtime (spack uses RPATH for its own binaries but + # does not set LD_LIBRARY_PATH — load_env in uw3_install_kaiju_amr.sh sets it). + MPI_DIR="$(dirname "$(dirname "$(which mpicc)")")" + python3 ./configure \ + --with-petsc-arch="$PETSC_ARCH" \ + --with-debugging=0 \ + --with-mpi-dir="$MPI_DIR" \ + --download-hdf5=1 \ + --download-fblaslapack=1 \ + --download-cmake=1 \ + --download-bison=1 \ + --download-eigen=1 \ + --download-metis=1 \ + --download-parmetis=1 \ + --download-mumps=1 \ + --download-scalapack=1 \ + --download-slepc=1 \ + --download-ptscotch=1 \ + --download-mmg=1 \ + --download-mmg-cmake-arguments="-DMMG_INSTALL_PRIVATE_HEADERS=ON -DUSE_SCOTCH=OFF" \ + --download-parmmg=1 \ + --download-pragmatic=1 \ + --with-pragmatic=1 \ + --with-petsc4py=1 \ + --with-x=0 \ + --with-make-np=40 + + echo "Configure complete." +} + +build_petsc() { + echo "Building PETSc..." + cd "$PETSC_DIR" + + export PETSC_DIR + export PETSC_ARCH + + make all + echo "PETSc build complete." +} + +test_petsc() { + echo "Testing PETSc..." + cd "$PETSC_DIR" + + export PETSC_DIR + export PETSC_ARCH + + make check + echo "PETSc tests complete." +} + +clean_petsc() { + echo "Removing PETSc directory..." + if [ -d "$PETSC_DIR" ]; then + rm -rf "$PETSC_DIR" + echo "Cleaned." + else + echo "Nothing to clean." + fi +} + +show_help() { + echo "Usage: $0 [command]" + echo "" + echo "Commands:" + echo " (none) Full build: clone, configure, build" + echo " clone Clone PETSc repository" + echo " configure Configure PETSc with AMR tools" + echo " build Build PETSc" + echo " test Run PETSc tests" + echo " clean Remove PETSc directory" + echo " help Show this help" +} + +case "${1:-all}" in + all) + clone_petsc + configure_petsc + build_petsc + echo "" + echo "==========================================" + echo "PETSc AMR build complete!" + echo "Set these environment variables:" + echo " export PETSC_DIR=$PETSC_DIR" + echo " export PETSC_ARCH=$PETSC_ARCH" + echo " export PYTHONPATH=\$PETSC_DIR/\$PETSC_ARCH/lib:\$PYTHONPATH" + echo "==========================================" + ;; + clone) clone_petsc ;; + configure) configure_petsc ;; + build) build_petsc ;; + test) test_petsc ;; + clean) clean_petsc ;; + help|--help|-h) show_help ;; + *) + echo "Unknown command: $1" + show_help + exit 1 + ;; +esac diff --git a/pixi.lock b/pixi.lock index 00800d32..1f79a946 100644 --- a/pixi.lock +++ b/pixi.lock @@ -7606,6 +7606,342 @@ environments: - pypi: https://files.pythonhosted.org/packages/6e/67/9d4ac4b0d683aaa4170da59a1980740b281fd38fc253e1830fde4dac3d4f/pygmsh-7.1.17-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/09/0ab0853d6d634455fe70d90a306162160ead7592eceaca194168a16d3beb/sphinx_math_dollar-1.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/03/46/25d64bcd7821c8d6f1080e1c43d5fcdfc442a18f759a230b5ccdc891093e/sphinxcontrib_mermaid-2.0.1-py3-none-any.whl + kaiju: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py312h4c3975b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45.1-default_h4852527_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.3.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.3.0-hbca2aae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.4-py312h68e6be4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.20-py312h8285ef7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flexcache-0.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flexparser-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-14.3.0-h76987e4_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-hfa02b96_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.0-py312hcaba1f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-he467f4b_21.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.15.1-nompi_py312ha4f8f14_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.1.0-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.31.0-pyha191276_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.0.0-pyhcf101f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.0-default_h99862b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.0-default_h746c552_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.0-hf7376ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.8-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meshio-5.3.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-h24ddda3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h90cbb55_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/msgspec-0.20.0-py312h4c3975b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311ha0596eb_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py312h50c33e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pint-0.24.4-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pixi-kernel-0.7.1-pyhbbac1ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-1.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py312h868fb18_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.4.3-py312h4f23490_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.10.2-py312h9da60e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-forked-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mpi-0.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.10.2-h17e89b9_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/returns-0.26.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py312h868fb18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - pypi: https://files.pythonhosted.org/packages/bc/5d/339b995273c25a79bad5144ffb4fe57f4428d9ad2603942c851a66376afd/gmsh-4.15.1-py2.py3-none-manylinux_2_24_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6e/67/9d4ac4b0d683aaa4170da59a1980740b281fd38fc253e1830fde4dac3d4f/pygmsh-7.1.17-py3-none-any.whl mpich: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -14955,6 +15291,23 @@ packages: - pkg:pypi/fonttools?source=hash-mapping size: 2932702 timestamp: 1765632761555 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py312h8a5da7c_0.conda + sha256: 777c80a1aa0889e6b637631c31f95d0b048848c5ba710f89ed7cedd3ad318227 + md5: 526f7ffd63820e55d7992cc1cf931a36 + depends: + - __glibc >=2.17,<3.0.a0 + - brotli + - libgcc >=14 + - munkres + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=compressed-mapping + size: 2935817 + timestamp: 1773137546716 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.61.1-py312h5748b74_0.conda sha256: d87752e84621f90e9350262200fef55f054472f7779323f51717b557208e2a16 md5: c14625bf00c41c00cea174f459287fc4 @@ -15550,6 +15903,23 @@ packages: - pkg:pypi/gmpy2?source=hash-mapping size: 214554 timestamp: 1762946924209 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.0-py312hcaba1f9_1.conda + sha256: 6fbdd686d04a0d8c48efe92795137d3bba55a4325acd7931978fd8ea5e24684d + md5: fedbe80d864debab03541e1b447fc12a + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=14 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=compressed-mapping + size: 253171 + timestamp: 1773245116314 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.2.1-py312hee6aa52_2.conda sha256: e2f72ddb929fcd161d68729891f25241d62ab1a9d4e37d0284f2b2fce88935fa md5: bed6eebc8d1690f205a781c993f9bc65 @@ -15815,6 +16185,23 @@ packages: - pkg:pypi/h5py?source=hash-mapping size: 1296491 timestamp: 1764016696413 +- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.15.1-nompi_py312ha4f8f14_101.conda + sha256: bb5cefbe5b54195a54f749189fc6797568d52e8790b2f542143c681b98a92b71 + md5: 23965cb240cb534649dfe2327ecec4fa + depends: + - __glibc >=2.17,<3.0.a0 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - libgcc >=14 + - numpy >=1.23,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1290741 + timestamp: 1764016665782 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.15.1-mpi_mpich_py312h15326f5_1.conda sha256: cf8f8debcf495e0b9c284e673877f2fa208b02ee5c8dfc1d96268d779299adc3 md5: 3f7f1871038d11ee3dcae08316842e23 @@ -15895,6 +16282,26 @@ packages: purls: [] size: 2035859 timestamp: 1769445400168 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.1.0-h6083320_0.conda + sha256: 08dc098dcc5c3445331a834f46602b927cb65d2768189f3f032a6e4643f15cd9 + md5: 5baf48da05855be929c5a50f4377794d + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=78.2,<79.0a0 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libgcc >=14 + - libglib >=2.86.4,<3.0a0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 2615630 + timestamp: 1773217509651 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-12.2.0-haf38c7b_0.conda sha256: 2f8d95fe1cb655fe3bac114062963f08cc77b31b042027ef7a04ebde3ce21594 md5: 1c7ff9d458dd8220ac2ee71dd4af1be5 @@ -16015,6 +16422,24 @@ packages: purls: [] size: 3885031 timestamp: 1770390958500 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda + sha256: 1fc50ce3b86710fba3ec9c5714f1612b5ffa4230d70bfe43e2a1436eacba1621 + md5: c223ee1429ba538f3e48cfb4a0b97357 + depends: + - __glibc >=2.17,<3.0.a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.18.0,<9.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3708864 + timestamp: 1770390337946 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-mpi_mpich_h15328f7_6.conda sha256: a041fb1de4c6e44d173c98385fb89e48254e03f22c4eeb5ffe7bffa53c05adc6 md5: be4b2eb273cb805267537126012cdd17 @@ -17115,6 +17540,21 @@ packages: - pkg:pypi/kiwisolver?source=hash-mapping size: 77682 timestamp: 1762488738724 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda + sha256: eec7654c2d68f06590862c6e845cc70987b6d6559222b6f0e619dea4268f5dd5 + md5: cd74a9525dc74bbbf93cf8aa2fa9eb5b + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=compressed-mapping + size: 77120 + timestamp: 1773067050308 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py312hd8c8125_2.conda sha256: 8d68f6ec4d947902034fe9ed9d4a4c1180b5767bd9731af940f5a0e436bc3dfd md5: ddf4775023a2466ee308792ed80ca408 @@ -17568,6 +18008,18 @@ packages: purls: [] size: 264243 timestamp: 1745264221534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 + md5: a752488c68f2e7c456bcbd8f16eec275 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 261513 + timestamp: 1773113328888 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda sha256: 12361697f8ffc9968907d1a7b5830e34c670e4a59b638117a2cdfed8f63a38f8 md5: a74332d9b60b62905e3d30709df08bf1 @@ -18384,6 +18836,23 @@ packages: purls: [] size: 463621 timestamp: 1770892808818 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + sha256: a0390fd0536ebcd2244e243f5f00ab8e76ab62ed9aa214cd54470fe7496620f4 + md5: d50608c443a30c341c24277d28290f76 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + size: 466704 + timestamp: 1773218522665 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.18.0-hd5a2499_1.conda sha256: dbc34552fc6f040bbcd52b4246ec068ce8d82be0e76bfe45c6984097758d37c2 md5: 2742a933ef07e91f38e3d33ad6fe937c @@ -19661,6 +20130,31 @@ packages: purls: [] size: 117463 timestamp: 1768753005332 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_100.conda + sha256: f38b00b29c9495b71c12465397c735224ebaef71ad01278c3b9cb69dac685b65 + md5: 0eb36a09dad274e750d60b49aaec0af7 + depends: + - __glibc >=2.17,<3.0.a0 + - attr >=2.5.2,<2.6.0a0 + - blosc >=1.21.6,<2.0a0 + - bzip2 >=1.0.8,<2.0a0 + - hdf4 >=4.2.15,<4.2.16.0a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.18.0,<9.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - libzip >=1.11.2,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: MIT + license_family: MIT + purls: [] + size: 862222 + timestamp: 1772190364667 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda sha256: e9a8668212719a91a6b0348db05188dfc59de5a21888db13ff8510918a67b258 md5: 3ccff1066c05a1e6c221356eecc40581 @@ -23243,6 +23737,32 @@ packages: - pkg:pypi/netcdf4?source=hash-mapping size: 1109790 timestamp: 1760540565753 +- conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311ha0596eb_105.conda + noarch: python + sha256: ec2dc3171649378d1602bfd361f00a158f800d32e4092749740c4c6d288746b1 + md5: 71b833f92f41ab92b16ca9f87e8735fe + depends: + - python + - certifi + - cftime + - numpy + - packaging + - hdf5 + - libnetcdf + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - libnetcdf >=4.10.0,<4.10.1.0a0 + - libzlib >=1.3.1,<2.0a0 + - numpy >=1.23,<3 + - _python_abi3_support 1.* + - cpython >=3.11 + license: MIT + license_family: MIT + purls: + - pkg:pypi/netcdf4?source=hash-mapping + size: 1094040 + timestamp: 1772794140711 - conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py312h25f8dc5_102.conda sha256: eecbf3489560510d2c7d8d73ae812b1d0d1241f667e250afdd3faad244fb3a52 md5: 99217b58c029977345b72bb36a1f6596 @@ -24534,6 +25054,18 @@ packages: - pkg:pypi/platformdirs?source=compressed-mapping size: 25643 timestamp: 1771233827084 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + sha256: 0289f0a38337ee201d984f8f31f11f6ef076cfbbfd0ab9181d12d9d1d099bf46 + md5: 82c1787f2a65c0155ef9652466ee98d6 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=compressed-mapping + size: 25646 + timestamp: 1773199142345 - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e md5: d7585b6550ad04c8c5e21097ada2888e diff --git a/pixi.toml b/pixi.toml index 26c7b8d7..8c1b9efe 100644 --- a/pixi.toml +++ b/pixi.toml @@ -229,6 +229,36 @@ PETSC_ARCH = "petsc-4-uw-openmpi" petsc-local-build = { cmd = "./build-petsc.sh", cwd = "petsc-custom" } petsc-local-clean = { cmd = "./build-petsc.sh clean", cwd = "petsc-custom" } +# ============================================ +# KAIJU CLUSTER FEATURE +# ============================================ +# For the Kaiju HPC cluster (Rocky Linux 8, Spack OpenMPI, Slurm) +# Pure Python only — base dependencies cover all pure-Python needs. +# mpi4py, h5py, petsc, petsc4py are built from source against +# spack's OpenMPI using petsc-custom/build-petsc-kaiju.sh +# See: docs/developer/guides/kaiju-cluster-setup.md + +[feature.kaiju] +platforms = ["linux-64"] + +# ============================================ +# GADI CLUSTER FEATURE +# ============================================ +# For NCI Gadi HPC (CentOS, module OpenMPI + HDF5, PBS Pro) +# Pure Python only — base dependencies cover all pure-Python needs. +# mpi4py, h5py, petsc, petsc4py are built from source against +# Gadi's module OpenMPI and HDF5 using gadi_install_pixi.sh. +# See: install-scripts/uw3-hpc-install-scripts/gadi_install_pixi.sh + +[feature.gadi] +platforms = ["linux-64"] + +[feature.gadi.dependencies] +# patchelf is needed to fix h5py RPATH order after source build: +# meson embeds the conda env lib dir before Gadi's HDF5 in RPATH, +# so we use patchelf post-install to move HDF5_DIR to the front. +patchelf = "*" + # ============================================ # RUNTIME FEATURE (for tutorials/examples) # ============================================ @@ -312,3 +342,11 @@ openmpi-dev = { features = ["conda-petsc-openmpi", "runtime", "dev"], solve-gr amr-openmpi = { features = ["amr-openmpi"], solve-group = "amr-openmpi" } amr-openmpi-dev = { features = ["amr-openmpi", "runtime", "dev"], solve-group = "amr-openmpi" } + +# --- Kaiju Cluster Track (linux-64 only) --- +# Pure Python from pixi; MPI/PETSc/h5py built from source against spack OpenMPI +kaiju = { features = ["kaiju"], solve-group = "kaiju" } + +# --- Gadi Cluster Track (linux-64 only) --- +# Pure Python from pixi; MPI/PETSc/h5py built from source against Gadi modules +gadi = { features = ["gadi"], solve-group = "gadi" }