MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include <sys/resource.h>
#include <cstdlib>
#include <cstdio>
#include <cassert>
#include <iostream>
#include "moab/Core.hpp"
#include "moab/ReadUtilIface.hpp"
#include "VertexSequence.hpp"
#include "StructuredElementSeq.hpp"
#include "EntitySequence.hpp"
#include "SequenceManager.hpp"
#include "moab/HomXform.hpp"
#include "moab/SetIterator.hpp"
Go to the source code of this file.
Defines | |
#define | IS_BUILDING_MB |
#define | RC(msg) |
#define | RR(msg) |
#define | VINDEX(i, j, k) ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) ) |
Functions | |
void | testA (const int nelem, const double *coords) |
void | testB (const int nelem, const double *coords, int *connect) |
void | testC (const int nelem, const double *coords) |
void | testD (const int nelem, const double *coords, int ver) |
void | testE (const int nelem, const double *coords, int *connect) |
void | print_time (const bool print_em, double &tot_time, double &utime, double &stime, long &imem, long &rmem) |
void | query_vert_to_elem () |
void | query_elem_to_vert () |
void | query_struct_elem_to_vert () |
void | query_elem_to_vert_direct () |
void | query_vert_to_elem_direct () |
ErrorCode | normalize_elems (double *coords) |
void | check_answers (const char *) |
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) |
void | build_connect (const int nelem, const EntityHandle, int *&connect) |
void | init () |
int | main (int argc, char *argv[]) |
void | query_elem_to_vert_iters (int chunk_size, bool check_valid, std::vector< EntityHandle > &connect, double *dum_coords, double *dum_pos) |
void | query_vert_to_elem_iters (int chunk_size, bool check_valid, std::vector< EntityHandle > &, double *dum_coords, double *dum_pos) |
Variables | |
double | LENGTH = 1.0 |
Interface * | gMB |
Tag | pos_tag |
Tag | pos2_tag |
#define IS_BUILDING_MB |
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.
#define RC | ( | msg | ) |
if( MB_SUCCESS != result ) do \ { \ std::cout << "FAIL in " << ( msg ) << std::endl; \ return; \ } while( true )
Definition at line 67 of file perf.cpp.
Referenced by check_answers(), query_elem_to_vert(), query_elem_to_vert_direct(), query_elem_to_vert_iters(), query_struct_elem_to_vert(), query_vert_to_elem(), query_vert_to_elem_iters(), testA(), testB(), testC(), testD(), and testE().
#define RR | ( | msg | ) |
if( MB_SUCCESS != result ) do \ { \ std::cout << "FAIL in " << ( msg ) << std::endl; \ return result; \ } while( true )
Definition at line 73 of file perf.cpp.
Referenced by normalize_elems().
#define VINDEX | ( | i, | |
j, | |||
k | |||
) | ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) ) |
void build_connect | ( | const int | nelem, |
const EntityHandle | , | ||
int *& | connect | ||
) |
Definition at line 268 of file perf.cpp.
References VINDEX.
{ // allocate the memory int nume_tot = nelem * nelem * nelem; connect = new int[8 * nume_tot]; EntityHandle 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 = 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, |
double *& | coords | ||
) |
Definition at line 125 of file perf.cpp.
References compute_edge(), compute_face(), LENGTH, print_time(), and VINDEX.
{ double ttime0 = 0.0, ttime1 = 0.0, utime1 = 0.0, stime1 = 0.0; long imem = 0, rmem = 0; print_time( false, ttime0, utime1, stime1, imem, rmem ); // allocate the memory int numv = nelem + 1; int numv_sq = numv * numv; int tot_numv = numv * numv * numv; coords = new double[3 * tot_numv]; // 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 // compute edges // i (stride=1) compute_edge( &coords[VINDEX( 0, 0, 0 )], nelem, scale1, 1 ); compute_edge( &coords[VINDEX( 0, nelem, 0 )], nelem, scale1, 1 ); compute_edge( &coords[VINDEX( 0, 0, nelem )], nelem, scale1, 1 ); compute_edge( &coords[VINDEX( 0, nelem, nelem )], nelem, scale1, 1 ); // j (stride=numv) compute_edge( &coords[VINDEX( 0, 0, 0 )], nelem, scale1, numv ); compute_edge( &coords[VINDEX( nelem, 0, 0 )], nelem, scale1, numv ); compute_edge( &coords[VINDEX( 0, 0, nelem )], nelem, scale1, numv ); compute_edge( &coords[VINDEX( nelem, 0, nelem )], nelem, scale1, numv ); // k (stride=numv^2) compute_edge( &coords[VINDEX( 0, 0, 0 )], nelem, scale1, numv_sq ); compute_edge( &coords[VINDEX( nelem, 0, 0 )], nelem, scale1, numv_sq ); compute_edge( &coords[VINDEX( 0, nelem, 0 )], nelem, scale1, numv_sq ); compute_edge( &coords[VINDEX( nelem, nelem, 0 )], nelem, scale1, numv_sq ); // compute faces // i=0, nelem compute_face( &coords[VINDEX( 0, 0, 0 )], nelem, scale1, numv, numv_sq ); compute_face( &coords[VINDEX( nelem, 0, 0 )], nelem, scale1, numv, numv_sq ); // j=0, nelem compute_face( &coords[VINDEX( 0, 0, 0 )], nelem, scale1, 1, numv_sq ); compute_face( &coords[VINDEX( 0, nelem, 0 )], nelem, scale1, 1, numv_sq ); // k=0, nelem compute_face( &coords[VINDEX( 0, 0, 0 )], nelem, scale1, 1, numv ); compute_face( &coords[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[i000] + tse * coords[i0t0] ) + ada * ( tm1 * coords[ia00] + tse * coords[iat0] ) ) + gamma * ( am1 * ( tm1 * coords[i00g] + tse * coords[i0tg] ) + ada * ( tm1 * coords[ia0g] + tse * coords[iatg] ) ); cY = gm1 * ( am1 * ( tm1 * coords[i000] + tse * coords[i0t0] ) + ada * ( tm1 * coords[ia00] + tse * coords[iat0] ) ) + gamma * ( am1 * ( tm1 * coords[i00g] + tse * coords[i0tg] ) + ada * ( tm1 * coords[ia0g] + tse * coords[iatg] ) ); cZ = gm1 * ( am1 * ( tm1 * coords[i000] + tse * coords[i0t0] ) + ada * ( tm1 * coords[ia00] + tse * coords[iat0] ) ) + gamma * ( am1 * ( tm1 * coords[i00g] + tse * coords[i0tg] ) + ada * ( tm1 * coords[ia0g] + tse * coords[iatg] ) ); double* ai0k = &coords[VINDEX( k, 0, i )]; double* aiak = &coords[VINDEX( k, adaInts, i )]; double* a0jk = &coords[VINDEX( k, j, 0 )]; double* atjk = &coords[VINDEX( k, j, tseInts )]; double* aij0 = &coords[VINDEX( 0, j, i )]; double* aijg = &coords[VINDEX( gammaInts, j, i )]; coords[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[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[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[idx] = i * scale1; coords[tot_numv + idx] = j * scale2; coords[2 * tot_numv + idx] = k * scale3; } } } #endif print_time( false, ttime1, utime1, stime1, imem, rmem ); // std::cout << "MOAB: TFI time = " << ttime1-ttime0 << " sec" // << std::endl; }
void check_answers | ( | const char * | ) |
Definition at line 1230 of file perf.cpp.
References moab::Range::begin(), moab::Range::end(), ErrorCode, moab::Interface::get_entities_by_type(), gMB, MBHEX, pos2_tag, pos_tag, RC, and moab::Interface::tag_get_data().
Referenced by testA(), testB(), testC(), testD(), and testE().
{ Range elems; ErrorCode result = gMB->get_entities_by_type( 0, MBHEX, elems ); RC( "check_answers" ); double coords1[3], coords2[3], del[3]; double diff = 0.0; for( Range::iterator vit = elems.begin(); vit != elems.end(); ++vit ) { result = gMB->tag_get_data( pos_tag, &( *vit ), 1, coords1 ); RC( "check_answers" ); result = gMB->tag_get_data( pos2_tag, &( *vit ), 1, coords2 ); RC( "check_answers" ); for( int i = 0; i < 3; i++ ) del[i] = fabs( coords1[i] - coords2[i] ); if( del[0] || del[1] || del[2] ) { double len2 = std::max( coords1[0] * coords1[0] + coords1[1] * coords1[1] + coords1[2] * coords1[2], coords2[0] * coords2[0] + coords2[1] * coords2[1] + coords2[2] * coords2[2] ), num = del[0] * del[0] + del[1] * del[1] + del[2] * del[2]; if( len2 > 0.0 ) diff = std::max( diff, num / sqrt( len2 ) ); else if( num > 0.0 ) diff = sqrt( num ); } } if( diff > 0.0 ) std::cout << "Max relative difference = " << diff << std::endl; }
void compute_edge | ( | double * | start, |
const int | nelem, | ||
const double | xint, | ||
const int | stride | ||
) |
Definition at line 80 of file perf.cpp.
Referenced by build_coords().
{ for( int i = 1; i < nelem; i++ ) { start[i * stride] = start[0] + i * xint; start[nelem + 1 + i * stride] = start[nelem + 1] + i * xint; start[2 * ( nelem + 1 ) + i * stride] = start[2 * ( nelem + 1 )] + i * xint; } }
void compute_face | ( | double * | a, |
const int | nelem, | ||
const double | xint, | ||
const int | stride1, | ||
const int | stride2 | ||
) |
Definition at line 90 of file perf.cpp.
Referenced by build_coords().
{ // 2D TFI on a face starting at a, with strides stride1 in ada and stride2 in tse for( int j = 1; j < nelem; j++ ) { double tse = j * xint; for( int i = 1; i < nelem; i++ ) { double ada = i * xint; a[i * stride1 + j * stride2] = ( 1.0 - ada ) * a[i * stride1] + ada * a[i * stride1 + nelem * stride2] + ( 1.0 - tse ) * a[j * stride2] + tse * a[j * stride2 + nelem * stride1] - ( 1.0 - tse ) * ( 1.0 - ada ) * a[0] - ( 1.0 - tse ) * ada * a[nelem * stride1] - tse * ( 1.0 - ada ) * a[nelem * stride2] - tse * ada * a[nelem * ( stride1 + stride2 )]; a[nelem + 1 + i * stride1 + j * stride2] = ( 1.0 - ada ) * a[nelem + 1 + i * stride1] + ada * a[nelem + 1 + i * stride1 + nelem * stride2] + ( 1.0 - tse ) * a[nelem + 1 + j * stride2] + tse * a[nelem + 1 + j * stride2 + nelem * stride1] - ( 1.0 - tse ) * ( 1.0 - ada ) * a[nelem + 1 + 0] - ( 1.0 - tse ) * ada * a[nelem + 1 + nelem * stride1] - tse * ( 1.0 - ada ) * a[nelem + 1 + nelem * stride2] - tse * ada * a[nelem + 1 + nelem * ( stride1 + stride2 )]; a[2 * ( nelem + 1 ) + i * stride1 + j * stride2] = ( 1.0 - ada ) * a[2 * ( nelem + 1 ) + i * stride1] + ada * a[2 * ( nelem + 1 ) + i * stride1 + nelem * stride2] + ( 1.0 - tse ) * a[2 * ( nelem + 1 ) + j * stride2] + tse * a[2 * ( nelem + 1 ) + j * stride2 + nelem * stride1] - ( 1.0 - tse ) * ( 1.0 - ada ) * a[2 * ( nelem + 1 ) + 0] - ( 1.0 - tse ) * ada * a[2 * ( nelem + 1 ) + nelem * stride1] - tse * ( 1.0 - ada ) * a[2 * ( nelem + 1 ) + nelem * stride2] - tse * ada * a[2 * ( nelem + 1 ) + nelem * ( stride1 + stride2 )]; } } }
void init | ( | ) |
Definition at line 302 of file perf.cpp.
References ErrorCode, gMB, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_DENSE, MB_TYPE_DOUBLE, pos2_tag, pos_tag, and moab::Interface::tag_get_handle().
Referenced by do_kdtree_test(), do_linear_test(), FBiGeom_getArrBoundBox(), main(), regression_insert_set_1(), moab::SpectralQuad::reverseEvalFcn(), moab::Core::tag_iterate(), test_optional_arg(), testA(), testB(), testC(), testD(), and testE().
{ gMB = new Core(); double def_val[3] = { 0.0, 0.0, 0.0 }; ErrorCode rval = gMB->tag_get_handle( "position_tag", 3, MB_TYPE_DOUBLE, pos_tag, MB_TAG_DENSE | MB_TAG_CREAT, def_val ); assert( MB_SUCCESS == rval ); if( rval ) { } // empty line to remove compiler warning rval = gMB->tag_get_handle( "position2_tag", 3, MB_TYPE_DOUBLE, pos2_tag, MB_TAG_DENSE | MB_TAG_CREAT, def_val ); assert( MB_SUCCESS == rval ); }
int main | ( | int | argc, |
char * | argv[] | ||
) |
Definition at line 316 of file perf.cpp.
References build_connect(), build_coords(), testA(), testB(), testC(), testD(), and testE().
{ int nelem = 20; if( argc < 3 ) { std::cout << "Usage: " << argv[0] << " <ints_per_side> [A|B|C|D [1|2|3|4]|E]" << std::endl; return 1; } char which_test = '\0'; int ver = 0; sscanf( argv[1], "%d", &nelem ); if( argc >= 3 ) sscanf( argv[2], "%c", &which_test ); if( argc >= 4 ) sscanf( argv[3], "%d", &ver ); if( 3 <= argc && which_test != 'A' && which_test != 'B' && which_test != 'C' && which_test != 'D' && which_test != 'E' ) { std::cout << "Must indicate A or B, C, D or E for test." << std::endl; return 1; } if( 4 <= argc && which_test == 'D' && ( ver < 1 || ver > 4 ) ) { std::cout << "Must indicate version 1, 2, 3, or 4 for test D." << std::endl; return 1; } // std::cout << "number of elements: " << nelem << "; test " // << which_test << std::endl; // pre-build the coords array double* coords = NULL; build_coords( nelem, coords ); assert( NULL != coords ); int* connect = NULL; // test A: create structured mesh if( '\0' == which_test || 'A' == which_test ) testA( nelem, coords ); build_connect( nelem, 1, connect ); // test B: create mesh using bulk interface if( '\0' == which_test || 'B' == which_test ) testB( nelem, coords, connect ); // test C: create mesh using individual interface if( '\0' == which_test || 'C' == which_test ) testC( nelem, coords ); // test D: query mesh using iterators if( '\0' == which_test || 'D' == which_test ) testD( nelem, coords, ver ); // test E: query mesh using direct access if( '\0' == which_test || 'E' == which_test ) testE( nelem, coords, connect ); return 0; }
ErrorCode normalize_elems | ( | double * | coords | ) |
Definition at line 526 of file perf.cpp.
References moab::Range::begin(), moab::Range::end(), ErrorCode, moab::Interface::get_entities_by_type(), gMB, MBHEX, pos2_tag, RR, moab::Interface::tag_get_data(), and moab::Interface::tag_set_data().
Referenced by query_vert_to_elem(), and query_vert_to_elem_iters().
{ // get all hexes and divide pos_tag by 8 Range elems; ErrorCode result = gMB->get_entities_by_type( 0, MBHEX, elems ); RR( "normalize" ); for( Range::iterator vit = elems.begin(); vit != elems.end(); ++vit ) { result = gMB->tag_get_data( pos2_tag, &( *vit ), 1, coords ); RR( "normalize" ); coords[0] *= 0.125; coords[1] *= 0.125; coords[2] *= 0.125; result = gMB->tag_set_data( pos2_tag, &( *vit ), 1, coords ); RR( "normalize" ); } return result; }
void print_time | ( | const bool | print_em, |
double & | tot_time, | ||
double & | utime, | ||
double & | stime, | ||
long & | imem, | ||
long & | rmem | ||
) |
Definition at line 586 of file perf.cpp.
{ struct rusage r_usage; getrusage( RUSAGE_SELF, &r_usage ); utime = (double)r_usage.ru_utime.tv_sec + ( (double)r_usage.ru_utime.tv_usec / 1.e6 ); stime = (double)r_usage.ru_stime.tv_sec + ( (double)r_usage.ru_stime.tv_usec / 1.e6 ); tot_time = utime + stime; if( print_em ) std::cout << "User, system, total time = " << utime << ", " << stime << ", " << tot_time << std::endl; #ifndef LINUX if( print_em ) { std::cout << "Max resident set size = " << r_usage.ru_maxrss << " kbytes" << std::endl; std::cout << "Int resident set size = " << r_usage.ru_idrss << std::endl; } imem = r_usage.ru_idrss; rmem = r_usage.ru_maxrss; #else system( "ps o args,drs,rss | grep perf | grep -v grep" ); // RedHat 9.0 doesnt fill in actual // memory data imem = rmem = 0; #endif }
void query_elem_to_vert | ( | ) |
Definition at line 375 of file perf.cpp.
References moab::Range::begin(), moab::Range::end(), ErrorCode, moab::Interface::get_connectivity(), moab::Interface::get_coords(), moab::Interface::get_entities_by_type(), gMB, MBHEX, pos_tag, RC, and moab::Interface::tag_set_data().
Referenced by testB(), and testC().
{ Range all_hexes; ErrorCode result = gMB->get_entities_by_type( 0, MBHEX, all_hexes ); RC( "query_elem_to_vert" ); const EntityHandle* connect; int num_connect; double dum_coords[24]; for( Range::iterator eit = all_hexes.begin(); eit != all_hexes.end(); ++eit ) { result = gMB->get_connectivity( *eit, connect, num_connect ); RC( "query_elem_to_vert" ); result = gMB->get_coords( connect, num_connect, dum_coords ); RC( "query_elem_to_vert" ); // compute the centroid double centroid[3] = { 0.0, 0.0, 0.0 }; for( int j = 0; j < 8; j++ ) { centroid[0] += dum_coords[3 * j + 0]; centroid[1] += dum_coords[3 * j + 1]; centroid[2] += dum_coords[3 * j + 2]; } centroid[0] *= 0.125; centroid[1] *= 0.125; centroid[2] *= 0.125; result = gMB->tag_set_data( pos_tag, &( *eit ), 1, centroid ); RC( "query_elem_to_vert" ); } }
void query_elem_to_vert_direct | ( | ) |
Definition at line 1115 of file perf.cpp.
References moab::Range::begin(), moab::Interface::connect_iterate(), moab::Interface::coords_iterate(), moab::Range::end(), ErrorCode, moab::Interface::get_entities_by_type(), gMB, MB_SUCCESS, MBHEX, MBVERTEX, pos_tag, RC, moab::Range::size(), and moab::Interface::tag_iterate().
Referenced by testE().
{ Range all_hexes, all_verts; ErrorCode result = gMB->get_entities_by_type( 0, MBHEX, all_hexes ); assert( MB_SUCCESS == result ); result = gMB->get_entities_by_type( 0, MBVERTEX, all_verts ); RC( "query_elem_to_vert_direct" ); EntityHandle* connect; int ecount, vcount, vpere; double* coords[3]; result = gMB->connect_iterate( all_hexes.begin(), all_hexes.end(), connect, vpere, ecount ); if( MB_SUCCESS != result || ecount != (int)all_hexes.size() ) { std::cout << "FAILED in connect_iterate!" << std::endl; return; } result = gMB->coords_iterate( all_verts.begin(), all_verts.end(), coords[0], coords[1], coords[2], vcount ); if( MB_SUCCESS != result || vcount != (int)all_verts.size() ) { std::cout << "FAILED in coords_iterate!" << std::endl; return; } double* centroid; result = gMB->tag_iterate( pos_tag, all_hexes.begin(), all_hexes.end(), ecount, (void*&)centroid ); if( MB_SUCCESS != result || ecount != (int)all_hexes.size() ) { std::cout << "FAILED in connect_iterate!" << std::endl; return; } EntityHandle vstart = *all_verts.begin(); for( int i = 0; i < ecount; i++ ) { // compute the centroid for( int j = 0; j < vpere; j++ ) { int vind = *connect - vstart; connect++; centroid[3 * i + 0] += coords[0][vind]; centroid[3 * i + 1] += coords[1][vind]; centroid[3 * i + 2] += coords[2][vind]; } // now normalize centroid[3 * i + 0] *= 0.125; centroid[3 * i + 1] *= 0.125; centroid[3 * i + 2] *= 0.125; } }
void query_elem_to_vert_iters | ( | int | chunk_size, |
bool | check_valid, | ||
std::vector< EntityHandle > & | connect, | ||
double * | dum_coords, | ||
double * | dum_pos | ||
) |
Definition at line 441 of file perf.cpp.
References moab::Interface::create_set_iterator(), ErrorCode, moab::Interface::get_connectivity(), moab::Interface::get_coords(), moab::SetIterator::get_next_arr(), gMB, MBHEX, pos_tag, RC, moab::Interface::tag_get_data(), and moab::Interface::tag_set_data().
Referenced by testD().
{ std::vector< EntityHandle > hexes; SetIterator* iter; ErrorCode result = gMB->create_set_iterator( 0, MBHEX, -1, chunk_size, check_valid, iter ); RC( "query_elem_to_vert_iters" ); bool atend = false; while( !atend ) { hexes.clear(); result = iter->get_next_arr( hexes, atend ); RC( "query_elem_to_vert_iters" ); result = gMB->get_connectivity( &hexes[0], hexes.size(), connect ); RC( "query_elem_to_vert_iters" ); result = gMB->get_coords( &connect[0], connect.size(), dum_coords ); RC( "query_elem_to_vert_iters" ); result = gMB->tag_get_data( pos_tag, &hexes[0], hexes.size(), dum_pos ); RC( "query_elem_to_vert_iters" ); for( unsigned int i = 0; i < hexes.size(); i++ ) { // compute the centroid for( int j = 0; j < 8; j++ ) { dum_pos[3 * i + 0] += dum_coords[24 * i + 3 * j]; dum_pos[3 * i + 1] += dum_coords[24 * i + 3 * j + 1]; dum_pos[3 * i + 2] += dum_coords[24 * i + 3 * j + 2]; } dum_pos[3 * i + 0] *= 0.125; dum_pos[3 * i + 1] *= 0.125; dum_pos[3 * i + 2] *= 0.125; } result = gMB->tag_set_data( pos_tag, &hexes[0], hexes.size(), dum_pos ); RC( "query_elem_to_vert_iters" ); } delete iter; }
void query_struct_elem_to_vert | ( | ) |
Definition at line 547 of file perf.cpp.
References moab::Range::begin(), moab::Range::end(), ErrorCode, moab::Interface::get_connectivity(), moab::Interface::get_coords(), moab::Interface::get_entities_by_type(), gMB, MBHEX, pos_tag, RC, and moab::Interface::tag_set_data().
Referenced by testA().
{ // assumes brick mapped mesh with handles starting at zero Range all_hexes; ErrorCode result = gMB->get_entities_by_type( 0, MBHEX, all_hexes ); RC( "query_struct_elem_to_vert" ); double dum_coords[24]; std::vector< EntityHandle > connect; for( Range::iterator eit = all_hexes.begin(); eit != all_hexes.end(); ++eit ) { result = gMB->get_connectivity( &( *eit ), 1, connect ); RC( "query_struct_elem_to_vert" ); result = gMB->get_coords( &connect[0], connect.size(), dum_coords ); RC( "query_struct_elem_to_vert" ); double centroid[3] = { 0.0, 0.0, 0.0 }; for( int j = 0; j < 8; j++ ) { centroid[0] += dum_coords[3 * j + 0]; centroid[1] += dum_coords[3 * j + 1]; centroid[2] += dum_coords[3 * j + 2]; } centroid[0] *= 0.125; centroid[1] *= 0.125; centroid[2] *= 0.125; result = gMB->tag_set_data( pos_tag, &( *eit ), 1, centroid ); RC( "query_struct_elem_to_vert" ); } }
void query_vert_to_elem | ( | ) |
Definition at line 406 of file perf.cpp.
References moab::Range::begin(), moab::Range::end(), ErrorCode, moab::Interface::get_adjacencies(), moab::Interface::get_coords(), moab::Interface::get_entities_by_type(), gMB, MBVERTEX, normalize_elems(), pos2_tag, RC, moab::Interface::tag_get_data(), and moab::Interface::tag_set_data().
Referenced by testA(), testB(), and testC().
{ Range all_verts; std::vector< EntityHandle > neighbor_hexes; std::vector< double > neighbor_pos; double coords[3]; neighbor_pos.resize( 3 * 8 ); // average vertex will have 8 adjacent hexes ErrorCode result = gMB->get_entities_by_type( 0, MBVERTEX, all_verts ); RC( "query_vert_to_elem" ); for( Range::iterator vit = all_verts.begin(); vit != all_verts.end(); ++vit ) { neighbor_hexes.clear(); result = gMB->get_coords( &( *vit ), 1, coords ); RC( "query_vert_to_elem" ); result = gMB->get_adjacencies( &( *vit ), 1, 3, false, neighbor_hexes ); RC( "query_vert_to_elem" ); assert( neighbor_pos.size() >= 3 * neighbor_hexes.size() ); result = gMB->tag_get_data( pos2_tag, &neighbor_hexes[0], neighbor_hexes.size(), &neighbor_pos[0] ); RC( "query_vert_to_elem" ); for( unsigned int i = 0; i < neighbor_hexes.size(); i++ ) { neighbor_pos[3 * i] += coords[0]; neighbor_pos[3 * i + 1] += coords[1]; neighbor_pos[3 * i + 2] += coords[2]; } result = gMB->tag_set_data( pos2_tag, &neighbor_hexes[0], neighbor_hexes.size(), &neighbor_pos[0] ); RC( "query_vert_to_elem" ); } // get all hexes and divide pos_tag by 8; reuse all_verts result = normalize_elems( coords ); RC( "query_vert_to_elem" ); }
void query_vert_to_elem_direct | ( | ) |
Definition at line 1166 of file perf.cpp.
References moab::Interface::adjacencies_iterate(), moab::Range::begin(), moab::Range::clear(), moab::Interface::coords_iterate(), moab::Range::end(), ErrorCode, moab::Interface::get_adjacencies(), moab::Interface::get_entities_by_type(), gMB, MB_SUCCESS, MBHEX, MBVERTEX, pos2_tag, moab::Range::size(), and moab::Interface::tag_iterate().
Referenced by testE().
{ Range all_verts, tmp_ents; ErrorCode result = gMB->get_entities_by_type( 0, MBVERTEX, all_verts ); assert( MB_SUCCESS == result ); // make sure vertex-element adjacencies are created result = gMB->get_adjacencies( &( *all_verts.begin() ), 1, 3, false, tmp_ents ); assert( MB_SUCCESS == result ); const std::vector< EntityHandle >** adjs; int count; result = gMB->adjacencies_iterate( all_verts.begin(), all_verts.end(), adjs, count ); if( MB_SUCCESS != result && count != (int)all_verts.size() ) { std::cout << "FAILED:adjacencies_iterate." << std::endl; return; } double* coords[3]; result = gMB->coords_iterate( all_verts.begin(), all_verts.end(), coords[0], coords[1], coords[2], count ); if( MB_SUCCESS != result || count != (int)all_verts.size() ) { std::cout << "FAILED in coords_iterate!" << std::endl; return; } // get all hexes, then iterator over pos2_tag double* centroid; int ecount; tmp_ents.clear(); result = gMB->get_entities_by_type( 0, MBHEX, tmp_ents ); assert( MB_SUCCESS == result ); result = gMB->tag_iterate( pos2_tag, tmp_ents.begin(), tmp_ents.end(), ecount, (void*&)centroid ); if( MB_SUCCESS != result || ecount != (int)tmp_ents.size() ) { std::cout << "FAILED in tag_iterate!" << std::endl; return; } int i; Range::iterator vit; EntityHandle estart = *tmp_ents.begin(); for( vit = all_verts.begin(), i = 0; vit != all_verts.end(); ++vit, i++ ) { assert( adjs[i] ); for( std::vector< EntityHandle >::const_iterator vit2 = adjs[i]->begin(); vit2 != adjs[i]->end(); ++vit2 ) if( *vit >= estart ) { int eind = *vit2 - estart; centroid[3 * eind + 0] += coords[0][i]; centroid[3 * eind + 1] += coords[1][i]; centroid[3 * eind + 2] += coords[2][i]; } } // now normalize for( i = 0; i < (int)tmp_ents.size(); i++ ) { centroid[3 * i + 0] *= 0.125; centroid[3 * i + 1] *= 0.125; centroid[3 * i + 2] *= 0.125; } }
void query_vert_to_elem_iters | ( | int | chunk_size, |
bool | check_valid, | ||
std::vector< EntityHandle > & | , | ||
double * | dum_coords, | ||
double * | dum_pos | ||
) |
Definition at line 483 of file perf.cpp.
References moab::Interface::create_set_iterator(), ErrorCode, moab::Interface::get_adjacencies(), moab::Interface::get_coords(), moab::SetIterator::get_next_arr(), gMB, MB_SUCCESS, MBVERTEX, normalize_elems(), pos2_tag, RC, moab::Interface::tag_get_data(), and moab::Interface::tag_set_data().
Referenced by testD().
{ std::vector< EntityHandle > verts, neighbor_hexes; SetIterator* iter; ErrorCode result = gMB->create_set_iterator( 0, MBVERTEX, -1, chunk_size, check_valid, iter ); RC( "query_vert_to_elem_iters" ); assert( MB_SUCCESS == result ); bool atend = false; while( !atend ) { verts.clear(); result = iter->get_next_arr( verts, atend ); RC( "query_vert_to_elem_iters" ); result = gMB->get_coords( &verts[0], verts.size(), dum_coords ); RC( "query_vert_to_elem_iters" ); chunk_size = std::min( (int)verts.size(), chunk_size ); for( int i = 0; i < chunk_size; i++ ) { neighbor_hexes.clear(); result = gMB->get_adjacencies( &verts[i], 1, 3, false, neighbor_hexes ); RC( "query_vert_to_elem_iters" ); result = gMB->tag_get_data( pos2_tag, &neighbor_hexes[0], neighbor_hexes.size(), dum_pos ); RC( "query_vert_to_elem_iters" ); for( unsigned int j = 0; j < neighbor_hexes.size(); j++ ) { dum_pos[3 * j + 0] += dum_coords[3 * i + 0]; dum_pos[3 * j + 1] += dum_coords[3 * i + 1]; dum_pos[3 * j + 2] += dum_coords[3 * i + 2]; } result = gMB->tag_set_data( pos2_tag, &neighbor_hexes[0], neighbor_hexes.size(), dum_pos ); RC( "query_vert_to_elem_iters" ); } } result = normalize_elems( dum_coords ); RC( "query_vert_to_elem_iters" ); }
void testA | ( | const int | nelem, |
const double * | coords | ||
) |
Definition at line 611 of file perf.cpp.
References moab::ScdElementData::add_vsequence(), check_answers(), moab::SequenceManager::create_scd_sequence(), moab::EntitySequence::data(), ErrorCode, gMB, init(), MB_SUCCESS, mbcore, MBHEX, MBVERTEX, print_time(), query_struct_elem_to_vert(), query_vert_to_elem(), RC, moab::StructuredElementSeq::sdata(), moab::Core::sequence_manager(), and moab::Interface::set_coords().
Referenced by main().
{ double ttime0 = 0.0, ttime1 = 0.0, ttime2 = 0.0, ttime3 = 0.0, ttime4 = 0.0, utime = 0.0, stime = 0.0; long imem0 = 0, rmem0 = 0, imem1 = 0, rmem1 = 0, imem2 = 0, rmem2 = 0, imem3 = 0, rmem3 = 0, imem4 = 0, rmem4 = 0; print_time( false, ttime0, utime, stime, imem0, rmem0 ); // make a 3d block of vertices EntitySequence* dum_seq = NULL; ScdVertexData* vseq = NULL; StructuredElementSeq* eseq = NULL; init(); Core* mbcore = dynamic_cast< Core* >( gMB ); assert( mbcore != NULL ); SequenceManager* seq_mgr = mbcore->sequence_manager(); HomCoord vseq_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( nelem, nelem, nelem ) }; EntityHandle vstart, estart; ErrorCode result = seq_mgr->create_scd_sequence( vseq_minmax[0], vseq_minmax[1], MBVERTEX, 1, vstart, dum_seq ); RC( "testA" ); if( NULL != dum_seq ) vseq = dynamic_cast< ScdVertexData* >( dum_seq->data() ); assert( MB_FAILURE != result && vstart != 0 && dum_seq != NULL && vseq != NULL ); // now the element sequence result = seq_mgr->create_scd_sequence( vseq_minmax[0], vseq_minmax[1], MBHEX, 1, estart, dum_seq ); if( NULL != dum_seq ) eseq = dynamic_cast< StructuredElementSeq* >( dum_seq ); assert( MB_FAILURE != result && estart != 0 && dum_seq != NULL && eseq != NULL ); // only need to add one vseq to this, unity transform // trick: if I know it's going to be unity, just input 3 sets of equivalent points result = eseq->sdata()->add_vsequence( vseq, vseq_minmax[0], vseq_minmax[0], vseq_minmax[0], vseq_minmax[0], vseq_minmax[0], vseq_minmax[0] ); assert( MB_SUCCESS == result ); // set the coordinates of the vertices EntityHandle handle; int i; double dumv[3]; int num_verts = ( nelem + 1 ) * ( nelem + 1 ) * ( nelem + 1 ); for( i = 0, handle = vstart; i < num_verts; i++, handle++ ) { dumv[0] = coords[i]; dumv[1] = coords[num_verts + i]; dumv[2] = coords[2 * num_verts + i]; result = gMB->set_coords( &handle, 1, dumv ); assert( MB_SUCCESS == result ); } print_time( false, ttime1, utime, stime, imem1, rmem1 ); // query the mesh 2 ways query_struct_elem_to_vert(); print_time( false, ttime2, utime, stime, imem2, rmem2 ); query_vert_to_elem(); print_time( false, ttime3, utime, stime, imem3, rmem3 ); #ifndef NDEBUG check_answers( "A" ); #endif delete gMB; print_time( false, ttime4, utime, stime, imem4, rmem4 ); std::cout << "MOAB_scd:nelem,construct,e_to_v,v_to_e,after_dtor,total= " << nelem << " " << ttime1 - ttime0 << " " << ttime2 - ttime1 << " " << ttime3 - ttime2 << " " << ttime4 - ttime3 << " " << ttime4 - ttime0 << " seconds" << std::endl; std::cout << "MOAB_scd_memory(rss):initial,after_construction,e-v,v-e,after_dtor= " << rmem0 << " " << rmem1 << " " << rmem2 << " " << rmem3 << " " << rmem4 << " kb" << std::endl; }
void testB | ( | const int | nelem, |
const double * | coords, | ||
int * | connect | ||
) |
Definition at line 684 of file perf.cpp.
References check_answers(), ErrorCode, moab::ReadUtilIface::get_element_connect(), moab::ReadUtilIface::get_node_coords(), gMB, init(), MB_SUCCESS, MBHEX, print_time(), query_elem_to_vert(), moab::Interface::query_interface(), query_vert_to_elem(), RC, and moab::ReadUtilIface::update_adjacencies().
Referenced by main().
{ double ttime0 = 0.0, ttime1 = 0.0, ttime2 = 0.0, ttime3 = 0.0, ttime4 = 0.0, utime = 0.0, stime = 0.0; long imem0 = 0, rmem0 = 0, imem1 = 0, rmem1 = 0, imem2 = 0, rmem2 = 0, imem3 = 0, rmem3 = 0, imem4 = 0, rmem4 = 0; print_time( false, ttime0, utime, stime, imem0, rmem0 ); int num_verts = ( nelem + 1 ) * ( nelem + 1 ) * ( nelem + 1 ); int num_elems = nelem * nelem * nelem; EntityHandle vstart, estart; // get the read interface ReadUtilIface* readMeshIface; init(); gMB->query_interface( readMeshIface ); // create a sequence to hold the node coordinates // get the current number of entities and start at the next slot std::vector< double* > coord_arrays; ErrorCode result = readMeshIface->get_node_coords( 3, num_verts, 1, vstart, coord_arrays ); RC( "testB" ); assert( MB_SUCCESS == result && 1 == vstart && coord_arrays[0] && coord_arrays[1] && coord_arrays[2] ); // memcpy the coordinate data into place memcpy( coord_arrays[0], coords, sizeof( double ) * num_verts ); memcpy( coord_arrays[1], &coords[num_verts], sizeof( double ) * num_verts ); memcpy( coord_arrays[2], &coords[2 * num_verts], sizeof( double ) * num_verts ); EntityHandle* conn = 0; result = readMeshIface->get_element_connect( num_elems, 8, MBHEX, 1, estart, conn ); assert( MB_SUCCESS == result ); for( int i = 0; i < num_elems * 8; i++ ) conn[i] = vstart + connect[i]; delete[] connect; result = readMeshIface->update_adjacencies( estart, num_elems, 8, conn ); assert( MB_SUCCESS == result ); print_time( false, ttime1, utime, stime, imem1, rmem1 ); // query the mesh 2 ways query_elem_to_vert(); print_time( false, ttime2, utime, stime, imem2, rmem2 ); query_vert_to_elem(); print_time( false, ttime3, utime, stime, imem3, rmem3 ); #ifndef NDEBUG check_answers( "B" ); #endif delete gMB; print_time( false, ttime4, utime, stime, imem4, rmem4 ); std::cout << "MOAB_ucd_blocked:nelem,construct,e_to_v,v_to_e,after_dtor,total= " << nelem << " " << ttime1 - ttime0 << " " << ttime2 - ttime1 << " " << ttime3 - ttime2 << " " << ttime4 - ttime3 << " " << ttime4 - ttime0 << " seconds" << std::endl; std::cout << "MOAB_ucdblocked_memory_(rss):initial,after_construction,e-v,v-e,after_dtor= " << rmem0 << " " << rmem1 << " " << rmem2 << " " << rmem3 << " " << rmem4 << " kb" << std::endl; }
void testC | ( | const int | nelem, |
const double * | coords | ||
) |
Definition at line 748 of file perf.cpp.
References check_answers(), moab::Interface::create_element(), moab::Interface::create_vertex(), ErrorCode, gMB, init(), MB_SUCCESS, MBHEX, print_time(), query_elem_to_vert(), query_vert_to_elem(), RC, and VINDEX.
Referenced by main().
{ double ttime0 = 0.0, ttime1 = 0.0, ttime2 = 0.0, ttime3 = 0.0, ttime4 = 0.0, utime = 0.0, stime = 0.0; long imem0 = 0, rmem0 = 0, imem1 = 0, rmem1 = 0, imem2 = 0, rmem2 = 0, imem3 = 0, rmem3 = 0, imem4 = 0, rmem4 = 0; print_time( false, ttime0, utime, stime, imem0, rmem0 ); // create the vertices; assume we don't need to keep a list of vertex handles, since they'll // be created in sequence int numv = nelem + 1; int numv_sq = numv * numv; int num_verts = numv * numv * numv; double dum_coords[3] = { coords[0], coords[num_verts], coords[2 * num_verts] }; EntityHandle vstart; init(); ErrorCode result = gMB->create_vertex( dum_coords, vstart ); RC( "testC" ); assert( MB_SUCCESS == result && 1 == vstart ); EntityHandle dum_vert, vijk; int i; for( i = 1; i < num_verts; i++ ) { dum_coords[0] = coords[i]; dum_coords[1] = coords[num_verts + i]; dum_coords[2] = coords[2 * num_verts + i]; result = gMB->create_vertex( dum_coords, dum_vert ); assert( MB_SUCCESS == result ); } EntityHandle dum_conn[8]; for( 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 ); dum_conn[0] = vijk; dum_conn[1] = vijk + 1; dum_conn[2] = vijk + 1 + numv; dum_conn[3] = vijk + numv; dum_conn[4] = vijk + numv * numv; dum_conn[5] = vijk + 1 + numv * numv; dum_conn[6] = vijk + 1 + numv + numv * numv; dum_conn[7] = vijk + numv + numv * numv; result = gMB->create_element( MBHEX, dum_conn, 8, dum_vert ); assert( MB_SUCCESS == result ); } } } print_time( false, ttime1, utime, stime, imem1, rmem1 ); // query the mesh 2 ways query_elem_to_vert(); print_time( false, ttime2, utime, stime, imem2, rmem2 ); query_vert_to_elem(); print_time( false, ttime3, utime, stime, imem3, rmem3 ); #ifndef NDEBUG check_answers( "C" ); #endif delete gMB; print_time( false, ttime4, utime, stime, imem4, rmem4 ); std::cout << "MOAB_ucd_indiv:nelem,construct,e_to_v,v_to_e,after_dtor,total= " << nelem << " " << ttime1 - ttime0 << " " << ttime2 - ttime1 << " " << ttime3 - ttime2 << " " << ttime4 - ttime3 << " " << ttime4 - ttime0 << " seconds" << std::endl; std::cout << "MOAB_ucd_indiv_memory_(rss):initial,after_construction,e-v,v-e,after_dtor= " << rmem0 << " " << rmem1 << " " << rmem2 << " " << rmem3 << " " << rmem4 << " kb" << std::endl; }
void testD | ( | const int | nelem, |
const double * | coords, | ||
int | ver | ||
) |
Definition at line 827 of file perf.cpp.
References check_answers(), moab::Interface::create_element(), moab::Interface::create_vertex(), ErrorCode, gMB, init(), MB_SUCCESS, MB_TAG_CREAT, MB_TAG_DENSE, MB_TYPE_DOUBLE, MBHEX, pos2_tag, pos_tag, print_time(), query_elem_to_vert_iters(), query_vert_to_elem_iters(), RC, moab::Interface::tag_delete(), moab::Interface::tag_get_handle(), and VINDEX.
Referenced by main().
{ double ttime0 = 0.0, ttime1 = 0.0, ttime2 = 0.0, ttime3 = 0.0, ttime4 = 0.0, ttime5 = 0.0, ttime6 = 0.0, ttime7 = 0.0, ttime8 = 0.0, ttime9 = 0.0, ttime10 = 0.0, utime = 0.0, stime = 0.0; long imem0 = 0, rmem0 = 0, imem1 = 0, rmem1 = 0, imem2 = 0, rmem2 = 0, imem3 = 0, rmem3 = 0, imem4 = 0, rmem4 = 0, imem5 = 0, rmem5 = 0, imem6 = 0, rmem6 = 0, imem7 = 0, rmem7 = 0, imem8 = 0, rmem8 = 0, imem9 = 0, rmem9 = 0, imem10 = 0, rmem10 = 0; print_time( false, ttime0, utime, stime, imem0, rmem0 ); // create the vertices; assume we don't need to keep a list of vertex handles, since they'll // be created in sequence int numv = nelem + 1; int numv_sq = numv * numv; int num_verts = numv * numv * numv; std::vector< double > dum_coords( 24 ), dum_pos( 24 ); dum_coords[0] = coords[0]; dum_coords[1] = coords[num_verts]; dum_coords[2] = coords[2 * num_verts]; EntityHandle vstart; init(); ErrorCode result = gMB->create_vertex( &dum_coords[0], vstart ); RC( "testD" ); assert( MB_SUCCESS == result && 1 == vstart ); EntityHandle dum_vert, vijk; int i; for( i = 1; i < num_verts; i++ ) { dum_coords[0] = coords[i]; dum_coords[1] = coords[num_verts + i]; dum_coords[2] = coords[2 * num_verts + i]; result = gMB->create_vertex( &dum_coords[0], dum_vert ); assert( MB_SUCCESS == result ); } EntityHandle dum_conn[8]; for( 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 ); dum_conn[0] = vijk; dum_conn[1] = vijk + 1; dum_conn[2] = vijk + 1 + numv; dum_conn[3] = vijk + numv; dum_conn[4] = vijk + numv * numv; dum_conn[5] = vijk + 1 + numv * numv; dum_conn[6] = vijk + 1 + numv + numv * numv; dum_conn[7] = vijk + numv + numv * numv; result = gMB->create_element( MBHEX, dum_conn, 8, dum_vert ); assert( MB_SUCCESS == result ); } } } print_time( false, ttime1, utime, stime, imem1, rmem1 ); // query the mesh 2 ways with !check_valid std::vector< EntityHandle > connect( 8 ); #ifndef NDEBUG // used only in debug mode double def_val[3] = { 0.0, 0.0, 0.0 }; #endif if( ver == 0 || ver == 1 ) { query_elem_to_vert_iters( 1, false, connect, &dum_coords[0], &dum_pos[0] ); print_time( false, ttime2, utime, stime, imem2, rmem2 ); query_vert_to_elem_iters( 1, false, connect, &dum_coords[0], &dum_pos[0] ); print_time( false, ttime3, utime, stime, imem3, rmem3 ); #ifndef NDEBUG check_answers( "D" ); result = gMB->tag_delete( pos_tag ); assert( MB_SUCCESS == result ); result = gMB->tag_get_handle( "position_tag", 3, MB_TYPE_DOUBLE, pos_tag, MB_TAG_DENSE | MB_TAG_CREAT, def_val ); assert( MB_SUCCESS == result ); result = gMB->tag_delete( pos2_tag ); assert( MB_SUCCESS == result ); result = gMB->tag_get_handle( "position2_tag", 3, MB_TYPE_DOUBLE, pos2_tag, MB_TAG_DENSE | MB_TAG_CREAT, def_val ); assert( MB_SUCCESS == result ); #endif } if( ver == 0 || ver == 2 ) { if( ver != 0 ) print_time( false, ttime3, utime, stime, imem3, rmem3 ); query_elem_to_vert_iters( 1, true, connect, &dum_coords[0], &dum_pos[0] ); print_time( false, ttime4, utime, stime, imem4, rmem4 ); query_vert_to_elem_iters( 1, true, connect, &dum_coords[0], &dum_pos[0] ); print_time( false, ttime5, utime, stime, imem5, rmem5 ); #ifndef NDEBUG check_answers( "D" ); result = gMB->tag_delete( pos_tag ); assert( MB_SUCCESS == result ); result = gMB->tag_get_handle( "position_tag", 3, MB_TYPE_DOUBLE, pos_tag, MB_TAG_DENSE | MB_TAG_CREAT, def_val ); assert( MB_SUCCESS == result ); result = gMB->tag_delete( pos2_tag ); assert( MB_SUCCESS == result ); result = gMB->tag_get_handle( "position2_tag", 3, MB_TYPE_DOUBLE, pos2_tag, MB_TAG_DENSE | MB_TAG_CREAT, def_val ); assert( MB_SUCCESS == result ); #endif } if( ver == 0 || ver >= 3 ) { dum_coords.resize( 2400 ); dum_pos.resize( 300 ); } if( ver == 0 || ver == 3 ) { if( ver != 0 ) print_time( false, ttime5, utime, stime, imem3, rmem3 ); query_elem_to_vert_iters( 100, false, connect, &dum_coords[0], &dum_pos[0] ); print_time( false, ttime6, utime, stime, imem6, rmem6 ); query_vert_to_elem_iters( 100, false, connect, &dum_coords[0], &dum_pos[0] ); print_time( false, ttime7, utime, stime, imem7, rmem7 ); #ifndef NDEBUG check_answers( "D" ); result = gMB->tag_delete( pos_tag ); assert( MB_SUCCESS == result ); result = gMB->tag_get_handle( "position_tag", 3, MB_TYPE_DOUBLE, pos_tag, MB_TAG_DENSE | MB_TAG_CREAT, def_val ); assert( MB_SUCCESS == result ); result = gMB->tag_delete( pos2_tag ); assert( MB_SUCCESS == result ); result = gMB->tag_get_handle( "position2_tag", 3, MB_TYPE_DOUBLE, pos2_tag, MB_TAG_DENSE | MB_TAG_CREAT, def_val ); assert( MB_SUCCESS == result ); #endif } if( ver == 0 || ver == 4 ) { if( ver != 0 ) print_time( false, ttime7, utime, stime, imem3, rmem3 ); query_elem_to_vert_iters( 100, true, connect, &dum_coords[0], &dum_pos[0] ); print_time( false, ttime8, utime, stime, imem8, rmem8 ); query_vert_to_elem_iters( 100, true, connect, &dum_coords[0], &dum_pos[0] ); print_time( false, ttime9, utime, stime, imem9, rmem9 ); #ifndef NDEBUG check_answers( "D" ); result = gMB->tag_delete( pos_tag ); assert( MB_SUCCESS == result ); result = gMB->tag_get_handle( "position_tag", 3, MB_TYPE_DOUBLE, pos_tag, MB_TAG_DENSE | MB_TAG_CREAT, def_val ); assert( MB_SUCCESS == result ); result = gMB->tag_delete( pos2_tag ); assert( MB_SUCCESS == result ); result = gMB->tag_get_handle( "position2_tag", 3, MB_TYPE_DOUBLE, pos2_tag, MB_TAG_DENSE | MB_TAG_CREAT, def_val ); assert( MB_SUCCESS == result ); #endif } if( ver > 0 && ver < 4 ) print_time( false, ttime9, utime, stime, imem9, rmem9 ); delete gMB; print_time( false, ttime10, utime, stime, imem10, rmem10 ); if( ver == 0 || ver == 1 ) { std::cout << "MOAB_ucd_iters_!check_valid_1:nelem,construct,e-v,v-e,after_dtor,total= " << nelem << " " << ttime1 - ttime0 << " " << ttime2 - ttime1 << " " << ttime3 - ttime2 << " " << ttime10 - ttime9 << " " << ttime3 - ttime0 + ttime10 - ttime9 << std::endl; std::cout << "MOAB_ucd_iters_memory_(rss)_!check_valid_1:initial,after_construction,e-v,v-" "e,after_dtor= " << rmem0 << " " << rmem1 << " " << rmem2 << " " << rmem3 << " " << rmem10 << " kb" << std::endl; } if( ver == 0 || ver == 2 ) { std::cout << "MOAB_ucd_iters_check_valid_1:nelem,construct,e-v,v-e,after_dtor,total= " << nelem << " " << ttime1 - ttime0 << " " << ttime4 - ttime3 << " " << ttime5 - ttime4 << " " << ttime10 - ttime9 << " " << ttime1 - ttime0 + ttime5 - ttime3 + ttime10 - ttime9 << std::endl; std::cout << "MOAB_ucd_iters_memory_(rss)_check_valid_1:initial,after_construction,e-v,v-e," "after_dtor= " << rmem0 << " " << rmem1 << " " << rmem2 << " " << rmem3 << " " << rmem10 << " kb" << std::endl; } if( ver == 0 || ver == 3 ) { std::cout << "MOAB_ucd_iters_!check_valid_100:nelem,construct,e-v,v-e,after_dtor,total= " << nelem << " " << ttime1 - ttime0 << " " << ttime6 - ttime5 << " " << ttime7 - ttime6 << " " << ttime10 - ttime9 << " " << ttime1 - ttime0 + ttime7 - ttime5 + ttime10 - ttime9 << std::endl; std::cout << "MOAB_ucd_iters_memory_(rss)_!check_valid_100:initial,after_construction,e-v," "v-e,after_dtor= " << rmem0 << " " << rmem1 << " " << rmem6 << " " << rmem7 << " " << rmem10 << " kb" << std::endl; } if( ver == 0 || ver == 4 ) { std::cout << "MOAB_ucd_iters_check_valid_100:nelem,construct,e-v,v-e,after_dtor,total= " << nelem << " " << ttime1 - ttime0 << " " << ttime8 - ttime7 << " " << ttime9 - ttime8 << " " << ttime10 - ttime9 << " " << ttime1 - ttime0 + ttime10 - ttime7 << std::endl; std::cout << "MOAB_ucd_iters_memory_(rss)_check_valid_100:initial,after_construction,e-v,v-" "e,after_dtor= " << rmem0 << " " << rmem1 << " " << rmem8 << " " << rmem9 << " " << rmem10 << " kb" << std::endl; } }
void testE | ( | const int | nelem, |
const double * | coords, | ||
int * | connect | ||
) |
Definition at line 1029 of file perf.cpp.
References check_answers(), ErrorCode, moab::ReadUtilIface::get_element_connect(), moab::ReadUtilIface::get_node_coords(), gMB, init(), MB_SUCCESS, MBHEX, print_time(), query_elem_to_vert_direct(), moab::Interface::query_interface(), query_vert_to_elem_direct(), RC, and moab::ReadUtilIface::update_adjacencies().
Referenced by main().
{ double ttime0 = 0.0, ttime1 = 0.0, ttime2 = 0.0, ttime3 = 0.0, ttime4 = 0.0, ttime5 = 0.0, ttime6 = 0.0, utime = 0.0, stime = 0.0; long imem0 = 0, rmem0 = 0, imem1 = 0, rmem1 = 0, imem2 = 0, rmem2 = 0, imem3 = 0, rmem3 = 0, imem4 = 0, rmem4 = 0, imem5 = 0, rmem5 = 0, imem6 = 0, rmem6 = 0; print_time( false, ttime0, utime, stime, imem0, rmem0 ); int num_verts = ( nelem + 1 ) * ( nelem + 1 ) * ( nelem + 1 ); int num_elems = nelem * nelem * nelem; EntityHandle vstart, estart; // get the read interface ReadUtilIface* readMeshIface; init(); gMB->query_interface( readMeshIface ); // create a sequence to hold the node coordinates // get the current number of entities and start at the next slot std::vector< double* > coord_arrays; ErrorCode result = readMeshIface->get_node_coords( 3, num_verts, 1, vstart, coord_arrays ); RC( "testE" ); assert( MB_SUCCESS == result && 1 == vstart && coord_arrays[0] && coord_arrays[1] && coord_arrays[2] ); // memcpy the coordinate data into place memcpy( coord_arrays[0], coords, sizeof( double ) * num_verts ); memcpy( coord_arrays[1], &coords[num_verts], sizeof( double ) * num_verts ); memcpy( coord_arrays[2], &coords[2 * num_verts], sizeof( double ) * num_verts ); EntityHandle* conn = 0; result = readMeshIface->get_element_connect( num_elems, 8, MBHEX, 1, estart, conn ); assert( MB_SUCCESS == result ); for( int i = 0; i < num_elems * 8; i++ ) conn[i] = vstart + connect[i]; delete[] connect; Range verts( vstart, vstart + num_verts - 1 ), elems( estart, estart + num_elems - 1 ); result = readMeshIface->update_adjacencies( estart, num_elems, 8, conn ); assert( MB_SUCCESS == result ); print_time( false, ttime1, utime, stime, imem1, rmem1 ); // query the mesh 2 ways query_elem_to_vert_direct(); print_time( false, ttime2, utime, stime, imem2, rmem2 ); query_vert_to_elem_direct(); print_time( false, ttime3, utime, stime, imem3, rmem3 ); #ifndef NDEBUG check_answers( "E" ); #endif query_elem_to_vert_direct(); print_time( false, ttime4, utime, stime, imem4, rmem4 ); query_vert_to_elem_direct(); print_time( false, ttime5, utime, stime, imem5, rmem5 ); #ifndef NDEBUG check_answers( "E" ); #endif delete gMB; print_time( false, ttime6, utime, stime, imem6, rmem6 ); std::cout << "MOAB_ucd_direct:nelem,construct,e_to_v,v_to_e,after_dtor,total= " << nelem << " " << ttime1 - ttime0 << " " << ttime2 - ttime1 << " " << ttime3 - ttime2 << " " << ttime6 - ttime5 << " " << ttime3 - ttime0 + ttime6 - ttime5 << " seconds" << std::endl; std::cout << "MOAB_ucd_direct_memory_(rss):initial,after_construction,e-v,v-e,after_dtor= " << rmem0 << " " << rmem1 << " " << rmem2 << " " << rmem3 << " " << rmem6 << " kb" << std::endl; std::cout << "MOAB_ucd_direct2:nelem,construct,e_to_v,v_to_e,after_dtor,total= " << nelem << " " << ttime1 - ttime0 << " " << ttime4 - ttime3 << " " << ttime5 - ttime4 << " " << ttime6 - ttime5 << " " << ttime1 - ttime0 + ttime6 - ttime3 << " seconds" << std::endl; std::cout << "MOAB_ucd_direct2_memory_(rss):initial,after_construction,e-v,v-e,after_dtor= " << rmem0 << " " << rmem1 << " " << rmem4 << " " << rmem5 << " " << rmem6 << " kb" << std::endl; }
Definition at line 300 of file perf.cpp.
Referenced by check_answers(), init(), normalize_elems(), query_vert_to_elem(), query_vert_to_elem_direct(), query_vert_to_elem_iters(), and testD().
Definition at line 300 of file perf.cpp.
Referenced by check_answers(), init(), query_elem_to_vert(), query_elem_to_vert_direct(), query_elem_to_vert_iters(), query_struct_elem_to_vert(), and testD().