diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py index 82c7c63413002341e161fcea0d3c2566d68e004c..a8b69b7326f76ab51fe26635cfd7d4557750bc19 100644 --- a/python/dune/perftool/pdelab/localoperator.py +++ b/python/dune/perftool/pdelab/localoperator.py @@ -251,7 +251,7 @@ def determine_accumulation_space(info, number): ) -def boundary_predicates(expr, measure, subdomain_id, visitor): +def boundary_predicates(expr, measure, subdomain_id): predicates = frozenset([]) if subdomain_id not in ['everywhere', 'otherwise']: @@ -279,6 +279,7 @@ def boundary_predicates(expr, measure, subdomain_id, visitor): from ufl.classes import Expr if isinstance(subdomain_data, Expr): + visitor = get_visitor(measure, subdomain_id) cond = visitor(subdomain_data, do_predicates=True) else: # Determine the name of the parameter function @@ -384,7 +385,7 @@ def generate_accumulation_instruction(expr, visitor): from dune.perftool.pdelab.argument import name_accumulation_variable accumvar = name_accumulation_variable(test_lfs.get_restriction() + ansatz_lfs.get_restriction()) - predicates = boundary_predicates(expr, visitor.measure, visitor.subdomain_id, visitor.copy()) + predicates = boundary_predicates(expr, visitor.measure, visitor.subdomain_id) rank = 1 if ansatz_lfs.lfs is None else 2 @@ -409,12 +410,7 @@ def generate_accumulation_instruction(expr, visitor): ) -def visit_integral(integral): - integrand = integral.integrand() - measure = integral.integral_type() - subdomain_id = integral.subdomain_id() - subdomain_data = integral.subdomain_data() - +def get_visitor(measure, subdomain_id): # Get a transformer instance for this kernel if get_option('sumfact'): from dune.perftool.sumfact import SumFactInterface @@ -425,10 +421,18 @@ def visit_integral(integral): else: from dune.perftool.pdelab import PDELabInterface interface = PDELabInterface() + from dune.perftool.ufl.visitor import UFL2LoopyVisitor - visitor = UFL2LoopyVisitor(interface, measure, subdomain_id) + return UFL2LoopyVisitor(interface, measure, subdomain_id) + + +def visit_integral(integral): + integrand = integral.integrand() + measure = integral.integral_type() + subdomain_id = integral.subdomain_id() # Start the visiting process! + visitor = get_visitor(measure, subdomain_id) visitor.accumulate(integrand) diff --git a/python/dune/perftool/sumfact/accumulation.py b/python/dune/perftool/sumfact/accumulation.py index a3e14a3b57c025e0016536876cebaa0534829c88..53d949c975c22cd1497e3b58c694bf62f5f168ea 100644 --- a/python/dune/perftool/sumfact/accumulation.py +++ b/python/dune/perftool/sumfact/accumulation.py @@ -231,7 +231,7 @@ def generate_accumulation_instruction(expr, visitor): predicates = boundary_predicates(expr, visitor.measure, visitor.subdomain_id, - visitor) + ) insn_dep = None diff --git a/python/dune/perftool/ufl/visitor.py b/python/dune/perftool/ufl/visitor.py index 57770051a597c2df8165a73b865c13c2a2990020..9128a295ec8c9d92a46167399029ef6dd713a37b 100644 --- a/python/dune/perftool/ufl/visitor.py +++ b/python/dune/perftool/ufl/visitor.py @@ -470,7 +470,3 @@ class UFL2LoopyVisitor(ModifiedTerminalTracker): def __hash__(self): return 0 - - def copy(self): - """ Get a copy of this visitor """ - return type(self)(self.interface, self.measure, self.subdomain_id)