Changeset 27799


Ignore:
Timestamp:
06/22/23 13:51:39 (21 months ago)
Author:
jdquinn
Message:

BUG: MATLAB -> Python (orphan culling); clean up

Location:
issm/trunk-jpl/src/m/mesh
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/mesh/triangle.m

    r23187 r27799  
    4848removeorphans=1;
    4949if 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),
    5253                disp('WARNING: removing orphans');
    5354                %get rid of the orphan node i
    5455                %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)];
    5758                %update elements
    58                 pos=find(elements>orphan(i)-(i-1));
     59                pos=find(elements>orphans(i)-(i-1));
    5960                elements(pos)=elements(pos)-1;
    6061                %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));
    6364                segments(pos1,1)=segments(pos1,1)-1;
    6465                segments(pos2,2)=segments(pos2,2)-1;
     
    7778md.mesh.numberofelements=size(md.mesh.elements,1);
    7879md.mesh.numberofvertices=length(md.mesh.x);
    79 md.mesh.vertexonboundary=zeros(md.mesh.numberofvertices,1); md.mesh.vertexonboundary(md.mesh.segments(:,1:2))=1;
     80md.mesh.vertexonboundary=zeros(md.mesh.numberofvertices,1);
     81md.mesh.vertexonboundary(md.mesh.segments(:,1:2))=1;
    8082
    8183%Now, build the connectivity tables for this mesh.
  • issm/trunk-jpl/src/m/mesh/triangle.py

    r25455 r27799  
    1010
    1111def triangle(md, domainname, *args):
    12     """TRIANGLE - create model mesh using the triangle package
     12    """triangle - create model mesh using the triangle package
    1313
    1414    This routine creates a model mesh using Triangle and a domain outline, to within a certain resolution
     
    2727    """
    2828
    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).
     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).
    3131
    3232    if len(args) == 1:
     
    3737        resolution = args[1]
    3838
    39     #Check that mesh was not already run, and warn user:
     39    # Check that mesh was not already run, and warn user:
    4040    if md.mesh.numberofelements:
    4141        choice = input('This model already has a mesh. Are you sure you want to go ahead? (y / n)')
    4242        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')
    4444            return None
    4545        if choice == 'n':
     
    4949    area = resolution ** 2
    5050
    51     #Check that file exist (this is a very very common mistake)
     51    # Check that file exist (this is a very very common mistake)
    5252    if not os.path.exists(domainname):
    53         raise IOError("file '%s' not found" % domainname)
     53        raise IOError('file {} not found'.format(domainname))
    5454
    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
    5681    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)
    6187
    62     #Fill in rest of fields:
     88    # Fill in rest of fields:
    6389    md.mesh.numberofelements = np.size(md.mesh.elements, axis=0)
    6490    md.mesh.numberofvertices = np.size(md.mesh.x)
     
    6692    md.mesh.vertexonboundary[md.mesh.segments[:, 0:2] - 1] = 1
    6793
    68     #Now, build the connectivity tables for this mesh.
     94    # Now, build the connectivity tables for this mesh.
    6995    md.mesh.vertexconnectivity = NodeConnectivity(md.mesh.elements, md.mesh.numberofvertices)
    7096    md.mesh.elementconnectivity = ElementConnectivity(md.mesh.elements, md.mesh.vertexconnectivity)
Note: See TracChangeset for help on using the changeset viewer.