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