Skip to content

Commit 566f3d7

Browse files
authored
Add group reading operations (Resolve #9) (#14)
* Add group reading operations & examples * update README.md
1 parent 0b864e7 commit 566f3d7

File tree

6 files changed

+120
-2
lines changed

6 files changed

+120
-2
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ endif()
154154
# test nc Fast I/O lib
155155
if (BUILD_FAST_IO AND HAS_NC)
156156
cda_add_test(test_ncio test_ncio ${CMAKE_SOURCE_DIR}/test-fast "Test passed")
157+
cda_add_test(test_ncio_group test_ncio_group ${CMAKE_SOURCE_DIR}/test-fast "Test passed")
157158
endif()
158159

159160
# test hdf5 Fast I/O lib

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# F90GIO Release v2.0.3
1+
# F90GIO Release v2.1
22
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7729468.svg)](https://doi.org/10.5281/zenodo.7729468)
33
[![GitHub Clones](https://img.shields.io/badge/dynamic/json?color=blue&label=Unique%20clone%20since%2009/13/2023&query=uniques&url=https://gist.githubusercontent.com/cd10kfsu/10a9cdaa0d1d14b12e1f58bcef5e56c3/raw/clone.json&logo=github)](https://github.com/MShawon/github-clone-count-badge)
44
[![build_gfortran](https://github.com/cd10kfsu/F90GIO/actions/workflows/build_gfortran.yml/badge.svg)](https://github.com/cd10kfsu/F90GIO/actions/workflows/build_gfortran.yml)

libsrc/fast/nc/m_ncio.f90

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ MODULE m_ncio
99
NF90_DOUBLE, NF90_FLOAT, NF90_INT, NF90_SHORT, NF90_BYTE, &
1010
NF90_UNLIMITED, &
1111
NF90_Open, NF90_Close, &
12-
NF90_inquire, NF90_Inq_Varid, NF90_Inquire_Variable, &
12+
NF90_inquire, NF90_Inq_Ncid, NF90_Inq_Varid, NF90_Inquire_Variable, &
1313
NF90_Inq_DimID, NF90_Inquire_Dimension, &
1414
NF90_Get_Var, NF90_Put_Var, &
1515
NF90_Create, NF90_Def_dim, NF90_Def_Var, NF90_Enddef, NF90_reDef, &
@@ -22,6 +22,9 @@ MODULE m_ncio
2222
! open/close file
2323
PUBLIC :: nc_get_fid, nc_close_fid
2424

25+
! get group id
26+
PUBLIC :: nc_get_gid
27+
2528
! Create new file/dim/var
2629
PUBLIC :: nc_create_file, nc_create_dim, nc_create_var
2730

@@ -42,9 +45,11 @@ MODULE m_ncio
4245
PUBLIC :: nc_fndvar, nc_fnddim
4346

4447
! read ND vars
48+
PUBLIC :: nc_rdvar
4549
PUBLIC :: nc_rdvar1d, nc_rdvar2d, nc_rdvar3d, nc_rdvar4d
4650

4751
! write ND vars
52+
PUBLIC :: nc_wrtvar
4853
PUBLIC :: nc_wrtvar1d, nc_wrtvar2d, nc_wrtvar3d, nc_wrtvar4d
4954

5055
! low-level Read 1D
@@ -82,6 +87,17 @@ MODULE m_ncio
8287
MODULE PROCEDURE nc_rdatt_r4, nc_rdatt_r8
8388
END INTERFACE
8489

90+
INTERFACE nc_rdvar
91+
MODULE PROCEDURE nc_rdvar1d_i1, nc_rdvar1d_i2, nc_rdvar1d_i4
92+
MODULE PROCEDURE nc_rdvar1d_r4, nc_rdvar1d_r8
93+
MODULE PROCEDURE nc_rdvar2d_i1, nc_rdvar2d_i2, nc_rdvar2d_i4
94+
MODULE PROCEDURE nc_rdvar2d_r4, nc_rdvar2d_r8
95+
MODULE PROCEDURE nc_rdvar3d_i1, nc_rdvar3d_i2, nc_rdvar3d_i4
96+
MODULE PROCEDURE nc_rdvar3d_r4, nc_rdvar3d_r8
97+
MODULE PROCEDURE nc_rdvar4d_i1, nc_rdvar4d_i2, nc_rdvar4d_i4
98+
MODULE PROCEDURE nc_rdvar4d_r4, nc_rdvar4d_r8
99+
END INTERFACE
100+
85101
INTERFACE nc_rdvar1d
86102
MODULE PROCEDURE nc_rdvar1d_i1, nc_rdvar1d_i2, nc_rdvar1d_i4
87103
MODULE PROCEDURE nc_rdvar1d_r4, nc_rdvar1d_r8
@@ -102,6 +118,17 @@ MODULE m_ncio
102118
MODULE PROCEDURE nc_rdvar4d_r4, nc_rdvar4d_r8
103119
END INTERFACE
104120

121+
INTERFACE nc_wrtvar
122+
MODULE PROCEDURE nc_wrtvar1d_i1, nc_wrtvar1d_i2, nc_wrtvar1d_i4
123+
MODULE PROCEDURE nc_wrtvar1d_r4, nc_wrtvar1d_r8
124+
MODULE PROCEDURE nc_wrtvar2d_i1, nc_wrtvar2d_i2, nc_wrtvar2d_i4
125+
MODULE PROCEDURE nc_wrtvar2d_r4, nc_wrtvar2d_r8
126+
MODULE PROCEDURE nc_wrtvar3d_i1, nc_wrtvar3d_i2, nc_wrtvar3d_i4
127+
MODULE PROCEDURE nc_wrtvar3d_r4, nc_wrtvar3d_r8
128+
MODULE PROCEDURE nc_wrtvar4d_i1, nc_wrtvar4d_i2, nc_wrtvar4d_i4
129+
MODULE PROCEDURE nc_wrtvar4d_r4, nc_wrtvar4d_r8
130+
END INTERFACE
131+
105132
INTERFACE nc_wrtvar1d
106133
MODULE PROCEDURE nc_wrtvar1d_i1, nc_wrtvar1d_i2, nc_wrtvar1d_i4
107134
MODULE PROCEDURE nc_wrtvar1d_r4, nc_wrtvar1d_r8
@@ -144,6 +171,7 @@ MODULE m_ncio
144171
INTEGER(i1) :: gendim = 8
145172
INTEGER(i1) :: genvar = 9
146173
INTEGER(i1) :: endgen = 10
174+
INTEGER(i1) :: gid = 11
147175
INTEGER(i1) :: undef = 127 ! max positive for signed 8-byte int
148176
END TYPE
149177
TYPE(t_errcode),SAVE,PRIVATE:: errcode
@@ -246,6 +274,24 @@ SUBROUTINE nc_close_fid(fid)
246274

247275
END SUBROUTINE nc_close_fid
248276

277+
!--------------------------------------------------------------------------------
278+
! group operations
279+
!--------------------------------------------------------------------------------
280+
SUBROUTINE nc_get_gid(fid, gname, gid)
281+
IMPLICIT NONE
282+
283+
INTEGER(i4),INTENT(IN) :: fid
284+
CHARACTER(*),INTENT(IN) :: gname
285+
INTEGER(i4),INTENT(OUT) :: gid
286+
INTEGER(i4) :: istat
287+
288+
istat = nf90_inq_ncid(fid, trim(gname), gid)
289+
if (istat /= NF90_NOERR) then
290+
write(lout_log,*) "[err] nc_close_fid::Fail to get group id =",fid, "for var:", trim(gname)
291+
call mystop(errcode%gid)
292+
end if
293+
294+
END SUBROUTINE nc_get_gid
249295

250296
!--------------------------------------------------------------------------------
251297
! create vars

test-fast/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ if (BUILD_FAST_IO AND HAS_NC)
88
target_link_libraries(${EXE} ${TESTLIBS})
99
set_target_properties(${EXE}
1010
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-fast)
11+
12+
set(EXE test_ncio_group)
13+
set(TESTSRC test_ncio_group.f90)
14+
set(TESTLIBS ncio $ENV{NC_LIBS})
15+
add_executable(${EXE} ${TESTSRC})
16+
#target_include_directories(${EXE} PRIVATE "$<BUILD_INTERFACE:${CMAKE_Fortran_MODULE_DIRECTORY}>")
17+
target_link_libraries(${EXE} ${TESTLIBS})
18+
set_target_properties(${EXE}
19+
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-fast)
20+
1121
endif()
1222

1323
if (BUILD_FAST_IO AND HAS_H5)

test-fast/profile_has_groups.nc4

71.5 KB
Binary file not shown.

test-fast/test_ncio_group.f90

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
PROGRAM test_ncio_group
2+
USE iso_fortran_env, ONLY: r8 =>real64, r4 =>real32
3+
USE m_ncio, ONLY: nc_get_fid, nc_get_gid, nc_close_fid, nc_rddim, nc_rdatt, &
4+
nc_rdvar
5+
use netcdf
6+
IMPLICIT NONE
7+
8+
CHARACTER(256) :: obsinfile
9+
10+
INTEGER :: fid, gid
11+
INTEGER :: nx ! Location
12+
REAL(r4),ALLOCATABLE :: alon1d(:), alat1d(:) ! nx
13+
REAL(r4),ALLOCATABLE :: hofx0_waterTemperature(:) ! nx
14+
REAL(r4) :: rFillValue
15+
16+
!-------------------------------------------------------------------------------
17+
! Open the nc file
18+
19+
obsinfile = "profile_has_groups.nc4"
20+
WRITE(6,*) "[msg] ioda_read::obsinfile=", trim(obsinfile)
21+
CALL nc_get_fid(trim(obsinfile), fid)
22+
23+
!-------------------------------------------------------------------------------
24+
! read global dimension
25+
CALL nc_rddim(fid, "Location", nx)
26+
WRITE(6,*) "[msg] ioda_read::Location=", nx
27+
28+
! read group "MetaData"
29+
CALL nc_get_gid(fid, "MetaData", gid)
30+
ALLOCATE(alon1d(nx),alat1d(nx))
31+
CALL nc_rdvar(gid, "longitude", alon1d)
32+
WRITE(6,*) "[msg] ioda_read::MetaData - longitude: min, max=", &
33+
minval(alon1d), maxval(alon1d)
34+
CALL nc_rdvar(gid, "latitude", alat1d)
35+
WRITE(6,*) "[msg] ioda_read::MetaData - latitude: min, max=", &
36+
minval(alat1d), maxval(alat1d)
37+
CALL nc_rdatt(gid, "latitude", "_FillValue", rFillValue)
38+
WRITE(6,*) "[msg] ioda_read::MetaData - latitude: _FillValue =", rFillValue
39+
40+
! [FIXME]: currently no way to read string attributes using netcdf-fortran
41+
! float longitude(Location) ;
42+
! longitude:_FillValue = -3.368795e+38f ;
43+
! string longitude:units = "degrees_east" ;
44+
45+
! read another group "hofx0"
46+
CALL nc_get_gid(fid, "hofx0", gid)
47+
ALLOCATE(hofx0_waterTemperature(nx))
48+
CALL nc_rdvar(gid, "waterTemperature",hofx0_waterTemperature)
49+
WRITE(6,*) "[msg] ioda_read::hofx0 - waterTemperature: min, max=", &
50+
minval(hofx0_waterTemperature), maxval(hofx0_waterTemperature)
51+
52+
!-------------------------------------------------------------------------------
53+
! Close the nc file
54+
55+
CALL nc_close_fid(fid)
56+
57+
WRITE(6,*) "Test passed"
58+
59+
END PROGRAM
60+
61+

0 commit comments

Comments
 (0)