MOAB: Mesh Oriented datABase
(version 5.4.1)
|
00001 /** @example addPCdata.cpp Add point cloud data 00002 * this tool will take an existing h5m fine atm mesh file and add data from an h5m type file with 00003 * point cloud mesh will support mainly showing the data with Visit 00004 * 00005 * example of usage: 00006 * ./mbaddpcdata -i wholeFineATM.h5m -s wholeLND_proj01.h5m -o atm_a2l.h5m -v a2lTbot_proj 00007 * 00008 * it should work also for pentagon file style data 00009 * ./mbaddpcdata -i <MOABsource>/MeshFiles/unittest/penta3d.h5m -s wholeLND_proj01.h5m -o 00010 * atm_a2l.h5m -v a2lTbot_proj -p 1 00011 * 00012 * Basically, will output a new h5m file (atm_a2l.h5m), which has an extra tag, corresponding to the 00013 * variable a2lTbot_proj from the file wholeLND_proj01.h5m; matching is based on the global ids 00014 * between what we think is the order on the original file (wholeFineATM.h5m) and the order of 00015 * surfdata_ne11np4_simyr1850_c160614.nc 00016 * 00017 * file wholeFineATM.h5m is obtained from a coupled run in e3sm, with the ne 11, np 4, 00018 * 00019 */ 00020 #include "moab/ProgOptions.hpp" 00021 #include "moab/Core.hpp" 00022 00023 #include <cmath> 00024 #include <sstream> 00025 00026 using namespace moab; 00027 00028 int main( int argc, char* argv[] ) 00029 { 00030 00031 ProgOptions opts; 00032 00033 std::string inputfile, outfile( "out.h5m" ), sourcefile, variable_name; 00034 int dual_mesh = 0; 00035 opts.addOpt< std::string >( "input,i", "input mesh filename", &inputfile ); 00036 opts.addOpt< std::string >( "source,s", "h5m file aligned with the mesh input file", &sourcefile ); 00037 opts.addOpt< std::string >( "output,o", "output mesh filename", &outfile ); 00038 00039 opts.addOpt< std::string >( "var,v", "variable to extract and add to output file", &variable_name ); 00040 opts.addOpt< int >( "pentagon,p", "switch for dual mesh ", &dual_mesh ); 00041 00042 opts.parseCommandLine( argc, argv ); 00043 00044 std::cout << "input file: " << inputfile << "\n"; 00045 std::cout << "source file: " << sourcefile << "\n"; 00046 std::cout << "variable to copy: " << variable_name << "\n"; 00047 std::cout << "output file: " << outfile << "\n"; 00048 00049 if( inputfile.empty() ) 00050 { 00051 opts.printHelp(); 00052 return 0; 00053 } 00054 ErrorCode rval; 00055 Core* mb = new Core(); 00056 00057 rval = mb->load_file( inputfile.c_str() );MB_CHK_SET_ERR( rval, "can't load input file" ); 00058 00059 Core* mb2 = new Core(); 00060 rval = mb2->load_file( sourcefile.c_str() );MB_CHK_SET_ERR( rval, "can't load source file" ); 00061 00062 Tag sourceTag; 00063 rval = mb2->tag_get_handle( variable_name.c_str(), sourceTag );MB_CHK_SET_ERR( rval, "can't get tag from file" ); 00064 00065 int sizeTag = 0; 00066 rval = mb2->tag_get_length( sourceTag, sizeTag );MB_CHK_SET_ERR( rval, "can't get size of tag " ); 00067 00068 DataType type; 00069 rval = mb2->tag_get_data_type( sourceTag, type );MB_CHK_SET_ERR( rval, "can't get type of tag " ); 00070 00071 int sizeInBytes = 0; 00072 rval = mb2->tag_get_bytes( sourceTag, sizeInBytes );MB_CHK_SET_ERR( rval, "can't get size in bytes of tag " ); 00073 00074 Tag newTag; 00075 /* 00076 * ErrorCode tag_get_handle( const char* name, 00077 int size, 00078 DataType type, 00079 Tag& tag_handle, 00080 unsigned flags = 0, 00081 const void* default_value = 0 ) 00082 */ 00083 void* defVal; 00084 int defInt = -100000; 00085 double defDouble = -1.e10; 00086 if( type == MB_TYPE_INTEGER ) 00087 { 00088 defVal = (void*)( &defInt ); 00089 } 00090 else if( type == MB_TYPE_DOUBLE ) 00091 { 00092 defVal = (void*)( &defDouble ); 00093 } 00094 00095 rval = mb->tag_get_handle( variable_name.c_str(), sizeTag, type, newTag, MB_TAG_DENSE | MB_TAG_CREAT, defVal );MB_CHK_SET_ERR( rval, "can't create new tag " ); 00096 00097 // get vertices on ini mesh; get global id on ini mesh 00098 // get global id on source mesh 00099 Tag gid; 00100 Tag gid2; 00101 rval = mb->tag_get_handle( "GLOBAL_ID", gid );MB_CHK_SET_ERR( rval, "can't get GLOBAL_ID tag on ini mesh " ); 00102 rval = mb2->tag_get_handle( "GLOBAL_ID", gid2 );MB_CHK_SET_ERR( rval, "can't get GLOBAL_ID tag on source mesh " ); 00103 00104 // get vertices on ini mesh; build 00105 Range iniVerts; 00106 rval = mb->get_entities_by_dimension( 0, 0, iniVerts );MB_CHK_SET_ERR( rval, "can't get verts on initial mesh " ); 00107 if( 0 != dual_mesh ) 00108 { 00109 // verts will be polygons 00110 rval = mb->get_entities_by_dimension( 0, 2, iniVerts );MB_CHK_SET_ERR( rval, "can't get polygons on initial mesh " ); 00111 } 00112 std::vector< int > gids; 00113 gids.resize( iniVerts.size() ); 00114 rval = mb->tag_get_data( gid, iniVerts, &( gids[0] ) );MB_CHK_SET_ERR( rval, "can't get gid on initial verts " ); 00115 // build now the map 00116 std::map< int, EntityHandle > fromGidToEh; 00117 int i = 0; 00118 for( Range::iterator vit = iniVerts.begin(); vit != iniVerts.end(); vit++, i++ ) 00119 { 00120 fromGidToEh[gids[i]] = *vit; 00121 } 00122 // now get the source verts, and tags, and set it on new mesh 00123 00124 char* valTag = new char[sizeInBytes]; 00125 00126 std::cout << " size of tag in bytes:" << sizeInBytes << "\n"; 00127 Range sourceVerts; 00128 rval = mb2->get_entities_by_dimension( 0, 0, sourceVerts );MB_CHK_SET_ERR( rval, "can't get verts on source mesh " ); 00129 for( Range::iterator sit = sourceVerts.begin(); sit != sourceVerts.end(); sit++ ) 00130 { 00131 int globalId = 0; 00132 EntityHandle sourceHandle = *sit; 00133 rval = mb2->tag_get_data( gid2, &sourceHandle, 1, &globalId );MB_CHK_SET_ERR( rval, "can't get id on source mesh " ); 00134 // iniVert could be a polygon, actually 00135 EntityHandle iniVert = fromGidToEh[globalId]; 00136 // find the value of source tag 00137 rval = mb2->tag_get_data( sourceTag, &sourceHandle, 1, (void*)valTag );MB_CHK_SET_ERR( rval, "can't get value on source tag " ); 00138 00139 rval = mb->tag_set_data( newTag, &iniVert, 1, (void*)valTag );MB_CHK_SET_ERR( rval, "can't set value on initial mesh, new tag " ); 00140 } 00141 00142 // save file 00143 rval = mb->write_file( outfile.c_str() );MB_CHK_SET_ERR( rval, "can't write file" ); 00144 00145 delete[] valTag; 00146 delete mb; 00147 delete mb2; 00148 00149 return 0; 00150 }