Hi, I am new to FEniCS.
I have solved a differential equation. Now i have to apply constraint (1) if sigma+ < sigma- then calculated solution on that node = 0.
How can i apply after calculation?
Thanks in advance.
What does $ \sigma^\pm$ mean? Maybe post a minimal working example of what you're after.
\sigma +_ is the positive and negative part of the energy density function. That is based on the displacement.
Is $\sigma$ the solution of the differential equation? Or do you have it as an analytical expression or as a dolfin.Function?
dolfin.Function
yes sigma is the solution of the differential equation
Are you familiar with conditional statements in Expressions?
I.e.
expr = Expression("sigma1 < sigma2 ? 0 : sol", sigma1=sigma_plus, sigma2=sigma_minus, sol=solution) solution = interpolate(expr,solution.function_space())
?
Hi, Thanks for the help. But after applying this conditional expression I am getting Error: TypeError: expected default arguments for member variables to be scalars or a scalar GenericFunctions.
I have attached my code:
from dolfin import * mesh = UnitSquareMesh(4,4) plot(mesh, title = 'mesh', interactive = True) def eps(v): return sym(grad(v)) def eps_dev(du): return dev(eps(du)) def sigma(u): return 2.0*mu*eps(u) + lmbda*tr(eps(u))*Identity(2) V = VectorFunctionSpace(mesh, 'Lagrange', 1) u = TrialFunction(V) v = TestFunction(V) du = Function(V) mu = 80.77e3 lmbda = 121.15e3 kn = lmbda + mu EDef = inner(sigma(u),grad(v))*dx class top(SubDomain): def inside(self,x,on_boundary): tol = 1e-10 return abs(x[1]-1.0) < tol and on_boundary class bottom(SubDomain): def inside(self,x,on_boundary): tol = 1e-10 return abs(x[1]) < tol and on_boundary Top = top() Bottom = bottom() bclx= DirichletBC(V.sub(0), Constant(0.0), Bottom) bcly = DirichletBC(V.sub(1), Constant(0.0), Bottom) bcty = DirichletBC(V.sub(1), Constant(1e-4), Top) bc_u = [bcly,bclx, bcty] solve(lhs(EDef)==rhs(EDef),du,bc_u) #--------------------- # Definition for energy #-------------------- def en_dens(u): str_ele = 0.5*(grad(u) + grad(u).T) IC = tr(str_ele) ICC = tr(str_ele * str_ele) return (0.5*lmbda*IC**2) + mu*ICC WW = FunctionSpace(mesh, 'CG',1) Histold = Function(WW) HistNew = Function(WW) # previous step solution uold = Function(V) # check enegy at the current step and previous step expr = Expression('sigma1 < sigma2 ? 0: sol', sigma1 = en_dens(uold), sigma2 = en_dens(du), sol = HistNew) HistNew = interpolate(expr, HistNew.function_space())
I assume that sigma is the solution that you computed and that sigmin is a given scalar value. Then I would proceed like:
sigma
sigmin
sigarray = sigma.vector().array() # make it a numpy array sigarray[sigarray < sigmin] = 0 # set all values to zero that are < sigmin adjsigma = sigma.vector().set_local(sigarray) # reassign the values of the dolfin function
Whenever I have applied
parray = p.vector().array() parray[parray < 0] = 0 adjparray = p.vector().set_local(parray)
Here, p if temperature solution I have got error: parray = p.vector().array() AttributeError: 'Indexed' object has no attribute 'vector'
p should be a dolfin.Function...
p
i have not got what do u mean by dolfin.Function p is the solution vector for temperature.
It should be a Function object in fenics. Like you would get it with this example
Function
import dolfin mesh = dolfin.UnitSquareMesh(10,10) V = dolfin.FunctionSpace(mesh, 'CG', 1) p = dolfin.Function(V)
or if you solve a problem via
# Compute solution ... u = Function(V) solve(a == L, u, bc)
cf., e.g., http://fenics.readthedocs.io/projects/dolfin/en/latest/demos/demo_poisson.py.html#demo-poisson-equation