Changeset 26161
- Timestamp:
- 03/30/21 13:43:45 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/m/classes/model.m ΒΆ
r26083 r26161 818 818 md2.mesh.extractedvertices=pos_node; 819 819 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 820 935 end % }}} 821 936 function md = extrude(md,varargin) % {{{
Note:
See TracChangeset
for help on using the changeset viewer.