Beispiel #1
0
    def __init__(self, region):
        """
        Assume a single GeometryElement type in all groups, linear
        approximation.

        Works for one group only for the moment.
        """
        domain = region.domain

        self.dim = domain.shape.dim

        self.region = copy(region)
        self.region.setup_face_indices()

        self.mesh_coors = domain.mesh.coors

        # add_to_regions=True due to Field implementation shortcomings.
        omega = domain.create_region('Omega', 'all', add_to_regions=True)
        self.field = Field('displacements', nm.float64, (3, ), omega, 1)

        self.gel = domain.geom_els.values()[0]
        self.sgel = self.gel.surface_facet

        face_key = 's%d' % self.sgel.n_vertex

        # Coordinate interpolation to face centres.
        self.ps = self.gel.interp.poly_spaces[face_key]
        centre = self.ps.node_coors.sum(axis=0) / self.ps.n_nod
        self.bf = self.ps.eval_base(centre[None, :])

        self.surfaces = surfaces = {}
        self.dual_surfaces = dual_surfaces = {}

        n_nod = n_fa = 0
        for ig, conn in enumerate(domain.mesh.conns):
            surface = FESurface(None, self.region, self.gel.faces, conn, ig)
            surfaces[ig] = surface

            dual_surface = self.describe_dual_surface(surface)
            dual_surfaces[ig] = dual_surface

            n_nod += dual_surface.n_nod
            n_fa += dual_surface.n_fa

        # Domain-like shape.
        self.shape = Struct(n_nod=n_nod, n_el=n_fa, dim=self.dim)