Changeset 24213 for issm/trunk-jpl/src/m/mesh/squaremesh.py
- Timestamp:
- 10/11/19 00:25:20 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/m/mesh/squaremesh.py
r23716 r24213 1 1 import numpy as np 2 2 from NodeConnectivity import NodeConnectivity 3 from ElementConnectivity import ElementConnectivity 3 from ElementConnectivity import ElementConnectivity 4 4 from mesh2d import mesh2d 5 5 6 def squaremesh(md,Lx,Ly,nx,ny):7 """8 SQUAREMESH - create a structured square mesh9 6 10 This script will generate a structured square mesh 11 Lx and Ly are the dimension of the domain (in meters) 12 nx anx ny are the number of nodes in the x and y direction 13 The coordinates x and y returned are in meters. 7 def squaremesh(md, Lx, Ly, nx, ny): 8 """ 9 SQUAREMESH - create a structured square mesh 14 10 15 Usage: 16 [md]=squaremesh(md,Lx,Ly,nx,ny) 17 """ 11 This script will generate a structured square mesh 12 Lx and Ly are the dimension of the domain (in meters) 13 nx anx ny are the number of nodes in the x and y direction 14 The coordinates x and y returned are in meters. 18 15 19 #get number of elements and number of nodes 20 nel=(nx-1)*(ny-1)*2 21 nods=nx*ny 16 Usage: 17 [md] = squaremesh(md, Lx, Ly, nx, ny) 18 """ 22 19 23 #initialization 24 index=np.zeros((nel,3),int) 25 x=np.zeros((nx*ny)) 26 y=np.zeros((nx*ny)) 20 #get number of elements and number of nodes 21 nel = (nx - 1) * (ny - 1) * 2 22 nods = nx * ny 27 23 28 #create coordinates 29 for n in range(0,nx): 30 for m in range(0,ny): 31 x[n*ny+m]=float(n) 32 y[n*ny+m]=float(m) 24 #initialization 25 index = np.zeros((nel, 3), int) 26 x = np.zeros((nx * ny)) 27 y = np.zeros((nx * ny)) 33 28 34 #create index 35 for n in range(0,nx-1): 36 for m in range(0,ny-1): 37 A=n*ny+(m+1) 38 B=A+1 39 C=(n+1)*ny+(m+1) 40 D=C+1 41 index[n*(ny-1)*2+2*m,:]=[A,C,B] 42 index[n*(ny-1)*2+2*(m+1)-1,:]=[B,C,D] 29 #create coordinates 30 for n in range(0, nx): 31 for m in range(0, ny): 32 x[n * ny + m] = float(n) 33 y[n * ny + m] = float(m) 43 34 44 #Scale x and y 45 x=x/np.max(x)*Lx 46 y=y/np.max(y)*Ly 35 #create index 36 for n in range(0, nx - 1): 37 for m in range(0, ny - 1): 38 A = n * ny + (m + 1) 39 B = A + 1 40 C = (n + 1) * ny + (m + 1) 41 D = C + 1 42 index[n * (ny - 1) * 2 + 2 * m, :] = [A, C, B] 43 index[n * (ny - 1) * 2 + 2 * (m + 1) - 1, :] = [B, C, D] 47 44 48 #create segments 49 segments=np.zeros((2*(nx-1)+2*(ny-1),3),int) 50 #left edge: 51 segments[0:ny-1,:]=np.vstack((np.arange(2,ny+1),np.arange(1,ny),(2*np.arange(1,ny)-1))).T 52 #right edge: 53 segments[ny-1:2*(ny-1),:]=np.vstack((np.arange(ny*(nx-1)+1,nx*ny),np.arange(ny*(nx-1)+2,nx*ny+1),2*np.arange((ny-1)*(nx-2)+1,(nx-1)*(ny-1)+1))).T 54 #front edge: 55 segments[2*(ny-1):2*(ny-1)+(nx-1),:]=np.vstack((np.arange(2*ny,ny*nx+1,ny),np.arange(ny,ny*(nx-1)+1,ny),np.arange(2*(ny-1),2*(nx-1)*(ny-1)+1,2*(ny-1)))).T 56 #back edge 57 segments[2*(ny-1)+(nx-1):2*(nx-1)+2*(ny-1),:]=np.vstack((np.arange(1,(nx-2)*ny+2,ny),np.arange(ny+1,ny*(nx-1)+2,ny),np.arange(1,2*(nx-2)*(ny-1)+2,2*(ny-1)))).T 45 #Scale x and y 46 x = x / np.max(x) * Lx 47 y = y / np.max(y) * Ly 58 48 59 #plug coordinates and nodes 60 md.mesh=mesh2d() 61 md.mesh.x=x 62 md.mesh.y=y 63 md.mesh.numberofvertices=nods 64 md.mesh.vertexonboundary=np.zeros((nods),bool) 65 md.mesh.vertexonboundary[segments[:,0:2]-1]=True 49 #create segments 50 segments = np.zeros((2 * (nx - 1) + 2 * (ny - 1), 3), int) 51 #left edge: 52 segments[0:ny - 1, :] = np.vstack((np.arange(2, ny + 1), np.arange(1, ny), (2 * np.arange(1, ny) - 1))).T 53 #right edge: 54 segments[ny - 1:2 * (ny - 1), :] = np.vstack((np.arange(ny * (nx - 1) + 1, nx * ny), np.arange(ny * (nx - 1) + 2, nx * ny + 1), 2 * np.arange((ny - 1) * (nx - 2) + 1, (nx - 1) * (ny - 1) + 1))).T 55 #front edge: 56 segments[2 * (ny - 1):2 * (ny - 1) + (nx - 1), :] = np.vstack((np.arange(2 * ny, ny * nx + 1, ny), np.arange(ny, ny * (nx - 1) + 1, ny), np.arange(2 * (ny - 1), 2 * (nx - 1) * (ny - 1) + 1, 2 * (ny - 1)))).T 57 #back edge 58 segments[2 * (ny - 1) + (nx - 1):2 * (nx - 1) + 2 * (ny - 1), :] = np.vstack((np.arange(1, (nx - 2) * ny + 2, ny), np.arange(ny + 1, ny * (nx - 1) + 2, ny), np.arange(1, 2 * (nx - 2) * (ny - 1) + 2, 2 * (ny - 1)))).T 66 59 67 #plug elements 68 md.mesh.elements=index 69 md.mesh.segments=segments 70 md.mesh.numberofelements=nel 60 #plug coordinates and nodes 61 md.mesh = mesh2d() 62 md.mesh.x = x 63 md.mesh.y = y 64 md.mesh.numberofvertices = nods 65 md.mesh.vertexonboundary = np.zeros((nods), bool) 66 md.mesh.vertexonboundary[segments[:, 0:2] - 1] = True 71 67 72 #Now, build the connectivity tables for this mesh. 73 md.mesh.vertexconnectivity=NodeConnectivity(md.mesh.elements,md.mesh.numberofvertices)[0] 74 md.mesh.elementconnectivity=ElementConnectivity(md.mesh.elements,md.mesh.vertexconnectivity)[0] 68 #plug elements 69 md.mesh.elements = index 70 md.mesh.segments = segments 71 md.mesh.numberofelements = nel 75 72 76 return md 73 #Now, build the connectivity tables for this mesh. 74 md.mesh.vertexconnectivity = NodeConnectivity(md.mesh.elements, md.mesh.numberofvertices)[0] 75 md.mesh.elementconnectivity = ElementConnectivity(md.mesh.elements, md.mesh.vertexconnectivity)[0] 76 77 return md
Note:
See TracChangeset
for help on using the changeset viewer.