|
Sierra Toolkit Version of the Day
|
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