def exampleLrmGrid(nC, exType): assert type(nC) == list, "nC must be a list containing the number of nodes" assert len(nC) == 2 or len( nC) == 3, "nC must either two or three dimensions" exType = exType.lower() possibleTypes = ['rect', 'rotate'] assert exType in possibleTypes, "Not a possible example type." if exType == 'rect': return list( ndgrid([np.cumsum(np.r_[0, np.ones(nx) / nx]) for nx in nC], vector=False)) elif exType == 'rotate': if len(nC) == 2: X, Y = ndgrid([np.cumsum(np.r_[0, np.ones(nx) / nx]) for nx in nC], vector=False) amt = 0.5 - np.sqrt((X - 0.5)**2 + (Y - 0.5)**2) amt[amt < 0] = 0 return [X + (-(Y - 0.5)) * amt, Y + (+(X - 0.5)) * amt] elif len(nC) == 3: X, Y, Z = ndgrid( [np.cumsum(np.r_[0, np.ones(nx) / nx]) for nx in nC], vector=False) amt = 0.5 - np.sqrt((X - 0.5)**2 + (Y - 0.5)**2 + (Z - 0.5)**2) amt[amt < 0] = 0 return [ X + (-(Y - 0.5)) * amt, Y + (-(Z - 0.5)) * amt, Z + (-(X - 0.5)) * amt ]
def surface2ind_topo(mesh, topo, gridLoc='CC'): # def genActiveindfromTopo(mesh, topo): """ Get active indices from topography """ if mesh.dim == 3: from scipy.interpolate import NearestNDInterpolator Ftopo = NearestNDInterpolator(topo[:,:2], topo[:,2]) if gridLoc == 'CC': XY = ndgrid(mesh.vectorCCx, mesh.vectorCCy) Zcc = mesh.gridCC[:,2].reshape((np.prod(mesh.vnC[:2]), mesh.nCz), order='F') gridTopo = Ftopo(XY) actind = [gridTopo[ixy] <= Zcc[ixy,:] for ixy in range(np.prod(mesh.vnC[0]))] actind = np.hstack(actind) elif gridLoc == 'N': XY = ndgrid(mesh.vectorNx, mesh.vectorNy) gridTopo = Ftopo(XY).reshape(mesh.vnN[:2], order='F') if mesh._meshType not in ['TENSOR', 'CYL', 'BASETENSOR']: raise NotImplementedError('Nodal surface2ind_topo not implemented for %s mesh'%mesh._meshType) Nz = mesh.vectorNz[1:] # TODO: this will only work for tensor meshes actind = np.array([False]*mesh.nC).reshape(mesh.vnC, order='F') for ii in range(mesh.nCx): for jj in range(mesh.nCy): actind[ii,jj,:] = [np.all(gridTopo[ii:ii+2, jj:jj+2] >= Nz[kk]) for kk in range(len(Nz)) ] elif mesh.dim == 2: from scipy.interpolate import interp1d Ftopo = interp1d(topo[:,0], topo[:,1]) if gridLoc == 'CC': gridTopo = Ftopo(mesh.gridCC[:,0]) actind = mesh.gridCC[:,1] <= gridTopo elif gridLoc == 'N': gridTopo = Ftopo(mesh.vectorNx) if mesh._meshType not in ['TENSOR', 'CYL', 'BASETENSOR']: raise NotImplementedError('Nodal surface2ind_topo not implemented for %s mesh'%mesh._meshType) Ny = mesh.vectorNy[1:] # TODO: this will only work for tensor meshes actind = np.array([False]*mesh.nC).reshape(mesh.vnC, order='F') for ii in range(mesh.nCx): actind[ii,:] = [np.all(gridTopo[ii:ii+2] > Ny[kk]) for kk in range(len(Ny)) ] else: raise NotImplementedError('surface2ind_topo not implemented for 1D mesh') return mkvc(actind)
def exampleLrmGrid(nC, exType): assert type(nC) == list, "nC must be a list containing the number of nodes" assert len(nC) == 2 or len(nC) == 3, "nC must either two or three dimensions" exType = exType.lower() possibleTypes = ['rect', 'rotate'] assert exType in possibleTypes, "Not a possible example type." if exType == 'rect': return list(ndgrid([np.cumsum(np.r_[0, np.ones(nx)/nx]) for nx in nC], vector=False)) elif exType == 'rotate': if len(nC) == 2: X, Y = ndgrid([np.cumsum(np.r_[0, np.ones(nx)/nx]) for nx in nC], vector=False) amt = 0.5-np.sqrt((X - 0.5)**2 + (Y - 0.5)**2) amt[amt < 0] = 0 return [X + (-(Y - 0.5))*amt, Y + (+(X - 0.5))*amt] elif len(nC) == 3: X, Y, Z = ndgrid([np.cumsum(np.r_[0, np.ones(nx)/nx]) for nx in nC], vector=False) amt = 0.5-np.sqrt((X - 0.5)**2 + (Y - 0.5)**2 + (Z - 0.5)**2) amt[amt < 0] = 0 return [X + (-(Y - 0.5))*amt, Y + (-(Z - 0.5))*amt, Z + (-(X - 0.5))*amt]
def surface2ind_topo(mesh, topo, gridLoc='CC'): # def genActiveindfromTopo(mesh, topo): """ Get active indices from topography """ if mesh.dim == 3: from scipy.interpolate import NearestNDInterpolator Ftopo = NearestNDInterpolator(topo[:, :2], topo[:, 2]) if gridLoc == 'CC': XY = ndgrid(mesh.vectorCCx, mesh.vectorCCy) Zcc = mesh.gridCC[:, 2].reshape((np.prod(mesh.vnC[:2]), mesh.nCz), order='F') gridTopo = Ftopo(XY) actind = [ gridTopo[ixy] <= Zcc[ixy, :] for ixy in range(np.prod(mesh.vnC[0])) ] actind = np.hstack(actind) elif gridLoc == 'N': XY = ndgrid(mesh.vectorNx, mesh.vectorNy) gridTopo = Ftopo(XY).reshape(mesh.vnN[:2], order='F') if mesh._meshType not in ['TENSOR', 'CYL', 'BASETENSOR']: raise NotImplementedError( 'Nodal surface2ind_topo not implemented for {0!s} mesh'. format(mesh._meshType)) Nz = mesh.vectorNz[ 1:] # TODO: this will only work for tensor meshes actind = np.array([False] * mesh.nC).reshape(mesh.vnC, order='F') for ii in range(mesh.nCx): for jj in range(mesh.nCy): actind[ii, jj, :] = [ np.all(gridTopo[ii:ii + 2, jj:jj + 2] >= Nz[kk]) for kk in range(len(Nz)) ] elif mesh.dim == 2: from scipy.interpolate import interp1d Ftopo = interp1d(topo[:, 0], topo[:, 1]) if gridLoc == 'CC': gridTopo = Ftopo(mesh.gridCC[:, 0]) actind = mesh.gridCC[:, 1] <= gridTopo elif gridLoc == 'N': gridTopo = Ftopo(mesh.vectorNx) if mesh._meshType not in ['TENSOR', 'CYL', 'BASETENSOR']: raise NotImplementedError( 'Nodal surface2ind_topo not implemented for {0!s} mesh'. format(mesh._meshType)) Ny = mesh.vectorNy[ 1:] # TODO: this will only work for tensor meshes actind = np.array([False] * mesh.nC).reshape(mesh.vnC, order='F') for ii in range(mesh.nCx): actind[ii, :] = [ np.all(gridTopo[ii:ii + 2] > Ny[kk]) for kk in range(len(Ny)) ] else: raise NotImplementedError( 'surface2ind_topo not implemented for 1D mesh') return mkvc(actind)
def indexCube(nodes, gridSize, n=None): """ Returns the index of nodes on the mesh. Input: nodes - string of which nodes to return. e.g. 'ABCD' gridSize - size of the nodal grid n - number of nodes each i,j,k direction: [ni,nj,nk] Output: index - index in the order asked e.g. 'ABCD' --> (A,B,C,D) TWO DIMENSIONS:: node(i,j) node(i,j+1) A -------------- B | | | cell(i,j) | | I | | | D -------------- C node(i+1,j) node(i+1,j+1) THREE DIMENSIONS:: node(i,j,k+1) node(i,j+1,k+1) E --------------- F /| / | / | / | / | / | node(i,j,k) node(i,j+1,k) A -------------- B | | H ----------|---- G | /cell(i,j) | / | / I | / | / | / D -------------- C node(i+1,j,k) node(i+1,j+1,k) """ assert type(nodes) == str, "Nodes must be a str variable: e.g. 'ABCD'" assert isinstance(gridSize, np.ndarray), "Number of nodes must be an ndarray" nodes = nodes.upper() # Make sure that we choose from the possible nodes. possibleNodes = 'ABCD' if gridSize.size == 2 else 'ABCDEFGH' for node in nodes: assert node in possibleNodes, "Nodes must be chosen from: '{0!s}'".format( possibleNodes) dim = gridSize.size if n is None: n = gridSize - 1 if dim == 2: ij = ndgrid(np.arange(n[0]), np.arange(n[1])) i, j = ij[:, 0], ij[:, 1] elif dim == 3: ijk = ndgrid(np.arange(n[0]), np.arange(n[1]), np.arange(n[2])) i, j, k = ijk[:, 0], ijk[:, 1], ijk[:, 2] else: raise Exception('Only 2 and 3 dimensions supported.') nodeMap = { 'A': [0, 0, 0], 'B': [0, 1, 0], 'C': [1, 1, 0], 'D': [1, 0, 0], 'E': [0, 0, 1], 'F': [0, 1, 1], 'G': [1, 1, 1], 'H': [1, 0, 1] } out = () for node in nodes: shift = nodeMap[node] if dim == 2: out += (sub2ind(gridSize, np.c_[i + shift[0], j + shift[1]]).flatten(), ) elif dim == 3: out += (sub2ind(gridSize, np.c_[i + shift[0], j + shift[1], k + shift[2]]).flatten(), ) return out
def indexCube(nodes, gridSize, n=None): """ Returns the index of nodes on the mesh. Input: nodes - string of which nodes to return. e.g. 'ABCD' gridSize - size of the nodal grid n - number of nodes each i,j,k direction: [ni,nj,nk] Output: index - index in the order asked e.g. 'ABCD' --> (A,B,C,D) TWO DIMENSIONS:: node(i,j) node(i,j+1) A -------------- B | | | cell(i,j) | | I | | | D -------------- C node(i+1,j) node(i+1,j+1) THREE DIMENSIONS:: node(i,j,k+1) node(i,j+1,k+1) E --------------- F /| / | / | / | / | / | node(i,j,k) node(i,j+1,k) A -------------- B | | H ----------|---- G | /cell(i,j) | / | / I | / | / | / D -------------- C node(i+1,j,k) node(i+1,j+1,k) """ assert type(nodes) == str, "Nodes must be a str variable: e.g. 'ABCD'" assert isinstance(gridSize, np.ndarray), "Number of nodes must be an ndarray" nodes = nodes.upper() # Make sure that we choose from the possible nodes. possibleNodes = 'ABCD' if gridSize.size == 2 else 'ABCDEFGH' for node in nodes: assert node in possibleNodes, "Nodes must be chosen from: '%s'" % possibleNodes dim = gridSize.size if n is None: n = gridSize - 1 if dim == 2: ij = ndgrid(np.arange(n[0]), np.arange(n[1])) i, j = ij[:, 0], ij[:, 1] elif dim == 3: ijk = ndgrid(np.arange(n[0]), np.arange(n[1]), np.arange(n[2])) i, j, k = ijk[:, 0], ijk[:, 1], ijk[:, 2] else: raise Exception('Only 2 and 3 dimensions supported.') nodeMap = {'A': [0, 0, 0], 'B': [0, 1, 0], 'C': [1, 1, 0], 'D': [1, 0, 0], 'E': [0, 0, 1], 'F': [0, 1, 1], 'G': [1, 1, 1], 'H': [1, 0, 1]} out = () for node in nodes: shift = nodeMap[node] if dim == 2: out += (sub2ind(gridSize, np.c_[i+shift[0], j+shift[1]]).flatten(), ) elif dim == 3: out += (sub2ind(gridSize, np.c_[i+shift[0], j+shift[1], k+shift[2]]).flatten(), ) return out