def addFace(self, du, dv, d, ru=0.5, rv=0.5): """ Creates a set of rectangular surfaces, their IDs, and face dims. nu,nv: number of surfaces in the u and v directions du,dv: {1,2,3} maps to {x,y,z}; negative sign means reverse order d: position of the surfaces in the remaining coordinate axis ru,rv: surfaces span -ru to +ru in u dir. and -rv to +rv in v dir. Adds to self.Ps and self.Ks """ self.faces.append([du,dv]) nP = 10 ni = self.ms[abs(du)-1].shape[0] nj = self.ms[abs(dv)-1].shape[0] verts = numpy.zeros((2,2,3),order='F') verts[:,:,:] = d verts[0,:,abs(du)-1] = -ru*numpy.sign(du) verts[1,:,abs(du)-1] = ru*numpy.sign(du) verts[:,0,abs(dv)-1] = -rv*numpy.sign(dv) verts[:,1,abs(dv)-1] = rv*numpy.sign(dv) for j in range(nj): for i in range(ni): self.Ps.append(PGMlib.bilinearinterp(nP, ni, nj, i+1, j+1, verts)) if len(self.Ks) > 0: counter = numpy.max(self.Ks[-1]) + 1 else: counter = 0 K = numpy.zeros((ni,nj),int) for j in range(nj): for i in range(ni): K[i,j] = counter counter += 1 self.Ks.append(K) self.outers.append(numpy.ones((ni,nj),bool))
def initializeSurfaces(self): def get(P, u, v, d): edge = P[u,:,:] if not u==None else P[:,v,:] return edge if d==1 else edge[::-1,:] getM = lambda f, i, j: self.mComp.Ps[self.mComp.Ks[f][i,j]] getI = lambda i, j: self.Ps[self.Ks[0][i,j]] getF = lambda i, j: self.rotate(self.fComp.Ps[self.fK[i,j]]) def copy(iI, jI, fM, iM, jM, uI=None, vI=None, uM=None, vM=None, d=1): edgeI = get(getI(iI, jI), uI, vI, 1) edgeM = get(getM(fM, iM, jM), uM, vM, d) edgeI[:,:] = edgeM[:,:] def copy2(i, j, u=None, v=None): edgeI = get(getI(i, j), u, v, 1) edgeF = get(getF(i, j), u, v, 1) edgeI[:,:] = edgeF[:,:] verts = self.initializeVerts() nP = self.nP ni = self.ni nj = self.nj si = self.si sj = self.sj self.Ps = [] self.Ks = [-numpy.ones((si[3],sj[3]),int)] counter = 0 for j in range(sj[3]): for i in range(si[3]): if i<si[1] or j<sj[1] or i>=si[2] or j>=sj[2]: self.Ps.append(numpy.zeros((nP,nP,3),order='F')) self.Ks[0][i,j] = counter counter += 1 for b in range(3): for a in range(3): for j in range(nj[b]): jj = sj[b] + j for i in range(ni[a]): ii = si[a] + i if not self.Ks[0][ii,jj]==-1: self.Ps[self.Ks[0][ii,jj]][:,:,:] = PGMlib.bilinearinterp(nP, ni[a], nj[b], i+1, j+1, verts[a:a+2,b:b+2,:]) for i in [0,-1]: for j in range(self.Ks[0].shape[1]): copy2(i, j, u=i) for j in [0,-1]: for i in range(self.Ks[0].shape[0]): copy2(i, j, v=j) if not self.mSide==-1: mComp = self.mComp ii = si[1] - 1 for j in range(nj[1]): jj = sj[1] + j if self.mSide==0: copy(ii, jj, 0, -1-j, 0, uI=-1, vM=0, d=-1) else: copy(ii, jj, 0, j, -1, uI=-1, vM=-1, d=1) ii = si[2] for j in range(nj[1]): jj = sj[1] + j if self.mSide==0: copy(ii, jj, 1, j, 0, uI=0, vM=0, d=1) else: copy(ii, jj, 1, -1-j, -1, uI=0, vM=-1, d=-1)