From 01ffdaa58324ed77c5c2c87db81bc86e1e4e2bf0 Mon Sep 17 00:00:00 2001 From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de> Date: Thu, 20 Sep 2018 16:03:34 +0200 Subject: [PATCH] Evaluate boundary predicates to discard silly conditions like 1 == 0 --- python/dune/perftool/pdelab/localoperator.py | 17 ++++++++++++++--- python/dune/perftool/sumfact/accumulation.py | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py index 3fb213c8..4fb63710 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 dff7cfcc..61e39ffa 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 -- GitLab