subroutine ESMF_XGridGetFieldBounds(xgrid, keywordEnforcer, &
xgridside, gridindex, localDe, gridToFieldMap, &
ungriddedLBound, ungriddedUBound, &
totalLBound, totalUBound, totalCount, rc)
! !ARGUMENTS:
type(ESMF_XGrid), intent(in) :: xgrid
type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below
type(ESMF_XGridSide_Flag), intent(in), optional :: xgridside
integer, intent(in), optional :: gridindex
integer, intent(in), optional :: localDe
integer, intent(in), optional :: gridToFieldMap(:)
integer, intent(in), optional :: ungriddedLBound(:)
integer, intent(in), optional :: ungriddedUBound(:)
integer, intent(out), optional :: totalLBound(:)
integer, intent(out), optional :: totalUBound(:)
integer, intent(out), optional :: totalCount(:)
integer, intent(out), optional :: rc
!
! !DESCRIPTION:
! Compute the lower and upper bounds of Fortran data array that can later
! be used in FieldCreate interface to create a {\tt ESMF\_Field} from a
! {\tt ESMF\_XGrid} and the Fortran data array. For an example and
! associated documentation using this method see section
! \ref{sec:field:usage:create_5dgrid_7dptr_2dungridded}.
!
! The arguments are:
! \begin{description}
! \item [xgrid]
! {\tt ESMF\_XGrid} object.
! \item [{[xgridside]}]
! Which side of the XGrid to create the Field on (either ESMF\_XGRIDSIDE\_A,
! ESMF\_XGRIDSIDE\_B, or ESMF\_XGRIDSIDE\_BALANCED). If not passed in then
! defaults to ESMF\_XGRIDSIDE\_BALANCED.
! \item [{[gridindex]}]
! If xgridside is ESMF\_XGRIDSIDE\_A or ESMF\_XGRIDSIDE\_B then this index tells which Grid on
! that side to create the Field on. If not provided, defaults to 1.
! \item [{[localDe]}]
! Local DE for which information is requested. {\tt [0,..,localDeCount-1]}.
! For {\tt localDeCount==1} the {\tt localDe} argument may be omitted,
! in which case it will default to {\tt localDe=0}.
! \item [{[gridToFieldMap]}]
! List with number of elements equal to 1.
! The list elements map the dimension
! of the {\tt locstream} to a dimension in the {\tt field} by
! specifying the appropriate {\tt field} dimension index. The default is to
! map the {\tt locstream}|s dimension against the lowest dimension of
! the {\tt field} in sequence, i.e. {\tt gridToFieldMap} = (/1/).
! The values of all {\tt gridToFieldMap} entries must be greater than or equal
! to one and smaller than or equal to the {\tt field} rank.
! The total ungridded dimensions in the {\tt field}
! are the total {\tt field} dimensions less
! the dimensions in
! the {\tt grid}. Ungridded dimensions must be in the same order they are
! stored in the {\t field}.
! \item [{[ungriddedLBound]}]
! Lower bounds of the ungridded dimensions of the {\tt field}.
! The number of elements in the {\tt ungriddedLBound} is equal to the number of ungridded
! dimensions in the {\tt field}. All ungridded dimensions of the
! {\tt field} are also undistributed. When field dimension count is
! greater than 1, both ungriddedLBound and ungriddedUBound
! must be specified. When both are specified the values are checked
! for consistency. Note that the the ordering of
! these ungridded dimensions is the same as their order in the {\tt field}.
! \item [{[ungriddedUBound]}]
! Upper bounds of the ungridded dimensions of the {\tt field}.
! The number of elements in the {\tt ungriddedUBound} is equal to the number of ungridded
! dimensions in the {\tt field}. All ungridded dimensions of the
! {\tt field} are also undistributed. When field dimension count is
! greater than 1, both ungriddedLBound and ungriddedUBound
! must be specified. When both are specified the values are checked
! for consistency. Note that the the ordering of
! these ungridded dimensions is the same as their order in the {\tt field}.
! \item [{[totalLBound]}]
! \begin{sloppypar}
! The relative lower bounds of Fortran data array to be used
! later in {\tt ESMF\_FieldCreate} from {\tt ESMF\_LocStream} and Fortran data array.
! This is an output variable from this user interface.
! \end{sloppypar}
! \item [{[totalUBound]}]
! \begin{sloppypar}
! The relative upper bounds of Fortran data array to be used
! later in {\tt ESMF\_FieldCreate} from {\tt ESMF\_LocStream} and Fortran data array.
! This is an output variable from this user interface.
! \end{sloppypar}
! \item [{[totalCount]}]
! Number of elements need to be allocated for Fortran data array to be used
! later in {\tt ESMF\_FieldCreate} from {\tt ESMF\_LocStream} and Fortran data array.
! This is an output variable from this user interface.
!
! \item[{[rc]}]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!EOP
! !Local Variables
integer :: localrc
type(ESMF_Geom) :: geom
! Initialize
localrc = ESMF_RC_NOT_IMPL
if (present(rc)) rc = ESMF_RC_NOT_IMPL
ESMF_INIT_CHECK_DEEP(ESMF_XGridGetInit, xgrid, rc)
! Create Geom from LocStream
geom=ESMF_GeomCreate(xgrid, xgridSide, gridIndex, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! call into generic alloc bound calculation subroutine
call ESMF_FieldGetGBAllocBounds(geom, localDe=localDe, &
gridToFieldMap=gridToFieldMap, &
ungriddedLBound=ungriddedLBound, ungriddedUBound=ungriddedUBound, &
totalLBound=totalLBound, totalUBound=totalUBound, &
totalCount=totalCount, rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Destroy Geom
call ESMF_GeomDestroy(geom, rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
if (present(rc)) rc = ESMF_SUCCESS
end subroutine ESMF_XGridGetFieldBounds