-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
d744c2f
commit 9b14a6f
Showing
2 changed files
with
193 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,192 @@ | ||
MODULE netcdf_utils | ||
!! Module for common NetCDF utility procedures. | ||
USE netcdf | ||
USE iso_fortran_env, ONLY: int32, real32, real64 | ||
|
||
IMPLICIT NONE | ||
|
||
PRIVATE | ||
|
||
PUBLIC :: to_netcdf | ||
|
||
INTERFACE to_netcdf | ||
!! Overloads for arrays of different types and dimensions to NetCDF. | ||
MODULE PROCEDURE to_netcdf_int32_1d, to_netcdf_int32_2d, to_netcdf_int32_3d | ||
MODULE PROCEDURE to_netcdf_real32_1d, to_netcdf_real32_2d, to_netcdf_real32_3d | ||
MODULE PROCEDURE to_netcdf_real64_1d, to_netcdf_real64_2d, to_netcdf_real64_3d | ||
END INTERFACE to_netcdf | ||
|
||
CONTAINS | ||
|
||
SUBROUTINE check(status) | ||
!! Check NetCDF error status. | ||
INTEGER, INTENT(IN) :: status !! Error status | ||
IF (status /= NF90_NOERR) THEN | ||
PRINT *, trim(nf90_strerror(status)) | ||
STOP | ||
END IF | ||
END SUBROUTINE check | ||
|
||
SUBROUTINE to_netcdf_int32_1d(filename, values) | ||
!* Dump values to NetCDF file. | ||
! Any existing dataset with the same filename will be overwritten. | ||
CHARACTER (len=*), INTENT(IN) :: filename | ||
INTEGER (kind=int32), DIMENSION(:), INTENT(IN) :: values | ||
INTEGER :: ncid, varid, dimids(1), i | ||
CHARACTER (len=2) :: dimc | ||
CALL check( nf90_create(filename, NF90_CLOBBER, ncid) ) | ||
DO i = 1, size(shape(values)) | ||
WRITE (dimc, "(I2.2)") i | ||
CALL check( nf90_def_dim(ncid, "dim" // dimc, size(values, i), dimids(i)) ) | ||
END DO | ||
CALL check( nf90_def_var(ncid, "values", NF90_INT, dimids, varid) ) | ||
CALL check( nf90_enddef(ncid) ) | ||
CALL check( nf90_put_var(ncid, varid, values) ) | ||
CALL check( nf90_close(ncid) ) | ||
END SUBROUTINE to_netcdf_int32_1d | ||
|
||
SUBROUTINE to_netcdf_int32_2d(filename, values) | ||
!* Dump values to NetCDF file. | ||
! Any existing dataset with the same filename will be overwritten. | ||
CHARACTER (len=*), INTENT(IN) :: filename | ||
INTEGER (kind=int32), DIMENSION(:,:), INTENT(IN) :: values | ||
INTEGER :: ncid, varid, dimids(2), i | ||
CHARACTER (len=2) :: dimc | ||
CALL check( nf90_create(filename, NF90_CLOBBER, ncid) ) | ||
DO i = 1, size(shape(values)) | ||
WRITE (dimc, "(I2.2)") i | ||
CALL check( nf90_def_dim(ncid, "dim" // dimc, size(values, i), dimids(i)) ) | ||
END DO | ||
CALL check( nf90_def_var(ncid, "values", NF90_INT, dimids, varid) ) | ||
CALL check( nf90_enddef(ncid) ) | ||
CALL check( nf90_put_var(ncid, varid, values) ) | ||
CALL check( nf90_close(ncid) ) | ||
END SUBROUTINE to_netcdf_int32_2d | ||
|
||
SUBROUTINE to_netcdf_int32_3d(filename, values) | ||
!* Dump values to NetCDF file. | ||
! Any existing dataset with the same filename will be overwritten. | ||
CHARACTER (len=*), INTENT(IN) :: filename | ||
INTEGER (kind=int32), DIMENSION(:,:,:), INTENT(IN) :: values | ||
INTEGER :: ncid, varid, dimids(3), i | ||
CHARACTER (len=2) :: dimc | ||
CALL check( nf90_create(filename, NF90_CLOBBER, ncid) ) | ||
DO i = 1, size(shape(values)) | ||
WRITE (dimc, "(I2.2)") i | ||
CALL check( nf90_def_dim(ncid, "dim" // dimc, size(values, i), dimids(i)) ) | ||
END DO | ||
CALL check( nf90_def_var(ncid, "values", NF90_INT, dimids, varid) ) | ||
CALL check( nf90_enddef(ncid) ) | ||
CALL check( nf90_put_var(ncid, varid, values) ) | ||
CALL check( nf90_close(ncid) ) | ||
END SUBROUTINE to_netcdf_int32_3d | ||
|
||
SUBROUTINE to_netcdf_real32_1d(filename, values) | ||
!* Dump values to NetCDF file. | ||
! Any existing dataset with the same filename will be overwritten. | ||
CHARACTER (len=*), INTENT(IN) :: filename | ||
REAL (kind=real32), DIMENSION(:), INTENT(IN) :: values | ||
INTEGER :: ncid, varid, dimids(1), i | ||
CHARACTER (len=2) :: dimc | ||
CALL check( nf90_create(filename, NF90_CLOBBER, ncid) ) | ||
DO i = 1, size(shape(values)) | ||
WRITE (dimc, "(I2.2)") i | ||
CALL check( nf90_def_dim(ncid, "dim" // dimc, size(values, i), dimids(i)) ) | ||
END DO | ||
CALL check( nf90_def_var(ncid, "values", NF90_FLOAT, dimids, varid) ) | ||
CALL check( nf90_enddef(ncid) ) | ||
CALL check( nf90_put_var(ncid, varid, values) ) | ||
CALL check( nf90_close(ncid) ) | ||
END SUBROUTINE to_netcdf_real32_1d | ||
|
||
SUBROUTINE to_netcdf_real32_2d(filename, values) | ||
!* Dump values to NetCDF file. | ||
! Any existing dataset with the same filename will be overwritten. | ||
CHARACTER (len=*), INTENT(IN) :: filename | ||
REAL (kind=real32), DIMENSION(:,:), INTENT(IN) :: values | ||
INTEGER :: ncid, varid, dimids(2), i | ||
CHARACTER (len=2) :: dimc | ||
CALL check( nf90_create(filename, NF90_CLOBBER, ncid) ) | ||
DO i = 1, size(shape(values)) | ||
WRITE (dimc, "(I2.2)") i | ||
CALL check( nf90_def_dim(ncid, "dim" // dimc, size(values, i), dimids(i)) ) | ||
END DO | ||
CALL check( nf90_def_var(ncid, "values", NF90_FLOAT, dimids, varid) ) | ||
CALL check( nf90_enddef(ncid) ) | ||
CALL check( nf90_put_var(ncid, varid, values) ) | ||
CALL check( nf90_close(ncid) ) | ||
END SUBROUTINE to_netcdf_real32_2d | ||
|
||
SUBROUTINE to_netcdf_real32_3d(filename, values) | ||
!* Dump values to NetCDF file. | ||
! Any existing dataset with the same filename will be overwritten. | ||
CHARACTER (len=*), INTENT(IN) :: filename | ||
REAL (kind=real32), DIMENSION(:,:,:), INTENT(IN) :: values | ||
INTEGER :: ncid, varid, dimids(3), i | ||
CHARACTER (len=2) :: dimc | ||
CALL check( nf90_create(filename, NF90_CLOBBER, ncid) ) | ||
DO i = 1, size(shape(values)) | ||
WRITE (dimc, "(I2.2)") i | ||
CALL check( nf90_def_dim(ncid, "dim" // dimc, size(values, i), dimids(i)) ) | ||
END DO | ||
CALL check( nf90_def_var(ncid, "values", NF90_FLOAT, dimids, varid) ) | ||
CALL check( nf90_enddef(ncid) ) | ||
CALL check( nf90_put_var(ncid, varid, values) ) | ||
CALL check( nf90_close(ncid) ) | ||
END SUBROUTINE to_netcdf_real32_3d | ||
|
||
SUBROUTINE to_netcdf_real64_1d(filename, values) | ||
!* Dump values to NetCDF file. | ||
! Any existing dataset with the same filename will be overwritten. | ||
CHARACTER (len=*), INTENT(IN) :: filename | ||
REAL (kind=real64), DIMENSION(:), INTENT(IN) :: values | ||
INTEGER :: ncid, varid, dimids(1), i | ||
CHARACTER (len=2) :: dimc | ||
CALL check( nf90_create(filename, NF90_CLOBBER, ncid) ) | ||
DO i = 1, size(shape(values)) | ||
WRITE (dimc, "(I2.2)") i | ||
CALL check( nf90_def_dim(ncid, "dim" // dimc, size(values, i), dimids(i)) ) | ||
END DO | ||
CALL check( nf90_def_var(ncid, "values", NF90_DOUBLE, dimids, varid) ) | ||
CALL check( nf90_enddef(ncid) ) | ||
CALL check( nf90_put_var(ncid, varid, values) ) | ||
CALL check( nf90_close(ncid) ) | ||
END SUBROUTINE to_netcdf_real64_1d | ||
|
||
SUBROUTINE to_netcdf_real64_2d(filename, values) | ||
!* Dump values to NetCDF file. | ||
! Any existing dataset with the same filename will be overwritten. | ||
CHARACTER (len=*), INTENT(IN) :: filename | ||
REAL (kind=real64), DIMENSION(:,:), INTENT(IN) :: values | ||
INTEGER :: ncid, varid, dimids(2), i | ||
CHARACTER (len=2) :: dimc | ||
CALL check( nf90_create(filename, NF90_CLOBBER, ncid) ) | ||
DO i = 1, size(shape(values)) | ||
WRITE (dimc, "(I2.2)") i | ||
CALL check( nf90_def_dim(ncid, "dim" // dimc, size(values, i), dimids(i)) ) | ||
END DO | ||
CALL check( nf90_def_var(ncid, "values", NF90_DOUBLE, dimids, varid) ) | ||
CALL check( nf90_enddef(ncid) ) | ||
CALL check( nf90_put_var(ncid, varid, values) ) | ||
CALL check( nf90_close(ncid) ) | ||
END SUBROUTINE to_netcdf_real64_2d | ||
|
||
SUBROUTINE to_netcdf_real64_3d(filename, values) | ||
!* Dump values to NetCDF file. | ||
! Any existing dataset with the same filename will be overwritten. | ||
CHARACTER (len=*), INTENT(IN) :: filename | ||
REAL (kind=real64), DIMENSION(:,:,:), INTENT(IN) :: values | ||
INTEGER :: ncid, varid, dimids(3), i | ||
CHARACTER (len=2) :: dimc | ||
CALL check( nf90_create(filename, NF90_CLOBBER, ncid) ) | ||
DO i = 1, size(shape(values)) | ||
WRITE (dimc, "(I2.2)") i | ||
CALL check( nf90_def_dim(ncid, "dim" // dimc, size(values, i), dimids(i)) ) | ||
END DO | ||
CALL check( nf90_def_var(ncid, "values", NF90_DOUBLE, dimids, varid) ) | ||
CALL check( nf90_enddef(ncid) ) | ||
CALL check( nf90_put_var(ncid, varid, values) ) | ||
CALL check( nf90_close(ncid) ) | ||
END SUBROUTINE to_netcdf_real64_3d | ||
|
||
END MODULE netcdf_utils |