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.

For example examples/force_residual_convergence.py runs fixed-boundary VMEC++ on the W7-X case and plots the convergence of the force residuals.

W7-X force residual convergence

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
# vmecpp is a python module and can be either run with `python -m` or directly as a script
vmecpp examples/data/input.w7x

# check all options
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
    • 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.6.tar.gz (352.4 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.6-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.6-cp313-cp313-macosx_14_0_arm64.whl (6.3 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

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

Uploaded CPython 3.13macOS 13.0+ x86-64

vmecpp-0.4.6-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.6-cp312-cp312-macosx_14_0_arm64.whl (6.3 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

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

Uploaded CPython 3.12macOS 13.0+ x86-64

vmecpp-0.4.6-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.6-cp311-cp311-macosx_14_0_arm64.whl (6.3 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

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

Uploaded CPython 3.11macOS 13.0+ x86-64

vmecpp-0.4.6-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.6-cp310-cp310-macosx_14_0_arm64.whl (6.3 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

vmecpp-0.4.6-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.6.tar.gz.

File metadata

  • Download URL: vmecpp-0.4.6.tar.gz
  • Upload date:
  • Size: 352.4 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.6.tar.gz
Algorithm Hash digest
SHA256 8043e802b31181f7cbb94120ef7c465ef51790be5e83e6700d4035d055f5ba1e
MD5 77cb44ae9c61e1ebf434295ed0a55ffe
BLAKE2b-256 32eda846aa37443742c4a604f28acb3e78300b166d1883b8ae54311bc2a13ef2

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1400debcd34e26fd38b37130c322f5e444532a0818bf13b727522fd675f23506
MD5 d81a716d33e1a0c1cb9283446ca72538
BLAKE2b-256 27fa9b99731ab18a333eec0a3888f0a85cd7d34b95b174d0d0748a9a9e929c23

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.6-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 2f28f52088906a2bb6d5050dc5c9d2ae5ac24ffd5c7b2a7ac294dca4faab04bb
MD5 1bf7425e8f1e65555e99925c9d656b6d
BLAKE2b-256 f97ba5f88a44d1a539cc817adecdbe8945db262b32aa5d9b0b5dee2c55a53e8d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.6-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 68706fd05254c9be1a9958294080233b6013596d184b9d8527b531390f2f5c37
MD5 bdb52ed8d38ba2c9690acf87c2226aa2
BLAKE2b-256 516b5560550f4b0fa692bb57abce55d8d4ca61bdbf78f6031dea0fdd9b8002ab

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 67ecfa96b06ffe84701141c688356e2458d0734c694205a9154fe4b1895c4ec6
MD5 af9dbd36d3c00b6bd6cfb17b2dfbd8a7
BLAKE2b-256 cc9a064983796ba154d0950cf9d3fa005e9da8bfb88c90e05b011f35c6c6434f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.6-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 8570f5e042e6a0a4fc1dc2ac1a95592f19c2a5da2c2f8ff15435bd5f88ee97ae
MD5 c3e425ec934cc3f88bccdff407ddf494
BLAKE2b-256 fe6c728714925b76acc2b73b9a9637f72a03544041514247c83d1c3dc6e8ac61

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.6-cp312-cp312-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 eaf92b4d6054556f1ac2bcb086d0d5415a61a99f5e6a87b7baef2b99eea6f050
MD5 71cad68780b5e3ceadc6e140555b5a04
BLAKE2b-256 3813c2e87c890f0c7963d738de7657a49f5d2c81f159bc6934532fe5c31a5127

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e7f20c9353bed1d023ca05d801d2c2d731e69b60b93b4a82bf8542f5948e11a0
MD5 f50e1be5712a0c6b4d399aa736f2d9d7
BLAKE2b-256 b456fe6758a8401c59fd03cfe3574d8897b0413e7c892cd67c6e809412bc7555

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.6-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 531e8be56a6f203fee180a6a3f81b8a3b2cf08a60b6e27591c66647b0f32b8b4
MD5 d073c18c82684b741a2a04ca2e085688
BLAKE2b-256 39d42f9f811afb1274bb1d1cff3b33c3df6cf19064a56fdb215ec060a7c4289f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.6-cp311-cp311-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 ee9eba03eef969792f907264abcc1c51908c4d190d30e9471de36be16c17d6b2
MD5 1dafa0a8684f6dddc93a811b98e9ca3f
BLAKE2b-256 dd4461fb5d6734445bf71d3f67afb7e1d6e7e0cd2d22f64007b9aad9c6ceb14b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1caf61d5b26bcf07a9b4fa35e7791599a1a1c6edf9a59989193fd26027d8f765
MD5 0dfd7a3dc5d7d5907e12d1f1c395a46c
BLAKE2b-256 b9fb388b7878191362505a99353a7d06b13d08c0806173e83bfeacad1b5bbf6e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.6-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 30196e362871243c176b8c8bedcec6e96037da657951f63a940b4672dab0ab96
MD5 0c8dc8bdb0810ba904b3a4aac6fa83ea
BLAKE2b-256 752d4cf45c3ad8f02d5903c8b37838aae82609aea1e79e3fd5e9b441ec166723

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.6-cp310-cp310-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 bc7e427f2492eb2ca5e8eafb54d42d5dfa7b3c7e0dd51e0012e0097ad3921ad0
MD5 00ac55907dcb499a618e271ae68a8fc2
BLAKE2b-256 b4f40b6d3e9baf97b6fa2cc35db94f4e7f08532641ddebeb306af43259bd10af

See more details on using hashes here.

Provenance

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