Roller Boundary Conditions Vector Finite Elements in dolfinx

Hi,
I was trying to test some solid mechanics problems with fenicsx/dolfinx, and I ran into a problem when trying to approximate roller-type boundary conditions. For the older versions of DirichletBC, I was able to find the post below in the old q&a.

https://fenicsproject.org/qa/1478/roller-boundary-condition/

I tried something like

u_bcl = Function(V)
with u_bcl.vector.localForm() as bc_local:
bc_local.set(0.0)

bcl = fem.DirichletBC(u_bcl,fem.locate_dofs_geometrical(V,lambda x:np.isclose(x[0],0.0)),V.sub(0))

Here V is the FunctionSpace

But this seems to be wrong. Is there a way to do this?

Thanks,
Subramanya

The QA you looked at has a really outdated interface. Consider something like this:

V0 = V.sub(0).collapse()
zero = dolfinx.Function(V0)
with zero.vector.localForm() as zero_local:
    zero_local.set(0.0)

def in_corner(x):
    return np.logical_or(np.isclose(x.T, [0, 2, 0]).all(axis=1),
                             np.isclose(x.T, [1, 2, 0]).all(axis=1))
dofs = fem.locate_dofs_geometrical((V.sub(0), V0), in_corner)
bc_corner = dolfinx.DirichletBC(zero, dofs, V.sub(0))

Of course modify the in_corner_expression to your own lambda function.

Thanks Dokken!
I will try that approach too. I ended up doing something like this, and this worked.

facetdim = mesh.topology.dim - 1
mf = MeshFunction("size_t", mesh, facetdim, 0)
mf.mark(lambda x: np.isclose(x[0], 1.0), 1)
bndry_facets = np.where(mf.values == 1)[0]
bdofs_y = fem.locate_dofs_topological(V.sub(0), facetdim, bndry_facets)

MeshFunction is in the process of being deprecated (it is replaced by MeshTags) in dolfinx master branch, just so you know.

Ah. I will move to those. I am still in the process of parsing the various available demos and figuring things out.