Assigning a scalar expression to mixed function space

In legacy fenics, how do we assign a scalar expression to a mixed function space? Thanks

from dolfin import *

mesh = UnitSquareMesh(1, 1)
P2 = FiniteElement("P", triangle, degree=2)
bubble = FiniteElement("B", triangle, degree=3)

W = FunctionSpace(mesh, MixedElement(P2 + bubble))
V = FunctionSpace(mesh, P2)

# assigning a scalar expression to mixed element fails
u = interpolate(Expression(('x[0]' ,), degree=3), W)
v = interpolate(Expression('x[0]', degree=3), V)

print(u.vector()[:])  # returns all zeros
print(v.vector()[:])  # returns x coordinates

Usage of FunctionAssigner - #2 by dokken you Need to use a FunctionAssigner

Hi @dokken, I just got around to testing this out. The FunctionAssigner didn’t work as I expected for the EnrichedElement - I had to use the following workaround (commented out). Is this the correct approach? Is there anyway to get it to work with the EnrichedElement? Thank you

from dolfin import *

mesh = UnitSquareMesh(1, 1)
P2 = FiniteElement("P", triangle, degree=2)
bubble = FiniteElement("B", triangle, degree=3)

W = FunctionSpace(mesh, MixedElement(P2 + bubble))
# W = FunctionSpace(mesh, MixedElement([P2] + [bubble]))  # this works
V = FunctionSpace(mesh, P2)

# assigning a scalar expression to mixed element fails
# u = interpolate(Expression(('x[0]' ,), degree=3), W)
v = interpolate(Expression('x[0]', degree=3), V)

# print(u.vector()[:])  # returns all zeros
print(v.vector()[:])  # returns x coordinates

B = FunctionSpace(mesh, bubble)
b = interpolate(Expression('x[0]', degree=3), B)
w = Function(W)
assigner = FunctionAssigner(W, [V, B])
assigner.assign(w, [v, b])

print(w.vector()[:])

The definition of EnrichedElement in legacy dolfin is a bit broken (partially supported).
The following works in DOLFINx (v0.5.0):

import dolfinx
import ufl
from mpi4py import MPI
mesh = dolfinx.mesh.create_unit_square(MPI.COMM_WORLD, 1, 1)
P2 = ufl.FiniteElement("P", ufl.triangle, degree=2)
bubble = ufl.FiniteElement("B", ufl.triangle, degree=3)

V = dolfinx.fem.FunctionSpace(mesh, P2+bubble)

# assigning a scalar expression to mixed element fails
u = dolfinx.fem.Function(V)
u.interpolate(lambda x: x[0])
print(u.x.array)

and

import dolfinx
import ufl
from mpi4py import MPI
mesh = dolfinx.mesh.create_unit_square(MPI.COMM_WORLD, 1, 1)
P2 = ufl.FiniteElement("P", ufl.triangle, degree=2)
bubble = ufl.FiniteElement("B", ufl.triangle, degree=3)

V = dolfinx.fem.FunctionSpace(mesh, ufl.MixedElement([P2+bubble, P2]))
W, Wmap = V.sub(0).collapse()
# assigning a scalar expression to mixed element fails
u = dolfinx.fem.Function(W)
u.interpolate(lambda x: x[0])
print(u.x.array)


v = dolfinx.fem.Function(V)
v.x.array[Wmap] = u.x.array
print(v.x.array)
print(v.sub(0).collapse().x.array)

@mscroggs might know more.

Edit
Try using a NodalEnrichedElement, which should in theory work in legacy DOLFIN.