![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /*
00002 * addncdata.cpp
00003 * this tool will take an existing h5m file and add data from some chunk description files
00004 * generated from e3sm runs;
00005 * will support mainly showing the chunks in ViSit
00006 *
00007 * example of usage:
00008 * ./mbaddchunk -i penta3d.h5m -n chunks_on_proc.txt -o penta3d_ch.h5m
00009 *
00010 *
00011 * Basically, will output a new h5m file (penta3d_ch.h5m), which has 2 extra tags, corresponding to
00012 * the chunks number and processors it sits on
00013 *
00014 *
00015 * file penta3d.h5m is obtained from the pentagons file, with a python script
00016 *
00017 */
00018
00019 #include "moab/ProgOptions.hpp"
00020 #include "moab/Core.hpp"
00021
00022 #include
00023 #include
00024 #include
00025 #include
00026 #include
00027
00028 using namespace moab;
00029 using namespace std;
00030
00031 int main( int argc, char* argv[] )
00032 {
00033
00034 ProgOptions opts;
00035
00036 std::string inputfile( "penta3d.h5m" ), outfile( "penta3d_ch.h5m" ), chunkfile_name, gsmapfile;
00037
00038 opts.addOpt< std::string >( "input,i", "input mesh filename", &inputfile );
00039 opts.addOpt< std::string >( "chunkFile,n", "chunk file from cam run", &chunkfile_name );
00040 opts.addOpt< std::string >( "gsMAPfile,g", "gsmap file", &gsmapfile );
00041
00042 opts.addOpt< std::string >( "output,o", "output mesh filename", &outfile );
00043
00044 opts.parseCommandLine( argc, argv );
00045
00046 ErrorCode rval;
00047 Core* mb = new Core();
00048
00049 rval = mb->load_file( inputfile.c_str() );MB_CHK_SET_ERR( rval, "can't load input file" );
00050
00051 std::cout << " opened " << inputfile << " with initial h5m data.\n";
00052 // open the netcdf file, and see if it has that variable we are looking for
00053
00054 Range nodes;
00055 rval = mb->get_entities_by_dimension( 0, 0, nodes );MB_CHK_SET_ERR( rval, "can't get nodes" );
00056
00057 Range edges;
00058 rval = mb->get_entities_by_dimension( 0, 1, edges );MB_CHK_SET_ERR( rval, "can't get edges" );
00059
00060 Range cells;
00061 rval = mb->get_entities_by_dimension( 0, 2, cells );MB_CHK_SET_ERR( rval, "can't get cells" );
00062
00063 std::cout << " it has " << nodes.size() << " vertices " << edges.size() << " edges " << cells.size() << " cells\n";
00064
00065 // construct maps between global id and handles
00066 std::map< int, EntityHandle > vGidHandle;
00067 std::map< int, EntityHandle > eGidHandle;
00068 std::map< int, EntityHandle > cGidHandle;
00069 std::vector< int > gids;
00070 Tag gid;
00071 rval = mb->tag_get_handle( "GLOBAL_ID", gid );MB_CHK_SET_ERR( rval, "can't get global id tag" );
00072 gids.resize( nodes.size() );
00073 rval = mb->tag_get_data( gid, nodes, &gids[0] );MB_CHK_SET_ERR( rval, "can't get global id on vertices" );
00074 int i = 0;
00075 for( Range::iterator vit = nodes.begin(); vit != nodes.end(); vit++ )
00076 {
00077 vGidHandle[gids[i++]] = *vit;
00078 }
00079
00080 gids.resize( edges.size() );
00081 rval = mb->tag_get_data( gid, edges, &gids[0] );MB_CHK_SET_ERR( rval, "can't get global id on edges" );
00082 i = 0;
00083 for( Range::iterator vit = edges.begin(); vit != edges.end(); vit++ )
00084 {
00085 eGidHandle[gids[i++]] = *vit;
00086 }
00087
00088 gids.resize( cells.size() );
00089 rval = mb->tag_get_data( gid, cells, &gids[0] );MB_CHK_SET_ERR( rval, "can't get global id on cells" );
00090 i = 0;
00091 for( Range::iterator vit = cells.begin(); vit != cells.end(); vit++ )
00092 {
00093 cGidHandle[gids[i++]] = *vit;
00094 }
00095
00096 if( chunkfile_name.length() > 0 )
00097 {
00098
00099 // Open chunk file
00100 ifstream inFile;
00101
00102 inFile.open( chunkfile_name.c_str() );
00103 if( !inFile )
00104 {
00105 cout << "Unable to open chunk file";
00106 exit( 1 ); // terminate with error
00107 }
00108 Tag pTag, cTag;
00109 int def_val = -1;
00110 rval = mb->tag_get_handle( "ProcID", 1, MB_TYPE_INTEGER, pTag, MB_TAG_CREAT | MB_TAG_DENSE, &def_val );MB_CHK_SET_ERR( rval, "can't define processor tag" );
00111 rval = mb->tag_get_handle( "ChunkID", 1, MB_TYPE_INTEGER, cTag, MB_TAG_CREAT | MB_TAG_DENSE, &def_val );MB_CHK_SET_ERR( rval, "can't define chunk tag" );
00112
00113 int proc, lcid, ncols;
00114 while( inFile >> proc )
00115 {
00116 inFile >> lcid >> ncols;
00117 int Gid;
00118 for( i = 0; i < ncols; i++ )
00119 {
00120 inFile >> Gid;
00121 EntityHandle cell = cGidHandle[Gid];
00122 rval = mb->tag_set_data( pTag, &cell, 1, &proc );MB_CHK_SET_ERR( rval, "can't set proc tag" );
00123 rval = mb->tag_set_data( cTag, &cell, 1, &lcid );MB_CHK_SET_ERR( rval, "can't set chunk tag" );
00124 }
00125 }
00126
00127 inFile.close();
00128 }
00129
00130 if( gsmapfile.length() > 0 )
00131 {
00132
00133 // Open chunk file
00134 ifstream inFile;
00135
00136 inFile.open( gsmapfile.c_str() );
00137 if( !inFile )
00138 {
00139 cout << "Unable to open gsmap file";
00140 exit( 1 ); // terminate with error
00141 }
00142 Tag pTag, cTag;
00143 int def_val = -1;
00144 std::string procTagName = gsmapfile + "_proc";
00145 rval =
00146 mb->tag_get_handle( procTagName.c_str(), 1, MB_TYPE_INTEGER, pTag, MB_TAG_CREAT | MB_TAG_DENSE, &def_val );MB_CHK_SET_ERR( rval, "can't define processor tag" );
00147 std::string segTagName = gsmapfile + "_seg";
00148 rval =
00149 mb->tag_get_handle( segTagName.c_str(), 1, MB_TYPE_INTEGER, cTag, MB_TAG_CREAT | MB_TAG_DENSE, &def_val );MB_CHK_SET_ERR( rval, "can't define segment tag" );
00150
00151 int compid, ngseg, gsize;
00152 inFile >> compid >> ngseg >> gsize;
00153 for( i = 1; i <= ngseg; i++ )
00154 {
00155 int start, len, pe;
00156 inFile >> start >> len >> pe;
00157 int Gid;
00158 for( int j = 0; j < len; j++ )
00159 {
00160 Gid = start + j;
00161 EntityHandle cell = cGidHandle[Gid];
00162 rval = mb->tag_set_data( pTag, &cell, 1, &pe );MB_CHK_SET_ERR( rval, "can't set proc tag" );
00163 rval = mb->tag_set_data( cTag, &cell, 1, &i );MB_CHK_SET_ERR( rval, "can't set segment tag" );
00164 }
00165 }
00166
00167 inFile.close();
00168 }
00169
00170 rval = mb->write_file( outfile.c_str() );MB_CHK_SET_ERR( rval, "can't write file" );
00171 std::cout << " wrote file " << outfile << "\n";
00172 return 0;
00173 }