NCL Home>
Application examples>
File IO ||
Data files for some examples
Support for NetCDF-4 files is in beta-testing in V6.1.1.
We encourage people to test it out and give us feedback on our ncl-talk email list.
Create the file:
Define dimensions:
Define the chunk sizes:
Define some file properties:
Define file variables:
Define file variables attributes:
Create coordinate arrays:
Generate a 2D array (and make it not too boring).
Loop through time, and write out the data (like integrating a model).
The end.
This script produced (use "ncl_filedump nc4_chunkingNcompression.nc"):
Example pages containing:
tips |
resources |
functions/procedures
>
write netCDF
NCL: Write netCDF with one unlimited dimension, plus chunking and compression
Support for NetCDF-4 files is in beta-testing in V6.1.1.
We encourage people to test it out and give us feedback on our ncl-talk email list.
Below is a script which creates a variable with one unlimited dimension,
and then expands it in the dimension, plus chunking and compression.
Pre-define some properties before writing the file
; This script writes a large variable to a file in NetCDF4
; with chunking and compression.
begin
theflnm = "./nc4_chunkingNcompression.nc"
setfileoption("nc","format","netcdf4")
setfileoption("nc","headerReserveSpace",64000)
setfileoption("nc","preFill",False)
;setfileoption("nc","defineMode",True)
;Remove the file if it already existed.
if (isfilepresent(theflnm)) then
system("rm " + theflnm)
end if
Create the file:
f = addfile(theflnm,"c")
Define dimensions:
(Note ONLY time dimension is unlimited, and its current value is 1.)
ctim = 1
ntim = 250 ;1000 will be little bit too much
nlat = 1800
nlon = 3600
dim_names = (/"time","lat","lon"/)
;time dimension is unlimited, but currently set to 1.
dim_sizes = (/ctim,nlat,nlon/)
dim_unlimited = (/True,False,False/)
print("Defining dimension sizes to be " + dim_sizes)
filedimdef(f,dim_names,dim_sizes,dim_unlimited)
Define the chunk sizes:
mtim = 1 mlat = nlat/10 mlon = nlon/10 chunk_sizes = (/mtim,mlat,mlon/) filechunkdimdef(f,dim_names,chunk_sizes,dim_unlimited)
Define some file properties:
atts = True
atts@description = "This file tests NCL's ability to create >2GB variables"
atts@timestamp = systemfunc("date")
print("Defining file attributes")
fileattdef(f,atts)
Define file variables:
print("Defining file variables")
filevardef(f,"time","float","time")
filevardef(f,"lat","float","lat")
filevardef(f,"lon","float","lon")
filevardef(f,"wave","float",(/"time","lat","lon"/))
Define file variables attributes:
print("Defining file variable attributes")
tatts = True
tatts@long_name = "elapsed time"
tatts@units = "hours since 01-01-2000"
filevarattdef(f,"time",tatts)
latatts = True
latatts@long_name = "latitude"
latatts@units = "degrees_north"
filevarattdef(f,"lat",latatts)
lonatts = True
lonatts@long_name = "longitude"
lonatts@units = "degrees_east"
filevarattdef(f,"lon",lonatts)
waveatts = 0.0
waveatts@long_name = "Sine Wave on the sphere"
waveatts@units = "None"
waveatts@_FillValue = 1e32
filevarattdef(f,"wave",waveatts)
filevarchunkdef(f, "wave", chunk_sizes)
filevarcompressleveldef(f, "wave", 2)
Create coordinate arrays:
(Note lon and lat write out here, but time will write later.)
print("Creating coordinate arrays")
time = fspan(0,ntim-1,ntim)
lat = fspan(-90,90,nlat)
f->lat = (/lat/)
lon = fspan(-180,180,nlon)
f->lon = (/lon/)
Generate a 2D array (and make it not too boring).
print("Generating " + nlat + " x " + nlon + " array")
base = new((/nlat, nlon/), "float", waveatts@_FillValue)
wave = new((/nlat, nlon/), "float", waveatts@_FillValue)
arc = 2.0 * 3.141693 / 180.0
lon = sin(arc * lon)
lat = cos(arc * lat)
do j = 0, nlat -1
base(j, :) = lat(j) * lon
end do
Loop through time, and write out the data (like integrating a model).
print("Looping across time (" + ntim + ")")
do n = 0, ntim-1
tf = sin(0.01 * arc * (n + 1))
;generate a 2d array
b1 = base(:, nlon - 1)
base(:, 1:nlon - 1) = base(:, 0:nlon - 2)
base(:, 0) = b1;
wave = tf * base;
f->time(n) = (/time(n)/)
f->wave(n,:,:) = (/wave/)
command = "date; ls -l " + theflnm
m = n + 1
print(systemfunc(command) + " : timestep " + m + "/" + ntim)
end do
The end.
print("Done looping across time (" + ntim + ")")
delete(f)
end
This script produced (use "ncl_filedump nc4_chunkingNcompression.nc"):
Variable: f
Type: file
filename: nc4_chunkingNcompression
path: nc4_chunkingNcompression.nc
attributes:
timestamp : Fri Jan 25 11:33:34 MST 2013
description : This file tests NCL's ability to create >2GB variables
dimensions:
time = 250 // unlimited
lat = 1800
lon = 3600
chunk dimensions:
time = 1 // unlimited
lat = 180
lon = 360
variables:
time: [ 250