Path: blob/devel/ElmerGUI/netgen/libsrc/interface/wuchemnitz.cpp
3206 views
// Write Chemnitz file format123#include <mystdlib.h>45#include <myadt.hpp>67#include <linalg.hpp>8#include <csg.hpp>9#include <meshing.hpp>1011namespace netgen12{1314class POINT3D15{16public:17POINT3D () { };18double x, y, z;19};2021class VOLELEMENT22{23public:24VOLELEMENT () {};25int domnr, p1, p2, p3, p4;26int faces[4];27};2829class SURFELEMENT30{31public:32SURFELEMENT () { };33int snr, p1, p2, p3;34};353637class FACE38{39public:40FACE () { };41int p1, p2, p3;42int edges[3];43};4445class EDGE46{47public:48EDGE () { };49int p1, p2;50};5152static ARRAY<POINT3D> points;53static ARRAY<VOLELEMENT> volelements;54static ARRAY<SURFELEMENT> surfelements;5556static ARRAY<FACE> faces;57static ARRAY<EDGE> edges;585960void ReadFile (char * filename)61{62int i, n;63ifstream infile(filename);64char reco[100];656667infile >> reco; // file format recognition6869infile >> n; // number of surface elements70cout << n << " Surface elements" << endl;7172for (i = 1; i <= n; i++)73{74SURFELEMENT sel;75infile >> sel.snr >> sel.p1 >> sel.p2 >> sel.p3;76surfelements.Append (sel);77}7879infile >> n; // number of volume elements80cout << n << " Volume elements" << endl;8182for (i = 1; i <= n; i++)83{84VOLELEMENT el;85infile >> el.p1 >> el.p2 >> el.p3 >> el.p4;86volelements.Append (el);87}8889infile >> n; // number of points90cout << n << " Points" << endl;9192for (i = 1; i <= n; i++)93{94POINT3D p;95infile >> p.x >> p.y >> p.z;96points.Append (p);97}98}99100101102void ReadFileMesh (const Mesh & mesh)103{104int i, n;105106n = mesh.GetNSE(); // number of surface elements107cout << n << " Surface elements" << endl;108109for (i = 1; i <= n; i++)110{111SURFELEMENT sel;112const Element2d & el = mesh.SurfaceElement(i);113sel.snr = el.GetIndex();114sel.p1 = el.PNum(1);115sel.p2 = el.PNum(2);116sel.p3 = el.PNum(3);117surfelements.Append (sel);118}119120n = mesh.GetNE(); // number of volume elements121cout << n << " Volume elements" << endl;122123for (i = 1; i <= n; i++)124{125VOLELEMENT el;126const Element & nel = mesh.VolumeElement(i);127el.p1 = nel.PNum(1);128el.p2 = nel.PNum(2);129el.p3 = nel.PNum(3);130el.p4 = nel.PNum(4);131// infile >> el.p1 >> el.p2 >> el.p3 >> el.p4;132volelements.Append (el);133}134135n = mesh.GetNP(); // number of points136cout << n << " Points" << endl;137138for (i = 1; i <= n; i++)139{140POINT3D p;141Point3d mp = mesh.Point(i);142p.x = mp.X();143p.y = mp.Y();144p.z = mp.Z();145// infile >> p.x >> p.y >> p.z;146points.Append (p);147}148}149150151152153void Convert ()154{155int i, j, facei, edgei;156INDEX_3 i3;157INDEX_2 i2;158159INDEX_3_HASHTABLE<int> faceindex(volelements.Size()/5 + 1);160INDEX_2_HASHTABLE<int> edgeindex(volelements.Size()/5 + 1);161162for (i = 1; i <= volelements.Size(); i++)163{164for (j = 1; j <= 4; j++)165{166switch (j)167{168case 1:169i3.I1() = volelements.Get(i).p2;170i3.I2() = volelements.Get(i).p3;171i3.I3() = volelements.Get(i).p4;172break;173case 2:174i3.I1() = volelements.Get(i).p1;175i3.I2() = volelements.Get(i).p3;176i3.I3() = volelements.Get(i).p4;177break;178case 3:179i3.I1() = volelements.Get(i).p1;180i3.I2() = volelements.Get(i).p2;181i3.I3() = volelements.Get(i).p4;182break;183case 4:184i3.I1() = volelements.Get(i).p1;185i3.I2() = volelements.Get(i).p2;186i3.I3() = volelements.Get(i).p3;187break;188default:189i3.I1()=i3.I2()=i3.I3()=0;190}191i3.Sort();192if (faceindex.Used (i3))193facei = faceindex.Get(i3);194else195{196FACE fa;197fa.p1 = i3.I1();198fa.p2 = i3.I2();199fa.p3 = i3.I3();200facei = faces.Append (fa);201faceindex.Set (i3, facei);202}203204volelements.Elem(i).faces[j-1] = facei;205}206207}208209210for (i = 1; i <= faces.Size(); i++)211{212for (j = 1; j <= 3; j++)213{214switch (j)215{216case 1:217i2.I1() = faces.Get(i).p2;218i2.I2() = faces.Get(i).p3;219break;220case 2:221i2.I1() = faces.Get(i).p1;222i2.I2() = faces.Get(i).p3;223break;224case 3:225i2.I1() = faces.Get(i).p1;226i2.I2() = faces.Get(i).p2;227break;228default:229i2.I1()=i2.I2()=0;230}231if (i2.I1() > i2.I2()) swap (i2.I1(), i2.I2());232if (edgeindex.Used (i2))233edgei = edgeindex.Get(i2);234else235{236EDGE ed;237ed.p1 = i2.I1();238ed.p2 = i2.I2();239edgei = edges.Append (ed);240edgeindex.Set (i2, edgei);241}242243faces.Elem(i).edges[j-1] = edgei;244}245246}247248}249250251void WriteFile (ostream & outfile)252{253int i;254255outfile256<< "#VERSION: 1.0" << endl257<< "#PROGRAM: NETGEN" << endl258<< "#EQN_TYPE: POISSON" << endl259<< "#DIMENSION: 3D" << endl260<< "#DEG_OF_FREE: 1" << endl261<< "#DESCRIPTION: I don't know" << endl262<< "##RENUM: not done" << endl263<< "#USER: Kleinzen" << endl264<< "DATE: 10.06.1996" << endl;265266outfile << "#HEADER: 8" << endl267<< points.Size() << " " << edges.Size() << " "268<< faces.Size() << " " << volelements.Size() << " 0 0 0 0" << endl;269270outfile << "#VERTEX: " << points.Size() << endl;271for (i = 1; i <= points.Size(); i++)272outfile << " " << i << " " << points.Get(i).x << " " << points.Get(i).y273<< " " << points.Get(i).z << endl;274275outfile << "#EDGE: " << edges.Size() << endl;276for (i = 1; i <= edges.Size(); i++)277outfile << " " << i << " 1 "278<< edges.Get(i).p1 << " "279<< edges.Get(i).p2280<< " 0" << endl;281282outfile << "#FACE: " << faces.Size() << endl;283for (i = 1; i <= faces.Size(); i++)284outfile << " " << i << " 1 3 "285<< faces.Get(i).edges[0] << " "286<< faces.Get(i).edges[1] << " "287<< faces.Get(i).edges[2] << endl;288289outfile << "#SOLID: " << volelements.Size() << endl;290for (i = 1; i <= volelements.Size(); i++)291outfile << " " << i << " 1 4 "292<< volelements.Get(i).faces[0] << " "293<< volelements.Get(i).faces[1] << " "294<< volelements.Get(i).faces[2] << " "295<< volelements.Get(i).faces[3] << endl;296297outfile << "#END_OF_DATA" << endl;298}299300301void WriteUserChemnitz (const Mesh & mesh,302const string & filename)303{304ofstream outfile (filename.c_str());305306ReadFileMesh (mesh);307Convert ();308309WriteFile (outfile);310cout << "Wrote Chemnitz standard file" << endl;311}312}313314315