| 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
    integer , allocatable :: a_iReqSend(:)
    integer , allocatable :: a_iReqRecv(:)
    real(DP), allocatable :: aa_LocalMax(:,:)
    integer               :: l
    integer               :: n
    if ( myrank == 0 ) then
      allocate( aa_LocalMax( 1:lmax, 0:nprocs-1 ) )
      allocate( a_iReqRecv ( 0:nprocs-1 ) )
      allocate( a_iReqSend ( 0:nprocs-1 ) )
      aa_LocalMax(:,0) = a_LocalMax
      do n = 1, nprocs-1
        idep = n
        call MPIWrapperIRecv( idep, lmax, aa_LocalMax(:,n), a_iReqRecv(n) )
      end do
      do n = 1, nprocs-1
        call MPIWrapperWait( a_iReqRecv(n) )
      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, a_iReqSend(n) )
      end do
      do n = 1, nprocs-1
        call MPIWrapperWait( a_iReqSend(n) )
      end do
      deallocate( aa_LocalMax )
      deallocate( a_iReqRecv )
      deallocate( a_iReqSend )
    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_double_precision, 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_double_precision, 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