Skip to main content

Python interface to PartMC

Project description

logo

PyPartMC

PyPartMC is a Python interface to PartMC, a particle-resolved Monte-Carlo code for atmospheric aerosol simulation. PyPartMC is implemented in C++ and it also constitutes a C++ API to the PartMC Fortran internals. The Python API can facilitate using PartMC from other environments - see, e.g., Julia and Matlab examples below.

For an outline of the project, rationale, architecture, and features, refer to: D'Aquino et al., 2023 (arXiv) (please cite if PyPartMC is used in your research). For a list of talks and other relevant resources, please see project Wiki.

US Funding License: GPL v3 Copyright Github Actions Build Status API docs DOI PyPI version

TL;DR (try in a Jupyter notebook)

Python 3 Linux OK macOS OK Windows OK Jupyter

! pip install PyPartMC
import PyPartMC

Jupyter notebooks with examples

Note: clicking the badges below redirects to cloud-computing platforms. The mybinder.org links allow anonymous execution, Google Colab requires logging in with a Google account, ARM JupyerHub requires logging in with an ARM account (and directing Jupyter to a particular notebook within the examples folder).

  • Urban plume scenario demo (as in PartMC):
    View notebook Open In Colab Binder ARM JupyterHub
  • Dry-Wet Particle Size Equilibration with PartMC and PySDM:
    View notebook Open In Colab Binder ARM JupyterHub Voila
  • Simulation output processing example (loading from netCDF files using PyPartMC):
    View notebook Open In Colab Binder ARM JupyterHub
  • Optical properties calculation using external Python package (PyMieScatt):
    View notebook Open In Colab Binder ARM JupyterHub

Features

  • works on Linux, macOS and Windows (compatibility assured with CI builds)
  • hassle-free installation using pip (prior PartMC installation not needed)
  • works out of the box on mybinder.org, Google Colab and alike
  • ships with a set of examples maintained in a form of Jupyter notebooks
  • Pythonic API (but retaining PartMC jargon) incl. Python GC deallocation of Fortran objects
  • specification of parameters using native Python datatypes (lists, dicts) in place of PartMC spec files
  • code snippets in README depicting how to use PyPartMC from Julia and Matlab (also executed on CI)
  • auto-generated API docs on the web
  • support for [de]serialization of selected wrapped structures using JSON
  • based on unmodified PartMC code
  • does not use or require shell or any pre-installed libraries
  • aiming at 100% unit test coverage

Usage examples

The listings below depict how the identical task of randomly sampling particles from an aerosol size distribution in PartMC can be done in different programming languages.

For a Fortran equivalent of the Python, Julia and Matlab programs below, see the readme_fortran folder.

Python

import numpy as np

import PyPartMC as ppmc
from PyPartMC import si

aero_data = ppmc.AeroData((
    #      [density, ions in solution, molecular weight, kappa]
    {"OC": [1000 *si.kg/si.m**3, 0, 1e-3 *si.kg/si.mol, 0.001]},
    {"BC": [1800 *si.kg/si.m**3, 0, 1e-3 *si.kg/si.mol, 0]},
))

aero_dist = ppmc.AeroDist(
    aero_data,
    [{
        "cooking": {
            "mass_frac": [{"OC": [1]}],
            "diam_type": "geometric",
            "mode_type": "log_normal",
            "num_conc": 3200 / si.cm**3,
            "geom_mean_diam": 8.64 * si.nm,
            "log10_geom_std_dev": 0.28,
        }
    },
    {
        "diesel": {
            "mass_frac": [{"OC": [0.3]}, {"BC": [0.7]}],
            "diam_type": "geometric",
            "mode_type": "log_normal",
            "num_conc": 2900 / si.cm**3,
            "geom_mean_diam": 50 * si.nm,
            "log10_geom_std_dev": 0.24,
        }
    }],
)

n_part = 100
aero_state = ppmc.AeroState(aero_data, n_part, "nummass_source")
aero_state.dist_sample(aero_dist)
print(np.dot(aero_state.masses(), aero_state.num_concs), "# kg/m3")

Julia (using PyCall.jl)

using Pkg
Pkg.add("PyCall")

using PyCall
ppmc = pyimport("PyPartMC")
si = ppmc["si"]

aero_data = ppmc.AeroData((
  #       (density, ions in solution, molecular weight, kappa)
  Dict("OC"=>(1000 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0.001)),
  Dict("BC"=>(1800 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0))
))

aero_dist = ppmc.AeroDist(aero_data, (
  Dict( 
    "cooking" => Dict(
      "mass_frac" => (Dict("OC" => (1,)),),
      "diam_type" => "geometric",
      "mode_type" => "log_normal",
      "num_conc" => 3200 / si.cm^3,
      "geom_mean_diam" => 8.64 * si.nm,
      "log10_geom_std_dev" => .28,
    )
  ),
  Dict( 
    "diesel" => Dict(
      "mass_frac" => (Dict("OC" => (.3,)), Dict("BC" => (.7,))),
      "diam_type" => "geometric",
      "mode_type" => "log_normal",
      "num_conc" => 2900 / si.cm^3,
      "geom_mean_diam" => 50 * si.nm,
      "log10_geom_std_dev" => .24,
    )
  )
))

n_part = 100
aero_state = ppmc.AeroState(aero_data, n_part, "nummass_source")
aero_state.dist_sample(aero_dist)
print(aero_state.masses()'aero_state.num_concs, "# kg/m3")

Matlab (using Matlab's built-in Python interface)

notes (see the PyPartMC Matlab CI workflow for an example on how to achieve it on Ubuntu 20):

  • Matlab ships with convenience copies of C, C++ and Fortran runtime libraries which are dlopened() by default; one way to make PyPartMC OK with it is to [pip-]install by compiling from source using the very same version of GCC that Matlab borrowed these libraries from (e.g., GCC 9 for Matlab R2022a, etc);
  • Matlab needs to use the same Python interpretter/venv as the pip invocation used to install PyPartMC;
  • a single-line pybind11_builtins.py file with just pybind11_type=type inside needs to be placed within Matlab's PYTHONPATH to sort out a Matlab-pybind11 incompatibility.
ppmc = py.importlib.import_module('PyPartMC');
si = py.importlib.import_module('PyPartMC').si;

aero_data = ppmc.AeroData(py.tuple({ ...
  py.dict(pyargs("OC", py.tuple({1000 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0.001}))), ...
  py.dict(pyargs("BC", py.tuple({1800 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0}))) ...
}));

aero_dist = ppmc.AeroDist(aero_data, py.tuple({ ...
  py.dict(pyargs( ...
    "cooking", py.dict(pyargs( ...
      "mass_frac", py.tuple({py.dict(pyargs("OC", py.tuple({1})))}), ...
      "diam_type", "geometric", ...
      "mode_type", "log_normal", ...
      "num_conc", 3200 / si.cm^3, ...
      "geom_mean_diam", 8.64 * si.nm, ...
      "log10_geom_std_dev", .28 ...
    )) ...
  )), ...
  py.dict(pyargs( ... 
    "diesel", py.dict(pyargs( ...
      "mass_frac", py.tuple({ ...
        py.dict(pyargs("OC", py.tuple({.3}))), ...
        py.dict(pyargs("BC", py.tuple({.7}))), ...
      }), ...
      "diam_type", "geometric", ...
      "mode_type", "log_normal", ...
      "num_conc", 2900 / si.cm^3, ...
      "geom_mean_diam", 50 * si.nm, ...
      "log10_geom_std_dev", .24 ...
    )) ...
  )) ...
}));

n_part = 100;
aero_state = ppmc.AeroState(aero_data, n_part, "nummass_source");
aero_state.dist_sample(aero_dist);
masses = cell(aero_state.masses());
num_concs = cell(aero_state.num_concs);
fprintf('%g # kg/m3\n', dot([masses{:}], [num_concs{:}]))

usage in other projects

PyPartMC is used within the test workflow of the PySDM project.

Implementation outline

  • PyPartMC is written in C++, Fortran and uses pybind11 and CMake.
  • JSON support is handled with nlohmann::json and pybind11_json
  • PartMC and selected parts of SUNDIALS are statically linked (and compiled in during pip install or python -m build)
  • C (SUNDIALS, netCDF), C++ (pybind11, ...) and Fortran (PartMC, CAMP, netCDF-fortran) dependencies are linked through git submodules
  • MOSAIC dependency is optionally linked through setting the environmental variable MOSAIC_HOME
  • a drop-in replacement of the PartMC spec file routines is used for i/o from/to JSON

Implementation architecture

flowchart TD
    subgraph J ["Julia"]
        julia_user_code["Julia user code"] --> PyCall.jl
    end
    subgraph M ["Matlab"]
        matlab_user_code["Matlab user code"] --> matlab_python["Matlab built-in\nPython interface"]
    end
    subgraph P ["Python"]
        python_user_code -.-> NumPy
        python_user_code["Python user code"] ---> PyPartMC["pubind11-generated\nPyPartMC module"]
        matlab_python --> PyPartMC
        PyCall.jl --> PyPartMC
    end
    subgraph Cpp ["C++"]
        cpp_user_code["C++ user code"] ----> ppmc_cpp
        PyPartMC --> ppmc_cpp["PyPartMC-C++"]
        ppmc_cpp --> pybind11_json
        pybind11_json ---> nlohmann::JSON
        fake_spec_file_cpp --> nlohmann::JSON
    end
    subgraph C ["C"]
        fake_spec_file_c --> fake_spec_file_cpp["SpecFile-C++"]
        ppmc_cpp --> ppmc_c["PyPartMC-C"]
        netCDF-C
        SUNDIALS
        camp_c["CAMP C code"]
    end
    subgraph Fortran ["Fortran"]
        PartMC -....-> MOSAIC
        ppmc_c --> ppmc_f["PyPartMC-F"]
        ppmc_f ---> PartMC
        PartMC --> netCDF-F
        netCDF-F --> netCDF-C
        PartMC --> SUNDIALS
        PartMC ---> camp_f
        camp_f["CAMP"] --> camp_c
        PartMC ----> fake_spec_file_f[SpecFile-F]
        fake_spec_file_f --> fake_spec_file_c["SpecFile-C"]
    end

    style PartMC fill:#7ae7ff,stroke-width:2px,color:#2B2B2B

FAQ

  • Q: Why pip install PyPartMC triggers compilation on my brand new Apple machine, while it quickly downloads and installs binary packages when executed on older Macs, Windows or Linux?
    A: We are not yet providing binary wheels on PyPI for Apple-silicon (arm64) machines. Cross-compilation with gfortran is only supported with experimental unofficial builds and is tricky, while Github Actions ARM64 virtual machines are costly.

  • Q: Why some of the constructors expect data to be passed as lists of single-entry dictionaries instead of multi-element dictionaries?
    A: This is intentional and related with PartMC relying on the order of elements within spec-file input; while Python dictionaries preserve ordering (insertion order), JSON format does not, and we intend to make these data structures safe to be [de]serialized using JSON.

  • Q: How to check the version of PartMC that PyPartMC was compiled against?
    A: Version numbers of compile-time dependencies of PyPartMC, including PartMC, can be accessed as follows:

import PyPartMC
PyPartMC.__versions_of_build_time_dependencies__['PartMC']

Troubleshooting

Common installation issues

error: [Errno 2] No such file or directory: 'cmake'

Try rerunning after installing CMake, e.g., using apt-get install cmake (Ubuntu/Debian), brew install cmake (homebrew on macOS) or using MSYS2 on Windows.

No CMAKE_Fortran_COMPILER could be found.

Try installing a Fortran compiler (e.g., brew reinstall gcc with Homebrew on macOS or using MSYS2 on Windows).

Could not find NC_M4 using the following names: m4, m4.exe

Try installing m4 (e.g., using MSYS2 on Windows).

Notes for developers

How to debug

git clone --recursive git+https://github.com/open-atmos/PyPartMC.git
cd PyPartMC
DEBUG=1 VERBOSE=1 pip --verbose install -e .
gdb python 
(gdb) run -m pytest -s -vv -We -p no:unraisableexception tests

Pre-commit hooks

PyPartMC codebase benefits from Pylint, Black and isort code analysis (which are all part of the CI workflows where we also use pre-commit hooks. The pre-commit hooks can be run locally, and then the resultant changes need to be staged before committing. To set up the hooks locally, install pre-commit via pip install pre-commit and set up the git hooks via pre-commit install (this needs to be done every time you clone the project). To run all pre-commit hooks, run pre-commit run --all-files. The .pre-commit-config.yaml file can be modified in case new hooks are to be added or existing ones need to be altered.

Credits

PyPartMC:

authors: PyPartMC developers
funding: US Department of Energy Atmospheric System Research programme
copyright: University of Illinois at Urbana-Champaign
licence: GPL v3

PartMC:

authors: Nicole Riemer, Matthew West, Jeff Curtis et al.
licence: GPL v2 or later

Project details


Release history Release notifications | RSS feed

This version

1.0.3

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

PyPartMC-1.0.3.tar.gz (2.4 MB view details)

Uploaded Source

Built Distributions

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

PyPartMC-1.0.3-cp311-cp311-win_amd64.whl (1.9 MB view details)

Uploaded CPython 3.11Windows x86-64

PyPartMC-1.0.3-cp311-cp311-manylinux_2_24_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64

PyPartMC-1.0.3-cp311-cp311-macosx_12_0_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11macOS 12.0+ x86-64

PyPartMC-1.0.3-cp310-cp310-win_amd64.whl (1.9 MB view details)

Uploaded CPython 3.10Windows x86-64

PyPartMC-1.0.3-cp310-cp310-manylinux_2_24_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64

PyPartMC-1.0.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.12+ x86-64

PyPartMC-1.0.3-cp310-cp310-macosx_12_0_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10macOS 12.0+ x86-64

PyPartMC-1.0.3-cp39-cp39-win_amd64.whl (1.9 MB view details)

Uploaded CPython 3.9Windows x86-64

PyPartMC-1.0.3-cp39-cp39-manylinux_2_24_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.24+ x86-64

PyPartMC-1.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

PyPartMC-1.0.3-cp39-cp39-macosx_12_0_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9macOS 12.0+ x86-64

PyPartMC-1.0.3-cp38-cp38-win_amd64.whl (1.9 MB view details)

Uploaded CPython 3.8Windows x86-64

PyPartMC-1.0.3-cp38-cp38-manylinux_2_24_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.24+ x86-64

PyPartMC-1.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

PyPartMC-1.0.3-cp38-cp38-macosx_12_0_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.8macOS 12.0+ x86-64

PyPartMC-1.0.3-cp37-cp37m-win_amd64.whl (1.9 MB view details)

Uploaded CPython 3.7mWindows x86-64

PyPartMC-1.0.3-cp37-cp37m-manylinux_2_24_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.24+ x86-64

PyPartMC-1.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

PyPartMC-1.0.3-cp37-cp37m-macosx_12_0_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.7mmacOS 12.0+ x86-64

File details

Details for the file PyPartMC-1.0.3.tar.gz.

File metadata

  • Download URL: PyPartMC-1.0.3.tar.gz
  • Upload date:
  • Size: 2.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for PyPartMC-1.0.3.tar.gz
Algorithm Hash digest
SHA256 cfb4e3ec7c5a151ffb103f5b341f525a3f650325cceba76567890cb1a66c3343
MD5 1718a8f25222278d778d33444d0ae2eb
BLAKE2b-256 849dc1b8520a6ec7a037430f5a4de4d6c42539d42760c7552a9cbc976cb70755

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: PyPartMC-1.0.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for PyPartMC-1.0.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2ab7f8aaab9e2fc6a833f8926bce492ff2bfa9c138747b2393070cb86f5515b4
MD5 294d7074c6ef72d4645a752a1ad17a8b
BLAKE2b-256 872025f6fcc2731f6b860a52d13492eb70c48f9253cc46849a5e2a5d18c5ebca

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp311-cp311-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp311-cp311-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 447a961281a6fd31da79968adaa3107bc7a036265c2945b52d83d23981c81315
MD5 3c3cf131143df3bf830cc9756a428d6b
BLAKE2b-256 c722e1f5a4daf20ef912bf4ef61bfe4475057357f8295dcf65c23b073149a689

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp311-cp311-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp311-cp311-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 d6ff4e7a3ef60d4c3d9883fcf68d2a624ac3df922cfd3a826e25f2cf97cf5137
MD5 8e469492604500719024b624594c78cc
BLAKE2b-256 dd53a0225a259b77187a1a7057c1c9aa3dd60e001ef03858f7fd72a0439b52f4

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: PyPartMC-1.0.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for PyPartMC-1.0.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6eb4d3b3f396740e21792edf4357077a4cd2558e5983292f161f0bfc698582c4
MD5 4701647235d34ef79aeec9dfbdc4c42a
BLAKE2b-256 902d19c6b46fe4daa95b188740e79e91a11d162b567fea62a255de62429c35db

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp310-cp310-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp310-cp310-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 0f4d634722b22c9631c65cb0f63ba5610c2f7e8b6e1344bbb3a7a29c8807755b
MD5 95b0f0d607821d16711d4fcc70bb6883
BLAKE2b-256 c53095255cefcc6b780459e57b6e23c0281ba687334b5d30b8c7988189e21a70

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 af42b3739b2b5d504d9fae25d7b5fb5c950362a1024c90af474b04c97901444f
MD5 b70c9266c3ae24a3aa56a66adce05f13
BLAKE2b-256 0d3b62041c282a417f4a8845382a347afa5fd036a081f76621187ac515fd9226

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp310-cp310-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp310-cp310-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 b3aea3b46dabf963d9f99e8fb9d78f2412cf10f08e08b9c99419c5989d6f9226
MD5 f73078132b772ea0ec359ad8a539fae8
BLAKE2b-256 0058b2d604aa2ccf80728d4bf5cf879fbd3a2decde12be60abbb23862398f1da

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: PyPartMC-1.0.3-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for PyPartMC-1.0.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 eb1bc4d4b11c663c0a58dd878d633002d1e4fb662f96f41729fadf91f02f7bae
MD5 85f76daa868f026787cc980ffa3445ad
BLAKE2b-256 394032605c16badacd233f900debac50d52fc3543cd708500bbcee62a79fb2b2

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp39-cp39-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp39-cp39-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 03244c1d6e33f2f17a9b96af080b0bfc516c605a0f9070f70bf2532c45497e38
MD5 509fa5384dfb974b337ec70bde08e8ba
BLAKE2b-256 c41bd953721f2f0ad4fb00e941cb9a2139f010f1176104c896bff1cf70271d3f

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 3f654e49de090e7c44b76b4369bbfbb11b91a35e36523893d6c5eeaa351be391
MD5 1cc20f8b26de817bd0b4dce8ba7bf992
BLAKE2b-256 3bf79494e0e35de1cc831d6766f483c7e2c1b8bea1fc1de6086f1927ccfbb266

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp39-cp39-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp39-cp39-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 3cd028950e10280ca8c6c894287561b3eec8040d4b1645567067503b37e57f57
MD5 128f15d7e2614a2cb472b4f41dc6656a
BLAKE2b-256 6e5efc85af80a552f2a148129cb4f3721fedf023e86496283cfa6ee87151932a

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: PyPartMC-1.0.3-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for PyPartMC-1.0.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 2028612f96bc3f6dcbee5dc12deeb506949d922403d14106174a7525951c7752
MD5 ce85011e56c70453fa32ac3d81239a1b
BLAKE2b-256 024e60dbd2f8d99bb16884cb92a5c50b46dbe75fbe4a66cc641f61fcba4b58be

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp38-cp38-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp38-cp38-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 326a275024ff17961eb541bb89a91005f584ae9ad970ef95fb4d827bfb434a81
MD5 eeb510457ef36dac8aa8bbdaf3486f87
BLAKE2b-256 b2631ffa8aa87a246cf3cb30658af059b16548fc04fe811a7e9e304d5b705ded

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 1c7337bbc175dee1328bb87ffe604c3fc65fb48697d618e26fa50738225dc8f2
MD5 8ced010213d7d7316c9eab0d514362ef
BLAKE2b-256 16dd3f1433097f83ecd4d0ee7426ff33b68a8e5c29d54b63d525ca64eaed8bfd

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp38-cp38-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp38-cp38-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 2a1fc6de13d41beb33409b8b4c5f72309d06c385cfe5b3106fe2f45c7c4010d1
MD5 51cd49f1beb05e2a82e3e2d5349f0d34
BLAKE2b-256 2f4d57e1ce9a5dc851eb41c647dda463f026ea2dd166ba2ec232cf5dbb421902

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: PyPartMC-1.0.3-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for PyPartMC-1.0.3-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 b42077d79dfaa961cad31e290a5c681454851a1c9e8a20fd7d1fc62ffb77acc9
MD5 aa1ce014b6169ce6e61e78f4062d8104
BLAKE2b-256 4a43143616eda74a23df26b5d03514f42e008cf6449ae62a763baa0244c7132d

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp37-cp37m-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp37-cp37m-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 f23a7724b897a8e93fee79361e2430fe48e78d8a7ff96a1bc65262944ecfc721
MD5 9750a09f972c9eb9a9f2a7ecb1c5884b
BLAKE2b-256 214020924ed6627c0077de40be20e917c3a9e72b9e5717cc8e22f8a7bbc3362b

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 67513828eb3dae0fbc6cc219876ebbd80510a8e479346ce61d16b8b49dc71096
MD5 9941bb1c51bbaca8e7b4de41668fc6cc
BLAKE2b-256 79f5412fdf2d6cb8e8a4abfa0a4ac5564b1b9f925aa55fa1021eb12e33189bf7

See more details on using hashes here.

File details

Details for the file PyPartMC-1.0.3-cp37-cp37m-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for PyPartMC-1.0.3-cp37-cp37m-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 e3554fe05553cf069c1ab9fe83af9f0d4d8fe4ce7ae3bef7822c5533e5b1bccb
MD5 2944d11af058c74b9f1eaec1d8971147
BLAKE2b-256 fddcb89c371af19030fbdcde6ea31d6e81e80219d99a527c2244afe4daaf721e

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