Class | mpi_wrapper |
In: |
../src/setup/mpi_wrapper.F90
|
Note that Japanese and English are described in parallel.
MPI 関係の変数の管理と MPI 関係ラッパールーチンのモジュール.
This is a module containing MPI-related variables and wrapper routines.
Subroutine : | |||
xsub : | integer, intent(in)
| ||
ysub : | integer, intent(in)
| ||
flag_periodic : | logical, intent(in) | ||
mpi_comm_cart : | integer, intent(inout) |
MPI cart の初期化
Initialization of MPI cart
subroutine MPIWrapperCartCreate( xsub, ysub, flag_periodic, mpi_comm_cart ) ! ! MPI cart の初期化 ! ! Initialization of MPI cart ! ! 暗黙の型宣言禁止 ! implicit none ! 入出力変数 ! integer, intent(in) :: xsub, ysub ! CPU nums of X and Y direction logical, intent(in) :: flag_periodic integer, intent(inout) :: mpi_comm_cart ! 作業変数 ! integer, parameter :: disp = 1 integer, parameter :: ndim = 2 logical, parameter :: reorder = .false. logical :: periodic(ndim) integer :: idivid(ndim) integer :: direction integer :: ierr #ifdef LIB_MPI idivid(1) = ysub idivid(2) = xsub periodic(1) = flag_periodic periodic(2) = flag_periodic call mpi_cart_create( mpi_comm_world, ndim, idivid, periodic, reorder, mpi_comm_cart, ierr ) ! if (.not. Flag_MPI_Cart) then ! Flag_MPI_Cart = .true. ! mpi_comm_cart_save = mpi_comm_cart ! end if #endif end subroutine MPIWrapperCartCreate
Subroutine : | |
mpi_comm_cart : | integer, intent(in) |
direction : | integer, intent(in) |
disp : | integer, intent(in) |
rank1 : | integer, intent(out) |
rank2 : | integer, intent(out) |
subroutine MPIWrapperCartShift(mpi_comm_cart, direction, disp, rank1, rank2) integer, intent(in) :: mpi_comm_cart integer, intent(in) :: direction integer, intent(in) :: disp integer, intent(out) :: rank1 integer, intent(out) :: rank2 integer :: ierr ! デフォルト値. ! rank1 = -1 rank2 = -1 #ifdef LIB_MPI call mpi_cart_shift( mpi_comm_cart, direction, disp, rank1, rank2, ierr ) #endif end subroutine MPIWrapperCartShift
Subroutine : | |
mpi_comm_cart : | integer, intent(in) |
MPI の終了処理
Finalization of MPI
subroutine MPIWrapperCommFree(mpi_comm_cart) ! ! MPI の終了処理 ! ! Finalization of MPI ! ! 暗黙の型宣言禁止 ! implicit none ! 入出力変数 ! integer, intent(in) :: mpi_comm_cart #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr call mpi_comm_free( mpi_comm_cart, ierr ) #endif end subroutine MPIWrapperCommFree
Subroutine : |
MPI の終了処理
Finalization of MPI
subroutine MPIWrapperFinalize ! ! MPI の終了処理 ! ! Finalization of MPI ! ! 暗黙の型宣言禁止 ! implicit none #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr ! if (FLAG_MPI_Cart) then ! call mpi_comm_free( mpi_comm_cart_save, ierr ) ! end if call mpi_finalize( ierr ) #endif end subroutine MPIWrapperFinalize
Subroutine : | |||
idep : | integer , intent(in )
| ||
im : | integer , intent(in )
| ||
buf( im ) : | real(DP), intent(out)
| ||
ireq : | integer , intent(out)
|
1D 倍精度配列の非ブロッキング通信(受信)
Non-blocking transfer (receive) of real(8) 1D array
subroutine MPIWrapperIRecv_dble_1d( idep, im, buf, ireq ) ! ! 1D 倍精度配列の非ブロッキング通信(受信) ! ! Non-blocking transfer (receive) of real(8) 1D array ! ! 暗黙の型宣言禁止 ! implicit none ! 入出力変数 ! input/output variables ! integer , intent(in ) :: idep ! Process number of departure integer , intent(in ) :: im ! Size of 1st dimension of received data real(DP), intent(out) :: buf( im ) ! Array to be received integer , intent(out) :: ireq ! Request number #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr integer :: isize isize = size( buf ) call mpi_irecv( buf, isize, mpi_double_precision, idep, 1, mpi_comm_world, ireq, ierr ) #endif end subroutine MPIWrapperIRecv_dble_1d
Subroutine : | |||
idep : | integer , intent(in )
| ||
im : | integer , intent(in )
| ||
jm : | integer , intent(in )
| ||
buf( im, jm ) : | real(DP), intent(out)
| ||
ireq : | integer , intent(out)
|
2D 倍精度配列の非ブロッキング通信(受信)
Non-blocking transfer (receive) of real(8) 2D array
subroutine MPIWrapperIRecv_dble_2d( idep, im, jm, buf, ireq ) ! ! 2D 倍精度配列の非ブロッキング通信(受信) ! ! Non-blocking transfer (receive) of real(8) 2D array ! ! 暗黙の型宣言禁止 ! implicit none ! 入出力変数 ! input/output variables ! integer , intent(in ) :: idep ! Process number of destination integer , intent(in ) :: im ! Size of 1st dimension of received data integer , intent(in ) :: jm ! Size of 2nd dimension of received data real(DP), intent(out) :: buf( im, jm ) ! Array to be received integer , intent(out) :: ireq ! Request number #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr integer :: isize isize = size( buf ) call mpi_irecv( buf, isize, mpi_double_precision, idep, 1, mpi_comm_world, ireq, ierr ) #endif end subroutine MPIWrapperIRecv_dble_2d
Subroutine : | |||
idep : | integer , intent(in )
| ||
im : | integer , intent(in )
| ||
jm : | integer , intent(in )
| ||
km : | integer , intent(in )
| ||
buf( im, jm, km ) : | real(DP), intent(inout)
| ||
ireq : | integer , intent(out)
|
3D 倍精度配列の非ブロッキング通信(受信)
Non-blocking transfer (receive) of real(8) 3D array
subroutine MPIWrapperIRecv_dble_3d( idep, im, jm, km, buf, ireq ) ! ! 3D 倍精度配列の非ブロッキング通信(受信) ! ! Non-blocking transfer (receive) of real(8) 3D array ! ! 暗黙の型宣言禁止 ! implicit none ! 入出力変数 ! input/output variables ! integer , intent(in ) :: idep ! Process number of departure integer , intent(in ) :: im ! Size of 1st dimension of received data integer , intent(in ) :: jm ! Size of 2nd dimension of received data integer , intent(in ) :: km ! Size of 3rd dimension of received data real(DP), intent(inout) :: buf( im, jm, km ) ! Array to be received integer , intent(out) :: ireq ! Request number #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr integer :: isize isize = size( buf ) ! write(*,*) "*** iRECV *** ", myrank, " <= ", idep call mpi_irecv( buf, isize, mpi_double_precision, idep, 1, mpi_comm_world, ireq, ierr ) #endif end subroutine MPIWrapperIRecv_dble_3d
Subroutine : | |||
idep : | integer , intent(in )
| ||
im : | integer , intent(in )
| ||
jm : | integer , intent(in )
| ||
km : | integer , intent(in )
| ||
lm : | integer , intent(in )
| ||
buf( im, jm, km, lm ) : | real(DP), intent(out)
| ||
ireq : | integer , intent(out)
|
4D 倍精度配列の非ブロッキング通信(受信)
Non-blocking transfer (receive) of real(8) 4D array
subroutine MPIWrapperIRecv_dble_4d( idep, im, jm, km, lm, buf, ireq ) ! ! 4D 倍精度配列の非ブロッキング通信(受信) ! ! Non-blocking transfer (receive) of real(8) 4D array ! ! 暗黙の型宣言禁止 ! implicit none ! 入出力変数 ! input/output variables ! integer , intent(in ) :: idep ! Process number of departure integer , intent(in ) :: im ! Size of 1st dimension of received data integer , intent(in ) :: jm ! Size of 2nd dimension of received data integer , intent(in ) :: km ! Size of 3rd dimension of received data integer , intent(in ) :: lm ! Size of 4th dimension of received data real(DP), intent(out) :: buf( im, jm, km, lm ) ! Array to be received integer , intent(out) :: ireq ! Request number #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr integer :: isize isize = size( buf ) call mpi_irecv( buf, isize, mpi_double_precision, idep, 1, mpi_comm_world, ireq, ierr ) #endif end subroutine MPIWrapperIRecv_dble_4d
Subroutine : | |||
idest : | integer , intent(in )
| ||
im : | integer , intent(in )
| ||
buf( im ) : | real(DP), intent(in )
| ||
ireq : | integer , intent(out)
|
1D 倍精度配列の非ブロッキング通信(送信)
Non-blocking transfer (send) of real(8) 1D array
subroutine MPIWrapperISend_dble_1d( idest, im, buf, ireq ) ! ! 1D 倍精度配列の非ブロッキング通信(送信) ! ! Non-blocking transfer (send) of real(8) 1D array ! ! 暗黙の型宣言禁止 ! implicit none ! 入出力変数 ! input/output variables ! integer , intent(in ) :: idest ! Process number of destination integer , intent(in ) :: im ! Size of 1st dimension of sent data real(DP), intent(in ) :: buf( im ) ! Array to be sent integer , intent(out) :: ireq ! Request number #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr integer :: isize isize = size( buf ) call mpi_isend( buf, isize, mpi_double_precision, idest, 1, mpi_comm_world, ireq, ierr ) #endif end subroutine MPIWrapperISend_dble_1d
Subroutine : | |||
idest : | integer , intent(in )
| ||
im : | integer , intent(in )
| ||
jm : | integer , intent(in )
| ||
buf( im, jm ) : | real(DP), intent(in )
| ||
ireq : | integer , intent(out)
|
2D 倍精度配列の非ブロッキング通信(送信)
Non-blocking transfer (send) of real(8) 2D array
subroutine MPIWrapperISend_dble_2d( idest, im, jm, buf, ireq ) ! ! 2D 倍精度配列の非ブロッキング通信(送信) ! ! Non-blocking transfer (send) of real(8) 2D array ! ! 暗黙の型宣言禁止 ! implicit none ! 入出力変数 ! input/output variables ! integer , intent(in ) :: idest ! Process number of destination integer , intent(in ) :: im ! Size of 1st dimension of sent data integer , intent(in ) :: jm ! Size of 2nd dimension of sent data real(DP), intent(in ) :: buf( im, jm ) ! Array to be sent integer , intent(out) :: ireq ! Request number #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr integer :: isize isize = size( buf ) call mpi_isend( buf, isize, mpi_double_precision, idest, 1, mpi_comm_world, ireq, ierr ) #endif end subroutine MPIWrapperISend_dble_2d
Subroutine : | |||
idest : | integer , intent(in )
| ||
im : | integer , intent(in )
| ||
jm : | integer , intent(in )
| ||
km : | integer , intent(in )
| ||
buf( im, jm, km ) : | real(DP), intent(in )
| ||
ireq : | integer , intent(out)
|
3D 倍精度配列の非ブロッキング通信(送信)
Non-blocking transfer (send) of real(8) 3D array
subroutine MPIWrapperISend_dble_3d( idest, im, jm, km, buf, ireq ) ! ! 3D 倍精度配列の非ブロッキング通信(送信) ! ! Non-blocking transfer (send) of real(8) 3D array ! ! 暗黙の型宣言禁止 ! implicit none ! 入出力変数 ! input/output variables ! integer , intent(in ) :: idest ! Process number of destination integer , intent(in ) :: im ! Size of 1st dimension of sent data integer , intent(in ) :: jm ! Size of 2nd dimension of sent data integer , intent(in ) :: km ! Size of 3rd dimension of sent data real(DP), intent(in ) :: buf( im, jm, km ) ! Array to be sent integer , intent(out) :: ireq ! Request number #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr integer :: isize ! write(*,*) "*** iSEND *** ", myrank, " => ", idest isize = size( buf ) call mpi_isend( buf, isize, mpi_double_precision, idest, 1, mpi_comm_world, ireq, ierr ) #endif end subroutine MPIWrapperISend_dble_3d
Subroutine : | |||
idest : | integer , intent(in )
| ||
im : | integer , intent(in )
| ||
jm : | integer , intent(in )
| ||
km : | integer , intent(in )
| ||
lm : | integer , intent(in )
| ||
buf( im, jm, km, lm ) : | real(DP), intent(in )
| ||
ireq : | integer , intent(out)
|
4D 倍精度配列の非ブロッキング通信(送信)
Non-blocking transfer (send) of real(8) 4D array
subroutine MPIWrapperISend_dble_4d( idest, im, jm, km, lm, buf, ireq ) ! ! 4D 倍精度配列の非ブロッキング通信(送信) ! ! Non-blocking transfer (send) of real(8) 4D array ! ! 暗黙の型宣言禁止 ! implicit none ! 入出力変数 ! input/output variables ! integer , intent(in ) :: idest ! Process number of destination integer , intent(in ) :: im ! Size of 1st dimension of sent data integer , intent(in ) :: jm ! Size of 2nd dimension of sent data integer , intent(in ) :: km ! Size of 3rd dimension of sent data integer , intent(in ) :: lm ! Size of 4th dimension of sent data real(DP), intent(in ) :: buf( im, jm, km, lm ) ! Array to be sent integer , intent(out) :: ireq ! Request number #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr integer :: isize isize = size( buf ) call mpi_isend( buf, isize, mpi_double_precision, idest, 1, mpi_comm_world, ireq, ierr ) #endif end subroutine MPIWrapperISend_dble_4d
Subroutine : |
MPI の初期化
Initialization of MPI
subroutine MPIWrapperInit ! ! MPI の初期化 ! ! Initialization of MPI ! ! 暗黙の型宣言禁止 ! implicit none #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr #endif ! set default values ! FLAG_LIB_MPI = .false. nprocs = 1 myrank = 0 #ifdef LIB_MPI ! call MPI initial subroutine ! FLAG_LIB_MPI = .true. call mpi_init( ierr ) call mpi_comm_size( mpi_comm_world, nprocs, ierr ) call mpi_comm_rank( mpi_comm_world, myrank, ierr ) #endif end subroutine MPIWrapperInit
Subroutine : | |||
ireq : | integer, intent(inout)
|
MPI 通信終了まで待機
Wait finishing MPI transfer
subroutine MPIWrapperWait( ireq ) ! ! MPI 通信終了まで待機 ! ! Wait finishing MPI transfer ! ! 暗黙の型宣言禁止 ! implicit none ! 作業変数 ! Work variables ! integer, intent(inout) :: ireq ! request number #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr integer :: istatus( MPI_STATUS_SIZE ) call mpi_wait( ireq, istatus, ierr ) #endif end subroutine MPIWrapperWait