Skip to content

Commit b825672

Browse files
committed
tkr-distinct write scalar prototype
1 parent 05d5fca commit b825672

File tree

3 files changed

+114
-63
lines changed

3 files changed

+114
-63
lines changed

src/interface.f90

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,15 @@ module nc4fortran
4040
is_chunked, is_contig, chunks=>get_chunk
4141

4242
!> generic procedures mapped over type / rank
43-
generic, public :: write => nc_write_scalar, nc_write_1d, nc_write_2d, nc_write_3d, &
43+
generic, public :: write => &
44+
nc_write_scalar_r32, nc_write_scalar_r64, nc_write_scalar_i32, nc_write_scalar_i64, nc_write_scalar_char, &
45+
nc_write_1d, nc_write_2d, nc_write_3d, &
4446
nc_write_4d, nc_write_5d, nc_write_6d, nc_write_7d
4547

4648
generic, public :: read => nc_read_scalar, nc_read_1d, nc_read_2d, nc_read_3d, nc_read_4d, nc_read_5d, nc_read_6d, nc_read_7d
4749

48-
procedure, private :: nc_write_scalar, nc_write_1d, nc_write_2d, nc_write_3d, nc_write_4d, nc_write_5d, nc_write_6d, nc_write_7d, &
50+
procedure, private :: nc_write_scalar_r32, nc_write_scalar_r64, nc_write_scalar_i32, nc_write_scalar_i64, nc_write_scalar_char, &
51+
nc_write_1d, nc_write_2d, nc_write_3d, nc_write_4d, nc_write_5d, nc_write_6d, nc_write_7d, &
4952
nc_read_scalar, nc_read_1d, nc_read_2d, nc_read_3d, nc_read_4d, nc_read_5d, nc_read_6d, nc_read_7d, &
5053
def_dims
5154

@@ -69,12 +72,40 @@ module function get_tempdir()
6972
end interface
7073

7174
interface !< writer.f90
72-
module subroutine nc_write_scalar(self, dname, value, ierr)
75+
module subroutine nc_write_scalar_char(self, dname, value, ierr)
7376
class(netcdf_file), intent(in) :: self
7477
character(*), intent(in) :: dname
75-
class(*), intent(in) :: value
78+
character(*), intent(in) :: value
79+
integer, intent(out), optional :: ierr
80+
end subroutine nc_write_scalar_char
81+
82+
module subroutine nc_write_scalar_r32(self, dname, value, ierr)
83+
class(netcdf_file), intent(in) :: self
84+
character(*), intent(in) :: dname
85+
real(real32), intent(in) :: value
86+
integer, intent(out), optional :: ierr
87+
end subroutine nc_write_scalar_r32
88+
89+
module subroutine nc_write_scalar_r64(self, dname, value, ierr)
90+
class(netcdf_file), intent(in) :: self
91+
character(*), intent(in) :: dname
92+
real(real64), intent(in) :: value
93+
integer, intent(out), optional :: ierr
94+
end subroutine nc_write_scalar_r64
95+
96+
module subroutine nc_write_scalar_i32(self, dname, value, ierr)
97+
class(netcdf_file), intent(in) :: self
98+
character(*), intent(in) :: dname
99+
integer(int32), intent(in) :: value
100+
integer, intent(out), optional :: ierr
101+
end subroutine nc_write_scalar_i32
102+
103+
module subroutine nc_write_scalar_i64(self, dname, value, ierr)
104+
class(netcdf_file), intent(in) :: self
105+
character(*), intent(in) :: dname
106+
integer(int64), intent(in) :: value
76107
integer, intent(out), optional :: ierr
77-
end subroutine nc_write_scalar
108+
end subroutine nc_write_scalar_i64
78109

79110
module subroutine nc_write_1d(self, dname, value, dims, ierr)
80111
class(netcdf_file), intent(in) :: self

src/tests/test_error.f90

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ program test_errors
1414
print *, 'OK: non-existing variable'
1515
call test_wrong_type()
1616
print *, "OK: wrong type read"
17-
call test_unknown_write()
18-
print *, 'OK: unknown write'
1917
call test_unknown_read()
2018
print *, 'OK: unknown read'
2119

@@ -83,20 +81,6 @@ subroutine test_wrong_type()
8381
end subroutine test_wrong_type
8482

8583

86-
subroutine test_unknown_write()
87-
integer :: ierr
88-
type(netcdf_file) :: h
89-
character(*), parameter :: filename = 'bad.nc'
90-
complex :: x
91-
92-
x = (1, -1)
93-
94-
call h%initialize(filename, ierr, status='replace')
95-
call h%write('/complex', x, ierr)
96-
if(ierr==NF90_NOERR) error stop 'test_unknown_write: writing unknown type variable'
97-
end subroutine test_unknown_write
98-
99-
10084
subroutine test_unknown_read()
10185
integer :: ierr
10286
type(netcdf_file) :: h

src/writer.in.f90

Lines changed: 78 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -7,62 +7,98 @@
77

88
contains
99

10-
module procedure nc_write_scalar
11-
integer :: varid, ier
10+
module procedure nc_write_scalar_char
11+
integer :: varid, ier, lenid
1212

1313
if(.not.self%is_open) error stop 'ERROR:nc4fortran:writer: file handle not open'
1414

15-
ier = NF90_NOERR
15+
!! uses string prefill method
16+
!! https://www.unidata.ucar.edu/software/netcdf/docs-fortran/f90-variables.html#f90-reading-and-writing-character-string-values
17+
18+
ier = nf90_def_dim(self%ncid, dname // "StrLen", len(value) + 1, lenid)
19+
if(ier == NF90_NOERR) ier = nf90_def_var(self%ncid, dname, NF90_CHAR, dimids=lenid, varid=varid)
20+
21+
if(ier == NF90_NOERR) ier = nf90_enddef(self%ncid) !< prefill
22+
if(ier == NF90_NOERR) ier = nf90_put_var(self%ncid, varid, value)
23+
24+
if (present(ierr)) ierr = ier
25+
if (check_error(ier, dname) .and. .not. present(ierr)) error stop 'nc4fortran:write could not write ' // dname
26+
27+
end procedure nc_write_scalar_char
28+
29+
module procedure nc_write_scalar_r32
30+
integer :: varid, ier
31+
32+
if(.not.self%is_open) error stop 'nc4fortran:write: file handle not open for ' // dname
1633

1734
if (self%exist(dname)) then
1835
ier = nf90_inq_varid(self%ncid, dname, varid)
1936
else
20-
select type (value)
21-
type is (real(real64))
22-
ier = nf90_def_var(self%ncid, dname, NF90_DOUBLE, varid=varid)
23-
type is (real(real32))
24-
ier = nf90_def_var(self%ncid, dname, NF90_FLOAT, varid=varid)
25-
type is (integer(int32))
26-
ier = nf90_def_var(self%ncid, dname, NF90_INT, varid=varid)
27-
type is (integer(int64))
28-
ier = nf90_def_var(self%ncid, dname, NF90_INT64, varid=varid)
29-
end select
37+
ier = nf90_def_var(self%ncid, dname, NF90_FLOAT, varid=varid)
3038
endif
3139

32-
if(ier/=NF90_NOERR) write(stderr,*) 'ERROR:nc4fortran:writer:scalar: problem getting varid'
33-
34-
if(ier == NF90_NOERR) then
35-
select type (value)
36-
type is (character(*))
37-
!! uses string prefill method
38-
!! https://www.unidata.ucar.edu/software/netcdf/docs-fortran/f90-variables.html#f90-reading-and-writing-character-string-values
39-
block
40-
integer :: lenid
41-
ier = nf90_def_dim(self%ncid, dname // "StrLen", len(value) + 1, lenid)
42-
if(ier == NF90_NOERR) ier = nf90_def_var(self%ncid, dname, NF90_CHAR, dimids=lenid, varid=varid)
43-
end block
44-
if(ier == NF90_NOERR) ier = nf90_enddef(self%ncid) !< prefill
45-
if(ier == NF90_NOERR) ier = nf90_put_var(self%ncid, varid, value)
46-
type is (real(real64))
47-
ier = nf90_put_var(self%ncid, varid, value)
48-
type is (real(real32))
49-
ier = nf90_put_var(self%ncid, varid, value)
50-
type is (integer(int32))
51-
ier = nf90_put_var(self%ncid, varid, value)
52-
type is (integer(int64))
53-
ier = nf90_put_var(self%ncid, varid, value)
54-
class default
55-
ier = NF90_EBADTYPE
56-
end select
40+
if(ier == NF90_NOERR) ier = nf90_put_var(self%ncid, varid, value)
41+
42+
if (present(ierr)) ierr = ier
43+
if (check_error(ier, dname) .and. .not. present(ierr)) error stop 'nc4fortran:write: could not write ' // dname
44+
45+
end procedure nc_write_scalar_r32
46+
47+
module procedure nc_write_scalar_r64
48+
integer :: varid, ier
49+
50+
if(.not.self%is_open) error stop 'nc4fortran:write: file handle not open for ' // dname
51+
52+
if (self%exist(dname)) then
53+
ier = nf90_inq_varid(self%ncid, dname, varid)
54+
else
55+
ier = nf90_def_var(self%ncid, dname, NF90_DOUBLE, varid=varid)
5756
endif
5857

58+
if(ier == NF90_NOERR) ier = nf90_put_var(self%ncid, varid, value)
59+
5960
if (present(ierr)) ierr = ier
60-
if (check_error(ier, dname)) then
61-
if (present(ierr)) return
62-
error stop
61+
if (check_error(ier, dname) .and. .not. present(ierr)) error stop 'nc4fortran:write: could not write ' // dname
62+
63+
end procedure nc_write_scalar_r64
64+
65+
66+
module procedure nc_write_scalar_i32
67+
integer :: varid, ier
68+
69+
if(.not.self%is_open) error stop 'nc4fortran:write: file handle not open for ' // dname
70+
71+
if (self%exist(dname)) then
72+
ier = nf90_inq_varid(self%ncid, dname, varid)
73+
else
74+
ier = nf90_def_var(self%ncid, dname, NF90_INT, varid=varid)
75+
endif
76+
77+
if(ier == NF90_NOERR) ier = nf90_put_var(self%ncid, varid, value)
78+
79+
if (present(ierr)) ierr = ier
80+
if (check_error(ier, dname) .and. .not. present(ierr)) error stop 'nc4fortran:write: could not write ' // dname
81+
82+
end procedure nc_write_scalar_i32
83+
84+
85+
module procedure nc_write_scalar_i64
86+
integer :: varid, ier
87+
88+
if(.not.self%is_open) error stop 'nc4fortran:write: file handle not open for ' // dname
89+
90+
if (self%exist(dname)) then
91+
ier = nf90_inq_varid(self%ncid, dname, varid)
92+
else
93+
ier = nf90_def_var(self%ncid, dname, NF90_INT64, varid=varid)
6394
endif
6495

65-
end procedure nc_write_scalar
96+
if(ier == NF90_NOERR) ier = nf90_put_var(self%ncid, varid, value)
97+
98+
if (present(ierr)) ierr = ier
99+
if (check_error(ier, dname) .and. .not. present(ierr)) error stop 'nc4fortran:write: could not write ' // dname
100+
101+
end procedure nc_write_scalar_i64
66102

67103

68104
module procedure nc_write_1d

0 commit comments

Comments
 (0)