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 ninja libomp netcdf-cxx git
# And if they aren't pre-installed already:
brew install gcc cmake
  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 flag is available for wout compatibility, but RFP-specific physics 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.5.2.tar.gz (377.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.5.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

vmecpp-0.5.2-cp313-cp313-macosx_15_0_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

vmecpp-0.5.2-cp313-cp313-macosx_14_0_arm64.whl (6.7 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

vmecpp-0.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

vmecpp-0.5.2-cp312-cp312-macosx_15_0_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

vmecpp-0.5.2-cp312-cp312-macosx_14_0_arm64.whl (6.7 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

vmecpp-0.5.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

vmecpp-0.5.2-cp311-cp311-macosx_15_0_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.11macOS 15.0+ x86-64

vmecpp-0.5.2-cp311-cp311-macosx_14_0_arm64.whl (6.7 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

vmecpp-0.5.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

vmecpp-0.5.2-cp310-cp310-macosx_15_0_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.10macOS 15.0+ x86-64

vmecpp-0.5.2-cp310-cp310-macosx_14_0_arm64.whl (6.7 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for vmecpp-0.5.2.tar.gz
Algorithm Hash digest
SHA256 f80aaf44ca1c0229a053aec42522a0fa754ce7c054316ff298c64be9ee80d6a0
MD5 e8aa0eb111898010e8ec45c8472c8ae9
BLAKE2b-256 c882280cd9a77a82080c2d5a418e1331dcf31e61e00e8740d470926400005df1

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.5.2.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.5.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.5.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 62547d52e27368c9daf00779f8606bf470c783c0927fe957ed564e3a85b53e40
MD5 340e347dc14eeadb77d2f1c69792b5b7
BLAKE2b-256 86fd8124f18eaf73f6df007251f766366bba4e8bffff69f2d0a6416057d7b2d4

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.5.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_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.5.2-cp313-cp313-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.5.2-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 438c2296245ad1fcd7ace2aee57e4c89843c44759f3930e5c0d2a06a637e463b
MD5 6c1a716b52dde98448131dfcf528f844
BLAKE2b-256 1271d9971041d91602a6a425bec6c008630173d800ff2c046f68b1669488a00c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.5.2-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 0e27a545ca2cd7dd1a3bb3f1b568979d4dda6dfc2c2acc125069b1a035e3d440
MD5 8a1b24163ea38e4713b06c8830a830cd
BLAKE2b-256 d6e8424a4f678988a2202dcb5fd475a3b46847275ac8826cf0b0fb04aecbcba1

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.5.2-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.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ee076474d5a6f423e904a10c7470af39b6ccd7fa27e449e3ef0c6154c6c24902
MD5 3733da694b4d855bb3853694ce4075be
BLAKE2b-256 0cb315c739af04d99a652f1c14d4983d3bdf5f26d5872ae574bcf5e02f4d2062

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_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.5.2-cp312-cp312-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.5.2-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 784ed64a9425d730383af13166ad5cd667b174af42b732a748d8ff056eceef84
MD5 74f5839b240f3ddae233a1440e04430f
BLAKE2b-256 aabe5eab978999ed2b3b368ca0a6f14d4e1227981d4623f84ff9a3df3f243998

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.5.2-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 01d30d90e4b127c476e09dee69f28eefc5bb0c9db1ca3bf383c594f3874b92d4
MD5 69085f5219c1fe62602a3b7077a55876
BLAKE2b-256 876d496833eaed30ff01ad5fb7a668741f56831461c02308be8a865538da2aa0

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.5.2-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.5.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.5.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9576050cb3a18e01de1bb6355c1ae0a320e727c64729c40547f63775758e7df0
MD5 5a65ef3cddc99145fd639e788f39b551
BLAKE2b-256 cced47e8ceb1523437bb787eb199cdf5cb95c61eab418b3733e973948bbc42b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.5.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_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.5.2-cp311-cp311-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.5.2-cp311-cp311-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 249b406cefbee9623edb374cd22e2815319848c58c71b070d4ccb0b8debf9640
MD5 c23fdf4b84d126f47e5de108f261c77c
BLAKE2b-256 8ad8f8341bca60434f7a4174528d9f21ed476b9648e6ced698e222ac0a456ef2

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.5.2-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 4dcfc487ac735174c8785c7d85ec61ab776b4e731c6094669750264a2aaf2a3e
MD5 b988a3182972fe59d6719dde15c83ac2
BLAKE2b-256 187fd1f460d6ee30f29e09bd9e54844fdacb9fcfd9be028aaf6003e2df152a87

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.5.2-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.5.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.5.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d29a0a1a1584785532efd66a8dde820a14146f7af4096987ab1a628345952eed
MD5 62b5d64d643ddec4ea974fe45e69c1b3
BLAKE2b-256 c32aa0b27d9a34d7d3f806d53fd58f638ebe69509900bcaaa5cb079a9c23df7d

See more details on using hashes here.

Provenance

The following attestation bundles were made for vmecpp-0.5.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_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.5.2-cp310-cp310-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for vmecpp-0.5.2-cp310-cp310-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 4f13a268b695aec3e057781c6c226ba59fde69d940c6db1c98644cc54c73d932
MD5 7439e66b97363971b5d226499c03f72b
BLAKE2b-256 d2685f24ac894452df38b16e65a5200f40aa2fdeed7a27bda3172dddae8b42cf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.5.2-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 bfe36fdd24b75303a26cad1b16ed4e6c550d20602a0ace8b3a9a07c1fe087dfa
MD5 5df92936a1760b56072b44e58d4570c6
BLAKE2b-256 252ef8ab67dbe2b666652a02bdeaa29b2bf6ded0b9f946b7a6d87acc5e5d9fdb

See more details on using hashes here.

Provenance

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

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