MeshKit  1.0
test_extrudemesh.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines