1D Elements in 3D FES

Hello,

I’m trying to link a node to face of a 3D geometry with 1D elements.
I succeed to creat “edges” with netgen as you can see on the picture.

However, I don’t understand how to convert these netgen “edges” into ngsolve element, and after use it in my FES.

Do you know how to do this ?

Thanks.

Thomas

My code :

from netgen.occ import *
from ngsolve import *
from ngsolve import *
from netgen.csg import Pnt
from netgen.meshing import Element1D, MeshPoint
import math


# Variable
E = 212000
nu = 0.3
Rho = 7849e-9

# Dirichlet Boundaries
Face_Dirichletx = 'Face12'
Face_Dirichlety = 'Face12'
Face_Dirichletz = 'Face12'

# Displacement boundary
FaceDisplacement = 'Face5'

# Degree of Element
EleDeg = 2

tolerance = 0.01


def arrondi(valeur):
    if abs(valeur) < 0.1:
        return 0.0
    else:
        return valeur


def vec_norm(r):
    norm = math.sqrt(r[0] ** 2 + r[1] ** 2 + r[2] ** 2)
    return norm


def vec_somme(rA, rB):
    xsom = rA[0] + rB[0]
    ysom = rA[1] + rB[1]
    zsom = rA[2] + rB[2]
    som = [xsom, ysom, zsom]
    return som


def prod_vec(rA, rB):
    xm = rA[1] * rB[2] - rA[2] * rB[1]
    ym = rA[2] * rB[0] - rA[0] * rB[2]
    zm = rA[0] * rB[1] - rA[1] * rB[0]
    m = [xm, ym, zm]
    return m


def dist_line(rp, m, e):
    dist = vec_norm(vec_somme(m, prod_vec(e, rp))) / vec_norm(e)
    return dist


def dist_hole(rA, rB, rp):
    xe = rB[0] - rA[0]
    ye = rB[1] - rA[1]
    ze = rB[2] - rA[2]
    e = [xe, ye, ze]
    m = prod_vec(rA, rB)
    d = dist_line(rp, m, e)
    return d


shp_path = "TestVisM8.stp"

# center_points, ext_points = get_centers(shp)
center_points = [[0.0, 0.0, 0.0, 8.0]]

# print(center_points)
ext_points = [[0.0, 0.0, 10.0], [0.0, 0.0, -10.0]]
# print(ext_points)

geometry = OCCGeometry(shp_path)
mesh = Mesh(geometry.GenerateMesh(maxh=10)).Curve(3)


n_center = len(center_points)

N = len(mesh.vertices)
for i in range(n_center):
    l = i + 1
    indice = mesh.ngmesh.Add(MeshPoint(Pnt(center_points[i][0], center_points[i][1], center_points[i][2])))
    idx = mesh.ngmesh.AddRegion("Center_point_" + str(l), dim=1)
    j = 2 * i
    k = 2 * i + 1
    print(center_points[i])
    print(ext_points[j], ext_points[k])
    for v in mesh.vertices:
        rp = list(v.point)
        rA = ext_points[j]
        rB = ext_points[k]

        d = dist_hole(rA, rB, rp)

        if d <= (0.5 * center_points[i][-1]) + tolerance:
            mesh.ngmesh.Add(Element1D([indice, v.nr + 1], index=idx))

            # print (v, v.nr, v.point)
        # print (v, v.nr, v.point)


mesh = Mesh(mesh.ngmesh)

# FE Space ---------------------------------------------------------------------------------
fes = VectorH1(mesh, order=EleDeg, dirichletx=Face_Dirichletx, dirichlety=Face_Dirichlety, dirichletz=Face_Dirichletz)
u, v = fes.TnT()
gfu = GridFunction(fes)

The attached STEP file :
TestVisM8.stp (16.4 KB)

what do you want to use it for?
If you want to set a gf on these edges for example you can do:

gfu.Set((x,y,z), definedon=mesh.BBoundaries("Center_point_1"))

you can also define equations using forms on these mesh regions,…

I would like to create 1D rigid body elements by using these edges.