MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include <sys/resource.h>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include "TSTT_MOAB.hh"
#include "TSTT.hh"
#include "TSTTM.hh"
Go to the source code of this file.
Defines | |
#define | IMPLEMENTATION_CLASS TSTT_MOAB::MoabMesh |
#define | CAST_INTERFACE(var_in, var_out, iface) |
#define | CAST_MINTERFACE(var_in, var_out, iface) |
#define | ARRAY_PTR(array, type) ( reinterpret_cast< ( type )* >( ( array )._get_ior()->d_firstElement ) ) |
#define | HANDLE_ARRAY_PTR(array) ( reinterpret_cast< Entity_Handle* >( ( array )._get_ior()->d_firstElement ) ) |
#define | ARRAY_SIZE(array) ( ( array )._is_nil() ? 0 : ( array ).upper( 0 ) - ( array ).lower( 0 ) + 1 ) |
#define | CHECK_SIZE(array, size) |
#define | VINDEX(i, j, k) ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) ) |
#define | VINDEX(i, j, k) ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) ) |
Typedefs | |
typedef void * | Entity_Handle |
Functions | |
void | query_vert_to_elem (TSTTM::Mesh &mesh) |
void | query_elem_to_vert (TSTTM::Mesh &mesh) |
void | print_time (const bool print_em, double &tot_time, double &utime, double &stime) |
void | build_connect (const int nelem, const int vstart, int *&connect) |
void | testB (TSTTM::Mesh &mesh, const int nelem, sidl::array< double > &coords, const int *connect) |
void | testC (TSTTM::Mesh &mesh, const int nelem, sidl::array< 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, sidl::array< double > &coords) |
int | main (int argc, char *argv[]) |
Variables | |
double | LENGTH = 1.0 |
#define ARRAY_PTR | ( | array, | |
type | |||
) | ( reinterpret_cast< ( type )* >( ( array )._get_ior()->d_firstElement ) ) |
Definition at line 82 of file tstt_perf.cpp.
Referenced by build_coords(), query_elem_to_vert(), and testC().
#define ARRAY_SIZE | ( | array | ) | ( ( array )._is_nil() ? 0 : ( array ).upper( 0 ) - ( array ).lower( 0 ) + 1 ) |
Definition at line 84 of file tstt_perf.cpp.
Referenced by query_elem_to_vert().
#define CAST_INTERFACE | ( | var_in, | |
var_out, | |||
iface | |||
) |
TSTT::iface var_out; \ try \ { \ ( var_out ) = var_in; \ } \ catch( TSTT::Error ) \ { \ cerr << "Error: current interface doesn't support iface." << endl; \ return; \ }
Definition at line 49 of file tstt_perf.cpp.
#define CAST_MINTERFACE | ( | var_in, | |
var_out, | |||
iface | |||
) |
TSTTM::iface var_out; \ try \ { \ ( var_out ) = var_in; \ } \ catch( TSTT::Error ) \ { \ cerr << "Error: current interface doesn't support iface." << endl; \ return; \ }
Definition at line 61 of file tstt_perf.cpp.
Referenced by query_elem_to_vert(), query_vert_to_elem(), testB(), and testC().
#define CHECK_SIZE | ( | array, | |
size | |||
) |
if( ( array )._is_nil() || ARRAY_SIZE( array ) == 0 ) \ ( array ) = ( array ).create1d( size ); \ else if( ARRAY_SIZE( array ) < ( size ) ) \ { \ cerr << "Array passed in is non-zero but too short." << endl; \ assert( false ); \ }
Definition at line 85 of file tstt_perf.cpp.
Referenced by build_coords(), testB(), and testC().
#define HANDLE_ARRAY_PTR | ( | array | ) | ( reinterpret_cast< Entity_Handle* >( ( array )._get_ior()->d_firstElement ) ) |
Definition at line 83 of file tstt_perf.cpp.
Referenced by query_elem_to_vert(), query_vert_to_elem(), testB(), and testC().
#define IMPLEMENTATION_CLASS TSTT_MOAB::MoabMesh |
MOAB, a Mesh-Oriented datABase, is a software component for creating, storing and accessing finite element mesh data.
Copyright 2004 Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software.
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. TSTT Mesh Interface brick mesh performance test
This program tests TSTT mesh interface functions used to create a square structured mesh. Boilerplate taken from tstt mesh interface test in MOAB and performance test in MOAB
Definition at line 46 of file tstt_perf.cpp.
#define VINDEX | ( | i, | |
j, | |||
k | |||
) | ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) ) |
#define VINDEX | ( | i, | |
j, | |||
k | |||
) | ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) ) |
typedef void* Entity_Handle |
Definition at line 78 of file tstt_perf.cpp.
void build_connect | ( | const int | nelem, |
const int | vstart, | ||
int *& | connect | ||
) |
Definition at line 679 of file tstt_perf.cpp.
References VINDEX.
{ // allocate the memory int nume_tot = nelem * nelem * nelem; connect = new int[8 * nume_tot]; int vijk; int numv = nelem + 1; int numv_sq = numv * numv; int idx = 0; for( int i = 0; i < nelem; i++ ) { for( int j = 0; j < nelem; j++ ) { for( int k = 0; k < nelem; k++ ) { vijk = vstart + VINDEX( i, j, k ); connect[idx++] = vijk; connect[idx++] = vijk + 1; connect[idx++] = vijk + 1 + numv; connect[idx++] = vijk + numv; connect[idx++] = vijk + numv * numv; connect[idx++] = vijk + 1 + numv * numv; connect[idx++] = vijk + 1 + numv + numv * numv; connect[idx++] = vijk + numv + numv * numv; assert( i <= numv * numv * numv ); } } } }
void build_coords | ( | const int | nelem, |
sidl::array< double > & | coords | ||
) |
Definition at line 517 of file tstt_perf.cpp.
References ARRAY_PTR, CHECK_SIZE, compute_edge(), compute_face(), LENGTH, print_time(), and VINDEX.
{ double ttime0, ttime1, utime1, stime1; print_time( false, ttime0, utime1, stime1 ); // allocate the memory int numv = nelem + 1; int numv_sq = numv * numv; int tot_numv = numv * numv * numv; CHECK_SIZE( coords, 3 * tot_numv ); double* coords_ptr = ARRAY_PTR( coords, double ); // use FORTRAN-like indexing #define VINDEX( i, j, k ) ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) ) int idx; double scale1, scale2, scale3; // use these to prevent optimization on 1-scale, etc (real map wouldn't have // all these equal) scale1 = LENGTH / nelem; scale2 = LENGTH / nelem; scale3 = LENGTH / nelem; #ifdef REALTFI // use a real TFI xform to compute coordinates // initialize positions of 8 corners coords_ptr[VINDEX( 0, 0, 0 )] = coords_ptr[VINDEX( 0, 0, 0 ) + nelem + 1] = coords_ptr[VINDEX( 0, 0, 0 ) + 2 * ( nelem + 1 )] = 0.0; coords_ptr[VINDEX( 0, nelem, 0 )] = coords_ptr[VINDEX( 0, nelem, 0 ) + 2 * ( nelem + 1 )] = 0.0; coords_ptr[VINDEX( 0, nelem, 0 ) + nelem + 1] = LENGTH; coords_ptr[VINDEX( 0, 0, nelem )] = coords_ptr[VINDEX( 0, 0, nelem ) + nelem + 1] = 0.0; coords_ptr[VINDEX( 0, 0, nelem ) + 2 * ( nelem + 1 )] = LENGTH; coords_ptr[VINDEX( 0, nelem, nelem )] = 0.0; coords_ptr[VINDEX( 0, nelem, nelem ) + nelem + 1] = coords_ptr[VINDEX( 0, nelem, nelem ) + 2 * ( nelem + 1 )] = LENGTH; coords_ptr[VINDEX( nelem, 0, 0 )] = LENGTH; coords_ptr[VINDEX( nelem, 0, 0 ) + nelem + 1] = coords_ptr[VINDEX( nelem, 0, 0 ) + 2 * ( nelem + 1 )] = 0.0; coords_ptr[VINDEX( nelem, 0, nelem )] = coords_ptr[VINDEX( nelem, 0, nelem ) + 2 * ( nelem + 1 )] = LENGTH; coords_ptr[VINDEX( nelem, 0, nelem ) + nelem + 1] = 0.0; coords_ptr[VINDEX( nelem, nelem, 0 )] = coords_ptr[VINDEX( nelem, nelem, 0 ) + nelem + 1] = LENGTH; coords_ptr[VINDEX( nelem, nelem, 0 ) + 2 * ( nelem + 1 )] = 0.0; coords_ptr[VINDEX( nelem, nelem, nelem )] = coords_ptr[VINDEX( nelem, nelem, nelem ) + nelem + 1] = coords_ptr[VINDEX( nelem, nelem, nelem ) + 2 * ( nelem + 1 )] = LENGTH; // compute edges // i (stride=1) compute_edge( &coords_ptr[VINDEX( 0, 0, 0 )], nelem, scale1, 1 ); compute_edge( &coords_ptr[VINDEX( 0, nelem, 0 )], nelem, scale1, 1 ); compute_edge( &coords_ptr[VINDEX( 0, 0, nelem )], nelem, scale1, 1 ); compute_edge( &coords_ptr[VINDEX( 0, nelem, nelem )], nelem, scale1, 1 ); // j (stride=numv) compute_edge( &coords_ptr[VINDEX( 0, 0, 0 )], nelem, scale1, numv ); compute_edge( &coords_ptr[VINDEX( nelem, 0, 0 )], nelem, scale1, numv ); compute_edge( &coords_ptr[VINDEX( 0, 0, nelem )], nelem, scale1, numv ); compute_edge( &coords_ptr[VINDEX( nelem, 0, nelem )], nelem, scale1, numv ); // k (stride=numv^2) compute_edge( &coords_ptr[VINDEX( 0, 0, 0 )], nelem, scale1, numv_sq ); compute_edge( &coords_ptr[VINDEX( nelem, 0, 0 )], nelem, scale1, numv_sq ); compute_edge( &coords_ptr[VINDEX( 0, nelem, 0 )], nelem, scale1, numv_sq ); compute_edge( &coords_ptr[VINDEX( nelem, nelem, 0 )], nelem, scale1, numv_sq ); // compute faces // i=0, nelem compute_face( &coords_ptr[VINDEX( 0, 0, 0 )], nelem, scale1, numv, numv_sq ); compute_face( &coords_ptr[VINDEX( nelem, 0, 0 )], nelem, scale1, numv, numv_sq ); // j=0, nelem compute_face( &coords_ptr[VINDEX( 0, 0, 0 )], nelem, scale1, 1, numv_sq ); compute_face( &coords_ptr[VINDEX( 0, nelem, 0 )], nelem, scale1, 1, numv_sq ); // k=0, nelem compute_face( &coords_ptr[VINDEX( 0, 0, 0 )], nelem, scale1, 1, numv ); compute_face( &coords_ptr[VINDEX( 0, 0, nelem )], nelem, scale1, 1, numv ); // initialize corner indices int i000 = VINDEX( 0, 0, 0 ); int ia00 = VINDEX( nelem, 0, 0 ); int i0t0 = VINDEX( 0, nelem, 0 ); int iat0 = VINDEX( nelem, nelem, 0 ); int i00g = VINDEX( 0, 0, nelem ); int ia0g = VINDEX( nelem, 0, nelem ); int i0tg = VINDEX( 0, nelem, nelem ); int iatg = VINDEX( nelem, nelem, nelem ); double cX, cY, cZ; int adaInts = nelem; int tseInts = nelem; int gammaInts = nelem; for( int i = 1; i < nelem; i++ ) { for( int j = 1; j < nelem; j++ ) { for( int k = 1; k < nelem; k++ ) { // idx = VINDEX(i,j,k); double tse = i * scale1; double ada = j * scale2; double gamma = k * scale3; double tm1 = 1.0 - tse; double am1 = 1.0 - ada; double gm1 = 1.0 - gamma; cX = gm1 * ( am1 * ( tm1 * coords_ptr[i000] + tse * coords_ptr[i0t0] ) + ada * ( tm1 * coords_ptr[ia00] + tse * coords_ptr[iat0] ) ) + gamma * ( am1 * ( tm1 * coords_ptr[i00g] + tse * coords_ptr[i0tg] ) + ada * ( tm1 * coords_ptr[ia0g] + tse * coords_ptr[iatg] ) ); cY = gm1 * ( am1 * ( tm1 * coords_ptr[i000] + tse * coords_ptr[i0t0] ) + ada * ( tm1 * coords_ptr[ia00] + tse * coords_ptr[iat0] ) ) + gamma * ( am1 * ( tm1 * coords_ptr[i00g] + tse * coords_ptr[i0tg] ) + ada * ( tm1 * coords_ptr[ia0g] + tse * coords_ptr[iatg] ) ); cZ = gm1 * ( am1 * ( tm1 * coords_ptr[i000] + tse * coords_ptr[i0t0] ) + ada * ( tm1 * coords_ptr[ia00] + tse * coords_ptr[iat0] ) ) + gamma * ( am1 * ( tm1 * coords_ptr[i00g] + tse * coords_ptr[i0tg] ) + ada * ( tm1 * coords_ptr[ia0g] + tse * coords_ptr[iatg] ) ); double* ai0k = &coords_ptr[VINDEX( k, 0, i )]; double* aiak = &coords_ptr[VINDEX( k, adaInts, i )]; double* a0jk = &coords_ptr[VINDEX( k, j, 0 )]; double* atjk = &coords_ptr[VINDEX( k, j, tseInts )]; double* aij0 = &coords_ptr[VINDEX( 0, j, i )]; double* aijg = &coords_ptr[VINDEX( gammaInts, j, i )]; coords_ptr[VINDEX( i, j, k )] = ( am1 * ai0k[0] + ada * aiak[0] + tm1 * a0jk[0] + tse * atjk[0] + gm1 * aij0[0] + gamma * aijg[0] ) / 2.0 - cX / 2.0; coords_ptr[nelem + 1 + VINDEX( i, j, k )] = ( am1 * ai0k[nelem + 1] + ada * aiak[nelem + 1] + tm1 * a0jk[nelem + 1] + tse * atjk[nelem + 1] + gm1 * aij0[nelem + 1] + gamma * aijg[nelem + 1] ) / 2.0 - cY / 2.0; coords_ptr[2 * ( nelem + 1 ) + VINDEX( i, j, k )] = ( am1 * ai0k[2 * ( nelem + 1 )] + ada * aiak[2 * ( nelem + 1 )] + tm1 * a0jk[2 * ( nelem + 1 )] + tse * atjk[2 * ( nelem + 1 )] + gm1 * aij0[2 * ( nelem + 1 )] + gamma * aijg[2 * ( nelem + 1 )] ) / 2.0 - cZ / 2.0; } } } #else for( int i = 0; i < numv; i++ ) { for( int j = 0; j < numv; j++ ) { for( int k = 0; k < numv; k++ ) { idx = VINDEX( i, j, k ); // blocked coordinate ordering coords_ptr[idx] = i * scale1; coords_ptr[tot_numv + idx] = j * scale2; coords_ptr[2 * tot_numv + idx] = k * scale3; } } } #endif print_time( false, ttime1, utime1, stime1 ); std::cout << "TSTT/MOAB: TFI time = " << ttime1 - ttime0 << " sec" << std::endl; }
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 108 of file tstt_perf.cpp.
References build_connect(), build_coords(), 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; // pre-build the coords array sidl::array< double > coords; build_coords( nelem, coords ); assert( NULL != coords ); int* connect = NULL; build_connect( nelem, 1, connect ); // create an implementation TSTTM::Mesh mesh = IMPLEMENTATION_CLASS::_create(); switch( which_test ) { case 'B': // 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; } return 0; }
void print_time | ( | const bool | print_em, |
double & | tot_time, | ||
double & | utime, | ||
double & | stime | ||
) |
void query_elem_to_vert | ( | TSTTM::Mesh & | mesh | ) |
Definition at line 342 of file tstt_perf.cpp.
References ARRAY_PTR, ARRAY_SIZE, CAST_MINTERFACE, and HANDLE_ARRAY_PTR.
{ sidl::array< Entity_Handle > all_hexes; int all_hexes_size; CAST_MINTERFACE( mesh, mesh_ent, Entity ); // get all the hex elements try { mesh.getEntities( 0, TSTTM::EntityType_REGION, TSTTM::EntityTopology_HEXAHEDRON, all_hexes, all_hexes_size ); } catch( TSTT::Error& /* err */ ) { cerr << "Couldn't get all hex elements in query_mesh" << endl; return; } try { // set up some tmp arrays and array ptrs Entity_Handle* all_hexes_ptr = HANDLE_ARRAY_PTR( all_hexes ); // now loop over elements for( int i = 0; i < all_hexes_size; i++ ) { sidl::array< int > dum_offsets; sidl::array< Entity_Handle > dum_connect; int dum_connect_size = 0; // get the connectivity of this element; will allocate space on 1st iteration, // but will have correct size on subsequent ones mesh_ent.getEntAdj( all_hexes_ptr[i], TSTTM::EntityType_VERTEX, dum_connect, dum_connect_size ); // get vertex coordinates; ; will allocate space on 1st iteration, // but will have correct size on subsequent ones sidl::array< double > dum_coords; int dum_coords_size = 0; TSTTM::StorageOrder order = TSTTM::StorageOrder_UNDETERMINED; mesh.getVtxArrCoords( dum_connect, dum_connect_size, order, dum_coords, dum_coords_size ); assert( 24 == dum_coords_size && ARRAY_SIZE( dum_coords ) == 24 ); double* dum_coords_ptr = ARRAY_PTR( dum_coords, double ); double centroid[3] = { 0.0, 0.0, 0.0 }; if( order == TSTTM::StorageOrder_BLOCKED ) { for( int j = 0; j < 8; j++ ) { centroid[0] += dum_coords_ptr[j]; centroid[1] += dum_coords_ptr[8 + j]; centroid[2] += dum_coords_ptr[16 + j]; centroid[0] += dum_coords.get( j ); centroid[1] += dum_coords.get( 8 + j ); centroid[2] += dum_coords.get( 16 + j ); } } else { for( int j = 0; j < 8; j++ ) { centroid[0] += dum_coords_ptr[3 * j]; centroid[1] += dum_coords_ptr[3 * j + 1]; centroid[2] += dum_coords_ptr[3 * j + 2]; } } } } catch( TSTT::Error& /* err */ ) { cerr << "Problem getting connectivity or vertex coords." << endl; return; } }
void query_vert_to_elem | ( | TSTTM::Mesh & | mesh | ) |
Definition at line 414 of file tstt_perf.cpp.
References CAST_MINTERFACE, and HANDLE_ARRAY_PTR.
{ sidl::array< Entity_Handle > all_verts; int all_verts_size; CAST_MINTERFACE( mesh, mesh_ent, Entity ); // get all the vertices elements try { mesh.getEntities( 0, TSTTM::EntityType_VERTEX, TSTTM::EntityTopology_POINT, all_verts, all_verts_size ); } catch( TSTT::Error& /* err */ ) { cerr << "Couldn't get all vertices in query_vert_to_elem" << endl; return; } try { // set up some tmp arrays and array ptrs Entity_Handle* all_verts_ptr = HANDLE_ARRAY_PTR( all_verts ); // now loop over vertices for( int i = 0; i < all_verts_size; i++ ) { sidl::array< Entity_Handle > dum_hexes; int dum_hexes_size; // get the connectivity of this element; will have to allocate space on every // iteration, since size can vary mesh_ent.getEntAdj( all_verts_ptr[i], TSTTM::EntityType_REGION, dum_hexes, dum_hexes_size ); } } catch( TSTT::Error& /* err */ ) { cerr << "Problem getting connectivity or vertex coords." << endl; return; } }
void testB | ( | TSTTM::Mesh & | mesh, |
const int | nelem, | ||
sidl::array< double > & | coords, | ||
const int * | connect | ||
) |
Definition at line 157 of file tstt_perf.cpp.
References CAST_MINTERFACE, CHECK_SIZE, HANDLE_ARRAY_PTR, print_time(), query_elem_to_vert(), and query_vert_to_elem().
{ double utime, stime, ttime0, ttime1, ttime2, ttime3; print_time( false, ttime0, utime, stime ); int num_verts = ( nelem + 1 ) * ( nelem + 1 ) * ( nelem + 1 ); int num_elems = nelem * nelem * nelem; // create vertices as a block CAST_MINTERFACE( mesh, mesh_arrmod, ArrMod ); sidl::array< Entity_Handle > sidl_vertices, dum_handles; CHECK_SIZE( dum_handles, num_verts ); int sidl_vertices_size; try { mesh_arrmod.createVtxArr( num_verts, TSTTM::StorageOrder_BLOCKED, coords, 3 * num_verts, sidl_vertices, sidl_vertices_size ); } catch( TSTT::Error& /* err */ ) { cerr << "Couldn't create vertices in bulk call" << endl; return; } // need to explicitly fill connectivity array, since we don't know // the format of entity handles sidl::array< Entity_Handle > sidl_connect; int sidl_connect_size = 8 * num_elems; CHECK_SIZE( sidl_connect, 8 * num_elems ); Entity_Handle* sidl_connect_ptr = HANDLE_ARRAY_PTR( sidl_connect ); Entity_Handle* sidl_vertices_ptr = HANDLE_ARRAY_PTR( sidl_vertices ); for( int i = 0; i < sidl_connect_size; i++ ) { // use connect[i]-1 because we used starting vertex index (vstart) of 1 assert( connect[i] - 1 < num_verts ); sidl_connect_ptr[i] = sidl_vertices_ptr[connect[i] - 1]; } // create the entities sidl::array< Entity_Handle > new_hexes; int new_hexes_size; sidl::array< TSTTM::CreationStatus > status; int status_size; try { mesh_arrmod.createEntArr( TSTTM::EntityTopology_HEXAHEDRON, sidl_connect, sidl_connect_size, new_hexes, new_hexes_size, status, status_size ); } catch( TSTT::Error& /* err */ ) { cerr << "Couldn't create hex elements in bulk call" << endl; return; } print_time( false, ttime1, utime, stime ); // query the mesh 2 ways query_elem_to_vert( mesh ); print_time( false, ttime2, utime, stime ); query_vert_to_elem( mesh ); print_time( false, ttime3, utime, stime ); std::cout << "TSTT/MOAB ucd blocked: nelem, construct, e_to_v query, v_to_e query = " << nelem << ", " << ttime1 - ttime0 << ", " << ttime2 - ttime1 << ", " << ttime3 - ttime2 << " seconds" << std::endl; }
void testC | ( | TSTTM::Mesh & | mesh, |
const int | nelem, | ||
sidl::array< double > & | coords | ||
) |
Definition at line 229 of file tstt_perf.cpp.
References ARRAY_PTR, CAST_MINTERFACE, CHECK_SIZE, HANDLE_ARRAY_PTR, print_time(), query_elem_to_vert(), query_vert_to_elem(), and VINDEX.
{ double utime, stime, ttime0, ttime1, ttime2, ttime3; print_time( false, ttime0, utime, stime ); CAST_MINTERFACE( mesh, mesh_arrmod, ArrMod ); // 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 sidl::array< Entity_Handle > sidl_vertices; // int sidl_vertices_size = num_verts; CHECK_SIZE( sidl_vertices, num_verts ); // temporary array to hold vertex positions for single vertex sidl::array< double > tmp_coords; int tmp_coords_size = 3; CHECK_SIZE( tmp_coords, 3 ); double* dum_coords = ARRAY_PTR( tmp_coords, double ); // get direct pointer to coordinate array double* coords_ptr = ARRAY_PTR( coords, double ); for( int i = 0; i < num_verts; i++ ) { // temporary array to hold (single) vertices sidl::array< Entity_Handle > tmp_vertices; int tmp_vertices_size = 0; // create the vertex dum_coords[0] = coords_ptr[i]; dum_coords[1] = coords_ptr[num_verts + i]; dum_coords[2] = coords_ptr[2 * num_verts + i]; try { mesh_arrmod.createVtxArr( 1, TSTTM::StorageOrder_BLOCKED, tmp_coords, tmp_coords_size, tmp_vertices, tmp_vertices_size ); } catch( TSTT::Error& /* err */ ) { cerr << "Couldn't create vertex in individual call" << endl; return; } // assign into permanent vertex array sidl_vertices.set( i, tmp_vertices.get( 0 ) ); } // get vertex array pointer for reading into tmp_conn Entity_Handle* tmp_sidl_vertices = HANDLE_ARRAY_PTR( sidl_vertices ); for( int i = 0; i < nelem; i++ ) { for( int j = 0; j < nelem; j++ ) { for( int k = 0; k < nelem; k++ ) { sidl::array< Entity_Handle > tmp_conn; int tmp_conn_size = 8; CHECK_SIZE( tmp_conn, 8 ); int vijk = VINDEX( i, j, k ); tmp_conn.set( 0, tmp_sidl_vertices[vijk] ); tmp_conn.set( 1, tmp_sidl_vertices[vijk + 1] ); tmp_conn.set( 2, tmp_sidl_vertices[vijk + 1 + numv] ); tmp_conn.set( 3, tmp_sidl_vertices[vijk + numv] ); tmp_conn.set( 4, tmp_sidl_vertices[vijk + numv * numv] ); tmp_conn.set( 5, tmp_sidl_vertices[vijk + 1 + numv * numv] ); tmp_conn.set( 6, tmp_sidl_vertices[vijk + 1 + numv + numv * numv] ); tmp_conn.set( 7, tmp_sidl_vertices[vijk + numv + numv * numv] ); // create the entity sidl::array< Entity_Handle > new_hex; int new_hex_size = 0; sidl::array< TSTTM::CreationStatus > status; int status_size = 0; try { mesh_arrmod.createEntArr( TSTTM::EntityTopology_HEXAHEDRON, tmp_conn, tmp_conn_size, new_hex, new_hex_size, status, status_size ); } catch( TSTT::Error& /* err */ ) { cerr << "Couldn't create hex element in individual call" << endl; return; } } } } print_time( false, ttime1, utime, stime ); // query the mesh 2 ways query_elem_to_vert( mesh ); print_time( false, ttime2, utime, stime ); query_vert_to_elem( mesh ); print_time( false, ttime3, utime, stime ); std::cout << "TSTT/MOAB ucd indiv: nelem, construct, e_to_v query, v_to_e query = " << nelem << ", " << ttime1 - ttime0 << ", " << ttime2 - ttime1 << ", " << ttime3 - ttime2 << " seconds" << std::endl; }
double LENGTH = 1.0 |
Definition at line 94 of file tstt_perf.cpp.