MeshKit
1.0
|
00001 00007 #include "meshkit/MKCore.hpp" 00008 #include "meshkit/MeshOp.hpp" 00009 #include "meshkit/ExtrudeMesh.hpp" 00010 #include "meshkit/ModelEnt.hpp" 00011 00012 using namespace MeshKit; 00013 00014 #include "TestUtil.hpp" 00015 #define DEFAULT_TEST_FILE "cube.cub" 00016 00017 MKCore *mk; 00018 00019 void test_load_and_extrude(); 00020 void test_extrude_quad(); 00021 void test_extrude_tri(); 00022 00023 void help_test_extrude_face(iMesh_EntityTopology topo, double *coords, 00024 size_t nverts); 00025 00026 int main(int argc, char **argv) 00027 { 00028 mk = new MKCore(); 00029 int num_fail = 0; 00030 00031 num_fail += RUN_TEST(test_load_and_extrude); 00032 num_fail += RUN_TEST(test_extrude_quad); 00033 num_fail += RUN_TEST(test_extrude_tri); 00034 00035 delete mk; 00036 return num_fail; 00037 } 00038 00039 void clear_mesh(MKCore *mk) 00040 { 00041 iMesh *mesh = mk->imesh_instance(); 00042 std::vector<iMesh::EntityHandle> ents; 00043 mesh->getEntities(mesh->getRootSet(), iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, 00044 ents); 00045 mesh->deleteEntArr(&ents[0], ents.size()); 00046 } 00047 00048 void test_load_and_extrude() 00049 { 00050 clear_mesh(mk); 00051 std::string filename = TestDir + "/" + DEFAULT_TEST_FILE; 00052 mk->load_mesh(filename.c_str()); 00053 00054 // populate mesh with no attached geometry or relations 00055 mk->populate_model_ents(-1, 0, -1); 00056 00057 // get the hexes 00058 MEntVector vols; 00059 mk->get_entities_by_dimension(2, vols); 00060 00061 ExtrudeMesh *em = (ExtrudeMesh*) mk->construct_meshop("ExtrudeMesh", vols); 00062 em->set_name("extrude_mesh"); 00063 00064 // some entity tag types are always copy or expand 00065 em->expand_sets().add_tag("MATERIAL_SET"); 00066 em->expand_sets().add_tag("DIRICHLET_SET"); 00067 em->expand_sets().add_tag("NEUMANN_SET"); 00068 00069 Vector<3> dx; dx[0] = 10; dx[1] = 0; dx[2] = 0; 00070 em->set_transform(Extrude::Translate(dx, 5)); 00071 00072 // put them in the graph 00073 mk->get_graph().addArc(mk->root_node()->get_node(), em->get_node()); 00074 mk->get_graph().addArc(em->get_node(), mk->leaf_node()->get_node()); 00075 00076 // mesh embedded boundary mesh, by calling execute 00077 mk->setup_and_execute(); 00078 00079 delete em; 00080 } 00081 00082 00083 void help_test_extrude_face(iMesh_EntityTopology topo, double *coords, 00084 size_t nverts) 00085 { 00086 clear_mesh(mk); 00087 00088 iMesh *mesh = mk->imesh_instance(); 00089 00090 std::vector<iMesh::EntityHandle> verts(nverts); 00091 iMesh::EntityHandle face; 00092 iMesh::EntitySetHandle set; 00093 00094 mesh->createVtxArr(nverts, iBase_INTERLEAVED, coords, &verts[0]); 00095 mesh->createEnt(topo, &verts[0], nverts, face); 00096 mesh->createEntSet(true, set); 00097 mesh->addEntToSet(face, set); 00098 00099 ModelEnt me(mk, iBase_EntitySetHandle(0), /*igeom instance*/0, 00100 (moab::EntityHandle)set); 00101 MEntVector selection; 00102 selection.push_back(&me); 00103 00104 ExtrudeMesh *em = (ExtrudeMesh*) mk->construct_meshop("ExtrudeMesh", 00105 selection); 00106 em->set_name("extrude_mesh"); 00107 00108 Vector<3> dx; dx[0] = 0; dx[1] = 0; dx[2] = 10; 00109 em->set_transform(Extrude::Translate(dx, 10)); 00110 em->copy_faces(true); 00111 00112 // put them in the graph 00113 mk->get_graph().addArc(mk->root_node()->get_node(), em->get_node()); 00114 mk->get_graph().addArc(em->get_node(), mk->leaf_node()->get_node()); 00115 00116 em->copy_sets().add_set(set); 00117 em->extrude_sets().add_set(set); 00118 00119 // mesh embedded boundary mesh, by calling execute 00120 mk->setup_and_execute(); 00121 00122 std::vector<iMesh::EntityHandle> new_verts; 00123 std::vector<double> new_coords(nverts*3); 00124 std::vector<iMesh::EntityHandle> new_face; 00125 iMesh::EntitySetHandle copy_set; 00126 00127 mesh->getEntSetEHData(set, em->copy_tag(), (iMesh::EntityHandle&)copy_set); 00128 00129 mesh->getEntities(copy_set, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, new_face); 00130 CHECK_EQUAL(new_face.size(), size_t(1)); 00131 00132 mesh->getEntAdj(new_face[0], iBase_VERTEX, new_verts); 00133 CHECK_EQUAL(new_verts.size(), nverts); 00134 00135 mesh->getVtxArrCoords(&new_verts[0], new_verts.size(), iBase_INTERLEAVED, 00136 &new_coords[0]); 00137 00138 for(size_t i=0; i<nverts; i++) { 00139 CHECK_REAL_EQUAL(coords[i*3+0], new_coords[i*3+0], 0.00001); 00140 CHECK_REAL_EQUAL(coords[i*3+1], new_coords[i*3+1], 0.00001); 00141 CHECK_REAL_EQUAL(coords[i*3+2]+10, new_coords[i*3+2], 0.00001); 00142 } 00143 00144 iMesh::EntitySetHandle extrude_set; 00145 int n; 00146 mesh->getEntSetEHData(set, em->extrude_tag(), 00147 (iMesh::EntityHandle&)extrude_set); 00148 mesh->getNumOfType(extrude_set, iBase_ALL_TYPES, n); 00149 CHECK_EQUAL(n, 10); 00150 00151 00152 delete em; 00153 } 00154 00155 void test_extrude_quad() 00156 { 00157 double coords[] = { 00158 0, 0, 0, 00159 1, 0, 0, 00160 1, 1, 0, 00161 0, 1, 0 00162 }; 00163 00164 help_test_extrude_face(iMesh_QUADRILATERAL, coords, 4); 00165 } 00166 00167 void test_extrude_tri() 00168 { 00169 double coords[] = { 00170 0, 0, 0, 00171 1, 0, 0, 00172 1, 1, 0 00173 }; 00174 00175 help_test_extrude_face(iMesh_TRIANGLE, coords, 3); 00176 }