### heterogeneous / position-dependent problems

125

views

0

I'm trying to solve a nonlinear elasticity problem where I would like the energy density to depend on spatial position. The nonlinearity is not relevant for this question; one could think of a linear problem with the coefficients being a function of spatial coordinate.

Here is the code snippet for my homogeneous problem:

I tried simply using "def W(x,y):" and "Pi=W(x,y)*dx", but this gives me the error

The only example of a spatially-varying problem that I could find was here:

http://comet-fenics.readthedocs.io/en/latest/demo/periodic_homog_elas/periodic_homog_elas.html

but this is for the special case of 2 materials where you pick one or the other. I also looked at the UFL manual but did not find anything that helped me.

I suppose that I could hard-code the form of $W(x,y)$ into $Pi$ rather than using a separate function, but I use $W$ elsewhere in my code so I prefer to have it defined in a single place.

Thanks for any suggestions.

Here is the code snippet for my homogeneous problem:

```
def W(y):
F = grad(y)
E, nu = 10.0, 0.3
mu, lmbda = Constant(E/(2*(1 + nu))), Constant(E*nu/((1 + nu)*(1 - 2*nu)))
psi = (mu/2)*(tr(F.T*F) - 3) - mu*ln(det(F)) + (lmbda/2)*(ln(det(F)))**2
return psi
Pi = W(y)*dx
```

I tried simply using "def W(x,y):" and "Pi=W(x,y)*dx", but this gives me the error

*NameError: name 'x' is not definedNameError: name 'x' is not defined*at "Pi=W(x,y)*dx"*.*

The only example of a spatially-varying problem that I could find was here:

http://comet-fenics.readthedocs.io/en/latest/demo/periodic_homog_elas/periodic_homog_elas.html

but this is for the special case of 2 materials where you pick one or the other. I also looked at the UFL manual but did not find anything that helped me.

I suppose that I could hard-code the form of $W(x,y)$ into $Pi$ rather than using a separate function, but I use $W$ elsewhere in my code so I prefer to have it defined in a single place.

Thanks for any suggestions.

Community: FEniCS Project

### 2 Answers

3

may be this will help: define x like this

`x = SpatialCoordinate(mesh)`

also see this implementation for functionally graded material. Functionally_Graded

Thanks! This works perfectly for my setting.

written
3 months ago by
K D

3

Hello,

if your modulus has a known analytical expression with respect to the position x you can use an Expression to define it such as :

Check also this tutorial

if your modulus has a known analytical expression with respect to the position x you can use an Expression to define it such as :

`E = Expression("10+2*x[0]+3*x[1]", degree=1)`

Otherwise, if it comes from a previous FE computation you can define it as a FunctionCheck also this tutorial

Thanks! The tutorial is particularly useful for my future plan.

written
3 months ago by
K D

Please login to add an answer/comment or follow this question.