Skip to content
Snippets Groups Projects
Commit abb92341 authored by Marcel Koch's avatar Marcel Koch
Browse files

Adds computation of macro index on facets in 3d

parent 3ac1629f
No related branches found
No related tags found
No related merge requests found
...@@ -27,9 +27,63 @@ def sub_element_inames(): ...@@ -27,9 +27,63 @@ def sub_element_inames():
return inames return inames
def tensor_index_to_sequential_index(inames, k): def sub_facet_inames():
index = prim.Sum(tuple(prim.Variable(name)*k**i for i,name in enumerate(inames))) subelem_inames = sub_element_inames()
return index
center = pymbolic_in_cell_coordinates(prim.Variable(name_localcenter()), Restriction.NEGATIVE)
def predicate(index):
return prim.Comparison(prim.Subscript(center, index), "==", 0.5)
def conditional_instruction(index):
instruction(assignee=prim.Variable(inames[index]),
expression=prim.Variable(subelem_inames[1 if index==2 else 0]),
within_inames=frozenset(subelem_inames).union(frozenset(quadrature_inames())),
predicates=frozenset([predicate(index)])
)
instruction(assignee=prim.Variable(inames[index]),
expression=prim.Product(((k-1),prim.Subscript(center, (index,)))),
within_inames=frozenset(subelem_inames).union(frozenset(quadrature_inames())),
predicates=frozenset([prim.LogicalNot(predicate(index))])
)
k = get_option("number_of_blocks")
inames = ("x",)
temporary_variable(inames[0])
conditional_instruction(0)
if world_dimension() < 3:
inames = inames + ("y",)
temporary_variable(inames[1])
conditional_instruction(1)
else:
inames = inames + ("y",)
temporary_variable(inames[1])
instruction(assignee=prim.Variable(inames[1]),
expression=prim.Variable(subelem_inames[0]),
within_inames=frozenset(subelem_inames).union(frozenset(quadrature_inames())),
predicates=frozenset([prim.LogicalAnd((predicate(1), predicate(2)))])
)
instruction(assignee=prim.Variable(inames[1]),
expression=prim.Variable(subelem_inames[1]),
within_inames=frozenset(subelem_inames).union(frozenset(quadrature_inames())),
predicates=frozenset([prim.LogicalAnd((predicate(1), predicate(0)))])
)
instruction(assignee=prim.Variable(inames[1]),
expression=prim.Product(((k-1),prim.Subscript(center, (1,)))),
within_inames=frozenset(subelem_inames).union(frozenset(quadrature_inames())),
predicates=frozenset([prim.LogicalNot(predicate(1))])
)
inames = inames + ("z",)
temporary_variable(inames[2])
conditional_instruction(2)
return inames
def tensor_index_to_sequential_index(indices, k):
return prim.Sum(tuple(index * k ** i for i, index in enumerate(indices)))
# TODO better name # TODO better name
...@@ -39,56 +93,15 @@ def to_tensor_index(iname): ...@@ -39,56 +93,15 @@ def to_tensor_index(iname):
# TODO 3d # TODO 3d
def micro_index_to_macro_index(iname): def micro_index_to_macro_index(iname):
subelem_inames_orig = sub_element_inames()
k = get_option("number_of_blocks")
it = get_global_context_value("integral_type") it = get_global_context_value("integral_type")
if it == "cell": if it == "cell":
sublem_inames = subelem_inames_orig subelem_inames = sub_element_inames()
elif it == "exterior_facet" or it == "interior_facet": elif it == "exterior_facet" or it == "interior_facet":
center = pymbolic_in_cell_coordinates(prim.Variable(name_localcenter()), Restriction.NEGATIVE) subelem_inames = sub_facet_inames()
def predicate(x):
return frozenset([prim.Comparison(prim.Subscript(center, 0), x, 0.5)])
sublem_inames = ("x",) k = get_option("number_of_blocks")
temporary_variable(sublem_inames[0]) modified_index = prim.Sum((tensor_index_to_sequential_index(to_tensor_index(iname), k+1),
instruction(assignee=prim.Variable(sublem_inames[0]), tensor_index_to_sequential_index(tuple(prim.Variable(iname) for iname in subelem_inames), k + 1)))
expression=prim.Variable(subelem_inames_orig[0]),
within_inames=frozenset(subelem_inames_orig).union(frozenset(quadrature_inames())),
predicates=predicate("==")
)
instruction(assignee=prim.Variable(sublem_inames[0]),
expression=prim.Product(((k-1),prim.Subscript(center, (0,)))),
within_inames=frozenset(subelem_inames_orig).union(frozenset(quadrature_inames())),
predicates=predicate("!=")
)
sublem_inames = sublem_inames + ("y",)
temporary_variable(sublem_inames[1])
instruction(assignee=prim.Variable(sublem_inames[1]),
expression=prim.Product(((k-1),prim.Subscript(center, (1,)))),
within_inames=frozenset(subelem_inames_orig).union(frozenset(quadrature_inames())),
predicates=predicate("==")
)
instruction(assignee=prim.Variable(sublem_inames[1]),
expression=prim.Variable(subelem_inames_orig[0]),
within_inames=frozenset(subelem_inames_orig).union(frozenset(quadrature_inames())),
predicates=predicate("!=")
)
#
# modified_index = prim.Sum((prim.Variable(x), index))
# if local_dimension() > 1:
# modified_index = prim.Sum((modified_index, prim.Product(((k+1), prim.Variable(y)))))
# index_div_2 = prim.FloorDiv(index, 2)
# index_div_2 = prim.Product((index_div_2, k-1))
# modified_index = prim.Sum((modified_index, index_div_2))
# if local_dimension() > 2:
# modified_index = prim.Sum((modified_index, prim.Variable(z)))
modified_index = prim.Sum(tuple(to_tensor_index(iname)[n] * (k + 1) ** n for n in range(world_dimension()))
+ (tensor_index_to_sequential_index(sublem_inames, get_option("number_of_blocks") + 1), ))
return modified_index return modified_index
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