Beispiel #1
0
    def computeStructure(self, P):
        oml0 = self.oml0
        Ms = self.Ms
        Js = self.Js
        layout = self.layout
        skinIndices = self.getSkinIndices()

        C = numpy.zeros((4,2),order='F')
        As = []
        Jns = []
        Jus = []
        col = 0
        for s in range(len(skinIndices)):
            n = max(self.quad_indices[:,s])*self.layout.n**2
            Aa = numpy.ones(n)
            Ai = numpy.linspace(0, n-1, n)
            Aj = numpy.linspace(0, n-1, n) + col
            As.append(scipy.sparse.csr_matrix((Aa,(Ai,Aj)), shape=(n,P.shape[0])))
            Jn = []
            Ju = []
            col += n
            for f in skinIndices[s]:
                for k in range(Js[f].shape[0]):
                    C[0,:] = oml0.C[Ms[f][Js[f][k,0],Js[f][k,1]],:2]
                    C[1,:] = oml0.C[Ms[f][Js[f][k,0],Js[f][k,3]],:2]
                    C[2,:] = oml0.C[Ms[f][Js[f][k,2],Js[f][k,1]],:2]
                    C[3,:] = oml0.C[Ms[f][Js[f][k,2],Js[f][k,3]],:2]
                    nu1, nu2, nv1, nv2 = layout.countJunctionEdges(self.JQs[s], min(C[:,0]), max(C[:,0]), min(C[:,1]), max(C[:,1]))
                    Jn.append([nu1, nu2, nv1, nv2])
                    Ju.append([min(C[:,0]), max(C[:,0]), min(C[:,1]), max(C[:,1])])
                    nP = layout.n*(nu1 + nu2 + nv1 + nv2)
                    col += nP
            if Jn==[]:
                Jn.append([-1,-1,-1,-1])
                Ju.append([-1,-1,-1,-1])
            Jns.append(numpy.array(Jn, int, order='F'))
            Jus.append(numpy.array(Ju, order='F'))
            
        nM = len(self.keys)
        members = numpy.zeros((nM,34),order='F')
        for i in range(nM):
            member = self.members[self.keys[i]]
            members[i,:4] = [member.domain, member.shape, member.nmem, member.ndiv]
            members[i, 4:16] = member.A1 + member.B1 + member.C1 + member.D1
            members[i,16:28] = member.A2 + member.B2 + member.C2 + member.D2
            members[i,28:] = [member.tx, member.ty, member.rx, member.ry, member.n1, member.n2]

        nP, nS = PGMlib.countinternalnodes(self.layout.n, nM, members)
        P2, M, S = PGMlib.computeinternalnodes(nP, nS, self.layout.n, nM, members)
        nA = PGMlib.countannz(nP, layout.nvert, layout.nquad, layout.verts, layout.poly_vert, self.quad_indices, P2, M)
        if len(skinIndices)==1:
            Aa, Ai, Aj = PGMlib.assembleamtx(nA, self.layout.n, nP, Jns[0].shape[0], Jns[0].shape[0], self.layout.nvert, self.layout.nquad, Jns[0], Jns[0], Jus[0], Jus[0], self.quad_indices, self.layout.verts, self.layout.poly_vert, P2, M)
        else:
            Aa, Ai, Aj = PGMlib.assembleamtx(nA, self.layout.n, nP, Jns[0].shape[0], Jns[1].shape[0], self.layout.nvert, self.layout.nquad, Jns[0], Jns[1], Jus[0], Jus[1], self.quad_indices, self.layout.verts, self.layout.poly_vert, P2, M)
        As.append(scipy.sparse.csr_matrix((Aa,(Ai,Aj)), shape=(max(Ai)+1,P.shape[0])))
            
        return As, S