Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    def internal_map_flux(self, flux_bind):
        from hedge.optemplate import IdentityMapper

        return IdentityMapper.map_operator_binding(self, flux_bind)
Esempio n. 4
0
 def internal_map_flux(self, flux_bind):
     from hedge.optemplate import IdentityMapper
     return IdentityMapper.map_operator_binding(self, flux_bind)