Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(ESMF_Mesh) | :: | mesh | ||||
type(ESMF_VM) | :: | VM | ||||
type(ESMF_Field) | :: | fracField | ||||
integer | :: | petNo | ||||
integer | :: | petCnt | ||||
real(kind=ESMF_KIND_R8), | pointer | :: | frac(:) | |||
integer | :: | rc |
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