diff --git a/firedrake/interpolation.py b/firedrake/interpolation.py index 82adf9bcdd..aa4f8b6aa6 100644 --- a/firedrake/interpolation.py +++ b/firedrake/interpolation.py @@ -231,10 +231,10 @@ def _interpolator(V, tensor, expr, subset, arguments, access): if not isinstance(expr, firedrake.Expression): if expr.ufl_domain() and expr.ufl_domain() != V.mesh(): raise NotImplementedError("Interpolation onto another mesh not supported.") - ast, oriented, needs_cell_sizes, coefficients, _ = compile_expression_dual_evaluation(expr, to_element, coords, - domain=V.mesh(), - parameters=parameters, - coffee=False) + ast, oriented, needs_cell_sizes, coefficients, first_coeff_fake_coords, _ = compile_expression_dual_evaluation(expr, to_element, + domain=V.mesh(), + parameters=parameters, + coffee=False) kernel = op2.Kernel(ast, ast.name, requires_zeroed_output_arguments=True) elif hasattr(expr, "eval"): to_pts = [] @@ -243,8 +243,8 @@ def _interpolator(V, tensor, expr, subset, arguments, access): raise NotImplementedError("Can only interpolate Python kernels with Lagrange elements") pts, = dual.pt_dict.keys() to_pts.append(pts) - kernel, oriented, needs_cell_sizes, coefficients = compile_python_kernel(expr, to_pts, to_element, V, coords) + first_coeff_fake_coords = False else: raise RuntimeError("Attempting to evaluate an Expression which has no value.") @@ -254,6 +254,10 @@ def _interpolator(V, tensor, expr, subset, arguments, access): cell_set = subset parloop_args = [kernel, cell_set] + if first_coeff_fake_coords: + # Replace with real coords coefficient + coefficients[0] = coords + if tensor in set((c.dat for c in coefficients)): output = tensor tensor = op2.Dat(tensor.dataset) diff --git a/firedrake/preconditioners/pmg.py b/firedrake/preconditioners/pmg.py index f206761443..3e1117b22a 100644 --- a/firedrake/preconditioners/pmg.py +++ b/firedrake/preconditioners/pmg.py @@ -264,10 +264,9 @@ def prolongation_transfer_kernel_aij(Pk, P1): from firedrake import TestFunction expr = TestFunction(P1) - coords = Pk.ufl_domain().coordinates to_element = create_base_element(Pk.ufl_element()) - ast, oriented, needs_cell_sizes, coefficients, _ = compile_expression_dual_evaluation(expr, to_element, coords, coffee=False) + ast, oriented, needs_cell_sizes, coefficients, first_coeff_fake_coords, _ = compile_expression_dual_evaluation(expr, to_element, coffee=False) kernel = op2.Kernel(ast, ast.name) return kernel @@ -377,9 +376,8 @@ def make_kernels(self, Vf, Vc): def prolongation_transfer_kernel_action(Vf, expr): from tsfc import compile_expression_dual_evaluation from tsfc.finatinterface import create_base_element - coords = Vf.ufl_domain().coordinates to_element = create_base_element(Vf.ufl_element()) - ast, oriented, needs_cell_sizes, coefficients, _ = compile_expression_dual_evaluation(expr, to_element, coords, coffee=False) + ast, oriented, needs_cell_sizes, coefficients, first_coeff_fake_coords, _ = compile_expression_dual_evaluation(expr, to_element, coffee=False) return op2.Kernel(ast, ast.name) def make_blas_kernels(self, Vf, Vc):