- Thank you received: 0
ensure boundary condition during adaptive mesh refinement
4 years 7 months ago #2568
by nsc
ensure boundary condition during adaptive mesh refinement was created by nsc
Hi,
as the title suggests, I would like to make sure, that the inhomogeneous boundary conditions are preserved during the adaptive mesh refinement scheme. In my current program, the first solution looks correct. However, after the error estimation and the refinement, the solution is 0 (or near 0) on the boundary. I think that the error estimation function is not correct, but I am struggling to find my blunder.
The PDE to be solved is:
[tex]-\Delta u(x) = -(18x^2-6)e^{-1.5(x^2 + y^2)}-(18y^2-6)e^{-1.5(x^2 + y^2)}[/tex]
on the domain
[tex]\Omega: x,y \in [-1,1][/tex]
subjected to the boundary condition
[tex]u(x,y)|_{\partial \Omega} = 2e^{-1.5(x^2 + y^2)}[/tex]
as the title suggests, I would like to make sure, that the inhomogeneous boundary conditions are preserved during the adaptive mesh refinement scheme. In my current program, the first solution looks correct. However, after the error estimation and the refinement, the solution is 0 (or near 0) on the boundary. I think that the error estimation function is not correct, but I am struggling to find my blunder.
The PDE to be solved is:
[tex]-\Delta u(x) = -(18x^2-6)e^{-1.5(x^2 + y^2)}-(18y^2-6)e^{-1.5(x^2 + y^2)}[/tex]
on the domain
[tex]\Omega: x,y \in [-1,1][/tex]
subjected to the boundary condition
[tex]u(x,y)|_{\partial \Omega} = 2e^{-1.5(x^2 + y^2)}[/tex]
Code:
import netgen.gui
from ngsolve import *
import netgen.geom2d as geom2d
geo = geom2d.SplineGeometry()
geo.AddRectangle((-1,-1), (1,1), bcs=["bottom", "right", "top", "left"])
mesh = Mesh(geo.GenerateMesh(maxh=0.05))
mesh.GetBoundaries()
fes = H1(mesh, order=2, dirichlet="left|right|top|bottom")
g = 2*exp(-1.5*(x**2 + y**2))
gfu = GridFunction(fes)
gfu.Set(g, definedon=mesh.Boundaries("left|right|top|bottom"))
Draw(gfu)
u, v = fes.TnT()
a = BilinearForm(fes)
a += grad(u)*grad(v)*dx
f = LinearForm(fes)
f += (-(18*x*x-6)*exp(-1.5*(x*x + y*y))-(18*y*y-6)*exp(-1.5*(x*x + y*y)))*v*dx
c = Preconditioner(a,"multigrid")
space_flux = HDiv(mesh, order=2)
gf_flux = GridFunction(space_flux, "flux")
def solveStep():
fes.Update()
gfu.Update()
Draw(gfu)
a.Assemble()
f.Assemble()
solvers.BVP(bf=a, lf=f, gf=gfu, pre=c)
gfu.Update()
Redraw(blocking=True)
def estimateError():
space_flux.Update()
gf_flux.Update()
flux = grad(gfu)
gf_flux.Set(flux)
err = (flux-gf_flux)*(flux-gf_flux)
Draw(err, mesh, 'error_representation')
eta2 = Integrate(err, mesh, VOL, element_wise=True)
maxerr = max(eta2)
for el in mesh.Elements():
mesh.SetRefinementFlag(el, eta2[el.nr] > 0.25*maxerr)
solveStep()
estimateError()
mesh.Refine()
solveStep()
Draw(gfu)
Attachments:
- mneunteufel
- Offline
- Premium Member
Less
More
- Thank you received: 59
4 years 7 months ago #2570
by mneunteufel
Replied by mneunteufel on topic ensure boundary condition during adaptive mesh refinement
Hi nsc,
when the GridFunction is updated, the set Dirichlet boundary data is forgotten. You need to set the data again in your solveStep function
You can use the autoupdate flag for FESpaces and GridFunctions. Then you do not need to call the Update method by hand, see attached file.
Best,
Michael
when the GridFunction is updated, the set Dirichlet boundary data is forgotten. You need to set the data again in your solveStep function
Code:
gfu.Set(g, definedon=mesh.Boundaries("left|right|top|bottom")).
You can use the autoupdate flag for FESpaces and GridFunctions. Then you do not need to call the Update method by hand, see attached file.
Best,
Michael
Attachments:
The following user(s) said Thank You: nsc
4 years 7 months ago #2571
by nsc
Replied by nsc on topic ensure boundary condition during adaptive mesh refinement
Thank you so much for your help! It works perfectly fine now.
I can't believe that I have wasted so much time on such a simple problem.
I can't believe that I have wasted so much time on such a simple problem.
Time to create page: 0.127 seconds