Ejemplo n.º 1
0
class StraightCurvedFaceGroup(hedge._internal.StraightCurvedFaceGroup):
    def __init__(self, double_sided, debug):
        hedge._internal.StraightCurvedFaceGroup.__init__(self, double_sided)
        from hedge.tools import IndexListRegistry
        self.fil_registry = IndexListRegistry(debug)

    def register_face_index_list(self, identifier, generator):
        return self.fil_registry.register(identifier, generator)

    def commit(self, discr, ldis_loc, ldis_opp):
        if self.fil_registry.index_lists:
            self.index_lists = numpy.array(
                    self.fil_registry.index_lists,
                    dtype=numpy.uint32, order="C")
            del self.fil_registry

        if ldis_loc is None:
            self.face_count = 0
        else:
            self.face_count = ldis_loc.face_count()

        # number elements locally
        used_bases_and_els = list(set(
                (side.el_base_index, side.element_id)
                for fp in self.face_pairs
                for side in [fp.int_side, fp.ext_side]
                if side.element_id != hedge._internal.INVALID_ELEMENT))

        used_bases_and_els.sort()
        el_id_to_local_number = dict(
                (bae[1], i) for i, bae in enumerate(used_bases_and_els))

        self.local_el_write_base = numpy.fromiter(
                (bae[0] for bae in used_bases_and_els), dtype=numpy.uint32)

        for fp in self.face_pairs:
            for side in [fp.int_side, fp.ext_side]:
                if side.element_id != hedge._internal.INVALID_ELEMENT:
                    side.local_el_number = el_id_to_local_number[side.element_id]

        # transfer inverse jacobians
        self.local_el_inverse_jacobians = numpy.fromiter(
                (abs(discr.mesh.elements[bae[1]].inverse_map.jacobian()) 
                    for bae in used_bases_and_els),
                dtype=float)

        self.ldis_loc = ldis_loc
        self.ldis_opp = ldis_opp
Ejemplo n.º 2
0
class StraightCurvedFaceGroup(hedge._internal.StraightCurvedFaceGroup):
    def __init__(self, double_sided, debug):
        hedge._internal.StraightCurvedFaceGroup.__init__(self, double_sided)
        from hedge.tools import IndexListRegistry
        self.fil_registry = IndexListRegistry(debug)

    def register_face_index_list(self, identifier, generator):
        return self.fil_registry.register(identifier, generator)

    def commit(self, discr, ldis_loc, ldis_opp):
        if self.fil_registry.index_lists:
            self.index_lists = np.array(
                    self.fil_registry.index_lists,
                    dtype=np.uint32, order="C")
            del self.fil_registry

        if ldis_loc is None:
            self.face_count = 0
        else:
            self.face_count = ldis_loc.face_count()

        # number elements locally
        used_bases_and_els = list(set(
                (side.el_base_index, side.element_id)
                for fp in self.face_pairs
                for side in [fp.int_side, fp.ext_side]
                if side.element_id != hedge._internal.INVALID_ELEMENT))

        used_bases_and_els.sort()
        el_id_to_local_number = dict(
                (bae[1], i) for i, bae in enumerate(used_bases_and_els))

        self.local_el_write_base = np.fromiter(
                (bae[0] for bae in used_bases_and_els), dtype=np.uint32)

        for fp in self.face_pairs:
            for side in [fp.int_side, fp.ext_side]:
                if side.element_id != hedge._internal.INVALID_ELEMENT:
                    side.local_el_number = el_id_to_local_number[side.element_id]

        # transfer inverse jacobians
        self.local_el_inverse_jacobians = np.fromiter(
                (abs(discr.mesh.elements[bae[1]].inverse_map.jacobian())
                    for bae in used_bases_and_els),
                dtype=float)

        self.ldis_loc = ldis_loc
        self.ldis_opp = ldis_opp
Ejemplo n.º 3
0
 def __init__(self, double_sided, debug):
     hedge._internal.StraightCurvedFaceGroup.__init__(self, double_sided)
     from hedge.tools import IndexListRegistry
     self.fil_registry = IndexListRegistry(debug)
Ejemplo n.º 4
0
class StraightFaceGroup(hedge._internal.StraightFaceGroup):
    """
    Each face group has its own element numbering.

    :ivar ldis_loc: An instance of 
        :hedge.discretization.local.LocalDiscretization`,
        used for the interior side of each face.
    :ivar ldis_opp: An instance of 
        :hedge.discretization.local.LocalDiscretization`,
        used for the exterior side of each face.
    :ivar local_el_inverse_jacobians: A list of inverse
        Jacobians for each element.

    The following attributes are inherited from the C++ level:

    :ivar face_pairs: A list of face pair instances.
    :ivar double_sided: A :class:`bool` indicating whether this 
        face group is double-sided, i.e. represents both sides
        of each face-pair, or only the interior side.
    :ivar index_lists: A numpy array of shape 
        *(index_list_count, index_list_length)*.
    :ivar face_count: The number of faces of each element
        in :attr:`ldis_loc`.
    :ivar local_el_write_base: a list of global volume 
        element base indices, indexed in local element numbers.

    Face groups on quadrature grids additionally have these
    properties:

    :ivar ldis_loc_quad_info: refer to 
      :class:`hedge.discretization.local.LocalDiscretization.QuadratureInfo`
      instance relevant for this face group's :attr:`ldis_loc`.
    :ivar ldis_opp_quad_info: refer to 
      :class:`hedge.discretization.local.LocalDiscretization.QuadratureInfo`
      instance relevant for this face group's :attr:`ldis_opp`.

    Further, the following methods are inherited from the C++ level:

    .. method:: element_count()
    .. method:: face_length()
    """

    def __init__(self, double_sided, debug):
        hedge._internal.StraightFaceGroup.__init__(self, double_sided)
        from hedge.tools import IndexListRegistry
        self.fil_registry = IndexListRegistry(debug)
        self.quadrature_info = {}

    def register_face_index_list(self, identifier, generator):
        return self.fil_registry.register(identifier, generator)

    def commit(self, discr, ldis_loc, ldis_opp, get_write_el_base=None):
        """
        :param get_write_el_base: a function of *(read_el_base, element_id)* 
          returning the DOF index to which data should be written post-lift.
          This is needed since on a quadrature grid, element base indices in a
          face pair refer to interior boundary vectors and are hence only
          usable for reading.
        """
        if self.fil_registry.index_lists:
            self.index_lists = numpy.array(
                    self.fil_registry.index_lists,
                    dtype=numpy.uint32, order="C")
            del self.fil_registry

        if ldis_loc is None:
            self.face_count = 0
        else:
            self.face_count = ldis_loc.face_count()

        # number elements locally
        used_bases_and_els = list(set(
                (side.el_base_index, side.element_id)
                for fp in self.face_pairs
                for side in [fp.int_side, fp.ext_side]
                if side.element_id != hedge._internal.INVALID_ELEMENT))

        if get_write_el_base is None:
            def get_write_el_base(read_base, el_id):
                return read_base

        used_bases_and_els.sort()
        el_id_to_local_number = dict(
                (bae[1], i) for i, bae in enumerate(used_bases_and_els))
        self.local_el_write_base = numpy.fromiter(
                (get_write_el_base(*bae) 
                    for bae in used_bases_and_els), dtype=numpy.uint32)

        for fp in self.face_pairs:
            for side in [fp.int_side, fp.ext_side]:
                if side.element_id != hedge._internal.INVALID_ELEMENT:
                    side.local_el_number = el_id_to_local_number[side.element_id]

        # transfer inverse jacobians
        self.local_el_inverse_jacobians = numpy.fromiter(
                (abs(discr.mesh.elements[bae[1]].inverse_map.jacobian()) 
                    for bae in used_bases_and_els),
                dtype=float)

        self.ldis_loc = ldis_loc
        self.ldis_opp = ldis_opp
Ejemplo n.º 5
0
 def __init__(self, double_sided, debug):
     hedge._internal.StraightCurvedFaceGroup.__init__(self, double_sided)
     from hedge.tools import IndexListRegistry
     self.fil_registry = IndexListRegistry(debug)
Ejemplo n.º 6
0
class StraightFaceGroup(hedge._internal.StraightFaceGroup):
    """
    Each face group has its own element numbering.

    :ivar ldis_loc: An instance of
        :hedge.discretization.local.LocalDiscretization`,
        used for the interior side of each face.
    :ivar ldis_opp: An instance of
        :hedge.discretization.local.LocalDiscretization`,
        used for the exterior side of each face.
    :ivar local_el_inverse_jacobians: A list of inverse
        Jacobians for each element.

    The following attributes are inherited from the C++ level:

    :ivar face_pairs: A list of face pair instances.
    :ivar double_sided: A :class:`bool` indicating whether this
        face group is double-sided, i.e. represents both sides
        of each face-pair, or only the interior side.
    :ivar index_lists: A numpy array of shape
        *(index_list_count, index_list_length)*.
    :ivar face_count: The number of faces of each element
        in :attr:`ldis_loc`.
    :ivar local_el_write_base: a list of global volume
        element base indices, indexed in local element numbers.

    Face groups on quadrature grids additionally have these
    properties:

    :ivar ldis_loc_quad_info: refer to
      :class:`hedge.discretization.local.LocalDiscretization.QuadratureInfo`
      instance relevant for this face group's :attr:`ldis_loc`.
    :ivar ldis_opp_quad_info: refer to
      :class:`hedge.discretization.local.LocalDiscretization.QuadratureInfo`
      instance relevant for this face group's :attr:`ldis_opp`.

    Further, the following methods are inherited from the C++ level:

    .. method:: element_count()
    .. method:: face_length()
    """

    def __init__(self, double_sided, debug):
        hedge._internal.StraightFaceGroup.__init__(self, double_sided)
        from hedge.tools import IndexListRegistry
        self.fil_registry = IndexListRegistry(debug)
        self.quadrature_info = {}

    def register_face_index_list(self, identifier, generator):
        return self.fil_registry.register(identifier, generator)

    def commit(self, discr, ldis_loc, ldis_opp, get_write_el_base=None):
        """
        :param get_write_el_base: a function of *(read_el_base, element_id)*
          returning the DOF index to which data should be written post-lift.
          This is needed since on a quadrature grid, element base indices in a
          face pair refer to interior boundary vectors and are hence only
          usable for reading.
        """
        if self.fil_registry.index_lists:
            self.index_lists = np.array(
                    self.fil_registry.index_lists,
                    dtype=np.uint32, order="C")
            del self.fil_registry

        if ldis_loc is None:
            self.face_count = 0
        else:
            self.face_count = ldis_loc.face_count()

        # number elements locally
        used_bases_and_els = list(set(
                (side.el_base_index, side.element_id)
                for fp in self.face_pairs
                for side in [fp.int_side, fp.ext_side]
                if side.element_id != hedge._internal.INVALID_ELEMENT))

        if get_write_el_base is None:
            def get_write_el_base(read_base, el_id):
                return read_base

        used_bases_and_els.sort()
        el_id_to_local_number = dict(
                (bae[1], i) for i, bae in enumerate(used_bases_and_els))
        self.local_el_write_base = np.fromiter(
                (get_write_el_base(*bae)
                    for bae in used_bases_and_els), dtype=np.uint32)

        for fp in self.face_pairs:
            for side in [fp.int_side, fp.ext_side]:
                if side.element_id != hedge._internal.INVALID_ELEMENT:
                    side.local_el_number = el_id_to_local_number[side.element_id]

        # transfer inverse jacobians
        self.local_el_inverse_jacobians = np.fromiter(
                (abs(discr.mesh.elements[bae[1]].inverse_map.jacobian())
                    for bae in used_bases_and_els),
                dtype=float)

        self.ldis_loc = ldis_loc
        self.ldis_opp = ldis_opp