Linux  R2.6.5-7.282-sn2 FORTRAN90/SX         Rev.360        Tue Oct 11 12:33:20 2011
FILE NAME: i.mpi_wrapper.F90
PROGRAM NAME: mpi_wrapper
TRANSFORMATION LIST

  LINE                   FORTRAN STATEMENT

     1  != MPI 関連ルーチン
     2  !
     3  != MPI related routines
     4  !
     5  ! Authors::   Yoshiyuki O. Takahashi
     6  ! Version::   $Id: mpi_wrapper.F90,v 1.5 2011-06-03 16:31:45 sugiyama Exp $
     7  ! Tag Name::  $Name: arare5-20111010 $
     8  ! Copyright:: Copyright (C) GFD Dennou Club, 2008. All rights reserved.
     9  ! License::   See COPYRIGHT[link:../../../COPYRIGHT]
    10  !
    11  
    12  module mpi_wrapper
    13    !
    14    != MPI 関連ルーチン
    15    !
    16    != MPI related routines
    17    !
    18    ! <b>Note that Japanese and English are described in parallel.</b>
    19    !
    20    ! MPI 関係の変数の管理と MPI 関係ラッパールーチンのモジュール.
    21    !
    22    ! This is a module containing MPI-related variables and wrapper routines.
    23    !
    24    !== Procedures List
    25    !
    26    !
    27    !== NAMELIST
    28    !
    29    !
    30  
    31    ! モジュール引用 ; USE statements
    32    !
    33  
    34    ! 種別型パラメタ
    35    ! Kind type parameter
    36    !
    37    use dc_types, only: DP, &      ! 倍精度実数型. Double precision.
    38      &                 STRING, &  ! 文字列.       Strings.
    39      &                 TOKEN      ! キーワード.   Keywords.
    40  
    41  
    42    ! MPI
    43    !
    44    use mpi
    45  
    46  
    47    ! 宣言文 ; Declaration statements
    48    !
    49    implicit none
    50    private
    51  
    52    ! 公開手続き
    53    ! Public procedure
    54    !
    55    public :: MPIWrapperInit
    56    public :: MPIWrapperFinalize
    57  
    58    public :: MPIWrapperISend
    59    public :: MPIWrapperIRecv
    60    public :: MPIWrapperWait
    61  
    62  
    63    ! 公開変数
    64    ! Public variables
    65    !
    66    integer, save, public :: nprocs
    67                             ! Number of MPI processes
    68    integer, save, public :: myrank
    69                             ! My rank
    70    logical, save, public :: FLAG_LIB_MPI
    71  
    72  
    73    ! 非公開変数
    74    ! Private variables
    75    !
    76    interface MPIWrapperISend
    77      module procedure &
    78        MPIWrapperISend_dble_1d, &
    79        MPIWrapperISend_dble_2d, &
    80        MPIWrapperISend_dble_3d, &
    81        MPIWrapperISend_dble_4d
    82    end interface
    83  
    84    interface MPIWrapperIRecv
    85      module procedure &
    86        MPIWrapperIRecv_dble_1d, &
    87        MPIWrapperIRecv_dble_2d, &
    88        MPIWrapperIRecv_dble_3d, &
    89        MPIWrapperIRecv_dble_4d
    90    end interface
    91  
    92    interface MPIWrapperAbort
    93      module procedure &
    94        MPIWrapperStop
    95    end interface
    96  
    97  
    98  contains
    99  
   100    !--------------------------------------------------------------------------------------
   101  
   102    subroutine MPIWrapperInit
   103      !
   104      ! MPI の初期化
   105      !
   106      ! Initialization of MPI
   107      !
   108  
   109      ! モジュール引用 ; USE statements
   110      !
   111  
   112  
   113  
   114  
   115      ! 作業変数
   116      ! Work variables
   117      !
   118      integer :: ierr
   119  
   120  
   121  
   122      FLAG_LIB_MPI = .false.
   123      nprocs = 1
   124      myrank = 0
   125  
   126  
   127  
   128      FLAG_LIB_MPI = .true.
   129       call mpi_init( ierr )
   130      call mpi_comm_size( mpi_comm_world, nprocs, ierr )
   131      call mpi_comm_rank( mpi_comm_world, myrank, ierr )
   132  
   133  
   134  
   135    end subroutine MPIWrapperInit
   136  
   137    !--------------------------------------------------------------------------------------
   138  
   139    subroutine MPIWrapperFinalize
   140      !
   141      ! MPI の終了処理
   142      !
   143      ! Finalization of MPI
   144      !
   145  
   146      ! モジュール引用 ; USE statements
   147      !
   148  
   149  
   150  
   151  
   152      ! 作業変数
   153      ! Work variables
   154      !
   155      integer :: ierr
   156  
   157  
   158      call mpi_finalize( ierr )
   159  
   160  
   161  
   162    end subroutine MPIWrapperFinalize
   163  
   164    !--------------------------------------------------------------------------------------
   165  
   166  
   167    subroutine MPIWrapperStop
   168      !
   169      ! MPI の異常終了処理
   170      !
   171      ! Abort of MPI
   172      !
   173  
   174      ! モジュール引用 ; USE statements
   175      !
   176  
   177      ! 作業変数
   178      ! Work variables
   179      !
   180      integer :: errorcode = 9
   181      integer :: ierr
   182  
   183      call mpi_abort( mpi_comm_world, errorcode, ierr )
   184      call MPIWrapperFinalize
   185      stop
   186  
   187    end subroutine MPIWrapperstop
   188  
   189    !--------------------------------------------------------------------------------------
   190  
   191    subroutine MPIWrapperWait( ireq )
   192      !
   193      ! MPI 通信終了まで待機
   194      !
   195      ! Wait finishing MPI transfer
   196      !
   197  
   198      ! モジュール引用 ; USE statements
   199      !
   200  
   201      integer, intent(inout) :: ireq
   202                                 ! request number
   203  
   204      ! 作業変数
   205      ! Work variables
   206      !
   207      integer :: ierr
   208      integer :: istatus( MPI_STATUS_SIZE )
   209  
   210  
   211      call mpi_wait( ireq, istatus, ierr )
   212  
   213    end subroutine MPIWrapperWait
   214  
   215    !--------------------------------------------------------------------------------------
   216  
   217    subroutine MPIWrapperISend_dble_1d( &
   218      & idest, im,                      & ! (in)
   219      & buf,                            & ! (in)
   220      & ireq                            & ! (out)
   221      & )
   222      !
   223      ! 1D 倍精度配列の非ブロッキング通信(送信)
   224      !
   225      ! Non-blocking transfer (send) of real(8) 1D array
   226      !
   227  
   228      ! モジュール引用 ; USE statements
   229      !
   230  
   231  
   232      integer , intent(in ) :: idest
   233                                ! Process number of destination
   234      integer , intent(in ) :: im
   235                                ! Size of 1st dimension of sent data
   236      real(DP), intent(in ) :: buf( im )
   237                                ! Array to be sent
   238      integer , intent(out) :: ireq
   239                                ! Request number
   240  
   241  
   242      ! 作業変数
   243      ! Work variables
   244      !
   245      integer :: ierr
   246      integer :: isize
   247  
   248  
   249      isize = size( buf )
   250  
   251      call mpi_isend( buf, isize, &
   252        mpi_double_precision, idest, 1, mpi_comm_world, &
   253        ireq, ierr )
   254  
   255    end subroutine MPIWrapperISend_dble_1d
   256  
   257    !--------------------------------------------------------------------------------------
   258  
   259    subroutine MPIWrapperIRecv_dble_1d( &
   260      & idep, im,                       & ! (in)
   261      & buf,                            & ! (out)
   262      & ireq                            & ! (out)
   263      & )
   264      !
   265      ! 1D 倍精度配列の非ブロッキング通信(受信)
   266      !
   267      ! Non-blocking transfer (receive) of real(8) 1D array
   268      !
   269  
   270      ! モジュール引用 ; USE statements
   271      !
   272  
   273  
   274      integer , intent(in ) :: idep
   275                                ! Process number of departure
   276      integer , intent(in ) :: im
   277                                ! Size of 1st dimension of received data
   278      real(DP), intent(out) :: buf( im )
   279                                ! Array to be received
   280      integer , intent(out) :: ireq
   281                                ! Request number
   282  
   283  
   284      ! 作業変数
   285      ! Work variables
   286      !
   287      integer :: ierr
   288      integer :: isize
   289  
   290  
   291      isize = size( buf )
   292  
   293      call mpi_irecv( buf, isize, &
   294        mpi_double_precision, idep, 1, mpi_comm_world, &
   295        ireq, ierr )
   296  
   297    end subroutine MPIWrapperIRecv_dble_1d
   298  
   299    !--------------------------------------------------------------------------------------
   300  
   301    subroutine MPIWrapperISend_dble_2d( &
   302      & idest, im, jm,                  & ! (in)
   303      & buf,                            & ! (in)
   304      & ireq                            & ! (out)
   305      & )
   306      !
   307      ! 2D 倍精度配列の非ブロッキング通信(送信)
   308      !
   309      ! Non-blocking transfer (send) of real(8) 2D array
   310      !
   311  
   312      ! モジュール引用 ; USE statements
   313      !
   314  
   315  
   316      integer , intent(in ) :: idest
   317                                ! Process number of destination
   318      integer , intent(in ) :: im
   319                                ! Size of 1st dimension of sent data
   320      integer , intent(in ) :: jm
   321                                ! Size of 2nd dimension of sent data
   322      real(DP), intent(in ) :: buf( im, jm )
   323                                ! Array to be sent
   324      integer , intent(out) :: ireq
   325                                ! Request number
   326  
   327      ! 作業変数
   328      ! Work variables
   329      !
   330      integer :: ierr
   331      integer :: isize
   332  
   333  
   334      isize = size( buf )
   335  
   336      call mpi_isend( buf, isize, &
   337        mpi_double_precision, idest, 1, mpi_comm_world, &
   338        ireq, ierr )
   339  
   340    end subroutine MPIWrapperISend_dble_2d
   341  
   342    !--------------------------------------------------------------------------------------
   343  
   344    subroutine MPIWrapperIRecv_dble_2d( &
   345      & idep, im, jm,                   & ! (in)
   346      & buf,                            & ! (out)
   347      & ireq                            & ! (out)
   348      & )
   349      !
   350      ! 2D 倍精度配列の非ブロッキング通信(受信)
   351      !
   352      ! Non-blocking transfer (receive) of real(8) 2D array
   353      !
   354  
   355      ! モジュール引用 ; USE statements
   356      !
   357  
   358  
   359      integer , intent(in ) :: idep
   360                                ! Process number of destination
   361      integer , intent(in ) :: im
   362                                ! Size of 1st dimension of received data
   363      integer , intent(in ) :: jm
   364                                ! Size of 2nd dimension of received data
   365      real(DP), intent(out) :: buf( im, jm )
   366                                ! Array to be received
   367      integer , intent(out) :: ireq
   368                                ! Request number
   369  
   370  
   371      ! 作業変数
   372      ! Work variables
   373      !
   374      integer :: ierr
   375      integer :: isize
   376  
   377  
   378      isize = size( buf )
   379  
   380      call mpi_irecv( buf, isize, &
   381        mpi_double_precision, idep, 1, mpi_comm_world, &
   382        ireq, ierr )
   383  
   384    end subroutine MPIWrapperIRecv_dble_2d
   385  
   386    !--------------------------------------------------------------------------------------
   387  
   388    subroutine MPIWrapperISend_dble_3d( &
   389      & idest, im, jm, km,              & ! (in)
   390      & buf,                            & ! (in)
   391      & ireq                            & ! (out)
   392      & )
   393      !
   394      ! 3D 倍精度配列の非ブロッキング通信(送信)
   395      !
   396      ! Non-blocking transfer (send) of real(8) 3D array
   397      !
   398  
   399      ! モジュール引用 ; USE statements
   400      !
   401  
   402  
   403      integer , intent(in ) :: idest
   404                                ! Process number of destination
   405      integer , intent(in ) :: im
   406                                ! Size of 1st dimension of sent data
   407      integer , intent(in ) :: jm
   408                                ! Size of 2nd dimension of sent data
   409      integer , intent(in ) :: km
   410                                ! Size of 3rd dimension of sent data
   411      real(DP), intent(in ) :: buf( im, jm, km )
   412                                ! Array to be sent
   413      integer , intent(out) :: ireq
   414                                ! Request number
   415  
   416  
   417      ! 作業変数
   418      ! Work variables
   419      !
   420      integer :: ierr
   421      integer :: isize
   422  
   423  
   424      isize = size( buf )
   425  
   426      call mpi_isend( buf, isize, &
   427        mpi_double_precision, idest, 1, mpi_comm_world, &
   428        ireq, ierr )
   429  
   430    end subroutine MPIWrapperISend_dble_3d
   431  
   432    !--------------------------------------------------------------------------------------
   433  
   434    subroutine MPIWrapperIRecv_dble_3d( &
   435      & idep, im, jm, km,               & ! (in)
   436      & buf,                            & ! (out)
   437      & ireq                            & ! (out)
   438      & )
   439      !
   440      ! 3D 倍精度配列の非ブロッキング通信(受信)
   441      !
   442      ! Non-blocking transfer (receive) of real(8) 3D array
   443      !
   444  
   445      ! モジュール引用 ; USE statements
   446      !
   447  
   448      integer , intent(in ) :: idep
   449                                ! Process number of departure
   450      integer , intent(in ) :: im
   451                                ! Size of 1st dimension of received data
   452      integer , intent(in ) :: jm
   453                                ! Size of 2nd dimension of received data
   454      integer , intent(in ) :: km
   455                                ! Size of 3rd dimension of received data
   456      real(DP), intent(out) :: buf( im, jm, km )
   457                                ! Array to be received
   458      integer , intent(out) :: ireq
   459                                ! Request number
   460  
   461  
   462      ! 作業変数
   463      ! Work variables
   464      !
   465      integer :: ierr
   466      integer :: isize
   467  
   468  
   469      isize = size( buf )
   470  
   471      call mpi_irecv( buf, isize, &
   472        mpi_double_precision, idep, 1, mpi_comm_world, &
   473        ireq, ierr )
   474  
   475    end subroutine MPIWrapperIRecv_dble_3d
   476  
   477    !--------------------------------------------------------------------------------------
   478  
   479    subroutine MPIWrapperISend_dble_4d( &
   480      & idest, im, jm, km, lm,          & ! (in)
   481      & buf,                            & ! (in)
   482      & ireq                            & ! (out)
   483      & )
   484      !
   485      ! 4D 倍精度配列の非ブロッキング通信(送信)
   486      !
   487      ! Non-blocking transfer (send) of real(8) 4D array
   488      !
   489  
   490      ! モジュール引用 ; USE statements
   491      !
   492  
   493  
   494      integer , intent(in ) :: idest
   495                                ! Process number of destination
   496      integer , intent(in ) :: im
   497                                ! Size of 1st dimension of sent data
   498      integer , intent(in ) :: jm
   499                                ! Size of 2nd dimension of sent data
   500      integer , intent(in ) :: km
   501                                ! Size of 3rd dimension of sent data
   502      integer , intent(in ) :: lm
   503                                ! Size of 4th dimension of sent data
   504      real(DP), intent(in ) :: buf( im, jm, km, lm )
   505                                ! Array to be sent
   506      integer , intent(out) :: ireq
   507                                ! Request number
   508  
   509      ! 作業変数
   510      ! Work variables
   511      !
   512      integer :: ierr
   513      integer :: isize
   514  
   515  
   516      isize = size( buf )
   517  
   518      call mpi_isend( buf, isize, &
   519        mpi_double_precision, idest, 1, mpi_comm_world, &
   520        ireq, ierr )
   521  
   522    end subroutine MPIWrapperISend_dble_4d
   523  
   524    !--------------------------------------------------------------------------------------
   525  
   526    subroutine MPIWrapperIRecv_dble_4d( &
   527      & idep, im, jm, km, lm,           & ! (in)
   528      & buf,                            & ! (out)
   529      & ireq                            & ! (out)
   530      & )
   531      !
   532      ! 4D 倍精度配列の非ブロッキング通信(受信)
   533      !
   534      ! Non-blocking transfer (receive) of real(8) 4D array
   535      !
   536  
   537      ! モジュール引用 ; USE statements
   538      !
   539  
   540  
   541      integer , intent(in ) :: idep
   542                                ! Process number of departure
   543      integer , intent(in ) :: im
   544                                ! Size of 1st dimension of received data
   545      integer , intent(in ) :: jm
   546                                ! Size of 2nd dimension of received data
   547      integer , intent(in ) :: km
   548                                ! Size of 3rd dimension of received data
   549      integer , intent(in ) :: lm
   550                                ! Size of 4th dimension of received data
   551      real(DP), intent(out) :: buf( im, jm, km, lm )
   552                                ! Array to be received
   553      integer , intent(out) :: ireq
   554                                ! Request number
   555  
   556  
   557      ! 作業変数
   558      ! Work variables
   559      !
   560      integer :: ierr
   561      integer :: isize
   562  
   563  
   564      isize = size( buf )
   565  
   566      call mpi_irecv( buf, isize, &
   567        mpi_double_precision, idep, 1, mpi_comm_world, &
   568        ireq, ierr )
   569  
   570    end subroutine MPIWrapperIRecv_dble_4d
   571  
   572    !--------------------------------------------------------------------------------------
   573  
   574  
   575  end module mpi_wrapper
Linux  R2.6.5-7.282-sn2 FORTRAN90/SX         Rev.360        Tue Oct 11 12:33:20 2011
FILE NAME: i.mpi_wrapper.F90
PROGRAM NAME: mpi_wrapper
FORMAT LIST

  LINE    LOOP     FORTRAN STATEMENT

     1:            != MPI 関連ルーチン
     2:            !
     3:            != MPI related routines
     4:            !
     5:            ! Authors::   Yoshiyuki O. Takahashi
     6:            ! Version::   $Id: mpi_wrapper.F90,v 1.5 2011-06-03 16:31:45 sugiyama Exp $
     7:            ! Tag Name::  $Name: arare5-20111010 $
     8:            ! Copyright:: Copyright (C) GFD Dennou Club, 2008. All rights reserved.
     9:            ! License::   See COPYRIGHT[link:../../../COPYRIGHT]
    10:            !
    11:            
    12:            module mpi_wrapper
    13:              !
    14:              != MPI 関連ルーチン
    15:              !
    16:              != MPI related routines
    17:              !
    18:              ! <b>Note that Japanese and English are described in parallel.</b>
    19:              !
    20:              ! MPI 関係の変数の管理と MPI 関係ラッパールーチンのモジュール. 
    21:              !
    22:              ! This is a module containing MPI-related variables and wrapper routines. 
    23:              !
    24:              !== Procedures List
    25:              !
    26:              !
    27:              !== NAMELIST
    28:              !
    29:              !
    30:            
    31:              ! モジュール引用 ; USE statements
    32:              !
    33:            
    34:              ! 種別型パラメタ
    35:              ! Kind type parameter
    36:              !
    37:              use dc_types, only: DP, &      ! 倍精度実数型. Double precision.
    38:                &                 STRING, &  ! 文字列.       Strings.
    39:                &                 TOKEN      ! キーワード.   Keywords.
    40:            
    41:            
    42:              ! MPI
    43:              !
    44:              use mpi
    45:            
    46:            
    47:              ! 宣言文 ; Declaration statements
    48:              !
    49:              implicit none
    50:              private
    51:            
    52:              ! 公開手続き
    53:              ! Public procedure
    54:              !
    55:              public :: MPIWrapperInit
    56:              public :: MPIWrapperFinalize
    57:            
    58:              public :: MPIWrapperISend
    59:              public :: MPIWrapperIRecv
    60:              public :: MPIWrapperWait
    61:            
    62:            
    63:              ! 公開変数
    64:              ! Public variables
    65:              !
    66:              integer, save, public :: nprocs
    67:                                       ! Number of MPI processes
    68:              integer, save, public :: myrank
    69:                                       ! My rank
    70:              logical, save, public :: FLAG_LIB_MPI
    71:            
    72:            
    73:              ! 非公開変数
    74:              ! Private variables
    75:              !
    76:              interface MPIWrapperISend
    77:                module procedure &
    78:                  MPIWrapperISend_dble_1d, &
    79:                  MPIWrapperISend_dble_2d, &
    80:                  MPIWrapperISend_dble_3d, &
    81:                  MPIWrapperISend_dble_4d
    82:              end interface
    83:            
    84:              interface MPIWrapperIRecv
    85:                module procedure &
    86:                  MPIWrapperIRecv_dble_1d, &
    87:                  MPIWrapperIRecv_dble_2d, &
    88:                  MPIWrapperIRecv_dble_3d, &
    89:                  MPIWrapperIRecv_dble_4d
    90:              end interface
    91:            
    92:              interface MPIWrapperAbort
    93:                module procedure &
    94:                  MPIWrapperStop
    95:              end interface
    96:            
    97:            
    98:            contains
    99:            
   100:              !--------------------------------------------------------------------------------------
   101:            
   102:              subroutine MPIWrapperInit
   103:                !
   104:                ! MPI の初期化
   105:                !
   106:                ! Initialization of MPI
   107:                !
   108:            
   109:                ! モジュール引用 ; USE statements
   110:                !
   111:            
   112:            
   113:            
   114:            
   115:                ! 作業変数
   116:                ! Work variables
   117:                !
   118:                integer :: ierr
   119:            
   120:            
   121:            
   122:                FLAG_LIB_MPI = .false.
   123:                nprocs = 1
   124:                myrank = 0
   125:            
   126:            
   127:            
   128:                FLAG_LIB_MPI = .true.
   129:                 call mpi_init( ierr )
   130:                call mpi_comm_size( mpi_comm_world, nprocs, ierr )
   131:                call mpi_comm_rank( mpi_comm_world, myrank, ierr )
   132:            
   133:            
   134:            
   135:              end subroutine MPIWrapperInit
   136:            
   137:              !--------------------------------------------------------------------------------------
   138:            
   139:              subroutine MPIWrapperFinalize
   140:                !
   141:                ! MPI の終了処理
   142:                !
   143:                ! Finalization of MPI
   144:                !
   145:            
   146:                ! モジュール引用 ; USE statements
   147:                !
   148:            
   149:            
   150:            
   151:            
   152:                ! 作業変数
   153:                ! Work variables
   154:                !
   155:                integer :: ierr
   156:            
   157:            
   158:                call mpi_finalize( ierr )
   159:            
   160:            
   161:            
   162:              end subroutine MPIWrapperFinalize
   163:            
   164:              !--------------------------------------------------------------------------------------
   165:            
   166:            
   167:              subroutine MPIWrapperStop
   168:                !
   169:                ! MPI の異常終了処理
   170:                !
   171:                ! Abort of MPI
   172:                !
   173:            
   174:                ! モジュール引用 ; USE statements
   175:                !
   176:            
   177:                ! 作業変数
   178:                ! Work variables
   179:                !
   180:                integer :: errorcode = 9
   181:                integer :: ierr
   182:            
   183:                call mpi_abort( mpi_comm_world, errorcode, ierr )
   184:                call MPIWrapperFinalize
   185:                stop
   186:            
   187:              end subroutine MPIWrapperstop
   188:            
   189:              !--------------------------------------------------------------------------------------
   190:            
   191:              subroutine MPIWrapperWait( ireq )
   192:                !
   193:                ! MPI 通信終了まで待機
   194:                !
   195:                ! Wait finishing MPI transfer
   196:                !
   197:            
   198:                ! モジュール引用 ; USE statements
   199:                !
   200:            
   201:                integer, intent(inout) :: ireq
   202:                                           ! request number
   203:            
   204:                ! 作業変数
   205:                ! Work variables
   206:                !
   207:                integer :: ierr
   208:                integer :: istatus( MPI_STATUS_SIZE )
   209:            
   210:            
   211:                call mpi_wait( ireq, istatus, ierr )
   212:            
   213:              end subroutine MPIWrapperWait
   214:            
   215:              !--------------------------------------------------------------------------------------
   216:            
   217:              subroutine MPIWrapperISend_dble_1d( &
   218:                & idest, im,                      & ! (in)
   219:                & buf,                            & ! (in)
   220:                & ireq                            & ! (out)
   221:                & )
   222:                !
   223:                ! 1D 倍精度配列の非ブロッキング通信(送信)
   224:                !
   225:                ! Non-blocking transfer (send) of real(8) 1D array
   226:                !
   227:            
   228:                ! モジュール引用 ; USE statements
   229:                !
   230:            
   231:            
   232:                integer , intent(in ) :: idest
   233:                                          ! Process number of destination
   234:                integer , intent(in ) :: im
   235:                                          ! Size of 1st dimension of sent data
   236:                real(DP), intent(in ) :: buf( im )
   237:                                          ! Array to be sent
   238:                integer , intent(out) :: ireq
   239:                                          ! Request number
   240:            
   241:            
   242:                ! 作業変数
   243:                ! Work variables
   244:                !
   245:                integer :: ierr
   246:                integer :: isize
   247:            
   248:            
   249:                isize = size( buf )
   250:            
   251:                call mpi_isend( buf, isize, &
   252:                  mpi_double_precision, idest, 1, mpi_comm_world, &
   253:                  ireq, ierr )
   254:            
   255:              end subroutine MPIWrapperISend_dble_1d
   256:            
   257:              !--------------------------------------------------------------------------------------
   258:            
   259:              subroutine MPIWrapperIRecv_dble_1d( &
   260:                & idep, im,                       & ! (in)
   261:                & buf,                            & ! (out)
   262:                & ireq                            & ! (out)
   263:                & )
   264:                !
   265:                ! 1D 倍精度配列の非ブロッキング通信(受信)
   266:                !
   267:                ! Non-blocking transfer (receive) of real(8) 1D array
   268:                !
   269:            
   270:                ! モジュール引用 ; USE statements
   271:                !
   272:            
   273:            
   274:                integer , intent(in ) :: idep
   275:                                          ! Process number of departure
   276:                integer , intent(in ) :: im
   277:                                          ! Size of 1st dimension of received data
   278:                real(DP), intent(out) :: buf( im )
   279:                                          ! Array to be received
   280:                integer , intent(out) :: ireq
   281:                                          ! Request number
   282:            
   283:            
   284:                ! 作業変数
   285:                ! Work variables
   286:                !
   287:                integer :: ierr
   288:                integer :: isize
   289:            
   290:            
   291:                isize = size( buf )
   292:            
   293:                call mpi_irecv( buf, isize, &
   294:                  mpi_double_precision, idep, 1, mpi_comm_world, &
   295:                  ireq, ierr )
   296:            
   297:              end subroutine MPIWrapperIRecv_dble_1d
   298:            
   299:              !--------------------------------------------------------------------------------------
   300:            
   301:              subroutine MPIWrapperISend_dble_2d( &
   302:                & idest, im, jm,                  & ! (in)
   303:                & buf,                            & ! (in)
   304:                & ireq                            & ! (out)
   305:                & )
   306:                !
   307:                ! 2D 倍精度配列の非ブロッキング通信(送信)
   308:                !
   309:                ! Non-blocking transfer (send) of real(8) 2D array
   310:                !
   311:            
   312:                ! モジュール引用 ; USE statements
   313:                !
   314:            
   315:            
   316:                integer , intent(in ) :: idest
   317:                                          ! Process number of destination
   318:                integer , intent(in ) :: im
   319:                                          ! Size of 1st dimension of sent data
   320:                integer , intent(in ) :: jm
   321:                                          ! Size of 2nd dimension of sent data
   322:                real(DP), intent(in ) :: buf( im, jm )
   323:                                          ! Array to be sent
   324:                integer , intent(out) :: ireq
   325:                                          ! Request number
   326:            
   327:                ! 作業変数
   328:                ! Work variables
   329:                !
   330:                integer :: ierr
   331:                integer :: isize
   332:            
   333:            
   334:                isize = size( buf )
   335:            
   336:                call mpi_isend( buf, isize, &
   337:                  mpi_double_precision, idest, 1, mpi_comm_world, &
   338:                  ireq, ierr )
   339:            
   340:              end subroutine MPIWrapperISend_dble_2d
   341:            
   342:              !--------------------------------------------------------------------------------------
   343:            
   344:              subroutine MPIWrapperIRecv_dble_2d( &
   345:                & idep, im, jm,                   & ! (in)
   346:                & buf,                            & ! (out)
   347:                & ireq                            & ! (out)
   348:                & )
   349:                !
   350:                ! 2D 倍精度配列の非ブロッキング通信(受信)
   351:                !
   352:                ! Non-blocking transfer (receive) of real(8) 2D array
   353:                !
   354:            
   355:                ! モジュール引用 ; USE statements
   356:                !
   357:            
   358:            
   359:                integer , intent(in ) :: idep
   360:                                          ! Process number of destination
   361:                integer , intent(in ) :: im
   362:                                          ! Size of 1st dimension of received data
   363:                integer , intent(in ) :: jm
   364:                                          ! Size of 2nd dimension of received data
   365:                real(DP), intent(out) :: buf( im, jm )
   366:                                          ! Array to be received
   367:                integer , intent(out) :: ireq
   368:                                          ! Request number
   369:            
   370:            
   371:                ! 作業変数
   372:                ! Work variables
   373:                !
   374:                integer :: ierr
   375:                integer :: isize
   376:            
   377:            
   378:                isize = size( buf )
   379:            
   380:                call mpi_irecv( buf, isize, &
   381:                  mpi_double_precision, idep, 1, mpi_comm_world, &
   382:                  ireq, ierr )
   383:            
   384:              end subroutine MPIWrapperIRecv_dble_2d
   385:            
   386:              !--------------------------------------------------------------------------------------
   387:            
   388:              subroutine MPIWrapperISend_dble_3d( &
   389:                & idest, im, jm, km,              & ! (in)
   390:                & buf,                            & ! (in)
   391:                & ireq                            & ! (out)
   392:                & )
   393:                !
   394:                ! 3D 倍精度配列の非ブロッキング通信(送信)
   395:                !
   396:                ! Non-blocking transfer (send) of real(8) 3D array
   397:                !
   398:            
   399:                ! モジュール引用 ; USE statements
   400:                !
   401:            
   402:            
   403:                integer , intent(in ) :: idest
   404:                                          ! Process number of destination
   405:                integer , intent(in ) :: im
   406:                                          ! Size of 1st dimension of sent data
   407:                integer , intent(in ) :: jm
   408:                                          ! Size of 2nd dimension of sent data
   409:                integer , intent(in ) :: km
   410:                                          ! Size of 3rd dimension of sent data
   411:                real(DP), intent(in ) :: buf( im, jm, km )
   412:                                          ! Array to be sent
   413:                integer , intent(out) :: ireq
   414:                                          ! Request number
   415:            
   416:            
   417:                ! 作業変数
   418:                ! Work variables
   419:                !
   420:                integer :: ierr
   421:                integer :: isize
   422:            
   423:            
   424:                isize = size( buf )
   425:            
   426:                call mpi_isend( buf, isize, &
   427:                  mpi_double_precision, idest, 1, mpi_comm_world, &
   428:                  ireq, ierr )
   429:            
   430:              end subroutine MPIWrapperISend_dble_3d
   431:            
   432:              !--------------------------------------------------------------------------------------
   433:            
   434:              subroutine MPIWrapperIRecv_dble_3d( &
   435:                & idep, im, jm, km,               & ! (in)
   436:                & buf,                            & ! (out)
   437:                & ireq                            & ! (out)
   438:                & )
   439:                !
   440:                ! 3D 倍精度配列の非ブロッキング通信(受信)
   441:                !
   442:                ! Non-blocking transfer (receive) of real(8) 3D array
   443:                !
   444:            
   445:                ! モジュール引用 ; USE statements
   446:                !
   447:            
   448:                integer , intent(in ) :: idep
   449:                                          ! Process number of departure
   450:                integer , intent(in ) :: im
   451:                                          ! Size of 1st dimension of received data
   452:                integer , intent(in ) :: jm
   453:                                          ! Size of 2nd dimension of received data
   454:                integer , intent(in ) :: km
   455:                                          ! Size of 3rd dimension of received data
   456:                real(DP), intent(out) :: buf( im, jm, km )
   457:                                          ! Array to be received
   458:                integer , intent(out) :: ireq
   459:                                          ! Request number
   460:            
   461:            
   462:                ! 作業変数
   463:                ! Work variables
   464:                !
   465:                integer :: ierr
   466:                integer :: isize
   467:            
   468:            
   469:                isize = size( buf )
   470:            
   471:                call mpi_irecv( buf, isize, &
   472:                  mpi_double_precision, idep, 1, mpi_comm_world, &
   473:                  ireq, ierr )
   474:            
   475:              end subroutine MPIWrapperIRecv_dble_3d
   476:            
   477:              !--------------------------------------------------------------------------------------
   478:            
   479:              subroutine MPIWrapperISend_dble_4d( &
   480:                & idest, im, jm, km, lm,          & ! (in)
   481:                & buf,                            & ! (in)
   482:                & ireq                            & ! (out)
   483:                & )
   484:                !
   485:                ! 4D 倍精度配列の非ブロッキング通信(送信)
   486:                !
   487:                ! Non-blocking transfer (send) of real(8) 4D array
   488:                !
   489:            
   490:                ! モジュール引用 ; USE statements
   491:                !
   492:            
   493:            
   494:                integer , intent(in ) :: idest
   495:                                          ! Process number of destination
   496:                integer , intent(in ) :: im
   497:                                          ! Size of 1st dimension of sent data
   498:                integer , intent(in ) :: jm
   499:                                          ! Size of 2nd dimension of sent data
   500:                integer , intent(in ) :: km
   501:                                          ! Size of 3rd dimension of sent data
   502:                integer , intent(in ) :: lm
   503:                                          ! Size of 4th dimension of sent data
   504:                real(DP), intent(in ) :: buf( im, jm, km, lm )
   505:                                          ! Array to be sent
   506:                integer , intent(out) :: ireq
   507:                                          ! Request number
   508:            
   509:                ! 作業変数
   510:                ! Work variables
   511:                !
   512:                integer :: ierr
   513:                integer :: isize
   514:            
   515:            
   516:                isize = size( buf )
   517:            
   518:                call mpi_isend( buf, isize, &
   519:                  mpi_double_precision, idest, 1, mpi_comm_world, &
   520:                  ireq, ierr )
   521:            
   522:              end subroutine MPIWrapperISend_dble_4d
   523:            
   524:              !--------------------------------------------------------------------------------------
   525:            
   526:              subroutine MPIWrapperIRecv_dble_4d( &
   527:                & idep, im, jm, km, lm,           & ! (in)
   528:                & buf,                            & ! (out)
   529:                & ireq                            & ! (out)
   530:                & )
   531:                !
   532:                ! 4D 倍精度配列の非ブロッキング通信(受信)
   533:                !
   534:                ! Non-blocking transfer (receive) of real(8) 4D array
   535:                !
   536:            
   537:                ! モジュール引用 ; USE statements
   538:                !
   539:            
   540:            
   541:                integer , intent(in ) :: idep
   542:                                          ! Process number of departure
   543:                integer , intent(in ) :: im
   544:                                          ! Size of 1st dimension of received data
   545:                integer , intent(in ) :: jm
   546:                                          ! Size of 2nd dimension of received data
   547:                integer , intent(in ) :: km
   548:                                          ! Size of 3rd dimension of received data
   549:                integer , intent(in ) :: lm
   550:                                          ! Size of 4th dimension of received data
   551:                real(DP), intent(out) :: buf( im, jm, km, lm )
   552:                                          ! Array to be received
   553:                integer , intent(out) :: ireq
   554:                                          ! Request number
   555:            
   556:            
   557:                ! 作業変数
   558:                ! Work variables
   559:                !
   560:                integer :: ierr
   561:                integer :: isize
   562:            
   563:            
   564:                isize = size( buf )
   565:            
   566:                call mpi_irecv( buf, isize, &
   567:                  mpi_double_precision, idep, 1, mpi_comm_world, &
   568:                  ireq, ierr )
   569:            
   570:              end subroutine MPIWrapperIRecv_dble_4d
   571:            
   572:              !--------------------------------------------------------------------------------------
   573:            
   574:            
   575:            end module mpi_wrapper
