![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /*
00002 * compareFiles.cpp
00003 * this tool will take two existing h5m files, for the same mesh;
00004 * they will both have the same GLOBAL_IDs for the elements, but the entity handles can be
00005 * very different (depending on how the mesh was partitioned, and saved in parallel)
00006 *
00007 * will compare then the difference between tags, and store the result on one of the files (saved
00008 * again)
00009 *
00010 *
00011 * example of usage:
00012 * ./mbcmpfiles -i file1.h5m -j file2.h5m -n -o out.file
00013 *
00014 *
00015 * Basically, will output a new h5m file (out.file), which has an extra tag, corresponding to the
00016 * difference between the 2 values
00017 *
00018 */
00019
00020 #include "moab/ProgOptions.hpp"
00021 #include "moab/Core.hpp"
00022
00023 #include
00024 #include
00025 #include
00026 #include
00027 #include
00028
00029 using namespace moab;
00030 using namespace std;
00031
00032 int main( int argc, char* argv[] )
00033 {
00034
00035 ProgOptions opts;
00036
00037 std::string inputfile1( "fTargetIntx.h5m" ), inputfile2( "ocn_proj.h5m" ), outfile( "out.h5m" );
00038
00039 std::string tag_name( "a2oTAG_proj" );
00040
00041 opts.addOpt< std::string >( "input1,i", "input mesh filename 1", &inputfile1 );
00042 opts.addOpt< std::string >( "input2,j", "input mesh filename 2", &inputfile2 );
00043 opts.addOpt< std::string >( "tagname,n", "tag to compare", &tag_name );
00044 opts.addOpt< std::string >( "outfile,o", "output file", &outfile );
00045
00046 opts.parseCommandLine( argc, argv );
00047
00048 ErrorCode rval;
00049 Core* mb = new Core();
00050
00051 rval = mb->load_file( inputfile1.c_str() );MB_CHK_SET_ERR( rval, "can't load input file 1" );
00052
00053 Core* mb2 = new Core();
00054 rval = mb2->load_file( inputfile2.c_str() );MB_CHK_SET_ERR( rval, "can't load input file 2" );
00055
00056 std::cout << " opened " << inputfile1 << " and " << inputfile2 << " with initial h5m data.\n";
00057 // open the netcdf file, and see if it has that variable we are looking for
00058
00059 Range nodes;
00060 rval = mb->get_entities_by_dimension( 0, 0, nodes );MB_CHK_SET_ERR( rval, "can't get nodes" );
00061
00062 Range edges;
00063 rval = mb->get_entities_by_dimension( 0, 1, edges );MB_CHK_SET_ERR( rval, "can't get edges" );
00064
00065 Range cells;
00066 rval = mb->get_entities_by_dimension( 0, 2, cells );MB_CHK_SET_ERR( rval, "can't get cells" );
00067
00068 std::cout << inputfile1 << " has " << nodes.size() << " vertices " << edges.size() << " edges " << cells.size()
00069 << " cells\n";
00070
00071 // construct maps between global id and handles
00072 std::map< int, EntityHandle > vGidHandle;
00073 std::map< int, EntityHandle > eGidHandle;
00074 std::map< int, EntityHandle > cGidHandle;
00075 std::vector< int > gids;
00076 Tag gid;
00077 rval = mb->tag_get_handle( "GLOBAL_ID", gid );MB_CHK_SET_ERR( rval, "can't get global id tag" );
00078 gids.resize( nodes.size() );
00079 rval = mb->tag_get_data( gid, nodes, &gids[0] );MB_CHK_SET_ERR( rval, "can't get global id on vertices" );
00080 int i = 0;
00081 for( Range::iterator vit = nodes.begin(); vit != nodes.end(); vit++ )
00082 {
00083 vGidHandle[gids[i++]] = *vit;
00084 }
00085
00086 gids.resize( edges.size() );
00087 rval = mb->tag_get_data( gid, edges, &gids[0] );MB_CHK_SET_ERR( rval, "can't get global id on edges" );
00088 i = 0;
00089 for( Range::iterator vit = edges.begin(); vit != edges.end(); vit++ )
00090 {
00091 eGidHandle[gids[i++]] = *vit;
00092 }
00093
00094 gids.resize( cells.size() );
00095 rval = mb->tag_get_data( gid, cells, &gids[0] );MB_CHK_SET_ERR( rval, "can't get global id on cells" );
00096 i = 0;
00097 for( Range::iterator vit = cells.begin(); vit != cells.end(); vit++ )
00098 {
00099 cGidHandle[gids[i++]] = *vit;
00100 }
00101
00102 Range nodes2;
00103 rval = mb2->get_entities_by_dimension( 0, 0, nodes2 );MB_CHK_SET_ERR( rval, "can't get nodes2" );
00104
00105 Range edges2;
00106 rval = mb2->get_entities_by_dimension( 0, 1, edges2 );MB_CHK_SET_ERR( rval, "can't get edges2" );
00107
00108 Range cells2;
00109 rval = mb2->get_entities_by_dimension( 0, 2, cells2 );MB_CHK_SET_ERR( rval, "can't get cells2" );
00110
00111 std::cout << inputfile2 << " has " << nodes2.size() << " vertices " << edges2.size() << " edges " << cells2.size()
00112 << " cells\n";
00113
00114 // construct maps between global id and handles
00115 std::map< int, EntityHandle > vGidHandle2;
00116 std::map< int, EntityHandle > eGidHandle2;
00117 std::map< int, EntityHandle > cGidHandle2;
00118
00119 Tag gid2;
00120 rval = mb2->tag_get_handle( "GLOBAL_ID", gid2 );MB_CHK_SET_ERR( rval, "can't get global id tag2" );
00121 gids.resize( nodes2.size() );
00122 rval = mb2->tag_get_data( gid2, nodes2, &gids[0] );MB_CHK_SET_ERR( rval, "can't get global id on vertices2" );
00123
00124 i = 0;
00125 for( Range::iterator vit = nodes2.begin(); vit != nodes2.end(); vit++ )
00126 {
00127 vGidHandle2[gids[i++]] = *vit;
00128 }
00129
00130 gids.resize( edges2.size() );
00131 rval = mb2->tag_get_data( gid2, edges2, &gids[0] );MB_CHK_SET_ERR( rval, "can't get global id on edges2" );
00132 i = 0;
00133 for( Range::iterator vit = edges2.begin(); vit != edges2.end(); vit++ )
00134 {
00135 eGidHandle2[gids[i++]] = *vit;
00136 }
00137
00138 gids.resize( cells2.size() );
00139 rval = mb2->tag_get_data( gid2, cells2, &gids[0] );MB_CHK_SET_ERR( rval, "can't get global id on cells2" );
00140 i = 0;
00141 for( Range::iterator vit = cells2.begin(); vit != cells2.end(); vit++ )
00142 {
00143 cGidHandle2[gids[i++]] = *vit;
00144 }
00145
00146 Tag tag;
00147 rval = mb->tag_get_handle( tag_name.c_str(), tag );MB_CHK_SET_ERR( rval, "can't get tag on file 1" );
00148
00149 int len_tag = 0;
00150 rval = mb->tag_get_length( tag, len_tag );MB_CHK_SET_ERR( rval, "can't get tag length on tag" );
00151 std::cout << "length tag : " << len_tag << "\n";
00152
00153 if( cells.size() != cells2.size() )
00154 {
00155 std::cout << " meshes are different between 2 files, cells.size do not agree \n";
00156 exit( 1 );
00157 }
00158 std::vector< double > vals;
00159 vals.resize( len_tag * cells.size() );
00160 rval = mb->tag_get_data( tag, cells, &vals[0] );MB_CHK_SET_ERR( rval, "can't get tag data" );
00161
00162 Tag tag2;
00163 rval = mb2->tag_get_handle( tag_name.c_str(), tag2 );MB_CHK_SET_ERR( rval, "can't get tag on file 2" );
00164 std::vector< double > vals2;
00165 vals2.resize( len_tag * cells2.size() );
00166 rval = mb2->tag_get_data( tag2, cells2, &vals2[0] );MB_CHK_SET_ERR( rval, "can't get tag data on file 2" );
00167
00168 rval = mb->delete_entities( edges );MB_CHK_SET_ERR( rval, "can't delete edges from file 1" );
00169
00170 std::string new_tag_name = tag_name + "_2";
00171 Tag newTag, newTagDiff;
00172 double def_val = -1000;
00173 rval = mb->tag_get_handle( new_tag_name.c_str(), 1, MB_TYPE_DOUBLE, newTag, MB_TAG_CREAT | MB_TAG_DENSE, &def_val );MB_CHK_SET_ERR( rval, "can't define new tag" );
00174
00175 std::string tag_name_diff = tag_name + "_diff";
00176 rval = mb->tag_get_handle( tag_name_diff.c_str(), 1, MB_TYPE_DOUBLE, newTagDiff, MB_TAG_CREAT | MB_TAG_DENSE,
00177 &def_val );MB_CHK_SET_ERR( rval, "can't define new tag diff" );
00178 i = 0;
00179 for( Range::iterator c2it = cells2.begin(); c2it != cells2.end(); c2it++ )
00180 {
00181 double val2 = vals2[i];
00182 int id2 = gids[i];
00183 i++;
00184 EntityHandle c1 = cGidHandle[id2];
00185
00186 rval = mb->tag_set_data( newTag, &c1, 1, &val2 );MB_CHK_SET_ERR( rval, "can't set new tag" );
00187 int indx = cells.index( c1 );
00188 double diff = vals[indx] - val2;
00189 rval = mb->tag_set_data( newTagDiff, &c1, 1, &diff );MB_CHK_SET_ERR( rval, "can't set new tag" );
00190 }
00191
00192 rval = mb->write_file( outfile.c_str() );MB_CHK_SET_ERR( rval, "can't write file" );
00193 std::cout << " wrote file " << outfile << "\n";
00194 return 0;
00195 }