|
6 | 6 |
|
7 | 7 |
|
8 | 8 | module procedure nc_read_scalar |
9 | | -integer :: varid, ier, i |
10 | | -integer, allocatable :: dims(:) |
| 9 | +integer :: varid, ier, i, dimids(1) |
| 10 | +integer :: dims |
| 11 | +character(:), allocatable :: buf |
11 | 12 |
|
12 | | -if(.not.self%is_open) error stop 'nc4fortran:reader file handle not open' |
| 13 | +if(.not.self%is_open) error stop 'ERROR:nc4fortran:reader file handle not open' |
13 | 14 |
|
14 | 15 | ier = nf90_inq_varid(self%ncid, dname, varid) |
| 16 | +if (check_error(ier, dname)) error stop 'ERROR:nc4fortran:read inquire_id ' // dname // ' in ' // self%filename |
15 | 17 |
|
16 | | -if(ier == NF90_NOERR) then |
17 | 18 | select type (value) |
18 | 19 | type is (character(*)) |
19 | 20 | !! NetCDF4 requires knowing the exact character length as if it were an array without fill values |
20 | 21 | !! HDF5 is not this strict; having a longer string variable than disk variable is OK in HDF5, but not NetCDF4 |
21 | | - call self%shape(dname, dims) |
22 | | - charbuf : block |
23 | | - character(len=dims(1)) :: buf |
24 | | - ier = nf90_get_var(self%ncid, varid, buf) |
25 | | - i = index(buf, c_null_char) - 1 |
26 | | - if(i == -1) i = len_trim(buf) |
27 | | - value = buf(:i) |
28 | | - end block charbuf |
| 22 | + ier = nf90_inquire_variable(self%ncid, varid, dimids = dimids) |
| 23 | + if(check_error(ier, dname)) error stop 'ERROR:nc4fortran:read_scalar: could not get dimension IDs for: ' // dname |
| 24 | + |
| 25 | + ier = nf90_inquire_dimension(self%ncid, dimid=dimids(1), len=dims) |
| 26 | + if(ier/=NF90_NOERR) error stop 'ERROR:nc4fortran:read_scalar: querying dimension size' |
| 27 | + |
| 28 | + allocate(character(dims) :: buf) |
| 29 | + ier = nf90_get_var(self%ncid, varid, buf) |
| 30 | + i = index(buf, c_null_char) - 1 |
| 31 | + if(i == -1) i = len_trim(buf) |
| 32 | + value = buf(:i) |
29 | 33 | type is (real(real64)) |
30 | 34 | ier = nf90_get_var(self%ncid, varid, value) |
31 | 35 | type is (real(real32)) |
|
37 | 41 | class default |
38 | 42 | ier = NF90_EBADTYPE |
39 | 43 | end select |
40 | | -endif |
41 | | - |
42 | | -if (check_error(ier, dname)) error stop 'nc4fortran:read failed ' // dname // ' in ' // self%filename |
| 44 | +if (check_error(ier, dname)) error stop 'ERROR:nc4fortran:read_scalar: failed ' // dname // ' in ' // self%filename |
43 | 45 |
|
44 | 46 | end procedure nc_read_scalar |
45 | 47 |
|
|
0 commit comments