From c9980807c8b9d5a4a4bd42afaea0281bcffc2c15 Mon Sep 17 00:00:00 2001 From: Marcel Koch <marcel.koch@uni-muenster.de> Date: Tue, 22 Jan 2019 12:03:47 +0100 Subject: [PATCH] move `name_point_in_macro` to tools --- .../codegen/blockstructured/quadrature.py | 23 ++----------- python/dune/codegen/blockstructured/tools.py | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/python/dune/codegen/blockstructured/quadrature.py b/python/dune/codegen/blockstructured/quadrature.py index 7effba47..18479030 100644 --- a/python/dune/codegen/blockstructured/quadrature.py +++ b/python/dune/codegen/blockstructured/quadrature.py @@ -1,10 +1,7 @@ from dune.codegen.error import CodegenError - -from dune.codegen.generation import (backend, - quadrature_mixin, - ) +from dune.codegen.generation import quadrature_mixin from dune.codegen.pdelab.quadrature import GenericQuadratureMixin -from dune.codegen.blockstructured.geometry import name_point_in_macro +from dune.codegen.blockstructured.tools import name_point_in_macro import pymbolic.primitives as prim @@ -23,19 +20,3 @@ class BlockstructuredQuadratureMixin(GenericQuadratureMixin): def quadrature_position(self, index=None): raise CodegenError('Decide if the quadrature point is in the macro or micro element') -# -# @backend(interface="quad_pos", name='blockstructured') -# def pymbolic_quadrature_position(): -# quad_points = name_quadrature_points() -# quad_iname = quadrature_iname() -# -# qp_in_micro = prim.Subscript(prim.Variable(quad_points), (prim.Variable(quad_iname),)) -# -# return prim.Variable(name_point_in_macro(qp_in_micro)) -# -# -# @backend(interface="qp_in_cell", name="blockstructured") -# def pymbolic_quadrature_position_in_cell(restriction): -# from dune.codegen.pdelab.geometry import to_cell_coordinates -# quad_pos = pymbolic_quadrature_position() -# return to_cell_coordinates(quad_pos, restriction) diff --git a/python/dune/codegen/blockstructured/tools.py b/python/dune/codegen/blockstructured/tools.py index e3150804..adf2b7ff 100644 --- a/python/dune/codegen/blockstructured/tools.py +++ b/python/dune/codegen/blockstructured/tools.py @@ -1,4 +1,5 @@ from dune.codegen.ufl.modified_terminals import Restriction +from dune.codegen.tools import get_pymbolic_basename from dune.codegen.generation import (iname, domain, get_global_context_value, @@ -115,3 +116,36 @@ def micro_index_to_macro_index(element, inames): p = element.degree() return prim.Sum(tuple((p * prim.Variable(si) + prim.Variable(bi)) * (p * k + 1) ** i for i, (si, bi) in enumerate(zip(subelem_inames, inames)))) + + +# translate a point in the micro element into macro coordinates +def define_point_in_macro(name, point_in_micro, visitor): + dim = local_dimension() + if get_form_option('vectorization_blockstructured'): + temporary_variable(name, shape=(dim,), managed=True) + else: + temporary_variable(name, shape=(dim,), shape_impl=('fv',)) + + # point_macro = (point_micro + index_micro) / number_of_blocks + # where index_micro = tensor index of the micro element + subelem_inames = sub_element_inames() + for i in range(dim): + if isinstance(point_in_micro, prim.Subscript): + expr = prim.Subscript(point_in_micro.aggregate, point_in_micro.index + (i,)) + else: + expr = prim.Subscript(point_in_micro, (i,)) + expr = prim.Sum((expr, prim.Variable(subelem_inames[i]),)) + expr = prim.Quotient(expr, get_form_option('number_of_blocks')) + # TODO relax within inames + instruction(assignee=prim.Subscript(prim.Variable(name), (i,)), + expression=expr, + within_inames=frozenset(subelem_inames + visitor.quadrature_inames()), + tags=frozenset({subelem_inames[i]}) + ) + + +def name_point_in_macro(point_in_micro, visitor): + assert isinstance(point_in_micro, prim.Expression) + name = get_pymbolic_basename(point_in_micro) + "_macro" + define_point_in_macro(name, point_in_micro, visitor) + return name \ No newline at end of file -- GitLab