Error creating forms from ufl.extract_blocks

Hi.

Im using dolfinx version 0.9.0 on a docker container, trying to compile the forms for the block system arising from the navier-stokes equations results in an unexpected error.

Here is the MWE:

from petsc4py import PETSc
from mpi4py import MPI
from basix.ufl import element, mixed_element
from dolfinx.mesh import create_unit_square
from dolfinx.fem import (
    Constant,
    Function,
    functionspace,
    form,
)
from ufl import (
    dx,
    ds,
    dot,
    inner,
    nabla_grad,
    div,
    TestFunctions,
    split,
    sym,
    Identity,
    extract_blocks,
)


mesh = create_unit_square(MPI.COMM_WORLD, 32, 32)
dt = Constant(mesh, PETSc.ScalarType(1 / 200))
rho = Constant(mesh, PETSc.ScalarType(1))
mu = Constant(mesh, PETSc.ScalarType(1))
f = Constant(mesh, PETSc.ScalarType((0.0, 0.0)))
h = Constant(mesh, PETSc.ScalarType((0.0, 0.0)))


element_velocity = element(
    "Lagrange",
    mesh.topology.cell_name(),
    1,
    shape=(2,),
)
element_pressure = element("Lagrange", mesh.topology.cell_name(), 1)
element_mixed = mixed_element([element_velocity, element_pressure])

W = functionspace(mesh, element_mixed)
v, q = TestFunctions(W)

w_sol = Function(W)
u_sol, p_sol = split(w_sol)

w_prev = Function(W)
u_prev, p_prev = split(w_prev)


def epsilon(u):
    return sym(nabla_grad(u))


def sigma(u, p, mu):
    return 2 * mu * sym(nabla_grad(u)) - p * Identity(len(u))


F = rho * inner(v, (u_sol - u_prev) / dt) * dx
F += rho * dot(v, dot(u_sol, nabla_grad(u_sol))) * dx
F -= inner(v, rho * f) * dx
F += inner(epsilon(v), sigma(u_sol, p_sol, mu)) * dx
F -= inner(v, h) * ds
F += inner(q, div(u_sol)) * dx

F_form = form(extract_blocks(F))

The error:

Traceback (most recent call last):
  File "/root/shared/mwe.py", line 68, in <module>
    F_form = form(extract_blocks(F))
             ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/dolfinx-real/lib/python3.12/dist-packages/dolfinx/fem/forms.py", line 337, in form
    return _create_form(form)
           ^^^^^^^^^^^^^^^^^^
  File "/usr/local/dolfinx-real/lib/python3.12/dist-packages/dolfinx/fem/forms.py", line 333, in _create_form
    return list(map(lambda sub_form: _create_form(sub_form), form))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/dolfinx-real/lib/python3.12/dist-packages/dolfinx/fem/forms.py", line 333, in <lambda>
    return list(map(lambda sub_form: _create_form(sub_form), form))
                                     ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/dolfinx-real/lib/python3.12/dist-packages/dolfinx/fem/forms.py", line 333, in _create_form
    return list(map(lambda sub_form: _create_form(sub_form), form))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/dolfinx-real/lib/python3.12/dist-packages/dolfinx/fem/forms.py", line 333, in <lambda>
    return list(map(lambda sub_form: _create_form(sub_form), form))
                                     ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/dolfinx-real/lib/python3.12/dist-packages/dolfinx/fem/forms.py", line 331, in _create_form
    return _form(form)
           ^^^^^^^^^^^
  File "/usr/local/dolfinx-real/lib/python3.12/dist-packages/dolfinx/fem/forms.py", line 259, in _form
    V = [arg.ufl_function_space()._cpp_object for arg in form.arguments()]
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'FunctionSpace' object has no attribute '_cpp_object'

ufl.extract_block is supposed to be used together with ufl.MixedFunctionSpace, not a mixed_element. See: FEniCS release notes | FEniCS Project for details.

1 Like