scikit-fem: from_meshio fails on old ex27

I was trying to regenerate a mesh for ex27 as part of the discussion with @bhaveshshrimali on the speed of pypardiso relative to scipy.sparse in #690 so that the number of elements could be varied but the old make_mesh(make_geom(...)) code seems not to work with the new (#680 ?) skfem.io.mesh.from_meshio.

The code:

from skfem import *
from skfem.io.meshio import from_meshio

from itertools import cycle, islice

import numpy as np

from pygmsh import generate_mesh
from pygmsh.built_in import Geometry


def make_geom(length: float, lcar: float) -> Geometry:
    # Barkley et al (2002, figure 3 a - c)
    geom = Geometry()

    points = []
    for point in [
        [0, -1, 0],
        [length, -1, 0],
        [length, 1, 0],
        [-1, 1, 0],
        [-1, 0, 0],
        [0, 0, 0],
    ]:
        points.append(geom.add_point(point, lcar))

    lines = []
    for termini in zip(points, islice(cycle(points), 1, None)):
        lines.append(geom.add_line(*termini))

    for k, label in [
        ([1], "outlet"),
        ([2], "ceiling"),
        ([3], "inlet"),
        ([0, 4, 5], "floor"),
    ]:
        geom.add_physical(list(np.array(lines)[k]), label)

    geom.add_physical(geom.add_plane_surface(geom.add_line_loop(lines)), "domain")

    return geom


if __name__ == "__main__":
    from pathlib import Path

    geom = make_geom(35.0, 0.2)

    with open(Path(__file__).with_suffix(".geo"), "w") as fgeo:
        fgeo.write(geom.get_code())

    mio = generate_mesh(geom, dim=2)
    print(mio)

    mesh = from_meshio(mio)
    print(mesh)

    mesh.save(Path(__file__).with_suffix(".vtk"))

When I run this with pygmsh==6.1.1 (before the big API change in pygmsh 7), I believe that this generates a valid *.geo file, which is accepted by Gmsh (4.8.4 here) and Gmsh can write this as MSH 4.1 file which is understood by meshio, but something goes wrong in skfem.io.meshio.from_meshio:

Traceback (most recent call last):
  File "/home/gdmcbain/src/scikit-fem/docs/examples/ex27_mesh.py", line 55, in <module>
    mesh = from_meshio(mio)
  File "/home/gdmcbain/miniconda3/envs/skfem/lib/python3.9/site-packages/skfem/io/meshio.py", line 93, in from_meshio
    facets = {k: [tuple(f) for f in
  File "/home/gdmcbain/miniconda3/envs/skfem/lib/python3.9/site-packages/skfem/io/meshio.py", line 94, in <dictcomp>
    np.sort(m.cells_dict[bnd_type][v[bnd_type]])]
IndexError: index 381 is out of bounds for axis 0 with size 380

I don’t mean to suggest that we should rely upon pygmsh<7 but I believe the GEO and MSH 4.1 files are valid, as is the meshio.Mesh, but I’ll check.

The intermediate files are generated and interrogated with

python docs/examples/ex27_mesh.py  # say, depending on where the above is saved
gmsh -2 docs/examples/ex27_mesh.geo
meshio info docs/examples/ex27_mesh.msh

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Comments: 20 (20 by maintainers)

Commits related to this issue

Most upvoted comments

Oh, O. K., great. (I wonder what’s going on here, but I’ll sort that out later.) You should be able to change lcar, the second argument to make_geom, to get meshes of different fineness to experiment with in #690.

Are you running on scikit-fem master, i.e. with #680? There were some substantial changes to skfem.io.meshio.from_meshio in that which I don’t know have been published as a release.