nschloe / meshio

:spider_web: input/output for many mesh formats

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

creating a 3d mesh with meshio

Mirialex opened this issue · comments

hi all,

need help in creating 3d mesh with meshio, basically my goal is to create a box with a cylinder inside of it, starting with creating a box
this is what i tried to do
`
import numpy
import meshio
import gmsh
import pygmsh

resolution = 0.01

Channel parameters

L = 2.2
H = 0.41
c = [0.2, 0.2, 0]
r = 0.05

Initialize empty geometry using the built-in kernel in GMSH

geometry = pygmsh.geo.Geometry()
model = geometry.enter()

Add circle

circle = model.add_circle(c, r, mesh_size=resolution)

Add points with finer resolution on the left side

points = [
model.add_point((0, 0, 0), mesh_size=resolution),
model.add_point((L, 0, 0), mesh_size=5 * resolution),
model.add_point((L, H, 0), mesh_size=5 * resolution),
model.add_point((0, H, 0), mesh_size=resolution)
]

Add lines between all points creating the rectangle

channel_lines = [model.add_line(points[i], points[i + 1]) for i in range(-1, len(points) - 1)]

Create a line loop and plane surface for meshing

channel_loop = model.add_curve_loop(channel_lines)
plane_surface = model.add_plane_surface(channel_loop, holes=[circle.curve_loop])

Synchronize the model

model.synchronize()

Mark different boundaries and the volume mesh

model.add_physical([plane_surface], "Volume")
model.add_physical([channel_lines[0]], "Inflow")
model.add_physical([channel_lines[2]], "Outflow")
model.add_physical([channel_lines[1], channel_lines[3]], "Walls")
model.add_physical(circle.curve_loop.curves, "Obstacle")

Generate the mesh and write to file

geometry.generate_mesh(dim=2)
gmsh.write("mesh.msh")
gmsh.clear()
geometry.exit()

Convert the mesh to XDMF format

mesh_from_file = meshio.read("mesh.msh")

def create_mesh(mesh, cell_type, prune_z=False):
cells = mesh.get_cells_type(cell_type)
cell_data = mesh.get_cell_data("gmsh:physical", cell_type)
points = mesh.points[:, :2] if prune_z else mesh.points
out_mesh = meshio.Mesh(points=points, cells={cell_type: cells}, cell_data={"name_to_read": [cell_data]})
return out_mesh

line_mesh = create_mesh(mesh_from_file, "line", prune_z=True)
meshio.write("facet_mesh.xdmf", line_mesh)

triangle_mesh = create_mesh(mesh_from_file, "triangle", prune_z=True)
meshio.write("mesh.xdmf", triangle_mesh)

3D Mesh generation using OpenCASCADE geometry kernel

L = 1.0
H = 1.0
W = 1.0
resolution = 0.1

geom = pygmsh.occ.Geometry()
model3D = geom.enter()

points = [
model3D.add_point([0.0, 0.0, 0.0], mesh_size=resolution),
model3D.add_point([L, 0.0, 0.0], mesh_size=5 * resolution),
model3D.add_point([L, H, 0.0], mesh_size=5 * resolution),
model3D.add_point([0.0, H, 0.0], mesh_size=resolution),
model3D.add_point([0.0, 0.0, W], mesh_size=resolution),
model3D.add_point([L, 0.0, W], mesh_size=5 * resolution),
model3D.add_point([L, H, W], mesh_size=5 * resolution),
model3D.add_point([0.0, H, W], mesh_size=resolution)
]

lines = [model3D.add_line(points[i], points[i + 1])
for i in range(-1, len(points) - 1)
]

Define surfaces (make sure lines are in the correct order to form closed loops)

surfaces = []
surfaces.append(model3D.add_plane_surface(model3D.add_curve_loop([lines[0], lines[1], lines[2], lines[3]]))) # Bottom
surfaces.append(model3D.add_plane_surface(model3D.add_curve_loop([lines[4], lines[5], lines[6], lines[7]]))) # Top
surfaces.append(model3D.add_plane_surface(model3D.add_curve_loop([lines[0], lines[9], lines[4], lines[8]]))) # Front
surfaces.append(model3D.add_plane_surface(model3D.add_curve_loop([lines[1], lines[10], lines[5], lines[9]]))) # Right
surfaces.append(model3D.add_plane_surface(model3D.add_curve_loop([lines[2], lines[11], lines[6], lines[10]]))) # Back
surfaces.append(model3D.add_plane_surface(model3D.add_curve_loop([lines[3], lines[8], lines[7], lines[11]]))) # Left

Define the volume

surface_loop = model3D.add_surface_loop(surfaces)
volume = model3D.add_volume(surface_loop)

Add Physical Groups

model3D.add_physical(volume, label="MyVolume")
for i, surface in enumerate(surfaces):
model3D.add_physical(surface, label=f"MySurface_{i}")

geom.generate_mesh(dim=3)
gmsh.write("mesh3D.msh")
model3D.exit()

mesh3D_from_file = meshio.read("mesh3D.msh")

triangle_mesh = create_mesh(mesh3D_from_file, "triangle", prune_z=True)
meshio.write("facet_mesh3D.xdmf", triangle_mesh)

tetra_mesh = create_mesh(mesh3D_from_file, "tetra", prune_z=True)
meshio.write("mesh3D.xdmf", tetra_mesh)

`

but im not sure how to use this add_curve_loop and how to change it in order for it to work
if you have any documention about it, would appreciate

error i got
/usr/bin/python3.10 /home/mirialex/PycharmProjects/fibers/from_community.py
Traceback (most recent call last):
File "/home/mirialex/PycharmProjects/fibers/from_community.py", line 94, in
surfaces.append(model3D.add_plane_surface(model3D.add_curve_loop([lines[0], lines[1], lines[2], lines[3]]))) # Bottom
File "/usr/lib/python3/dist-packages/pygmsh/common/geometry.py", line 80, in add_curve_loop
return CurveLoop(self.env, *args, **kwargs)
File "/usr/lib/python3/dist-packages/pygmsh/common/curve_loop.py", line 26, in init
assert curves[-1].points[-1] == curves[0].points[0]
AssertionError

Process finished with exit code 1