Skip to main content

C++ & Python API for Scientific I/O with openPMD

Project description

C++ & Python API for Scientific I/O with openPMD

Supported openPMD Standard Documentation Status Doxygen Gitter chat Supported Platforms License DOI

Linux/OSX Build Status dev Windows Build Status dev Coverity Scan Build Status Coverage Status CodeFactor

This library provides a high-level API for writing and reading scientific data according to openPMD. It allows to build logical file structures which drive scientific I/O libraries such as HDF5 and ADIOS through a common, intuitive interface. Where supported, openPMD-api implements both serial and MPI parallel I/O capabilities.

Usage

C++

C++11 C++11 API: Alpha

#include <openPMD/openPMD.hpp>
#include <iostream>

// ...

auto s = openPMD::Series("samples/git-sample/data%T.h5", openPMD::AccessType::READ_ONLY);

for( auto const& i : s.iterations ) {
    std::cout << "Iteration: " << i.first << "\n";

    for( auto const& m : i.second.meshes ) {
        std::cout << "  Mesh '" << m.first << "' attributes:\n";
        for( auto const& val : m.second.attributes() )
            std::cout << "    " << val << '\n';
    }

    for( auto const& p : i.second.particles ) {
        std::cout << "  Particle species '" << p.first << "' attributes:\n";
        for( auto const& val : p.second.attributes() )
            std::cout << "    " << val << '\n';
    }
}

Python

Python3 Python3 API: Alpha

import openpmd_api

# ...

series = openpmd_api.Series("samples/git-sample/data%T.h5", openPMD.Access_Type.read_only)

for k_i, i in series.iterations.items():
    print("Iteration: {0}".format(k_i))

    for k_m, m in i.meshes.items():
        print("  Mesh '{0}' attributes:".format(k_m))
        for a in m.attributes:
            print("    {0}".format(a))

    for k_p, p in i.particles.items():
        print("  Particle species '{0}' attributes:".format(k_p))
        for a in p.attributes:
            print("    {0}".format(a))

More!

Curious? Our manual shows full read & write examples, both serial and MPI-parallel!

Dependencies

Required:

  • CMake 3.11.0+
  • C++11 capable compiler, e.g. g++ 4.8+, clang 3.9+, VS 2015+

Shipped internally in share/openPMD/thirdParty/:

Optional I/O backends:

while those can be built either with or without:

  • MPI 2.1+, e.g. OpenMPI 1.6.5+ or MPICH2

Optional language bindings:

  • Python:
    • Python 3.5 - 3.7
    • pybind 2.3.0+
    • numpy 1.15+
    • mpi4py 2.1+

Installation

Spack Package Conda Package PyPI Package From Source

Choose one of the install methods below to get started:

Spack

Spack Version Spack Status

# optional:               +python +adios1 -mpi
spack install openpmd-api
spack load -r openpmd-api

Conda

Conda Version Conda Status Conda Downloads

# optional:            OpenMPI support  =*=mpi_openmpi*
# optional:              MPICH support  =*=mpi_mpich*
conda install -c conda-forge openpmd-api

PyPI

PyPI Version PyPI Format PyPI Status PyPI Downloads

Behind the scenes, this install method compiles from source against the found installations of HDF5, ADIOS and/or MPI (in system paths, from other package managers, or loaded via a module system, ...). The current status for this install method is experimental. Please feel free to report how this works for you.

# optional:             --user
pip install openpmd-api

or with MPI support:

# optional:                                                  --user
openPMD_USE_MPI=ON pip install openpmd-api --no-binary :all:

From Source

Source Status

openPMD can then be installed using CMake:

git clone https://github.com/openPMD/openPMD-api.git

mkdir openPMD-api-build
cd openPMD-api-build

# optional: for full tests, with unzip
../openPMD-api/.travis/download_samples.sh

# for own install prefix append:
#   -DCMAKE_INSTALL_PREFIX=$HOME/somepath
# for options append:
#   -DopenPMD_USE_...=...
# e.g. for python support add:
#   -DopenPMD_USE_PYTHON=ON -DPYTHON_EXECUTABLE=$(which python)
cmake ../openPMD-api

cmake --build .

# optional
ctest

# sudo might be required for system paths
cmake --build . --target install

The following options can be added to the cmake call to control features. CMake controls options with prefixed -D, e.g. -DopenPMD_USE_MPI=OFF:

CMake Option Values Description
openPMD_USE_MPI AUTO/ON/OFF Parallel, Multi-Node I/O for clusters
openPMD_USE_JSON AUTO/ON/OFF JSON backend (.json files)
openPMD_USE_HDF5 AUTO/ON/OFF HDF5 backend (.h5 files)
openPMD_USE_ADIOS1 AUTO/ON/OFF ADIOS1 backend (.bp files)
openPMD_USE_ADIOS2 AUTO/ON/OFF ADIOS2 backend (.bp files) 1
openPMD_USE_PYTHON AUTO/ON/OFF Enable Python bindings
openPMD_USE_INVASIVE_TESTS ON/OFF Enable unit tests that modify source code 2
openPMD_USE_VERIFY ON/OFF Enable internal VERIFY (assert) macro independent of build type 3
PYTHON_EXECUTABLE (first found) Path to Python executable

1 not yet implemented 2 e.g. changes C++ visibility keywords, breaks MSVC 3 this includes most pre-/post-condition checks, disabling without specific cause is highly discouraged

Additionally, the following libraries are shipped internally. The following options allow to switch to external installs:

CMake Option Values Library Version
openPMD_USE_INTERNAL_VARIANT ON/OFF MPark.Variant 1.4.0+
openPMD_USE_INTERNAL_CATCH ON/OFF Catch2 2.6.1+
openPMD_USE_INTERNAL_PYBIND11 ON/OFF pybind11 2.3.0+
openPMD_USE_INTERNAL_JSON ON/OFF NLohmann-JSON 3.5.0+

By default, this will build as a shared library (libopenPMD.[so|dylib|dll]) and installs also its headers. In order to build a static library, append -DBUILD_SHARED_LIBS=OFF to the cmake command. You can only build a static or a shared library at a time.

By default, the Release version is built. In order to build with debug symbols, pass -DCMAKE_BUILD_TYPE=Debug to your cmake command.

By default, tests and examples are built. In order to skip building those, pass -DBUILD_TESTING=OFF or -DBUILD_EXAMPLES to your cmake command.

Linking to your project

The install will contain header files and libraries in the path set with -DCMAKE_INSTALL_PREFIX.

CMake

If your project is using CMake for its build, one can conveniently use our provided openPMDConfig.cmake package which is installed alongside the library.

First set the following environment hint if openPMD-api was not installed in a system path:

# optional: only needed if installed outside of system paths
export CMAKE_PREFIX_PATH=$HOME/somepath:$CMAKE_PREFIX_PATH

Use the following lines in your project's CMakeLists.txt:

# supports:                       COMPONENTS MPI NOMPI JSON HDF5 ADIOS1 ADIOS2
find_package(openPMD 0.1.0 CONFIG)

if(openPMD_FOUND)
    target_link_libraries(YourTarget PRIVATE openPMD::openPMD)
endif()

Alternatively, add the openPMD-api repository source directly to your project and use it via:

add_subdirectory("path/to/source/of/openPMD-api")

target_link_libraries(YourTarget PRIVATE openPMD::openPMD)

Manually

If your (Linux/OSX) project is build by calling the compiler directly or uses a manually written Makefile, consider using our openPMD.pc helper file for pkg-config which are installed alongside the library.

First set the following environment hint if openPMD-api was not installed in a system path:

# optional: only needed if installed outside of system paths
export PKG_CONFIG_PATH=$HOME/somepath/lib/pkgconfig:$PKG_CONFIG_PATH

Additional linker and compiler flags for your project are available via:

pkg-config --libs openPMD
# -L${HOME}/somepath/lib -lopenPMD

# if you build openPMD-api as static library with `-DBUILD_SHARED_LIBS=OFF`
pkg-config --libs --static openPMD
# -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/openmpi/lib -lopenPMD -pthread /usr/lib/libmpi.so -pthread /usr/lib/x86_64-linux-gnu/openmpi/lib/libmpi_cxx.so /usr/lib/libmpi.so /usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5.so /usr/lib/x86_64-linux-gnu/libsz.so /usr/lib/x86_64-linux-gnu/libz.so /usr/lib/x86_64-linux-gnu/libdl.so /usr/lib/x86_64-linux-gnu/libm.so -pthread /usr/lib/libmpi.so -pthread /usr/lib/x86_64-linux-gnu/openmpi/lib/libmpi_cxx.so /usr/lib/libmpi.so

pkg-config --cflags openPMD
# -I${HOME}/somepath/include

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

openPMD-api-0.9.0a1.tar.gz (572.8 kB view details)

Uploaded Source

Built Distributions

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

openPMD_api-0.9.0a1-cp37-cp37m-manylinux2010_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

openPMD_api-0.9.0a1-cp36-cp36m-manylinux2010_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64

openPMD_api-0.9.0a1-cp35-cp35m-manylinux2010_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.5mmanylinux: glibc 2.12+ x86-64

File details

Details for the file openPMD-api-0.9.0a1.tar.gz.

File metadata

  • Download URL: openPMD-api-0.9.0a1.tar.gz
  • Upload date:
  • Size: 572.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/40.0.0 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.5.3

File hashes

Hashes for openPMD-api-0.9.0a1.tar.gz
Algorithm Hash digest
SHA256 672a8d8cbab4afbede173e8c5748dacb58b5e888bc7384a7e43880cadf11160d
MD5 1122ffd5bd29cc0a7d02cd29c787f530
BLAKE2b-256 10e7575daf3fe06d430713e5bf32ea68077c693a1aa82138209a85f8cbb715aa

See more details on using hashes here.

File details

Details for the file openPMD_api-0.9.0a1-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: openPMD_api-0.9.0a1-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 2.9 MB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/40.0.0 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.5.3

File hashes

Hashes for openPMD_api-0.9.0a1-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 822f03bd9f0c7bf6915d61b810769b577682069bd527ae875bd97aa734dc6901
MD5 431667e12d7be4b3b3228d22fedc3c09
BLAKE2b-256 a9a2134d74441bd8b019af18cd319c12b71088cfc9fafdb320bca02d621488ae

See more details on using hashes here.

File details

Details for the file openPMD_api-0.9.0a1-cp36-cp36m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: openPMD_api-0.9.0a1-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 2.9 MB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/40.0.0 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.5.3

File hashes

Hashes for openPMD_api-0.9.0a1-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 f02b71843ccd10b18ce3a1abf085a1f95affd35bafee27cc00703f5396eca1ce
MD5 ab95d4884c5942c60558d26dd1340b53
BLAKE2b-256 c8cd7c08ef9a961963e29c411638d48adac0780511be36ad93a7835c1165c0a7

See more details on using hashes here.

File details

Details for the file openPMD_api-0.9.0a1-cp35-cp35m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: openPMD_api-0.9.0a1-cp35-cp35m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 2.9 MB
  • Tags: CPython 3.5m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/40.0.0 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.5.3

File hashes

Hashes for openPMD_api-0.9.0a1-cp35-cp35m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 16ae568b0de2c4fc3307de61b1a03704dd9500b5f097cf3fad35b2cd1b51cb43
MD5 7e7a02f8fb258a3ea63bba78d57ed2cd
BLAKE2b-256 c9340e2fba03db3dafcceb140235cc789db51faaec4304a42eda9caf3ec39c43

See more details on using hashes here.

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