Skip to main content

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

Project description

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

VMEC++

Ruff Code style: black MIT license Python version DOI

CI C++ core tests

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

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

Compared to its Fortran predecessors, VMEC++:

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

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

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


Table of Contents

Usage

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

As a Python package

VMEC++ offers a simple Python API:

import vmecpp

# construct a VmecInput object, e.g. from a classic Fortran input file
vmec_input = vmecpp.VmecInput.from_file("input.w7x")

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

# inspect the results or save them as a classic wout file
vmec_output.wout.save("wout_w7x.nc")

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

With SIMSOPT

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

import vmecpp.simsopt_compat

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

As a command line tool

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

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

# check all options
python -m vmecpp --help

As a Docker image

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

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

Installation

The easiest method for installing vmecpp is using pip:

pip install vmecpp

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

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

Ubuntu/Debian

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

  1. Install required system packages:
sudo apt-get install build-essential cmake libnetcdf-dev liblapack-dev libopenmpi-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 openmpi 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 openmpi-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
module load mpi/openmpi-x86_64
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 protobuf git open-mpi
  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)
export CC=$(which gcc-14)
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.2.0.tar.gz (3.3 MB view details)

Uploaded Source

Built Distributions

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

vmecpp-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

vmecpp-0.2.0-cp313-cp313-macosx_14_0_arm64.whl (8.7 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

vmecpp-0.2.0-cp313-cp313-macosx_13_0_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.13macOS 13.0+ x86-64

vmecpp-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

vmecpp-0.2.0-cp312-cp312-macosx_14_0_arm64.whl (8.7 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

vmecpp-0.2.0-cp312-cp312-macosx_13_0_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.12macOS 13.0+ x86-64

vmecpp-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

vmecpp-0.2.0-cp311-cp311-macosx_14_0_arm64.whl (8.7 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

vmecpp-0.2.0-cp311-cp311-macosx_13_0_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.11macOS 13.0+ x86-64

vmecpp-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

vmecpp-0.2.0-cp310-cp310-macosx_14_0_arm64.whl (8.7 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

vmecpp-0.2.0-cp310-cp310-macosx_13_0_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.10macOS 13.0+ x86-64

File details

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

File metadata

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

File hashes

Hashes for vmecpp-0.2.0.tar.gz
Algorithm Hash digest
SHA256 2354e50af2a13800f79e230e0f2ee1d30289bc277bb6310461023972e26814cb
MD5 a49b63b507f90077380046dd6bb0d198
BLAKE2b-256 9e8c1ff6142738f51be443bbf03bc50cda52a726b2cb57cef7bbec6814c8cc4b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 91914debb2342618db52a7646491f7e0c72c5e5b0a7d66555ee0611e8c090f28
MD5 1ed0ef4ec6a0c2e442f10537e8c4f5e7
BLAKE2b-256 a4be9c88af65724e6eba430f6a86e62899ef762ea7c2af931b33368cc639e705

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.2.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 08bf6cf76529a464325326bbd922a434e5ef7d8154a5f84cd8ad70e5678718f9
MD5 a0b4c4c6fb644ec3bc4cd230b7187f88
BLAKE2b-256 4b263a56d7508d8a2836c22ac4ba035879aa36fcba08eda29371327c23b9ae77

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.2.0-cp313-cp313-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 df5fc3dd724d501857720cd989ae1b9fdd8fa12b8ea1bd217f7c5bf896940f42
MD5 9fefd9f0e3fa0a18b2cde1f28c50b4cc
BLAKE2b-256 607856cd187564af6bba89180a80c10de214948879c756a58ba677f4e2348df2

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6e6b526bbab866eb281156995d97cd3aaf306d7e05960f064de74cfa286decff
MD5 f23f44c9c27ad52a8e07102d948607a7
BLAKE2b-256 c5612653466bf9e228d075da73a5283e7217abe57f27eb53dcde0cf781bc4b15

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.2.0-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 3caf5ad09becffd978519446865ed6094ad1e540583b755da8f408b8973a9077
MD5 7f272817b27569edea8e360c46a4bc86
BLAKE2b-256 192df4ef94c58b89a780d2f26f03441d48229c2413731ece27ef77e9fc480c13

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.2.0-cp312-cp312-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 4f10e89427bee2b85b63dd4f74674c10daa150999b973688974b4284a50bc913
MD5 bd3468af4477c733b986e67c55736be2
BLAKE2b-256 bef3d6c4dde4ac2357b5820ed6bfadd9433567a491be7e030ebe9107483ddebd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3c41c30e8526ea92f99ebd2ca8d1f1e8b2c507c26687fcf7739b7f962ab32067
MD5 41d779e02e829b63cf529606ef5624c5
BLAKE2b-256 4db3f640d66d144391dbdd7e4693decd1fb2110a386dbe120e0e0f61309ce839

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.2.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 50a4d95431f58849984234d4c41e4ae4e764a7b599aa0fac0580d6dabf1ed982
MD5 db1d447707065a0f32b86c7c0e78a071
BLAKE2b-256 3470ad640ee922df474ccc1d57a4d0db887dc129c0c16bcbe3cb471943f0e6db

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.2.0-cp311-cp311-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 bafdf9da1f9a98ef724254a718747911669083999e144bf121d6a6a456441919
MD5 4280653bcad2253d0a66b8e6f8ccb2e9
BLAKE2b-256 63a7e43fa09e4fb8f7c060097b2be2f83081030204fa557969868c8234206c1d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 85417d69d914452e4a1ecdf948167cc01c1c8efd218e8121669a72757656ff2d
MD5 ce6c80489f720322756b62d4ae03e957
BLAKE2b-256 24dacff1c321313ed7a378f00d86a0db9c6587f259215ca5c4778ad203fbee91

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.2.0-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 51a81e0db1dcbd29fdfbf55f443b4b51857d367a5d124566b575bdb6c2d78794
MD5 b6ac56f796463953e2fbd4e444e88aad
BLAKE2b-256 c4ae9e40aec7ef4105af79511632a11b8cb974512935058d8582ba2b49735dc5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for vmecpp-0.2.0-cp310-cp310-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 47148f38cd0cdbf7464b1c4ab1daf7bda96fb3bab9b8f6979145182cd7af1d63
MD5 8a7d5cf2259131669e789cf6642ca8ce
BLAKE2b-256 341a7bcb017829414ddc81c15f237613db5f67f1b1e45c517d140f6da1e60752

See more details on using hashes here.

Provenance

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