25 #pragma warning( disable : 4786 )
51 #ifndef IS_BUILDING_MB
52 #define IS_BUILDING_MB
64 #define TEST_USES_ERR_CODES
73 if( MB_SUCCESS != ( A ) ) \
75 std::cerr << "Failure (error code " << ( A ) << ") at " __FILE__ ":" << __LINE__ << std::endl; \
80 #ifdef MOAB_HAVE_NETCDF
83 std::string file_name = TestDir +
"unittest/mbtest1.g";
87 std::cout <<
"Failed to load input file: " << file_name << std::endl;
88 std::string error_reason;
90 cout << error_reason << std::endl;
117 std::vector< double > all_coords( 3 * vertices.
size() );
118 double* coord_iter = &all_coords[0];
126 const size_t N = vertices.
size() + 1;
127 std::vector< double > x( N ), y( N ), z( N );
130 x[vertices.
size()] = y[vertices.
size()] = z[vertices.
size()] = -3.14159;
132 for(
size_t i = 0; i < vertices.
size(); ++i )
184 std::vector< EntityHandle > verts;
188 int input_value = 11;
196 else if( output_value != input_value )
208 else if( output_value != input_value )
212 handle = *std::max_element( verts.begin(), verts.end() ) + 1;
221 if( output_value != input_value )
return MB_FAILURE;
231 bool bool_input_value =
true;
232 bool bool_output_value =
false;
238 else if( bool_output_value != bool_input_value )
249 double double_input_value = 1.0;
250 double double_output_value = 0.0;
257 else if( double_output_value != double_input_value )
275 input_tag_struct.test_int = 55;
283 else if( output_tag_struct.test_int != input_tag_struct.test_int ||
296 for( i = 0; i < 10; i++ )
301 handle = verts[i] + *std::max_element( verts.begin(), verts.end() );
323 if( ( i % 2 ) && output_value != input_value )
return MB_FAILURE;
327 std::string int_tag_name;
331 if( int_tag_name !=
"sparse_int_tag" )
return MB_FAILURE;
338 if( int_tag_handle != tag_id )
return MB_FAILURE;
341 std::vector< Tag > all_tags;
346 if( !all_tags.empty() )
386 double array[3] = { 0.0, 0.0, 0.0 };
408 bool create_if_missing =
false;
409 std::vector< EntityHandle > meshsets;
413 if( 1u != meshsets.size() )
return MB_FAILURE;
425 Range hexes, expt_vert, got_vert, some_hexes;
437 for( i = hexes.
begin(); i != hexes.
end(); ++i )
439 if( ++n % 3 )
continue;
445 for(
int k = 0; k < len; ++k )
446 expt_vert.
insert( conn[k] );
453 std::cout <<
"get_adjacencies failed with error code " << rval << std::endl;
457 i = expt_vert.
begin();
458 j = got_vert.
begin();
459 while( i != expt_vert.
end() && j != got_vert.
end() )
463 std::cout <<
"Result missing vertex: " << *i << std::endl;
468 std::cout <<
"Result contains extra vertex: " << *j << std::endl;
475 if( i != expt_vert.
end() )
477 std::cout <<
"Result missing vertex: " << *i << std::endl;
480 else if( j != got_vert.
end() )
482 std::cout <<
"Result contains extra vertex: " << *j << std::endl;
488 #ifdef MOAB_HAVE_NETCDF
519 unsigned int num_hexes = hexes.
size();
522 for( riter = hexes.
rbegin(); riter != hexes.
rend(); ++riter )
533 for( iter = nodes.
begin(); iter != nodes.
end(); ++iter )
539 Range interior_nodes;
540 std::vector< EntityHandle > attached_hexes;
541 for( iter = nodes.
begin(); iter != nodes.
end(); )
543 attached_hexes.
clear();
546 attached_hexes.erase( std::remove_if( attached_hexes.begin(), attached_hexes.end(),
548 attached_hexes.end() );
552 if( attached_hexes.size() == 8 )
555 interior_nodes.
insert( *iter );
556 iter = nodes.
erase( iter );
563 Range interior_quads;
564 result =
mb->
get_adjacencies( interior_nodes, 2,
true, interior_quads, Interface::UNION );
568 Range temp_quads, exterior_quads;
574 std::set_difference( temp_quads.
begin(), temp_quads.
end(), interior_quads.
begin(), interior_quads.
end(),
579 unsigned int num_expected_int_quads = ( 6 * num_hexes - exterior_quads.
size() ) / 2;
580 if( num_expected_int_quads != interior_quads.
size() )
return MB_FAILURE;
586 Range remaining_quads;
590 if( remaining_quads.
size() != exterior_quads.
size() )
return MB_FAILURE;
599 handle_range.
clear();
607 if( handle_range.
size() != (
unsigned int)num_ents )
return MB_FAILURE;
621 double coords[] = { 0, 0, 0, 2, 0, 0, 1, 2, 0 };
625 if( verts.
size() != 3 )
return MB_FAILURE;
629 std::copy( verts.
begin(), verts.
end(), vert_arr );
633 vert_arr[2] = vert_arr[0];
638 std::vector< EntityHandle > results;
640 if( results.size() != 1 || results.front() != tri )
642 std::cerr <<
"Adjacency query from forward edge to tri failed at " << __FILE__ <<
":" << __LINE__ << std::endl;
647 if( results.size() != 1 || results.front() != forward_edge )
649 std::cerr <<
"Adjacency query from tri to forward edge failed at " << __FILE__ <<
":" << __LINE__ << std::endl;
658 if( !results.empty() )
660 std::cerr <<
"Adjacency query from tri returned non-existent edge at " << __FILE__ <<
":" << __LINE__
670 if( results.size() != 1 || results.front() != tri )
672 std::cerr <<
"Adjacency query from reverse edge to tri failed at " << __FILE__ <<
":" << __LINE__ << std::endl;
677 if( results.size() != 1 || results.front() != reverse_edge )
679 std::cerr <<
"Adjacency query from tri to reverse edge failed at " << __FILE__ <<
":" << __LINE__ << std::endl;
696 const double coords[] = { 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 1, 0, 1, 1, 0, 2, 1, 0,
697 0, 0, 1, 1, 0, 1, 2, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1 };
698 for(
int i = 0; i < 12; ++i )
700 EntityHandle hex1_conn[] = { vertices[6], vertices[7], vertices[1], vertices[0],
701 vertices[9], vertices[10], vertices[4], vertices[3] };
702 EntityHandle hex2_conn[] = { vertices[7], vertices[8], vertices[2], vertices[1],
703 vertices[10], vertices[11], vertices[5], vertices[4] };
704 EntityHandle shared_quad_conn[] = { vertices[7], vertices[1], vertices[4], vertices[10] };
705 EntityHandle hex1_face_conn[][4] = { { vertices[6], vertices[7], vertices[10], vertices[9] },
706 { vertices[7], vertices[6], vertices[0], vertices[1] },
707 { vertices[1], vertices[0], vertices[3], vertices[4] },
708 { vertices[9], vertices[10], vertices[4], vertices[3] },
709 { vertices[3], vertices[0], vertices[6], vertices[9] } };
710 EntityHandle hex2_face_conn[][4] = { { vertices[7], vertices[8], vertices[11], vertices[10] },
711 { vertices[8], vertices[7], vertices[1], vertices[2] },
712 { vertices[2], vertices[1], vertices[4], vertices[5] },
713 { vertices[10], vertices[11], vertices[5], vertices[4] },
714 { vertices[5], vertices[2], vertices[8], vertices[11] } };
715 EntityHandle shared_edge_conn[][2] = { { vertices[1], vertices[7] },
716 { vertices[7], vertices[10] },
717 { vertices[10], vertices[4] },
718 { vertices[4], vertices[1] } };
719 EntityHandle hex1_edge_conn[][2] = { { vertices[6], vertices[7] }, { vertices[9], vertices[10] },
720 { vertices[3], vertices[4] }, { vertices[0], vertices[1] },
721 { vertices[6], vertices[9] }, { vertices[9], vertices[3] },
722 { vertices[3], vertices[0] }, { vertices[0], vertices[6] } };
723 EntityHandle hex2_edge_conn[][2] = { { vertices[7], vertices[8] }, { vertices[10], vertices[11] },
724 { vertices[4], vertices[5] }, { vertices[1], vertices[2] },
725 { vertices[8], vertices[11] }, { vertices[11], vertices[5] },
726 { vertices[5], vertices[2] }, { vertices[2], vertices[8] } };
733 hex2_faces[0] = hex1_faces[0];
734 for(
int i = 0; i < 5; ++i )
741 for(
int i = 0; i < 4; ++i )
745 hex2_edges[i] = hex1_edges[i];
747 for(
int i = 0; i < 8; ++i )
764 EntityHandle vertices[12], hexes[2], hex1_faces[6], hex2_faces[6], hex1_edges[12], hex2_edges[12];
770 std::vector< EntityHandle > hex1_ent, hex2_ent, shared;
792 for(
int i = 0; i < n; ++i )
794 if( std::find( list2, list2 + n, list1[i] ) - list2 == n )
795 hex1_ent.push_back( list1[i] );
797 shared.push_back( list1[i] );
798 if( std::find( list1, list1 + n, list2[i] ) - list1 == n ) hex2_ent.push_back( list2[i] );
801 for(
size_t j = 0; j < shared.size(); ++j )
803 std::vector< EntityHandle > adj;
805 if( adj.size() != 2 )
807 std::cout <<
"Expected 2 hexes adjacent to " <<
dim <<
"D entity " << j <<
". Got " << adj.size()
808 <<
" hexes." << std::endl;
811 if( !( adj[0] == hexes[0] && adj[1] == hexes[1] ) && !( adj[0] == hexes[1] && adj[1] == hexes[0] ) )
813 std::cout <<
"Got incorrect hexes adjacent to " <<
dim <<
"D entity " << j << std::endl;
818 for(
size_t j = 0; j < hex1_ent.size(); ++j )
820 std::vector< EntityHandle > adj;
822 CHECK( adj.size() == 1 && adj[0] == hexes[0] );
825 for(
size_t j = 0; j < hex2_ent.size(); ++j )
827 std::vector< EntityHandle > adj;
829 CHECK( adj.size() == 1 && adj[0] == hexes[1] );
836 std::vector< EntityHandle > all_edges( 24 );
837 std::copy( hex1_edges, hex1_edges + 12, all_edges.begin() );
838 std::copy( hex2_edges, hex2_edges + 12, all_edges.begin() + 12 );
839 std::sort( all_edges.begin(), all_edges.end() );
840 all_edges.erase( std::unique( all_edges.begin(), all_edges.end() ), all_edges.end() );
841 for(
size_t j = 0; j < all_edges.size(); ++j )
843 std::vector< EntityHandle > edge_hexes, edge_faces, face_hexes;
847 if( edge_hexes.size() != face_hexes.size() )
849 std::cout <<
"Inconsistent adjacency data for edge " << j <<
". edge->face->hex resulted in "
850 << face_hexes.size() <<
"hexes while edge->hex resulted in " << edge_hexes.size() << std::endl;
853 switch( edge_hexes.size() )
856 CHECK( edge_hexes[0] == face_hexes[0] );
859 CHECK( ( edge_hexes[0] == face_hexes[0] && edge_hexes[1] == face_hexes[1] ) ||
860 ( edge_hexes[0] == face_hexes[1] && edge_hexes[1] == face_hexes[0] ) );
863 std::cout <<
"Got " << edge_hexes.size() <<
" hexes adjacent to edge " << j << std::endl;
877 const double coords[][3] = { { -0.5, -0.5, 0.5 }, { -0.5, -0.5, -0.5 }, { -0.5, 0.5, -0.5 }, { -0.5, 0.5, 0.5 },
878 { 0.5, -0.5, 0.5 }, { 0.5, -0.5, -0.5 }, { 0.5, 0.5, -0.5 }, { 0.5, 0.5, 0.5 } };
880 for(
int i = 0; i < 8; ++i )
885 const EntityHandle hconn[8] = { verts[0], verts[1], verts[2], verts[3], verts[4], verts[5], verts[6], verts[7] };
889 std::vector< EntityHandle > quads;
895 { verts[0], verts[1], verts[5], verts[4] }, { verts[1], verts[2], verts[6], verts[5] },
896 { verts[2], verts[3], verts[7], verts[6] }, { verts[3], verts[0], verts[4], verts[7] },
897 { verts[3], verts[2], verts[1], verts[0] }, { verts[4], verts[5], verts[6], verts[7] } };
898 for(
int i = 0; i < 6; ++i )
901 std::vector< EntityHandle > exp_sorted( 4 );
902 std::copy( faces[i], faces[i] + 4, exp_sorted.begin() );
903 std::sort( exp_sorted.begin(), exp_sorted.end() );
906 std::vector< EntityHandle > conn;
912 std::vector< EntityHandle > sorted( conn );
913 std::sort( sorted.begin(), sorted.end() );
914 if( sorted == exp_sorted )
break;
918 std::cerr <<
"No adjacent face matching hex face " << i << std::endl;
922 int k = std::find( conn.begin(), conn.end(), faces[i][0] ) - conn.begin();
923 for( j = 1; j < 4; ++j )
924 if( faces[i][j] != conn[( j + k ) % 4] )
break;
927 std::cerr <<
"Incorrect vertex order for hex face " << i << std::endl;
928 std::cerr <<
"Expected: " << faces[i][0] <<
", " << faces[i][1] <<
", " << faces[i][2] <<
", "
929 << faces[i][3] << std::endl;
930 std::cerr <<
"Actual: " << conn[0] <<
", " << conn[1] <<
", " << conn[2] <<
", " << conn[3] << std::endl;
942 iter = range.
begin();
943 end_iter = range.
end();
945 for( ; iter != end_iter; ++iter )
957 int entity_sets_size;
959 if(
MB_SUCCESS != result || entity_sets_size != num_sets )
return MB_FAILURE;
972 std::vector< EntityHandle > temp_vector;
977 unsigned int num_dim_array[4] = { 0, 0, 0, 0 };
978 int count, start_num_sets;
994 if( (
unsigned)count != temp_range.
size() )
return MB_FAILURE;
995 result = MB->
add_entities( ms_array[ent_type], temp_range );
998 number_array[ent_type] = temp_range.
size();
999 num_dim_array[CN::Dimension( ent_type )] += count;
1003 temp_vector.clear();
1006 if( number_array[ent_type] != temp_range.
size() )
1008 cout <<
"Number of entities in meshset test is not correct" << endl;
1011 if( !temp_range.
all_of_type( ent_type ) )
return MB_FAILURE;
1015 if( number_array[ent_type] != temp_vector.size() )
1017 cout <<
"Number of entities in meshset test is not correct" << endl;
1024 if( number_array[ent_type] != temp_range.
size() )
1026 cout <<
"Number of entities by type in meshset test is not correct" << endl;
1029 if( !temp_range.
all_of_type( ent_type ) )
return MB_FAILURE;
1034 if( 0 != temp_range.
size() )
return MB_FAILURE;
1039 if( number_array[ent_type] != temp_range.
size() )
1041 cout <<
"Number of entities by dimension in meshset test is not correct" << endl;
1044 if( !temp_range.
all_of_type( ent_type ) )
return MB_FAILURE;
1049 if( 0 != temp_range.
size() )
1051 cout <<
"Number of entities by dimension in meshset test is not correct" << endl;
1057 if( (
unsigned)count != number_array[ent_type] )
return MB_FAILURE;
1061 if( (
unsigned)count != number_array[ent_type] )
return MB_FAILURE;
1065 if( count != 0 )
return MB_FAILURE;
1069 if( (
unsigned)count != number_array[ent_type] )
return MB_FAILURE;
1073 if( count != 0 )
return MB_FAILURE;
1082 if(
MB_SUCCESS != result )
return MB_FAILURE;
1083 if( (
unsigned)count != num_dim_array[
dim] )
return MB_FAILURE;
1095 result = MB->
add_entities( recursive1, &recursive2, 1 );
1101 if( temp_range.
size() != 1 || *( temp_range.
begin() ) != recursive2 )
return MB_FAILURE;
1111 if( temp_range.
size() != 1 || *( temp_range.
begin() ) != recursive2 )
return MB_FAILURE;
1121 total += number_array[ent_type];
1125 if( number_array[ent_type] != temp_range.
size() )
1127 cout <<
"Recursive number of entities by type in meshset test is not correct" << endl;
1130 if( !temp_range.
all_of_type( ent_type ) )
return MB_FAILURE;
1133 if( number_array[ent_type] != (
unsigned)count )
1135 cout <<
"Recursive number of entities by type in meshset test is not correct" << endl;
1138 if( !temp_range.
all_of_type( ent_type ) )
return MB_FAILURE;
1142 cout <<
"Invalid test input. No entities!" << endl;
1150 if(
MB_SUCCESS != result )
return MB_FAILURE;
1151 if( temp_range.
size() != num_dim_array[
dim] )
return MB_FAILURE;
1154 if(
MB_SUCCESS != result )
return MB_FAILURE;
1155 if( (
unsigned)count != num_dim_array[
dim] )
return MB_FAILURE;
1161 if( total != temp_range.
size() )
1163 cout <<
"Recursive number of entities in meshset test is not correct" << endl;
1168 result = MB->
add_entities( recursive2, &recursive1, 1 );
1171 std::cout <<
"Failed to create circular set containment" << std::endl;
1177 if( total != temp_range.
size() )
1179 cout <<
"Recursive number of entities in meshset test is not correct" << endl;
1222 if( number_array[
MBHEX] != temp_range.
size() )
1224 cout <<
"MBset subtraction is bad" << endl;
1266 if( number_array[
MBTET] != temp_range.
size() )
1268 cout <<
"MBset intersection is bad" << endl;
1316 int size1 = 0, size2 = 0;
1325 if( size1 != size2 )
1345 EntityHandle handle_array[] = { 1, 2, 3, 4, 5, 7, 8, 9, 10 };
1346 const int num_handle =
sizeof( handle_array ) /
sizeof( handle_array[0] );
1348 result = MB->
add_entities( temp_ms3, handle_array, num_handle );
1352 result = MB->
add_entities( temp_ms3, handle_array, num_handle );
1359 int num_expected = ( flags &
MESHSET_SET ) ? num_handle : 2 * num_handle;
1360 if( num_ents != num_expected )
return MB_FAILURE;
1367 if( vect.size() != (
size_t)count )
return false;
1368 for(
int i = 0; i < count; ++i )
1372 if( vect[i] != array[i] )
return false;
1374 else if( std::find( vect.begin(), vect.end(), array[i] ) == vect.end() )
1387 std::vector< EntityHandle > list;
1393 const int num_sets = 10;
1395 for(
int i = 0; i < num_sets; ++i )
1409 if( !
compare_lists( list, sets + 1, 1 ) )
return MB_FAILURE;
1416 if( !
compare_lists( list, sets + 1, 1 ) )
return MB_FAILURE;
1424 if( !
compare_lists( list, sets + 1, 2 ) )
return MB_FAILURE;
1431 if( !
compare_lists( list, sets + 1, 2 ) )
return MB_FAILURE;
1439 if( !
compare_lists( list, sets + 1, 3 ) )
return MB_FAILURE;
1446 if( !
compare_lists( list, sets + 1, 3 ) )
return MB_FAILURE;
1454 if( !
compare_lists( list, sets + 1, 4 ) )
return MB_FAILURE;
1457 std::sort( list.begin(), list.end() );
1459 iter = range.
begin();
1460 for(
unsigned i = 0; i < 4; ++i, ++iter )
1461 if( *iter != list[i] )
return MB_FAILURE;
1469 if( !
compare_lists( list, sets + 2, 3 ) )
return MB_FAILURE;
1479 if( !
compare_lists( list, sets + 3, 2 ) )
return MB_FAILURE;
1489 if( list.size() != 1 || list[0] != sets[4] )
return MB_FAILURE;
1496 if( !list.empty() )
return MB_FAILURE;
1506 if( !
compare_lists( list, sets + 1, 1 ) )
return MB_FAILURE;
1513 if( !
compare_lists( list, sets + 1, 1 ) )
return MB_FAILURE;
1521 if( !
compare_lists( list, sets + 1, 2 ) )
return MB_FAILURE;
1528 if( !
compare_lists( list, sets + 1, 2 ) )
return MB_FAILURE;
1536 if( !
compare_lists( list, sets + 1, 3 ) )
return MB_FAILURE;
1543 if( !
compare_lists( list, sets + 1, 3 ) )
return MB_FAILURE;
1551 if( !
compare_lists( list, sets + 1, 4 ) )
return MB_FAILURE;
1554 std::sort( list.begin(), list.end() );
1556 iter = range.
begin();
1557 for(
unsigned i = 0; i < 4; ++i, ++iter )
1558 if( *iter != list[i] )
return MB_FAILURE;
1566 if( !
compare_lists( list, sets + 2, 3 ) )
return MB_FAILURE;
1576 if( !
compare_lists( list, sets + 3, 2 ) )
return MB_FAILURE;
1586 if( list.size() != 1 || list[0] != sets[4] )
return MB_FAILURE;
1593 if( !list.empty() )
return MB_FAILURE;
1628 if( list.size() != 2 || list[0] != sets[1] || list[1] != sets[2] )
return MB_FAILURE;
1631 if( count != 2 )
return MB_FAILURE;
1637 if( !
compare_lists( list, sets + 1, 5,
false ) )
return MB_FAILURE;
1640 if( count != 5 )
return MB_FAILURE;
1646 if( !
compare_lists( list, sets + 1, 7,
false ) )
return MB_FAILURE;
1649 if( count != 7 )
return MB_FAILURE;
1655 if( !
compare_lists( list, sets + 1, 7,
false ) )
return MB_FAILURE;
1658 if( count != 7 )
return MB_FAILURE;
1664 if( !
compare_lists( list, sets + 1, 7,
false ) )
return MB_FAILURE;
1667 if( count != 7 )
return MB_FAILURE;
1690 for(
int i = 0; i < 5; ++i )
1726 if( list.size() != 2 || list[0] != sets[1] || list[1] != sets[2] )
return MB_FAILURE;
1729 if( count != 2 )
return MB_FAILURE;
1735 if( !
compare_lists( list, sets + 1, 5,
false ) )
return MB_FAILURE;
1738 if( count != 5 )
return MB_FAILURE;
1744 if( !
compare_lists( list, sets + 1, 7,
false ) )
return MB_FAILURE;
1747 if( count != 7 )
return MB_FAILURE;
1753 if( !
compare_lists( list, sets + 1, 7,
false ) )
return MB_FAILURE;
1756 if( count != 7 )
return MB_FAILURE;
1762 if( !
compare_lists( list, sets + 1, 7,
false ) )
return MB_FAILURE;
1765 if( count != 7 )
return MB_FAILURE;
1788 for(
int i = 0; i < 5; ++i )
1799 if( list.size() != 1 || list[0] != sets[8] )
return MB_FAILURE;
1803 if( list.size() != 1 || list[0] != sets[9] )
return MB_FAILURE;
1812 if( !list.empty() )
return MB_FAILURE;
1815 if( !list.empty() )
return MB_FAILURE;
1840 Range all_ents, verts, elems, results;
1864 if( results != all_ents )
return MB_FAILURE;
1870 if( results != all_ents )
return MB_FAILURE;
1876 if( results != all_ents )
return MB_FAILURE;
1880 Range expected( elems );
1881 expected.
insert( entity );
1884 const int zero = 0, one = 1;
1885 const void* vals[] = { &one };
1896 if( results != expected )
return MB_FAILURE;
1902 if( results != expected )
return MB_FAILURE;
1914 if( results != expected )
return MB_FAILURE;
1941 std::vector< double > coords( 30 );
1943 std::vector< EntityHandle > verts( r.
size() );
1944 std::copy( r.
begin(), r.
end(), verts.begin() );
1950 for(
size_t i = 0; i < 10; i += 2 )
1955 EntityHandle old_ents[3] = { verts[2], verts[4], verts[6] };
1956 EntityHandle new_ents[3] = { verts[1], verts[9], verts[5] };
1968 std::cerr <<
"Range does not contain expected values." << std::endl
1969 <<
" Expected: " << r2 << std::endl
1970 <<
" Actual : " << r << std::endl;
1984 std::vector< double > coords( 30 );
1986 std::vector< EntityHandle > verts( r.
size() );
1987 std::copy( r.
begin(), r.
end(), verts.begin() );
1993 std::vector< EntityHandle > list( verts );
1994 list.push_back( verts.front() );
1997 EntityHandle old_ents[3] = { verts[2], verts[4], verts[6] };
1998 EntityHandle new_ents[3] = { verts[1], verts[9], verts[5] };
2001 std::vector< EntityHandle > list2;
2008 std::cerr <<
"Range does not contain expected values." << std::endl;
2009 std::cerr <<
" Expected: ";
2010 std::copy( list.begin(), list.end(), std::ostream_iterator< EntityHandle >( std::cerr,
" " ) );
2011 std::cerr << std::endl <<
" Actual : ";
2012 std::copy( list2.begin(), list2.end(), std::ostream_iterator< EntityHandle >( std::cerr,
" " ) );
2013 std::cerr << std::endl;
2018 list[0] = list[10] = verts[3];
2023 std::cerr <<
"Range does not contain expected values." << std::endl;
2024 std::cerr <<
" Expected: ";
2025 std::copy( list.begin(), list.end(), std::ostream_iterator< EntityHandle >( std::cerr,
" " ) );
2026 std::cerr << std::endl <<
" Actual : ";
2027 std::copy( list2.begin(), list2.end(), std::ostream_iterator< EntityHandle >( std::cerr,
" " ) );
2028 std::cerr << std::endl;
2049 std::vector< double > coords( 30 );
2060 if( !adj_sets.
empty() )
2062 std::cerr <<
"range should be empty but contains:" << std::endl;
2071 std::cerr <<
"set should be MESHSET_SET only, flags=" << flags << std::endl;
2079 std::cerr <<
"set should be MESHSET_TRACK_OWNER only, flags=" << flags << std::endl;
2084 if( 1 != adj_sets.
size() )
2086 std::cerr <<
"range should contain a set, adj_sets.size()=" << adj_sets.
size() << std::endl;
2097 std::cerr <<
"set should be MESHSET_SET only, flags=" << flags << std::endl;
2103 if( !adj_sets.
empty() )
2105 std::cerr <<
"range should be empty but contains:" << std::endl;
2113 std::vector< EntityHandle >
entities;
2117 std::cerr <<
"set should not hold duplicate entities" << std::endl;
2125 std::cerr <<
"set should be MESHSET_ORDERED only, flags=" << flags << std::endl;
2140 std::cerr <<
"ordered set did not keep its order" << std::endl;
2150 std::cerr <<
"set should be MESHSET_SET only, flags=" << flags << std::endl;
2158 std::cerr <<
"unordered set is still ordered" << std::endl;
2164 #ifdef MOAB_HAVE_NETCDF
2168 const int num_types =
sizeof( types ) /
sizeof( types[0] );
2169 static const unsigned int num_entities[num_types + 1] = { 47, 12, 18, 8, 22, 8, 0 };
2194 size_t idx = std::find( types, types + num_types, type ) - types;
2195 if(
entities.size() != num_entities[idx] )
return MB_FAILURE;
2237 std::vector< EntityHandle > tets( temp_range.
size() );
2238 std::copy( temp_range.
begin(), temp_range.
end(), tets.begin() );
2246 if( hexes.
size() + tets.size() != dim_3_range.
size() )
return MB_FAILURE;
2272 iter = tris.
begin();
2274 std::vector< EntityHandle > temp_vec;
2281 if( temp_vec.size() != 2 )
return MB_FAILURE;
2285 std::vector< EntityHandle >::iterator vec_iter = tets.begin();
2286 result = MB->
get_adjacencies( &( *vec_iter ), 1, 4,
false, temp_vec );
2290 if( temp_vec.size() != 3 )
return MB_FAILURE;
2294 iter = hexes.
begin();
2299 if( temp_vec.size() != 4 )
return MB_FAILURE;
2309 temp_range.
insert( *iter );
2317 if( temp_vec.size() != 1 )
return MB_FAILURE;
2327 if( temp_vec.size() != 2 )
return MB_FAILURE;
2330 temp_range.
insert( *iter );
2338 if( temp_vec.size() != 1 )
return MB_FAILURE;
2342 iter = tris.
begin();
2348 if( temp_vec.size() != 2 )
return MB_FAILURE;
2359 if( temp_vec.size() != 1 )
return MB_FAILURE;
2364 vec_iter = tets.begin();
2370 if( num_before != num_after + 1 )
return MB_FAILURE;
2385 for(
int i = 0; i < std::min( num_expected,
length ); ++i )
2387 if( expected[i] != contents[i] )
2389 std::cerr <<
"List set contents differ at index " << i <<
": expected " << expected[i] <<
" but got "
2390 << contents[i] << std::endl;
2394 if( num_expected >
length )
2396 std::cerr <<
"List set is missing " << num_expected -
length <<
"handles" << std::endl;
2399 else if(
length > num_expected )
2401 std::cerr <<
"List set has " << num_expected -
length <<
" extra handles" << std::endl;
2407 std::cerr <<
"Expected contents: ";
2409 std::cerr <<
"(empty)";
2411 std::cerr << expected[0];
2412 for(
int i = 1; i < num_expected; ++i )
2413 std::cerr <<
", " << expected[i];
2414 std::cerr << std::endl;
2416 std::cerr <<
"Actual contents: ";
2418 std::cerr <<
"(empty)";
2420 std::cerr << contents[0];
2421 for(
int i = 1; i <
length; ++i )
2422 std::cerr <<
", " << contents[i];
2423 std::cerr << std::endl;
2438 std::cerr <<
"Range set is corrupt. Odd number of handles in content list" << std::endl;
2439 std::cerr <<
"Actual contents: " << contents[0];
2440 for(
int i = 1; i <
length; ++i )
2441 std::cerr <<
", " << contents[i];
2442 std::cerr << std::endl;
2448 for(
int i = 0; i <
length; i += 2 )
2450 if( contents[i] > contents[i + 1] )
2452 std::cerr <<
"Range set has invalid range pair at index " << i <<
": [" << contents[i] <<
','
2453 << contents[i + 1] <<
']' << std::endl;
2459 for(
int i = 2; i <
length; i += 2 )
2461 if( contents[i] < contents[i - 1] )
2463 std::cerr <<
"Range set has incorrectly ordered ranges at index " << i <<
": [...," << contents[i - 1]
2464 <<
"], [" << contents[i] <<
",...]" << std::endl;
2467 if( contents[i] == contents[i - 1] + 1 )
2469 std::cerr <<
"Range set has pairs that should have been merged at index " << i <<
": [...,"
2470 << contents[i - 1] <<
"], [" << contents[i] <<
",...]" << std::endl;
2476 std::cerr <<
"Actual contents: ";
2478 std::cerr <<
"(empty)";
2480 std::cerr <<
'[' << contents[0] <<
',' << contents[1] <<
']';
2481 for(
int i = 2; i <
length; i += 2 )
2482 std::cerr <<
", [" << contents[i] <<
',' << contents[i + 1] <<
']';
2483 std::cerr << std::endl;
2488 for(
int i = 0; i <
length; i += 2 )
2490 for( ; j < num_expected && expected[j] < contents[i]; ++j )
2492 std::cerr <<
"Range set missing expected handle: " << expected[j] << std::endl;
2496 while( k < num_expected && expected[k] <= contents[i + 1] )
2498 if( (
EntityHandle)( k - j ) <= ( contents[i + 1] - contents[i] ) )
2500 std::cerr <<
"Handle range [" << contents[i] <<
',' << contents[i + 1]
2501 <<
"] contains unexpected handles. Expected handles: ";
2503 std::cerr <<
"(none)" << std::endl;
2506 std::cerr << expected[j];
2507 for( ++j; j < k; ++j )
2508 std::cerr <<
", " << expected[j];
2509 std::cerr << std::endl;
2518 std::cerr <<
"Expected contents: ";
2520 std::cerr <<
"(empty)";
2522 std::cerr << expected[0];
2523 for(
int i = 1; i < num_expected; ++i )
2524 std::cerr <<
", " << expected[i];
2525 std::cerr << std::endl;
2527 std::cerr <<
"Actual contents: ";
2529 std::cerr <<
"(empty)";
2531 std::cerr <<
'[' << contents[0] <<
',' << contents[1] <<
']';
2532 for(
int i = 2; i <
length; i += 2 )
2533 std::cerr <<
", [" << contents[i] <<
',' << contents[i + 1] <<
']';
2534 std::cerr << std::endl;
2552 unsigned char flags;
2556 if( flags & MESHSET_ORDERED )
2571 size_t len1 =
sizeof( list1 ) /
sizeof( list1[0] );
2572 EntityHandle list2[] = { 10, 16, 17, 18, 19, 20, 24, 27 };
2573 size_t len2 =
sizeof( list2 ) /
sizeof( list2[0] );
2577 EntityHandle exp12[] = { 10, 16, 17, 18, 19, 20, 24, 27 };
2578 size_t len12 =
sizeof( exp12 ) /
sizeof( exp12[0] );
2582 size_t len3 =
sizeof( list3 ) /
sizeof( list3[0] );
2585 size_t len123 =
sizeof( exp123 ) /
sizeof( exp123[0] );
2588 EntityHandle list4[] = { 18, 10, 11, 12, 13, 14, 15, 16 };
2589 size_t len4 =
sizeof( list4 ) /
sizeof( list4[0] );
2591 EntityHandle exp14[] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 27 };
2592 size_t len14 =
sizeof( exp14 ) /
sizeof( exp14[0] );
2595 EntityHandle list5[] = { 9, 10, 12, 13, 14, 15, 19, 20 };
2602 EntityHandle exp6[] = { 9, 10, 11, 15, 16, 17, 18, 19, 27, 28 };
2607 EntityHandle exp7[] = { 9, 10, 11, 13, 15, 16, 17, 18, 19, 27, 28 };
2612 EntityHandle exp8[] = { 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 27, 28, 33 };
2619 EntityHandle list10[] = { 9, 11, 13, 17, 18, 19, 28, 33, 100 };
2641 double nodes_array[7][3];
2643 nodes_array[0][0] = 0;
2644 nodes_array[0][1] = 0;
2645 nodes_array[0][2] = 0;
2646 nodes_array[1][0] = 2;
2647 nodes_array[1][1] = 0;
2648 nodes_array[1][2] = 0;
2649 nodes_array[2][0] = 1;
2650 nodes_array[2][1] = 2;
2651 nodes_array[2][2] = 1;
2652 nodes_array[3][0] = 1;
2653 nodes_array[3][1] = 0;
2654 nodes_array[3][2] = 0;
2655 nodes_array[4][0] = 1.5;
2656 nodes_array[4][1] = 0.5;
2657 nodes_array[4][2] = 0.5;
2658 nodes_array[5][0] = 0.5;
2659 nodes_array[5][1] = 0.5;
2660 nodes_array[5][2] = 0.5;
2661 nodes_array[6][0] = 1;
2662 nodes_array[6][1] = 1;
2663 nodes_array[6][2] = 0.5;
2666 std::vector< EntityHandle > connectivity( 8 );
2669 for( i = 0; i < 7; i++ )
2672 connectivity[i] = node_handle;
2681 std::vector< EntityHandle > other_conn( 3 );
2683 double other_nodes[3][3];
2684 other_nodes[0][0] = 1.999;
2685 other_nodes[0][1] = 1.999;
2686 other_nodes[0][2] = 1.999;
2687 other_nodes[1][0] = 2.999;
2688 other_nodes[1][1] = 2.999;
2689 other_nodes[1][2] = 2.999;
2690 other_nodes[2][0] = 3.999;
2691 other_nodes[2][1] = 3.999;
2692 other_nodes[2][2] = 3.999;
2694 for( i = 0; i < 3; i++ )
2697 other_conn[i] = node_handle;
2705 std::vector< EntityHandle > retrieved_conn;
2711 for( k = 0; k < retrieved_conn.size(); k++ )
2712 if( connectivity[k] != retrieved_conn[k] )
return MB_FAILURE;
2717 for( k = 0; k < other_conn.size(); k++ )
2718 if( other_conn[k] != retrieved_conn[k] )
return MB_FAILURE;
2721 std::vector< EntityHandle > topo_conn;
2725 if( topo_conn.size() != 3 )
return MB_FAILURE;
2727 for( k = 0; k < 3; k++ )
2728 if( topo_conn[k] != retrieved_conn[k] )
return MB_FAILURE;
2737 if( test_handle != node_handle )
return MB_FAILURE;
2744 if( test_handle != tri_handle )
return MB_FAILURE;
2771 cout <<
"couldn't create bit tag" << endl;
2780 bits = ( ( *iter ) & 0x7 );
2781 success = MB->
tag_set_data( bit_tag, &( *iter ), 1, &bits );
2782 if( success !=
MB_SUCCESS )
return MB_FAILURE;
2789 success = MB->
tag_get_data( bit_tag, &( *iter ), 1, &bits );
2790 if( success !=
MB_SUCCESS )
return MB_FAILURE;
2792 if( bits != ( ( *iter ) & 0x7 ) )
return MB_FAILURE;
2796 std::vector< unsigned char > data(
entities.size() );
2799 std::vector< unsigned char >::iterator i = data.begin();
2801 if( *i != ( ( *iter ) & 0x7 ) )
return MB_FAILURE;
2805 success = MB->
tag_get_data( bit_tag, &verts[0], verts.size(), &data[0] );
2809 if( *i != ( ( *iter ) & 0x7 ) )
return MB_FAILURE;
2812 const unsigned char default_bits =
'\005';
2817 cout <<
"Failed to create bit tag with default value" << std::endl;
2829 data.resize( verts.size(), 0x7A );
2836 if( *iter == zh && *i )
2838 else if( *iter != zh && *i != default_bits )
2844 #ifdef MOAB_HAVE_NETCDF
2852 Tag stale_bits, stale_dense, stale_sparse;
2863 double coords[3] = { 0, 0, 0 };
2868 unsigned char bits = 0x5;
2869 result = MB->
tag_set_data( stale_bits, &stale_handle1, 1, &bits );
2872 result = MB->
tag_get_data( stale_bits, &stale_handle1, 1, &bits );
2874 if( bits != 0x5 )
return MB_FAILURE;
2877 result = MB->
tag_set_data( stale_dense, &stale_handle1, 1, &def_data );
2880 result = MB->
tag_get_data( stale_dense, &stale_handle1, 1, &def_data );
2882 if( def_data != 1 )
return MB_FAILURE;
2885 result = MB->
tag_set_data( stale_sparse, &stale_handle1, 1, &def_data );
2888 result = MB->
tag_get_data( stale_sparse, &stale_handle1, 1, &def_data );
2890 if( def_data != 100 )
return MB_FAILURE;
2897 if( stale_handle1 != stale_handle2 )
2898 cout <<
"Tag test could test stale data" << endl;
2902 result = MB->
tag_get_data( stale_bits, &stale_handle2, 1, &bits );
2904 if( bits != 0 )
return MB_FAILURE;
2907 result = MB->
tag_get_data( stale_dense, &stale_handle2, 1, &def_data );
2909 if( def_data != 9 )
return MB_FAILURE;
2926 const void* dum_ptr = &value;
2933 if(
entities.size() != 1 )
return MB_FAILURE;
2946 iter = test_range.
begin();
2947 end_iter = test_range.
end();
2950 const void* ptr_data = &data;
2953 unsigned int times = test_range.
size() / 5;
2955 const void* ptr_bits = &bits;
2957 for(
unsigned int i = 0; i < times; i++ )
3014 if( !
entities.empty() )
return MB_FAILURE;
3030 sprintf(
tagname,
"t%d", rand() );
3039 if(
entities.empty() )
return MB_FAILURE;
3064 if( val != *i )
return MB_FAILURE;
3068 if( val != def_val )
return MB_FAILURE;
3073 std::vector< EntityHandle > values(
entities.size() );
3084 if( val != *i )
return MB_FAILURE;
3092 const void*
const tag_vals[] = { &h };
3096 if( range.
size() != 1 )
return MB_FAILURE;
3097 if( range.
front() != h )
return MB_FAILURE;
3132 mCoords[0] += mOffset[0];
3133 mCoords[1] += mOffset[1];
3134 mCoords[2] += mOffset[2];
3146 #ifdef MOAB_HAVE_NETCDF
3154 std::string file_name = TestDir +
"unittest/mbtest3.g";
3170 file_name =
"hex_mid_volume_nodes.g";
3183 file_name = TestDir +
"unittest/mbtest3.g";
3195 file_name =
"hex_mid_edge_face_vol_nodes.g";
3208 file_name = TestDir +
"unittest/mbtest3.g";
3214 unsigned int original_num_nodes =
entities.size();
3223 file_name =
"hex_mid_edge_nodes.g";
3234 if(
entities.size() != original_num_nodes )
return MB_FAILURE;
3245 file_name = TestDir +
"unittest/mbtest1.g";
3257 file_name =
"tet_mid_edge_nodes.g";
3270 file_name = TestDir +
"unittest/mbtest1.g";
3282 file_name =
"tet_mid_face_nodes.g";
3295 file_name = TestDir +
"unittest/mbtest1.g";
3307 file_name =
"tet_mid_edge_face_nodes.g";
3320 file_name = TestDir +
"unittest/mbtest1.g";
3338 std::vector< EntityHandle > adj;
3341 for( std::vector< EntityHandle >::iterator tri_iter = adj.begin(); tri_iter != adj.end(); ++tri_iter )
3343 std::vector< EntityHandle > up_adj;
3345 if( up_adj.size() > 1 )
3359 MB->
tag_set_data( material_tag, &export_meshset, 1, &block_id );
3380 std::vector< EntityHandle > conn( 3 );
3384 if( conn.size() != 3 )
return MB_FAILURE;
3388 file_name =
"tri_mid_edge_face_nodes.g";
3404 if(
entities.size() != 101 )
return MB_FAILURE;
3437 double node_coord1[3] = { 0., 0., 0. };
3438 double node_coord2[3] = { 1., 0., 0. };
3439 double node_coord3[3] = { 2., 0., 0. };
3440 double node_coord4[3] = { 0., 1., 0. };
3441 double node_coord5[3] = { 1., 1., 0. };
3442 double node_coord6[3] = { 2., 1., 0. };
3463 std::vector< EntityHandle > conn( 4 );
3533 if( edge4 == edge5 )
return MB_FAILURE;
3536 std::vector< EntityHandle > edge_adjacencies1( 4 );
3537 edge_adjacencies1[0] = edge1;
3538 edge_adjacencies1[1] = edge4;
3539 edge_adjacencies1[2] = edge7;
3540 edge_adjacencies1[3] = edge3;
3548 std::vector< EntityHandle > edge_adjacencies2( 4 );
3549 edge_adjacencies2[0] = edge2;
3550 edge_adjacencies2[1] = edge6;
3551 edge_adjacencies2[2] = edge8;
3552 edge_adjacencies2[3] = edge5;
3557 std::vector< EntityHandle > quad1_adjacencies;
3561 std::sort( quad1_adjacencies.begin(), quad1_adjacencies.end() );
3562 std::sort( edge_adjacencies1.begin(), edge_adjacencies1.end() );
3564 if( quad1_adjacencies != edge_adjacencies1 )
return MB_FAILURE;
3566 std::vector< EntityHandle > quad2_adjacencies;
3570 std::sort( quad2_adjacencies.begin(), quad2_adjacencies.end() );
3571 std::sort( edge_adjacencies2.begin(), edge_adjacencies2.end() );
3573 if( quad2_adjacencies != edge_adjacencies2 )
return MB_FAILURE;
3576 std::vector< EntityHandle > edge1_adjacencies;
3581 if( edge1_adjacencies.size() != 1 )
return MB_FAILURE;
3584 if( edge1_adjacencies[0] != quad1 )
return MB_FAILURE;
3587 std::vector< EntityHandle > edge6_adjacencies;
3592 if( edge6_adjacencies.size() != 1 )
return MB_FAILURE;
3597 std::vector< EntityHandle > edge5_adjacencies( 1, edge5 );
3601 std::vector< EntityHandle > edge4_adjacencies( 1, edge4 );
3606 std::vector< EntityHandle > quad_adjacencies;
3611 if( quad_adjacencies.size() != 2 )
return MB_FAILURE;
3615 if( ( quad_adjacencies[0] != quad1 || quad_adjacencies[1] != quad2 ) &&
3616 ( quad_adjacencies[0] != quad2 || quad_adjacencies[1] != quad1 ) )
3646 diff[2] =
first[2] - second[2];
3649 diff[0] =
first[0] - second[0];
3650 diff[1] =
first[1] - second[1];
3652 double length = diff[0] * diff[0] + diff[1] * diff[1] + diff[2] * diff[2];
3653 if( fabs(
length ) < .001 )
return true;
3658 const Range& vertices,
3659 std::vector< std::pair< EntityHandle, EntityHandle > >& coin_nodes )
3661 double first_coords[3], second_coords[3];
3663 std::pair< EntityHandle, EntityHandle > coincident_pair;
3666 for( iter = vertices.
begin(); iter != vertices.
end(); ++iter )
3671 for( jter = iter; jter != vertices.
end(); ++jter )
3673 if( *iter != *jter )
3680 coincident_pair.first = *iter;
3681 coincident_pair.second = *jter;
3682 coin_nodes.push_back( coincident_pair );
3693 std::vector< std::pair< EntityHandle, EntityHandle > >& coin )
3695 double coords1[8][3], coords2[8][3];
3697 std::vector< EntityHandle > conn( 8 );
3698 std::pair< EntityHandle, EntityHandle > coincident_pair;
3705 for( ii = 0; ii < num_nodes; ii++ )
3710 for( jter = iter; jter !=
entities.end(); ++jter )
3712 if( *iter != *jter )
3717 for(
int tq = 0; tq < num_nodes; tq++ )
3724 for( i = 0; i < num_nodes; i++ )
3742 bool second =
false;
3743 for(
int t2 = 0; t2 < num_nodes; t2++ )
3762 for(
int ti = 0; ti < num_nodes; ti++ )
3779 if( (
first ) && ( second ) && ( third ) )
3781 cout <<
"i = " << i <<
"\n";
3782 for(
int tii = 0; tii < num_nodes; tii++ )
3784 cout <<
" coords1[" << tii <<
"] = (" << coords1[tii][0] <<
"," << coords1[tii][1] <<
","
3785 << coords1[tii][2] <<
") ";
3786 cout <<
" coords2[" << tii <<
"] = (" << coords2[tii][0] <<
"," << coords2[tii][1] <<
","
3787 << coords2[tii][2] <<
")\n";
3793 for( ii = 1; ii < num_nodes; ii++ )
3805 if( (
first ) && ( second ) && ( third ) )
3807 coincident_pair.first = *iter;
3808 coincident_pair.second = *jter;
3809 coin.push_back( coincident_pair );
3819 #ifdef MOAB_HAVE_NETCDF
3825 time_t begin_time = clock();
3830 std::string test_files[] = { std::string(
"cell1.gen" ), std::string(
"cell2.gen" ) };
3859 Range forward_lower;
3860 Range reverse_lower;
3864 cout <<
"---Starting Merge Tests---" << endl << endl;
3865 for( i = 0; i < (
sizeof( test_files ) /
sizeof( std::string ) ); i++ )
3868 cout <<
"---Testing:\"" << test_files[i] <<
"\"---" << endl;
3869 result = MB->
load_mesh( test_files[i].c_str(), NULL, 0 );
3870 if( result ==
MB_SUCCESS ) cout <<
"Loaded " << test_files[i] <<
"\n";
3875 Skinner_Obj.find_skin( 0,
entities,
false, forward_lower, &reverse_lower );
3888 std::vector< std::pair< EntityHandle, EntityHandle > > coin_nodes;
3893 cout <<
"coin_nodes.size() = " << coin_nodes.size() <<
"\n";
3894 std::vector< std::pair< EntityHandle, EntityHandle > >::iterator n_iter;
3895 for( n_iter = coin_nodes.begin(); n_iter != coin_nodes.end(); ++n_iter )
3897 result = MB->
merge_entities( ( *n_iter ).first, ( *n_iter ).second,
false,
true );
3920 double clocks_per_sec = (double)CLOCKS_PER_SEC;
3921 double real_time = difftime( time( NULL ), begin_time );
3922 cout <<
"TIME: " << ( real_time / clocks_per_sec ) <<
" seconds.\n";
3934 double coords[] = { 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 2, 0, 0, 2, 1, 0 };
3936 for(
int i = 0; i < 8; ++i )
3958 std::cerr <<
"Merge failed at " << __FILE__ <<
":" << __LINE__ << std::endl;
3964 std::cerr <<
"Merge failed at " << __FILE__ <<
":" << __LINE__ << std::endl;
3970 std::cerr <<
"Merge failed at " << __FILE__ <<
":" << __LINE__ << std::endl;
3977 if( r.
size() != 1 || r.
front() != edge1 )
3979 std::cerr <<
"Edge merge failed at " << __FILE__ <<
":" << __LINE__ << std::endl;
3982 std::vector< EntityHandle > exp( verts + 1, verts + 3 ), act;
3986 std::cerr <<
"Incorrect conn for edge at " << __FILE__ <<
":" << __LINE__ << std::endl;
3991 exp = std::vector< EntityHandle >( verts, verts + 4 );
3996 std::cerr <<
"Incorrect conn for quad at " << __FILE__ <<
":" << __LINE__ << std::endl;
4008 std::cerr <<
"Incorrect conn for quad at " << __FILE__ <<
":" << __LINE__ << std::endl;
4013 exp = std::vector< EntityHandle >( verts, verts + 4 );
4014 exp.push_back( edge1 );
4017 std::sort( exp.begin(), exp.end() );
4018 std::sort( act.begin(), act.end() );
4021 std::cerr <<
"Incorrect set contents at " << __FILE__ <<
":" << __LINE__ << std::endl;
4022 std::cerr <<
" Expected: ";
4023 std::copy( exp.begin(), exp.end(), std::ostream_iterator< EntityHandle >( std::cerr,
" " ) );
4024 std::cerr << std::endl <<
" Actual : ";
4025 std::copy( act.begin(), act.end(), std::ostream_iterator< EntityHandle >( std::cerr,
" " ) );
4026 std::cerr << std::endl;
4040 std::cerr <<
"Incorrect set contents at " << __FILE__ <<
":" << __LINE__ << std::endl;
4041 std::cerr <<
" Expected: ";
4042 std::copy( exp.begin(), exp.end(), std::ostream_iterator< EntityHandle >( std::cerr,
" " ) );
4043 std::cerr << std::endl <<
" Actual : ";
4044 std::copy( act.begin(), act.end(), std::ostream_iterator< EntityHandle >( std::cerr,
" " ) );
4045 std::cerr << std::endl;
4051 #ifdef MOAB_HAVE_NETCDF
4058 cout <<
" Beginning Stress Test . . ." << endl;
4059 cout <<
"\n Reading elements" << endl;
4060 clock_t start = clock();
4061 clock_t total_start = clock();
4064 std::string file_name =
"mb_big_test.g";
4068 clock_t stop = clock();
4070 int num_entities_local;
4074 if( num_entities_local != 256000 )
return error;
4076 float time =
static_cast< float >( stop - start ) / CLOCKS_PER_SEC;
4077 float speed = num_entities_local / time;
4078 cout <<
" Read " << num_entities_local <<
" entities"
4079 <<
" in " << time <<
" seconds" << endl;
4080 cout <<
" at " << speed <<
" elements per second." << endl;
4082 cout <<
"\n Transforming and copying elements" << endl;
4089 std::vector< EntityHandle > conn;
4091 for( iter = hexes.
begin(); iter != hexes.
end(); ++iter )
4098 std::vector< EntityHandle > vertex_handle( 8 );
4100 std::vector< EntityHandle >::iterator jter;
4102 for( jter = conn.begin(); jter != conn.end(); ++jter )
4115 time =
static_cast< float >( stop - start ) / CLOCKS_PER_SEC;
4117 cout <<
" Transformed and created " << num_entities_local <<
" entities"
4118 <<
" in " << time <<
" seconds" << endl;
4121 cout <<
"\n Creating meshset" << endl;
4126 if( hexes.
size() != 512000 )
return MB_FAILURE;
4136 time =
static_cast< float >( stop - start ) / CLOCKS_PER_SEC;
4138 cout <<
" Created meshset with " << hexes.
size() <<
" entities"
4139 <<
" in " << time <<
" seconds" << endl;
4141 cout <<
"\n Writing 512K element file . . ." << endl;
4153 std::vector< EntityHandle > output_list;
4156 file_name =
"mb_stress_out.g";
4157 error = MB->
write_mesh( file_name.c_str(), &output_list[0], output_list.size() );
4161 time =
static_cast< float >( stop - start ) / CLOCKS_PER_SEC;
4163 cout <<
" Wrote file with " << hexes.
size() <<
" entities"
4164 <<
" in " << time <<
" seconds" << endl;
4166 clock_t total_stop = clock();
4167 time =
static_cast< float >( total_stop - total_start ) / CLOCKS_PER_SEC;
4169 cout <<
" Total time: " << time <<
" seconds." << endl;
4185 std::vector< int > vec1, vec2;
4188 EntityType this_type;
4190 for( this_type =
MBEDGE; this_type !=
MBKNIFE; this_type++ )
4193 for(
int i = 0; i < CN::VerticesPerEntity( this_type ); i++ )
4196 for(
int dim = 1;
dim <= CN::Dimension( this_type );
dim++ )
4200 int temp_result = CN::AdjacentSubEntities( this_type, &i, 1, 0,
dim, vec1 );
4202 if( 0 != temp_result || vec1.size() > (
unsigned int)CN::NumSubEntities( this_type,
dim ) )
4204 cout <<
"failed getting sides for type " << CN::EntityTypeName( this_type ) <<
" dimension" <<
dim
4211 temp_result = CN::AdjacentSubEntities( this_type, &vec1[0], vec1.size(),
dim, 0, vec2 );
4214 if( 0 != temp_result ||
4217 (
dim == CN::Dimension( this_type ) &&
4218 vec2.size() != (
unsigned int)CN::VerticesPerEntity( this_type ) ) ||
4221 (
dim != CN::Dimension( this_type ) && ( vec2.size() != 1 || vec2[0] != i ) ) )
4223 cout <<
"traversal from verts to sides to verts failed for " << endl
4224 <<
"vertex " << i <<
" type " << CN::EntityTypeName( this_type ) <<
" dimension " <<
dim
4235 double xyz[3] = { 0.0, 0.0, 0.0 };
4237 for(
int i = 0; i < 8; i++ )
4242 int side, sense, offset;
4246 for( this_type =
MBEDGE; this_type !=
MBKNIFE; this_type++ )
4254 result = MB->
create_element( this_type, vertex_handles, CN::VerticesPerEntity( this_type ), this_entity );
4255 if(
MB_SUCCESS != result || 0 == this_entity )
4257 cout <<
"failed to create entity of type " << CN::EntityTypeName( this_type ) << endl;
4265 if(
MB_SUCCESS != result || num_verts != CN::VerticesPerEntity( this_type ) )
4267 cout <<
"failed to get connectivity for entity type " << CN::EntityTypeName( this_type ) << endl;
4272 for(
int dim = 1;
dim <= CN::Dimension( this_type );
dim++ )
4275 const CN::ConnMap& cm = CN::mConnectivityMap[this_type][
dim - 1];
4278 for(
int side_no = 0; side_no < CN::NumSubEntities( this_type,
dim ); side_no++ )
4282 tmp_conn[j] = cm.
conn[side_no][j];
4283 int temp_result = CN::SideNumber( this_type, tmp_conn,
4284 CN::VerticesPerEntity( CN::SubEntityType( this_type,
dim, side_no ) ),
4285 dim, side, sense, offset );
4286 if( 0 != temp_result )
4288 cout <<
"call to CN::side_number failed with non-success result"
4289 <<
" for type " << CN::EntityTypeName( this_type ) <<
" dimension " <<
dim <<
" side no "
4296 if( side != side_no || sense != 1 || offset != 0 )
4298 cout <<
"call to CN::side_number failed for type " << CN::EntityTypeName( this_type )
4299 <<
" dimension " <<
dim <<
" side no " << side_no << endl
4300 <<
"side, sense, offset = " << side <<
" " << sense <<
" " << offset << endl;
4333 const double coords[][3] = {
4334 { 0, 0, 0 }, { 2, 0, 0 }, { 1, 0, 1 }, { 0, 2, 0 }, { 2, 2, 0 }, { 1, 2, 1 }, { 3, 1, 0 },
4337 for(
unsigned i = 0; i < 7; ++i )
4342 EntityHandle tri2[] = { verts[3], verts[4], verts[5] };
4343 EntityHandle quad1[] = { verts[0], verts[1], verts[5], verts[3] };
4344 EntityHandle quad2[] = { verts[1], verts[5], verts[4], verts[2] };
4345 EntityHandle quad3[] = { verts[2], verts[4], verts[3], verts[0] };
4362 int side_n, sen, ofs;
4372 rval =
mb->
side_number( prism, diagonal1, side_n, sen, ofs );
4374 if( rval != MB_FAILURE )
return MB_FAILURE;
4377 EntityHandle tri3[] = { verts[3], verts[4], verts[6] };
4379 rval =
mb->
side_number( prism, faces[5], side_n, sen, ofs );
4381 if( rval != MB_FAILURE )
return MB_FAILURE;
4393 const double vert_pos[48] = { -1, 0, 0, 1, 0, 0, 2, 0, 0, 2, 1, 0, 1, 1, 0, 0,
4394 2, 0, -1, 1, 0, -2, 1, 0, -2, 0, 0, -2, -1, 0, -1, -1,
4395 0, -1, -2, 0, 1, -2, 0, 1, -1, 0, 2, -1, 0, 1.5, .5, 1 };
4400 for( i = 0; i < 16; i++ )
4405 std::cout <<
"Failed to create vertex " << i <<
" in mb_poly_test." << std::endl;
4411 const int connect_idx[] = { 1, 2, 5, 6, 7, 2, 3, 4, 5, 5, 4, 6, 7, 6, 8, 0, 1, 7, 8, 0, 1, 2, 3, 14,
4412 13, 12, 11, 10, 9, 0, 9, 10, 11, 12, 13, 14, 3, 4, 6, 8, 2, 3, 15, 5, 3, 4, 5, 15 };
4414 int num_connect_idx[] = { 5, 4, 3, 3, 4, 10, 11, 4, 4 };
4417 int idx = 0, nump = 0;
4421 for( i = 0; i < num_connect_idx[nump]; i++ )
4422 temp_connect[i] = verts[connect_idx[idx + i]];
4427 std::cout <<
"mb_poly_test: create_element failed for polygon " << i <<
"." << std::endl;
4428 result = tmp_result;
4433 idx += num_connect_idx[nump];
4444 for( i = 0; i < 9; i++ )
4447 if(
MB_SUCCESS != tmp_result || num_connect != num_connect_idx[i] )
4449 std::cout <<
"mb_poly_test: get_connectivity test failed for polygon " << i <<
"." << std::endl;
4450 result = ( tmp_result !=
MB_SUCCESS ? tmp_result : MB_FAILURE );
4454 for( j = 0; j < num_connect; j++ )
4456 if( connect[j] != verts[connect_idx[idx + j]] )
4458 std::cout <<
"mb_poly_test: get_connectivity test returned wrong vertices for polygon " << i <<
"."
4460 result = MB_FAILURE;
4471 Range vert_range, poly_range;
4472 for( i = 0; i < 9; i++ )
4473 poly_range.
insert( polygons[i] );
4474 result =
mb->
get_adjacencies( poly_range, 0,
false, vert_range, Interface::UNION );
4477 std::cout <<
"mb_poly_test: get_adjacencies failed for polygon " << i <<
"." << std::endl;
4481 else if( vert_range.
size() != 16 )
4483 std::cout <<
"mb_poly_test: get_adjacencies returned wrong # of vertices for polygon " << i <<
"." << std::endl;
4492 std::cout <<
"mb_poly_test: create_element failed for polyhedron 1." << std::endl;
4496 temp_connect[0] = polygons[1];
4497 temp_connect[1] = polygons[7];
4498 temp_connect[2] = polygons[8];
4502 std::cout <<
"mb_poly_test: create_element failed for polyhedron 2." << std::endl;
4507 std::vector< EntityHandle > temp_verts;
4511 std::cout <<
"mb_poly_test: get_adjacencies failed for polyhedra." << std::endl;
4515 if( 4 != temp_verts.size() )
4517 std::cout <<
"mb_poly_test: get_adjacencies for polyhedra returned " << temp_verts.size()
4518 <<
" vertices, should be 4." << std::endl;
4533 double grid_vert_pos[] = { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0,
4534 0.0, 2.0, 0.0, 1.0, 2.0, 0.0, 2.0, 2.0, 0.0,
4536 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 2.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0,
4537 0.0, 2.0, 1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 1.0 };
4542 if( result != MB_SUCCESS ) return result
4543 int init_edges, init_faces;
4548 for(
int i = 0; i < 18; i++ )
4554 int numv = 3, numv_sq = 9;
4555 #define VINDEX( i, j, k ) ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) )
4557 for(
int j = 0; j < 2; j++ )
4559 for(
int i = 0; i < 2; i++ )
4561 int vijk =
VINDEX( i, j, 0 );
4562 connect[0] = grid_verts[vijk];
4563 connect[1] = grid_verts[vijk + 1];
4564 connect[2] = grid_verts[vijk + 1 + numv];
4565 connect[3] = grid_verts[vijk + numv];
4566 connect[4] = grid_verts[vijk + numv * numv];
4567 connect[5] = grid_verts[vijk + 1 + numv * numv];
4568 connect[6] = grid_verts[vijk + 1 + numv + numv * numv];
4569 connect[7] = grid_verts[vijk + numv + numv * numv];
4575 std::copy( grid_verts, grid_verts + 18,
range_inserter( vert_range ) );
4580 int this_edges, this_faces;
4584 if( this_edges != init_edges + 33 || this_faces != init_faces + 20 )
4586 std::cout <<
"Wrong number of edges or faces in mb_topo_util test." << std::endl;
4592 for(
int j = 0; j < 2; j++ )
4594 for(
int i = 0; i < 2; i++ )
4597 if( pos[0] != .5 + i || pos[1] != .5 + j || pos[2] != .5 )
4599 std::cout <<
"Wrong position at i = " << i <<
", j = " << j << std::endl;
4600 result = MB_FAILURE;
4607 Range all_hexes, middle_edge;
4608 std::copy( grid_elems, grid_elems + 4,
range_inserter( all_hexes ) );
4613 std::cout <<
"Bad result getting single shared edge." << std::endl;
4617 std::vector< EntityHandle > star_faces, star_hexes;
4619 result = mtu.
star_entities( *middle_edge.
begin(), star_faces, bdy_edge, 0, &star_hexes );
4620 if(
MB_SUCCESS != result || bdy_edge || star_faces.size() != 4 || star_hexes.size() != 4 )
4622 std::cout <<
"Bad result from star_faces for non-bdy edge." << std::endl;
4629 all_hexes.
insert( grid_elems[0] );
4632 if( 11 != other_edges.
size() )
4634 std::cout <<
"Wrong number of edges in hex." << std::endl;
4639 result = mtu.
star_entities( *other_edges.
begin(), star_faces, bdy_edge, 0, &star_hexes );
4640 if(
MB_SUCCESS != result || !bdy_edge || ( star_faces.size() != 2 && star_faces.size() != 3 ) ||
4641 ( star_hexes.size() != 1 && star_hexes.size() != 2 ) )
4643 std::cout <<
"Bad result from star_faces for bdy edge." << std::endl;
4657 double grid_vert_pos[] = { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0,
4658 0.0, 2.0, 0.0, 1.0, 2.0, 0.0, 2.0, 2.0, 0.0,
4660 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 2.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0,
4661 0.0, 2.0, 1.0, 1.0, 2.0, 1.0, 2.0, 2.0, 1.0,
4663 0.0, 0.0, 2.0, 1.0, 0.0, 2.0, 2.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 2.0, 2.0, 1.0, 2.0,
4664 0.0, 2.0, 2.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0 };
4669 if( result != MB_SUCCESS ) return result
4670 int init_edges, init_faces, init_regions;
4676 for(
int i = 0; i < 27; i++ )
4682 int numv = 3, numv_sq = 9;
4683 #define VINDEX( i, j, k ) ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) )
4685 for(
int k = 0; k < 2; k++ )
4687 for(
int j = 0; j < 2; j++ )
4689 for(
int i = 0; i < 2; i++ )
4691 int vijk =
VINDEX( i, j, k );
4692 connect[0] = grid_verts[vijk];
4693 connect[1] = grid_verts[vijk + 1];
4694 connect[2] = grid_verts[vijk + 1 + numv];
4695 connect[3] = grid_verts[vijk + numv];
4696 connect[4] = grid_verts[vijk + numv * numv];
4697 connect[5] = grid_verts[vijk + 1 + numv * numv];
4698 connect[6] = grid_verts[vijk + 1 + numv + numv * numv];
4699 connect[7] = grid_verts[vijk + numv + numv * numv];
4706 std::copy( grid_verts, grid_verts + 27,
range_inserter( vert_range ) );
4711 int this_edges, this_faces;
4715 if( this_edges != init_edges + 54 || this_faces != init_faces + 36 )
4717 std::cout <<
"Wrong number of edges or faces in mb_topo_util test." << std::endl;
4723 Range split_faces, tmp_ents, tmp_faces;
4724 for(
int i = 0; i < 4; i++ )
4727 tmp_ents.
insert( grid_elems[i] );
4728 tmp_ents.
insert( grid_elems[i + 4] );
4733 std::cout <<
"mb_split_test failed to get shared quad." << std::endl;
4739 Range new_faces, new_regions;
4747 std::cout <<
"mb_split_test failed to split quads." << std::endl;
4756 if( this_edges != init_edges + 54 || this_faces != init_faces + 40 || this_regions != init_regions + 12 )
4758 std::cout <<
"Wrong number of edges or faces or regions after splitting in mb_topo_util test." << std::endl;
4775 const int nt1 = 100, nt2 = 10, nt3 = 1, nq1 = 20;
4786 if( th1 > th2 || th2 > th3 || th3 > qh1 )
return MB_FAILURE;
4821 if( !iter.
is_at_end() )
return MB_FAILURE;
4823 if( MB_FAILURE != rval )
return MB_FAILURE;
4833 if( !iter.
is_at_end() )
return MB_FAILURE;
4835 if( MB_FAILURE != rval )
return MB_FAILURE;
4854 if( !iter.
is_at_end() )
return MB_FAILURE;
4856 if( MB_FAILURE != rval )
return MB_FAILURE;
4867 if( !iter.
is_at_end() )
return MB_FAILURE;
4869 if( MB_FAILURE != rval )
return MB_FAILURE;
4875 if( quads.
erase( removed ) == quads.
end() )
return MB_FAILURE;
4889 if( !iter.
is_at_end() )
return MB_FAILURE;
4891 if( MB_FAILURE != rval )
return MB_FAILURE;
4983 if( !iter.
is_at_end() )
return MB_FAILURE;
4985 if( MB_FAILURE != rval )
return MB_FAILURE;
5098 if( !iter.
is_at_end() )
return MB_FAILURE;
5100 if( MB_FAILURE != rval )
return MB_FAILURE;
5104 if( range.
erase( dead1 ) == quads.
end() )
return MB_FAILURE;
5105 if( range.
erase( dead2 ) == quads.
end() )
return MB_FAILURE;
5106 if( range.
erase( dead3 ) == quads.
end() )
return MB_FAILURE;
5107 if( range.
erase( dead4 ) == quads.
end() )
return MB_FAILURE;
5108 if( range.
erase( dead5 ) == quads.
end() )
return MB_FAILURE;
5109 if( range.
erase( dead6 ) == quads.
end() )
return MB_FAILURE;
5164 if( !iter.
is_at_end() )
return MB_FAILURE;
5166 if( MB_FAILURE != rval )
return MB_FAILURE;
5171 #define ASSERT_EQUAL( A, B ) \
5174 if( !_assert_equal( ( A ), ( B ), #A, #B, __LINE__ ) ) return MB_FAILURE; \
5177 #define ASSERT_NOT_EQUAL( A, B ) \
5180 if( !_assert_not_equal( ( A ), ( B ), #A, #B, __LINE__ ) ) return MB_FAILURE; \
5183 template <
typename T1,
typename T2 >
5186 if( a == b )
return true;
5188 std::cout <<
"Assertion failed at line " << line << std::endl
5189 <<
"\t" << as <<
" == " << bs << std::endl
5190 <<
"\t" << as <<
" = " << a << std::endl
5191 <<
"\t" << bs <<
" = " << b << std::endl;
5195 template <
typename T1,
typename T2 >
5198 if( a != b )
return true;
5200 std::cout <<
"Assertion failed at line " << line << std::endl
5201 <<
"\t" << as <<
" != " << bs << std::endl
5202 <<
"\t" << as <<
" = " << a << std::endl
5203 <<
"\t" << bs <<
" = " << b << std::endl;
5219 double coords[3] = { 0, 1, 2 };
5222 for(
int i = 0; i < 10; i++ )
5228 for(
int i = 0; i < 2; i++ )
5250 return moab.check_adjacencies();
5282 2, 0, 0, 0, 0, 2, 2, 0, 2,
5290 for(
int i = 0; i < 10; i++ )
5300 9, 10, 4, 2, 1, 7, 8, 10, 9, 5, 6, 8, 7, 1, 3, 5, 7, 9
5303 int num_verts[7] = { 3, 5, 4, 5, 4, 4, 5 };
5306 for(
int i = 0; i < 6; i++ )
5307 start_indx[i + 1] = start_indx[i] + num_verts[i];
5308 for(
int j = 0; j < 7; j++ )
5321 rval = mbImpl->
get_adjacencies( &polyhedron, 1,
dim,
true, dum_range, Interface::UNION );
5334 return moab.check_adjacencies();
5340 unsigned long long init_total, total_with_elem, total_with_tag, total_with_tag_data;
5343 double coords[12] = { 1, 2, 0, 3, 4, 0, 5, 6, 0, 7, 8, 0 };
5345 for(
int i = 0; i < 4; ++i )
5352 if( total_with_elem <= init_total )
return MB_FAILURE;
5354 unsigned long long min, am;
5358 if( min != 4 *
sizeof(
EntityHandle ) )
return MB_FAILURE;
5364 if( min != 6 *
sizeof(
double ) )
return MB_FAILURE;
5370 if( min != 6 *
sizeof(
double ) )
return MB_FAILURE;
5373 if( total_with_tag <= total_with_elem )
return MB_FAILURE;
5375 int tag_data[] = { 0xA, 0xB };
5378 if( min <= 6 *
sizeof(
double ) )
return MB_FAILURE;
5381 if( total_with_tag_data <= total_with_tag )
return MB_FAILURE;
5428 std::vector< EntityHandle > verts;
5429 for(
unsigned i = 0; i < 10; ++i )
5431 double coords[] = {
static_cast< double >( i ), 0, 0 };
5434 verts.push_back( h );
5437 for(
unsigned i = 1; i < verts.size(); ++i )
5450 std::cerr <<
"Skinner failure at " __FILE__
":" << __LINE__ << std::endl;
5453 if(
skin.size() != 2 )
5455 std::cerr <<
"Skinner bad result at " __FILE__
":" << __LINE__ << std::endl;
5459 if( verts.front() > verts.back() )
std::swap( verts.front(), verts.back() );
5460 if(
skin.front() != verts.front() ||
skin.back() != verts.back() )
5462 std::cerr <<
"Skinner bad result at " __FILE__
":" << __LINE__ << std::endl;
5473 std::cerr <<
"Skinner failure at " __FILE__
":" << __LINE__ << std::endl;
5476 if(
skin.size() != 2 )
5478 std::cerr <<
"Skinner bad result at " __FILE__
":" << __LINE__ << std::endl;
5486 std::cerr <<
"Skinner bad result at " __FILE__
":" << __LINE__ << std::endl;
5513 const double coords[][3] = { { 0, 0, 0 }, { 2, 0, 0 }, { 1, 0, 1 }, { 0, 2, 0 }, { 2, 2, 0 }, { 1, 2, 1 } };
5515 for(
unsigned i = 0; i < 6; ++i )
5520 EntityHandle quad1[] = { verts[0], verts[1], verts[5], verts[3] };
5521 EntityHandle quad2[] = { verts[1], verts[5], verts[4], verts[2] };
5522 EntityHandle quad3[] = { verts[2], verts[4], verts[3], verts[0] };
5539 std::cerr <<
"Skinner failure at " __FILE__
":" << __LINE__ << std::endl;
5544 std::cerr <<
"Skinner bad result at " __FILE__
":" << __LINE__ << std::endl;
5549 std::vector< EntityHandle > conn[3];
5556 for(
int i = 0; i < 3; ++i )
5557 if( conn[i][0] > conn[i][1] )
std::swap( conn[i][0], conn[i][1] );
5559 for(
int i = 0; i < 3; ++i )
5561 EntityHandle s = verts[i + 3], e = verts[( i + 1 ) % 3 + 3];
5564 for( j = 0; j < 3; ++j )
5565 if( conn[j][0] == s && conn[j][1] == e )
break;
5569 std::cerr <<
"Skin does not contain edge [" << s <<
"," << e <<
"] at " << __FILE__
":" << __LINE__
5595 const double coords[][3] = { { 0, 0, 0 }, { 1, 0, 0 }, { 2, 0, 0 }, { 0, 1, 0 }, { 1, 1, 0 }, { 2, 1, 0 },
5596 { 0, 0, 1 }, { 1, 0, 1 }, { 2, 0, 1 }, { 0, 1, 1 }, { 1, 1, 1 }, { 2, 1, 1 } };
5598 for(
unsigned i = 0; i < 12; ++i )
5601 EntityHandle hex1c[] = { verts[0], verts[1], verts[4], verts[3], verts[6], verts[7], verts[10], verts[9] };
5602 EntityHandle hex2c[] = { verts[1], verts[2], verts[5], verts[4], verts[7], verts[8], verts[11], verts[10] };
5611 Range tmp, all_faces;
5614 assert( tmp.
size() == 1 );
5624 std::cerr <<
"Skinner failure at " __FILE__
":" << __LINE__ << std::endl;
5627 if(
skin != non_shared )
5629 std::cerr <<
"Skinner bad result at " __FILE__
":" << __LINE__ << std::endl;
5644 HomCoord low( 0, 0, 0 ), high( 10, 10, 5 );
5653 rval = tool.
find_skin( 0, ents,
false, scd_skin_ents, NULL,
true,
true,
true );
5656 rval = tool.
find_skin( 0, ents,
false, skin_ents, NULL,
true,
true,
false );
5660 if( scd_skin_ents.
size() != skin_ents.
size() )
return MB_FAILURE;
5663 scd_skin_ents.
clear();
5666 rval = tool.
find_skin( 0, ents,
true, scd_skin_ents, NULL,
true,
true,
true );
5669 rval = tool.
find_skin( 0, ents,
true, skin_ents, NULL,
true,
true,
false );
5684 const double coords[] = { 0, 0, 0, 1, 0, 0, 2, 0, 0, 2, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 2, 0, 1,
5685 2, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 2, 1, 0, 2, 2, 0, 2, 2, 1, 2, 1, 1, 2, 0, 1, 2 };
5686 const size_t num_vtx =
sizeof( coords ) /
sizeof(
double ) / 3;
5688 const int conn[] = { 0, 1, 4, 5, 6, 7, 10, 11, 1, 2, 3, 4, 7, 8, 9, 10,
5689 6, 7, 10, 11, 12, 13, 16, 17, 7, 8, 9, 10, 13, 14, 15, 16 };
5690 const size_t num_elems =
sizeof( conn ) /
sizeof(
int ) / 8;
5693 for(
size_t i = 0; i < num_vtx; ++i )
5698 for(
size_t i = 0; i < num_elems; ++i )
5701 for(
int j = 0; j < 8; j++ )
5702 c[j] = verts[conn[8 * i + j]];
5712 Range fverts, fedges, ffaces, fcells;
5718 assert( fverts.
size() == 18 && fedges.
size() == 0 && ffaces.
size() == 0 && fcells.
size() == 4 );
5724 assert( ffaces.
size() == 16 );
5727 assert( fedges.
size() == 32 );
5729 const double fcoords[] = { 0, 0, 3, 1, 0, 3, 2, 0, 3, 2, 1, 3, 1, 1, 3, 0, 1, 3 };
5730 const size_t num_fvtx =
sizeof( fcoords ) /
sizeof(
double ) / 3;
5732 const int fconn[] = { 0, 1, 4, 5, 1, 2, 3, 4 };
5733 const size_t num_faces =
sizeof( fconn ) /
sizeof(
int ) / 4;
5735 for(
size_t i = 0; i < num_fvtx; ++i )
5740 for(
size_t i = 0; i < num_faces; ++i )
5743 for(
int j = 0; j < 4; j++ )
5744 c[j] = nwverts[fconn[4 * i + j]];
5753 Range verts1, edges1, faces1;
5758 assert( verts1.
size() == 6 && edges1.
size() == 0 && faces1.
size() == 2 );
5763 assert( edges1.
size() == 6 );
5780 const char BAD_FILE_NAME[] =
"non-existant-file.txt";
5783 FILE* fptr = fopen( BAD_FILE_NAME,
"r" );
5787 std::cout <<
"Test cannot proceed while file exists: " << BAD_FILE_NAME << std::endl;
5805 #define TEST_ERROR_CODE( E ) \
5806 if( mb->get_error_string( E ) != #E ) \
5808 std::cerr << "Invalid error string from get_error_string for " << #E << ": " << mb->get_error_string( E ) \
5810 return MB_FAILURE; \
5865 const char*
tmp_file =
"structured.vtk";
5869 std::cerr <<
tmp_file <<
": filed to create temp file" << std::endl;
5872 str <<
"#vtk DataFile Version 2.0" << std::endl
5873 <<
"mb_skin_verts_common temp file" << std::endl
5874 <<
"ASCII" << std::endl
5875 <<
"DATASET STRUCTURED_POINTS" << std::endl
5876 <<
"DIMENSIONS " <<
INT <<
" " << (
dim > 1 ?
INT : 1 ) <<
" " << (
dim > 2 ?
INT : 1 ) << std::endl
5877 <<
"ORIGIN 0 0 0" << std::endl
5878 <<
"SPACING 1 1 1" << std::endl;
5892 if( ents.
empty() )
return MB_FAILURE;
5899 unsigned interior_adj = 1;
5900 for(
unsigned i = 0; i <
dim; ++i )
5902 Range expected, verts;
5906 std::vector< EntityHandle > adj;
5912 if( adj.size() < interior_adj ) h = expected.
insert( h, *v );
5917 rval = tool.
find_skin( 0, ents, !skin_elems, actual );
5920 Range extra, missing;
5924 extra =
subtract( actual, expected );
5925 missing =
subtract( expected, actual );
5928 std::cout <<
"Extra vertices returned: " << extra << std::endl
5929 <<
"Missing vertices: " << missing << std::endl;
5940 if( !extra.
empty() )
5942 std::cout <<
"Extra/non-returned elements created: " << extra << std::endl;
5951 std::vector< EntityHandle > elem, side;
5956 if( elem.size() == 1 )
5958 if( side.size() <
dim )
5960 else if( side.size() >
dim )
5963 else if( elem.size() == interior_adj )
5965 if( !side.empty() ) extra.
insert( *i );
5969 if( side.size() < interior_adj / 2 )
5971 else if( side.size() > interior_adj / 2 )
5977 std::cout <<
"Skin elements missing at vertices: " << missing << std::endl
5978 <<
"Extra skin elements at vertices: " << extra << std::endl;
5989 verts2 =
subtract( verts2, expected );
5992 if( !extra.
empty() )
5994 std::cout <<
"Skinner returned elements not on skin: " << extra << std::endl;
6031 const double coords2D[][2] = {
6033 { 1, 5 }, { 3, 3 }, { 5, 1 }, { 5, -1 }, { 3, -3 },
6034 { 1, -5 }, { -1, -5 }, { -3, -3 }, { -5, -1 }, { -5, 1 },
6035 { -3, 3 }, { -1, 1 }, { 1, 1 }, { 1, -1 }, { -1, -1 }
6037 const int polyconn[4][6] = {
6038 { 0, 1, 2, 13, 12, 11 }, { 2, 3, 4, 5, 14, 13 }, { 5, 6, 7, 8, 15, 14 }, { 8, 9, 10, 11, 12, 15 } };
6039 const int polyside[4][6] = {
6040 { 0, 1, 13, 16, 12, 11 }, { 2, 3, 4, 14, 17, 13 }, { 5, 6, 7, 15, 18, 14 }, { 8, 9, 10, 12, 19, 15 } };
6045 Range regions, faces, interior_faces;
6049 for(
int i = 0; i < 3; ++i )
6051 for(
int j = 0; j < 16; ++j )
6053 double coords[3] = { coords2D[j][0], coords2D[j][1],
static_cast< double >( 2 * i ) };
6061 for(
int i = 0; i < 2; ++i )
6063 EntityHandle conn[8] = { verts[i][15], verts[i][14], verts[i][13], verts[i][12],
6064 verts[i + 1][15], verts[i + 1][14], verts[i + 1][13], verts[i + 1][12] };
6067 regions.
insert( hexes[i] );
6072 for(
int i = 0; i < 3; ++i )
6074 for(
int j = 0; j < 4; ++j )
6077 for(
int k = 0; k < 6; ++k )
6078 conn[k] = verts[i][polyconn[j][k]];
6081 faces.
insert( hexagons[i][j] );
6082 if( i == 1 ) interior_faces.
insert( hexagons[i][j] );
6088 for(
int i = 0; i < 2; ++i )
6090 for(
int j = 0; j < 20; ++j )
6096 c2 = ( j + 1 ) % 12;
6101 c2 = 2 + 3 * ( ( j - 9 ) % 4 );
6106 c2 = 12 + ( j - 15 ) % 4;
6108 EntityHandle conn[4] = { verts[i][c1], verts[i][c2], verts[i + 1][c2], verts[i + 1][c1] };
6111 faces.
insert( quads[i][j] );
6112 if( j > 11 ) interior_faces.
insert( quads[i][j] );
6118 for(
int i = 0; i < 2; ++i )
6120 for(
int j = 0; j < 4; ++j )
6123 for(
int k = 0; k < 6; ++k )
6124 conn[k] = quads[i][polyside[j][k]];
6125 conn[6] = hexagons[i][j];
6126 conn[7] = hexagons[i + 1][j];
6129 regions.
insert( poly[i][j] );
6133 Range interior_verts;
6134 interior_verts.
insert( verts[1][12] );
6135 interior_verts.
insert( verts[1][13] );
6136 interior_verts.
insert( verts[1][14] );
6137 interior_verts.
insert( verts[1][15] );
6141 rval = tool.
find_skin( 0, regions,
true,
skin, 0,
true,
false );
6144 std::cout <<
"Vertex skinning failed with: " <<
mb.
get_error_string( rval ) << std::endl;
6148 Range all_verts, all_faces;
6155 if( expected !=
skin )
6157 std::cout <<
"Skinner returned incorrect vertices." << std::endl;
6160 if( all_faces != faces )
6162 std::cout <<
"Skinner created/deleted faces for vertex-only skinning" << std::endl;
6167 rval = tool.
find_skin( 0, regions,
false,
skin, 0,
true,
false );
6170 std::cout <<
"Non-create face skinning failed with: " <<
mb.
get_error_string( rval ) << std::endl;
6173 expected =
subtract( all_faces, interior_faces );
6174 if( expected !=
skin )
6176 std::cout <<
"Skinner returned incorrect faces." << std::endl;
6179 if( all_faces != faces )
6181 std::cout <<
"Skinner created/deleted faces for no-create skinning" << std::endl;
6186 rval = tool.
find_skin( 0, regions,
false,
skin, 0,
true,
true );
6189 std::cout <<
"Create face skinning failed with: " <<
mb.
get_error_string( rval ) << std::endl;
6196 if( difference.
size() != 2 )
6198 std::cout <<
"Skinner failed to create new quads or created to many." << std::endl;
6201 expected.
merge( difference );
6202 if( expected !=
skin )
6204 std::cout <<
"Skinner returned incorrect faces." << std::endl;
6208 EntityHandle expected_conn[2][4] = { { verts[0][12], verts[0][13], verts[0][14], verts[0][15] },
6209 { verts[2][12], verts[2][13], verts[2][14], verts[2][15] } };
6211 for(
int i = 0; i < 2; ++i )
6216 for(
int j = 0; !found && j < 2; ++j )
6220 int idx1 = std::find( conn, conn + len, expected_conn[i][0] ) - conn;
6221 if( idx1 == len )
continue;
6223 for(
int k = 1; k < 4; ++k )
6224 if( conn[( idx1 + k ) % 4] != expected_conn[i][k] ) found =
false;
6228 for(
int k = 1; k < 4; ++k )
6229 if( conn[( idx1 + 4 - k ) % 4] != expected_conn[i][k] ) found =
false;
6234 std::cerr <<
"Skinner did not create & return expected quad " << i << std::endl;
6260 double coords[13][3] = { { 0, 4, 0 }, { 2, 4, 0 }, { 4, 4, 0 }, { 6, 4, 0 }, { 8, 4, 0 }, { 0, 2, 0 }, { 2, 2, 0 },
6261 { 4, 2, 0 }, { 5, 2, 0 }, { 6, 2, 0 }, { 0, 0, 0 }, { 2, 0, 0 }, { 4, 0, 0 } };
6263 for(
int i = 0; i < 13; ++i )
6269 EntityHandle qconn[9] = { verts[0], verts[2], verts[12], verts[10], verts[1],
6270 verts[7], verts[11], verts[5], verts[6] };
6271 EntityHandle tconn[7] = { verts[2], verts[4], verts[12], verts[3], verts[9], verts[7], verts[8] };
6283 const int skin_vert_idx[] = { 0, 1, 2, 3, 4, 5, 9, 10, 11, 12 };
6284 for(
size_t i = 0; i <
sizeof( skin_vert_idx ) /
sizeof( skin_vert_idx[0] ); ++i )
6285 skin_verts.
insert( verts[skin_vert_idx[i]] );
6290 rval = tool.
find_skin( 0, faces,
true,
skin, 0, use_adj,
false );
6293 std::cout <<
"Vertex skinning failed with: " <<
mb.
get_error_string( rval ) << std::endl;
6296 if(
skin != skin_verts )
6298 std::cout <<
"Skinner returned incorrect vertices." << std::endl;
6302 const int skin_edges[5][3] = { { 0, 1, 2 }, { 2, 3, 4 }, { 4, 9, 12 }, { 12, 11, 10 }, { 10, 5, 0 } };
6304 rval = tool.
find_skin( 0, faces,
false,
skin, 0, use_adj,
true );
6307 std::cout <<
"Edge skinning failed with: " <<
mb.
get_error_string( rval ) << std::endl;
6310 if(
skin.size() != 5u )
6312 std::cout <<
"Skinner returned " <<
skin.size() <<
" vertices. Expected 5" << std::endl;
6315 int num_quadratic = 0;
6326 std::cerr <<
"Skinner created edge with " << len <<
" vertices" << std::endl;
6330 if( num_quadratic != 5 )
6332 std::cerr << num_quadratic <<
" of 5 created edges were quadratic" << std::endl;
6336 for(
int i = 0; i < 5; ++i )
6342 if( conn[2] == verts[skin_edges[i][1]] )
6350 std::cerr <<
"One or more skin edges is incorrect" << std::endl;
6353 if( ( conn[0] != verts[skin_edges[i][0]] || conn[1] != verts[skin_edges[i][2]] ) &&
6354 ( conn[0] != verts[skin_edges[i][2]] || conn[1] != verts[skin_edges[i][0]] ) )
6356 std::cerr <<
"Invalid skin edge connectivity" << std::endl;
6392 for(
int i = 0; i < 5; ++i )
6393 for(
int j = 0; j < 3; ++j )
6394 for(
int k = 0; k < 3; ++k )
6396 double coords[] = {
static_cast< double >( i ),
static_cast< double >( j ),
6397 static_cast< double >( k ) };
6402 int hex_conn[][3] = {
6435 for(
int i = 0; i < 2; ++i )
6438 for(
int j = 0; j < 27; ++j )
6439 hexverts[i][j] = verts[2 * i + hex_conn[j][0]][hex_conn[j][1]][hex_conn[j][2]];
6445 Range interior_verts;
6446 interior_verts.
insert( verts[1][1][1] );
6447 interior_verts.
insert( verts[3][1][1] );
6448 interior_verts.
insert( verts[2][1][1] );
6453 rval = tool.
find_skin( 0, hexes,
true,
skin, 0, use_adj,
false );
6456 std::cout <<
"Vertex skinning failed with: " <<
mb.
get_error_string( rval ) << std::endl;
6460 if( !extra.
empty() )
6462 std::cout <<
"Skinner returned " << extra.
size() <<
" interior vertices" << std::endl;
6463 std::cout << extra << std::endl;
6468 size_t num_skin = num_vtx - interior_verts.
size();
6469 if(
skin.size() != num_skin )
6471 std::cout <<
"Skinner returned " <<
skin.size() <<
" of " << num_skin <<
" skin vertices" << std::endl;
6476 rval = tool.
find_skin( 0, hexes,
false,
skin, 0, use_adj,
true );
6479 std::cout <<
"Element skinning failed with: " <<
mb.
get_error_string( rval ) << std::endl;
6483 if(
skin.size() > 10u )
6485 std::cout <<
"Skinner created too many faces" << std::endl;
6489 bool all_okay =
true;
6490 bool faces[2][6] = { {
false,
false,
false,
false,
false,
false }, {
false,
false,
false,
false,
false,
false } };
6499 std::cout <<
"Skinner created face with " << len <<
" nodes" << std::endl;
6504 int valid, side, sense, offset;
6505 for(
int h = 0; h < 2; ++h )
6507 valid = CN::SideNumber(
MBHEX, hexverts[h], conn, 4, 2, side, sense, offset );
6508 if( valid != 0 )
continue;
6511 std::cout <<
"Skinner created reversed face for hex " << h <<
" side " << side << std::endl;
6517 EntityType sidetype;
6518 CN::SubEntityNodeIndices(
MBHEX, 27, 2, side, sidetype, len2, idx );
6519 assert( sidetype ==
MBQUAD );
6520 assert( len2 == 9 );
6521 if( conn[offset] != hexverts[h][idx[0]] || conn[( offset + 1 ) % 4] != hexverts[h][idx[1]] ||
6522 conn[( offset + 2 ) % 4] != hexverts[h][idx[2]] || conn[( offset + 3 ) % 4] != hexverts[h][idx[3]] ||
6523 conn[4 + offset] != hexverts[h][idx[4]] || conn[4 + ( offset + 1 ) % 4] != hexverts[h][idx[5]] ||
6524 conn[4 + ( offset + 2 ) % 4] != hexverts[h][idx[6]] ||
6525 conn[4 + ( offset + 3 ) % 4] != hexverts[h][idx[7]] || conn[8] != hexverts[h][idx[8]] )
6527 std::cout <<
"Side " << side <<
" of hex " << h <<
" has invalid connectivity" << std::endl;
6531 faces[h][side] =
true;
6535 for(
int h = 0; h < 2; ++h )
6537 for(
int i = 0; i < 6; ++i )
6539 if( ( h == 0 && i == 1 ) || ( h == 1 && i == 3 ) )
6543 std::cout <<
"Skinner created interior face for side " << i <<
" of hex " << h << std::endl;
6547 else if( !faces[h][i] )
6549 std::cout <<
"Skinner failed to create side " << i <<
" of hex " << h << std::endl;
6573 for(
int i = 0; i < 3; ++i )
6574 for(
int j = 0; j < 3; ++j )
6575 for(
int k = 0; k < 3; ++k )
6577 double coords[] = {
static_cast< double >( i ),
static_cast< double >( j ),
6578 static_cast< double >( k ) };
6583 EntityHandle piramid1[13] = { 19, 25, 27, 21, 1, 22, 26, 24, 20, 10, 13, 14, 11 };
6607 if( 6 != num_verts )
return MB_FAILURE;
6616 if( 8 != num_verts )
return MB_FAILURE;
6632 EntityType type, subtype;
6661 double coords[][3] = { { 0, 0, 0 }, { 1, 0, 0 }, { 2, 0, 0 }, { 1, 2, 0 }, { 1, 2, 2 } };
6663 const int nvtx = 2 +
dim;
6664 for(
int i = 0; i < nvtx; ++i )
6670 EntityHandle conn[2][4] = { { verts[0], verts[1], verts[3], verts[4] },
6671 { verts[2], verts[3], verts[1], verts[4] } };
6672 const int conn_len =
dim + 1;
6674 for(
int i = 0; i < 2; ++i )
6684 int side_indices[3] = { 0, 0, 0 };
6685 CN::SubEntityVertexIndices( type,
dim - 1, 0, side_indices );
6686 side_conn[0] = conn[0][side_indices[1]];
6687 side_conn[1] = conn[0][side_indices[0]];
6688 side_conn[2] = conn[0][side_indices[2]];
6693 Range forward, reverse;
6695 rval = tool.
find_skin( 0, elems,
false, forward, &reverse, use_adj,
true );
6698 std::cout <<
"Skinner failed." << std::endl;
6704 if( reverse.
size() != 1 || reverse.
front() != side )
6706 std::cout <<
"Expected 1 reversed side, got: " << reverse.
size() << std::endl;
6763 Range expected_verts;
6765 const double coords2D[7][2] = { { 0, 2 }, { 1, 1 }, { 1, -1 }, { 0, -2 }, { -1, -1 }, { -1, 1 }, { 0, 0 } };
6766 EntityHandle verts[2][7] = { { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 } };
6767 for(
int d = 1; d < dimension; ++d )
6769 for(
int i = 0; i < 7; ++i )
6771 double coords[3] = { coords2D[i][0], coords2D[i][1],
static_cast< double >( d - 1 ) };
6774 if( i != 4 && i != 5 ) expected_verts.
insert( verts[d - 1][i] );
6779 for(
int i = 0; i < 6; ++i )
6781 EntityHandle conn[6] = { verts[0][6], verts[0][( i + 1 ) % 6], verts[0][i],
6782 verts[1][6], verts[1][( i + 1 ) % 6], verts[1][i] };
6783 rval =
mb.
create_element( type, conn, CN::VerticesPerEntity( type ), elems[i] );
6788 input.
insert( elems[0] );
6789 input.
insert( elems[1] );
6790 input.
insert( elems[2] );
6794 rval = tool.
find_skin( 0, input,
true,
skin, 0, use_adj,
false );
6797 std::cout <<
"Skinner failed to find skin vertices" << std::endl;
6800 if(
skin != expected_verts )
6802 std::cout <<
"Skinner returned incorrect skin vertices" << std::endl;
6809 std::cout <<
"Skinner created lower-dimension entities for vertex-only skinning" << std::endl;
6813 std::vector< EntityHandle > sv(
skin.begin(),
skin.end() );
6814 std::vector< int > counts( sv.size(), 0 );
6816 rval = tool.
find_skin( 0, input,
false,
skin, 0, use_adj,
true );
6819 std::cout <<
"Skinner failed to find skin elements" << std::endl;
6828 for(
int j = 0; j < len; ++j )
6830 size_t idx = std::find( sv.begin(), sv.end(), conn[j] ) - sv.begin();
6831 if( idx == sv.size() )
6833 std::cout <<
"Skinner returned non-skin element" << std::endl;
6839 for(
size_t i = 0; i < counts.size(); ++i )
6841 if( counts[i] < dimension )
6843 std::cout <<
"Skinner did not return all skin elements" << std::endl;
6848 if( (
size_t)n !=
skin.size() )
6850 std::cout <<
"Skinner created extra lower-dimension entities" << std::endl;
6902 const double coords2D[6][2] = { { 0, 0 }, { 1, 0 }, { 2, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 } };
6903 EntityHandle v[2][6] = { { 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 } };
6904 for(
int d = 1; d < dimension; ++d )
6906 for(
int i = 0; i < 6; ++i )
6908 double coords[3] = { coords2D[i][0], coords2D[i][1],
static_cast< double >( d - 1 ) };
6918 for(
int i = 0; i < 2; ++i )
6920 EntityHandle conn[8] = { v[0][i], v[0][i + 1], v[0][i + 4], v[0][i + 3],
6921 v[1][i], v[1][i + 1], v[1][i + 4], v[1][i + 3] };
6922 memcpy( econn[i], conn,
sizeof( conn ) );
6923 rval =
mb.
create_element( type, conn, CN::VerticesPerEntity( type ), elems[i] );
6925 input.
insert( elems[i] );
6931 for(
int i = 0; i < CN::NumSubEntities( type, dimension - 1 ); ++i )
6935 const short* indices = CN::SubEntityVertexIndices( type, dimension - 1, i, subtype, len );
6937 assert( (
size_t)len <=
sizeof( conn ) /
sizeof( conn[0] ) );
6938 for(
int j = 0; j < 2; ++j )
6940 if( j == 1 && i == 3 )
6942 for(
int k = 0; k < len; ++k )
6943 conn[k] = econn[j][indices[k]];
6947 if( j != 0 || i != 1 )
6954 rval = tool.
find_skin( 0, input,
false,
skin, 0, use_adj,
true );
6957 std::cout <<
"Skinner failed to find skin elements" << std::endl;
6960 if(
skin != expected )
6962 std::cout <<
"Skinner returned incorrect skin elements" << std::endl;
6968 if( (
size_t)n != expected.
size() + 1 )
6970 std::cout <<
"Skinner created extra lower-dimension entities" << std::endl;
7019 const int num_vtx = 30;
7021 for(
int i = 0; i < 6; ++i )
7023 for(
int j = 0; j < 5; ++j )
7025 double coords[3] = {
static_cast< double >( i ),
static_cast< double >( j ), 0 };
7032 for(
int i = 0; i < 5; ++i )
7034 for(
int j = 0; j < 4; ++j )
7044 const int Aquads[] = { 0, 1, 5, 6, 7, 10 };
7045 const int Aquads_size =
sizeof( Aquads ) /
sizeof( Aquads[0] );
7046 const int Bquads[] = { 2, 3, 4, 8, 9 };
7047 const int Bquads_size =
sizeof( Bquads ) /
sizeof( Bquads[0] );
7048 const int Cquads[] = { 11, 15, 16, 17 };
7049 const int Cquads_size =
sizeof( Cquads ) /
sizeof( Cquads[0] );
7050 const int Dquads[] = { 12, 13, 14, 18, 19 };
7051 const int Dquads_size =
sizeof( Dquads ) /
sizeof( Dquads[0] );
7055 const int Askin[] = { 0, 1, 2, 8, 9, 15, 14, 13, 19, 18, 12, 6 };
7056 const int Ashared[] = { -1, -1, 1, 1, 1, 3, 2, 2, 2, -1, -1, -1 };
7057 const int Askin_size =
sizeof( Askin ) /
sizeof( Askin[0] );
7058 const int Bskin[] = { 2, 3, 4, 5, 11, 17, 16, 15, 9, 8 };
7059 const int Bshared[] = { -1, -1, -1, -1, -1, 3, 3, 0, 0, 0 };
7060 const int Bskin_size =
sizeof( Bskin ) /
sizeof( Bskin[0] );
7061 const int Cskin[] = { 18, 19, 13, 14, 20, 21, 27, 26, 25, 24 };
7062 const int Cshared[] = { 0, 0, 0, 3, 3, 3, -1, -1, -1, -1 };
7063 const int Cskin_size =
sizeof( Cskin ) /
sizeof( Cskin[0] );
7064 const int Dskin[] = { 14, 15, 16, 17, 23, 29, 28, 27, 21, 20 };
7065 const int Dshared[] = { 0, 1, 1, -1, -1, -1, -1, 2, 2, 2 };
7066 const int Dskin_size =
sizeof( Dskin ) /
sizeof( Dskin[0] );
7069 const int*
const gquads[4] = { Aquads, Bquads, Cquads, Dquads };
7070 const int gquads_size[4] = { Aquads_size, Bquads_size, Cquads_size, Dquads_size };
7071 const int*
const skin[4] = { Askin, Bskin, Cskin, Dskin };
7072 const int*
const shared[4] = { Ashared, Bshared, Cshared, Dshared };
7073 const int skin_size[4] = { Askin_size, Bskin_size, Cskin_size, Dskin_size };
7077 for(
int grp = 0; grp < 4; ++grp )
7078 for(
int i = 0; i < gquads_size[grp]; ++i )
7079 ranges[grp].insert( quads[gquads[grp][i]] );
7091 for(
int run = 0; run < 4; ++run )
7093 const bool use_adj = run > 1;
7103 for(
int grp = 0; grp < 4; ++grp )
7106 rval = tool.
find_skin( 0, ranges[grp], 1, edges[grp], use_adj );
7109 std::cout <<
"Skinner failed for run " << run <<
" group " << grp << std::endl;
7114 std::vector< bool > seen( skin_size[grp],
false );
7121 if( len != 2 )
return MB_FAILURE;
7122 const int idx1 = std::find(
vtx,
vtx + num_vtx, conn[0] ) -
vtx;
7123 const int idx2 = std::find(
vtx,
vtx + num_vtx, conn[1] ) -
vtx;
7124 int pos = std::find(
skin[grp],
skin[grp] + skin_size[grp], idx1 ) -
skin[grp];
7125 if( pos == skin_size[grp] )
7127 std::cout <<
"Non-skin vertex in skin for run " << run <<
" group " << grp << std::endl;
7128 std::cout <<
"idx1 = " << idx1 <<
", idx2 = " << idx2 << std::endl;
7133 if(
skin[grp][( pos + skin_size[grp] - 1 ) % skin_size[grp]] == idx2 )
7134 pos = ( pos + skin_size[grp] - 1 ) % skin_size[grp];
7135 else if(
skin[grp][( pos + 1 ) % skin_size[grp]] != idx2 )
7137 std::cout <<
"Non-skin edge in skin for run " << run <<
" group " << grp << std::endl;
7138 std::cout <<
"idx1 = " << idx1 <<
", idx2 = " << idx2 << std::endl;
7145 std::cout <<
"Duplicate edge in skin for run " << run <<
" group " << grp << std::endl;
7146 std::cout <<
"idx1 = " << idx1 <<
", idx2 = " << idx2 << std::endl;
7151 int shared_with = shared[grp][pos];
7152 if( shared_with < 0 )
7154 if( shared_with > grp )
7156 if( edges[shared_with].find( *e ) == edges[shared_with].
end() )
7158 std::cout <<
"Skin edge duplicated for run " << run <<
" group " << grp << std::endl;
7159 std::cout <<
"idx1 = " << idx1 <<
", idx2 = " << idx2 <<
" not in skin for group " << shared_with
7165 int missing = std::count( seen.begin(), seen.end(),
false );
7168 std::cout <<
"Missking " << missing <<
" skin edges for run " << run <<
" group " << grp << std::endl;
7179 const Tag* tag_handles,
7180 const void*
const* values,
7214 std::vector< EntityHandle > v1, v2;
7288 std::vector< int > d1( r1.
size() );
7290 std::vector< int >::iterator ii = d1.begin();
7291 for( ri = r1.
begin(); ri != r1.
end(); ++ri, ++ii )
7328 const void* vallist[2] = { &value, 0 };
7372 d1.resize( r2.
size() );
7375 for( ri = r2.
begin(); ri != r2.
end(); ++ri, ++ii )
7379 Tag tags[] = { t1, t2 };
7533 CHECK( !( flags & MESHSET_ORDERED ) );
7542 CHECK( sets == sets2 );
7594 const double coords[] = { 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 1, 0, 1, 1, 0, 2, 1, 0, 0, 2, 0, 1, 2, 0, 2, 2, 0,
7595 0, 0, 1, 1, 0, 1, 2, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 0, 2, 1, 1, 2, 1, 2, 2, 1,
7596 0, 0, 2, 1, 0, 2, 2, 0, 2, 0, 1, 2, 1, 1, 2, 2, 1, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2 };
7597 const size_t num_vtx =
sizeof( coords ) /
sizeof(
double ) / 3;
7598 assert( num_vtx == 27u );
7600 const int conn[] = { 0, 1, 4, 3, 9, 10, 13, 12, 1, 2, 5, 4, 10, 11, 14, 13, 3, 4, 7, 6, 12, 13,
7601 16, 15, 4, 5, 8, 9, 13, 14, 17, 16, 9, 10, 13, 12, 18, 19, 22, 21, 10, 11, 14, 13,
7602 19, 20, 23, 22, 12, 13, 16, 15, 21, 22, 25, 24, 13, 14, 17, 18, 22, 23, 26, 25 };
7603 const size_t num_elem =
sizeof( conn ) /
sizeof( conn[0] ) / 8;
7604 assert( num_elem == 8u );
7607 for(
size_t i = 0; i < num_vtx; ++i )
7613 for(
size_t i = 0; i < num_elem; ++i )
7616 for(
int j = 0; j < 8; ++j )
7618 assert( conn[8 * i + j] < (
int)num_vtx );
7619 c[j] = verts[conn[8 * i + j]];
7630 std::vector< EntityHandle >::const_iterator i;
7631 i = std::lower_bound( list.begin(), list.end(), h );
7632 return i != list.end() && *i == h;
7642 std::vector< EntityHandle > vertices, storage;
7644 std::sort( vertices.begin(), vertices.end() );
7647 Range elements, tmp;
7648 for(
int d = 1; d < 4; ++d )
7652 elements.
merge( tmp );
7658 for( it = elements.
begin(); it != elements.
end(); ++it )
7663 for(
int i = 0; i < len; ++i )
7667 printf(
"Invalid handle (%s %d) in connectivity of %s %d\n",
7670 result = MB_FAILURE;
7680 cerr <<
"Usage: " << exe <<
" [-nostress] [-d input_file_dir]\n";
7686 #define RUN_TEST_ERR( A ) _run_test( ( A ), #A )
7700 #ifdef MOAB_HAVE_MPI
7701 int fail = MPI_Init( &argc, &argv );
7708 #ifdef MOAB_HAVE_NETCDF
7709 bool stress_test =
true;
7712 std::cout <<
"Size of mConnMap = " <<
sizeof( CN::mConnectivityMap ) << std::endl;
7713 std::cout <<
"Size of mUpConnMap = " <<
sizeof( CN::mUpConnMap ) << std::endl;
7714 std::cout <<
"Size of CN = " <<
sizeof(
CN ) << std::endl;
7716 for(
int i = 1; i < argc; ++i )
7719 if(
string( argv[i] ) ==
"-h" || string( argv[i] ) ==
"--help" )
usage( argv[0] );
7720 #if MOAB_HAVE_NETCDF
7721 else if(
string( argv[i] ) ==
"-nostress" )
7722 stress_test =
false;
7726 cerr <<
"Invalid argument: " << argv[i] << endl;
7733 cout <<
"\n\nMOAB Comprehensive test suite:\n\n";
7757 #if MOAB_HAVE_NETCDF
7809 #if MOAB_HAVE_NETCDF
7816 cout <<
"\nMB TEST SUMMARY: \n"
7821 #ifdef MOAB_HAVE_MPI
7822 fail = MPI_Finalize();