I/O for mesh files.
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
- ANSYS msh
- CGNS
- DOLFIN XML
- Exodus
- FLAC3D
- H5M
- Kratos/MDPA
- Medit
- MED/Salome
- Nastran (bulk data)
- Neuroglancer precomputed format
- Gmsh (versions 2 and 4)
- OBJ
- OFF
- PERMAS
- PLY
- STL
- TetGen .node/.ele
- SVG (2D only, output only)
- VTK
- VTU (not raw binary data)
- WKT (TIN)
- XDMF
Install with
pip3 install meshio[all] --user
and simply call
meshio-convert input.msh output.vtu
with any of the supported formats.
In Python, simply do
import meshio
mesh = meshio.read(
filename, # string, os.PathLike, or a buffer/open file
file_format="stl" # optional if filename is a path; inferred from extension
)
# mesh.points, mesh.cells, ...
# mesh.vtk.read() is also possibleto read a mesh. To write, do
points = numpy.array([
[0.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 1.0],
])
cells = {
"triangle": numpy.array([
[0, 1, 2]
])
}
meshio.write_points_cells(
"foo.vtk",
points,
cells,
# Optionally provide extra data on points, cells, etc.
# point_data=point_data,
# cell_data=cell_data,
# field_data=field_data
)or explicitly create a mesh object for writing
mesh = meshio.Mesh(points, cells)
meshio.write(
"foo.vtk", # str, os.PathLike, or buffer/ open file
mesh,
# file_format="vtk", # optional if first argument is a path; inferred from extension
)
# mesh.vtk.write() is also possibleFor 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).
Reading and writing can also be handled directly by the Mesh object:
m = meshio.Mesh.read(filename, "vtk") # same arguments as meshio.read
m.write("foo.vtk") # same arguments as meshio.write, besides `mesh`The XDMF format supports time series with a shared mesh. You can write times series data using meshio with
with meshio.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 meshio.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)Some mesh formats are more suitable for I/O than others. Here you find an overview of how fast the meshio routines are for a certain mesh with about 100k nodes.
Comparison of the file sizes for a tetrahedral mesh with about 100k points. The red line marks the size of the mesh in memory.
meshio is available from the Python Package Index, so simply do
pip3 install meshio --user
to install.
Additional dependencies (netcdf4, h5py and lxml) are required for some of the
output formats and can be pulled in by
pip install meshio[all] --user
You can also install meshio from anaconda:
conda install -c conda-forge meshio
To run the meshio unit tests, check out this repository and type
pytest
meshio is published under the MIT license.