subroutine x_comp_grid_diag(xstate, fileName, overwrite, status, timeslice, &
iofmt, relaxedflag, rc)
! arguments
type(xdata_state), pointer, intent(in) :: xstate
character(len=*), intent(in), optional :: fileName
logical, intent(in), optional :: overwrite
type(ESMF_FileStatus_Flag), intent(in), optional :: status
integer, intent(in), optional :: timeslice
type(ESMF_IOFmt_Flag), intent(in), optional :: iofmt
logical, intent(in), optional :: relaxedflag
integer, intent(out) :: rc
! local variables
logical :: ioCapable
logical :: doItFlag
character(len=64) :: lfileName
character(len=64) :: gridName
type(ESMF_Array) :: array
type(ESMF_ArrayBundle) :: arraybundle
logical :: isPresent
integer :: dimCount
integer :: dimIndex
integer,allocatable :: coordDimCount(:)
integer :: coordDimMax
integer :: stat
logical :: hasCorners
rc = ESMF_SUCCESS
if (.not. associated(xstate)) then
call ESMF_LogSetError(ESMF_RC_PTR_NOTALLOC, &
msg='XDATA: xstate has not been associated', &
line=__LINE__, file=__FILE__, rcToReturn=rc)
return
endif
ioCapable = (ESMF_IO_PIO_PRESENT .and. &
(ESMF_IO_NETCDF_PRESENT .or. ESMF_IO_PNETCDF_PRESENT))
doItFlag = .true. ! default
if (present(relaxedFlag)) then
doItFlag = .not.relaxedflag .or. (relaxedflag.and.ioCapable)
endif
if (doItFlag) then
if (present(fileName)) then
lfileName = trim(fileName)
else
call ESMF_GridGet(xstate%grid, name=gridName, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
lfileName = trim(gridName)//".nc"
endif
arraybundle = ESMF_ArrayBundleCreate(rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
! -- centers --
call ESMF_GridGetCoord(xstate%grid, staggerLoc=ESMF_STAGGERLOC_CENTER, &
isPresent=isPresent, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
if (isPresent) then
call ESMF_GridGetCoord(xstate%grid, coordDim=1, &
staggerLoc=ESMF_STAGGERLOC_CENTER, array=array, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
call ESMF_ArraySet(array, name="lon_center", rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
call ESMF_ArrayBundleAdd(arraybundle,(/array/),rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
call ESMF_GridGetCoord(xstate%grid, coordDim=2, &
staggerLoc=ESMF_STAGGERLOC_CENTER, array=array, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
call ESMF_ArraySet(array, name="lat_center", rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
call ESMF_ArrayBundleAdd(arraybundle,(/array/),rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
endif
! -- corners --
call ESMF_GridGetCoord(xstate%grid, staggerLoc=ESMF_STAGGERLOC_CORNER, &
isPresent=hasCorners, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
if (hasCorners) then
call ESMF_GridGetCoord(xstate%grid, coordDim=1, &
staggerLoc=ESMF_STAGGERLOC_CORNER, array=array, rc=rc)
if (.not. ESMF_LogFoundError(rcToCheck=rc)) then
call ESMF_ArraySet(array, name="lon_corner", rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
call ESMF_ArrayBundleAdd(arraybundle,(/array/),rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
endif
call ESMF_GridGetCoord(xstate%grid, coordDim=2, &
staggerLoc=ESMF_STAGGERLOC_CORNER, array=array, rc=rc)
if (.not. ESMF_LogFoundError(rcToCheck=rc)) then
call ESMF_ArraySet(array, name="lat_corner", rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
call ESMF_ArrayBundleAdd(arraybundle,(/array/),rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
endif
endif
! -- mask --
call ESMF_GridGetItem(xstate%grid, itemflag=ESMF_GRIDITEM_MASK, &
staggerLoc=ESMF_STAGGERLOC_CENTER, isPresent=isPresent, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
if (isPresent) then
call ESMF_GridGetItem(xstate%grid, staggerLoc=ESMF_STAGGERLOC_CENTER, &
itemflag=ESMF_GRIDITEM_MASK, array=array, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
call ESMF_ArraySet(array, name="mask", rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
call ESMF_ArrayBundleAdd(arraybundle,(/array/),rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
endif
! -- area --
call ESMF_GridGetItem(xstate%grid, itemflag=ESMF_GRIDITEM_AREA, &
staggerLoc=ESMF_STAGGERLOC_CENTER, isPresent=isPresent, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
if (isPresent) then
call ESMF_GridGetItem(xstate%grid, staggerLoc=ESMF_STAGGERLOC_CENTER, &
itemflag=ESMF_GRIDITEM_AREA, array=array, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
call ESMF_ArraySet(array, name="area", rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
call ESMF_ArrayBundleAdd(arraybundle,(/array/),rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
endif
call ESMF_ArrayBundleWrite(arraybundle, &
fileName=trim(lfileName),rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
call ESMF_ArrayBundleDestroy(arraybundle,rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, file=__FILE__)) return
endif
endsubroutine x_comp_grid_diag