20 #if !defined( _MSC_VER ) && !defined( __MINGW32__ )
21 #include <sys/resource.h>
26 extern "C" int getrusage(
int,
struct rusage* );
28 #include </usr/ucbinclude/sys/rusage.h>
32 #ifndef IS_BUILDING_MB
33 #define IS_BUILDING_MB
53 void testA(
const int nelem,
const double* coords );
54 void testB(
const int nelem,
const double* coords,
int* connect );
55 void testC(
const int nelem,
const double* coords );
56 void testD(
const int nelem,
const double* coords,
int ver );
57 void testE(
const int nelem,
const double* coords,
int* connect );
58 void print_time(
const bool print_em,
double& tot_time,
double& utime,
double& stime,
long& imem,
long& rmem );
68 if( MB_SUCCESS != result ) do \
70 std::cout << "FAIL in " << ( msg ) << std::endl; \
74 if( MB_SUCCESS != result ) do \
76 std::cout << "FAIL in " << ( msg ) << std::endl; \
80 void compute_edge(
double* start,
const int nelem,
const double xint,
const int stride )
82 for(
int i = 1; i < nelem; i++ )
84 start[i * stride] = start[0] + i * xint;
85 start[nelem + 1 + i * stride] = start[nelem + 1] + i * xint;
86 start[2 * ( nelem + 1 ) + i * stride] = start[2 * ( nelem + 1 )] + i * xint;
90 void compute_face(
double* a,
const int nelem,
const double xint,
const int stride1,
const int stride2 )
93 for(
int j = 1; j < nelem; j++ )
95 double tse = j * xint;
96 for(
int i = 1; i < nelem; i++ )
98 double ada = i * xint;
100 a[i * stride1 + j * stride2] =
101 ( 1.0 - ada ) * a[i * stride1] + ada * a[i * stride1 + nelem * stride2] +
102 ( 1.0 - tse ) * a[j * stride2] + tse * a[j * stride2 + nelem * stride1] -
103 ( 1.0 - tse ) * ( 1.0 - ada ) * a[0] - ( 1.0 - tse ) * ada * a[nelem * stride1] -
104 tse * ( 1.0 - ada ) * a[nelem * stride2] - tse * ada * a[nelem * ( stride1 + stride2 )];
105 a[nelem + 1 + i * stride1 + j * stride2] =
106 ( 1.0 - ada ) * a[nelem + 1 + i * stride1] + ada * a[nelem + 1 + i * stride1 + nelem * stride2] +
107 ( 1.0 - tse ) * a[nelem + 1 + j * stride2] + tse * a[nelem + 1 + j * stride2 + nelem * stride1] -
108 ( 1.0 - tse ) * ( 1.0 - ada ) * a[nelem + 1 + 0] -
109 ( 1.0 - tse ) * ada * a[nelem + 1 + nelem * stride1] -
110 tse * ( 1.0 - ada ) * a[nelem + 1 + nelem * stride2] -
111 tse * ada * a[nelem + 1 + nelem * ( stride1 + stride2 )];
112 a[2 * ( nelem + 1 ) + i * stride1 + j * stride2] =
113 ( 1.0 - ada ) * a[2 * ( nelem + 1 ) + i * stride1] +
114 ada * a[2 * ( nelem + 1 ) + i * stride1 + nelem * stride2] +
115 ( 1.0 - tse ) * a[2 * ( nelem + 1 ) + j * stride2] +
116 tse * a[2 * ( nelem + 1 ) + j * stride2 + nelem * stride1] -
117 ( 1.0 - tse ) * ( 1.0 - ada ) * a[2 * ( nelem + 1 ) + 0] -
118 ( 1.0 - tse ) * ada * a[2 * ( nelem + 1 ) + nelem * stride1] -
119 tse * ( 1.0 - ada ) * a[2 * ( nelem + 1 ) + nelem * stride2] -
120 tse * ada * a[2 * ( nelem + 1 ) + nelem * ( stride1 + stride2 )];
127 double ttime0 = 0.0, ttime1 = 0.0, utime1 = 0.0, stime1 = 0.0;
128 long imem = 0, rmem = 0;
129 print_time(
false, ttime0, utime1, stime1, imem, rmem );
131 int numv = nelem + 1;
132 int numv_sq = numv * numv;
133 int tot_numv = numv * numv * numv;
134 coords =
new double[3 * tot_numv];
137 #define VINDEX( i, j, k ) ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) )
139 double scale1, scale2, scale3;
177 int i000 =
VINDEX( 0, 0, 0 );
178 int ia00 =
VINDEX( nelem, 0, 0 );
179 int i0t0 =
VINDEX( 0, nelem, 0 );
180 int iat0 =
VINDEX( nelem, nelem, 0 );
181 int i00g =
VINDEX( 0, 0, nelem );
182 int ia0g =
VINDEX( nelem, 0, nelem );
183 int i0tg =
VINDEX( 0, nelem, nelem );
184 int iatg =
VINDEX( nelem, nelem, nelem );
188 int gammaInts = nelem;
190 for(
int i = 1; i < nelem; i++ )
192 for(
int j = 1; j < nelem; j++ )
194 for(
int k = 1; k < nelem; k++ )
197 double tse = i * scale1;
198 double ada = j * scale2;
199 double gamma = k * scale3;
200 double tm1 = 1.0 - tse;
201 double am1 = 1.0 - ada;
202 double gm1 = 1.0 - gamma;
204 cX = gm1 * ( am1 * ( tm1 * coords[i000] + tse * coords[i0t0] ) +
205 ada * ( tm1 * coords[ia00] + tse * coords[iat0] ) ) +
206 gamma * ( am1 * ( tm1 * coords[i00g] + tse * coords[i0tg] ) +
207 ada * ( tm1 * coords[ia0g] + tse * coords[iatg] ) );
209 cY = gm1 * ( am1 * ( tm1 * coords[i000] + tse * coords[i0t0] ) +
210 ada * ( tm1 * coords[ia00] + tse * coords[iat0] ) ) +
211 gamma * ( am1 * ( tm1 * coords[i00g] + tse * coords[i0tg] ) +
212 ada * ( tm1 * coords[ia0g] + tse * coords[iatg] ) );
214 cZ = gm1 * ( am1 * ( tm1 * coords[i000] + tse * coords[i0t0] ) +
215 ada * ( tm1 * coords[ia00] + tse * coords[iat0] ) ) +
216 gamma * ( am1 * ( tm1 * coords[i00g] + tse * coords[i0tg] ) +
217 ada * ( tm1 * coords[ia0g] + tse * coords[iatg] ) );
219 double* ai0k = &coords[
VINDEX( k, 0, i )];
220 double* aiak = &coords[
VINDEX( k, adaInts, i )];
221 double* a0jk = &coords[
VINDEX( k, j, 0 )];
222 double* atjk = &coords[
VINDEX( k, j, tseInts )];
223 double* aij0 = &coords[
VINDEX( 0, j, i )];
224 double* aijg = &coords[
VINDEX( gammaInts, j, i )];
226 coords[
VINDEX( i, j, k )] = ( am1 * ai0k[0] + ada * aiak[0] + tm1 * a0jk[0] + tse * atjk[0] +
227 gm1 * aij0[0] + gamma * aijg[0] ) /
231 coords[nelem + 1 +
VINDEX( i, j, k )] =
232 ( am1 * ai0k[nelem + 1] + ada * aiak[nelem + 1] + tm1 * a0jk[nelem + 1] + tse * atjk[nelem + 1] +
233 gm1 * aij0[nelem + 1] + gamma * aijg[nelem + 1] ) /
237 coords[2 * ( nelem + 1 ) +
VINDEX( i, j, k )] =
238 ( am1 * ai0k[2 * ( nelem + 1 )] + ada * aiak[2 * ( nelem + 1 )] + tm1 * a0jk[2 * ( nelem + 1 )] +
239 tse * atjk[2 * ( nelem + 1 )] + gm1 * aij0[2 * ( nelem + 1 )] +
240 gamma * aijg[2 * ( nelem + 1 )] ) /
248 for(
int i = 0; i < numv; i++ )
250 for(
int j = 0; j < numv; j++ )
252 for(
int k = 0; k < numv; k++ )
256 coords[idx] = i * scale1;
257 coords[tot_numv + idx] = j * scale2;
258 coords[2 * tot_numv + idx] = k * scale3;
263 print_time(
false, ttime1, utime1, stime1, imem, rmem );
271 int nume_tot = nelem * nelem * nelem;
272 connect =
new int[8 * nume_tot];
275 int numv = nelem + 1;
276 int numv_sq = numv * numv;
278 for(
int i = 0; i < nelem; i++ )
280 for(
int j = 0; j < nelem; j++ )
282 for(
int k = 0; k < nelem; k++ )
285 connect[idx++] = vijk;
286 connect[idx++] = vijk + 1;
287 connect[idx++] = vijk + 1 + numv;
288 connect[idx++] = vijk + numv;
289 connect[idx++] = vijk + numv * numv;
290 connect[idx++] = vijk + 1 + numv * numv;
291 connect[idx++] = vijk + 1 + numv + numv * numv;
292 connect[idx++] = vijk + numv + numv * numv;
293 assert( i <= numv * numv * numv );
305 double def_val[3] = { 0.0, 0.0, 0.0 };
316 int main(
int argc,
char* argv[] )
321 std::cout <<
"Usage: " << argv[0] <<
" <ints_per_side> [A|B|C|D [1|2|3|4]|E]" << std::endl;
325 char which_test =
'\0';
328 sscanf( argv[1],
"%d", &nelem );
329 if( argc >= 3 ) sscanf( argv[2],
"%c", &which_test );
330 if( argc >= 4 ) sscanf( argv[3],
"%d", &ver );
332 if( 3 <= argc && which_test !=
'A' && which_test !=
'B' && which_test !=
'C' && which_test !=
'D' &&
335 std::cout <<
"Must indicate A or B, C, D or E for test." << std::endl;
339 if( 4 <= argc && which_test ==
'D' && ( ver < 1 || ver > 4 ) )
341 std::cout <<
"Must indicate version 1, 2, 3, or 4 for test D." << std::endl;
349 double* coords = NULL;
351 assert( NULL != coords );
356 if(
'\0' == which_test ||
'A' == which_test )
testA( nelem, coords );
361 if(
'\0' == which_test ||
'B' == which_test )
testB( nelem, coords, connect );
364 if(
'\0' == which_test ||
'C' == which_test )
testC( nelem, coords );
367 if(
'\0' == which_test ||
'D' == which_test )
testD( nelem, coords, ver );
370 if(
'\0' == which_test ||
'E' == which_test )
testE( nelem, coords, connect );
379 RC(
"query_elem_to_vert" );
382 double dum_coords[24];
386 RC(
"query_elem_to_vert" );
387 result =
gMB->
get_coords( connect, num_connect, dum_coords );
388 RC(
"query_elem_to_vert" );
391 double centroid[3] = { 0.0, 0.0, 0.0 };
392 for(
int j = 0; j < 8; j++ )
394 centroid[0] += dum_coords[3 * j + 0];
395 centroid[1] += dum_coords[3 * j + 1];
396 centroid[2] += dum_coords[3 * j + 2];
398 centroid[0] *= 0.125;
399 centroid[1] *= 0.125;
400 centroid[2] *= 0.125;
402 RC(
"query_elem_to_vert" );
409 std::vector< EntityHandle > neighbor_hexes;
410 std::vector< double > neighbor_pos;
412 neighbor_pos.resize( 3 * 8 );
414 RC(
"query_vert_to_elem" );
417 neighbor_hexes.clear();
419 RC(
"query_vert_to_elem" );
421 RC(
"query_vert_to_elem" );
422 assert( neighbor_pos.size() >= 3 * neighbor_hexes.size() );
424 RC(
"query_vert_to_elem" );
425 for(
unsigned int i = 0; i < neighbor_hexes.size(); i++ )
427 neighbor_pos[3 * i] += coords[0];
428 neighbor_pos[3 * i + 1] += coords[1];
429 neighbor_pos[3 * i + 2] += coords[2];
433 RC(
"query_vert_to_elem" );
438 RC(
"query_vert_to_elem" );
443 std::vector< EntityHandle >& connect,
447 std::vector< EntityHandle > hexes;
450 RC(
"query_elem_to_vert_iters" );
456 RC(
"query_elem_to_vert_iters" );
458 RC(
"query_elem_to_vert_iters" );
459 result =
gMB->
get_coords( &connect[0], connect.size(), dum_coords );
460 RC(
"query_elem_to_vert_iters" );
462 RC(
"query_elem_to_vert_iters" );
463 for(
unsigned int i = 0; i < hexes.size(); i++ )
466 for(
int j = 0; j < 8; j++ )
468 dum_pos[3 * i + 0] += dum_coords[24 * i + 3 * j];
469 dum_pos[3 * i + 1] += dum_coords[24 * i + 3 * j + 1];
470 dum_pos[3 * i + 2] += dum_coords[24 * i + 3 * j + 2];
472 dum_pos[3 * i + 0] *= 0.125;
473 dum_pos[3 * i + 1] *= 0.125;
474 dum_pos[3 * i + 2] *= 0.125;
477 RC(
"query_elem_to_vert_iters" );
485 std::vector< EntityHandle >& ,
489 std::vector< EntityHandle > verts, neighbor_hexes;
492 RC(
"query_vert_to_elem_iters" );
499 RC(
"query_vert_to_elem_iters" );
500 result =
gMB->
get_coords( &verts[0], verts.size(), dum_coords );
501 RC(
"query_vert_to_elem_iters" );
502 chunk_size = std::min( (
int)verts.size(), chunk_size );
503 for(
int i = 0; i < chunk_size; i++ )
505 neighbor_hexes.clear();
507 RC(
"query_vert_to_elem_iters" );
509 RC(
"query_vert_to_elem_iters" );
510 for(
unsigned int j = 0; j < neighbor_hexes.size(); j++ )
512 dum_pos[3 * j + 0] += dum_coords[3 * i + 0];
513 dum_pos[3 * j + 1] += dum_coords[3 * i + 1];
514 dum_pos[3 * j + 2] += dum_coords[3 * i + 2];
517 RC(
"query_vert_to_elem_iters" );
522 RC(
"query_vert_to_elem_iters" );
552 RC(
"query_struct_elem_to_vert" );
553 double dum_coords[24];
554 std::vector< EntityHandle > connect;
558 RC(
"query_struct_elem_to_vert" );
559 result =
gMB->
get_coords( &connect[0], connect.size(), dum_coords );
560 RC(
"query_struct_elem_to_vert" );
562 double centroid[3] = { 0.0, 0.0, 0.0 };
563 for(
int j = 0; j < 8; j++ )
565 centroid[0] += dum_coords[3 * j + 0];
566 centroid[1] += dum_coords[3 * j + 1];
567 centroid[2] += dum_coords[3 * j + 2];
569 centroid[0] *= 0.125;
570 centroid[1] *= 0.125;
571 centroid[2] *= 0.125;
573 RC(
"query_struct_elem_to_vert" );
577 #if defined( _MSC_VER ) || defined( __MINGW32__ )
578 void print_time(
const bool print_em,
double& tot_time,
double& utime,
double& stime,
long& imem,
long& rmem )
580 utime = (double)clock() / CLOCKS_PER_SEC;
581 if( print_em ) std::cout <<
"Total wall time = " << utime << std::endl;
582 tot_time = stime = 0;
586 void print_time(
const bool print_em,
double& tot_time,
double& utime,
double& stime,
long& imem,
long& rmem )
588 struct rusage r_usage;
589 getrusage( RUSAGE_SELF, &r_usage );
590 utime = (double)r_usage.ru_utime.tv_sec + ( (
double)r_usage.ru_utime.tv_usec / 1.e6 );
591 stime = (double)r_usage.ru_stime.tv_sec + ( (
double)r_usage.ru_stime.tv_usec / 1.e6 );
592 tot_time = utime + stime;
594 std::cout <<
"User, system, total time = " << utime <<
", " << stime <<
", " << tot_time << std::endl;
598 std::cout <<
"Max resident set size = " << r_usage.ru_maxrss <<
" kbytes" << std::endl;
599 std::cout <<
"Int resident set size = " << r_usage.ru_idrss << std::endl;
601 imem = r_usage.ru_idrss;
602 rmem = r_usage.ru_maxrss;
604 system(
"ps o args,drs,rss | grep perf | grep -v grep" );
611 void testA(
const int nelem,
const double* coords )
613 double ttime0 = 0.0, ttime1 = 0.0, ttime2 = 0.0, ttime3 = 0.0, ttime4 = 0.0, utime = 0.0, stime = 0.0;
614 long imem0 = 0, rmem0 = 0, imem1 = 0, rmem1 = 0, imem2 = 0, rmem2 = 0, imem3 = 0, rmem3 = 0, imem4 = 0, rmem4 = 0;
616 print_time(
false, ttime0, utime, stime, imem0, rmem0 );
632 assert( MB_FAILURE != result && vstart != 0 && dum_seq != NULL && vseq != NULL );
636 assert( MB_FAILURE != result && estart != 0 && dum_seq != NULL && eseq != NULL );
640 result = eseq->
sdata()->
add_vsequence( vseq, vseq_minmax[0], vseq_minmax[0], vseq_minmax[0], vseq_minmax[0],
641 vseq_minmax[0], vseq_minmax[0] );
648 int num_verts = ( nelem + 1 ) * ( nelem + 1 ) * ( nelem + 1 );
649 for( i = 0, handle = vstart; i < num_verts; i++, handle++ )
652 dumv[1] = coords[num_verts + i];
653 dumv[2] = coords[2 * num_verts + i];
658 print_time(
false, ttime1, utime, stime, imem1, rmem1 );
663 print_time(
false, ttime2, utime, stime, imem2, rmem2 );
667 print_time(
false, ttime3, utime, stime, imem3, rmem3 );
675 print_time(
false, ttime4, utime, stime, imem4, rmem4 );
677 std::cout <<
"MOAB_scd:nelem,construct,e_to_v,v_to_e,after_dtor,total= " << nelem <<
" " << ttime1 - ttime0 <<
" "
678 << ttime2 - ttime1 <<
" " << ttime3 - ttime2 <<
" " << ttime4 - ttime3 <<
" " << ttime4 - ttime0
679 <<
" seconds" << std::endl;
680 std::cout <<
"MOAB_scd_memory(rss):initial,after_construction,e-v,v-e,after_dtor= " << rmem0 <<
" " << rmem1 <<
" "
681 << rmem2 <<
" " << rmem3 <<
" " << rmem4 <<
" kb" << std::endl;
684 void testB(
const int nelem,
const double* coords,
int* connect )
686 double ttime0 = 0.0, ttime1 = 0.0, ttime2 = 0.0, ttime3 = 0.0, ttime4 = 0.0, utime = 0.0, stime = 0.0;
687 long imem0 = 0, rmem0 = 0, imem1 = 0, rmem1 = 0, imem2 = 0, rmem2 = 0, imem3 = 0, rmem3 = 0, imem4 = 0, rmem4 = 0;
689 print_time(
false, ttime0, utime, stime, imem0, rmem0 );
691 int num_verts = ( nelem + 1 ) * ( nelem + 1 ) * ( nelem + 1 );
692 int num_elems = nelem * nelem * nelem;
702 std::vector< double* > coord_arrays;
705 assert(
MB_SUCCESS == result && 1 == vstart && coord_arrays[0] && coord_arrays[1] && coord_arrays[2] );
707 memcpy( coord_arrays[0], coords,
sizeof(
double ) * num_verts );
708 memcpy( coord_arrays[1], &coords[num_verts],
sizeof(
double ) * num_verts );
709 memcpy( coord_arrays[2], &coords[2 * num_verts],
sizeof(
double ) * num_verts );
714 for(
int i = 0; i < num_elems * 8; i++ )
715 conn[i] = vstart + connect[i];
722 print_time(
false, ttime1, utime, stime, imem1, rmem1 );
727 print_time(
false, ttime2, utime, stime, imem2, rmem2 );
731 print_time(
false, ttime3, utime, stime, imem3, rmem3 );
739 print_time(
false, ttime4, utime, stime, imem4, rmem4 );
741 std::cout <<
"MOAB_ucd_blocked:nelem,construct,e_to_v,v_to_e,after_dtor,total= " << nelem <<
" " << ttime1 - ttime0
742 <<
" " << ttime2 - ttime1 <<
" " << ttime3 - ttime2 <<
" " << ttime4 - ttime3 <<
" " << ttime4 - ttime0
743 <<
" seconds" << std::endl;
744 std::cout <<
"MOAB_ucdblocked_memory_(rss):initial,after_construction,e-v,v-e,after_dtor= " << rmem0 <<
" " << rmem1
745 <<
" " << rmem2 <<
" " << rmem3 <<
" " << rmem4 <<
" kb" << std::endl;
748 void testC(
const int nelem,
const double* coords )
750 double ttime0 = 0.0, ttime1 = 0.0, ttime2 = 0.0, ttime3 = 0.0, ttime4 = 0.0, utime = 0.0, stime = 0.0;
751 long imem0 = 0, rmem0 = 0, imem1 = 0, rmem1 = 0, imem2 = 0, rmem2 = 0, imem3 = 0, rmem3 = 0, imem4 = 0, rmem4 = 0;
753 print_time(
false, ttime0, utime, stime, imem0, rmem0 );
757 int numv = nelem + 1;
758 int numv_sq = numv * numv;
759 int num_verts = numv * numv * numv;
760 double dum_coords[3] = { coords[0], coords[num_verts], coords[2 * num_verts] };
766 assert(
MB_SUCCESS == result && 1 == vstart );
770 for( i = 1; i < num_verts; i++ )
772 dum_coords[0] = coords[i];
773 dum_coords[1] = coords[num_verts + i];
774 dum_coords[2] = coords[2 * num_verts + i];
780 for( i = 0; i < nelem; i++ )
782 for(
int j = 0; j < nelem; j++ )
784 for(
int k = 0; k < nelem; k++ )
786 vijk = vstart +
VINDEX( i, j, k );
788 dum_conn[1] = vijk + 1;
789 dum_conn[2] = vijk + 1 + numv;
790 dum_conn[3] = vijk + numv;
791 dum_conn[4] = vijk + numv * numv;
792 dum_conn[5] = vijk + 1 + numv * numv;
793 dum_conn[6] = vijk + 1 + numv + numv * numv;
794 dum_conn[7] = vijk + numv + numv * numv;
801 print_time(
false, ttime1, utime, stime, imem1, rmem1 );
806 print_time(
false, ttime2, utime, stime, imem2, rmem2 );
810 print_time(
false, ttime3, utime, stime, imem3, rmem3 );
818 print_time(
false, ttime4, utime, stime, imem4, rmem4 );
820 std::cout <<
"MOAB_ucd_indiv:nelem,construct,e_to_v,v_to_e,after_dtor,total= " << nelem <<
" " << ttime1 - ttime0
821 <<
" " << ttime2 - ttime1 <<
" " << ttime3 - ttime2 <<
" " << ttime4 - ttime3 <<
" " << ttime4 - ttime0
822 <<
" seconds" << std::endl;
823 std::cout <<
"MOAB_ucd_indiv_memory_(rss):initial,after_construction,e-v,v-e,after_dtor= " << rmem0 <<
" " << rmem1
824 <<
" " << rmem2 <<
" " << rmem3 <<
" " << rmem4 <<
" kb" << std::endl;
827 void testD(
const int nelem,
const double* coords,
int ver )
829 double ttime0 = 0.0, ttime1 = 0.0, ttime2 = 0.0, ttime3 = 0.0, ttime4 = 0.0, ttime5 = 0.0, ttime6 = 0.0,
830 ttime7 = 0.0, ttime8 = 0.0, ttime9 = 0.0, ttime10 = 0.0, utime = 0.0, stime = 0.0;
831 long imem0 = 0, rmem0 = 0, imem1 = 0, rmem1 = 0, imem2 = 0, rmem2 = 0, imem3 = 0, rmem3 = 0, imem4 = 0, rmem4 = 0,
832 imem5 = 0, rmem5 = 0, imem6 = 0, rmem6 = 0, imem7 = 0, rmem7 = 0, imem8 = 0, rmem8 = 0, imem9 = 0, rmem9 = 0,
833 imem10 = 0, rmem10 = 0;
835 print_time(
false, ttime0, utime, stime, imem0, rmem0 );
839 int numv = nelem + 1;
840 int numv_sq = numv * numv;
841 int num_verts = numv * numv * numv;
842 std::vector< double > dum_coords( 24 ), dum_pos( 24 );
843 dum_coords[0] = coords[0];
844 dum_coords[1] = coords[num_verts];
845 dum_coords[2] = coords[2 * num_verts];
851 assert(
MB_SUCCESS == result && 1 == vstart );
855 for( i = 1; i < num_verts; i++ )
857 dum_coords[0] = coords[i];
858 dum_coords[1] = coords[num_verts + i];
859 dum_coords[2] = coords[2 * num_verts + i];
865 for( i = 0; i < nelem; i++ )
867 for(
int j = 0; j < nelem; j++ )
869 for(
int k = 0; k < nelem; k++ )
871 vijk = vstart +
VINDEX( i, j, k );
873 dum_conn[1] = vijk + 1;
874 dum_conn[2] = vijk + 1 + numv;
875 dum_conn[3] = vijk + numv;
876 dum_conn[4] = vijk + numv * numv;
877 dum_conn[5] = vijk + 1 + numv * numv;
878 dum_conn[6] = vijk + 1 + numv + numv * numv;
879 dum_conn[7] = vijk + numv + numv * numv;
886 print_time(
false, ttime1, utime, stime, imem1, rmem1 );
889 std::vector< EntityHandle > connect( 8 );
892 double def_val[3] = { 0.0, 0.0, 0.0 };
894 if( ver == 0 || ver == 1 )
897 print_time(
false, ttime2, utime, stime, imem2, rmem2 );
899 print_time(
false, ttime3, utime, stime, imem3, rmem3 );
915 if( ver == 0 || ver == 2 )
917 if( ver != 0 )
print_time(
false, ttime3, utime, stime, imem3, rmem3 );
919 print_time(
false, ttime4, utime, stime, imem4, rmem4 );
921 print_time(
false, ttime5, utime, stime, imem5, rmem5 );
937 if( ver == 0 || ver >= 3 )
939 dum_coords.resize( 2400 );
940 dum_pos.resize( 300 );
942 if( ver == 0 || ver == 3 )
944 if( ver != 0 )
print_time(
false, ttime5, utime, stime, imem3, rmem3 );
946 print_time(
false, ttime6, utime, stime, imem6, rmem6 );
948 print_time(
false, ttime7, utime, stime, imem7, rmem7 );
964 if( ver == 0 || ver == 4 )
966 if( ver != 0 )
print_time(
false, ttime7, utime, stime, imem3, rmem3 );
968 print_time(
false, ttime8, utime, stime, imem8, rmem8 );
970 print_time(
false, ttime9, utime, stime, imem9, rmem9 );
986 if( ver > 0 && ver < 4 )
print_time(
false, ttime9, utime, stime, imem9, rmem9 );
989 print_time(
false, ttime10, utime, stime, imem10, rmem10 );
991 if( ver == 0 || ver == 1 )
993 std::cout <<
"MOAB_ucd_iters_!check_valid_1:nelem,construct,e-v,v-e,after_dtor,total= " << nelem <<
" "
994 << ttime1 - ttime0 <<
" " << ttime2 - ttime1 <<
" " << ttime3 - ttime2 <<
" " << ttime10 - ttime9
995 <<
" " << ttime3 - ttime0 + ttime10 - ttime9 << std::endl;
996 std::cout <<
"MOAB_ucd_iters_memory_(rss)_!check_valid_1:initial,after_construction,e-v,v-"
998 << rmem0 <<
" " << rmem1 <<
" " << rmem2 <<
" " << rmem3 <<
" " << rmem10 <<
" kb" << std::endl;
1000 if( ver == 0 || ver == 2 )
1002 std::cout <<
"MOAB_ucd_iters_check_valid_1:nelem,construct,e-v,v-e,after_dtor,total= " << nelem <<
" "
1003 << ttime1 - ttime0 <<
" " << ttime4 - ttime3 <<
" " << ttime5 - ttime4 <<
" " << ttime10 - ttime9
1004 <<
" " << ttime1 - ttime0 + ttime5 - ttime3 + ttime10 - ttime9 << std::endl;
1005 std::cout <<
"MOAB_ucd_iters_memory_(rss)_check_valid_1:initial,after_construction,e-v,v-e,"
1007 << rmem0 <<
" " << rmem1 <<
" " << rmem2 <<
" " << rmem3 <<
" " << rmem10 <<
" kb" << std::endl;
1009 if( ver == 0 || ver == 3 )
1011 std::cout <<
"MOAB_ucd_iters_!check_valid_100:nelem,construct,e-v,v-e,after_dtor,total= " << nelem <<
" "
1012 << ttime1 - ttime0 <<
" " << ttime6 - ttime5 <<
" " << ttime7 - ttime6 <<
" " << ttime10 - ttime9
1013 <<
" " << ttime1 - ttime0 + ttime7 - ttime5 + ttime10 - ttime9 << std::endl;
1014 std::cout <<
"MOAB_ucd_iters_memory_(rss)_!check_valid_100:initial,after_construction,e-v,"
1016 << rmem0 <<
" " << rmem1 <<
" " << rmem6 <<
" " << rmem7 <<
" " << rmem10 <<
" kb" << std::endl;
1018 if( ver == 0 || ver == 4 )
1020 std::cout <<
"MOAB_ucd_iters_check_valid_100:nelem,construct,e-v,v-e,after_dtor,total= " << nelem <<
" "
1021 << ttime1 - ttime0 <<
" " << ttime8 - ttime7 <<
" " << ttime9 - ttime8 <<
" " << ttime10 - ttime9
1022 <<
" " << ttime1 - ttime0 + ttime10 - ttime7 << std::endl;
1023 std::cout <<
"MOAB_ucd_iters_memory_(rss)_check_valid_100:initial,after_construction,e-v,v-"
1025 << rmem0 <<
" " << rmem1 <<
" " << rmem8 <<
" " << rmem9 <<
" " << rmem10 <<
" kb" << std::endl;
1029 void testE(
const int nelem,
const double* coords,
int* connect )
1031 double ttime0 = 0.0, ttime1 = 0.0, ttime2 = 0.0, ttime3 = 0.0, ttime4 = 0.0, ttime5 = 0.0, ttime6 = 0.0,
1032 utime = 0.0, stime = 0.0;
1033 long imem0 = 0, rmem0 = 0, imem1 = 0, rmem1 = 0, imem2 = 0, rmem2 = 0, imem3 = 0, rmem3 = 0, imem4 = 0, rmem4 = 0,
1034 imem5 = 0, rmem5 = 0, imem6 = 0, rmem6 = 0;
1036 print_time(
false, ttime0, utime, stime, imem0, rmem0 );
1038 int num_verts = ( nelem + 1 ) * ( nelem + 1 ) * ( nelem + 1 );
1039 int num_elems = nelem * nelem * nelem;
1049 std::vector< double* > coord_arrays;
1052 assert(
MB_SUCCESS == result && 1 == vstart && coord_arrays[0] && coord_arrays[1] && coord_arrays[2] );
1054 memcpy( coord_arrays[0], coords,
sizeof(
double ) * num_verts );
1055 memcpy( coord_arrays[1], &coords[num_verts],
sizeof(
double ) * num_verts );
1056 memcpy( coord_arrays[2], &coords[2 * num_verts],
sizeof(
double ) * num_verts );
1061 for(
int i = 0; i < num_elems * 8; i++ )
1062 conn[i] = vstart + connect[i];
1066 Range verts( vstart, vstart + num_verts - 1 ), elems( estart, estart + num_elems - 1 );
1071 print_time(
false, ttime1, utime, stime, imem1, rmem1 );
1076 print_time(
false, ttime2, utime, stime, imem2, rmem2 );
1080 print_time(
false, ttime3, utime, stime, imem3, rmem3 );
1088 print_time(
false, ttime4, utime, stime, imem4, rmem4 );
1092 print_time(
false, ttime5, utime, stime, imem5, rmem5 );
1100 print_time(
false, ttime6, utime, stime, imem6, rmem6 );
1102 std::cout <<
"MOAB_ucd_direct:nelem,construct,e_to_v,v_to_e,after_dtor,total= " << nelem <<
" " << ttime1 - ttime0
1103 <<
" " << ttime2 - ttime1 <<
" " << ttime3 - ttime2 <<
" " << ttime6 - ttime5 <<
" "
1104 << ttime3 - ttime0 + ttime6 - ttime5 <<
" seconds" << std::endl;
1105 std::cout <<
"MOAB_ucd_direct_memory_(rss):initial,after_construction,e-v,v-e,after_dtor= " << rmem0 <<
" " << rmem1
1106 <<
" " << rmem2 <<
" " << rmem3 <<
" " << rmem6 <<
" kb" << std::endl;
1108 std::cout <<
"MOAB_ucd_direct2:nelem,construct,e_to_v,v_to_e,after_dtor,total= " << nelem <<
" " << ttime1 - ttime0
1109 <<
" " << ttime4 - ttime3 <<
" " << ttime5 - ttime4 <<
" " << ttime6 - ttime5 <<
" "
1110 << ttime1 - ttime0 + ttime6 - ttime3 <<
" seconds" << std::endl;
1111 std::cout <<
"MOAB_ucd_direct2_memory_(rss):initial,after_construction,e-v,v-e,after_dtor= " << rmem0 <<
" "
1112 << rmem1 <<
" " << rmem4 <<
" " << rmem5 <<
" " << rmem6 <<
" kb" << std::endl;
1117 Range all_hexes, all_verts;
1121 RC(
"query_elem_to_vert_direct" );
1123 int ecount, vcount, vpere;
1129 std::cout <<
"FAILED in connect_iterate!" << std::endl;
1135 std::cout <<
"FAILED in coords_iterate!" << std::endl;
1142 std::cout <<
"FAILED in connect_iterate!" << std::endl;
1147 for(
int i = 0; i < ecount; i++ )
1150 for(
int j = 0; j < vpere; j++ )
1152 int vind = *connect - vstart;
1154 centroid[3 * i + 0] += coords[0][vind];
1155 centroid[3 * i + 1] += coords[1][vind];
1156 centroid[3 * i + 2] += coords[2][vind];
1160 centroid[3 * i + 0] *= 0.125;
1161 centroid[3 * i + 1] *= 0.125;
1162 centroid[3 * i + 2] *= 0.125;
1168 Range all_verts, tmp_ents;
1176 const std::vector< EntityHandle >** adjs;
1181 std::cout <<
"FAILED:adjacencies_iterate." << std::endl;
1189 std::cout <<
"FAILED in coords_iterate!" << std::endl;
1201 std::cout <<
"FAILED in tag_iterate!" << std::endl;
1208 for( vit = all_verts.
begin(), i = 0; vit != all_verts.
end(); ++vit, i++ )
1211 for( std::vector< EntityHandle >::const_iterator vit2 = adjs[i]->begin(); vit2 != adjs[i]->end(); ++vit2 )
1212 if( *vit >= estart )
1214 int eind = *vit2 - estart;
1215 centroid[3 * eind + 0] += coords[0][i];
1216 centroid[3 * eind + 1] += coords[1][i];
1217 centroid[3 * eind + 2] += coords[2][i];
1222 for( i = 0; i < (int)tmp_ents.
size(); i++ )
1224 centroid[3 * i + 0] *= 0.125;
1225 centroid[3 * i + 1] *= 0.125;
1226 centroid[3 * i + 2] *= 0.125;
1234 RC(
"check_answers" );
1236 double coords1[3], coords2[3], del[3];
1241 RC(
"check_answers" );
1243 RC(
"check_answers" );
1244 for(
int i = 0; i < 3; i++ )
1245 del[i] = fabs( coords1[i] - coords2[i] );
1246 if( del[0] || del[1] || del[2] )
1248 double len2 = std::max( coords1[0] * coords1[0] + coords1[1] * coords1[1] + coords1[2] * coords1[2],
1249 coords2[0] * coords2[0] + coords2[1] * coords2[1] + coords2[2] * coords2[2] ),
1250 num = del[0] * del[0] + del[1] * del[1] + del[2] * del[2];
1252 diff = std::max( diff, num / sqrt( len2 ) );
1253 else if( num > 0.0 )
1257 if( diff > 0.0 ) std::cout <<
"Max relative difference = " << diff << std::endl;