# Interpolate "Real" function space

Hello,
Here I have defined a “Real” function space for the macroscopic strain. And at the end I interpolate the solution:

``````import dolfin
import numpy as np

mesh = dolfin.RectangleMesh(
dolfin.Point(0, 0, 0), dolfin.Point(1, 1, 0),
2, 2,
"crossed")

boundaries_mf = dolfin.MeshFunction("size_t", mesh, mesh.topology().dim()-1)

V_element  = dolfin.VectorElement("CG", mesh.ufl_cell(), 2)
T_element  = dolfin.TensorElement("R", mesh.ufl_cell(), 0, symmetry=True)
TH         = dolfin.MixedElement([V_element, T_element])

fs_V     = dolfin.FunctionSpace(mesh, V_element)
fs_T     = dolfin.FunctionSpace(mesh, T_element)
W        = dolfin.FunctionSpace(mesh, TH)

du = dolfin.TrialFunction(W)
v  = dolfin.TestFunction(W)
w  = dolfin.Function(W)

(u, eps)             = dolfin.split(w)
(delta_v, delta_eps) = dolfin.split(v)

V_CG2_out = dolfin.VectorFunctionSpace(mesh, 'CG', 2)

X_0     = dolfin.Constant((1/2.,1/2.))
X_coord = dolfin.Expression(('x[0]','x[1]'),degree=1,domain=mesh)
u_bar   = eps*(X_coord-X_0)
u_tot   = u + u_bar

d = len(u)
I = dolfin.Identity(d)
F = I + dolfin.grad(u + u_bar)
C = F.T*F

Ic = dolfin.tr(C)
J  = dolfin.det(F)
mu = dolfin.Constant(31.7)

I1b = Ic*J**(-2./3.)
psi = (mu/2.0)*(I1b - 3.0)

dx = dolfin.dx
Pi = psi*dx

dPi = dolfin.derivative(Pi, w, v)
Jac = dolfin.derivative(dPi, w, du)

bcs = []

u_tot = dolfin.project(u_bar+u, V_CG2_out, solver_type='mumps')

dolfin.solve(dPi == 0, w, bcs, J=Jac)

func = dolfin.Function(fs_V)
func.interpolate(u)
``````

I’m facing the following error:

``````self._cpp_object.interpolate(u)
AttributeError: 'ListTensor' object has no attribute '_cpp_object'
``````

That comes from the last line. Can you please let me know if there is any solution for this?
Thanks

Could you specify what version of DOLFIN you are running. I do not get the error-massage that you are supplying using the docker image: `quay.io/fenicsproject/dev:latest`.
Instead, the Newton solver does not converge.

`2019.1.0`

For the interpolation, might I suggest using:

``````func = dolfin.Function(fs_V)

func.interpolate(w.sub(0,deepcopy=True))
``````
1 Like

Thank you so much. It works in this way.
But if I replace `func.interpolate(u)` with `func.interpolate(u + u_bar)`, or with this method `func.interpolate(w.sub(0,deepcopy=True) + w.sub(1,deepcopy=True)*(X_coord-X_0))`, a similar error happens:

``````self._cpp_object.interpolate(u)
AttributeError: 'Sum' object has no attribute '_cpp_object'
``````

Do you know what can I do for this?
P.S. In my real problem I can’t use `w.sub(0,deepcopy=True)`. So, is there an alternative solution to this?
Thanks

I dolfin, you cannot interpolate ufl-expression, such as those you describe here. You can do this in dolfinx. However, dolfinx does not support real spaces.

I would suggest you use a projection in place of the interpolation.

1 Like

Thank you so much. It works with projection!