subroutine ESMF_EsmfInqUnits(filename, units, rc)
! !ARGUMENTS:
character(len=*), intent(in) :: filename
character(len=*), intent(out) :: units
integer, intent(out), optional :: rc
integer:: localrc, ncStatus
integer :: ncid, VarId, len
character(len=80) :: buffer
character(len=256) :: errmsg
integer, parameter :: nf90_noerror = 0
integer :: coordDim,DimID
#ifdef ESMF_NETCDF
if (present(rc)) rc=ESMF_SUCCESS
ncStatus = nf90_open (path=trim(filename), mode=nf90_nowrite, ncid=ncid)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE, trim(filename),rc)) return
! Get vertex dimension
ncStatus = nf90_inq_dimid (ncid, "coordDim", DimId)
errmsg = "Dimension coordDim in "//trim(filename)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE, errmsg, &
rc)) return
ncStatus = nf90_inquire_dimension (ncid, DimId, len=coordDim)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE, errmsg, &
rc)) return
! Get units
ncStatus = nf90_inq_varid (ncid, "nodeCoords", VarId)
errmsg = "Variable nodeCoords in "//trim(filename)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,errmsg,&
rc)) return
ncStatus = nf90_inquire_attribute(ncid, VarId, "units", len=len)
! only require units for 2D
if (coordDim==2) then
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,errmsg,&
rc)) return
else
! if no units are present set to default and leave
if (ncStatus /= nf90_noerror) then
units="UNKNOWN"
if (present(rc)) rc=ESMF_SUCCESS
return
endif
endif
ncStatus = nf90_get_att(ncid, VarId, "units", buffer)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,errmsg,&
rc)) return
if (buffer(len:len) .eq. achar(0)) len = len-1
units = ESMF_UtilStringLowerCase(buffer(1:len))
if (present(rc)) rc=ESMF_SUCCESS
return
#else
if (ESMF_LogFoundError(ESMF_RC_LIB_NOT_PRESENT, &
msg="- ESMF_NETCDF not defined when lib was compiled", &
ESMF_CONTEXT, rcToReturn=rc)) return
#endif
end subroutine ESMF_EsmfInqUnits