Changeset 17719


Ignore:
Timestamp:
04/14/14 13:34:20 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: importgmsh.m now compatible with 3d meshes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk-jpl/src/m/contrib/dassflow/importgmsh.m

    r17610 r17719  
    1 function md = importgmsh(filename)
     1function md = importgmsh(filename,dim)
    22
    33%some checks
     
    3030x = A(2,:)';
    3131y = A(3,:)';
     32z = A(4,:)';
     33
    3234A=fscanf(fid,'%s',1);
    3335if ~strcmp(A,'$EndNodes'),
     
    4345disp(['Number of elements: ' num2str(nbt) ]);
    4446counter = 0;
    45 index   = zeros(0,3);
    46 segments       = zeros(0,2);
    47 segmentmarkers = zeros(0,1);
     47if (dim==2),
     48        index   = zeros(0,3);
     49        segments       = zeros(0,2);
     50        segmentmarkers = zeros(0,1);
     51elseif (dim==3),
     52        index   = zeros(0,4);
     53        segments       = zeros(0,3);
     54        segmentmarkers = zeros(0,1);
     55else
     56        error('not supported');
     57end
     58
    4859while(counter<nbt);
    4960        id = fscanf(fid,'%i',1);
    5061        ty = fscanf(fid,'%i',1);
    51         if(ty>2) error('Type not supported'); end
    5262        nbf = fscanf(fid,'%i',1);
    5363        flags = fscanf(fid,'%i',nbf);
    5464
    55         if ty==1,
    56                 A=fscanf(fid,'%i %i',2);
    57                 segments(end+1,:)=A;
    58                 if(flags(1)==5 & flags(2)==3), segmentmarkers(end+1)=3;
    59                 elseif(flags(1)==1 & flags(2)==4), segmentmarkers(end+1)=4;
    60                 elseif(flags(1)==2 & flags(2)==1), segmentmarkers(end+1)=1;
    61                 elseif(flags(1)==4 & flags(2)==2), segmentmarkers(end+1)=2;
    62                 else error(['flags ' num2str(flags') ' not supported']);
    63                 end
    64         else
    65                 A=fscanf(fid,'%i %i %i',3);
    66                 index(end+1,:)=A;
     65        switch(ty)
     66                case 1, %segments
     67                        A=fscanf(fid,'%i %i',2);
     68                        if (dim==2),  %Actual element
     69                                segments(end+1,:)=A;
     70                                if    (flags(1)==5 & flags(2)==3), segmentmarkers(end+1)=3;
     71                                elseif(flags(1)==1 & flags(2)==4), segmentmarkers(end+1)=4;
     72                                elseif(flags(1)==2 & flags(2)==1), segmentmarkers(end+1)=1;
     73                                elseif(flags(1)==4 & flags(2)==2), segmentmarkers(end+1)=2;
     74                                else error(['flags ' num2str(flags') ' not supported']);
     75                                end
     76                        else
     77                                error('not supported');
     78                        end
     79                case 2, %tria
     80                        A=fscanf(fid,'%i %i %i',3);
     81                        if (dim==2), %Actual element
     82                                index(end+1,:)=A;
     83                        else         %Boundary element
     84                                segments(end+1,:)=A;
     85                                if    (flags(1)==3), segmentmarkers(end+1)=3;
     86                                elseif(flags(1)==4), segmentmarkers(end+1)=4;
     87                                elseif(flags(1)==1), segmentmarkers(end+1)=1;
     88                                elseif(flags(1)==2), segmentmarkers(end+1)=2;
     89                                elseif(flags(1)==5), segmentmarkers(end+1)=5;
     90                                elseif(flags(1)==6), segmentmarkers(end+1)=6;
     91                                else error(['flags ' num2str(flags') ' not supported']);
     92                                end
     93                        end
     94                case 4, %tetra
     95                        A=fscanf(fid,'%i %i %i %i',4);
     96                        if (dim==3), %Actual element
     97                                index(end+1,:)=A;
     98                        else
     99                                error('not supported');
     100                        end
     101                otherwise,
     102                        error(['Type ' num2str(ty) ' not supported']);
    67103        end
    68104        counter = counter + 1;
     
    70106
    71107%recreate segments
    72 nbs = size(segments,1);
    73 segments = [segments zeros(nbs,1)];
    74 for i=1:nbs,
    75         E = find(sum(ismember(index,segments(i,:)),2)>1);
    76         segments(i,3)=E;
     108if dim==2,
     109        nbs = size(segments,1);
     110        segments = [segments zeros(nbs,1)];
     111        for i=1:nbs,
     112                E = find(sum(ismember(index,segments(i,:)),2)>1);
     113                segments(i,3)=E;
     114        end
     115else
     116        nbs = size(segments,1);
     117        segments = [segments zeros(nbs,1)];
     118        for i=1:nbs,
     119                E = find(sum(ismember(index,segments(i,:)),2)>2);
     120                segments(i,4)=E;
     121        end
    77122end
    78123
     
    81126
    82127%Create model
    83 md=meshconvert(model,index,x,y);
    84 md.mesh=mesh2dvertical(md.mesh);
    85 md.mesh.segmentmarkers=segmentmarkers;
    86 md.mesh.segments=segments;
    87 md.mesh.vertexonbase=zeros(md.mesh.numberofvertices,1);
    88 md.mesh.vertexonbase(find(vertexflags(md.mesh,1)))=1;
    89 md.mesh.vertexonsurface=zeros(md.mesh.numberofvertices,1);
    90 md.mesh.vertexonsurface(find(vertexflags(md.mesh,3)))=1;
     128if 0, %2d triangles
     129        md=meshconvert(model,index,x,y);
     130        md.mesh=mesh2dvertical(md.mesh);
     131        md.mesh.segmentmarkers=segmentmarkers;
     132        md.mesh.segments=segments;
     133        md.mesh.vertexonbase=zeros(md.mesh.numberofvertices,1);
     134        md.mesh.vertexonbase(find(vertexflags(md.mesh,1)))=1;
     135        md.mesh.vertexonsurface=zeros(md.mesh.numberofvertices,1);
     136        md.mesh.vertexonsurface(find(vertexflags(md.mesh,3)))=1;
     137else
     138        md=model();
     139        md.mesh=mesh3dprisms();
     140        md.mesh.x = x;
     141        md.mesh.y = y;
     142        md.mesh.z = z;
     143        md.mesh.elements = index;
     144        md.mesh.numberofelements=size(md.mesh.elements,1);
     145        md.mesh.numberofvertices=length(md.mesh.x);
     146        md.mesh.vertexonbase=zeros(md.mesh.numberofvertices,1);
     147        md.mesh.vertexonbase(find(segments(find(segmentmarkers==1),1:3)))=1;
     148        md.mesh.vertexonsurface=zeros(md.mesh.numberofvertices,1);
     149        md.mesh.vertexonsurface(find(segments(find(segmentmarkers==3),1:3)))=1;
     150end
Note: See TracChangeset for help on using the changeset viewer.