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 Publish wheels to PyPI

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")

All other output files are accessible via members of the output object called threed1_volumetrics, jxbout and mercier.

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.4.3.tar.gz (327.5 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.4.3-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.4.3-cp313-cp313-macosx_14_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

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

Uploaded CPython 3.13macOS 13.0+ x86-64

vmecpp-0.4.3-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.4.3-cp312-cp312-macosx_14_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

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

Uploaded CPython 3.12macOS 13.0+ x86-64

vmecpp-0.4.3-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.4.3-cp311-cp311-macosx_14_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

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

Uploaded CPython 3.11macOS 13.0+ x86-64

vmecpp-0.4.3-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.4.3-cp310-cp310-macosx_14_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

vmecpp-0.4.3-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.4.3.tar.gz.

File metadata

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

File hashes

Hashes for vmecpp-0.4.3.tar.gz
Algorithm Hash digest
SHA256 f2df396abb75b12bc806e676355f558bf886342df7c63fb64e3405bb27966bc7
MD5 fd40b506a44626db50d10f3fcdb8c791
BLAKE2b-256 af180031a63eedff9b138641d50073a49f57bf94778c89ec3240d5be5e5b8d6a

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3.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.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 12ae3156709b7573d5ada58192ee2d753b0803f6ff0fac9f70980e7e3e3adfd2
MD5 c0868b841fa8e6bcfdb1a22b8f9ae42e
BLAKE2b-256 c0ffb01c774d5070f0541717451c5e612a1b7e5f44ce0e0d21e7accfeb039ad0

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3-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.4.3-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for vmecpp-0.4.3-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 e426c9f2012aa084bf70b7d8e5e0cf693e25c196e1cb441e58113fb7b2cd1f5d
MD5 c48e1ef3c5e533b641f6954b2640d8c2
BLAKE2b-256 93c27ff7a110dc98b3ffa80928c7f71530e6a68dd4543b0a6367fa0803e577cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3-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.4.3-cp313-cp313-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.4.3-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 3d6bb309918c51322408571aa9a953e26b6bdc111179514d22a22d6261537285
MD5 375e461c5647ac18924aad990661df10
BLAKE2b-256 a381199409ab84d94ac880fa54bedb49ba5d512f5ac50177d86606a11f2202df

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3-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.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a93a2f82678753ac2c39adcbbdea7c09d8d257d920422ff5e8315411f1514929
MD5 7b2c636db38b7638a1cb36af51baaac7
BLAKE2b-256 39c41694ccbe85b3fa65916170b27e04e292d0decc0fcffe1cb6e017d24d6972

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3-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.4.3-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for vmecpp-0.4.3-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 132cb73020c57c36b315e3e93c02751d3512fd27a6b89732bff5a9ca808dd1da
MD5 1d940964f61e98651c715cdf03a40275
BLAKE2b-256 35bf0f8f3776a2e819a4dce8afee9f637713f095467daaee7a337f187e724f04

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3-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.4.3-cp312-cp312-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.4.3-cp312-cp312-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 8360814ecc63e4e7a365317d8fb74c3a4e2e3306f20b83d93f280aa854451a6a
MD5 a1653e4c83ec9ee6f8304fff25b2c476
BLAKE2b-256 2b96c98cde80e0553f5d9367ed464b29fb83d05da30bff2d0660eeed0c1b268a

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3-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.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 00dbbf2b5daeb8452939b476b24ecd46a402ff16dba9d3d23542626edc34eb4b
MD5 7b57ea0decc2761c45f20e1ad079a101
BLAKE2b-256 8166ff6b4eb209672737439d0f0ebff68aa0dc6f6d6b660788bd004fc141845e

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3-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.4.3-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for vmecpp-0.4.3-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 9492e924771298ffc9f233d42381ebcdd554886e76ac34332c7b64916ce71b5c
MD5 ce5fc6d4a7a8949862b69ceb903ec903
BLAKE2b-256 b220ed77ad1f88d2b7e284022cd13a16f9366bf2edbbb4c47ea8bfcdd8289fd9

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3-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.4.3-cp311-cp311-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.4.3-cp311-cp311-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 17a4d3acb15a8bb0b3510c5fb0847ca7a45116ebd3e37213499a60f93548410d
MD5 eb82256d4c579cbc22e72fb442d80edf
BLAKE2b-256 b440ca3cde9d1f1d249785b007e289288b3bde17339db7e1aedd3553085fdd0e

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3-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.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3f528bfd09806e7ee9ce77acd8e427ed87c696dc08df9f28dbf5fe4f6310288c
MD5 f3ea0ef8698f31f1e28b797ed27584fb
BLAKE2b-256 25374f861f2816e564cfcd72f9b595f03a14cdea4a6bb54474875fa45d438a45

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3-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.4.3-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for vmecpp-0.4.3-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 4e665ea738a14fb0c080bade8aa03e6c52efd8472a71f6294c361c33146b0325
MD5 f1092ce9a07ae50db8699d214569c087
BLAKE2b-256 1539d6038f9a625994083b9911787e796af0c64bfb0673dfd46fa2663c6b89d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3-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.4.3-cp310-cp310-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.4.3-cp310-cp310-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 edf099c3813aa063257209a098ab9dddadf2c450219fadda77475c1cc669029b
MD5 d66d40d32f8a0eee00d64cf4403066d1
BLAKE2b-256 90c1d0976b71bc189c7ac1132b74b8569adf8df704e6aa61ce6f8ec303f79085

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.4.3-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