mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-25 21:40:33 +05:00
166 lines
6.6 KiB
Python
166 lines
6.6 KiB
Python
from netgen.meshing import *
|
|
|
|
|
|
def ReadGmsh(filename):
|
|
meshdim = 1
|
|
with open(filename + ".msh", 'r') as f:
|
|
while f.readline().split()[0] != "$Elements":
|
|
pass
|
|
nelem = int(f.readline())
|
|
for i in range(nelem):
|
|
line = f.readline()
|
|
eltype = int(line.split()[1])
|
|
if eltype > 1 and eltype != 15:
|
|
meshdim = 2
|
|
if eltype > 3 and eltype != 15:
|
|
meshdim = 3
|
|
break
|
|
|
|
f = open(filename + ".msh", 'r')
|
|
mesh = Mesh(dim=meshdim)
|
|
|
|
pointmap = {}
|
|
facedescriptormap = {}
|
|
namemap = {}
|
|
materialmap = {}
|
|
bbcmap = {}
|
|
|
|
while True:
|
|
line = f.readline()
|
|
if line == "":
|
|
break
|
|
|
|
if line.split()[0] == "$PhysicalNames":
|
|
print('WARNING: Physical groups detected - Be sure to define them for every geometrical entity.')
|
|
numnames = int(f.readline())
|
|
for i in range(numnames):
|
|
f.readline
|
|
line = f.readline()
|
|
namemap[int(line.split()[1])] = line.split()[2][1:-1]
|
|
|
|
if line.split()[0] == "$Nodes":
|
|
num = int(f.readline().split()[0])
|
|
for i in range(num):
|
|
line = f.readline()
|
|
nodenum, x, y, z = line.split()[0:4]
|
|
pnum = mesh.Add(MeshPoint(Pnt(float(x), float(y), float(z))))
|
|
pointmap[int(nodenum)] = pnum
|
|
|
|
if line.split()[0] == "$Elements":
|
|
num = int(f.readline().split()[0])
|
|
|
|
for i in range(num):
|
|
line = f.readline().split()
|
|
elmnum = int(line[0])
|
|
elmtype = int(line[1])
|
|
numtags = int(line[2])
|
|
# the first tag is the physical group nr, the second tag is the group nr of the dim
|
|
tags = [int(line[3 + k]) for k in range(numtags)]
|
|
|
|
if elmtype == 1: # 2-node line
|
|
num_nodes = 2
|
|
elif elmtype == 2: # 3-node trig
|
|
num_nodes = 3
|
|
elif elmtype == 3: # 4-node quad
|
|
num_nodes = 4
|
|
elif elmtype == 4: # 4-node tet
|
|
num_nodes = 4
|
|
elif elmtype == 5: # 8-node hex
|
|
num_nodes = 8
|
|
elif elmtype == 6: # 6-node prism
|
|
num_nodes = 6
|
|
elif elmtype == 7: # 5-node pyramid
|
|
num_nodes = 5
|
|
elif elmtype == 15: # 1-node point
|
|
num_nodes = 1
|
|
else:
|
|
raise Exception("element type", elmtype, "not implemented")
|
|
|
|
nodenums = line[3 + numtags:3 + numtags + num_nodes]
|
|
nodenums2 = [pointmap[int(nn)] for nn in nodenums]
|
|
|
|
if elmtype == 1:
|
|
if meshdim == 3:
|
|
if tags[1] in bbcmap:
|
|
index = bbcmap[tags[1]]
|
|
else:
|
|
index = len(bbcmap) + 1
|
|
if len(namemap):
|
|
mesh.SetCD2Name(index, namemap[tags[0]])
|
|
else:
|
|
mesh.SetCD2Name(index, "line" + str(tags[1]))
|
|
bbcmap[tags[1]] = index
|
|
|
|
elif meshdim == 2:
|
|
if tags[1] in facedescriptormap.keys():
|
|
index = facedescriptormap[tags[1]]
|
|
else:
|
|
index = len(facedescriptormap) + 1
|
|
fd = FaceDescriptor(bc=index)
|
|
if len(namemap):
|
|
fd.bcname = namemap[tags[0]]
|
|
else:
|
|
fd.bcname = 'line' + str(tags[1])
|
|
mesh.SetBCName(index - 1, fd.bcname)
|
|
mesh.Add(fd)
|
|
facedescriptormap[tags[1]] = index
|
|
else:
|
|
if tags[1] in materialmap:
|
|
index = materialmap[tags[1]]
|
|
else:
|
|
index = len(materialmap) + 1
|
|
if len(namemap):
|
|
mesh.SetMaterial(index, namemap[tags[0]])
|
|
else:
|
|
mesh.SetMaterial(index, "line" + str(tags[1]))
|
|
materialmap[tags[1]] = index
|
|
|
|
mesh.Add(Element1D(index=index, vertices=nodenums2))
|
|
|
|
if elmtype in [2, 3]: # 2d elements
|
|
if meshdim == 3:
|
|
if tags[1] in facedescriptormap.keys():
|
|
index = facedescriptormap[tags[1]]
|
|
else:
|
|
index = len(facedescriptormap) + 1
|
|
fd = FaceDescriptor(bc=index)
|
|
if len(namemap):
|
|
fd.bcname = namemap[tags[0]]
|
|
else:
|
|
fd.bcname = "surf" + str(tags[1])
|
|
mesh.SetBCName(index - 1, fd.bcname)
|
|
mesh.Add(fd)
|
|
facedescriptormap[tags[1]] = index
|
|
else:
|
|
if tags[1] in materialmap:
|
|
index = materialmap[tags[1]]
|
|
else:
|
|
index = len(materialmap) + 1
|
|
if len(namemap):
|
|
mesh.SetMaterial(index, namemap[tags[0]])
|
|
else:
|
|
mesh.SetMaterial(index, "surf" + str(tags[1]))
|
|
materialmap[tags[1]] = index
|
|
|
|
mesh.Add(Element2D(index, nodenums2))
|
|
|
|
if elmtype in [4, 5, 6, 7]: # volume elements
|
|
if tags[1] in materialmap:
|
|
index = materialmap[tags[1]]
|
|
else:
|
|
index = len(materialmap) + 1
|
|
if len(namemap):
|
|
mesh.SetMaterial(index, namemap[tags[0]])
|
|
else:
|
|
mesh.SetMaterial(index, "vol" + str(tags[1]))
|
|
materialmap[tags[1]] = index
|
|
|
|
nodenums2 = [pointmap[int(nn)] for nn in nodenums]
|
|
|
|
if elmtype == 4:
|
|
mesh.Add(Element3D(index, [nodenums2[0], nodenums2[1], nodenums2[3], nodenums2[2]]))
|
|
elif elmtype in [5, 6, 7]:
|
|
mesh.Add(Element3D(index, nodenums2))
|
|
|
|
return mesh
|