Skip to content

Commit

Permalink
Add netcdf debugging utilities
Browse files Browse the repository at this point in the history
  • Loading branch information
SeanBryan51 committed Feb 24, 2025
1 parent d744c2f commit 9b14a6f
Show file tree
Hide file tree
Showing 2 changed files with 193 additions and 0 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ else()
src/offline/casa_cable.F90
src/offline/cbl_model_driver_offline.F90
src/offline/landuse_inout.F90
src/offline/netcdf_utils.F90
src/offline/spincasacnp.F90
src/util/cable_climate_type_mod.F90
src/util/masks_cbl.F90
Expand Down
192 changes: 192 additions & 0 deletions src/offline/netcdf_utils.F90
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

0 comments on commit 9b14a6f

Please sign in to comment.