Skip to main content

meshio++

I/O for mesh files.

PyPi Version npm Version PyPI pyversions DOI

C++ Python C Fortran Julia R WebAssembly TypeScript

GitHub stars PyPi downloads

gh-actions codecov Code style: black

There are various mesh formats available for representing unstructured meshes. meshio++ can read and write all of the following and smoothly converts between them:

Abaqus (.inp), ANSYS msh (.msh), Ansys/APDL coded database (.cdb, .inp), AVS-UCD (.avs), CGNS (.cgns), DOLFIN XML (.xml), COMSOL (.mphtxt), Exodus (.e, .exo), EnSight Gold (geometry, .case/.geo), FLAC3D (.f3grid), FLUX (mesh .pf3, field .dex), FreeFem++ (.msh), H5M (.h5m), HMF (.hmf, experimental, meshio++-specific), I-deas Universal / UNV (.unv), ANSYS Fluent interpolation (.ip), Kratos/MDPA (.mdpa), Medit (.mesh, .meshb), MED/Salome (.med), Modulef (mesh .mfm, field .mff), Nastran (bulk data, .bdf, .fem, .nas), Netgen (.vol, .vol.gz), Neuroglancer precomputed format, Gmsh (format versions 2.2, 4.0, and 4.1, .msh), OBJ (.obj), OFF (.off), OpenFOAM polyMesh (.foam, read-only), PERMAS (.post, .post.gz, .dato, .dato.gz), PLY (.ply), STL (.stl), Tecplot .dat, TetGen .node/.ele, Triangle .node/.ele/.poly, SVG (output only; 2D direct, 3D via skin projection) (.svg), TikZ (LaTeX output only; 2D direct, 3D via skin projection) (.tikz), SU2 (.su2), UGRID (.ugrid), VTK (.vtk), VTP (.vtp), VTU (.vtu), WKT (TIN) (.wkt), XDMF (.xdmf, .xmf).

meshio++ ships a C++20 core (built with pybind11 + scikit-build-core) that reads and writes most formats with zero-copy numpy at the I/O boundary, plus optional HDF5/netCDF acceleration and a selectable parallel backend (AUTO by default — prefers OpenMP, then STL+TBB, then sequential; override with -DMESHIOPLUSPLUS_PARALLEL_BACKEND=...). Every format has a pure-Python fallback, so behaviour and file compatibility are identical whether or not the native libraries are present. For a standalone C++ build use build/configure.sh (Linux/macOS) or build/configure.bat (Windows). Full docs (install, data model, per-format options, CLI) live at the documentation site (sources under doc/).

Install with

pip install meshioplusplus[all]

([all] pulls in all optional dependencies. By default, meshio++ only uses numpy.) You can then use the command-line tool

meshioplusplus convert    input.msh output.vtk   # convert between two formats

meshioplusplus info       input.xdmf             # show some info about the mesh

meshioplusplus compress   input.vtu              # compress the mesh file
meshioplusplus decompress input.vtu              # decompress the mesh file

meshioplusplus binary     input.msh              # convert to binary format
meshioplusplus ascii      input.msh              # convert to ASCII format

meshioplusplus merge      a.vtu b.vtu out.vtu    # merge meshes (optional --weld)

meshioplusplus transform  in.vtu out.vtu --translate 1,2,3   # affine transform
meshioplusplus clean      in.vtu out.vtu --weld              # weld / prune / de-dup
meshioplusplus crop       in.vtu out.vtu --bbox 0,0,0,1,1,1  # subset by region
meshioplusplus split      in.vtu 'out_{key}.vtu' --by type   # split by criterion
meshioplusplus stats      mesh.vtu                           # geometric statistics
meshioplusplus convert-cells in.msh out.vtu --mode simplexify  # hexes -> tetra
meshioplusplus refine     in.vtu out.vtu --levels 2          # uniform subdivision
meshioplusplus partition  in.vtu 'out_{part}.vtu' --nparts 4 # N balanced parts
meshioplusplus smooth     in.vtu out.vtu --iterations 20     # relax node positions
meshioplusplus interpolate src.vtu tgt.vtu out.vtu           # transfer fields across meshes
meshioplusplus slice      in.vtu out.vtu --normal 0,0,1      # planar cross-section
meshioplusplus isosurface in.vtu out.vtu --array T --values 350  # level set of a field

meshioplusplus data info  mesh.vtu                           # summarize data arrays
meshioplusplus data calc  in.vtu out.vtu --point "s = norm(v)"   # derive a field
meshioplusplus data to-cell  in.vtu out.vtu --keys T         # point -> cell average
meshioplusplus data normalize in.vtu out.vtu --cell damage --to 0,1

with any of the supported formats.

The same verbs are available as a standalone C++ binary that needs no Python: grab a ready-to-run, statically-linked build for Linux/macOS/Windows from the GitHub Releases page, or build it yourself with build/configure.sh --cli --build (or -DMESHIOPLUSPLUS_BUILD_CLI=ON). It links only the C++ core. Named regions — and so point/cell sets — are carried there since v8.1.0, so info lists them and diff compares them; convert -s/-d is still Python-only.

In Python, simply do

import meshioplusplus

mesh = meshioplusplus.read(
    filename,  # string, os.PathLike, or a buffer/open file
    # file_format="stl",  # optional if filename is a path; inferred from extension
    # see meshioplusplus convert --help for all possible formats
)
# mesh.points, mesh.cells, mesh.cells_dict, ...

# mesh.vtk.read() is also possible

to read a mesh. To write, do

import meshioplusplus

# two triangles and one quad
points = [
    [0.0, 0.0],
    [1.0, 0.0],
    [0.0, 1.0],
    [1.0, 1.0],
    [2.0, 0.0],
    [2.0, 1.0],
]
cells = [
    ("triangle", [[0, 1, 2], [1, 3, 2]]),
    ("quad", [[1, 4, 5, 3]]),
]

mesh = meshioplusplus.Mesh(
    points,
    cells,
    # Optionally provide extra data on points, cells, etc.
    point_data={"T": [0.3, -1.2, 0.5, 0.7, 0.0, -3.0]},
    # Each item in cell data must match the cells array
    cell_data={"a": [[0.1, 0.2], [0.4]]},
)
mesh.write(
    "foo.vtk",  # str, os.PathLike, or buffer/open file
    # file_format="vtk",  # optional if first argument is a path; inferred from extension
)

# Alternative with the same options
meshioplusplus.write_points_cells("foo.vtk", points, cells)

For both input and output, you can optionally specify the exact file_format (in case you would like to enforce ASCII over binary VTK, for example).

Skin extraction

meshioplusplus.extract_skin derives the boundary surface of a 3D volume mesh (the Kratos SkinDetectionProcess face-hashing algorithm — faces occurring exactly once are boundary; points are compacted, point_data follows):

vol = meshioplusplus.read("part.msh")     # tetra/hexa/wedge/pyramid mesh
skin = meshioplusplus.extract_skin(vol)   # triangle/quad/... surface mesh

The STL and PLY writers do this automatically for volume meshes (pass skin=False for the legacy drop-volume-cells behavior), and the SVG/TikZ writers render 3D meshes by projecting the skin through an orthographic camera (azimuth/elevation/roll in degrees, default the classic CAD isometric view) with painter's-algorithm depth ordering — that is exactly how the Stanford-bunny logo above is drawn.

Publication-quality vector figures

The SVG and TikZ writers can colour each face by a data array, turning them into figures you can drop straight into a paper — resolution-independent, and with no extra dependency: the colormaps are built into the core.

annotated = meshioplusplus.attach_quality(mesh)
meshioplusplus.write(
    "quality.svg", annotated,
    color_by="quality:scaled_jacobian",   # or any point_data / cell_data name
    cmap="viridis",                       # viridis / coolwarm / turbo
    colorbar=True,
)
a bracket coloured by scaled Jacobian

The bundled bracket coloured by element quality — the same figure tools/gen_doc_images.py regenerates.

Point data colours a face by the mean of its corner values, cell data by its owning cell's value — for a volume mesh, tracked through the extracted skin's parent-cell provenance, so a per-cell material or metric lands on the right facet. Multi-component arrays reduce to a component or to their magnitude; vmin/vmax set the range (default: the drawn faces' finite range), and non-finite values take nan_color. From the command line:

meshioplusplus convert mesh.vtu figure.svg --color-by temperature --colorbar

Colouring is available from Python, from C++ directly, and from both CLIs; the flat C/Fortran/WebAssembly bindings reach these writers through the shared registry and always emit the default styling.

Surface extraction

meshioplusplus.extract_surface is the general form of skin extraction: it picks the dimension automatically (a volume mesh → boundary faces, a 2D surface mesh → boundary edges) and can record each facet's parent cell id (record_parent_ids=True). See the surface extraction docs (doc/extract_surface.md).

surf = meshioplusplus.extract_surface(vol)                  # faces (or edges for a 2D mesh)
edges = meshioplusplus.extract_surface(sheet, record_parent_ids=True)

Mesh quality

meshioplusplus.compute_quality scores every cell on a set of geometric quality metrics (area/volume, scaled Jacobian, aspect ratio, skewness, interior/dihedral angles, warpage) and flags inverted/degenerate cells; attach_quality writes them back as cell_data. See doc/mesh_quality.md.

report = meshioplusplus.compute_quality(mesh)
print(report["num_inverted"], "inverted cells")
annotated = meshioplusplus.attach_quality(mesh)   # metrics as cell_data

Reordering / renumbering

meshioplusplus.reorder renumbers nodes and elements to reduce sparse-matrix bandwidth (Reverse Cuthill–McKee) or improve cache locality (Morton / Hilbert space-filling curves). It is a pure permutation — geometry and all data preserved — and returns the applied node/cell permutations so external arrays can be remapped. compute_bandwidth measures the before/after connectivity bandwidth. See doc/reorder.md.

out = meshioplusplus.reorder(mesh, method="rcm")            # "morton" / "hilbert" too
out, node_perm, cell_perms = meshioplusplus.reorder(mesh, return_permutation=True)
print(meshioplusplus.compute_bandwidth(mesh), "->", meshioplusplus.compute_bandwidth(out))

Comparison (diff)

meshioplusplus.diff compares two meshes and reports whether they are equivalent within a tolerance (abs_err <= atol + rtol*|expected|), with a structured breakdown (points, cells, data, named sets) and an overall verdict (identical / equal within tolerance / different); meshes_equal is the boolean wrapper for test suites. An optional unordered=True mode matches nodes by spatial proximity, so a shuffled node order still compares equal. See doc/diff.md.

assert meshioplusplus.meshes_equal(a, b, atol=1e-8)         # ideal in a regression test
report = meshioplusplus.diff(a, b, unordered=True)          # tolerant to shuffled node order
print(report["verdict"])

The meshioplusplus diff a.vtu b.vtu CLI verb sets a nonzero exit code when meshes differ, for direct use in CI / Makefiles.

Merge / combine

meshioplusplus.merge combines two or more meshes into one: it concatenates points (offsetting connectivity so indices stay valid), merges cell blocks by type, concatenates data (per a configurable data_policy), and tags each cell's origin. With weld=True it fuses coincident nodes across inputs within atol using a spatial hash (never O(N²)) — the standard way to stitch adjacent blocks into a watertight mesh. Overlapping set / field-data names are namespaced by source id. See doc/merge.md.

combined = meshioplusplus.merge([a, b, c])                 # concatenate
welded = meshioplusplus.merge([left, right], weld=True, atol=1e-8)  # fuse the shared interface

Editing (transform / clean / crop / split) and statistics

A bundle of dependency-free mesh-editing utilities:

  • meshioplusplus.transform — apply an affine transform (translate / scale / rotate / 4×4 matrix / unit-scale) to the points; connectivity and data are carried through. See doc/transform.md.
  • meshioplusplus.clean — weld coincident points (spatial hash), drop degenerate and duplicate cells, and remove orphaned points, in one toggleable pass. See doc/clean.md.
  • meshioplusplus.crop — extract the part of a mesh inside a bounding box or half-space, pruning unused points (mode="all"/"any"). See doc/crop.md.
  • meshioplusplus.split — partition a mesh into several by cell type, connected component (flood-fill), or region (cell_sets / integer tag). See doc/split.md.
  • meshioplusplus.compute_stats — geometric statistics (bounding box, centroid, per-type counts, area, signed/unsigned volume, inverted cells) — the geometric complement to info. See doc/stats.md.
out = meshioplusplus.transform(mesh, rotate=("z", 90))
out = meshioplusplus.clean(mesh, weld=True, atol=1e-8)
sub = meshioplusplus.crop(mesh, bbox=[0, 0, 0, 1, 1, 1])
pieces = meshioplusplus.split(mesh, by="type")             # {"triangle": ..., ...}
s = meshioplusplus.compute_stats(mesh)                     # dict of measures

Cell conversion (linearize / simplexify / elevate)

meshioplusplus.convert_cells converts a mesh's element representation — which cell types it is built from — while leaving the object it describes intact. See doc/convert_cells.md.

  • mode="linearize" — every higher-order cell becomes its linear base (tetra10tetra, hexahedron27hexahedron), keeping the corner connectivity verbatim and pruning the nodes that become unreferenced.
  • mode="simplexify" — every cell is decomposed into simplices of the same topological dimension (quad → 2 triangle, hexahedron → 6 tetra, wedge → 3, pyramid → 2, an n-gon into an (n−2)-triangle fan). No points are added, each parent's cell_data is replicated to its children, and every emitted simplex is positively oriented with volume conserved.
  • mode="elevate" — every linear cell is promoted to its serendipity quadratic counterpart (triangletriangle6, hexahedronhexahedron20), adding one node per unique edge at the edge midpoint with point_data set to the endpoint mean.
linear = meshioplusplus.convert_cells(mesh, mode="linearize")
tets = meshioplusplus.convert_cells(mesh, mode="simplexify")   # hexes -> tetra
quadratic = meshioplusplus.convert_cells(mesh, mode="elevate")

Each mode is idempotent on cells it does not apply to, so it is safe on a mixed-order mesh, and output is byte-identical across mesh backends and thread counts.

Refinement

meshioplusplus.refine subdivides every cell into congruent children of the same cell type, increasing a mesh's resolution: line → 2, triangle → 4, quad → 4, tetra → 8, wedge → 8, hexahedron → 8, with levels=n applying the templates n times. See doc/refine.md.

New nodes sit at the midpoints of the parent's edges, quad faces and (hexahedron only) body, and carry the mean of that entity's corner values for every point_data array — so a linear field is interpolated exactly. Mid-edge and quad-face-centre nodes are shared between every cell touching the entity, so the refined mesh has no hanging nodes; each parent's cell_data row is replicated to its children.

fine = meshioplusplus.refine(mesh)                      # one level
finer = meshioplusplus.refine(mesh, levels=2)           # 64x the cells in 3D
tagged = meshioplusplus.refine(mesh, record_parent_ids=True)

Children inherit the parent's orientation (zero newly-inverted cells for a well-oriented input), and volume is conserved — exactly for tetra always, and for wedge/hexahedron when the parent is affine. Higher-order cells, pyramid, and ragged blocks have no same-type subdivision and raise by name.

Decimation

meshioplusplus.decimate is refine's inverse: it reduces a surface mesh's face count by greedy quadric-error-metric (Garland–Heckbert) edge collapse, preserving shape, boundaries and features. Exactly one stopping criterion is given — ratio (fraction of faces to keep), target_faces, or max_error — and the output is all-triangle (quad/polygon blocks are triangulated first, block structure kept 1:1). See doc/decimate.md.

a refined sphere before and after decimation to 25% of its faces

coarse = meshioplusplus.decimate(mesh, ratio=0.25)            # keep 25% of the faces
coarse = meshioplusplus.decimate(mesh, target_faces=5000)     # absolute face budget
coarse, report = meshioplusplus.decimate(mesh, max_error=1e-6, return_report=True)

Boundary vertices (once-used-edge test) and feature vertices (face normals differing by more than feature_angle, default 30°) are pinned by default, so an open patch keeps its outline exactly and a cube keeps its corners; the link condition and a normal-flip guard reject any collapse that would change topology, create a non-manifold edge, or fold the surface. Float point_data blends along the collapsed edge; integer arrays keep the survivor's value. Volume meshes raise by name — run extract_surface first, then decimate the skin.

Partitioning

meshioplusplus.partition decomposes a mesh into exactly N balanced pieces for domain decomposition — the count-driven complement to the criterion-driven split. See doc/partition.md.

  • SFC (the default fallback, always available, dependency-free): cells are cut into contiguous ranges along a Hilbert space-filling curve of their centroids — equal-weight part sizes differ by at most one cell, weights=<cell_data> balances a per-cell cost instead, and the assignment is deterministic and byte-identical across mesh backends and thread counts.
  • KaHIP (the optional quality path): the shared-face dual graph goes through KaHIP's serial kaffpa(), which actively minimizes the edge cut. Configure imbalance (default 3%), mode (fast/eco/strong, default eco — eco/strong carry the quality) and seed. KaHIP is MIT-licensed like meshio++ itself, so enabling it changes nothing about licensing; it is bring-your-own (-DMESHIOPLUSPLUS_WITH_KAHIP=ON + KAHIP_ROOT, Conan with_kahip, vcpkg feature kahip — next to the HDF5/zstd-style optional deps), links only the serial interface (no MPI), and pip install meshioplusplus[kahip] gives pure-Python installs the same quality path via the MIT kahip wheel. Requesting it where absent fails by name — never a silent downgrade.
pieces = meshioplusplus.partition(mesh, 4)                    # list of 4 meshes
labels = meshioplusplus.partition_labels(mesh, 4)             # per-block Int64 part ids
quality = meshioplusplus.partition(mesh, 16, method="kahip", mode="strong")

Pieces keep the input's block structure 1:1, so they recombine into the input: every cell lands in exactly one piece (ghost_layers is reserved for halo growth and raises for now).

Smoothing

meshioplusplus.smooth relaxes point coordinates toward their edge-neighbour centroids to improve element shape, leaving topology and every data value alone: only the points move. See doc/smooth.md.

Both operators are driven by the same centroid displacement. Laplacian (x <- x + lambda*L(x)) smooths strongly per pass but shrinks — over 40 iterations on a jittered 8×8 quad grid it contracts the bounding box by 57%. Taubin (the default) follows each +lambda pass with a larger-magnitude -mu pass that deliberately un-shrinks, leaving the same grid 3.6% smaller. Neighbours are the nodes joined by an actual cell edge, not the element clique, so a structured hex block is a fixed point rather than being bevelled toward a sphere. Boundary nodes, feature nodes (incident boundary facet normals differing by more than feature_angle), an optional frozen mask, and the nodes of blocks whose edge topology is unknown are all pinned by default, and the inversion guard rejects any move that would turn a valid cell inverted.

relaxed = meshioplusplus.smooth(mesh)                          # 10 Taubin iterations
harder = meshioplusplus.smooth(mesh, iterations=40)            # shrink-free even so
lap = meshioplusplus.smooth(mesh, method="laplacian", lambda_=0.4)  # note the underscore
out, report = meshioplusplus.smooth(mesh, return_report=True)  # nodes moved, max displacement

lambda_ carries a trailing underscore because lambda is a Python keyword, and a negative value means "this method's own default" (0.5 Laplacian, 0.33 Taubin). Point and cell counts, connectivity, cell_data, field_data, point_data values and the points array's dtype all come through unchanged, and output is byte-identical across mesh backends and thread counts.

Field transfer (interpolation)

meshioplusplus.interpolate samples a source mesh's data arrays onto a target mesh — the first cross-mesh operation that transfers data (diff compares, merge concatenates). The result is a copy of the target, its own geometry/data/sets preserved exactly, with the requested source arrays sampled on: source point_data at the target's points, source cell_data by nearest source-cell centroid. method="nearest" (default) copies the nearest source point's value bit-for-bit; method="barycentric" simplexifies the source first and interpolates linearly — exact on a linear field — with default_value/extrapolate deciding what happens outside the source domain. Both search grids are bucket-grid spatial hashes (never O(N²)), and output is byte-identical across backends, thread counts and the C++/numpy boundary. See doc/interpolate.md.

coarse = meshioplusplus.read("solution.vtu")   # carries point_data "T"
fine = meshioplusplus.read("remeshed.vtu")
mapped = meshioplusplus.interpolate(coarse, fine, method="barycentric")
meshioplusplus.write("mapped.vtu", mapped)

Slicing / cross-sections

meshioplusplus.slice computes the planar cross-section of a mesh — the actual intersection of the mesh with a plane, one topological dimension below the cut cells: a 3D volume mesh yields a triangle/quad surface, a 2D surface mesh a line mesh. Unlike crop (plane mode), which keeps whole cells on one side, slice computes the intersection and lowers the dimension. It uses robust marching tetrahedra (the input is simplexified first, so each cell's cross-section is a well-defined convex primitive), deduping crossing points on shared edges into single nodes so the section is watertight, and winding every face consistently toward the +normal side. Each section cell inherits its parent's cell_data; record_parent_ids=True attaches slice:parent_cell, and point_data is interpolated at the cut. Output is byte-identical across backends, thread counts and the C++/numpy boundary. See doc/slice.md.

vol = meshioplusplus.read("part.vtu")                          # a tetra/hex/wedge mesh
section = meshioplusplus.slice(vol, origin=(0, 0, 0.5), normal=(0, 0, 1))
meshioplusplus.write("section.vtu", section)                  # a triangle/quad surface at z=0.5

(slice shadows the Python built-in only as a module attribute — meshioplusplus.slice is intended.)

Isosurfaces / contours

meshioplusplus.isosurface computes the level set of a scalar field — the locus where a point_data array equals a given isovalue, as a mesh one topological dimension below the cut cells: a 3D volume mesh yields a triangle/quad surface, a 2D surface mesh a line contour. It is the data-driven sibling of slice (which cuts where the distance to a plane is zero) and shares its marching-tetrahedra cutter, so contours are watertight in the same way. The field must be point_datacell_data is piecewise constant and has no level set, so naming one raises and points at cell_data_to_point_data. Several isovalues land in one mesh, cut in ascending order and tagged per cell with a Float64 iso:value and an Int64 iso:index (the ordinal — the integer tag split(by="region", tag=…) needs). The contoured field reads back as exactly the isovalue on the cut points, faces are wound toward increasing field, and an out-of-range isovalue is an empty contour rather than an error. Output is byte-identical across backends, thread counts and the C++/numpy boundary. See doc/isosurface.md.

vol = meshioplusplus.read("part.vtu")                          # carrying point_data["T"]
shells = meshioplusplus.isosurface(vol, "T", [300.0, 350.0, 400.0])
meshioplusplus.write("shells.vtu", shells)                     # three tagged contour surfaces

These operations are exposed across every binding surface (Python, C API, Fortran, WASM) and as the CLI verbs meshioplusplus quality, meshioplusplus extract-surface, meshioplusplus reorder, meshioplusplus diff, meshioplusplus merge, meshioplusplus transform, meshioplusplus clean, meshioplusplus crop, meshioplusplus slice, meshioplusplus split, meshioplusplus stats, meshioplusplus convert-cells, meshioplusplus refine, meshioplusplus partition, meshioplusplus smooth, meshioplusplus interpolate, and meshioplusplus isosurface.

Data operations (rename / average / calc / condition / summarize)

A second bundle operates on the data arrays a mesh carries (point_data / cell_data / field_data) rather than on its geometry, which none of them ever modifies:

  • meshioplusplus.data_rename / data_drop / data_keep — rewrite which arrays a mesh carries and under what names; values, dtypes and shapes are copied verbatim. See doc/data_manage.md.
  • meshioplusplus.point_data_to_cell_data / cell_data_to_point_data — move data between locations by averaging, optionally weighted by cell area/volume. See doc/data_average.md.
  • meshioplusplus.data_calc — derive a new array from an elementwise expression (+ - * /, parentheses, abs/sqrt/min/max/norm) evaluated by a hand-written parser — no external parser library, no arbitrary-code path. See doc/data_calc.md.
  • meshioplusplus.data_condition — clamp, normalize to a target range, or standardize to zero mean / unit standard deviation, per component or by row magnitude. See doc/data_condition.md.
  • meshioplusplus.data_info — a read-only per-array summary (dtype, shape, components, min/max/mean, NaN/inf counts) — the data-side complement to info and compute_stats. See doc/data_info.md.
out = meshioplusplus.data_calc(mesh, "norm(velocity)", location="point", output="speed")
out = meshioplusplus.point_data_to_cell_data(out, keys=["speed"], suffix="_c")
out = meshioplusplus.data_condition(out, "cell", ["speed_c"], mode="normalize")
out = meshioplusplus.data_rename(out, "point", "T", "temperature")
arrays = meshioplusplus.data_info(out)                     # list of per-array dicts

These are likewise exposed across every binding surface, and as the nine CLI verbs under the meshioplusplus data group (info, rename, drop, keep, to-cell, to-point, calc, clamp, normalize). See doc/data_operations.md.

Time series

The XDMF format supports time series with a shared mesh. You can write times series data using meshio++ with

with meshioplusplus.xdmf.TimeSeriesWriter(filename) as writer:
    writer.write_points_cells(points, cells)
    for t in [0.0, 0.1, 0.21]:
        writer.write_data(t, point_data={"phi": data})

and read it with

with meshioplusplus.xdmf.TimeSeriesReader(filename) as reader:
    points, cells = reader.read_points_cells()
    for k in range(reader.num_steps):
        t, point_data, cell_data = reader.read_data(k)

Interactive viewer

Try it in your browser

the meshio++ browser viewer

The browser viewer — reading, rendering and converting entirely client-side.

One call, two backends:

import meshioplusplus

mesh = meshioplusplus.read("part.msh")
meshioplusplus.view(mesh)                      # pick a backend automatically
meshioplusplus.view(mesh, backend="polyscope") # a native desktop window
meshioplusplus.view(mesh, backend="browser")   # vtk.js, in a browser or notebook

The desktop backend is Polyscope, an optional Python-only extra (pip install meshioplusplus[viewer]). It draws solids you can slice into, colours by any point or cell array, and renders headless screenshots for CI and docs:

meshioplusplus.screenshot(mesh, "part.png", color_by="temperature")
the example bracket in Polyscope, coloured by scaled Jacobian

The bundled example.msh bracket coloured by element quality — this image is generated by screenshot() itself.

The browser backend needs nothing extra. The same app is hosted as a live demo: drag in any supported format, colour by point or cell data, and convert and download to another format — all client-side, with no server and no upload. Since it runs the WebAssembly build, every format meshio++ reads works there too.

From the command line:

meshioplusplus view part.msh
meshioplusplus screenshot part.msh part.png --size 1600 1200

See the viewer docs for how volume meshes are handled and what each backend can and cannot do.

Interoperability

Hand a mesh straight to the tools you reach for next — no file round-trip, and the numpy buffers are shared, not copied, wherever the target accepts them as they are:

import meshioplusplus

mesh = meshioplusplus.read("bracket.msh")

grid = meshioplusplus.to_pyvista(mesh)      # a pyvista.UnstructuredGrid
tm = meshioplusplus.to_trimesh(mesh)        # a trimesh.Trimesh (triangles only)

Both directions exist (from_pyvista, from_trimesh). Mixed-type meshes are the normal case, and named regions ride along as region:<name> mask arrays plus a metadata sidecar, so even a gmsh physical group's integer tag survives a PyVista round-trip. zero_copy_only=True turns any step that would copy into a named error instead of a silent one.

Data arrays also export to Apache Arrow and Parquet for the analytics stack:

meshioplusplus.write_parquet(mesh, "cells.parquet", location="cell")

import pandas
pandas.read_parquet("cells.parquet").head()
meshioplusplus data export bracket.msh cells.parquet --location cell

Multi-component arrays keep their shape (as Arrow fixed_size_list columns), and the mesh's counts, cell types and region names travel in the schema metadata. This is a data export, not a mesh format — it does not round-trip geometry and is deliberately not in the format registry.

PyVista, trimesh and pyarrow are Python-only optional extras (pip install meshioplusplus[interop], or one at a time with [pyvista] / [trimesh] / [arrow]). They are kept out of [all], which means "the optional dependencies the formats need". None of them reaches the C++/WebAssembly/C/Fortran core, which stays dependency-free.

Meshes also hand off to the GPU through the standard exchange protocols — DLPack as the primary export (which covers host arrays too), __cuda_array_interface__ consumed on the way back:

gpu = meshioplusplus.to_cupy(mesh)            # one host→device transfer per array
gpu.point_data["T"] *= 2.0                    # any CuPy / RAPIDS kernel
meshioplusplus.write("out.vtu", meshioplusplus.from_cupy(gpu))

The host→device move is always a bus transfer — what this removes is the file round-trip and every extra copy around it. to_dlpack(mesh) exports host arrays any DLPack consumer (PyTorch, JAX, Numba, …) adopts in place. There is deliberately no [gpu] extra: CuPy wheels are CUDA-version-specific, so install the one matching your toolkit (e.g. pip install cupy-cuda13x for CUDA 13.x, cupy-cuda12x for 12.x).

See the interoperability docs for the full mapping tables, the zero-copy contract, and the Open3D/DOLFINx design sketch, and the GPU docs for the device handoff.

ParaView plugin

gmsh paraview *A Gmsh file opened with ParaView.*

If you have downloaded a binary version of ParaView, you may proceed as follows.

  • Install meshio++ for the Python major version that ParaView uses (check pvpython --version)
  • Open ParaView
  • Find the file paraview-meshioplusplus-plugin.py of your meshio++ installation (on Linux: ~/.local/share/paraview-5.9/plugins/) and load it under Tools / Manage Plugins / Load New
  • Optional: Activate Auto Load

You can now open all meshio++-supported files in ParaView.

Benchmarks

How much does the C++ core help? The benchmark/ folder times read/write conversions against the original pure-Python meshio on the formats both support (same in-memory mesh, same machine). The headline input is the bundled example.msh — a real Gmsh bracket (~52k nodes, ~293k cells).

meshio vs meshio++ speedup on example.msh

meshio++'s biggest wins are the parallel and text paths: VTU binary+zlib ~16× write (the zlib blocks run across cores via an OpenMP backend with dynamic scheduling — hybrid P+E-core CPUs load-balance too), VTU ASCII ~7× write / ~5× read, and mixed-topology XDMF read ~10×. The binary and HDF5 formats that used to be slower — VTK/Gmsh binary, UGRID, and MED — are now at or above parity after an optimisation pass (bulk-buffered binary I/O, single-instruction bswap endianness conversion, a real parallel backend, an Eigen-backed MED transpose, zero-copy cell reconstruction that moves the connectivity buffer straight into the mesh, and uninitialised reader buffers + thread-parallel block copies so nothing is written twice); binary reads now match or beat numpy's fromfile — Gmsh ~1.7×, single-type VTK ~1.45×, and even mixed-topology VTK ~1.1×. Output stays byte-identical throughout.

The speedup is per-element: text/parallel formats climb out of the small-mesh regime and plateau (large meshes realise the full speedup):

speedup vs mesh size

Full methodology and a reproducible notebook are on the Benchmarks doc page (source: benchmark/01_benchmark.ipynb).

Reading only what you need

import meshioplusplus

mesh = meshioplusplus.read("big.vtu", points_only=True)   # geometry, no data arrays
mesh = meshioplusplus.read("big.vtu", arrays=["u", "p"])  # only these arrays
meta = meshioplusplus.read_metadata("big.vtu")            # counts/names, no heavy arrays

VTU, VTP, XDMF and Gmsh skip the unwanted array bodies outright; other formats are read in full and filtered, and meta["fell_back_to_full_read"] says which happened. Large files can also be memory-mapped (automatic above 16 MiB), which roughly halves peak memory during a read. See selective reads and memory-mapped reading.

VTK XML output can additionally use lz4 (ParaView-readable) or zstd (a meshio++ extension) instead of zlib, when built with -DMESHIOPLUSPLUS_WITH_LZ4=ON / -DMESHIOPLUSPLUS_WITH_ZSTD=ON. zlib remains the default. See compression codecs.

Installation

meshio++ is available from the Python Package Index, so simply run

pip install meshioplusplus

to install.

Additional dependencies (netcdf4, h5py) are required for some of the output formats and can be pulled in by

pip install meshioplusplus[all]

For JavaScript / browser use, the C++ core also ships as a WebAssembly npm package covering every format above — including the HDF5- and netCDF-backed ones (CGNS, H5M, HMF, MED, Exodus), as of v8.0.0:

npm install @meshioplusplus/wasm

See the WebAssembly / JavaScript doc page for usage and the format-support table.

C / Fortran API

For HPC codes written in C or Fortran, the C++ core also builds as an installable shared library (libmeshioplusplus, pure-C99 header, pkg-config + find_package support) with a modern OO Fortran 2008 module on top:

./build/configure.sh --fortran --tests --build     # --c-api for the C API alone
cmake --install build/cpp-release --prefix /opt/meshioplusplus
mio_mesh* m = mio_read("in.msh", NULL);
printf("%lld points\n", (long long)mio_mesh_num_points(m));
mio_write("out.vtu", m, NULL);
mio_mesh_free(m);
use meshioplusplus
type(mio_mesh) :: m
call m%read("in.msh")
call m%write("out.vtu")
call m%free()

The C API is also packaged for Conan (root conanfile.py) and vcpkg (overlay port under packages/vcpkg/meshioplusplus/), both driving the same install/find_package path:

conan create . -o meshioplusplus/*:with_hdf5=True
vcpkg install meshioplusplus --overlay-ports=ports

Full mesh access (build meshes from raw arrays, zero-copy readback) is covered on the C API and Fortran doc pages.

Julia / R bindings

The same installed C library also carries bindings for Julia and R, the two remaining languages of the scientific-computing audience. Both are layered on libmeshioplusplus exactly as the Fortran module is — no new C++, and the core stays untouched:

import MeshioPlusPlus as mio
m = mio.read("bracket.msh")
mio.write(mio.extract_surface(m), "surface.vtu")
library(meshioplusplus)
m <- mio_read("bracket.msh")
mio_write(mio_extract_surface(m), "surface.vtu")

Julia and R are both column-major, so — as in Fortran — points shaped (dim, n) and connectivity (nodes_per_cell, n) are the same memory as the C API's row-major shapes, and nothing is ever transposed. Node indices are 1-based, with the shift applied inside the copying accessors only; Julia additionally exposes genuine zero-copy borrows (points_ptr, connectivity_ptr) whose validity window is enforced rather than merely documented. R is copy-only — R vectors are R-managed, so a borrow cannot survive into R — and says so plainly instead of implying parity.

[!IMPORTANT] The Julia binding is not MIT. bindings/julia/ is released under the GNU General Public License, version 3 (GPL-3.0) — a copyleft license, not a permission-required one: anyone may use, modify or sell it commercially with no permission needed, but distributing it or a modified version of it must be under GPL-3.0 too, with source available; purely private use carries no obligation. Everything else in this repository, including the C API it calls and the R binding, remains MIT.

See the Julia and R doc pages.

Single-header C++

The whole C++ core is also amalgamated into one self-contained, STB-style header — src/single_include/meshioplusplus/meshioplusplus.hpp — with pugixml bundled and no external dependencies by default. Drop it in, no CMake or linking required:

// in exactly ONE .cpp:
#define MESHIOPLUSPLUS_IMPLEMENTATION
#include "meshioplusplus/meshioplusplus.hpp"
// elsewhere: just #include it (declarations only)
g++ -std=c++20 -I src/single_include main.cpp

It is generated by ./tools/amalgamate.sh and kept in sync by CI. See the single-header doc page (optional HDF5/netCDF/zlib formats via MESHIOPLUSPLUS_HAS_* macros).

example/cpp/ is the C++ counterpart of example/python/: the same tour of meshio++, called directly against this single header instead of the Python bindings, on the xeus-cpp Jupyter kernel — no PyVista either, renders go through meshio++'s own SVG writer. example/julia/ and example/r/ are the same tour again, called through the Julia and R bindings on their own Jupyter kernels (IJulia / IRkernel) — since those flat-ABI bindings can't drive the SVG writer's data-driven colouring either, quality/field renders are small charts instead of colour.

C++ mesh backends

Standalone C++ builds (no Python) can swap the in-memory mesh structure at compile time via MESHIOPLUSPLUS_MESH_BACKEND — every format works identically under each backend:

  • MESHIO (default; the Python extension and PyPI wheels always use it) — mirrors the Python meshio.Mesh;
  • NATIVE — the fastest pure-C++ structure (canonical Float64/Int64 storage, cell-type enum, CSR ragged blocks); the WebAssembly build uses it;
  • KRATOS — a Kratos Multiphysics-style ModelPart (Nodes/Elements/Conditions/SubModelParts) plus a header-only templated bridge that populates a real Kratos::ModelPart with no Kratos build dependency.
./build/configure.sh --mesh-backend NATIVE --tests --build

See the C++ mesh backends doc page.

Testing

To run the meshio++ unit tests, check out this repository, install it with the test extras, and type

pytest tests/python/

License

meshio++ is published under the MIT license, with one exception: the Julia binding in bindings/julia/ is released under the GNU General Public License, version 3 (GPL-3.0). GPL-3.0 is copyleft, not permission-required: anyone may use, modify or sell it commercially without asking, but distributing it (or a modified version) must be under GPL-3.0 too, with source available; purely private/internal use carries no obligation at all. Nothing else is affected: the C++ core, the C API that binding calls, and the R binding are all MIT.

Acknowledgements

meshio++ is a fork of meshio by Nico Schlömer and its contributors (MIT). meshio is where the Mesh data model, the cell-type naming, and the great majority of the format readers and writers come from; this fork adds a C++20 core, an operations layer, and the C/Fortran/WebAssembly bindings on top of that foundation. The original copyright is retained in LICENSE.

Some code and test fixtures also come from Simvia's meshlane fork of meshio (MIT), credited per-change in CITATION.cff and CHANGELOG.md.

The C++ core is dependency-free by design. Everything below is either optional, bundled, or confined to one binding or tool.

Runtime dependencies (Python)

Project Used for License
NumPy the array type the whole data model is built on BSD-3-Clause
Rich CLI output formatting MIT

Optional dependencies

Project Extra Used for License
Polyscope [viewer] the desktop viewer and screenshot() MIT
PyVista [pyvista] / [interop] to_pyvista() / from_pyvista() BSD-3-Clause
trimesh [trimesh] / [interop] to_trimesh() / from_trimesh() MIT
pyarrow [arrow] / [interop] the Arrow/Parquet data export Apache-2.0
CuPy — (wheels are CUDA-version-specific, e.g. cupy-cuda13x — see the GPU docs) to_cupy() / from_cupy() MIT
h5py [all] the Python fallback for CGNS, H5M, MED, XDMF BSD-3-Clause
netCDF4 [all] the Python fallback for Exodus MIT
KaHIP [kahip] / CMake the quality graph-partitioning backend MIT
zstandard, lz4 [codecs] the Python fallback for the optional VTK block codecs BSD-3-Clause / BSD-2-Clause

Bundled and build-time

Project Used for License
pugixml XML parsing in the C++ core (vendored in src/cpp/third_party/) MIT
Eigen the MED Fortran↔C transpose (git submodule, optional) MPL-2.0
pybind11 the Python bindings BSD-3-Clause
scikit-build-core the CMake-driven build backend Apache-2.0
Emscripten the WebAssembly build MIT / NCSA
GoogleTest the C++ test suite BSD-3-Clause
zlib, Zstandard, LZ4 optional compression codecs zlib / BSD-3-Clause / BSD-2-Clause
HDF5, netCDF optional native paths for HDF5/netCDF-backed formats BSD-3-Clause / MIT-like

Browser viewer (isolated under src/viewer/)

Project Used for License
vtk.js all rendering, colour maps and the scalar bar BSD-3-Clause
Vite the app build MIT
vite-plugin-singlefile the self-contained wheel-bundled build MIT
Playwright the end-to-end tests and the documentation screenshots Apache-2.0

Also

Kratos Multiphysics (BSD-3-Clause) is the source of the skin-detection algorithm, the EnSight writer logic, the KaHIP partitioning approach and the FindKaHIP.cmake module, all these 3 implementation are from the original author of this project as well. Also thanks to its ModelPart design informs the KRATOS mesh backend. VTK and Verdict (both BSD-3-Clause) define the mesh-quality formulas. The documentation is built with VitePress (MIT) and Doxygen (GPL-2.0, used as a tool only). The logo renders the Stanford Bunny ("Stanford Bunny — Digitized!" by MakerBot, CC-BY).

Thank you to all of them.

Download files

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

Source Distribution

meshioplusplus-8.4.0.tar.gz (19.9 MB view details)

Uploaded Source

Built Distributions

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

meshioplusplus-8.4.0-cp312-cp312-win_amd64.whl (2.4 MB view details)

Uploaded CPython 3.12Windows x86-64

meshioplusplus-8.4.0-cp312-cp312-manylinux_2_34_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

meshioplusplus-8.4.0-cp312-cp312-manylinux_2_34_aarch64.whl (3.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

meshioplusplus-8.4.0-cp312-cp312-macosx_13_0_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.12macOS 13.0+ x86-64

meshioplusplus-8.4.0-cp312-cp312-macosx_13_0_arm64.whl (2.1 MB view details)

Uploaded CPython 3.12macOS 13.0+ ARM64

meshioplusplus-8.4.0-cp311-cp311-win_amd64.whl (2.4 MB view details)

Uploaded CPython 3.11Windows x86-64

meshioplusplus-8.4.0-cp311-cp311-manylinux_2_34_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

meshioplusplus-8.4.0-cp311-cp311-manylinux_2_34_aarch64.whl (3.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

meshioplusplus-8.4.0-cp311-cp311-macosx_13_0_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.11macOS 13.0+ x86-64

meshioplusplus-8.4.0-cp311-cp311-macosx_13_0_arm64.whl (2.1 MB view details)

Uploaded CPython 3.11macOS 13.0+ ARM64

meshioplusplus-8.4.0-cp310-cp310-win_amd64.whl (2.4 MB view details)

Uploaded CPython 3.10Windows x86-64

meshioplusplus-8.4.0-cp310-cp310-manylinux_2_34_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

meshioplusplus-8.4.0-cp310-cp310-manylinux_2_34_aarch64.whl (3.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

meshioplusplus-8.4.0-cp310-cp310-macosx_13_0_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.10macOS 13.0+ x86-64

meshioplusplus-8.4.0-cp310-cp310-macosx_13_0_arm64.whl (2.1 MB view details)

Uploaded CPython 3.10macOS 13.0+ ARM64

meshioplusplus-8.4.0-cp39-cp39-win_amd64.whl (2.4 MB view details)

Uploaded CPython 3.9Windows x86-64

meshioplusplus-8.4.0-cp39-cp39-manylinux_2_34_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

meshioplusplus-8.4.0-cp39-cp39-manylinux_2_34_aarch64.whl (3.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ ARM64

meshioplusplus-8.4.0-cp39-cp39-macosx_13_0_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.9macOS 13.0+ x86-64

meshioplusplus-8.4.0-cp39-cp39-macosx_13_0_arm64.whl (2.1 MB view details)

Uploaded CPython 3.9macOS 13.0+ ARM64

File details

Details for the file meshioplusplus-8.4.0.tar.gz.

File metadata

  • Download URL: meshioplusplus-8.4.0.tar.gz
  • Upload date:
  • Size: 19.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for meshioplusplus-8.4.0.tar.gz
Algorithm Hash digest
SHA256 83cab964248543c5e42257eba355f5e04d995c0b3b65570df1d6f11278ff6ffb
MD5 9835d4322396a08d9246e64b789e06f7
BLAKE2b-256 743ffebc22479e6c34e3264ef299f9d5e8dd297db56aded8b88cb1a7b56a3d13

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0.tar.gz:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3599dc06fea28b62faa3506fbc47d3e0658629b1c556b20a2afd3e32aa57fa8a
MD5 a48f2ca41e470e0bb7c9044033122c88
BLAKE2b-256 f2ebed2564e2e8bcdae278d177bfc6c2769adb25b6a231e704734d5a2e8249da

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp312-cp312-win_amd64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 09b2488aebf73d50081bb9991f897b7a05a6742362c8a3a1dfa8a8e683fa447e
MD5 ef95200dd6864ee6f1d4ac131682c003
BLAKE2b-256 dcb7ce3e1ae9dddc8c87839b8ecc032d7a514fed38c0cba8a9c66fd1ba51f133

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp312-cp312-manylinux_2_34_x86_64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp312-cp312-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 17acb2614b177789ebc46d875eedd71f47cd7ded2c54c19a7465327e2bc21a2d
MD5 e0f204a06b207a7ec60889f980e3c928
BLAKE2b-256 3e33453af9dd3fa95f8452185d7fd5ba3ea5f3890abf6ba1c794c95b79d9e0c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp312-cp312-manylinux_2_34_aarch64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp312-cp312-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp312-cp312-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 c305095447ae6a28ec6c29a30716426def6e4bf64f5a690b23cdb7d297a72c7b
MD5 aa5c6fd8d14698661a20544044bded2c
BLAKE2b-256 f40ef5698cd09671ad129d94d3382706e4a496846701e2b79ec1cd7e9e26b882

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp312-cp312-macosx_13_0_x86_64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp312-cp312-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp312-cp312-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 1f31031f6e07a0117324ad29efa834aff80e7c5607156f7266df13b3654a832f
MD5 b8a3a3ccb4584c49df3f7d054b952deb
BLAKE2b-256 9fe6d650f931aca7d608fe7c057f298eadebcfc2f22e6bc8c26c02f3bd9e66e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp312-cp312-macosx_13_0_arm64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9b2fbeeaf2ca17cd46f847ec64cd44f3e71d2ebbf1b4fb50b0265bd7254fb775
MD5 8913fe07a2c75ae88e1a66c66379953c
BLAKE2b-256 b491192ce5155c5cebde2a07289e59bc9ca5446a47ae67cf5ca702e084121710

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp311-cp311-win_amd64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 c848e814f045bc7465d183b3062f25833d070a7f077e4f706bf8770d1d943286
MD5 5a1d63e5dea22cee41d225e245a9d512
BLAKE2b-256 ddbc94d317f58aceadabfb38bb38de6cb51b8737e3cb06e984b9f5abebaf3b4d

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp311-cp311-manylinux_2_34_x86_64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp311-cp311-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 1ae7ced5f06bed7652e48ee7db28b8d6ceae0d7dda6e4380cf713bd4f4c60b07
MD5 a7824ca3d2f9b4e3da0e6cda884a1e43
BLAKE2b-256 d81c9b1028bf79c76ebe826b9dd3ab2d09be53efca297dbd60f5e62f45e64171

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp311-cp311-manylinux_2_34_aarch64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp311-cp311-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp311-cp311-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 40ac95719bcc04ae643a9f8ca6eef9c742558726d2f26c754746822159a7103d
MD5 3fd94fc6b432e3dfe45b5d2fe4ad8f2e
BLAKE2b-256 c5137c7e2f6e14fc24b36c0772ea6baea763fb9c46b2f484f08a9cd9e592473f

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp311-cp311-macosx_13_0_x86_64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp311-cp311-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp311-cp311-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 aa248e269fe7c9bcb1147bff1dea13ff61cb6227a8c98aed7e93f9f166a7611d
MD5 2d66437c7f4b0f1b33646b717878fffb
BLAKE2b-256 9610422712d3736a827046582e8302cc4a0435246ba842e0dcfe35386a87e75b

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp311-cp311-macosx_13_0_arm64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e4ac3149be6e58f1ff0a8fdd7441483e4924b3d4f4d7dca448dee0365d07f156
MD5 48d1926c77045b870bdb69475ea3bcf6
BLAKE2b-256 c02b4bcd4fe21801306979fe9cef827ef8895506971a965501e57ad59650175c

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp310-cp310-win_amd64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 f5c78ced10eae0bd5bc52570d94c12c9bb0cc833a9a747292a5c2c9aeba66d6f
MD5 a77a9773a8ad188d16e13dc939117d05
BLAKE2b-256 b29c7859cb663419ece147b74a70f741504d5159b8e44c9c45e760140a8c71c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp310-cp310-manylinux_2_34_x86_64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp310-cp310-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 7b10216e5368a8a55814ee2b3f52a010305959e306092358998c6bac0bb195a9
MD5 014e1a850eae0d58cb8684c446d01ef4
BLAKE2b-256 3c3b7f7a35e245a731b28376e11b8cb51f8d4510b23d4f8514b108b697d261db

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp310-cp310-manylinux_2_34_aarch64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp310-cp310-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp310-cp310-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 75de0b914ed94f1dbb6803e5b5d868a05a119c40fc153894523d70c145a96efd
MD5 2feb8f1158817107c7d9d0daf4b590f1
BLAKE2b-256 32e84e051101a839e0cd1bfdb8934322bc9a427433677dd013757d51fd169b49

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp310-cp310-macosx_13_0_x86_64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp310-cp310-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp310-cp310-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 a744c76153caeeee3064cb5ace533ddfa81a5cd7ddefe00899b7005703bfd324
MD5 1734bb9a7c94623a94a95a1d1652cea9
BLAKE2b-256 0482fdbe63e321a152e6ddab66c56203a54285cd84b8d139f7f1b3618db78e93

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp310-cp310-macosx_13_0_arm64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 bf8f5359f4a4ca8bac9d4185ac1bf5174ff6bcec7a83aafaa65b886961babbdf
MD5 82844bf0564021c385ee445af4224d64
BLAKE2b-256 81d94de6fec1854ef94118e97cb3d4d7593b02b539efab157c058e9203b69edd

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp39-cp39-win_amd64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp39-cp39-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 168d9b6ea6a45ceae074ff2931bddc8b5c81cd28b10ae408c1beb46fde3cf88b
MD5 b463c1f1243203847819dbf42864b999
BLAKE2b-256 f21ff3b83f000f91d4b1899fc79d3429bf36264da0a35152b2169f05c560e78f

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp39-cp39-manylinux_2_34_x86_64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp39-cp39-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp39-cp39-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 c71f8b385c065baac4b1d8c5c0dc3265c4b089e2395d5b8863a1d1aa1b90f655
MD5 3c175ed5e5550d998d21e94a3bdb6865
BLAKE2b-256 548d13c3c17209b353a351612daaabe8e9cde10a7679635a0b501b1ef69fab49

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp39-cp39-manylinux_2_34_aarch64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp39-cp39-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp39-cp39-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 7ae6d1b5554575eccc863c3ffc54a9aa9009c2152930179b287f46b9a2542683
MD5 3915c180f3c9c805d5b686b8caf693d3
BLAKE2b-256 ae3df90f7468537fe68093fc1370e76ddab8c83eac3b38838bbbe315d6c07223

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp39-cp39-macosx_13_0_x86_64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file meshioplusplus-8.4.0-cp39-cp39-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for meshioplusplus-8.4.0-cp39-cp39-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 46bad487fe820f62ca8906a6687f84fea705c0141fc6e9387be75f1bdae12720
MD5 35f4cfe99ffaed513ccd0f16c5442267
BLAKE2b-256 e68c2281d7950613bac3a2c904186934c1b792e0fdbd3afc532b4bcb5b02ab4f

See more details on using hashes here.

Provenance

The following attestation bundles were made for meshioplusplus-8.4.0-cp39-cp39-macosx_13_0_arm64.whl:

Publisher: wheels.yml on loumalouomega/meshioplusplus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

10.17.0

21 files

10.14.0

21 files

10.9.0

21 files

10.6.0

21 files

10.0.0

21 files

9.27.0

21 files

9.25.0

21 files

9.22.0

21 files

9.14.0

21 files

9.12.0

21 files

9.11.0

21 files

9.10.0

21 files

9.9.0

21 files

9.8.0

21 files

9.7.0

21 files

9.6.0

21 files

9.4.1

21 files

9.4.0

21 files

9.3.0

21 files

9.2.0

21 files

9.1.0

21 files

9.0.0

21 files

8.7.0

21 files

8.5.0

21 files

This release

8.4.0 This release

21 files

8.3.0

21 files

8.0.0

21 files

7.16.0

21 files

7.15.0

21 files

7.14.0

21 files

7.13.0

21 files

7.12.0

21 files

7.10.0

21 files

7.7.0

21 files

7.6.0

21 files

7.5.0

21 files

7.4.0

21 files

7.3.0

21 files

7.2.1

21 files

7.2.0

21 files

7.1.0

21 files

7.0.0

21 files

6.9.0

17 files

6.8.0

17 files

6.7.0

17 files

6.6.3

17 files

6.6.1

17 files

6.6.0

17 files

6.5.0

17 files

6.4.0

17 files

6.3.2

17 files

6.3.1

17 files

6.3.0

17 files

6.2.0

17 files

6.1.0

17 files

6.0.5

17 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page