MOAB: Mesh Oriented datABase
(version 5.4.1)
|
Public Member Functions | |
void | test_edge_length_distribution_types () |
void | test_edge_length_distribution_unique () |
void | test_edge_length_distribution_empty () |
void | test_lambda_distribution () |
void | test_lambda_distribution_mixed () |
void | test_lambda_distribution_empty () |
Private Member Functions | |
CPPUNIT_TEST_SUITE (MeshUtilTest) | |
CPPUNIT_TEST (test_edge_length_distribution_types) | |
CPPUNIT_TEST (test_edge_length_distribution_unique) | |
CPPUNIT_TEST (test_edge_length_distribution_empty) | |
CPPUNIT_TEST (test_lambda_distribution) | |
CPPUNIT_TEST (test_lambda_distribution_mixed) | |
CPPUNIT_TEST (test_lambda_distribution_empty) | |
CPPUNIT_TEST_SUITE_END () |
Definition at line 39 of file MeshUtilTest.cpp.
MeshUtilTest::CPPUNIT_TEST | ( | test_lambda_distribution | ) | [private] |
MeshUtilTest::CPPUNIT_TEST | ( | test_lambda_distribution_mixed | ) | [private] |
MeshUtilTest::CPPUNIT_TEST | ( | test_lambda_distribution_empty | ) | [private] |
MeshUtilTest::CPPUNIT_TEST_SUITE | ( | MeshUtilTest | ) | [private] |
MeshUtilTest::CPPUNIT_TEST_SUITE_END | ( | ) | [private] |
Definition at line 244 of file MeshUtilTest.cpp.
References CPPUNIT_ASSERT_EQUAL, MBMesquite::MeshUtil::edge_length_distribution(), MBMesquite::MsqError::error_code(), and MBMesquite::MsqError::INVALID_MESH.
{ ArrayMesh empty( 3, 0, 0, 0, 0, 0, 0 ); MeshUtil tool( &empty ); SimpleStats act_results; MsqError err; tool.edge_length_distribution( act_results, err ); CPPUNIT_ASSERT_EQUAL( MsqError::INVALID_MESH, err.error_code() ); }
Definition at line 81 of file MeshUtilTest.cpp.
References ASSERT_NO_ERROR, MBMesquite::SimpleStats::average(), conn, CPPUNIT_ASSERT_DOUBLES_EQUAL, MBMesquite::MeshUtil::edge_length_distribution(), MBMesquite::edges, MBMesquite::EPSILON, fixed, MBMesquite::HEXAHEDRON, MBMesquite::SimpleStats::maximum(), mesh, MBMesquite::SimpleStats::minimum(), MBMesquite::PRISM, MBMesquite::PYRAMID, MBMesquite::QUADRILATERAL, MBMesquite::SimpleStats::rms(), MBMesquite::SimpleStats::standard_deviation(), MBMesquite::TETRAHEDRON, and MBMesquite::TRIANGLE.
{ // create a mesh that contains one of each element type, // completely disconnected from any other element double coords[] = { // triangle : 0 - 2 0, 0, 0, 2, 0, 0, 1, 1, 0, // quad : 3 - 6 3, 0, 0, 3, 1, 0, 3, 2, 2, 3, 0, 1, // tet : 7 - 10 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, // pyramid : 11 - 15 0, 0, 0, 0, -2, 0, -2, -2, 0, -1, 0, 0, 0, 0, -3, // wedge : 16 - 21 0, 0, -2, 2, 0, -2, 1, 1, -2, 0, 0, -1.5, 2, 0, -1.5, 1, 1, -1, 5, // hex : 22 - 29 4, 0, 0, 4, 1, 0, 4, 2, 2, 4, 0, 1, 5, 0, 0, 5, 1, 0, 5, 2, 2, 5, 0, 1 }; const int tri_offset = 0; const int quad_offset = tri_offset + 3; const int tet_offset = quad_offset + 4; const int pyr_offset = tet_offset + 4; const int wedge_offset = pyr_offset + 5; const int hex_offset = wedge_offset + 6; const int num_vtx = hex_offset + 8; const int fixed[num_vtx] = { 0 }; EntityTopology types[] = { TRIANGLE, QUADRILATERAL, TETRAHEDRON, PYRAMID, PRISM, HEXAHEDRON }; const unsigned long conn[] = { 0, 1, 2, // triangle 3, 4, 5, 6, // quadrilateral 7, 8, 9, 10, // tetrahedron 11, 12, 13, 14, 15, // pyramid 16, 17, 18, 19, 20, 21, // prism, 22, 23, 24, 25, 26, 27, 28, 29 // hex }; ArrayMesh mesh( 3, num_vtx, coords, fixed, 6, types, conn ); // calculate expected value const int edges[][2] = { // triangle { 0, 1 }, { 1, 2 }, { 2, 0 }, // quad { 3, 4 }, { 4, 5 }, { 5, 6 }, { 6, 3 }, // tet { 7, 8 }, { 8, 9 }, { 9, 7 }, { 7, 10 }, { 8, 10 }, { 9, 10 }, // pyramid { 11, 12 }, { 12, 13 }, { 13, 14 }, { 14, 11 }, { 11, 15 }, { 12, 15 }, { 13, 15 }, { 14, 15 }, // prism { 16, 17 }, { 17, 18 }, { 18, 16 }, { 16, 19 }, { 17, 20 }, { 18, 21 }, { 19, 20 }, { 20, 21 }, { 21, 19 }, // hex { 22, 23 }, { 23, 24 }, { 24, 25 }, { 25, 22 }, { 22, 26 }, { 23, 27 }, { 24, 28 }, { 25, 29 }, { 26, 27 }, { 27, 28 }, { 28, 29 }, { 29, 26 } }; const int num_edges = sizeof( edges ) / sizeof( edges[0] ); double exp_min = HUGE_VAL, exp_max = -HUGE_VAL; double exp_avg = 0, exp_rms = 0; for( int i = 0; i < num_edges; ++i ) { int v1 = edges[i][0]; int v2 = edges[i][1]; Vector3D c0( coords + 3 * v1 ); Vector3D c1( coords + 3 * v2 ); Vector3D diff = c1 - c0; double len = sqrt( diff % diff ); if( len < exp_min ) exp_min = len; if( len > exp_max ) exp_max = len; exp_avg += len; exp_rms += diff % diff; } exp_avg /= num_edges; exp_rms /= num_edges; double exp_std_dev = sqrt( exp_rms - exp_avg * exp_avg ); exp_rms = sqrt( exp_rms ); SimpleStats act_results; MsqError err; MeshUtil tool( &mesh ); tool.edge_length_distribution( act_results, err ); ASSERT_NO_ERROR( err ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_min, act_results.minimum(), EPSILON ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_max, act_results.maximum(), EPSILON ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_avg, act_results.average(), EPSILON ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_rms, act_results.rms(), EPSILON ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_std_dev, act_results.standard_deviation(), EPSILON ); }
Definition at line 200 of file MeshUtilTest.cpp.
References ASSERT_NO_ERROR, MBMesquite::SimpleStats::average(), conn, CPPUNIT_ASSERT_DOUBLES_EQUAL, MBMesquite::MeshUtil::edge_length_distribution(), MBMesquite::edges, MBMesquite::EPSILON, fixed, MBMesquite::SimpleStats::maximum(), mesh, MBMesquite::SimpleStats::minimum(), MBMesquite::SimpleStats::rms(), MBMesquite::SimpleStats::standard_deviation(), and MBMesquite::TETRAHEDRON.
{ // define two-tet mesh where tets share a face double coords[] = { 0, -5, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 }; const unsigned long conn[] = { 4, 3, 2, 0, 2, 3, 4, 1 }; int fixed[5] = { 0 }; ArrayMesh mesh( 3, 5, coords, fixed, 2, TETRAHEDRON, conn ); const int edges[][2] = { { 0, 2 }, { 0, 3 }, { 0, 4 }, { 1, 2 }, { 1, 3 }, { 1, 4 }, { 2, 3 }, { 3, 4 }, { 4, 2 } }; const int num_edges = sizeof( edges ) / sizeof( edges[0] ); double exp_min = HUGE_VAL, exp_max = -HUGE_VAL; double exp_avg = 0, exp_rms = 0; for( int i = 0; i < num_edges; ++i ) { int v1 = edges[i][0]; int v2 = edges[i][1]; Vector3D c0( coords + 3 * v1 ); Vector3D c1( coords + 3 * v2 ); Vector3D diff = c1 - c0; double len = sqrt( diff % diff ); if( len < exp_min ) exp_min = len; if( len > exp_max ) exp_max = len; exp_avg += len; exp_rms += diff % diff; } exp_avg /= num_edges; exp_rms /= num_edges; double exp_std_dev = sqrt( exp_rms - exp_avg * exp_avg ); exp_rms = sqrt( exp_rms ); SimpleStats act_results; MsqError err; MeshUtil tool( &mesh ); tool.edge_length_distribution( act_results, err ); ASSERT_NO_ERROR( err ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_min, act_results.minimum(), EPSILON ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_max, act_results.maximum(), EPSILON ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_avg, act_results.average(), EPSILON ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_rms, act_results.rms(), EPSILON ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_std_dev, act_results.standard_deviation(), EPSILON ); }
Definition at line 254 of file MeshUtilTest.cpp.
References ASSERT_NO_ERROR, MBMesquite::SimpleStats::average(), MBMesquite::SimpleStats::clear(), conn, CPPUNIT_ASSERT_DOUBLES_EQUAL, MBMesquite::EPSILON, fixed, MBMesquite::MeshUtil::lambda_distribution(), MBMesquite::length(), MBMesquite::SimpleStats::maximum(), MBMesquite::SimpleStats::minimum(), MBMesquite::QUADRILATERAL, MBMesquite::SimpleStats::rms(), and MBMesquite::SimpleStats::variance().
{ // simple regular unit quad mesh one deformed corner double coords[] = { 0, 2, 0, 1, 2, 0, 2, 2, 0, 0, 1, 0, 1, 1, 0, 2, 1, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0 }; const unsigned long conn[] = { 3, 4, 1, 0, 4, 5, 2, 1, 6, 7, 4, 3, 7, 8, 5, 4 }; const int fixed[9] = { 0 }; // first mesh doesn't contain deformed element SimpleStats results; MsqError err; ArrayMesh mesh3( 3, 8, coords, fixed, 3, QUADRILATERAL, conn ); MeshUtil tool3( &mesh3 ); tool3.lambda_distribution( results, err ); // lambda should be one everywhere ASSERT_NO_ERROR( err ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, results.minimum(), 1e-12 ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, results.maximum(), 1e-12 ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, results.average(), 1e-12 ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, results.rms(), 1e-12 ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, results.variance(), 1e-12 ); // now try with deformed element ArrayMesh mesh4( 3, 9, coords, fixed, 4, QUADRILATERAL, conn ); MeshUtil tool4( &mesh4 ); results.clear(); tool4.lambda_distribution( results, err ); // expect 13 values of 1 and a few other values Vector3D v4( coords + 3 * 4 ); Vector3D v5( coords + 3 * 5 ); Vector3D v7( coords + 3 * 7 ); Vector3D v8( coords + 3 * 8 ); double val14 = sqrt( ( ( v4 - v5 ) * ( v8 - v5 ) ).length() ); double val15 = sqrt( ( ( v5 - v8 ) * ( v7 - v8 ) ).length() ); double val16 = sqrt( ( ( v4 - v7 ) * ( v8 - v7 ) ).length() ); double exp_min = std::min( std::min( val14, val15 ), std::min( val16, 1.0 ) ); double exp_max = std::max( std::max( val14, val15 ), val16 ); double exp_avg = ( 13 + val14 + val15 + val16 ) / 16.0; double exp_rms = sqrt( ( 13 + val14 * val14 + val15 * val16 + val16 * val16 ) / 16.0 ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_min, results.minimum(), EPSILON ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_max, results.maximum(), EPSILON ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_avg, results.average(), EPSILON ); CPPUNIT_ASSERT_DOUBLES_EQUAL( exp_rms, results.rms(), EPSILON ); }
Definition at line 344 of file MeshUtilTest.cpp.
References CPPUNIT_ASSERT_EQUAL, MBMesquite::MsqError::error_code(), MBMesquite::MsqError::INVALID_MESH, and MBMesquite::MeshUtil::lambda_distribution().
{ ArrayMesh empty( 3, 0, 0, 0, 0, 0, 0 ); MeshUtil tool( &empty ); SimpleStats act_results; MsqError err; tool.lambda_distribution( act_results, err ); CPPUNIT_ASSERT_EQUAL( MsqError::INVALID_MESH, err.error_code() ); }
Definition at line 301 of file MeshUtilTest.cpp.
References ASSERT_NO_ERROR, conn, MBMesquite::MeshUtil::edge_length_distribution(), fixed, MBMesquite::HEXAHEDRON, mesh, MBMesquite::PRISM, MBMesquite::PYRAMID, MBMesquite::QUADRILATERAL, MBMesquite::TETRAHEDRON, and MBMesquite::TRIANGLE.
{ // create a mesh that contains one of each element type, // completely disconnected from any other element double coords[] = { // triangle : 0 - 2 0, 0, 0, 2, 0, 0, 1, 1, 0, // quad : 3 - 6 3, 0, 0, 3, 1, 0, 3, 2, 2, 3, 0, 1, // tet : 7 - 10 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, // pyramid : 11 - 15 0, 0, 0, 0, -2, 0, -2, -2, 0, -1, 0, 0, 0, 0, -3, // wedge : 16 - 21 0, 0, -2, 2, 0, -2, 1, 1, -2, 0, 0, -1.5, 2, 0, -1.5, 1, 1, -1, 5, // hex : 22 - 29 4, 0, 0, 4, 1, 0, 4, 2, 2, 4, 0, 1, 5, 0, 0, 5, 1, 0, 5, 2, 2, 5, 0, 1 }; const int tri_offset = 0; const int quad_offset = tri_offset + 3; const int tet_offset = quad_offset + 4; const int pyr_offset = tet_offset + 4; const int wedge_offset = pyr_offset + 5; const int hex_offset = wedge_offset + 6; const int num_vtx = hex_offset + 8; const int fixed[num_vtx] = { 0 }; EntityTopology types[] = { TRIANGLE, QUADRILATERAL, TETRAHEDRON, PYRAMID, PRISM, HEXAHEDRON }; const unsigned long conn[] = { 0, 1, 2, // triangle 3, 4, 5, 6, // quadrilateral 7, 8, 9, 10, // tetrahedron 11, 12, 13, 14, 15, // pyramid 16, 17, 18, 19, 20, 21, // prism, 22, 23, 24, 25, 26, 27, 28, 29 // hex }; ArrayMesh mesh( 3, num_vtx, coords, fixed, 6, types, conn ); // just test that this doesn't fail for any of the element types SimpleStats act_results; MsqError err; MeshUtil tool( &mesh ); tool.edge_length_distribution( act_results, err ); ASSERT_NO_ERROR( err ); }