Add files via upload
This commit is contained in:
562
code/NcdfUtil/m_netcdf_io_readattr.F90
Normal file
562
code/NcdfUtil/m_netcdf_io_readattr.F90
Normal file
@ -0,0 +1,562 @@
|
||||
!------------------------------------------------------------------------------
|
||||
! 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
|
Reference in New Issue
Block a user