Skip to content
Snippets Groups Projects
Commit c9980807 authored by Marcel Koch's avatar Marcel Koch Committed by Dominic Kempf
Browse files

move `name_point_in_macro` to tools

parent 1a476864
No related branches found
No related tags found
No related merge requests found
from dune.codegen.error import CodegenError from dune.codegen.error import CodegenError
from dune.codegen.generation import quadrature_mixin
from dune.codegen.generation import (backend,
quadrature_mixin,
)
from dune.codegen.pdelab.quadrature import GenericQuadratureMixin 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 import pymbolic.primitives as prim
...@@ -23,19 +20,3 @@ class BlockstructuredQuadratureMixin(GenericQuadratureMixin): ...@@ -23,19 +20,3 @@ class BlockstructuredQuadratureMixin(GenericQuadratureMixin):
def quadrature_position(self, index=None): def quadrature_position(self, index=None):
raise CodegenError('Decide if the quadrature point is in the macro or micro element') 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)
from dune.codegen.ufl.modified_terminals import Restriction from dune.codegen.ufl.modified_terminals import Restriction
from dune.codegen.tools import get_pymbolic_basename
from dune.codegen.generation import (iname, from dune.codegen.generation import (iname,
domain, domain,
get_global_context_value, get_global_context_value,
...@@ -115,3 +116,36 @@ def micro_index_to_macro_index(element, inames): ...@@ -115,3 +116,36 @@ def micro_index_to_macro_index(element, inames):
p = element.degree() p = element.degree()
return prim.Sum(tuple((p * prim.Variable(si) + prim.Variable(bi)) * (p * k + 1) ** i 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)))) 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment