Skip to content

BUG: function interpolation failed #4868

@abaaba337

Description

@abaaba337

Describe the bug
"TypeError: TensorFiniteElement.dual_evaluation() takes 2 positional arguments but 3 were given" raised when using Function.interpolate()

Steps to Reproduce
Steps to reproduce the behavior:
from firedrake import *

mesh1 = RectangleMesh(1, 1, 1, 1)
mesh2 = RectangleMesh(1, 1, 1, 1)

V1 = VectorFunctionSpace(mesh1, "CG", 1)
V2 = VectorFunctionSpace(mesh2, "CG", 1)

z1 = Function(V1)
z2 = Function(V2)

z1.interpolate(z2)'

Expected behavior
Assignment works normally.

Error message

TypeError Traceback (most recent call last)
Cell In[1], line 13
10 z1 = Function(V1)
11 z2 = Function(V2)
---> 13 z1.interpolate(z2)

File petsc4py/PETSc/Log.pyx:250, in petsc4py.PETSc.Log.EventDecorator.decorator.wrapped_func()

File petsc4py/PETSc/Log.pyx:251, in petsc4py.PETSc.Log.EventDecorator.decorator.wrapped_func()

File ~/python_project/Firedrake_develop/firedrake/firedrake/function.py:386, in Function.interpolate(self, expression, ad_block_tag, **kwargs)
384 V = self.function_space()
385 interp = interpolate(expression, V, **kwargs)
--> 386 return assemble(interp, tensor=self, ad_block_tag=ad_block_tag)

File petsc4py/PETSc/Log.pyx:250, in petsc4py.PETSc.Log.EventDecorator.decorator.wrapped_func()

File petsc4py/PETSc/Log.pyx:251, in petsc4py.PETSc.Log.EventDecorator.decorator.wrapped_func()

File ~/python_project/Firedrake_develop/firedrake/firedrake/adjoint_utils/assembly.py:30, in annotate_assemble..wrapper(form, *args, **kwargs)
28 form = BaseFormAssembler.preprocess_base_form(form)
29 kwargs['is_base_form_preprocessed'] = True
---> 30 output = assemble(form, *args, **kwargs)
32 from firedrake.function import Function
33 from firedrake.cofunction import Cofunction

File ~/python_project/Firedrake_develop/firedrake/firedrake/assemble.py:149, in assemble(expr, *args, **kwargs)
147 if key in kwargs:
148 assemble_kwargs[key] = kwargs.pop(key, None)
--> 149 return get_assembler(expr, *args, **kwargs).assemble(**assemble_kwargs)

File ~/python_project/Firedrake_develop/firedrake/firedrake/assemble.py:432, in BaseFormAssembler.assemble(self, tensor, current_state)
430 # DAG assembly: traverse the DAG in a post-order fashion and evaluate the node on the fly.
431 visited = {}
--> 432 result = BaseFormAssembler.base_form_postorder_traversal(self._form, visitor, visited)
434 # Deal with 1-form bcs outside the visitor
435 rank = len(self._form.arguments())

File ~/python_project/Firedrake_develop/firedrake/firedrake/assemble.py:658, in BaseFormAssembler.base_form_postorder_traversal(expr, visitor, visited)
656 stack.extend(unvisited_children)
657 else:
--> 658 visited[e] = visitor(e, *(visited[arg] for arg in operands))
660 return visited[expr]

File ~/python_project/Firedrake_develop/firedrake/firedrake/assemble.py:428, in BaseFormAssembler.assemble..visitor(e, *operands)
426 # Deal with 2-form bcs inside the visitor
427 bcs = self._bcs if isinstance(e, ufl.BaseForm) and len(e.arguments()) == 2 else ()
--> 428 return self.base_form_assembly_visitor(e, t, bcs, *operands)

File ~/python_project/Firedrake_develop/firedrake/firedrake/assemble.py:626, in BaseFormAssembler.base_form_assembly_visitor(self, expr, tensor, bcs, *args)
624 raise ValueError("Cannot assemble an Interpolate with more than two arguments")
625 interpolator = get_interpolator(expr)
--> 626 return interpolator.assemble(tensor=tensor, bcs=bcs, mat_type=self._mat_type, sub_mat_type=self._sub_mat_type)
627 elif tensor and isinstance(expr, (firedrake.Function, firedrake.Cofunction, firedrake.MatrixBase)):
628 return tensor.assign(expr)

File ~/python_project/Firedrake_develop/firedrake/firedrake/interpolation.py:359, in Interpolator.assemble(self, tensor, bcs, mat_type, sub_mat_type)
320 """Assemble the interpolation. The result depends on the rank (number of arguments)
321 of the :class:Interpolate expression:
322
(...) 355 interpolation.
356 """
357 self._check_mat_type(mat_type)
--> 359 result = self._get_callable(tensor=tensor, bcs=bcs, mat_type=mat_type, sub_mat_type=sub_mat_type)()
360 if self.rank == 2:
361 # Assembling the operator
362 assert isinstance(tensor, MatrixBase | None)

File ~/python_project/Firedrake_develop/firedrake/firedrake/interpolation.py:576, in CrossMeshInterpolator._get_callable..callable()
575 def callable() -> Function | Number:
--> 576 assemble(action(point_eval_input_ordering, point_eval), tensor=f_point_eval_input_ordering)
577 # We assign these values to the output function
578 if self.allow_missing_dofs and self.default_missing_val is None:

File petsc4py/PETSc/Log.pyx:250, in petsc4py.PETSc.Log.EventDecorator.decorator.wrapped_func()

File petsc4py/PETSc/Log.pyx:251, in petsc4py.PETSc.Log.EventDecorator.decorator.wrapped_func()

File ~/python_project/Firedrake_develop/firedrake/firedrake/adjoint_utils/assembly.py:30, in annotate_assemble..wrapper(form, *args, **kwargs)
28 form = BaseFormAssembler.preprocess_base_form(form)
29 kwargs['is_base_form_preprocessed'] = True
---> 30 output = assemble(form, *args, **kwargs)
32 from firedrake.function import Function
33 from firedrake.cofunction import Cofunction

File ~/python_project/Firedrake_develop/firedrake/firedrake/assemble.py:149, in assemble(expr, *args, **kwargs)
147 if key in kwargs:
148 assemble_kwargs[key] = kwargs.pop(key, None)
--> 149 return get_assembler(expr, *args, **kwargs).assemble(**assemble_kwargs)

File ~/python_project/Firedrake_develop/firedrake/firedrake/assemble.py:432, in BaseFormAssembler.assemble(self, tensor, current_state)
430 # DAG assembly: traverse the DAG in a post-order fashion and evaluate the node on the fly.
431 visited = {}
--> 432 result = BaseFormAssembler.base_form_postorder_traversal(self._form, visitor, visited)
434 # Deal with 1-form bcs outside the visitor
435 rank = len(self._form.arguments())

File ~/python_project/Firedrake_develop/firedrake/firedrake/assemble.py:658, in BaseFormAssembler.base_form_postorder_traversal(expr, visitor, visited)
656 stack.extend(unvisited_children)
657 else:
--> 658 visited[e] = visitor(e, *(visited[arg] for arg in operands))
660 return visited[expr]

File ~/python_project/Firedrake_develop/firedrake/firedrake/assemble.py:428, in BaseFormAssembler.assemble..visitor(e, *operands)
426 # Deal with 2-form bcs inside the visitor
427 bcs = self._bcs if isinstance(e, ufl.BaseForm) and len(e.arguments()) == 2 else ()
--> 428 return self.base_form_assembly_visitor(e, t, bcs, *operands)

File ~/python_project/Firedrake_develop/firedrake/firedrake/assemble.py:626, in BaseFormAssembler.base_form_assembly_visitor(self, expr, tensor, bcs, *args)
624 raise ValueError("Cannot assemble an Interpolate with more than two arguments")
625 interpolator = get_interpolator(expr)
--> 626 return interpolator.assemble(tensor=tensor, bcs=bcs, mat_type=self._mat_type, sub_mat_type=self._sub_mat_type)
627 elif tensor and isinstance(expr, (firedrake.Function, firedrake.Cofunction, firedrake.MatrixBase)):
628 return tensor.assign(expr)

File ~/python_project/Firedrake_develop/firedrake/firedrake/interpolation.py:359, in Interpolator.assemble(self, tensor, bcs, mat_type, sub_mat_type)
320 """Assemble the interpolation. The result depends on the rank (number of arguments)
321 of the :class:Interpolate expression:
322
(...) 355 interpolation.
356 """
357 self._check_mat_type(mat_type)
--> 359 result = self._get_callable(tensor=tensor, bcs=bcs, mat_type=mat_type, sub_mat_type=sub_mat_type)()
360 if self.rank == 2:
361 # Assembling the operator
362 assert isinstance(tensor, MatrixBase | None)

File ~/python_project/Firedrake_develop/firedrake/firedrake/interpolation.py:736, in SameMeshInterpolator._get_callable(self, tensor, bcs, mat_type, sub_mat_type)
734 for indices, sub_expr in expressions.items():
735 sub_op2_tensor = op2_tensor[indices[0]] if self.rank == 1 else op2_tensor
--> 736 loops.extend(_build_interpolation_callables(sub_expr, sub_op2_tensor, self.access, self.subset, bcs))
738 if bcs and self.rank == 1:
739 loops.extend(partial(bc.apply, f) for bc in bcs)

File :2, in _build_interpolation_callables(expr, tensor, access, subset, bcs)

File ~/python_project/Firedrake_develop/firedrake/firedrake/utils.py:91, in known_pyop2_safe..wrapper(f, *args, **kwargs)
89 opts["type_check"] = safe
90 try:
---> 91 return f(*args, **kwargs)
92 finally:
93 opts["type_check"] = check

File ~/python_project/Firedrake_develop/firedrake/firedrake/interpolation.py:913, in _build_interpolation_callables(expr, tensor, access, subset, bcs)
910 with wdat.vec_ro as w, v.dat.vec as y:
911 copyin += (partial(y.pointwiseMult, y, w),)
--> 913 kernel = compile_expression(cell_set.comm, expr, target_element,
914 domain=source_mesh, parameters=parameters)
915 ast = kernel.ast
916 oriented = kernel.oriented

File petsc4py/PETSc/Log.pyx:250, in petsc4py.PETSc.Log.EventDecorator.decorator.wrapped_func()

File petsc4py/PETSc/Log.pyx:251, in petsc4py.PETSc.Log.EventDecorator.decorator.wrapped_func()

File ~/python_project/Firedrake_develop/firedrake/pyop2/caching.py:583, in parallel_cache..decorator..wrapper(*args, **kwargs)
581 value = comm.bcast(value, root=0)
582 else:
--> 583 value = func(*args, **kwargs)
585 return cache.setdefault(key, value)

File petsc4py/PETSc/Log.pyx:250, in petsc4py.PETSc.Log.EventDecorator.decorator.wrapped_func()

File petsc4py/PETSc/Log.pyx:251, in petsc4py.PETSc.Log.EventDecorator.decorator.wrapped_func()

File ~/python_project/Firedrake_develop/firedrake/pyop2/caching.py:583, in parallel_cache..decorator..wrapper(*args, **kwargs)
581 value = comm.bcast(value, root=0)
582 else:
--> 583 value = func(*args, **kwargs)
585 return cache.setdefault(key, value)

File petsc4py/PETSc/Log.pyx:250, in petsc4py.PETSc.Log.EventDecorator.decorator.wrapped_func()

File petsc4py/PETSc/Log.pyx:251, in petsc4py.PETSc.Log.EventDecorator.decorator.wrapped_func()

File ~/python_project/Firedrake_develop/firedrake/firedrake/interpolation.py:1062, in compile_expression(comm, *args, **kwargs)
1056 @memory_and_disk_cache(
1057 hashkey=_compile_expression_key,
1058 cachedir=_cachedir
1059 )
1060 @PETSc.Log.EventDecorator()
1061 def compile_expression(comm, *args, **kwargs):
-> 1062 return compile_expression_dual_evaluation(*args, **kwargs)

File ~/python_project/Firedrake_develop/firedrake/tsfc/driver.py:346, in compile_expression_dual_evaluation(expression, ufl_element, domain, interface, parameters, name)
344 else:
345 coordinate_mapping = None
--> 346 evaluation, basis_indices = to_element.dual_evaluation(fn, coordinate_mapping)
348 # Compute the action against the dual argument
349 if isinstance(dual_arg, ufl.Cofunction):

TypeError: TensorFiniteElement.dual_evaluation() takes 2 positional arguments but 3 were given

Environment:

  • OS: WSL (Windows Subsystem for Linux)
  • Python version: 3.12.3
  • Firedrake Version: the latest main branch

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions