Example 2: Using cpp (and an included file)
If there were some simple conditional code in the body of the routine or additional
substitutions in the body of the text, the cpp(1) processor might provide a solution.
cpp(1) or fpp(1) is supported by most (all?) Fortran compilers.
sub.inc
subroutine _SCATTERV1D_(r,rscatter,scounts,displs)
_TYPE_(kind=_KIND_) :: r(:),rscatter(:)
integer :: i,ierror,scounts_default(iproc),displs_default(iproc)
integer, optional :: scounts(iproc),displs(iproc)
if (.not.(present(scounts).and.present(displs))) then ! here assume no scounts and no displs.
call gather(size(rscatter),scounts_default)
if (myrank()==0) then
displs_default(1)=0
do i=2,iproc
displs_default(i)=displs_default(i-1)+scounts_default(i-1)
enddo
endif
#ifdef OTHER
! something else depending on TYPE _TYPE_ and KIND _KIND_
#endif
call mpi_scatterv(r,scounts_default,displs_default,mpir8,rscatter,size(rscatter),mpir8,0, &
mpi_comm_world,ierror)
else
call mpi_scatterv(r,scounts,displs,mpir8,rscatter,size(rscatter),mpir8,0, &
mpi_comm_world,ierror)
endif
end subroutine _SCATTERV1D_
M_wrappers.F90
module M_wrappers
use, intrinsic :: iso_fortran_env, only : real32,real64,int8,int16,int32,int64
interface scatterv ! scatterv from process 0 to all process, evenly scatter. inverse of gather
module procedure scatterv1d_real32
module procedure scatterv1d_real64
module procedure scatterv1d_int8
module procedure scatterv1d_int16
module procedure scatterv1d_int32
module procedure scatterv1d_int64
end interface scatterv
contains
$!==================================================================================================
#define OTHER
#define _TYPE_ real
#define _SCATTERV1D_ scatterv1d_real32
#define _KIND_ real32
#include "sub.inc"
#define _SCATTERV1D_ scatterv1d_real64
#define _KIND_ real64
#include "sub.inc"
#define _TYPE_ integer
#define _SCATTERV1D_ scatterv1d_int8
#define _KIND_ int8
#include "sub.inc"
#define _SCATTERV1D_ scatterv1d_int16
#define _KIND_ int16
#include "sub.inc"
#define _SCATTERV1D_ scatterv1d_int32
#define _KIND_ int32
#include "sub.inc"
#define _SCATTERV1D_ scatterv1d_int64
#define _KIND_ int64
#include "sub.inc"
$!==================================================================================================
end module M_wrappers