Skip to content

Commit 968ebbf

Browse files
issue #262
1 parent 35991a8 commit 968ebbf

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

src/netcdf_c.jl

+20-1
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,26 @@ end
10261026

10271027
function nc_get_vars!(ncid::Integer,varid::Integer,startp,countp,stridep,ip)
10281028
@debug "nc_get_vars!: $startp,$countp,$stridep"
1029-
check(ccall((:nc_get_vars,libnetcdf),Cint,(Cint,Cint,Ptr{Csize_t},Ptr{Csize_t},Ptr{Cint},Ptr{Nothing}),ncid,varid,startp,countp,stridep,ip))
1029+
1030+
if any(<(0),stridep)
1031+
reverse_dim = stridep .< 0
1032+
strider = copy(stridep)
1033+
startr = copy(startp)
1034+
1035+
for i = 1:length(stridep)
1036+
if reverse_dim[i]
1037+
strider[i] = -stridep[i]
1038+
startr[i] = startp[i] + (countp[i]-1)*stridep[i]
1039+
end
1040+
end
1041+
1042+
check(ccall((:nc_get_vars,libnetcdf),Cint,(Cint,Cint,Ptr{Csize_t},Ptr{Csize_t},Ptr{Cint},Ptr{Nothing}),ncid,varid,startr,countp,strider,ip))
1043+
1044+
# reverse(reverse_dim) is necessary because stride uses the C ordering
1045+
reverse!(ip,dims=Tuple(findall(reverse(reverse_dim))))
1046+
else
1047+
check(ccall((:nc_get_vars,libnetcdf),Cint,(Cint,Cint,Ptr{Csize_t},Ptr{Csize_t},Ptr{Cint},Ptr{Nothing}),ncid,varid,startp,countp,stridep,ip))
1048+
end
10301049
end
10311050

10321051

test/test_variable.jl

+18
Original file line numberDiff line numberDiff line change
@@ -310,3 +310,21 @@ vv = [1.0f0]
310310
NCDatasets.load!(variable(ds, "temperature"), vv, CartesianIndex(5,5))
311311
@test vv[1] == data[CartesianIndex(5,5)]
312312
close(ds)
313+
314+
# issue 262
315+
fname = tempname()
316+
ds = NCDataset(fname,"c")
317+
defDim(ds,"lon",10)
318+
defDim(ds,"lat",11)
319+
data = [Float32(i+j) for i = 1:10, j = 1:11];
320+
data2 = similar(data)
321+
v = defVar(ds,"temperature",data,("lon","lat"))
322+
323+
@test v[:,end:-1:1] == data[:,end:-1:1]
324+
@test v[:,end:-2:1] == data[:,end:-2:1]
325+
@test v[:,5:-1:1] == data[:,5:-1:1]
326+
@test v[:,5:-1:3] == data[:,5:-1:3]
327+
@test v[end:-1:1,:] == data[end:-1:1,:]
328+
329+
NCDatasets.load!(variable(ds, "temperature"), data2, :,11:-1:1)
330+
@test data2 == data[:,end:-1:1]

0 commit comments

Comments
 (0)