16 #if !defined( _MSC_VER ) && !defined( __MINGW32__ )
17 #include <sys/resource.h>
20 extern "C" int getrusage(
int,
struct rusage* );
22 #include </usr/ucbinclude/sys/rusage.h>
30 if( MB_SUCCESS != ( r ) ) \
32 fail( ( r ), ( s ), __FILE__, __LINE__ ); \
39 static void fail(
ErrorCode error_code,
const char* str,
const char* file_name,
int line_number )
41 std::cerr << str <<
", line " << line_number <<
" of file " << file_name <<
", error code " << error_code
53 CHK( rval,
"get_entities_by_dimension" );
58 CHK( MB_FAILURE,
"No elements in file" );
64 if( tp != tp2 )
CHK( MB_FAILURE,
"Elements must have same type" );
69 CHK( rval,
"get_connectivity" );
71 CHK( rval,
"get_connectivity" );
74 CHK( MB_FAILURE,
"Elements must have same #vertices" );
82 opts.
addOpt<
int >( std::string(
"dim" ),
83 std::string(
"Evaluate 1d/2d/3d elements (default: maximal dimension in mesh)" ), &
dim,
85 opts.
addOpt< std::string >( std::string(
"filename,f" ), std::string(
"Filename containing mesh" ), &
filename );
98 else if( nconn == 27 )
131 std::vector< CartVect >& params,
132 std::vector< CartVect >& coords,
147 for( rit = elems.
begin(), i = 0; rit != elems.
end(); ++rit, i++ )
150 rval = eeval.
eval( params[i].array(), coords[i].array(), 3 );
162 for( rit = elems.
begin(), i = 0; rit != elems.
end(); ++rit, i++ )
165 CHK( rval,
"get_connectivity" );
166 rval = mbi->
get_coords( connect, nconn, vcoords[0].array() );
167 CHK( rval,
"get_coords" );
169 CHK( rval,
"get_elem_map" );
170 coords[i] = elemmap->
evaluate( params[i] );
174 evtime =
mytime() - evtime;
181 std::vector< CartVect >& coords,
182 std::vector< CartVect >& params,
196 for( rit = elems.
begin(), i = 0; rit != elems.
end(); ++rit, i++ )
199 rval = eeval.
reverse_eval( coords[i].array(), 1.0e-10, 1.0e-6, params[i].array(), &ins );
212 for( rit = elems.
begin(), i = 0; rit != elems.
end(); ++rit, i++ )
215 CHK( rval,
"get_connectivity" );
216 rval = mbi->
get_coords( connect, nconn, vcoords[0].array() );
217 CHK( rval,
"get_coords" );
219 CHK( rval,
"get_elem_map" );
220 coords[i] = elemmap->
ievaluate( coords[i], 1.0e-6 );
223 retime =
mytime() - retime;
240 for( rit = elems.
begin(), i = 0; rit != elems.
end(); ++rit, i++ )
255 for( rit = elems.
begin(), i = 0; rit != elems.
end(); ++rit, i++ )
258 CHK( rval,
"get_connectivity" );
259 rval = mbi->
get_coords( connect, nconn, vcoords[0].array() );
260 CHK( rval,
"get_coords" );
262 CHK( rval,
"get_elem_map" );
263 jac = elemmap->
jacobian( params[i] );
266 jactime =
mytime() - jactime;
274 double integral = 0.0;
282 CHK( rval,
"set_tag_handle" );
301 for( rit = elems.
begin(), i = 0; rit != elems.
end(); ++rit, i++ )
304 CHK( rval,
"get_connectivity" );
305 rval = mbi->
get_coords( connect, nconn, vcoords[0].array() );
306 CHK( rval,
"get_coords" );
308 CHK( rval,
"get_elem_map" );
309 rval = mbi->
tag_get_data( tag, connect, nconn, &tagval[0] );
310 CHK( rval,
"tag_get_data" );
314 inttime =
mytime() - inttime;
315 std::cout <<
"integral = " << integral << std::endl;
323 CHK( rval,
"get_adjacencies" );
325 CHK( rval,
"tag_get_handle" );
326 std::vector< double > tag_vals( verts.
size() );
327 for(
unsigned int i = 0; i < verts.
size(); i++ )
328 tag_vals[i] = ( (
double)rand() ) / RAND_MAX;
337 std::vector< CartVect >& params,
338 std::vector< CartVect >& coords,
344 evtime = 0, retime = 0, jactime = 0, inttime = 0;
348 CHK( rval,
"time_forward_eval" );
352 CHK( rval,
"time_reverse_eval" );
356 CHK( rval,
"time_jacobian" );
360 CHK( rval,
"time_integrate" );
365 int main(
int argc,
char* argv[] )
374 CHK( MB_FAILURE,
"No file specified" );
375 else if( dim < 1 || dim > 3 )
376 CHK( MB_FAILURE,
"Dimension must be > 0 and <= 3" );
387 unsigned int ne = elems.
size();
388 std::vector< CartVect > params( ne ), coords( ne );
389 srand( time( NULL ) );
390 for(
unsigned int i = 0; i < ne; i++ )
392 params[i][0] = -1 + 2 * ( (double)rand() ) / RAND_MAX;
393 if(
dim > 1 ) params[i][1] = -1 + 2 * ( (double)rand() ) / RAND_MAX;
394 if(
dim > 2 ) params[i][2] = -1 + 2 * ( (double)rand() ) / RAND_MAX;
400 CHK( rval,
"put_random_field" );
401 double evtime[2], retime[2], jactime[2],
404 rval =
elem_evals( &mbi,
ELEMEVAL, elems, tag, params, coords, evtime[0], retime[0], jactime[0], inttime[0] );
405 CHK( rval,
"new elem_evals" );
407 rval =
elem_evals( &mbi,
ELEMUTIL, elems, tag, params, coords, evtime[1], retime[1], jactime[1], inttime[1] );
408 CHK( rval,
"old elem_evals" );
411 <<
" vertices per element." << std::endl
413 std::cout <<
"New, old element evaluation code:" << std::endl;
414 std::cout <<
"Evaluation type, time, time per element:" << std::endl;
415 std::cout <<
" New Old (New/Old)*100" << std::endl;
416 std::cout <<
"Forward evaluation " << evtime[0] <<
", " << evtime[0] / elems.
size() <<
" " << evtime[1] <<
", "
417 << evtime[1] / elems.
size() <<
" " << ( evtime[0] / ( evtime[1] ? evtime[1] : 1 ) ) * 100.0
419 std::cout <<
"Reverse evaluation " << retime[0] <<
", " << retime[0] / elems.
size() <<
" " << retime[1] <<
", "
420 << retime[1] / elems.
size() <<
" " << ( retime[0] / ( retime[1] ? retime[1] : 1 ) ) * 100.0
422 std::cout <<
"Jacobian " << jactime[0] <<
", " << jactime[0] / elems.
size() <<
" " << jactime[1]
423 <<
", " << jactime[1] / elems.
size() <<
" " << ( jactime[0] / ( jactime[1] ? jactime[1] : 1 ) ) * 100.0
425 std::cout <<
"Integration " << inttime[0] <<
", " << inttime[0] / elems.
size() <<
" " << inttime[1]
426 <<
", " << inttime[1] / elems.
size() <<
" " << ( inttime[0] / ( inttime[1] ? inttime[1] : 1 ) ) * 100.0
430 #if defined( _MSC_VER ) || defined( __MINGW32__ )
431 double mytime2(
double& tot_time,
double& utime,
double& stime,
long& imem,
long& rmem )
433 utime = (double)clock() / CLOCKS_PER_SEC;
434 tot_time = stime = 0;
439 double mytime2(
double& tot_time,
double& utime,
double& stime,
long& imem,
long& rmem )
441 struct rusage r_usage;
442 getrusage( RUSAGE_SELF, &r_usage );
443 utime = (double)r_usage.ru_utime.tv_sec + ( (
double)r_usage.ru_utime.tv_usec / 1.e6 );
444 stime = (double)r_usage.ru_stime.tv_sec + ( (
double)r_usage.ru_stime.tv_usec / 1.e6 );
445 tot_time = utime + stime;
447 imem = r_usage.ru_idrss;
448 rmem = r_usage.ru_maxrss;
450 system(
"ps o args,drs,rss | grep perf | grep -v grep" );
459 double ttime, utime, stime;
461 return mytime2( ttime, utime, stime, imem, rmem );