![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /** @example ReadWriteTest.cpp \n
00002 * \brief Read mesh into MOAB and write some back \n
00003 *
00004 * To run: mpiexec -np 4 ReadWriteTest [input] [output] -O [read_opts] -o [write_opts]\n
00005 *
00006 * used for stress test of reader/writer
00007 * report times to read and write
00008 *
00009 * example ReadWriteTest ../MeshFiles/io/fv3x46x72.t.3.nc out.nc \
00010 * -O PARALLEL=READ_PART;PARTITION_METHOD=SQIJ;PARALLEL_RESOLVE_SHARED_ENTS;VARIABLE=T,U; \
00011 * -o PARALLEL=WRITE_PART;VARIABLE=T,U
00012 */
00013
00014 #include "moab/Core.hpp"
00015 #ifdef MOAB_HAVE_MPI
00016 #include "moab/ParallelComm.hpp"
00017 #include "MBParallelConventions.h"
00018 #endif
00019 #include
00020 #include
00021
00022 using namespace moab;
00023 using namespace std;
00024
00025 int main( int argc, char** argv )
00026 {
00027 #ifdef MOAB_HAVE_MPI
00028 string input_file, output_file, read_opts, write_opts;
00029
00030 MPI_Init( &argc, &argv );
00031
00032 // Need option handling here for input filename
00033 if( argc < 3 )
00034 {
00035 #ifdef MOAB_HAVE_NETCDF
00036 input_file = string( MESH_DIR ) + string( "/io/fv3x46x72.t.3.nc" );
00037 output_file = "ReadWriteTestOut.h5m";
00038 read_opts = "PARALLEL=READ_PART;PARTITION_METHOD=SQIJ;PARALLEL_RESOLVE_SHARED_ENTS;VARIABLE=T,U";
00039 write_opts = "PARALLEL=WRITE_PART";
00040 #else
00041 cout << "Usage: mpiexec -n $NP ReadWriteTest [input] [output] -O -o "
00042 "\n";
00043 return 0;
00044 #endif
00045 }
00046 else
00047 {
00048 input_file = argv[1];
00049 output_file = argv[2];
00050 }
00051
00052 if( argc > 3 )
00053 {
00054 int index = 3;
00055 while( index < argc )
00056 {
00057 if( !strcmp( argv[index], "-O" ) ) // This is for reading options, optional
00058 read_opts = argv[++index];
00059 if( !strcmp( argv[index], "-o" ) ) write_opts = argv[++index];
00060 index++;
00061 }
00062 }
00063
00064 // Get MOAB instance
00065 Interface* mb = new( std::nothrow ) Core;
00066 if( NULL == mb ) return 1;
00067
00068 // Get the ParallelComm instance
00069 ParallelComm* pcomm = new ParallelComm( mb, MPI_COMM_WORLD );
00070 int nprocs = pcomm->proc_config().proc_size();
00071 int rank = pcomm->proc_config().proc_rank();
00072
00073 EntityHandle set;
00074 ErrorCode rval = mb->create_meshset( MESHSET_SET, set );MB_CHK_ERR( rval );
00075
00076 clock_t tt = clock();
00077
00078 if( 0 == rank )
00079 cout << "Reading file " << input_file << "\n with options: " << read_opts << "\n on " << nprocs
00080 << " processors\n";
00081
00082 // Read the file with the specified options
00083 rval = mb->load_file( input_file.c_str(), &set, read_opts.c_str() );MB_CHK_ERR( rval );
00084
00085 if( 0 == rank )
00086 {
00087 cout << "Time: " << ( clock() - tt ) / (double)CLOCKS_PER_SEC << " seconds" << endl;
00088 tt = clock();
00089 }
00090
00091 // Write back the file with the specified options
00092 rval = mb->write_file( output_file.c_str(), 0, write_opts.c_str(), &set, 1 );MB_CHK_ERR( rval );
00093
00094 if( 0 == rank )
00095 {
00096 cout << "Writing file " << output_file << "\n with options: " << write_opts << endl;
00097 cout << "Time: " << ( clock() - tt ) / (double)CLOCKS_PER_SEC << " seconds" << endl;
00098 tt = clock();
00099 }
00100
00101 delete mb;
00102
00103 MPI_Finalize();
00104 #else
00105 std::cout << " compile MOAB with mpi for this example to work\n";
00106 #endif
00107
00108 return 0;
00109 }