MOAB: Mesh Oriented datABase  (version 5.4.1)
DomainClassifierTest.cpp
Go to the documentation of this file.
00001 /* *****************************************************************
00002     MESQUITE -- The Mesh Quality Improvement Toolkit
00003 
00004     Copyright 2008 Sandia National Laboratories.  Developed at the
00005     University of Wisconsin--Madison under SNL contract number
00006     624796.  The U.S. Government and the University of Wisconsin
00007     retain certain rights to this software.
00008 
00009     This library is free software; you can redistribute it and/or
00010     modify it under the terms of the GNU Lesser General Public
00011     License as published by the Free Software Foundation; either
00012     version 2.1 of the License, or (at your option) any later version.
00013 
00014     This library is distributed in the hope that it will be useful,
00015     but WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017     Lesser General Public License for more details.
00018 
00019     You should have received a copy of the GNU Lesser General Public License
00020     (lgpl.txt) along with this library; if not, write to the Free Software
00021     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 
00023     (2008) [email protected]
00024 
00025   ***************************************************************** */
00026 
00027 /** \file DomainClassifierTest.cpp
00028  *  \brief
00029  *  \author Jason Kraftcheck
00030  */
00031 
00032 #include "Mesquite.hpp"
00033 #include "UnitUtil.hpp"
00034 #include "DomainClassifier.hpp"
00035 #include "MeshDomain1D.hpp"
00036 #include "MsqError.hpp"
00037 #include "MeshImpl.hpp"
00038 #include "MsqVertex.hpp"
00039 #include "PlanarDomain.hpp"
00040 
00041 #include <cstdio>
00042 #include <iostream>
00043 #include <algorithm>
00044 
00045 using namespace MBMesquite;
00046 using namespace std;
00047 
00048 class DomainClassifierTest : public CppUnit::TestFixture
00049 {
00050   private:
00051     CPPUNIT_TEST_SUITE( DomainClassifierTest );
00052     CPPUNIT_TEST( test_classify_by_handle );
00053     CPPUNIT_TEST( test_valid_classification );
00054     CPPUNIT_TEST( test_classify_by_tag );
00055     CPPUNIT_TEST( test_classify_skin );
00056     CPPUNIT_TEST( test_classify_by_geometry );
00057     CPPUNIT_TEST_SUITE_END();
00058 
00059   public:
00060     typedef DomainClassifier::DomainSet DomSet;
00061     typedef std::vector< DomSet > DomSetList;
00062     MeshImpl myMesh;
00063     DomSetList myDomains;
00064     std::vector< int > domainDims;
00065 
00066     void setUp();
00067     void tearDown();
00068 
00069     void test_classify_by_handle();
00070     void test_valid_classification();
00071     void test_classify_by_tag();
00072     void test_classify_skin();
00073     void test_classify_by_geometry();
00074 
00075     void check_domain( DomainClassifier& dom );
00076 };
00077 
00078 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( DomainClassifierTest, "Unit" );
00079 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( DomainClassifierTest, "DomainClassifierTest" );
00080 
00081 static void print_domain( int i, DomainClassifier::DomainSet& set )
00082 {
00083     if( PointDomain* pd = dynamic_cast< PointDomain* >( set.domain ) )
00084         printf( "%d: PointDomain( %f %f %f ) @ %p\n", i, pd->geom()[0], pd->geom()[1], pd->geom()[2], pd );
00085     else if( LineDomain* ld = dynamic_cast< LineDomain* >( set.domain ) )
00086     {
00087         if( fabs( ld->geom().direction()[0] ) < 1e-6 && fabs( ld->geom().direction()[1] ) < 1e-6 )
00088             printf( "%d: LineDomain( x = %f, y = %f ) @ %p\n", i, ld->geom().point()[0], ld->geom().point()[1], ld );
00089         else if( fabs( ld->geom().direction()[1] ) < 1e-6 && fabs( ld->geom().direction()[2] ) < 1e-6 )
00090             printf( "%d: LineDomain( y = %f, z = %f ) @ %p\n", i, ld->geom().point()[1], ld->geom().point()[2], ld );
00091         else if( fabs( ld->geom().direction()[0] ) < 1e-6 && fabs( ld->geom().direction()[2] ) < 1e-6 )
00092             printf( "%d: LineDomain( x = %f, z = %f ) @ %p\n", i, ld->geom().point()[0], ld->geom().point()[2], ld );
00093         else
00094             printf( "%d: LineDomain( ? ) @ %p\n", i, ld );
00095     }
00096     else if( PlanarDomain* pd = dynamic_cast< PlanarDomain* >( set.domain ) )
00097     {
00098         if( fabs( pd->get_normal()[0] ) < 1e-6 && fabs( pd->get_normal()[1] ) < 1e-6 )
00099             printf( "%d: PlanarDomain( z = %f ) @ %p\n", i, pd->get_origin()[2], pd );
00100         else if( fabs( pd->get_normal()[1] ) < 1e-6 && fabs( pd->get_normal()[2] ) < 1e-6 )
00101             printf( "%d: PlanarDomain( x = %f ) @ %p\n", i, pd->get_origin()[1], pd );
00102         else if( fabs( pd->get_normal()[0] ) < 1e-6 && fabs( pd->get_normal()[2] ) < 1e-6 )
00103             printf( "%d: PlanarDomain( y = %f ) @ %p\n", i, pd->get_origin()[0], pd );
00104         else
00105             printf( "%d: PlanarDomain( ? ) @ %p\n", i, pd );
00106     }
00107     else
00108     {
00109         printf( "%d: unknown domain type @ %p\n", i, set.domain );
00110     }
00111 
00112     if( !set.vertices.empty() )
00113     {
00114         printf( "  vertices: " );
00115         std::vector< Mesh::VertexHandle >::iterator vi = set.vertices.begin();
00116         for( ; vi != set.vertices.end(); ++vi )
00117             printf( "%lu, ", (unsigned long)*vi );
00118         printf( "\n" );
00119     }
00120     if( !set.elements.empty() )
00121     {
00122         printf( "  elements: " );
00123         std::vector< Mesh::ElementHandle >::iterator ei = set.elements.begin();
00124         for( ; ei != set.elements.end(); ++ei )
00125             printf( "%lu, ", (unsigned long)*ei );
00126         printf( "\n" );
00127     }
00128 }
00129 
00130 void DomainClassifierTest::setUp()
00131 {
00132     myMesh.clear();
00133     myDomains.clear();
00134     domainDims.clear();
00135     // vertex coodinates
00136     const char vertex_data[] = "POINTS 64 float\n"
00137                                "0 0 0  1 0 0  2 0 0  3 0 0\n"
00138                                "0 1 0  1 1 0  2 1 0  3 1 0\n"
00139                                "0 2 0  1 2 0  2 2 0  3 2 0\n"
00140                                "0 3 0  1 3 0  2 3 0  3 3 0\n"
00141                                "\n"
00142                                "0 0 1  1 0 1  2 0 1  3 0 1\n"
00143                                "0 1 1  1 1 1  2 1 1  3 1 1\n"
00144                                "0 2 1  1 2 1  2 2 1  3 2 1\n"
00145                                "0 3 1  1 3 1  2 3 1  3 3 1\n"
00146                                "\n"
00147                                "0 0 2  1 0 2  2 0 2  3 0 2\n"
00148                                "0 1 2  1 1 2  2 1 2  3 1 2\n"
00149                                "0 2 2  1 2 2  2 2 2  3 2 2\n"
00150                                "0 3 2  1 3 2  2 3 2  3 3 2\n"
00151                                "\n"
00152                                "0 0 3  1 0 3  2 0 3  3 0 3\n"
00153                                "0 1 3  1 1 3  2 1 3  3 1 3\n"
00154                                "0 2 3  1 2 3  2 2 3  3 2 3\n"
00155                                "0 3 3  1 3 3  2 3 3  3 3 3\n"
00156                                "\n";
00157     // quad connectivity for quads on mesh skin
00158     const int num_quads    = 9 * 6;             // nine per side
00159     const char quad_data[] = "4  1  0  4  5\n"  // -z face (z == 0)
00160                              "4  2  1  5  6\n"
00161                              "4  3  2  6  7\n"
00162                              "4  5  4  8  9\n"
00163                              "4  6  5  9 10\n"
00164                              "4  7  6 10 11\n"
00165                              "4  9  8 12 13\n"
00166                              "4 10  9 13 14\n"
00167                              "4 11 10 14 15\n"
00168                              "\n"
00169                              "4 48 49 53 52\n"  // +z face (z == 3)
00170                              "4 49 50 54 53\n"
00171                              "4 50 51 55 54\n"
00172                              "4 52 53 57 56\n"
00173                              "4 53 54 58 57\n"
00174                              "4 54 55 59 58\n"
00175                              "4 56 57 61 60\n"
00176                              "4 57 58 62 61\n"
00177                              "4 58 59 63 62\n"
00178                              "\n"
00179                              "4  0  1 17 16\n"  // -y face (y == 0)
00180                              "4  1  2 18 17\n"
00181                              "4  2  3 19 18\n"
00182                              "4 16 17 33 32\n"
00183                              "4 17 18 34 33\n"
00184                              "4 18 19 35 34\n"
00185                              "4 32 33 49 48\n"
00186                              "4 33 34 50 49\n"
00187                              "4 34 35 51 50\n"
00188                              "\n"
00189                              "4 13 12 28 29\n"  // +y face (y == 3)
00190                              "4 14 13 29 30\n"
00191                              "4 15 14 30 31\n"
00192                              "4 29 28 44 45\n"
00193                              "4 30 29 45 46\n"
00194                              "4 31 30 46 47\n"
00195                              "4 45 44 60 61\n"
00196                              "4 46 45 61 62\n"
00197                              "4 47 46 62 63\n"
00198                              "\n"
00199                              "4  4  0 16 20\n"  // -x face (x == 0)
00200                              "4  8  4 20 24\n"
00201                              "4 12  8 24 28\n"
00202                              "4 20 16 32 36\n"
00203                              "4 24 20 36 40\n"
00204                              "4 28 24 40 44\n"
00205                              "4 36 32 48 52\n"
00206                              "4 40 36 52 56\n"
00207                              "4 44 40 56 60\n"
00208                              "\n"
00209                              "4  3  7 23 19\n"  // +x face (x == 3)
00210                              "4  7 11 27 23\n"
00211                              "4 11 15 31 27\n"
00212                              "4 19 23 39 35\n"
00213                              "4 23 27 43 39\n"
00214                              "4 27 31 47 43\n"
00215                              "4 35 39 55 51\n"
00216                              "4 39 43 59 55\n"
00217                              "4 43 47 63 59\n"
00218                              "\n";
00219     // hexahedron connectivity
00220     const int num_hexes   = 3 * 3 * 3;
00221     const char hex_data[] = "8  0  1  5  4 16 17 21 20\n"
00222                             "8  1  2  6  5 17 18 22 21\n"
00223                             "8  2  3  7  6 18 19 23 22\n"
00224                             "8  4  5  9  8 20 21 25 24\n"
00225                             "8  5  6 10  9 21 22 26 25\n"
00226                             "8  6  7 11 10 22 23 27 26\n"
00227                             "8  8  9 13 12 24 25 29 28\n"
00228                             "8  9 10 14 13 25 26 30 29\n"
00229                             "8 10 11 15 14 26 27 31 30\n"
00230                             "\n"
00231                             "8 16 17 21 20 32 33 37 36\n"
00232                             "8 17 18 22 21 33 34 38 37\n"
00233                             "8 18 19 23 22 34 35 39 38\n"
00234                             "8 20 21 25 24 36 37 41 40\n"
00235                             "8 21 22 26 25 37 38 42 41\n"
00236                             "8 22 23 27 26 38 39 43 42\n"
00237                             "8 24 25 29 28 40 41 45 44\n"
00238                             "8 25 26 30 29 41 42 46 45\n"
00239                             "8 26 27 31 30 42 43 47 46\n"
00240                             "\n"
00241                             "8 32 33 37 36 48 49 53 52\n"
00242                             "8 33 34 38 37 49 50 54 53\n"
00243                             "8 34 35 39 38 50 51 55 54\n"
00244                             "8 36 37 41 40 52 53 57 56\n"
00245                             "8 37 38 42 41 53 54 58 57\n"
00246                             "8 38 39 43 42 54 55 59 58\n"
00247                             "8 40 41 45 44 56 57 61 60\n"
00248                             "8 41 42 46 45 57 58 62 61\n"
00249                             "8 42 43 47 46 58 59 63 62\n"
00250                             "\n";
00251     // a few interior quads
00252     const int num_interior_quads    = 3;
00253     const char interior_quad_data[] = "4  1  5 25 17\n"
00254                                       "4  4  5 25 24\n"
00255                                       "4 16 17 25 24\n"
00256                                       "\n";
00257 
00258     const char filename[] = "dctest.vtk";
00259     FILE* file            = fopen( filename, "w" );
00260     fputs( "# vtk DataFile Version 2.0\n", file );
00261     fputs( "Mesquite Mesh\n", file );
00262     fputs( "ASCII\n", file );
00263     fputs( "DATASET UNSTRUCTURED_GRID\n", file );
00264     fputs( vertex_data, file );
00265 
00266     int num_elem      = num_quads + num_hexes + num_interior_quads;
00267     int num_elem_data = 5 * num_quads + 9 * num_hexes * 5 * num_interior_quads;
00268     fprintf( file, "CELLS %d %d\n", num_elem, num_elem_data );
00269     fputs( quad_data, file );
00270     fputs( hex_data, file );
00271     fputs( interior_quad_data, file );
00272     fprintf( file, "CELL_TYPES %d\n", num_elem );
00273     for( int i = 0; i < num_quads; ++i )
00274         fputs( "9\n", file );
00275     for( int i = 0; i < num_hexes; ++i )
00276         fputs( "12\n", file );
00277     for( int i = 0; i < num_interior_quads; ++i )
00278         fputs( "9\n", file );
00279 
00280     fclose( file );
00281     MsqPrintError err( std::cerr );
00282     myMesh.read_vtk( filename, err );
00283     remove( filename );
00284     CPPUNIT_ASSERT( !err );
00285 
00286     std::vector< Mesh::VertexHandle > verts;
00287     std::vector< Mesh::ElementHandle > elems;
00288     myMesh.get_all_vertices( verts, err );
00289     CPPUNIT_ASSERT( !err );
00290     CPPUNIT_ASSERT_EQUAL( (size_t)64, verts.size() );
00291     myMesh.get_all_elements( elems, err );
00292     CPPUNIT_ASSERT( !err );
00293     CPPUNIT_ASSERT_EQUAL( (size_t)num_elem, elems.size() );
00294 
00295     // define point domains
00296     PointDomain* pdom[8];
00297     pdom[0]         = new PointDomain( Vector3D( 0, 0, 0 ) );
00298     pdom[1]         = new PointDomain( Vector3D( 3, 0, 0 ) );
00299     pdom[2]         = new PointDomain( Vector3D( 0, 3, 0 ) );
00300     pdom[3]         = new PointDomain( Vector3D( 3, 3, 0 ) );
00301     pdom[4]         = new PointDomain( Vector3D( 0, 0, 3 ) );
00302     pdom[5]         = new PointDomain( Vector3D( 3, 0, 3 ) );
00303     pdom[6]         = new PointDomain( Vector3D( 0, 3, 3 ) );
00304     pdom[7]         = new PointDomain( Vector3D( 3, 3, 3 ) );
00305     size_t pdidx[8] = { 0, 3, 12, 15, 48, 51, 60, 63 };
00306     for( unsigned i = 0; i < 8; ++i )
00307     {
00308         MsqVertex coords;
00309         Mesh::VertexHandle h = verts[pdidx[i]];
00310         myMesh.vertices_get_coordinates( &h, &coords, 1, err );
00311         CPPUNIT_ASSERT( !err );
00312         CPPUNIT_ASSERT_VECTORS_EQUAL( pdom[i]->geom(), coords, 1e-6 );
00313         DomSet set;
00314         set.domain = pdom[i];
00315         set.vertices.push_back( h );
00316         myDomains.push_back( set );
00317         domainDims.push_back( 0 );
00318     }
00319 
00320     // define line domains
00321     LineDomain* ldom[12];
00322     ldom[0]             = new LineDomain( Vector3D( 0, 0, 0 ), Vector3D( 1, 0, 0 ) );  // y=0,z=0
00323     ldom[1]             = new LineDomain( Vector3D( 0, 3, 0 ), Vector3D( 1, 0, 0 ) );  // y=3,z=0
00324     ldom[2]             = new LineDomain( Vector3D( 0, 0, 3 ), Vector3D( 1, 0, 0 ) );  // y=0,z=3
00325     ldom[3]             = new LineDomain( Vector3D( 0, 3, 3 ), Vector3D( 1, 0, 0 ) );  // y=3,z=3
00326     ldom[4]             = new LineDomain( Vector3D( 0, 0, 0 ), Vector3D( 0, 1, 0 ) );  // x=0,z=0
00327     ldom[5]             = new LineDomain( Vector3D( 3, 0, 0 ), Vector3D( 0, 1, 0 ) );  // x=3,z=0
00328     ldom[6]             = new LineDomain( Vector3D( 0, 0, 3 ), Vector3D( 0, 1, 0 ) );  // x=0,z=3
00329     ldom[7]             = new LineDomain( Vector3D( 3, 0, 3 ), Vector3D( 0, 1, 0 ) );  // x=3,z=3
00330     ldom[8]             = new LineDomain( Vector3D( 0, 0, 0 ), Vector3D( 0, 0, 1 ) );  // x=0,y=0
00331     ldom[9]             = new LineDomain( Vector3D( 3, 0, 0 ), Vector3D( 0, 0, 1 ) );  // x=3,y=0
00332     ldom[10]            = new LineDomain( Vector3D( 0, 3, 0 ), Vector3D( 0, 0, 1 ) );  // x=0,y=3
00333     ldom[11]            = new LineDomain( Vector3D( 3, 3, 0 ), Vector3D( 0, 0, 1 ) );  // x=3,y=3
00334     size_t ldidx[12][2] = { { 1, 2 },   { 13, 14 }, { 49, 50 }, { 61, 62 }, { 4, 8 },   { 7, 11 },
00335                             { 52, 56 }, { 55, 59 }, { 16, 32 }, { 19, 35 }, { 28, 44 }, { 31, 47 } };
00336     for( unsigned i = 0; i < 12; ++i )
00337     {
00338         Mesh::VertexHandle v[2];
00339         v[0] = verts[ldidx[i][0]];
00340         v[1] = verts[ldidx[i][1]];
00341         MsqVertex coords[2];
00342         myMesh.vertices_get_coordinates( v, coords, 2, err );
00343         CPPUNIT_ASSERT( !err );
00344         CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, ldom[i]->geom().distance( coords[0] ), 1e-6 );
00345         CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, ldom[i]->geom().distance( coords[1] ), 1e-6 );
00346         DomSet set;
00347         set.domain = ldom[i];
00348         set.vertices.push_back( v[0] );
00349         set.vertices.push_back( v[1] );
00350         myDomains.push_back( set );
00351         domainDims.push_back( 1 );
00352     }
00353 
00354     // define planar domains
00355     PlanarDomain* sdom[6];
00356     sdom[0]            = new PlanarDomain( Vector3D( 0, 0, -1 ), Vector3D( 0, 0, 0 ) );
00357     sdom[1]            = new PlanarDomain( Vector3D( 0, 0, 1 ), Vector3D( 0, 0, 3 ) );
00358     sdom[2]            = new PlanarDomain( Vector3D( 0, -1, 0 ), Vector3D( 0, 0, 0 ) );
00359     sdom[3]            = new PlanarDomain( Vector3D( 0, 1, 0 ), Vector3D( 0, 3, 0 ) );
00360     sdom[4]            = new PlanarDomain( Vector3D( -1, 0, 0 ), Vector3D( 0, 0, 0 ) );
00361     sdom[5]            = new PlanarDomain( Vector3D( 1, 0, 0 ), Vector3D( 3, 0, 0 ) );
00362     size_t sdidx[6][4] = { { 5, 6, 9, 10 },    { 53, 54, 57, 58 }, { 17, 18, 33, 34 },
00363                            { 29, 30, 45, 46 }, { 20, 24, 36, 40 }, { 23, 27, 39, 43 } };
00364     for( unsigned i = 0; i < 6; ++i )
00365     {
00366         DomSet set;
00367         set.domain = sdom[i];
00368         for( unsigned j = 0; j < 4; ++j )
00369             set.vertices.push_back( verts[sdidx[i][j]] );
00370         for( unsigned j = 0; j < 9; ++j )
00371             set.elements.push_back( elems[9 * i + j] );
00372         myDomains.push_back( set );
00373         domainDims.push_back( 2 );
00374     }
00375 
00376     //  for (unsigned i = 0; i < myDomains.size(); ++i)
00377     //    print_domain( i, myDomains[i] );
00378 }
00379 
00380 void DomainClassifierTest::tearDown()
00381 {
00382     myMesh.clear();
00383     while( !myDomains.empty() )
00384     {
00385         delete myDomains.back().domain;
00386         myDomains.pop_back();
00387     }
00388     domainDims.clear();
00389 }
00390 
00391 void DomainClassifierTest::check_domain( DomainClassifier& domain )
00392 {
00393     std::vector< Mesh::VertexHandle > vertices, cverts;
00394     std::vector< Mesh::ElementHandle > elements, celems;
00395 
00396     // Check that, for each entity with a domain, the
00397     // DomainClassifier instance returns that domain.
00398     // Also, put all entities with domains into cverts and
00399     // celems for later.
00400     for( unsigned i = 0; i < myDomains.size(); ++i )
00401     {
00402         for( unsigned j = 0; j < myDomains[i].vertices.size(); ++j )
00403         {
00404             Mesh::VertexHandle v  = myDomains[i].vertices[j];
00405             const MeshDomain* ptr = domain.find_vertex_domain( v );
00406             CPPUNIT_ASSERT( myDomains[i].domain == ptr );
00407             cverts.push_back( v );
00408         }
00409         for( unsigned k = 0; k < myDomains[i].elements.size(); ++k )
00410         {
00411             Mesh::ElementHandle e = myDomains[i].elements[k];
00412             const MeshDomain* ptr = domain.find_element_domain( e );
00413             CPPUNIT_ASSERT( myDomains[i].domain == ptr );
00414             celems.push_back( e );
00415         }
00416     }
00417 
00418     // sort cverts and celems so we can do binary_search later
00419     std::sort( cverts.begin(), cverts.end() );
00420     std::sort( celems.begin(), celems.end() );
00421     // get all vertices and elements in mesh
00422     MsqPrintError err( std::cerr );
00423     myMesh.get_all_vertices( vertices, err );
00424     CPPUNIT_ASSERT( !err );
00425     myMesh.get_all_elements( elements, err );
00426     CPPUNIT_ASSERT( !err );
00427 
00428     // For each vertex not in a domain (not in cverts), make sure
00429     // that the domain is NULL.
00430     for( size_t i = 0; i < vertices.size(); ++i )
00431     {
00432         if( std::binary_search( cverts.begin(), cverts.end(), vertices[i] ) ) continue;
00433 
00434         const MeshDomain* ptr = domain.find_vertex_domain( vertices[i] );
00435         CPPUNIT_ASSERT( NULL == ptr );
00436     }
00437     // For each element not in a domain (not in celems), make sure
00438     // that the domain is NULL.
00439     for( size_t i = 0; i < elements.size(); ++i )
00440     {
00441         if( std::binary_search( celems.begin(), celems.end(), elements[i] ) ) continue;
00442 
00443         const MeshDomain* ptr = domain.find_element_domain( elements[i] );
00444         CPPUNIT_ASSERT( NULL == ptr );
00445     }
00446 }
00447 
00448 void DomainClassifierTest::test_classify_by_handle()
00449 {
00450     MsqPrintError err( std::cerr );
00451     DomainClassifier domain;
00452     DomainClassifier::classify_by_handle( domain, &myMesh, arrptr( myDomains ), myDomains.size(), err );
00453     CPPUNIT_ASSERT( !err );
00454 
00455     check_domain( domain );
00456 }
00457 
00458 void DomainClassifierTest::test_valid_classification()
00459 {
00460     MsqPrintError err( std::cerr );
00461     DomainClassifier domain;
00462     DomainClassifier::classify_by_handle( domain, &myMesh, arrptr( myDomains ), myDomains.size(), err );
00463     CPPUNIT_ASSERT( !err );
00464 
00465     domain.test_valid_classification( &myMesh, err );
00466     CPPUNIT_ASSERT( !err );
00467 }
00468 
00469 void DomainClassifierTest::test_classify_by_tag()
00470 {
00471     CPPUNIT_ASSERT( !myDomains.empty() );
00472 
00473     MsqPrintError err( std::cerr );
00474     int def       = myDomains.size();
00475     TagHandle tag = myMesh.tag_create( "domain", Mesh::INT, 1, &def, err );
00476     CPPUNIT_ASSERT( !err );
00477 
00478     std::vector< MeshDomain* > dom_list;
00479     std::vector< int > id_list;
00480     for( unsigned i = 0; i < myDomains.size(); ++i )
00481     {
00482         std::vector< int > vtx_data( myDomains[i].vertices.size(), i );
00483         std::vector< int > elm_data( myDomains[i].elements.size(), i );
00484         if( !vtx_data.empty() )
00485         {
00486             myMesh.tag_set_vertex_data( tag, vtx_data.size(), &( myDomains[i].vertices[0] ), arrptr( vtx_data ), err );
00487             CPPUNIT_ASSERT( !err );
00488         }
00489         if( !elm_data.empty() )
00490         {
00491             myMesh.tag_set_element_data( tag, elm_data.size(), &( myDomains[i].elements[0] ), arrptr( elm_data ), err );
00492             CPPUNIT_ASSERT( !err );
00493         }
00494 
00495         dom_list.push_back( myDomains[i].domain );
00496         id_list.push_back( i );
00497     }
00498 
00499     DomainClassifier domain;
00500     DomainClassifier::classify_by_tag( domain, &myMesh, "domain", arrptr( dom_list ), arrptr( id_list ),
00501                                        myDomains.size(), err );
00502     CPPUNIT_ASSERT( !err );
00503 
00504     check_domain( domain );
00505 }
00506 
00507 void DomainClassifierTest::test_classify_skin()
00508 {
00509     CPPUNIT_ASSERT( !myDomains.empty() );
00510 
00511     MsqPrintError err( std::cerr );
00512     std::vector< MeshDomain* > arr( myDomains.size() );
00513     for( size_t i = 0; i < myDomains.size(); ++i )
00514         arr[i] = myDomains[i].domain;
00515 
00516     DomainClassifier domain;
00517     DomainClassifier::classify_skin_geometrically( domain, &myMesh, 1e-6, arrptr( arr ), arrptr( domainDims ),
00518                                                    arr.size(), err );
00519     CPPUNIT_ASSERT( !err );
00520 
00521     check_domain( domain );
00522 }
00523 
00524 void DomainClassifierTest::test_classify_by_geometry()
00525 {
00526     CPPUNIT_ASSERT( !myDomains.empty() );
00527 
00528     MsqPrintError err( std::cerr );
00529     std::vector< MeshDomain* > arr( myDomains.size() );
00530     for( size_t i = 0; i < myDomains.size(); ++i )
00531         arr[i] = myDomains[i].domain;
00532 
00533     DomainClassifier domain;
00534     DomainClassifier::classify_geometrically( domain, &myMesh, 1e-6, arrptr( arr ), arrptr( domainDims ), arr.size(),
00535                                               err );
00536     CPPUNIT_ASSERT( !err );
00537 
00538     check_domain( domain );
00539 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines