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
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
def __init__(self, double_sided, debug): hedge._internal.StraightCurvedFaceGroup.__init__(self, double_sided) from hedge.tools import IndexListRegistry self.fil_registry = IndexListRegistry(debug)
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
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