![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 //-------------------------------------------------------------------------
00002 // Filename : netcdfcpp_par.hpp
00003 //
00004 // Purpose : Parallel C++ Climate NC file read/write
00005 //
00006 // Creator : Vijay Mahadevan
00007 //-------------------------------------------------------------------------
00008
00009 #if defined( MOAB_HAVE_NETCDFPAR ) && defined( MOAB_HAVE_TEMPESTREMAP )
00010 #include "netcdf_par.h"
00011 #include "netcdfcpp.h"
00012
00013 class ParNcFile : public NcFile
00014 {
00015 public:
00016 ParNcFile( MPI_Comm comm,
00017 MPI_Info comm_info,
00018 const char* path,
00019 FileMode fmode = ReadOnly,
00020 FileFormat fformat = Classic )
00021 : NcFile(), m_comm( comm )
00022 {
00023 NcError err( NcError::silent_nonfatal ); // constructor must not fail
00024
00025 int mode = NC_NOWRITE;
00026 the_fill_mode = Fill;
00027 int status;
00028
00029 // If the user wants a 64-bit offset format, set that flag.
00030 if( fformat == Offset64Bits ) mode |= NC_64BIT_OFFSET;
00031 #ifndef NETCDF3_ONLY
00032 else if( fformat == Netcdf4 )
00033 mode |= NC_NETCDF4;
00034 else if( fformat == Netcdf4Classic )
00035 mode |= NC_NETCDF4 | NC_CLASSIC_MODEL;
00036 #endif
00037 mode |= NC_MPIIO;
00038
00039 switch( fmode )
00040 {
00041 case Write:
00042 mode |= NC_WRITE;
00043 /*FALLTHRU*/
00044 case ReadOnly:
00045 // use netcdf-3 interface to permit specifying tuning parameter
00046 status = NcError::set_err( nc_open_par( path, mode, comm, comm_info, &the_id ) );
00047 if( status != NC_NOERR )
00048 {
00049 NcError::set_err( status );
00050 the_id = -1;
00051 }
00052 in_define_mode = 0;
00053 break;
00054 case New:
00055 mode |= NC_NOCLOBBER;
00056 /*FALLTHRU*/
00057 case Replace:
00058 // use netcdf-3 interface to permit specifying tuning parameters
00059 status = NcError::set_err( nc_create_par( path, mode, comm, comm_info, &the_id ) );
00060 if( status != NC_NOERR )
00061 {
00062 NcError::set_err( status );
00063 the_id = -1;
00064 }
00065 in_define_mode = 1;
00066 break;
00067 default:
00068 the_id = ncBad;
00069 in_define_mode = 0;
00070 break;
00071 }
00072 if( is_valid() )
00073 {
00074 dimensions = new NcDim*[NC_MAX_DIMS];
00075 variables = new NcVar*[NC_MAX_VARS];
00076 int i;
00077 for( i = 0; i < num_dims(); i++ )
00078 dimensions[i] = new NcDim( this, i );
00079 for( i = 0; i < num_vars(); i++ )
00080 variables[i] = new NcVar( this, i );
00081 globalv = new NcVar( this, ncGlobal );
00082 }
00083 else
00084 {
00085 dimensions = 0;
00086 variables = 0;
00087 globalv = 0;
00088 }
00089 }
00090
00091 virtual ~ParNcFile( void ){};
00092
00093 NcBool enable_var_par_access( NcVar* var, bool is_independent = true ) // synchronize to disk
00094 {
00095 int status;
00096 status = NcError::set_err(
00097 nc_var_par_access( the_id, var->id(), ( is_independent ? NC_INDEPENDENT : NC_COLLECTIVE ) ) );
00098 if( status != NC_NOERR )
00099 {
00100 NcError::set_err( status );
00101 return 0;
00102 }
00103 return 1;
00104 }
00105
00106 protected:
00107 MPI_Comm m_comm;
00108 static const int ncGlobal = NC_GLOBAL; // psuedo-variable for global attributes
00109 static const int ncBad = -1; // failure return for netCDF C interface
00110 };
00111
00112 #endif // #if defined(MOAB_HAVE_NETCDFPAR) && defined(MOAB_HAVE_TEMPESTREMAP)