1 /*This function profiles the performance of the AHF datastructure */
2 #include <iostream>
3 #include <assert.h>
4 #include <time.h>
5 #include <vector>
6 #include "moab/Core.hpp"
7 #include "moab/Range.hpp"
8 #include "moab/MeshTopoUtil.hpp"
9 #include "moab/HalfFacetRep.hpp"
10 #include "../TestUtil.hpp"
11 #include "moab/CpuTimer.hpp"
12 
13 #ifdef MOAB_HAVE_MPI
14 #include "moab/ParallelComm.hpp"
15 #include "MBParallelConventions.h"
16 #include "moab/FileOptions.hpp"
17 #include "MBTagConventions.hpp"
18 #include "moab_mpi.h"
19 #endif
20 
21 using namespace moab;
22 
23 #ifdef MOAB_HAVE_MPI
24 std::string read_options;
25 #endif
26 
27 int number_tests_successful = 0;
28 int number_tests_failed = 0;
29 
30 struct query_time
31 {
32   double ds_construction;
33   double vertex_to_edges_total;
34   double vertex_to_edges_avg;
35   double edge_to_edges_total;
36   double edge_to_edges_avg;
37   double vertex_to_faces_total;
38   double vertex_to_faces_avg;
39   double edge_to_faces_total;
40   double edge_to_faces_avg;
41   double face_to_faces_total;
42   double face_to_faces_avg;
43   double face_to_edges_total;
44   double face_to_edges_avg;
45   double vertex_to_cells_total;
46   double vertex_to_cells_avg;
47   double edge_to_cells_total;
48   double edge_to_cells_avg;
49   double face_to_cells_total;
50   double face_to_cells_avg;
51   double cell_to_cells_total;
52   double cell_to_cells_avg;
53   double cell_to_edges_total;
54   double cell_to_edges_avg;
55   double cell_to_faces_total;
56   double cell_to_faces_avg;
57 };
58 
59 struct mesh_mem
60 {
61    unsigned long long total_storage[2];
62    unsigned long long amortized_total_storage[2];
63    unsigned long long entity_storage[2];
64    unsigned long long amortized_entity_storage[2];
65    unsigned long long adjacency_storage[2];
66    unsigned long long amortized_adjacency_storage[2];
67    unsigned long long tag_storage[2];
68    unsigned long long amortized_tag_storage[2];
69 };
70 
handle_error_code(ErrorCode rv,int & number_failed,int & number_successful)71 void handle_error_code(ErrorCode rv, int &number_failed, int &number_successful)
72 {
73   if (rv == MB_SUCCESS) {
74 #ifdef MOAB_HAVE_MPI
75       int rank = 0;
76       MPI_Comm_rank(MPI_COMM_WORLD, &rank);
77       if (rank==0)
78           std::cout << "Success";
79 #else
80       std::cout << "Success";
81 #endif
82     number_successful++;
83   } else {
84     std::cout << "Failure";
85     number_failed++;
86   }
87 }
88 
adj_perf(const char * filename)89 ErrorCode adj_perf(const char* filename)
90 {
91   ErrorCode error;
92   Core moab;
93   Interface* mbImpl = &moab;
94   MeshTopoUtil mtu(mbImpl);
95 
96   struct query_time qtime;
97   struct mesh_mem qmem;
98 
99 #ifdef MOAB_HAVE_MPI
100     int procs = 1;
101     MPI_Comm_size(MPI_COMM_WORLD, &procs);
102 
103     if (procs > 1){
104     read_options = "PARALLEL=READ_PART;PARTITION=PARALLEL_PARTITION;PARALLEL_RESOLVE_SHARED_ENTS";
105 
106     error = mbImpl->load_file(filename, 0, read_options.c_str());
107     CHECK_ERR(error);
108     }
109     else if (procs == 1) {
110 #endif
111     error = mbImpl->load_file(filename);
112     CHECK_ERR(error);
113 #ifdef MOAB_HAVE_MPI
114     }
115 #endif
116 
117     //Storage Costs before any call to adjacencies
118     unsigned long long sTotS, sTAS, sES, sAES, sAS, sAAS, sTS, sATS;
119     sTotS = sTAS = sES = sAES = sAS = sAAS = sTS = sATS = 0;
120     mbImpl->estimated_memory_use(NULL, 0, &sTotS, &sTAS, &sES, &sAES, &sAS, &sAAS, NULL, 0, &sTS, &sATS);
121 
122     qmem.total_storage[0] = sTotS;
123     qmem.amortized_total_storage[0] = sTAS;
124     qmem.entity_storage[0] = sES;
125     qmem.amortized_entity_storage[0] = sAES;
126     qmem.adjacency_storage[0] = sAS;
127     qmem.amortized_adjacency_storage[0] = sAAS;
128     qmem.tag_storage[0] = sTS;
129     qmem.amortized_tag_storage[0] = sATS;
130 
131 
132     //Create ranges for handles of explicit elements of the mixed mesh
133     Range verts, edges, faces, cells;
134     error = mbImpl->get_entities_by_dimension( 0, 0, verts);
135     error = mbImpl->get_entities_by_dimension( 0, 1, edges);
136     error = mbImpl->get_entities_by_dimension( 0, 2, faces);
137     error = mbImpl->get_entities_by_dimension( 0, 3, cells);
138 
139   int nverts = verts.size();
140   int nedges = edges.size();
141   int nfaces = faces.size();
142   int ncells = cells.size();
143 
144   std::cout<<"MESH SIZE :: "<<"NV = "<<nverts<<", NE = "<<nedges<<", NF = "<<nfaces<<", NC = "<<ncells<<std::endl;
145 
146   CpuTimer *mt = new CpuTimer;
147   double time_start, time_avg, time_total;
148 
149   //Perform queries
150   std::vector<EntityHandle> adjents;
151   Range ngbents;
152 
153   // This call should create all the necessary ahf maps or adjacency lists
154   time_start = mt->time_elapsed();
155   error = mbImpl->get_adjacencies( &*verts.begin(), 1, 1, false, adjents );
156   time_total = mt->time_elapsed() - time_start;
157   qtime.ds_construction = time_total;
158 
159   //1D Queries
160 
161   std::cout<<"1D QUERIES Start"<<std::endl;
162 
163   //IQ1: For every vertex, obtain incident edges
164   time_start = mt->time_elapsed();
165   for (Range::iterator i = verts.begin(); i != verts.end(); ++i) {
166     adjents.clear();
167     error = mbImpl->get_adjacencies( &*i, 1, 1, false, adjents);
168   }
169   time_total = mt->time_elapsed()-time_start;
170   time_avg = time_total/(double)verts.size();
171 
172   qtime.vertex_to_edges_total = time_total;
173   qtime.vertex_to_edges_avg = time_avg;
174 
175   //NQ1:  For every edge, obtain neighbor edges
176 #ifdef MOAB_HAVE_AHF
177   time_start = mt->time_elapsed();
178   for (Range::iterator i = edges.begin(); i != edges.end(); ++i) {
179     adjents.clear();
180     error = mbImpl->get_adjacencies( &*i, 1, 1, false, adjents);
181   }
182   time_total = mt->time_elapsed()-time_start;
183   time_avg = time_total/(double)edges.size();
184 #else
185   error = mtu.get_bridge_adjacencies( *edges.begin(), 0, 1, ngbents);
186   time_start = mt->time_elapsed();
187   for (Range::iterator i = edges.begin(); i != edges.end(); ++i) {
188       ngbents.clear();
189       error = mtu.get_bridge_adjacencies( *i, 0, 1, ngbents);
190   }
191   time_total = mt->time_elapsed()-time_start;
192   time_avg = time_total/(double)edges.size();
193 #endif
194 
195   qtime.edge_to_edges_total = time_total;
196   qtime.edge_to_edges_avg = time_avg;
197 
198   std::cout<<"1D QUERIES End"<<std::endl;
199 
200   // 2D Queries
201 
202   std::cout<<"2D QUERIES Start"<<std::endl;
203 
204   //IQ21: For every vertex, obtain incident faces
205   time_start = mt->time_elapsed();
206   for (Range::iterator i = verts.begin(); i != verts.end(); ++i) {
207     adjents.clear();
208     error = mbImpl->get_adjacencies( &*i, 1, 2, false, adjents);
209   }
210   time_total = mt->time_elapsed()-time_start;
211   time_avg = time_total/(double)verts.size();
212 
213   qtime.vertex_to_faces_total = time_total;
214   qtime.vertex_to_faces_avg = time_avg;
215 
216   //IQ22: For every edge, obtain incident faces
217   time_start = mt->time_elapsed();
218   for (Range::iterator i = edges.begin(); i != edges.end(); ++i) {
219     adjents.clear();
220     error = mbImpl->get_adjacencies( &*i, 1, 2, false, adjents);
221   }
222   time_total = mt->time_elapsed()-time_start;
223   time_avg = time_total/(double)edges.size();
224 
225   qtime.edge_to_faces_total = time_total;
226   qtime.edge_to_faces_avg = time_avg;
227 
228   //NQ2: For every face, obtain neighbor faces
229 #ifdef MOAB_HAVE_AHF
230   time_start = mt->time_elapsed();
231   for (Range::iterator i = faces.begin(); i != faces.end(); ++i) {
232       adjents.clear();
233     error = mbImpl->get_adjacencies( &*i, 1, 2, false, adjents);
234   }
235   time_total = mt->time_elapsed()-time_start;
236   time_avg = time_total/(double)faces.size();
237 #else
238   error = mtu.get_bridge_adjacencies( *faces.begin(), 1, 2, ngbents);
239   time_start = mt->time_elapsed();
240   for (Range::iterator i = faces.begin(); i != faces.end(); ++i) {
241       ngbents.clear();
242       error = mtu.get_bridge_adjacencies( *i, 1, 2, ngbents);
243   }
244   time_total = mt->time_elapsed()-time_start;
245   time_avg = time_total/(double)faces.size();
246 #endif
247 
248   qtime.face_to_faces_total = time_total;
249   qtime.face_to_faces_avg = time_avg;
250 
251   //DQ2: For every face, obtain its edges
252   time_start = mt->time_elapsed();
253   for (Range::iterator i = faces.begin(); i != faces.end(); ++i) {
254     adjents.clear();
255     error = mbImpl->get_adjacencies( &*i, 1, 1, false, adjents);
256   }
257   time_total = mt->time_elapsed()-time_start;
258   time_avg = time_total/(double)faces.size();
259 
260   qtime.face_to_edges_total = time_total;
261   qtime.face_to_edges_avg = time_avg;
262 
263   std::cout<<"2D QUERIES End"<<std::endl;
264 
265   // 3D Queries
266 
267   std::cout<<"3D QUERIES Start "<<std::endl;
268 
269   //IQ31: For every vertex, obtain incident cells
270   time_start = mt->time_elapsed();
271   for (Range::iterator i = verts.begin(); i != verts.end(); ++i) {
272       adjents.clear();
273       error = mbImpl->get_adjacencies(&*i, 1, 3, false, adjents);
274   }
275   time_total = mt->time_elapsed()-time_start;
276   time_avg = time_total/(double)verts.size();
277 
278   qtime.vertex_to_cells_total = time_total;
279   qtime.vertex_to_cells_avg = time_avg;
280 
281   // IQ 32: For every edge, obtain incident cells
282   time_start = mt->time_elapsed();
283   for (Range::iterator i = edges.begin(); i != edges.end(); ++i) {
284       adjents.clear();
285       error = mbImpl->get_adjacencies(&*i, 1, 3, false, adjents);
286   }
287   time_total = mt->time_elapsed()-time_start;
288   time_avg = time_total/(double)edges.size();
289 
290   qtime.edge_to_cells_total = time_total;
291   qtime.edge_to_cells_avg = time_avg;
292 
293   //IQ32: For every face, obtain incident cells
294   time_start = mt->time_elapsed();
295   for (Range::iterator i = faces.begin(); i != faces.end(); ++i) {
296       adjents.clear();
297       error = mbImpl->get_adjacencies(&*i, 1, 3, false, adjents);
298   }
299   time_total = mt->time_elapsed()-time_start;
300   time_avg = time_total/(double)faces.size();
301 
302   qtime.face_to_cells_total = time_total;
303   qtime.face_to_cells_avg = time_avg;
304 
305   //NQ3: For every cell, obtain neighbor cells
306 #ifdef MOAB_HAVE_AHF
307   time_start = mt->time_elapsed();
308   for (Range::iterator i = cells.begin(); i != cells.end(); ++i) {
309       adjents.clear();
310       error = mbImpl->get_adjacencies(&*i, 1, 3, false, adjents);
311   }
312   time_total = mt->time_elapsed()-time_start;
313   time_avg = time_total/(double)cells.size();
314 #else
315   error = mtu.get_bridge_adjacencies( *cells.begin(), 2, 3, ngbents);
316   time_start = mt->time_elapsed();
317   for (Range::iterator i = cells.begin(); i != cells.end(); ++i) {
318     ngbents.clear();
319     error = mtu.get_bridge_adjacencies( *i, 2, 3, ngbents);
320   }
321   time_total = mt->time_elapsed()-time_start;
322   time_avg = time_total/(double)cells.size();
323 #endif
324 
325   qtime.cell_to_cells_total = time_total;
326   qtime.cell_to_cells_avg = time_avg;
327 
328   //DQ31: For every cell, obtain its edges
329   time_start = mt->time_elapsed();
330   for (Range::iterator i = cells.begin(); i != cells.end(); ++i) {
331     adjents.clear();
332     error = mbImpl->get_adjacencies( &*i, 1, 1, false, adjents);
333   }
334   time_total = mt->time_elapsed()-time_start;
335   time_avg = time_total/(double)cells.size();
336 
337   qtime.cell_to_edges_total = time_total;
338   qtime.cell_to_edges_avg = time_avg;
339 
340   //DQ32: For every cell, obtain its faces
341   time_start = mt->time_elapsed();
342   for (Range::iterator i = cells.begin(); i != cells.end(); ++i) {
343     adjents.clear();
344     error = mbImpl->get_adjacencies( &*i, 1, 2, false, adjents);
345   }
346   time_total = mt->time_elapsed()-time_start;
347   time_avg = time_total/(double)cells.size();
348 
349   qtime.cell_to_faces_total = time_total;
350   qtime.cell_to_faces_avg = time_avg;
351 
352    std::cout<<"3D QUERIES End"<<std::endl;
353 
354   //Storage Costs after calling ahf deinitialize
355   unsigned long long eTotS, eTAS, eES, eAES, eAS, eAAS, eTS, eATS;
356   eTotS = eTAS = eES = eAES = eAS = eAAS = eTS = eATS = 0;
357   mbImpl->estimated_memory_use(NULL, 0, &eTotS, &eTAS, &eES, &eAES, &eAS, &eAAS, NULL, 0, &eTS, &eATS);
358 
359   qmem.total_storage[1] = eTotS;
360   qmem.amortized_total_storage[1] = eTAS;
361   qmem.entity_storage[1] = eES;
362   qmem.amortized_entity_storage[1] = eAES;
363   qmem.adjacency_storage[1] = eAS;
364   qmem.amortized_adjacency_storage[1] = eAAS;
365   qmem.tag_storage[1] = eTS;
366   qmem.amortized_tag_storage[1] = eATS;
367 
368   //Print times
369   std::cout<<std::endl;
370   std::cout<<" Data Structure Construction Time = "<<qtime.ds_construction<<" Secs"<<std::endl;
371   std::cout<<std::endl;
372   std::cout<<"Query times in Seconds"<<std::endl;
373 #ifdef MOAB_HAVE_AHF
374   std::cout<<"QUERY: Vertex -> Edges :: MOAB_AHF: Average time =  "<< qtime.vertex_to_edges_avg ;
375   std::cout<<", Total time = "<<qtime.vertex_to_edges_total<<std::endl;
376   std::cout<<std::endl;
377 #else
378   std::cout<<"QUERY: Vertex -> Edges :: MOAB: Average time =  "<<  qtime.vertex_to_edges_avg;
379   std::cout<<", Total time = "<<qtime.vertex_to_edges_total<<std::endl;
380   std::cout<<std::endl;
381 #endif
382 
383 #ifdef MOAB_HAVE_AHF
384   std::cout<<"QUERY: Edge -> Edges :: MOAB_AHF: Average time = "<<qtime.edge_to_edges_avg;
385   std::cout<<", Total time = "<<qtime.edge_to_edges_total<<std::endl;
386   std::cout<<std::endl;
387 #else
388   std::cout<<"QUERY: Edge -> Edges :: MOAB: Average time = "<<qtime.edge_to_edges_avg;
389   std::cout<<", Total time = "<<qtime.edge_to_edges_total<<std::endl;
390   std::cout<<std::endl;
391 #endif
392 
393 #ifdef MOAB_HAVE_AHF
394   std::cout<<"QUERY: Vertex -> Faces :: MOAB_AHF: Average time =  "<<qtime.vertex_to_faces_avg;
395   std::cout<<", Total time = "<<qtime.vertex_to_faces_total<<std::endl;
396   std::cout<<std::endl;
397 #else
398   std::cout<<"QUERY: Vertex -> Faces :: MOAB: Average time =  "<<qtime.vertex_to_faces_avg;
399   std::cout<<", Total time = "<<qtime.vertex_to_faces_total<<std::endl;
400   std::cout<<std::endl;
401 #endif
402 
403 #ifdef MOAB_HAVE_AHF
404   std::cout<<"QUERY: Edge -> Faces :: MOAB_AHF: Average time =  "<<qtime.edge_to_faces_avg;
405   std::cout<<", Total time = "<<qtime.edge_to_faces_total<<std::endl;
406   std::cout<<std::endl;
407 #else
408   std::cout<<"QUERY: Edge -> Faces :: MOAB: Average time =  "<<qtime.edge_to_faces_avg;
409   std::cout<<", Total time = "<<qtime.edge_to_faces_total<<std::endl;
410   std::cout<<std::endl;
411 #endif
412 
413 #ifdef MOAB_HAVE_AHF
414   std::cout<<"QUERY: Face -> Faces :: MOAB_AHF: Average time = "<< qtime.face_to_faces_avg;
415   std::cout<<", Total time = "<<qtime.face_to_faces_total<<std::endl;
416   std::cout<<std::endl;
417 #else
418   std::cout<<"QUERY: Face -> Faces :: MOAB: Average time = "<< qtime.face_to_faces_avg;
419   std::cout<<", Total time = "<<qtime.face_to_faces_total<<std::endl;
420   std::cout<<std::endl;
421 #endif
422 
423 #ifdef MOAB_HAVE_AHF
424   std::cout<<"QUERY: Face -> Edges :: MOAB_AHF: Average time =  "<<qtime.face_to_edges_avg;
425   std::cout<<", Total time = "<<qtime.face_to_edges_total<<std::endl;
426   std::cout<<std::endl;
427 #else
428   std::cout<<"QUERY: Face -> Edges :: MOAB: Average time =  "<<qtime.face_to_edges_avg;
429   std::cout<<", Total time = "<<qtime.face_to_edges_total<<std::endl;
430   std::cout<<std::endl;
431 #endif
432 
433 #ifdef MOAB_HAVE_AHF
434   std::cout<<"QUERY: Vertex -> Cells :: MOAB_AHF: Average time =  "<<qtime.vertex_to_cells_avg;
435   std::cout<<", Total time = "<<qtime.vertex_to_cells_total<<std::endl;
436   std::cout<<std::endl;
437 #else
438   std::cout<<"QUERY: Vertex -> Cells :: MOAB: Average time =  "<<qtime.vertex_to_cells_avg;
439   std::cout<<", Total time = "<<qtime.vertex_to_cells_total<<std::endl;
440   std::cout<<std::endl;
441 #endif
442 
443 #ifdef MOAB_HAVE_AHF
444   std::cout<<"QUERY: Edge -> Cells :: MOAB_AHF: Average time =  "<<qtime.edge_to_cells_avg;
445   std::cout<<", Total time = "<<qtime.edge_to_cells_total<<std::endl;
446   std::cout<<std::endl;
447 #else
448   std::cout<<"QUERY: Edge -> Cells :: MOAB: Average time =  "<<qtime.edge_to_cells_avg;
449   std::cout<<", Total time = "<<qtime.edge_to_cells_total<<std::endl;
450   std::cout<<std::endl;
451 #endif
452 
453 #ifdef MOAB_HAVE_AHF
454   std::cout<<"QUERY: Face -> Cells :: MOAB_AHF: Average time =  "<<qtime.face_to_cells_avg;
455   std::cout<<", Total time = "<<qtime.face_to_cells_total<<std::endl;
456   std::cout<<std::endl;
457 #else
458   std::cout<<"QUERY: Face -> Cells :: MOAB: Average time =  "<<qtime.face_to_cells_avg;
459   std::cout<<", Total time = "<<qtime.face_to_cells_total<<std::endl;
460   std::cout<<std::endl;
461 #endif
462 
463 #ifdef MOAB_HAVE_AHF
464   std::cout<<"QUERY: Cell -> Cells :: MOAB_AHF: Average time =  "<< qtime.cell_to_cells_avg;
465   std::cout<<", Total time = "<<qtime.cell_to_cells_total<<std::endl;
466   std::cout<<std::endl;
467 #else
468   std::cout<<"QUERY: Cell -> Cells :: MOAB: Average time =  "<< qtime.cell_to_cells_avg;
469   std::cout<<", Total time = "<<qtime.cell_to_cells_total<<std::endl;
470   std::cout<<std::endl;
471 #endif
472 
473 #ifdef MOAB_HAVE_AHF
474   std::cout<<"QUERY: Cell -> Edges :: MOAB_AHF: Average time =  "<<qtime.cell_to_edges_avg;
475   std::cout<<", Total time = "<<qtime.cell_to_edges_total<<std::endl;
476   std::cout<<std::endl;
477 #else
478   std::cout<<"QUERY: Cell -> Edges :: MOAB: Average time =  "<<qtime.cell_to_edges_avg;
479   std::cout<<", Total time = "<<qtime.cell_to_edges_total<<std::endl;
480   std::cout<<std::endl;
481 #endif
482 
483 #ifdef MOAB_HAVE_AHF
484   std::cout<<"QUERY: Cell -> Faces :: MOAB_AHF: Average time =  "<<qtime.cell_to_faces_avg;
485   std::cout<<", Total time = "<<qtime.cell_to_faces_total<<std::endl;
486   std::cout<<std::endl;
487 #else
488   std::cout<<"QUERY: Cell -> Faces :: MOAB: Average time =  "<<qtime.cell_to_faces_avg;
489   std::cout<<", Total time = "<<qtime.cell_to_faces_total<<std::endl;
490   std::cout<<std::endl;
491 #endif
492 
493 
494   //Print Storage
495   std::cout<<std::endl;
496   for (int i=0; i<2; i++){
497       if (i==0)
498         std::cout<<"STORAGE BEFORE CALLING ADJACENCIES"<<std::endl;
499       else
500         std::cout<<"STORAGE AFTER CALLING ADJACENCIES"<<std::endl;
501 
502       std::cout<<"Total storage = "<<qmem.total_storage[i]<<std::endl;
503       std::cout<<"Total amortized storage = "<<qmem.amortized_total_storage[i]<<std::endl;
504       std::cout<<std::endl;
505 
506       std::cout<<"Entity storage = "<<qmem.entity_storage[i]<<std::endl;
507       std::cout<<"Amortized entity storage = "<<qmem.amortized_entity_storage[i]<<std::endl;
508       std::cout<<std::endl;
509 
510       std::cout<<"Adjacency storage = "<<qmem.adjacency_storage[i]<<std::endl;
511       std::cout<<"Amortized adjacency storage = "<<qmem.amortized_adjacency_storage[i]<<std::endl;
512       std::cout<<std::endl;
513 
514       std::cout<<"Tag storage = "<<qmem.tag_storage[i]<<std::endl;
515       std::cout<<"Amortized tag storage = "<<qmem.amortized_tag_storage[i]<<std::endl;
516       std::cout<<std::endl;
517     }
518 
519   double total_time = qtime.vertex_to_edges_total+qtime.edge_to_edges_total+qtime.vertex_to_faces_total+qtime.edge_to_faces_total+qtime.face_to_faces_total+qtime.face_to_edges_total+qtime.vertex_to_cells_total+qtime.edge_to_cells_total+qtime.face_to_cells_total+qtime.cell_to_cells_total+qtime.cell_to_edges_total+qtime.cell_to_faces_total;
520 
521   //Print values in a line to aid data copying later
522   std::cout<<qtime.ds_construction<<"  "<<total_time<<"  "<<qmem.entity_storage[1]<<"  "<<qmem.adjacency_storage[1]<<"  "<<qtime.vertex_to_edges_avg<<"  "<<qtime.edge_to_edges_avg<<"  "<<qtime.vertex_to_faces_avg<<"  "<<qtime.edge_to_faces_avg<<"  "<<qtime.face_to_faces_avg<<"  "<<qtime.face_to_edges_avg<<"  "<<qtime.vertex_to_cells_avg<<"  "<<qtime.edge_to_cells_avg<<"  "<<qtime.face_to_cells_avg<<"  "<<qtime.cell_to_cells_avg<<"  "<<qtime.cell_to_edges_avg<<"  "<<qtime.cell_to_faces_avg<<std::endl;
523 
524   delete mt;
525   return MB_SUCCESS;
526 }
527 
main(int argc,char * argv[])528 int main(int argc, char *argv[])
529 {
530 
531 #ifdef MOAB_HAVE_MPI
532     MPI_Init(&argc, &argv);
533 
534     int nprocs, rank;
535     MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
536     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
537 #endif
538 
539     std::string filename;
540  #ifdef MOAB_HAVE_HDF5
541     filename = TestDir + "/32hex_ef.h5m";
542  #else
543     filename = TestDir + "/hexes_mixed.vtk";
544  #endif
545 
546     if (argc==1)
547     {
548 #ifdef MOAB_HAVE_MPI
549         if (rank == 0)
550             std::cout<<"Using default input file:"<<filename<<std::endl;
551 #else
552         std::cout<<"Using default input file:"<<filename<<std::endl;
553 #endif
554     }
555 
556     else if (argc==2)
557         filename = argv[1];
558     else {
559             std::cerr << "Usage: " << argv[0] << " [filename]" << std::endl;
560             return 1;
561     }
562 
563     ErrorCode result;
564 
565 #ifdef MOAB_HAVE_MPI
566     if (rank == 0)
567         std::cout<<" para_adj_perf: ";
568 #else
569     std::cout<<"adj_perf:";
570 #endif
571 
572     result = adj_perf(filename.c_str());
573     handle_error_code(result, number_tests_failed, number_tests_successful);
574     std::cout<<"\n";
575 
576 #ifdef MOAB_HAVE_MPI
577     MPI_Finalize();
578 #endif
579 
580     return number_tests_failed;
581 }
582 
583