- Thank you received: 0
Extracting boundary points
6 years 6 months ago #517
by andrew22
Extracting boundary points was created by andrew22
I've created a 2D disc which has a virtual boundary (h1 etc. are mesh sizes).
geo = SplineGeometry()
geo = Circle(geo, electrode_radius, 1, 0, 1, h1)
geo = Circle(geo, diel_radius, 2, 1, 0, h3)
geo = Circle(geo, electrode_radius, 4, 2, 0, h1)
mesh = geo.GenerateMesh(maxh=h4)
mesh.Save("annular_face.vol")
I would like to extract the points from the virtual boundary then use them to define the exact points along the edge of second disc (that will have a larger mesh in the centre).
How do I do that?
geo = SplineGeometry()
geo = Circle(geo, electrode_radius, 1, 0, 1, h1)
geo = Circle(geo, diel_radius, 2, 1, 0, h3)
geo = Circle(geo, electrode_radius, 4, 2, 0, h1)
mesh = geo.GenerateMesh(maxh=h4)
mesh.Save("annular_face.vol")
I would like to extract the points from the virtual boundary then use them to define the exact points along the edge of second disc (that will have a larger mesh in the centre).
How do I do that?
- christopher
- Offline
- Administrator
Less
More
- Thank you received: 101
6 years 6 months ago #518
by christopher
Replied by christopher on topic Extracting boundary points
Hi andrew,
You can iterate over the boundary elements and get using their boundary number you can collect the vertex numbers of the boundary:
Best
Christopher
You can iterate over the boundary elements and get using their boundary number you can collect the vertex numbers of the boundary:
Code:
from netgen.geom2d import unit_square
mesh = unit_square.GenerateMesh(maxh=0.2)
for el in mesh.Elements1D():
# get boundary index
print(el.index)
# get name of boundary condition (one based)
print(mesh.GetBCName(el.index-1))
# get vertex numbers of element
print(el.vertices)
# get vertex coordinates
print([mesh[vert] for vert in el.vertices])
Christopher
6 years 6 months ago #520
by andrew22
Replied by andrew22 on topic Extracting boundary points
Thank you for the help. I can now extract the mesh points from a circular virtual boundary, and create a new meshed circle. My intention is that the mesh points along the perimeter should be at exactly the same locations as those of the original virtual boundary - but the mesh density at the centre of the new circle can be set differently. When I try to do this I find that the perimeter points are not the same.
[attachment=undefined]circles.png[/attachment]
If you have a moment to help me sort this out it would be much appreciated.
# Create concentric circles with virtual boundary
geo = SplineGeometry()
geo.AddCircle(c=(0,0), r=radius1, bc=1, leftdomain=0, rightdomain=1, maxh=h1)
geo.AddCircle(c=(0,0), r=radius2, bc=2, leftdomain=1, rightdomain=0, maxh=h3)
geo.AddCircle(c=(0,0), r=radius1, bc=4, leftdomain=2, rightdomain=0, maxh=h1)
ngmesh = geo.GenerateMesh(maxh=h4)
ngmesh.Save("annular.vol")
# Extract points from virtual boundary and create a second mesh
geo2 = SplineGeometry()
nlist = []
for el in ngmesh.Elements1D():
# check boundary index is the right one (circle perimeter)
if el.index != 1: continue
x, y, z = ngmesh[el.vertices[0]]
nlist.append(geo2.AppendPoint(x,y))
nlen = len(nlist)
nlist.append(nlist[0])
for i in range(nlen):
geo2.Append(,nlist[i+1]], leftdomain=1, rightdomain=0, bc=1)
ngmesh2 = geo2.GenerateMesh(maxh=h5)
ngmesh2.Save("plane_face.vol")
[attachment=undefined]circles.png[/attachment]
If you have a moment to help me sort this out it would be much appreciated.
# Create concentric circles with virtual boundary
geo = SplineGeometry()
geo.AddCircle(c=(0,0), r=radius1, bc=1, leftdomain=0, rightdomain=1, maxh=h1)
geo.AddCircle(c=(0,0), r=radius2, bc=2, leftdomain=1, rightdomain=0, maxh=h3)
geo.AddCircle(c=(0,0), r=radius1, bc=4, leftdomain=2, rightdomain=0, maxh=h1)
ngmesh = geo.GenerateMesh(maxh=h4)
ngmesh.Save("annular.vol")
# Extract points from virtual boundary and create a second mesh
geo2 = SplineGeometry()
nlist = []
for el in ngmesh.Elements1D():
# check boundary index is the right one (circle perimeter)
if el.index != 1: continue
x, y, z = ngmesh[el.vertices[0]]
nlist.append(geo2.AppendPoint(x,y))
nlen = len(nlist)
nlist.append(nlist[0])
for i in range(nlen):
geo2.Append(,nlist[i+1]], leftdomain=1, rightdomain=0, bc=1)
ngmesh2 = geo2.GenerateMesh(maxh=h5)
ngmesh2.Save("plane_face.vol")
6 years 5 months ago #530
by cwinters
Replied by cwinters on topic Extracting boundary points
Hi,
one comment about your geometry. Your first circle defines that outside of radius1 is domain 1 and your third circle defines that outside of radius1 is domain 0. This should be consistent.
Regarding your problem:
It is not guaranteed that the geometry points are contained in the mesh (as mesh points). So copying the mesh points to the new geometry is not going to work.
What would you like to do with the mesh? Maybe the is another workaround for your problem.
Best,
Christoph
one comment about your geometry. Your first circle defines that outside of radius1 is domain 1 and your third circle defines that outside of radius1 is domain 0. This should be consistent.
Regarding your problem:
It is not guaranteed that the geometry points are contained in the mesh (as mesh points). So copying the mesh points to the new geometry is not going to work.
What would you like to do with the mesh? Maybe the is another workaround for your problem.
Best,
Christoph
Time to create page: 0.101 seconds