diff --git a/python/dune/codegen/pdelab/localoperator.py b/python/dune/codegen/pdelab/localoperator.py index 600617eaa72779cf3e7f4a20e4d524fbb1fbbd38..835fe44e24df9f0849391e1f50422512df43c044 100644 --- a/python/dune/codegen/pdelab/localoperator.py +++ b/python/dune/codegen/pdelab/localoperator.py @@ -41,6 +41,7 @@ from dune.codegen.cgen.clazz import (AccessModifier, ) from dune.codegen.loopy.target import type_floatingpoint from dune.codegen.ufl.modified_terminals import Restriction +from frozendict import frozendict import dune.codegen.loopy.mangler @@ -509,24 +510,35 @@ def visit_integral(integral): def generate_kernel(integrals): logger = logging.getLogger(__name__) - # Visit all integrals once to collect information (dry-run)! - logger.debug('generate_kernel: visit_integrals (dry run)') - with global_context(dry_run=True): + # Assert that metadata for a given measure type agrees. This is a limitation + # of our current approach that is hard to overcome. + def remove_nonuser_metadata(d): + return frozendict({k: v for k, v in d.items() if k != "estimated_polynomial_degree"}) + + meta_dicts = [remove_nonuser_metadata(i.metadata()) for i in integrals] + if len(set(meta_dicts)) > 1: + measure = get_global_context_value("measure") + raise CodegenUFLError("Measure {} used with varying metadata! dune-codegen does not currently support this.") + + with form_option_context(**meta_dicts[0]): + # Visit all integrals once to collect information (dry-run)! + logger.debug('generate_kernel: visit_integrals (dry run)') + with global_context(dry_run=True): + for integral in integrals: + visit_integral(integral) + + # Now perform some checks on what should be done + from dune.codegen.sumfact.vectorization import decide_vectorization_strategy + logger.debug('generate_kernel: decide_vectorization_strategy') + decide_vectorization_strategy() + + # Delete the cache contents and do the real thing! + logger.debug('generate_kernel: visit_integrals (no dry run)') + from dune.codegen.generation import delete_cache_items + delete_cache_items("kernel_default") for integral in integrals: visit_integral(integral) - # Now perform some checks on what should be done - from dune.codegen.sumfact.vectorization import decide_vectorization_strategy - logger.debug('generate_kernel: decide_vectorization_strategy') - decide_vectorization_strategy() - - # Delete the cache contents and do the real thing! - logger.debug('generate_kernel: visit_integrals (no dry run)') - from dune.codegen.generation import delete_cache_items - delete_cache_items("kernel_default") - for integral in integrals: - visit_integral(integral) - from dune.codegen.pdelab.signatures import kernel_name, assembly_routine_signature name = kernel_name() signature = assembly_routine_signature() diff --git a/python/dune/codegen/pdelab/quadrature.py b/python/dune/codegen/pdelab/quadrature.py index 9814f6f2d389e4ec46d055ff2892f8058a330ebf..ca44056ce82037124cc3ea2a9781e6eb1feb9692 100644 --- a/python/dune/codegen/pdelab/quadrature.py +++ b/python/dune/codegen/pdelab/quadrature.py @@ -203,7 +203,7 @@ def quadrature_order(): possible to use a different quadrature_order per direction. """ if get_form_option("quadrature_order"): - quadrature_order = tuple(map(int, get_form_option("quadrature_order").split(','))) + quadrature_order = tuple(map(int, str(get_form_option("quadrature_order")).split(','))) else: quadrature_order = _estimate_quadrature_order() diff --git a/test/poisson/poisson_tensor.ufl b/test/poisson/poisson_tensor.ufl index b527d05258667dae629f608a1a630e5f11f947b8..3591d4d70e17f8811cf32bb759212c7c33e0bb24 100644 --- a/test/poisson/poisson_tensor.ufl +++ b/test/poisson/poisson_tensor.ufl @@ -12,6 +12,9 @@ V = FiniteElement("CG", cell, 1) u = TrialFunction(V) v = TestFunction(V) +# Test metadata setting of options +dx = dx(metadata={"quadrature_order": 27}) + r= (inner(A*grad(u), grad(v)) + c*u*v -f*v)*dx exact_solution = g is_dirichlet = 1