MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include <iostream>
#include <string>
#include <sstream>
#include <ctime>
#include <vector>
#include <algorithm>
#include "moab/Core.hpp"
#include "moab/Range.hpp"
#include "moab/MeshTopoUtil.hpp"
#include "moab/ReadUtilIface.hpp"
#include "moab/NestedRefine.hpp"
#include "TestUtil.hpp"
Go to the source code of this file.
Functions | |
void | handle_error_code (ErrorCode rv, int &number_failed, int &number_successful) |
ErrorCode | test_adjacencies (Interface *mbImpl, NestedRefine *nr, const Range &all_ents) |
ErrorCode | refine_entities (Interface *mb, ParallelComm *pc, EntityHandle fset, int *level_degrees, const int num_levels, bool output) |
ErrorCode | create_single_entity (Interface *mbImpl, EntityType type) |
ErrorCode | create_mesh (Interface *mbImpl, EntityType type) |
ErrorCode | create_simple_mesh (Interface *mbImpl, EntityType type) |
ErrorCode | test_entities (int mesh_type, EntityType type, int *level_degrees, int num_levels, bool output) |
ErrorCode | test_1D () |
ErrorCode | test_2D () |
ErrorCode | test_3D () |
ErrorCode | test_mesh (const char *filename, int *level_degrees, int num_levels) |
int | main (int argc, char *argv[]) |
Variables | |
int | number_tests_successful = 0 |
int | number_tests_failed = 0 |
ErrorCode create_mesh | ( | Interface * | mbImpl, |
EntityType | type | ||
) |
Definition at line 712 of file urefine_mesh_test.cpp.
References CHECK_ERR, moab::Interface::create_element(), moab::Interface::create_vertex(), moab::error(), ErrorCode, MB_SUCCESS, MBEDGE, MBHEX, MBQUAD, MBTET, and MBTRI.
{ ErrorCode error; if( type == MBEDGE ) { const double coords[] = { 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1, 0 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 1, 0, 0, 3, 2, 0, 0, 4 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 2; EntityHandle verts[num_vtx], edges[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[2]; c[0] = verts[conn[2 * i]]; c[1] = verts[conn[2 * i + 1]]; error = mbImpl->create_element( MBEDGE, c, 2, edges[i] );CHECK_ERR( error ); } } else if( type == MBTRI ) { const double coords[] = { 0, 0, 0, 1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 0, 0, 1 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 1, 0, 5, 3, 0, 2, 5, 0, 4, 5, 0, 5, 1 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 3; EntityHandle verts[num_vtx], faces[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[3]; for( int j = 0; j < 3; j++ ) c[j] = verts[conn[3 * i + j]]; error = mbImpl->create_element( MBTRI, c, 3, faces[i] );CHECK_ERR( error ); } } else if( type == MBQUAD ) { const double coords[] = { 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, -1, 1, 0, -1, 0, 0, -1, -1, 0, 0, -1, 0, 1, -1, 0, 0, 1, 1, 0, 0, 1, 0, -1, 1 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 0, 1, 2, 3, 0, 3, 4, 5, 7, 8, 1, 0, 6, 7, 0, 5, 0, 3, 9, 10, 0, 10, 11, 7 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 4; EntityHandle verts[num_vtx], faces[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[4]; for( int j = 0; j < 4; j++ ) c[j] = verts[conn[4 * i + j]]; error = mbImpl->create_element( MBQUAD, c, 4, faces[i] );CHECK_ERR( error ); } } else if( type == MBTET ) { const double coords[] = { 0, -1, 0, 0, 2, 0, 1, 0, 0, -0.5, 0, 0, 0, 0, 1, 0, 0, -2 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 0, 2, 1, 4, 3, 0, 1, 4, 5, 2, 1, 0, 5, 0, 1, 3 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 4; EntityHandle verts[num_vtx], cells[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[4]; for( int j = 0; j < 4; j++ ) c[j] = verts[conn[4 * i + j]]; error = mbImpl->create_element( MBTET, c, 4, cells[i] );CHECK_ERR( error ); } } else if( type == MBHEX ) { const double coords[] = { 0, -1, 0, 1, -1, 0, 1, 1, 0, 0, 1, 0, -1, 1, 0, -1, -1, 0, 0, -1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, -1, 1, 1, -1, -1, 1, 0, -1, -1, 1, -1, -1, 1, 1, -1, 0, 1, -1, -1, 1, -1, -1, -1, -1 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 0, 1, 2, 3, 6, 7, 8, 9, 5, 0, 3, 4, 11, 6, 9, 10, 12, 13, 14, 15, 0, 1, 2, 3, 17, 12, 15, 16, 5, 0, 3, 4 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 8; EntityHandle verts[num_vtx], cells[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[8]; for( int j = 0; j < 8; j++ ) c[j] = verts[conn[8 * i + j]]; error = mbImpl->create_element( MBHEX, c, 8, cells[i] );CHECK_ERR( error ); } } return MB_SUCCESS; }
ErrorCode create_simple_mesh | ( | Interface * | mbImpl, |
EntityType | type | ||
) |
Definition at line 843 of file urefine_mesh_test.cpp.
References CHECK_ERR, moab::Interface::create_element(), moab::Interface::create_vertex(), moab::error(), ErrorCode, MB_SUCCESS, MBEDGE, MBHEX, MBQUAD, MBTET, and MBTRI.
{ ErrorCode error; if( type == MBEDGE ) { const double coords[] = { 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 4, 1, 0, 3, 1, 0, 2, 1, 0, 1, 1, 0, 0, 1, 0 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 1, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 0 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 2; EntityHandle verts[num_vtx], edges[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[2]; c[0] = verts[conn[2 * i]]; c[1] = verts[conn[2 * i + 1]]; error = mbImpl->create_element( MBEDGE, c, 2, edges[i] );CHECK_ERR( error ); } } else if( type == MBTRI ) { const double coords[] = { 0, 0, 0, 1, 0, 0, 2, 0, 0, 2.5, 1, 0, 1.5, 1, 0, 0.5, 1, 0, -0.5, 1, 0, -0.5, -1, 0, 0.5, -1, 0, 1.5, -1, 0, 2.5, -1, 0 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 0, 5, 6, 0, 1, 5, 1, 4, 5, 1, 2, 4, 2, 3, 4, 7, 8, 0, 8, 1, 0, 8, 9, 1, 9, 2, 1, 9, 10, 2 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 3; EntityHandle verts[num_vtx], faces[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[3]; for( int j = 0; j < 3; j++ ) c[j] = verts[conn[3 * i + j]]; error = mbImpl->create_element( MBTRI, c, 3, faces[i] );CHECK_ERR( error ); } } else if( type == MBQUAD ) { const double coords[] = { 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5, 0, 0, 0, 1, 0, 1, 1, 0, 2, 1, 0, 3, 1, 0, 4, 1, 0, 5, 1, 0, 0, 2, 0, 1, 2, 0, 2, 2, 0, 3, 2, 0, 4, 2, 0, 5, 2, 0 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 0, 1, 7, 6, 1, 2, 8, 7, 2, 3, 9, 8, 3, 4, 10, 9, 4, 5, 11, 10, 6, 7, 13, 12, 7, 8, 14, 13, 8, 9, 15, 14, 9, 10, 16, 15, 10, 11, 17, 16 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 4; EntityHandle verts[num_vtx], faces[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[4]; for( int j = 0; j < 4; j++ ) c[j] = verts[conn[4 * i + j]]; error = mbImpl->create_element( MBQUAD, c, 4, faces[i] );CHECK_ERR( error ); } } else if( type == MBTET ) { const double coords[] = { 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 1 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 0, 1, 2, 5, 3, 0, 2, 5, 4, 1, 0, 5, 4, 0, 3, 5 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 4; EntityHandle verts[num_vtx], cells[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[4]; for( int j = 0; j < 4; j++ ) c[j] = verts[conn[4 * i + j]]; error = mbImpl->create_element( MBTET, c, 4, cells[i] );CHECK_ERR( error ); } } else if( type == MBHEX ) { 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, 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 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; 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, 16, 15, 4, 5, 8, 7, 13, 14, 17, 16 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 8; EntityHandle verts[num_vtx], cells[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[8]; for( int j = 0; j < 8; j++ ) c[j] = verts[conn[8 * i + j]]; error = mbImpl->create_element( MBHEX, c, 8, cells[i] );CHECK_ERR( error ); } } return MB_SUCCESS; }
ErrorCode create_single_entity | ( | Interface * | mbImpl, |
EntityType | type | ||
) |
Definition at line 583 of file urefine_mesh_test.cpp.
References CHECK_ERR, moab::Interface::create_element(), moab::Interface::create_vertex(), moab::error(), ErrorCode, MB_SUCCESS, MBEDGE, MBHEX, MBQUAD, MBTET, and MBTRI.
Referenced by test_entities().
{ ErrorCode error; if( type == MBEDGE ) { const double coords[] = { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 0, 1 }; const size_t num_elems = sizeof( conn ) / sizeof( conn[0] ) / 2; std::cout << "Specify verts and ents" << std::endl; EntityHandle verts[num_vtx], edges[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } std::cout << "Created vertices" << std::endl; for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[2]; c[0] = verts[conn[0]]; c[1] = verts[conn[1]]; error = mbImpl->create_element( MBEDGE, c, 2, edges[i] );CHECK_ERR( error ); } std::cout << "Created ents" << std::endl; } else if( type == MBTRI ) { const double coords[] = { 0, 0, 0, 1, 0, 0, 0, 1, 0 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 0, 1, 2 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 3; EntityHandle verts[num_vtx], faces[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] ); if( error != MB_SUCCESS ) return error; } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[3]; for( int j = 0; j < 3; j++ ) c[j] = verts[conn[3 * i + j]]; error = mbImpl->create_element( MBTRI, c, 3, faces[i] );CHECK_ERR( error ); } } else if( type == MBQUAD ) { const double coords[] = { 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 0, 1, 2, 3 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 3; EntityHandle verts[num_vtx], faces[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[4]; for( int j = 0; j < 4; j++ ) c[j] = verts[conn[j]]; error = mbImpl->create_element( MBQUAD, c, 4, faces[i] );CHECK_ERR( error ); } } else if( type == MBTET ) { const double coords[] = { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 0, 1, 2, 3 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 4; EntityHandle verts[num_vtx], cells[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[4]; for( int j = 0; j < 4; j++ ) c[j] = verts[conn[j]]; error = mbImpl->create_element( MBTET, c, 4, cells[i] );CHECK_ERR( error ); } } else if( type == MBHEX ) { const double coords[] = { 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1 }; const size_t num_vtx = sizeof( coords ) / sizeof( double ) / 3; const int conn[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; const size_t num_elems = sizeof( conn ) / sizeof( int ) / 8; EntityHandle verts[num_vtx], cells[num_elems]; for( size_t i = 0; i < num_vtx; ++i ) { error = mbImpl->create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( error ); } for( size_t i = 0; i < num_elems; ++i ) { EntityHandle c[8]; for( int j = 0; j < 8; j++ ) c[j] = verts[conn[j]]; error = mbImpl->create_element( MBHEX, c, 8, cells[i] );CHECK_ERR( error ); } } return MB_SUCCESS; }
void handle_error_code | ( | ErrorCode | rv, |
int & | number_failed, | ||
int & | number_successful | ||
) |
Definition at line 38 of file urefine_mesh_test.cpp.
References MB_SUCCESS, MPI_COMM_WORLD, and rank.
{ if( rv == MB_SUCCESS ) { #ifdef MOAB_HAVE_MPI int rank = 0; MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if( rank == 0 ) std::cout << "Success"; #else std::cout << "Success"; #endif number_successful++; } else { std::cout << "Failure"; number_failed++; } }
int main | ( | int | argc, |
char * | argv[] | ||
) |
Definition at line 1159 of file urefine_mesh_test.cpp.
References ErrorCode, filename, handle_error_code(), MPI_COMM_WORLD, number_tests_failed, number_tests_successful, rank, test_1D(), test_2D(), test_3D(), and test_mesh().
{ #ifdef MOAB_HAVE_MPI MPI_Init( &argc, &argv ); int nprocs, rank; MPI_Comm_size( MPI_COMM_WORLD, &nprocs ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); #endif ErrorCode result; if( argc == 1 ) { result = test_1D(); handle_error_code( result, number_tests_failed, number_tests_successful ); std::cout << "\n"; result = test_2D(); handle_error_code( result, number_tests_failed, number_tests_successful ); std::cout << "\n"; result = test_3D(); handle_error_code( result, number_tests_failed, number_tests_successful ); std::cout << "\n"; } else if( argc == 2 ) { const char* filename = argv[1]; int deg[1] = { 2 }; int len = sizeof( deg ) / sizeof( int ); result = test_mesh( filename, deg, len ); handle_error_code( result, number_tests_failed, number_tests_successful ); std::cout << "\n"; } #ifdef MOAB_HAVE_MPI MPI_Finalize(); #endif return number_tests_failed; }
ErrorCode refine_entities | ( | Interface * | mb, |
ParallelComm * | pc, | ||
EntityHandle | fset, | ||
int * | level_degrees, | ||
const int | num_levels, | ||
bool | output | ||
) |
Definition at line 351 of file urefine_mesh_test.cpp.
References CHECK_EQUAL, CHECK_ERR, moab::NestedRefine::child_to_parent(), children, dim, moab::Range::empty(), moab::Range::end(), moab::error(), ErrorCode, moab::ParallelComm::filter_pstatus(), moab::NestedRefine::generate_mesh_hierarchy(), moab::Interface::get_entities_by_dimension(), moab::Interface::get_entities_by_handle(), MB_CHK_ERR, MB_SUCCESS, moab::NestedRefine::parent_to_child(), PSTATUS_GHOST, PSTATUS_NOT, size, moab::Range::size(), moab::Range::subset_by_dimension(), test_adjacencies(), moab::NestedRefine::timeall, moab::NestedRefine::codeperf::tm_refine, moab::NestedRefine::codeperf::tm_resolve, moab::NestedRefine::codeperf::tm_total, and moab::Interface::write_file().
Referenced by test_entities(), and test_mesh().
{ ErrorCode error; // Get the range of entities in the initial mesh Range init_ents[4]; int dim[3] = { 1, 2, 3 }; if( output ) { // int inents = init_ents.size(); std::stringstream file; #ifdef MOAB_HAVE_MPI file << "MESH_LEVEL_0.h5m"; #else file << "MESH_LEVEL_0.vtk"; #endif std::string str = file.str(); const char* output_file = str.c_str(); #ifdef MOAB_HAVE_MPI error = mb->write_file( output_file, 0, ";;PARALLEL=WRITE_PART" );CHECK_ERR( error ); #else error = mb->write_file( output_file, 0, NULL );CHECK_ERR( error ); #endif } // Create an hm object and generate the hierarchy std::cout << "Creating a hm object" << std::endl; #ifdef MOAB_HAVE_MPI Range averts, aedges, afaces, acells; error = mb->get_entities_by_dimension( fset, 0, averts );MB_CHK_ERR( error ); error = mb->get_entities_by_dimension( fset, 1, aedges );MB_CHK_ERR( error ); error = mb->get_entities_by_dimension( fset, 2, afaces );MB_CHK_ERR( error ); error = mb->get_entities_by_dimension( fset, 3, acells );MB_CHK_ERR( error ); /* filter based on parallel status */ if( pc ) { error = pc->filter_pstatus( averts, PSTATUS_GHOST, PSTATUS_NOT, -1, &init_ents[0] );MB_CHK_ERR( error ); error = pc->filter_pstatus( aedges, PSTATUS_GHOST, PSTATUS_NOT, -1, &init_ents[1] );MB_CHK_ERR( error ); error = pc->filter_pstatus( afaces, PSTATUS_GHOST, PSTATUS_NOT, -1, &init_ents[2] );MB_CHK_ERR( error ); error = pc->filter_pstatus( acells, PSTATUS_GHOST, PSTATUS_NOT, -1, &init_ents[3] );MB_CHK_ERR( error ); } else { init_ents[0] = averts; init_ents[1] = aedges; init_ents[2] = afaces; init_ents[3] = acells; } #else error = mb->get_entities_by_dimension( fset, 0, init_ents[0] );CHECK_ERR( error ); error = mb->get_entities_by_dimension( fset, 1, init_ents[1] );CHECK_ERR( error ); error = mb->get_entities_by_dimension( fset, 2, init_ents[2] );CHECK_ERR( error ); error = mb->get_entities_by_dimension( fset, 3, init_ents[3] );CHECK_ERR( error ); #endif NestedRefine uref( dynamic_cast< Core* >( mb ), pc, fset ); std::vector< EntityHandle > set; std::cout << "Starting hierarchy generation" << std::endl; bool opt = true; // bool opt = false; error = uref.generate_mesh_hierarchy( num_levels, level_degrees, set, opt );CHECK_ERR( error ); std::cout << "Finished hierarchy generation in " << uref.timeall.tm_total << " secs" << std::endl; #ifdef MOAB_HAVE_MPI if( pc ) { std::cout << "Time taken for refinement " << uref.timeall.tm_refine << " secs" << std::endl; std::cout << "Time taken for resolving shared interface " << uref.timeall.tm_resolve << " secs" << std::endl; } #endif // error = uref.exchange_ghosts(set, 1); CHECK_ERR(error); std::cout << std::endl; std::cout << "Mesh size for level 0 :: inverts = " << init_ents[0].size() << ", inedges = " << init_ents[1].size() << ", infaces = " << init_ents[2].size() << ", incells = " << init_ents[3].size() << std::endl; Range prev_ents[4]; for( int i = 0; i < 4; i++ ) prev_ents[i] = init_ents[i]; // Loop over each mesh level and check its topological properties for( int l = 0; l < num_levels; l++ ) { Range all_ents; error = mb->get_entities_by_handle( set[l + 1], all_ents );CHECK_ERR( error ); Range ents[4]; for( int k = 0; k < 4; k++ ) ents[k] = all_ents.subset_by_dimension( k ); if( ents[0].empty() || all_ents.empty() ) std::cout << "Something is not right" << std::endl; std::cout << std::endl; std::cout << "Mesh size for level " << l + 1 << " :: nverts = " << ents[0].size() << ", nedges = " << ents[1].size() << ", nfaces = " << ents[2].size() << ", ncells = " << ents[3].size() << std::endl; // Check if the number of new entities created are correct. for( int type = 1; type < 3; type++ ) { int factor = 1; if( !ents[type + 1].empty() ) { for( int p = 0; p <= l; p++ ) { for( int d = 0; d < dim[type]; d++ ) factor *= level_degrees[p]; } int expected_nents = factor * init_ents[type + 1].size(); CHECK_EQUAL( expected_nents, (int)ents[type + 1].size() ); } } // Check adjacencies error = test_adjacencies( mb, &uref, all_ents );CHECK_ERR( error ); // Check interlevel child-parent query between previous and current level for( int type = 1; type < 3; type++ ) { if( !prev_ents[type + 1].empty() ) { for( Range::iterator e = prev_ents[type + 1].begin(); e != prev_ents[type + 1].end(); e++ ) { std::vector< EntityHandle > children; error = uref.parent_to_child( *e, l, l + 1, children );CHECK_ERR( error ); for( int i = 0; i < (int)children.size(); i++ ) { EntityHandle parent; error = uref.child_to_parent( children[i], l + 1, l, &parent );CHECK_ERR( error ); assert( parent == *e ); } } } } for( int i = 0; i < 4; i++ ) prev_ents[i] = ents[i]; // Print out the boundary vertices /* EntityHandle bnd_set; error = mb->create_meshset(MESHSET_SET, bnd_set); MB_CHK_ERR(error); std::vector<EntityHandle> vbnd; for (int k=0; k<3; k++){ std::cout<<"Finding boundary of dimension "<<k<<" with size "<<ents[k].size()<<std::endl; if (ents[k].size() != 0){ for (Range::iterator v = ents[k].begin(); v != ents[k].end(); v++) { EntityHandle ent = *v; bool bnd = uref.is_entity_on_boundary(ent); if (bnd) vbnd.push_back(*v); } } } std::cout<<"vbnd.size = "<<vbnd.size()<<std::endl; error = mb->add_entities(bnd_set, &vbnd[0], (int)vbnd.size()); MB_CHK_ERR(error); if (output) { std::stringstream file; file << "VBND_LEVEL_" <<l+1<<".vtk"; std::string str = file.str(); const char* output_file = str.c_str(); char * write_opts = NULL; error = mb->write_file(output_file, 0, write_opts, &bnd_set, 1); CHECK_ERR(error); }*/ // Print out the mesh if( output ) { std::stringstream file; #ifdef MOAB_HAVE_MPI file << "MESH_LEVEL_" << l + 1 << ".h5m"; #else file << "MESH_LEVEL_" << l + 1 << ".vtk"; #endif std::string str = file.str(); const char* output_file = str.c_str(); #ifdef MOAB_HAVE_MPI error = mb->write_file( output_file, 0, ";;PARALLEL=WRITE_PART", &set[l + 1], 1 );CHECK_ERR( error ); #else error = mb->write_file( output_file, 0, NULL, &set[l + 1], 1 );CHECK_ERR( error ); #endif } } // Check interlevel child-parent query between initial and most refined mesh for( int type = 1; type < 3; type++ ) { if( !init_ents[type + 1].empty() ) { for( Range::iterator e = init_ents[type + 1].begin(); e != init_ents[type + 1].end(); e++ ) { std::vector< EntityHandle > children; error = uref.parent_to_child( *e, 0, num_levels, children );CHECK_ERR( error ); for( int i = 0; i < (int)children.size(); i++ ) { EntityHandle parent; error = uref.child_to_parent( children[i], num_levels, 0, &parent );CHECK_ERR( error ); assert( parent == *e ); } } } } // Print out the whole hierarchy into a single file /* if (output) { std::stringstream file; file << "MESH_HIERARCHY.vtk"; std::string str = file.str(); const char* output_file = str.c_str(); error = mb->write_file(output_file); CHECK_ERR(error); }*/ return MB_SUCCESS; }
Definition at line 1009 of file urefine_mesh_test.cpp.
References CHECK_ERR, moab::error(), ErrorCode, MB_SUCCESS, MBEDGE, and test_entities().
{ ErrorCode error; std::cout << "Testing EDGE" << std::endl; EntityType type = MBEDGE; std::cout << "Testing single entity" << std::endl; int deg[3] = { 2, 3, 5 }; int len = sizeof( deg ) / sizeof( int ); error = test_entities( 1, type, deg, len, false );CHECK_ERR( error ); std::cout << std::endl; std::cout << "Testing a small mesh" << std::endl; error = test_entities( 2, type, deg, len, false );CHECK_ERR( error ); std::cout << std::endl; std::cout << "Testing a small simple mesh" << std::endl; int degree[4] = { 5, 5, 2, 2 }; len = sizeof( degree ) / sizeof( int ); error = test_entities( 3, type, degree, len, false );CHECK_ERR( error ); return MB_SUCCESS; }
Definition at line 1034 of file urefine_mesh_test.cpp.
References CHECK_ERR, moab::error(), ErrorCode, length(), MB_SUCCESS, MBQUAD, MBTRI, and test_entities().
{ ErrorCode error; std::cout << "Testing TRI" << std::endl; EntityType type = MBTRI; std::cout << "Testing single entity" << std::endl; int deg[3] = { 2, 3, 5 }; int len = sizeof( deg ) / sizeof( int ); error = test_entities( 1, type, deg, len, false );CHECK_ERR( error ); std::cout << std::endl; std::cout << "Testing a small mesh" << std::endl; error = test_entities( 2, type, deg, len, false );CHECK_ERR( error ); std::cout << std::endl; std::cout << "Testing a small simple mesh" << std::endl; int degree[2] = { 5, 2 }; int length = sizeof( degree ) / sizeof( int ); error = test_entities( 3, type, degree, length, false );CHECK_ERR( error ); std::cout << std::endl; std::cout << "Testing QUAD" << std::endl; type = MBQUAD; std::cout << "Testing single entity" << std::endl; error = test_entities( 1, type, deg, len, false );CHECK_ERR( error ); std::cout << std::endl; std::cout << "Testing a small mesh" << std::endl; error = test_entities( 2, type, deg, len, false );CHECK_ERR( error ); std::cout << std::endl; std::cout << "Testing a small simple mesh" << std::endl; error = test_entities( 3, type, degree, length, false );CHECK_ERR( error ); return MB_SUCCESS; }
Definition at line 1074 of file urefine_mesh_test.cpp.
References CHECK_ERR, moab::error(), ErrorCode, length(), MB_SUCCESS, MBHEX, MBTET, and test_entities().
{ ErrorCode error; std::cout << "Testing TET" << std::endl; EntityType type = MBTET; int deg[2] = { 2, 3 }; int len = sizeof( deg ) / sizeof( int ); std::cout << "Testing single entity" << std::endl; error = test_entities( 1, type, deg, len, false );CHECK_ERR( error ); std::cout << std::endl; std::cout << "Testing a small mesh" << std::endl; error = test_entities( 2, type, deg, len, false );CHECK_ERR( error ); std::cout << std::endl; std::cout << "Testing a small simple mesh" << std::endl; int degree[4] = { 2, 2, 2, 2 }; int length = sizeof( degree ) / sizeof( int ); error = test_entities( 3, type, degree, length, false );CHECK_ERR( error ); std::cout << std::endl; std::cout << "Testing HEX" << std::endl; type = MBHEX; std::cout << "Testing single entity" << std::endl; error = test_entities( 1, type, deg, len, false );CHECK_ERR( error ); std::cout << std::endl; std::cout << "Testing a small mesh" << std::endl; error = test_entities( 2, type, deg, len, false );CHECK_ERR( error ); std::cout << std::endl; std::cout << "Testing a small simple mesh" << std::endl; error = test_entities( 3, type, degree, length, false );CHECK_ERR( error ); return MB_SUCCESS; }
ErrorCode test_adjacencies | ( | Interface * | mbImpl, |
NestedRefine * | nr, | ||
const Range & | all_ents | ||
) |
Definition at line 58 of file urefine_mesh_test.cpp.
References moab::Range::begin(), CHECK, CHECK_EQUAL, CHECK_ERR, moab::Range::clear(), moab::Range::empty(), moab::Range::end(), moab::error(), ErrorCode, moab::NestedRefine::get_adjacencies(), moab::Interface::get_adjacencies(), moab::MeshTopoUtil::get_bridge_adjacencies(), moab::Interface::get_connectivity(), MB_SUCCESS, moab::Range::print(), moab::Interface::query_interface(), moab::Range::size(), moab::Range::subset_by_dimension(), moab::subtract(), and moab::ReadUtilIface::update_adjacencies().
Referenced by refine_entities().
{ MeshTopoUtil mtu( mbImpl ); ErrorCode error; Range verts, edges, faces, cells; verts = all_ents.subset_by_dimension( 0 ); edges = all_ents.subset_by_dimension( 1 ); faces = all_ents.subset_by_dimension( 2 ); cells = all_ents.subset_by_dimension( 3 ); std::vector< EntityHandle > adjents; Range mbents, ahfents; // Update the moab native data structures ReadUtilIface* read_face; error = mbImpl->query_interface( read_face );CHECK_ERR( error ); std::vector< EntityHandle > ents, conn; if( !edges.empty() ) { conn.clear(); ents.clear(); for( Range::iterator it = edges.begin(); it != edges.end(); it++ ) ents.push_back( *it ); // std::copy(edges.begin(), edges.end(), ents.begin()); error = mbImpl->get_connectivity( &ents[0], (int)ents.size(), conn );CHECK_ERR( error ); error = read_face->update_adjacencies( *ents.begin(), (int)ents.size(), 2, &conn[0] );CHECK_ERR( error ); } if( !faces.empty() ) { conn.clear(); ents.clear(); for( Range::iterator it = faces.begin(); it != faces.end(); it++ ) ents.push_back( *it ); // std::copy(faces.begin(), faces.end(), ents.begin()); error = mbImpl->get_connectivity( &ents[0], 1, conn );CHECK_ERR( error ); int nvF = conn.size(); conn.clear(); error = mbImpl->get_connectivity( &ents[0], (int)ents.size(), conn );CHECK_ERR( error ); error = read_face->update_adjacencies( *ents.begin(), (int)ents.size(), nvF, &conn[0] );CHECK_ERR( error ); } if( !cells.empty() ) { conn.clear(); ents.clear(); for( Range::iterator it = cells.begin(); it != cells.end(); it++ ) ents.push_back( *it ); // std::copy(cells.begin(), cells.end(), ents.begin()); error = mbImpl->get_connectivity( &ents[0], 1, conn );CHECK_ERR( error ); int nvF = conn.size(); conn.clear(); error = mbImpl->get_connectivity( &ents[0], (int)ents.size(), conn );CHECK_ERR( error ); error = read_face->update_adjacencies( *ents.begin(), (int)ents.size(), nvF, &conn[0] );CHECK_ERR( error ); } if( !edges.empty() ) { // 1D Queries // // IQ1: For every vertex, obtain incident edges for( Range::iterator i = verts.begin(); i != verts.end(); ++i ) { adjents.clear(); mbents.clear(); ahfents.clear(); error = nr->get_adjacencies( *i, 1, adjents );CHECK_ERR( error ); error = mbImpl->get_adjacencies( &*i, 1, 1, false, mbents );CHECK_ERR( error ); std::sort( adjents.begin(), adjents.end() ); std::copy( adjents.begin(), adjents.end(), range_inserter( ahfents ) ); if( ahfents.size() != mbents.size() ) { std::cout << "ahf results = " << std::endl; ahfents.print(); std::cout << "native results = " << std::endl; mbents.print(); } CHECK_EQUAL( adjents.size(), mbents.size() ); mbents = subtract( mbents, ahfents ); if( ahfents.size() != mbents.size() ) { // std::cout<<"ahf results = "<<std::endl; // ahfents.print(); // std::cout<<"native results = "<<std::endl; // mbents.print(); } // CHECK_EQUAL(adjents.size(),mbents.size()); CHECK( !mbents.size() ); } // NQ1: For every edge, obtain neighbor edges for( Range::iterator i = edges.begin(); i != edges.end(); ++i ) { adjents.clear(); mbents.clear(); ahfents.clear(); error = nr->get_adjacencies( *i, 1, adjents );CHECK_ERR( error ); error = mtu.get_bridge_adjacencies( *i, 0, 1, mbents );CHECK_ERR( error ); CHECK_EQUAL( adjents.size(), mbents.size() ); std::sort( adjents.begin(), adjents.end() ); std::copy( adjents.begin(), adjents.end(), range_inserter( ahfents ) ); mbents = subtract( mbents, ahfents ); CHECK( !mbents.size() ); } } if( !faces.empty() ) { // IQ21: For every vertex, obtain incident faces for( Range::iterator i = verts.begin(); i != verts.end(); ++i ) { adjents.clear(); mbents.clear(); ahfents.clear(); error = nr->get_adjacencies( *i, 2, adjents );CHECK_ERR( error ); error = mbImpl->get_adjacencies( &*i, 1, 2, false, mbents );CHECK_ERR( error ); CHECK_EQUAL( adjents.size(), mbents.size() ); std::sort( adjents.begin(), adjents.end() ); std::copy( adjents.begin(), adjents.end(), range_inserter( ahfents ) ); mbents = subtract( mbents, ahfents ); CHECK( !mbents.size() ); } // IQ22: For every edge, obtain incident faces if( !edges.empty() ) { for( Range::iterator i = edges.begin(); i != edges.end(); ++i ) { adjents.clear(); mbents.clear(); ahfents.clear(); error = nr->get_adjacencies( *i, 2, adjents );CHECK_ERR( error ); error = mbImpl->get_adjacencies( &*i, 1, 2, false, mbents );CHECK_ERR( error ); CHECK_EQUAL( adjents.size(), mbents.size() ); std::sort( adjents.begin(), adjents.end() ); std::copy( adjents.begin(), adjents.end(), range_inserter( ahfents ) ); mbents = subtract( mbents, ahfents ); CHECK( !mbents.size() ); } } // NQ2: For every face, obtain neighbor faces for( Range::iterator i = faces.begin(); i != faces.end(); ++i ) { adjents.clear(); mbents.clear(); ahfents.clear(); error = nr->get_adjacencies( *i, 2, adjents );CHECK_ERR( error ); error = mtu.get_bridge_adjacencies( *i, 1, 2, mbents );CHECK_ERR( error ); CHECK_EQUAL( adjents.size(), mbents.size() ); std::sort( adjents.begin(), adjents.end() ); std::copy( adjents.begin(), adjents.end(), range_inserter( ahfents ) ); mbents = subtract( mbents, ahfents ); CHECK( !mbents.size() ); } if( !edges.empty() ) { for( Range::iterator i = faces.begin(); i != faces.end(); ++i ) { adjents.clear(); mbents.clear(); ahfents.clear(); error = nr->get_adjacencies( *i, 1, adjents );CHECK_ERR( error ); error = mbImpl->get_adjacencies( &*i, 1, 1, false, mbents );CHECK_ERR( error ); CHECK_EQUAL( adjents.size(), mbents.size() ); std::sort( adjents.begin(), adjents.end() ); std::copy( adjents.begin(), adjents.end(), range_inserter( ahfents ) ); mbents = subtract( mbents, ahfents ); CHECK( !mbents.size() ); } } } if( !cells.empty() ) { // IQ 31: For every vertex, obtain incident cells for( Range::iterator i = verts.begin(); i != verts.end(); ++i ) { adjents.clear(); mbents.clear(); ahfents.clear(); error = nr->get_adjacencies( *i, 3, adjents );CHECK_ERR( error ); error = mbImpl->get_adjacencies( &*i, 1, 3, false, mbents );CHECK_ERR( error ); if( adjents.size() != mbents.size() ) { // std::cout<<"ahf results = "<<std::endl; // ahfents.print(); // std::cout<<"native results = "<<std::endl; // mbents.print(); } CHECK_EQUAL( adjents.size(), mbents.size() ); std::sort( adjents.begin(), adjents.end() ); std::copy( adjents.begin(), adjents.end(), range_inserter( ahfents ) ); mbents = subtract( mbents, ahfents ); CHECK( !mbents.size() ); } if( !edges.empty() ) { for( Range::iterator i = edges.begin(); i != edges.end(); ++i ) { adjents.clear(); mbents.clear(); ahfents.clear(); error = nr->get_adjacencies( *i, 3, adjents );CHECK_ERR( error ); error = mbImpl->get_adjacencies( &*i, 1, 3, false, mbents );CHECK_ERR( error ); CHECK_EQUAL( adjents.size(), mbents.size() ); std::sort( adjents.begin(), adjents.end() ); std::copy( adjents.begin(), adjents.end(), range_inserter( ahfents ) ); mbents = subtract( mbents, ahfents ); CHECK( !mbents.size() ); } } if( !faces.empty() ) { for( Range::iterator i = faces.begin(); i != faces.end(); ++i ) { adjents.clear(); mbents.clear(); ahfents.clear(); error = nr->get_adjacencies( *i, 3, adjents );CHECK_ERR( error ); error = mbImpl->get_adjacencies( &*i, 1, 3, false, mbents );CHECK_ERR( error ); CHECK_EQUAL( adjents.size(), mbents.size() ); std::sort( adjents.begin(), adjents.end() ); std::copy( adjents.begin(), adjents.end(), range_inserter( ahfents ) ); mbents = subtract( mbents, ahfents ); CHECK( !mbents.size() ); } } // NQ3: For every cell, obtain neighbor cells for( Range::iterator i = cells.begin(); i != cells.end(); ++i ) { adjents.clear(); mbents.clear(); ahfents.clear(); error = nr->get_adjacencies( *i, 3, adjents );CHECK_ERR( error ); error = mtu.get_bridge_adjacencies( *i, 2, 3, mbents );CHECK_ERR( error ); CHECK_EQUAL( adjents.size(), mbents.size() ); std::sort( adjents.begin(), adjents.end() ); std::copy( adjents.begin(), adjents.end(), range_inserter( ahfents ) ); mbents = subtract( mbents, ahfents ); CHECK( !mbents.size() ); } if( !edges.empty() ) { for( Range::iterator i = cells.begin(); i != cells.end(); ++i ) { adjents.clear(); mbents.clear(); ahfents.clear(); error = nr->get_adjacencies( *i, 1, adjents );CHECK_ERR( error ); error = mbImpl->get_adjacencies( &*i, 1, 1, false, mbents );CHECK_ERR( error ); CHECK_EQUAL( adjents.size(), mbents.size() ); std::sort( adjents.begin(), adjents.end() ); std::copy( adjents.begin(), adjents.end(), range_inserter( ahfents ) ); mbents = subtract( mbents, ahfents ); CHECK( !mbents.size() ); } } if( !faces.empty() ) { for( Range::iterator i = cells.begin(); i != cells.end(); ++i ) { adjents.clear(); mbents.clear(); ahfents.clear(); error = nr->get_adjacencies( *i, 2, adjents );CHECK_ERR( error ); error = mbImpl->get_adjacencies( &*i, 1, 2, false, mbents );CHECK_ERR( error ); CHECK_EQUAL( adjents.size(), mbents.size() ); std::sort( adjents.begin(), adjents.end() ); std::copy( adjents.begin(), adjents.end(), range_inserter( ahfents ) ); mbents = subtract( mbents, ahfents ); CHECK( !mbents.size() ); } } } return MB_SUCCESS; }
ErrorCode test_entities | ( | int | mesh_type, |
EntityType | type, | ||
int * | level_degrees, | ||
int | num_levels, | ||
bool | output | ||
) |
Definition at line 977 of file urefine_mesh_test.cpp.
References create_mesh(), create_simple_mesh(), create_single_entity(), moab::error(), ErrorCode, mb, MB_SUCCESS, and refine_entities().
Referenced by test_1D(), test_2D(), and test_3D().
{ ErrorCode error; Core mb; Interface* mbimpl = &mb; // Create entities if( mesh_type == 1 ) { error = create_single_entity( mbimpl, type ); if( error != MB_SUCCESS ) return error; std::cout << "Entity created successfully" << std::endl; } else if( mesh_type == 2 ) { error = create_mesh( mbimpl, type ); if( error != MB_SUCCESS ) return error; std::cout << "Small mesh created successfully" << std::endl; } else if( mesh_type == 3 ) { error = create_simple_mesh( mbimpl, type ); if( error != MB_SUCCESS ) return error; std::cout << "Small simple mesh created successfully" << std::endl; } // Generate hierarchy error = refine_entities( mbimpl, 0, 0, level_degrees, num_levels, output ); if( error != MB_SUCCESS ) return error; return MB_SUCCESS; }
Definition at line 1114 of file urefine_mesh_test.cpp.
References CHECK_ERR, moab::Interface::create_meshset(), moab::error(), ErrorCode, moab::ParallelComm::get_comm_procs(), moab::ParallelComm::get_pcomm(), moab::Interface::load_file(), MB_CHK_ERR, MB_SUCCESS, MESHSET_SET, MPI_COMM_WORLD, read_options, and refine_entities().
{ Core moab; Interface* mbImpl = &moab; ParallelComm* pc = NULL; EntityHandle fileset; ErrorCode error; error = mbImpl->create_meshset( moab::MESHSET_SET, fileset );CHECK_ERR( error ); #ifdef MOAB_HAVE_MPI MPI_Comm comm = MPI_COMM_WORLD; EntityHandle partnset; error = mbImpl->create_meshset( moab::MESHSET_SET, partnset );MB_CHK_ERR( error ); pc = moab::ParallelComm::get_pcomm( mbImpl, partnset, &comm ); int procs = 1; MPI_Comm_size( MPI_COMM_WORLD, &procs ); if( procs > 1 ) { read_options = "PARALLEL=READ_PART;PARTITION=PARALLEL_PARTITION;PARALLEL_RESOLVE_SHARED_ENTS"; error = mbImpl->load_file( filename, &fileset, read_options.c_str() );CHECK_ERR( error ); // DBG std::set< unsigned int > shprocs; error = pc->get_comm_procs( shprocs );CHECK_ERR( error ); std::cout << "#sprocs = " << shprocs.size() << std::endl; // DBG } else if( procs == 1 ) { #endif error = mbImpl->load_file( filename, &fileset );CHECK_ERR( error ); #ifdef MOAB_HAVE_MPI } #endif // Generate hierarchy error = refine_entities( &moab, pc, fileset, level_degrees, num_levels, false );CHECK_ERR( error ); return MB_SUCCESS; }
int number_tests_failed = 0 |
Definition at line 36 of file urefine_mesh_test.cpp.
int number_tests_successful = 0 |
Definition at line 35 of file urefine_mesh_test.cpp.