So I have been doing this problem in 2-D. I have this space:
fes_rhs_Gm = FacetFESpace(Om_mesh, order=0, definedon=“”, definedonbound=“Gamma”)
I then do this:
gf_rhs_Gm = GridFunction(fes_rhs_Gm)
gf_rhs_Gm.Set(0.0)
And this works fine in 2-D. However, when my mesh is 3-D cube (with boundary labeled “Gamma”) I get an error when I run:
gf_rhs_Gm.Set(0.0)
The error is:
netgen.libngpy._meshing.NgException: cannot evaluate facet-fe inside element, add trans simd
What does this mean?
Here is a minimal example:
import numpy as np
import netgen.gui
from ngsolve import *
#from netgen.geom2d import unit_square
from netgen.geom2d import SplineGeometry
from netgen.csg import unit_cube
from netgen.csg import CSGeometry
from netgen.csg import Pnt
from netgen.csg import OrthoBrick
# make the mesh (this works)
geo = SplineGeometry()
geo.AddRectangle( (0,0), (1,1), bc = “Gamma”)
Om_mesh = Mesh(geo.GenerateMesh(maxh=1.0))
for r in range(3):
# Om_mesh.Refine()
Draw(Om_mesh)
print(Om_mesh.GetBoundaries())
make the mesh (this does not work!)
cube = OrthoBrick( Pnt(0,0,0), Pnt(1,1,1) ).bc(“Gamma”)
geo = CSGeometry()
geo.Add (cube)
Om_mesh = Mesh(geo.GenerateMesh(maxh=1.0))
for r in range(2):
Om_mesh.Refine()
Draw(Om_mesh)
print(Om_mesh.GetBoundaries())
bdy space
fes_rhs_Gm = FacetFESpace(Om_mesh, order=0, definedon=“”, definedonbound=“Gamma”)
print(" ")
num_Gm_dofs = np.sum(fes_rhs_Gm.FreeDofs())
print("number of FreeDofs for fes_rhs_Gm: ", num_Gm_dofs)
print("fes_rhs_Gm FreeDof mask: ")
print(fes_rhs_Gm.FreeDofs())
gf_rhs_Gm = GridFunction(fes_rhs_Gm)
init
gf_rhs_Gm.Set(0.0)
input(“Press Enter to finish…”)
using
gf.Set (x, dual=True)
works. The default is to use element-wise L2-projection followed by averaging. This does not work for facet-spaces. dual=True does the projection using degrees of freedom of the finite element, which are usually moments on edges, faces and cells.
Thanks for this. But why did it work in 2-D without that extra flag?