Skip to content

Commit 39d2f2e

Browse files
committed
add read/write stride= option
1 parent 5b51977 commit 39d2f2e

File tree

6 files changed

+155
-91
lines changed

6 files changed

+155
-91
lines changed

src/interface.f90

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,10 @@ module subroutine nc_create(self, dset_name, dtype, dims, dim_names, chunk_size,
7878
integer, intent(out), optional :: varid
7979
end subroutine
8080

81-
module subroutine def_dims(self, dname, dimnames, dims, dimids)
81+
module subroutine def_dims(self, dname, dim_names, dims, dimids)
8282
class(netcdf_file), intent(in) :: self
8383
character(*), intent(in) :: dname
84-
character(*), intent(in), optional :: dimnames(:)
84+
character(*), intent(in), optional :: dim_names(:)
8585
integer, intent(in) :: dims(:)
8686
integer, intent(out) :: dimids(size(dims))
8787
end subroutine
@@ -100,66 +100,66 @@ module subroutine nc_write_scalar(self, dname, value)
100100
class(*), intent(in) :: value
101101
end subroutine
102102

103-
module subroutine nc_write_1d(self, dname, value, dims, istart, iend, chunk_size)
103+
module subroutine nc_write_1d(self, dname, value, dims, istart, iend, stride, chunk_size)
104104
class(netcdf_file), intent(in) :: self
105105
character(*), intent(in) :: dname
106106
class(*), intent(in) :: value(:)
107107
character(*), intent(in), optional :: dims(1)
108-
integer, intent(in), dimension(1), optional :: istart, iend
108+
integer, intent(in), dimension(1), optional :: istart, iend, stride
109109
integer, intent(in), dimension(1), optional :: chunk_size
110110
end subroutine
111111

112-
module subroutine nc_write_2d(self, dname, value, dims, istart, iend, chunk_size)
112+
module subroutine nc_write_2d(self, dname, value, dims, istart, iend, stride, chunk_size)
113113
class(netcdf_file), intent(in) :: self
114114
character(*), intent(in) :: dname
115115
class(*), intent(in) :: value(:,:)
116116
character(*), intent(in), optional :: dims(2)
117-
integer, intent(in), dimension(2), optional :: istart, iend
117+
integer, intent(in), dimension(2), optional :: istart, iend, stride
118118
integer, intent(in), dimension(2), optional :: chunk_size
119119
end subroutine
120120

121-
module subroutine nc_write_3d(self, dname, value, dims, istart, iend, chunk_size)
121+
module subroutine nc_write_3d(self, dname, value, dims, istart, iend, stride, chunk_size)
122122
class(netcdf_file), intent(in) :: self
123123
character(*), intent(in) :: dname
124124
class(*), intent(in) :: value(:,:,:)
125125
character(*), intent(in), optional :: dims(3)
126-
integer, intent(in), dimension(3), optional :: istart, iend
126+
integer, intent(in), dimension(3), optional :: istart, iend, stride
127127
integer, intent(in), dimension(3), optional :: chunk_size
128128
end subroutine
129129

130-
module subroutine nc_write_4d(self, dname, value, dims, istart, iend, chunk_size)
130+
module subroutine nc_write_4d(self, dname, value, dims, istart, iend, stride, chunk_size)
131131
class(netcdf_file), intent(in) :: self
132132
character(*), intent(in) :: dname
133133
class(*), intent(in) :: value(:,:,:,:)
134134
character(*), intent(in), optional :: dims(4)
135-
integer, intent(in), dimension(4), optional :: istart, iend
135+
integer, intent(in), dimension(4), optional :: istart, iend, stride
136136
integer, intent(in), dimension(4), optional :: chunk_size
137137
end subroutine
138138

139-
module subroutine nc_write_5d(self, dname, value, dims, istart, iend, chunk_size)
139+
module subroutine nc_write_5d(self, dname, value, dims, istart, iend, stride, chunk_size)
140140
class(netcdf_file), intent(in) :: self
141141
character(*), intent(in) :: dname
142142
class(*), intent(in) :: value(:,:,:,:,:)
143143
character(*), intent(in), optional :: dims(5)
144-
integer, intent(in), dimension(5), optional :: istart, iend
144+
integer, intent(in), dimension(5), optional :: istart, iend, stride
145145
integer, intent(in), dimension(5), optional :: chunk_size
146146
end subroutine
147147

148-
module subroutine nc_write_6d(self, dname, value, dims, istart, iend, chunk_size)
148+
module subroutine nc_write_6d(self, dname, value, dims, istart, iend, stride, chunk_size)
149149
class(netcdf_file), intent(in) :: self
150150
character(*), intent(in) :: dname
151151
class(*), intent(in) :: value(:,:,:,:,:,:)
152152
character(*), intent(in), optional :: dims(6)
153-
integer, intent(in), dimension(6), optional :: istart, iend
153+
integer, intent(in), dimension(6), optional :: istart, iend, stride
154154
integer, intent(in), dimension(6), optional :: chunk_size
155155
end subroutine
156156

157-
module subroutine nc_write_7d(self, dname, value, dims, istart, iend, chunk_size)
157+
module subroutine nc_write_7d(self, dname, value, dims, istart, iend, stride, chunk_size)
158158
class(netcdf_file), intent(in) :: self
159159
character(*), intent(in) :: dname
160160
class(*), intent(in) :: value(:,:,:,:,:,:,:)
161161
character(*), intent(in), optional :: dims(7)
162-
integer, intent(in), dimension(7), optional :: istart, iend
162+
integer, intent(in), dimension(7), optional :: istart, iend, stride
163163
integer, intent(in), dimension(7), optional :: chunk_size
164164
end subroutine
165165

@@ -208,53 +208,53 @@ module subroutine nc_read_scalar(self, dname, value)
208208
!! inout for character
209209
end subroutine
210210

211-
module subroutine nc_read_1d(self, dname, value, istart, iend)
211+
module subroutine nc_read_1d(self, dname, value, istart, iend, stride)
212212
class(netcdf_file), intent(in) :: self
213213
character(*), intent(in) :: dname
214214
class(*), intent(inout) :: value(:)
215-
integer, intent(in), dimension(1), optional :: istart, iend
215+
integer, intent(in), dimension(1), optional :: istart, iend, stride
216216
end subroutine
217217

218-
module subroutine nc_read_2d(self, dname, value, istart, iend)
218+
module subroutine nc_read_2d(self, dname, value, istart, iend, stride)
219219
class(netcdf_file), intent(in) :: self
220220
character(*), intent(in) :: dname
221221
class(*), intent(inout) :: value(:,:)
222-
integer, intent(in), dimension(2), optional :: istart, iend
222+
integer, intent(in), dimension(2), optional :: istart, iend, stride
223223
end subroutine
224224

225-
module subroutine nc_read_3d(self, dname, value, istart, iend)
225+
module subroutine nc_read_3d(self, dname, value, istart, iend, stride)
226226
class(netcdf_file), intent(in) :: self
227227
character(*), intent(in) :: dname
228228
class(*), intent(inout) :: value(:,:,:)
229-
integer, intent(in), dimension(3), optional :: istart, iend
229+
integer, intent(in), dimension(3), optional :: istart, iend, stride
230230
end subroutine
231231

232-
module subroutine nc_read_4d(self, dname, value, istart, iend)
232+
module subroutine nc_read_4d(self, dname, value, istart, iend, stride)
233233
class(netcdf_file), intent(in) :: self
234234
character(*), intent(in) :: dname
235235
class(*), intent(inout) :: value(:,:,:,:)
236-
integer, intent(in), dimension(4), optional :: istart, iend
236+
integer, intent(in), dimension(4), optional :: istart, iend, stride
237237
end subroutine
238238

239-
module subroutine nc_read_5d(self, dname, value, istart, iend)
239+
module subroutine nc_read_5d(self, dname, value, istart, iend, stride)
240240
class(netcdf_file), intent(in) :: self
241241
character(*), intent(in) :: dname
242242
class(*), intent(inout) :: value(:,:,:,:,:)
243-
integer, intent(in), dimension(5), optional :: istart, iend
243+
integer, intent(in), dimension(5), optional :: istart, iend, stride
244244
end subroutine
245245

246-
module subroutine nc_read_6d(self, dname, value, istart, iend)
246+
module subroutine nc_read_6d(self, dname, value, istart, iend, stride)
247247
class(netcdf_file), intent(in) :: self
248248
character(*), intent(in) :: dname
249249
class(*), intent(inout) :: value(:,:,:,:,:,:)
250-
integer, intent(in), dimension(6), optional :: istart, iend
250+
integer, intent(in), dimension(6), optional :: istart, iend, stride
251251
end subroutine
252252

253-
module subroutine nc_read_7d(self, dname, value, istart, iend)
253+
module subroutine nc_read_7d(self, dname, value, istart, iend, stride)
254254
class(netcdf_file), intent(in) :: self
255255
character(*), intent(in) :: dname
256256
class(*), intent(inout) :: value(:,:,:,:,:,:,:)
257-
integer, intent(in), dimension(7), optional :: istart, iend
257+
integer, intent(in), dimension(7), optional :: istart, iend, stride
258258
end subroutine
259259

260260
end interface

src/reader.inc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ endif
2020

2121
select type (value)
2222
type is (real(real64))
23-
ier = nf90_get_var(self%file_id, varid, value, start=istart, count=i)
23+
ier = nf90_get_var(self%file_id, varid, value, start=istart, count=i, stride=stride)
2424
type is (real(real32))
25-
ier = nf90_get_var(self%file_id, varid, value, start=istart, count=i)
25+
ier = nf90_get_var(self%file_id, varid, value, start=istart, count=i, stride=stride)
2626
type is (integer(int64))
27-
ier = nf90_get_var(self%file_id, varid, value, start=istart, count=i)
27+
ier = nf90_get_var(self%file_id, varid, value, start=istart, count=i, stride=stride)
2828
type is (integer(int32))
29-
ier = nf90_get_var(self%file_id, varid, value, start=istart, count=i)
29+
ier = nf90_get_var(self%file_id, varid, value, start=istart, count=i, stride=stride)
3030
class default
3131
ier = NF90_EBADTYPE
3232
end select

src/utils.f90

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
submodule (nc4fortran) utils
22

3+
use netcdf, only : NF90_STRERROR
4+
35
implicit none (type, external)
46

57
contains
@@ -28,7 +30,7 @@
2830
case('r')
2931
ier = nf90_open(self%filename, NF90_NOWRITE, self%file_id)
3032
case('r+')
31-
ier = nf90_open(self%filename, NF90_NETCDF4, self%file_id)
33+
ier = nf90_open(self%filename, NF90_WRITE, self%file_id)
3234
case('rw', 'a')
3335
if(is_netcdf(filename)) then
3436
!! NF90_WRITE is necessary to be in true read/write mode
@@ -122,47 +124,10 @@
122124

123125

124126
module procedure check_error
125-
character(:), allocatable :: m
126-
127-
check_error = .true.
128-
129-
select case (code)
130-
case (NF90_NOERR)
131-
check_error = .false.
132-
case (NF90_EHDFERR)
133-
m = 'ERROR: ' // dname // ' an error was reported by the HDF5 layer.'
134-
case (NF90_EBADNAME)
135-
m = 'ERROR: ' // dname // ' Name contains illegal characters.'
136-
case (NF90_EBADTYPE)
137-
m = 'ERROR: ' // dname // ' specified type is not a valid netCDF type'
138-
case (NF90_EDIMSIZE)
139-
m = 'ERROR: ' // dname // ' bad dimension size'
140-
case (NF90_EBADDIM)
141-
m = 'ERROR: ' // dname // ' invalid dimension ID or Name'
142-
case (NF90_EBADGRPID)
143-
m = 'ERROR: ' // dname // ' bad group ID in file_id'
144-
case (NF90_EBADID)
145-
m = 'ERROR: ' // dname // ' Bad group id or file_id invalid'
146-
case (NF90_ENOTVAR)
147-
m = 'ERROR: ' // dname // ' variable not found'
148-
case (NF90_ENOTNC)
149-
m = 'ERROR: ' // dname // ' not a NetCDF file'
150-
case (NF90_ENAMEINUSE)
151-
m = 'ERROR: ' // dname // ' That name is in use. Compound type names must be unique in the data file.'
152-
case (NF90_ECHAR)
153-
m = 'ERROR: ' // dname // ' attempt to convert between text & numbers'
154-
case (NF90_EEDGE)
155-
m = 'ERROR: ' // dname // ' edge + start exceeds dimension bound'
156-
case (NF90_ESTRIDE)
157-
m = 'ERROR: ' // dname // ' illegal stride'
158-
case (NF90_EINDEFINE)
159-
m = 'ERROR: ' // dname // ' operation not allowed in define mode'
160-
case default
161-
write(stderr,'(/,A,I8)') 'ERROR: ' // dname // ' unknown error',code
162-
m = ''
163-
end select
164127

165-
if(check_error) write(stderr,'(/,A)') m
128+
check_error = code /= NF90_NOERR
129+
130+
if(check_error) write(stderr,'(/,A)') "ERROR:nc4fortran:" // NF90_STRERROR(code)
166131

167132
end procedure check_error
168133

src/write.f90

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
integer :: var_id, dimids(size(dims)), ier
1313

14-
call def_dims(self, dset_name, dimnames=dim_names, dims=dims, dimids=dimids)
14+
call def_dims(self, dset_name, dim_names, dims=dims, dimids=dimids)
1515

1616
if(present(chunk_size)) then
1717
ier = nf90_def_var(self%file_id, dset_name, dtype, dimids=dimids, varid=var_id, &
@@ -102,19 +102,20 @@ end subroutine filler
102102
if(.not.self%is_open) error stop 'ERROR:nc4fortran:write:def_dims: file handle not open'
103103

104104
do i=1,size(dims)
105-
if (present(dimnames)) then
106-
ierr = nf90_inq_dimid(self%file_id, dimnames(i), dimids(i))
105+
if(present(dim_names)) then
106+
ierr = nf90_inq_dimid(self%file_id, dim_names(i), dimids(i))
107107
if(ierr==NF90_NOERR) cycle
108108
!! dimension already exists
109109
endif
110-
!! create new dimension
111-
if(present(dimnames)) then
112-
ierr = nf90_def_dim(self%file_id, dimnames(i), dims(i), dimids(i))
110+
111+
!> create new dimension
112+
if(present(dim_names)) then
113+
ierr = nf90_def_dim(self%file_id, dim_names(i), dims(i), dimids(i))
113114
else
114115
write(name,'(A,A4,I1)') dname,"_dim",i
115116
ierr = nf90_def_dim(self%file_id, trim(name), dims(i), dimids(i))
116-
! print *,trim(name)
117117
endif
118+
if(self%debug) print '(a,i1,a)', "TRACE:def_dims: dimension ", i, " name: " // trim(name)
118119
if (check_error(ierr, dname)) error stop "ERROR:nc4fortran:write def_dim " // dname // " in " // self%filename
119120
end do
120121

src/writer.inc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ endif
2828

2929
select type (value)
3030
type is (real(real32))
31-
ier = nf90_put_var(self%file_id, varid, value, start=istart, count=i)
31+
ier = nf90_put_var(self%file_id, varid, value, start=istart, count=i, stride=stride)
3232
type is (real(real64))
33-
ier = nf90_put_var(self%file_id, varid, value, start=istart, count=i)
33+
ier = nf90_put_var(self%file_id, varid, value, start=istart, count=i, stride=stride)
3434
type is (integer(int32))
35-
ier = nf90_put_var(self%file_id, varid, value, start=istart, count=i)
35+
ier = nf90_put_var(self%file_id, varid, value, start=istart, count=i, stride=stride)
3636
type is (integer(int64))
37-
ier = nf90_put_var(self%file_id, varid, value, start=istart, count=i)
37+
ier = nf90_put_var(self%file_id, varid, value, start=istart, count=i, stride=stride)
3838
class default
3939
ier = NF90_EBADTYPE
4040
end select

0 commit comments

Comments
 (0)