Python extension for tracing field lines using the Fortran tracer from MapFL
Project description
mapflpy :: IN DEVELOPMENT
!!! BETA: Please consult Cooper or Ryder before using package. !!!
Python extension for tracing field lines using the Fortran tracer from MapFL.
The goal of mapflpy is to provide fast and accurate tracing capabilities for spherical vector fields inside a convenient Python interface.
mapflpy is designed to work natively with the staggered meshes produced by
Predictive Science Inc.'s codes for simulating the solar corona, and
inner heliosphere (e.g. MAS or
POT3D), but it should be generally compatible
with any global vector field that can be described on a rectilinear grid in
spherical coordinates.
Cooper can provide a wheel for those interested in using this package while it is in production.
Disclaimer
This package is currently in a pre-release state as we make an attempt to simplify the process for end-users to get working mapflpy libraries on their system. The routines, organization, and interfaces are subject to change.
Automated builds, basic documentation, and an initial release are coming soon! Thank you for your patience.
I. Installation
Install from pre-built wheels (eventually...)
# pip install mapflpy # this will work when mapflpy is on PyPi
Install from source:
- Right now the alternative of installing from source with pip isn't perfect yet (meson linking vagaries).
Note: Because mapflpy includes a Python extension built from cross-compiled Fortran code, the pre-built wheels are platform specific. If necessary, please see the instructions for building mapflpy from source.
A. Building
If you really want to build a wheel yourself, it should work with the
mapflpy-dev environment prescribed in environment.yml. Have conda set that
up and then from within that conda environment type:
python -m build
This will build a .whl wheel file specific to your OS and CPU architecture.
Then install the wheel, e.g.:
pip install <WHEEL_FILE>
Unless you've used a "repair tool" to consolidate the shared libraries to the wheel (e.g. delocate or auditwheel) then this might only work within the conda environment that built the package.
I don't recommend playing with these build tools manually to build for many systems, and there are several idiosyncrasies with the current setup. We will likely automate this process using github actions (i.e. talk to Cooper).
B. Testing
The automated tests will confirm if tracing is working properly or not. Here we use pytest. Run this after installing mapflpy
pytest -rA -v --pyargs mapflpy.tests
II. Usage
mapflpy centers around the Tracer and TracerMP classes (both of which inherit
from the base _Tracer class interface).
The Tracer class is for single-threaded tracing, while the TracerMP class is for
multi-processed tracing using python'smultiprocessing module.
The mapflpy_fortran shared-object is built from mapfl Fortran source code using
F2PY and Meson.
The Fortran routines are not intended to be called directly by end-users, but rather
through the Tracer and TracerMP classes.
mapfl itself is not designed for object-oriented programming; rather, it is generally
called from the command line using a .in file to specify input arguments, and relies
on global variables to hold state information.
This package wraps the Fortran routines in a "pythonic" interface, allowing for a more flexible approach to tracing fieldlines. Until there is time (...) to refactor the Fortran code into a more modular design, these wrapper classes are the most feasible way to allow a broader audience to use the Fortran tracer.
A. Tracer vs. TracerMP
The Tracer class directly imports the mapflpy_fortran cross-compiled Fortran
module.
Since imports in Python are singletons, only one instance of the Fortran module can
exist within a process at a time.
As such, the Tracer class also enforces a singleton pattern (due to the fact that
the Fortran routines rely on global state variables, and multiple instances of the
Tracer class would lead to conflicts and race-conditions).
The TracerMP class, on the other hand, spawns multiple processes using the
multiprocessing module.
Each instance of the TracerMP class creates and links to a distinct subprocess,
which imports its own instance of the Fortran module.
A two-way pipe is used to communicate between the main process and the subprocess.
This allows multiple instances of the Fortran routines to be used simultaneously,
without conflicts (at the cost of inter-process communication overhead).
In an attempt to limit this overhead, magnetic field data is passed as filepaths.
These filepaths are passed to the respective subprocess over the pipe, then
loaded into memory by the subprocess itself.
B. Tracer as Dictionary
The base _Tracer class implements the MutableMapping interface, allowing for
Tracer and TracerMP instances to behave like dictionaries. Under the hood,
the "mapfl.in" parameters are stored in a ChainMap which contains a set of default
parameters, as well as any user-specified changes (or additions) to the parameters.
from mapflpy.tracer import Tracer
tracer = Tracer()
current_params = dict(tracer) # get current parameters as a dictionary
tracer['verbose_'] = True # set verbose_ parameter to True
tracer.update(ds_min_=0.00001, ds_max_=10.1) # update multiple parameters at once
updated_params = dict(tracer) # get updated parameters as a dictionary
tracer.clear() # reset parameters to defaults
The one exception to this is the magnetic field data itself. Because this data is
handled differently in the Tracer and TracerMP classes, the magnetic field data
should be set using the br, bt, and bp properties (or the set_field_data method).
TracerMP must be set with filepaths, whereas Tracer can be set with numpy arrays or
filepaths i.e.
from mapflpy.tracer import Tracer
from psi_io import read_hdf_by_value
# load magnetic field data from HDF files
# read_hdf_by_value returns the data array followed by any scale arrays
# e.g. values, r_scale, t_scale, p_scale
br, *br_scales = read_hdf_by_value(ifile="br_file.h5")
bt, *bt_scales = read_hdf_by_value(ifile="bt_file.h5")
bp = "bp_file.h5"
tracer = Tracer()
tracer.br = br, *br_scales
tracer.bt = bt, *bt_scales
tracer.bp = bp # can be a filepath
or
from mapflpy.tracer import TracerMP
tracer_mp = TracerMP()
tracer_mp.br = "br_file.h5"
tracer_mp.bt = "bt_file.h5"
tracer_mp.bp = "bp_file.h5"
C. Tracing Fieldines
Once a Tracer or TracerMP instance has been created, and the magnetic field
data has been set, fieldlines can be traced using the trace method.
NOTE: prior to tracing fieldlines the run method must be called viz. to
populate any changes made to the input params or magnetic field data.
With that said, the current "staleness" of the tracer instance can be checked using
the stale property i.e. whether there have been any changes to the input parameters
or magnetic field data since the last time the run method was called.
from mapflpy.tracer import Tracer
tracer = Tracer()
print(tracer.stale) # True, since nothing has been run yet
tracer.run() # run the tracer to initialize
print(tracer.stale) # False, since tracer is up-to-date
tracer['ds_min_'] = 0.0001 # change a parameter
print(tracer.stale) # True, since a parameter has changed
NOTE: If trace is called while the tracer is stale, run will be called automatically.
from mapflpy.tracer import Tracer
import numpy as np
lps = [
np.full(10, 1.01), # r launch points [R_sun]
np.linspace(0, np.pi, 10), # theta launch points [rad]
np.zeros(10) # phi launch points [rad]
]
tracer = Tracer()
tracer.load_fields( ... ) # load magnetic field data
tracer.trace(lps, buffer_size=1000) # will call run() if stale
Traces can be performed "forward" or "backward" by calling the set_trace_direction
method with either 'f' or 'b'.
Two separate calls must be made to trace in
both directions.
The resulting trace geometry must then be combined manually.
With that said, a utility function combine_fwd_bwd_traces is provided to help with
this common use case.
from mapflpy.tracer import Tracer
from mapflpy.utils import combine_fwd_bwd_traces
tracer = Tracer()
lps = [ ... ] # launch points
tracer.load_fields( ... ) # load magnetic field data
tracer.set_tracing_direction('f') # set to forward tracing
fwd_traces = tracer.trace(lps)
tracer.set_tracing_direction('b') # set to backward tracing
bwd_traces = tracer.trace(lps)
# combine the two traces into one, correctly ordered
combined = combine_fwd_bwd_traces(fwd_traces, bwd_traces)
Example of iterating through a series of states within a time-dependent run:
from mapflpy.tracer import Tracer
import numpy as np
traces =[]
states = range(10, 20)
lps = [
np.full(10, 1.01), # r launch points [R_sun]
np.linspace(0, np.pi, 10), # theta launch points [rad]
np.zeros(10) # phi launch points [rad]
]
tracer = Tracer()
for state in states:
tracer.load_fields(
br=f"br_0000{state}.h5",
bt=f"bt_0000{state}.h5",
bp=f"bp_0000{state}.h5"
)
traces.append(tracer.trace(lps, buffer_size=1000)) # will call run() if stale
The result of trace is a Traces object – a named-tuple-like container for the
traced fieldlines. This structure contains the following attributes:
geometry: an Nx3xM array of the traced fieldline coordinates, i.e. the radial-theta-phi coordinates of the traces where N is the buffer size, and M is the number of fieldlines. (Note, to preserve a homogeneous array, fieldlines shorter than N are NaN padded).start_pos: an Mx3 array of the starting positions of each fieldline.end_pos: an Mx3 array of the ending positions of each fieldline.traced_to_boundary: a boolean array of length M indicating whether each fieldline traced to a boundary (True) or was terminated early due to step-size constraints (False).
D. Using Scripts
Several scripts are provided in the scripts/ directory.
These standalone functions are used to perform common "one-off" tracing tasks
(similar, in many respects, to how mapfl itself is used from the command line).
Any additional keyword arguments (see function signature) provided within the calls
to these scripts are passed to the instantiation of the TracerMP class, i.e.
arguments used to set the mapfl parameters.
from mapflpy.scripts import run_forward_tracing
lps = [...]
bfiles = {
'br': 'br_file.h5',
'bt': 'bt_file.h5',
'bp': 'bp_file.h5'
}
traces = run_forward_tracing(
**bfiles,
launch_points=lps, # <-- passed to trace() method
buffer_size=1000, # <-- passed to trace() method
domain_r_max_=100 # <-- example of passing mapfl parameter
)
or
from mapflpy.scripts import run_fwdbwd_tracing
lps = [ ... ]
bfiles = {
'br': 'br_file.h5',
'bt': 'bt_file.h5',
'bp': 'bp_file.h5'
}
traces = run_fwdbwd_tracing(
**bfiles,
launch_points=lps, # <-- passed to trace() method
buffer_size=1000, # <-- passed to trace() method
)
This module also contains a script for performing interdomain tracing between
two different magnetic field domains (e.g. coronal to heliospheric). A more
comprehensive explanation of the function signature can be found in the docstring for
the run_interdomain_tracing function.
A few general notes about this function:
- requires 6 magnetic field files: 3 for the inner domain, and 3 for the outer domain.
- the
r_interfaceparameter must be specified to indicate the radial location of the recross boundary between the two domains. - the
helio_shiftparameter can be used to account for the longitudinal shift angle between the heliospheric domain and the coronal domain.
from mapflpy.scripts import inter_domain_tracing
from math import pi
lps = [ ... ]
coronal_bfiles = {
'br_cor': 'br_coronal.h5',
'bt_cor': 'bt_coronal.h5',
'bp_cor': 'bp_coronal.h5'
}
heliospheric_bfiles = {
'br_hel': 'br_helio.h5',
'bt_hel': 'bt_helio.h5',
'bp_hel': 'bp_helio.h5'
}
traces = inter_domain_tracing(
**coronal_bfiles,
**heliospheric_bfiles,
launch_points=lps,
r_interface=30.0, # <-- radial location of domain interface [R_sun]
helio_shift=pi/6, # <-- longitudinal shift between domains [rad]
rtol_=1e-6, # <-- relative tolerance used to determine when
# a fieldline has crossed the interface boundary
)
E. Utilities
A few utility functions are provided in the mapflpy.utils module.
get_fieldline_endpoints, get_fieldline_npoints, and trim_fieldline_nan_buffer
can be used on raw fieldline geometry (numpy arrays) or on Traces objects to extract
information about the traced fieldlines, or (in the case of trim_fieldline_nan_buffer)
to remove the NaN padding from fieldlines – returning a list of heterogeneously sized
fieldlines.
Lastly, get_fieldline_polarity can be used to determine and classify fieldlines as:
- "open" (with negative polarity)
- "closed"
- "undefined" (e.g. if the fieldline did not trace to a boundary)
- "disconnected"
- "open" (with positive polarity)
The result of this function is an array of type Polarity (an IntEnum class) which
provides a mapping between integer codes and string labels for each fieldline.
III. Requirements
This package requires the python HDF5 interface, h5py, to work with .h5 files.
It also requires the psi-io python package, which has reader/writers for
PSI-style HDF data files.
If you are working with HDF4 .hdf files then you must also have the optional
pyhdf HDF4 python interface installed.
Because these packages require the underlying C HDF libraries to be installed, we generally recommend using conda to install these dependencies. This often makes life much easier than installing from source:
for HDF5 and psi-io
conda install h5py
pip install psi-io
for HDF4
conda install pyhdf
To isolate these to a specific environment, see environment.yml
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mapflpy-1.1.1.tar.gz.
File metadata
- Download URL: mapflpy-1.1.1.tar.gz
- Upload date:
- Size: 2.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
467a08b7170825fe2ac22556ffa6a71f0f227c9b5ff0dc68aa0dd2d498140a8e
|
|
| MD5 |
6a5594703e9d5a1081a17574c6ecceb3
|
|
| BLAKE2b-256 |
8657761340972f898187c5bc5ba7c14ce468e7dc96c9097ecbeebf8e446b24e8
|
File details
Details for the file mapflpy-1.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 9.5 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4cf305717a1ba27765188a5cff20de5899c47c2620b635e2d8a437ffccead022
|
|
| MD5 |
70389c490bdc72a08be37e5cb986660d
|
|
| BLAKE2b-256 |
8c3686c36a403cfe683aa050dc088d86f8071223023cbd106459e547597dad3b
|
File details
Details for the file mapflpy-1.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
- Upload date:
- Size: 9.3 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a2cd9b211ad497457e6357f77fc2a201f175054c561833b67b91b05ce83cea6
|
|
| MD5 |
d8f581d9068b90efe4ec07d61d48ea20
|
|
| BLAKE2b-256 |
4b2b672ccdf6b38ab91e8c7303aeb30d7d896c5f123e2b940037462e5be83975
|
File details
Details for the file mapflpy-1.1.1-cp313-cp313-macosx_11_0_x86_64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp313-cp313-macosx_11_0_x86_64.whl
- Upload date:
- Size: 7.6 MB
- Tags: CPython 3.13, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
393dbc54db2210b256b277ef08fcf48592e25dff6dcdaa5ead6579ff0b0fd969
|
|
| MD5 |
1f9ae9a70814dfebf2c917dd3c0546d4
|
|
| BLAKE2b-256 |
5ab9fc30d9309180edad35249da9d046f85a7bb936d5e7008ac9d44c882806b9
|
File details
Details for the file mapflpy-1.1.1-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 6.6 MB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e85541f98397929775c39398d17b4a0ade9717b334981a51ec0572b00ed8726
|
|
| MD5 |
50f7630a32e201f665636a6bfbf18351
|
|
| BLAKE2b-256 |
8239a1cfa2e2e893bbceb1baf88282bac49d798b7e66b6c1175cf2fecfd1bdbd
|
File details
Details for the file mapflpy-1.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 9.5 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5de90ecf3d60f2c62bc9cb50d6ee22fd93067e2ee197be65a9fcdd6ae86426f8
|
|
| MD5 |
ce9a9bc7493175b9d9b546f9dad21219
|
|
| BLAKE2b-256 |
d98638e9bdbbdc3ac13b2fd9f8398d4d6ba52e3faff95b29ad1d363ed5d2a840
|
File details
Details for the file mapflpy-1.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
- Upload date:
- Size: 9.3 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d62d4a929697ae5b78be8013337a15512078ad05103ad2362cf233a45a1c0ef
|
|
| MD5 |
9d164a368b3980fe84c2a14abb92cbdc
|
|
| BLAKE2b-256 |
24a1e7e87a78cf04522d4a2a4b24b198b212956027c3ae101786a36b2e1c52c6
|
File details
Details for the file mapflpy-1.1.1-cp312-cp312-macosx_11_0_x86_64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp312-cp312-macosx_11_0_x86_64.whl
- Upload date:
- Size: 7.6 MB
- Tags: CPython 3.12, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71b9103e27591a895091dfef9389f99c847ae94cda1ca9605ca2d08da6a4e466
|
|
| MD5 |
4cd35ed95ae592810a6745efe04bcac8
|
|
| BLAKE2b-256 |
d062c4ad98affab2a47838b64309eae65a80c0085d63ec6e6b82f07805a2cf4d
|
File details
Details for the file mapflpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 6.6 MB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28692467c57c4bb0e6b5aea7f3da4115f183d0f3222650628a26d6c50ee55d5e
|
|
| MD5 |
29456e14de79cd8166edfacc6f6076ff
|
|
| BLAKE2b-256 |
8638092bf5b625fb3b020a418bfe5bb60d61562817c31f7146de94b4526ae09b
|
File details
Details for the file mapflpy-1.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 9.5 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9894bf3c067386e0f74d6bc46fb5c16763a270baab07cba9ace9fbd17e0790b0
|
|
| MD5 |
42ac7f0f451047675970ce2bc5fd4407
|
|
| BLAKE2b-256 |
40a6c1249cd1ffe4c7d54fc39d243b3950fcce5040e1a6fb1442d646f7f3a3e0
|
File details
Details for the file mapflpy-1.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
- Upload date:
- Size: 9.3 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
672020b7d432e9a372b2b351976f697e468942d310a9232f4a28d32085e2b5dc
|
|
| MD5 |
9150d99a1d38bf376bdf80a811ee5049
|
|
| BLAKE2b-256 |
91fd2f4fa014bdda595c535ce133fdf5196206ab44f8353591216842ee023d70
|
File details
Details for the file mapflpy-1.1.1-cp311-cp311-macosx_11_0_x86_64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp311-cp311-macosx_11_0_x86_64.whl
- Upload date:
- Size: 7.6 MB
- Tags: CPython 3.11, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
897daebe3076ac1ae57317c402f43686c3e67efda2b0ce2854ac6960587987df
|
|
| MD5 |
ef667128a73721f86b6c6831de62678c
|
|
| BLAKE2b-256 |
f85e350c803846aa930d59ae020325977df6b5b62dd6c075f2182171e882dc37
|
File details
Details for the file mapflpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 6.6 MB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e28aa476c1209a885e088c8a2f820cb9b7cec863af4e93ed6f439850c1a24cd4
|
|
| MD5 |
62763f7486a0c2e79ae8fde7b8d099df
|
|
| BLAKE2b-256 |
3ea91a5c1f1ecdb70258311323978b8efb0d69aed5b477715e990d3a89ea10a9
|
File details
Details for the file mapflpy-1.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 9.5 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
09f8696dd6f712dc5c5314359d963182aba0ca5d84ca0427401515343d8b48a4
|
|
| MD5 |
7393d7fc6debc577bde7c651bee292df
|
|
| BLAKE2b-256 |
4ea2f170553c98e45dd490c444f9638e9f818f3573131130dc412051e682bc93
|
File details
Details for the file mapflpy-1.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
- Upload date:
- Size: 9.3 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4695a6ad922b44c50ed0a6af882f25de97771788fefd2a616ffacfd3f2f02ca0
|
|
| MD5 |
75a9428d772793502e4bf942c23b8205
|
|
| BLAKE2b-256 |
153d389f6ce971b74eb165c2ca3935cced39549c0377eb681f3a3bb107ac2e61
|
File details
Details for the file mapflpy-1.1.1-cp310-cp310-macosx_11_0_x86_64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp310-cp310-macosx_11_0_x86_64.whl
- Upload date:
- Size: 7.6 MB
- Tags: CPython 3.10, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1f2507288fe34ef100bc0ba50be4f504d31f1a0ad978a7bb93d91d58ce0667c
|
|
| MD5 |
81e0a46c85decaa0c584a45f30141e76
|
|
| BLAKE2b-256 |
18d0e9c8c6fd6c8d7221ff8f97157dc1b3326924168524e5071c42fca5249e6a
|
File details
Details for the file mapflpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: mapflpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 6.6 MB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45fef313836387ca0a7c81a0c11e3180f90cb1d9aa18d20af72a941384d302e7
|
|
| MD5 |
59f16b75342f4cea9b03b7b481cd6ba0
|
|
| BLAKE2b-256 |
833d2199e083d3a9c402a5472e5860347e06281759430c617cb809ad645541f1
|