Mesh Oriented datABase  (version 5.4.1)
Array-based unstructured mesh datastructure
LoadPartial.cpp
Go to the documentation of this file.
00001 /** @example LoadPartial.cpp \n
00002  * \brief Load a part of a file  \n
00003  * <b>To run</b>: LoadPartial [file] [tag_name] [val1] [val2] ...\n
00004  *
00005  * In this example, it is shown how to load only a part of one file; the file must be organized in
00006  * sets. (cherry-picking only the sets we want) The sets to load are identified by a tag name and
00007  * the tag values for the sets of interest. This procedure is used  when reading in parallel, as
00008  * each processor will load only its part of the file, identified either by partition or by
00009  * material/block sets by default, this example will load parallel partition sets with values 1, 2,
00010  * and 5 from ../MeshFiles/unittest/64bricks_1khex.h5m The example will always write the output to a
00011  * file name part.h5m
00012  */
00013 
00014 #include <iostream>
00015 #include <vector>
00016 
00017 // Include header for MOAB instance and tag conventions for
00018 #include "moab/Core.hpp"
00019 #include "MBTagConventions.hpp"
00020 
00021 #define NTAGVALS 3
00022 
00023 using namespace moab;
00024 using namespace std;
00025 
00026 // Function to parse input parameters
00027 ErrorCode get_file_options( int argc, char** argv, string& filename, string& tagName, vector< int >& tagValues )
00028 {
00029     // Get mesh filename
00030     if( argc > 1 )
00031         filename = string( argv[1] );
00032     else
00033         filename = string( MESH_DIR ) + string( "/64bricks_512hex_256part.h5m" );
00034 
00035     // Get tag selection options
00036     if( argc > 2 )
00037         tagName = string( argv[2] );
00038     else
00039         tagName = "USERTAG";
00040 
00041     if( argc > 3 )
00042     {
00043         tagValues.resize( argc - 3, 0 );
00044         for( int i = 3; i < argc; ++i )
00045             tagValues[i - 3] = atoi( argv[i] );
00046     }
00047     else
00048     {
00049         for( unsigned i = 0; i < tagValues.size(); ++i )
00050             tagValues[i] = 2 * i + 1;
00051     }
00052 
00053     if( argc > 1 && argc < 4 )  // print usage
00054         cout << " usage is " << argv[0] << " <file> <tag_name> <value1> <value2> .. \n";
00055     return MB_SUCCESS;
00056 }
00057 
00058 int main( int argc, char** argv )
00059 {
00060     // Get MOAB instance
00061     Interface* mb = new( std::nothrow ) Core;
00062     if( NULL == mb ) return 1;
00063 
00064     std::string filename, tagname;
00065     vector< int > tagvals( NTAGVALS );  // Allocate for a maximum of 5 tag values
00066     ErrorCode rval = get_file_options( argc, argv, filename, tagname, tagvals );MB_CHK_ERR( rval );
00067 
00068 #ifdef MOAB_HAVE_HDF5
00069     // This file is in the mesh files directory
00070     rval = mb->load_file( filename.c_str(), 0, 0, PARALLEL_PARTITION_TAG_NAME, tagvals.data(), (int)tagvals.size() );MB_CHK_SET_ERR( rval, "Failed to read" );
00071 
00072     // If HANDLEID tag present, convert to long, and see what we read from file
00073     Tag handleid_tag;
00074     rval = mb->tag_get_handle( "HANDLEID", handleid_tag );
00075     if( MB_SUCCESS == rval )
00076     {
00077         // Convert a few values for a few vertices
00078         Range verts;
00079         rval = mb->get_entities_by_type( 0, MBVERTEX, verts );MB_CHK_SET_ERR( rval, "Failed to get vertices" );
00080         vector< long > valsTag( verts.size() );
00081         rval = mb->tag_get_data( handleid_tag, verts, &valsTag[0] );
00082         if( MB_SUCCESS == rval ) cout << "First 2 long values recovered: " << valsTag[0] << " " << valsTag[1] << "\n";
00083     }
00084 
00085     rval = mb->write_file( "part.h5m" );MB_CHK_SET_ERR( rval, "Failed to write partial file" );
00086     cout << "Wrote successfully part.h5m.\n";
00087 
00088 #else
00089     std::cout << "Configure MOAB with HDF5 to build and use this example correctly.\n";
00090 #endif
00091     delete mb;
00092     return 0;
00093 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines