How to unitization the solution in fenics

i want to unitization my vector solution in fenics, it means to make ||u||=1 at every points.
For example, for the elastic problem

from future import print_function

from fenics import *

Scaled variables

L = 1; W = 0.2

mu = 1

rho = 1

delta = W/L

gamma = 0.4*delta**2

beta = 1.25

lambda_ = beta

g = gamma

Create mesh and define function space

mesh = BoxMesh(Point(0, 0, 0), Point(L, W, W), 10, 3, 3)

V = VectorFunctionSpace(mesh, ā€˜Pā€™, 1)

Define boundary condition

tol = 1E-14

def clamped_boundary(x, on_boundary):

return on_boundary and x[0] < tol

bc = DirichletBC(V, Constant((0, 0, 0)), clamped_boundary)

Define strain and stress

def epsilon(u):

return 0.5*(nabla_grad(u) + nabla_grad(u).T)

#return sym(nabla_grad(u))

def sigma(u):

return lambda_nabla_div(u)Identity(d) + 2muepsilon(u)

Define variational problem

u = TrialFunction(V)

d = u.geometric_dimension() # space dimension

v = TestFunction(V)

f = Constant((0, 0, -rho*g))

T = Constant((0, 0, 0))

a = inner(sigma(u), epsilon(v))*dx

L = dot(f, v)*dx + dot(T, v)*ds

Compute solution

u = Function(V)

solve(a == L, u, bc)

is there any way to make it in fenics? thanks a lot

How about projecting:

u_uni = project(u/sqrt(dot(u,u)), V)

Note that this is not well defined if dot(u,u)=0, which can be encoded using a ufl.conditional, see for instance: How to implement function with condition? - #3 by dokken

1 Like