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; }
inline iMesh::Error iMesh::load( EntitySetHandle set, const char* file_name, const char* options ) { int err, len = options ? strlen(options) : 0; iMesh_load( mInstance, set, file_name, options, &err, strlen(file_name), len ); return (Error)err; }
// 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; }