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.

How to set up finite element space for 1d periodic mesh correctly?

More
1 year 5 months ago - 1 year 5 months ago #4548 by dwersd
Hallo!

I'm trying to define a finite element space on 1d periodic mesh with the following simple codes:

########################
from ngsolve import *
from ngsolve.meshes import Make1DMesh

n = 3
mymesh = Make1DMesh(n, periodic = True)

fes = Periodic(H1(mymesh,order=1))
u,v = fes.TnT()

a = BilinearForm(fes)
a += u*v*ds

a.Assemble()
print(a.mat)
########################

When I ran these codes, it said "used dof inconsistency
(silence this warning by setting BilinearForm(...check_unused=False) )"
with "print(a.mat)" to be:

Row 0: 0: 2 1: 0 2: 0
Row 1: 0: 0 1: 0 2: 0
Row 2: 0: 0 1: 0 2: 0
Row 3:

this mass matrix is definitely not correct for periodic setting.

Does anyone know what's wrong in the codes? Thank you very much!
 
Last edit: 1 year 5 months ago by dwersd.
More
1 year 5 months ago #4549 by mneunteufel
Hi,

with
u*v*ds
you are integrating only over the boundary of the mesh. To obtain the mass matrix you have to use dx instead of ds.

Best,
Michael
More
1 year 5 months ago #4551 by dwersd
Thank you Michael! I'm new to NGsolve. May I ask another simple question?

After I changed ds to dx, "print(fes.ndof)" is 4 instead of 3 (actual nodes number). Moreover if I set the gridfunction below

gfu = GridFunction(fes)
gfu.Set(cos(2*pi*x))

the first entry does not coincide with the 4th entry. So it seems to break the periodic condition. Do you have any idea?
More
1 year 5 months ago #4553 by mneunteufel
Hi,

the behavior is correct. If you plot fes.FreeDofs() you observe that the last dof is “not-free”, it depends on the first one due to periodicity. If you draw the function you get a periodic function

from ngsolve.internal import visoptions
from ngsolve.internal import viewoptions
visoptions.showsurfacesolution=True
viewoptions.drawedges=1
visoptions.deformation=1
Draw(gfu, mymesh, "gfu")

With fes = Compress(Periodic(H1(mymesh,order=1))) the last dof is compressed out and you have only 3 dofs left.

Best,
Michael
Time to create page: 0.106 seconds