Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/interface/writeuser.cpp
3206 views
1
//
2
// Write user dependent output file
3
//
4
5
#include <mystdlib.h>
6
7
#include <myadt.hpp>
8
#include <linalg.hpp>
9
#include <csg.hpp>
10
#include <geometry2d.hpp>
11
#include <meshing.hpp>
12
13
namespace netgen
14
{
15
#include "writeuser.hpp"
16
17
18
void RegisterUserFormats (ARRAY<const char*> & names)
19
{
20
const char *types[] =
21
{
22
"Neutral Format",
23
"Surface Mesh Format" ,
24
"DIFFPACK Format",
25
"TecPlot Format",
26
"Tochnog Format",
27
"Abaqus Format",
28
"Fluent Format",
29
"Permas Format",
30
"FEAP Format",
31
"Elmer Format",
32
"STL Format",
33
"VRML Format",
34
"Gmsh Format",
35
"JCMwave Format",
36
"TET Format",
37
// { "Chemnitz Format" },
38
0
39
};
40
41
for (int i = 0; types[i]; i++)
42
names.Append (types[i]);
43
}
44
45
46
47
bool WriteUserFormat (const string & format,
48
const Mesh & mesh,
49
const CSGeometry & geom,
50
const string & filename)
51
{
52
PrintMessage (1, "Export mesh to file ", filename,
53
", format is ", format);
54
55
if (format == "Neutral Format")
56
WriteNeutralFormat (mesh, geom, filename);
57
58
else if (format == "Surface Mesh Format")
59
WriteSurfaceFormat (mesh, filename);
60
61
else if (format == "DIFFPACK Format")
62
WriteDiffPackFormat (mesh, geom, filename);
63
64
else if (format == "Tochnog Format")
65
WriteTochnogFormat (mesh, filename);
66
67
else if (format == "TecPlot Format")
68
cerr << "ERROR: TecPlot format currently out of order" << endl;
69
// WriteTecPlotFormat (mesh, geom, filename);
70
71
else if (format == "Abaqus Format")
72
WriteAbaqusFormat (mesh, filename);
73
74
else if (format == "Fluent Format")
75
WriteFluentFormat (mesh, filename);
76
77
else if (format == "Permas Format")
78
WritePermasFormat (mesh, filename);
79
80
else if (format == "FEAP Format")
81
WriteFEAPFormat (mesh, filename);
82
83
else if (format == "Elmer Format")
84
WriteElmerFormat (mesh, filename);
85
86
else if (format == "STL Format")
87
WriteSTLFormat (mesh, filename);
88
89
else if (format == "VRML Format")
90
WriteVRMLFormat (mesh, 1, filename);
91
92
else if (format == "Fepp Format")
93
WriteFEPPFormat (mesh, geom, filename);
94
95
else if (format == "EdgeElement Format")
96
WriteEdgeElementFormat (mesh, geom, filename);
97
98
else if (format == "Chemnitz Format")
99
WriteUserChemnitz (mesh, filename);
100
101
else if (format == "Gmsh Format")
102
WriteGmshFormat (mesh, geom, filename);
103
104
else if (format == "JCMwave Format")
105
WriteJCMFormat (mesh, geom, filename);
106
107
#ifdef OLIVER
108
else if (format == "TET Format")
109
WriteTETFormat( mesh, filename);//, "High Frequency" );
110
#endif
111
112
else
113
{
114
return 1;
115
}
116
117
return 0;
118
}
119
120
121
122
123
/*
124
* Neutral mesh format
125
* points, elements, surface elements
126
*/
127
128
void WriteNeutralFormat (const Mesh & mesh,
129
const CSGeometry & geom,
130
const string & filename)
131
{
132
cout << "write neutral, new" << endl;
133
int np = mesh.GetNP();
134
int ne = mesh.GetNE();
135
int nse = mesh.GetNSE();
136
int nseg = mesh.GetNSeg();
137
int i, j;
138
139
int inverttets = mparam.inverttets;
140
int invertsurf = mparam.inverttrigs;
141
142
ofstream outfile (filename.c_str());
143
144
outfile.precision(6);
145
outfile.setf (ios::fixed, ios::floatfield);
146
outfile.setf (ios::showpoint);
147
148
outfile << np << "\n";
149
150
for (i = 1; i <= np; i++)
151
{
152
const Point3d & p = mesh.Point(i);
153
154
outfile.width(10);
155
outfile << p.X() << " ";
156
outfile.width(9);
157
outfile << p.Y() << " ";
158
if (mesh.GetDimension() == 3)
159
{
160
outfile.width(9);
161
outfile << p.Z();
162
}
163
outfile << "\n";
164
}
165
166
if (mesh.GetDimension() == 3)
167
{
168
outfile << ne << "\n";
169
for (i = 1; i <= ne; i++)
170
{
171
Element el = mesh.VolumeElement(i);
172
if (inverttets)
173
el.Invert();
174
outfile.width(4);
175
outfile << el.GetIndex() << " ";
176
for (j = 1; j <= el.GetNP(); j++)
177
{
178
outfile << " ";
179
outfile.width(8);
180
outfile << el.PNum(j);
181
}
182
outfile << "\n";
183
}
184
}
185
186
outfile << nse << "\n";
187
for (i = 1; i <= nse; i++)
188
{
189
Element2d el = mesh.SurfaceElement(i);
190
if (invertsurf)
191
el.Invert();
192
outfile.width(4);
193
outfile << mesh.GetFaceDescriptor (el.GetIndex()).BCProperty() << " ";
194
for (j = 1; j <= el.GetNP(); j++)
195
{
196
outfile << " ";
197
outfile.width(8);
198
outfile << el.PNum(j);
199
}
200
outfile << "\n";
201
}
202
203
204
if (mesh.GetDimension() == 2)
205
{
206
outfile << nseg << "\n";
207
for (i = 1; i <= nseg; i++)
208
{
209
const Segment & seg = mesh.LineSegment(i);
210
outfile.width(4);
211
outfile << seg.si << " ";
212
213
outfile << " ";
214
outfile.width(8);
215
outfile << seg.p1;
216
outfile << " ";
217
outfile.width(8);
218
outfile << seg.p2;
219
220
outfile << "\n";
221
}
222
}
223
}
224
225
226
227
228
229
230
231
232
233
void WriteSurfaceFormat (const Mesh & mesh,
234
const string & filename)
235
{
236
// surface mesh
237
int i, j;
238
239
cout << "Write Surface Mesh" << endl;
240
241
ofstream outfile (filename.c_str());
242
243
outfile << "surfacemesh" << endl;
244
245
outfile << mesh.GetNP() << endl;
246
for (i = 1; i <= mesh.GetNP(); i++)
247
{
248
for (j = 0; j < 3; j++)
249
{
250
outfile.width(10);
251
outfile << mesh.Point(i)(j) << " ";
252
}
253
outfile << endl;
254
}
255
outfile << mesh.GetNSE() << endl;
256
for (i = 1; i <= mesh.GetNSE(); i++)
257
{
258
for (j = 1; j <= 3; j++)
259
{
260
outfile.width(8);
261
outfile << mesh.SurfaceElement(i).PNum(j);
262
}
263
outfile << endl;
264
}
265
}
266
267
268
269
270
271
/*
272
* save surface mesh as STL file
273
*/
274
275
void WriteSTLFormat (const Mesh & mesh,
276
const string & filename)
277
{
278
cout << "\nWrite STL Surface Mesh" << endl;
279
280
ofstream outfile (filename.c_str());
281
282
int i;
283
284
outfile.precision(10);
285
286
outfile << "solid" << endl;
287
288
for (i = 1; i <= mesh.GetNSE(); i++)
289
{
290
outfile << "facet normal ";
291
const Point3d& p1 = mesh.Point(mesh.SurfaceElement(i).PNum(1));
292
const Point3d& p2 = mesh.Point(mesh.SurfaceElement(i).PNum(2));
293
const Point3d& p3 = mesh.Point(mesh.SurfaceElement(i).PNum(3));
294
295
Vec3d normal = Cross(p2-p1,p3-p1);
296
if (normal.Length() != 0)
297
{
298
normal /= (normal.Length());
299
}
300
301
outfile << normal.X() << " " << normal.Y() << " " << normal.Z() << "\n";
302
outfile << "outer loop\n";
303
304
outfile << "vertex " << p1.X() << " " << p1.Y() << " " << p1.Z() << "\n";
305
outfile << "vertex " << p2.X() << " " << p2.Y() << " " << p2.Z() << "\n";
306
outfile << "vertex " << p3.X() << " " << p3.Y() << " " << p3.Z() << "\n";
307
308
outfile << "endloop\n";
309
outfile << "endfacet\n";
310
}
311
outfile << "endsolid" << endl;
312
}
313
314
315
316
317
318
/*
319
*
320
* write surface mesh as VRML file
321
*
322
*/
323
324
void WriteVRMLFormat (const Mesh & mesh,
325
bool faces,
326
const string & filename)
327
{
328
329
if (faces)
330
331
{
332
// Output in VRML, IndexedFaceSet is used
333
// Bartosz Sawicki <[email protected]>
334
335
int np = mesh.GetNP();
336
int nse = mesh.GetNSE();
337
int i, j;
338
339
ofstream outfile (filename.c_str());
340
341
outfile.precision(6);
342
outfile.setf (ios::fixed, ios::floatfield);
343
outfile.setf (ios::showpoint);
344
345
outfile << "#VRML V2.0 utf8 \n"
346
"Background {\n"
347
" skyColor [1 1 1]\n"
348
" groundColor [1 1 1]\n"
349
"}\n"
350
"Group{ children [\n"
351
"Shape{ \n"
352
"appearance Appearance { material Material { }} \n"
353
"geometry IndexedFaceSet { \n"
354
"coord Coordinate { point [ \n";
355
356
357
for (i = 1; i <= np; i++)
358
{
359
const Point3d & p = mesh.Point(i);
360
outfile.width(10);
361
outfile << p.X() << " ";
362
outfile << p.Y() << " ";
363
outfile << p.Z() << " \n";
364
}
365
366
outfile << " ] } \n"
367
"coordIndex [ \n";
368
369
for (i = 1; i <= nse; i++)
370
{
371
const Element2d & el = mesh.SurfaceElement(i);
372
373
for (j = 1; j <= 3; j++)
374
{
375
outfile.width(8);
376
outfile << el.PNum(j)-1;
377
}
378
outfile << " -1 \n";
379
}
380
381
outfile << " ] \n";
382
383
//define number and RGB definitions of colors
384
outfile << "color Color { color [1 0 0, 0 1 0, 0 0 1, 1 1 0]} \n"
385
"colorIndex [\n";
386
387
for (i = 1; i <= nse; i++)
388
{
389
outfile << mesh.GetFaceDescriptor(mesh.SurfaceElement(i).GetIndex ()).BCProperty();
390
outfile << endl;
391
}
392
393
outfile << " ] \n"
394
"colorPerVertex FALSE \n"
395
"creaseAngle 0 \n"
396
"solid FALSE \n"
397
"ccw FALSE \n"
398
"convex TRUE \n"
399
"} } # end of Shape\n"
400
"] }\n";
401
402
} /* end of VRMLFACES */
403
404
405
else
406
407
{
408
// Output in VRML, IndexedLineSet is used
409
// Bartosz Sawicki <[email protected]>
410
411
int np = mesh.GetNP();
412
int nse = mesh.GetNSE();
413
int i, j;
414
415
ofstream outfile (filename.c_str());
416
417
outfile.precision(6);
418
outfile.setf (ios::fixed, ios::floatfield);
419
outfile.setf (ios::showpoint);
420
421
outfile << "#VRML V2.0 utf8 \n"
422
"Background {\n"
423
" skyColor [1 1 1]\n"
424
" groundColor [1 1 1]\n"
425
"}\n"
426
"Group{ children [\n"
427
"Shape{ \n"
428
"appearance Appearance { material Material { }} \n"
429
"geometry IndexedLineSet { \n"
430
"coord Coordinate { point [ \n";
431
432
433
for (i = 1; i <= np; i++)
434
{
435
const Point3d & p = mesh.Point(i);
436
outfile.width(10);
437
outfile << p.X() << " ";
438
outfile << p.Y() << " ";
439
outfile << p.Z() << " \n";
440
}
441
442
outfile << " ] } \n"
443
"coordIndex [ \n";
444
445
for (i = 1; i <= nse; i++)
446
{
447
const Element2d & el = mesh.SurfaceElement(i);
448
449
for (j = 1; j <= 3; j++)
450
{
451
outfile.width(8);
452
outfile << el.PNum(j)-1;
453
}
454
outfile.width(8);
455
outfile << el.PNum(1)-1;
456
outfile << " -1 \n";
457
}
458
459
outfile << " ] \n";
460
461
/* Uncomment if you want color mesh
462
outfile << "color Color { color [1 1 1, 0 1 0, 0 0 1, 1 1 0]} \n"
463
"colorIndex [\n";
464
465
for (i = 1; i <= nse; i++)
466
{
467
outfile << mesh.GetFaceDescriptor(mesh.SurfaceElement(i).GetIndex ()).BCProperty();
468
outfile << endl;
469
}
470
471
outfile << " ] \n"
472
*/
473
outfile << "colorPerVertex FALSE \n"
474
"} } #end of Shape\n"
475
"] } \n";
476
477
}
478
479
}
480
481
482
483
484
485
486
/*
487
* FEPP .. a finite element package developed at University Linz, Austria
488
*/
489
void WriteFEPPFormat (const Mesh & mesh,
490
const CSGeometry & geom,
491
const string & filename)
492
{
493
494
ofstream outfile (filename.c_str());
495
496
if (mesh.GetDimension() == 3)
497
498
{
499
500
// output for FEPP
501
502
int np = mesh.GetNP();
503
int ne = mesh.GetNE();
504
int nse = mesh.GetNSE();
505
int ns = mesh.GetNFD();
506
int i, j;
507
508
outfile.precision(5);
509
outfile.setf (ios::fixed, ios::floatfield);
510
outfile.setf (ios::showpoint);
511
512
outfile << "volumemesh4" << endl;
513
outfile << nse << endl;
514
for (i = 1; i <= nse; i++)
515
{
516
const Element2d & el = mesh.SurfaceElement(i);
517
518
// int facenr = mesh.facedecoding.Get(el.GetIndex()).surfnr;
519
outfile.width(4);
520
outfile << el.GetIndex() << " ";
521
outfile.width(4);
522
// outfile << mesh.GetFaceDescriptor(el.GetIndex()).BCProperty() << " ";
523
outfile << mesh.GetFaceDescriptor(el.GetIndex()).BCProperty() << " ";
524
outfile.width(4);
525
outfile << el.GetNP() << " ";
526
for (j = 1; j <= el.GetNP(); j++)
527
{
528
outfile.width(8);
529
outfile << el.PNum(j);
530
}
531
outfile << "\n";
532
}
533
534
535
outfile << ne << "\n";
536
for (i = 1; i <= ne; i++)
537
{
538
const Element & el = mesh.VolumeElement(i);
539
outfile.width(4);
540
outfile << el.GetIndex() << " ";
541
outfile.width(4);
542
outfile << el.GetNP() << " ";
543
for (j = 1; j <= el.GetNP(); j++)
544
{
545
outfile.width(8);
546
outfile << el.PNum(j);
547
}
548
outfile << "\n";
549
}
550
551
outfile << np << "\n";
552
for (i = 1; i <= np; i++)
553
{
554
const Point3d & p = mesh.Point(i);
555
556
outfile.width(10);
557
outfile << p.X() << " ";
558
outfile.width(9);
559
outfile << p.Y() << " ";
560
outfile.width(9);
561
outfile << p.Z() << "\n";
562
}
563
564
/*
565
if (typ == WRITE_FEPPML)
566
{
567
int nbn = mesh.mlbetweennodes.Size();
568
outfile << nbn << "\n";
569
for (i = 1; i <= nbn; i++)
570
outfile << mesh.mlbetweennodes.Get(i).I1() << " "
571
<< mesh.mlbetweennodes.Get(i).I2() << "\n";
572
573
574
// int ncon = mesh.connectedtonode.Size();
575
// outfile << ncon << "\n";
576
// for (i = 1; i <= ncon; i++)
577
// outfile << i << " " << mesh.connectedtonode.Get(i) << endl;
578
}
579
*/
580
581
582
// write CSG surfaces
583
if (&geom && geom.GetNSurf() >= ns)
584
{
585
outfile << ns << endl;
586
for (i = 1; i <= ns; i++)
587
geom.GetSurface(mesh.GetFaceDescriptor(i).SurfNr())->Print(outfile);
588
}
589
else
590
outfile << "0" << endl;
591
}
592
593
594
else
595
596
{ // 2D fepp format
597
598
;
599
/*
600
extern SplineGeometry2d * geometry2d;
601
if (geometry2d)
602
Save2DMesh (mesh, &geometry2d->GetSplines(), outfile);
603
else
604
Save2DMesh (mesh, 0, outfile);
605
*/
606
}
607
}
608
609
610
611
612
613
614
/*
615
* Edge element mesh format
616
* points, elements, edges
617
*/
618
619
void WriteEdgeElementFormat (const Mesh & mesh,
620
const CSGeometry & geom,
621
const string & filename)
622
{
623
cout << "write edge element format" << endl;
624
625
const MeshTopology * top = &mesh.GetTopology();
626
int npoints = mesh.GetNP();
627
int nelements = mesh.GetNE();
628
int nsurfelem = mesh.GetNSE();
629
int nedges = top->GetNEdges();
630
int i, j;
631
632
int inverttets = mparam.inverttets;
633
int invertsurf = mparam.inverttrigs;
634
ARRAY<int> edges;
635
636
ofstream outfile (filename.c_str());
637
638
outfile.precision(6);
639
outfile.setf (ios::fixed, ios::floatfield);
640
outfile.setf (ios::showpoint);
641
642
643
// vertices with coordinates
644
outfile << npoints << "\n";
645
for (i = 1; i <= npoints; i++)
646
{
647
const Point3d & p = mesh.Point(i);
648
649
outfile.width(10);
650
outfile << p.X() << " ";
651
outfile.width(9);
652
outfile << p.Y() << " ";
653
outfile.width(9);
654
outfile << p.Z() << "\n";
655
}
656
657
// element - edge - list
658
outfile << nelements << " " << nedges << "\n";
659
for (i = 1; i <= nelements; i++)
660
{
661
Element el = mesh.VolumeElement(i);
662
if (inverttets)
663
el.Invert();
664
outfile.width(4);
665
outfile << el.GetIndex() << " ";
666
outfile.width(8);
667
outfile << el.GetNP();
668
for (j = 1; j <= el.GetNP(); j++)
669
{
670
outfile << " ";
671
outfile.width(8);
672
outfile << el.PNum(j);
673
}
674
675
top->GetElementEdges(i,edges);
676
outfile << endl << " ";
677
outfile.width(8);
678
outfile << edges.Size();
679
for (j=1; j <= edges.Size(); j++)
680
{
681
outfile << " ";
682
outfile.width(8);
683
outfile << edges[j-1];
684
}
685
outfile << "\n";
686
687
// orientation:
688
top->GetElementEdgeOrientations(i,edges);
689
outfile << " ";
690
for (j=1; j <= edges.Size(); j++)
691
{
692
outfile << " ";
693
outfile.width(8);
694
outfile << edges[j-1];
695
}
696
outfile << "\n";
697
}
698
699
// surface element - edge - list (with boundary conditions)
700
outfile << nsurfelem << "\n";
701
for (i = 1; i <= nsurfelem; i++)
702
{
703
Element2d el = mesh.SurfaceElement(i);
704
if (invertsurf)
705
el.Invert();
706
outfile.width(4);
707
outfile << mesh.GetFaceDescriptor (el.GetIndex()).BCProperty() << " ";
708
outfile.width(8);
709
outfile << el.GetNP();
710
for (j = 1; j <= el.GetNP(); j++)
711
{
712
outfile << " ";
713
outfile.width(8);
714
outfile << el.PNum(j);
715
}
716
717
top->GetSurfaceElementEdges(i,edges);
718
outfile << endl << " ";
719
outfile.width(8);
720
outfile << edges.Size();
721
for (j=1; j <= edges.Size(); j++)
722
{
723
outfile << " ";
724
outfile.width(8);
725
outfile << edges[j-1];
726
}
727
outfile << "\n";
728
}
729
730
731
int v1, v2;
732
// edge - vertex - list
733
outfile << nedges << "\n";
734
for (i=1; i <= nedges; i++)
735
{
736
top->GetEdgeVertices(i,v1,v2);
737
outfile.width(4);
738
outfile << v1;
739
outfile << " ";
740
outfile.width(8);
741
outfile << v2 << endl;
742
}
743
}
744
745
746
747
748
749
750
751
752
753
#ifdef OLDSTYLE_WRITE
754
755
756
void WriteFile (int typ,
757
const Mesh & mesh,
758
const CSGeometry & geom,
759
const char * filename,
760
const char * geomfile,
761
double h)
762
{
763
764
765
int inverttets = mparam.inverttets;
766
int invertsurf = mparam.inverttrigs;
767
768
769
770
771
772
773
774
775
if (typ == WRITE_EDGEELEMENT)
776
{
777
// write edge element file
778
// Peter Harscher, ETHZ
779
780
cout << "Write Edge-Element Format" << endl;
781
782
ofstream outfile (filename);
783
784
int i, j;
785
int ned;
786
787
// hash table representing edges;
788
INDEX_2_HASHTABLE<int> edgeht(mesh.GetNP());
789
790
// list of edges
791
ARRAY<INDEX_2> edgelist;
792
793
// edge (point) on boundary ?
794
BitArray bedge, bpoint(mesh.GetNP());
795
796
static int eledges[6][2] = { { 1, 2 } , { 1, 3 } , { 1, 4 },
797
{ 2, 3 } , { 2, 4 } , { 3, 4 } };
798
799
// fill hashtable (point1, point2) ----> edgenr
800
for (i = 1; i <= mesh.GetNE(); i++)
801
{
802
const Element & el = mesh.VolumeElement (i);
803
INDEX_2 edge;
804
for (j = 1; j <= 6; j++)
805
{
806
edge.I1() = el.PNum (eledges[j-1][0]);
807
edge.I2() = el.PNum (eledges[j-1][1]);
808
edge.Sort();
809
810
if (!edgeht.Used (edge))
811
{
812
edgelist.Append (edge);
813
edgeht.Set (edge, edgelist.Size());
814
}
815
}
816
}
817
818
819
// set bedges, bpoints
820
bedge.SetSize (edgelist.Size());
821
bedge.Clear();
822
bpoint.Clear();
823
824
for (i = 1; i <= mesh.GetNSE(); i++)
825
{
826
const Element2d & sel = mesh.SurfaceElement(i);
827
for (j = 1; j <= 3; j++)
828
{
829
bpoint.Set (sel.PNum(j));
830
831
INDEX_2 edge;
832
edge.I1() = sel.PNum(j);
833
edge.I2() = sel.PNum(j%3+1);
834
edge.Sort();
835
836
bedge.Set (edgeht.Get (edge));
837
}
838
}
839
840
841
842
outfile << mesh.GetNE() << endl;
843
// write element ---> point
844
for (i = 1; i <= mesh.GetNE(); i++)
845
{
846
const Element & el = mesh.VolumeElement(i);
847
848
outfile.width(8);
849
outfile << i;
850
for (j = 1; j <= 4; j++)
851
{
852
outfile.width(8);
853
outfile << el.PNum(j);
854
}
855
outfile << endl;
856
}
857
858
// write element ---> edge
859
for (i = 1; i <= mesh.GetNE(); i++)
860
{
861
const Element & el = mesh.VolumeElement (i);
862
INDEX_2 edge;
863
for (j = 1; j <= 6; j++)
864
{
865
edge.I1() = el.PNum (eledges[j-1][0]);
866
edge.I2() = el.PNum (eledges[j-1][1]);
867
edge.Sort();
868
869
outfile.width(8);
870
outfile << edgeht.Get (edge);
871
}
872
outfile << endl;
873
}
874
875
// write points
876
outfile << mesh.GetNP() << endl;
877
outfile.precision (6);
878
for (i = 1; i <= mesh.GetNP(); i++)
879
{
880
const Point3d & p = mesh.Point(i);
881
882
for (j = 1; j <= 3; j++)
883
{
884
outfile.width(8);
885
outfile << p.X(j);
886
}
887
outfile << " "
888
<< (bpoint.Test(i) ? "1" : 0) << endl;
889
}
890
891
// write edges
892
outfile << edgelist.Size() << endl;
893
for (i = 1; i <= edgelist.Size(); i++)
894
{
895
outfile.width(8);
896
outfile << edgelist.Get(i).I1();
897
outfile.width(8);
898
outfile << edgelist.Get(i).I2();
899
outfile << " "
900
<< (bedge.Test(i) ? "1" : "0") << endl;
901
}
902
}
903
904
905
906
907
}
908
#endif
909
}
910
911
912