def searchPoint(self, mesh, probe): cells = mesh.getCells() xCells = self.geomFields.coordinate[cells] xCellsA = xCells.asNumPyArray() cloestPoints = fvmbaseExt.newIntArray(1) cloestPointsA = cloestPoints.asNumPyArray() target = fvmbaseExt.VecD3() target[0] = probe[0] target[1] = probe[1] target[2] = probe[2] search = fvmbaseExt.KSearchTree(xCells) search.findNeighbors(target, 1, cloestPoints) point = cloestPointsA[0] return point
def makeMesh(self): nodeCoordsN = models.newVec3Array(self.nNodes) nodeCoordsA = nodeCoordsN.asNumPyArray() for n in range(self.nNodes): nodeCoordsA[n,0] = self.nodes[n].x nodeCoordsA[n,1] = self.nodes[n].y nodeCoordsA[n,2] = self.nodes[n].z nFaceZones = 7 faceGroupCountN = fvmbaseExt.newIntArray(nFaceZones) faceGroupCount = faceGroupCountN.asNumPyArray() #interior faces faceGroupCount[0] = len(self.interiorFaces) #xmin faces faceGroupCount[1] = len(self.xminFaces) #xmax faces faceGroupCount[2] = len(self.xmaxFaces) #ymin faces faceGroupCount[3] = len(self.yminFaces) #ymax faces faceGroupCount[4] = len(self.ymaxFaces) #zmin faces faceGroupCount[5] = len(self.zminFaces) #zmax faces faceGroupCount[6] = len(self.zmaxFaces) ## allocate arrays for face nodes and cells faceNodeCountN = fvmbaseExt.newIntArray(self.nFaces) faceNodesN = fvmbaseExt.newIntArray(self.nFaces*4) faceCellsN = fvmbaseExt.newIntArray(self.nFaces*2) faceNodesA = faceNodesN.asNumPyArray() faceCellsA = faceCellsN.asNumPyArray() faceNodeCountA = faceNodeCountN.asNumPyArray() faceNodeCountA[:] = 4 ## reshape for convenience faceNodes = faceNodesA.reshape((self.nFaces,4)) faceCells = faceCellsA.reshape((self.nFaces,2)) nf = 0 for f in self.interiorFaces: faceNodes[nf,0] = f.nodes[0].nID faceNodes[nf,1] = f.nodes[1].nID faceNodes[nf,2] = f.nodes[2].nID faceNodes[nf,3] = f.nodes[3].nID faceCells[nf,0] = f.cell0.cID faceCells[nf,1] = f.cell1.cID nf = nf + 1 for f in self.xminFaces: faceNodes[nf,0] = f.nodes[0].nID faceNodes[nf,1] = f.nodes[1].nID faceNodes[nf,2] = f.nodes[2].nID faceNodes[nf,3] = f.nodes[3].nID faceCells[nf,0] = f.cell0.cID faceCells[nf,1] = f.cell1.cID nf = nf + 1 for f in self.xmaxFaces: faceNodes[nf,0] = f.nodes[0].nID faceNodes[nf,1] = f.nodes[1].nID faceNodes[nf,2] = f.nodes[2].nID faceNodes[nf,3] = f.nodes[3].nID faceCells[nf,0] = f.cell0.cID faceCells[nf,1] = f.cell1.cID nf = nf + 1 for f in self.yminFaces: faceNodes[nf,0] = f.nodes[0].nID faceNodes[nf,1] = f.nodes[1].nID faceNodes[nf,2] = f.nodes[2].nID faceNodes[nf,3] = f.nodes[3].nID faceCells[nf,0] = f.cell0.cID faceCells[nf,1] = f.cell1.cID nf = nf + 1 for f in self.ymaxFaces: faceNodes[nf,0] = f.nodes[0].nID faceNodes[nf,1] = f.nodes[1].nID faceNodes[nf,2] = f.nodes[2].nID faceNodes[nf,3] = f.nodes[3].nID faceCells[nf,0] = f.cell0.cID faceCells[nf,1] = f.cell1.cID nf = nf + 1 for f in self.zminFaces: faceNodes[nf,0] = f.nodes[0].nID faceNodes[nf,1] = f.nodes[1].nID faceNodes[nf,2] = f.nodes[2].nID faceNodes[nf,3] = f.nodes[3].nID faceCells[nf,0] = f.cell0.cID faceCells[nf,1] = f.cell1.cID nf = nf + 1 for f in self.zmaxFaces: faceNodes[nf,0] = f.nodes[0].nID faceNodes[nf,1] = f.nodes[1].nID faceNodes[nf,2] = f.nodes[2].nID faceNodes[nf,3] = f.nodes[3].nID faceCells[nf,0] = f.cell0.cID faceCells[nf,1] = f.cell1.cID nf = nf + 1 pdb.set_trace() return fvmbaseExt.Mesh(3, self.nCells, nodeCoordsN, faceCellsN, faceNodesN, faceNodeCountN, faceGroupCountN)
reader.importFlowBCs(fmodel) fmodel.init() t0 = time.time() solid = fvmbaseExt.MPM() octree = fvmbaseExt.Octree() octree.Impl(mesh0, geomFields) option = 1 nradius = 50 ntheta = 320 nparticles = nradius * ntheta px = particle_coordinates(mesh0, "cylinder2d", nradius, ntheta, 0.5, 0.5, 0) pv = geomFields.coordinate[mesh0.getCells()].newSizedClone(int(nparticles)) pType = fvmbaseExt.newIntArray(nparticles) pType.asNumPyArray()[:] = 1 print "px = ", px.asNumPyArray() print "size = ", size(px.asNumPyArray()) solid.setCoordinates(px) solid.setVelocities(pv) solid.setTypes(pType) particles = solid.getParticles(nparticles) geomFields.coordinate[particles] = px flowFields.velocity[particles] = pv fvmbaseExt.CellMark_Impl(mesh0, geomFields, fileBase, octree, solid, option) fvmParticles = fvmbaseExt.FVMParticles(meshes)
def generate2DMesh(la, lb, ta, tb, tc, nxa, nxb, nxc, nya, nyb): # number of cells imax = 2*(nxa + nxc) + nxb jmax = nya + nyb # cell lengths in x and y dx = numpy.zeros(shape=(imax,), dtype='double') dy = numpy.zeros(shape=(jmax,), dtype='double') dxa = la/nxa dxb = lb/nxb dxc = tc/nxc dx[0:nxa] = dxa dx[nxa:nxa+nxc] = dxc dx[nxa+nxc:nxa+nxc+nxb] = dxb dx[nxa+nxc+nxb:nxa+2*nxc+nxb] = dxc dx[nxa+2*nxc+nxb:] = dxa dya = ta/nya dyb = tb/nyb dy[0:nya] = dya dy[nya:] = dyb xcoord = numpy.zeros(shape=(imax+1,), dtype='double') ycoord = numpy.zeros(shape=(jmax+1,), dtype='double') xcoord[0] = ycoord[0] = 0 for i in range(0,imax): xcoord[i+1] = xcoord[i] + dx[i] for j in range(0,jmax): ycoord[j+1] = ycoord[j] + dy[j] ## move the x centroid to center of beam xmax = xcoord[imax] xcoord[:] -= xmax/2.0 # this will store the node index in the mesh for the cartesian node location nodeIndex = numpy.zeros(shape=(imax+1,jmax+1), dtype='int') nodeIndex[:,:] = -1 nNodes = 0 ## mark nodes in left anchor for j in range(0, nya+1): for i in range(0, nxa+nxc+1): if nodeIndex[i,j] == -1: nodeIndex[i,j] = nNodes nNodes += 1 ## mark nodes in beam for j in range(nya, jmax+1): for i in range(nxa, nxa+2*nxc+nxb+1): if nodeIndex[i,j] == -1: nodeIndex[i,j] = nNodes nNodes += 1 ## mark nodes in right anchor for j in range(0, nya+1): for i in range(nxa+nxc+nxb, imax+1): if nodeIndex[i,j] == -1: nodeIndex[i,j] = nNodes nNodes += 1 nodeCoordsN = models.newVec3Array(nNodes) nodeCoordsA = nodeCoordsN.asNumPyArray() nodeCoordsA[:,2] = 0. for i in range(0, imax+1): for j in range(0, jmax+1): ni = nodeIndex[i,j] if (ni >= 0): nodeCoordsA[ni,0] = xcoord[i] nodeCoordsA[ni,1] = ycoord[j] # this will store the cell index in the mesh for the cartesian cell location cellIndex = numpy.zeros(shape=(imax,jmax), dtype='int') cellIndex[:,:] = -1 nCells = 0 ## mark cells in left anchor for j in range(0, nya): for i in range(0, nxa+nxc): if cellIndex[i,j] == -1: cellIndex[i,j] = nCells nCells += 1 ## mark cells in beam for j in range(nya, jmax): for i in range(nxa, nxa+2*nxc+nxb): if cellIndex[i,j] == -1: cellIndex[i,j] = nCells nCells += 1 ## mark cells in right anchor for j in range(0, nya): for i in range(nxa+nxc+nxb, imax): if cellIndex[i,j] == -1: cellIndex[i,j] = nCells nCells += 1 nFacesInterior = 0 ## interior faces of left and right anchors nFacesInterior += (nxa+nxc-1)*nya + (nya-1)*(nxa+nxc) nFacesInterior += (nxa+nxc-1)*nya + (nya-1)*(nxa+nxc) ## interior faces of beam nFacesInterior += (nxb+2*nxc-1)*nyb + (nyb-1)*(nxb+2*nxc) ## interior faces between anchor and beam nFacesInterior += 2*nxc nFaceZones = 8 faceGroupCountN = fvmbaseExt.newIntArray(nFaceZones) faceGroupCount = faceGroupCountN.asNumPyArray() faceGroupCount[0] = nFacesInterior # bottom of anchors faceGroupCount[1] = 2*(nxa+nxc) #outer sides of anchors faceGroupCount[2] = 2*nya #inner sides of anchors faceGroupCount[3] = 2*nya #beam bottom faceGroupCount[4] = nxb #beam top faceGroupCount[5] = nxb + 2*nxc #beam sides faceGroupCount[6] = 2*nyb # top of anchors faceGroupCount[7] = 2*nxa nFaces = int(faceGroupCount.sum()) ## allocate arrays for face nodes faceNodeCountN = fvmbaseExt.newIntArray(nFaces) faceNodesN = fvmbaseExt.newIntArray(nFaces*2) faceCellsN = fvmbaseExt.newIntArray(nFaces*2) faceNodesA = faceNodesN.asNumPyArray() faceCellsA = faceCellsN.asNumPyArray() faceNodeCountA = faceNodeCountN.asNumPyArray() faceNodeCountA[:] = 2 ## reshape for convenience faceNodes = faceNodesA.reshape((nFaces,2)) faceCells = faceCellsA.reshape((nFaces,2)) # interior x faces of left anchor nf = 0 for j in range(0, nya): for i in range(0, nxa+nxc-1): faceNodes[nf,0] = nodeIndex[i+1,j] faceNodes[nf,1] = nodeIndex[i+1,j+1] faceCells[nf,0] = cellIndex[i,j] faceCells[nf,1] = cellIndex[i+1,j] nf += 1 # interior y faces of left anchor for j in range(0, nya-1): for i in range(0, nxa+nxc): faceNodes[nf,0] = nodeIndex[i+1,j+1] faceNodes[nf,1] = nodeIndex[i,j+1] faceCells[nf,0] = cellIndex[i,j] faceCells[nf,1] = cellIndex[i,j+1] nf += 1 # interior x faces of beam for j in range(nya, jmax): for i in range(nxa, nxa+2*nxc+nxb-1): faceNodes[nf,0] = nodeIndex[i+1,j] faceNodes[nf,1] = nodeIndex[i+1,j+1] faceCells[nf,0] = cellIndex[i,j] faceCells[nf,1] = cellIndex[i+1,j] nf += 1 # interior y faces of beam for j in range(nya, jmax-1): for i in range(nxa, nxa+2*nxc+nxb): faceNodes[nf,0] = nodeIndex[i+1,j+1] faceNodes[nf,1] = nodeIndex[i,j+1] faceCells[nf,0] = cellIndex[i,j] faceCells[nf,1] = cellIndex[i,j+1] nf += 1 ## interior x faces in right anchor for j in range(0, nya): for i in range(nxa+nxc+nxb, imax-1): faceNodes[nf,0] = nodeIndex[i+1,j] faceNodes[nf,1] = nodeIndex[i+1,j+1] faceCells[nf,0] = cellIndex[i,j] faceCells[nf,1] = cellIndex[i+1,j] nf += 1 ## interior y faces in right anchor for j in range(0, nya-1): for i in range(nxa+nxc+nxb, imax): faceNodes[nf,0] = nodeIndex[i+1,j+1] faceNodes[nf,1] = nodeIndex[i,j+1] faceCells[nf,0] = cellIndex[i,j] faceCells[nf,1] = cellIndex[i,j+1] nf += 1 ## left interior faces between anchor and beam j = nya for i in range(nxa, nxa+nxc): faceNodes[nf,0] = nodeIndex[i+1,j] faceNodes[nf,1] = nodeIndex[i,j] faceCells[nf,0] = cellIndex[i,j-1] faceCells[nf,1] = cellIndex[i,j] nf += 1 ## right interior faces between anchor and beam for i in range(nxa+nxc+nxb, nxa+2*nxc+nxb): faceNodes[nf,0] = nodeIndex[i+1,j] faceNodes[nf,1] = nodeIndex[i,j] faceCells[nf,0] = cellIndex[i,j-1] faceCells[nf,1] = cellIndex[i,j] nf += 1 nb = 0 # left anchor bottom j = 0 for i in range(0, nxa+nxc): faceNodes[nf,0] = nodeIndex[i,j] faceNodes[nf,1] = nodeIndex[i+1,j] faceCells[nf,0] = cellIndex[i,j] faceCells[nf,1] = nCells + nb nf += 1 nb += 1 # right anchor bottom for i in range(nxa+nxc+nxb,imax): faceNodes[nf,0] = nodeIndex[i,j] faceNodes[nf,1] = nodeIndex[i+1,j] faceCells[nf,0] = cellIndex[i,j] faceCells[nf,1] = nCells + nb nf += 1 nb += 1 # left anchor outer side i = 0 for j in range(0, nya): faceNodes[nf,0] = nodeIndex[i,j+1] faceNodes[nf,1] = nodeIndex[i,j] faceCells[nf,0] = cellIndex[i,j] faceCells[nf,1] = nCells + nb nf += 1 nb += 1 # right anchor outer side i = imax for j in range(0, nya): faceNodes[nf,0] = nodeIndex[i,j] faceNodes[nf,1] = nodeIndex[i,j+1] faceCells[nf,0] = cellIndex[i-1,j] faceCells[nf,1] = nCells + nb nf += 1 nb += 1 # left anchor inner side i = nxa+nxc for j in range(0, nya): faceNodes[nf,0] = nodeIndex[i,j] faceNodes[nf,1] = nodeIndex[i,j+1] faceCells[nf,0] = cellIndex[i-1,j] faceCells[nf,1] = nCells + nb nf += 1 nb += 1 # right anchor inner side i = nxa+nxc+nxb for j in range(0, nya): faceNodes[nf,0] = nodeIndex[i,j+1] faceNodes[nf,1] = nodeIndex[i,j] faceCells[nf,0] = cellIndex[i,j] faceCells[nf,1] = nCells + nb nf += 1 nb += 1 # beam bottom j = nya for i in range(nxa+nxc, nxa+nxc+nxb): faceNodes[nf,0] = nodeIndex[i,j] faceNodes[nf,1] = nodeIndex[i+1,j] faceCells[nf,0] = cellIndex[i,j] faceCells[nf,1] = nCells + nb nf += 1 nb += 1 # beam top j = nya+nyb for i in range(nxa, nxa+2*nxc+nxb): faceNodes[nf,0] = nodeIndex[i+1,j] faceNodes[nf,1] = nodeIndex[i,j] faceCells[nf,0] = cellIndex[i,j-1] faceCells[nf,1] = nCells + nb nf += 1 nb += 1 # left beam side i = nxa for j in range(nya, nya+nyb): faceNodes[nf,0] = nodeIndex[i,j+1] faceNodes[nf,1] = nodeIndex[i,j] faceCells[nf,0] = cellIndex[i,j] faceCells[nf,1] = nCells + nb nf += 1 nb += 1 # right beam side i = nxa+2*nxc+nxb for j in range(nya, nya+nyb): faceNodes[nf,0] = nodeIndex[i,j] faceNodes[nf,1] = nodeIndex[i,j+1] faceCells[nf,0] = cellIndex[i-1,j] faceCells[nf,1] = nCells + nb nf += 1 nb += 1 # left anchor top j = nya for i in range(0, nxa): faceNodes[nf,0] = nodeIndex[i+1,j] faceNodes[nf,1] = nodeIndex[i,j] faceCells[nf,0] = cellIndex[i,j-1] faceCells[nf,1] = nCells + nb nf += 1 nb += 1 # right anchor top for i in range(nxa+2*nxc+nxb, imax): faceNodes[nf,0] = nodeIndex[i+1,j] faceNodes[nf,1] = nodeIndex[i,j] faceCells[nf,0] = cellIndex[i,j-1] faceCells[nf,1] = nCells + nb nf += 1 nb += 1 #numpy.set_printoptions(threshold=1e8) #print faceCellsA[:] #print faceNodesA mesh = fvmbaseExt.Mesh(2, nCells, nodeCoordsN, faceCellsN, faceNodesN, faceNodeCountN, faceGroupCountN) print '2d mesh nnodes = %s' % nNodes print 'midpoint node index is %s' % nodeIndex[imax/2,nya] return mesh
def makeMesh(self): nodeCoordsN = models.newVec3Array(self.nNodes) nodeCoordsA = nodeCoordsN.asNumPyArray() for n in range(self.nNodes): nodeCoordsA[n, 0] = self.nodes[n].x nodeCoordsA[n, 1] = self.nodes[n].y nodeCoordsA[n, 2] = self.nodes[n].z nFaceZones = 7 faceGroupCountN = fvmbaseExt.newIntArray(nFaceZones) faceGroupCount = faceGroupCountN.asNumPyArray() # interior faces faceGroupCount[0] = len(self.interiorFaces) # xmin faces faceGroupCount[1] = len(self.xminFaces) # xmax faces faceGroupCount[2] = len(self.xmaxFaces) # ymin faces faceGroupCount[3] = len(self.yminFaces) # ymax faces faceGroupCount[4] = len(self.ymaxFaces) # zmin faces faceGroupCount[5] = len(self.zminFaces) # zmax faces faceGroupCount[6] = len(self.zmaxFaces) ## allocate arrays for face nodes and cells faceNodeCountN = fvmbaseExt.newIntArray(self.nFaces) faceNodesN = fvmbaseExt.newIntArray(self.nFaces * 4) faceCellsN = fvmbaseExt.newIntArray(self.nFaces * 2) faceNodesA = faceNodesN.asNumPyArray() faceCellsA = faceCellsN.asNumPyArray() faceNodeCountA = faceNodeCountN.asNumPyArray() faceNodeCountA[:] = 4 ## reshape for convenience faceNodes = faceNodesA.reshape((self.nFaces, 4)) faceCells = faceCellsA.reshape((self.nFaces, 2)) nf = 0 for f in self.interiorFaces: faceNodes[nf, 0] = f.nodes[0].nID faceNodes[nf, 1] = f.nodes[1].nID faceNodes[nf, 2] = f.nodes[2].nID faceNodes[nf, 3] = f.nodes[3].nID faceCells[nf, 0] = f.cell0.cID faceCells[nf, 1] = f.cell1.cID nf = nf + 1 for f in self.xminFaces: faceNodes[nf, 0] = f.nodes[0].nID faceNodes[nf, 1] = f.nodes[1].nID faceNodes[nf, 2] = f.nodes[2].nID faceNodes[nf, 3] = f.nodes[3].nID faceCells[nf, 0] = f.cell0.cID faceCells[nf, 1] = f.cell1.cID nf = nf + 1 for f in self.xmaxFaces: faceNodes[nf, 0] = f.nodes[0].nID faceNodes[nf, 1] = f.nodes[1].nID faceNodes[nf, 2] = f.nodes[2].nID faceNodes[nf, 3] = f.nodes[3].nID faceCells[nf, 0] = f.cell0.cID faceCells[nf, 1] = f.cell1.cID nf = nf + 1 for f in self.yminFaces: faceNodes[nf, 0] = f.nodes[0].nID faceNodes[nf, 1] = f.nodes[1].nID faceNodes[nf, 2] = f.nodes[2].nID faceNodes[nf, 3] = f.nodes[3].nID faceCells[nf, 0] = f.cell0.cID faceCells[nf, 1] = f.cell1.cID nf = nf + 1 for f in self.ymaxFaces: faceNodes[nf, 0] = f.nodes[0].nID faceNodes[nf, 1] = f.nodes[1].nID faceNodes[nf, 2] = f.nodes[2].nID faceNodes[nf, 3] = f.nodes[3].nID faceCells[nf, 0] = f.cell0.cID faceCells[nf, 1] = f.cell1.cID nf = nf + 1 for f in self.zminFaces: faceNodes[nf, 0] = f.nodes[0].nID faceNodes[nf, 1] = f.nodes[1].nID faceNodes[nf, 2] = f.nodes[2].nID faceNodes[nf, 3] = f.nodes[3].nID faceCells[nf, 0] = f.cell0.cID faceCells[nf, 1] = f.cell1.cID nf = nf + 1 for f in self.zmaxFaces: faceNodes[nf, 0] = f.nodes[0].nID faceNodes[nf, 1] = f.nodes[1].nID faceNodes[nf, 2] = f.nodes[2].nID faceNodes[nf, 3] = f.nodes[3].nID faceCells[nf, 0] = f.cell0.cID faceCells[nf, 1] = f.cell1.cID nf = nf + 1 pdb.set_trace() return fvmbaseExt.Mesh(3, self.nCells, nodeCoordsN, faceCellsN, faceNodesN, faceNodeCountN, faceGroupCountN)
def generate2DMesh(la, lb, ta, tb, tc, nxa, nxb, nxc, nya, nyb): # number of cells imax = 2 * (nxa + nxc) + nxb jmax = nya + nyb # cell lengths in x and y dx = numpy.zeros(shape=(imax, ), dtype='double') dy = numpy.zeros(shape=(jmax, ), dtype='double') dxa = la / nxa dxb = lb / nxb dxc = tc / nxc dx[0:nxa] = dxa dx[nxa:nxa + nxc] = dxc dx[nxa + nxc:nxa + nxc + nxb] = dxb dx[nxa + nxc + nxb:nxa + 2 * nxc + nxb] = dxc dx[nxa + 2 * nxc + nxb:] = dxa dya = ta / nya dyb = tb / nyb dy[0:nya] = dya dy[nya:] = dyb xcoord = numpy.zeros(shape=(imax + 1, ), dtype='double') ycoord = numpy.zeros(shape=(jmax + 1, ), dtype='double') xcoord[0] = ycoord[0] = 0 for i in range(0, imax): xcoord[i + 1] = xcoord[i] + dx[i] for j in range(0, jmax): ycoord[j + 1] = ycoord[j] + dy[j] ## move the x centroid to center of beam xmax = xcoord[imax] xcoord[:] -= xmax / 2.0 # this will store the node index in the mesh for the cartesian node location nodeIndex = numpy.zeros(shape=(imax + 1, jmax + 1), dtype='int') nodeIndex[:, :] = -1 nNodes = 0 ## mark nodes in left anchor for j in range(0, nya + 1): for i in range(0, nxa + nxc + 1): if nodeIndex[i, j] == -1: nodeIndex[i, j] = nNodes nNodes += 1 ## mark nodes in beam for j in range(nya, jmax + 1): for i in range(nxa, nxa + 2 * nxc + nxb + 1): if nodeIndex[i, j] == -1: nodeIndex[i, j] = nNodes nNodes += 1 ## mark nodes in right anchor for j in range(0, nya + 1): for i in range(nxa + nxc + nxb, imax + 1): if nodeIndex[i, j] == -1: nodeIndex[i, j] = nNodes nNodes += 1 nodeCoordsN = models.newVec3Array(nNodes) nodeCoordsA = nodeCoordsN.asNumPyArray() nodeCoordsA[:, 2] = 0. for i in range(0, imax + 1): for j in range(0, jmax + 1): ni = nodeIndex[i, j] if (ni >= 0): nodeCoordsA[ni, 0] = xcoord[i] nodeCoordsA[ni, 1] = ycoord[j] # this will store the cell index in the mesh for the cartesian cell location cellIndex = numpy.zeros(shape=(imax, jmax), dtype='int') cellIndex[:, :] = -1 nCells = 0 ## mark cells in left anchor for j in range(0, nya): for i in range(0, nxa + nxc): if cellIndex[i, j] == -1: cellIndex[i, j] = nCells nCells += 1 ## mark cells in beam for j in range(nya, jmax): for i in range(nxa, nxa + 2 * nxc + nxb): if cellIndex[i, j] == -1: cellIndex[i, j] = nCells nCells += 1 ## mark cells in right anchor for j in range(0, nya): for i in range(nxa + nxc + nxb, imax): if cellIndex[i, j] == -1: cellIndex[i, j] = nCells nCells += 1 nFacesInterior = 0 ## interior faces of left and right anchors nFacesInterior += (nxa + nxc - 1) * nya + (nya - 1) * (nxa + nxc) nFacesInterior += (nxa + nxc - 1) * nya + (nya - 1) * (nxa + nxc) ## interior faces of beam nFacesInterior += (nxb + 2 * nxc - 1) * nyb + (nyb - 1) * (nxb + 2 * nxc) ## interior faces between anchor and beam nFacesInterior += 2 * nxc nFaceZones = 8 faceGroupCountN = fvmbaseExt.newIntArray(nFaceZones) faceGroupCount = faceGroupCountN.asNumPyArray() faceGroupCount[0] = nFacesInterior # bottom of anchors faceGroupCount[1] = 2 * (nxa + nxc) #outer sides of anchors faceGroupCount[2] = 2 * nya #inner sides of anchors faceGroupCount[3] = 2 * nya #beam bottom faceGroupCount[4] = nxb #beam top faceGroupCount[5] = nxb + 2 * nxc #beam sides faceGroupCount[6] = 2 * nyb # top of anchors faceGroupCount[7] = 2 * nxa nFaces = int(faceGroupCount.sum()) ## allocate arrays for face nodes faceNodeCountN = fvmbaseExt.newIntArray(nFaces) faceNodesN = fvmbaseExt.newIntArray(nFaces * 2) faceCellsN = fvmbaseExt.newIntArray(nFaces * 2) faceNodesA = faceNodesN.asNumPyArray() faceCellsA = faceCellsN.asNumPyArray() faceNodeCountA = faceNodeCountN.asNumPyArray() faceNodeCountA[:] = 2 ## reshape for convenience faceNodes = faceNodesA.reshape((nFaces, 2)) faceCells = faceCellsA.reshape((nFaces, 2)) # interior x faces of left anchor nf = 0 for j in range(0, nya): for i in range(0, nxa + nxc - 1): faceNodes[nf, 0] = nodeIndex[i + 1, j] faceNodes[nf, 1] = nodeIndex[i + 1, j + 1] faceCells[nf, 0] = cellIndex[i, j] faceCells[nf, 1] = cellIndex[i + 1, j] nf += 1 # interior y faces of left anchor for j in range(0, nya - 1): for i in range(0, nxa + nxc): faceNodes[nf, 0] = nodeIndex[i + 1, j + 1] faceNodes[nf, 1] = nodeIndex[i, j + 1] faceCells[nf, 0] = cellIndex[i, j] faceCells[nf, 1] = cellIndex[i, j + 1] nf += 1 # interior x faces of beam for j in range(nya, jmax): for i in range(nxa, nxa + 2 * nxc + nxb - 1): faceNodes[nf, 0] = nodeIndex[i + 1, j] faceNodes[nf, 1] = nodeIndex[i + 1, j + 1] faceCells[nf, 0] = cellIndex[i, j] faceCells[nf, 1] = cellIndex[i + 1, j] nf += 1 # interior y faces of beam for j in range(nya, jmax - 1): for i in range(nxa, nxa + 2 * nxc + nxb): faceNodes[nf, 0] = nodeIndex[i + 1, j + 1] faceNodes[nf, 1] = nodeIndex[i, j + 1] faceCells[nf, 0] = cellIndex[i, j] faceCells[nf, 1] = cellIndex[i, j + 1] nf += 1 ## interior x faces in right anchor for j in range(0, nya): for i in range(nxa + nxc + nxb, imax - 1): faceNodes[nf, 0] = nodeIndex[i + 1, j] faceNodes[nf, 1] = nodeIndex[i + 1, j + 1] faceCells[nf, 0] = cellIndex[i, j] faceCells[nf, 1] = cellIndex[i + 1, j] nf += 1 ## interior y faces in right anchor for j in range(0, nya - 1): for i in range(nxa + nxc + nxb, imax): faceNodes[nf, 0] = nodeIndex[i + 1, j + 1] faceNodes[nf, 1] = nodeIndex[i, j + 1] faceCells[nf, 0] = cellIndex[i, j] faceCells[nf, 1] = cellIndex[i, j + 1] nf += 1 ## left interior faces between anchor and beam j = nya for i in range(nxa, nxa + nxc): faceNodes[nf, 0] = nodeIndex[i + 1, j] faceNodes[nf, 1] = nodeIndex[i, j] faceCells[nf, 0] = cellIndex[i, j - 1] faceCells[nf, 1] = cellIndex[i, j] nf += 1 ## right interior faces between anchor and beam for i in range(nxa + nxc + nxb, nxa + 2 * nxc + nxb): faceNodes[nf, 0] = nodeIndex[i + 1, j] faceNodes[nf, 1] = nodeIndex[i, j] faceCells[nf, 0] = cellIndex[i, j - 1] faceCells[nf, 1] = cellIndex[i, j] nf += 1 nb = 0 # left anchor bottom j = 0 for i in range(0, nxa + nxc): faceNodes[nf, 0] = nodeIndex[i, j] faceNodes[nf, 1] = nodeIndex[i + 1, j] faceCells[nf, 0] = cellIndex[i, j] faceCells[nf, 1] = nCells + nb nf += 1 nb += 1 # right anchor bottom for i in range(nxa + nxc + nxb, imax): faceNodes[nf, 0] = nodeIndex[i, j] faceNodes[nf, 1] = nodeIndex[i + 1, j] faceCells[nf, 0] = cellIndex[i, j] faceCells[nf, 1] = nCells + nb nf += 1 nb += 1 # left anchor outer side i = 0 for j in range(0, nya): faceNodes[nf, 0] = nodeIndex[i, j + 1] faceNodes[nf, 1] = nodeIndex[i, j] faceCells[nf, 0] = cellIndex[i, j] faceCells[nf, 1] = nCells + nb nf += 1 nb += 1 # right anchor outer side i = imax for j in range(0, nya): faceNodes[nf, 0] = nodeIndex[i, j] faceNodes[nf, 1] = nodeIndex[i, j + 1] faceCells[nf, 0] = cellIndex[i - 1, j] faceCells[nf, 1] = nCells + nb nf += 1 nb += 1 # left anchor inner side i = nxa + nxc for j in range(0, nya): faceNodes[nf, 0] = nodeIndex[i, j] faceNodes[nf, 1] = nodeIndex[i, j + 1] faceCells[nf, 0] = cellIndex[i - 1, j] faceCells[nf, 1] = nCells + nb nf += 1 nb += 1 # right anchor inner side i = nxa + nxc + nxb for j in range(0, nya): faceNodes[nf, 0] = nodeIndex[i, j + 1] faceNodes[nf, 1] = nodeIndex[i, j] faceCells[nf, 0] = cellIndex[i, j] faceCells[nf, 1] = nCells + nb nf += 1 nb += 1 # beam bottom j = nya for i in range(nxa + nxc, nxa + nxc + nxb): faceNodes[nf, 0] = nodeIndex[i, j] faceNodes[nf, 1] = nodeIndex[i + 1, j] faceCells[nf, 0] = cellIndex[i, j] faceCells[nf, 1] = nCells + nb nf += 1 nb += 1 # beam top j = nya + nyb for i in range(nxa, nxa + 2 * nxc + nxb): faceNodes[nf, 0] = nodeIndex[i + 1, j] faceNodes[nf, 1] = nodeIndex[i, j] faceCells[nf, 0] = cellIndex[i, j - 1] faceCells[nf, 1] = nCells + nb nf += 1 nb += 1 # left beam side i = nxa for j in range(nya, nya + nyb): faceNodes[nf, 0] = nodeIndex[i, j + 1] faceNodes[nf, 1] = nodeIndex[i, j] faceCells[nf, 0] = cellIndex[i, j] faceCells[nf, 1] = nCells + nb nf += 1 nb += 1 # right beam side i = nxa + 2 * nxc + nxb for j in range(nya, nya + nyb): faceNodes[nf, 0] = nodeIndex[i, j] faceNodes[nf, 1] = nodeIndex[i, j + 1] faceCells[nf, 0] = cellIndex[i - 1, j] faceCells[nf, 1] = nCells + nb nf += 1 nb += 1 # left anchor top j = nya for i in range(0, nxa): faceNodes[nf, 0] = nodeIndex[i + 1, j] faceNodes[nf, 1] = nodeIndex[i, j] faceCells[nf, 0] = cellIndex[i, j - 1] faceCells[nf, 1] = nCells + nb nf += 1 nb += 1 # right anchor top for i in range(nxa + 2 * nxc + nxb, imax): faceNodes[nf, 0] = nodeIndex[i + 1, j] faceNodes[nf, 1] = nodeIndex[i, j] faceCells[nf, 0] = cellIndex[i, j - 1] faceCells[nf, 1] = nCells + nb nf += 1 nb += 1 #numpy.set_printoptions(threshold=1e8) #print faceCellsA[:] #print faceNodesA mesh = fvmbaseExt.Mesh(2, nCells, nodeCoordsN, faceCellsN, faceNodesN, faceNodeCountN, faceGroupCountN) print '2d mesh nnodes = %s' % nNodes print 'midpoint node index is %s' % nodeIndex[imax / 2, nya] return mesh
print fmodel.getMomentumFluxIntegral(fluidMeshes[0],4)[0] print fmodel.getMomentumFluxIntegral(fluidMeshes[0],4)[1] print fmodel.getMomentumFluxIntegral(fluidMeshes[0],4)[2] print "\n" #calling getMomentumDerivativeIntegral print "getMomentumDerivativeIntegral ... \n" print fmodel.getMomentumDerivativeIntegral(fluidMeshes[0])[0] print fmodel.getMomentumDerivativeIntegral(fluidMeshes[0])[1] print fmodel.getMomentumDerivativeIntegral(fluidMeshes[0])[2] print "\n" #calling getStressTensor print "getStressTensor ... \n" IBCellIDsA= fvmbaseExt.newIntArray(5) IBCellIDs = IBCellIDsA.asNumPyArray() IBCellIDs[0] = 0 IBCellIDs[1] = 10 IBCellIDs[2] = 100 IBCellIDs[3] = 200 IBCellIDs[4] = 512 stressA = fmodel.getStressTensor(fluidMeshes[0],IBCellIDsA) stress = stressA.asNumPyArray() print stress #getTranction print "getTraction ... \n" fmodel.getTraction(fluidMeshes[0]) tractionX = flowFields.tractionX[fluidMeshes[0].getCells()] print tractionX.asNumPyArray()
def generateBoxMesh(xmax, ymax, zmax, imax, jmax, kmax): xcoord = np.linspace(0.0, xmax, num=(imax+1)) xcoord = xcoord.astype('double') ycoord = np.linspace(0.0, ymax, num=(jmax+1)) ycoord = ycoord.astype('double') zcoord = np.linspace(0.0, zmax, num=(kmax+1)) zcoord = zcoord.astype('double') nCells = imax*jmax*kmax nodeIndex = np.zeros(shape=(imax+1,jmax+1,kmax+1), dtype='int') nNodes = 0 nodeCoordsN = models.newVec3Array((imax+1)*(jmax+1)*(kmax+1)) nodeCoordsA = nodeCoordsN.asNumPyArray() for k in range(kmax+1): for j in range(jmax+1): for i in range(imax+1): nodeIndex[i,j,k] = nNodes nodeCoordsA[nNodes,0] = xcoord[i] nodeCoordsA[nNodes,1] = ycoord[j] nodeCoordsA[nNodes,2] = zcoord[k] nNodes = nNodes + 1 cellIndex = np.zeros(shape=(imax,jmax,kmax), dtype='int') nCells = 0 for k in range(kmax): for j in range(jmax): for i in range(imax): cellIndex[i,j,k] = nCells nCells = nCells + 1 nFacesInterior = imax*jmax*(kmax-1)+imax*(jmax-1)*kmax+(imax-1)*jmax*kmax nFaceZones = 7 faceGroupCountN = fvmbaseExt.newIntArray(nFaceZones) faceGroupCount = faceGroupCountN.asNumPyArray() #interior faces faceGroupCount[0] = nFacesInterior #xmin faces faceGroupCount[1] = jmax*kmax #xmax faces faceGroupCount[2] = jmax*kmax #ymin faces faceGroupCount[3] = imax*kmax #ymax faces faceGroupCount[4] = imax*kmax #zmin faces faceGroupCount[5] = imax*jmax #zmax faces faceGroupCount[6] = imax*jmax nFaces = int(faceGroupCount.sum()) ## allocate arrays for face nodes and cells faceNodeCountN = fvmbaseExt.newIntArray(nFaces) faceNodesN = fvmbaseExt.newIntArray(nFaces*4) faceCellsN = fvmbaseExt.newIntArray(nFaces*2) faceNodesA = faceNodesN.asNumPyArray() faceCellsA = faceCellsN.asNumPyArray() faceNodeCountA = faceNodeCountN.asNumPyArray() faceNodeCountA[:] = 4 ## reshape for convenience faceNodes = faceNodesA.reshape((nFaces,4)) faceCells = faceCellsA.reshape((nFaces,2)) nf = 0 # interior x faces for i in range(1,imax): for j in range(jmax): for k in range(kmax): faceNodes[nf,0] = nodeIndex[i,j,k] faceNodes[nf,1] = nodeIndex[i,j+1,k] faceNodes[nf,2] = nodeIndex[i,j+1,k+1] faceNodes[nf,3] = nodeIndex[i,j,k+1] faceCells[nf,0] = cellIndex[i,j,k] faceCells[nf,1] = cellIndex[i-1,j,k] nf = nf + 1 # interior y faces for j in range(1,jmax): for i in range(imax): for k in range(kmax): faceNodes[nf,0] = nodeIndex[i,j,k] faceNodes[nf,1] = nodeIndex[i+1,j,k] faceNodes[nf,2] = nodeIndex[i+1,j,k+1] faceNodes[nf,3] = nodeIndex[i,j,k+1] faceCells[nf,0] = cellIndex[i,j-1,k] faceCells[nf,1] = cellIndex[i,j,k] nf = nf + 1 # interior z faces for k in range(1,kmax): for i in range(imax): for j in range(jmax): faceNodes[nf,0] = nodeIndex[i,j,k] faceNodes[nf,1] = nodeIndex[i+1,j,k] faceNodes[nf,2] = nodeIndex[i+1,j+1,k] faceNodes[nf,3] = nodeIndex[i,j+1,k] faceCells[nf,0] = cellIndex[i,j,k] faceCells[nf,1] = cellIndex[i,j,k-1] nf = nf + 1 nb = 0 #x-boundaries i = 0 for j in range(jmax): for k in range(kmax): faceNodes[nf,0] = nodeIndex[i,j,k] faceNodes[nf,1] = nodeIndex[i,j+1,k] faceNodes[nf,2] = nodeIndex[i,j+1,k+1] faceNodes[nf,3] = nodeIndex[i,j,k+1] faceCells[nf,0] = cellIndex[i,j,k] faceCells[nf,1] = nCells + nb nf = nf + 1 nb = nb + 1 i = imax for j in range(jmax): for k in range(kmax): faceNodes[nf,0] = nodeIndex[i,j,k] faceNodes[nf,1] = nodeIndex[i,j,k+1] faceNodes[nf,2] = nodeIndex[i,j+1,k+1] faceNodes[nf,3] = nodeIndex[i,j+1,k] faceCells[nf,0] = cellIndex[i-1,j,k] faceCells[nf,1] = nCells + nb nf = nf + 1 nb = nb + 1 #y-boundaries j = 0 for i in range(imax): for k in range(kmax): faceNodes[nf,0] = nodeIndex[i,j,k] faceNodes[nf,1] = nodeIndex[i,j,k+1] faceNodes[nf,2] = nodeIndex[i+1,j,k+1] faceNodes[nf,3] = nodeIndex[i+1,j,k] faceCells[nf,0] = cellIndex[i,j,k] faceCells[nf,1] = nCells + nb nf = nf + 1 nb = nb + 1 j = jmax for i in range(imax): for k in range(kmax): faceNodes[nf,0] = nodeIndex[i,j,k] faceNodes[nf,1] = nodeIndex[i+1,j,k] faceNodes[nf,2] = nodeIndex[i+1,j,k+1] faceNodes[nf,3] = nodeIndex[i,j,k+1] faceCells[nf,0] = cellIndex[i,j-1,k] faceCells[nf,1] = nCells + nb nf = nf + 1 nb = nb + 1 #z-boundaries k = 0 for i in range(imax): for j in range(jmax): faceNodes[nf,0] = nodeIndex[i,j,k] faceNodes[nf,1] = nodeIndex[i+1,j,k] faceNodes[nf,2] = nodeIndex[i+1,j+1,k] faceNodes[nf,3] = nodeIndex[i,j+1,k] faceCells[nf,0] = cellIndex[i,j,k] faceCells[nf,1] = nCells + nb nf = nf + 1 nb = nb + 1 k = kmax for i in range(imax): for j in range(jmax): faceNodes[nf,0] = nodeIndex[i,j,k] faceNodes[nf,1] = nodeIndex[i,j+1,k] faceNodes[nf,2] = nodeIndex[i+1,j+1,k] faceNodes[nf,3] = nodeIndex[i+1,j,k] faceCells[nf,0] = cellIndex[i,j,k-1] faceCells[nf,1] = nCells + nb nf = nf + 1 nb = nb + 1 mesh = fvmbaseExt.Mesh(3, nCells, nodeCoordsN, faceCellsN, faceNodesN, faceNodeCountN, faceGroupCountN) return mesh
reader.importFlowBCs(fmodel) fmodel.init() t0 = time.time() solid = fvmbaseExt.MPM() octree = fvmbaseExt.Octree() octree.Impl(mesh0, geomFields) option = 1 nradius = 50; ntheta = 320; nparticles = nradius * ntheta px = particle_coordinates(mesh0, "cylinder2d", nradius, ntheta, 0.5, 0.5, 0) pv = geomFields.coordinate[mesh0.getCells()].newSizedClone( int(nparticles) ) pType =fvmbaseExt.newIntArray(nparticles) pType.asNumPyArray()[:] = 1 print "px = ", px.asNumPyArray() print "size = ", size( px.asNumPyArray() ) solid.setCoordinates(px) solid.setVelocities(pv) solid.setTypes(pType) particles = solid.getParticles( nparticles ) geomFields.coordinate[particles]=px flowFields.velocity[particles] =pv fvmbaseExt.CellMark_Impl(mesh0, geomFields, fileBase, octree, solid, option) fvmParticles = fvmbaseExt.FVMParticles( meshes )