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)