| Class | setmargin |
| In: |
../src/utils/setmargin.F90
|
setmargin は, 3 次元 (xyz 方向) 不等間隔交互格子を用いた有限差分法に 基づく数値モデルのための, 境界条件設定 Fortran 90 副プログラムを提供 する.
このモジュールは xyz_module の下位モジュールである. 下請けモジュール として data_type, xyz_base_module, x_bc_module, y_bc_module, z_bc_module モジュールを用いている.
境界条件を設定する副プログラムは
Boundary[境界条件を示す文字列][...]_(入力配列の次元情報)
のように命名されている. 境界条件を示す文字列の種類は x_bc_module, y_bc_module, z_bc_module の場合と同じである.
| Subroutine : | |
| aaz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(inout) |
subroutine SetMargin_aaz(aaz_Var)
implicit none
real(DP),intent(inout) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax)
integer :: idest_a, idep_a, idest_b, idep_b
integer, parameter :: nvars = 1
real(8) :: sbuf_a( Xmg, ny, nz )
real(8) :: rbuf_a( Xmg, ny, nz )
real(8) :: sbuf_b( Xmg, ny, nz )
real(8) :: rbuf_b( Xmg, ny, nz )
integer :: ireqs_a, ireqr_a, ireqs_b, ireqr_b
integer :: ix, jy, kz
integer :: i, j, k
! x 方向に周期境界条件を適用する
!
!-------------------------------
! 配列の右側を, ノード間で通信する.
! 送信する部分配列(sbuf_a)を用意する
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
sbuf_a( i, j, k ) = aaz_var( nx + 1 - i , j, k )
end do
end do
end do
idest_a = mod(( myrank+1 ) , nprocs) !送信先
idep_a = mod(( myrank-1 )+nprocs, nprocs) !受信元
call MPIWrapperISend( idest_a, xmg, ny, nz, sbuf_a, ireqs_a ) !送信
call MPIWrapperIRecv( idep_a , xmg, ny, nz, rbuf_a, ireqr_a ) !受信
!-------------------------------
! 配列の左側を, ノード間で通信する.
! 送信する部分配列(sbuf_b)を用意する
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
sbuf_b( i, j, k ) = aaz_var( i, j, k )
end do
end do
end do
idest_b = mod(( myrank-1 )+nprocs, nprocs) !送信先
idep_b = mod(( myrank+1 ) , nprocs) !受信元
call MPIWrapperISend( idest_b, xmg, ny, nz, sbuf_b, ireqs_b ) !送信
call MPIWrapperIRecv( idep_b , xmg, ny, nz, rbuf_b, ireqr_b ) !受信
!-------------------------------
! 配列の右側を, ノード間で通信する.
! 受信した部分配列(rbuf_a)を代入する.
call MPIWrapperWait( ireqs_a )
call MPIWrapperWait( ireqr_a )
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
aaz_var( 1-i , j, k ) = rbuf_a( i, j, k )
end do
end do
end do
!-------------------------------
! 配列の左側を, ノード間で通信する.
! 受信した部分配列(rbuf_b)を代入する.
call MPIWrapperWait( ireqs_b )
call MPIWrapperWait( ireqr_b )
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
aaz_var(nx + i , j, k ) = rbuf_b( i, j, k )
end do
end do
end do
! y 方向に周期境界条件を適用する
!
if (ymg /= 0) then
do jy = 1, ymg
aaz_Var(:,1-jy,:) = aaz_Var(:,ny+1-jy,:)
aaz_Var(:,ny+jy,:) = aaz_Var(:,jy,:)
end do
end if
! z 方向に対称境界条件を適用する
!
do kz = 1, zmg
aaz_Var(:,:,1-kz) = aaz_Var(:,:,kz)
aaz_Var(:,:,nz+kz) = aaz_Var(:,:,nz+1-kz)
end do
end subroutine SetMargin_aaz
| Subroutine : | |
| aaz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(inout) |
subroutine SetMargin_aaz(aaz_Var)
implicit none
real(DP),intent(inout) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax)
integer :: idest_a, idep_a, idest_b, idep_b
integer, parameter :: nvars = 1
real(8) :: sbuf_a( Xmg, ny, nz )
real(8) :: rbuf_a( Xmg, ny, nz )
real(8) :: sbuf_b( Xmg, ny, nz )
real(8) :: rbuf_b( Xmg, ny, nz )
integer :: ireqs_a, ireqr_a, ireqs_b, ireqr_b
integer :: ix, jy, kz
integer :: i, j, k
! x 方向に周期境界条件を適用する
!
!-------------------------------
! 配列の右側を, ノード間で通信する.
! 送信する部分配列(sbuf_a)を用意する
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
sbuf_a( i, j, k ) = aaz_var( nx + 1 - i , j, k )
end do
end do
end do
idest_a = mod(( myrank+1 ) , nprocs) !送信先
idep_a = mod(( myrank-1 )+nprocs, nprocs) !受信元
call MPIWrapperISend( idest_a, xmg, ny, nz, sbuf_a, ireqs_a ) !送信
call MPIWrapperIRecv( idep_a , xmg, ny, nz, rbuf_a, ireqr_a ) !受信
!-------------------------------
! 配列の左側を, ノード間で通信する.
! 送信する部分配列(sbuf_b)を用意する
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
sbuf_b( i, j, k ) = aaz_var( i, j, k )
end do
end do
end do
idest_b = mod(( myrank-1 )+nprocs, nprocs) !送信先
idep_b = mod(( myrank+1 ) , nprocs) !受信元
call MPIWrapperISend( idest_b, xmg, ny, nz, sbuf_b, ireqs_b ) !送信
call MPIWrapperIRecv( idep_b , xmg, ny, nz, rbuf_b, ireqr_b ) !受信
!-------------------------------
! 配列の右側を, ノード間で通信する.
! 受信した部分配列(rbuf_a)を代入する.
call MPIWrapperWait( ireqs_a )
call MPIWrapperWait( ireqr_a )
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
aaz_var( 1-i , j, k ) = rbuf_a( i, j, k )
end do
end do
end do
!-------------------------------
! 配列の左側を, ノード間で通信する.
! 受信した部分配列(rbuf_b)を代入する.
call MPIWrapperWait( ireqs_b )
call MPIWrapperWait( ireqr_b )
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
aaz_var(nx + i , j, k ) = rbuf_b( i, j, k )
end do
end do
end do
! y 方向に周期境界条件を適用する
!
if (ymg /= 0) then
do jy = 1, ymg
aaz_Var(:,1-jy,:) = aaz_Var(:,ny+1-jy,:)
aaz_Var(:,ny+jy,:) = aaz_Var(:,jy,:)
end do
end if
! z 方向に対称境界条件を適用する
!
do kz = 1, zmg
aaz_Var(:,:,1-kz) = aaz_Var(:,:,kz)
aaz_Var(:,:,nz+kz) = aaz_Var(:,:,nz+1-kz)
end do
end subroutine SetMargin_aaz
| Subroutine : | |
| xyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(inout) |
subroutine SetMargin_xyr(xyr_Var)
implicit none
real(DP),intent(inout) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax)
integer :: idest_a, idep_a, idest_b, idep_b
integer, parameter :: nvars = 1
real(8) :: sbuf_a( Xmg, ny, nz )
real(8) :: rbuf_a( Xmg, ny, nz )
real(8) :: sbuf_b( Xmg, ny, nz )
real(8) :: rbuf_b( Xmg, ny, nz )
integer :: ireqs_a, ireqr_a, ireqs_b, ireqr_b
integer :: ix, jy, kz
integer :: i, j, k
!-------------------------------
! 配列の右側を, ノード間で通信する.
! 送信する部分配列(sbuf_a)を用意する
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
sbuf_a( i, j, k ) = xyr_var( nx + 1 - i , j, k )
end do
end do
end do
idest_a = mod(( myrank+1 ) , nprocs) !送信先
idep_a = mod(( myrank-1 )+nprocs, nprocs) !受信元
call MPIWrapperISend( idest_a, xmg, ny, nz, sbuf_a, ireqs_a ) !送信
call MPIWrapperIRecv( idep_a , xmg, ny, nz, rbuf_a, ireqr_a ) !受信
!-------------------------------
! 配列の左側を, ノード間で通信する.
! 送信する部分配列(sbuf_b)を用意する
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
sbuf_b( i, j, k ) = xyr_var( i, j, k )
end do
end do
end do
idest_b = mod(( myrank-1 )+nprocs, nprocs) !送信先
idep_b = mod(( myrank+1 ) , nprocs) !受信元
call MPIWrapperISend( idest_b, xmg, ny, nz, sbuf_b, ireqs_b ) !送信
call MPIWrapperIRecv( idep_b , xmg, ny, nz, rbuf_b, ireqr_b ) !受信
!-------------------------------
! 配列の右側を, ノード間で通信する.
! 受信した部分配列(rbuf_a)を代入する.
call MPIWrapperWait( ireqs_a )
call MPIWrapperWait( ireqr_a )
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
xyr_var( 1-i , j, k ) = rbuf_a( i, j, k )
end do
end do
end do
!-------------------------------
! 配列の左側を, ノード間で通信する.
! 受信した部分配列(rbuf_b)を代入する.
call MPIWrapperWait( ireqs_b )
call MPIWrapperWait( ireqr_b )
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
xyr_var(nx + i , j, k ) = rbuf_b( i, j, k )
end do
end do
end do
! y 方向に周期境界条件を適用する
!
if (ymg /= 0) then
do jy = 1, ymg
xyr_Var(:,1-jy,:) = xyr_Var(:,ny+1-jy,:)
xyr_Var(:,ny+jy,:) = xyr_Var(:,jy,:)
end do
end if
! z 方向に反対称境界条件を適用する
!
xyr_Var(:,:,0) = 0.0d0
xyr_Var(:,:,nz) = 0.0d0
do kz = 1, zmg-1
xyr_Var(:,:,-kz) = - xyr_Var(:,:,kz)
end do
do kz = 1, zmg
xyr_Var(:,:,nz+kz) = - xyr_Var(:,:,nz-kz)
end do
end subroutine SetMargin_xyr
| Subroutine : | |
| xyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(inout) |
subroutine SetMargin_xyr(xyr_Var)
implicit none
real(DP),intent(inout) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax)
integer :: ix, jy, kz
! x 方向に周期境界条件を適用する
!
do ix = 1, xmg
xyr_Var(1-ix,:,:) = xyr_Var(nx+1-ix,:,:)
xyr_Var(nx+ix,:,:) = xyr_Var(ix,:,:)
end do
! y 方向に周期境界条件を適用する
!
if (ymg /= 0) then
do jy = 1, ymg
xyr_Var(:,1-jy,:) = xyr_Var(:,ny+1-jy,:)
xyr_Var(:,ny+jy,:) = xyr_Var(:,jy,:)
end do
end if
! z 方向に反対称境界条件を適用する
!
xyr_Var(:,:,0) = 0.0d0
xyr_Var(:,:,nz) = 0.0d0
do kz = 1, zmg-1
xyr_Var(:,:,-kz) = - xyr_Var(:,:,kz)
end do
do kz = 1, zmg
xyr_Var(:,:,nz+kz) = - xyr_Var(:,:,nz-kz)
end do
end subroutine SetMargin_xyr
| Subroutine : | |
| aaz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(inout) |
subroutine SetMargin_aaz(aaz_Var)
implicit none
real(DP),intent(inout) :: aaz_Var(imin:imax,jmin:jmax,kmin:kmax)
integer :: idest_a, idep_a, idest_b, idep_b
integer, parameter :: nvars = 1
real(8) :: sbuf_a( Xmg, ny, nz )
real(8) :: rbuf_a( Xmg, ny, nz )
real(8) :: sbuf_b( Xmg, ny, nz )
real(8) :: rbuf_b( Xmg, ny, nz )
integer :: ireqs_a, ireqr_a, ireqs_b, ireqr_b
integer :: ix, jy, kz
integer :: i, j, k
! x 方向に周期境界条件を適用する
!
!-------------------------------
! 配列の右側を, ノード間で通信する.
! 送信する部分配列(sbuf_a)を用意する
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
sbuf_a( i, j, k ) = aaz_var( nx + 1 - i , j, k )
end do
end do
end do
idest_a = mod(( myrank+1 ) , nprocs) !送信先
idep_a = mod(( myrank-1 )+nprocs, nprocs) !受信元
call MPIWrapperISend( idest_a, xmg, ny, nz, sbuf_a, ireqs_a ) !送信
call MPIWrapperIRecv( idep_a , xmg, ny, nz, rbuf_a, ireqr_a ) !受信
!-------------------------------
! 配列の左側を, ノード間で通信する.
! 送信する部分配列(sbuf_b)を用意する
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
sbuf_b( i, j, k ) = aaz_var( i, j, k )
end do
end do
end do
idest_b = mod(( myrank-1 )+nprocs, nprocs) !送信先
idep_b = mod(( myrank+1 ) , nprocs) !受信元
call MPIWrapperISend( idest_b, xmg, ny, nz, sbuf_b, ireqs_b ) !送信
call MPIWrapperIRecv( idep_b , xmg, ny, nz, rbuf_b, ireqr_b ) !受信
!-------------------------------
! 配列の右側を, ノード間で通信する.
! 受信した部分配列(rbuf_a)を代入する.
call MPIWrapperWait( ireqs_a )
call MPIWrapperWait( ireqr_a )
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
aaz_var( 1-i , j, k ) = rbuf_a( i, j, k )
end do
end do
end do
!-------------------------------
! 配列の左側を, ノード間で通信する.
! 受信した部分配列(rbuf_b)を代入する.
call MPIWrapperWait( ireqs_b )
call MPIWrapperWait( ireqr_b )
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
aaz_var(nx + i , j, k ) = rbuf_b( i, j, k )
end do
end do
end do
! y 方向に周期境界条件を適用する
!
if (ymg /= 0) then
do jy = 1, ymg
aaz_Var(:,1-jy,:) = aaz_Var(:,ny+1-jy,:)
aaz_Var(:,ny+jy,:) = aaz_Var(:,jy,:)
end do
end if
! z 方向に対称境界条件を適用する
!
do kz = 1, zmg
aaz_Var(:,:,1-kz) = aaz_Var(:,:,kz)
aaz_Var(:,:,nz+kz) = aaz_Var(:,:,nz+1-kz)
end do
end subroutine SetMargin_aaz
| Subroutine : | |
| xyzf_Var(imin:imax,jmin:jmax,kmin:kmax,1:ncmax) : | real(DP),intent(inout) |
subroutine SetMargin_xyzf(xyzf_Var)
implicit none
real(DP),intent(inout) :: xyzf_Var(imin:imax,jmin:jmax,kmin:kmax,1:ncmax)
integer :: ix, jy, kz
! x 方向に周期境界条件を適用する
!
do ix = 1, xmg
xyzf_Var(1-ix,:,:,:) = xyzf_Var(nx+1-ix,:,:,:)
xyzf_Var(nx+ix,:,:,:) = xyzf_Var(ix,:,:,:)
end do
! y 方向に周期境界条件を適用する
!
if (ymg /= 0) then
do jy = 1, ymg
xyzf_Var(:,1-jy,:,:) = xyzf_Var(:,ny+1-jy,:,:)
xyzf_Var(:,ny+jy,:,:) = xyzf_Var(:,jy,:,:)
end do
end if
! z 方向に対称境界条件を適用する
!
do kz = 1, zmg
xyzf_Var(:,:,1-kz,:) = xyzf_Var(:,:,kz,:)
xyzf_Var(:,:,nz+kz,:) = xyzf_Var(:,:,nz+1-kz,:)
end do
end subroutine SetMargin_xyzf
| Subroutine : | |
| xyzf_Var(imin:imax,jmin:jmax,kmin:kmax,1:ncmax) : | real(DP),intent(inout) |
subroutine SetMargin_xyzf(xyzf_Var)
implicit none
real(DP),intent(inout) :: xyzf_Var(imin:imax,jmin:jmax,kmin:kmax,1:ncmax)
real(DP) :: aaa_Var(imin:imax,jmin:jmax,kmin:kmax)
integer :: idest_a, idep_a, idest_b, idep_b
integer, parameter :: nvars = 1
real(8) :: sbuf_a( Xmg, ny, nz )
real(8) :: rbuf_a( Xmg, ny, nz )
real(8) :: sbuf_b( Xmg, ny, nz )
real(8) :: rbuf_b( Xmg, ny, nz )
integer :: ireqs_a, ireqr_a, ireqs_b, ireqr_b
integer :: ix, jy, kz
integer :: i, j, k, s
! x 方向に周期境界条件を適用する
!
do s = 1, ncmax
aaa_Var = xyzf_Var(:,:,:,s)
!-------------------------------
! 配列の右側を, ノード間で通信する.
! 送信する部分配列(sbuf_a)を用意する
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
sbuf_a( i, j, k ) = aaa_var( nx + 1 - i , j, k )
end do
end do
end do
idest_a = mod(( myrank+1 ) , nprocs) !送信先
idep_a = mod(( myrank-1 )+nprocs, nprocs) !受信元
call MPIWrapperISend( idest_a, xmg, ny, nz, sbuf_a, ireqs_a ) !送信
call MPIWrapperIRecv( idep_a , xmg, ny, nz, rbuf_a, ireqr_a ) !受信
!-------------------------------
! 配列の左側を, ノード間で通信する.
! 送信する部分配列(sbuf_b)を用意する
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
sbuf_b( i, j, k ) = aaa_var( i, j, k )
end do
end do
end do
idest_b = mod(( myrank-1 )+nprocs, nprocs) !送信先
idep_b = mod(( myrank+1 ) , nprocs) !受信元
call MPIWrapperISend( idest_b, xmg, ny, nz, sbuf_b, ireqs_b ) !送信
call MPIWrapperIRecv( idep_b , xmg, ny, nz, rbuf_b, ireqr_b ) !受信
!-------------------------------
! 配列の右側を, ノード間で通信する.
! 受信した部分配列(rbuf_a)を代入する.
call MPIWrapperWait( ireqs_a )
call MPIWrapperWait( ireqr_a )
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
aaa_var( 1-i , j, k ) = rbuf_a( i, j, k )
end do
end do
end do
!-------------------------------
! 配列の左側を, ノード間で通信する.
! 受信した部分配列(rbuf_b)を代入する.
call MPIWrapperWait( ireqs_b )
call MPIWrapperWait( ireqr_b )
do k = 1, nz
do j = 1, ny
do i = 1, Xmg
aaa_var(nx + i , j, k ) = rbuf_b( i, j, k )
end do
end do
end do
xyzf_Var(:,:,:,s) = aaa_Var
end do
! y 方向に周期境界条件を適用する
!
if (ymg /= 0) then
do jy = 1, ymg
xyzf_Var(:,1-jy,:,:) = xyzf_Var(:,ny+1-jy,:,:)
xyzf_Var(:,ny+jy,:,:) = xyzf_Var(:,jy,:,:)
end do
end if
! z 方向に対称境界条件を適用する
!
do kz = 1, zmg
xyzf_Var(:,:,1-kz,:) = xyzf_Var(:,:,kz,:)
xyzf_Var(:,:,nz+kz,:) = xyzf_Var(:,:,nz+1-kz,:)
end do
end subroutine SetMargin_xyzf