diff --git a/utils/converters/scilab/load_gmsh.sci b/utils/converters/scilab/load_gmsh.sci index 3ff8d0cd541ebdb44561c7e54955e251157a141c..2281d7c606d1583c2c629a19747eb0c3e3572349 100644 --- a/utils/converters/scilab/load_gmsh.sci +++ b/utils/converters/scilab/load_gmsh.sci @@ -1,28 +1,27 @@ function gmesh = load_gmsh ( filename ) - gmesh = []; + [fid,ierr] = mopen ( filename, 'r'); + if ierr <> 0 then; + mclose(fid); + error('no such file: '+filename) + end + gmesh = []; gmesh.MIN = zeros(3,1); gmesh.MAX = zeros(3,1); - fid = mopen ( filename, 'r'); - while 1 + while 1 endoffile = 0; -// while (1) -// tline = mgetl(fid,1); -// if meof(fid), endoffile=1,break, end -// if (tline == '$'), break, end -// end - - tline = mgetl(fid,1); - if meof(fid), endoffile=1,break, end - if (tline == '$'), break, end - + while (1) + // jump over irrelevant text + tline = mgetl(fid,1); + if meof(fid), endoffile=1,break, end + if (part(tline,1) == '$'), break, end + end if (endoffile == 1), break, end - - if tline == '$NOD' + if (part(tline,1:4) == '$NOD' | part(tline,1:4) == '$Nod') disp('reading nodes') gmesh.nbNod = mfscanf (1, fid, '%d'); - gmesh.POS = zeros (gmesh.nbNod, 3); + gmesh.POS = zeros (gmesh.nbNod, 3); for(I=1:gmesh.nbNod) iNod = mfscanf(1,fid,'%d'); X = mfscanf(3,fid,'%g'); @@ -48,74 +47,94 @@ function gmesh = load_gmsh ( filename ) tline = mgetl(fid,2); // read 2 dummy lines disp('nodes have been read') - else - if (tline == '$ELM') - disp('reading elements') - gmesh.nbElm = mfscanf (1,fid, '%d'); - gmesh.ELE_INFOS = zeros (gmesh.nbElm,5); - gmesh.nbLines = 0; - gmesh.nbPoints = 0; - gmesh.nbTriangles = 0; - gmesh.nbQuads = 0; - gmesh.nbPrism=0; - gmesh.nbPyr=0; - gmesh.nbTet = 0; - gmesh.nbHex = 0; - gmesh.nbQTriangles = 0; - gmesh.nbQQuads = 0; - gmesh.POINTS=[]; - gmesh.LINES=[]; - gmesh.TRIANGLES=[]; - gmesh.QUADS=[]; - gmesh.TETS=[]; - gmesh.HEXA=[]; - gmesh.PRISM=[]; - gmesh.PYRAMID=[]; - gmesh.QTRIANGLES=[]; - gmesh.QQUADS=[]; - for (I=1:gmesh.nbElm) - gmesh.ELE_INFOS(I,:) = mfscanf(5,fid,'%d')'; - NODES_ELEM = mfscanf(gmesh.ELE_INFOS(I,5),fid,'%d')'; - select gmesh.ELE_INFOS(I,2) - case 15 then // point - gmesh.nbPoints = gmesh.nbPoints + 1; - gmesh.POINTS =[gmesh.POINTS; IDS(NODES_ELEM (1))' I]; - case 1 then // beam - gmesh.nbLines = gmesh.nbLines + 1; - gmesh.LINES =[gmesh.LINES; IDS(NODES_ELEM (1:2))' I]; - case 2 then // triangle - gmesh.nbTriangles = gmesh.nbTriangles + 1; - gmesh.TRIANGLES = [gmesh.TRIANGLES; IDS(NODES_ELEM (1:3))' I]; - case 3 then // quadrangle - gmesh.nbQuads = gmesh.nbQuads + 1; - gmesh.QUADS =[gmesh.QUADS; IDS(NODES_ELEM (1:4))' I]; - case 4 then // tetrahedron (4 node) - gmesh.nbTet = gmesh.nbTet + 1; - gmesh.TETS = [gmesh.TETS; IDS(NODES_ELEM (1:4))' I]; - case 5 then // hexahedron (8 nodes) - gmesh.nbHex = gmesh.nbHex + 1; - gmesh.HEXA =[gmesh.HEXA; IDS(NODES_ELEM (1:8))' I]; - case 6 then // prism (6 nodes) - gmesh.nbPrism = gmesh.nbPrism + 1; - gmesh.PRISM =[gmesh.PRISM; IDS(NODES_ELEM (1:6))' I]; - case 7 then // pyramid (5 nodes) - gmesh.nbPyr = gmesh.nbPyr + 1; - gmesh.PYRAMID =[gmesh.PYRAMID; IDS(NODES_ELEM (1:5))' I]; - case 9 then // second order triangle (6 nodes) - gmesh.nbQTriangles = gmesh.nbQTriangles + 1; - gmesh.QTRIANGLES = [gmesh.QTRIANGLES; IDS(NODES_ELEM (1:6))' I]; - case 10 then // second order quadrangle (9 nodes) - gmesh.nbQQuads = gmesh.nbQQuads + 1; - gmesh.QQUADS = [gmesh.QQUADS; IDS(NODES_ELEM (1:9))' I]; - else - disp(' ') - warning('Unknown element type '+string(gmesh.ELE_INFOS(I,2)) +' !') - end - end - tline = mgetl(fid,1); - disp('elements have been read') + elseif(part(tline,1:4)=='$ELM' | part(tline,1:4)=='$Ele') + disp('reading elements') + gmesh.nbElm = mfscanf (1,fid, '%d'); + gmesh.ELE_INFOS = zeros (gmesh.nbElm,5); + gmesh.nbLines = 0; + gmesh.nbPoints = 0; + gmesh.nbTriangles = 0; + gmesh.nbQuads = 0; + gmesh.nbPrism=0; + gmesh.nbPyr=0; + gmesh.nbTet = 0; + gmesh.nbHex = 0; + gmesh.nbQTriangles = 0; + gmesh.nbQQuads = 0; + gmesh.POINTS=[]; + gmesh.LINES=[]; + gmesh.TRIANGLES=[]; + gmesh.QUADS=[]; + gmesh.TETS=[]; + gmesh.HEXA=[]; + gmesh.PRISM=[]; + gmesh.PYRAMID=[]; + gmesh.QTRIANGLES=[]; + gmesh.QQUADS=[]; + for (I=1:gmesh.nbElm) + if (part(tline,1:4)=='$Ele') + // file is in GMSH version 2.0 format + gmesh.ELE_INFOS(I,1:3) = mfscanf(3,fid,'%d')'; + n_of_tags = gmesh.ELE_INFOS(I,3); + gmesh.ELE_INFOS(I,4+(1:n_of_tags)) = mfscanf(n_of_tags,fid,'%d')'; + // the number of points + select gmesh.ELE_INFOS(I,2) + case 15 then, np=1; + case 1 then, np=2; + case 2 then, np=3; + case 3 then, np=4; + case 4 then, np=4; + case 5 then, np=8; + case 6 then, np=6; + case 7 then, np=5; + case 9 then, np=6; + case 10 then, np=9; + end + NODES_ELEM = mfscanf(np,fid,'%d')'; + else + // version 1.0 format + gmesh.ELE_INFOS(I,:) = mfscanf(5,fid,'%d')'; + NODES_ELEM = mfscanf(gmesh.ELE_INFOS(I,5),fid,'%d')'; + end + select gmesh.ELE_INFOS(I,2) + case 15 then // point + gmesh.nbPoints = gmesh.nbPoints + 1; + gmesh.POINTS =[gmesh.POINTS; IDS(NODES_ELEM (1))' I]; + case 1 then // beam + gmesh.nbLines = gmesh.nbLines + 1; + gmesh.LINES =[gmesh.LINES; IDS(NODES_ELEM (1:2))' I]; + case 2 then // triangle + gmesh.nbTriangles = gmesh.nbTriangles + 1; + gmesh.TRIANGLES = [gmesh.TRIANGLES; IDS(NODES_ELEM (1:3))' I]; + case 3 then // quadrangle + gmesh.nbQuads = gmesh.nbQuads + 1; + gmesh.QUADS =[gmesh.QUADS; IDS(NODES_ELEM (1:4))' I]; + case 4 then // tetrahedron (4 node) + gmesh.nbTet = gmesh.nbTet + 1; + gmesh.TETS = [gmesh.TETS; IDS(NODES_ELEM (1:4))' I]; + case 5 then // hexahedron (8 nodes) + gmesh.nbHex = gmesh.nbHex + 1; + gmesh.HEXA =[gmesh.HEXA; IDS(NODES_ELEM (1:8))' I]; + case 6 then // prism (6 nodes) + gmesh.nbPrism = gmesh.nbPrism + 1; + gmesh.PRISM =[gmesh.PRISM; IDS(NODES_ELEM (1:6))' I]; + case 7 then // pyramid (5 nodes) + gmesh.nbPyr = gmesh.nbPyr + 1; + gmesh.PYRAMID =[gmesh.PYRAMID; IDS(NODES_ELEM (1:5))' I]; + case 9 then // second order triangle (6 nodes) + gmesh.nbQTriangles = gmesh.nbQTriangles + 1; + gmesh.QTRIANGLES = [gmesh.QTRIANGLES; IDS(NODES_ELEM (1:6))' I]; + case 10 then // second order quadrangle (9 nodes) + gmesh.nbQQuads = gmesh.nbQQuads + 1; + gmesh.QQUADS = [gmesh.QQUADS; IDS(NODES_ELEM (1:9))' I]; + else + disp(' ') + warning('Unknown element type ' + string(gmesh.ELE_INFOS(I,2)) + ' !') + end end - end - end + disp('elements have been read') + tline = mgetl(fid,1); + end // + end // while mclose (fid); endfunction