Changeset 27799
- Timestamp:
- 06/22/23 13:51:39 (21 months ago)
- Location:
- issm/trunk-jpl/src/m/mesh
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/m/mesh/triangle.m
r23187 r27799 48 48 removeorphans=1; 49 49 if removeorphans, 50 orphan=find(~ismember([1:length(x)],sort(unique(elements(:))))); 51 for i=1:length(orphan), 50 uniqueelements=sort(unique(elements(:))); 51 orphans=find(~ismember([1:length(x)],uniqueelements)); 52 for i=1:length(orphans), 52 53 disp('WARNING: removing orphans'); 53 54 %get rid of the orphan node i 54 55 %update x and y 55 x=[x(1:orphan (i)-(i-1)-1); x(orphan(i)-(i-1)+1:end)];56 y=[y(1:orphan (i)-(i-1)-1); y(orphan(i)-(i-1)+1:end)];56 x=[x(1:orphans(i)-(i-1)-1); x(orphans(i)-(i-1)+1:end)]; 57 y=[y(1:orphans(i)-(i-1)-1); y(orphans(i)-(i-1)+1:end)]; 57 58 %update elements 58 pos=find(elements>orphan (i)-(i-1));59 pos=find(elements>orphans(i)-(i-1)); 59 60 elements(pos)=elements(pos)-1; 60 61 %update segments 61 pos1=find(segments(:,1)>orphan (i)-(i-1));62 pos2=find(segments(:,2)>orphan (i)-(i-1));62 pos1=find(segments(:,1)>orphans(i)-(i-1)); 63 pos2=find(segments(:,2)>orphans(i)-(i-1)); 63 64 segments(pos1,1)=segments(pos1,1)-1; 64 65 segments(pos2,2)=segments(pos2,2)-1; … … 77 78 md.mesh.numberofelements=size(md.mesh.elements,1); 78 79 md.mesh.numberofvertices=length(md.mesh.x); 79 md.mesh.vertexonboundary=zeros(md.mesh.numberofvertices,1); md.mesh.vertexonboundary(md.mesh.segments(:,1:2))=1; 80 md.mesh.vertexonboundary=zeros(md.mesh.numberofvertices,1); 81 md.mesh.vertexonboundary(md.mesh.segments(:,1:2))=1; 80 82 81 83 %Now, build the connectivity tables for this mesh. -
issm/trunk-jpl/src/m/mesh/triangle.py
r25455 r27799 10 10 11 11 def triangle(md, domainname, *args): 12 """ TRIANGLE- create model mesh using the triangle package12 """triangle - create model mesh using the triangle package 13 13 14 14 This routine creates a model mesh using Triangle and a domain outline, to within a certain resolution … … 27 27 """ 28 28 29 # Figure out a characteristic area. Resolution is a node oriented concept (ex a 1000m resolution node would30 # be made of 1000 * 1000 area squares).29 # Figure out a characteristic area. Resolution is a node oriented concept (ex a 1000m resolution node would 30 # be made of 1000 * 1000 area squares). 31 31 32 32 if len(args) == 1: … … 37 37 resolution = args[1] 38 38 39 # Check that mesh was not already run, and warn user:39 # Check that mesh was not already run, and warn user: 40 40 if md.mesh.numberofelements: 41 41 choice = input('This model already has a mesh. Are you sure you want to go ahead? (y / n)') 42 42 if choice not in ['y', 'n']: 43 print( "bad answer try you should use 'y' or 'n' ... exiting")43 print('bad answer try you should use \'y\' or \'n\' ... exiting') 44 44 return None 45 45 if choice == 'n': … … 49 49 area = resolution ** 2 50 50 51 # Check that file exist (this is a very very common mistake)51 # Check that file exist (this is a very very common mistake) 52 52 if not os.path.exists(domainname): 53 raise IOError( "file '%s' not found" % domainname)53 raise IOError('file {} not found'.format(domainname)) 54 54 55 #Mesh using Triangle 55 # Mesh using Triangle 56 elements, x, y, segments, segmentmarkers = Triangle_python(domainname, riftname, area) 57 58 # Check that all the created nodes belong to at least one element 59 removeorphans = 1 60 if removeorphans: 61 uniqueelements = np.sort(np.unique(elements)) 62 orphans = np.nonzero((~np.isin(range(1, len(x)), uniqueelements)).astype(int))[0] 63 for i in range(0, len(orphans)): 64 print('WARNING: removing orphans') 65 # Get rid of the orphan node i 66 # Update x and y 67 x = np.concatenate((x[0:(orphans[i] - i)], x[(orphans[i] - i + 1):])) 68 y = np.concatenate((y[0:(orphans[i] - i)], y[(orphans[i] - i + 1):])) 69 # Update elements 70 pos = np.nonzero((elements > (orphans[i] - i)).flatten(order='F'))[0] 71 elementstmp = elements.flatten(order='F') 72 elementstmp[pos] -= 1 73 elements = elementstmp.reshape(np.shape(elements), order='F') 74 # Update segments 75 pos1 = np.nonzero(segments[:,0] > (orphans[i] - i))[0] 76 pos2 = np.nonzero(segments[:,1] > (orphans[i] - i))[0] 77 segments[pos1, 0] -= 1 78 segments[pos2, 1] -= 1 79 80 # Plug into md 56 81 md.mesh = mesh2d() 57 md.mesh.elements, md.mesh.x, md.mesh.y, md.mesh.segments, md.mesh.segmentmarkers = Triangle_python(domainname, riftname, area) 58 md.mesh.elements = md.mesh.elements.astype(int) 59 md.mesh.segments = md.mesh.segments.astype(int) 60 md.mesh.segmentmarkers = md.mesh.segmentmarkers.astype(int) 82 md.mesh.x = x 83 md.mesh.y = y 84 md.mesh.elements = elements.astype(int) 85 md.mesh.segments = segments.astype(int) 86 md.mesh.segmentmarkers = segmentmarkers.astype(int) 61 87 62 # Fill in rest of fields:88 # Fill in rest of fields: 63 89 md.mesh.numberofelements = np.size(md.mesh.elements, axis=0) 64 90 md.mesh.numberofvertices = np.size(md.mesh.x) … … 66 92 md.mesh.vertexonboundary[md.mesh.segments[:, 0:2] - 1] = 1 67 93 68 # Now, build the connectivity tables for this mesh.94 # Now, build the connectivity tables for this mesh. 69 95 md.mesh.vertexconnectivity = NodeConnectivity(md.mesh.elements, md.mesh.numberofvertices) 70 96 md.mesh.elementconnectivity = ElementConnectivity(md.mesh.elements, md.mesh.vertexconnectivity)
Note:
See TracChangeset
for help on using the changeset viewer.