I would like to partially fix the dofs where a traction force is applied on a circle on the surface of a body. Right now the way I am applying the traction is the following:
# Traction direction: push along +x (change sign if needed)
T = fem.Constant(domain, -p_traction * default_scalar_type((node_normal[0], node_normal[1], node_normal[2])))
a = ufl.inner(sigma(u, lambda_, mu), epsilon(v)) * ufl.dx
L = ufl.dot(f_vec, v) * ufl.dx + ufl.dot(T, v) * ds(2)
Is there a way of enforcing zero displacement normal to the node_normal vector for the nodes where the traction is applied?
Running code and a vtk mesh can be found in another post:
As you are using Lagrange elements, you can’t enforce this through a normal dirichlet condition if your normals do not align with the cartesian grid. You can however use DOLFINx MPC for it, as shown in: Stokes flow with slip conditions — DOLFINx-MPC: An extension to DOLFINx for multi point constraints in the setting of Stokes equation.
You could alternatively try to enforce it weakly with Nitsche’s method.
Then you can take the DirichletBC in the appropriate sub space. For instance, if you want the component in the ith direction to be 0, you set a bc on V.sub(i).
In Mixed finite element problems — FEniCS Workshop there is a fairly comprehensive explaination.