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.
The above script has created a variable with two unlimited dimensions. We are going to expand this variable in space and time directions (The following script are continuing from above).
The above script has created a variable with two unlimited dimensions. Expand in time:
This script produced (use "ncdump nc4_multiudim.nc"):
Example pages containing:
tips |
resources |
functions/procedures
>
write netCDF
NCL: Write netCDF with multiple unlimited dimensions
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 two unlimited dimension variable
and then expands it in both dimensions.
;Based on code for JIRA-1603.
;This script also serves the purpose of test its correctness.
;load "$NCARGTEST/nclscripts/functions.ncl"
;------------------------------------------------------------
;Make sure we set the file output as NetCDF4.
setfileoption("nc", "Format", "NetCDF4")
fn = "nc4_multiudim.nc"
system("/bin/rm -f " + fn) ; remove if exists
f = addfile(fn, "c")
;===================================================================
; explicitly declare file definition mode. Improve efficiency.
setfileoption(f,"DefineMode",True)
;Create some file attributes
fAtt = True ; assign file attributes
fAtt@title = "NCL generated netCDF file with multiple unlimited dimensions"
fAtt@source_file = fn
fAtt@creation_date = systemfunc ("date")
fileattdef(f, fAtt)
;We want to create a variable of two dimensions:
; 0: use time as dimension
; 1: use space as dimension
;Define some parameters for dimension.
nd = 2
nt = 5
ns = 5
nt2 = 2 * nt
ns2 = 2 * ns
;===================================================================
;Define the file dimensions, NOTE that both dimensions are unlimited.
dimNames = (/"time", "space"/)
dimSizes = (/ -1, -1/)
dimUnlim = (/ True, True/)
filedimdef(f, dimNames, dimSizes, dimUnlim)
;===================================================================
;Generate time and space coordinate variable.
time = ispan(1, nt, 1)
time@name = "time"
time!0 = "time"
filevardef(f, "time", typeof(time), getvardims(time))
filevarattdef(f,"time", time)
space = ispan(1, ns, 1)
space@name = "space"
space!0 = "space"
filevardef(f, "space", typeof(space), getvardims(space))
filevarattdef(f,"space", space)
;===================================================================
;Make a Fibonacci series (somehow in 2d)
;Where: value(0, 0) = 1
; value(1, 0) = 1
; value(0, 1) = 1
; value(0, i) = value(0, i-1) + value(0, i-2) (i > 1)
; value(j, 0) = value(j-1, 0) + value(j-2, 0) (j > 1)
; value(j, i) = value(i-1, j) + value(i, j-1) (i > 0, j > 0)
value = new((/nt, ns/), integer)
value@name = "value"
value!0 = "time"
value!1 = "space"
filevardef(f, "value", typeof(value), getvardims(value))
filevarattdef(f,"value", value)
value(0, 0) = 1
value(1, 0) = 1
value(0, 1) = 1
do i = 2, ns - 1
value(0, i) = value(0, i-1) + value(0, i-2)
end do
do j = 2, nt - 1
value(j, 0) = value(j-1, 0) + value(j-2, 0)
end do
do j = 1, nt - 1
do i = 1, ns - 1
value(j, i) = value(j-1, i) + value(j, i-1)
end do
end do
;Write the data out.
f->time = (/time/)
f->space = (/space/)
f->value = (/value/)
;===================================================================
The above script has created a variable with two unlimited dimensions. We are going to expand this variable in space and time directions (The following script are continuing from above).
Expand in space first:
;=================================================================== ;Extend is space: ;The ":=" is called reassignment, which is available in ;version 6.1.1 or later. ;See: http://www.ncl.ucar.edu/Document/Manuals/Ref_Manual/NclVariables.shtml#Reassignment ;for more details. space := ispan(1, ns2, 1) f->space(ns:ns2-1) = (/space(ns:ns2-1)/) value1 = new((/nt, ns2/), integer) value1@name = "value" value1!0 = "time" value1!1 = "space" ;printVarSummary(value1) value1(:, :ns-1) = value(:, :ns-1) do i = ns, ns2 - 1 value1(0, i) = value1(0, i-1) + value1(0, i-2) end do do j = 1, nt - 1 do i = ns, ns2 - 1 value1(j, i) = value1(j-1, i) + value1(j, i-1) end do end do ;Write f->value(:, ns:ns2-1) = (/value1(:, ns:ns2-1)/) ;===================================================================
The above script has created a variable with two unlimited dimensions. Expand in time:
;===================================================================
;Extend is time:
time := ispan(1, ns2, 1)
f->time(nt:nt2-1) = (/time(nt:nt2-1)/)
value2 = new((/nt2, ns2/), integer)
value2@name = "value"
value2!0 = "time"
value2!1 = "space"
;printVarSummary(value2)
value2(:nt-1, :) = value1(:nt-1, :)
do j = nt, nt2 - 1
value2(j, 0) = value2(j-1, 0) + value2(j-2, 0)
end do
do j = nt, nt2 - 1
do i = 1, ns2 - 1
value2(j, i) = value2(j-1, i) + value2(j, i-1)
end do
end do
f->value(nt:nt2-1, :) = (/value2(nt:nt2-1, :)/)
delete(f)
;Uncomment the following line (and the load line at top) to test.
;f2 = addfile(fn, "r")
;value := f2->value
;check_values("Check", "nc4_multipleunlimiteddims", value2, value, True, True, value@_FillValue)
This script produced (use "ncdump nc4_multiudim.nc"):
netcdf nc4_multiudim {
dimensions:
time = UNLIMITED ; // (10 currently)
space = UNLIMITED ; // (10 currently)
variables:
int time(time) ;
string time:name = "time" ;
int space(space) ;
string space:name = "space" ;
int value(time, space) ;
string value:name = "value" ;
value:_FillValue = -2147483647 ;
// global attributes:
string :creation_date = "Tue Jan 15 13:35:23 MST 2013" ;
string :source_file = "nc4_multiudim.nc" ;
string :title = "NCL generated netCDF file with multiple unlimited dimensions" ;
data:
time = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;
space = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;
value =
1, 1, 2, 3, 5, 8, 13, 21, 34, 55,
1, 2, 4, 7, 12, 20, 33, 54, 88, 143,
2, 4, 8, 15, 27, 47, 80, 134, 222, 365,
3, 7, 15, 30, 57, 104, 184, 318, 540, 905,
5, 12, 27, 57, 114, 218, 402, 720, 1260, 2165,
8, 20, 47, 104, 218, 436, 838, 1558, 2818, 4983,
13, 33, 80, 184, 402, 838, 1676, 3234, 6052, 11035,
21, 54, 134, 318, 720, 1558, 3234, 6468, 12520, 23555,
34, 88, 222, 540, 1260, 2818, 6052, 12520, 25040, 48595,
55, 143, 365, 905, 2165, 4983, 11035, 23555, 48595, 97190 ;
}