def map_operator_binding(self, expr): from hedge.optemplate import \ FluxOperatorBase, \ BoundaryPair, OperatorBinding, \ FluxExchangeOperator if isinstance(expr, OperatorBinding): if isinstance(expr.op, FluxOperatorBase): if isinstance(expr.field, BoundaryPair): # we're only worried about internal fluxes return IdentityMapper.map_operator_binding(self, expr) # by now we've narrowed it down to a bound interior flux def func_on_scalar_or_vector(func, arg_fields): # No CSE necessary here--the compiler CSE's these # automatically. from hedge.tools import is_obj_array, make_obj_array if is_obj_array(arg_fields): # arg_fields (as an object array) isn't hashable # --make it so by turning it into a tuple arg_fields = tuple(arg_fields) return make_obj_array([ func(i, arg_fields) for i in range(len(arg_fields)) ]) else: return func(0, (arg_fields, )) from hedge.mesh import TAG_RANK_BOUNDARY def exchange_and_cse(rank): return func_on_scalar_or_vector( lambda i, args: FluxExchangeOperator(i, rank, args), expr.field) from pymbolic.primitives import flattened_sum return flattened_sum([expr] + [ OperatorBinding( expr.op, BoundaryPair(expr.field, exchange_and_cse(rank), TAG_RANK_BOUNDARY(rank))) for rank in self.interacting_ranks ]) else: return IdentityMapper.map_operator_binding(self, expr)
def map_operator_binding(self, expr): from hedge.optemplate import \ FluxOperatorBase, \ BoundaryPair, OperatorBinding, \ FluxExchangeOperator if isinstance(expr, OperatorBinding): if isinstance(expr.op, FluxOperatorBase): if isinstance(expr.field, BoundaryPair): # we're only worried about internal fluxes return IdentityMapper.map_operator_binding(self, expr) # by now we've narrowed it down to a bound interior flux def func_on_scalar_or_vector(func, arg_fields): # No CSE necessary here--the compiler CSE's these # automatically. from hedge.tools import is_obj_array, make_obj_array if is_obj_array(arg_fields): # arg_fields (as an object array) isn't hashable # --make it so by turning it into a tuple arg_fields = tuple(arg_fields) return make_obj_array([ func(i, arg_fields) for i in range(len(arg_fields))]) else: return func(0, (arg_fields,)) from hedge.mesh import TAG_RANK_BOUNDARY def exchange_and_cse(rank): return func_on_scalar_or_vector( lambda i, args: FluxExchangeOperator(i, rank, args), expr.field) from pymbolic.primitives import flattened_sum return flattened_sum([expr] + [OperatorBinding(expr.op, BoundaryPair( expr.field, exchange_and_cse(rank), TAG_RANK_BOUNDARY(rank))) for rank in self.interacting_ranks]) else: return IdentityMapper.map_operator_binding(self, expr)
def internal_map_flux(self, flux_bind): from hedge.optemplate import IdentityMapper return IdentityMapper.map_operator_binding(self, flux_bind)
def internal_map_flux(self, flux_bind): from hedge.optemplate import IdentityMapper return IdentityMapper.map_operator_binding(self, flux_bind)