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.7.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.7-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.7-cp313-cp313-macosx_14_0_arm64.whl (6.3 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

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

Uploaded CPython 3.13macOS 13.0+ x86-64

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

Uploaded CPython 3.12macOS 14.0+ ARM64

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

Uploaded CPython 3.12macOS 13.0+ x86-64

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

Uploaded CPython 3.11macOS 14.0+ ARM64

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

Uploaded CPython 3.11macOS 13.0+ x86-64

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

Uploaded CPython 3.10macOS 14.0+ ARM64

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

File metadata

  • Download URL: vmecpp-0.4.7.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.7.tar.gz
Algorithm Hash digest
SHA256 3d7b651798389946063be175728fa5c1a952fc46f2b5ec99bc91c982e79a5c09
MD5 9c92e96e1b01f05d8f1c1302d6f92e7d
BLAKE2b-256 53a7c4ca2aaa75a9e4f2595a11f4e7cf9bb25bc1ca968a93700db425d8f1e495

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 67dac0970724a419db384ecf3c5d1c9025b2a7e1720b04dd93ad37ef5b75e5e3
MD5 7d14c14f569b93f4bd3c0df802c6dea3
BLAKE2b-256 4217013b71d3cb95d0d61dfd58a796c291735ff60399513e656e31c784e3362e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.7-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 d50a5de93b1074a2167e4aa55300c250b537775e1e52560eb3ff3fa0caa963c1
MD5 6831f37c0a4c95b4d79dba58345921ac
BLAKE2b-256 52f7cb49734b01a0a151d32ee26239d3870c13e9d22dd9c31c4ba430d496f8bf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.7-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 b19dfd35548650436a47bc1c1e9212b85ae79e3a90c10d6e27a34713c2f74e38
MD5 34c8bc235b2a0de93e5c9d2ce39049d9
BLAKE2b-256 0f3278fa2f48cdc2116ae5db8af261f21057598b4d389008fb693cb3e09dce92

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3490f446bbd0cb9cb9df2746a0410b40915891ebdf2b6eaa255aa536429db84d
MD5 a44be4abd2947a574645e20a5d8eaba5
BLAKE2b-256 b0a42b5816d60b5f50d8146cdbc9f139eef58c67bf61bd85d484dc5571b1149f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.7-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 2d08929bce83f40eb79cd6b26ac3829922d133dad190f5d61ca6b4f95d9629d2
MD5 0d73d64b7890b43f1066c32aebfae011
BLAKE2b-256 f07cd8187850081cff9fead0c8ce506d39584d83ecdde77d37759cc318b970d7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.7-cp312-cp312-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 33d056dc339863b39851edd579e8477c23bb8bc6db327d81abc880ee0b12a240
MD5 ce2753e87fd3fa26accd443146ddc4e1
BLAKE2b-256 0e2757eeb4144b9becedf5bb0a58cfda9817d7719fa0be60d2823afe039bcdde

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 887c956d80941f67233b2e0ce5f081fc622ea9fc4eb10e0b436d256229f2608b
MD5 ee5ac7632492b29e88d0c168ef695c7c
BLAKE2b-256 59e40ffd7ed4eb660c40ad2f5c30c6b3f4a353e8af3583d9feaa2cac8041c982

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.7-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 63897a869eecaf0eeb71f1c6ed82832d2cd0c0127e7170f7762b5b023151b57d
MD5 7bd140c8b6b8932c7dbdb8c0bd608a8b
BLAKE2b-256 6b255c2de49cf743dd1107ead965fc96d04ec78585f85f76345d11d741f27a1d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.7-cp311-cp311-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 1dc6ba292a5805ed38295356af66722eac00d50eeb0505478b92233dde6f3856
MD5 f85703751b59fb9814fd978a6d1e70e8
BLAKE2b-256 79496f1952560ce30f628ddd3f3b8e555424b55088adf07f8d84522c53f3061b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fec605c216a54d72c8269da089d5e21ce917ad0304f1eca6ef2e55efe4b7b7d7
MD5 f69e75a5bb153ae38b274e5639c45c97
BLAKE2b-256 53bda78d4ab151bf38248cf01cdab5043d7dc8bf0653e1ed0b816db21a8bddb9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.7-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 6eec7ffee65f40ba83105e67214d494a9ebdc62665b433dcb99fc0ceb5f067e8
MD5 0dbdf52d1e8798dbacf38188e12a3494
BLAKE2b-256 7799c50a2a8d9c5555c0aadb54f4cc8c7c87b1b5a64b9da51f024d2eda40d60b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.4.7-cp310-cp310-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 cede9eb3b071ee0bca3f01f61a3afeae45639d81a93eb903291b7480a50e47a6
MD5 76b02478364053573b009d09422f495d
BLAKE2b-256 51b515eea959b69c8beeae9a99e1785ffaa749a58b2fe7069fb1f461e2d4a0f4

See more details on using hashes here.

Provenance

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