mirror of
https://github.com/Unidata/netcdf-c.git
synced 2025-04-24 18:30:51 +08:00
123 lines
3.4 KiB
C++
123 lines
3.4 KiB
C++
#include <config.h>
|
|
#include <stdio.h>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <netcdf.h>
|
|
|
|
using namespace std;
|
|
|
|
#ifdef EXTRA_TESTS
|
|
#define MEGABYTE 1048576
|
|
void
|
|
get_mem_used2(int *mem_used)
|
|
{
|
|
char buf[30];
|
|
FILE *pf;
|
|
size_t page_size = 4092; /* For spock... */
|
|
unsigned size; /* total program size */
|
|
unsigned resident;/* resident set size */
|
|
unsigned share;/* shared pages */
|
|
unsigned text;/* text (code) */
|
|
unsigned lib;/* library */
|
|
unsigned data;/* data/stack */
|
|
/*unsigned dt; dirty pages (unused in Linux 2.6)*/
|
|
|
|
snprintf(buf, 30, "/proc/%u/statm", (unsigned)getpid());
|
|
if ((pf = fopen(buf, "r")))
|
|
{
|
|
fscanf(pf, "%u %u %u %u %u %u", &size, &resident, &share,
|
|
&text, &lib, &data);
|
|
*mem_used = (data * page_size) / MEGABYTE;
|
|
}
|
|
else
|
|
*mem_used = -1;
|
|
fclose(pf);
|
|
}
|
|
#endif /* EXTRA_TESTS */
|
|
|
|
//Exception class
|
|
class NcErrorException : public exception
|
|
{
|
|
public:
|
|
NcErrorException(const string& descr) throw(): exception(), _descr(descr) {};
|
|
~NcErrorException() throw() {};
|
|
|
|
const char* what() const throw() { ostringstream err; err << "NcErrorException: " << _descr; return err.str().c_str(); };
|
|
|
|
|
|
private:
|
|
string _descr;
|
|
};
|
|
|
|
void handle_error(int status) {
|
|
if (status != NC_NOERR) {
|
|
throw NcErrorException(nc_strerror(status));
|
|
}
|
|
};
|
|
|
|
/******MAIN********/
|
|
int main(int argc, char** argv)
|
|
{
|
|
int NUMVARS = 1;
|
|
size_t NUMREC=10000;
|
|
int fileId, dimId, varId[1];
|
|
string filename("tst_many_writes.nc");
|
|
|
|
cout << "\n*** Testing netCDF-4 file with user-provided test (thanks Marica!)\n";
|
|
|
|
try{
|
|
//create the netcdf-4 file
|
|
handle_error(nc_create(filename.c_str(), NC_NETCDF4, &fileId));
|
|
|
|
//define the unlimited dimension "rec"
|
|
handle_error(nc_def_dim(fileId, "rec", NC_UNLIMITED, &dimId)); //--> Segmentation Fault
|
|
//handle_error ( nc_def_dim(fileId, "rec", NUMREC, &dimId) ); //--> Good!!
|
|
|
|
int dimids[1] = {dimId};
|
|
|
|
//define NUMVARS variables named field_%i using a loop
|
|
for (int v = 0; v < NUMVARS; v++)
|
|
{
|
|
size_t chunkSize[1] = {100000};
|
|
ostringstream varName; varName << "field_" << v;
|
|
handle_error(nc_def_var(fileId, varName.str().c_str(), NC_DOUBLE, 1, dimids , &varId[v]));
|
|
handle_error(nc_def_var_chunking(fileId, varId[v], NC_CHUNKED, chunkSize));
|
|
}
|
|
handle_error (nc_enddef(fileId));
|
|
|
|
//write data to the NUMVARS variables using nc_put_var1_double
|
|
double data = 100;
|
|
size_t start[1];
|
|
size_t count[1] = {1};
|
|
char charName[NC_MAX_NAME+1];
|
|
|
|
for (int v = 0; v < NUMVARS; v++)
|
|
{
|
|
handle_error(nc_inq_varname(fileId, varId[v], charName));
|
|
cout << "var " << v << "\n";
|
|
for (size_t start = 0; start < NUMREC; start++)
|
|
{
|
|
#ifdef EXTRA_TESTS
|
|
if (start % 1000 == 0)
|
|
{
|
|
int mem_used;
|
|
get_mem_used2(&mem_used);
|
|
cout << mem_used << "\n";
|
|
}
|
|
#endif /* EXTRA_TESTS */
|
|
handle_error(nc_put_vara_double(fileId, varId[v], &start, count, &data));
|
|
}
|
|
}
|
|
|
|
//close file
|
|
handle_error(nc_close(fileId));
|
|
cout << "*** nctst SUCCESS!\n";
|
|
}
|
|
catch(exception &ex) //exception handling
|
|
{
|
|
cerr << "Exception caught: " << ex.what() << endl;
|
|
cout << "*** nctst FAILURE!\n";
|
|
return -1;
|
|
}
|
|
}
|