Skip to content

Commit ca56885

Browse files
committed
allow loading coord grid with "longitude"
1 parent d00675a commit ca56885

File tree

2 files changed

+24
-24
lines changed

2 files changed

+24
-24
lines changed

src/io/netcdf.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ dim_to_commonname(::Pre) = "level"
1616
dim_to_commonname(D::Dim) = string(DimensionalData.name(D))
1717
dim_to_commonname(::Coord) = "cell"
1818

19+
"Names of dimensions that represent (lon, lat) cells in Coordinate (unstructured) grids"
1920
const POSSIBLE_CELL_NAMES = ("ncells", "cell", "rgrid", "grid")
2021

21-
2222
"""
2323
nckeys(file::String)
2424
Return all keys of the `.nc` file in `file`.

src/io/netcdf_read.jl

+23-23
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ NCDatasets.jl and then convert to some kind of dimensional container.
6969
lat = Array(ds["clat"]);
7070
```
7171
If `lon, lat` are given, `grid` is automatically assumed `CoordinateSpace()`.
72+
* `celldim = nothing`: only used for `CoordinateSpace`: when `
7273
"""
7374
function ncread(path::Union{String, Vector{String}}, args...; kwargs...)
7475
NCDataset(path) do ds
@@ -83,7 +84,7 @@ end
8384
function ncread(ds::NCDatasets.AbstractDataset, var, selection = nothing;
8485
name = var2name(var), grid = nothing, lon = nothing, lat = nothing,
8586
)
86-
if lon isa Vector && lat isa Vector
87+
if lon isa AbstractVector && lat isa AbstractVector
8788
gridtype = CoordinateSpace()
8889
elseif isnothing(grid)
8990
gridtype = autodetect_grid(ds)
@@ -222,7 +223,12 @@ function ncread_unstructured(
222223
lonlat, original_grid_dim = load_coordinate_points(ds)
223224
else
224225
lonlat = [SVector(lo, la) for (lo, la) in zip(lon, lat)]
225-
original_grid_dim = intersect(NCDatasets.dimnames(cfvar), POSSIBLE_CELL_NAMES)[1]
226+
possible_name = intersect(NCDatasets.dimnames(cfvar), POSSIBLE_CELL_NAMES)
227+
if isempty(possible_name)
228+
error("Name of dimension of cell coordinates not recognized,
229+
augment `POSSIBLE_CELL_NAMES`")
230+
end
231+
original_grid_dim = possible_name[1]
226232
end
227233

228234
alldims = Any[NCDatasets.dimnames(cfvar)...]
@@ -271,12 +277,8 @@ function ncread_unstructured(
271277
return ClimArray(X; name = Symbol(name), attrib)
272278
end
273279

274-
function has_unstructured_key(ds)
275-
any(x -> haskey(ds.dim, x), POSSIBLE_CELL_NAMES) ||
276-
haskey(ds, "lon") || haskey(ds, "clon")
277-
end
278-
279280
function load_coordinate_points(ds)
281+
@show keys(ds)
280282
if haskey(ds, "reduced_points")
281283
lonlat = reduced_grid_to_points(ds["lat"], ds["reduced_points"])
282284
original_grid_dim = "rgrid" # Specific to CDO Gaussian grid
@@ -288,32 +290,30 @@ function load_coordinate_points(ds)
288290
lats = ds["lat"] |> Matrix |> vec
289291
original_grid_dim = ("lon", "lat")
290292
lonlat = [SVector(lo, la) for (lo, la) in zip(lons, lats)]
291-
elseif has_unstructured_key(ds)
292-
if haskey(ds, "lon")
293-
lons = ds["lon"] |> Vector
294-
lats = ds["lat"] |> Vector
295-
original_grid_dim = NCDatasets.dimnames(ds["lon"])[1]
296-
elseif haskey(ds, "clon")
297-
lons = ds["clon"] |> Vector
298-
lats = ds["clat"] |> Vector
299-
original_grid_dim = NCDatasets.dimnames(ds["clon"])[1]
300-
else
301-
error("""
302-
We didn't find key `"lon"` or `"clon"` that represents the longitude of each
303-
polygon in a non-orthogonal grid.
304-
""")
305-
end
306-
lonlat = [SVector(lo, la) for (lo, la) in zip(lons, lats)]
293+
elseif haskey(ds, "lon")
294+
lons = ds["lon"] |> Vector
295+
lats = ds["lat"] |> Vector
296+
original_grid_dim = NCDatasets.dimnames(ds["lon"])[1]
297+
elseif haskey(ds, "clon")
298+
lons = ds["clon"] |> Vector
299+
lats = ds["clat"] |> Vector
300+
original_grid_dim = NCDatasets.dimnames(ds["clon"])[1]
301+
elseif haskey(ds, "longitude")
302+
lons = ds["longitude"] |> Vector
303+
lats = ds["latitude"] |> Vector
304+
original_grid_dim = NCDatasets.dimnames(ds["longitude"])[1]
307305
else
308306
error("""
309307
We couldn't automatically identify the lon/lat values of cell centers.
310308
Please provide explicitly keywords `lon, lat` in `ncread`.
311309
""")
312310
end
311+
lonlat = [SVector(lo, la) for (lo, la) in zip(lons, lats)]
313312
lonlat = convert_to_degrees(lonlat, ds)
314313
return lonlat, original_grid_dim
315314
end
316315

316+
"Assumes a gaussian grid information for efficient storage"
317317
function reduced_grid_to_points(lat, reduced_points)
318318
lonlat = SVector{2, Float32}[]
319319
for (i, θ) in enumerate(lat)

0 commit comments

Comments
 (0)