MOAB: Mesh Oriented datABase  (version 5.2.1)
test_determinism.cpp
Go to the documentation of this file.
00001 /**
00002  * MOAB, a Mesh-Oriented datABase, is a software component for creating,
00003  * storing and accessing finite element mesh data.
00004  *
00005  * Copyright 2004 Sandia Corporation.  Under the terms of Contract
00006  * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
00007  * retains certain rights in 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  */
00015 
00016 #ifdef WIN32
00017 #ifdef _DEBUG
00018 // turn off warnings that say they debugging identifier has been truncated
00019 // this warning comes up when using some STL containers
00020 #pragma warning( disable : 4786 )
00021 #endif
00022 #endif
00023 
00024 #include <iostream>
00025 #include "moab/Core.hpp"
00026 #include "TestUtil.hpp"
00027 
00028 #ifndef IS_BUILDING_MB
00029 #define IS_BUILDING_MB
00030 #endif
00031 
00032 #include "Internals.hpp"
00033 #include "TestUtil.hpp"
00034 
00035 using namespace moab;
00036 
00037 int main()
00038 {
00039     Interface* iface0 = new Core;
00040     Interface* iface1 = new Core;
00041 
00042     std::string filename = TestDir + "/tet_brick.vtk";
00043 
00044     ErrorCode err;
00045     err = iface0->load_file( filename.c_str() );CHECK_ERR( err );
00046     err = iface1->load_file( filename.c_str() );CHECK_ERR( err );
00047 
00048     Range tets0, verts0, edges0, edges1, tris0, tris1;
00049     err = iface0->get_entities_by_dimension( 0, 3, tets0 );CHECK_ERR( err );
00050     err = iface0->get_adjacencies( tets0, 1, true, edges0, Interface::UNION );CHECK_ERR( err );
00051     err = iface1->get_adjacencies( tets0, 1, true, edges1, Interface::UNION );CHECK_ERR( err );
00052     CHECK_EQUAL( edges0, edges1 );
00053     err = iface0->get_adjacencies( tets0, 2, true, tris0, Interface::UNION );CHECK_ERR( err );
00054     err = iface1->get_adjacencies( tets0, 2, true, tris1, Interface::UNION );CHECK_ERR( err );
00055     CHECK_EQUAL( tris0, tris1 );
00056 
00057     std::vector< EntityHandle > conn_squence;
00058 
00059     // At that point iface0 and iface1 should have the same entity handler
00060     // associated with entities, so we can use one or another, no difference.
00061 
00062     int repeat = 0;
00063     for( ; repeat != 3; repeat++ )
00064     {
00065 
00066         std::vector< EntityHandle > conn_seq;
00067 
00068         Range to_delete;
00069         // Build range of quad to delete form iface0
00070         int ii = 0;
00071         for( Range::iterator qit = tets0.begin(); qit != tets0.end(); qit++, ii++ )
00072         {
00073             if( ii % 3 )
00074             {
00075                 to_delete.insert( *qit );
00076                 const EntityHandle* conn;
00077                 int number_nodes = 0;
00078                 iface0->get_connectivity( *qit, conn, number_nodes );
00079                 conn_seq.insert( conn_seq.end(), conn, &conn[number_nodes] );
00080             }
00081         }
00082         // Buidl tange of edges to delete from iface1
00083         // Create gaps in sequence, to be filled later on.
00084         for( Range::iterator eit = edges1.begin(); eit != edges1.end(); eit++, ii++ )
00085         {
00086             if( ii % 3 ) { to_delete.insert( *eit ); }
00087         }
00088         for( Range::iterator eit = tris1.begin(); eit != tris1.end(); eit++, ii++ )
00089         {
00090             if( ii % 3 ) { to_delete.insert( *eit ); }
00091         }
00092 
00093         err = iface0->delete_entities( to_delete );
00094         err = iface1->delete_entities( to_delete );
00095 
00096         for( unsigned qq = 0; qq != conn_seq.size() / 4; qq++ )
00097         {
00098             EntityHandle q0, q1;
00099             err = iface1->create_element( MBTET, &conn_seq[4 * qq], 4, q1 );CHECK_ERR( err );
00100             err = iface0->create_element( MBTET, &conn_seq[4 * qq], 4, q0 );CHECK_ERR( err );
00101             CHECK( q0 == q1 );
00102         }
00103 
00104         tets0.clear();
00105         err = iface0->get_entities_by_dimension( 0, 3, tets0 );CHECK_ERR( err );
00106         Range tets1;
00107         err = iface1->get_entities_by_dimension( 0, 3, tets1 );CHECK_ERR( err );
00108         CHECK_EQUAL( tets0, tets1 );
00109 
00110         // Finally check adjacency, this finally check if code is deterministic
00111         for( Range::iterator tit = tets1.begin(); tit != tets1.end(); tit++ )
00112         {
00113             std::vector< EntityHandle > adj0, adj1;
00114             err = iface0->get_adjacencies( &*tit, 1, 1, true, adj0 );CHECK_ERR( err );
00115             err = iface1->get_adjacencies( &*tit, 1, 1, true, adj1 );CHECK_ERR( err );
00116             CHECK_EQUAL( adj0, adj1 );
00117         }
00118         for( Range::iterator tit = tets1.begin(); tit != tets1.end(); tit++ )
00119         {
00120             std::vector< EntityHandle > adj0, adj1;
00121             err = iface0->get_adjacencies( &*tit, 1, 2, true, adj0 );CHECK_ERR( err );
00122             err = iface1->get_adjacencies( &*tit, 1, 2, true, adj1 );CHECK_ERR( err );
00123             CHECK_EQUAL( adj0, adj1 );
00124         }
00125     }
00126 
00127     delete iface0;
00128     delete iface1;
00129 
00130     return 0;
00131 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines