
# PyPartMC
PyPartMC is a Python interface to [PartMC](https://lagrange.mechse.illinois.edu/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., 2024 (SoftwareX)](https://doi.org/10.1016/j.softx.2023.101613) (please cite if PyPartMC is used in your research).
For a list of talks and other relevant resources, please see [project Wiki](https://github.com/open-atmos/PyPartMC/wiki/).
If interested in contributing to PyPartMC, please have a look a the [notes for developers](https://github.com/open-atmos/PyPartMC/tree/main/CONTRIBUTING.md).
[](https://asr.science.energy.gov/) [](https://www.ncn.gov.pl/?language=en)
[](https://www.gnu.org/licenses/gpl-3.0.html)
[](https://atmos.illinois.edu/)
[](https://github.com/open-atmos/PyPartMC/actions)
[](https://open-atmos.github.io/PyPartMC/)
[](https://doi.org/10.5281/zenodo.7662635)
[](https://pypi.org/p/PyPartMC)
## TL;DR (try in a Jupyter notebook)
[](https://www.python.org/)
[](https://en.wikipedia.org/wiki/Linux)
[](https://en.wikipedia.org/wiki/macOS)
[](https://en.wikipedia.org/wiki/Windows)
[](https://jupyter.org/)
```python
! 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](https://github.com/compdyn/partmc/tree/master/scenarios/1_urban_plume)):
[](https://github.com/open-atmos/PyPartMC/blob/main/examples/particle_simulation.ipynb)
[](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/particle_simulation.ipynb)
[](https://mybinder.org/v2/gh/open-atmos/PyPartMC.git/main?urlpath=lab/tree/examples/particle_simulation.ipynb)
[](https://jupyterhub.arm.gov/hub/user-redirect/git-pull?repo=https%3A//github.com/open-atmos/PyPartMC&branch=main&urlPath=)
- Dry-Wet Particle Size Equilibration with PartMC and PySDM:
[](https://github.com/open-atmos/PyPartMC/blob/main/examples/lognorm_ex.ipynb)
[](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/lognorm_ex.ipynb)
[](https://mybinder.org/v2/gh/open-atmos/PyPartMC.git/main?urlpath=lab/tree/examples/lognorm_ex.ipynb)
[](https://jupyterhub.arm.gov/hub/user-redirect/git-pull?repo=https%3A//github.com/open-atmos/PyPartMC&branch=main&urlPath=)
[](https://mybinder.org/v2/gh/open-atmos/PyPartMC/main?urlpath=voila%2Frender%2Fexamples%2Flognorm_ex.ipynb)
- Simulation output processing example (loading from netCDF files using PyPartMC):
[](https://github.com/open-atmos/PyPartMC/blob/main/examples/process_simulation_output.ipynb)
[](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/process_simulation_output.ipynb)
[](https://mybinder.org/v2/gh/open-atmos/PyPartMC.git/main?urlpath=lab/tree/examples/process_simulation_output.ipynb)
[](https://jupyterhub.arm.gov/hub/user-redirect/git-pull?repo=https%3A//github.com/open-atmos/PyPartMC&branch=main&urlPath=)
- Optical properties calculation using external Python package ([PyMieScatt](https://pymiescatt.readthedocs.io/en/latest/)):
[](https://github.com/open-atmos/PyPartMC/blob/main/examples/mie_optical.ipynb)
[](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/mie_optical.ipynb)
[](https://mybinder.org/v2/gh/open-atmos/PyPartMC.git/main?urlpath=lab/tree/examples/mie_optical.ipynb)
[](https://jupyterhub.arm.gov/hub/user-redirect/git-pull?repo=https%3A//github.com/open-atmos/PyPartMC&branch=main&urlPath=)
- Cloud parcel example featuring supersaturation-evolution-coupled CCN activation and drop growth:
[](https://github.com/open-atmos/PyPartMC/blob/main/examples/cloud_parcel.ipynb)
[](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/cloud_parcel.ipynb)
[](https://mybinder.org/v2/gh/open-atmos/PyPartMC.git/main?urlpath=lab/tree/examples/cloud_parcel.ipynb)
[](https://jupyterhub.arm.gov/hub/user-redirect/git-pull?repo=https%3A//github.com/open-atmos/PyPartMC&branch=main&urlPath=)
## Features
- works on Linux, macOS and Windows (compatibility assured with [CI builds](https://github.com/open-atmos/PyPartMC/blob/main/.github/workflows/tests.yml))
- hassle-free installation using `pip` (prior PartMC installation **not needed**)
- works out of the box on [mybinder.org](https://mybinder.org/), [Google Colab](colab.research.google.com/) and alike
- ships with [a set of examples](https://github.com/open-atmos/PyPartMC/tree/main/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](https://open-atmos.github.io/PyPartMC/)
- support for [de]serialization of selected wrapped structures using JSON
- based on [unmodified PartMC code](https://github.com/open-atmos/PyPartMC/tree/main/gitmodules)
- does not use or require shell or any pre-installed libraries
- aiming at 100% [unit test coverage](https://github.com/open-atmos/PyPartMC/tree/main/tests)
## 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](https://github.com/open-atmos/PyPartMC/tree/main/readme_fortran).
#### Python
```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](https://github.com/JuliaPy/PyCall.jl))
```Julia
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](https://www.mathworks.com/help/matlab/python-language.html))
notes (see the [PyPartMC Matlab CI workflow](https://github.com/open-atmos/PyPartMC/blob/main/.github/workflows/readme_listings.yml) 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](https://www.mathworks.com/support/requirements/supported-compilers-linux.html));
- Matlab needs to [use the same Python interpretter/venv](https://www.mathworks.com/support/requirements/python-compatibility.html) 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](https://github.com/pybind/pybind11/issues/3945).
````Matlab
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](https://github.com/atmos-cloud-sim-uj/PySDM/tree/main/tests/smoke_tests/box/partmc).
## FAQ
- Q: How to install PyPartMC with MOSAIC enabled?
A: Installation can be done using `pip`, however, `pip` needs to be instructed not to use binary packages available at pypi.org but rather to compile from source (pip will download the source from pip.org), and the path to compiled MOSAIC library needs to be provided at compile-time; the following command should convey it:
```bash
MOSAIC_HOME=<<PATH_TO_MOSAIC_LIB>> pip install --force-reinstall --no-binary=PyPartMC PyPartMC
```
- 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 providing binary wheels on PyPI for Apple-silicon (arm64) machines for selected macOS version made available by Github. In case the macOS version you are using is newer, compilation from source is triggered.
- 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:
```Python
import PyPartMC
PyPartMC.__versions_of_build_time_dependencies__['PartMC']
```
- Q: Why m4 and perl are required at compile time?
A: PyPartMC includes parts of netCDF and HDF5 codebases which depend on m4 and perl, respectively, for generating source files before compilation.
## 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](https://www.msys2.org/docs/cmake/) 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](https://packages.msys2.org/package/mingw-w64-x86_64-gcc-fortran?repo=mingw64) on Windows).
```
Could not find NC_M4 using the following names: m4, m4.exe
```
Try installing `m4` (e.g., using [MSYS2](https://packages.msys2.org/package/m4?repo=msys&variant=x86_64) on Windows).
## Credits
#### PyPartMC:
authors: [PyPartMC developers](https://github.com/open-atmos/PyPartMC/graphs/contributors)
funding: [US Department of Energy Atmospheric System Research programme](https://asr.science.energy.gov/), [Polish National Science Centre](https://ncn.gov.pl/en)
copyright: [University of Illinois at Urbana-Champaign](https://atmos.illinois.edu/)
licence: [GPL v3](https://www.gnu.org/licenses/gpl-3.0.en.html)
#### PartMC:
authors: [Nicole Riemer](https://www.atmos.uiuc.edu/~nriemer/), [Matthew West](https://lagrange.mechse.illinois.edu/mwest/), [Jeff Curtis](https://publish.illinois.edu/jcurtis2/) et al.
licence: [GPL v2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or later
Raw data
{
"_id": null,
"home_page": null,
"name": "PyPartMC",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": null,
"author": "PyPartMC team (see https://github.com/open-atmos/PyPartMC/graphs/contributors)",
"author_email": "nriemer@illinois.edu",
"download_url": "https://files.pythonhosted.org/packages/22/8a/7de8efdbd5a709becb37570c5cfab1e3eb3514d6e988aad19000f5aa3f7f/PyPartMC-1.3.5.tar.gz",
"platform": null,
"description": "\n\n# PyPartMC\n\nPyPartMC is a Python interface to [PartMC](https://lagrange.mechse.illinois.edu/partmc/), \n a particle-resolved Monte-Carlo code for atmospheric aerosol simulation.\nPyPartMC is implemented in C++ and it also constitutes a C++ API to the PartMC Fortran internals.\nThe Python API can facilitate using PartMC from other environments - see, e.g., Julia and Matlab examples below.\n\nFor an outline of the project, rationale, architecture, and features, refer to: [D'Aquino et al., 2024 (SoftwareX)](https://doi.org/10.1016/j.softx.2023.101613) (please cite if PyPartMC is used in your research).\nFor a list of talks and other relevant resources, please see [project Wiki](https://github.com/open-atmos/PyPartMC/wiki/).\nIf interested in contributing to PyPartMC, please have a look a the [notes for developers](https://github.com/open-atmos/PyPartMC/tree/main/CONTRIBUTING.md).\n\n[](https://asr.science.energy.gov/) [](https://www.ncn.gov.pl/?language=en)\n \n[](https://www.gnu.org/licenses/gpl-3.0.html)\n[](https://atmos.illinois.edu/)\n[](https://github.com/open-atmos/PyPartMC/actions)\n[](https://open-atmos.github.io/PyPartMC/)\n[](https://doi.org/10.5281/zenodo.7662635)\n[](https://pypi.org/p/PyPartMC)\n\n## TL;DR (try in a Jupyter notebook)\n\n[](https://www.python.org/)\n[](https://en.wikipedia.org/wiki/Linux)\n[](https://en.wikipedia.org/wiki/macOS)\n[](https://en.wikipedia.org/wiki/Windows)\n[](https://jupyter.org/)\n\n```python\n! pip install PyPartMC\nimport PyPartMC\n```\n\n#### Jupyter notebooks with examples \nNote: 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).\n\n- Urban plume scenario demo (as in [PartMC](https://github.com/compdyn/partmc/tree/master/scenarios/1_urban_plume)): \n[](https://github.com/open-atmos/PyPartMC/blob/main/examples/particle_simulation.ipynb) \n[](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/particle_simulation.ipynb) \n[](https://mybinder.org/v2/gh/open-atmos/PyPartMC.git/main?urlpath=lab/tree/examples/particle_simulation.ipynb)\n[](https://jupyterhub.arm.gov/hub/user-redirect/git-pull?repo=https%3A//github.com/open-atmos/PyPartMC&branch=main&urlPath=) \n- Dry-Wet Particle Size Equilibration with PartMC and PySDM: \n[](https://github.com/open-atmos/PyPartMC/blob/main/examples/lognorm_ex.ipynb) \n[](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/lognorm_ex.ipynb)\n[](https://mybinder.org/v2/gh/open-atmos/PyPartMC.git/main?urlpath=lab/tree/examples/lognorm_ex.ipynb)\n[](https://jupyterhub.arm.gov/hub/user-redirect/git-pull?repo=https%3A//github.com/open-atmos/PyPartMC&branch=main&urlPath=)\n[](https://mybinder.org/v2/gh/open-atmos/PyPartMC/main?urlpath=voila%2Frender%2Fexamples%2Flognorm_ex.ipynb)\n- Simulation output processing example (loading from netCDF files using PyPartMC): \n[](https://github.com/open-atmos/PyPartMC/blob/main/examples/process_simulation_output.ipynb)\n[](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/process_simulation_output.ipynb)\n[](https://mybinder.org/v2/gh/open-atmos/PyPartMC.git/main?urlpath=lab/tree/examples/process_simulation_output.ipynb)\n[](https://jupyterhub.arm.gov/hub/user-redirect/git-pull?repo=https%3A//github.com/open-atmos/PyPartMC&branch=main&urlPath=)\n- Optical properties calculation using external Python package ([PyMieScatt](https://pymiescatt.readthedocs.io/en/latest/)): \n[](https://github.com/open-atmos/PyPartMC/blob/main/examples/mie_optical.ipynb)\n[](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/mie_optical.ipynb)\n[](https://mybinder.org/v2/gh/open-atmos/PyPartMC.git/main?urlpath=lab/tree/examples/mie_optical.ipynb)\n[](https://jupyterhub.arm.gov/hub/user-redirect/git-pull?repo=https%3A//github.com/open-atmos/PyPartMC&branch=main&urlPath=)\n- Cloud parcel example featuring supersaturation-evolution-coupled CCN activation and drop growth: \n[](https://github.com/open-atmos/PyPartMC/blob/main/examples/cloud_parcel.ipynb)\n[](https://colab.research.google.com/github/open-atmos/PyPartMC/blob/main/examples/cloud_parcel.ipynb)\n[](https://mybinder.org/v2/gh/open-atmos/PyPartMC.git/main?urlpath=lab/tree/examples/cloud_parcel.ipynb)\n[](https://jupyterhub.arm.gov/hub/user-redirect/git-pull?repo=https%3A//github.com/open-atmos/PyPartMC&branch=main&urlPath=)\n\n## Features\n\n- works on Linux, macOS and Windows (compatibility assured with [CI builds](https://github.com/open-atmos/PyPartMC/blob/main/.github/workflows/tests.yml))\n- hassle-free installation using `pip` (prior PartMC installation **not needed**)\n- works out of the box on [mybinder.org](https://mybinder.org/), [Google Colab](colab.research.google.com/) and alike\n- ships with [a set of examples](https://github.com/open-atmos/PyPartMC/tree/main/examples) maintained in a form of Jupyter notebooks\n- Pythonic API (but retaining PartMC jargon) incl. Python GC deallocation of Fortran objects\n- specification of parameters using native Python datatypes (lists, dicts) in place of PartMC spec files\n- code snippets in README depicting how to use PyPartMC from Julia and Matlab (also executed on CI)\n- auto-generated [API docs on the web](https://open-atmos.github.io/PyPartMC/)\n- support for [de]serialization of selected wrapped structures using JSON \n- based on [unmodified PartMC code](https://github.com/open-atmos/PyPartMC/tree/main/gitmodules)\n- does not use or require shell or any pre-installed libraries\n- aiming at 100% [unit test coverage](https://github.com/open-atmos/PyPartMC/tree/main/tests)\n\n## Usage examples\n\nThe listings below depict how the identical task of randomly sampling particles from an aerosol size distribution in PartMC can be\ndone in different programming languages.\n\nFor a Fortran equivalent of the Python, Julia and Matlab programs below, see the [`readme_fortran` folder](https://github.com/open-atmos/PyPartMC/tree/main/readme_fortran).\n\n#### Python\n\n```Python\nimport numpy as np\n\nimport PyPartMC as ppmc\nfrom PyPartMC import si\n\naero_data = ppmc.AeroData((\n # [density, ions in solution, molecular weight, kappa]\n {\"OC\": [1000 *si.kg/si.m**3, 0, 1e-3 *si.kg/si.mol, 0.001]},\n {\"BC\": [1800 *si.kg/si.m**3, 0, 1e-3 *si.kg/si.mol, 0]},\n))\n\naero_dist = ppmc.AeroDist(\n aero_data,\n [{\n \"cooking\": {\n \"mass_frac\": [{\"OC\": [1]}],\n \"diam_type\": \"geometric\",\n \"mode_type\": \"log_normal\",\n \"num_conc\": 3200 / si.cm**3,\n \"geom_mean_diam\": 8.64 * si.nm,\n \"log10_geom_std_dev\": 0.28,\n }\n },\n {\n \"diesel\": {\n \"mass_frac\": [{\"OC\": [0.3]}, {\"BC\": [0.7]}],\n \"diam_type\": \"geometric\",\n \"mode_type\": \"log_normal\",\n \"num_conc\": 2900 / si.cm**3,\n \"geom_mean_diam\": 50 * si.nm,\n \"log10_geom_std_dev\": 0.24,\n }\n }],\n)\n\nn_part = 100\naero_state = ppmc.AeroState(aero_data, n_part, \"nummass_source\")\naero_state.dist_sample(aero_dist)\nprint(np.dot(aero_state.masses(), aero_state.num_concs), \"# kg/m3\")\n```\n\n#### Julia (using [PyCall.jl](https://github.com/JuliaPy/PyCall.jl))\n```Julia\nusing Pkg\nPkg.add(\"PyCall\")\n\nusing PyCall\nppmc = pyimport(\"PyPartMC\")\nsi = ppmc[\"si\"]\n\naero_data = ppmc.AeroData((\n # (density, ions in solution, molecular weight, kappa)\n Dict(\"OC\"=>(1000 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0.001)),\n Dict(\"BC\"=>(1800 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0))\n))\n\naero_dist = ppmc.AeroDist(aero_data, (\n Dict( \n \"cooking\" => Dict(\n \"mass_frac\" => (Dict(\"OC\" => (1,)),),\n \"diam_type\" => \"geometric\",\n \"mode_type\" => \"log_normal\",\n \"num_conc\" => 3200 / si.cm^3,\n \"geom_mean_diam\" => 8.64 * si.nm,\n \"log10_geom_std_dev\" => .28,\n )\n ),\n Dict( \n \"diesel\" => Dict(\n \"mass_frac\" => (Dict(\"OC\" => (.3,)), Dict(\"BC\" => (.7,))),\n \"diam_type\" => \"geometric\",\n \"mode_type\" => \"log_normal\",\n \"num_conc\" => 2900 / si.cm^3,\n \"geom_mean_diam\" => 50 * si.nm,\n \"log10_geom_std_dev\" => .24,\n )\n )\n))\n\nn_part = 100\naero_state = ppmc.AeroState(aero_data, n_part, \"nummass_source\")\naero_state.dist_sample(aero_dist)\nprint(aero_state.masses()'aero_state.num_concs, \"# kg/m3\")\n```\n\n#### Matlab (using [Matlab's built-in Python interface](https://www.mathworks.com/help/matlab/python-language.html))\n\nnotes (see the [PyPartMC Matlab CI workflow](https://github.com/open-atmos/PyPartMC/blob/main/.github/workflows/readme_listings.yml) for an example on how to achieve it on Ubuntu 20):\n- 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](https://www.mathworks.com/support/requirements/supported-compilers-linux.html));\n- Matlab needs to [use the same Python interpretter/venv](https://www.mathworks.com/support/requirements/python-compatibility.html) as the pip invocation used to install PyPartMC;\n- 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](https://github.com/pybind/pybind11/issues/3945). \n\n````Matlab\nppmc = py.importlib.import_module('PyPartMC');\nsi = py.importlib.import_module('PyPartMC').si;\n\naero_data = ppmc.AeroData(py.tuple({ ...\n py.dict(pyargs(\"OC\", py.tuple({1000 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0.001}))), ...\n py.dict(pyargs(\"BC\", py.tuple({1800 * si.kg/si.m^3, 0, 1e-3 * si.kg/si.mol, 0}))) ...\n}));\n\naero_dist = ppmc.AeroDist(aero_data, py.tuple({ ...\n py.dict(pyargs( ...\n \"cooking\", py.dict(pyargs( ...\n \"mass_frac\", py.tuple({py.dict(pyargs(\"OC\", py.tuple({1})))}), ...\n \"diam_type\", \"geometric\", ...\n \"mode_type\", \"log_normal\", ...\n \"num_conc\", 3200 / si.cm^3, ...\n \"geom_mean_diam\", 8.64 * si.nm, ...\n \"log10_geom_std_dev\", .28 ...\n )) ...\n )), ...\n py.dict(pyargs( ... \n \"diesel\", py.dict(pyargs( ...\n \"mass_frac\", py.tuple({ ...\n py.dict(pyargs(\"OC\", py.tuple({.3}))), ...\n py.dict(pyargs(\"BC\", py.tuple({.7}))), ...\n }), ...\n \"diam_type\", \"geometric\", ...\n \"mode_type\", \"log_normal\", ...\n \"num_conc\", 2900 / si.cm^3, ...\n \"geom_mean_diam\", 50 * si.nm, ...\n \"log10_geom_std_dev\", .24 ...\n )) ...\n )) ...\n}));\n\nn_part = 100;\naero_state = ppmc.AeroState(aero_data, n_part, \"nummass_source\");\naero_state.dist_sample(aero_dist);\nmasses = cell(aero_state.masses());\nnum_concs = cell(aero_state.num_concs);\nfprintf('%g # kg/m3\\n', dot([masses{:}], [num_concs{:}]))\n````\n\n#### usage in other projects\n\nPyPartMC is used within the [test workflow of the PySDM project](https://github.com/atmos-cloud-sim-uj/PySDM/tree/main/tests/smoke_tests/box/partmc).\n\n## FAQ\n- Q: How to install PyPartMC with MOSAIC enabled? \n A: Installation can be done using `pip`, however, `pip` needs to be instructed not to use binary packages available at pypi.org but rather to compile from source (pip will download the source from pip.org), and the path to compiled MOSAIC library needs to be provided at compile-time; the following command should convey it:\n```bash\nMOSAIC_HOME=<<PATH_TO_MOSAIC_LIB>> pip install --force-reinstall --no-binary=PyPartMC PyPartMC\n```\n\n- 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? \n A: We are providing binary wheels on PyPI for Apple-silicon (arm64) machines for selected macOS version made available by Github. In case the macOS version you are using is newer, compilation from source is triggered. \n\n- Q: Why some of the constructors expect data to be passed as **lists of single-entry dictionaries** instead of multi-element dictionaries? \n 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. \n\n- Q: How to check the version of PartMC that PyPartMC was compiled against? \n A: Version numbers of compile-time dependencies of PyPartMC, including PartMC, can be accessed as follows:\n```Python\nimport PyPartMC\nPyPartMC.__versions_of_build_time_dependencies__['PartMC']\n```\n\n- Q: Why m4 and perl are required at compile time? \n A: PyPartMC includes parts of netCDF and HDF5 codebases which depend on m4 and perl, respectively, for generating source files before compilation.\n\n## Troubleshooting \n\n#### Common installation issues \n```\nerror: [Errno 2] No such file or directory: 'cmake'\n```\nTry rerunning after installing CMake, e.g., using `apt-get install cmake` (Ubuntu/Debian), `brew install cmake` (homebrew on macOS) or using [MSYS2](https://www.msys2.org/docs/cmake/) on Windows.\n\n```\nNo CMAKE_Fortran_COMPILER could be found.\n```\nTry installing a Fortran compiler (e.g., `brew reinstall gcc` with Homebrew on macOS or using [MSYS2](https://packages.msys2.org/package/mingw-w64-x86_64-gcc-fortran?repo=mingw64) on Windows).\n\n```\nCould not find NC_M4 using the following names: m4, m4.exe\n```\nTry installing `m4` (e.g., using [MSYS2](https://packages.msys2.org/package/m4?repo=msys&variant=x86_64) on Windows).\n\n## Credits\n\n#### PyPartMC:\n\nauthors: [PyPartMC developers](https://github.com/open-atmos/PyPartMC/graphs/contributors) \nfunding: [US Department of Energy Atmospheric System Research programme](https://asr.science.energy.gov/), [Polish National Science Centre](https://ncn.gov.pl/en) \ncopyright: [University of Illinois at Urbana-Champaign](https://atmos.illinois.edu/) \nlicence: [GPL v3](https://www.gnu.org/licenses/gpl-3.0.en.html)\n\n#### PartMC:\nauthors: [Nicole Riemer](https://www.atmos.uiuc.edu/~nriemer/), [Matthew West](https://lagrange.mechse.illinois.edu/mwest/), [Jeff Curtis](https://publish.illinois.edu/jcurtis2/) et al. \nlicence: [GPL v2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or later\n\n",
"bugtrack_url": null,
"license": "GPL-3.0",
"summary": "Python interface to PartMC",
"version": "1.3.5",
"project_urls": {
"Documentation": "https://open-atmos.github.io/PyPartMC",
"Source": "https://github.com/open-atmos/PyPartMC/",
"Tracker": "https://github.com/open-atmos/PyPartMC/issues"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "1932130a6c96e90bddcf9815b7b8032fee61937148fa448fe4270cf846a441da",
"md5": "d016407828a98e47f7e6886bc87adcc5",
"sha256": "5cdf5976ea4b580ed17dd3bc8e60ce1969fcce4d5bfdaa5e7202316666591bd9"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp310-cp310-macosx_12_0_x86_64.whl",
"has_sig": false,
"md5_digest": "d016407828a98e47f7e6886bc87adcc5",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 3127170,
"upload_time": "2024-10-26T10:53:47",
"upload_time_iso_8601": "2024-10-26T10:53:47.293026Z",
"url": "https://files.pythonhosted.org/packages/19/32/130a6c96e90bddcf9815b7b8032fee61937148fa448fe4270cf846a441da/PyPartMC-1.3.5-cp310-cp310-macosx_12_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cd78b0cc8db0662b116149a73b024a713484d557ab1c5c4b0939c79899fd0aa6",
"md5": "5ab5d47bc7d71ecfc1b8e71acfb54b4c",
"sha256": "3b7b61f8c7dddb82bd5433c3df548a91bdd6d0c3b85563445740b36f088009d7"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp310-cp310-macosx_14_0_universal2.whl",
"has_sig": false,
"md5_digest": "5ab5d47bc7d71ecfc1b8e71acfb54b4c",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 2740861,
"upload_time": "2024-10-26T10:53:50",
"upload_time_iso_8601": "2024-10-26T10:53:50.229922Z",
"url": "https://files.pythonhosted.org/packages/cd/78/b0cc8db0662b116149a73b024a713484d557ab1c5c4b0939c79899fd0aa6/PyPartMC-1.3.5-cp310-cp310-macosx_14_0_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "dc1f71e43aec175b684966c948b39c8d5fa107a9ba8bc337d8d9a576fcd82f61",
"md5": "fa66d1dc4ad261f0eee09cbe10e8db0f",
"sha256": "6e65aafea895c83baef59486f1334e570f7c1e82d5825cbde4bf4baf59bfceba"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"has_sig": false,
"md5_digest": "fa66d1dc4ad261f0eee09cbe10e8db0f",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 3982998,
"upload_time": "2024-10-26T10:53:52",
"upload_time_iso_8601": "2024-10-26T10:53:52.476694Z",
"url": "https://files.pythonhosted.org/packages/dc/1f/71e43aec175b684966c948b39c8d5fa107a9ba8bc337d8d9a576fcd82f61/PyPartMC-1.3.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "85feba46d178a0ae2b8e59e4c6bea0e22a186cebe03035b744c1fb5a4f23e1a6",
"md5": "68cfbf4b3ff6017d969dbe52a0956680",
"sha256": "5a6f45b2b4b24a95fdb1611131c352ff7fb608f0e0738e4b16145d518275f6fc"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp310-cp310-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "68cfbf4b3ff6017d969dbe52a0956680",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 3649325,
"upload_time": "2024-10-26T10:53:54",
"upload_time_iso_8601": "2024-10-26T10:53:54.850861Z",
"url": "https://files.pythonhosted.org/packages/85/fe/ba46d178a0ae2b8e59e4c6bea0e22a186cebe03035b744c1fb5a4f23e1a6/PyPartMC-1.3.5-cp310-cp310-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7b20391c326bc9d61f657d27e248708b3e2c6440d70e7c247d537d66369fa1ad",
"md5": "7721e4ed5d8ed9252cc0243f1c080951",
"sha256": "ee6eeb6dfcc954543a9557621fee6969d99f1b572cd8e497f4a86736caf1e0cb"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "7721e4ed5d8ed9252cc0243f1c080951",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 3572447,
"upload_time": "2024-10-26T10:53:57",
"upload_time_iso_8601": "2024-10-26T10:53:57.127288Z",
"url": "https://files.pythonhosted.org/packages/7b/20/391c326bc9d61f657d27e248708b3e2c6440d70e7c247d537d66369fa1ad/PyPartMC-1.3.5-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2cf02b715e654c621dffe680326eb71cd3a7dc604c015b21d57cc6222efbb015",
"md5": "1a36ab7a4b8b0bdc4efed0ba28a9be12",
"sha256": "60bee79b28028bac47239d67035dd44754be288a148e8e2f6a92c01895e6e3c6"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp311-cp311-macosx_12_0_x86_64.whl",
"has_sig": false,
"md5_digest": "1a36ab7a4b8b0bdc4efed0ba28a9be12",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 3126534,
"upload_time": "2024-10-26T10:53:59",
"upload_time_iso_8601": "2024-10-26T10:53:59.587307Z",
"url": "https://files.pythonhosted.org/packages/2c/f0/2b715e654c621dffe680326eb71cd3a7dc604c015b21d57cc6222efbb015/PyPartMC-1.3.5-cp311-cp311-macosx_12_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f5cc88b2044d2c26067808744806372330873a450977fbb55325b53a479c1568",
"md5": "ac3e75c2df03e3fa02f5a9c52233c074",
"sha256": "efc731e7e52411901b6a4e87abbc28ac4ecb11b382b2c7fe7335326d047e5a81"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp311-cp311-macosx_14_0_universal2.whl",
"has_sig": false,
"md5_digest": "ac3e75c2df03e3fa02f5a9c52233c074",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 2739958,
"upload_time": "2024-10-26T10:54:02",
"upload_time_iso_8601": "2024-10-26T10:54:02.225843Z",
"url": "https://files.pythonhosted.org/packages/f5/cc/88b2044d2c26067808744806372330873a450977fbb55325b53a479c1568/PyPartMC-1.3.5-cp311-cp311-macosx_14_0_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7cb503c70387746cc3893de3f25dc9ed04a74f6c9880fe48953b5b0d9162c1b8",
"md5": "21cf6037ca1e4fb1fe3337a3744ad1d4",
"sha256": "d27de0a3b045dbaf6113ff90b18dbcc1eacdad81c2476f7396cf021d62b31313"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp311-cp311-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "21cf6037ca1e4fb1fe3337a3744ad1d4",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 3649043,
"upload_time": "2024-10-26T10:54:03",
"upload_time_iso_8601": "2024-10-26T10:54:03.855340Z",
"url": "https://files.pythonhosted.org/packages/7c/b5/03c70387746cc3893de3f25dc9ed04a74f6c9880fe48953b5b0d9162c1b8/PyPartMC-1.3.5-cp311-cp311-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ebb6c5d3a1d0393f500d40b0eb0dedf51f0c683636868f67eaa998eb61f2e834",
"md5": "fefb08200477433074c6ff3d4b6beb47",
"sha256": "c16b12b409fdb5edb30d9f306235eca945155c32604c60a6319d2b020e3d9c5b"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "fefb08200477433074c6ff3d4b6beb47",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 3572288,
"upload_time": "2024-10-26T10:54:06",
"upload_time_iso_8601": "2024-10-26T10:54:06.266804Z",
"url": "https://files.pythonhosted.org/packages/eb/b6/c5d3a1d0393f500d40b0eb0dedf51f0c683636868f67eaa998eb61f2e834/PyPartMC-1.3.5-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a6b14a8e4f1a6b64e7efabcc4a89be93d74317f169588338796307c2c2e01f0a",
"md5": "6ce4c8e0afe844ee9fdbe15c84ab04fb",
"sha256": "a219edb7425669f3415616dd6a0275e860c3dcd7062c6995672bf8dbb7c1410f"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp37-cp37m-macosx_12_0_x86_64.whl",
"has_sig": false,
"md5_digest": "6ce4c8e0afe844ee9fdbe15c84ab04fb",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 3121759,
"upload_time": "2024-10-26T10:54:08",
"upload_time_iso_8601": "2024-10-26T10:54:08.658346Z",
"url": "https://files.pythonhosted.org/packages/a6/b1/4a8e4f1a6b64e7efabcc4a89be93d74317f169588338796307c2c2e01f0a/PyPartMC-1.3.5-cp37-cp37m-macosx_12_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e1147f883c204adb59c2ccb33e7c98b9723cb3dc6df6656a13d344d59f2bb281",
"md5": "990ea8321a4b5dcfc3169d193404bd28",
"sha256": "6eb1e278b5f4b25c71a53c015dbed3a83d80ff86de64ac38ce71ee18400f6e51"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"has_sig": false,
"md5_digest": "990ea8321a4b5dcfc3169d193404bd28",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 3985521,
"upload_time": "2024-10-26T10:54:10",
"upload_time_iso_8601": "2024-10-26T10:54:10.147140Z",
"url": "https://files.pythonhosted.org/packages/e1/14/7f883c204adb59c2ccb33e7c98b9723cb3dc6df6656a13d344d59f2bb281/PyPartMC-1.3.5-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e8d0a900a97a7b9e7901cb69d57cd04fdf9b1eec753c26ad35071a7692652359",
"md5": "e07e5d1b5a3708187564b2bf42179fe0",
"sha256": "ff94fcb9f18a2b9031e40599d9e7c3b7d11e334ef5fcbfd385266a0057d704d0"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp37-cp37m-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "e07e5d1b5a3708187564b2bf42179fe0",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 3652370,
"upload_time": "2024-10-26T10:54:12",
"upload_time_iso_8601": "2024-10-26T10:54:12.498369Z",
"url": "https://files.pythonhosted.org/packages/e8/d0/a900a97a7b9e7901cb69d57cd04fdf9b1eec753c26ad35071a7692652359/PyPartMC-1.3.5-cp37-cp37m-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "22a1e60e14de964b1e70193a640884e0e7846473c74d89f560a0452b41852f33",
"md5": "2771ded88b2b97373aba1856d3be18db",
"sha256": "a38fc8ea69a33c57327d2fae7cd55ba0654b9d2365c89bc34354d3b99ef475c5"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp37-cp37m-win_amd64.whl",
"has_sig": false,
"md5_digest": "2771ded88b2b97373aba1856d3be18db",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 3575106,
"upload_time": "2024-10-26T10:54:15",
"upload_time_iso_8601": "2024-10-26T10:54:15.312868Z",
"url": "https://files.pythonhosted.org/packages/22/a1/e60e14de964b1e70193a640884e0e7846473c74d89f560a0452b41852f33/PyPartMC-1.3.5-cp37-cp37m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "611358239628152b5ce0d7785679fb9c7ece92336b120434d7150a52fe38db40",
"md5": "258be59a757b2538361664ce6a0f0283",
"sha256": "2d4ccdf1a32668afa44373a9f9e733c50933aa24a2afcc6c0521a4783d645c0f"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp38-cp38-macosx_12_0_x86_64.whl",
"has_sig": false,
"md5_digest": "258be59a757b2538361664ce6a0f0283",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 3126291,
"upload_time": "2024-10-26T10:54:16",
"upload_time_iso_8601": "2024-10-26T10:54:16.635091Z",
"url": "https://files.pythonhosted.org/packages/61/13/58239628152b5ce0d7785679fb9c7ece92336b120434d7150a52fe38db40/PyPartMC-1.3.5-cp38-cp38-macosx_12_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1d042c2ed02e4fad24715df1f7065556440b116de9d166ef124e59f4c5639dd7",
"md5": "85e2f3136fb5b9902a4f6c31974db1fe",
"sha256": "6f4ddaa63a40bc7f90e35ce26fe3820b5fdcd04741f96009d7c0f421eb0e5382"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"has_sig": false,
"md5_digest": "85e2f3136fb5b9902a4f6c31974db1fe",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 3982810,
"upload_time": "2024-10-26T10:54:17",
"upload_time_iso_8601": "2024-10-26T10:54:17.948010Z",
"url": "https://files.pythonhosted.org/packages/1d/04/2c2ed02e4fad24715df1f7065556440b116de9d166ef124e59f4c5639dd7/PyPartMC-1.3.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "28f36ce15f601b111f698b33a304e0b5f9bc16369986478589867578a1a37ea9",
"md5": "3ffbf6ad4474c2babeba8140c81e17aa",
"sha256": "a477370ba7b1c12d20da0e71c23458ea32e21ab6c0e6cc3f52af763594d17efa"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp38-cp38-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "3ffbf6ad4474c2babeba8140c81e17aa",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 3649309,
"upload_time": "2024-10-26T10:54:19",
"upload_time_iso_8601": "2024-10-26T10:54:19.254255Z",
"url": "https://files.pythonhosted.org/packages/28/f3/6ce15f601b111f698b33a304e0b5f9bc16369986478589867578a1a37ea9/PyPartMC-1.3.5-cp38-cp38-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "467a9bcf444eede39c7583eb270f5fc1b1888d24485863425a892b82ca988ff1",
"md5": "a5009197fc6fda5c50167fb3545122f5",
"sha256": "01a96b7b4e772c4d986a9e8122ef0eb665ecab379cd6a1a780abb90496b609fc"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "a5009197fc6fda5c50167fb3545122f5",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 3573043,
"upload_time": "2024-10-26T10:54:21",
"upload_time_iso_8601": "2024-10-26T10:54:21.663677Z",
"url": "https://files.pythonhosted.org/packages/46/7a/9bcf444eede39c7583eb270f5fc1b1888d24485863425a892b82ca988ff1/PyPartMC-1.3.5-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7bd97b3fa682c5797fc0475842db89eb014cd85d54118604f41c588bbc4cb8bf",
"md5": "508abd3766fe3a836ea4c2f06963a6e2",
"sha256": "73beb61c56ff93ddeeda86308f05b1f983a6e3c7a9652cd3d8798edece791991"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp39-cp39-macosx_12_0_x86_64.whl",
"has_sig": false,
"md5_digest": "508abd3766fe3a836ea4c2f06963a6e2",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 3126391,
"upload_time": "2024-10-26T10:54:23",
"upload_time_iso_8601": "2024-10-26T10:54:23.796622Z",
"url": "https://files.pythonhosted.org/packages/7b/d9/7b3fa682c5797fc0475842db89eb014cd85d54118604f41c588bbc4cb8bf/PyPartMC-1.3.5-cp39-cp39-macosx_12_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8989e0aa35b1c5cbb3e7d33dd8cf62087a8bbad8294995bbcf28702848cf5ca8",
"md5": "9f369f6ecab55b11964bee559663c27a",
"sha256": "f6ea977bde87d95bb25b6232ba4a79c709dc2fd1df8ca680f905181588790f1e"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"has_sig": false,
"md5_digest": "9f369f6ecab55b11964bee559663c27a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 3983351,
"upload_time": "2024-10-26T10:54:25",
"upload_time_iso_8601": "2024-10-26T10:54:25.285018Z",
"url": "https://files.pythonhosted.org/packages/89/89/e0aa35b1c5cbb3e7d33dd8cf62087a8bbad8294995bbcf28702848cf5ca8/PyPartMC-1.3.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bb542766ba84dcd8ee42e28c084de88fab9dcfbc308acc9fd80afb8ef8756e82",
"md5": "7fba60f0f53678e28f322c61932d0e7a",
"sha256": "b4c52e1c66ec445796373b555da33956dd94056fb0c131175dfb9a1abd8b2ee9"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp39-cp39-manylinux_2_24_x86_64.whl",
"has_sig": false,
"md5_digest": "7fba60f0f53678e28f322c61932d0e7a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 3649202,
"upload_time": "2024-10-26T10:54:27",
"upload_time_iso_8601": "2024-10-26T10:54:27.587262Z",
"url": "https://files.pythonhosted.org/packages/bb/54/2766ba84dcd8ee42e28c084de88fab9dcfbc308acc9fd80afb8ef8756e82/PyPartMC-1.3.5-cp39-cp39-manylinux_2_24_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7ac8021363d91e8f36dffec98ae0deac23f0bc5bb0fdbdacebda5d334150a7ff",
"md5": "0e39eb598190a30ca907d70bd280be24",
"sha256": "8603a4728989cee960f97d3f4cf29df441f3842e403e168fa5646889a7ebe18a"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "0e39eb598190a30ca907d70bd280be24",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 3573205,
"upload_time": "2024-10-26T10:54:29",
"upload_time_iso_8601": "2024-10-26T10:54:29.456647Z",
"url": "https://files.pythonhosted.org/packages/7a/c8/021363d91e8f36dffec98ae0deac23f0bc5bb0fdbdacebda5d334150a7ff/PyPartMC-1.3.5-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "228a7de8efdbd5a709becb37570c5cfab1e3eb3514d6e988aad19000f5aa3f7f",
"md5": "0cf8dcfc7ec4285ff126d5e32b56ab37",
"sha256": "e4d41763302151f5006e105985f2796fea6b14ff6c39c87489304fd659d33e5c"
},
"downloads": -1,
"filename": "PyPartMC-1.3.5.tar.gz",
"has_sig": false,
"md5_digest": "0cf8dcfc7ec4285ff126d5e32b56ab37",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 6300455,
"upload_time": "2024-10-26T10:54:31",
"upload_time_iso_8601": "2024-10-26T10:54:31.878811Z",
"url": "https://files.pythonhosted.org/packages/22/8a/7de8efdbd5a709becb37570c5cfab1e3eb3514d6e988aad19000f5aa3f7f/PyPartMC-1.3.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-10-26 10:54:31",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "open-atmos",
"github_project": "PyPartMC",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "pypartmc"
}