diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py index 3fb213c87e98883e4f474c4145090b40aff1eec4..4fb6371057905f1d5cc0d301306522352236fac8 100644 --- a/python/dune/perftool/pdelab/localoperator.py +++ b/python/dune/perftool/pdelab/localoperator.py @@ -281,7 +281,7 @@ def determine_accumulation_space(info, number): def boundary_predicates(expr, measure, subdomain_id): - predicates = frozenset([]) + predicates = [] if subdomain_id not in ['everywhere', 'otherwise']: # Get the original form and inspect the present measures @@ -301,9 +301,18 @@ def boundary_predicates(expr, measure, subdomain_id): visitor = get_visitor(measure, subdomain_id) subdomain_data = visitor(subdomain_data, do_predicates=True) - predicates = predicates.union([prim.Comparison(subdomain_data, '==', subdomain_id)]) + p = prim.Comparison(subdomain_data, '==', subdomain_id) - return predicates + # Try to find conditions that are always 0 or always 1 + from pymbolic.mapper.evaluator import evaluate + try: + eval = evaluate(p) + if not eval: + predicates.append(False) + except: + predicates.append(p) + + return frozenset(predicates) class PDELabAccumulationInfo(ImmutableRecord): @@ -392,6 +401,8 @@ def generate_accumulation_instruction(expr, visitor): accumvar = name_accumulation_variable(test_lfs.get_restriction() + ansatz_lfs.get_restriction()) predicates = boundary_predicates(expr, visitor.measure, visitor.subdomain_id) + if False in predicates: + return rank = 1 if ansatz_lfs.lfs is None else 2 diff --git a/python/dune/perftool/sumfact/accumulation.py b/python/dune/perftool/sumfact/accumulation.py index dff7cfccd8a0282a2b0cf87e8c4a0ea3c709a010..61e39ffa4cc1179645ace5744a7354441ea773ca 100644 --- a/python/dune/perftool/sumfact/accumulation.py +++ b/python/dune/perftool/sumfact/accumulation.py @@ -402,6 +402,8 @@ def generate_accumulation_instruction(expr, visitor): visitor.measure, visitor.subdomain_id, ) + if False in predicates: + return insn_dep = None