|
MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include "moab/ScdInterface.hpp"#include "moab/Core.hpp"#include "TestUtil.hpp"#include <iostream>
Include dependency graph for scdseq_test.cpp:Go to the source code of this file.
Defines | |
| #define | PARRAY(a) "(" << ( a )[0] << "," << ( a )[1] << "," << ( a )[2] << ")" |
| #define | PARRAY3(a, b, c) "(" << ( a ) << "," << ( b ) << "," << ( c ) << ")" |
| #define | PARRAY6(a) PARRAY( a ) << "-" << PARRAY( ( ( a ) + 3 ) ) |
Functions | |
| void | test_vertex_seq () |
| void | test_element_seq () |
| void | test_periodic_seq () |
| void | test_parallel_partitions () |
| ErrorCode | test_parallel_partition (int *gdims, int nprocs, int part_method) |
| ErrorCode | check_vertex_sequence (const ScdBox *this_box, const int imin, const int jmin, const int kmin, const int imax, const int jmax, const int kmax, const EntityHandle this_start) |
| ErrorCode | evaluate_vertex_box (ScdBox *this_box) |
| ErrorCode | check_element_sequence (const ScdBox *this_box, const HomCoord &min_params, const HomCoord &max_params, const EntityHandle this_start) |
| ErrorCode | evaluate_element_sequence (ScdBox *this_box) |
| ErrorCode | eseq_test1a (ScdInterface *scdi, HomCoord tmp_min, HomCoord tmp_max) |
| ErrorCode | eseq_test1b (ScdInterface *scdi, HomCoord tmp_min, HomCoord tmp_max) |
| ErrorCode | eseq_test1c (ScdInterface *scdi, const HomCoord &tmp_min, const HomCoord &tmp_max) |
| ErrorCode | eseq_test2a (ScdInterface *scdi, const HomCoord &tmp_min, const HomCoord &tmp_max) |
| ErrorCode | eseq_test2b (ScdInterface *scdi) |
| ErrorCode | eseq_test2c (ScdInterface *scdi) |
| ErrorCode | eseq_test2d (ScdInterface *scdi) |
| ErrorCode | create_1d_3_sequences (ScdInterface *scdi, HomCoord tmp_min, HomCoord tmp_max, ScdBox **vseq, ScdBox **eseq) |
| ErrorCode | create_2d_3_sequences (ScdInterface *scdi, ScdBox **vseq, ScdBox **eseq) |
| ErrorCode | create_2dtri_3_sequences (ScdInterface *scdi, const int int1, const int int2, const int int3, ScdBox **vseq, ScdBox **eseq) |
| ErrorCode | create_3dtri_3_sequences (ScdInterface *scdi, const int int1, const int int2, const int int3, const int int4, ScdBox **vseq, ScdBox **eseq) |
| ErrorCode | access_adjacencies (ScdBox *box) |
| void | test_partition_methods () |
| void | test_partition_method (ScdParData::PartitionMethod pm) |
| ErrorCode | evaluate_vertex_sequence (ScdBox *this_box) |
| int | main (int, char **) |
| #define PARRAY | ( | a | ) | "(" << ( a )[0] << "," << ( a )[1] << "," << ( a )[2] << ")" |
| #define PARRAY3 | ( | a, | |
| b, | |||
| c | |||
| ) | "(" << ( a ) << "," << ( b ) << "," << ( c ) << ")" |
Referenced by test_parallel_partition().
Referenced by test_parallel_partition().
| ErrorCode access_adjacencies | ( | ScdBox * | box | ) |
Definition at line 1060 of file scdseq_test.cpp.
References box_max(), moab::ScdBox::box_max(), box_min(), moab::ScdBox::box_min(), moab::ScdBox::box_size(), ErrorCode, moab::ScdBox::get_adj_edge_or_face(), moab::Interface::get_connectivity(), moab::HomCoord::i(), moab::ScdInterface::impl(), moab::HomCoord::j(), moab::HomCoord::k(), MB_SUCCESS, and moab::ScdBox::sc_impl().
Referenced by eseq_test1b(), eseq_test1c(), eseq_test2b(), eseq_test2c(), and eseq_test2d().
{
// access the adjacencies in this box in a few places
HomCoord box_size = box->box_size(), box_min = box->box_min(), box_max = box->box_max();
EntityHandle dum_entity;
const EntityHandle* connect;
int num_connect;
ErrorCode rval;
bool is_2d = ( box_size.k() <= 1 );
// edges first; bottom:
for( int dir = 0; dir < 3; dir++ )
{
// don't do 3rd direction for 2d box
if( 2 == dir && is_2d ) continue;
rval = box->get_adj_edge_or_face( 1, box_min.i(), box_min.j(), box_min.k(), dir, dum_entity, true );
if( MB_SUCCESS != rval ) return rval;
// do a simple API call on that entity to make sure we can
rval = box->sc_impl()->impl()->get_connectivity( dum_entity, connect, num_connect );
if( MB_SUCCESS != rval ) return rval;
}
// middle:
for( int dir = 0; dir < 3; dir++ )
{
// don't do 3rd direction for 2d box
if( 2 == dir && is_2d ) continue;
rval = box->get_adj_edge_or_face( 1, box_min.i() + .5 * box_size.i(), box_min.j() + .5 * box_size.j(),
box_min.k() + .5 * box_size.k(), dir, dum_entity, true );
if( MB_SUCCESS != rval ) return rval;
// do a simple API call on that entity to make sure we can
rval = box->sc_impl()->impl()->get_connectivity( dum_entity, connect, num_connect );
if( MB_SUCCESS != rval ) return rval;
}
// top:
for( int dir = 0; dir < 3; dir++ )
{
// don't do 3rd direction for 2d box
if( 2 == dir && is_2d ) continue;
rval = box->get_adj_edge_or_face( 1, ( box_max.i() == box_min.i() ? box_max.i() : box_max.i() - 1 ),
( box_max.j() == box_min.j() ? box_max.j() : box_max.j() - 1 ),
( box_max.k() == box_min.k() ? box_max.k() : box_max.k() - 1 ), dir,
dum_entity, true );
if( MB_SUCCESS != rval ) return rval;
// do a simple API call on that entity to make sure we can
rval = box->sc_impl()->impl()->get_connectivity( dum_entity, connect, num_connect );
if( MB_SUCCESS != rval ) return rval;
}
if( is_2d ) return MB_SUCCESS;
// now faces; bottom:
for( int dir = 0; dir < 3; dir++ )
{
rval = box->get_adj_edge_or_face( 2, box_min.i(), box_min.j(), box_min.k(), dir, dum_entity, true );
if( MB_SUCCESS != rval ) return rval;
// do a simple API call on that entity to make sure we can
rval = box->sc_impl()->impl()->get_connectivity( dum_entity, connect, num_connect );
if( MB_SUCCESS != rval ) return rval;
}
// middle:
for( int dir = 0; dir < 3; dir++ )
{
// don't do 3rd direction for 2d box
if( 2 == dir && is_2d ) continue;
rval = box->get_adj_edge_or_face( 2, box_min.i() + .5 * box_size.i(), box_min.j() + .5 * box_size.j(),
box_min.k() + .5 * box_size.k(), dir, dum_entity, true );
if( MB_SUCCESS != rval ) return rval;
// do a simple API call on that entity to make sure we can
rval = box->sc_impl()->impl()->get_connectivity( dum_entity, connect, num_connect );
if( MB_SUCCESS != rval ) return rval;
}
// top:
for( int dir = 0; dir < 3; dir++ )
{
// don't do 3rd direction for 2d box
if( 2 == dir && is_2d ) continue;
rval = box->get_adj_edge_or_face( 2, ( box_max.i() == box_min.i() ? box_max.i() : box_max.i() - 1 ),
( box_max.j() == box_min.j() ? box_max.j() : box_max.j() - 1 ),
( box_max.k() == box_min.k() ? box_max.k() : box_max.k() - 1 ), dir,
dum_entity, true );
if( MB_SUCCESS != rval ) return rval;
// do a simple API call on that entity to make sure we can
rval = box->sc_impl()->impl()->get_connectivity( dum_entity, connect, num_connect );
if( MB_SUCCESS != rval ) return rval;
}
return MB_SUCCESS;
}
| ErrorCode check_element_sequence | ( | const ScdBox * | this_box, |
| const HomCoord & | min_params, | ||
| const HomCoord & | max_params, | ||
| const EntityHandle | this_start | ||
| ) |
Definition at line 117 of file scdseq_test.cpp.
References moab::ScdBox::boundary_complete(), moab::ScdBox::box_max(), moab::ScdBox::box_min(), moab::ScdBox::box_size(), ErrorCode, moab::HomCoord::i(), moab::HomCoord::j(), moab::HomCoord::k(), MB_SUCCESS, and moab::ScdBox::start_element().
Referenced by eseq_test1a(), eseq_test1b(), eseq_test1c(), eseq_test2a(), eseq_test2b(), eseq_test2c(), and eseq_test2d().
{
ErrorCode result = MB_SUCCESS;
// check data stored in sequence with that in arg list
if( min_params.i() != this_box->box_min()[0] || min_params.j() != this_box->box_min()[1] ||
min_params.k() != this_box->box_min()[2] || max_params.i() != this_box->box_max()[0] ||
max_params.j() != this_box->box_max()[1] || max_params.k() != this_box->box_max()[2] )
{
std::cout << "min/max params not correct for a sequence." << std::endl;
result = MB_FAILURE;
}
if( this_box->box_max() - this_box->box_min() + HomCoord( 1, 1, 1, 0 ) != this_box->box_size() )
{
std::cout << "min_params/max_params/param_extents functions returned inconsistent results" << std::endl;
result = MB_FAILURE;
}
if( this_start != this_box->start_element() )
{
std::cout << "Start handle for sequence wrong." << std::endl;
result = MB_FAILURE;
}
if( this_box->boundary_complete() == false )
{
std::cout << "Element sequence didn't pass boundary_complete test." << std::endl;
result = MB_FAILURE;
}
return result;
}
| ErrorCode check_vertex_sequence | ( | const ScdBox * | this_box, |
| const int | imin, | ||
| const int | jmin, | ||
| const int | kmin, | ||
| const int | imax, | ||
| const int | jmax, | ||
| const int | kmax, | ||
| const EntityHandle | this_start | ||
| ) |
Definition at line 82 of file scdseq_test.cpp.
References moab::ScdBox::box_max(), moab::ScdBox::box_min(), moab::ScdBox::box_size(), ErrorCode, MB_SUCCESS, and moab::ScdBox::start_vertex().
Referenced by test_vertex_seq().
{
ErrorCode result = MB_SUCCESS;
// check data stored in sequence with that in arg list
if( imin != this_box->box_min()[0] || jmin != this_box->box_min()[1] || kmin != this_box->box_min()[2] ||
imax != this_box->box_max()[0] || jmax != this_box->box_max()[1] || kmax != this_box->box_max()[2] )
{
std::cout << "min/max params not correct for a sequence." << std::endl;
result = MB_FAILURE;
}
HomCoord ijk1 = this_box->box_min(), ijk2 = this_box->box_max(), dijk = this_box->box_size();
if( ijk2 - ijk1 + HomCoord( 1, 1, 1, 0 ) != dijk )
{
std::cout << "min_params/max_params/param_extents functions returned inconsistent results" << std::endl;
result = MB_FAILURE;
}
if( this_start != this_box->start_vertex() )
{
std::cout << "Start handle for sequence wrong." << std::endl;
result = MB_FAILURE;
}
return result;
}
| ErrorCode create_1d_3_sequences | ( | ScdInterface * | scdi, |
| HomCoord | tmp_min, | ||
| HomCoord | tmp_max, | ||
| ScdBox ** | vseq, | ||
| ScdBox ** | eseq | ||
| ) |
Definition at line 611 of file scdseq_test.cpp.
References moab::ScdBox::add_vbox(), box_max(), box_min(), CHECK_ERR, moab::ScdInterface::create_scd_sequence(), ErrorCode, moab::HomCoord::getUnitv(), MBEDGE, and MBVERTEX.
Referenced by eseq_test2a().
{
// first get 1d min/max by resetting j, k components
tmp_min[1] = tmp_min[2] = tmp_max[1] = tmp_max[2] = 0;
// split the sequence in three in i parameter, at 1/2, 1/3 and 1/6, such that the
// total # vertices is the expected number from tmp_max - tmp_min)
int idiff = ( tmp_max[0] - tmp_min[0] + 1 ) / 6;
HomCoord vseq0_minmax[2] = { HomCoord( tmp_min ), HomCoord( tmp_min[0] + 3 * idiff - 1, tmp_max[1], tmp_max[2] ) };
HomCoord vseq1_minmax[2] = { HomCoord( tmp_min ), HomCoord( tmp_min[0] + 2 * idiff - 1, tmp_max[1], tmp_max[2] ) };
HomCoord vseq2_minmax[2] = { HomCoord( tmp_min ), HomCoord( tmp_max[0] - 5 * idiff, tmp_max[1], tmp_max[2] ) };
// create three vertex sequences
vbox[0] = vbox[1] = vbox[2] = NULL;
// first vertex sequence
ErrorCode result = scdi->create_scd_sequence( vseq0_minmax[0], vseq0_minmax[1], MBVERTEX, 1, vbox[0] );CHECK_ERR( result );
// second vertex sequence
result = scdi->create_scd_sequence( vseq1_minmax[0], vseq1_minmax[1], MBVERTEX, 1, vbox[1] );CHECK_ERR( result );
// third vertex sequence
result = scdi->create_scd_sequence( vseq2_minmax[0], vseq2_minmax[1], MBVERTEX, 1, vbox[2] );CHECK_ERR( result );
// now create the three element sequences
ebox[0] = ebox[1] = ebox[2] = NULL;
// create the first element sequence
result = scdi->create_scd_sequence( vseq0_minmax[0], vseq0_minmax[1], MBEDGE, 1, ebox[0] );CHECK_ERR( result );
// add first vertex seq to first element seq, forward orientation, unity transform
result = ebox[0]->add_vbox( vbox[0], vseq0_minmax[0], vseq0_minmax[0], vseq0_minmax[1], vseq0_minmax[1],
vseq0_minmax[0], vseq0_minmax[0] );CHECK_ERR( result );
// create the second element sequence; make it use the second vseq in reverse and start
// with the end vertex of the first sequence; parameterize it such that it tacks onto the
// end of the previous ebox
result = scdi->create_scd_sequence(
HomCoord( vseq0_minmax[1].i(), 0, 0 ),
HomCoord( 1 + vseq0_minmax[1].i() + vseq1_minmax[1].i() - vseq1_minmax[0].i(), 0, 0 ), MBEDGE, 1, ebox[1] );CHECK_ERR( result );
// add shared vertex from first vseq to this ebox; parameter space should be the same since
// we're adding to that parameter space
result = ebox[1]->add_vbox( vbox[0], vseq0_minmax[0], vseq0_minmax[0], vseq0_minmax[1], vseq0_minmax[1],
vseq0_minmax[0], vseq0_minmax[0], true, HomCoord( ebox[1]->box_min().i(), 0, 0 ),
HomCoord( ebox[1]->box_min().i(), 0, 0 ) );CHECK_ERR( result );
// add second vseq to this ebox, but reversed; parameter space should be such that the
// last vertex in the second vseq occurs first, and so on
result = ebox[1]->add_vbox( vbox[1], vseq1_minmax[1], ebox[1]->box_min() + HomCoord::getUnitv( 0 ), vseq1_minmax[0],
ebox[1]->box_max(), vseq1_minmax[1], ebox[1]->box_min() + HomCoord::getUnitv( 0 ) );CHECK_ERR( result );
// create the third element sequence; make it use the third vseq (forward sense) and start
// with the start vertex of the second vseq; parameterize it such that it tacks onto the
// end of the previous ebox
result = scdi->create_scd_sequence(
ebox[1]->box_max(), HomCoord( ebox[1]->box_max().i() + 1 + vseq2_minmax[1].i() - vseq2_minmax[0].i(), 0, 0 ),
MBEDGE, 1, ebox[2] );CHECK_ERR( result );
// add shared vertex from second vseq to this ebox; parameter space mapping such that we get
// first vertex only of that vseq
result = ebox[2]->add_vbox( vbox[1], vseq0_minmax[0], ebox[2]->box_min(), vseq0_minmax[0] + HomCoord::getUnitv( 0 ),
ebox[2]->box_min() - HomCoord::getUnitv( 0 ), vseq0_minmax[0], ebox[2]->box_min(), true,
ebox[2]->box_min(), ebox[2]->box_min() );CHECK_ERR( result );
// add third vseq to this ebox, forward orientation
result = ebox[2]->add_vbox( vbox[2], vseq2_minmax[0], ebox[2]->box_min() + HomCoord::getUnitv( 0 ), vseq2_minmax[1],
ebox[2]->box_max(), vseq1_minmax[0], ebox[2]->box_min() + HomCoord::getUnitv( 0 ) );CHECK_ERR( result );
return result;
}
| ErrorCode create_2d_3_sequences | ( | ScdInterface * | scdi, |
| ScdBox ** | vseq, | ||
| ScdBox ** | eseq | ||
| ) |
Definition at line 683 of file scdseq_test.cpp.
References moab::ScdBox::add_vbox(), box_max(), box_min(), CHECK_ERR, moab::ScdInterface::create_scd_sequence(), ErrorCode, moab::HomCoord::getUnitv(), MBEDGE, MBQUAD, and MBVERTEX.
Referenced by eseq_test2b().
{
// create 3 rectangular sequences attached end to end and back (periodic); sequences are
// assorted orientations, sequences have globally-consistent (periodic in i) parameter space
// set vbox parametric spaces directly
HomCoord vbox0_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( 5, 5, 0 ) };
HomCoord vbox1_minmax[2] = { HomCoord( -2, 4, 0 ), HomCoord( 8, 9, 0 ) };
HomCoord vbox2_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( 8, 5, 0 ) };
// create three vertex sequences
vbox[0] = vbox[1] = vbox[2] = NULL;
// first vertex sequence
ErrorCode result = scdi->create_scd_sequence( vbox0_minmax[0], vbox0_minmax[1], MBVERTEX, 1, vbox[0] );CHECK_ERR( result );
// second vertex sequence
result = scdi->create_scd_sequence( vbox1_minmax[0], vbox1_minmax[1], MBVERTEX, 1, vbox[1] );CHECK_ERR( result );
// third vertex sequence
result = scdi->create_scd_sequence( vbox2_minmax[0], vbox2_minmax[1], MBVERTEX, 1, vbox[2] );CHECK_ERR( result );
// now create the three element sequences
ebox[0] = ebox[1] = ebox[2] = NULL;
// create the first element sequence
result = scdi->create_scd_sequence( vbox0_minmax[0], vbox0_minmax[1], MBQUAD, 1, ebox[0] );CHECK_ERR( result );
// add first vertex seq to first element seq, forward orientation, unity transform
result = ebox[0]->add_vbox( vbox[0],
// p1: imin,jmin
vbox0_minmax[0], vbox0_minmax[0],
// p2: imax,jmin
HomCoord( vbox0_minmax[1].i(), vbox0_minmax[0].j(), 0 ),
HomCoord( vbox0_minmax[1].i(), vbox0_minmax[0].j(), 0 ),
// p3: imin,jmax
HomCoord( vbox0_minmax[0].i(), vbox0_minmax[1].j(), 0 ),
HomCoord( vbox0_minmax[0].i(), vbox0_minmax[1].j(), 0 ) );
CHECK_ERR( result );
// create the second element sequence; make it use the right side of the first vbox;
// parameterize it such that it tacks onto imax of the previous ebox
result = scdi->create_scd_sequence( HomCoord( ebox[0]->box_max().i(), ebox[0]->box_min().j(), 0 ),
HomCoord( vbox0_minmax[1].i() + 1 + vbox1_minmax[1].i() - vbox1_minmax[0].i(),
ebox[0]->box_max().j(), 0 ),
MBQUAD, 1, ebox[1] );CHECK_ERR( result );
// add shared side from first vbox to this ebox; parameter space should be the same since
// we're adding to that parameter space
result =
ebox[1]->add_vbox( vbox[0],
// p1: lower right of box 0, lower left of box 1
HomCoord( vbox0_minmax[1].i(), vbox0_minmax[0].j(), 0 ), ebox[1]->box_min(),
// p2: one up from p1
HomCoord( vbox0_minmax[1].i(), vbox0_minmax[0].j(), 0 ) + HomCoord::getUnitv( 1 ),
ebox[1]->box_min() + HomCoord::getUnitv( 1 ),
// p3: one right of p1
HomCoord( vbox0_minmax[1].i(), vbox0_minmax[0].j(), 0 ) + HomCoord::getUnitv( 0 ),
ebox[1]->box_min() + HomCoord::getUnitv( 0 ),
// set bb such that it's the right side of the vbox, left of local ebox
true, ebox[1]->box_min(), HomCoord( ebox[1]->box_min().i(), ebox[1]->box_max().j(), 0 ) );CHECK_ERR( result );
// add second vbox to this ebox, with different orientation but all of it (no bb input)
result = ebox[1]->add_vbox( vbox[1],
// p1: one right of top left of ebox1
vbox1_minmax[0], HomCoord( ebox[1]->box_min().i() + 1, ebox[1]->box_max().j(), 0 ),
// p2: one right from p1
vbox1_minmax[0] + HomCoord::getUnitv( 0 ),
HomCoord( ebox[1]->box_min().i() + 2, ebox[1]->box_max().j(), 0 ),
// p3: one down from p1
vbox1_minmax[0] + HomCoord::getUnitv( 1 ),
HomCoord( ebox[1]->box_min().i() + 1, ebox[1]->box_max().j() - 1, 0 ) );CHECK_ERR( result );
// create the third element sequence; make it use the third vbox (middle) as well as the side of
// the second sequence (left) and a side of the first sequence (right); parameterize it such
// that it tacks onto the end of the previous ebox and the beginning of the 1st sequence (i.e.
// periodic in i)
result =
scdi->create_scd_sequence( HomCoord( ebox[1]->box_max().i(), ebox[1]->box_min().j(), 0 ),
// add one extra for each of left and right sides
HomCoord( ebox[1]->box_max().i() + 1 + vbox2_minmax[1].i() - vbox2_minmax[0].i() + 1,
ebox[1]->box_max().j(), 0 ),
MBEDGE, 1, ebox[2] );CHECK_ERR( result );
// add shared side from second vbox to this ebox; parameter space mapping such that we get
// a side only of that vbox
result =
ebox[2]->add_vbox( vbox[1],
// p1: bottom left
vbox1_minmax[1], ebox[2]->box_min(),
// p2: one right from p1
vbox1_minmax[1] + HomCoord::getUnitv( 0 ), ebox[2]->box_min() + HomCoord::getUnitv( 0 ),
// p3: one up
vbox1_minmax[1] - HomCoord::getUnitv( 1 ), ebox[2]->box_min() + HomCoord::getUnitv( 1 ),
// bb input such that we only get left side of ebox parameter space
true, ebox[2]->box_min(), HomCoord( ebox[2]->box_min().i(), ebox[2]->box_max().j(), 0 ) );CHECK_ERR( result );
// add shared side from first vbox to this ebox; parameter space mapping such that we get
// a side only of that vbox
result = ebox[2]->add_vbox(
vbox[0],
// p1: bottom right
vbox0_minmax[0], HomCoord( ebox[2]->box_max().i(), ebox[2]->box_min().j(), 0 ),
// p2: one right from p1
vbox0_minmax[0] + HomCoord::getUnitv( 0 ), HomCoord( ebox[2]->box_max().i() + 1, ebox[2]->box_min().j(), 0 ),
// p3: one up from p1
vbox0_minmax[0] + HomCoord::getUnitv( 1 ), HomCoord( ebox[2]->box_max().i(), ebox[2]->box_min().j() + 1, 0 ),
// bb input such that we only get left side of ebox parameter space
true, HomCoord( ebox[2]->box_max().i(), ebox[2]->box_min().j(), 0 ), ebox[2]->box_max() );CHECK_ERR( result );
// add third vbox to this ebox
result =
ebox[2]->add_vbox( vbox[2],
// p1: top right and left one
vbox2_minmax[0], ebox[2]->box_max() - HomCoord::getUnitv( 0 ),
// p2: one left of p1
vbox2_minmax[0] + HomCoord::getUnitv( 0 ), ebox[2]->box_max() - HomCoord::getUnitv( 0 ) * 2,
// p3: one down from p1
vbox2_minmax[0] + HomCoord::getUnitv( 1 ),
ebox[2]->box_max() - HomCoord::getUnitv( 0 ) - HomCoord::getUnitv( 1 ) );CHECK_ERR( result );
return result;
}
| ErrorCode create_2dtri_3_sequences | ( | ScdInterface * | scdi, |
| const int | int1, | ||
| const int | int2, | ||
| const int | int3, | ||
| ScdBox ** | vseq, | ||
| ScdBox ** | eseq | ||
| ) |
Definition at line 808 of file scdseq_test.cpp.
References moab::ScdBox::add_vbox(), box_max(), box_min(), CHECK_ERR, moab::ScdInterface::create_scd_sequence(), ErrorCode, moab::HomCoord::getUnitv(), MBQUAD, and MBVERTEX.
Referenced by eseq_test2c().
{
// create 3 rectangular sequences arranged such that the all share a common (tri-valent) corner;
// orient each region such that its origin is at the tri-valent corner and the k direction is
// out of the page
//
// int1 and int2 controls the i and j intervals in region 0, int3 follows from that.
// input is 3 interval settings controlling the 3 degrees of freedom on the interfacesp
// set vbox parametric spaces directly from int1-3
// use 0-based parameterization on vbox's just for fun, which means we'll have to transform into
// ebox system
HomCoord vbox0_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( int1, int2, 0 ) };
HomCoord vbox1_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( int3 - 1, int1, 0 ) };
HomCoord vbox2_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( int2 - 1, int3 - 1, 0 ) };
// create three vertex sequences
vbox[0] = vbox[1] = vbox[2] = NULL;
// first vertex sequence
ErrorCode result = scdi->create_scd_sequence( vbox0_minmax[0], vbox0_minmax[1], MBVERTEX, 1, vbox[0] );CHECK_ERR( result );
// second vertex sequence
result = scdi->create_scd_sequence( vbox1_minmax[0], vbox1_minmax[1], MBVERTEX, 1, vbox[1] );CHECK_ERR( result );
// third vertex sequence
result = scdi->create_scd_sequence( vbox2_minmax[0], vbox2_minmax[1], MBVERTEX, 1, vbox[2] );CHECK_ERR( result );
// now create the three element sequences
// set ebox parametric spaces directly from int1-3
// use 0-based parameterization on ebox's just for fun, which means we'll have to transform into
// ebox system
HomCoord ebox0_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( int1, int2, 0 ) };
HomCoord ebox1_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( int3, int1, 0 ) };
HomCoord ebox2_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( int2, int3, 0 ) };
ebox[0] = ebox[1] = ebox[2] = NULL;
// create the first element sequence
result = scdi->create_scd_sequence( ebox0_minmax[0], ebox0_minmax[1], MBQUAD, 1, ebox[0] );CHECK_ERR( result );
// only need to add one vbox to this, unity transform
result = ebox[0]->add_vbox( vbox[0],
// trick: if I know it's going to be unity, just input
// 3 sets of equivalent points
vbox0_minmax[0], vbox0_minmax[0], vbox0_minmax[0], vbox0_minmax[0], vbox0_minmax[0],
vbox0_minmax[0] );
CHECK_ERR( result );
// create the second element sequence
result = scdi->create_scd_sequence( ebox1_minmax[0], ebox1_minmax[1], MBQUAD, 1, ebox[1] );CHECK_ERR( result );
// add shared side from first vbox to this ebox, with bb to get just the line
result =
ebox[1]->add_vbox( vbox[0],
// p1: origin in both systems
vbox0_minmax[0], ebox0_minmax[0],
// p2: one unit along the shared line (i in one, j in other)
vbox0_minmax[0] + HomCoord::getUnitv( 0 ), ebox0_minmax[0] + HomCoord::getUnitv( 1 ),
// p3: arbitrary
vbox0_minmax[0], ebox0_minmax[0],
// set bb such that it's the jmin side of vbox
true, ebox[1]->box_min(), HomCoord( ebox[1]->box_min().i(), ebox[1]->box_max().j(), 0 ) );CHECK_ERR( result );
// add second vbox to this ebox, with different orientation but all of it (no bb input)
result = ebox[1]->add_vbox( vbox[1],
// p1: origin/i+1 (vbox/ebox)
vbox1_minmax[0], ebox1_minmax[0] + HomCoord::getUnitv( 0 ),
// p2: j+1 from p1
vbox1_minmax[0] + HomCoord::getUnitv( 1 ),
ebox1_minmax[0] + HomCoord::getUnitv( 0 ) + HomCoord::getUnitv( 1 ),
// p3: i+1 from p1
vbox1_minmax[0] + HomCoord::getUnitv( 0 ),
ebox[1]->box_min() + HomCoord::getUnitv( 0 ) * 2 );CHECK_ERR( result );
// create the third element sequence
result = scdi->create_scd_sequence( ebox2_minmax[0], ebox2_minmax[1], MBQUAD, 1, ebox[2] );CHECK_ERR( result );
// add shared side from second vbox to this ebox
result =
ebox[2]->add_vbox( vbox[1],
// p1: origin/j+1 (vbox/ebox)
vbox1_minmax[0], ebox[2]->box_min() + HomCoord::getUnitv( 1 ),
// p2: i+1/j+2 (vbox/ebox)
vbox1_minmax[0] + HomCoord::getUnitv( 0 ), ebox[2]->box_min() + HomCoord::getUnitv( 1 ) * 2,
// p3: arbitrary
vbox1_minmax[0], ebox[2]->box_min() + HomCoord::getUnitv( 1 ),
// bb input such that we only get one side of ebox parameter space
true, ebox[2]->box_min() + HomCoord::getUnitv( 1 ),
HomCoord( ebox[2]->box_min().i(), ebox[2]->box_max().j(), 0 ) );CHECK_ERR( result );
// add shared side from first vbox to this ebox
result = ebox[2]->add_vbox( vbox[0],
// p1: origin/origin
vbox1_minmax[0], ebox2_minmax[0],
// p2: j+1/i+1
vbox1_minmax[0] + HomCoord::getUnitv( 1 ), ebox2_minmax[0] + HomCoord::getUnitv( 0 ),
// p3: arbitrary
vbox1_minmax[0], ebox2_minmax[0],
// bb input such that we only get one side of ebox parameter space
true, ebox2_minmax[0], HomCoord( ebox2_minmax[1].i(), ebox2_minmax[0].j(), 0 ) );CHECK_ERR( result );
// add third vbox to this ebox
result = ebox[2]->add_vbox( vbox[2],
// p1: origin/i+1,j+1
vbox2_minmax[0], ebox[2]->box_min() + HomCoord::getUnitv( 0 ) + HomCoord::getUnitv( 1 ),
// p2: i+1 from p1
vbox2_minmax[0] + HomCoord::getUnitv( 0 ),
ebox[2]->box_min() + HomCoord::getUnitv( 0 ) * 2 + HomCoord::getUnitv( 1 ),
// p3: j+1 from p1
vbox2_minmax[0] + HomCoord::getUnitv( 1 ),
ebox[2]->box_min() + HomCoord::getUnitv( 0 ) + HomCoord::getUnitv( 1 ) * 2 );CHECK_ERR( result );
return result;
}
| ErrorCode create_3dtri_3_sequences | ( | ScdInterface * | scdi, |
| const int | int1, | ||
| const int | int2, | ||
| const int | int3, | ||
| const int | int4, | ||
| ScdBox ** | vseq, | ||
| ScdBox ** | eseq | ||
| ) |
Definition at line 932 of file scdseq_test.cpp.
References moab::ScdBox::add_vbox(), box_max(), box_min(), CHECK_ERR, moab::ScdInterface::create_scd_sequence(), ErrorCode, moab::HomCoord::getUnitv(), MBHEX, and MBVERTEX.
Referenced by eseq_test2d(), and main().
{
// create 3 brick sequences arranged such that the all share a common (tri-valent) edge;
// orient each region similarly to the 2dtri_3_sequences test problem, swept into 3d in the
// positive k direction. This direction is divided into int4 intervals
//
// int1 and int2 controls the i and j intervals in region 0, int3 follows from that; int4
// divides the k axis
// input is 4 interval settings controlling the 4 degrees of freedom on the interfacesp
// set vbox parametric spaces directly from int1-4
// use 0-based parameterization on vbox's just for fun, which means we'll have to transform into
// ebox system
HomCoord vbox0_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( int1, int2, int4 ) };
HomCoord vbox1_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( int3 - 1, int1, int4 ) };
HomCoord vbox2_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( int2 - 1, int3 - 1, int4 ) };
// create three vertex sequences
vbox[0] = vbox[1] = vbox[2] = NULL;
// first vertex sequence
ErrorCode result = scdi->create_scd_sequence( vbox0_minmax[0], vbox0_minmax[1], MBVERTEX, 1, vbox[0] );CHECK_ERR( result );
// second vertex sequence
result = scdi->create_scd_sequence( vbox1_minmax[0], vbox1_minmax[1], MBVERTEX, 1, vbox[1] );CHECK_ERR( result );
// third vertex sequence
result = scdi->create_scd_sequence( vbox2_minmax[0], vbox2_minmax[1], MBVERTEX, 1, vbox[2] );CHECK_ERR( result );
// now create the three element sequences
// set ebox parametric spaces directly from int1-4
// use 0-based parameterization on ebox's just for fun, which means we'll have to transform into
// ebox system
HomCoord ebox0_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( int1, int2, int4 ) };
HomCoord ebox1_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( int3, int1, int4 ) };
HomCoord ebox2_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( int2, int3, int4 ) };
ebox[0] = ebox[1] = ebox[2] = NULL;
// create the first element sequence
result = scdi->create_scd_sequence( ebox0_minmax[0], ebox0_minmax[1], MBHEX, 1, ebox[0] );CHECK_ERR( result );
// only need to add one vbox to this, unity transform
result = ebox[0]->add_vbox( vbox[0],
// trick: if I know it's going to be unity, just input
// 3 sets of equivalent points
vbox0_minmax[0], vbox0_minmax[0], vbox0_minmax[0], vbox0_minmax[0], vbox0_minmax[0],
vbox0_minmax[0] );
CHECK_ERR( result );
// create the second element sequence
result = scdi->create_scd_sequence( ebox1_minmax[0], ebox1_minmax[1], MBHEX, 1, ebox[1] );CHECK_ERR( result );
// add shared side from first vbox to this ebox, with bb to get just the face
result = ebox[1]->add_vbox( vbox[0],
// p1: origin in both systems
vbox0_minmax[0], ebox1_minmax[0],
// p2: one unit along the shared line (i in one, j in other)
vbox0_minmax[0] + HomCoord::getUnitv( 0 ), ebox1_minmax[0] + HomCoord::getUnitv( 1 ),
// p3: +k in both (not arbitrary, since interface is 2d)
vbox0_minmax[0] + HomCoord::getUnitv( 2 ), ebox1_minmax[0] + HomCoord::getUnitv( 2 ),
// set bb such that it's the jmin side of vbox
true, ebox[1]->box_min(),
HomCoord( ebox[1]->box_min().i(), ebox[1]->box_max().j(), ebox[1]->box_max().k() ) );CHECK_ERR( result );
// add second vbox to this ebox, with different orientation but all of it (no bb input)
result = ebox[1]->add_vbox( vbox[1],
// p1: origin/i+1 (vbox/ebox)
vbox1_minmax[0], ebox1_minmax[0] + HomCoord::getUnitv( 0 ),
// p2: j+1 from p1
vbox1_minmax[0] + HomCoord::getUnitv( 1 ),
ebox1_minmax[0] + HomCoord::getUnitv( 0 ) + HomCoord::getUnitv( 1 ),
// p3: i+1 from p1
vbox1_minmax[0] + HomCoord::getUnitv( 0 ),
ebox[1]->box_min() + HomCoord::getUnitv( 0 ) * 2 );CHECK_ERR( result );
// create the third element sequence
result = scdi->create_scd_sequence( ebox2_minmax[0], ebox2_minmax[1], MBHEX, 1, ebox[2] );CHECK_ERR( result );
// add shared side from second vbox to this ebox
result =
ebox[2]->add_vbox( vbox[1],
// p1: origin/j+1 (vbox/ebox)
vbox1_minmax[0], ebox[2]->box_min() + HomCoord::getUnitv( 1 ),
// p2: i+1/j+2 (vbox/ebox)
vbox1_minmax[0] + HomCoord::getUnitv( 0 ), ebox[2]->box_min() + HomCoord::getUnitv( 1 ) * 2,
// p3: +k in both (not arbitrary, since interface is 2d)
vbox1_minmax[0] + HomCoord::getUnitv( 2 ),
ebox[2]->box_min() + HomCoord::getUnitv( 1 ) + HomCoord::getUnitv( 2 ),
// bb input such that we only get one side of ebox parameter space
true, ebox[2]->box_min() + HomCoord::getUnitv( 1 ),
HomCoord( ebox[2]->box_min().i(), ebox[2]->box_max().j(), ebox[2]->box_max().k() ) );CHECK_ERR( result );
// add shared side from first vbox to this ebox
result = ebox[2]->add_vbox( vbox[0],
// p1: origin/origin
vbox0_minmax[0], ebox2_minmax[0],
// p2: j+1/i+1
vbox0_minmax[0] + HomCoord::getUnitv( 1 ), ebox2_minmax[0] + HomCoord::getUnitv( 0 ),
// p3: +k in both (not arbitrary, since interface is 2d)
vbox0_minmax[0] + HomCoord::getUnitv( 2 ), ebox[2]->box_min() + HomCoord::getUnitv( 2 ),
// bb input such that we only get one side of ebox parameter space
true, ebox2_minmax[0],
HomCoord( ebox2_minmax[1].i(), ebox2_minmax[0].j(), ebox2_minmax[1].k() ) );CHECK_ERR( result );
// add third vbox to this ebox
result = ebox[2]->add_vbox( vbox[2],
// p1: origin/i+1,j+1
vbox2_minmax[0], ebox[2]->box_min() + HomCoord::getUnitv( 0 ) + HomCoord::getUnitv( 1 ),
// p2: i+1 from p1
vbox2_minmax[0] + HomCoord::getUnitv( 0 ),
ebox[2]->box_min() + HomCoord::getUnitv( 0 ) * 2 + HomCoord::getUnitv( 1 ),
// p3: j+1 from p1
vbox2_minmax[0] + HomCoord::getUnitv( 1 ),
ebox[2]->box_min() + HomCoord::getUnitv( 0 ) + HomCoord::getUnitv( 1 ) * 2 );CHECK_ERR( result );
return result;
}
| ErrorCode eseq_test1a | ( | ScdInterface * | scdi, |
| HomCoord | tmp_min, | ||
| HomCoord | tmp_max | ||
| ) |
Definition at line 362 of file scdseq_test.cpp.
References moab::ScdBox::add_vbox(), check_element_sequence(), CHECK_EQUAL, CHECK_ERR, moab::ScdInterface::create_scd_sequence(), ErrorCode, evaluate_element_sequence(), MBEDGE, MBVERTEX, moab::ScdBox::num_elements(), and moab::ScdBox::start_element().
Referenced by test_element_seq().
{
// TEST 1a: 1d single vertex seq block, min/max = (-10,0,0)/(10,0,0)
// create vertex seq
// first get 1d min/max by resetting j, k components
tmp_min[1] = tmp_min[2] = tmp_max[1] = tmp_max[2] = 0;
ScdBox *ebox, *vbox;
ErrorCode result = scdi->create_scd_sequence( tmp_min, tmp_max, MBVERTEX, 1, vbox );CHECK_ERR( result );
// now create the element sequence
result = scdi->create_scd_sequence( tmp_min, tmp_max, MBEDGE, 1, ebox );CHECK_ERR( result );
int num_edges = ebox->num_elements();
CHECK_EQUAL( ( tmp_max[0] - tmp_min[0] ), num_edges );
// add vertex seq to element seq
result = ebox->add_vbox( vbox, tmp_min, tmp_min, tmp_max, tmp_max, tmp_min, tmp_min );CHECK_ERR( result );
// check/evaluate element sequence
result = check_element_sequence( ebox, tmp_min, tmp_max, ebox->start_element() );CHECK_ERR( result );
result = evaluate_element_sequence( ebox );CHECK_ERR( result );
return result;
}
| ErrorCode eseq_test1b | ( | ScdInterface * | scdi, |
| HomCoord | tmp_min, | ||
| HomCoord | tmp_max | ||
| ) |
Definition at line 389 of file scdseq_test.cpp.
References access_adjacencies(), moab::ScdBox::add_vbox(), check_element_sequence(), CHECK_EQUAL, CHECK_ERR, moab::ScdInterface::create_scd_sequence(), ErrorCode, evaluate_element_sequence(), moab::Interface::get_connectivity(), moab::HomCoord::i(), moab::ScdInterface::impl(), moab::HomCoord::j(), moab::HomCoord::k(), MBQUAD, MBVERTEX, and moab::ScdBox::start_element().
Referenced by test_element_seq().
{
// TEST 1b: 2d single vertex seq block, min/max = (-10,-5,0)/(10,5,0)
// first get 2d min/max by resetting k component
tmp_min[2] = tmp_max[2] = 0;
// get the seq manager from gMB
ScdBox *ebox, *vbox;
ErrorCode result = scdi->create_scd_sequence( tmp_min, tmp_max, MBVERTEX, 1, vbox );CHECK_ERR( result );
// now create the element sequence
result = scdi->create_scd_sequence( tmp_min, tmp_max, MBQUAD, 1, ebox );CHECK_ERR( result );
// add vertex seq to element seq; first need to construct proper 3pt input (p1 is tmp_min)
HomCoord p2( tmp_max.i(), tmp_min.j(), tmp_min.k() );
HomCoord p3( tmp_min.i(), tmp_max.j(), tmp_min.k() );
result = ebox->add_vbox( vbox, tmp_min, tmp_min, p2, p2, p3, p3 );CHECK_ERR( result );
std::vector< EntityHandle > connect;
EntityHandle dum_ent = ebox->start_element();
result = scdi->impl()->get_connectivity( &dum_ent, 1, connect );CHECK_ERR( result );
CHECK_EQUAL( (unsigned int)connect.size(), (unsigned int)4 );
// check/evaluate element sequence
result = check_element_sequence( ebox, tmp_min, tmp_max, ebox->start_element() );CHECK_ERR( result );
result = evaluate_element_sequence( ebox );CHECK_ERR( result );
result = access_adjacencies( ebox );CHECK_ERR( result );
return result;
}
| ErrorCode eseq_test1c | ( | ScdInterface * | scdi, |
| const HomCoord & | tmp_min, | ||
| const HomCoord & | tmp_max | ||
| ) |
Definition at line 423 of file scdseq_test.cpp.
References access_adjacencies(), moab::ScdBox::add_vbox(), check_element_sequence(), CHECK_ERR, moab::ScdInterface::create_scd_sequence(), ErrorCode, evaluate_element_sequence(), moab::HomCoord::i(), moab::HomCoord::j(), moab::HomCoord::k(), MBHEX, MBVERTEX, and moab::ScdBox::start_element().
Referenced by test_element_seq().
{
// TEST 1c: 3d single vertex seq block, min/max = (-10,-5,-1)/(10,5,1)
// get the seq manager from gMB
ScdBox *ebox, *vbox;
ErrorCode result = scdi->create_scd_sequence( tmp_min, tmp_max, MBVERTEX, 1, vbox );CHECK_ERR( result );
// now create the element sequence
result = scdi->create_scd_sequence( tmp_min, tmp_max, MBHEX, 1, ebox );CHECK_ERR( result );
// add vertex seq to element seq; first need to construct proper 3pt input (p1 is tmp_min)
HomCoord p2( tmp_max.i(), tmp_min.j(), tmp_min.k() );
HomCoord p3( tmp_min.i(), tmp_max.j(), tmp_min.k() );
result = ebox->add_vbox( vbox, tmp_min, tmp_min, p2, p2, p3, p3 );CHECK_ERR( result );
// check/evaluate element sequence
result = check_element_sequence( ebox, tmp_min, tmp_max, ebox->start_element() );CHECK_ERR( result );
result = evaluate_element_sequence( ebox );CHECK_ERR( result );
result = access_adjacencies( ebox );CHECK_ERR( result );
return result;
}
| ErrorCode eseq_test2a | ( | ScdInterface * | scdi, |
| const HomCoord & | tmp_min, | ||
| const HomCoord & | tmp_max | ||
| ) |
Definition at line 449 of file scdseq_test.cpp.
References box_max(), box_min(), check_element_sequence(), CHECK_ERR, create_1d_3_sequences(), ErrorCode, and evaluate_element_sequence().
Referenced by test_element_seq().
{
// TEST 2a: 1d composite block, 0d difference between owning/sharing blocks
// create vertex seq
ScdBox *vbox[3], *ebox[3];
ErrorCode result = create_1d_3_sequences( scdi, tmp_min, tmp_max, vbox, ebox );CHECK_ERR( result );
// whew; that's done; now check and evaluate
// first check to make sure the parameter spaces tack onto one another
if( ebox[0]->box_min() != tmp_min || ebox[0]->box_max() != ebox[1]->box_min() ||
ebox[1]->box_max() != ebox[2]->box_min() )
CHECK_ERR( MB_FAILURE );
// check/evaluate element sequences
for( int i = 0; i < 3; i++ )
{
result = check_element_sequence( ebox[i], ebox[i]->box_min(), ebox[i]->box_max(), ebox[i]->start_element() );CHECK_ERR( result );
result = evaluate_element_sequence( ebox[i] );CHECK_ERR( result );
}
return result;
}
| ErrorCode eseq_test2b | ( | ScdInterface * | scdi | ) |
Definition at line 475 of file scdseq_test.cpp.
References access_adjacencies(), box_max(), box_min(), check_element_sequence(), CHECK_ERR, create_2d_3_sequences(), ErrorCode, and evaluate_element_sequence().
Referenced by test_element_seq().
{
// TEST 2b: 2d composite block, 0d difference between owning/sharing blocks
// create vertex seq
ScdBox *ebox[3], *vbox[3];
ErrorCode result = create_2d_3_sequences( scdi, vbox, ebox );CHECK_ERR( result );
// whew; that's done; now check and evaluate
// first check to make sure the parameter spaces tack onto one another
if( ebox[0]->box_max() != HomCoord( ebox[1]->box_min().i(), ebox[1]->box_max().j(), 0 ) ||
ebox[1]->box_max() != HomCoord( ebox[2]->box_min().i(), ebox[2]->box_max().j(), 0 ) ||
// cheat on the i value of ebox0, since it's a periodic bdy (we don't check for that, so you
// may get different values for that parameter)
ebox[2]->box_max() != HomCoord( ebox[2]->box_max().i(), ebox[0]->box_max().j(), 0 ) )
CHECK_ERR( MB_FAILURE );
// check/evaluate element sequences
for( int i = 0; i < 3; i++ )
{
result = check_element_sequence( ebox[i], ebox[i]->box_min(), ebox[i]->box_max(), ebox[i]->start_element() );CHECK_ERR( result );
result = evaluate_element_sequence( ebox[i] );CHECK_ERR( result );
}
for( int i = 0; i < 3; i++ )
{
result = access_adjacencies( ebox[i] );CHECK_ERR( result );
}
return result;
}
| ErrorCode eseq_test2c | ( | ScdInterface * | scdi | ) |
Definition at line 509 of file scdseq_test.cpp.
References access_adjacencies(), box_max(), box_min(), check_element_sequence(), CHECK_ERR, create_2dtri_3_sequences(), ErrorCode, and evaluate_element_sequence().
Referenced by test_element_seq().
{
// TEST 2c: 2d composite block, 0d difference between owning/sharing blocks,
// tri-valent shared vertex between the three blocks
// interval settings: only 3 of them
int int1 = 5, int2 = 15, int3 = 25;
ScdBox *ebox[3], *vbox[3];
ErrorCode result = create_2dtri_3_sequences( scdi, int1, int2, int3, vbox, ebox );CHECK_ERR( result );
// whew; that's done; now check and evaluate
// check/evaluate element sequences
for( int i = 0; i < 3; i++ )
{
result = check_element_sequence( ebox[i], ebox[i]->box_min(), ebox[i]->box_max(), ebox[i]->start_element() );CHECK_ERR( result );
result = evaluate_element_sequence( ebox[i] );CHECK_ERR( result );
}
for( int i = 0; i < 3; i++ )
{
result = access_adjacencies( ebox[i] );CHECK_ERR( result );
}
return result;
}
| ErrorCode eseq_test2d | ( | ScdInterface * | scdi | ) |
Definition at line 537 of file scdseq_test.cpp.
References access_adjacencies(), box_max(), box_min(), check_element_sequence(), CHECK_ERR, create_3dtri_3_sequences(), ErrorCode, and evaluate_element_sequence().
Referenced by test_element_seq().
{
// TEST 2d: 3d composite block, 0d difference between owning/sharing blocks,
// tri-valent shared edge between the three blocks
// interval settings: only 3 of them
int int1 = 10, int2 = 10, int3 = 10, int4 = 10;
ScdBox *ebox[3], *vbox[3];
ErrorCode result = create_3dtri_3_sequences( scdi, int1, int2, int3, int4, vbox, ebox );CHECK_ERR( result );
// whew; that's done; now check and evaluate
// check/evaluate element sequences
for( int i = 0; i < 3; i++ )
{
result = check_element_sequence( ebox[i], ebox[i]->box_min(), ebox[i]->box_max(), ebox[i]->start_element() );CHECK_ERR( result );
result = evaluate_element_sequence( ebox[i] );CHECK_ERR( result );
}
for( int i = 0; i < 3; i++ )
{
result = access_adjacencies( ebox[i] );CHECK_ERR( result );
}
return result;
}
| ErrorCode evaluate_element_sequence | ( | ScdBox * | this_box | ) |
Definition at line 218 of file scdseq_test.cpp.
References moab::ScdBox::box_max(), moab::ScdBox::box_min(), moab::ScdBox::contains(), ErrorCode, moab::ScdBox::get_element(), moab::ScdBox::get_params(), moab::ScdBox::get_vertex(), moab::ScdBox::locally_periodic_i(), moab::ScdBox::locally_periodic_j(), and MB_SUCCESS.
Referenced by eseq_test1a(), eseq_test1b(), eseq_test1c(), eseq_test2a(), eseq_test2b(), eseq_test2c(), eseq_test2d(), and test_periodic_seq().
{
ErrorCode result = MB_SUCCESS;
// first get the parametric extents
HomCoord ijk1 = this_box->box_min(), ijk2 = this_box->box_max();
// now evaluate all the vertices and elements in forward and reverse
EntityHandle tmp_handle, tmp_handle2;
int is_periodic_i = ( this_box->locally_periodic_i() ? 1 : 0 ),
is_periodic_j = ( this_box->locally_periodic_j() ? 1 : 0 );
for( int i = ijk1[0]; i < ijk2[0] + is_periodic_i; i++ )
{
for( int j = ijk1[1]; j < ijk2[1] + is_periodic_j; j++ )
{
for( int k = ijk1[2]; k < ijk2[2]; k++ )
{
// get_vertex variants
tmp_handle = this_box->get_vertex( i, j, k );
tmp_handle2 = this_box->get_vertex( HomCoord( i, j, k ) );
if( tmp_handle2 != tmp_handle )
{
std::cout << "element seq: get_vertex(HomCoord) and get_vertex(i,j,k) didn't return" << std::endl
<< "consistent results, i, j, k = " << i << ", " << j << ", " << k << "." << std::endl;
result = MB_FAILURE;
}
// get element variants
tmp_handle = this_box->get_element( i, j, k );
tmp_handle2 = this_box->get_element( HomCoord( i, j, k ) );
if( tmp_handle2 != tmp_handle )
{
std::cout << "element seq: get_element(HomCoord) and get_element(i,j,k) didn't return" << std::endl
<< "consistent results, i, j, k = " << i << ", " << j << ", " << k << "." << std::endl;
result = MB_FAILURE;
}
// get_params
int itmp, jtmp, ktmp;
itmp = jtmp = ktmp = 0xdeadbeef;
ErrorCode tmp_result = this_box->get_params( tmp_handle, itmp, jtmp, ktmp );
if( MB_SUCCESS != tmp_result || i != itmp || j != jtmp || k != ktmp )
{
std::cout << "element seq: get_params didn't work, i, j, k = " << i << ", " << j << ", " << k
<< "; itmp, jtmp, ktmp = " << itmp << ", " << jtmp << ", " << ktmp << std::endl;
result = MB_FAILURE;
}
if( !this_box->contains( i, j, k ) || !this_box->contains( HomCoord( i, j, k ) ) )
{
std::cout << "element seq: contains didn't work, i, j, k = " << i << ", " << j << ", " << k << "."
<< std::endl;
result = MB_FAILURE;
}
}
}
}
return result;
}
| ErrorCode evaluate_vertex_box | ( | ScdBox * | this_box | ) |
| ErrorCode evaluate_vertex_sequence | ( | ScdBox * | this_box | ) |
Definition at line 154 of file scdseq_test.cpp.
References moab::ScdBox::box_max(), moab::ScdBox::box_min(), moab::ScdBox::contains(), ErrorCode, moab::ScdBox::get_params(), moab::ScdBox::get_vertex(), MB_SUCCESS, and moab::ScdBox::start_vertex().
Referenced by test_vertex_seq().
{
ErrorCode result = MB_SUCCESS;
// first get the parametric extents
HomCoord ijk1 = this_box->box_min(), ijk2 = this_box->box_max();
// then the start vertex
EntityHandle start_handle = this_box->start_vertex();
// now evaluate all the vertices in forward and reverse
EntityHandle tmp_handle, tmp_handle2;
for( int i = ijk1[0]; i <= ijk2[0]; i++ )
{
for( int j = ijk1[1]; j <= ijk2[1]; j++ )
{
for( int k = ijk1[2]; k <= ijk2[2]; k++ )
{
// compute what the vertex handle is supposed to be
EntityHandle this_handle = start_handle + ( i - ijk1[0] ) +
( j - ijk1[1] ) * ( ijk2[0] - ijk1[0] + 1 ) +
( k - ijk1[2] ) * ( ijk2[1] - ijk1[1] + 1 ) * ( ijk2[0] - ijk1[0] + 1 );
// get_vertex variants
tmp_handle = this_box->get_vertex( i, j, k );
if( this_box->get_vertex( i, j, k ) != this_handle )
{
std::cout << "vertex seq: get_vertex(i, j, k) didn't work, i, j, k = " << i << ", " << j << ", "
<< k << "." << std::endl;
result = MB_FAILURE;
}
tmp_handle2 = this_box->get_vertex( HomCoord( i, j, k ) );
if( tmp_handle2 != this_handle )
{
std::cout << "vertex seq: get_vertex(HomCoord) didn't work, i, j, k = " << i << ", " << j << ", "
<< k << "." << std::endl;
result = MB_FAILURE;
}
int itmp, jtmp, ktmp;
itmp = jtmp = ktmp = 0xdeadbeef;
ErrorCode tmp_result = this_box->get_params( tmp_handle, itmp, jtmp, ktmp );
if( MB_SUCCESS != tmp_result || i != itmp || j != jtmp || k != ktmp )
{
std::cout << "vertex seq: get_params didn't work, i, j, k = " << i << ", " << j << ", " << k
<< "; itmp, jtmp, ktmp = " << itmp << ", " << jtmp << ", " << ktmp << std::endl;
result = MB_FAILURE;
}
if( !this_box->contains( i, j, k ) || !this_box->contains( HomCoord( i, j, k ) ) )
{
std::cout << "vertex seq: contains didn't work, i, j, k = " << i << ", " << j << ", " << k << "."
<< std::endl;
result = MB_FAILURE;
}
}
}
}
return result;
}
| int main | ( | int | , |
| char ** | |||
| ) |
Definition at line 282 of file scdseq_test.cpp.
References RUN_TEST, test_element_seq(), test_parallel_partitions(), test_periodic_seq(), and test_vertex_seq().
{
// test partition methods
int err = RUN_TEST( test_parallel_partitions );
// test creating and evaluating vertex sequences
err += RUN_TEST( test_vertex_seq );
// test creating and evaluating element sequences
err += RUN_TEST( test_element_seq );
// test periodic sequences
err += RUN_TEST( test_periodic_seq );
return err;
}
| void test_element_seq | ( | ) |
Definition at line 340 of file scdseq_test.cpp.
References CHECK_ERR, ErrorCode, eseq_test1a(), eseq_test1b(), eseq_test1c(), eseq_test2a(), eseq_test2b(), eseq_test2c(), and eseq_test2d().
Referenced by main().
{
Core moab;
ScdInterface* scdi;
ErrorCode rval = moab.Interface::query_interface( scdi );CHECK_ERR( rval );
HomCoord TEST_MIN_PARAMS( 0, 0, 0 );
HomCoord TEST_BOX_MAX( 11, 5, 2 );
// TEST 1: single vertex sequence blocks, unity mapping
rval = eseq_test1a( scdi, TEST_MIN_PARAMS, TEST_BOX_MAX );CHECK_ERR( rval );
rval = eseq_test1b( scdi, TEST_MIN_PARAMS, TEST_BOX_MAX );CHECK_ERR( rval );
rval = eseq_test1c( scdi, TEST_MIN_PARAMS, TEST_BOX_MAX );CHECK_ERR( rval );
// TEST 2: composites, 0d difference between element block "owning"
// vertex block and element block sharing vertex block
rval = eseq_test2a( scdi, TEST_MIN_PARAMS, TEST_BOX_MAX );CHECK_ERR( rval );
rval = eseq_test2b( scdi );CHECK_ERR( rval );
rval = eseq_test2c( scdi );CHECK_ERR( rval );
rval = eseq_test2d( scdi );CHECK_ERR( rval );
}
| ErrorCode test_parallel_partition | ( | int * | gdims, |
| int | nprocs, | ||
| int | part_method | ||
| ) |
Definition at line 1203 of file scdseq_test.cpp.
References moab::ScdInterface::compute_partition(), ErrorCode, moab::fail(), moab::ScdParData::gDims, moab::ScdInterface::get_neighbor(), moab::ScdParData::gPeriodic, MB_SUCCESS, PARRAY3, PARRAY6, moab::ScdParData::partMethod, and moab::ScdParData::pDims.
Referenced by test_parallel_partitions().
{
ErrorCode rval;
int pto, pfrom, across_bdy_a[3], across_bdy_b[3], rdims_a[6], rdims_b[6], facedims_a[6], facedims_b[6], ldims[6],
lper[3], pijk[3];
ScdParData spd;
for( int i = 0; i < 6; i++ )
spd.gDims[i] = gdims[i];
for( int i = 0; i < 3; i++ )
spd.gPeriodic[i] = 0;
spd.partMethod = part_method;
int fails = 0;
for( int p = 0; p < nprocs / 2; p++ )
{
rval = ScdInterface::compute_partition( nprocs, p, spd, ldims, lper, pijk );
if( MB_SUCCESS != rval ) continue;
for( int k = -1; k <= 1; k++ )
{
for( int j = -1; j <= 1; j++ )
{
for( int i = -1; i <= 1; i++ )
{
int dijka[] = { i, j, k }, dijkb[] = { -i, -j, -k };
rval = ScdInterface::get_neighbor( nprocs, p, spd, dijka, pto, rdims_a, facedims_a, across_bdy_a );
if( MB_SUCCESS != rval ) return rval;
if( -1 == pto ) continue;
bool fail = false;
if( facedims_a[0] < rdims_a[0] || facedims_a[0] > rdims_a[3] || facedims_a[1] < rdims_a[1] ||
facedims_a[1] > rdims_a[4] || facedims_a[2] < rdims_a[2] || facedims_a[2] > rdims_a[5] )
fail = true;
// non-negative value of pto; check corresponding input from that proc to this
rval =
ScdInterface::get_neighbor( nprocs, pto, spd, dijkb, pfrom, rdims_b, facedims_b, across_bdy_b );
if( MB_SUCCESS != rval ) return rval;
for( int ind = 0; ind < 3; ind++ )
if( facedims_a[ind] < rdims_b[ind] || facedims_b[ind] > rdims_b[ind + 3] ) fail = true;
for( int ind = 0; ind < 6; ind++ )
{
if( facedims_a[ind] != facedims_b[ind] || rdims_b[ind] != ldims[ind] ) fail = true;
}
if( across_bdy_a[0] != across_bdy_b[0] || across_bdy_a[1] != across_bdy_b[1] ) fail = true;
#define PARRAY( a ) "(" << ( a )[0] << "," << ( a )[1] << "," << ( a )[2] << ")"
#define PARRAY3( a, b, c ) "(" << ( a ) << "," << ( b ) << "," << ( c ) << ")"
#define PARRAY6( a ) PARRAY( a ) << "-" << PARRAY( ( ( a ) + 3 ) )
if( fail )
{
fails++;
for( int l = 0; l < 3; l++ )
spd.pDims[l] = pijk[l];
std::cerr << "partMeth = " << part_method << ", p/np = " << p << "/" << nprocs
<< ", (i,j,k) = " << PARRAY3( i, j, k ) << ", ldims = " << PARRAY6( ldims )
<< std::endl
<< "facedims_a = " << PARRAY6( facedims_a )
<< ", facedims_b = " << PARRAY6( facedims_b ) << std::endl
<< "rdims_a = " << PARRAY6( rdims_a ) << ", rdims_b = " << PARRAY6( rdims_b )
<< std::endl;
std::cerr << "ScdParData: " << spd << std::endl;
}
} // i
} // j
} // k
} // p
return ( fails ? MB_FAILURE : MB_SUCCESS );
}
| void test_parallel_partitions | ( | ) |
Definition at line 1163 of file scdseq_test.cpp.
References moab::ScdParData::ALLJKBAL, moab::ScdParData::ALLJORKORI, CHECK_ERR, ErrorCode, gdims, MB_SUCCESS, moab::ScdParData::SQIJ, moab::ScdParData::SQIJK, moab::ScdParData::SQJK, and test_parallel_partition().
Referenced by main().
{
Core moab;
ScdInterface* scdi;
ErrorCode rval = moab.Interface::query_interface( scdi );CHECK_ERR( rval );
int gdims[] = { 0, 0, 0, 48, 40, 18 };
// test for various numbers of procs, powers of two
int maxpow = 4;
int fails = 0;
for( int exp = 2; exp <= maxpow; exp += 2 )
{
int nprocs = 0.1 + pow( 2.0, (double)exp );
// alljorkori
rval = test_parallel_partition( gdims, nprocs, ScdParData::ALLJORKORI );
if( MB_SUCCESS != rval ) fails++;
// alljkbal
rval = test_parallel_partition( gdims, nprocs, ScdParData::ALLJKBAL );
if( MB_SUCCESS != rval ) fails++;
// sqij
rval = test_parallel_partition( gdims, nprocs, ScdParData::SQIJ );
if( MB_SUCCESS != rval ) fails++;
// sqjk
rval = test_parallel_partition( gdims, nprocs, ScdParData::SQJK );
if( MB_SUCCESS != rval ) fails++;
// sqijk
rval = test_parallel_partition( gdims, nprocs, ScdParData::SQIJK );
if( MB_SUCCESS != rval ) fails++;
}
if( fails ) CHECK_ERR( MB_FAILURE );
}
| void test_partition_method | ( | ScdParData::PartitionMethod | pm | ) |
| void test_partition_methods | ( | ) |
| void test_periodic_seq | ( | ) |
Definition at line 565 of file scdseq_test.cpp.
References CHECK_ERR, moab::ScdInterface::construct_box(), ErrorCode, and evaluate_element_sequence().
Referenced by main().
{
Core moab;
ScdInterface* scdi;
ErrorCode rval = moab.Interface::query_interface( scdi );CHECK_ERR( rval );
HomCoord TEST_MIN_PARAMS( 0, 0, 0 );
HomCoord TEST_BOX_MAX( 11, 5, 2 );
// periodic in i
ScdBox* new_box;
int lperiodic[2] = { 1, 0 };
rval = scdi->construct_box( TEST_MIN_PARAMS, TEST_BOX_MAX, NULL, 0, new_box, lperiodic );CHECK_ERR( rval );
rval = evaluate_element_sequence( new_box );CHECK_ERR( rval );
// periodic in j
lperiodic[0] = 0;
lperiodic[1] = 1;
rval = scdi->construct_box( TEST_MIN_PARAMS, TEST_BOX_MAX, NULL, 0, new_box, lperiodic );CHECK_ERR( rval );
rval = evaluate_element_sequence( new_box );CHECK_ERR( rval );
// periodic in i and j
lperiodic[0] = 1;
lperiodic[1] = 1;
rval = scdi->construct_box( TEST_MIN_PARAMS, TEST_BOX_MAX, NULL, 0, new_box, lperiodic );CHECK_ERR( rval );
rval = evaluate_element_sequence( new_box );CHECK_ERR( rval );
// 2d, periodic in i
TEST_BOX_MAX[2] = 0;
lperiodic[0] = 1;
lperiodic[1] = 0;
rval = scdi->construct_box( TEST_MIN_PARAMS, TEST_BOX_MAX, NULL, 0, new_box, lperiodic );CHECK_ERR( rval );
rval = evaluate_element_sequence( new_box );CHECK_ERR( rval );
// 2d, periodic in j
lperiodic[0] = 0;
lperiodic[1] = 1;
rval = scdi->construct_box( TEST_MIN_PARAMS, TEST_BOX_MAX, NULL, 0, new_box, lperiodic );CHECK_ERR( rval );
rval = evaluate_element_sequence( new_box );CHECK_ERR( rval );
// 2d, periodic in i and j
lperiodic[0] = 1;
lperiodic[1] = 1;
rval = scdi->construct_box( TEST_MIN_PARAMS, TEST_BOX_MAX, NULL, 0, new_box, lperiodic );CHECK_ERR( rval );
rval = evaluate_element_sequence( new_box );CHECK_ERR( rval );
}
| void test_vertex_seq | ( | ) |
Definition at line 299 of file scdseq_test.cpp.
References CHECK_ERR, check_vertex_sequence(), moab::ScdInterface::create_scd_sequence(), ErrorCode, evaluate_vertex_sequence(), MBVERTEX, and moab::ScdBox::start_vertex().
Referenced by main().
{
Core moab;
ScdInterface* scdi;
ErrorCode rval = moab.Interface::query_interface( scdi );CHECK_ERR( rval );
// get the seq manager from gMB
ScdBox* dum_box = NULL;
// make a 1d sequence
ErrorCode result = scdi->create_scd_sequence( HomCoord( -10, 0, 0 ), HomCoord( 10, 0, 0 ), MBVERTEX, 1, dum_box );CHECK_ERR( result );
if( !dum_box || dum_box->start_vertex() == 0 ) CHECK_ERR( MB_FAILURE );
// check sequence data
result = check_vertex_sequence( dum_box, -10, 0, 0, 10, 0, 0, dum_box->start_vertex() );CHECK_ERR( result );
// evaluate that sequence for all possible values
result = evaluate_vertex_sequence( dum_box );CHECK_ERR( result );
// make a 2d sequence
dum_box = NULL;
result = scdi->create_scd_sequence( HomCoord( -10, -10, 0 ), HomCoord( 10, 10, 0 ), MBVERTEX, 1, dum_box );CHECK_ERR( result );
// check sequence data
result = check_vertex_sequence( dum_box, -10, -10, 0, 10, 10, 0, dum_box->start_vertex() );CHECK_ERR( result );
// evaluate that sequence for all possible values
result = evaluate_vertex_sequence( dum_box );CHECK_ERR( result );
// make a 3d sequence
dum_box = NULL;
result = scdi->create_scd_sequence( HomCoord( -10, -10, -10 ), HomCoord( 10, 10, 10 ), MBVERTEX, 1, dum_box );CHECK_ERR( result );
if( !dum_box || dum_box->start_vertex() == 0 ) CHECK_ERR( MB_FAILURE );
// check sequence data
result = check_vertex_sequence( dum_box, -10, -10, -10, 10, 10, 10, dum_box->start_vertex() );CHECK_ERR( result );
// evaluate that sequence for all possible values
result = evaluate_vertex_sequence( dum_box );CHECK_ERR( result );
}