|
NEP 2.7.0
NetCDF Extension Pack
|
Demonstrates byte order (endianness) handling performance in NetCDF-4/HDF5. More...
#include <netcdf.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <sys/time.h>Macros | |
| #define | NZ 500 |
| #define | NY 180 |
| #define | NX 360 |
| #define | NVALS ((size_t)NZ * NY * NX) |
| #define | UNCOMPRESSED_BYTES ((double)NVALS * sizeof(float)) |
| #define | ERRCODE 2 |
| #define | ERR(e) {printf("Error: %s\n", nc_strerror(e)); exit(ERRCODE);} |
Functions | |
| static double | get_time (void) |
| Return current wall-clock time in seconds. | |
| static void | generate_data (float *data) |
| Generate synthetic temperature data. | |
| static int | run_test (const char *path, int endian, const char *endian_name) |
| Run one endianness test and print a CSV row. | |
| int | main (void) |
| Main entry point. | |
Demonstrates byte order (endianness) handling performance in NetCDF-4/HDF5.
NetCDF-4 supports explicit byte order control via nc_def_var_endian(). By default, data is stored in the platform's native byte order (NC_ENDIAN_NATIVE). However, users can specify NC_ENDIAN_LITTLE or NC_ENDIAN_BIG to ensure cross-platform compatibility or match requirements of downstream tools.
This program creates a 500×180×360 NC_FLOAT temperature dataset (~129 MB uncompressed) three times with different byte orders and reports:
Output: CSV printed to stdout with columns:
Typical workflow:
Learning Objectives:
Key Concepts:
Prerequisites:
Related Examples:
Key API functions:
| #define ERR | ( | e | ) | {printf("Error: %s\n", nc_strerror(e)); exit(ERRCODE);} |
Error handling macro.
| #define ERRCODE 2 |
Error exit code.
| #define NX 360 |
Longitude dimension: 360 degrees.
| #define NY 180 |
Latitude dimension: 180 degrees.
| #define NZ 500 |
Time dimension: 500 time steps.
| #define UNCOMPRESSED_BYTES ((double)NVALS * sizeof(float)) |
Uncompressed size in bytes.
|
static |
Generate synthetic temperature data.
Fills the buffer with synthetic data: 280.0 + t*0.1 + y*0.01 + x*0.001
| data | Buffer of NVALS floats to fill. |
|
static |
Return current wall-clock time in seconds.
| int main | ( | void | ) |
Main entry point.
Runs three endianness tests:
Prints CSV header followed by one data row per test.
|
static |
Run one endianness test and print a CSV row.
Creates a file with the given byte order, writes a 500×180×360 NC_FLOAT temperature variable, stats the file to obtain the on-disk size, reads the variable back, then removes the file.
| path | Path for temporary file (will be created and removed). |
| endian | Byte order: NC_ENDIAN_NATIVE, NC_ENDIAN_LITTLE, or NC_ENDIAN_BIG. |
| endian_name | String for CSV output ("native", "little", or "big"). |