How to set up finite element space for 1d periodic mesh correctly?
- dwersd
- Topic Author
- New Member
Less
More
2 years 1 week ago - 2 years 1 week 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!
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!
Attachments:
Last edit: 2 years 1 week ago by dwersd.
- mneunteufel
- Offline
- Premium Member
Less
More
- Thank you received: 59
2 years 1 week ago #4549
by mneunteufel
Replied by mneunteufel on topic How to set up finite element space for 1d periodic mesh correctly?
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
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
- dwersd
- Topic Author
- New Member
Less
More
2 years 1 week ago #4551
by dwersd
Replied by dwersd on topic How to set up finite element space for 1d periodic mesh correctly?
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?
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?
- mneunteufel
- Offline
- Premium Member
Less
More
- Thank you received: 59
2 years 4 days ago #4553
by mneunteufel
Replied by mneunteufel on topic How to set up finite element space for 1d periodic mesh correctly?
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
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.103 seconds