MOAB: Mesh Oriented datABase
(version 5.4.1)
|
00001 #include "TestUtil.hpp" 00002 #include "moab/Core.hpp" 00003 #include "moab/ReadUtilIface.hpp" 00004 #include "TagInfo.hpp" 00005 #include "MBTagConventions.hpp" 00006 00007 using namespace moab; 00008 00009 std::string example = TestDir + "unittest/io/homme3x3458.t.3.nc"; 00010 std::string conn_fname = TestDir + "unittest/io/HommeMapping.nc"; 00011 00012 #ifdef MOAB_HAVE_MPI 00013 #include "moab_mpi.h" 00014 #include "moab/ParallelComm.hpp" 00015 #endif 00016 00017 void test_read_all(); 00018 void test_read_onevar(); 00019 void test_read_onetimestep(); 00020 void test_read_nomesh(); 00021 void test_read_novars(); 00022 void test_read_coord_vars(); // Test reading coordinate variables 00023 void test_gather_onevar(); // Test gather set with one variable 00024 void test_read_conn(); // Test reading connectivity file only 00025 00026 void get_options( std::string& opts ); 00027 00028 const int levels = 3; 00029 00030 int main( int argc, char* argv[] ) 00031 { 00032 int result = 0; 00033 00034 #ifdef MOAB_HAVE_MPI 00035 int fail = MPI_Init( &argc, &argv ); 00036 if( fail ) return 1; 00037 #else 00038 argv[0] = argv[argc - argc]; // To remove the warnings in serial mode about unused variables 00039 #endif 00040 00041 result += RUN_TEST( test_read_all ); 00042 result += RUN_TEST( test_read_onevar ); 00043 result += RUN_TEST( test_read_onetimestep ); 00044 result += RUN_TEST( test_read_nomesh ); 00045 result += RUN_TEST( test_read_novars ); 00046 result += RUN_TEST( test_read_coord_vars ); 00047 result += RUN_TEST( test_gather_onevar ); 00048 result += RUN_TEST( test_read_conn ); 00049 00050 #ifdef MOAB_HAVE_MPI 00051 fail = MPI_Finalize(); 00052 if( fail ) return 1; 00053 #endif 00054 00055 return result; 00056 } 00057 00058 void test_read_all() 00059 { 00060 Core moab; 00061 Interface& mb = moab; 00062 00063 std::string opts; 00064 get_options( opts ); 00065 00066 ErrorCode rval = mb.load_file( example.c_str(), NULL, opts.c_str() );CHECK_ERR( rval ); 00067 00068 // Check for proper tags 00069 Tag Ttag0, Ttag1; 00070 rval = mb.tag_get_handle( "T0", levels, MB_TYPE_DOUBLE, Ttag0 );CHECK_ERR( rval ); 00071 00072 rval = mb.tag_get_handle( "T1", levels, MB_TYPE_DOUBLE, Ttag1 );CHECK_ERR( rval ); 00073 } 00074 00075 void test_read_onevar() 00076 { 00077 Core moab; 00078 Interface& mb = moab; 00079 00080 std::string opts; 00081 get_options( opts ); 00082 00083 // Read mesh and read vertex variable T at all timesteps 00084 opts += std::string( ";VARIABLE=T" ); 00085 ErrorCode rval = mb.load_file( example.c_str(), NULL, opts.c_str() );CHECK_ERR( rval ); 00086 00087 #ifdef MOAB_HAVE_MPI 00088 ParallelComm* pcomm = ParallelComm::get_pcomm( &mb, 0 ); 00089 int procs = pcomm->proc_config().proc_size(); 00090 #else 00091 int procs = 1; 00092 #endif 00093 00094 // Make check runs this test on one processor 00095 if( 1 == procs ) 00096 { 00097 // Check for proper tags 00098 Tag Ttag0, Ttag1; 00099 rval = mb.tag_get_handle( "T0", levels, MB_TYPE_DOUBLE, Ttag0 );CHECK_ERR( rval ); 00100 rval = mb.tag_get_handle( "T1", levels, MB_TYPE_DOUBLE, Ttag1 );CHECK_ERR( rval ); 00101 00102 // Get vertices 00103 Range verts; 00104 rval = mb.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval ); 00105 CHECK_EQUAL( (size_t)3458, verts.size() ); 00106 00107 // Get all values of tag T0 00108 int count; 00109 void* Tbuf; 00110 rval = mb.tag_iterate( Ttag0, verts.begin(), verts.end(), count, Tbuf );CHECK_ERR( rval ); 00111 CHECK_EQUAL( (size_t)count, verts.size() ); 00112 00113 const double eps = 0.0001; 00114 double* data = (double*)Tbuf; 00115 00116 // Check first level values on 4 strategically selected vertices 00117 CHECK_REAL_EQUAL( 233.1136, data[0 * levels], eps ); // First vert 00118 CHECK_REAL_EQUAL( 236.1505, data[1728 * levels], eps ); // Median vert 00119 CHECK_REAL_EQUAL( 235.7722, data[1729 * levels], eps ); // Median vert 00120 CHECK_REAL_EQUAL( 234.0416, data[3457 * levels], eps ); // Last vert 00121 } 00122 } 00123 00124 void test_read_onetimestep() 00125 { 00126 Core moab; 00127 Interface& mb = moab; 00128 00129 std::string opts; 00130 get_options( opts ); 00131 00132 opts += std::string( ";TIMESTEP=1" ); 00133 ErrorCode rval = mb.load_file( example.c_str(), NULL, opts.c_str() );CHECK_ERR( rval ); 00134 00135 // Check for proper tags 00136 Tag Ttag0, Ttag1; 00137 rval = mb.tag_get_handle( "T0", levels, MB_TYPE_DOUBLE, Ttag0 ); 00138 CHECK_EQUAL( rval, MB_TAG_NOT_FOUND ); 00139 00140 rval = mb.tag_get_handle( "T1", levels, MB_TYPE_DOUBLE, Ttag1 );CHECK_ERR( rval ); 00141 } 00142 00143 void test_read_nomesh() 00144 { 00145 Core moab; 00146 Interface& mb = moab; 00147 00148 // Need a set for nomesh to work right 00149 EntityHandle file_set; 00150 ErrorCode rval = mb.create_meshset( MESHSET_SET, file_set );CHECK_ERR( rval ); 00151 00152 std::string orig, opts; 00153 get_options( orig ); 00154 00155 opts = orig + std::string( ";TIMESTEP=0" ); 00156 rval = mb.load_file( example.c_str(), &file_set, opts.c_str() );CHECK_ERR( rval ); 00157 00158 // Check for proper tag 00159 Tag Ttag0, Ttag1; 00160 rval = mb.tag_get_handle( "T0", levels, MB_TYPE_DOUBLE, Ttag0 );CHECK_ERR( rval ); 00161 00162 rval = mb.tag_get_handle( "T1", levels, MB_TYPE_DOUBLE, Ttag1 ); 00163 CHECK_EQUAL( rval, MB_TAG_NOT_FOUND ); 00164 00165 // Now read 2nd timestep with nomesh option 00166 opts = orig + std::string( ";TIMESTEP=1;NOMESH" ); 00167 rval = mb.load_file( example.c_str(), &file_set, opts.c_str() );CHECK_ERR( rval ); 00168 00169 // Check for proper tag 00170 rval = mb.tag_get_handle( "T1", levels, MB_TYPE_DOUBLE, Ttag1 );CHECK_ERR( rval ); 00171 } 00172 00173 void test_read_novars() 00174 { 00175 Core moab; 00176 Interface& mb = moab; 00177 00178 // Need a set for nomesh to work right 00179 EntityHandle set; 00180 ErrorCode rval = mb.create_meshset( MESHSET_SET, set );CHECK_ERR( rval ); 00181 00182 std::string orig, opts; 00183 get_options( orig ); 00184 00185 opts = orig + std::string( ";NOMESH;VARIABLE=" ); 00186 rval = mb.load_file( example.c_str(), &set, opts.c_str() );CHECK_ERR( rval ); 00187 00188 opts = orig + std::string( ";VARIABLE=;TIMESTEP=0" ); 00189 rval = mb.load_file( example.c_str(), &set, opts.c_str() );CHECK_ERR( rval ); 00190 00191 // Check for proper tag 00192 Tag Ttag0, Ttag1; 00193 rval = mb.tag_get_handle( "T0", levels, MB_TYPE_DOUBLE, Ttag0 ); 00194 CHECK_EQUAL( rval, MB_TAG_NOT_FOUND ); 00195 00196 opts = orig + std::string( ";VARIABLE=T;TIMESTEP=0;NOMESH" ); 00197 rval = mb.load_file( example.c_str(), &set, opts.c_str() );CHECK_ERR( rval ); 00198 00199 rval = mb.tag_get_handle( "T0", levels, MB_TYPE_DOUBLE, Ttag0 );CHECK_ERR( rval ); 00200 00201 rval = mb.tag_get_handle( "T1", levels, MB_TYPE_DOUBLE, Ttag1 ); 00202 CHECK_EQUAL( rval, MB_TAG_NOT_FOUND ); 00203 00204 // Now read 2nd timestep with nomesh option 00205 opts = orig + std::string( ";TIMESTEP=1;NOMESH" ); 00206 rval = mb.load_file( example.c_str(), &set, opts.c_str() );CHECK_ERR( rval ); 00207 00208 // Check for proper tag 00209 rval = mb.tag_get_handle( "T1", levels, MB_TYPE_DOUBLE, Ttag1 );CHECK_ERR( rval ); 00210 } 00211 00212 void test_read_coord_vars() 00213 { 00214 Core moab; 00215 Interface& mb = moab; 00216 00217 EntityHandle file_set; 00218 ErrorCode rval = mb.create_meshset( MESHSET_SET, file_set );CHECK_ERR( rval ); 00219 00220 std::string orig, opts; 00221 get_options( orig ); 00222 00223 opts = orig + std::string( ";NOMESH;VARIABLE=" ); 00224 rval = mb.load_file( example.c_str(), &file_set, opts.c_str() );CHECK_ERR( rval ); 00225 00226 std::string tag_name; 00227 int var_len; 00228 Tag var_tag; 00229 const void* var_data; 00230 00231 // Check tag for regular coordinate variable lev 00232 tag_name = "lev"; 00233 var_len = 0; 00234 rval = mb.tag_get_handle( tag_name.c_str(), var_len, MB_TYPE_OPAQUE, var_tag, MB_TAG_SPARSE | MB_TAG_VARLEN );CHECK_ERR( rval ); 00235 CHECK_EQUAL( true, var_tag->variable_length() ); 00236 CHECK_EQUAL( MB_TYPE_DOUBLE, var_tag->get_data_type() ); 00237 00238 // Check lev tag size and values on file_set 00239 rval = mb.tag_get_by_ptr( var_tag, &file_set, 1, &var_data, &var_len );CHECK_ERR( rval ); 00240 CHECK_EQUAL( levels, var_len ); 00241 double* lev_val = (double*)var_data; 00242 const double eps = 1e-10; 00243 CHECK_REAL_EQUAL( 3.54463800000002, lev_val[0], eps ); 00244 CHECK_REAL_EQUAL( 13.9672100000001, lev_val[levels - 1], eps ); 00245 00246 // Check tag for dummy coordinate variable ncol 00247 tag_name = "ncol"; 00248 var_len = 0; 00249 rval = mb.tag_get_handle( tag_name.c_str(), var_len, MB_TYPE_OPAQUE, var_tag, MB_TAG_SPARSE | MB_TAG_VARLEN );CHECK_ERR( rval ); 00250 CHECK_EQUAL( true, var_tag->variable_length() ); 00251 CHECK_EQUAL( MB_TYPE_INTEGER, var_tag->get_data_type() ); 00252 00253 // Check ncol tag size and values on file_set 00254 rval = mb.tag_get_by_ptr( var_tag, &file_set, 1, &var_data, &var_len );CHECK_ERR( rval ); 00255 CHECK_EQUAL( 1, var_len ); 00256 int* ncol_val = (int*)var_data; 00257 CHECK_EQUAL( 3458, ncol_val[0] ); 00258 00259 // Create another file set 00260 EntityHandle file_set2; 00261 rval = mb.create_meshset( MESHSET_SET, file_set2 );CHECK_ERR( rval ); 00262 00263 // Read file again with file_set2 00264 rval = mb.load_file( example.c_str(), &file_set2, opts.c_str() );CHECK_ERR( rval ); 00265 00266 // Check tag for regular coordinate lev 00267 tag_name = "lev"; 00268 var_len = 0; 00269 rval = mb.tag_get_handle( tag_name.c_str(), var_len, MB_TYPE_OPAQUE, var_tag, MB_TAG_SPARSE | MB_TAG_VARLEN );CHECK_ERR( rval ); 00270 CHECK_EQUAL( true, var_tag->variable_length() ); 00271 CHECK_EQUAL( MB_TYPE_DOUBLE, var_tag->get_data_type() ); 00272 00273 // Check lev tag size and values on file_set2 00274 rval = mb.tag_get_by_ptr( var_tag, &file_set2, 1, &var_data, &var_len );CHECK_ERR( rval ); 00275 CHECK_EQUAL( levels, var_len ); 00276 lev_val = (double*)var_data; 00277 CHECK_REAL_EQUAL( 3.54463800000002, lev_val[0], eps ); 00278 CHECK_REAL_EQUAL( 13.9672100000001, lev_val[levels - 1], eps ); 00279 00280 // Check tag for dummy coordinate variable ncol 00281 tag_name = "ncol"; 00282 var_len = 0; 00283 rval = mb.tag_get_handle( tag_name.c_str(), var_len, MB_TYPE_OPAQUE, var_tag, MB_TAG_SPARSE | MB_TAG_VARLEN );CHECK_ERR( rval ); 00284 CHECK_EQUAL( true, var_tag->variable_length() ); 00285 CHECK_EQUAL( MB_TYPE_INTEGER, var_tag->get_data_type() ); 00286 00287 // Check ncol tag size and values on file_set2 00288 rval = mb.tag_get_by_ptr( var_tag, &file_set2, 1, &var_data, &var_len );CHECK_ERR( rval ); 00289 CHECK_EQUAL( 1, var_len ); 00290 ncol_val = (int*)var_data; 00291 CHECK_EQUAL( 3458, ncol_val[0] ); 00292 } 00293 00294 void test_gather_onevar() 00295 { 00296 Core moab; 00297 Interface& mb = moab; 00298 00299 EntityHandle file_set; 00300 ErrorCode rval = mb.create_meshset( MESHSET_SET, file_set );CHECK_ERR( rval ); 00301 00302 std::string opts; 00303 get_options( opts ); 00304 00305 // Read vertex variable T and create gather set on processor 0 00306 opts += ";VARIABLE=T;GATHER_SET=0"; 00307 #ifdef MOAB_HAVE_MPI 00308 opts += ";PARALLEL_RESOLVE_SHARED_ENTS"; 00309 #endif 00310 rval = mb.load_file( example.c_str(), &file_set, opts.c_str() );CHECK_ERR( rval ); 00311 00312 #ifdef MOAB_HAVE_MPI 00313 ParallelComm* pcomm = ParallelComm::get_pcomm( &mb, 0 ); 00314 int rank = pcomm->proc_config().proc_rank(); 00315 00316 Range verts, verts_owned; 00317 rval = mb.get_entities_by_type( file_set, MBVERTEX, verts );CHECK_ERR( rval ); 00318 00319 // Get local owned vertices 00320 rval = pcomm->filter_pstatus( verts, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, &verts_owned );CHECK_ERR( rval ); 00321 00322 EntityHandle gather_set = 0; 00323 if( 0 == rank ) 00324 { 00325 // Get gather set 00326 ReadUtilIface* readUtilIface; 00327 mb.query_interface( readUtilIface ); 00328 rval = readUtilIface->get_gather_set( gather_set );CHECK_ERR( rval ); 00329 assert( gather_set != 0 ); 00330 } 00331 00332 Tag Ttag0, gid_tag; 00333 rval = mb.tag_get_handle( "T0", levels, MB_TYPE_DOUBLE, Ttag0, MB_TAG_DENSE );CHECK_ERR( rval ); 00334 00335 gid_tag = mb.globalId_tag(); 00336 00337 pcomm->gather_data( verts_owned, Ttag0, gid_tag, gather_set, 0 ); 00338 00339 if( 0 == rank ) 00340 { 00341 // Get gather set vertices 00342 Range gather_set_verts; 00343 rval = mb.get_entities_by_type( gather_set, MBVERTEX, gather_set_verts );CHECK_ERR( rval ); 00344 CHECK_EQUAL( (size_t)3458, gather_set_verts.size() ); 00345 00346 // Get T0 tag values on 4 strategically selected gather set vertices 00347 double T0_val[4 * levels]; 00348 EntityHandle vert_ents[] = { gather_set_verts[0], gather_set_verts[1728], gather_set_verts[1729], 00349 gather_set_verts[3457] }; 00350 rval = mb.tag_get_data( Ttag0, vert_ents, 4, T0_val );CHECK_ERR( rval ); 00351 00352 const double eps = 0.001; 00353 00354 // Check first level values 00355 CHECK_REAL_EQUAL( 233.1136, T0_val[0 * levels], eps ); // First vert 00356 CHECK_REAL_EQUAL( 236.1505, T0_val[1 * levels], eps ); // Median vert 00357 CHECK_REAL_EQUAL( 235.7722, T0_val[2 * levels], eps ); // Median vert 00358 CHECK_REAL_EQUAL( 234.0416, T0_val[3 * levels], eps ); // Last vert 00359 } 00360 #endif 00361 } 00362 00363 void test_read_conn() 00364 { 00365 Core moab; 00366 Interface& mb = moab; 00367 00368 std::string opts; 00369 get_options( opts ); 00370 00371 ErrorCode rval = mb.load_file( conn_fname.c_str(), NULL, opts.c_str() );CHECK_ERR( rval ); 00372 00373 #ifdef MOAB_HAVE_MPI 00374 ParallelComm* pcomm = ParallelComm::get_pcomm( &mb, 0 ); 00375 int procs = pcomm->proc_config().proc_size(); 00376 #else 00377 int procs = 1; 00378 #endif 00379 00380 // Make check runs this test on one processor 00381 if( 1 == procs ) 00382 { 00383 // Get vertices 00384 Range verts; 00385 rval = mb.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval ); 00386 CHECK_EQUAL( (size_t)3458, verts.size() ); 00387 00388 // Get cells 00389 Range cells; 00390 rval = mb.get_entities_by_type( 0, MBQUAD, cells );CHECK_ERR( rval ); 00391 CHECK_EQUAL( (size_t)3456, cells.size() ); 00392 } 00393 } 00394 00395 void get_options( std::string& opts ) 00396 { 00397 #ifdef MOAB_HAVE_MPI 00398 // Use parallel options 00399 opts = std::string( ";;PARALLEL=READ_PART;PARTITION_METHOD=TRIVIAL" ); 00400 #else 00401 opts = std::string( ";;" ); 00402 #endif 00403 }