Problem Description
As the title states, I encounter an error when using the div() operator for the 2D Poisson problem. The issue does not occur if I instead use (uh.dx(0).dx(0) + uh.dx(1).dx(1)).
I was wondering if someone could explain why this might be. I have some experience sorting out issues related to the dimensions of objects (dot vs inner, etc), but this one has me stumped.
Code
from mpi4py import MPI # Parallel communication
from dolfinx import mesh # Mesh tools
from dolfinx import fem
from dolfinx.fem import FunctionSpace
import ufl
from petsc4py.PETSc import ScalarType
#%% Problem Definition
# Domain
nx = 10
ny = 10
domain = mesh.create_unit_square(MPI.COMM_WORLD, nx, ny, mesh.CellType.triangle)
func_space = ("CG", 2)
V = FunctionSpace(domain, func_space)
#% Define BC
uD = fem.Function(V)
bound_func = lambda x: 1 + x[0]**2 + 2 * x[1]**2
uD.interpolate(bound_func)
# Define Boundary
# Create facet to cell connectivity required to determine boundary facets
tdim = domain.topology.dim # Topology dimension
fdim = tdim - 1 # Facet dimension
domain.topology.create_connectivity(fdim, tdim)
boundary_facets = mesh.exterior_facet_indices(domain.topology)
# Construct BC
boundary_dofs = fem.locate_dofs_topological(V, fdim, boundary_facets)
bc = fem.dirichletbc(uD, boundary_dofs)
#% Define Solution/Basis functions
u = ufl.TrialFunction(V)
v = ufl.TestFunction(V)
#% Define Source Terms
f = fem.Constant(domain, ScalarType(-6))
#% Define variational problem
dot = ufl.dot
dx = ufl.dx
grad = ufl.grad
div = ufl.div
inner = ufl.inner
a = -dot(grad(u), grad(v)) * dx + u*v*dx
L = f * v * dx
# Use solver
problem = fem.petsc.LinearProblem(a, L, bcs=[bc], petsc_options={"ksp_type": "preonly", "pc_type": "lu"})
uh = problem.solve()
# Calculate Residual
R = ( inner(div(uh), div(uh)) )*dx # *** This is where the error occurs
R_val = fem.assemble_scalar( fem.form(R) )
Error Message
Component and shape length don't match.
ERROR:UFL:Component and shape length don't match.
Traceback (most recent call last):
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/spyder_kernels/py3compat.py:356 in compat_exec
exec(code, globals, locals)
File ~/Grad School/Research/Software/FENICS/Tests/untitled0.py:133
R_val = fem.assemble_scalar( fem.form(R) )
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/dolfinx/fem/forms.py:176 in form
return _create_form(form)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/dolfinx/fem/forms.py:171 in _create_form
return _form(form)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/dolfinx/fem/forms.py:145 in _form
ufcx_form, module, code = jit.ffcx_jit(mesh.comm, form,
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/dolfinx/jit.py:56 in mpi_jit
return local_jit(*args, **kwargs)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/dolfinx/jit.py:204 in ffcx_jit
r = ffcx.codegeneration.jit.compile_forms([ufl_object], options=p_ffcx, **p_jit)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ffcx/codegeneration/jit.py:186 in compile_forms
impl = _compile_objects(decl, forms, form_names, module_name, p, cache_dir,
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ffcx/codegeneration/jit.py:250 in _compile_objects
_, code_body = ffcx.compiler.compile_ufl_objects(ufl_objects, prefix=module_name, options=options)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ffcx/compiler.py:97 in compile_ufl_objects
analysis = analyze_ufl_objects(ufl_objects, options)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ffcx/analysis.py:86 in analyze_ufl_objects
form_data = tuple(_analyze_form(form, options) for form in forms)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ffcx/analysis.py:86 in <genexpr>
form_data = tuple(_analyze_form(form, options) for form in forms)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ffcx/analysis.py:164 in _analyze_form
form_data = ufl.algorithms.compute_form_data(
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/algorithms/compute_form_data.py:253 in compute_form_data
form = apply_algebra_lowering(form)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/algorithms/apply_algebra_lowering.py:175 in apply_algebra_lowering
return map_integrand_dags(LowerCompoundAlgebra(), expr)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/algorithms/map_integrands.py:66 in map_integrand_dags
return map_integrands(lambda expr: map_expr_dag(function, expr, compress),
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/algorithms/map_integrands.py:29 in map_integrands
mapped_integrals = [map_integrands(function, itg, only_integral_type)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/algorithms/map_integrands.py:29 in <listcomp>
mapped_integrals = [map_integrands(function, itg, only_integral_type)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/algorithms/map_integrands.py:37 in map_integrands
return itg.reconstruct(function(itg.integrand()))
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/algorithms/map_integrands.py:66 in <lambda>
return map_integrands(lambda expr: map_expr_dag(function, expr, compress),
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/corealg/map_dag.py:36 in map_expr_dag
result, = map_expr_dags(function, [expression], compress=compress,
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/corealg/map_dag.py:99 in map_expr_dags
r = handlers[v._ufl_typecode_](v, *[vcache[u] for u in v.ufl_operands])
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/algorithms/apply_algebra_lowering.py:141 in div
return a[..., i].dx(i)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/exproperators.py:438 in _getitem
all_indices, slice_indices, repeated_indices = create_slice_indices(component, shape, self.ufl_free_indices)
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/index_combination_utils.py:169 in create_slice_indices
error("Component and shape length don't match.")
File ~/anaconda3/envs/fenicsx-env/lib/python3.10/site-packages/ufl/log.py:135 in error
raise self._exception_type(self._format_raw(*message))
UFLException: Component and shape length don't match.