
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 ; }