### (BC problems) Warning: Found no facets matching domain for boundary condition.

524
views
1
12 months ago by

Hello,

I am trying to add both Derichlet and Robin's BC to a 2-D rectangle defined as:

nx = ny = 30
mesh = RectangleMesh(Point(-2.0, -2.0), Point(2.0, 2.0), nx, ny)
V = FunctionSpace(mesh, 'P', 1)

# Define boundary condition
boundary_markers = FacetFunction('size_t', mesh)
class BoundaryX0(SubDomain):
tol = 1e-2
def inside(self, x, on_boundary):
return on_boundary and near(x[0], -2.0, 1E-2) or  near(x[0], 2.0, 1E-2) or near(x[1], -2.0, 1E-2) or near(x[1], 2.0, 1E-2)

bx0 = BoundaryX0()
bx0.mark(boundary_markers, 0)

class BoundaryX1(SubDomain):
tol = 1e-2
def inside(self, x, on_boundary):
return on_boundary and near(x[0], -0.5, 1E-2) or  near(x[0], 0.5, 1E-2) or near(x[1],-0.5, 1E-2) or near(x[1], 0.5, 1E-2)
bx1 = BoundaryX1()
bx1.mark(boundary_markers, 1)

boundary_conditions = {0: {'Robin': (r, s)}, 1: {'Dirichlet': u_0}}

bcs = []
for i in boundary_conditions:
if 'Dirichlet' in boundary_conditions[i]:
bc = DirichletBC(V, boundary_conditions[i]['Dirichlet'],
boundary_markers, i)
bcs.append(bc)

ds = Measure('ds', domain=mesh, subdomain_data=boundary_markers)

integrals_R = []
for i in boundary_conditions:
if 'Robin' in boundary_conditions[i]:
r, s = boundary_conditions[i]['Robin']
integrals_R.append(r*(u - s)*v*ds(i))

# Define variational problem
sum(integrals_R) - f*v*dx
a, L = lhs(F), rhs(F)

solve(a == L, u, bcs=bc)


My goal is to have robin's BC on the exterior of the rectangle mesh and dirichlet on x = -0.5, 0.5 and y = -0.5, 0.5
When I run the code I get this error message:

Solving linear variational problem.
*** Warning: Found no facets matching domain for boundary condition.
*** Warning: Plotting backend set to 'none'. Plotting disabled.
(fenicsproject) -bash-4.1\$


Please let me know if you can help
thanks

Community: FEniCS Project

3
12 months ago by
Hi Terrence,

You may have to reduce the tolerance when you are finding the boundary. Your tolerance in
class BoundaryX1(SubDomain):
tol = 1E-5
def inside(self, x, on_boundary):
return on_boundary and near(x[0], -0.5) or near(x[0], 0.5) or near(x[1],-0.5) or near(x[1], 0.5)​
is too tight. You could try 1e-3 or lower and check.

Hey Kaushik,

Thank you so much for your comment. I tried reducing my tolerances to tol = 1E-3 and then all the way to tol = 1 with no avail. I am still getting the same error.
written 12 months ago by Terrence
3
12 months ago by
Hi Terrance,

This should work, try it out
class BoundaryX0(SubDomain):
def inside(self, x, on_boundary):
return on_boundary and near(x[0], -2.0, 1E-3) or near(x[0], 2.0, 1E-3) or near(x[1], -2.0,1E-3) or near(x[1], 2.0,1E-3)​
written 12 months ago by Terrence
Is there something wrong with my definition of ds maybe:
ds = Measure('ds', domain=mesh, subdomain_data=boundary_markers)

​
written 12 months ago by Terrence
1
Hi Terrance,

class BoundaryX1(SubDomain):
tol = 1e-2
def inside(self, x, on_boundary):
return on_boundary and near(x[0], -0.5, 1E-2) or  near(x[0], 0.5, 1E-2) or near(x[1],-0.5, 1E-2) or near(x[1], 0.5, 1E-2)​

does not lie on the boundary. The first boundary condition is correct.

written 12 months ago by Kaushik Vijaykumar
Thank you so much It worked!!! I assume to have another Dirichlet BC on the interior I would have to change the "inside" statement to something else?
written 12 months ago by Terrence
0
12 months ago by
I was trying to apply boundary conditions within the boundary