MOAB: Mesh Oriented datABase  (version 5.4.1)
write_nc.cpp
Go to the documentation of this file.
00001 #include "TestUtil.hpp"
00002 #include "moab/Core.hpp"
00003 
00004 using namespace moab;
00005 
00006 std::string example_eul    = TestDir + "unittest/io/eul3x48x96.t.3.nc";
00007 std::string example_eul_t0 = TestDir + "unittest/io/eul3x48x96.t0.nc";
00008 std::string example_eul_t1 = TestDir + "unittest/io/eul3x48x96.t1.nc";
00009 std::string example_eul_t2 = TestDir + "unittest/io/eul3x48x96.t2.nc";
00010 std::string example_fv     = TestDir + "unittest/io/fv3x46x72.t.3.nc";
00011 std::string example_homme  = TestDir + "unittest/io/homme3x3458.t.3.nc";
00012 std::string example_mpas   = TestDir + "unittest/io/mpasx1.642.t.2.nc";
00013 std::string example_gcrm   = TestDir + "unittest/io/gcrm_r3.nc";
00014 
00015 #ifdef MOAB_HAVE_MPI
00016 #include "moab_mpi.h"
00017 #include "moab/ParallelComm.hpp"
00018 #endif
00019 
00020 #ifdef MOAB_HAVE_PNETCDF
00021 #include "pnetcdf.h"
00022 #define NCFUNC( func ) ncmpi_##func
00023 #define NCDF_SIZE      MPI_Offset
00024 #else
00025 #include "netcdf.h"
00026 #define NCFUNC( func ) nc_##func
00027 #define NCDF_SIZE      size_t
00028 #endif
00029 
00030 // CAM-EUL
00031 void test_eul_read_write_T();
00032 void test_eul_check_T();
00033 
00034 // CAM-FV
00035 void test_fv_read_write_T();
00036 void test_fv_check_T();
00037 
00038 // CAM-SE (HOMME)
00039 void test_homme_read_write_T();
00040 void test_homme_check_T();
00041 
00042 // MPAS
00043 void test_mpas_read_write_vars();
00044 void test_mpas_check_vars();
00045 
00046 // GCRM
00047 void test_gcrm_read_write_vars();
00048 void test_gcrm_check_vars();
00049 
00050 // Test timestep option
00051 void test_eul_read_write_timestep();
00052 void test_eul_check_timestep();
00053 
00054 // Test append option
00055 void test_eul_read_write_append();
00056 void test_eul_check_append();
00057 
00058 // Test writing variables with timesteps spread across files
00059 void test_eul_read_write_across_files();
00060 void test_eul_check_across_files();
00061 
00062 #ifdef MOAB_HAVE_MPI
00063 // Test mesh with ghosted entities
00064 void test_eul_read_write_ghosting();
00065 void test_eul_check_ghosting();
00066 #endif
00067 
00068 void get_eul_read_options( std::string& opts );
00069 void get_fv_read_options( std::string& opts );
00070 void get_homme_read_options( std::string& opts );
00071 void get_mpas_read_options( std::string& opts );
00072 
00073 const double eps      = 1e-10;
00074 const int levels      = 3;
00075 const int mpas_levels = 1;
00076 
00077 int main( int argc, char* argv[] )
00078 {
00079     int result = 0;
00080 
00081 #ifdef MOAB_HAVE_MPI
00082     int fail = MPI_Init( &argc, &argv );
00083     if( fail ) return 1;
00084 #else
00085     argv[0] = argv[argc - argc];  // To remove the warnings in serial mode about unused variables
00086 #endif
00087 
00088     result += RUN_TEST( test_eul_read_write_T );
00089     result += RUN_TEST( test_eul_check_T );
00090 
00091     result += RUN_TEST( test_fv_read_write_T );
00092     result += RUN_TEST( test_fv_check_T );
00093 
00094     result += RUN_TEST( test_homme_read_write_T );
00095     result += RUN_TEST( test_homme_check_T );
00096 
00097     result += RUN_TEST( test_mpas_read_write_vars );
00098     result += RUN_TEST( test_mpas_check_vars );
00099 
00100     result += RUN_TEST( test_gcrm_read_write_vars );
00101     result += RUN_TEST( test_gcrm_check_vars );
00102 
00103     result += RUN_TEST( test_eul_read_write_timestep );
00104     result += RUN_TEST( test_eul_check_timestep );
00105 
00106     result += RUN_TEST( test_eul_read_write_append );
00107     result += RUN_TEST( test_eul_check_append );
00108 
00109     result += RUN_TEST( test_eul_read_write_across_files );
00110     result += RUN_TEST( test_eul_check_across_files );
00111 
00112 #ifdef MOAB_HAVE_MPI
00113     result += RUN_TEST( test_eul_read_write_ghosting );
00114     result += RUN_TEST( test_eul_check_ghosting );
00115 #endif
00116 
00117 #ifdef MOAB_HAVE_MPI
00118     fail = MPI_Finalize();
00119     if( fail ) return 1;
00120 #endif
00121 
00122     return result;
00123 }
00124 
00125 // We also read and write gw (test writing a set variable without timesteps)
00126 void test_eul_read_write_T()
00127 {
00128     int procs = 1;
00129 #ifdef MOAB_HAVE_MPI
00130     MPI_Comm_size( MPI_COMM_WORLD, &procs );
00131 #endif
00132 
00133 // We will not test NC writer in parallel without pnetcdf support
00134 #ifndef MOAB_HAVE_PNETCDF
00135     if( procs > 1 ) return;
00136 #endif
00137 
00138     Core moab;
00139     Interface& mb = moab;
00140 
00141     std::string read_opts;
00142     get_eul_read_options( read_opts );
00143 
00144     EntityHandle set;
00145     ErrorCode rval = mb.create_meshset( MESHSET_SET, set );CHECK_ERR( rval );
00146 
00147     // Read non-set variable T and set variable gw
00148     read_opts += ";VARIABLE=T,gw;DEBUG_IO=0";
00149     rval = mb.load_file( example_eul.c_str(), &set, read_opts.c_str() );CHECK_ERR( rval );
00150 
00151     // Write variables T and gw
00152     std::string write_opts = ";;VARIABLE=T,gw;DEBUG_IO=0";
00153 #ifdef MOAB_HAVE_MPI
00154     // Use parallel options
00155     write_opts += ";PARALLEL=WRITE_PART";
00156 #endif
00157     if( procs > 1 )
00158         rval = mb.write_file( "test_par_eul_T.nc", 0, write_opts.c_str(), &set, 1 );
00159     else
00160         rval = mb.write_file( "test_eul_T.nc", 0, write_opts.c_str(), &set, 1 );CHECK_ERR( rval );
00161 }
00162 
00163 // Check non-set variable T
00164 // Also check set variable gw
00165 void test_eul_check_T()
00166 {
00167     int rank  = 0;
00168     int procs = 1;
00169 #ifdef MOAB_HAVE_MPI
00170     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
00171     MPI_Comm_size( MPI_COMM_WORLD, &procs );
00172 #endif
00173 
00174 // We will not test NC writer in parallel without pnetcdf support
00175 #ifndef MOAB_HAVE_PNETCDF
00176     if( procs > 1 ) return;
00177 #endif
00178 
00179     if( 0 == rank )
00180     {
00181         int ncid;
00182         int ncid_ref;
00183         int success;
00184 
00185         std::string filename;
00186         if( procs > 1 )
00187             filename = "test_par_eul_T.nc";
00188         else
00189             filename = "test_eul_T.nc";
00190 
00191 #ifdef MOAB_HAVE_PNETCDF
00192         success = NCFUNC( open )( MPI_COMM_SELF, filename.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid );
00193 #else
00194         success = NCFUNC( open )( filename.c_str(), NC_NOWRITE, &ncid );
00195 #endif
00196         CHECK_EQUAL( 0, success );
00197 
00198 #ifdef MOAB_HAVE_PNETCDF
00199         success = NCFUNC( open )( MPI_COMM_SELF, example_eul.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid_ref );
00200 #else
00201         success = NCFUNC( open )( example_eul.c_str(), NC_NOWRITE, &ncid_ref );
00202 #endif
00203         CHECK_EQUAL( 0, success );
00204 
00205         int T_id;
00206         success = NCFUNC( inq_varid )( ncid, "T", &T_id );
00207         CHECK_EQUAL( 0, success );
00208 
00209         int T_id_ref;
00210         success = NCFUNC( inq_varid )( ncid_ref, "T", &T_id_ref );
00211         CHECK_EQUAL( 0, success );
00212 
00213         int gw_id;
00214         success = NCFUNC( inq_varid )( ncid, "gw", &gw_id );
00215         CHECK_EQUAL( 0, success );
00216 
00217         int gw_id_ref;
00218         success = NCFUNC( inq_varid )( ncid_ref, "gw", &gw_id_ref );
00219         CHECK_EQUAL( 0, success );
00220 
00221 #ifdef MOAB_HAVE_PNETCDF
00222         // Enter independent I/O mode
00223         success = NCFUNC( begin_indep_data )( ncid );
00224         CHECK_EQUAL( 0, success );
00225 #endif
00226 
00227 #ifdef MOAB_HAVE_PNETCDF
00228         // Enter independent I/O mode
00229         success = NCFUNC( begin_indep_data )( ncid_ref );
00230         CHECK_EQUAL( 0, success );
00231 #endif
00232 
00233         NCDF_SIZE start[] = { 0, 0, 0, 0 };
00234         NCDF_SIZE count[] = { 3, levels, 48, 96 };
00235         const int size    = 3 * levels * 48 * 96;
00236 
00237         // Read variable T from output file
00238         double T_vals[size];
00239         success = NCFUNC( get_vara_double )( ncid, T_id, start, count, T_vals );
00240         CHECK_EQUAL( 0, success );
00241 
00242         // Read variable T from reference file
00243         double T_vals_ref[size];
00244         success = NCFUNC( get_vara_double )( ncid_ref, T_id_ref, start, count, T_vals_ref );
00245         CHECK_EQUAL( 0, success );
00246 
00247         // Read variable gw (on lat) from output file
00248         count[0] = 48;
00249         double gw_vals[48];
00250         success = NCFUNC( get_vara_double )( ncid, gw_id, start, count, gw_vals );
00251         CHECK_EQUAL( 0, success );
00252 
00253         // Read variable gw (on lat) from reference file
00254         double gw_vals_ref[48];
00255         success = NCFUNC( get_vara_double )( ncid_ref, gw_id_ref, start, count, gw_vals_ref );
00256         CHECK_EQUAL( 0, success );
00257 
00258 #ifdef MOAB_HAVE_PNETCDF
00259         // End independent I/O mode
00260         success = NCFUNC( end_indep_data )( ncid );
00261         CHECK_EQUAL( 0, success );
00262 #endif
00263 
00264 #ifdef MOAB_HAVE_PNETCDF
00265         // End independent I/O mode
00266         success = NCFUNC( end_indep_data )( ncid_ref );
00267         CHECK_EQUAL( 0, success );
00268 #endif
00269 
00270         success = NCFUNC( close )( ncid );
00271         CHECK_EQUAL( 0, success );
00272 
00273         success = NCFUNC( close )( ncid_ref );
00274         CHECK_EQUAL( 0, success );
00275 
00276         // Check T values
00277         for( int i = 0; i < size; i++ )
00278             CHECK_REAL_EQUAL( T_vals_ref[i], T_vals[i], eps );
00279 
00280         // Check gw values
00281         for( int i = 0; i < 48; i++ )
00282             CHECK_REAL_EQUAL( gw_vals_ref[i], gw_vals[i], eps );
00283     }
00284 }
00285 
00286 void test_fv_read_write_T()
00287 {
00288     int procs = 1;
00289 #ifdef MOAB_HAVE_MPI
00290     MPI_Comm_size( MPI_COMM_WORLD, &procs );
00291 #endif
00292 
00293 // We will not test NC writer in parallel without pnetcdf support
00294 #ifndef MOAB_HAVE_PNETCDF
00295     if( procs > 1 ) return;
00296 #endif
00297 
00298     Core moab;
00299     Interface& mb = moab;
00300 
00301     std::string read_opts;
00302     get_fv_read_options( read_opts );
00303 
00304     EntityHandle set;
00305     ErrorCode rval = mb.create_meshset( MESHSET_SET, set );CHECK_ERR( rval );
00306 
00307     // Read non-set variable T
00308     read_opts += ";VARIABLE=T;DEBUG_IO=0";
00309     rval = mb.load_file( example_fv.c_str(), &set, read_opts.c_str() );CHECK_ERR( rval );
00310 
00311     // Write variable T
00312     std::string write_opts = ";;VARIABLE=T;DEBUG_IO=0";
00313 #ifdef MOAB_HAVE_MPI
00314     // Use parallel options
00315     write_opts += ";PARALLEL=WRITE_PART";
00316 #endif
00317     if( procs > 1 )
00318         rval = mb.write_file( "test_par_fv_T.nc", 0, write_opts.c_str(), &set, 1 );
00319     else
00320         rval = mb.write_file( "test_fv_T.nc", 0, write_opts.c_str(), &set, 1 );CHECK_ERR( rval );
00321 }
00322 
00323 // Check non-set variable T
00324 void test_fv_check_T()
00325 {
00326     int rank  = 0;
00327     int procs = 1;
00328 #ifdef MOAB_HAVE_MPI
00329     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
00330     MPI_Comm_size( MPI_COMM_WORLD, &procs );
00331 #endif
00332 
00333 // We will not test NC writer in parallel without pnetcdf support
00334 #ifndef MOAB_HAVE_PNETCDF
00335     if( procs > 1 ) return;
00336 #endif
00337 
00338     if( 0 == rank )
00339     {
00340         int ncid;
00341         int ncid_ref;
00342         int success;
00343 
00344         std::string filename;
00345         if( procs > 1 )
00346             filename = "test_par_fv_T.nc";
00347         else
00348             filename = "test_fv_T.nc";
00349 
00350 #ifdef MOAB_HAVE_PNETCDF
00351         success = NCFUNC( open )( MPI_COMM_SELF, filename.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid );
00352 #else
00353         success = NCFUNC( open )( filename.c_str(), NC_NOWRITE, &ncid );
00354 #endif
00355         CHECK_EQUAL( 0, success );
00356 
00357 #ifdef MOAB_HAVE_PNETCDF
00358         success = NCFUNC( open )( MPI_COMM_SELF, example_fv.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid_ref );
00359 #else
00360         success = NCFUNC( open )( example_fv.c_str(), NC_NOWRITE, &ncid_ref );
00361 #endif
00362         CHECK_EQUAL( 0, success );
00363 
00364         int T_id;
00365         success = NCFUNC( inq_varid )( ncid, "T", &T_id );
00366         CHECK_EQUAL( 0, success );
00367 
00368         int T_id_ref;
00369         success = NCFUNC( inq_varid )( ncid_ref, "T", &T_id_ref );
00370         CHECK_EQUAL( 0, success );
00371 
00372 #ifdef MOAB_HAVE_PNETCDF
00373         // Enter independent I/O mode
00374         success = NCFUNC( begin_indep_data )( ncid );
00375         CHECK_EQUAL( 0, success );
00376 #endif
00377 
00378 #ifdef MOAB_HAVE_PNETCDF
00379         // Enter independent I/O mode
00380         success = NCFUNC( begin_indep_data )( ncid_ref );
00381         CHECK_EQUAL( 0, success );
00382 #endif
00383 
00384         NCDF_SIZE start[] = { 0, 0, 0, 0 };
00385         NCDF_SIZE count[] = { 3, levels, 46, 72 };
00386         const int size    = 3 * levels * 46 * 72;
00387 
00388         // Read variable T from output file
00389         double T_vals[size];
00390         success = NCFUNC( get_vara_double )( ncid, T_id, start, count, T_vals );
00391         CHECK_EQUAL( 0, success );
00392 
00393         // Read variable T from reference file
00394         double T_vals_ref[size];
00395         success = NCFUNC( get_vara_double )( ncid_ref, T_id_ref, start, count, T_vals_ref );
00396         CHECK_EQUAL( 0, success );
00397 
00398 #ifdef MOAB_HAVE_PNETCDF
00399         // End independent I/O mode
00400         success = NCFUNC( end_indep_data )( ncid );
00401         CHECK_EQUAL( 0, success );
00402 #endif
00403 
00404 #ifdef MOAB_HAVE_PNETCDF
00405         // End independent I/O mode
00406         success = NCFUNC( end_indep_data )( ncid_ref );
00407         CHECK_EQUAL( 0, success );
00408 #endif
00409 
00410         success = NCFUNC( close )( ncid );
00411         CHECK_EQUAL( 0, success );
00412 
00413         success = NCFUNC( close )( ncid_ref );
00414         CHECK_EQUAL( 0, success );
00415 
00416         // Check T values
00417         for( int i = 0; i < size; i++ )
00418             CHECK_REAL_EQUAL( T_vals_ref[i], T_vals[i], eps );
00419     }
00420 }
00421 
00422 // We also read and write lat (test writing a set variable without timesteps)
00423 void test_homme_read_write_T()
00424 {
00425     int procs = 1;
00426 #ifdef MOAB_HAVE_MPI
00427     MPI_Comm_size( MPI_COMM_WORLD, &procs );
00428 #endif
00429 
00430 // We will not test NC writer in parallel without pnetcdf support
00431 #ifndef MOAB_HAVE_PNETCDF
00432     if( procs > 1 ) return;
00433 #endif
00434 
00435     Core moab;
00436     Interface& mb = moab;
00437 
00438     std::string read_opts;
00439     get_homme_read_options( read_opts );
00440 
00441     EntityHandle set;
00442     ErrorCode rval = mb.create_meshset( MESHSET_SET, set );CHECK_ERR( rval );
00443 
00444     // Read non-set variable T and set variable lat
00445     read_opts += ";VARIABLE=T,lat;DEBUG_IO=0";
00446     if( procs > 1 )
00447     {
00448         // Rotate trivial partition, otherwise localGidVertsOwned.psize() is always 1
00449         read_opts += ";PARALLEL_RESOLVE_SHARED_ENTS;TRIVIAL_PARTITION_SHIFT=1";
00450     }
00451     rval = mb.load_file( example_homme.c_str(), &set, read_opts.c_str() );CHECK_ERR( rval );
00452 
00453     // Write variables T and lat
00454     std::string write_opts = ";;VARIABLE=T,lat;DEBUG_IO=0";
00455 #ifdef MOAB_HAVE_MPI
00456     // Use parallel options
00457     write_opts += ";PARALLEL=WRITE_PART";
00458 #endif
00459     if( procs > 1 )
00460         rval = mb.write_file( "test_par_homme_T.nc", 0, write_opts.c_str(), &set, 1 );
00461     else
00462         rval = mb.write_file( "test_homme_T.nc", 0, write_opts.c_str(), &set, 1 );CHECK_ERR( rval );
00463 }
00464 
00465 // Check non-set variable T
00466 // Also check set variable lat
00467 void test_homme_check_T()
00468 {
00469     int rank  = 0;
00470     int procs = 1;
00471 #ifdef MOAB_HAVE_MPI
00472     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
00473     MPI_Comm_size( MPI_COMM_WORLD, &procs );
00474 #endif
00475 
00476 // We will not test NC writer in parallel without pnetcdf support
00477 #ifndef MOAB_HAVE_PNETCDF
00478     if( procs > 1 ) return;
00479 #endif
00480 
00481     if( 0 == rank )
00482     {
00483         int ncid;
00484         int ncid_ref;
00485         int success;
00486 
00487         std::string filename;
00488         if( procs > 1 )
00489             filename = "test_par_homme_T.nc";
00490         else
00491             filename = "test_homme_T.nc";
00492 
00493 #ifdef MOAB_HAVE_PNETCDF
00494         success = NCFUNC( open )( MPI_COMM_SELF, filename.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid );
00495 #else
00496         success = NCFUNC( open )( filename.c_str(), NC_NOWRITE, &ncid );
00497 #endif
00498         CHECK_EQUAL( 0, success );
00499 
00500 #ifdef MOAB_HAVE_PNETCDF
00501         success = NCFUNC( open )( MPI_COMM_SELF, example_homme.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid_ref );
00502 #else
00503         success = NCFUNC( open )( example_homme.c_str(), NC_NOWRITE, &ncid_ref );
00504 #endif
00505         CHECK_EQUAL( 0, success );
00506 
00507         int T_id;
00508         success = NCFUNC( inq_varid )( ncid, "T", &T_id );
00509         CHECK_EQUAL( 0, success );
00510 
00511         int T_id_ref;
00512         success = NCFUNC( inq_varid )( ncid_ref, "T", &T_id_ref );
00513         CHECK_EQUAL( 0, success );
00514 
00515         int lat_id;
00516         success = NCFUNC( inq_varid )( ncid, "lat", &lat_id );
00517         CHECK_EQUAL( 0, success );
00518 
00519         int lat_id_ref;
00520         success = NCFUNC( inq_varid )( ncid_ref, "lat", &lat_id_ref );
00521         CHECK_EQUAL( 0, success );
00522 
00523 #ifdef MOAB_HAVE_PNETCDF
00524         // Enter independent I/O mode
00525         success = NCFUNC( begin_indep_data )( ncid );
00526         CHECK_EQUAL( 0, success );
00527 #endif
00528 
00529 #ifdef MOAB_HAVE_PNETCDF
00530         // Enter independent I/O mode
00531         success = NCFUNC( begin_indep_data )( ncid_ref );
00532         CHECK_EQUAL( 0, success );
00533 #endif
00534 
00535         NCDF_SIZE start[] = { 0, 0, 0 };
00536         NCDF_SIZE count[] = { 3, levels, 3458 };
00537         const int size    = 3 * levels * 3458;
00538 
00539         // Read variable T from output file
00540         double T_vals[size];
00541         success = NCFUNC( get_vara_double )( ncid, T_id, start, count, T_vals );
00542         CHECK_EQUAL( 0, success );
00543 
00544         // Read variable T from reference file
00545         double T_vals_ref[size];
00546         success = NCFUNC( get_vara_double )( ncid_ref, T_id_ref, start, count, T_vals_ref );
00547         CHECK_EQUAL( 0, success );
00548 
00549         // Read variable lat from output file
00550         count[0] = 3458;
00551         double lat_vals[3458];
00552         success = NCFUNC( get_vara_double )( ncid, lat_id, start, count, lat_vals );
00553         CHECK_EQUAL( 0, success );
00554 
00555         // Read variable lat from reference file
00556         double lat_vals_ref[3458];
00557         success = NCFUNC( get_vara_double )( ncid_ref, lat_id_ref, start, count, lat_vals_ref );
00558         CHECK_EQUAL( 0, success );
00559 
00560 #ifdef MOAB_HAVE_PNETCDF
00561         // End independent I/O mode
00562         success = NCFUNC( end_indep_data )( ncid );
00563         CHECK_EQUAL( 0, success );
00564 #endif
00565 
00566 #ifdef MOAB_HAVE_PNETCDF
00567         // End independent I/O mode
00568         success = NCFUNC( end_indep_data )( ncid_ref );
00569         CHECK_EQUAL( 0, success );
00570 #endif
00571 
00572         success = NCFUNC( close )( ncid );
00573         CHECK_EQUAL( 0, success );
00574 
00575         success = NCFUNC( close )( ncid_ref );
00576         CHECK_EQUAL( 0, success );
00577 
00578         // Check T values
00579         for( int i = 0; i < size; i++ )
00580             CHECK_REAL_EQUAL( T_vals_ref[i], T_vals[i], eps );
00581 
00582         // Check gw values
00583         for( int i = 0; i < 3458; i++ )
00584             CHECK_REAL_EQUAL( lat_vals_ref[i], lat_vals[i], eps );
00585     }
00586 }
00587 
00588 // Write vertex variable vorticity, edge variable u and cell variable ke
00589 void test_mpas_read_write_vars()
00590 {
00591     int procs = 1;
00592 #ifdef MOAB_HAVE_MPI
00593     MPI_Comm_size( MPI_COMM_WORLD, &procs );
00594 #endif
00595 
00596 // We will not test NC writer in parallel without pnetcdf support
00597 #ifndef MOAB_HAVE_PNETCDF
00598     if( procs > 1 ) return;
00599 #endif
00600 
00601     Core moab;
00602     Interface& mb = moab;
00603 
00604     std::string read_opts;
00605     get_mpas_read_options( read_opts );
00606 
00607     EntityHandle set;
00608     ErrorCode rval = mb.create_meshset( MESHSET_SET, set );CHECK_ERR( rval );
00609 
00610     // Read non-set variables vorticity, u and ke
00611     read_opts += ";VARIABLE=vorticity,u,ke;DEBUG_IO=0";
00612     if( procs > 1 ) read_opts += ";PARALLEL_RESOLVE_SHARED_ENTS";
00613     rval = mb.load_file( example_mpas.c_str(), &set, read_opts.c_str() );CHECK_ERR( rval );
00614 
00615     // Write variables vorticity, u and ke
00616     std::string write_opts = ";;VARIABLE=vorticity,u,ke;DEBUG_IO=0";
00617 #ifdef MOAB_HAVE_MPI
00618     // Use parallel options
00619     write_opts += ";PARALLEL=WRITE_PART";
00620 #endif
00621     if( procs > 1 )
00622         rval = mb.write_file( "test_par_mpas_vars.nc", 0, write_opts.c_str(), &set, 1 );
00623     else
00624         rval = mb.write_file( "test_mpas_vars.nc", 0, write_opts.c_str(), &set, 1 );CHECK_ERR( rval );
00625 }
00626 
00627 // Check vertex variable vorticity, edge variable u and cell variable ke
00628 void test_mpas_check_vars()
00629 {
00630     int rank  = 0;
00631     int procs = 1;
00632 #ifdef MOAB_HAVE_MPI
00633     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
00634     MPI_Comm_size( MPI_COMM_WORLD, &procs );
00635 #endif
00636 
00637 // We will not test NC writer in parallel without pnetcdf support
00638 #ifndef MOAB_HAVE_PNETCDF
00639     if( procs > 1 ) return;
00640 #endif
00641 
00642     if( 0 == rank )
00643     {
00644         int ncid;
00645         int ncid_ref;
00646         int success;
00647 
00648         std::string filename;
00649         if( procs > 1 )
00650             filename = "test_par_mpas_vars.nc";
00651         else
00652             filename = "test_mpas_vars.nc";
00653 
00654 #ifdef MOAB_HAVE_PNETCDF
00655         success = NCFUNC( open )( MPI_COMM_SELF, filename.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid );
00656 #else
00657         success = NCFUNC( open )( filename.c_str(), NC_NOWRITE, &ncid );
00658 #endif
00659         CHECK_EQUAL( 0, success );
00660 
00661 #ifdef MOAB_HAVE_PNETCDF
00662         success = NCFUNC( open )( MPI_COMM_SELF, example_mpas.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid_ref );
00663 #else
00664         success = NCFUNC( open )( example_mpas.c_str(), NC_NOWRITE, &ncid_ref );
00665 #endif
00666         CHECK_EQUAL( 0, success );
00667 
00668         int vorticity_id;
00669         success = NCFUNC( inq_varid )( ncid, "vorticity", &vorticity_id );
00670         CHECK_EQUAL( 0, success );
00671 
00672         int vorticity_id_ref;
00673         success = NCFUNC( inq_varid )( ncid_ref, "vorticity", &vorticity_id_ref );
00674         CHECK_EQUAL( 0, success );
00675 
00676         int u_id;
00677         success = NCFUNC( inq_varid )( ncid, "u", &u_id );
00678         CHECK_EQUAL( 0, success );
00679 
00680         int u_id_ref;
00681         success = NCFUNC( inq_varid )( ncid_ref, "u", &u_id_ref );
00682         CHECK_EQUAL( 0, success );
00683 
00684         int ke_id;
00685         success = NCFUNC( inq_varid )( ncid, "ke", &ke_id );
00686         CHECK_EQUAL( 0, success );
00687 
00688         int ke_id_ref;
00689         success = NCFUNC( inq_varid )( ncid_ref, "ke", &ke_id_ref );
00690         CHECK_EQUAL( 0, success );
00691 
00692 #ifdef MOAB_HAVE_PNETCDF
00693         // Enter independent I/O mode
00694         success = NCFUNC( begin_indep_data )( ncid );
00695         CHECK_EQUAL( 0, success );
00696 #endif
00697 
00698 #ifdef MOAB_HAVE_PNETCDF
00699         // Enter independent I/O mode
00700         success = NCFUNC( begin_indep_data )( ncid_ref );
00701         CHECK_EQUAL( 0, success );
00702 #endif
00703 
00704         NCDF_SIZE start[] = { 0, 0, 0 };
00705         NCDF_SIZE count[] = { 2, 1, mpas_levels };
00706         const int size1   = 2 * 1280 * mpas_levels;
00707         const int size2   = 2 * 1920 * mpas_levels;
00708         const int size3   = 2 * 642 * mpas_levels;
00709 
00710         // Read vertex variable vorticity from output file
00711         count[1] = 1280;
00712         double vorticity_vals[size1];
00713         success = NCFUNC( get_vara_double )( ncid, vorticity_id, start, count, vorticity_vals );
00714         CHECK_EQUAL( 0, success );
00715 
00716         // Read vertex variable vorticity from reference file
00717         double vorticity_vals_ref[size1];
00718         success = NCFUNC( get_vara_double )( ncid_ref, vorticity_id_ref, start, count, vorticity_vals_ref );
00719         CHECK_EQUAL( 0, success );
00720 
00721         // Read edge variable u from output file
00722         count[1] = 1920;
00723         double u_vals[size2];
00724         success = NCFUNC( get_vara_double )( ncid, u_id, start, count, u_vals );
00725         CHECK_EQUAL( 0, success );
00726 
00727         // Read edge variable u from reference file
00728         double u_vals_ref[size2];
00729         success = NCFUNC( get_vara_double )( ncid_ref, u_id_ref, start, count, u_vals_ref );
00730         CHECK_EQUAL( 0, success );
00731 
00732         // Read cell variable ke from output file
00733         count[1] = 642;
00734         double ke_vals[size3];
00735         success = NCFUNC( get_vara_double )( ncid, ke_id, start, count, ke_vals );
00736         CHECK_EQUAL( 0, success );
00737 
00738         // Read cell variable ke from reference file
00739         double ke_vals_ref[size3];
00740         success = NCFUNC( get_vara_double )( ncid_ref, ke_id_ref, start, count, ke_vals_ref );
00741         CHECK_EQUAL( 0, success );
00742 
00743 #ifdef MOAB_HAVE_PNETCDF
00744         // End independent I/O mode
00745         success = NCFUNC( end_indep_data )( ncid );
00746         CHECK_EQUAL( 0, success );
00747 #endif
00748 
00749 #ifdef MOAB_HAVE_PNETCDF
00750         // End independent I/O mode
00751         success = NCFUNC( end_indep_data )( ncid_ref );
00752         CHECK_EQUAL( 0, success );
00753 #endif
00754 
00755         success = NCFUNC( close )( ncid );
00756         CHECK_EQUAL( 0, success );
00757 
00758         success = NCFUNC( close )( ncid_ref );
00759         CHECK_EQUAL( 0, success );
00760 
00761         // Check vorticity values
00762         for( int i = 0; i < size1; i++ )
00763             CHECK_REAL_EQUAL( vorticity_vals_ref[i], vorticity_vals[i], eps );
00764 
00765         // Check u values
00766         for( int i = 0; i < size2; i++ )
00767             CHECK_REAL_EQUAL( u_vals_ref[i], u_vals[i], eps );
00768 
00769         // Check ke values
00770         for( int i = 0; i < size3; i++ )
00771             CHECK_REAL_EQUAL( ke_vals_ref[i], ke_vals[i], eps );
00772     }
00773 }
00774 
00775 // Write vertex variable u, edge variable wind, cell variable vorticity (on layers),
00776 // and cell variable pressure (on interfaces)
00777 void test_gcrm_read_write_vars()
00778 {
00779     int procs = 1;
00780 #ifdef MOAB_HAVE_MPI
00781     MPI_Comm_size( MPI_COMM_WORLD, &procs );
00782 #endif
00783 
00784 // We will not test NC writer in parallel without pnetcdf support
00785 #ifndef MOAB_HAVE_PNETCDF
00786     if( procs > 1 ) return;
00787 #endif
00788 
00789     Core moab;
00790     Interface& mb = moab;
00791 
00792     std::string read_opts;
00793     // we can use the same base options as mpas, because the zoltan can apply too
00794     get_mpas_read_options( read_opts );
00795 
00796     EntityHandle set;
00797     ErrorCode rval = mb.create_meshset( MESHSET_SET, set );CHECK_ERR( rval );
00798 
00799     // Read non-set variables u, wind, vorticity and pressure
00800     read_opts += ";VARIABLE=u,wind,vorticity,pressure;DEBUG_IO=0";
00801     if( procs > 1 ) read_opts += ";PARALLEL_RESOLVE_SHARED_ENTS";
00802     rval = mb.load_file( example_gcrm.c_str(), &set, read_opts.c_str() );CHECK_ERR( rval );
00803 
00804     // Write variables u, wind, vorticity and pressure
00805     std::string write_opts = ";;VARIABLE=u,wind,vorticity,pressure;DEBUG_IO=0";
00806 #ifdef MOAB_HAVE_MPI
00807     // Use parallel options
00808     write_opts += ";PARALLEL=WRITE_PART";
00809 #endif
00810     if( procs > 1 )
00811         rval = mb.write_file( "test_par_gcrm_vars.nc", 0, write_opts.c_str(), &set, 1 );
00812     else
00813         rval = mb.write_file( "test_gcrm_vars.nc", 0, write_opts.c_str(), &set, 1 );CHECK_ERR( rval );
00814 }
00815 
00816 // Check vertex variable u, edge variable wind, cell variable vorticity (on layers),
00817 // and cell variable pressure (on interfaces)
00818 void test_gcrm_check_vars()
00819 {
00820     int rank  = 0;
00821     int procs = 1;
00822 #ifdef MOAB_HAVE_MPI
00823     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
00824     MPI_Comm_size( MPI_COMM_WORLD, &procs );
00825 #endif
00826 
00827 // We will not test NC writer in parallel without pnetcdf support
00828 #ifndef MOAB_HAVE_PNETCDF
00829     if( procs > 1 ) return;
00830 #endif
00831 
00832     if( 0 == rank )
00833     {
00834         int ncid;
00835         int ncid_ref;
00836         int success;
00837 
00838         std::string filename;
00839         if( procs > 1 )
00840             filename = "test_par_gcrm_vars.nc";
00841         else
00842             filename = "test_gcrm_vars.nc";
00843 
00844 #ifdef MOAB_HAVE_PNETCDF
00845         success = NCFUNC( open )( MPI_COMM_SELF, filename.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid );
00846 #else
00847         success = NCFUNC( open )( filename.c_str(), NC_NOWRITE, &ncid );
00848 #endif
00849         CHECK_EQUAL( 0, success );
00850 
00851 #ifdef MOAB_HAVE_PNETCDF
00852         success = NCFUNC( open )( MPI_COMM_SELF, example_gcrm.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid_ref );
00853 #else
00854         success = NCFUNC( open )( example_gcrm.c_str(), NC_NOWRITE, &ncid_ref );
00855 #endif
00856         CHECK_EQUAL( 0, success );
00857 
00858         int u_id;
00859         success = NCFUNC( inq_varid )( ncid, "u", &u_id );
00860         CHECK_EQUAL( 0, success );
00861 
00862         int u_id_ref;
00863         success = NCFUNC( inq_varid )( ncid_ref, "u", &u_id_ref );
00864         CHECK_EQUAL( 0, success );
00865 
00866         int wind_id;
00867         success = NCFUNC( inq_varid )( ncid, "wind", &wind_id );
00868         CHECK_EQUAL( 0, success );
00869 
00870         int wind_id_ref;
00871         success = NCFUNC( inq_varid )( ncid_ref, "wind", &wind_id_ref );
00872         CHECK_EQUAL( 0, success );
00873 
00874         int vorticity_id;
00875         success = NCFUNC( inq_varid )( ncid, "vorticity", &vorticity_id );
00876         CHECK_EQUAL( 0, success );
00877 
00878         int vorticity_id_ref;
00879         success = NCFUNC( inq_varid )( ncid_ref, "vorticity", &vorticity_id_ref );
00880         CHECK_EQUAL( 0, success );
00881 
00882         int pressure_id;
00883         success = NCFUNC( inq_varid )( ncid, "pressure", &pressure_id );
00884         CHECK_EQUAL( 0, success );
00885 
00886         int pressure_id_ref;
00887         success = NCFUNC( inq_varid )( ncid_ref, "pressure", &pressure_id_ref );
00888         CHECK_EQUAL( 0, success );
00889 
00890 #ifdef MOAB_HAVE_PNETCDF
00891         // Enter independent I/O mode
00892         success = NCFUNC( begin_indep_data )( ncid );
00893         CHECK_EQUAL( 0, success );
00894 #endif
00895 
00896 #ifdef MOAB_HAVE_PNETCDF
00897         // Enter independent I/O mode
00898         success = NCFUNC( begin_indep_data )( ncid_ref );
00899         CHECK_EQUAL( 0, success );
00900 #endif
00901 
00902         NCDF_SIZE start[] = { 0, 0, 0 };
00903         NCDF_SIZE count[] = { 2, 1, levels };
00904         const int size1   = 2 * 1280 * levels;
00905         const int size2   = 2 * 1920 * levels;
00906         const int size3   = 2 * 642 * levels;
00907 
00908         // Read vertex variable u from output file
00909         count[1] = 1280;
00910         double u_vals[size1];
00911         success = NCFUNC( get_vara_double )( ncid, u_id, start, count, u_vals );
00912         CHECK_EQUAL( 0, success );
00913 
00914         // Read vertex variable u from reference file
00915         double u_vals_ref[size1];
00916         success = NCFUNC( get_vara_double )( ncid_ref, u_id_ref, start, count, u_vals_ref );
00917         CHECK_EQUAL( 0, success );
00918 
00919         // Read edge variable wind from output file
00920         count[1] = 1920;
00921         double wind_vals[size2];
00922         success = NCFUNC( get_vara_double )( ncid, wind_id, start, count, wind_vals );
00923         CHECK_EQUAL( 0, success );
00924 
00925         // Read edge variable wind from reference file
00926         double wind_vals_ref[size2];
00927         success = NCFUNC( get_vara_double )( ncid_ref, wind_id_ref, start, count, wind_vals_ref );
00928         CHECK_EQUAL( 0, success );
00929 
00930         // Read cell variable vorticity from output file
00931         count[1] = 642;
00932         double vorticity_vals[size3];
00933         success = NCFUNC( get_vara_double )( ncid, vorticity_id, start, count, vorticity_vals );
00934         CHECK_EQUAL( 0, success );
00935 
00936         // Read cell variable vorticity from reference file
00937         double vorticity_vals_ref[size3];
00938         success = NCFUNC( get_vara_double )( ncid_ref, vorticity_id_ref, start, count, vorticity_vals_ref );
00939         CHECK_EQUAL( 0, success );
00940 
00941         // Read cell variable pressure from output file
00942         double pressure_vals[size3];
00943         success = NCFUNC( get_vara_double )( ncid, pressure_id, start, count, pressure_vals );
00944         CHECK_EQUAL( 0, success );
00945 
00946         // Read cell variable pressure from reference file
00947         double pressure_vals_ref[size3];
00948         success = NCFUNC( get_vara_double )( ncid_ref, pressure_id_ref, start, count, pressure_vals_ref );
00949         CHECK_EQUAL( 0, success );
00950 
00951 #ifdef MOAB_HAVE_PNETCDF
00952         // End independent I/O mode
00953         success = NCFUNC( end_indep_data )( ncid );
00954         CHECK_EQUAL( 0, success );
00955 #endif
00956 
00957 #ifdef MOAB_HAVE_PNETCDF
00958         // End independent I/O mode
00959         success = NCFUNC( end_indep_data )( ncid_ref );
00960         CHECK_EQUAL( 0, success );
00961 #endif
00962 
00963         success = NCFUNC( close )( ncid );
00964         CHECK_EQUAL( 0, success );
00965 
00966         success = NCFUNC( close )( ncid_ref );
00967         CHECK_EQUAL( 0, success );
00968 
00969         // Check u values
00970         for( int i = 0; i < size1; i++ )
00971             CHECK_REAL_EQUAL( u_vals_ref[i], u_vals[i], eps );
00972 
00973         // Check wind values
00974         for( int i = 0; i < size2; i++ )
00975             CHECK_REAL_EQUAL( wind_vals_ref[i], wind_vals[i], eps );
00976 
00977         // Check vorticity and pressure values
00978         for( int i = 0; i < size3; i++ )
00979         {
00980             CHECK_REAL_EQUAL( vorticity_vals_ref[i], vorticity_vals[i], eps );
00981             CHECK_REAL_EQUAL( pressure_vals_ref[i], pressure_vals[i], eps );
00982         }
00983     }
00984 }
00985 
00986 // Read non-set variable T on all 3 timesteps, and write only timestep 2
00987 void test_eul_read_write_timestep()
00988 {
00989     int procs = 1;
00990 #ifdef MOAB_HAVE_MPI
00991     MPI_Comm_size( MPI_COMM_WORLD, &procs );
00992 #endif
00993 
00994 // We will not test NC writer in parallel without pnetcdf support
00995 #ifndef MOAB_HAVE_PNETCDF
00996     if( procs > 1 ) return;
00997 #endif
00998 
00999     Core moab;
01000     Interface& mb = moab;
01001 
01002     std::string read_opts;
01003     get_eul_read_options( read_opts );
01004 
01005     EntityHandle set;
01006     ErrorCode rval = mb.create_meshset( MESHSET_SET, set );CHECK_ERR( rval );
01007 
01008     // Read non-set variable T
01009     read_opts += ";VARIABLE=T;DEBUG_IO=0";
01010     rval = mb.load_file( example_eul.c_str(), &set, read_opts.c_str() );CHECK_ERR( rval );
01011 
01012     // Write variable T on timestep 2
01013     std::string write_opts = ";;VARIABLE=T;TIMESTEP=2;DEBUG_IO=0";
01014 #ifdef MOAB_HAVE_MPI
01015     // Use parallel options
01016     write_opts += ";PARALLEL=WRITE_PART";
01017 #endif
01018     if( procs > 1 )
01019         rval = mb.write_file( "test_par_eul_T2.nc", 0, write_opts.c_str(), &set, 1 );
01020     else
01021         rval = mb.write_file( "test_eul_T2.nc", 0, write_opts.c_str(), &set, 1 );CHECK_ERR( rval );
01022 }
01023 
01024 void test_eul_check_timestep()
01025 {
01026     int rank  = 0;
01027     int procs = 1;
01028 #ifdef MOAB_HAVE_MPI
01029     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
01030     MPI_Comm_size( MPI_COMM_WORLD, &procs );
01031 #endif
01032 
01033 // We will not test NC writer in parallel without pnetcdf support
01034 #ifndef MOAB_HAVE_PNETCDF
01035     if( procs > 1 ) return;
01036 #endif
01037 
01038     if( 0 == rank )
01039     {
01040         int ncid;
01041         int ncid_ref;
01042         int success;
01043 
01044         std::string filename;
01045         if( procs > 1 )
01046             filename = "test_par_eul_T2.nc";
01047         else
01048             filename = "test_eul_T2.nc";
01049 
01050 #ifdef MOAB_HAVE_PNETCDF
01051         success = NCFUNC( open )( MPI_COMM_SELF, filename.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid );
01052 #else
01053         success = NCFUNC( open )( filename.c_str(), NC_NOWRITE, &ncid );
01054 #endif
01055         CHECK_EQUAL( 0, success );
01056 
01057 #ifdef MOAB_HAVE_PNETCDF
01058         success = NCFUNC( open )( MPI_COMM_SELF, example_eul.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid_ref );
01059 #else
01060         success = NCFUNC( open )( example_eul.c_str(), NC_NOWRITE, &ncid_ref );
01061 #endif
01062         CHECK_EQUAL( 0, success );
01063 
01064         int T_id;
01065         success = NCFUNC( inq_varid )( ncid, "T", &T_id );
01066         CHECK_EQUAL( 0, success );
01067 
01068         int T_id_ref;
01069         success = NCFUNC( inq_varid )( ncid_ref, "T", &T_id_ref );
01070         CHECK_EQUAL( 0, success );
01071 
01072 #ifdef MOAB_HAVE_PNETCDF
01073         // Enter independent I/O mode
01074         success = NCFUNC( begin_indep_data )( ncid );
01075         CHECK_EQUAL( 0, success );
01076 #endif
01077 
01078 #ifdef MOAB_HAVE_PNETCDF
01079         // Enter independent I/O mode
01080         success = NCFUNC( begin_indep_data )( ncid_ref );
01081         CHECK_EQUAL( 0, success );
01082 #endif
01083 
01084         NCDF_SIZE start[] = { 0, 0, 0, 0 };
01085         NCDF_SIZE count[] = { 1, levels, 48, 96 };
01086         const int size    = levels * 48 * 96;
01087 
01088         // Read variable T from output file (timestep 0)
01089         double T_vals[size];
01090         success = NCFUNC( get_vara_double )( ncid, T_id, start, count, T_vals );
01091         CHECK_EQUAL( 0, success );
01092 
01093         // Read variable T from reference file (timestep 2)
01094         start[0] = 2;
01095         double T_vals_ref[size];
01096         success = NCFUNC( get_vara_double )( ncid_ref, T_id_ref, start, count, T_vals_ref );
01097         CHECK_EQUAL( 0, success );
01098 
01099 #ifdef MOAB_HAVE_PNETCDF
01100         // End independent I/O mode
01101         success = NCFUNC( end_indep_data )( ncid );
01102         CHECK_EQUAL( 0, success );
01103 #endif
01104 
01105 #ifdef MOAB_HAVE_PNETCDF
01106         // End independent I/O mode
01107         success = NCFUNC( end_indep_data )( ncid_ref );
01108         CHECK_EQUAL( 0, success );
01109 #endif
01110 
01111         success = NCFUNC( close )( ncid );
01112         CHECK_EQUAL( 0, success );
01113 
01114         success = NCFUNC( close )( ncid_ref );
01115         CHECK_EQUAL( 0, success );
01116 
01117         // Check T values
01118         for( int i = 0; i < size; i++ )
01119             CHECK_REAL_EQUAL( T_vals_ref[i], T_vals[i], eps );
01120     }
01121 }
01122 
01123 // Read non-set variables T, U and V
01124 // Write variable T, append U, and then append V (with a new name)
01125 void test_eul_read_write_append()
01126 {
01127     int procs = 1;
01128 #ifdef MOAB_HAVE_MPI
01129     MPI_Comm_size( MPI_COMM_WORLD, &procs );
01130 #endif
01131 
01132 // We will not test NC writer in parallel without pnetcdf support
01133 #ifndef MOAB_HAVE_PNETCDF
01134     if( procs > 1 ) return;
01135 #endif
01136 
01137     Core moab;
01138     Interface& mb = moab;
01139 
01140     std::string read_opts;
01141     get_eul_read_options( read_opts );
01142 
01143     EntityHandle set;
01144     ErrorCode rval = mb.create_meshset( MESHSET_SET, set );CHECK_ERR( rval );
01145 
01146     // Load non-set variables T, U, V, and the mesh
01147     read_opts += ";VARIABLE=T,U,V;DEBUG_IO=0";
01148     rval = mb.load_file( example_eul.c_str(), &set, read_opts.c_str() );CHECK_ERR( rval );
01149 
01150     // Write variable T
01151     std::string write_opts = ";;VARIABLE=T;DEBUG_IO=0";
01152 #ifdef MOAB_HAVE_MPI
01153     // Use parallel options
01154     write_opts += ";PARALLEL=WRITE_PART";
01155 #endif
01156     if( procs > 1 )
01157         rval = mb.write_file( "test_par_eul_append.nc", 0, write_opts.c_str(), &set, 1 );
01158     else
01159         rval = mb.write_file( "test_eul_append.nc", 0, write_opts.c_str(), &set, 1 );CHECK_ERR( rval );
01160 
01161     // Append to the file variable U
01162     write_opts = ";;VARIABLE=U;APPEND;DEBUG_IO=0";
01163 #ifdef MOAB_HAVE_MPI
01164     // Use parallel options
01165     write_opts += ";PARALLEL=WRITE_PART";
01166 #endif
01167     if( procs > 1 )
01168         rval = mb.write_file( "test_par_eul_append.nc", 0, write_opts.c_str(), &set, 1 );
01169     else
01170         rval = mb.write_file( "test_eul_append.nc", 0, write_opts.c_str(), &set, 1 );CHECK_ERR( rval );
01171 
01172     // Append to the file variable V, renamed to VNEWNAME
01173     write_opts = ";;VARIABLE=V;RENAME=VNEWNAME;APPEND;DEBUG_IO=0";
01174 #ifdef MOAB_HAVE_MPI
01175     // Use parallel options
01176     write_opts += ";PARALLEL=WRITE_PART";
01177 #endif
01178     if( procs > 1 )
01179         rval = mb.write_file( "test_par_eul_append.nc", 0, write_opts.c_str(), &set, 1 );
01180     else
01181         rval = mb.write_file( "test_eul_append.nc", 0, write_opts.c_str(), &set, 1 );CHECK_ERR( rval );
01182 }
01183 
01184 void test_eul_check_append()
01185 {
01186     int rank  = 0;
01187     int procs = 1;
01188 #ifdef MOAB_HAVE_MPI
01189     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
01190     MPI_Comm_size( MPI_COMM_WORLD, &procs );
01191 #endif
01192 
01193 // We will not test NC writer in parallel without pnetcdf support
01194 #ifndef MOAB_HAVE_PNETCDF
01195     if( procs > 1 ) return;
01196 #endif
01197 
01198     if( 0 == rank )
01199     {
01200         int ncid;
01201         int ncid_ref;
01202         int success;
01203 
01204         std::string filename;
01205         if( procs > 1 )
01206             filename = "test_par_eul_append.nc";
01207         else
01208             filename = "test_eul_append.nc";
01209 
01210 #ifdef MOAB_HAVE_PNETCDF
01211         success = NCFUNC( open )( MPI_COMM_SELF, filename.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid );
01212 #else
01213         success = NCFUNC( open )( filename.c_str(), NC_NOWRITE, &ncid );
01214 #endif
01215         CHECK_EQUAL( 0, success );
01216 
01217 #ifdef MOAB_HAVE_PNETCDF
01218         success = NCFUNC( open )( MPI_COMM_SELF, example_eul.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid_ref );
01219 #else
01220         success = NCFUNC( open )( example_eul.c_str(), NC_NOWRITE, &ncid_ref );
01221 #endif
01222         CHECK_EQUAL( 0, success );
01223 
01224         int T_id;
01225         success = NCFUNC( inq_varid )( ncid, "T", &T_id );
01226         CHECK_EQUAL( 0, success );
01227 
01228         int T_id_ref;
01229         success = NCFUNC( inq_varid )( ncid_ref, "T", &T_id_ref );
01230         CHECK_EQUAL( 0, success );
01231 
01232         int U_id;
01233         success = NCFUNC( inq_varid )( ncid, "U", &U_id );
01234         CHECK_EQUAL( 0, success );
01235 
01236         int U_id_ref;
01237         success = NCFUNC( inq_varid )( ncid_ref, "U", &U_id_ref );
01238         CHECK_EQUAL( 0, success );
01239 
01240         int V_id;
01241         success = NCFUNC( inq_varid )( ncid, "VNEWNAME", &V_id );
01242         CHECK_EQUAL( 0, success );
01243 
01244         int V_id_ref;
01245         success = NCFUNC( inq_varid )( ncid_ref, "V", &V_id_ref );
01246         CHECK_EQUAL( 0, success );
01247 
01248 #ifdef MOAB_HAVE_PNETCDF
01249         // Enter independent I/O mode
01250         success = NCFUNC( begin_indep_data )( ncid );
01251         CHECK_EQUAL( 0, success );
01252 #endif
01253 
01254 #ifdef MOAB_HAVE_PNETCDF
01255         // Enter independent I/O mode
01256         success = NCFUNC( begin_indep_data )( ncid_ref );
01257         CHECK_EQUAL( 0, success );
01258 #endif
01259 
01260         NCDF_SIZE start[] = { 0, 0, 0, 0 };
01261         NCDF_SIZE count[] = { 3, levels, 48, 96 };
01262         const int size    = 3 * levels * 48 * 96;
01263 
01264         // Read variable T from output file
01265         double T_vals[size];
01266         success = NCFUNC( get_vara_double )( ncid, T_id, start, count, T_vals );
01267         CHECK_EQUAL( 0, success );
01268 
01269         // Read variable T from reference file
01270         double T_vals_ref[size];
01271         success = NCFUNC( get_vara_double )( ncid_ref, T_id_ref, start, count, T_vals_ref );
01272         CHECK_EQUAL( 0, success );
01273 
01274         // Read variable U from output file
01275         double U_vals[size];
01276         success = NCFUNC( get_vara_double )( ncid, U_id, start, count, U_vals );
01277         CHECK_EQUAL( 0, success );
01278 
01279         // Read variable U from reference file
01280         double U_vals_ref[size];
01281         success = NCFUNC( get_vara_double )( ncid_ref, U_id_ref, start, count, U_vals_ref );
01282         CHECK_EQUAL( 0, success );
01283 
01284         // Read variable VNEWNAME from output file
01285         double V_vals[size];
01286         success = NCFUNC( get_vara_double )( ncid, V_id, start, count, V_vals );
01287         CHECK_EQUAL( 0, success );
01288 
01289         // Read variable V from reference file
01290         double V_vals_ref[size];
01291         success = NCFUNC( get_vara_double )( ncid_ref, V_id_ref, start, count, V_vals_ref );
01292         CHECK_EQUAL( 0, success );
01293 
01294 #ifdef MOAB_HAVE_PNETCDF
01295         // End independent I/O mode
01296         success = NCFUNC( end_indep_data )( ncid );
01297         CHECK_EQUAL( 0, success );
01298 #endif
01299 
01300 #ifdef MOAB_HAVE_PNETCDF
01301         // End independent I/O mode
01302         success = NCFUNC( end_indep_data )( ncid_ref );
01303         CHECK_EQUAL( 0, success );
01304 #endif
01305 
01306         success = NCFUNC( close )( ncid );
01307         CHECK_EQUAL( 0, success );
01308 
01309         success = NCFUNC( close )( ncid_ref );
01310         CHECK_EQUAL( 0, success );
01311 
01312         // Check T, U, and V values
01313         for( int i = 0; i < size; i++ )
01314         {
01315             CHECK_REAL_EQUAL( T_vals_ref[i], T_vals[i], eps );
01316             CHECK_REAL_EQUAL( U_vals_ref[i], U_vals[i], eps );
01317             CHECK_REAL_EQUAL( V_vals_ref[i], V_vals[i], eps );
01318         }
01319     }
01320 }
01321 
01322 void test_eul_read_write_across_files()
01323 {
01324     int procs = 1;
01325 #ifdef MOAB_HAVE_MPI
01326     MPI_Comm_size( MPI_COMM_WORLD, &procs );
01327 #endif
01328 
01329 // We will not test NC writer in parallel without pnetcdf support
01330 #ifndef MOAB_HAVE_PNETCDF
01331     if( procs > 1 ) return;
01332 #endif
01333 
01334     Core moab;
01335     Interface& mb = moab;
01336 
01337     std::string read_opts;
01338 
01339     EntityHandle set;
01340     ErrorCode rval = mb.create_meshset( MESHSET_SET, set );CHECK_ERR( rval );
01341 
01342     // This file contains single timestep 2 (option TIMESTEP=0 will be implicitly used)
01343     // Read T as tag T2 with option TIMESTEPBASE=2
01344     get_eul_read_options( read_opts );
01345     read_opts += ";VARIABLE=T;TIMESTEPBASE=2;DEBUG_IO=0";
01346     rval = mb.load_file( example_eul_t2.c_str(), &set, read_opts.c_str() );CHECK_ERR( rval );
01347 
01348     // This file contains single timestep 0 (option TIMESTEP=0 will be implicitly used)
01349     // Read T as tag T0 with option TIMESTEPBASE=0
01350     get_eul_read_options( read_opts );
01351     read_opts += ";VARIABLE=T;TIMESTEPBASE=0;NOMESH;DEBUG_IO=0";
01352     rval = mb.load_file( example_eul_t0.c_str(), &set, read_opts.c_str() );CHECK_ERR( rval );
01353 
01354     // This file contains single timestep 1 (option TIMESTEP=0 will be implicitly used)
01355     // Read T as tag T1 with option TIMESTEPBASE=1
01356     get_eul_read_options( read_opts );
01357     read_opts += ";VARIABLE=T;TIMESTEPBASE=1;NOMESH;DEBUG_IO=0";
01358     rval = mb.load_file( example_eul_t1.c_str(), &set, read_opts.c_str() );CHECK_ERR( rval );
01359 
01360     // Write variable T with 3 timesteps
01361     std::string write_opts = ";;VARIABLE=T;TIMESTEP=0,1,2;DEBUG_IO=0";
01362 #ifdef MOAB_HAVE_MPI
01363     // Use parallel options
01364     write_opts += ";PARALLEL=WRITE_PART";
01365 #endif
01366     if( procs > 1 )
01367         rval = mb.write_file( "test_par_eul_across_files.nc", 0, write_opts.c_str(), &set, 1 );
01368     else
01369         rval = mb.write_file( "test_eul_across_files.nc", 0, write_opts.c_str(), &set, 1 );CHECK_ERR( rval );
01370 }
01371 
01372 void test_eul_check_across_files()
01373 {
01374     int rank  = 0;
01375     int procs = 1;
01376 #ifdef MOAB_HAVE_MPI
01377     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
01378     MPI_Comm_size( MPI_COMM_WORLD, &procs );
01379 #endif
01380 
01381 // We will not test NC writer in parallel without pnetcdf support
01382 #ifndef MOAB_HAVE_PNETCDF
01383     if( procs > 1 ) return;
01384 #endif
01385 
01386     if( 0 == rank )
01387     {
01388         int ncid;
01389         int ncid_ref;
01390         int success;
01391 
01392         std::string filename;
01393         if( procs > 1 )
01394             filename = "test_par_eul_across_files.nc";
01395         else
01396             filename = "test_eul_across_files.nc";
01397 
01398 #ifdef MOAB_HAVE_PNETCDF
01399         success = NCFUNC( open )( MPI_COMM_SELF, filename.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid );
01400 #else
01401         success = NCFUNC( open )( filename.c_str(), NC_NOWRITE, &ncid );
01402 #endif
01403         CHECK_EQUAL( 0, success );
01404 
01405 #ifdef MOAB_HAVE_PNETCDF
01406         success = NCFUNC( open )( MPI_COMM_SELF, example_eul.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid_ref );
01407 #else
01408         success = NCFUNC( open )( example_eul.c_str(), NC_NOWRITE, &ncid_ref );
01409 #endif
01410         CHECK_EQUAL( 0, success );
01411 
01412         int T_id;
01413         success = NCFUNC( inq_varid )( ncid, "T", &T_id );
01414         CHECK_EQUAL( 0, success );
01415 
01416         int T_id_ref;
01417         success = NCFUNC( inq_varid )( ncid_ref, "T", &T_id_ref );
01418         CHECK_EQUAL( 0, success );
01419 
01420 #ifdef MOAB_HAVE_PNETCDF
01421         // Enter independent I/O mode
01422         success = NCFUNC( begin_indep_data )( ncid );
01423         CHECK_EQUAL( 0, success );
01424 #endif
01425 
01426 #ifdef MOAB_HAVE_PNETCDF
01427         // Enter independent I/O mode
01428         success = NCFUNC( begin_indep_data )( ncid_ref );
01429         CHECK_EQUAL( 0, success );
01430 #endif
01431 
01432         NCDF_SIZE start[] = { 0, 0, 0, 0 };
01433         NCDF_SIZE count[] = { 3, levels, 48, 96 };
01434         const int size    = 3 * levels * 48 * 96;
01435 
01436         // Read variable T from output file (with 3 timesteps)
01437         double T_vals[size];
01438         success = NCFUNC( get_vara_double )( ncid, T_id, start, count, T_vals );
01439         CHECK_EQUAL( 0, success );
01440 
01441         // Read variable T from reference file (with 3 timesteps)
01442         double T_vals_ref[size];
01443         success = NCFUNC( get_vara_double )( ncid_ref, T_id_ref, start, count, T_vals_ref );
01444         CHECK_EQUAL( 0, success );
01445 
01446 #ifdef MOAB_HAVE_PNETCDF
01447         // End independent I/O mode
01448         success = NCFUNC( end_indep_data )( ncid );
01449         CHECK_EQUAL( 0, success );
01450 #endif
01451 
01452 #ifdef MOAB_HAVE_PNETCDF
01453         // End independent I/O mode
01454         success = NCFUNC( end_indep_data )( ncid_ref );
01455         CHECK_EQUAL( 0, success );
01456 #endif
01457 
01458         success = NCFUNC( close )( ncid );
01459         CHECK_EQUAL( 0, success );
01460 
01461         success = NCFUNC( close )( ncid_ref );
01462         CHECK_EQUAL( 0, success );
01463 
01464         // Check T values
01465         for( int i = 0; i < size; i++ )
01466             CHECK_REAL_EQUAL( T_vals_ref[i], T_vals[i], eps );
01467     }
01468 }
01469 
01470 #ifdef MOAB_HAVE_MPI
01471 // NC writer should filter entities that are not owned, e.g. ghosted elements
01472 void test_eul_read_write_ghosting()
01473 {
01474     int procs = 1;
01475     MPI_Comm_size( MPI_COMM_WORLD, &procs );
01476 
01477 // We will not test NC writer in parallel without pnetcdf support
01478 #ifndef MOAB_HAVE_PNETCDF
01479     if( procs > 1 ) return;
01480 #endif
01481 
01482     Core moab;
01483     Interface& mb = moab;
01484 
01485     EntityHandle set;
01486     ErrorCode rval = mb.create_meshset( MESHSET_SET, set );CHECK_ERR( rval );
01487 
01488     std::string read_opts = "PARALLEL=READ_PART;PARTITION;PARALLEL_RESOLVE_SHARED_ENTS;PARALLEL_"
01489                             "GHOSTS=2.0.1;PARTITION_METHOD=SQIJ;VARIABLE=";
01490     rval                  = mb.load_file( example_eul.c_str(), &set, read_opts.c_str() );CHECK_ERR( rval );
01491 
01492     read_opts = "PARALLEL=READ_PART;PARTITION;PARTITION_METHOD=SQIJ;VARIABLE=T;NOMESH";
01493     rval      = mb.load_file( example_eul.c_str(), &set, read_opts.c_str() );CHECK_ERR( rval );
01494 
01495     // Write variable T
01496     std::string write_opts = ";;PARALLEL=WRITE_PART;VARIABLE=T;DEBUG_IO=0";
01497     if( procs > 1 )
01498         rval = mb.write_file( "test_par_eul_ghosting.nc", 0, write_opts.c_str(), &set, 1 );
01499     else
01500         rval = mb.write_file( "test_eul_ghosting.nc", 0, write_opts.c_str(), &set, 1 );CHECK_ERR( rval );
01501 }
01502 
01503 void test_eul_check_ghosting()
01504 {
01505     int rank  = 0;
01506     int procs = 1;
01507 #ifdef MOAB_HAVE_MPI
01508     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
01509     MPI_Comm_size( MPI_COMM_WORLD, &procs );
01510 #endif
01511 
01512 // We will not test NC writer in parallel without pnetcdf support
01513 #ifndef MOAB_HAVE_PNETCDF
01514     if( procs > 1 ) return;
01515 #endif
01516 
01517     if( 0 == rank )
01518     {
01519         int ncid;
01520         int ncid_ref;
01521         int success;
01522 
01523         std::string filename;
01524         if( procs > 1 )
01525             filename = "test_par_eul_ghosting.nc";
01526         else
01527             filename = "test_eul_ghosting.nc";
01528 
01529 #ifdef MOAB_HAVE_PNETCDF
01530         success = NCFUNC( open )( MPI_COMM_SELF, filename.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid );
01531 #else
01532         success = NCFUNC( open )( filename.c_str(), NC_NOWRITE, &ncid );
01533 #endif
01534         CHECK_EQUAL( 0, success );
01535 
01536 #ifdef MOAB_HAVE_PNETCDF
01537         success = NCFUNC( open )( MPI_COMM_SELF, example_eul.c_str(), NC_NOWRITE, MPI_INFO_NULL, &ncid_ref );
01538 #else
01539         success = NCFUNC( open )( example_eul.c_str(), NC_NOWRITE, &ncid_ref );
01540 #endif
01541         CHECK_EQUAL( 0, success );
01542 
01543         int T_id;
01544         success = NCFUNC( inq_varid )( ncid, "T", &T_id );
01545         CHECK_EQUAL( 0, success );
01546 
01547         int T_id_ref;
01548         success = NCFUNC( inq_varid )( ncid_ref, "T", &T_id_ref );
01549         CHECK_EQUAL( 0, success );
01550 
01551 #ifdef MOAB_HAVE_PNETCDF
01552         // Enter independent I/O mode
01553         success = NCFUNC( begin_indep_data )( ncid );
01554         CHECK_EQUAL( 0, success );
01555 #endif
01556 
01557 #ifdef MOAB_HAVE_PNETCDF
01558         // Enter independent I/O mode
01559         success = NCFUNC( begin_indep_data )( ncid_ref );
01560         CHECK_EQUAL( 0, success );
01561 #endif
01562 
01563         NCDF_SIZE start[] = { 0, 0, 0, 0 };
01564         NCDF_SIZE count[] = { 3, levels, 48, 96 };
01565         const int size    = 3 * levels * 48 * 96;
01566 
01567         // Read variable T from output file
01568         double T_vals[size];
01569         success = NCFUNC( get_vara_double )( ncid, T_id, start, count, T_vals );
01570         CHECK_EQUAL( 0, success );
01571 
01572         // Read variable T from reference file
01573         double T_vals_ref[size];
01574         success = NCFUNC( get_vara_double )( ncid_ref, T_id_ref, start, count, T_vals_ref );
01575         CHECK_EQUAL( 0, success );
01576 
01577 #ifdef MOAB_HAVE_PNETCDF
01578         // End independent I/O mode
01579         success = NCFUNC( end_indep_data )( ncid );
01580         CHECK_EQUAL( 0, success );
01581 #endif
01582 
01583 #ifdef MOAB_HAVE_PNETCDF
01584         // End independent I/O mode
01585         success = NCFUNC( end_indep_data )( ncid_ref );
01586         CHECK_EQUAL( 0, success );
01587 #endif
01588 
01589         success = NCFUNC( close )( ncid );
01590         CHECK_EQUAL( 0, success );
01591 
01592         success = NCFUNC( close )( ncid_ref );
01593         CHECK_EQUAL( 0, success );
01594 
01595         // Check T values
01596         for( int i = 0; i < size; i++ )
01597             CHECK_REAL_EQUAL( T_vals_ref[i], T_vals[i], eps );
01598     }
01599 }
01600 #endif
01601 
01602 void get_eul_read_options( std::string& opts )
01603 {
01604 #ifdef MOAB_HAVE_MPI
01605     // Use parallel options
01606     opts = ";;PARALLEL=READ_PART;PARTITION_METHOD=SQIJ";
01607 #else
01608     opts = ";;";
01609 #endif
01610 }
01611 
01612 void get_fv_read_options( std::string& opts )
01613 {
01614 #ifdef MOAB_HAVE_MPI
01615     // Use parallel options
01616     opts = ";;PARALLEL=READ_PART;PARTITION_METHOD=SQIJ";
01617 #else
01618     opts = ";;";
01619 #endif
01620 }
01621 
01622 void get_homme_read_options( std::string& opts )
01623 {
01624 #ifdef MOAB_HAVE_MPI
01625     // Use parallel options
01626     opts = ";;PARALLEL=READ_PART;PARTITION_METHOD=TRIVIAL";
01627 #else
01628     opts = ";;";
01629 #endif
01630 }
01631 
01632 void get_mpas_read_options( std::string& opts )
01633 {
01634 #ifdef MOAB_HAVE_MPI
01635     // Use parallel options
01636 #ifdef MOAB_HAVE_ZOLTAN
01637     opts = ";;PARALLEL=READ_PART;PARTITION_METHOD=RCBZOLTAN";
01638 #else
01639     opts = ";;PARALLEL=READ_PART;PARTITION_METHOD=TRIVIAL";
01640 #endif
01641 #else
01642     opts = ";;";
01643 #endif
01644 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines