NEP 2.7.0
NetCDF Extension Pack
Loading...
Searching...
No Matches
Macros | Functions
fill_values.c File Reference

Demonstrates fill value handling performance across classic and NetCDF-4 formats. 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 FILL_VALUE   (9.9692099683868690e+36f)
 
#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 format, int fill_mode, const char *format_name)
 Run one fill value test and print a CSV row.
 
int main (void)
 Main entry point.
 

Detailed Description

Demonstrates fill value handling performance across classic and NetCDF-4 formats.

NetCDF supports fill values — a special value indicating missing or unwritten data. When fill mode is enabled (NC_FILL, the default), NetCDF automatically writes fill values to any data not explicitly written. This benchmark measures the performance impact of fill mode (ON vs OFF) across both classic (netCDF-3) and NetCDF-4/HDF5 formats.

This program creates a 500×180×360 NC_FLOAT temperature dataset (~129 MB) four times with different configurations and reports:

Output: CSV printed to stdout with columns:

format,fill_mode,write_s,read_s,file_bytes

Typical workflow:

./fill_values > fill_values_results.csv
python3 plot_fill_values.py # produces fill_values_performance.jpg

Learning Objectives:

Key Concepts:

Prerequisites:

Related Examples:

Key API functions:

Note
The program is intended for local performance profiling. Build with ENABLE_BENCHMARKS=ON (CMake) or –enable-benchmarks (Autotools); it is excluded from regular CI.
Companion code for "The NetCDF Developer's Handbook: The Authoritative Guide to Writing High-Performance Programs for Scientific Data Management, Second Edition" (https://www.amazon.com/dp/B0H7Q1Z75L)
Author
Edward Hartnett, Intelligent Data Design, Inc.

Macro Definition Documentation

◆ ERR

#define ERR (   e)    {printf("Error: %s\n", nc_strerror(e)); exit(ERRCODE);}

Error handling macro.

◆ ERRCODE

#define ERRCODE   2

Error exit code.

◆ FILL_VALUE

#define FILL_VALUE   (9.9692099683868690e+36f)

NetCDF fill value for floats.

◆ NVALS

#define NVALS   ((size_t)NZ * NY * NX)

Total number of float values in the dataset.

◆ NX

#define NX   360

Longitude dimension: 360 degrees.

◆ NY

#define NY   180

Latitude dimension: 180 degrees.

◆ NZ

#define NZ   500

Time dimension: 500 time steps.

◆ UNCOMPRESSED_BYTES

#define UNCOMPRESSED_BYTES   ((double)NVALS * sizeof(float))

Uncompressed size in bytes.

Function Documentation

◆ generate_data()

static void generate_data ( float *  data)
static

Generate synthetic temperature data.

Fills the buffer with synthetic data: 280.0 + t*0.1 + y*0.01 + x*0.001

Parameters
dataBuffer of NVALS floats to fill.

◆ get_time()

static double get_time ( void  )
static

Return current wall-clock time in seconds.

Returns
Seconds since the epoch as a double.

◆ main()

int main ( void  )

Main entry point.

Runs four fill value tests:

  1. Classic format with NC_FILL
  2. Classic format with NC_NOFILL
  3. NetCDF-4 format with NC_FILL
  4. NetCDF-4 format with NC_NOFILL

Prints CSV header followed by one data row per test.

Returns
0 on success, 1 on any error.

◆ run_test()

static int run_test ( const char *  path,
int  format,
int  fill_mode,
const char *  format_name 
)
static

Run one fill value test and print a CSV row.

Creates a file with the given format and fill mode, 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.

Parameters
pathPath for temporary file (will be created and removed).
formatFile format: NC_CLOBBER (classic) or NC_NETCDF4|NC_CLOBBER.
fill_mode1 for NC_FILL, 0 for NC_NOFILL.
format_nameString for CSV output ("classic" or "nc4").
Returns
0 on success, 1 on any error.