NetCDF
Unidata Network Common Data Form (NetCDF) is a set of libraries and machine-independent data formats that support the creation, access, and sharing of array-oriented scientific data from C, C++, FORTRAN 77, Fortran 90, and Java. For several other programming languages, interface bindings are available (e. g., Python, Octave, Perl).
Installation
The Fortran 90 version of NetCDF 4 can be installed as a package on most Unix-like operating system. On FreeBSD, run:
# pkg install science/netcdf-fortran
The NetCDF shared library is linked with -lnetcdff. Note the
additional f at the end, indicating the Fortran version.
Example
The following example program in Fortran 90 fills an integer array and
writes the data to the NetCDF file data.nc. The data is then read
back into the array from the very same NetCDF file.
! example.f90
program main
use :: netcdf
implicit none
character(len=*), parameter :: FILE_NAME = 'data.nc' ! Export/import file.
integer, parameter :: NX = 12 ! Number of columns.
integer, parameter :: NY = 6 ! Number of rows.
integer :: array(NX, NY)
integer :: x, y
! Create and output sample data.
print '("Data to be written to NetCDF file:")'
print '(a)', repeat('-', 64)
do y = 1, NY
do x = 1, NX
array(x, y) = (y - 1) * NY + (x - 1)
write (*, '(i4)', advance='no') array(x, y)
end do
write (*, *)
end do
print '(a)', repeat('-', 64)
! Write data to NetCDF file (into variable `data`).
call export_int_array(FILE_NAME, array, 'data')
array = 0
! Read data back in from the same NetCDF file (from variable `data`).
call import_int_array(FILE_NAME, array, 'data')
! Print read data to stdout.
print '(/, "Data read from NetCDF file:")'
print '(a)', repeat('-', 64)
do y = 1, NY
do x = 1, NX
write (*, '(i4)', advance='no') array(x, y)
end do
write (*, *)
end do
print '(a)', repeat('-', 64)
contains
subroutine check(stat)
integer, intent(in) :: stat
if (stat /= NF90_NOERR) then
print '(a)', trim(nf90_strerror(stat))
stop
end if
end subroutine check
subroutine export_int_array(file_name, array, var_name)
character(len=*), intent(in) :: file_name
integer, intent(inout) :: array(:, :)
character(len=*), intent(in) :: var_name
integer :: ncid, varid
integer :: x_dimid, y_dimid
! Create the NetCDF file. Override file, if it already exists.
call check(nf90_create(file_name, NF90_CLOBBER, ncid))
! Define the dimensions. NetCDF returns the IDs `x_dimid` and `y_dimid`.
call check(nf90_def_dim(ncid, 'x', size(array, 1), x_dimid))
call check(nf90_def_dim(ncid, 'y', size(array, 2), y_dimid))
! Define the variable type (NF90_INT: 4-byte integer).
call check(nf90_def_var(ncid, var_name, NF90_INT, [ x_dimid, y_dimid ], varid))
! End define mode.
call check(nf90_enddef(ncid))
! Write the data to the file.
call check(nf90_put_var(ncid, varid, array))
! Close the file.
call check(nf90_close(ncid))
end subroutine export_int_array
subroutine import_int_array(file_name, array, var_name)
character(len=*), intent(in) :: file_name
integer, intent(inout) :: array(:, :)
character(len=*), intent(in) :: var_name
integer :: ncid, varid
! Open the NetCDF file read-only.
call check(nf90_open(file_name, NF90_NOWRITE, ncid))
! Get the `varid` of the data variable, based on its name.
call check(nf90_inq_varid(ncid, var_name, varid))
! Read the data.
call check(nf90_get_var(ncid, varid, array))
! Close the file.
call check(nf90_close(ncid))
end subroutine import_int_array
end program main
Compile, link, and run the program with:
$ gfortran14 -I/usr/local/include -L/usr/local/lib -o example example.f90 -lnetcdff
$ ./example
Data to be written to NetCDF file:
----------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31 32 33 34 35
36 37 38 39 40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69 70 71
----------------------------------------------------------------
Data read from NetCDF file:
----------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31 32 33 34 35
36 37 38 39 40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69 70 71
----------------------------------------------------------------
Fortran Libraries
- easy-netcdf: Fortran OOP interface to the NetCDF library
- mo_netcdf: Object-oriented wrapper around the NetCDF Fortran 90 interface
- nc4fortran: Object-oriented Fortran 2008 NetCDF 4 interface
- NetCDF95: Fortran 95 interface to the NetCDF library
- NCIO: NetCDF input-output interface library
References
- NetCDF: Official website
- NetCDF-Fortran: Documentation of the NetCDF Fortran library
- NetCDF Example Programs: Examples in FORTRAN 77, Fortran 90, and other languages
| < Gnuplot | [Index] | JSON > |