I have the following domain to apply the Navier Stokes equation as mentioned in here:
I have successfully created this domain (in GMSH) and loaded to the dolfinx using
mesh, cell_tags, facet_tags = gmshio.read_from_msh("mesh3D.msh", MPI.COMM_WORLD, 0, gdim=2)
Here, the lines AB
, DC
, EF
and FA
should be no-slip. Hence, as mentioned in the tutorial I’m hoping to change the following code which was originally written for a unit square
def walls(x):
return np.logical_or(np.isclose(x[1],0), np.isclose(x[1],1))
wall_dofs = locate_dofs_geometrical(V, walls)
u_noslip = np.array((0,) * mesh.geometry.dim, dtype=PETSc.ScalarType)
bc_noslip = dirichletbc(u_noslip, wall_dofs, V)
So, and I’m proposing the following:
def approx_in_range(x, x_min,x_max):
#Check whether 'x' is within the interval (x_min,x_max) approximately
return (x_min<=x and x<= x_max) or np.isclose(x, x_min) or np.isclose(x,x_max)
Ax=3
Ay=0
Bx=12
By=0
Cx=12
Cy=5
Dx=0
Dy=5
Ex=0
Ey=3
Fx=3
Fy=3
def walls(x):
AB = np.logical_and(approx_in_range(x[0], Ax,Bx),np.isclose(x[1],Ay))
CD = np.logical_and(approx_in_range(x[0], Dx,Cx),np.isclose(x[1],Cy))
EF = np.logical_and(approx_in_range(x[0], Ex,Fx),np.isclose(x[1],Ey))
FA = np.logical_and(np.isclose(x[0],Ax),approx_in_range(x[1], Ay,Fy))
return AB or CD or EF or FA
wall_dofs = locate_dofs_geometrical(V, walls)
u_noslip = np.array((0,) * mesh.geometry.dim, dtype=PETSc.ScalarType)
bc_noslip = dirichletbc(u_noslip, wall_dofs, V)
def inflow(x):
return np.logical_and(np.isclose(x[0], 0),approx_in_range(x[1], Ey,Dy))
inflow_dofs = locate_dofs_geometrical(Q, inflow)
bc_inflow = dirichletbc(PETSc.ScalarType(p0), inflow_dofs, Q)
def outflow(x):
return np.isclose(x[0], Bx)
outflow_dofs = locate_dofs_geometrical(Q, outflow)
bc_outflow = dirichletbc(PETSc.ScalarType(0), outflow_dofs, Q)
bcu = [bc_noslip]
bcp = [bc_inflow, bc_outflow]
But then I get the error:
Can someone please help me to figure out the problem here