def computeJacobian(self): """ Compute the global Jacobian """ self.nJ = PUBSlib.computejnnz(self.nsurf,self.nedge,self.ngroup,self.nvert,self.surf_edge,self.edge_group,self.group_k,self.group_n,self.edge_count) Ja, Ji, Jj = PUBSlib.computejacobian(self.nJ, self.nT, self.nD, self.nsurf, self.nedge, self.ngroup, self.nvert, self.surf_vert, self.surf_edge, self.edge_group, self.group_k, self.group_m, self.group_n, self.group_d, self.surf_index_P, self.edge_index_P, self.surf_index_C, self.edge_index_C, self.knot_index, self.edge_count, self.T) self.J = scipy.sparse.csc_matrix((Ja,(Ji,Jj))) self.Nuv = PUBSlib.getsurfacesizes(self.nsurf, self.nedge, self.ngroup, self.surf_edge, self.edge_group, self.group_n) self.Np0 = numpy.zeros(self.nsurf+1) for s in range(self.nsurf+1): self.Np0[s] = int(sum(self.Nuv[:s,0]*self.Nuv[:s,1])) surf = numpy.zeros(self.Np0[-1],int) u = numpy.zeros(self.Np0[-1]) v = numpy.zeros(self.Np0[-1]) for s in range(self.nsurf): T = PUBSlib.getsurfacet(s+1, self.Nuv[s,0], self.Nuv[s,1], self.nT, self.nsurf, self.nedge, self.surf_edge, self.surf_index_P, self.edge_index_P, self.T) surf[self.Np0[s]:self.Np0[s+1]] = s u[self.Np0[s]:self.Np0[s+1]] = T[:,:,0].flatten(order='F') v[self.Np0[s]:self.Np0[s+1]] = T[:,:,1].flatten(order='F') self.J0 = self.evaluateBases(surf, u, v, 0, 0) self.Ju = self.evaluateBases(surf, u, v, 1, 0) self.Jv = self.evaluateBases(surf, u, v, 0, 1) self.nM = PUBSlib.computemnnz(self.nsurf,self.nedge,self.ngroup,self.nvert,self.surf_edge,self.edge_group,self.group_m,self.surf_index_C, self.edge_index_Q, self.vert_index_Q, self.edge_count, self.surf_c1, self.edge_c1) Ma, Mi, Mj = PUBSlib.computedofmapping(self.nM,self.nsurf,self.nedge,self.ngroup,self.nvert,self.surf_vert,self.surf_edge,self.edge_group,self.group_m,self.surf_index_C,self.edge_index_C,self.edge_index_Q,self.vert_index_Q, self.edge_count,self.surf_c1,self.edge_c1) self.M = scipy.sparse.csc_matrix((Ma,(Mi,Mj))) self.JM = self.J.dot(self.M) if self.printInfo: print '# Jacobian non-zeros =',self.JM.nnz
def computeJacobian(self): """ Compute the global Jacobian """ self.nJ = PUBSlib.computejnnz(self.nsurf, self.nedge, self.ngroup, self.nvert, self.surf_edge, self.edge_group, self.group_k, self.group_n, self.edge_count) Ja, Ji, Jj = PUBSlib.computejacobian( self.nJ, self.nT, self.nD, self.nsurf, self.nedge, self.ngroup, self.nvert, self.surf_vert, self.surf_edge, self.edge_group, self.group_k, self.group_m, self.group_n, self.group_d, self.surf_index_P, self.edge_index_P, self.surf_index_C, self.edge_index_C, self.knot_index, self.edge_count, self.T) self.J = scipy.sparse.csc_matrix((Ja, (Ji, Jj))) self.Nuv = PUBSlib.getsurfacesizes(self.nsurf, self.nedge, self.ngroup, self.surf_edge, self.edge_group, self.group_n) self.Np0 = numpy.zeros(self.nsurf + 1) for s in range(self.nsurf + 1): self.Np0[s] = int(sum(self.Nuv[:s, 0] * self.Nuv[:s, 1])) surf = numpy.zeros(self.Np0[-1], int) u = numpy.zeros(self.Np0[-1]) v = numpy.zeros(self.Np0[-1]) for s in range(self.nsurf): T = PUBSlib.getsurfacet(s + 1, self.Nuv[s, 0], self.Nuv[s, 1], self.nT, self.nsurf, self.nedge, self.surf_edge, self.surf_index_P, self.edge_index_P, self.T) surf[self.Np0[s]:self.Np0[s + 1]] = s u[self.Np0[s]:self.Np0[s + 1]] = T[:, :, 0].flatten(order='F') v[self.Np0[s]:self.Np0[s + 1]] = T[:, :, 1].flatten(order='F') self.J0 = self.evaluateBases(surf, u, v, 0, 0) self.Ju = self.evaluateBases(surf, u, v, 1, 0) self.Jv = self.evaluateBases(surf, u, v, 0, 1) self.nM = PUBSlib.computemnnz(self.nsurf, self.nedge, self.ngroup, self.nvert, self.surf_edge, self.edge_group, self.group_m, self.surf_index_C, self.edge_index_Q, self.vert_index_Q, self.edge_count, self.surf_c1, self.edge_c1) Ma, Mi, Mj = PUBSlib.computedofmapping( self.nM, self.nsurf, self.nedge, self.ngroup, self.nvert, self.surf_vert, self.surf_edge, self.edge_group, self.group_m, self.surf_index_C, self.edge_index_C, self.edge_index_Q, self.vert_index_Q, self.edge_count, self.surf_c1, self.edge_c1) self.M = scipy.sparse.csc_matrix((Ma, (Mi, Mj))) self.JM = self.J.dot(self.M) if self.printInfo: print '# Jacobian non-zeros =', self.JM.nnz
def write2EGADS(self, filename): """ BROKEN """ model = self.model Ps = [] for surf in range(model.nsurf): ugroup = model.edge_group[abs(model.surf_edge[surf, 0, 0]) - 1] vgroup = model.edge_group[abs(model.surf_edge[surf, 1, 0]) - 1] nu = model.group_n[ugroup - 1] nv = model.group_n[vgroup - 1] P = PUBSlib.getsurfacep(surf + 1, model.nP, nu, nv, model.nvar, model.nsurf, model.nedge, model.nvert, model.surf_vert, model.surf_edge, model.surf_index_P, model.edge_index_P, model.P) Ps.append(P[:, :, :]) Ps.append(copy.copy(P[::-1, :, :])) Ps[-1][:, :, 2] *= -1 oml0 = PUBS.PUBS(Ps) file = open(filename + '.dat', "w") file.write(str(oml0.nvert) + '\n') file.write(str(oml0.nedge) + '\n') file.write(str(oml0.nsurf) + '\n') for i in range(oml0.nvert): file.write(str(oml0.C[i, 0]) + ' ') file.write(str(oml0.C[i, 1]) + ' ') file.write(str(oml0.C[i, 2]) + '\n') edgePtr = numpy.zeros((oml0.nedge, 3), int) for i in range(oml0.nsurf): for u in range(2): for v in range(2): edgePtr[abs(oml0.surf_edge[i, u, v]) - 1, :] = [i, u, v] ms = PUBSlib.getsurfacesizes(oml0.nsurf, oml0.nedge, oml0.ngroup, oml0.surf_edge, oml0.edge_group, oml0.group_m) for i in range(oml0.nedge): surf = edgePtr[i, 0] edge0 = edgePtr[i, 1] edge1 = edgePtr[i, 2] if edge0 == 0: if edge1 == 0: start = [0, 0] end = [1, 0] else: start = [0, 1] end = [1, 1] else: if edge1 == 0: start = [0, 0] end = [0, 1] else: start = [1, 0] end = [1, 1] if oml0.surf_edge[surf, edge0, edge1] < 0: temp = start start = end end = temp file.write(str(oml0.surf_vert[surf, start[0], start[1]]) + ' ') file.write(str(oml0.surf_vert[surf, end[0], end[1]]) + '\n') group = oml0.edge_group[i] - 1 k = oml0.group_k[group] m = oml0.group_m[group] file.write(str(k) + ' ') file.write(str(m) + '\n') d = oml0.group_d[oml0.knot_index[group, 0]:oml0.knot_index[group, 1]] for j in range(d.shape[0]): file.write(str(d[j]) + ' ') file.write('\n') C = PUBSlib.getsurfacep(surf + 1, oml0.nC, ms[surf, 0], ms[surf, 1], oml0.nvar, oml0.nsurf, oml0.nedge, oml0.nvert, oml0.surf_vert, oml0.surf_edge, oml0.surf_index_C, oml0.edge_index_C, oml0.C) if edge0 == 0: if edge1 == 0: edgeCs = copy.copy(C[:, 0, :]) else: edgeCs = copy.copy(C[:, -1, :]) else: if edge1 == 0: edgeCs = copy.copy(C[0, :, :]) else: edgeCs = copy.copy(C[-1, :, :]) if oml0.surf_edge[surf, edge0, edge1] < 0: edgeCs[:, :] = copy.copy(edgeCs[::-1, :]) for j in range(edgeCs.shape[0]): file.write(str(edgeCs[j, 0]) + ' ') file.write(str(edgeCs[j, 1]) + ' ') file.write(str(edgeCs[j, 2]) + '\n') for i in range(oml0.nsurf): for u in range(2): for v in range(2): file.write(str(oml0.surf_edge[i, u, v]) + ' ') file.write('\n') ugroup = oml0.edge_group[abs(oml0.surf_edge[i, 0, 0]) - 1] - 1 vgroup = oml0.edge_group[abs(oml0.surf_edge[i, 1, 0]) - 1] - 1 ku = oml0.group_k[ugroup] mu = oml0.group_m[ugroup] kv = oml0.group_k[vgroup] mv = oml0.group_m[vgroup] file.write(str(ku) + ' ') file.write(str(mu) + ' ') file.write(str(kv) + ' ') file.write(str(mv) + ' ') file.write('\n') d = oml0.group_d[oml0.knot_index[ugroup, 0]:oml0.knot_index[ugroup, 1]] for j in range(d.shape[0]): file.write(str(d[j]) + ' ') file.write('\n') d = oml0.group_d[oml0.knot_index[vgroup, 0]:oml0.knot_index[vgroup, 1]] for j in range(d.shape[0]): file.write(str(d[j]) + ' ') file.write('\n') C = PUBSlib.getsurfacep(i + 1, oml0.nC, ms[i, 0], ms[i, 1], oml0.nvar, oml0.nsurf, oml0.nedge, oml0.nvert, oml0.surf_vert, oml0.surf_edge, oml0.surf_index_C, oml0.edge_index_C, oml0.C) for v in range(C.shape[1]): for u in range(C.shape[0]): file.write(str(C[u, v, 0]) + ' ') file.write(str(C[u, v, 1]) + ' ') file.write(str(C[u, v, 2]) + '\n') file.close()
def write2EGADS(self,filename): """ BROKEN """ model = self.model Ps = [] for surf in range(model.nsurf): ugroup = model.edge_group[abs(model.surf_edge[surf,0,0])-1] vgroup = model.edge_group[abs(model.surf_edge[surf,1,0])-1] nu = model.group_n[ugroup-1] nv = model.group_n[vgroup-1] P = PUBSlib.getsurfacep(surf+1, model.nP, nu, nv, model.nvar, model.nsurf, model.nedge, model.nvert, model.surf_vert, model.surf_edge, model.surf_index_P, model.edge_index_P, model.P) Ps.append(P[:,:,:]) Ps.append(copy.copy(P[::-1,:,:])) Ps[-1][:,:,2] *= -1 oml0 = PUBS.PUBS(Ps) file = open(filename+'.dat',"w") file.write(str(oml0.nvert)+'\n') file.write(str(oml0.nedge)+'\n') file.write(str(oml0.nsurf)+'\n') for i in range(oml0.nvert): file.write(str(oml0.C[i,0])+' ') file.write(str(oml0.C[i,1])+' ') file.write(str(oml0.C[i,2])+'\n') edgePtr = numpy.zeros((oml0.nedge,3),int) for i in range(oml0.nsurf): for u in range(2): for v in range(2): edgePtr[abs(oml0.surf_edge[i,u,v])-1,:] = [i,u,v] ms = PUBSlib.getsurfacesizes(oml0.nsurf, oml0.nedge, oml0.ngroup, oml0.surf_edge, oml0.edge_group, oml0.group_m) for i in range(oml0.nedge): surf = edgePtr[i,0] edge0 = edgePtr[i,1] edge1 = edgePtr[i,2] if edge0==0: if edge1==0: start = [0,0] end = [1,0] else: start = [0,1] end = [1,1] else: if edge1==0: start = [0,0] end = [0,1] else: start = [1,0] end = [1,1] if oml0.surf_edge[surf,edge0,edge1] < 0: temp = start start = end end = temp file.write(str(oml0.surf_vert[surf,start[0],start[1]])+' ') file.write(str(oml0.surf_vert[surf,end[0],end[1]])+'\n') group = oml0.edge_group[i] - 1 k = oml0.group_k[group] m = oml0.group_m[group] file.write(str(k)+' ') file.write(str(m)+'\n') d = oml0.group_d[oml0.knot_index[group,0]:oml0.knot_index[group,1]] for j in range(d.shape[0]): file.write(str(d[j])+' ') file.write('\n') C = PUBSlib.getsurfacep(surf+1, oml0.nC, ms[surf,0], ms[surf,1], oml0.nvar, oml0.nsurf, oml0.nedge, oml0.nvert, oml0.surf_vert, oml0.surf_edge, oml0.surf_index_C, oml0.edge_index_C, oml0.C) if edge0==0: if edge1==0: edgeCs = copy.copy(C[:,0,:]) else: edgeCs = copy.copy(C[:,-1,:]) else: if edge1==0: edgeCs = copy.copy(C[0,:,:]) else: edgeCs = copy.copy(C[-1,:,:]) if oml0.surf_edge[surf,edge0,edge1] < 0: edgeCs[:,:] = copy.copy(edgeCs[::-1,:]) for j in range(edgeCs.shape[0]): file.write(str(edgeCs[j,0])+' ') file.write(str(edgeCs[j,1])+' ') file.write(str(edgeCs[j,2])+'\n') for i in range(oml0.nsurf): for u in range(2): for v in range(2): file.write(str(oml0.surf_edge[i,u,v])+' ') file.write('\n') ugroup = oml0.edge_group[abs(oml0.surf_edge[i,0,0])-1] - 1 vgroup = oml0.edge_group[abs(oml0.surf_edge[i,1,0])-1] - 1 ku = oml0.group_k[ugroup] mu = oml0.group_m[ugroup] kv = oml0.group_k[vgroup] mv = oml0.group_m[vgroup] file.write(str(ku)+' ') file.write(str(mu)+' ') file.write(str(kv)+' ') file.write(str(mv)+' ') file.write('\n') d = oml0.group_d[oml0.knot_index[ugroup,0]:oml0.knot_index[ugroup,1]] for j in range(d.shape[0]): file.write(str(d[j])+' ') file.write('\n') d = oml0.group_d[oml0.knot_index[vgroup,0]:oml0.knot_index[vgroup,1]] for j in range(d.shape[0]): file.write(str(d[j])+' ') file.write('\n') C = PUBSlib.getsurfacep(i+1, oml0.nC, ms[i,0], ms[i,1], oml0.nvar, oml0.nsurf, oml0.nedge, oml0.nvert, oml0.surf_vert, oml0.surf_edge, oml0.surf_index_C, oml0.edge_index_C, oml0.C) for v in range(C.shape[1]): for u in range(C.shape[0]): file.write(str(C[u,v,0])+' ') file.write(str(C[u,v,1])+' ') file.write(str(C[u,v,2])+'\n') file.close()