Class | mpi_wrapper |
In: |
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.
!$ ! RadiationFluxDennouAGCM : | 放射フラックスの計算 |
!$ ! RadiationFinalize : | 終了処理 (モジュール内部の変数の割り付け解除) |
!$ ! ———— : | ———— |
!$ ! RadiationFluxDennouAGCM : | Calculate radiation flux |
!$ ! RadiationFinalize : | Termination (deallocate variables in this module) |
!$ ! NAMELIST#radiation_DennouAGCM_nml
Subroutine : |
MPI の終了処理
Finalization of MPI
subroutine MPIWrapperFinalize ! ! MPI の終了処理 ! ! Finalization of MPI ! ! モジュール引用 ; USE statements ! #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr call mpi_finalize( ierr ) #endif end subroutine MPIWrapperFinalize
Subroutine : | |
lmax : | integer , intent(in ) |
a_LocalMax(1:lmax) : | real(DP), intent(in ) |
a_GlobalMax(1:lmax) : | real(DP), intent(out) |
全球の最大値を探す
Find the maximum of the globe
Alias for MPIWrapperFindMaxVal_dble_1d
Subroutine : | |||
idep : | integer , intent(in )
| ||
im : | integer , intent(in )
| ||
buf( im ) : | integer , intent(out)
| ||
ireq : | integer , intent(out)
|
1D 倍精度配列の非ブロッキング通信(受信)
Non-blocking transfer (receive) of real(8) 1D array
Alias for MPIWrapperIRecv_int_1d
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
Alias for 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
Alias for 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(out)
| ||
ireq : | integer , intent(out)
|
3D 倍精度配列の非ブロッキング通信(受信)
Non-blocking transfer (receive) of real(8) 3D array
Alias for 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
Alias for MPIWrapperIRecv_dble_4d
Subroutine : | |||
idest : | integer , intent(in )
| ||
im : | integer , intent(in )
| ||
buf( im ) : | integer , intent(in )
| ||
ireq : | integer , intent(out)
|
1D 倍精度配列の非ブロッキング通信(送信)
Non-blocking transfer (send) of real(8) 1D array
Alias for MPIWrapperISend_int_1d
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
Alias for 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
Alias for 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
Alias for 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
Alias for MPIWrapperISend_dble_4d
Subroutine : |
MPI の初期化
Initialization of MPI
subroutine MPIWrapperInit ! ! MPI の初期化 ! ! Initialization of MPI ! ! モジュール引用 ; USE statements ! #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: ierr #endif nprocs = 1 myrank = 0 #ifdef LIB_MPI 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 ! ! モジュール引用 ; USE statements ! 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
Subroutine : | |
lmax : | integer , intent(in ) |
a_LocalMax(1:lmax) : | real(DP), intent(in ) |
a_GlobalMax(1:lmax) : | real(DP), intent(out) |
全球の最大値を探す
Find the maximum of the globe
subroutine MPIWrapperFindMaxVal_dble_1d( lmax, a_LocalMax, a_GlobalMax ) ! ! 全球の最大値を探す ! ! Find the maximum of the globe ! ! モジュール引用 ; USE statements ! integer , intent(in ) :: lmax real(DP), intent(in ) :: a_LocalMax (1:lmax) real(DP), intent(out) :: a_GlobalMax(1:lmax) #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: idep ! Process number of departure integer :: idest ! Process number of destination real(DP) :: a_Buf(1:lmax) ! Array to be received integer :: ireq ! Request number real(DP), allocatable :: aa_LocalMax(:,:) integer :: l integer :: n if ( myrank == 0 ) then allocate( aa_LocalMax( 1:lmax, 0:nprocs-1 ) ) aa_LocalMax(:,0) = a_LocalMax do n = 1, nprocs-1 idep = n call MPIWrapperIRecv( idep, lmax, aa_LocalMax(:,n), ireq ) call MPIWrapperWait( ireq ) end do do l = 1, lmax n = 0 a_GlobalMax(l) = aa_LocalMax(l,n) do n = 1, nprocs-1 if ( a_GlobalMax(l) < aa_LocalMax(l,n) ) then a_GlobalMax(l) = aa_LocalMax(l,n) end if end do end do a_Buf = a_GlobalMax do n = 1, nprocs-1 idest = n call MPIWrapperISend( idest, lmax, a_Buf, ireq ) call MPIWrapperWait( ireq ) end do deallocate( aa_LocalMax ) else idest = 0 a_Buf = a_LocalMax call MPIWrapperISend( idest, lmax, a_Buf, ireq ) call MPIWrapperWait( ireq ) idep = 0 call MPIWrapperIRecv( idep, lmax, a_Buf, ireq ) call MPIWrapperWait( ireq ) a_GlobalMax = a_Buf end if #else a_GlobalMax = a_LocalMax #endif end subroutine MPIWrapperFindMaxVal_dble_1d
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 ! ! モジュール引用 ; USE statements ! 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 ! ! モジュール引用 ; USE statements ! 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(out)
| ||
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 ! ! モジュール引用 ; USE statements ! 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(out) :: 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 ) 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 ! ! モジュール引用 ; USE statements ! 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 : | |||
idep : | integer , intent(in )
| ||
im : | integer , intent(in )
| ||
buf( im ) : | integer , intent(out)
| ||
ireq : | integer , intent(out)
|
1D 倍精度配列の非ブロッキング通信(受信)
Non-blocking transfer (receive) of real(8) 1D array
subroutine MPIWrapperIRecv_int_1d( idep, im, buf, ireq ) ! ! 1D 倍精度配列の非ブロッキング通信(受信) ! ! Non-blocking transfer (receive) of real(8) 1D array ! ! モジュール引用 ; USE statements ! integer , intent(in ) :: idep ! Process number of departure integer , intent(in ) :: im ! Size of 1st dimension of received data integer , 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_integer, idep, 1, mpi_comm_world, ireq, ierr ) #endif end subroutine MPIWrapperIRecv_int_1d
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 ! ! モジュール引用 ; USE statements ! 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 ! ! モジュール引用 ; USE statements ! 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 ! ! モジュール引用 ; USE statements ! 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 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 ! ! モジュール引用 ; USE statements ! 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 : | |||
idest : | integer , intent(in )
| ||
im : | integer , intent(in )
| ||
buf( im ) : | integer , intent(in )
| ||
ireq : | integer , intent(out)
|
1D 倍精度配列の非ブロッキング通信(送信)
Non-blocking transfer (send) of real(8) 1D array
subroutine MPIWrapperISend_int_1d( idest, im, buf, ireq ) ! ! 1D 倍精度配列の非ブロッキング通信(送信) ! ! Non-blocking transfer (send) of real(8) 1D array ! ! モジュール引用 ; USE statements ! integer , intent(in ) :: idest ! Process number of destination integer , intent(in ) :: im ! Size of 1st dimension of sent data integer , 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_integer, idest, 1, mpi_comm_world, ireq, ierr ) #endif end subroutine MPIWrapperISend_int_1d
Subroutine : |
MPI の異常終了処理
Abort of MPI
subroutine MPIWrapperStop ! ! MPI の異常終了処理 ! ! Abort of MPI ! ! モジュール引用 ; USE statements ! #ifdef LIB_MPI ! 作業変数 ! Work variables ! integer :: errorcode = 9 integer :: ierr call mpi_abort( mpi_comm_world, errorcode, ierr ) call MPIWrapperFinalize stop #endif end subroutine MPIWrapperstop