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

  LINE  LEVEL( NO.): DIAGNOSTIC MESSAGE

    88  vec  (   4): Vectorized array expression.
    88  vec  (   4): Vectorized array expression.
    95  vec  (   1): Vectorized loop.
    95  vec  (   1): Vectorized loop.
   112  vec  (   1): Vectorized loop.
   112  vec  (   1): Vectorized loop.
   132  vec  (   1): Vectorized loop.
   132  vec  (   1): Vectorized loop.
   146  vec  (   1): Vectorized loop.
   146  vec  (   1): Vectorized loop.
   152  vec  (   4): Vectorized array expression.
   152  vec  (   4): Vectorized array expression.
   158  vec  (   3): Unvectorized loop.
   159  opt  (  11): Fused array assignments. :line 159 - 160
   159  vec  (   4): Vectorized array expression.
   159  vec  (   4): Vectorized array expression.
   166  vec  (   3): Unvectorized loop.
   167  opt  (  11): Fused array assignments. :line 167 - 168
   167  vec  (   4): Vectorized array expression.
   171  warn (  82): Name "ix" is not used.
   195  vec  (   1): Vectorized loop.
   195  vec  (   1): Vectorized loop.
   212  vec  (   1): Vectorized loop.
   212  vec  (   1): Vectorized loop.
   232  vec  (   1): Vectorized loop.
   232  vec  (   1): Vectorized loop.
   246  vec  (   1): Vectorized loop.
   246  vec  (   1): Vectorized loop.
   255  vec  (   3): Unvectorized loop.
   256  opt  (  11): Fused array assignments. :line 256 - 257
   256  vec  (   4): Vectorized array expression.
   256  vec  (   4): Vectorized array expression.
   263  vec  (   3): Unvectorized loop.
   264  opt  (  11): Fused array assignments. :line 264 - 265
   264  vec  (   4): Vectorized array expression.
   268  warn (  82): Name "ix" is not used.
   290  vec  (   1): Vectorized loop.
   290  vec  (   1): Vectorized loop.
   307  vec  (   1): Vectorized loop.
   307  vec  (   1): Vectorized loop.
   327  vec  (   1): Vectorized loop.
   327  vec  (   1): Vectorized loop.
   341  vec  (   1): Vectorized loop.
   341  vec  (   1): Vectorized loop.
   350  vec  (   3): Unvectorized loop.
   351  opt  (  11): Fused array assignments. :line 351 - 352
   351  vec  (   4): Vectorized array expression.
   351  vec  (   4): Vectorized array expression.
   358  opt  (  11): Fused array assignments. :line 358 - 359
   358  vec  (   4): Vectorized array expression.
   361  vec  (   3): Unvectorized loop.
   362  vec  (   4): Vectorized array expression.
   365  vec  (   3): Unvectorized loop.
   366  vec  (   4): Vectorized array expression.
   369  warn (  82): Name "ix" is not used.
Linux  R2.6.5-7.282-sn2 FORTRAN90/SX         Rev.360        Tue Oct 11 12:33:54 2011
FILE NAME: i.setmargin.F90
PROGRAM NAME: setmargin
TRANSFORMATION LIST

  LINE                   FORTRAN STATEMENT

     1  !---------------------------------------------------------------------
     2  !     Copyright (C) GFD Dennou Club, 2006. All rights reserved.
     3  !---------------------------------------------------------------------
     4  !
     5  != 3 次元 (xyz 方向) 不等間隔交互格子 境界条件モジュール
     6  !
     7  !* 履歴
     8  !  * 2007/07/15 (小高正嗣) : 3D deepconv へ移植, dc_types を Use.
     9  !  * 2006/06/07 (小高正嗣) : 新規作成
    10  
    11  module setmargin
    12    != 3 次元 (xyz 方向) 不等間隔交互格子 有限差分モデル用 境界条件モジュール
    13    !
    14    !== 概要
    15    !
    16    ! setmargin は, 3 次元 (xyz 方向) 不等間隔交互格子を用いた有限差分法に
    17    ! 基づく数値モデルのための, 境界条件設定 Fortran 90 副プログラムを提供
    18    ! する.
    19    !
    20    ! このモジュールは xyz_module の下位モジュールである. 下請けモジュール
    21    ! として data_type, xyz_base_module, x_bc_module, y_bc_module,
    22    ! z_bc_module モジュールを用いている.
    23    !
    24    !
    25    !== 手続きの命名法
    26    !
    27    ! 境界条件を設定する副プログラムは
    28    !
    29    !   Boundary[境界条件を示す文字列][...]_(入力配列の次元情報)
    30    !
    31    ! のように命名されている. 境界条件を示す文字列の種類は x_bc_module,
    32    ! y_bc_module, z_bc_module の場合と同じである.
    33    !
    34    !
    35    use dc_types, only : DP
    36    use gridset,  only : imin, imax, jmin, jmax, kmin, kmax,    &
    37      &                  xmg, ymg, zmg, nx, ny, nz, ncmax
    38  
    39    use mpi_wrapper, only : myrank, nprocs, &
    40      &                     MPIWrapperISend, MPIWrapperIRecv, MPIWrapperWait
    41  
    42  
    43    implicit none
    44  
    45    private
    46  
    47    public :: SetMargin_xyzf
    48    public :: SetMargin_xyz
    49    public :: SetMargin_pyz
    50    public :: SetMargin_xqz
    51    public :: SetMargin_xyr
    52  
    53    interface SetMargin_xyz
    54      module procedure SetMargin_aaz
    55    end interface
    56  
    57    interface SetMargin_pyz
    58      module procedure SetMargin_aaz
    59    end interface
    60  
    61    interface SetMargin_xqz
    62      module procedure SetMargin_aaz
    63    end interface
    64  
    65  contains
    66  
    67  !!!-------------------------------------------------------------
    68  
    69    subroutine SetMargin_xyzf(xyzf_Var)
    70  
    71      implicit none
    72      real(DP),intent(inout) :: xyzf_Var(imin:imax,jmin:jmax,kmin:kmax,1:ncmax)
    73      real(DP)           :: aaa_Var(imin:imax,jmin:jmax,kmin:kmax)
    74      integer            :: idest_a, idep_a, idest_b, idep_b
    75      integer, parameter :: nvars = 1
    76      real(8)            :: sbuf_a( Xmg, ny, nz )
    77      real(8)            :: rbuf_a( Xmg, ny, nz )
    78      real(8)            :: sbuf_b( Xmg, ny, nz )
    79      real(8)            :: rbuf_b( Xmg, ny, nz )
    80      integer            :: ireqs_a, ireqr_a, ireqs_b, ireqr_b
    81      integer            :: ix, jy, kz
    82      integer            :: i, j, k, s
    83  
    84  
    85      ! x 方向に周期境界条件を適用する
    86      !
    87      do s = 1, ncmax
    88        aaa_Var = xyzf_Var(:,:,:,s)
     .        if (aaa_var.DSC.U2 + 1 - aaa_var.DSC.L2 .gt. 0) then              
     .           J1 = and(aaa_var.DSC.U2 + 1 - aaa_var.DSC.L2,3)                
     .  !CDIR    NODEP                                                          
     .           do t368 = 1, J1                                                
     .  !CDIR       NODEP                                                       
     .              do t370 = 1, aaa_var.DSC.U1 + 1 - aaa_var.DSC.L1            
     .                 aaa_var(aaa_var.DSC.L1+t370-1,t368-1+aaa_var.DSC.L2,t366+
     .       1            aaa_var.DSC.L3) = xyzf_var(t39+t370-1,t368-1+t41,t366+
     .       2            t43,s)                                                
     .              end do                                                      
     .           end do                                                         
     .  !CDIR    NODEP                                                          
     .           do t368 = J1 + 1, aaa_var.DSC.U2 + 1 - aaa_var.DSC.L2, 4       
     .  !CDIR       NODEP                                                       
     .              do t370 = 1, aaa_var.DSC.U1 + 1 - aaa_var.DSC.L1            
     .                 aaa_var(aaa_var.DSC.L1+t370-1,t368-1+aaa_var.DSC.L2,t366+
     .       1            aaa_var.DSC.L3) = xyzf_var(t39+t370-1,t368-1+t41,t366+
     .       2            t43,s)                                                
     .                 aaa_var(aaa_var.DSC.L1+t370-1,t368+aaa_var.DSC.L2,t366+  
     .       1            aaa_var.DSC.L3) = xyzf_var(t39+t370-1,t368+t41,t366+  
     .       2            t43,s)                                                
     .                 aaa_var(aaa_var.DSC.L1+t370-1,t368+1+aaa_var.DSC.L2,t366+
     .       1            aaa_var.DSC.L3) = xyzf_var(t39+t370-1,t368+1+t41,t366+
     .       2            t43,s)                                                
     .                 aaa_var(aaa_var.DSC.L1+t370-1,t368+2+aaa_var.DSC.L2,t366+
     .       1            aaa_var.DSC.L3) = xyzf_var(t39+t370-1,t368+2+t41,t366+
     .       2            t43,s)                                                
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
    89  
    90        !-------------------------------
    91        ! 配列の右側を, ノード間で通信する.
    92        ! 送信する部分配列(sbuf_a)を用意する
    93        do k = 1, nz
    94          do j = 1, ny
    95            do i = 1, Xmg
    96              sbuf_a( i, j, k ) = aaa_var( nx + 1 - i , j, k )
    97            end do
    98          end do
     .        if (ny .gt. 0) then                                               
     .           J2 = and(ny,3)                                                 
     .           do j = 1, J2                                                   
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 sbuf_a(i,j,k) = aaa_var(nx+1-i,j,k)                      
     .              end do                                                      
     .           end do                                                         
     .           do j = J2 + 1, ny, 4                                           
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 sbuf_a(i,j,k) = aaa_var(nx+1-i,j,k)                      
     .                 sbuf_a(i,j+1,k) = aaa_var(nx+1-i,j+1,k)                  
     .                 sbuf_a(i,j+2,k) = aaa_var(nx+1-i,j+2,k)                  
     .                 sbuf_a(i,j+3,k) = aaa_var(nx+1-i,j+3,k)                  
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
    99        end do
   100  
   101        idest_a = mod(( myrank+1 )       , nprocs)   !送信先
   102        idep_a  = mod(( myrank-1 )+nprocs, nprocs)   !受信元
   103  
   104        call MPIWrapperISend( idest_a, xmg, ny, nz, sbuf_a, ireqs_a ) !送信
   105        call MPIWrapperIRecv( idep_a , xmg, ny, nz, rbuf_a, ireqr_a ) !受信
   106  
   107        !-------------------------------
   108        ! 配列の左側を, ノード間で通信する.
   109        ! 送信する部分配列(sbuf_b)を用意する
   110        do k = 1, nz
   111          do j = 1, ny
   112            do i = 1, Xmg
   113              sbuf_b( i, j, k ) = aaa_var( i, j, k )
   114            end do
   115          end do
     .        if (ny .gt. 0) then                                               
     .           J3 = and(ny,3)                                                 
     .           do j = 1, J3                                                   
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 sbuf_b(i,j,k) = aaa_var(i,j,k)                           
     .              end do                                                      
     .           end do                                                         
     .           do j = J3 + 1, ny, 4                                           
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 sbuf_b(i,j,k) = aaa_var(i,j,k)                           
     .                 sbuf_b(i,j+1,k) = aaa_var(i,j+1,k)                       
     .                 sbuf_b(i,j+2,k) = aaa_var(i,j+2,k)                       
     .                 sbuf_b(i,j+3,k) = aaa_var(i,j+3,k)                       
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   116        end do
   117  
   118        idest_b = mod(( myrank-1 )+nprocs, nprocs)    !送信先
   119        idep_b  = mod(( myrank+1 )       , nprocs)    !受信元
   120  
   121        call MPIWrapperISend( idest_b, xmg, ny, nz, sbuf_b, ireqs_b ) !送信
   122        call MPIWrapperIRecv( idep_b , xmg, ny, nz, rbuf_b, ireqr_b ) !受信
   123  
   124        !-------------------------------
   125        ! 配列の右側を, ノード間で通信する.
   126        ! 受信した部分配列(rbuf_a)を代入する.
   127        call MPIWrapperWait( ireqs_a )
   128        call MPIWrapperWait( ireqr_a )
   129  
   130        do k = 1, nz
   131          do j = 1, ny
   132            do i = 1, Xmg
   133              aaa_var( 1-i , j, k ) = rbuf_a( i, j, k )
   134            end do
   135          end do
     .        if (ny .gt. 0) then                                               
     .           J4 = and(ny,3)                                                 
     .           do j = 1, J4                                                   
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 aaa_var(1-i,j,k) = rbuf_a(i,j,k)                         
     .              end do                                                      
     .           end do                                                         
     .           do j = J4 + 1, ny, 4                                           
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 aaa_var(1-i,j,k) = rbuf_a(i,j,k)                         
     .                 aaa_var(1-i,j+1,k) = rbuf_a(i,j+1,k)                     
     .                 aaa_var(1-i,j+2,k) = rbuf_a(i,j+2,k)                     
     .                 aaa_var(1-i,j+3,k) = rbuf_a(i,j+3,k)                     
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   136        end do
   137  
   138        !-------------------------------
   139        ! 配列の左側を, ノード間で通信する.
   140        ! 受信した部分配列(rbuf_b)を代入する.
   141        call MPIWrapperWait( ireqs_b )
   142        call MPIWrapperWait( ireqr_b )
   143  
   144        do k = 1, nz
   145          do j = 1, ny
   146            do i = 1, Xmg
   147              aaa_var(nx + i , j, k ) = rbuf_b( i, j, k )
   148            end do
   149          end do
     .        if (ny .gt. 0) then                                               
     .           J5 = and(ny,3)                                                 
     .           do j = 1, J5                                                   
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 aaa_var(nx+i,j,k) = rbuf_b(i,j,k)                        
     .              end do                                                      
     .           end do                                                         
     .           do j = J5 + 1, ny, 4                                           
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 aaa_var(nx+i,j,k) = rbuf_b(i,j,k)                        
     .                 aaa_var(nx+i,j+1,k) = rbuf_b(i,j+1,k)                    
     .                 aaa_var(nx+i,j+2,k) = rbuf_b(i,j+2,k)                    
     .                 aaa_var(nx+i,j+3,k) = rbuf_b(i,j+3,k)                    
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   150        end do
   151  
   152        xyzf_Var(:,:,:,s) = aaa_Var
     .        if (jmax + 1 - jmin .gt. 0) then                                  
     .           J6 = and(jmax + 1 - jmin,3)                                    
     .  !CDIR    NODEP                                                          
     .           do t380 = 1, J6                                                
     .  !CDIR       NODEP                                                       
     .              do t382 = 1, imax + 1 - imin                                
     .                 xyzf_var(t39+t382-1,t380-1+t41,t378+t43,s) = aaa_var(    
     .       1            aaa_var.DSC.L1+t382-1,t380-1+aaa_var.DSC.L2,t378+     
     .       2            aaa_var.DSC.L3)                                       
     .              end do                                                      
     .           end do                                                         
     .  !CDIR    NODEP                                                          
     .           do t380 = J6 + 1, jmax + 1 - jmin, 4                           
     .  !CDIR       NODEP                                                       
     .              do t382 = 1, imax + 1 - imin                                
     .                 xyzf_var(t39+t382-1,t380-1+t41,t378+t43,s) = aaa_var(    
     .       1            aaa_var.DSC.L1+t382-1,t380-1+aaa_var.DSC.L2,t378+     
     .       2            aaa_var.DSC.L3)                                       
     .                 xyzf_var(t39+t382-1,t380+t41,t378+t43,s) = aaa_var(      
     .       1            aaa_var.DSC.L1+t382-1,t380+aaa_var.DSC.L2,t378+       
     .       2            aaa_var.DSC.L3)                                       
     .                 xyzf_var(t39+t382-1,t380+1+t41,t378+t43,s) = aaa_var(    
     .       1            aaa_var.DSC.L1+t382-1,t380+1+aaa_var.DSC.L2,t378+     
     .       2            aaa_var.DSC.L3)                                       
     .                 xyzf_var(t39+t382-1,t380+2+t41,t378+t43,s) = aaa_var(    
     .       1            aaa_var.DSC.L1+t382-1,t380+2+aaa_var.DSC.L2,t378+     
     .       2            aaa_var.DSC.L3)                                       
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   153      end do
   154  
   155      ! y 方向に周期境界条件を適用する
   156      !
   157      if (ymg /= 0) then
   158        do jy = 1, ymg
   159          xyzf_Var(:,1-jy,:,:)  = xyzf_Var(:,ny+1-jy,:,:)
     .        if (kmax + 1 - kmin .gt. 0) then                                  
     .           J7 = and(kmax + 1 - kmin,1)                                    
     .  !CDIR    NODEP                                                          
     .           do t410 = 1, J7                                                
     .  !CDIR       NODEP                                                       
     .              do t412 = 1, imax + 1 - imin                                
     .                 xyzf_var(t39+t412-1,1-jy,t410-1+t43,t408+1) = xyzf_var(  
     .       1            t39+t412-1,ny-jy+1,t410-1+t43,t408+1)                 
     .                 xyzf_var(t39+t412-1,jy+ny,t410-1+t43,t408+1) = xyzf_var( 
     .       1            t39+t412-1,jy,t410-1+t43,t408+1)                      
     .              end do                                                      
     .           end do                                                         
     .  !CDIR    NODEP                                                          
     .           do t410 = J7 + 1, kmax + 1 - kmin, 2                           
     .  !CDIR       NODEP                                                       
     .              do t412 = 1, imax + 1 - imin                                
     .                 xyzf_var(t39+t412-1,1-jy,t410-1+t43,t408+1) = xyzf_var(  
     .       1            t39+t412-1,ny-jy+1,t410-1+t43,t408+1)                 
     .                 xyzf_var(t39+t412-1,1-jy,t410+t43,t408+1) = xyzf_var(t39+
     .       1            t412-1,ny-jy+1,t410+t43,t408+1)                       
     .                 xyzf_var(t39+t412-1,jy+ny,t410-1+t43,t408+1) = xyzf_var( 
     .       1            t39+t412-1,jy,t410-1+t43,t408+1)                      
     .                 xyzf_var(t39+t412-1,jy+ny,t410+t43,t408+1) = xyzf_var(t39
     .       1            +t412-1,jy,t410+t43,t408+1)                           
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   160          xyzf_Var(:,ny+jy,:,:) = xyzf_Var(:,jy,:,:)
   161        end do
   162      end if
   163  
   164      ! z 方向に対称境界条件を適用する
   165      !
   166      do kz = 1, zmg
   167        xyzf_Var(:,:,1-kz,:)  = xyzf_Var(:,:,kz,:)
     .  !CDIR NODEP                                                             
     .  !CDIR NOASSUME                                                          
     .        do t392 = 1, (jmax + 1 - jmin)*(imax + 1 - imin)                  
     .           xyzf_var(t39+t392-1,t41,1-kz,t390+1) = xyzf_var(t39+t392-1,t41,
     .       1      kz,t390+1)                                                  
     .           xyzf_var(t39+t392-1,t41,kz+nz,t390+1) = xyzf_var(t39+t392-1,t41
     .       1      ,nz-kz+1,t390+1)                                            
     .        end do                                                            
   168        xyzf_Var(:,:,nz+kz,:) = xyzf_Var(:,:,nz+1-kz,:)
   169      end do
   170  
   171    end subroutine SetMargin_xyzf
   172  
   173  
   174    subroutine SetMargin_aaz(aaz_Var)
   175  
   176      implicit none
   177      real(DP),intent(inout) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax)
   178      integer            :: idest_a, idep_a, idest_b, idep_b
   179      integer, parameter :: nvars = 1
   180      real(8)            :: sbuf_a( Xmg, ny, nz )
   181      real(8)            :: rbuf_a( Xmg, ny, nz )
   182      real(8)            :: sbuf_b( Xmg, ny, nz )
   183      real(8)            :: rbuf_b( Xmg, ny, nz )
   184      integer            :: ireqs_a, ireqr_a, ireqs_b, ireqr_b
   185      integer            :: ix, jy, kz
   186      integer            :: i, j, k
   187  
   188      ! x 方向に周期境界条件を適用する
   189      !
   190      !-------------------------------
   191      ! 配列の右側を, ノード間で通信する.
   192      ! 送信する部分配列(sbuf_a)を用意する
   193      do k = 1, nz
   194        do j = 1, ny
   195          do i = 1, Xmg
   196            sbuf_a( i, j, k ) = aaz_var( nx + 1 - i , j, k )
   197          end do
   198        end do
     .        if (ny .gt. 0) then                                               
     .           J1 = and(ny,3)                                                 
     .           do j = 1, J1                                                   
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 sbuf_a(i,j,k) = aaz_var(nx+1-i,j,k)                      
     .              end do                                                      
     .           end do                                                         
     .           do j = J1 + 1, ny, 4                                           
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 sbuf_a(i,j,k) = aaz_var(nx+1-i,j,k)                      
     .                 sbuf_a(i,j+1,k) = aaz_var(nx+1-i,j+1,k)                  
     .                 sbuf_a(i,j+2,k) = aaz_var(nx+1-i,j+2,k)                  
     .                 sbuf_a(i,j+3,k) = aaz_var(nx+1-i,j+3,k)                  
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   199      end do
   200  
   201      idest_a = mod(( myrank+1 )       , nprocs)   !送信先
   202      idep_a  = mod(( myrank-1 )+nprocs, nprocs)   !受信元
   203  
   204      call MPIWrapperISend( idest_a, xmg, ny, nz, sbuf_a, ireqs_a ) !送信
   205      call MPIWrapperIRecv( idep_a , xmg, ny, nz, rbuf_a, ireqr_a ) !受信
   206  
   207      !-------------------------------
   208      ! 配列の左側を, ノード間で通信する.
   209      ! 送信する部分配列(sbuf_b)を用意する
   210      do k = 1, nz
   211        do j = 1, ny
   212          do i = 1, Xmg
   213            sbuf_b( i, j, k ) = aaz_var( i, j, k )
   214          end do
   215        end do
     .        if (ny .gt. 0) then                                               
     .           J2 = and(ny,3)                                                 
     .           do j = 1, J2                                                   
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 sbuf_b(i,j,k) = aaz_var(i,j,k)                           
     .              end do                                                      
     .           end do                                                         
     .           do j = J2 + 1, ny, 4                                           
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 sbuf_b(i,j,k) = aaz_var(i,j,k)                           
     .                 sbuf_b(i,j+1,k) = aaz_var(i,j+1,k)                       
     .                 sbuf_b(i,j+2,k) = aaz_var(i,j+2,k)                       
     .                 sbuf_b(i,j+3,k) = aaz_var(i,j+3,k)                       
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   216      end do
   217  
   218      idest_b = mod(( myrank-1 )+nprocs, nprocs)    !送信先
   219      idep_b  = mod(( myrank+1 )       , nprocs)    !受信元
   220  
   221      call MPIWrapperISend( idest_b, xmg, ny, nz, sbuf_b, ireqs_b ) !送信
   222      call MPIWrapperIRecv( idep_b , xmg, ny, nz, rbuf_b, ireqr_b ) !受信
   223  
   224      !-------------------------------
   225      ! 配列の右側を, ノード間で通信する.
   226      ! 受信した部分配列(rbuf_a)を代入する.
   227      call MPIWrapperWait( ireqs_a )
   228      call MPIWrapperWait( ireqr_a )
   229  
   230      do k = 1, nz
   231        do j = 1, ny
   232          do i = 1, Xmg
   233            aaz_var( 1-i , j, k ) = rbuf_a( i, j, k )
   234          end do
   235        end do
     .        if (ny .gt. 0) then                                               
     .           J3 = and(ny,3)                                                 
     .           do j = 1, J3                                                   
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 aaz_var(1-i,j,k) = rbuf_a(i,j,k)                         
     .              end do                                                      
     .           end do                                                         
     .           do j = J3 + 1, ny, 4                                           
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 aaz_var(1-i,j,k) = rbuf_a(i,j,k)                         
     .                 aaz_var(1-i,j+1,k) = rbuf_a(i,j+1,k)                     
     .                 aaz_var(1-i,j+2,k) = rbuf_a(i,j+2,k)                     
     .                 aaz_var(1-i,j+3,k) = rbuf_a(i,j+3,k)                     
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   236      end do
   237  
   238      !-------------------------------
   239      ! 配列の左側を, ノード間で通信する.
   240      ! 受信した部分配列(rbuf_b)を代入する.
   241      call MPIWrapperWait( ireqs_b )
   242      call MPIWrapperWait( ireqr_b )
   243  
   244      do k = 1, nz
   245        do j = 1, ny
   246          do i = 1, Xmg
   247            aaz_var(nx + i , j, k ) = rbuf_b( i, j, k )
   248          end do
   249        end do
     .        if (ny .gt. 0) then                                               
     .           J4 = and(ny,3)                                                 
     .           do j = 1, J4                                                   
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 aaz_var(nx+i,j,k) = rbuf_b(i,j,k)                        
     .              end do                                                      
     .           end do                                                         
     .           do j = J4 + 1, ny, 4                                           
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 aaz_var(nx+i,j,k) = rbuf_b(i,j,k)                        
     .                 aaz_var(nx+i,j+1,k) = rbuf_b(i,j+1,k)                    
     .                 aaz_var(nx+i,j+2,k) = rbuf_b(i,j+2,k)                    
     .                 aaz_var(nx+i,j+3,k) = rbuf_b(i,j+3,k)                    
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   250      end do
   251  
   252      ! y 方向に周期境界条件を適用する
   253      !
   254      if (ymg /= 0) then
   255        do jy = 1, ymg
   256          aaz_Var(:,1-jy,:)  = aaz_Var(:,ny+1-jy,:)
     .        if (kmax + 1 - kmin .gt. 0) then                                  
     .           J5 = and(kmax + 1 - kmin,1)                                    
     .  !CDIR    NODEP                                                          
     .           do t331 = 1, J5                                                
     .  !CDIR       NODEP                                                       
     .              do t333 = 1, imax + 1 - imin                                
     .                 aaz_var(t29+t333-1,1-jy,t331-1+t33) = aaz_var(t29+t333-1,
     .       1            ny-jy+1,t331-1+t33)                                   
     .                 aaz_var(t29+t333-1,jy+ny,t331-1+t33) = aaz_var(t29+t333-1
     .       1            ,jy,t331-1+t33)                                       
     .              end do                                                      
     .           end do                                                         
     .  !CDIR    NODEP                                                          
     .           do t331 = J5 + 1, kmax + 1 - kmin, 2                           
     .  !CDIR       NODEP                                                       
     .              do t333 = 1, imax + 1 - imin                                
     .                 aaz_var(t29+t333-1,1-jy,t331-1+t33) = aaz_var(t29+t333-1,
     .       1            ny-jy+1,t331-1+t33)                                   
     .                 aaz_var(t29+t333-1,1-jy,t331+t33) = aaz_var(t29+t333-1,ny
     .       1            -jy+1,t331+t33)                                       
     .                 aaz_var(t29+t333-1,jy+ny,t331-1+t33) = aaz_var(t29+t333-1
     .       1            ,jy,t331-1+t33)                                       
     .                 aaz_var(t29+t333-1,jy+ny,t331+t33) = aaz_var(t29+t333-1, 
     .       1            jy,t331+t33)                                          
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   257          aaz_Var(:,ny+jy,:) = aaz_Var(:,jy,:)
   258        end do
   259      end if
   260  
   261      ! z 方向に対称境界条件を適用する
   262      !
   263      do kz = 1, zmg
   264        aaz_Var(:,:,1-kz)  = aaz_Var(:,:,kz)
     .  !CDIR NODEP                                                             
     .  !CDIR NOASSUME                                                          
     .        do t319 = 1, (jmax + 1 - jmin)*(imax + 1 - imin)                  
     .           aaz_var(t29+t319-1,t31,1-kz) = aaz_var(t29+t319-1,t31,kz)      
     .           aaz_var(t29+t319-1,t31,kz+nz) = aaz_var(t29+t319-1,t31,nz-kz+1)
     .        end do                                                            
   265        aaz_Var(:,:,nz+kz) = aaz_Var(:,:,nz+1-kz)
   266      end do
   267  
   268    end subroutine SetMargin_aaz
   269  
   270  
   271    subroutine SetMargin_xyr(xyr_Var)
   272  
   273      implicit none
   274      real(DP),intent(inout) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax)
   275      integer            :: idest_a, idep_a, idest_b, idep_b
   276      integer, parameter :: nvars = 1
   277      real(8)            :: sbuf_a( Xmg, ny, nz )
   278      real(8)            :: rbuf_a( Xmg, ny, nz )
   279      real(8)            :: sbuf_b( Xmg, ny, nz )
   280      real(8)            :: rbuf_b( Xmg, ny, nz )
   281      integer            :: ireqs_a, ireqr_a, ireqs_b, ireqr_b
   282      integer            :: ix, jy, kz
   283      integer            :: i, j, k
   284  
   285      !-------------------------------
   286      ! 配列の右側を, ノード間で通信する.
   287      ! 送信する部分配列(sbuf_a)を用意する
   288      do k = 1, nz
   289        do j = 1, ny
   290          do i = 1, Xmg
   291            sbuf_a( i, j, k ) = xyr_var( nx + 1 - i , j, k )
   292          end do
   293        end do
     .        if (ny .gt. 0) then                                               
     .           J1 = and(ny,3)                                                 
     .           do j = 1, J1                                                   
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 sbuf_a(i,j,k) = xyr_var(nx+1-i,j,k)                      
     .              end do                                                      
     .           end do                                                         
     .           do j = J1 + 1, ny, 4                                           
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 sbuf_a(i,j,k) = xyr_var(nx+1-i,j,k)                      
     .                 sbuf_a(i,j+1,k) = xyr_var(nx+1-i,j+1,k)                  
     .                 sbuf_a(i,j+2,k) = xyr_var(nx+1-i,j+2,k)                  
     .                 sbuf_a(i,j+3,k) = xyr_var(nx+1-i,j+3,k)                  
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   294      end do
   295  
   296      idest_a = mod(( myrank+1 )       , nprocs)   !送信先
   297      idep_a  = mod(( myrank-1 )+nprocs, nprocs)   !受信元
   298  
   299      call MPIWrapperISend( idest_a, xmg, ny, nz, sbuf_a, ireqs_a ) !送信
   300      call MPIWrapperIRecv( idep_a , xmg, ny, nz, rbuf_a, ireqr_a ) !受信
   301  
   302      !-------------------------------
   303      ! 配列の左側を, ノード間で通信する.
   304      ! 送信する部分配列(sbuf_b)を用意する
   305      do k = 1, nz
   306        do j = 1, ny
   307          do i = 1, Xmg
   308            sbuf_b( i, j, k ) = xyr_var( i, j, k )
   309          end do
   310        end do
     .        if (ny .gt. 0) then                                               
     .           J2 = and(ny,3)                                                 
     .           do j = 1, J2                                                   
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 sbuf_b(i,j,k) = xyr_var(i,j,k)                           
     .              end do                                                      
     .           end do                                                         
     .           do j = J2 + 1, ny, 4                                           
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 sbuf_b(i,j,k) = xyr_var(i,j,k)                           
     .                 sbuf_b(i,j+1,k) = xyr_var(i,j+1,k)                       
     .                 sbuf_b(i,j+2,k) = xyr_var(i,j+2,k)                       
     .                 sbuf_b(i,j+3,k) = xyr_var(i,j+3,k)                       
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   311      end do
   312  
   313      idest_b = mod(( myrank-1 )+nprocs, nprocs)    !送信先
   314      idep_b  = mod(( myrank+1 )       , nprocs)    !受信元
   315  
   316      call MPIWrapperISend( idest_b, xmg, ny, nz, sbuf_b, ireqs_b ) !送信
   317      call MPIWrapperIRecv( idep_b , xmg, ny, nz, rbuf_b, ireqr_b ) !受信
   318  
   319      !-------------------------------
   320      ! 配列の右側を, ノード間で通信する.
   321      ! 受信した部分配列(rbuf_a)を代入する.
   322      call MPIWrapperWait( ireqs_a )
   323      call MPIWrapperWait( ireqr_a )
   324  
   325      do k = 1, nz
   326        do j = 1, ny
   327          do i = 1, Xmg
   328            xyr_var( 1-i , j, k ) = rbuf_a( i, j, k )
   329          end do
   330        end do
     .        if (ny .gt. 0) then                                               
     .           J3 = and(ny,3)                                                 
     .           do j = 1, J3                                                   
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 xyr_var(1-i,j,k) = rbuf_a(i,j,k)                         
     .              end do                                                      
     .           end do                                                         
     .           do j = J3 + 1, ny, 4                                           
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 xyr_var(1-i,j,k) = rbuf_a(i,j,k)                         
     .                 xyr_var(1-i,j+1,k) = rbuf_a(i,j+1,k)                     
     .                 xyr_var(1-i,j+2,k) = rbuf_a(i,j+2,k)                     
     .                 xyr_var(1-i,j+3,k) = rbuf_a(i,j+3,k)                     
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   331      end do
   332  
   333      !-------------------------------
   334      ! 配列の左側を, ノード間で通信する.
   335      ! 受信した部分配列(rbuf_b)を代入する.
   336      call MPIWrapperWait( ireqs_b )
   337      call MPIWrapperWait( ireqr_b )
   338  
   339      do k = 1, nz
   340        do j = 1, ny
   341          do i = 1, Xmg
   342            xyr_var(nx + i , j, k ) = rbuf_b( i, j, k )
   343          end do
   344        end do
     .        if (ny .gt. 0) then                                               
     .           J4 = and(ny,3)                                                 
     .           do j = 1, J4                                                   
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 xyr_var(nx+i,j,k) = rbuf_b(i,j,k)                        
     .              end do                                                      
     .           end do                                                         
     .           do j = J4 + 1, ny, 4                                           
     .  !CDIR       NODEP                                                       
     .              do i = 1, xmg                                               
     .                 xyr_var(nx+i,j,k) = rbuf_b(i,j,k)                        
     .                 xyr_var(nx+i,j+1,k) = rbuf_b(i,j+1,k)                    
     .                 xyr_var(nx+i,j+2,k) = rbuf_b(i,j+2,k)                    
     .                 xyr_var(nx+i,j+3,k) = rbuf_b(i,j+3,k)                    
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   345      end do
   346  
   347      ! y 方向に周期境界条件を適用する
   348      !
   349      if (ymg /= 0) then
   350        do jy = 1, ymg
   351          xyr_Var(:,1-jy,:)  = xyr_Var(:,ny+1-jy,:)
     .        if (kmax + 1 - kmin .gt. 0) then                                  
     .           J5 = and(kmax + 1 - kmin,1)                                    
     .  !CDIR    NODEP                                                          
     .           do t361 = 1, J5                                                
     .  !CDIR       NODEP                                                       
     .              do t363 = 1, imax + 1 - imin                                
     .                 xyr_var(t29+t363-1,1-jy,t361-1+t33) = xyr_var(t29+t363-1,
     .       1            ny-jy+1,t361-1+t33)                                   
     .                 xyr_var(t29+t363-1,jy+ny,t361-1+t33) = xyr_var(t29+t363-1
     .       1            ,jy,t361-1+t33)                                       
     .              end do                                                      
     .           end do                                                         
     .  !CDIR    NODEP                                                          
     .           do t361 = J5 + 1, kmax + 1 - kmin, 2                           
     .  !CDIR       NODEP                                                       
     .              do t363 = 1, imax + 1 - imin                                
     .                 xyr_var(t29+t363-1,1-jy,t361-1+t33) = xyr_var(t29+t363-1,
     .       1            ny-jy+1,t361-1+t33)                                   
     .                 xyr_var(t29+t363-1,1-jy,t361+t33) = xyr_var(t29+t363-1,ny
     .       1            -jy+1,t361+t33)                                       
     .                 xyr_var(t29+t363-1,jy+ny,t361-1+t33) = xyr_var(t29+t363-1
     .       1            ,jy,t361-1+t33)                                       
     .                 xyr_var(t29+t363-1,jy+ny,t361+t33) = xyr_var(t29+t363-1, 
     .       1            jy,t361+t33)                                          
     .              end do                                                      
     .           end do                                                         
     .        endif                                                             
   352          xyr_Var(:,ny+jy,:) = xyr_Var(:,jy,:)
   353        end do
   354      end if
   355  
   356      ! z 方向に反対称境界条件を適用する
   357      !
   358      xyr_Var(:,:,0) = 0.0d0
     .  !CDIR NODEP                                                             
     .  !CDIR NOASSUME                                                          
     .        do t337 = 1, (jmax + 1 - jmin)*(imax + 1 - imin)                  
     .           xyr_var(t29+t337-1,t31,0) = 0.0000000000000000e+000            
     .           xyr_var(t29+t337-1,t31,nz) = 0.0000000000000000e+000           
     .        end do                                                            
   359      xyr_Var(:,:,nz) = 0.0d0
   360  
   361      do kz = 1, zmg-1
   362        xyr_Var(:,:,-kz) = - xyr_Var(:,:,kz)
     .  !CDIR NODEP                                                             
     .  !CDIR NOASSUME                                                          
     .        do t345 = 1, (jmax + 1 - jmin)*(imax + 1 - imin)                  
     .           xyr_var(t29+t345-1,t31,(-kz)) = -xyr_var(t29+t345-1,t31,kz)    
     .        end do                                                            
   363      end do
   364  
   365      do kz = 1, zmg
   366        xyr_Var(:,:,nz+kz) = - xyr_Var(:,:,nz-kz)
     .  !CDIR NODEP                                                             
     .  !CDIR NOASSUME                                                          
     .        do t353 = 1, (jmax + 1 - jmin)*(imax + 1 - imin)                  
     .           xyr_var(t29+t353-1,t31,kz+nz) = -xyr_var(t29+t353-1,t31,nz-kz) 
     .        end do                                                            
   367      end do
   368  
   369    end subroutine SetMargin_xyr
   370  
   371  !!!---------------------------------------------
   372  
   373  
   374  end module setmargin
Linux  R2.6.5-7.282-sn2 FORTRAN90/SX         Rev.360        Tue Oct 11 12:33:54 2011
FILE NAME: i.setmargin.F90
PROGRAM NAME: setmargin
FORMAT LIST

  LINE    LOOP     FORTRAN STATEMENT

     1:            !---------------------------------------------------------------------
     2:            !     Copyright (C) GFD Dennou Club, 2006. All rights reserved.
     3:            !---------------------------------------------------------------------
     4:            !
     5:            != 3 次元 (xyz 方向) 不等間隔交互格子 境界条件モジュール
     6:            !
     7:            !* 履歴
     8:            !  * 2007/07/15 (小高正嗣) : 3D deepconv へ移植, dc_types を Use.
     9:            !  * 2006/06/07 (小高正嗣) : 新規作成
    10:            
    11:            module setmargin
    12:              != 3 次元 (xyz 方向) 不等間隔交互格子 有限差分モデル用 境界条件モジュール
    13:              !
    14:              !== 概要
    15:              !
    16:              ! setmargin は, 3 次元 (xyz 方向) 不等間隔交互格子を用いた有限差分法に
    17:              ! 基づく数値モデルのための, 境界条件設定 Fortran 90 副プログラムを提供
    18:              ! する.
    19:              !
    20:              ! このモジュールは xyz_module の下位モジュールである. 下請けモジュール
    21:              ! として data_type, xyz_base_module, x_bc_module, y_bc_module, 
    22:              ! z_bc_module モジュールを用いている. 
    23:              !
    24:              !
    25:              !== 手続きの命名法
    26:              !
    27:              ! 境界条件を設定する副プログラムは
    28:              !
    29:              !   Boundary[境界条件を示す文字列][...]_(入力配列の次元情報)
    30:              !
    31:              ! のように命名されている. 境界条件を示す文字列の種類は x_bc_module,
    32:              ! y_bc_module, z_bc_module の場合と同じである.
    33:              ! 
    34:              !
    35:              use dc_types, only : DP
    36:              use gridset,  only : imin, imax, jmin, jmax, kmin, kmax,    &
    37:                &                  xmg, ymg, zmg, nx, ny, nz, ncmax
    38:            
    39:              use mpi_wrapper, only : myrank, nprocs, &
    40:                &                     MPIWrapperISend, MPIWrapperIRecv, MPIWrapperWait
    41:            
    42:            
    43:              implicit none
    44:            
    45:              private
    46:            
    47:              public :: SetMargin_xyzf 
    48:              public :: SetMargin_xyz
    49:              public :: SetMargin_pyz
    50:              public :: SetMargin_xqz
    51:              public :: SetMargin_xyr
    52:            
    53:              interface SetMargin_xyz
    54:                module procedure SetMargin_aaz
    55:              end interface
    56:            
    57:              interface SetMargin_pyz
    58:                module procedure SetMargin_aaz
    59:              end interface
    60:            
    61:              interface SetMargin_xqz
    62:                module procedure SetMargin_aaz
    63:              end interface
    64:              
    65:            contains
    66:            
    67:            !!!-------------------------------------------------------------
    68:            
    69:              subroutine SetMargin_xyzf(xyzf_Var)
    70:            
    71:                implicit none
    72:                real(DP),intent(inout) :: xyzf_Var(imin:imax,jmin:jmax,kmin:kmax,1:ncmax) 
    73:                real(DP)           :: aaa_Var(imin:imax,jmin:jmax,kmin:kmax) 
    74:                integer            :: idest_a, idep_a, idest_b, idep_b
    75:                integer, parameter :: nvars = 1
    76:                real(8)            :: sbuf_a( Xmg, ny, nz )
    77:                real(8)            :: rbuf_a( Xmg, ny, nz )
    78:                real(8)            :: sbuf_b( Xmg, ny, nz )
    79:                real(8)            :: rbuf_b( Xmg, ny, nz )
    80:                integer            :: ireqs_a, ireqr_a, ireqs_b, ireqr_b
    81:                integer            :: ix, jy, kz
    82:                integer            :: i, j, k, s
    83:            
    84:            
    85:                ! x 方向に周期境界条件を適用する
    86:                !
    87: +------>       do s = 1, ncmax
    88: |++V===          aaa_Var = xyzf_Var(:,:,:,s)
    89: |              
    90: |                !-------------------------------
    91: |                ! 配列の右側を, ノード間で通信する.
    92: |                ! 送信する部分配列(sbuf_a)を用意する
    93: |+----->         do k = 1, nz
    94: ||+---->           do j = 1, ny
    95: |||V--->             do i = 1, Xmg
    96: ||||                   sbuf_a( i, j, k ) = aaa_var( nx + 1 - i , j, k ) 
    97: |||V---              end do
    98: ||+----            end do
    99: |+-----          end do
   100: |                
   101: |                idest_a = mod(( myrank+1 )       , nprocs)   !送信先
   102: |                idep_a  = mod(( myrank-1 )+nprocs, nprocs)   !受信元
   103: |                
   104: |                call MPIWrapperISend( idest_a, xmg, ny, nz, sbuf_a, ireqs_a ) !送信
   105: |                call MPIWrapperIRecv( idep_a , xmg, ny, nz, rbuf_a, ireqr_a ) !受信
   106: |                
   107: |                !-------------------------------
   108: |                ! 配列の左側を, ノード間で通信する.
   109: |                ! 送信する部分配列(sbuf_b)を用意する
   110: |+----->         do k = 1, nz
   111: ||+---->           do j = 1, ny
   112: |||V--->             do i = 1, Xmg
   113: ||||                   sbuf_b( i, j, k ) = aaa_var( i, j, k ) 
   114: |||V---              end do
   115: ||+----            end do
   116: |+-----          end do
   117: |                
   118: |                idest_b = mod(( myrank-1 )+nprocs, nprocs)    !送信先
   119: |                idep_b  = mod(( myrank+1 )       , nprocs)    !受信元
   120: |                
   121: |                call MPIWrapperISend( idest_b, xmg, ny, nz, sbuf_b, ireqs_b ) !送信
   122: |                call MPIWrapperIRecv( idep_b , xmg, ny, nz, rbuf_b, ireqr_b ) !受信
   123: |          
   124: |                !-------------------------------
   125: |                ! 配列の右側を, ノード間で通信する.
   126: |                ! 受信した部分配列(rbuf_a)を代入する.
   127: |                call MPIWrapperWait( ireqs_a )
   128: |                call MPIWrapperWait( ireqr_a )
   129: |                
   130: |+----->         do k = 1, nz
   131: ||+---->           do j = 1, ny
   132: |||V--->             do i = 1, Xmg
   133: ||||                   aaa_var( 1-i , j, k ) = rbuf_a( i, j, k ) 
   134: |||V---              end do
   135: ||+----            end do
   136: |+-----          end do
   137: |                
   138: |                !-------------------------------
   139: |                ! 配列の左側を, ノード間で通信する.
   140: |                ! 受信した部分配列(rbuf_b)を代入する.
   141: |                call MPIWrapperWait( ireqs_b )
   142: |                call MPIWrapperWait( ireqr_b )
   143: |                
   144: |+----->         do k = 1, nz
   145: ||+---->           do j = 1, ny
   146: |||V--->             do i = 1, Xmg
   147: ||||                   aaa_var(nx + i , j, k ) = rbuf_b( i, j, k ) 
   148: |||V---              end do
   149: ||+----            end do
   150: |+-----          end do
   151: |          
   152: |++V===          xyzf_Var(:,:,:,s) = aaa_Var
   153: +------        end do
   154:            
   155:                ! y 方向に周期境界条件を適用する
   156:                !
   157:                if (ymg /= 0) then 
   158: +------>         do jy = 1, ymg
   159: |**V--->           xyzf_Var(:,1-jy,:,:)  = xyzf_Var(:,ny+1-jy,:,:)
   160: |**V---            xyzf_Var(:,ny+jy,:,:) = xyzf_Var(:,jy,:,:)
   161: +------          end do
   162:                end if
   163:                
   164:                ! z 方向に対称境界条件を適用する
   165:                !
   166: +------>       do kz = 1, zmg
   167: |**W--->         xyzf_Var(:,:,1-kz,:)  = xyzf_Var(:,:,kz,:)
   168: |**W---          xyzf_Var(:,:,nz+kz,:) = xyzf_Var(:,:,nz+1-kz,:)
   169: +------        end do
   170:                
   171:              end subroutine SetMargin_xyzf
   172:            
   173:            
   174:              subroutine SetMargin_aaz(aaz_Var)
   175:            
   176:                implicit none
   177:                real(DP),intent(inout) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax) 
   178:                integer            :: idest_a, idep_a, idest_b, idep_b
   179:                integer, parameter :: nvars = 1
   180:                real(8)            :: sbuf_a( Xmg, ny, nz )
   181:                real(8)            :: rbuf_a( Xmg, ny, nz )
   182:                real(8)            :: sbuf_b( Xmg, ny, nz )
   183:                real(8)            :: rbuf_b( Xmg, ny, nz )
   184:                integer            :: ireqs_a, ireqr_a, ireqs_b, ireqr_b
   185:                integer            :: ix, jy, kz
   186:                integer            :: i, j, k
   187:            
   188:                ! x 方向に周期境界条件を適用する
   189:                !
   190:                !-------------------------------
   191:                ! 配列の右側を, ノード間で通信する.
   192:                ! 送信する部分配列(sbuf_a)を用意する
   193: +------>       do k = 1, nz
   194: |+----->         do j = 1, ny
   195: ||V---->           do i = 1, Xmg
   196: |||                  sbuf_a( i, j, k ) = aaz_var( nx + 1 - i , j, k ) 
   197: ||V----            end do
   198: |+-----          end do
   199: +------        end do
   200:            
   201:                idest_a = mod(( myrank+1 )       , nprocs)   !送信先
   202:                idep_a  = mod(( myrank-1 )+nprocs, nprocs)   !受信元
   203:            
   204:                call MPIWrapperISend( idest_a, xmg, ny, nz, sbuf_a, ireqs_a ) !送信
   205:                call MPIWrapperIRecv( idep_a , xmg, ny, nz, rbuf_a, ireqr_a ) !受信
   206:                
   207:                !-------------------------------
   208:                ! 配列の左側を, ノード間で通信する.
   209:                ! 送信する部分配列(sbuf_b)を用意する
   210: +------>       do k = 1, nz
   211: |+----->         do j = 1, ny
   212: ||V---->           do i = 1, Xmg
   213: |||                  sbuf_b( i, j, k ) = aaz_var( i, j, k ) 
   214: ||V----            end do
   215: |+-----          end do
   216: +------        end do
   217:                
   218:                idest_b = mod(( myrank-1 )+nprocs, nprocs)    !送信先
   219:                idep_b  = mod(( myrank+1 )       , nprocs)    !受信元
   220:            
   221:                call MPIWrapperISend( idest_b, xmg, ny, nz, sbuf_b, ireqs_b ) !送信
   222:                call MPIWrapperIRecv( idep_b , xmg, ny, nz, rbuf_b, ireqr_b ) !受信
   223:            
   224:                !-------------------------------
   225:                ! 配列の右側を, ノード間で通信する.
   226:                ! 受信した部分配列(rbuf_a)を代入する.
   227:                call MPIWrapperWait( ireqs_a )
   228:                call MPIWrapperWait( ireqr_a )
   229:                
   230: +------>       do k = 1, nz
   231: |+----->         do j = 1, ny
   232: ||V---->           do i = 1, Xmg
   233: |||                  aaz_var( 1-i , j, k ) = rbuf_a( i, j, k ) 
   234: ||V----            end do
   235: |+-----          end do
   236: +------        end do
   237:                
   238:                !-------------------------------
   239:                ! 配列の左側を, ノード間で通信する.
   240:                ! 受信した部分配列(rbuf_b)を代入する.
   241:                call MPIWrapperWait( ireqs_b )
   242:                call MPIWrapperWait( ireqr_b )
   243:                
   244: +------>       do k = 1, nz
   245: |+----->         do j = 1, ny
   246: ||V---->           do i = 1, Xmg
   247: |||                  aaz_var(nx + i , j, k ) = rbuf_b( i, j, k ) 
   248: ||V----            end do
   249: |+-----          end do
   250: +------        end do
   251:                
   252:                ! y 方向に周期境界条件を適用する
   253:                !
   254:                if (ymg /= 0) then 
   255: +------>         do jy = 1, ymg
   256: |*V---->           aaz_Var(:,1-jy,:)  = aaz_Var(:,ny+1-jy,:)
   257: |*V----            aaz_Var(:,ny+jy,:) = aaz_Var(:,jy,:)
   258: +------          end do
   259:                end if
   260:                
   261:                ! z 方向に対称境界条件を適用する
   262:                !
   263: +------>       do kz = 1, zmg
   264: |*W---->         aaz_Var(:,:,1-kz)  = aaz_Var(:,:,kz)
   265: |*W----          aaz_Var(:,:,nz+kz) = aaz_Var(:,:,nz+1-kz)
   266: +------        end do
   267:                
   268:              end subroutine SetMargin_aaz
   269:              
   270:            
   271:              subroutine SetMargin_xyr(xyr_Var)
   272:            
   273:                implicit none
   274:                real(DP),intent(inout) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax) 
   275:                integer            :: idest_a, idep_a, idest_b, idep_b
   276:                integer, parameter :: nvars = 1
   277:                real(8)            :: sbuf_a( Xmg, ny, nz )
   278:                real(8)            :: rbuf_a( Xmg, ny, nz )
   279:                real(8)            :: sbuf_b( Xmg, ny, nz )
   280:                real(8)            :: rbuf_b( Xmg, ny, nz )
   281:                integer            :: ireqs_a, ireqr_a, ireqs_b, ireqr_b
   282:                integer            :: ix, jy, kz
   283:                integer            :: i, j, k
   284:                
   285:                !-------------------------------
   286:                ! 配列の右側を, ノード間で通信する.
   287:                ! 送信する部分配列(sbuf_a)を用意する
   288: +------>       do k = 1, nz
   289: |+----->         do j = 1, ny
   290: ||V---->           do i = 1, Xmg
   291: |||                  sbuf_a( i, j, k ) = xyr_var( nx + 1 - i , j, k ) 
   292: ||V----            end do
   293: |+-----          end do
   294: +------        end do
   295:            
   296:                idest_a = mod(( myrank+1 )       , nprocs)   !送信先
   297:                idep_a  = mod(( myrank-1 )+nprocs, nprocs)   !受信元
   298:            
   299:                call MPIWrapperISend( idest_a, xmg, ny, nz, sbuf_a, ireqs_a ) !送信
   300:                call MPIWrapperIRecv( idep_a , xmg, ny, nz, rbuf_a, ireqr_a ) !受信
   301:                
   302:                !-------------------------------
   303:                ! 配列の左側を, ノード間で通信する.
   304:                ! 送信する部分配列(sbuf_b)を用意する
   305: +------>       do k = 1, nz
   306: |+----->         do j = 1, ny
   307: ||V---->           do i = 1, Xmg
   308: |||                  sbuf_b( i, j, k ) = xyr_var( i, j, k ) 
   309: ||V----            end do
   310: |+-----          end do
   311: +------        end do
   312:                
   313:                idest_b = mod(( myrank-1 )+nprocs, nprocs)    !送信先
   314:                idep_b  = mod(( myrank+1 )       , nprocs)    !受信元
   315:            
   316:                call MPIWrapperISend( idest_b, xmg, ny, nz, sbuf_b, ireqs_b ) !送信
   317:                call MPIWrapperIRecv( idep_b , xmg, ny, nz, rbuf_b, ireqr_b ) !受信
   318:            
   319:                !-------------------------------
   320:                ! 配列の右側を, ノード間で通信する.
   321:                ! 受信した部分配列(rbuf_a)を代入する.
   322:                call MPIWrapperWait( ireqs_a )
   323:                call MPIWrapperWait( ireqr_a )
   324:                
   325: +------>       do k = 1, nz
   326: |+----->         do j = 1, ny
   327: ||V---->           do i = 1, Xmg
   328: |||                  xyr_var( 1-i , j, k ) = rbuf_a( i, j, k ) 
   329: ||V----            end do
   330: |+-----          end do
   331: +------        end do
   332:                
   333:                !-------------------------------
   334:                ! 配列の左側を, ノード間で通信する.
   335:                ! 受信した部分配列(rbuf_b)を代入する.
   336:                call MPIWrapperWait( ireqs_b )
   337:                call MPIWrapperWait( ireqr_b )
   338:                
   339: +------>       do k = 1, nz
   340: |+----->         do j = 1, ny
   341: ||V---->           do i = 1, Xmg
   342: |||                  xyr_var(nx + i , j, k ) = rbuf_b( i, j, k ) 
   343: ||V----            end do
   344: |+-----          end do
   345: +------        end do
   346:                
   347:                ! y 方向に周期境界条件を適用する
   348:                !
   349:                if (ymg /= 0) then 
   350: +------>         do jy = 1, ymg
   351: |*V---->           xyr_Var(:,1-jy,:)  = xyr_Var(:,ny+1-jy,:)
   352: |*V----            xyr_Var(:,ny+jy,:) = xyr_Var(:,jy,:)
   353: +------          end do
   354:                end if
   355:                
   356:                ! z 方向に反対称境界条件を適用する
   357:                !
   358: *W----->       xyr_Var(:,:,0) = 0.0d0
   359: *W-----        xyr_Var(:,:,nz) = 0.0d0
   360:                
   361: +------>       do kz = 1, zmg-1
   362: |W*====          xyr_Var(:,:,-kz) = - xyr_Var(:,:,kz)
   363: +------        end do
   364:                
   365: +------>       do kz = 1, zmg
   366: |W*====          xyr_Var(:,:,nz+kz) = - xyr_Var(:,:,nz-kz)
   367: +------        end do
   368:                
   369:              end subroutine SetMargin_xyr
   370:            
   371:            !!!---------------------------------------------
   372:            
   373:            
   374:            end module setmargin
