-
Notifications
You must be signed in to change notification settings - Fork 179
Description
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