Path: blob/devel/ElmerGUI/netgen/libsrc/interface/readtetmesh.cpp
3206 views
1//2// Read CST file format3//45#include <mystdlib.h>67#include <myadt.hpp>8#include <linalg.hpp>9#include <csg.hpp>10#include <meshing.hpp>11#include <sys/stat.h>121314namespace netgen15{16#include "writeuser.hpp"1718192021void ReadTETFormat (Mesh & mesh,22const string & hfilename)23{24const char * filename = hfilename.c_str();2526cout << "Reading .tet mesh" << endl;2728ifstream in (filename);2930int inputsection = 0;31bool done = false;3233char ch;34string str;3536string version;3738int unitcode;39double tolerance;40double dS1, dS2, alphaDeg, x3D, y3D, z3D;41int nelts,nfaces,nedges,nnodes;42int nperiodicmasternodes,ncornerperiodicmasternodes,ncubicperiodicmasternodes;43int nperiodicmasteredges,ncornerperiodicmasteredges;44int nperiodicmasterfaces;45int nodeid,type,pid;46int dummyint;47int modelverts,modeledges,modelfaces,modelcells;48Point3d p;49int numObj3D,numObj2D,numObj1D,numObj0D;50bool nullstarted;51ARRAY<int> eldom;52int minId3D,minId2D;53int maxId3D(-1), maxId2D(-1), maxId1D(-1), maxId0D(-1);54ARRAY<ARRAY<int> *> segmentdata;55ARRAY<Element2d* > tris;5657ARRAY<int> userdata_int; // just save data for 1:1 output58ARRAY<double> userdata_double;59ARRAY<int> point_pids;60ARRAY<int> tetfacedata;61ARRAY<int> uid_to_group_3D, uid_to_group_2D, uid_to_group_1D, uid_to_group_0D;6263while(!done)64{65// skip "//" comment66bool comment = true;67while(comment)68{69ch = in.get();70while(ch == ' ' || ch == '\n' || ch == '\t' || ch =='\r')71ch = in.get();7273if(ch != '/')74{75comment = false;76in.putback(ch);77}78else79{80ch = in.get();81if(ch != '/')82{83comment = false;84in.putback(ch);85in.putback('/');86}87else88{89in.ignore(10000,'\n');90}91}92}939495switch(inputsection)96{97case 0:98// version number99in >> version;100cout << "Version number " << version << endl;101if(version != "1.1" && version != "2" && version != "2.0")102{103cerr << "WARNING: import only tested for versions 1.1 and 2" << endl;104//done = true;105}106userdata_double.Append(atof(version.c_str()));107break;108109case 1:110// unit code (1=CM 2=MM 3=M 4=MIC 5=NM 6=FT 7=IN 8=MIL)111in >> unitcode;112cout << "unit code " << unitcode << endl;113userdata_int.Append(unitcode);114break;115116case 2:117// Geometric coord "zero" tolerance threshold118in >> tolerance;119cout << "tolerance " << tolerance << endl;120userdata_double.Append(tolerance);121break;122123case 3:124// Periodic UnitCell dS1 , dS2 , alphaDeg125in >> dS1 >> dS2 >> alphaDeg;126userdata_double.Append(dS1);127userdata_double.Append(dS2);128userdata_double.Append(alphaDeg);129break;130131case 4:132// Periodic UnitCell origin in global coords (x3D,y3D,z3D)133in >> x3D >> y3D >> z3D;134userdata_double.Append(x3D);135userdata_double.Append(y3D);136userdata_double.Append(z3D);137break;138139case 5:140// Model entity count: Vertices, Edges, Faces, Cells (Version 2)141in >> modelverts >> modeledges >> modelfaces >> modelcells;142userdata_int.Append(modelverts);143userdata_int.Append(modeledges);144userdata_int.Append(modelfaces);145userdata_int.Append(modelcells);146break;147148case 6:149// Topological mesh-entity counts (#elements,#faces,#edges,#nodes)150in >> nelts >> nfaces >> nedges >> nnodes;151cout << nelts << " elements, " << nfaces << " faces, " << nedges << " edges, " << nnodes << " nodes" << endl;152mesh.SetAllocSize(nnodes,2*nedges,nfaces,nelts);153break;154155case 7:156// NodeID, X, Y, Z, Type (0=Reg 1=PMaster 2=PSlave 3=CPMaster 4=CPSlave), PID:157{158cout << "read nodes" << endl;159for(int i=0; i<nnodes; i++)160{161in >> nodeid >> p.X() >> p.Y() >> p.Z() >> type >> pid;162mesh.AddPoint(p);163point_pids.Append(pid);164if(pid > maxId0D)165maxId0D = pid;166//(*testout) << "point " << p << " type " << type << " mastersexist " << mastersexist << endl;167}168}169break;170171case 8:172// Number of Periodic Master Nodes173in >> nperiodicmasternodes;174break;175176case 9:177// MasterNodeID, SlaveNodeID, TranslCode (1=dS1 2=dS2 3=dS1+dS2)178for(int i=0; i<nperiodicmasternodes; i++)179{180for(int j=0; j<2; j++)181in >> dummyint;182183in >> dummyint;184}185break;186187case 10:188// Number of Corner Periodic Master Nodes189in >> ncornerperiodicmasternodes;190break;191192case 11:193// MasterNodeID, 3-SlaveNodeID's, 3-TranslCodes (1=dS1 2=dS2 3=dS1+dS2)194for(int i=0; i<ncornerperiodicmasternodes; i++)195{196for(int j=0; j<4; j++)197in >> dummyint;198199for(int j=0; j<3; j++)200in >> dummyint;201}202break;203204case 12:205// Number of Cubic Periodic Master Nodes206in >> ncubicperiodicmasternodes;207break;208209case 13:210//MasterNodeID, 7-SlaveNodeID's, TranslCodes211for(int i=0; i<ncubicperiodicmasternodes; i++)212{213for(int j=0; j<8; j++)214in >> dummyint;215216for(int j=0; j<7; j++)217in >> dummyint;218}219break;220221case 14:222// EdgeID, NodeID0, NodeID1, Type (0=Reg 1=PMaster 2=PSlave 3=CPMaster 4=CPSlave), PID223cout << "read edges" << endl;224nullstarted = false;225segmentdata.SetSize(nedges);226for(int i=0; i<nedges; i++)227{228segmentdata[i] = new ARRAY<int>(7);229*segmentdata[i] = -1;230in >> dummyint;231in >> (*segmentdata[i])[0] >> (*segmentdata[i])[1];232in >> type;233in >> (*segmentdata[i])[2];234if((*segmentdata[i])[2] > maxId1D)235maxId1D = (*segmentdata[i])[2];236}237break;238239case 15:240// Number of Periodic Master Edges241in >> nperiodicmasteredges;242break;243244case 16:245// MasterEdgeID, SlaveEdgeID, TranslCode (1=dS1 2=dS2 3=dS1+dS2)246for(int i=0; i<nperiodicmasteredges; i++)247in >> dummyint >> dummyint >> dummyint;248break;249250case 17:251// Number of Corner Periodic Master Edges252in >> ncornerperiodicmasteredges;253break;254255case 18:256// MasterEdgeID, 3 SlaveEdgeID's, 3 TranslCode (1=dS1 2=dS2 3=dS1+dS2)257for(int i=0; i<ncornerperiodicmasteredges; i++)258{259in >> dummyint;260for(int j=0; j<3; j++)261in >> dummyint;262for(int j=0; j<3; j++)263in >> dummyint;264}265break;266267case 19:268// FaceID, EdgeID0, EdgeID1, EdgeID2, FaceType (0=Reg 1=PMaster 2=PSlave), PID269{270//Segment seg;271int segnum_ng[3];272bool neg[3];273cout << "read faces" << endl;274nullstarted = false;275for(int i=0; i<nfaces; i++)276{277int trinum;278int segnum;279280tris.Append(new Element2d(TRIG));281282in >> trinum;283for(int j=0; j<3; j++)284{285in >> segnum;286neg[j] = (segnum<0);287if(!neg[j])288segnum_ng[j] = segnum-1;289else290segnum_ng[j] = -segnum-1;291292if(neg[j])293tris.Last()->PNum(j+1) = (*segmentdata[segnum_ng[j]])[1];294else295tris.Last()->PNum(j+1) = (*segmentdata[segnum_ng[j]])[0];296297tris.Last()->GeomInfoPi(j+1).trignum = trinum;298}299in >> type;300int faceid;301in >> faceid;302303if(faceid > maxId2D)304maxId2D = faceid;305306if(i==0 || faceid < minId2D)307minId2D = faceid;308309tris.Last()->SetIndex(faceid);310311if(faceid > 0)312{313//if(nullstarted)314// {315// cout << "Faces: Assumption about index 0 wrong (face"<<trinum <<")" << endl;316// }317//mesh.AddSurfaceElement(tri);318319for(int j=0; j<3; j++)320{321if(neg[j])322{323(*segmentdata[segnum_ng[j]])[4] = faceid;324(*segmentdata[segnum_ng[j]])[6] = trinum;325}326else327{328(*segmentdata[segnum_ng[j]])[3] = faceid;329(*segmentdata[segnum_ng[j]])[5] = trinum;330}331}332}333else334nullstarted = true;335}336}337break;338339case 20:340// Number of Periodic Master Faces341in >> nperiodicmasterfaces;342break;343344case 21:345// MasterFaceID, SlaveFaceID, TranslCode (1=dS1 2=dS2)346{347Vec<3> randomvec(-1.32834,3.82399,0.5429151);348int maxtransl = -1;349for(int i=0; i<nperiodicmasterfaces; i++)350{351int tri1,tri2,transl;352ARRAY<PointIndex> nodes1(3),nodes2(3);353ARRAY<double> sortval1(3),sortval2(3);354in >> tri1 >> tri2 >> transl;355356if(transl > maxtransl)357maxtransl = transl;358359360for(int j=0; j<3; j++)361{362nodes1[j] = tris[tri1-1]->PNum(j+1);363sortval1[j] = Vec<3>(mesh[nodes1[j]])*randomvec;364nodes2[j] = tris[tri2-1]->PNum(j+1);365sortval2[j] = Vec<3>(mesh[nodes2[j]])*randomvec;366}367368BubbleSort(sortval1,nodes1);369BubbleSort(sortval2,nodes2);370371for(int j=0; j<3; j++)372mesh.GetIdentifications().Add(nodes1[j],nodes2[j],transl);373374}375for(int i=1; i<= maxtransl; i++)376mesh.GetIdentifications().SetType(i,Identifications::PERIODIC);377}378break;379380case 22:381// ElemID, FaceID0, FaceID1, FaceID2, FaceID3, PID382{383cout << "read elements (1)" << endl;384385//SurfaceElementIndex surf[4];386bool neg[4];387int elemid;388int domain;389390eldom.SetSize(nelts);391392for(int i=0; i<nelts; i++)393{394if(int(100.*i/nelts) % 5 == 0)395cout << int(100.*i/nelts)396#ifdef WIN32397<< "%%\r"398#else399<< "\%\r"400#endif401<< flush;402in >> elemid;403for(int j=0; j<4;j++)404{405in >> dummyint;406neg[j] = (dummyint < 0);407if(neg[j])408tetfacedata.Append(-dummyint-1);409//surf[j] = -dummyint-1;410else411tetfacedata.Append(dummyint-1);412tetfacedata.Append(((neg[j]) ? 1 : 0));413//surf[j] = dummyint-1;414}415416in >> domain;417eldom[i] = domain;418tetfacedata.Append(domain);419420if(i==0 || domain < minId3D)421minId3D = domain;422423if(domain > maxId3D)424maxId3D = domain;425426// for(int j=0; j<4; j++)427// {428// if(mesh.GetNSE() <= surf[j])429// continue;430431// int faceind = 0;432// for(int k=1; k<=mesh.GetNFD(); k++)433// {434// if(mesh.GetFaceDescriptor(k).SurfNr() == mesh[surf[j]].GetIndex())435// faceind = k;436// }437// if(faceind)438// {439// if(neg[j])440// mesh.GetFaceDescriptor(faceind).SetDomainOut(domain);441// else442// mesh.GetFaceDescriptor(faceind).SetDomainIn(domain);443// }444// else445// {446// if(neg[j])447// faceind = mesh.AddFaceDescriptor(FaceDescriptor(mesh[surf[j]].GetIndex(),0,domain,0));448// else449// faceind = mesh.AddFaceDescriptor(FaceDescriptor(mesh[surf[j]].GetIndex(),domain,0,0));450// mesh.GetFaceDescriptor(faceind).SetBCProperty(mesh[surf[j]].GetIndex());451// }452// }453}454cout << endl;455456457// ARRAY<int> indextodescriptor(maxId2D+1);458459// for(int i=1; i<=mesh.GetNFD(); i++)460// indextodescriptor[mesh.GetFaceDescriptor(i).SurfNr()] = i;461462463// for(SurfaceElementIndex i=0; i<mesh.GetNSE(); i++)464// mesh[i].SetIndex(indextodescriptor[mesh[i].GetIndex()]);465}466break;467468case 23:469// ElemID, NodeID0, NodeID1, NodeID2, NodeID3470{471cout << "read elements (2)" << endl;472Element el(TET);473for(ElementIndex i=0; i<nelts; i++)474{475in >> dummyint;476for(int j=1; j<=4; j++)477in >> el.PNum(j);478swap(el.PNum(1),el.PNum(2));479480el.SetIndex(eldom[i]);481mesh.AddVolumeElement(el);482}483}484break;485486case 24:487// Physical Object counts (#Obj3D,#Obj2D,#Obj1D,#Obj0D)488{489in >> numObj3D;490userdata_int.Append(numObj3D);491in >> numObj2D;492userdata_int.Append(numObj2D);493in >> numObj1D;494userdata_int.Append(numObj1D);495in >> numObj0D;496userdata_int.Append(numObj0D);497}498break;499500case 25:501// Number of Ports (Ports are a subset of Object2D list)502{503in >> dummyint;504//userdata_int.Append(dummyint);505}506break;507508case 26:509// Object3D GroupID, #Elems <immediately followed by> ElemID List510{511uid_to_group_3D.SetSize(maxId3D+1);512uid_to_group_3D = -1;513for(int i=0; i<numObj3D; i++)514{515int groupid;516in >> groupid;517(*testout) << "3d groupid " << groupid << endl;518//userdata_int.Append(groupid);519int nelems;520in >> nelems;521//userdata_int.Append(nelems);522for(int j=0; j<nelems; j++)523{524in >> dummyint;525526(*testout) << "read " << dummyint << endl;527//userdata_int.Append(dummyint);528529if(dummyint < 0)530dummyint *= -1;531uid_to_group_3D[eldom[dummyint-1]] = groupid;532}533}534}535break;536537case 27:538// Object2D GroupID, #Faces <immediately followed by> FaceID List539{540ARRAY<int> ports;541//int totnum = 0;542uid_to_group_2D.SetSize(maxId2D+1);543uid_to_group_2D = -1;544545for(int i=0; i<numObj2D; i++)546{547int groupid;548in >> groupid;549(*testout) << "2d groupid " << groupid << endl;550//userdata_int.Append(groupid);551int nelems;552in >> nelems;553//userdata_int.Append(nelems);554for(int j=0; j<nelems; j++)555{556in >> dummyint;557char port;558while((port = in.get()) == ' ')559;560561(*testout) << "read " << dummyint << endl;562if(dummyint < 0)563dummyint *= -1;564int uid = tris[dummyint-1]->GetIndex();565566if(port == 'P' || port == 'p')567{568if(!ports.Contains(uid))569ports.Append(uid);570}571else572in.putback(port);573574//userdata_int.Append(dummyint);575576uid_to_group_2D[uid] = groupid;577(*testout) << "setting " << uid << endl;578579//totnum++;580}581}582mesh.SetUserData("TETmesh:ports",ports);583}584break;585586case 28:587// Object1D GroupID, #Edges <immediately followed by> EdgeID List588{589uid_to_group_1D.SetSize(maxId1D+1);590uid_to_group_1D = -1;591592for(int i=0; i<numObj1D; i++)593{594int groupid;595in >> groupid;596//userdata_int.Append(groupid);597int nelems;598in >> nelems;599//userdata_int.Append(nelems);600for(int j=0; j<nelems; j++)601{602in >> dummyint;603//userdata_int.Append(dummyint);604605if(dummyint < 0)606dummyint *= -1;607uid_to_group_1D[(*segmentdata[dummyint-1])[2]] = groupid;608}609}610}611break;612613case 29:614// Object0D GroupID, #Nodes <immediately followed by> NodeID List615{616uid_to_group_0D.SetSize(maxId0D+1);617uid_to_group_0D = -1;618for(int i=0; i<numObj0D; i++)619{620int groupid;621in >> groupid;622//userdata_int.Append(groupid);623int nelems;624in >> nelems;625//userdata_int.Append(nelems);626for(int j=0; j<nelems; j++)627{628in >> dummyint;629//userdata_int.Append(dummyint);630631if(dummyint < 0)632dummyint *= -1;633uid_to_group_0D[point_pids[dummyint-1]] = groupid;634}635}636}637break;638639640641default:642done = true;643644}645646if(inputsection == 4 && version == "1.1")647inputsection++;648649inputsection++;650}651in.close();652653654mesh.SetUserData("TETmesh:double",userdata_double);655userdata_int.Append(minId2D);656userdata_int.Append(minId3D);657mesh.SetUserData("TETmesh:int",userdata_int);658//if(version == "1.1")659mesh.SetUserData("TETmesh:point_id",point_pids);660661mesh.SetUserData("TETmesh:uid_to_group_3D",uid_to_group_3D);662mesh.SetUserData("TETmesh:uid_to_group_2D",uid_to_group_2D);663mesh.SetUserData("TETmesh:uid_to_group_1D",uid_to_group_1D);664mesh.SetUserData("TETmesh:uid_to_group_0D",uid_to_group_0D);665666667ARRAY<SurfaceElementIndex> surfindices(tris.Size());668surfindices = -1;669670for(int i=0; i<tris.Size(); i++)671{672if(atof(version.c_str()) <= 1.999999)673{674if(tris[i]->GetIndex() > 0)675surfindices[i] = mesh.AddSurfaceElement(*tris[i]);676}677else678{679if(tris[i]->GetIndex() > 0 &&680tris[i]->GetIndex() < minId3D)681{682tris[i]->SetIndex(tris[i]->GetIndex()-minId2D+1);683surfindices[i] = mesh.AddSurfaceElement(*tris[i]);684}685}686delete tris[i];687}688689690mesh.ClearFaceDescriptors();691if(atof(version.c_str()) <= 1.999999)692for(int i = 1; i <= maxId2D; i++)693mesh.AddFaceDescriptor(FaceDescriptor(i,0,0,0));694else695for(int i=minId2D; i<minId3D; i++)696mesh.AddFaceDescriptor(FaceDescriptor(i,0,0,0));697698699for(int i=0; i<tetfacedata.Size(); i+=9)700{701for(int j=0; j<4; j++)702{703SurfaceElementIndex surf = surfindices[tetfacedata[i+2*j]];704705//if(mesh.GetNSE() <= surf)706if(surf == -1)707continue;708709if(tetfacedata[i+2*j+1] == 1)710mesh.GetFaceDescriptor(mesh[surf].GetIndex()).SetDomainOut(tetfacedata[i+8]);711else712mesh.GetFaceDescriptor(mesh[surf].GetIndex()).SetDomainIn(tetfacedata[i+8]);713714715/*716int faceind = 0;717for(int k=1; k<=mesh.GetNFD(); k++)718{719if(mesh.GetFaceDescriptor(k).SurfNr() == mesh[surf].GetIndex())720faceind = k;721}722if(faceind)723{724if(tetfacedata[i+4+j] == 1)725mesh.GetFaceDescriptor(faceind).SetDomainOut(tetfacedata[i+8]);726else727mesh.GetFaceDescriptor(faceind).SetDomainIn(tetfacedata[i+8]);728}729else730{731if(tetfacedata[i+4+j] == 1)732faceind = mesh.AddFaceDescriptor(FaceDescriptor(mesh[surf].GetIndex(),0,tetfacedata[i+8],0));733else734faceind = mesh.AddFaceDescriptor(FaceDescriptor(mesh[surf].GetIndex(),tetfacedata[i+8],0,0));735mesh.GetFaceDescriptor(faceind).SetBCProperty(mesh[surf].GetIndex());736}737*/738}739740}741742// ARRAY<int> indextodescriptor(maxId2D+1);743744// for(int i=1; i<=mesh.GetNFD(); i++)745// indextodescriptor[mesh.GetFaceDescriptor(i).SurfNr()] = i;746747748// for(SurfaceElementIndex i=0; i<mesh.GetNSE(); i++)749// mesh[i].SetIndex(indextodescriptor[mesh[i].GetIndex()]);750751752for(int i=0; i<segmentdata.Size(); i++)753{754Segment seg;755756757if((atof(version.c_str()) <= 1.999999 && (*segmentdata[i])[2] > 0) ||758(atof(version.c_str()) > 1.999999 && (*segmentdata[i])[2] > 0 && (*segmentdata[i])[2] < minId2D))759{760seg.p1 = (*segmentdata[i])[0];761seg.p2 = (*segmentdata[i])[1];762seg.edgenr = (*segmentdata[i])[2];763seg.epgeominfo[0].edgenr = (*segmentdata[i])[2];764seg.epgeominfo[1].edgenr = (*segmentdata[i])[2];765seg.si = (*segmentdata[i])[3]-minId2D+1;766seg.surfnr1 = -1;//(*segmentdata[i])[3];767seg.surfnr2 = -1;//(*segmentdata[i])[4];768seg.geominfo[0].trignum = (*segmentdata[i])[5];769seg.geominfo[1].trignum = (*segmentdata[i])[5];770mesh.AddSegment(seg);771772seg.p1 = (*segmentdata[i])[1];773seg.p2 = (*segmentdata[i])[0];774seg.si = (*segmentdata[i])[4]-minId2D+1;775seg.surfnr1 = -1;//(*segmentdata[i])[3];776seg.surfnr2 = -1;//(*segmentdata[i])[4];777seg.geominfo[0].trignum = (*segmentdata[i])[6];778seg.geominfo[1].trignum = (*segmentdata[i])[6];779mesh.AddSegment(seg);780}781delete segmentdata[i];782}783784/*785for(int i=mesh.GetNSeg(); i>=1; i--)786if(mesh.LineSegment(i).epgeominfo[0].edgenr == 0 ||787mesh.LineSegment(i).epgeominfo[1].edgenr == 0)788mesh.FullDeleteSegment(i);789*/790791mesh.CalcSurfacesOfNode();792793}794}795796797798799