The main documentation of the Distribute Procedure contains additional explanation of this code listing.
define([DISTRIBUTE_ROUTINE],[
pushdef([TYPE], [$1])
pushdef([Distribute_TYPE_0], expand(Distribute_TYPE_0))
subroutine Distribute_TYPE_0 (Output, Input)
! Input variables.
type(TYPE,1,np), intent(in) :: Input ! Variable to be distributed.
! Output variable.
type(TYPE), intent(out) :: Output ! Distributed variable.
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Verify requirements.
! Input is the right size.
VERIFY(SIZE(Input) == NPEs * delta_PE_IO_PE,3)
! Do the global distribute.
ifdef([USE_PGSLIB],[
! PGSLib parallel distribute.
call PGSLib_Dist (Output, Input)
],[
! Serial distribute.
Output = Input(1)
])
! Verify guarantees - none.
return
end subroutine Distribute_TYPE_0
popdef([TYPE])
popdef([Distribute_TYPE_0])
])
fortext([Type],[real integer logical],[
DISTRIBUTE_ROUTINE(Type)
])
define([DISTRIBUTE_ROUTINE],[
pushdef([TYPE], [$1])
pushdef([Distribute_TYPE_1], expand(Distribute_TYPE_1))
subroutine Distribute_TYPE_1 (Output, Input, Lengths)
! Input variables.
type(integer,1,np), intent(in) :: Lengths ! Distribution lengths.
type(TYPE,1,np), intent(in) :: Input ! Variable to be distributed.
! Output variable.
type(TYPE,1,np), intent(out) :: Output ! Distributed variable.
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Verify requirements.
! Input is the right size.
VERIFY(SIZE(Input) == SUM(Lengths) * delta_PE_IO_PE,3)
! Lengths is the right size.
VERIFY(SIZE(Lengths) == NPEs,3)
! Do the global distribute.
ifdef([USE_PGSLIB],[
! PGSLib parallel distribute.
call PGSLib_Dist (Output, Input, Lengths)
],[
! Serial distribute.
Output = Input
])
! Verify guarantees - none.
return
end subroutine Distribute_TYPE_1
popdef([TYPE])
popdef([Distribute_TYPE_1])
])
fortext([Type],[real integer logical],[
DISTRIBUTE_ROUTINE(Type)
])