563 lines
16 KiB
Fortran
563 lines
16 KiB
Fortran
!------------------------------------------------------------------------------
|
|
! NASA/GFSC, SIVO, Code 610.3 and
|
|
! Harvard Atmospheric Chemistry Modeling Group
|
|
!------------------------------------------------------------------------------
|
|
!BOP
|
|
!
|
|
! !MODULE: m_netcdf_io_readattr
|
|
!
|
|
! !INTERFACE:
|
|
!
|
|
MODULE m_netcdf_io_readattr
|
|
!
|
|
! !USES:
|
|
|
|
USE m_do_err_out
|
|
|
|
IMPLICIT NONE
|
|
PRIVATE
|
|
|
|
INCLUDE "netcdf.inc"
|
|
!
|
|
! !PUBLIC MEMBER FUNCTIONS:
|
|
!
|
|
PUBLIC :: NcGet_Var_Attributes
|
|
INTERFACE NcGet_Var_Attributes
|
|
MODULE PROCEDURE NcGet_Var_Attr_C
|
|
MODULE PROCEDURE NcGet_Var_Attr_I4
|
|
MODULE PROCEDURE NcGet_Var_Attr_R4
|
|
MODULE PROCEDURE NcGet_Var_Attr_R8
|
|
END INTERFACE
|
|
|
|
PUBLIC :: NcGet_Glob_Attributes
|
|
INTERFACE NcGet_Glob_Attributes
|
|
MODULE PROCEDURE NcGet_Glob_Attr_C
|
|
MODULE PROCEDURE NcGet_Glob_Attr_I4
|
|
MODULE PROCEDURE NcGet_Glob_Attr_R4
|
|
MODULE PROCEDURE NcGet_Glob_Attr_R8
|
|
END INTERFACE
|
|
!
|
|
! !PRIVATE MEMBER FUNCTIONS:
|
|
!
|
|
PRIVATE :: NcGet_Var_Attr_C
|
|
PRIVATE :: NcGet_Var_Attr_I4
|
|
PRIVATE :: NcGet_Var_Attr_R4
|
|
PRIVATE :: NcGet_Var_Attr_R8
|
|
PRIVATE :: NcGet_Glob_Attr_C
|
|
PRIVATE :: NcGet_Glob_Attr_I4
|
|
PRIVATE :: NcGet_Glob_Attr_R4
|
|
PRIVATE :: NcGet_Glob_Attr_R8
|
|
!
|
|
! !DESCRIPTION: Provides netCDF utility routines to read both netCDF
|
|
! variable attributes and global attributes. Individual routines for
|
|
! reading attributes of different types are overloaded with F90
|
|
! interfaces.
|
|
!\\
|
|
!\\
|
|
! !AUTHOR:
|
|
! Bob Yantosca (based on code by Jules Kouatchou and Maharaj Bhat)
|
|
!
|
|
! !REVISION HISTORY:
|
|
! 25 Jan 2012 - R. Yantosca - Initial version
|
|
! 30 Apr 2012 - R. Yantosca - Modified for compatibility with netCDF-3
|
|
! 30 Apr 2012 - R. Yantosca - Added comments
|
|
!EOP
|
|
!------------------------------------------------------------------------------
|
|
!BOC
|
|
CONTAINS
|
|
!EOC
|
|
!------------------------------------------------------------------------------
|
|
!BOP
|
|
!
|
|
! !IROUTINE: NcGet_Var_Attr_C
|
|
!
|
|
! !DESCRIPTION: Returns a variable attribute of type CHARACTER.
|
|
!\\
|
|
!\\
|
|
! !INTERFACE:
|
|
!
|
|
SUBROUTINE NcGet_Var_Attr_C( fid, varName, attName, attValue )
|
|
!
|
|
! !INPUT PARAMETERS:
|
|
!
|
|
INTEGER, INTENT(IN) :: fId ! netCDF file ID
|
|
CHARACTER(LEN=*), INTENT(IN) :: varName ! netCDF variable name
|
|
CHARACTER(LEN=*), INTENT(IN) :: attName ! Name of variable attribute
|
|
!
|
|
! !OUTPUT PARAMETERS:
|
|
!
|
|
CHARACTER(LEN=*), INTENT(OUT) :: attValue ! Attribute value
|
|
!
|
|
! !DESCRIPTION: Reads a variable attribute (CHARACTER type) from a netCDF file.
|
|
!\\
|
|
!\\
|
|
! !AUTHOR:
|
|
! Bob Yantosca (based on code by Jules Kouatchou and Maharaj Bhat)
|
|
!
|
|
! !REVISION HISTORY:
|
|
! 25 Jan 2012 - R. Yantosca - Initial version
|
|
! 31 Jan 2012 - R. Yantosca - Zero attValue before reading attributes
|
|
! 30 Apr 2012 - R. Yantosca - Use netCDF library function NF_GET_ATT_TEXT,
|
|
! which is compatible w/ netCDF3
|
|
!EOP
|
|
!------------------------------------------------------------------------------
|
|
!BOC
|
|
!
|
|
! !LOCAL VARIABLES:
|
|
!
|
|
CHARACTER(LEN=128) :: errMsg
|
|
INTEGER :: status, vId
|
|
|
|
! Zero return value
|
|
attValue = ''
|
|
|
|
! Check if VARNAME is a valid variable
|
|
status = Nf_Inq_Varid ( fId, varName, vId )
|
|
|
|
! Exit w/ error message if VARNAME is not valid
|
|
IF ( status /= NF_NOERR ) THEN
|
|
errMsg = 'In NcGet_Var_Attr_C: ' // TRIM( varName ) // &
|
|
', ' // Nf_Strerror( status )
|
|
CALL Do_Err_Out ( errMsg, .TRUE., 1, fId, 0, 0, 0.0d0, 0.0d0)
|
|
ENDIF
|
|
|
|
! Get the attribute
|
|
status = Nf_Get_Att_Text( fId, vId, attName, attValue )
|
|
|
|
! Exit w/ error message if unsuccessful
|
|
IF ( status /= NF_NOERR ) THEN
|
|
errMsg = 'In NcGet_Var_Attr_C: cannot read attribute : ' // &
|
|
TRIM( attName )
|
|
CALL Do_Err_Out( errMsg, .TRUE., 0, 0, 0, 0, 0.0d0, 0.0d0 )
|
|
endif
|
|
|
|
END SUBROUTINE NcGet_Var_Attr_C
|
|
!EOC
|
|
!------------------------------------------------------------------------------
|
|
!BOP
|
|
!
|
|
! !IROUTINE: NcGet_Var_Attr_I4
|
|
!
|
|
! !DESCRIPTION: Returns a variable attribute of type INTEGER*4.
|
|
!\\
|
|
!\\
|
|
! !INTERFACE:
|
|
!
|
|
SUBROUTINE NcGet_Var_Attr_I4( fid, varName, attName, attValue )
|
|
!
|
|
! !INPUT PARAMETERS:
|
|
!
|
|
INTEGER, INTENT(IN) :: fId ! netCDF file ID
|
|
CHARACTER(LEN=*), INTENT(IN) :: varName ! netCDF variable name
|
|
CHARACTER(LEN=*), INTENT(IN) :: attName ! Name of variable attribute
|
|
!
|
|
! !OUTPUT PARAMETERS:
|
|
!
|
|
INTEGER, INTENT(OUT) :: attValue ! Attribute value
|
|
!
|
|
! !DESCRIPTION: Reads a variable attribute (INTEGER type) from a netCDF file.
|
|
!\\
|
|
!\\
|
|
! !AUTHOR:
|
|
! Bob Yantosca (based on code by Jules Kouatchou and Maharaj Bhat)
|
|
!
|
|
! !REVISION HISTORY:
|
|
! 25 Jan 2012 - R. Yantosca - Initial version
|
|
! 31 Jan 2012 - R. Yantosca - Zero attValue before reading attributes
|
|
! 30 Apr 2012 - R. Yantosca - Use netCDF library function NF_GET_ATT_INT,
|
|
! which is compatible w/ netCDF3
|
|
!EOP
|
|
!------------------------------------------------------------------------------
|
|
!BOC
|
|
!
|
|
! !LOCAL VARIABLES:
|
|
!
|
|
CHARACTER(LEN=128) :: errMsg
|
|
INTEGER :: status, vId
|
|
|
|
! Zero return value
|
|
attValue = 0
|
|
|
|
! Check if VARNAME is a valid variable
|
|
status = Nf_Inq_Varid ( fId, varName, vId )
|
|
|
|
! Exit w/ error message if VARNAME is not valid
|
|
IF ( status /= NF_NOERR ) THEN
|
|
errMsg = 'In NcGet_Var_Attr_I4: ' // TRIM( varName ) // &
|
|
', ' // Nf_Strerror( status )
|
|
CALL Do_Err_Out ( errMsg, .TRUE., 1, fId, 0, 0, 0.0d0, 0.0d0)
|
|
ENDIF
|
|
|
|
! Get the attribute
|
|
status = Nf_Get_Att_Int( fId, vId, attName, attValue )
|
|
|
|
! Exit w/ error message if unsuccessful
|
|
IF ( status /= NF_NOERR ) THEN
|
|
errMsg = 'In NcGet_Var_Attr_I4: cannot read attribute : ' // &
|
|
TRIM( attName )
|
|
CALL Do_Err_Out( errMsg, .TRUE., 0, 0, 0, 0, 0.0d0, 0.0d0 )
|
|
endif
|
|
|
|
END SUBROUTINE NcGet_Var_Attr_I4
|
|
!EOC
|
|
!------------------------------------------------------------------------------
|
|
!BOP
|
|
!
|
|
! !IROUTINE: NcGet_Var_Attr_R4
|
|
!
|
|
! !DESCRIPTION: Returns a variable attribute of type REAL*4.
|
|
!\\
|
|
!\\
|
|
! !INTERFACE:
|
|
!
|
|
SUBROUTINE NcGet_Var_Attr_R4( fid, varName, attName, attValue )
|
|
!
|
|
! !INPUT PARAMETERS:
|
|
!
|
|
INTEGER, INTENT(IN) :: fId ! netCDF file ID
|
|
CHARACTER(LEN=*), INTENT(IN) :: varName ! netCDF variable name
|
|
CHARACTER(LEN=*), INTENT(IN) :: attName ! Name of variable attribute
|
|
!
|
|
! !OUTPUT PARAMETERS:
|
|
!
|
|
REAL*4, INTENT(OUT) :: attValue ! Attribute value
|
|
!
|
|
! !DESCRIPTION: Reads a variable attribute (REAL*4 type) from a netCDF file.
|
|
!\\
|
|
!\\
|
|
! !AUTHOR:
|
|
! Bob Yantosca (based on code by Jules Kouatchou and Maharaj Bhat)
|
|
!
|
|
! !REVISION HISTORY:
|
|
! 25 Jan 2012 - R. Yantosca - Initial version
|
|
! 31 Jan 2012 - R. Yantosca - Zero attValue before reading attributes
|
|
! 30 Apr 2012 - R. Yantosca - Use netCDF library function NF_GET_ATT_REAL,
|
|
! which is compatible w/ netCDF3
|
|
!EOP
|
|
!------------------------------------------------------------------------------
|
|
!BOC
|
|
!
|
|
! !LOCAL VARIABLES:
|
|
!
|
|
CHARACTER(LEN=128) :: errMsg
|
|
INTEGER :: status, vId
|
|
|
|
! Zero return value
|
|
attValue = 0e0
|
|
|
|
! Check if VARNAME is a valid variable
|
|
status = Nf_Inq_Varid ( fId, varName, vId )
|
|
|
|
! Exit w/ error message if VARNAME is not valid
|
|
IF ( status /= NF_NOERR ) THEN
|
|
errMsg = 'In NcGet_Var_Attr_R4: ' // TRIM( varName ) // &
|
|
', ' // Nf_Strerror( status )
|
|
CALL Do_Err_Out ( errMsg, .TRUE., 1, fId, 0, 0, 0.0d0, 0.0d0)
|
|
ENDIF
|
|
|
|
! Get the attribute
|
|
status = Nf_Get_Att_Real( fId, vId, attName, attValue )
|
|
|
|
! Exit w/ error message if unsuccessful
|
|
IF ( status /= NF_NOERR ) THEN
|
|
errMsg = 'In NcGet_Var_Attr_R4: cannot read attribute : ' // &
|
|
TRIM( attName )
|
|
CALL Do_Err_Out( errMsg, .TRUE., 0, 0, 0, 0, 0.0d0, 0.0d0 )
|
|
endif
|
|
|
|
END SUBROUTINE NcGet_Var_Attr_R4
|
|
!EOC
|
|
!------------------------------------------------------------------------------
|
|
!BOP
|
|
!
|
|
! !IROUTINE: NcGet_Var_Attr_R4
|
|
!
|
|
! !DESCRIPTION: Returns a variable attribute of type REAL*8.
|
|
!\\
|
|
!\\
|
|
! !INTERFACE:
|
|
!
|
|
SUBROUTINE NcGet_Var_Attr_R8( fid, varName, attName, attValue )
|
|
!
|
|
! !INPUT PARAMETERS:
|
|
!
|
|
INTEGER, INTENT(IN) :: fId ! netCDF file ID
|
|
CHARACTER(LEN=*), INTENT(IN) :: varName ! netCDF variable name
|
|
CHARACTER(LEN=*), INTENT(IN) :: attName ! Name of variable attribute
|
|
!
|
|
! !OUTPUT PARAMETERS:
|
|
!
|
|
REAL*8, INTENT(OUT) :: attValue ! Attribute value
|
|
!
|
|
! !DESCRIPTION: Reads a variable attribute (REAL*4 type) from a netCDF file.
|
|
!\\
|
|
!\\
|
|
! !AUTHOR:
|
|
! Bob Yantosca (based on code by Jules Kouatchou and Maharaj Bhat)
|
|
!
|
|
! !REVISION HISTORY:
|
|
! 25 Jan 2012 - R. Yantosca - Initial version
|
|
! 31 Jan 2012 - R. Yantosca - Zero attValue before reading attributes
|
|
! 30 Apr 2012 - R. Yantosca - Use internal function NF_GET_ATT_DOUBLE,
|
|
! which is compatible w/ netCDF3
|
|
!EOP
|
|
!------------------------------------------------------------------------------
|
|
!BOC
|
|
!
|
|
! !LOCAL VARIABLES:
|
|
!
|
|
CHARACTER(LEN=128) :: errMsg
|
|
INTEGER :: status, vId
|
|
|
|
! Zero return value
|
|
attValue = 0d0
|
|
|
|
! Check if VARNAME is a valid variable
|
|
status = Nf_Inq_Varid ( fId, varName, vId )
|
|
|
|
! Exit w/ error message if VARNAME is not valid
|
|
IF ( status /= NF_NOERR ) THEN
|
|
errMsg = 'In NcGet_Var_Attr_R8: ' // TRIM( varName ) // &
|
|
', ' // Nf_Strerror( status )
|
|
CALL Do_Err_Out ( errMsg, .TRUE., 1, fId, 0, 0, 0.0d0, 0.0d0)
|
|
ENDIF
|
|
|
|
! Get the attribute
|
|
status = Nf_Get_Att_Double( fId, vId, attName, attValue )
|
|
|
|
! Exit w/ error message if unsuccessful
|
|
IF ( status /= NF_NOERR ) THEN
|
|
errMsg = 'In NcGet_Var_Attr_R8: cannot read attribute : ' // &
|
|
TRIM( attName )
|
|
CALL Do_Err_Out( errMsg, .TRUE., 0, 0, 0, 0, 0.0d0, 0.0d0 )
|
|
endif
|
|
|
|
END SUBROUTINE NcGet_Var_Attr_R8
|
|
!EOC
|
|
!------------------------------------------------------------------------------
|
|
!BOP
|
|
!
|
|
! !IROUTINE: NcGet_Glob_Attr_C
|
|
!
|
|
! !DESCRIPTION: Returns a variable attribute of type CHARACTER.
|
|
!\\
|
|
!\\
|
|
! !INTERFACE:
|
|
!
|
|
SUBROUTINE NcGet_Glob_Attr_C( fid, attName, attValue )
|
|
!
|
|
! !INPUT PARAMETERS:
|
|
!
|
|
INTEGER, INTENT(IN) :: fId ! netCDF file ID
|
|
CHARACTER(LEN=*), INTENT(IN) :: attName ! Name of variable attribute
|
|
!
|
|
! !OUTPUT PARAMETERS:
|
|
!
|
|
CHARACTER(LEN=*), INTENT(OUT) :: attValue ! Attribute value
|
|
!
|
|
! !DESCRIPTION: Reads a global attribute (CHARACTER type) from a netCDF file.
|
|
!\\
|
|
!\\
|
|
! !AUTHOR:
|
|
! Bob Yantosca (based on code by Jules Kouatchou and Maharaj Bhat)
|
|
!
|
|
! !REVISION HISTORY:
|
|
! 25 Jan 2012 - R. Yantosca - Initial version
|
|
! 31 Jan 2012 - R. Yantosca - Zero attValue before reading attributes
|
|
! 30 Apr 2012 - R. Yantosca - Use netCDF library function NF_GET_ATT_TEXT,
|
|
! which is compatible w/ netCDF3
|
|
!EOP
|
|
!------------------------------------------------------------------------------
|
|
!BOC
|
|
!
|
|
! !LOCAL VARIABLES:
|
|
!
|
|
CHARACTER(LEN=128) :: errMsg, varName
|
|
INTEGER :: status
|
|
|
|
! Zero return value
|
|
attValue = ''
|
|
|
|
! Get the attribute
|
|
status = Nf_Get_Att_Text( fId, NF_GLOBAL, attName, attValue )
|
|
|
|
! Exit w/ error message if unsuccessful
|
|
IF ( status /= NF_NOERR ) THEN
|
|
errMsg = 'In NcGet_Glob_Attr_C: cannot read attribute : ' // &
|
|
TRIM( attName )
|
|
CALL Do_Err_Out( errMsg, .TRUE., 0, 0, 0, 0, 0.0d0, 0.0d0 )
|
|
endif
|
|
|
|
END SUBROUTINE NcGet_Glob_Attr_C
|
|
|
|
!EOC
|
|
!------------------------------------------------------------------------------
|
|
!BOP
|
|
!
|
|
! !IROUTINE: NcGet_Glob_Attr_I4
|
|
!
|
|
! !DESCRIPTION: Returns a variable attribute of type INTEGER*4.
|
|
!\\
|
|
!\\
|
|
! !INTERFACE:
|
|
!
|
|
SUBROUTINE NcGet_Glob_Attr_I4( fid, attName, attValue )
|
|
!
|
|
! !INPUT PARAMETERS:
|
|
!
|
|
INTEGER, INTENT(IN) :: fId ! netCDF file ID
|
|
CHARACTER(LEN=*), INTENT(IN) :: attName ! Name of variable attribute
|
|
!
|
|
! !OUTPUT PARAMETERS:
|
|
!
|
|
INTEGER, INTENT(OUT) :: attValue ! Attribute value
|
|
!
|
|
! !DESCRIPTION: Reads a global attribute (INTEGER type) from a netCDF file.
|
|
!\\
|
|
!\\
|
|
! !AUTHOR:
|
|
! Bob Yantosca (based on code by Jules Kouatchou and Maharaj Bhat)
|
|
!
|
|
! !REVISION HISTORY:
|
|
! 25 Jan 2012 - R. Yantosca - Initial version
|
|
! 31 Jan 2012 - R. Yantosca - Zero attValue before reading attributes
|
|
! 30 Apr 2012 - R. Yantosca - Use netCDF library function NF_GET_ATT_INT,
|
|
! which is compatible w/ netCDF3
|
|
!EOP
|
|
!------------------------------------------------------------------------------
|
|
!BOC
|
|
!
|
|
! !LOCAL VARIABLES:
|
|
!
|
|
CHARACTER(LEN=128) :: errMsg, varName
|
|
INTEGER :: status
|
|
|
|
! Zero return value
|
|
attValue = 0
|
|
|
|
! Get the attribute
|
|
status = Nf_Get_Att_Int( fId, NF_GLOBAL, attName, attValue )
|
|
|
|
! Exit w/ error message if unsuccessful
|
|
IF ( status /= NF_NOERR ) THEN
|
|
errMsg = 'In NcGet_Glob_Attr_I4: cannot read attribute : ' // &
|
|
TRIM( attName )
|
|
CALL Do_Err_Out( errMsg, .TRUE., 0, 0, 0, 0, 0.0d0, 0.0d0 )
|
|
endif
|
|
|
|
END SUBROUTINE NcGet_Glob_Attr_I4
|
|
!EOC
|
|
!------------------------------------------------------------------------------
|
|
!BOP
|
|
!
|
|
! !IROUTINE: NcGet_Glob_Attr_R4
|
|
!
|
|
! !DESCRIPTION: Returns a variable attribute of type REAL*4.
|
|
!\\
|
|
!\\
|
|
! !INTERFACE:
|
|
!
|
|
SUBROUTINE NcGet_Glob_Attr_R4( fid, attName, attValue )
|
|
!
|
|
! !INPUT PARAMETERS:
|
|
!
|
|
INTEGER, INTENT(IN) :: fId ! netCDF file ID
|
|
CHARACTER(LEN=*), INTENT(IN) :: attName ! Name of variable attribute
|
|
!
|
|
! !OUTPUT PARAMETERS:
|
|
!
|
|
REAL*4, INTENT(OUT) :: attValue ! Attribute value
|
|
!
|
|
! !DESCRIPTION: Reads a global attribute (REAL*4 type) from a netCDF file.
|
|
!\\
|
|
!\\
|
|
! !AUTHOR:
|
|
! Bob Yantosca (based on code by Jules Kouatchou and Maharaj Bhat)
|
|
!
|
|
! !REVISION HISTORY:
|
|
! 25 Jan 2012 - R. Yantosca - Initial version
|
|
! 31 Jan 2012 - R. Yantosca - Zero attValue before reading attributes
|
|
! 30 Apr 2012 - R. Yantosca - Use netCDF library function NF_GET_ATT_REAL,
|
|
! which is compatible w/ netCDF3
|
|
!EOP
|
|
!------------------------------------------------------------------------------
|
|
!BOC
|
|
!
|
|
! !LOCAL VARIABLES:
|
|
!
|
|
CHARACTER(LEN=128) :: errMsg, varName
|
|
INTEGER :: status
|
|
|
|
! Zero return value
|
|
attValue = 0e0
|
|
|
|
! Get the attribute
|
|
status = Nf_Get_Att_Real( fId, NF_GLOBAL, attName, attValue )
|
|
|
|
! Exit w/ error message if unsuccessful
|
|
IF ( status /= NF_NOERR ) THEN
|
|
errMsg = 'In NcGet_Glob_Attr_R4: cannot read attribute : ' // &
|
|
TRIM( attName )
|
|
CALL Do_Err_Out( errMsg, .TRUE., 0, 0, 0, 0, 0.0d0, 0.0d0 )
|
|
endif
|
|
|
|
END SUBROUTINE NcGet_Glob_Attr_R4
|
|
!EOC
|
|
!------------------------------------------------------------------------------
|
|
!BOP
|
|
!
|
|
! !IROUTINE: NcGet_Glob_Attr_R8
|
|
!
|
|
! !DESCRIPTION: Returns a variable attribute of type REAL*8.
|
|
!\\
|
|
!\\
|
|
! !INTERFACE:
|
|
!
|
|
SUBROUTINE NcGet_Glob_Attr_R8( fid, attName, attValue )
|
|
!
|
|
! !INPUT PARAMETERS:
|
|
!
|
|
INTEGER, INTENT(IN) :: fId ! netCDF file ID
|
|
CHARACTER(LEN=*), INTENT(IN) :: attName ! Name of variable attribute
|
|
!
|
|
! !OUTPUT PARAMETERS:
|
|
!
|
|
REAL*8, INTENT(OUT) :: attValue ! Attribute value
|
|
!
|
|
! !DESCRIPTION: Reads a global attribute (REAL*8 type) from a netCDF file.
|
|
!\\
|
|
!\\
|
|
! !AUTHOR:
|
|
! Bob Yantosca (based on code by Jules Kouatchou and Maharaj Bhat)
|
|
!
|
|
! !REVISION HISTORY:
|
|
! 25 Jan 2012 - R. Yantosca - Initial version
|
|
! 31 Jan 2012 - R. Yantosca - Zero attValue before reading attributes
|
|
! 30 Apr 2012 - R. Yantosca - Use netCDF library function NF_GET_ATT_DOUBLE,
|
|
! which is compatible w/ netCDF3
|
|
!EOP
|
|
!------------------------------------------------------------------------------
|
|
!BOC
|
|
!
|
|
! !LOCAL VARIABLES:
|
|
!
|
|
CHARACTER(LEN=128) :: errMsg, varName
|
|
INTEGER :: status
|
|
|
|
! Zero return value
|
|
attValue = 0d0
|
|
|
|
! Get the attribute
|
|
status = Nf_Get_Att_Double( fId, NF_GLOBAL, attName, attValue )
|
|
|
|
! Exit w/ error message if unsuccessful
|
|
IF ( status /= NF_NOERR ) THEN
|
|
errMsg = 'In NcGet_Glob_Attr_R8: cannot read attribute : ' // &
|
|
TRIM( attName )
|
|
CALL Do_Err_Out( errMsg, .TRUE., 0, 0, 0, 0, 0.0d0, 0.0d0 )
|
|
endif
|
|
|
|
END SUBROUTINE NcGet_Glob_Attr_R8
|
|
!EOC
|
|
END MODULE m_netcdf_io_readattr
|