Forum Message

 

 

We have moved the forum to https://forum.ngsolve.org . This is an archived version of the topics until 05/05/23. All the topics were moved to the new forum and conversations can be continued there. This forum is just kept as legacy to not invalidate old links. If you want to continue a conversation just look for the topic in the new forum.

Notice

The forum is in read only mode.

Boundaries of open surfaces

More
3 years 5 months ago #3339 by Bittermandeln
Hi,

I want to do a boundary integral for an open surface, namely a half-cylinder, in order to implement boundary conditions in the Nitsche fashion. Parts of my code now look like

geo = CSGeometry()

r = 1/pi
cyl = Cylinder(Pnt(0,0,0), Pnt(1,0,0),r)
top = Plane(Pnt(0,0,0),Vec(0,0,-1))
left = Plane(Pnt(0,0,0),Vec(-1,0,0))
right =Plane(Pnt(1,0,0),Vec(1,0,0))

shell = (cyl * left*right*top)

geo.AddSurface(cyl, shell)
################


mesh = Mesh(geo.GenerateMesh(maxh=0.3))
bnd_D = mesh.Boundaries("dir")

in order to define the mesh and the boundary. I then perform the integral using e.g.

a += SymbolicBFI(InnerProduct(p*mu, v.Trace()), BND, element_boundary = True, definedon = bnd_D)


However, it seems that NGSolve skips this integral. Does anyone know what I am doing wrong?

Best regards,

Alvar
More
3 years 5 months ago #3340 by mneunteufel
Hi Alvar,

with
Code:
bnd_D = mesh.Boundaries("dir")
you only access boundaries labeled with "dir". But in your presented code no such label appears.

With e.g.
Code:
cyl = Cylinder(Pnt(0,0,0), Pnt(1,0,0),r).bc("dir")
you can label the surface.

Best,
Michael
More
3 years 5 months ago #3345 by Bittermandeln
Hi Michael,

Thank you for your answer. I have now rewritten the code to be
r = 1/pi
cyl = Cylinder(Pnt(0,0,0), Pnt(1,0,0),r)
top = Plane(Pnt(0,0,0),Vec(0,0,-1)).bc("dir")
left = Plane(Pnt(0,0,0),Vec(-1,0,0)).bc("dir")
right =Plane(Pnt(1,0,0),Vec(1,0,0)).bc("dir")

shell = (cyl * left*right*top)

geo.AddSurface(cyl, shell)
################



ngmesh = geo.GenerateMesh(maxh=0.3)

ngmesh.SetCD2Name(1,"wall")
ngmesh.SetCD2Name(2,"wall")
ngmesh.SetCD2Name(3,"outflow")
ngmesh.SetCD2Name(4,"inflow")
mesh = Mesh(ngmesh)

bnd_D = mesh.Boundaries("inflow|outflow|wall")

with one of the boundary integrals looking like

a += SymbolicBFI(-2*InnerProduct(epsu*mu, v.Trace()), BND, element_boundary = True, definedon = bnd_D)



It still seems like the integral has no effect. Am I missing it completely? How do you do integrals on boundaries of a surfaces, i.e. with Co-dimension 2?




It is worth pointing out that v is in a SurfaceHDiv space and epsu is the symmetric gradient of such a vector. I also need to integrate vectors in SurfaceL2
More
3 years 5 months ago #3346 by mneunteufel
Hi Alvar,

I somehow got confused with the boundaries and co-dimensional 2 boundaries. In NGSolve co-dimensional 2 boundaries are called BBoundaries and the surface is still a boundary.

In this tutorial you can find how to define BBoundaries without guessing the right index for SetCD2Name.

So to access only the BBoundaries the correct syntax is
Code:
bnd_D = mesh.BBoundaries("inflow|outflow|wall")

But, I'm afraid that your code
Code:
a += SymbolicBFI(-2*InnerProduct(epsu*mu, v.Trace()), BND, element_boundary = True, definedon = bnd_D)
won't work. I guess it will throw an exception concerning the traces. Integrating over edges in three dimensions with a SurfaceHDiv space is not well defined as there is no unique normal vector.

In this example to perform integration over a BBoundary for hyb in SurfaceHDiv the following trick has been used
Code:
bfA += Variation( -IfPos(x-L+1e-6, 1, 0)*(hyb*nel)*ds(element_boundary=True) )

to loop over all edges with the surface information at hand for the (element)normal vector and being 1 only at the BBoundary.

I hope this helps.

Best,
Michael
The following user(s) said Thank You: Bittermandeln
More
3 years 5 months ago #3360 by Bittermandeln
Thank you for your help.
Time to create page: 0.122 seconds