diff --git a/python/dune/perftool/loopy/transformer.py b/python/dune/perftool/loopy/transformer.py index db0a0fbc002d6ad5117e637db6f28ccb018d2edb..727f31b4dc13eb1fe14928d04ea5743962d1f77f 100644 --- a/python/dune/perftool/loopy/transformer.py +++ b/python/dune/perftool/loopy/transformer.py @@ -144,11 +144,13 @@ def transform_accumulation_term(term): inames = retrieve_cache_items("iname") from dune.perftool.pdelab.quadrature import name_factor + factor = name_factor() instruction(inames=inames, code="{}.accumulate({}, {}*{})".format(residual, ", ".join(accumargs), expr_tv_name, - name_factor() + factor, ), assignees=residual, + read_variables=(factor, expr_tv_name), ) diff --git a/python/dune/perftool/pdelab/__init__.py b/python/dune/perftool/pdelab/__init__.py index 534fea4373209c9f50ea99b9711bc7c5603a0722..4d5762dd4687a2e7fa8cd7b8e4d2a4865484c3e6 100644 --- a/python/dune/perftool/pdelab/__init__.py +++ b/python/dune/perftool/pdelab/__init__.py @@ -1,6 +1,8 @@ """ The pdelab specific parts of the code generation process """ -from dune.perftool.generation import symbol +from dune.perftool.generation import (preamble, + symbol, + ) # Now define some commonly used generators that do not fall into a specific category diff --git a/python/dune/perftool/pdelab/basis.py b/python/dune/perftool/pdelab/basis.py index e84c05f5a2a126d56e48c0015652df7cade34821..9a44bb64c6f9079d5bc26451d8c4f11745db220f 100644 --- a/python/dune/perftool/pdelab/basis.py +++ b/python/dune/perftool/pdelab/basis.py @@ -34,7 +34,7 @@ def name_lfs_bound(lfs): return bound -@generator_factory(cache_key_generator=lambda e, **kw: e, item_tags=('blubb',)) +@generator_factory(cache_key_generator=lambda e, **kw: e) def name_lfs(element, prefix=None): # Omitting the prefix is only valid upon a second call, which will # result in a cache hit. @@ -106,15 +106,10 @@ def lfs_iname(element, argcount=0): return _lfs_iname(element, argcount) -@symbol -def name_localfunctionspace(expr): - return 'lfsu' - - @cached def evaluate_basis(element, name): temporary_variable(name, shape=(name_lfs_bound(element),)) - lfs = name_localfunctionspace(element) + lfs = name_lfs(element) qp = name_quadrature_point() instruction(inames=(quadrature_iname(), ), @@ -136,7 +131,7 @@ def name_basis(element): def evaluate_reference_gradient(element, name): # TODO this is of course not yet correct temporary_variable(name, shape=(name_lfs_bound(element), name_dimension())) - lfs = name_localfunctionspace(element) + lfs = name_lfs(element) qp = name_quadrature_point() instruction(inames=(quadrature_iname(), ), @@ -170,6 +165,9 @@ def evaluate_basis_gradient(element, name): name, ), assignees=name, + read_variables=(reference_gradients, + ), + ) @@ -182,7 +180,7 @@ def name_basis_gradient(element): @cached def evaluate_trialfunction(element, name): temporary_variable(name, shape=()) - lfs = name_localfunctionspace(element) + lfs = name_lfs(element) index = lfs_iname(element) basis = name_basis() instruction(inames=(quadrature_iname(), @@ -205,7 +203,7 @@ def evaluate_trialfunction(element, name): def evaluate_trialfunction_gradient(element, name): # TODO this is of course not yet correct temporary_variable(name, shape=(name_dimension(),)) - lfs = name_localfunctionspace(element) + lfs = name_lfs(element) index = lfs_iname(element) basis = name_basis_gradient(element) instruction(inames=(quadrature_iname(), @@ -217,4 +215,6 @@ def evaluate_trialfunction_gradient(element, name): basis ), assignees=name, + read_variables=(basis, + ), ) diff --git a/python/dune/perftool/pdelab/geometry.py b/python/dune/perftool/pdelab/geometry.py index 10787306982040a08b70b9a21f42111f836a6967..5a12c91b37a70997a0399acf275a307da4b27b87 100644 --- a/python/dune/perftool/pdelab/geometry.py +++ b/python/dune/perftool/pdelab/geometry.py @@ -1,5 +1,6 @@ from dune.perftool.generation import (preamble, symbol, + temporary_variable, ) from dune.perftool.pdelab.quadrature import (name_quadrature_position, quadrature_preamble, @@ -24,7 +25,7 @@ def type_geometry(): @preamble def define_dimension(name): geo = type_geometry() - return 'auto {} = {}::Geometry::coorddimension;'.format(name, geo) + return 'const int {} = {}::Entity::dimension;'.format(name, geo) @symbol @@ -33,13 +34,23 @@ def name_dimension(): return "dim" +@preamble +def define_jacobian_inverse_transposed_temporary(name, **kwargs): + geo = name_geometry() + return "auto {} = {}.jacobianInverseTransposed({{{{ 0.0 }}}});".format(name, + geo, + ) + + def define_jacobian_inverse_transposed(name): + dim = name_dimension() + temporary_variable(name, decl_method=define_jacobian_inverse_transposed_temporary, shape=(dim, dim)) geo = name_geometry() pos = name_quadrature_position() - return quadrature_preamble("auto {} = {}.jacobianInverseTransposed({});".format(name, - geo, - pos, - ) + return quadrature_preamble("{} = {}.jacobianInverseTransposed({});".format(name, + geo, + pos, + ) ) @symbol