MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include <sys/resource.h>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <cassert>
#include "iMesh.h"
Go to the source code of this file.
Defines | |
#define | VINDEX(i, j, k) ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) ) |
#define | VINDEX(i, j, k) ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) ) |
Functions | |
void | query_elem_to_vert (iMesh_Instance mesh) |
void | query_vert_to_elem (iMesh_Instance mesh) |
void | print_time (const bool print_em, double &tot_time, double &utime, double &stime, long &imem, long &rmem) |
void | build_connect (const int nelem, const int vstart, int *&connect) |
void | testB (iMesh_Instance mesh, const int nelem, const double *coords, int *connect) |
void | testC (iMesh_Instance mesh, const int nelem, const double *coords) |
void | compute_edge (double *start, const int nelem, const double xint, const int stride) |
void | compute_face (double *a, const int nelem, const double xint, const int stride1, const int stride2) |
void | build_coords (const int nelem, double *&coords) |
int | main (int argc, char *argv[]) |
Variables | |
double | LENGTH = 1.0 |
#define VINDEX | ( | i, | |
j, | |||
k | |||
) | ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) ) |
#define VINDEX | ( | i, | |
j, | |||
k | |||
) | ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) ) |
void build_connect | ( | const int | nelem, |
const int | vstart, | ||
int *& | connect | ||
) |
void build_coords | ( | const int | nelem, |
double *& | coords | ||
) |
void compute_edge | ( | double * | start, |
const int | nelem, | ||
const double | xint, | ||
const int | stride | ||
) |
void compute_face | ( | double * | a, |
const int | nelem, | ||
const double | xint, | ||
const int | stride1, | ||
const int | stride2 | ||
) |
int main | ( | int | argc, |
char * | argv[] | ||
) |
Definition at line 45 of file tstt_perf_binding.cpp.
References build_connect(), build_coords(), iBase_SUCCESS, iMesh_dtor, iMesh_newMesh, iMesh_setGeometricDimension, mesh, testB(), and testC().
{ int nelem = 20; if( argc < 3 ) { std::cout << "Usage: " << argv[0] << " <ints_per_side> <A|B|C>" << std::endl; return 1; } char which_test = '\0'; sscanf( argv[1], "%d", &nelem ); sscanf( argv[2], "%c", &which_test ); if( which_test != 'B' && which_test != 'C' ) { std::cout << "Must indicate B or C for test." << std::endl; return 1; } std::cout << "number of elements: " << nelem << "; test " << which_test << std::endl; // initialize the data in native format // pre-build the coords array double* coords; build_coords( nelem, coords ); assert( NULL != coords ); // test B: create mesh using bulk interface // create an implementation iMesh_Instance mesh; int result; iMesh_newMesh( NULL, &mesh, &result, 0 ); int* connect = NULL; if( iBase_SUCCESS != result ) { cerr << "Couldn't create mesh instance." << endl; iMesh_dtor( mesh, &result ); return 1; } iMesh_setGeometricDimension( mesh, 3, &result ); if( iBase_SUCCESS != result ) { cerr << "Couldn't set geometric dimension." << endl; iMesh_dtor( mesh, &result ); return 1; } switch( which_test ) { case 'B': build_connect( nelem, 1, connect ); // test B: create mesh using bulk interface testB( mesh, nelem, coords, connect ); break; case 'C': // test C: create mesh using individual interface testC( mesh, nelem, coords ); break; } free( coords ); return 0; }
void print_time | ( | const bool | print_em, |
double & | tot_time, | ||
double & | utime, | ||
double & | stime, | ||
long & | imem, | ||
long & | rmem | ||
) |
void query_elem_to_vert | ( | iMesh_Instance | mesh | ) |
Definition at line 281 of file tstt_perf_binding.cpp.
References iBase_BLOCKED, iBase_REGION, iBase_SUCCESS, iBase_VERTEX, iMesh_getDfltStorage, iMesh_getEntAdj, iMesh_getEntities, iMesh_getRootSet, iMesh_getVtxArrCoords, iMesh_HEXAHEDRON, and root_set.
{ iBase_EntityHandle* all_hexes = NULL; int all_hexes_size, all_hexes_allocated = 0; // get all the hex elements int success; iBase_EntitySetHandle root_set; iMesh_getRootSet( mesh, &root_set, &success ); if( iBase_SUCCESS != success ) { cerr << "Couldn't get root set." << endl; return; } iMesh_getEntities( mesh, root_set, iBase_REGION, iMesh_HEXAHEDRON, &all_hexes, &all_hexes_allocated, &all_hexes_size, &success ); if( iBase_SUCCESS != success ) { cerr << "Couldn't get all hex elements in query_mesh" << endl; return; } // now loop over elements iBase_EntityHandle* dum_connect = NULL; int dum_connect_allocated = 0, dum_connect_size; double* dum_coords = NULL; int dum_coords_size, dum_coords_allocated = 0; int order; iMesh_getDfltStorage( mesh, &order, &success ); if( iBase_SUCCESS != success ) return; for( int i = 0; i < all_hexes_size; i++ ) { // get the connectivity of this element; will allocate space on 1st iteration, // but will have correct size on subsequent ones iMesh_getEntAdj( mesh, all_hexes[i], iBase_VERTEX, &dum_connect, &dum_connect_allocated, &dum_connect_size, &success ); if( iBase_SUCCESS == success ) { // get vertex coordinates; ; will allocate space on 1st iteration, // but will have correct size on subsequent ones iMesh_getVtxArrCoords( mesh, dum_connect, dum_connect_size, order, &dum_coords, &dum_coords_allocated, &dum_coords_size, &success ); double centroid[3] = { 0.0, 0.0, 0.0 }; if( order == iBase_BLOCKED ) { for( int j = 0; j < 8; j++ ) { centroid[0] += dum_coords[j]; centroid[1] += dum_coords[8 + j]; centroid[2] += dum_coords[16 + j]; } } else { for( int j = 0; j < 8; j++ ) { centroid[0] += dum_coords[3 * j]; centroid[1] += dum_coords[3 * j + 1]; centroid[2] += dum_coords[3 * j + 2]; } } } if( iBase_SUCCESS != success ) { cerr << "Problem getting connectivity or vertex coords." << endl; return; } } free( all_hexes ); free( dum_connect ); free( dum_coords ); }
void query_vert_to_elem | ( | iMesh_Instance | mesh | ) |
Definition at line 360 of file tstt_perf_binding.cpp.
References iBase_REGION, iBase_SUCCESS, iBase_VERTEX, iMesh_getEntAdj, iMesh_getEntities, iMesh_getRootSet, iMesh_POINT, and root_set.
{ iBase_EntityHandle* all_verts = NULL; int all_verts_allocated = 0, all_verts_size; iBase_EntitySetHandle root_set; int success; iMesh_getRootSet( mesh, &root_set, &success ); if( iBase_SUCCESS != success ) { cerr << "Couldn't get root set." << endl; return; } // get all the vertices elements iMesh_getEntities( mesh, root_set, iBase_VERTEX, iMesh_POINT, &all_verts, &all_verts_allocated, &all_verts_size, &success ); if( iBase_SUCCESS != success ) { cerr << "Couldn't get all vertices in query_vert_to_elem" << endl; return; } // for this mesh, should never be more than 8 hexes connected to a vertex iBase_EntityHandle* dum_hexes = (iBase_EntityHandle*)calloc( 8, sizeof( iBase_EntityHandle ) ); int dum_hexes_allocated = 8, dum_hexes_size; // now loop over vertices for( int i = 0; i < all_verts_size; i++ ) { // get the connectivity of this element; will have to allocate space on every // iteration, since size can vary iMesh_getEntAdj( mesh, all_verts[i], iBase_REGION, &dum_hexes, &dum_hexes_allocated, &dum_hexes_size, &success ); if( iBase_SUCCESS != success ) { cerr << "Problem getting connectivity or vertex coords." << endl; // do not return early, as we would leak memory } } free( dum_hexes ); free( all_verts ); }
void testB | ( | iMesh_Instance | mesh, |
const int | nelem, | ||
const double * | coords, | ||
int * | connect | ||
) |
Definition at line 117 of file tstt_perf_binding.cpp.
References iBase_BLOCKED, iBase_SUCCESS, iMesh_createEntArr, iMesh_createVtxArr, iMesh_dtor, iMesh_HEXAHEDRON, print_time(), query_elem_to_vert(), and query_vert_to_elem().
{ double utime, stime, ttime0, ttime1, ttime2, ttime3, ttime4; long imem0, rmem0, imem1, rmem1, imem2, rmem2, imem3, rmem3, imem4, rmem4; print_time( false, ttime0, utime, stime, imem0, rmem0 ); int num_verts = ( nelem + 1 ) * ( nelem + 1 ) * ( nelem + 1 ); int num_elems = nelem * nelem * nelem; // create vertices as a block; initialize to NULL so allocation is done in interface iBase_EntityHandle* vertices = NULL; int vertices_allocated = 0, vertices_size; int result; iMesh_createVtxArr( mesh, num_verts, iBase_BLOCKED, coords, 3 * num_verts, &vertices, &vertices_allocated, &vertices_size, &result ); if( iBase_SUCCESS != result ) { cerr << "Couldn't create vertices in bulk call" << endl; free( vertices ); return; } // need to explicitly fill connectivity array, since we don't know // the format of entity handles int nconnect = 8 * num_elems; iBase_EntityHandle* sidl_connect = (iBase_EntityHandle*)malloc( nconnect * sizeof( iBase_EntityHandle ) ); for( int i = 0; i < nconnect; i++ ) { // use connect[i]-1 because we used starting vertex index (vstart) of 1 assert( connect[i] - 1 < num_verts ); sidl_connect[i] = vertices[connect[i] - 1]; } // no longer need vertices and connect arrays, free here to reduce overall peak memory usage free( vertices ); free( connect ); // create the entities iBase_EntityHandle* new_hexes = NULL; int new_hexes_allocated = 0, new_hexes_size; int* status = NULL; int status_allocated = 0, status_size; iMesh_createEntArr( mesh, iMesh_HEXAHEDRON, sidl_connect, nconnect, &new_hexes, &new_hexes_allocated, &new_hexes_size, &status, &status_allocated, &status_size, &result ); if( iBase_SUCCESS != result ) { cerr << "Couldn't create hex elements in bulk call" << endl; free( new_hexes ); free( status ); free( sidl_connect ); return; } print_time( false, ttime1, utime, stime, imem1, rmem1 ); free( status ); free( new_hexes ); free( sidl_connect ); // query the mesh 2 ways query_elem_to_vert( mesh ); print_time( false, ttime2, utime, stime, imem2, rmem2 ); query_vert_to_elem( mesh ); print_time( false, ttime3, utime, stime, imem3, rmem3 ); iMesh_dtor( mesh, &result ); print_time( false, ttime4, utime, stime, imem4, rmem4 ); std::cout << "TSTTb/MOAB_ucd_blocked: nelem, construct, e_to_v, v_to_e, after_dtor = " << nelem << ", " << ttime1 - ttime0 << ", " << ttime2 - ttime1 << ", " << ttime3 - ttime2 << ", " << ttime4 - ttime3 << " seconds" << std::endl; std::cout << "TSTTb/MOAB_ucd_blocked_memory_(rss): initial, after_construction, e-v, v-e, after_dtor:" << rmem0 << ", " << rmem1 << ", " << rmem2 << ", " << rmem3 << ", " << rmem4 << " kb" << std::endl; }
void testC | ( | iMesh_Instance | mesh, |
const int | nelem, | ||
const double * | coords | ||
) |
Definition at line 198 of file tstt_perf_binding.cpp.
References iBase_SUCCESS, iMesh_createEnt, iMesh_createVtx, iMesh_dtor, iMesh_HEXAHEDRON, print_time(), query_elem_to_vert(), query_vert_to_elem(), and VINDEX.
{ double utime, stime, ttime0, ttime1, ttime2, ttime3, ttime4; long imem0, rmem0, imem1, rmem1, imem2, rmem2, imem3, rmem3, imem4, rmem4; print_time( false, ttime0, utime, stime, imem0, rmem0 ); // need some dimensions int numv = nelem + 1; int numv_sq = numv * numv; int num_verts = numv * numv * numv; #define VINDEX( i, j, k ) ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) ) // array to hold vertices created individually iBase_EntityHandle* sidl_vertices = (iBase_EntityHandle*)malloc( num_verts * sizeof( iBase_EntityHandle ) ); int result; for( int i = 0; i < num_verts; i++ ) { // create the vertex iMesh_createVtx( mesh, coords[i], coords[i + num_verts], coords[i + 2 * num_verts], sidl_vertices + i, &result ); if( iBase_SUCCESS != result ) { cerr << "Couldn't create vertex in individual call" << endl; return; } } iBase_EntityHandle tmp_conn[8], new_hex; for( int i = 0; i < nelem; i++ ) { for( int j = 0; j < nelem; j++ ) { for( int k = 0; k < nelem; k++ ) { int vijk = VINDEX( i, j, k ); tmp_conn[0] = sidl_vertices[vijk]; tmp_conn[1] = sidl_vertices[vijk + 1]; tmp_conn[2] = sidl_vertices[vijk + 1 + numv]; tmp_conn[3] = sidl_vertices[vijk + numv]; tmp_conn[4] = sidl_vertices[vijk + numv * numv]; tmp_conn[5] = sidl_vertices[vijk + 1 + numv * numv]; tmp_conn[6] = sidl_vertices[vijk + 1 + numv + numv * numv]; tmp_conn[7] = sidl_vertices[vijk + numv + numv * numv]; // create the entity int status; iMesh_createEnt( mesh, iMesh_HEXAHEDRON, tmp_conn, 8, &new_hex, &status, &result ); if( iBase_SUCCESS != result ) { cerr << "Couldn't create hex element in individual call" << endl; // return; do not return if errors, as we would leak memory } } } } print_time( false, ttime1, utime, stime, imem1, rmem1 ); free( sidl_vertices ); // query the mesh 2 ways query_elem_to_vert( mesh ); print_time( false, ttime2, utime, stime, imem2, rmem2 ); query_vert_to_elem( mesh ); print_time( false, ttime3, utime, stime, imem3, rmem3 ); iMesh_dtor( mesh, &result ); print_time( false, ttime4, utime, stime, imem4, rmem4 ); std::cout << "TSTTb/MOAB_ucd_indiv: nelem, construct, e_to_v, v_to_e, after_dtor = " << nelem << ", " << ttime1 - ttime0 << ", " << ttime2 - ttime1 << ", " << ttime3 - ttime2 << ", " << ttime4 - ttime3 << " seconds" << std::endl; std::cout << "TSTTb/MOAB_ucd_indiv_memory_(rss): initial, after_construction, e-v, v-e, after_dtor:" << rmem0 << ", " << rmem1 << ", " << rmem2 << ", " << rmem3 << ", " << rmem4 << " kb" << std::endl; }
double LENGTH = 1.0 |
Definition at line 31 of file tstt_perf_binding.cpp.