Changeset 26161


Ignore:
Timestamp:
03/30/21 13:43:45 (4 years ago)
Author:
Mathieu Morlighem
Message:

CHG: added super cool function to refine 4x a mesh automatically

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk-jpl/src/m/classes/model.m ΒΆ

    r26083 r26161  
    818818                        md2.mesh.extractedvertices=pos_node;
    819819                        md2.mesh.extractedelements=pos_elem;
     820                end % }}}
     821                function md2 = refine(md) % {{{
     822                        %refine - split all triangles into 3 to refine the mesh everywhere
     823                        %
     824                        %   This function only works for 2d triangle meshes
     825                        %
     826                        %   Usage:
     827                        %      md2=refine(md);
     828                        %
     829                        %   See also: EXTRUDE, COLLAPSE, EXTRACT
     830
     831                        %Check incoming
     832                        if ~strcmp(elementtype(md.mesh),'Tria')
     833                                error('not supported for 3d meshes');
     834                        end
     835
     836                        %copy model
     837                        md2=md;
     838
     839                        disp('Getting edges');
     840                        %initialization of some variables
     841                        nbe   = md.mesh.numberofelements;
     842                        nbv   = md.mesh.numberofvertices;
     843                        index = md.mesh.elements;
     844                        elementslist=1:nbe;
     845                        %1: list of edges
     846                        edges=[index(:,[1,2]); index(:,[2,3]); index(:,[3,1])];
     847                        %2: find unique edges
     848                        [edges,I,J]=unique(sort(edges,2),'rows');
     849                        %3: unique edge numbers
     850                        vec=J;
     851                        %4: unique edges numbers in each triangle (2 triangles sharing the same edge will have the same edge number)
     852                        edges_tria=[vec(elementslist+nbe) vec(elementslist+2*nbe) vec(elementslist)];
     853
     854                        % We divide each element as follows
     855                        %
     856                        %                   e2
     857                        %    n1 ------------+------------ n3
     858                        %       \          / \          /
     859                        %        \    1   /   \   3    /
     860                        %         \      /     \      /
     861                        %          \    /   2   \    /
     862                        %           \  /         \  /
     863                        %         e3 +____________\/ e1
     864                        %             \           /
     865                        %              \         /
     866                        %               \   4   /
     867                        %                \     /
     868                        %                 \   /
     869                        %                   n2
     870
     871                        %Create new coordinates
     872                        disp('Remeshing...');
     873                        x_edges = 0.5*(md.mesh.x(edges(:,1)) + md.mesh.x(edges(:,2)));
     874                        y_edges = 0.5*(md.mesh.y(edges(:,1)) + md.mesh.y(edges(:,2)));
     875                        md2.mesh.x = [md2.mesh.x;x_edges];
     876                        md2.mesh.y = [md2.mesh.y;y_edges];
     877                        md2.mesh.elements = [...
     878                                index(:,1)          nbv+edges_tria(:,3) nbv+edges_tria(:,2);...
     879                                nbv+edges_tria(:,2) nbv+edges_tria(:,3) nbv+edges_tria(:,1);...
     880                                nbv+edges_tria(:,2) nbv+edges_tria(:,1) index(:,3);...
     881                                nbv+edges_tria(:,3) index(:,2)          nbv+edges_tria(:,1)];
     882                        md2.mesh.numberofelements = 4*nbe;
     883                        md2.mesh.numberofvertices = nbv + size(edges,1);
     884                        disp(['   Old number of elements: ' num2str(nbe)]);
     885                        disp(['   New number of elements: ' num2str(4*nbe)]);
     886
     887                        disp('Interpolate all fields');
     888                        numberofvertices1 = md.mesh.numberofvertices;
     889                        numberofelements1 = md.mesh.numberofelements;
     890                        nbv2 = md2.mesh.numberofvertices;
     891                        %Create transformation vectors
     892                        nbedges = size(edges,1);
     893                        Pelem = sparse(1:4*nbe,repmat([1:nbe],1,4),ones(4*nbe,1),4*nbe,nbe);
     894                        Pnode = sparse([1:nbv,repmat([nbv+1:nbv+nbedges],1,2)],[1:nbv edges(:)'],[ones(nbv,1);1/2*ones(2*nbedges,1)],md2.mesh.numberofvertices,nbv);
     895                        %loop over model fields
     896                        model_fields=setxor(fields(md),{'mesh'});
     897                        %remove mesh from this field
     898                        for i=1:length(model_fields),
     899                                %get field
     900                                field=md.(model_fields{i});
     901                                fieldsize=size(field);
     902                                if isobject(field), %recursive call
     903                                        object_fields=fields(md.(model_fields{i}));
     904                                        for j=1:length(object_fields),
     905                                                %get field
     906                                                field=md.(model_fields{i}).(object_fields{j});
     907                                                fieldsize=size(field);
     908                                                %size = number of nodes * n
     909                                                if fieldsize(1)==numberofvertices1
     910                                                        md2.(model_fields{i}).(object_fields{j})=Pnode*field;
     911                                                elseif (fieldsize(1)==numberofvertices1+1)
     912                                                        md2.(model_fields{i}).(object_fields{j})=[Pnode*field(1:end-1,:); field(end,:)];
     913                                                        %size = number of elements * n
     914                                                elseif fieldsize(1)==numberofelements1
     915                                                        md2.(model_fields{i}).(object_fields{j})=Pelem*field;
     916                                                elseif (fieldsize(1)==numberofelements1+1)
     917                                                        md2.(model_fields{i}).(object_fields{j})=[Pelem*field(1:end-1,:); field(end,:)];
     918                                                end
     919                                        end
     920                                else
     921                                        %size = number of nodes * n
     922                                        if fieldsize(1)==numberofvertices1
     923                                                md2.(model_fields{i})=Pnode*field;
     924                                        elseif (fieldsize(1)==numberofvertices1+1)
     925                                                md2.(model_fields{i})=[Pnode*field(1:end-1,:); field(end,:)];
     926                                                %size = number of elements * n
     927                                        elseif fieldsize(1)==numberofelements1
     928                                                md2.(model_fields{i})=Pelem*field;
     929                                        elseif (fieldsize(1)==numberofelements1+1)
     930                                                md2.(model_fields{i})=[Pelem*field(1:end-1,:); field(end,:)];
     931                                        end
     932                                end
     933                        end
     934
    820935                end % }}}
    821936                function md = extrude(md,varargin) % {{{
Note: See TracChangeset for help on using the changeset viewer.