Skip to main content

Proxima Fusion's reimplementation of the Variational Moments Equilibrium Code (VMEC), a free-boundary ideal-MHD equilibrium solver for stellarators and Tokamaks.

Project description

A dark Proxima logo in light color mode and a light one in dark color mode.

VMEC++

Ruff Code style: black MIT license Python version DOI

CI C++ core tests

VMEC++ is a Python-friendly, from-scratch reimplementation in C++ of the Variational Moments Equilibrium Code (VMEC), a free-boundary ideal-MHD equilibrium solver for stellarators and tokamaks.

The original version was written by Steven P. Hirshman and colleagues in the 1980s and 1990s. The latest version of the original code is called PARVMEC and is available here.

Compared to its Fortran predecessors, VMEC++:

  • has a zero-crash policy and reports issues via standard Python exceptions
  • allows hot-restarting a run from a previous converged state (see Hot restart)
  • supports inputs in the classic INDATA format as well as simpler-to-parse JSON files; it is also simple to construct input objects programmatically in Python
  • typically runs just as fast or faster
  • comes with substantial documentation of its internal numerics

VMEC++ can run on a laptop, but it is a suitable component for large-scale stellarator optimization pipelines.

On the other hand, some features of the original Fortran VMEC are not available in VMEC++. See below for more details.


Table of Contents

Usage

This is a quick overview of the three main ways in which you can use VMEC++. See examples/ for some actual example scripts. Suitable input files are found in examples/data. If unsure where to start, we suggest to give the w7x case a try, which is a five-field-period stellarator case for the Wendelstein 7-X stellarator.

As a Python package

VMEC++ offers a simple Python API:

import vmecpp

# Construct a VmecInput object, e.g. from a classic Fortran input file
vmec_input = vmecpp.VmecInput.from_file("input.w7x")  # or VMEC++'s w7x.json format
# This is a normal Python object: it can be constructed and modified programmatically
vmec_input.rbc[0, 0] *= 1.1

# Run VMEC++
vmec_output = vmecpp.run(vmec_input)

# Inspect the results programmatically or save them as a classic wout file
print(vmec_output.mercier.iota)
vmec_output.wout.save("wout_w7x.nc")

Note that other output files are planned to be accessible via members of the output object called threed1, jxbout and mercier soon.

With SIMSOPT

SIMSOPT is a popular stellarator optimization framework. VMEC++ implements a SIMSOPT-friendly wrapper that makes it easy to use it with SIMSOPT.

import vmecpp.simsopt_compat

vmec = vmecpp.simsopt_compat.Vmec("input.w7x")
print(f"Computed plasma volume: {vmec.volume()}")

As a command line tool

You can use VMEC++ directly as a CLI tool. In a terminal in which Python has access to the VMEC++ package:

# run on a given input file -> produce corresponding wout_w7x.nc
python -m vmecpp examples/data/input.w7x

# check all options
python -m vmecpp --help

As a Docker image

A pre-built Docker image is available at https://github.com/proximafusion/vmecpp/pkgs/container/vmecpp. Note that at present it is only updated occasionally.

See docker/README.md for more information and instructions on how to build a new image.

Installation

The easiest method for installing vmecpp is using pip:

pip install vmecpp

For usage as part of MPI-parallelized SIMSOPT applications, you might want to also install MPI on your machine and pip install mpi4py.

Alternatively you can build the latest vmecpp directly from source according to the appropriate instructions below.

Ubuntu/Debian

Ubuntu 22.04 and 24.04, as well as Debian 12 are officially supported.

  1. Install required system packages:
sudo apt-get install -y build-essential cmake libnetcdf-dev liblapack-dev libomp-dev libhdf5-dev python3-dev
  1. Install VMEC++ as a Python package (possibly after creating a dedicated virtual environment):
pip install git+https://github.com/proximafusion/vmecpp

The procedure will take a few minutes as it will build VMEC++ and some dependencies from source.

A common issue on Ubuntu is a build failure due to no python executable being available in PATH, since on Ubuntu the executable is called python3. When installing in a virtual environment (which is always a good idea anyways) python will be present. Otherwise the Ubuntu package python-is-python3 provides the python alias.

Arch Linux

  1. Install required system packages:
pacman -Sy --noconfirm python-pip gcc gcc-fortran openmp hdf5 netcdf lapack
  1. Install VMEC++ as a Python package (possibly after creating a virtual environment):
python -m pip install git+https://github.com/proximafusion/vmecpp

Fedora

Fedora 41 is officially supported.

  1. Install required system packages:
dnf install -y python3.10-devel cmake g++ gfortran libomp-devel hdf5-devel netcdf-devel lapack-devel
  1. Install VMEC++ as a Python package (possibly after creating a virtual environment):
# If you are installing with MPI support, remember to source the mpi compiler first
. /etc/profile.d/modules.sh
python3.10 -m pip install git+https://github.com/proximafusion/vmecpp

MacOS

  1. Install dependencies via Homebrew:
brew install python@3.10 gcc cmake ninja libomp netcdf-cxx git
  1. Install VMEC++ as a Python package (possibly after creating a virtual environment):
# tell cmake where to find gfortran and gcc as they have non-standard names
export FC=$(which gfortran-14)
# OpenMP headers live under a different path newer OS-X versions, so CMake can't find them
export OpenMP_ROOT=$(brew --prefix)/opt/libomp
export HDF5_ROOT=$(brew --prefix hdf5)
python3.10 -m pip install git+https://github.com/proximafusion/vmecpp

As part of a conda environment

VMEC++ is currently not packaged for conda, but all its dependencies are and VMEC++ can be installed inside a conda environment. An example environment.yml file is provided here that can be used, after cloning the vmecpp repository, as:

git clone https://github.com/proximafusion/vmecpp.git
cd vmecpp
# this creates a "vmecpp" conda environment
conda env create --file environment.yml
# use the environment as usual
conda activate vmecpp

C++ build from source

After having installed the build dependencies as shown above, you can compile the C++ core of VMEC++ via CMake or Bazel. E.g. with CMake:

git clone https://github.com/proximafusion/vmecpp.git
cd vmecpp
cmake -B build  # create and configure build directory
cmake --build build --parallel  # build VMEC++
# you can now use the vmec_standalone C++ executable to run VMEC on a VMEC++ input JSON file, e.g.
./build/vmec_standalone ./examples/data/solovev.json

The main C++ source code tree is located at src/vmecpp/cpp/vmecpp.

Hot restart

By passing the output of a VMEC++ run as initial state for a subsequent one, VMEC++ is initialized using the previously converged equilibrium. This can dramatically decrease the number of iterations to convergence when running VMEC++ on a configuration that is very similar to the converged equilibrium.

Example

import vmecpp

input = vmecpp.VmecInput.from_file("w7x.json")

# Base run
output = vmecpp.run(input)

# Now let's perturb the plasma boundary a little bit...
input.rbc[0, 0] *= 0.8
input.rbc[1, 0] *= 1.2
# ...and fix up the multigrid steps: hot-restarted runs only allow a single step
input.ns_array = input.ns_array[-1:]
input.ftol_array = input.ftol_array[-1:]
input.niter_array = input.niter_array[-1:]

# We can now run with hot restart:
# passing the previously obtained output ensures that
# the run starts already close to the equilibrium, so it will take
# very few iterations to converge this time!
hot_restarted_output = vmecpp.run(input, restart_from=output)

Full tests and validation against the reference Fortran VMEC v8.52

When developing the C++ core, it's advisable to locally run the full C++ tests for debugging or to validate changes before submitting them. The full tests are not stored in the sources of this repo, but in a separate repo: https://github.com/proximafusion/vmecpp_large_cpp_tests . See the instructions there for how to run those tests locally. The CI of this repo includes those tests too.

The single-thread runtimes as well as the contents of the "wout" file produced by VMEC++ can be compared with those of Fortran VMEC v8.52. The full validation test can be found at https://github.com/proximafusion/vmecpp-validation, including a set of sensible input configurations, parameter scan values and tolerances that make the comparison pass. See that repo for more information.

Differences with respect to PARVMEC/VMEC2000

VMEC++:

  • reports issues via standard Python exceptions and has a zero crash policy
  • allows hot-restarting a run from a previous converged state (see Hot restart)
  • supports inputs in the classic INDATA format as well as simpler-to-parse JSON files; it is also simple to construct input objects programmatically in Python
  • employs the same parallelization strategy as Fortran VMEC, but VMEC++ leverages OpenMP for a multi-thread implementation rather than Fortran VMEC's MPI parallelization: as a consequence it cannot parallelize over multiple nodes
  • implements the iteration algorithm of Fortran VMEC 8.52, which sometimes has different convergence behavior from (PAR)VMEC 9.0: some configurations might converge with VMEC++ and not with (PAR)VMEC 9.0, and vice versa

Limitations with respect to the Fortran implementations

  • non-stellarator-symmetric terms (lasym == true) are not supported yet
  • free-boundary works only for ntor > 0 - axisymmetric (ntor = 0) free-boundary runs don't work yet
  • lgiveup/fgiveup logic for early termination of a multi-grid sequence is not implemented yet
  • lbsubs logic in computing outputs is not implemented yet
  • lforbal logic for non-variational forces near the magnetic axis is not implemented yet
  • lrfp is not implemented yet - only stellarators/Tokamaks for now
  • several profile parameterizations are not fully implemented yet:
    • gauss_trunc
    • two_power_gs
    • akima_spline
    • akima_spline_i
    • akima_spline_ip
    • cubic_spline
    • cubic_spline_i
    • cubic_spline_ip
    • pedestal
    • rational
    • line_segment
    • line_segment_i
    • line_segment_ip
    • nice_quadratic
    • sum_cossq_s
    • sum_cossq_sqrts
    • sum_cossq_s_free
  • some (rarely used) free-boundary-related output quantities are not implemented yet:
    • curlabel - declared but not populated yet
    • potvac - declared but not populated yet
    • xmpot - not declared yet
    • xnpot - not declared yet
  • 2D preconditioning using block-tridiagonal solver (BCYCLIC) is not implemented; neither are the associated input fields precon_type and prec2d_threshold
  • VMEC++ only computes the output quantities if the run converged
  • The Fortran version falls back to fixed-boundary computation if the mgrid file cannot be found; VMEC++ (gracefully) errors out instead.
  • The Fortran version accepts both the full path or filename of the input file as well as the "extension", i.e., the part after input.; VMEC++ only supports a valid filename or full path to an existing input file.

Roadmap

Some of the things we are planning for VMEC++'s future:

  • free-boundary hot-restart in Python
  • open-sourcing the full VMEC++ test suite (including the Verification&Validation part that compares wout contents)
  • open-sourcing the source code to reproduce VMEC++'s performance benchmarks
  • VMEC++ usable as a C++ bazel module

Some items we do not plan to work on, but where community ownership is welcome:

  • packaging VMEC++ for platforms or package managers other than pip (e.g. conda, homebrew, ...)
  • native Windows support
  • ARM support
  • 2D preconditioner using bcyclic_plus_plus

Related repositories

License

vmecpp is distributed under the terms of the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vmecpp-0.3.5.tar.gz (316.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

vmecpp-0.3.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

vmecpp-0.3.5-cp313-cp313-macosx_14_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

vmecpp-0.3.5-cp313-cp313-macosx_13_0_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.13macOS 13.0+ x86-64

vmecpp-0.3.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

vmecpp-0.3.5-cp312-cp312-macosx_14_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

vmecpp-0.3.5-cp312-cp312-macosx_13_0_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.12macOS 13.0+ x86-64

vmecpp-0.3.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

vmecpp-0.3.5-cp311-cp311-macosx_14_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

vmecpp-0.3.5-cp311-cp311-macosx_13_0_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.11macOS 13.0+ x86-64

vmecpp-0.3.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

vmecpp-0.3.5-cp310-cp310-macosx_14_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

vmecpp-0.3.5-cp310-cp310-macosx_13_0_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.10macOS 13.0+ x86-64

File details

Details for the file vmecpp-0.3.5.tar.gz.

File metadata

  • Download URL: vmecpp-0.3.5.tar.gz
  • Upload date:
  • Size: 316.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for vmecpp-0.3.5.tar.gz
Algorithm Hash digest
SHA256 a52c88f0077807ed73e6460ee97e2d706324dede3881d51ecfbd19aa2e9f78a0
MD5 7cb47b7abf8b692e394b7d6ee915d42b
BLAKE2b-256 a01e16510d7b63f9975baa88879e6e539dab44f60dcd01af48777d06bda78d9a

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5.tar.gz:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vmecpp-0.3.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.3.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 930a2570927ff261090e9baafbe75d0ec69008f958bcc1714d7650aee254190d
MD5 03d89e405a6be90d2eca6b458b14000d
BLAKE2b-256 b2cc2ff9bc1f412dfeb0a82c723378157dbc8c1f0c1ad803e98add9323181734

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vmecpp-0.3.5-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for vmecpp-0.3.5-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 9b3ebc70dee4fbc3e0408931091f1f440a73cf805b34919b7aabda91812bb7f9
MD5 6fb28e93d27666ba0c5244124ea1a716
BLAKE2b-256 935531e8a4d97dd03c1faa425d1e7224574e8065457e6fab3fb87ae8c78b3a4c

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vmecpp-0.3.5-cp313-cp313-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.3.5-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 a80be7613599d9cc726af6e57a24b38524a5cce44f3d2960b86edfe9ca66fe42
MD5 812a710873f85cb29f006bf513b62f9d
BLAKE2b-256 e6b1a8f97ee1b41e9deb36787315c63161b64aab303ccb224c21d1760493f2c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5-cp313-cp313-macosx_13_0_x86_64.whl:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vmecpp-0.3.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.3.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2a9e205f320f30415a5d487a47517700cb8742b9026b5d5b988fee97d8ccec0c
MD5 fb4457a3497ef9ee015977b587b90a71
BLAKE2b-256 2f12a67f7a7bb2ba5a31ef1c077eb4140dbabf0e838b73d279b47946b9435ab7

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vmecpp-0.3.5-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for vmecpp-0.3.5-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 8fbccdf9a797ff92aa6a273282c3dbfde96a1a560c304b3fa491eb35fae1064e
MD5 32a540321c71962cf9221407b95672e3
BLAKE2b-256 e4a693dc78c8d9899cf8004d350fa5992b9b3bf2276efdaac922239d792294c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vmecpp-0.3.5-cp312-cp312-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.3.5-cp312-cp312-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 28bd31034e47ea88be7a04eada4f595122673c8c91c7ce47d53732869da32f90
MD5 2a857ca8ee53121ec8750897394ce3ac
BLAKE2b-256 9082a839dfe7c73a97eede3689a985613e6d7d1fe668ecca28f2b61f171259ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5-cp312-cp312-macosx_13_0_x86_64.whl:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vmecpp-0.3.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.3.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9cfdbb91920bdf0ea1e2ab53734255e75b9c76249858d17b436818ff03fd5e29
MD5 1d0173daded4490ad9e880bb4e07dce0
BLAKE2b-256 541e53ec358e17b61967c6bf158ceec4da4eb483a9ac62d9a99c7368669c1304

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vmecpp-0.3.5-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for vmecpp-0.3.5-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 a3001677be630f153d63b5283f9a39c4a568d3f818d02187030936ae453efe2e
MD5 1c50a327b132cbaba311a949745d787f
BLAKE2b-256 7f641a2b834cc405bee39b3a6fb0d63743db25d9518463e627fe99b9cfdc03b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5-cp311-cp311-macosx_14_0_arm64.whl:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vmecpp-0.3.5-cp311-cp311-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.3.5-cp311-cp311-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 98769397f13cdde21b3b2b2c49dbe52dbf04d630850640ea4968d2103f13847e
MD5 b19e4ae5de268db3df2f0ac22151f172
BLAKE2b-256 011060d1058333b52fd1756c575fa228ff01a6eba40a2359205eeb5e25e5efdc

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5-cp311-cp311-macosx_13_0_x86_64.whl:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vmecpp-0.3.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.3.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6ff25eb9c03175026e082c514eb5eefeabffc63ead0e70dca12ff129c17b4fae
MD5 47ed2b5544564f8fba7a0826b363f78e
BLAKE2b-256 a459b8fa2a75cb257e9519cfc8fdf3a8d26630504e7f5e966d5f79fa3fa64d91

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vmecpp-0.3.5-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for vmecpp-0.3.5-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 829d7b6e740cdc718cf6b7fc22f7aec63a4f58de0f79e462428a1318c5eb8a02
MD5 f3e33f754567163ba5773e709dbaf789
BLAKE2b-256 c421b75b31fe6b1bf73af0f9533ab76b85cbbaab7bc5137b34ef7c8992876a2a

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5-cp310-cp310-macosx_14_0_arm64.whl:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vmecpp-0.3.5-cp310-cp310-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.3.5-cp310-cp310-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 06cf38f8fe2286c0e15e7f3aa62c1c08433f88ff720d7b3bda522f3ad1fb824c
MD5 ff3abf6922cf6786cb07941128b5f847
BLAKE2b-256 56ce6bface94f9c0598d9f35daed120873e1c91e0cce22945aae7310658ce11d

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.3.5-cp310-cp310-macosx_13_0_x86_64.whl:

Publisher: pypi_publish.yml on proximafusion/vmecpp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page