funny ellipsoid mesh
I try to generate a mesh of an ellipsoid. With seams, it works well. When trying to get rid of the seams using setCompound
, one part of the mesh is totally bogus. This is probably a bug. Also, I cannot seem to call setCompound
on all surface parts. (Again, no error, it just doesn't work.)
import gmsh
gmsh.initialize()
x0 = [0.0, 0.0, 0.0]
radii = [1.0, 1.0, 1.0]
a = 0.1
p = [
gmsh.model.geo.addPoint(*x0, meshSize=0.1),
gmsh.model.geo.addPoint(x0[0] + radii[0], x0[1], x0[2], meshSize=0.1),
gmsh.model.geo.addPoint(x0[0], x0[1] + radii[1], x0[2], meshSize=0.1),
gmsh.model.geo.addPoint(x0[0], x0[1], x0[2] + radii[2], meshSize=0.1),
gmsh.model.geo.addPoint(x0[0] - radii[0], x0[1], x0[2], meshSize=0.1),
gmsh.model.geo.addPoint(x0[0], x0[1] - radii[1], x0[2], meshSize=0.1),
gmsh.model.geo.addPoint(x0[0], x0[1], x0[2] - radii[2], meshSize=0.1),
]
c = [
gmsh.model.geo.addEllipseArc(p[1], p[0], p[6], p[6]),
gmsh.model.geo.addEllipseArc(p[6], p[0], p[4], p[4]),
gmsh.model.geo.addEllipseArc(p[4], p[0], p[3], p[3]),
gmsh.model.geo.addEllipseArc(p[3], p[0], p[1], p[1]),
gmsh.model.geo.addEllipseArc(p[1], p[0], p[2], p[2]),
gmsh.model.geo.addEllipseArc(p[2], p[0], p[4], p[4]),
gmsh.model.geo.addEllipseArc(p[4], p[0], p[5], p[5]),
gmsh.model.geo.addEllipseArc(p[5], p[0], p[1], p[1]),
gmsh.model.geo.addEllipseArc(p[6], p[0], p[2], p[2]),
gmsh.model.geo.addEllipseArc(p[2], p[0], p[3], p[3]),
gmsh.model.geo.addEllipseArc(p[3], p[0], p[5], p[5]),
gmsh.model.geo.addEllipseArc(p[5], p[0], p[6], p[6]),
]
ll = [
# one half
gmsh.model.geo.addCurveLoop([c[4], c[9], c[3]]),
gmsh.model.geo.addCurveLoop([c[8], -c[4], c[0]]),
gmsh.model.geo.addCurveLoop([-c[9], c[5], c[2]]),
gmsh.model.geo.addCurveLoop([-c[5], -c[8], c[1]]),
# the other half
gmsh.model.geo.addCurveLoop([c[7], -c[3], c[10]]),
gmsh.model.geo.addCurveLoop([-c[11], c[7], c[0]]),
gmsh.model.geo.addCurveLoop([-c[10], -c[2], c[6]]),
gmsh.model.geo.addCurveLoop([c[1], c[6], c[11]]),
]
# Create a surface for each line loop.
s = [gmsh.model.geo.addSurfaceFilling([l]) for l in ll]
surface_loop = gmsh.model.geo.addSurfaceLoop(s)
volume = gmsh.model.geo.addVolume([surface_loop])
gmsh.model.geo.synchronize()
# Leads to bad mesh:
gmsh.model.mesh.setCompound(2, s[:4])
gmsh.model.mesh.setCompound(2, s[4:])
gmsh.model.mesh.generate(3)
msh_filename = "out.msh"
gmsh.write(msh_filename)
import meshio
mesh = meshio.read(msh_filename)
mesh.write("out.vtu")