subroutine ESMF_GeomGetArrayInfo(geom, &
gridToFieldMap, ungriddedLBound, ungriddedUBound, &
distgrid, distgridToArrayMap, undistLBound, undistUBound, &
rc)
!
! !ARGUMENTS:
type(ESMF_Geom), intent(in) :: geom
integer, intent(in), optional :: gridToFieldMap(:)
integer, intent(in), optional :: ungriddedLBound(:)
integer, intent(in), optional :: ungriddedUBound(:)
type(ESMF_DistGrid), intent(out), optional :: distgrid
integer, intent(out) :: distgridToArrayMap(:)
integer, intent(out), optional :: undistLBound(:)
integer, intent(out), optional :: undistUBound(:)
integer, intent(out), optional :: rc
!
! !DESCRIPTION:
!
! This subroutine gets information from a Geom which is useful in creating an
! Array. This subroutine takes as input {\tt gridToFieldMap} which gives for each
! geom object dimension which dimension in the eventual Array it should be
! mapped to. It also takes {\tt ungriddedLBound} and {\tt ungriddedUBound} which
! describes the dimensions of the Array not associated with the geom object.
! From these it produces a mapping from the distgrid to the Array, the undistributed
! bounds of the Array in the correct order. (For everything besides {\tt Grid} the
! gridToFieldMap and distgridToArrayMap will be single element
! arrays describing which dimension in the Array the geom object (e.g. Mesh)
! is mapped to.
!
! The arguments are:
! \begin{description}
!\item[{geom}]
! The geom to get the information from to create the Array.
!\item[{[distgrid]}]
! The distgrid to create the Array on
!\item[{[gridToFieldMap]}]
! Indicates where each grid dimension goes in the newly created Array.
! {\tt The array gridToFieldMap} should be at least of size equal to the geom object's
! Array dimension (e.g. Mesh = 1)
! If not set defaults to (1,2,3,....,geom objects dim).
!\item[{[ungriddedLBound]}]
! The lower bounds of the non-grid Array dimensions.
!\item[{[ungriddedUBound]}]
! The upper bounds of the non-grid array dimensions.
!\item[{distgridToArrayMap}]
! The distgrid to Array dimension map (must be allocated to at least
! the number of dimensions of the distGrid).
!\item[{undistLBound}]
! Undistributed lower bounds (must be of size grid undistDimCount+size(ungriddedUBound))
!\item[{undistUBound}]
! Undistributed upper bounds (must be of size grid undistDimCount+size(ungriddedUBound))
! \item[{[rc]}]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!
!EOPI
integer :: localrc
type(ESMF_GeomClass),pointer :: gbcp
integer :: i
! Initialize return code; assume failure until success is certain
if (present(rc)) rc = ESMF_RC_NOT_IMPL
! Check init status of arguments
ESMF_INIT_CHECK_DEEP_SHORT(ESMF_GeomGetInit, geom, rc)
! Get GeomClass
gbcp=>geom%gbcp
! Get info depending on type
select case(gbcp%type%type)
case (ESMF_GEOMTYPE_GRID%type) ! Grid
call ESMF_GridGetArrayInfo(gbcp%grid, gbcp%staggerloc, &
gridToFieldMap, ungriddedLBound, ungriddedUBound, &
distgrid, distgridToArrayMap, undistLBound, undistUBound, &
rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
case (ESMF_GEOMTYPE_MESH%type) ! Mesh
if (present(gridToFieldMap)) then
distgridToArrayMap = gridToFieldMap
else
do i=1,size(distgridToArrayMap)
distgridToArrayMap(i)=i
enddo
endif
if (present(ungriddedLBound) .and. present (undistLBound)) then
if (size(ungriddedLBound) .gt. 0) undistLBound(1:size(ungriddedLBound)) = ungriddedLBound
endif
if (present(ungriddedUBound) .and. present (undistUBound)) then
if (size(ungriddedUBound) .gt. 0) undistUBound(1:size(ungriddedUBound)) = ungriddedUBound
endif
! Distgrid
if (present(distgrid)) then
if (gbcp%meshloc == ESMF_MESHLOC_NODE) then
call ESMF_MeshGet(mesh=gbcp%mesh, &
nodalDistgrid=distgrid, &
rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
else if (gbcp%meshloc == ESMF_MESHLOC_ELEMENT) then
call ESMF_MeshGet(mesh=gbcp%mesh, &
elementDistgrid=distgrid, &
rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
else
if (ESMF_LogFoundError(ESMF_RC_ARG_VALUE, &
msg=" Bad Mesh Location value", &
ESMF_CONTEXT, rcToReturn=rc)) return
endif
endif
case (ESMF_GEOMTYPE_LOCSTREAM%type) ! LocStream
if (present(gridToFieldMap)) then
distgridToArrayMap = gridToFieldMap
else
distgridToArrayMap = 1
endif
if (present(ungriddedLBound) .and. present (undistLBound)) then
if (size(ungriddedLBound) .gt. 0) undistLBound(1:size(ungriddedLBound)) = ungriddedLBound
endif
if (present(ungriddedUBound) .and. present (undistUBound)) then
if (size(ungriddedUBound) .gt. 0) undistUBound(1:size(ungriddedUBound)) = ungriddedUBound
endif
! Get distgrid
if (present(distgrid)) then
call ESMF_LocStreamGet(gbcp%locstream, distgrid=distgrid, &
rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
endif
case (ESMF_GEOMTYPE_XGRID%type) ! Xgrid
if (present(gridToFieldMap)) then
distgridToArrayMap = gridToFieldMap
else
distgridToArrayMap = 1
endif
if (present(ungriddedLBound) .and. present (undistLBound)) then
if (size(ungriddedLBound) .gt. 0) undistLBound(1:size(ungriddedLBound)) = ungriddedLBound
endif
if (present(ungriddedUBound) .and. present (undistUBound)) then
if (size(ungriddedUBound) .gt. 0) undistUBound(1:size(ungriddedUBound)) = ungriddedUBound
endif
! Get distgrid
if (present(distgrid)) then
call ESMF_XGridGet(gbcp%xgrid, gridIndex=gbcp%xgridindex, &
xgridSide=gbcp%xgridSide, &
distgrid=distgrid, rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
endif
case default
if (ESMF_LogFoundError(ESMF_RC_ARG_VALUE, &
msg=" Bad type value", &
ESMF_CONTEXT, rcToReturn=rc)) return
end select
! Set return value
if (present(rc)) rc = ESMF_SUCCESS
end subroutine ESMF_GeomGetArrayInfo