!---------------------------------------------------------------------- ! Copyright (c) 2010--2011 Shin-ichi Takehiro. All rights reserved. !---------------------------------------------------------------------- ! !表題 wtq_mpi_module テストプログラム ! ! 磁場ポロイダルポテンシャルの境界値問題 ! !履歴 2010/04/18 竹広真一 wt_module_sjpack_test_polmagbc.f90 より改造 ! 2011/09/14 竹広真一 MPI 並列化 ! 2011/09/14 竹広真一 wtq_mpi_module 用に改造 ! program wtq_mpi_module_polmagbc_wt_test use dc_message, only : MessageNotify use dc_test, only : AssertEqual use wtq_mpi_module use mpi implicit none integer,parameter :: im=32, jm=16 ! 格子点の設定(経度, 緯度, 動径) integer,parameter :: kmo=16, kmi=10 ! 格子点の設定(球殻動径, 球動径) integer,parameter :: nm=10 ! 切断波数の設定(水平) integer,parameter :: lmo=16, lmi=16 ! 切断波数の設定(球殻動径, 球動径) real(8),parameter :: ri=0.5, ro=1.5 ! 内外半径 real(8), dimension(0:im-1,1:jm,0:kmo) :: xyz_POLMAG real(8), dimension((nm+1)*(nm+1),0:lmo) :: wt_POLMAG real(8), dimension((nm+1)*(nm+1),0:kmo) :: wz_TopBoundary real(8), dimension((nm+1)*(nm+1),0:kmo) :: wz_BottomBoundary real(8), dimension((nm+1)*(nm+1),0:kmo) :: wz_Zero real(8), dimension((nm+1)*(nm+1),0:kmo) :: wz_n ! 全波数 ! 判定誤差設定 integer, parameter :: check_digits = 9 integer, parameter :: ignore = -10 real(8), parameter :: pi=3.1415926535897932385D0 integer :: k, n, nn(2) integer :: iproc, np, ierr !---------------- MPI スタート --------------------- call MPI_INIT(IERR) call MPI_COMM_RANK(MPI_COMM_WORLD,IPROC,IERR) call MPI_COMM_SIZE(MPI_COMM_WORLD,NP,IERR) call MessageNotify('M','wtq_mpi_module_polmagbc_wt_test', & 'wtq_mpi_module wt_PolmagBoundaries subroutine test') call wtq_mpi_Initial(im,jm,kmi,kmo,nm,lmi,lmo,ri,ro) !=================== wt_PolmagBoundaries ======================= ! P_10 xyz_POLMAG = sin(xyz_lat) * sin( pi*(xyz_rad-ri)/(ro-ri) ) ! P_1_1 !xyz_POLMAG = cos(xyz_lat)*cos(xyz_lon)* sin( pi*(xyz_rad-ri)/(ro-ri) ) !xyz_POLMAG = 2*sin(xyz_lat)**2 * sin( pi*(xyz_rad-ri)/(ro-ri) ) wt_POLMAG = wt_xyz(xyz_POLMAG) call wt_PolmagBoundaries(wt_POLMAG) xyz_POLMAG = xyz_wt(wt_POLMAG) do k=0,kmo do n=1,(nm+1)**2 nn=nm_l(n) wz_n(n,k) = nn(1) enddo enddo wz_Zero = 0.0D0 wz_TopBoundary = wz_wt(wt_DRad_wt(wt_POLMAG)) & + (wz_n +1)*wz_wt(wt_POLMAG)/wz_RAD wz_BottomBoundary = wz_wt(wt_DRad_wt(wt_POLMAG)) & - wz_n * wz_wt(wt_POLMAG)/wz_RAD call AssertEqual(& message='wt_PolmagBoundaries (Top B.C.)', & answer = wz_Zero(:,0), & check = wz_TopBoundary(:,0), & significant_digits = check_digits, ignore_digits = ignore & ) call AssertEqual(& message='wt_PolmagBoundaries (Bottom B.C.)', & answer = wz_Zero(:,kmo), & check = wz_BottomBoundary(:,kmo), & significant_digits = check_digits, ignore_digits = ignore & ) !=================== wt_PolmagBoundariesGrid ======================= ! P_10 !xyz_POLMAG = sin(xyz_lat) * sin( pi*(xyz_rad-ri)/(ro-ri) ) ! P_1_1 !xyz_POLMAG = cos(xyz_lat)*cos(xyz_lon)* sin( pi*(xyz_rad-ri)/(ro-ri) ) xyz_POLMAG = 2*sin(xyz_lat)**2 * sin( pi*(xyz_rad-ri)/(ro-ri) ) wt_POLMAG = wt_xyz(xyz_POLMAG) call wt_PolmagBoundariesGrid(wt_POLMAG) xyz_POLMAG = xyz_wt(wt_POLMAG) do k=0,kmo do n=1,(nm+1)**2 nn=nm_l(n) wz_n(n,k) = nn(1) enddo enddo wz_TopBoundary = wz_wt(wt_DRad_wt(wt_POLMAG)) & + (wz_n +1)*wz_wt(wt_POLMAG)/wz_RAD wz_BottomBoundary = wz_wt(wt_DRad_wt(wt_POLMAG)) & - wz_n * wz_wt(wt_POLMAG)/wz_RAD wz_Zero = 0.0D0 wz_TopBoundary = wz_wt(wt_DRad_wt(wt_POLMAG)) & + (wz_n +1)*wz_wt(wt_POLMAG)/wz_RAD wz_BottomBoundary = wz_wt(wt_DRad_wt(wt_POLMAG)) & - wz_n * wz_wt(wt_POLMAG)/wz_RAD call AssertEqual(& message='wt_PolmagBoundariesTau (Top B.C.)', & answer = wz_Zero(:,0), & check = wz_TopBoundary(:,0), & significant_digits = check_digits, ignore_digits = ignore & ) call AssertEqual(& message='wt_PolmagBoundariesTau (Bottom B.C.)', & answer = wz_Zero(:,kmo), & check = wz_BottomBoundary(:,kmo), & significant_digits = check_digits, ignore_digits = ignore & ) call MessageNotify('M','wtq_mpi_module_polmagbc_wt_test', & 'wtq_mpi_module wt_PolmagBoundaries subroutine test succeeded!') !------ MPIの終了 ------ call MPI_FINALIZE(IERR) end program wtq_mpi_module_polmagbc_wt_test