function ESMF_LocStreamCreateFromLocal(localCount, keywordEnforcer, &
indexflag, coordSys, name, rc)
!
! !RETURN VALUE:
type(ESMF_LocStream) :: ESMF_LocStreamCreateFromLocal
!
! !ARGUMENTS:
integer, intent(in) :: localCount
type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below
type(ESMF_Index_Flag), intent(in), optional :: indexflag
type(ESMF_CoordSys_Flag), intent(in), optional :: coordSys
character (len=*), intent(in), optional :: name
integer, intent(out), optional :: rc
!
! !DESCRIPTION:
! Allocates memory for a new {\tt ESMF\_LocStream} object, constructs its
! internal derived types. The {\tt ESMF\_DistGrid} is set up, indicating
! how the LocStream is distributed. The assumed layout is one DE per PET.
!
! The arguments are:
! \begin{description}
! \item[localCount]
! Number of grid cells to be distributed to this DE/PET.
! \item[{[indexflag]}]
! Flag that indicates how the DE-local indices are to be defined.
! Defaults to {\tt ESMF\_INDEX\_DELOCAL}, which indicates
! that the index range on each DE starts at 1. See Section~\ref{const:indexflag}
! for the full range of options.
! \item[{[coordSys]}]
! The coordinate system of the location stream coordinate data.
! For a full list of options, please see Section~\ref{const:coordsys}.
! If not specified then defaults to ESMF\_COORDSYS\_SPH\_DEG.
! \item[{[name]}]
! Name of the location stream
! \item[{[rc]}]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!
!EOP
integer :: localrc ! Error status
type(ESMF_VM) :: vm ! Virtual machine used
integer, allocatable :: countsPerPet(:)
integer :: localPet, petCount
integer :: i, currMin
type(ESMF_DistGrid) :: distgrid
integer, pointer :: deBLockList(:,:,:)
integer :: minIndex(1), maxIndex(1)
type(ESMF_Index_Flag) :: indexflagLocal
type(ESMF_CoordSys_Flag) :: coordSysLocal
! Initialize return code; assume failure until success is certain
if (present(rc)) rc = ESMF_RC_NOT_IMPL
! Set defaults
if (present(indexflag)) then
indexflagLocal=indexflag
else
indexflagLocal=ESMF_INDEX_DELOCAL
endif
if (present(coordSys)) then
coordSysLocal=coordSys
else
coordSysLocal=ESMF_COORDSYS_SPH_DEG
endif
! Get VM for this context
call ESMF_VMGetCurrent(vm, rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Gather localCount for each Pet
call ESMF_VMGet( vm, localPet = localPet, &
petCount = petCount, rc=localrc )
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
allocate(countsPerPet(petCount), stat=localrc)
if (ESMF_LogFoundAllocError(localrc, msg="Allocating countsPerPet", &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_VMAllGather(vm, sendData=(/localCount/), &
recvData=countsPerPet, count=1, rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Setup DistGrid
!! define min and maxIndex
minIndex(1)=1
maxIndex(1)=sum(countsPerPet(:))
!! setup deBlockList
allocate(deBlockList(1,2,petCount), stat=localrc)
if (ESMF_LogFoundAllocError(localrc, msg="Allocating deBlockList", &
ESMF_CONTEXT, rcToReturn=rc)) return
currMin=1
do i=1,petCount
deBlockList(1,1,i)=currMin
deBlockList(1,2,i)=currMin+countsPerPet(i)-1
currMin=deBlockList(1,2,i)+1
enddo
!! Create DistGrid
distgrid=ESMF_DistGridCreate(minIndex=minIndex, &
maxIndex=maxIndex, &
deBlockList=deBlockList, &
indexflag=indexflagLocal, &
rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! cleanup local allocations
deallocate(countsPerPet)
deallocate(deBlockList)
! Create LocStream using CreateFromDistGrid version
ESMF_LocStreamCreateFromLocal=ESMF_LocStreamCreateFromDG(name=name, &
distgrid=distgrid, &
indexflag=indexflagLocal, &
coordSys=coordSysLocal, &
rc=localrc )
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Set distgrid to be destroyed, since ESMF created it
ESMF_LocStreamCreateFromLocal%lstypep%destroyDistgrid=.true.
! return successfully
if (present(rc)) rc = ESMF_SUCCESS
end function ESMF_LocStreamCreateFromLocal