From 17e44b2a4e383cdf5d5ad911eb9efcc9c10bd87d Mon Sep 17 00:00:00 2001 From: Reuben Hill Date: Fri, 9 Oct 2020 15:55:31 +0100 Subject: [PATCH 1/2] Remove coords argument from compile_expression_dual_evaluation See issue https://github.com/firedrakeproject/tsfc/issues/232 Note for some reason this breaks tests/regression/test_interpolate.py::test_piola which exits without stacktrace. --- firedrake/interpolation.py | 2 +- firedrake/preconditioners/pmg.py | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/firedrake/interpolation.py b/firedrake/interpolation.py index 82adf9bcdd..e8b4b3adea 100644 --- a/firedrake/interpolation.py +++ b/firedrake/interpolation.py @@ -231,7 +231,7 @@ 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, + ast, oriented, needs_cell_sizes, coefficients, _ = compile_expression_dual_evaluation(expr, to_element, domain=V.mesh(), parameters=parameters, coffee=False) diff --git a/firedrake/preconditioners/pmg.py b/firedrake/preconditioners/pmg.py index f206761443..e90983eadb 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, _ = 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, _ = compile_expression_dual_evaluation(expr, to_element, coffee=False) return op2.Kernel(ast, ast.name) def make_blas_kernels(self, Vf, Vc): From 9a5adc7c90981671d6090d2ac7c7b933a295349a Mon Sep 17 00:00:00 2001 From: Reuben Nixon-Hill Date: Wed, 18 Nov 2020 11:52:25 +0000 Subject: [PATCH 2/2] Replace manufactured coordinates coefficient Use new interface that informs if a manufactured coordinates coefficient is the first coefficient --- firedrake/interpolation.py | 14 +++++++++----- firedrake/preconditioners/pmg.py | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/firedrake/interpolation.py b/firedrake/interpolation.py index e8b4b3adea..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, - 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 e90983eadb..3e1117b22a 100644 --- a/firedrake/preconditioners/pmg.py +++ b/firedrake/preconditioners/pmg.py @@ -266,7 +266,7 @@ def prolongation_transfer_kernel_aij(Pk, P1): expr = TestFunction(P1) to_element = create_base_element(Pk.ufl_element()) - ast, oriented, needs_cell_sizes, coefficients, _ = compile_expression_dual_evaluation(expr, to_element, 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,7 +377,7 @@ def prolongation_transfer_kernel_action(Vf, expr): from tsfc import compile_expression_dual_evaluation from tsfc.finatinterface import create_base_element to_element = create_base_element(Vf.ufl_element()) - ast, oriented, needs_cell_sizes, coefficients, _ = compile_expression_dual_evaluation(expr, to_element, 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):