subroutine gatherFracFieldMesh(mesh, vm, fracField, petNo, petCnt, frac, rc)
type(ESMF_Mesh) :: mesh
type(ESMF_VM) :: VM
integer :: petNo,petCnt
type(ESMF_Field) :: fracField
real (ESMF_KIND_R8), pointer :: frac(:)
integer :: rc
real (ESMF_KIND_R8), pointer :: localFrac(:)
real (ESMF_KIND_R8), pointer :: mergedFrac(:)
integer :: localrc
integer :: localElemCount,i
integer (ESMF_KIND_I4) :: localCount(1)
integer (ESMF_KIND_I4),pointer :: globalCount(:),globalDispl(:)
integer :: totalCount
! Get localFrac from field
call ESMF_FieldGet(fracField, localDE=0, farrayPtr=localFrac, rc=localrc)
if (localrc /=ESMF_SUCCESS) then
rc=localrc
return
endif
localElemCount=size(localFrac)
! localFrac is gotten from the fracField above
! Allocate List of counts
allocate(globalCount(petCnt))
! Get List of counts
localCount(1)=localElemCount
call ESMF_VMGather(vm,localCount,globalCount,count=1,rootPet=0,rc=localrc)
if (localrc /=ESMF_SUCCESS) then
rc=localrc
return
endif
! Calculate Displacements
allocate(globalDispl(petCnt))
if (petNo==0) then
globalDispl(1)=0
do i=2,petCnt
globalDispl(i)=globalDispl(i-1)+globalCount(i-1)
enddo
else
globalDispl=0
endif
! Sum size
if (petNo==0) then
totalCount=0
do i=1,petCnt
totalCount=totalCount+globalCount(i)
enddo
else
totalCount=1 ! Because I'm not sure what happens
! if array is not allocated in VM
endif
! Allocate final area list
allocate(frac(totalCount))
! Gather all areas
call ESMF_VMGatherV(vm,sendData=localFrac, sendCount=localElemCount,&
recvData=frac,recvCounts=globalCount,recvOffsets=globalDispl,&
rootPet=0, rc=localrc)
if (localrc /=ESMF_SUCCESS) then
rc=localrc
return
endif
deallocate(globalCount)
deallocate(globalDispl)
if (petNo .ne. 0) deallocate(frac)
end subroutine gatherFracFieldMesh