void test_tags_retrieval() { iMesh_Instance mesh; int err; iMesh_newMesh("", &mesh, &err, 0); CHECK_EQUAL( iBase_SUCCESS, err ); iBase_EntitySetHandle root_set; iMesh_getRootSet(mesh, &root_set, &err); CHECK_EQUAL( iBase_SUCCESS, err ); // open a file with var len tags (sense tags) // they should be filtered out std::string filename = STRINGIFY(MESHDIR) "/PB.h5m"; iMesh_load(mesh, root_set, filename.c_str(), NULL, &err, filename.length(), 0); CHECK_EQUAL( iBase_SUCCESS, err ); iBase_EntitySetHandle* contained_set_handles = NULL; int contained_set_handles_allocated = 0; int contained_set_handles_size; // get all entity sets iMesh_getEntSets(mesh, root_set, 1, &contained_set_handles, &contained_set_handles_allocated, &contained_set_handles_size, &err ); CHECK_EQUAL( iBase_SUCCESS, err ); // get tags for all sets for (int i=0; i< contained_set_handles_size; i++) { iBase_TagHandle* tag_handles = NULL; int tag_handles_allocated=0; int tag_handles_size; iMesh_getAllEntSetTags (mesh, contained_set_handles[i], &tag_handles, &tag_handles_allocated, &tag_handles_size, &err); CHECK_EQUAL( iBase_SUCCESS, err ); for (int j=0; j<tag_handles_size; j++) { int tagSize; iMesh_getTagSizeValues(mesh, tag_handles[j], &tagSize, &err); CHECK_EQUAL( iBase_SUCCESS, err ); } free(tag_handles); } free (contained_set_handles); // Delete the iMesh instance iMesh_dtor(mesh, &err); CHECK_EQUAL(iBase_SUCCESS, err); return; }
void test_step_iter() { iMesh_Instance mesh; int err; iMesh_newMesh("", &mesh, &err, 0); CHECK_EQUAL( iBase_SUCCESS, err ); iBase_EntitySetHandle root_set; iMesh_getRootSet(mesh, &root_set, &err); CHECK_EQUAL( iBase_SUCCESS, err ); iBase_EntityHandle *verts = 0; int verts_alloc = 0, verts_size = 0; double coords[] = { 0,0,0, 1,1,1, 2,2,2, 3,3,3, 4,4,4, 5,5,5 }; iMesh_createVtxArr(mesh,6,iBase_INTERLEAVED,coords,18,&verts,&verts_alloc, &verts_size,&err); CHECK_EQUAL( iBase_SUCCESS, err ); /* make a non-array iterator and test stepping over it */ iBase_EntityIterator iter; int atend; iMesh_initEntIter( mesh, root_set, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, 0, &iter, &err ); CHECK_EQUAL( iBase_SUCCESS, err ); iMesh_stepEntIter(mesh, iter, 2, &atend, &err); CHECK_EQUAL( iBase_SUCCESS, err ); /* shouldn't be at end yet */ if (atend) CHECK_EQUAL( iBase_SUCCESS, iBase_FAILURE ); iMesh_stepEntIter(mesh, iter, 4, &atend, &err); CHECK_EQUAL( iBase_SUCCESS, err ); /* should be at end now */ if (!atend) CHECK_EQUAL( iBase_SUCCESS, iBase_FAILURE ); iMesh_endEntIter(mesh, iter, &err); CHECK_EQUAL( iBase_SUCCESS, err ); /* make an array iterator and test stepping over it */ iBase_EntityArrIterator arr_iter; iMesh_initEntArrIter( mesh, root_set, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, 6, 0, &arr_iter, &err ); CHECK_EQUAL( iBase_SUCCESS, err ); iMesh_stepEntArrIter(mesh, arr_iter, 2, &atend, &err); CHECK_EQUAL( iBase_SUCCESS, err ); /* shouldn't be at end yet */ if (atend) CHECK_EQUAL( iBase_SUCCESS, iBase_FAILURE ); iMesh_stepEntArrIter(mesh, arr_iter, 4, &atend, &err); CHECK_EQUAL( iBase_SUCCESS, err ); /* should be at end now */ if (!atend) CHECK_EQUAL( iBase_SUCCESS, iBase_FAILURE ); iMesh_endEntArrIter(mesh, arr_iter, &err); CHECK_EQUAL( iBase_SUCCESS, err ); iMesh_dtor(mesh,&err); CHECK_EQUAL( iBase_SUCCESS, err ); free(verts); }
void CESets::update_tagged_sets() { int err; iBase_EntitySetHandle root_set; iMesh_getRootSet(impl_, &root_set, &err); check_error(impl_, err); std::vector<tag_data>::const_iterator tag; for (tag = tags_.begin(); tag != tags_.end(); ++tag) { SimpleArray<iBase_EntitySetHandle> tmp_sets; iMesh_getEntSetsByTagsRec(impl_, root_set, &tag->tag, (tag->value ? &tag->value : NULL), 1, false, ARRAY_INOUT(tmp_sets), &err); check_error(impl_, err); sets_.insert(tmp_sets.begin(), tmp_sets.end()); } }
// This consistent interpolation example loads a linear quad mesh // tagged with a scalar field and interpolates it along with the gradient // pullback onto a delaunay tri mesh mesh. (Function domain = func_dmn, // function range = func_rng ) int main(int argc, char* argv[]) { // Setup communication. Teuchos::GlobalMPISession mpiSession(&argc,&argv); Teuchos::RCP<const Teuchos::Comm<int> > comm = Teuchos::DefaultComm<int>::getComm(); if ( getDefaultComm<int>()->getRank() == 0 ) // Force scalar execution. { int error; // The tensor template can be shared by both the range and // domain value. Teuchos::RCP<FOOD::TensorTemplate> tensor_template = Teuchos::rcp( new FOOD::TensorTemplate(0, 1, FOOD::FOOD_REAL, Teuchos::null) ); // Need another one for the gradient. Here the gradient is a 3-vector. Teuchos::RCP<FOOD::TensorTemplate> grad_tensor_template = Teuchos::rcp( new FOOD::TensorTemplate(1, 3, FOOD::FOOD_REAL, Teuchos::null) ); // Set up the func_dmn mesh. iMesh_Instance func_dmn_mesh; iMesh_newMesh("", &func_dmn_mesh, &error, 0); assert( iBase_SUCCESS == error ); iBase_EntitySetHandle func_dmn_root_set; iMesh_getRootSet( func_dmn_mesh, &func_dmn_root_set, &error ); assert( iBase_SUCCESS == error ); std::string func_dmn_mesh_filename = "tagged_quad_flat_surf.vtk"; iMesh_load( func_dmn_mesh, func_dmn_root_set, &func_dmn_mesh_filename[0], "", &error, (int) func_dmn_mesh_filename.size(), 0 ); assert( iBase_SUCCESS == error ); // Set up the func_dmn mesh field. Teuchos::RCP<FOOD::Domain> func_dmn_domain = Teuchos::rcp( new FOOD::Domain(func_dmn_mesh, func_dmn_root_set, FOOD::FOOD_MBCN) ); Teuchos::RCP< FOOD::DFuncKernel<double> > func_dmn_dfunckernel = Teuchos::rcp( new FOOD::DFuncKernel<double>( iBase_FACE, iMesh_QUADRILATERAL, iBase_VERTEX, iMesh_POINT, FOOD::FOOD_CARTESIAN, FOOD::FOOD_FEM, FOOD::FOOD_HGRAD, FOOD::FOOD_SHARDSCN, 2 ) ); Teuchos::RCP< FOOD::TensorField<double> > func_dmn_field = Teuchos::rcp( new FOOD::TensorField<double>( getDefaultComm<int>(), func_dmn_domain, func_dmn_dfunckernel, FOOD::FOOD_CARTESIAN, tensor_template, Teuchos::null, "FUNC_DMN_FIELD" ) ); std::string func_dmn_tag_name = "domain"; iBase_TagHandle func_dmn_tag; iMesh_getTagHandle( func_dmn_domain->getMesh(), &func_dmn_tag_name[0], &func_dmn_tag, &error, (int) func_dmn_tag_name.size() ); assert( iBase_SUCCESS == error ); func_dmn_field->attachToTagData( func_dmn_tag, error ); assert( iBase_SUCCESS == error ); // Set up the func_rng mesh. iMesh_Instance func_rng_mesh; iMesh_newMesh("", &func_rng_mesh, &error, 0); assert( iBase_SUCCESS == error ); iBase_EntitySetHandle func_rng_root_set; iMesh_getRootSet( func_rng_mesh, &func_rng_root_set, &error ); assert( iBase_SUCCESS == error ); std::string func_rng_mesh_filename = "tagged_delaunay_flat_surf.vtk"; iMesh_load( func_rng_mesh, func_rng_root_set, &func_rng_mesh_filename[0], "", &error, (int) func_rng_mesh_filename.size(), 0 ); assert( iBase_SUCCESS == error ); // Set up the func_rng mesh field for function values. Teuchos::RCP<FOOD::Domain> func_rng_domain = Teuchos::rcp( new FOOD::Domain(func_rng_mesh, func_rng_root_set, FOOD::FOOD_MBCN) ); Teuchos::RCP< FOOD::DFuncKernel<double> > func_rng_dfunckernel = Teuchos::rcp( new FOOD::DFuncKernel<double>( iBase_FACE, iMesh_TRIANGLE, iBase_VERTEX, iMesh_POINT, FOOD::FOOD_CARTESIAN, FOOD::FOOD_FEM, FOOD::FOOD_HGRAD, FOOD::FOOD_SHARDSCN, 1 ) ); Teuchos::RCP< FOOD::TensorField<double> > func_rng_field = Teuchos::rcp( new FOOD::TensorField<double>( getDefaultComm<int>(), func_rng_domain, func_rng_dfunckernel, FOOD::FOOD_CARTESIAN, tensor_template, Teuchos::null, "FUNC_RNG_FIELD" ) ); std::string func_rng_tag_name = "range"; iBase_TagHandle func_rng_tag; iMesh_getTagHandle( func_rng_domain->getMesh(), &func_rng_tag_name[0], &func_rng_tag, &error, (int) func_rng_tag_name.size() ); assert( iBase_SUCCESS == error ); func_rng_field->attachToTagData( func_rng_tag, error ); assert( iBase_SUCCESS == error ); // Setup the gradient field. Teuchos::RCP< FOOD::TensorField<double> > func_rng_grad_field = Teuchos::rcp( new FOOD::TensorField<double>( getDefaultComm<int>(), func_rng_domain, func_rng_dfunckernel, FOOD::FOOD_CARTESIAN, grad_tensor_template, Teuchos::null, "FUNC_RNG_GRAD_FIELD" ) ); std::string func_rng_grad_tag_name = "grad_range"; iBase_TagHandle func_rng_grad_tag; iMesh_getTagHandle( func_rng_domain->getMesh(), &func_rng_grad_tag_name[0], &func_rng_grad_tag, &error, (int) func_rng_grad_tag_name.size() ); assert( iBase_SUCCESS == error ); func_rng_grad_field->attachToTagData( func_rng_grad_tag, error ); assert( iBase_SUCCESS == error ); // Do interpolation. FOOD::ConsistentScheme<double> fem_interp_val( func_dmn_field, func_rng_field ); fem_interp_val.setup(); fem_interp_val.transferValueDF(); FOOD::ConsistentScheme<double> fem_interp_grad( func_dmn_field, func_rng_grad_field ); fem_interp_grad.setup(); fem_interp_grad.transferGradDF(); // Write the interpolated mesh to file. std::string interp_file = "flat_surf_output.vtk"; iMesh_save( func_rng_domain->getMesh(), func_rng_domain->getMeshSet(), &interp_file[0], "", &error, (int) interp_file.size(), 0 ); assert( iBase_SUCCESS == error ); } // end rank 0 return 0; }
void test_tag_iterate() { iMesh_Instance mesh; int err; iMesh_newMesh("", &mesh, &err, 0); CHECK_EQUAL( iBase_SUCCESS, err ); iBase_EntitySetHandle root_set, entset; iMesh_getRootSet(mesh, &root_set, &err); CHECK_EQUAL( iBase_SUCCESS, err ); iBase_EntityHandle *verts = 0; int verts_alloc = 0, verts_size = 0; double coords[] = { 0,0,0, 1,1,1, 2,2,2, 3,3,3, 4,4,4, 5,5,5 }; iMesh_createVtxArr(mesh,6,iBase_INTERLEAVED,coords,18,&verts,&verts_alloc, &verts_size,&err); CHECK_EQUAL( iBase_SUCCESS, err ); /* create an entity set with two subranges */ iMesh_createEntSet( mesh, 0, &entset, &err ); CHECK_EQUAL( iBase_SUCCESS, err ); iMesh_addEntArrToSet( mesh, verts, 2, entset, &err ); CHECK_EQUAL( iBase_SUCCESS, err ); iMesh_addEntArrToSet( mesh, &verts[3], 3, entset, &err ); CHECK_EQUAL( iBase_SUCCESS, err ); /* create a dbl tag and set vertices */ iBase_TagHandle tagh; iMesh_createTagWithOptions(mesh, "dum", "moab:TAG_STORAGE_TYPE=DENSE", 1, iBase_DOUBLE, &tagh, &err, 3, 27); CHECK_EQUAL( iBase_SUCCESS, err ); iMesh_setDblArrData(mesh, verts, 6, tagh, coords+3, 6, &err); CHECK_EQUAL( iBase_SUCCESS, err ); /* get an iterator over the root set, and check tag iterator for that */ iBase_EntityArrIterator iter; int count, atend; double *data; iMesh_initEntArrIter( mesh, root_set, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, 6, 0, &iter, &err ); CHECK_EQUAL( iBase_SUCCESS, err ); iMesh_tagIterate(mesh, tagh, iter, &data, &count, &err); CHECK_EQUAL( iBase_SUCCESS, err ); if (count != 6) CHECK_EQUAL( iBase_SUCCESS, iBase_FAILURE ); for (int i = 0; i < 6; i++) { if (data[i] != coords[i+3]) CHECK_EQUAL( iBase_SUCCESS, iBase_FAILURE ); } iMesh_endEntArrIter(mesh, iter, &err); CHECK_EQUAL( iBase_SUCCESS, err ); /* get an iterator over the set with two subranges, and check tag iterator for that */ iMesh_initEntArrIter( mesh, entset, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, 6, 0, &iter, &err ); CHECK_EQUAL( iBase_SUCCESS, err ); iMesh_tagIterate(mesh, tagh, iter, &data, &count, &err); CHECK_EQUAL( iBase_SUCCESS, err ); if (count != 2 || data[0] != coords[3] || data[1] != coords[4]) CHECK_EQUAL( iBase_SUCCESS, iBase_FAILURE ); iMesh_stepEntArrIter(mesh, iter, 2, &atend, &err); CHECK_EQUAL( iBase_SUCCESS, err ); /* shouldn't be at end yet */ if (atend) CHECK_EQUAL( iBase_SUCCESS, iBase_FAILURE ); iMesh_tagIterate(mesh, tagh, iter, &data, &count, &err); CHECK_EQUAL( iBase_SUCCESS, err ); if (count != 3 || data[0] != coords[6] || data[1] != coords[7]) CHECK_EQUAL( iBase_SUCCESS, iBase_FAILURE ); iMesh_stepEntArrIter(mesh, iter, 3, &atend, &err); CHECK_EQUAL( iBase_SUCCESS, err ); /* should be at end now */ if (!atend) CHECK_EQUAL( iBase_SUCCESS, iBase_FAILURE ); iMesh_endEntArrIter(mesh, iter, &err); CHECK_EQUAL( iBase_SUCCESS, err ); iMesh_dtor(mesh,&err); CHECK_EQUAL( iBase_SUCCESS, err ); free(verts); }