|
MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include "moab/Core.hpp"#include "moab/Range.hpp"#include "moab/ScdInterface.hpp"#include "moab/HomXform.hpp"#include "moab/ReadUtilIface.hpp"#include "TestUtil.hpp"#include <cstdlib>#include <algorithm>
Include dependency graph for coords_connect_iterate.cpp:Go to the source code of this file.
Functions | |
| void | test_coords_connect_iterate () |
| void | test_scd_invalid () |
| void | test_iterates () |
| int | main () |
| int main | ( | ) |
Definition at line 16 of file coords_connect_iterate.cpp.
References RUN_TEST, test_coords_connect_iterate(), test_iterates(), and test_scd_invalid().
{
int failures = 0;
failures += RUN_TEST( test_coords_connect_iterate );
failures += RUN_TEST( test_scd_invalid );
failures += RUN_TEST( test_iterates );
if( failures ) std::cerr << "<<<< " << failures << " TESTS FAILED >>>>" << std::endl;
return failures;
}
| void test_coords_connect_iterate | ( | ) |
Definition at line 29 of file coords_connect_iterate.cpp.
References moab::Range::begin(), CHECK_ARRAYS_EQUAL, CHECK_EQUAL, CHECK_ERR, CHECK_REAL_EQUAL, moab::Interface::connect_iterate(), moab::Interface::coords_iterate(), moab::Interface::create_vertices(), moab::Interface::delete_entities(), moab::dum, moab::Range::end(), entities, moab::Range::erase(), ErrorCode, moab::GeomUtil::first(), moab::Interface::get_coords(), moab::ReadUtilIface::get_element_connect(), moab::Range::insert(), mb, MB_SUCCESS, MBHEX, moab::Interface::query_interface(), and moab::Range::size().
Referenced by main().
{
// create 1000 vertices
const unsigned int NUM_VTX = 1000;
Core moab;
Interface& mb = moab;
std::vector< double > coords( 3 * NUM_VTX );
for( unsigned int i = 0; i < NUM_VTX; i++ )
coords[3 * i] = coords[3 * i + 1] = coords[3 * i + 2] = i;
Range verts, hexes, faces, edges, dead;
ErrorCode rval = mb.create_vertices( &coords[0], NUM_VTX, verts );CHECK_ERR( rval );
// create a bunch of hexes from those
ReadUtilIface* rui;
EntityHandle *orig_connect, start_hex;
rval = mb.query_interface( rui );CHECK_ERR( rval );
rval = rui->get_element_connect( NUM_VTX / 8, 8, MBHEX, 1, start_hex, orig_connect );CHECK_ERR( rval );
std::copy( verts.begin(), verts.end(), orig_connect );
hexes.insert( start_hex, start_hex + NUM_VTX / 8 - 1 );
// delete about 1% of vertices
const int step = 100;
int remaining = NUM_VTX;
Range::iterator vit = verts.begin();
EntityHandle entities[2];
for( int j = 0; j < remaining; j += step )
{
entities[0] = start_hex + j / 8;
entities[1] = *vit;
rval = mb.delete_entities( entities, 2 );CHECK_ERR( rval );
dead.insert( *vit );
dead.insert( start_hex + j / 8 );
vit = verts.erase( vit );
vit += step - 1;
hexes.erase( start_hex + j / 8 );
}
// Remove some additional values from the range
// so that our handle blocks don't always align with
// sequences
verts.erase( verts.begin() + ( step - 5 ), verts.begin() + ( step + 5 ) );
hexes.erase( hexes.begin() + ( step / 8 - 5 ), hexes.begin() + ( step / 8 + 5 ) );
// Check that we get back expected values
double *xcoord, *ycoord, *zcoord;
vit = verts.begin();
int count, total = 0;
while( vit != verts.end() )
{
rval = mb.coords_iterate( vit, verts.end(), xcoord, ycoord, zcoord, count );
if( MB_SUCCESS && ( !xcoord || !ycoord || !zcoord ) ) rval = MB_FAILURE;CHECK_ERR( rval );
assert( total + count <= (int)verts.size() );
for( int i = 0; i < count; i++ )
{
// vertex handles start at 1, so need to subtract one
double val = *vit + (double)i - 1.0;
CHECK_REAL_EQUAL( val, xcoord[i], 1.0e-10 );
CHECK_REAL_EQUAL( val, ycoord[i], 1.0e-10 );
CHECK_REAL_EQUAL( val, zcoord[i], 1.0e-10 );
}
// Check that we can set values and get the right values back
for( int i = 0; i < count; i++ )
{
xcoord[i] *= 2.0;
ycoord[i] *= 2.0;
zcoord[i] *= 2.0;
}
std::vector< double > dum( 3 * count );
Range dum_verts( *vit, *vit + count - 1 );
rval = mb.get_coords( dum_verts, &dum[0] );CHECK_ERR( rval );
for( int i = 0; i < count; i++ )
{
// vertex handles start at 1, so need to subtract 1 from expected value
double val = 2.0 * ( *vit + (double)i - 1 );
CHECK_REAL_EQUAL( val, xcoord[i], 1.0e-10 );
CHECK_REAL_EQUAL( val, ycoord[i], 1.0e-10 );
CHECK_REAL_EQUAL( val, zcoord[i], 1.0e-10 );
}
vit += count;
total += count;
}
// now check connectivity
Range::iterator hit = hexes.begin();
EntityHandle* connect = NULL;
EntityHandle dum_connect[8];
int num_connect;
while( hit != hexes.end() )
{
rval = mb.connect_iterate( hit, hexes.end(), connect, num_connect, count );
if( MB_SUCCESS && !connect ) rval = MB_FAILURE;CHECK_ERR( rval );
CHECK_EQUAL( num_connect, 8 );
// should be equal to initial connectivity
for( int i = 0; i < count; i++ )
{
EntityHandle first = 8 * ( *hit - start_hex + i ) + 1;
for( unsigned int j = 0; j < 8; j++ )
dum_connect[j] = first + j;
CHECK_ARRAYS_EQUAL( connect, 8, &dum_connect[0], 8 );
connect += 8;
}
hit += count;
// total += count;
}
// ok, done
}
| void test_iterates | ( | ) |
Definition at line 177 of file coords_connect_iterate.cpp.
References moab::Range::begin(), CHECK_ARRAYS_EQUAL, CHECK_EQUAL, CHECK_ERR, moab::Interface::connect_iterate(), moab::Interface::coords_iterate(), moab::Interface::create_vertices(), moab::Range::end(), ErrorCode, moab::GeomUtil::first(), moab::Range::front(), moab::Core::globalId_tag(), moab::Range::insert(), mb, MB_SUCCESS, MBHEX, moab::Range::psize(), moab::Interface::query_interface(), moab::Interface::tag_iterate(), moab::Interface::tag_set_data(), and moab::unite().
Referenced by main().
{
// create 400 vertices, in 2 separate sequences
// also, create 50 hexes, in 2 separate sequences
const int NUM_VTX = 400;
const int NUM_HEX = 50;
Core moab;
Interface& mb = moab;
std::vector< double > coords( 3 * NUM_VTX / 2 );
for( unsigned int i = 0; i < NUM_VTX / 2; i++ )
{
coords[3 * i] = i;
coords[3 * i + 1] = 10 * i;
coords[3 * i + 2] = 100 * i;
}
Range verts, hexes;
ErrorCode rval = mb.create_vertices( &coords[0], NUM_VTX / 2, verts );CHECK_ERR( rval );
// create more vertices, with same coordinates
Range v2;
rval = mb.create_vertices( &coords[0], NUM_VTX / 2, v2 );CHECK_ERR( rval );
Range ver = unite( verts, v2 );
// range of vertices is contiguous, but its memory for vertices is not!!
CHECK_EQUAL( (int)ver.psize(), 1 );
// create a bunch of hexes from those
ReadUtilIface* rui;
EntityHandle start_hex;
rval = mb.query_interface( rui );CHECK_ERR( rval );
Range::iterator vertIter = ver.begin();
for( int i = 0; i < NUM_HEX; i += NUM_HEX / 2 )
{
EntityHandle *orig_connect, current_hex;
Range::iterator vertIterEnd = vertIter + ( 25 * 8 );
rval = rui->get_element_connect( 25, 8, MBHEX, 1, current_hex, orig_connect );CHECK_ERR( rval );
std::copy( vertIter, vertIterEnd, orig_connect );
hexes.insert( current_hex, current_hex + 24 );
vertIter += ( NUM_HEX / 2 * 8 );
}
// make sure hexes range is contiguous
CHECK_EQUAL( (int)hexes.psize(), 1 );
start_hex = hexes.front();
Tag idtag = moab.globalId_tag();
for( int i = 0; i < NUM_HEX; i++, start_hex++ )
{
rval = mb.tag_set_data( idtag, &start_hex, 1, &i );CHECK_ERR( rval );
}
int count = 0;
int total = 0;
// now check connectivity
start_hex = hexes.front();
Range::iterator hit = hexes.begin();
EntityHandle* connect = NULL;
EntityHandle dum_connect[8];
int num_connect;
while( hit != hexes.end() )
{
rval = mb.connect_iterate( hit, hexes.end(), connect, num_connect, count );
if( MB_SUCCESS && !connect ) rval = MB_FAILURE;
CHECK_ERR( rval );
CHECK_EQUAL( num_connect, 8 );
CHECK_EQUAL( count, NUM_HEX / 2 );
// should be equal to initial connectivity
for( int i = 0; i < count; i++ )
{
EntityHandle first = 8 * ( *hit - start_hex + i ) + 1;
for( unsigned int j = 0; j < 8; j++ )
dum_connect[j] = first + j;
CHECK_ARRAYS_EQUAL( connect, 8, &dum_connect[0], 8 );
connect += 8;
}
hit += count;
total += count;
}
hit = hexes.begin();
void* ptr;
while( hit != hexes.end() )
{
// get contiguous block of tag data, of size of the sequence allocated
rval = mb.tag_iterate( idtag, hit, hexes.end(), count, ptr );CHECK_ERR( rval );
CHECK_EQUAL( count, NUM_HEX / 2 );
hit += count;
}
hit = ver.begin();
// coords_iterate
double* xc;
double* yc;
double* zc;
while( hit != ver.end() )
{
// get contiguous block of coords
rval = mb.coords_iterate( hit, ver.end(), xc, yc, zc, count );CHECK_ERR( rval );
CHECK_EQUAL( count, NUM_VTX / 2 );
hit += count;
}
}
| void test_scd_invalid | ( | ) |
Definition at line 144 of file coords_connect_iterate.cpp.
References moab::Range::begin(), CHECK, CHECK_EQUAL, CHECK_ERR, moab::Interface::connect_iterate(), moab::ScdInterface::construct_box(), moab::Range::end(), ErrorCode, moab::Interface::get_adjacencies(), mb, moab::Interface::query_interface(), moab::Range::size(), moab::ScdBox::start_element(), and moab::Interface::UNION.
Referenced by main().
{
// check that we get errors from structured mesh
Core moab;
Interface& mb = moab;
ScdInterface* scdi;
ErrorCode rval = mb.query_interface( scdi );CHECK_ERR( rval );
// make an arbitrary structured mesh
const int NUM_DIMS = 10;
HomCoord low( 0, 0, 0 ), high( NUM_DIMS, NUM_DIMS, NUM_DIMS );
ScdBox* new_box = NULL;
rval = scdi->construct_box( low, high, NULL, 0, new_box );CHECK_ERR( rval );
CHECK( new_box != NULL );
EntityHandle start_hex = new_box->start_element();
Range hexes( start_hex, start_hex + NUM_DIMS * NUM_DIMS * NUM_DIMS - 1 );
// should be able to get vertices used by this box
Range verts;
rval = mb.get_adjacencies( hexes, 0, false, verts, Interface::UNION );CHECK_ERR( rval );
CHECK_EQUAL( (int)verts.size(), (int)( ( NUM_DIMS + 1 ) * ( NUM_DIMS + 1 ) * ( NUM_DIMS + 1 ) ) );
// should NOT be able to get connect iterator
EntityHandle* connect;
int count, num_connect;
// expected failure
rval = mb.connect_iterate( hexes.begin(), hexes.end(), connect, num_connect, count );
CHECK_EQUAL( rval, MB_FAILURE );
}