def computeMembers(self): nmem = self.nmem geometry = self.geometry oml0 = geometry.oml0 groupIntPtr = self.groupIntPtr groupInts = self.groupInts groupSplitPtr = self.groupSplitPtr groupSplits = self.groupSplits quad = self.quad ngroup = self.ngroupS + self.ngroupM nint = groupIntPtr[-1,-1] nsplit = groupSplitPtr[-1,-1] nodesInt0 = [] nodesFlt0 = [] quads0 = [] nnode0 = [0] for imem in range(nmem): print 'Computing internal members:', self.memberNames[imem] edges, edge_group = PSMlib.computememberedges(imem+1, nmem, self.mem_group) quad.importEdges(edges) verts, edges = quad.verts, quad.edges nvert = PSMlib.countintersectionverts(edges.shape[0], ngroup, edge_group, groupIntPtr, groupSplitPtr) verts = PSMlib.computeintersectionverts(verts.shape[0], edges.shape[0], ngroup, nint, nsplit, nvert + verts.shape[0], verts, edges, edge_group, groupIntPtr, groupInts, groupSplitPtr, groupSplits) quad.importVertsNEdges(verts, edges) nodes, quads = quad.mesh(self.maxL, self.memEdgeLengths[imem,:,:]) nodesInt, nodesFlt = PSMlib.computemembernodes(imem+1, nmem, nodes.shape[0], self.membersInt, self.membersFlt, nodes) nodesInt0.append(nodesInt) nodesFlt0.append(nodesFlt) quads0.append(quads) nnode0.append(nnode0[-1] + nodes.shape[0]) nodesInt = numpy.array(numpy.vstack(nodesInt0),order='F') nodesFlt = numpy.array(numpy.vstack(nodesFlt0),order='F') nnode = nodesInt.shape[0] for k in range(len(geometry.comps)): comp = geometry.comps[geometry.keys[k]] for f in range(len(comp.Ks)): ni, nj = comp.Ks[f].shape idims, jdims = self.faceDims[k][f] PSMlib.computememberlocalcoords(k+1, f+1, ni, nj, nnode, idims, jdims, comp.Ks[f]+1, nodesInt, nodesFlt) linW = numpy.linspace(0,nnode-1,nnode) B0 = scipy.sparse.csr_matrix((nnode,oml0.C.shape[0])) for src in range(4): W = scipy.sparse.csr_matrix((nodesFlt[:,src,0],(linW,linW))) for surf in range(oml0.nsurf): npts = PSMlib.countmembers(surf+1, src+1, nnode, nodesInt) if npts is not 0: inds, P, Q = PSMlib.computememberproj(surf+1, src+1, nnode, npts, nodesInt, nodesFlt) Ta = numpy.ones(npts) Ti = inds - 1 Tj = numpy.linspace(0,npts-1,npts) T = scipy.sparse.csr_matrix((Ta,(Ti,Tj)),shape=(nnode,npts)) mu, mv = oml0.edgeProperty(surf,1) for u in range(mu): for v in range(mv): oml0.C[oml0.getIndex(surf,u,v,1),:3] = [u/(mu-1), v/(mv-1), 0] oml0.computePointsC() s,u,v = oml0.evaluateProjection(P, [surf], Q) B = oml0.evaluateBases(s, u, v) B0 = B0 + W.dot(T.dot(B)) self.meshM = [B0, quads0, nnode0]
def meshStructure(self, members, lengths): oml0 = self.oml0 nmem = len(members) faces = -numpy.ones((nmem,4,2),int,order='F') coords = numpy.zeros((nmem,4,2,2,3),order='F') for imem in range(nmem): key = members.keys()[imem] for icontr in range(len(members[key])): faces[imem,icontr,0] = self.inds[members[key][icontr][0]] faces[imem,icontr,1] = members[key][icontr][1] coords[imem,icontr,0,0,:] = members[key][icontr][2] coords[imem,icontr,1,0,:] = members[key][icontr][3] coords[imem,icontr,0,1,:] = members[key][icontr][4] coords[imem,icontr,1,1,:] = members[key][icontr][5] surfs = numpy.linspace(0,oml0.nsurf-1,oml0.nsurf) s = numpy.zeros(4*oml0.nsurf) s[0::4] = surfs s[1::4] = surfs s[2::4] = surfs s[3::4] = surfs u = numpy.zeros(4*oml0.nsurf) u[1::4] = 1. u[3::4] = 1. v = numpy.zeros(4*oml0.nsurf) v[2::4] = 1. v[3::4] = 1. quadsS = numpy.zeros((oml0.nsurf,4),order='F') quadsS[:,0] = 4*surfs + 0 quadsS[:,1] = 4*surfs + 1 quadsS[:,2] = 4*surfs + 3 quadsS[:,3] = 4*surfs + 2 B = oml0.evaluateBases(s,u,v) nodesS = B.dot(oml0.C[:,:3]) oml0.export.write2TecQuads('john.dat',nodesS,quadsS) #oml0.C[:,:] = -1.0 #for k in range(len(self.comps)): # c = self.keys[k] # comp = self.comps[c] # for f in range(len(comp.Ks)): # ni, nj = comp.Ks[f].shape # for i in range(ni): # for j in range(nj): # surf = comp.Ks[f][i,j] # mu, mv = oml0.edgeProperty(surf,1) # ugroup = oml0.edge_group[abs(oml0.surf_edge[surf,0,0])-1] # vgroup = oml0.edge_group[abs(oml0.surf_edge[surf,1,0])-1] # mu = oml0.group_m[ugroup-1] # mv = oml0.group_m[vgroup-1] # for u in range(mu): # for v in range(mv): # oml0.C[oml0.getIndex(surf,u,v,1),:3] = [u/(mu-1), v/(mv-1), 0] oml0.C[:,:] = -1.0 for surf in range(oml0.nsurf): mu, mv = oml0.edgeProperty(surf,1) ugroup = oml0.edge_group[abs(oml0.surf_edge[surf,0,0])-1] vgroup = oml0.edge_group[abs(oml0.surf_edge[surf,1,0])-1] mu = oml0.group_m[ugroup-1] mv = oml0.group_m[vgroup-1] for u in range(mu): for v in range(mv): oml0.C[oml0.getIndex(surf,u,v,1),:3] = [u/(mu-1), v/(mv-1), 0] print u/(mu-1), v/(mv-1) oml0.computePointsC() #oml0.export.write2TecQuads('john2.dat',nodesM,quadsM) oml0.write2Tec('test2') oml0.write2TecC('test2') self.computePoints() print oml0.C[oml0.getIndex(147,-1, 0,1),:3] print oml0.C[oml0.getIndex(144,-1,-1,1),:3] print oml0.C[oml0.getIndex( 49, 0, 0,1),:3] s = numpy.zeros(4*nmem) P = numpy.zeros((4*nmem,3),order='F') Q = numpy.zeros((4*nmem,3),order='F') w = numpy.zeros((4*nmem,4),order='F') mems = numpy.linspace(0,nmem-1,nmem) Q[:,2] = 1. Bs = [] ws = [] for icontr in range(4): for imem in range(nmem): k = faces[imem,icontr,0] f = faces[imem,icontr,1] c = self.keys[k] comp = self.comps[c] ni, nj = comp.Ks[f].shape for i in range(2): for j in range(2): u, v = coords[imem,icontr,i,j,:2] ii = int(numpy.floor(u*ni)) jj = int(numpy.floor(v*nj)) s[4*imem+2*j+i] = comp.Ks[f][ii,jj] P[4*imem+2*j+i,0] = u*ni - ii P[4*imem+2*j+i,1] = v*nj - jj w[4*imem+2*j+i,icontr] = coords[imem,icontr,i,j,2] surf,u,v = oml0.evaluateProjection(P, Q=Q) Bs.append(oml0.evaluateBases(surf, u, v)) quadsM = numpy.zeros((nmem,4),order='F') quadsM[:,0] = 4*mems + 0 quadsM[:,1] = 4*mems + 1 quadsM[:,2] = 4*mems + 3 quadsM[:,3] = 4*mems + 2 nodesM = numpy.zeros((4*nmem,3),order='F') for icontr in range(4): for k in range(3): nodesM[:,k] += w[:,icontr] * Bs[icontr].dot(oml0.C[:,k]) oml0.export.write2TecQuads('john2.dat',nodesM,quadsM) exit() Ps = numpy.zeros((oml0.nsurf,3,3,3),order='F') for s in range(oml0.nsurf): for i in range(3): for j in range(3): Ps[s,i,j] = oml0.evaluatePoint(s,i/2.0,j/2.0)[:3] nvertS,ngroupS,surf_vert,surf_group = PUBSlib.initializeconnectivities(oml0.nsurf,1e-13,1e-5,Ps) nvertM,ngroupM,mem_vert,mem_group = PSMlib.computemembertopology(nmem, faces, coords) mem_group[:,:,:] += ngroupS ngroup = ngroupS + ngroupM nint = PSMlib.countfaceintersections(nmem, coords) intFaces, intCoords = PSMlib.computefaceintersections(nmem, nint, faces, coords) groupIntCount = numpy.zeros(ngroup,int) meshesS = [] for k in range(len(self.comps)): c = self.keys[k] comp = self.comps[c] meshes = [] for f in range(len(comp.Ks)): ni, nj = comp.Ks[f].shape nedge = PSMlib.countfaceedges(k, f, ni, nj, nint, intFaces) edges, edge_group = PSMlib.computefaceedges(k, f, ni, nj, oml0.nsurf, nint, nmem, nedge, comp.Ks[f], surf_group, mem_group, intFaces, intCoords) mesh = QuadMesh(0.2,edges) mesh.computeIntersections() mesh.computeDivisions() mesh.deleteDuplicateVerts() groupIntCount = PSMlib.countgroupintersections(mesh.verts.shape[0], mesh.edges.shape[0], ngroup, mesh.verts, mesh.edges, edge_group, groupIntCount) meshes.append([mesh,edge_group]) meshesS.append(meshes) meshesM = [] for imem in range(nmem): edges, edge_group = PSMlib.computememberedges(imem+1, nmem, mem_group) mesh = QuadMesh(1e6,edges) meshesM.append([mesh,edge_group]) groupIntPtr = PSMlib.computegroupintptr(ngroup, groupIntCount) nint = groupIntPtr[-1,-1] groupInts = numpy.zeros(nint) for k in range(len(self.comps)): c = self.keys[k] comp = self.comps[c] for f in range(len(comp.Ks)): mesh, edge_group = meshesS[k][f] groupInts = PSMlib.computegroupintersections(mesh.verts.shape[0], mesh.edges.shape[0], ngroup, nint, mesh.verts, mesh.edges, edge_group, groupIntPtr, groupInts) #print groupInts for k in range(len(self.comps)): c = self.keys[k] comp = self.comps[c] for f in range(len(comp.Ks)): mesh, edge_group = meshesS[k][f] nvert = PSMlib.countintersectionverts(mesh.edges.shape[0], ngroup, edge_group, groupIntPtr) mesh.verts = PSMlib.computeintersectionverts(mesh.verts.shape[0], mesh.edges.shape[0], ngroup, nint, nvert + mesh.verts.shape[0], mesh.verts, mesh.edges, edge_group, groupIntPtr, groupInts) print 'QM1', k, f mesh.mesh() #edges[:,:,0] *= lengths[k,0] #edges[:,:,1] *= lengths[k,1] if k==1 and f==0 and 0: import pylab mesh.plot(111,pt=False,pq=False) pylab.show() exit() for imem in range(nmem): mesh, edge_group = meshesM[imem] nvert = PSMlib.countintersectionverts(mesh.edges.shape[0], ngroup, edge_group, groupIntPtr) mesh.verts = PSMlib.computeintersectionverts(mesh.verts.shape[0], mesh.edges.shape[0], ngroup, nint, nvert + mesh.verts.shape[0], mesh.verts, mesh.edges, edge_group, groupIntPtr, groupInts) print 'QM2', imem mesh.mesh() if 0: import pylab mesh.plot(111,pt=False,pq=False) pylab.show() exit() meshesM.append([mesh,edge_group]) oml0.C[:,:] = -1.0 for k in range(len(self.comps)): c = self.keys[k] comp = self.comps[c] for f in range(len(comp.Ks)): ni, nj = comp.Ks[f].shape for i in range(ni): for j in range(nj): surf = comp.Ks[f][i,j] mu, mv = oml0.edgeProperty(surf,1) for u in range(mu): uu = u/(mu-1) for v in range(mv): vv = v/(mv-1) oml0.C[oml0.getIndex(surf,u,v,1),:3] = [(uu+i)/ni, (vv+j)/nj, 0] oml0.computePointsC() #oml0.write2Tec('test2') #oml0.write2TecC('test2') #exit() Bs = [] quads = [] nquad0 = 0 for k in range(len(self.comps)): c = self.keys[k] comp = self.comps[c] for f in range(len(comp.Ks)): mesh, edge_group = meshesS[k][f] ni, nj = comp.Ks[f].shape print mesh.verts.shape[0] P0, surfs, Q = PSMlib.computeprojtninputs(mesh.verts.shape[0], ni, nj, mesh.verts, comp.Ks[f]) surf,u,v = oml0.evaluateProjection(P0, comp.Ks[f].flatten(), Q) Bs.append(oml0.evaluateBases(surf,u,v)) quads.append(nquad0 + mesh.quads - 1) #quads.append(mesh.quads - 1) nquad0 += mesh.verts.shape[0] self.computePoints() #i = 0 #for k in range(len(self.comps)): # c = self.keys[k] # comp = self.comps[c] # for f in range(len(comp.Ks)): # P = Bs[i].dot(oml0.C[:,:3]) # oml0.export.write2TecQuads('data'+str(k)+'-'+str(f)+'.dat',P,quads[i]-1) # i += 1 import scipy.sparse B = scipy.sparse.vstack(Bs) P = B.dot(oml0.C[:,:3]) quads = numpy.vstack(quads) oml0.export.write2TecQuads('john.dat',P,quads)#mesh.quads-1)
def computeMembers(self): nmem = self.nmem geometry = self.geometry oml0 = geometry.oml0 groupIntPtr = self.groupIntPtr groupInts = self.groupInts groupSplitPtr = self.groupSplitPtr groupSplits = self.groupSplits quad = self.quad ngroup = self.ngroupS + self.ngroupM nint = groupIntPtr[-1, -1] nsplit = groupSplitPtr[-1, -1] nodesInt0 = [] nodesFlt0 = [] quads0 = [] nnode0 = [0] for imem in range(nmem): print 'Computing internal members:', self.memberNames[imem] edges, edge_group = PSMlib.computememberedges( imem + 1, nmem, self.mem_group) quad.importEdges(edges) verts, edges = quad.verts, quad.edges nvert = PSMlib.countintersectionverts(edges.shape[0], ngroup, edge_group, groupIntPtr, groupSplitPtr) verts = PSMlib.computeintersectionverts( verts.shape[0], edges.shape[0], ngroup, nint, nsplit, nvert + verts.shape[0], verts, edges, edge_group, groupIntPtr, groupInts, groupSplitPtr, groupSplits) quad.importVertsNEdges(verts, edges) nodes, quads = quad.mesh(self.maxL, self.memEdgeLengths[imem, :, :]) nodesInt, nodesFlt = PSMlib.computemembernodes( imem + 1, nmem, nodes.shape[0], self.membersInt, self.membersFlt, nodes) nodesInt0.append(nodesInt) nodesFlt0.append(nodesFlt) quads0.append(quads) nnode0.append(nnode0[-1] + nodes.shape[0]) nodesInt = numpy.array(numpy.vstack(nodesInt0), order='F') nodesFlt = numpy.array(numpy.vstack(nodesFlt0), order='F') nnode = nodesInt.shape[0] for comp in geometry.comps.values(): for face in comp.faces.values(): ni, nj = face.num_surf idims, jdims = self.faceDims[comp.name][face.name] PSMlib.computememberlocalcoords(comp.num + 1, face.num + 1, ni, nj, nnode, idims, jdims, face.surf_indices + 1, nodesInt, nodesFlt) linW = numpy.linspace(0, nnode - 1, nnode) B0 = scipy.sparse.csr_matrix((nnode, oml0.C.shape[0])) for src in range(4): W = scipy.sparse.csr_matrix((nodesFlt[:, src, 0], (linW, linW))) for surf in range(oml0.nsurf): npts = PSMlib.countmembers(surf + 1, src + 1, nnode, nodesInt) if npts is not 0: inds, P, Q = PSMlib.computememberproj( surf + 1, src + 1, nnode, npts, nodesInt, nodesFlt) Ta = numpy.ones(npts) Ti = inds - 1 Tj = numpy.linspace(0, npts - 1, npts) T = scipy.sparse.csr_matrix((Ta, (Ti, Tj)), shape=(nnode, npts)) mu, mv = oml0.edgeProperty(surf, 1) for u in range(mu): for v in range(mv): oml0.C[oml0.getIndex(surf, u, v, 1), :3] = [ u / (mu - 1), v / (mv - 1), 0 ] oml0.computePointsC() s, u, v = oml0.evaluateProjection(P, [surf], Q) B = oml0.evaluateBases(s, u, v) B0 = B0 + W.dot(T.dot(B)) self.meshM = [B0, quads0, nnode0]
def computeMembers(self): nmem = self.nmem geometry = self.geometry bse = geometry._bse groupIntPtr = self.groupIntPtr groupInts = self.groupInts groupSplitPtr = self.groupSplitPtr groupSplits = self.groupSplits quad = self.quad ngroup = self.ngroupS + self.ngroupM nint = groupIntPtr[-1, -1] nsplit = groupSplitPtr[-1, -1] nsurf = bse._num['surf'] ncp = bse._size['cp_str'] nodesInt0 = [] nodesFlt0 = [] quads0 = [] nnode0 = [0] mem0 = [] ucoord0 = [] vcoord0 = [] for imem in range(nmem): print 'Computing internal members:', self.memberNames[imem] edges, edge_group = PSMlib.computememberedges( imem + 1, nmem, self.mem_group) quad.importEdges(edges) verts, edges = quad.verts, quad.edges nvert = PSMlib.countintersectionverts(edges.shape[0], ngroup, edge_group, groupIntPtr, groupSplitPtr) verts = PSMlib.computeintersectionverts( verts.shape[0], edges.shape[0], ngroup, nint, nsplit, nvert + verts.shape[0], verts, edges, edge_group, groupIntPtr, groupInts, groupSplitPtr, groupSplits) quad.importVertsNEdges(verts, edges) nodes, quads = quad.mesh(self.maxL, self.memEdgeLengths[imem, :, :]) nodesInt, nodesFlt = PSMlib.computemembernodes( imem + 1, nmem, nodes.shape[0], self.membersInt, self.membersFlt, nodes) nodesInt0.append(nodesInt) nodesFlt0.append(nodesFlt) quads0.append(quads) nnode0.append(nnode0[-1] + nodes.shape[0]) P0, Q = PSMlib.computesurfaceprojections(nodes.shape[0], nodes) mem0.append(imem * numpy.ones(P0.shape[0])) ucoord0.append(P0[:, 0]) vcoord0.append(P0[:, 1]) nodesInt = numpy.array(numpy.vstack(nodesInt0), order='F') nodesFlt = numpy.array(numpy.vstack(nodesFlt0), order='F') nnode = nodesInt.shape[0] for comp in geometry.comps.values(): for face in comp.faces.values(): ni, nj = face._num_surf['u'], face._num_surf['v'] surf_indices = face._surf_indices idims, jdims = self.faceDims[comp._name][face._name] PSMlib.computememberlocalcoords(comp._num + 1, face._num + 1, ni, nj, nnode, idims, jdims, surf_indices + 1, nodesInt, nodesFlt) linW = numpy.linspace(0, nnode - 1, nnode, dtype='int') B0 = scipy.sparse.csr_matrix((nnode, ncp)) for src in range(4): W = scipy.sparse.csr_matrix((nodesFlt[:, src, 0], (linW, linW))) for surf in range(nsurf): npts = PSMlib.countmembers(surf + 1, src + 1, nnode, nodesInt) if npts is not 0: inds, P, Q = PSMlib.computememberproj( surf + 1, src + 1, nnode, npts, nodesInt, nodesFlt) Ta = numpy.ones(npts) Ti = inds - 1 Tj = numpy.linspace(0, npts - 1, npts) T = scipy.sparse.csr_matrix((Ta, (Ti, Tj)), shape=(nnode, npts)) mu = bse.get_bspline_option('num_cp', surf, 'u') mv = bse.get_bspline_option('num_cp', surf, 'v') nu = bse.get_bspline_option('num_pt', surf, 'u') nv = bse.get_bspline_option('num_pt', surf, 'v') for u in range(mu): for v in range(mv): bse.vec['cp_str'](surf)[u, v, :] = [ u / (mu - 1), v / (mv - 1), 0 ] for u in range(nu): for v in range(nv): bse.vec['pt_str'](surf)[u, v, :] = [ u / (nu - 1), v / (nv - 1), 0 ] bse.compute_projection('temp', P, [surf], ndim=3) B = bse.jac['d(temp)/d(cp_str)'] B0 = B0 + W * T * B bse.apply_jacobian('cp_str', 'd(cp_str)/d(cp)', 'cp') self.meshM = [B0, quads0, nnode0, mem0, ucoord0, vcoord0]
def computeMembers(self): nmem = self.nmem geometry = self.geometry bse = geometry._bse groupIntPtr = self.groupIntPtr groupInts = self.groupInts groupSplitPtr = self.groupSplitPtr groupSplits = self.groupSplits quad = self.quad ngroup = self.ngroupS + self.ngroupM nint = groupIntPtr[-1,-1] nsplit = groupSplitPtr[-1,-1] nsurf = bse._num['surf'] ncp = bse._size['cp_str'] nodesInt0 = [] nodesFlt0 = [] quads0 = [] nnode0 = [0] mem0 = [] ucoord0 = [] vcoord0 = [] for imem in range(nmem): print 'Computing internal members:', self.memberNames[imem] edges, edge_group = PSMlib.computememberedges(imem+1, nmem, self.mem_group) quad.importEdges(edges) verts, edges = quad.verts, quad.edges nvert = PSMlib.countintersectionverts(edges.shape[0], ngroup, edge_group, groupIntPtr, groupSplitPtr) verts = PSMlib.computeintersectionverts(verts.shape[0], edges.shape[0], ngroup, nint, nsplit, nvert + verts.shape[0], verts, edges, edge_group, groupIntPtr, groupInts, groupSplitPtr, groupSplits) quad.importVertsNEdges(verts, edges) nodes, quads = quad.mesh(self.maxL, self.memEdgeLengths[imem,:,:]) nodesInt, nodesFlt = PSMlib.computemembernodes(imem+1, nmem, nodes.shape[0], self.membersInt, self.membersFlt, nodes) nodesInt0.append(nodesInt) nodesFlt0.append(nodesFlt) quads0.append(quads) nnode0.append(nnode0[-1] + nodes.shape[0]) P0, Q = PSMlib.computesurfaceprojections(nodes.shape[0], nodes) mem0.append(imem*numpy.ones(P0.shape[0])) ucoord0.append(P0[:,0]) vcoord0.append(P0[:,1]) nodesInt = numpy.array(numpy.vstack(nodesInt0),order='F') nodesFlt = numpy.array(numpy.vstack(nodesFlt0),order='F') nnode = nodesInt.shape[0] for comp in geometry.comps.values(): for face in comp.faces.values(): ni, nj = face._num_surf['u'], face._num_surf['v'] surf_indices = face._surf_indices idims, jdims = self.faceDims[comp._name][face._name] PSMlib.computememberlocalcoords(comp._num+1, face._num+1, ni, nj, nnode, idims, jdims, surf_indices+1, nodesInt, nodesFlt) linW = numpy.linspace(0,nnode-1,nnode) B0 = scipy.sparse.csr_matrix((nnode,ncp)) for src in range(4): W = scipy.sparse.csr_matrix((nodesFlt[:,src,0],(linW,linW))) for surf in range(nsurf): npts = PSMlib.countmembers(surf+1, src+1, nnode, nodesInt) if npts is not 0: inds, P, Q = PSMlib.computememberproj(surf+1, src+1, nnode, npts, nodesInt, nodesFlt) Ta = numpy.ones(npts) Ti = inds - 1 Tj = numpy.linspace(0,npts-1,npts) T = scipy.sparse.csr_matrix((Ta,(Ti,Tj)),shape=(nnode,npts)) mu = bse.get_bspline_option('num_cp', surf, 'u') mv = bse.get_bspline_option('num_cp', surf, 'v') nu = bse.get_bspline_option('num_pt', surf, 'u') nv = bse.get_bspline_option('num_pt', surf, 'v') for u in range(mu): for v in range(mv): bse.vec['cp_str'](surf)[u, v, :] = [u/(mu-1), v/(mv-1), 0] for u in range(nu): for v in range(nv): bse.vec['pt_str'](surf)[u, v, :] = [u/(nu-1), v/(nv-1), 0] bse.compute_projection('temp', P, [surf], ndim=3) B = bse.jac['d(temp)/d(cp_str)'] B0 = B0 + W * T * B bse.apply_jacobian('cp_str', 'd(cp_str)/d(cp)', 'cp') self.meshM = [B0, quads0, nnode0, mem0, ucoord0, vcoord0]