nschloe / meshio

:spider_web: input/output for many mesh formats
MIT License
1.96k stars 402 forks source link

writing out gmsh file after reading it in #614

Open SBFRF opened 4 years ago

SBFRF commented 4 years ago

I'm trying to read a mesh in, then write it. I use meshio to read the file in then i go to write it out and get the below error.

In[12]: a = mio.read('Mesh_interp_Mar2018.msh')
WARNING:root:The file contains tag data that couldn't be processed.

In[13]: a.cell_data
Out[13]: 
{'vertex': {'gmsh:physical': array([0, 0, 0, ..., 0, 0, 0]),
  'gmsh:geometrical': array([0, 0, 0, ..., 0, 0, 0])},
 'triangle': {'gmsh:physical': array([0, 0, 0, ..., 0, 0, 0]),
  'gmsh:geometrical': array([     1,      2,      3, ..., 213896, 213897, 213898])}}

In[14]: mio.write('out.msh', a)
WARNING:root:Binary Gmsh needs c_size_t (got int64). Converting.
WARNING:root:Binary Gmsh needs c_size_t (got int64). Converting.
Traceback (most recent call last):
  File "/home/spike/anaconda3/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3326, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-14-8540c4eefe05>", line 1, in <module>
    mio.write('out.msh', a)
  File "/home/spike/anaconda3/lib/python3.7/site-packages/meshio/_helpers.py", line 133, in write
    return writer(filename, mesh, **kwargs)
  File "/home/spike/anaconda3/lib/python3.7/site-packages/meshio/gmsh/main.py", line 109, in <lambda>
    "gmsh": lambda f, m, **kwargs: write(f, m, "4", **kwargs, binary=True),
  File "/home/spike/anaconda3/lib/python3.7/site-packages/meshio/gmsh/main.py", line 101, in write
    writer.write(filename, mesh, binary=binary)
  File "/home/spike/anaconda3/lib/python3.7/site-packages/meshio/gmsh/_gmsh41.py", line 281, in write
    write4_1(filename, mesh, binary=binary)
  File "/home/spike/anaconda3/lib/python3.7/site-packages/meshio/gmsh/_gmsh41.py", line 328, in write4_1
    _write_nodes(fh, mesh.points, mesh.cells, binary)
  File "/home/spike/anaconda3/lib/python3.7/site-packages/meshio/gmsh/_gmsh41.py", line 379, in _write_nodes
    raise WriteError("Can only deal with one cell type for now")
meshio._exceptions.WriteError: Can only deal with one cell type for now

PR #524 has the same error output, and the response suggests that the capability is not supported yet. I'm not too familiar with the different mesh types or conventions associated. Hopefully I'm not duplicating, but I used to be able to write them out so I'm thinking that something else is going on or I'm wondering if something has changed in the package (or maybe there is something else I'm missing). I've attached the mesh in a tarball.

Mesh_interp_Mar2018.msh.tar.gz

I appreciate any help!

SBFRF commented 4 years ago

So i've dug a little deeper, it doesn't seem like the meshio.read actually reads the files appropriately. I've written this to solve my problem, but i'm not sure if it's helpful for the library as a whole (as i don't throughly know the gmsh conventions, but thought i'd leave it here in case it is. (based on one of your old stack posts) https://stackoverflow.com/questions/41641505/read-formatted-data-from-part-of-a-file-fast-gmsh-mesh-format

####################
f = open(fname)
f.readline() # '$MeshFormat\n'
f.readline() # '2.2 0 8\n'
f.readline() # '$EndMeshFormat\n'
f.readline() # '$Nodes\n'
n_nodes = int(f.readline()) # '8\n'
nodes = np.fromfile(f,count=n_nodes*4, sep=" ").reshape((n_nodes,4))
f.readline() # '$EndNodes\n'
f.readline() # '$Elements\n'
n_elems = int(f.readline()) # '2\n'
boundary, internalTriangles = [], []
for ee in range(n_elems):
    data = f.readline().split()
    if len(data) is 6:
        # if boundary will have only
        boundary.append(np.array(data, dtype=int))
    elif len(data) is 9:
        internalTriangles.append(np.array(data, dtype=int))
assert f.readline() is '$EndElements\n', "File didn't read properly"
boundary = np.array(boundary)
internalTriangles = np.array(internalTriangles)
nschloe commented 2 years ago

So I've looked at the mesh now, trying to find out if this is still an issue. Turns out that not even Gmsh itself can read the file. Error:

Error   : Wrong node index 0
Error   : Error loading '/tmp/Mesh_interp_Mar2018.msh'
Info    : Done reading '/tmp/Mesh_interp_Mar2018.msh'

The tags of the triangles are also weird:

#   idx      type  num_tags   tag1   tag2    tag3  point_indices
    2950       2       3       0      44       0   13666    2532    2533
    2951       2       3       0      45       0   17054    2902    2903
    2952       2       3       0      46       0   31565   71067   71496
    2953       2       3       0      47       0   22182   22181    2906
    2954       2       3       0      48       0   21467   21250   41879
    2955       2       3       0      49       0   17022   34885    4330
    2956       2       3       0      50       0   22181   35162   22179
    2957       2       3       0      51       0    2901   46456    2900

The second tag ("geometrical entity") is different for every single triangle? That seems wrong.

Anyway, can't say if this is/was an actual meshio issue. If OP can shed some light on this, that'd be great. If not, I'll close this at some point.

SBFRF commented 2 years ago

@Thesser1 Do you know anything more about the gmsh file for ww3 that would be helpful here?

SBFRF commented 2 years ago

@Thesser1 Do you know anything more about the gmsh file for ww3 that would be helpful here?