Sierra Toolkit Version of the Day
UnitTestPartRepository.cpp
00001 /*------------------------------------------------------------------------*/
00002 /*                 Copyright 2010 Sandia Corporation.                     */
00003 /*  Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive   */
00004 /*  license for use of this work by or on behalf of the U.S. Government.  */
00005 /*  Export of this program may require a license from the                 */
00006 /*  United States Government.                                             */
00007 /*------------------------------------------------------------------------*/
00008 
00009 
00010 #include <stdexcept>
00011 #include <stk_util/unit_test_support/stk_utest_macros.hpp>
00012 
00013 #include <stk_mesh/baseImpl/PartRepository.hpp>
00014 #include <stk_mesh/base/MetaData.hpp>
00015 
00016 #include <stk_util/parallel/Parallel.hpp>
00017 
00018 
00019 
00020 namespace {
00021 
00022 STKUNIT_UNIT_TEST( UnitTestPartRepository, construct )
00023 {
00024   std::vector<std::string> entity_rank_names;
00025   entity_rank_names.push_back("node");
00026   entity_rank_names.push_back("element");
00027   stk::mesh::MetaData meta(entity_rank_names);
00028   stk::mesh::impl::PartRepository partRepo(&meta);
00029   stk::mesh::Part * universal_part = partRepo.universal_part();
00030   STKUNIT_EXPECT_TRUE( universal_part != NULL );
00031 }
00032 
00033 STKUNIT_UNIT_TEST( UnitTestPartRepository, universal_in_subset )
00034 {
00035   std::vector<std::string> entity_rank_names;
00036   entity_rank_names.push_back("node");
00037   entity_rank_names.push_back("element");
00038   stk::mesh::MetaData meta(entity_rank_names);
00039   stk::mesh::impl::PartRepository partRepo(&meta);
00040   stk::mesh::Part * universal_part = partRepo.universal_part();
00041   stk::mesh::Part * part_A = partRepo.declare_part("A",0);
00042   STKUNIT_ASSERT_THROW(
00043     partRepo.declare_subset(*part_A,*universal_part),
00044     std::runtime_error
00045     );
00046 }
00047 
00048 
00049 STKUNIT_UNIT_TEST( UnitTestPartRepository, subset_equal_superset )
00050 {
00051   std::vector<std::string> entity_rank_names;
00052   entity_rank_names.push_back("node");
00053   entity_rank_names.push_back("element");
00054   stk::mesh::MetaData meta(entity_rank_names);
00055   stk::mesh::impl::PartRepository partRepo(&meta);
00056   stk::mesh::Part * part_A = partRepo.declare_part("A",0);
00057   STKUNIT_ASSERT_THROW(
00058     partRepo.declare_subset(*part_A,*part_A),
00059     std::runtime_error
00060     );
00061 }
00062 
00063 
00064 STKUNIT_UNIT_TEST( UnitTestPartRepository, universal_in_intersection )
00065 {
00066   std::vector<std::string> entity_rank_names;
00067   entity_rank_names.push_back("node");
00068   entity_rank_names.push_back("element");
00069   stk::mesh::MetaData meta(entity_rank_names);
00070   stk::mesh::impl::PartRepository partRepo(&meta);
00071   stk::mesh::Part * universal_part = partRepo.universal_part();
00072   stk::mesh::Part * part_A = partRepo.declare_part("A",0);
00073   std::vector<stk::mesh::Part *> intersection;
00074   intersection.push_back(universal_part);
00075   STKUNIT_ASSERT_THROW(
00076     partRepo.declare_part(intersection),
00077     std::runtime_error
00078     );
00079   intersection.push_back(part_A);
00080   STKUNIT_ASSERT_THROW(
00081     partRepo.declare_part(intersection),
00082     std::runtime_error
00083     );
00084 }
00085 
00086 
00087 STKUNIT_UNIT_TEST( UnitTestPartRepository, circular_subset )
00088 {
00089   std::vector<std::string> entity_rank_names;
00090   entity_rank_names.push_back("node");
00091   entity_rank_names.push_back("element");
00092   stk::mesh::MetaData meta(entity_rank_names);
00093   stk::mesh::impl::PartRepository partRepo(&meta);
00094   stk::mesh::Part * part_A = partRepo.declare_part("A",0);
00095   stk::mesh::Part * part_B = partRepo.declare_part("B",0);
00096   stk::mesh::Part * part_C = partRepo.declare_part("C",0);
00097   partRepo.declare_subset(*part_A,*part_B);
00098   partRepo.declare_subset(*part_B,*part_C);
00099   STKUNIT_ASSERT_THROW(
00100     partRepo.declare_subset(*part_C,*part_A),
00101     std::runtime_error
00102     );
00103 }
00104 
00105 
00106 STKUNIT_UNIT_TEST( UnitTestPartRepository, inconsistent_rank_subset )
00107 {
00108   std::vector<std::string> entity_rank_names;
00109   entity_rank_names.push_back("node");
00110   entity_rank_names.push_back("element");
00111   stk::mesh::MetaData meta(entity_rank_names);
00112   stk::mesh::impl::PartRepository partRepo(&meta);
00113   stk::mesh::Part * part_A = partRepo.declare_part("A",0);
00114   stk::mesh::Part * part_B = partRepo.declare_part("B",1);
00115   // lower rank cannot contain higher rank:
00116   STKUNIT_ASSERT_THROW(
00117     partRepo.declare_subset(*part_A,*part_B),
00118     std::runtime_error
00119     );
00120   // higher rank can contain lower rank:
00121   STKUNIT_ASSERT_NO_THROW(
00122     partRepo.declare_subset(*part_B,*part_A)
00123     );
00124 }
00125 
00126 STKUNIT_UNIT_TEST( UnitTestPartRepository, two_part_repositories )
00127 {
00128   std::vector<std::string> entity_rank_names;
00129   entity_rank_names.push_back("node");
00130   entity_rank_names.push_back("element");
00131   stk::mesh::MetaData meta(entity_rank_names);
00132   stk::mesh::impl::PartRepository partRepo_1(&meta);
00133   stk::mesh::Part * part_1_A = partRepo_1.declare_part("A",0);
00134   stk::mesh::Part * part_1_B = partRepo_1.declare_part("B",0);
00135   stk::mesh::impl::PartRepository partRepo_2(&meta);
00136   stk::mesh::Part * part_2_A = partRepo_2.declare_part("A",0);
00137   // subset/superset parts must come from same part repository
00138   STKUNIT_ASSERT_THROW(
00139     partRepo_1.declare_subset(*part_1_A,*part_2_A),
00140     std::runtime_error
00141     );
00142 
00143   // intersection contains parts from another part repository
00144   {
00145     std::vector<stk::mesh::Part *> intersection;
00146     intersection.push_back(part_1_A);
00147     intersection.push_back(part_1_B);
00148     STKUNIT_ASSERT_THROW(
00149         partRepo_2.declare_part( intersection ),
00150         std::runtime_error
00151         );
00152   }
00153   // intersection contains parts from multiple part repositories
00154   {
00155     std::vector<stk::mesh::Part *> intersection;
00156     intersection.push_back(part_1_A);
00157     intersection.push_back(part_2_A);
00158     STKUNIT_ASSERT_THROW(
00159         partRepo_1.declare_part( intersection ),
00160         std::runtime_error
00161         );
00162   }
00163 }
00164 
00165 STKUNIT_UNIT_TEST( UnitTestPartRepository, invalid_relation )
00166 {
00167   std::vector<std::string> entity_rank_names;
00168   entity_rank_names.push_back("node");
00169   entity_rank_names.push_back("element");
00170   stk::mesh::MetaData meta(entity_rank_names);
00171   stk::mesh::impl::PartRepository partRepo(&meta);
00172   stk::mesh::Part * part_A = partRepo.declare_part("A",0);
00173   stk::mesh::Part * part_B = partRepo.declare_part("B",0);
00174   stk::mesh::PartRelation relation;
00175   relation.m_root = part_B;
00176   relation.m_target = part_A;
00177   STKUNIT_ASSERT_THROW(
00178       partRepo.declare_part_relation( *part_A, relation, *part_B ),
00179       std::runtime_error
00180       );
00181 }
00182 } // namespace 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends