subroutine ESMF_ScripInq(filename, grid_size, grid_corners, &
grid_dims, grid_rank, has_area, rc)
! !ARGUMENTS:
character(len=*), intent(in) :: filename
integer, intent(out), optional :: grid_size
integer, intent(out), optional :: grid_corners
integer, intent(out), optional :: grid_dims(:)
integer, intent(out), optional :: grid_rank
logical, intent(out), optional :: has_area
integer, intent(out), optional :: rc
integer:: localrc, ncStatus
integer :: DimId, VarId
integer :: ncid, local_rank
character(len=256) :: errmsg
integer, parameter :: nf90_noerror = 0
#ifdef ESMF_NETCDF
ncStatus = nf90_open (path=trim(filename), mode=nf90_nowrite, ncid=ncid)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE, &
trim(filename), &
rc)) return
! get number of vertices
errmsg = "dimension grid_size in "//trim(filename)
if (present(grid_size)) then
ncStatus = nf90_inq_dimid (ncid, "grid_size", DimId)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,&
errmsg,&
rc)) return
ncStatus = nf90_inquire_dimension (ncid, DimId, len=grid_size)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,&
errmsg,&
rc)) return
end if
! Get vertex dimension
if (present(grid_corners)) then
ncStatus = nf90_inq_dimid (ncid, "grid_corners", DimId)
errmsg = "dimension grid_corners in "//trim(filename)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,&
errmsg,&
rc)) return
ncStatus = nf90_inquire_dimension (ncid, DimId, len=grid_corners)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,&
errmsg, &
rc)) return
end if
! Get vertex dimension
if (present(grid_rank)) then
ncStatus = nf90_inq_dimid (ncid, "grid_rank", DimId)
errmsg = "dimension grid_rank in "//trim(filename)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,&
errmsg,&
rc)) return
ncStatus = nf90_inquire_dimension (ncid, DimId, len=local_rank)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,&
errmsg,&
rc)) return
grid_rank = local_rank
end if
! get grid dimension
! If we didn't get the rank earlier, get it now
if (present(grid_dims)) then
if (.not. present(grid_rank)) then
ncStatus = nf90_inq_dimid (ncid, "grid_rank", DimId)
errmsg = "dimension grid_rank in "//trim(filename)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,&
errmsg,&
rc)) return
ncStatus = nf90_inquire_dimension (ncid, DimId, len=local_rank)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,&
errmsg,&
rc)) return
end if
ncStatus = nf90_inq_varid (ncid, "grid_dims", VarId)
errmsg = "dimension grid_dims in "//trim(filename)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,&
errmsg,&
rc)) return
ncStatus = nf90_get_var (ncid, VarId, grid_dims(1:local_rank))
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE,&
errmsg,&
rc)) return
end if
if (present(has_area)) then
ncStatus = nf90_inq_varid (ncid, "grid_area", VarId)
if (ncStatus /= nf90_noerror) then
has_area = .false.
else
has_area = .true.
endif
endif
ncStatus = nf90_close(ncid)
if (CDFCheckError (ncStatus, &
ESMF_METHOD, &
ESMF_SRCLINE, &
trim(filename), &
rc)) return
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_ScripInq