Example 5 : Array Types
A ClimArray
(struct from ClimateBase.jl
), which includes metadata read from nectdf file, is written back to a netcdf file via NCTiles.jl
. Then the reverse is done to illustrate consistent workflows.
using ClimateBase, NCTiles, Unitful, NCDatasets, Dates
File Paths
inputs=NCTiles.NCTILES_TESTCASES
NCTiles.ensure_testcases_installed()
outputs = joinpath(tempdir(),"NCTILES_TESTCASES_OUTPUT/")
if ~ispath(outputs); mkpath(outputs); end
savedir = joinpath(outputs,"ex5")
if ~ispath(savedir); mkpath(savedir); end
1. Read via NCTiles.jl and write via ClimateBase.jl
Helper function
"""
NCvar_to_ClimArray(ncvar::NCvar,ncdims::Dict)
Creates a ClimArray struct, from a NCvar struct, which can then be written
to a NetCDF file using `ClimateBase.ncwrite()`.
"""
function NCvar_to_ClimArray(ncvar::NCvar,ncdims::Dict)
lons=ncdims["lon_c"].values[:]
lats=ncdims["lat_c"].values[:]
t=ncdims["tim"].values[:]
dimensions = (Lon(lons), Lat(lats), ClimateBase.Ti(t))
name=ncvar.name
data=ncvar.values[:]
units=ncvar.units
return ClimArray(data, dimensions; name = name, attrib = Dict("units" => units))
end
Main.NCvar_to_ClimArray
Main call sequence :
fil=joinpath(outputs,"ex1/ex1_NetCDF.nc")
ncvars,ncdims,fileatts = NCTiles.readncfile(fil)
#filout=joinpath(savedir,"ex5_NCTiles.nc")
#write(ncvars["ETAN"],filout,globalattribs=fileatts)
filout=joinpath(savedir,"ex5_ClimateBase.nc")
A=NCvar_to_ClimArray(ncvars["ETAN"],ncdims)
ClimateBase.ncwrite(filout, A)
processing variable ETAN...
writing dimension lon...
┌ Warning: Dimension lon has no attributes, adding default attributes.
└ @ ClimateBase ~/.julia/packages/ClimateBase/IODSD/src/io/netcdf_write.jl:82
writing dimension lat...
┌ Warning: Dimension lat has no attributes, adding default attributes.
└ @ ClimateBase ~/.julia/packages/ClimateBase/IODSD/src/io/netcdf_write.jl:82
writing dimension time...
┌ Warning: Dimension time has no attributes, adding default attributes.
└ @ ClimateBase ~/.julia/packages/ClimateBase/IODSD/src/io/netcdf_write.jl:82
2. Read via ClimateBase.jl and write via NCTiles.jl
Helper function
"""
ClimArray_to_NCvar(C::ClimGrid,N::String)
Creates an NCvar struct, from a ClimArray struct, which can then be written
to a NetCDF file using `NCTiles.write()`.
```
C = ClimateBase.ncread(fil, "ETAN")
writefld = ClimArray_to_NCvar(C,"ETAN")
NCTiles.write(writefld,"myfile.nc")
```
"""
function ClimArray_to_NCvar(C::ClimArray,N::String)
x = C.dims[1][:]
y = C.dims[2][:]
timevec = DateTime.(C.dims[3][:])
timeunit = "days since 1992-01-01"
timevec = NCDatasets.timeencode(timevec, timeunit)
dims = [NCvar("lon","degrees_east",size(C.data)[1],x,Dict("long_name" => "longitude"),NCDatasets),
NCvar("lat","degrees_north",size(C.data)[2],y,Dict("long_name" => "latitude"),NCDatasets),
NCvar("time",timeunit,Inf,timevec,Dict(("long_name" => "Ti","standard_name" => "time")),NCDatasets)
]
return NCvar(N,C.attrib["units"],dims,C.data,C.attrib,NCDatasets)
end
Main.ClimArray_to_NCvar
Main call sequence :
Note: ClimateBase.jl
relies on specific dimension names to identify space and time dimensions (as follows). This sometimes lead to warnings when files use different names.
- latitude: lat, latitude, rlat, y, yc
- longitude: lon, longitude, rlon, x, xc
- time: time
ETAN = ClimateBase.ncread(fil, "ETAN")
ETAN = ClimArray_to_NCvar(ETAN,"ETAN")
filout=joinpath(savedir,"ex5_ClimArray_to_NCvar.nc")
NCTiles.write(ETAN,filout)
#
using MeshArrays
function ClimArray_to_MeshArray(C::ClimArray)
u=uparse(C.attrib["units"])
n=string(C.name)
ln=C.attrib["long_name"]
tim=DateTime.(collect(tmp.dims[3][:]))
m=varmeta(u,fill(0.5,3),tim,n,ln)
#MeshArray(C.data;meta=m)
nlon=length(tmp.dims[1][:])
nlat=length(tmp.dims[2][:])
XC = MeshArray(collect(tmp.dims[1][:])*ones(1,nlon))
YC = MeshArray(ones(nlat,1)*collect(tmp.dims[2][:])')
Γ = (XC=XC,YC=YC)
MeshArray(C.data;meta=m),Γ
end
function NCvar_to_MeshArray(ncvar::NCvar)
u=uparse(ncvar.units)
n=string(ncvar.name)
ln=ncvar.atts["long_name"]
tim=ncvar.dims[3].values[:]
m=varmeta(u,fill(0.5,3),tim,n,ln)
#MeshArray(ncvar.values[:];meta=m)
nlon=length(ncvar.dims[1].values[:])
nlat=length(ncvar.dims[2].values[:])
XC = MeshArray(ncvar.dims[1].values[:]*ones(1,nlon))
YC = MeshArray(ones(nlat,1)*ncvar.dims[2].values[:]')
Γ = (XC=XC,YC=YC)
MeshArray(ncvar.values[:];meta=m),Γ
end
fil=joinpath(outputs,"ex1/ex1_NetCDF.nc")
tmp = ClimateBase.ncread(fil, "ETAN")
ETAN,Γ = ClimArray_to_MeshArray(tmp)
ncvars,ncdims,fileatts = NCTiles.readncfile(fil)
ETAN,Γ = NCvar_to_MeshArray(ncvars["ETAN"])
( name = ETAN
unit = m
data type = Float32
cell pos. = [0.5, 0.5, 0.5]
tile array = (1, 3)
tile sizes = (720, 360)
grid class = PeriodicDomain
MeshArray = gcmarray
version = 0.3.3
, (XC = data type = Float64
cell pos. = [0.5, 0.5, 0.5]
tile array = (1,)
tile sizes = (720, 720)
grid class = PeriodicDomain
MeshArray = gcmarray
version = 0.3.3
, YC = data type = Float64
cell pos. = [0.5, 0.5, 0.5]
tile array = (1,)
tile sizes = (360, 360)
grid class = PeriodicDomain
MeshArray = gcmarray
version = 0.3.3
))
This page was generated using Literate.jl.