! Sample program for gtool_history/gtool4 and ISPACK 2001/11/12 S.Takehiro ! ! 2002/01/13 TAKAHASHI Koko ! Rossby Wave : ! Solving 2-D non-divergent (barotropic) fluid system ! d\zeta/dt + d\zeta/dx + d\psi/dx = q ! \lapla psi = \zeta ! q = exp( - (x^2 + y^2)/(0.05 * /labmda) ) ! program n2_rossbywave use n2pack use gtool_history implicit none !---- 空間解像度設定 ---- integer, parameter :: im=64, jm=64 ! 格子点の設定(X,Y) integer, parameter :: km=10, lm=10 ! 切断波数の設定(X,Y) !---- 変数 ---- real(8) :: gzeta(0:jm-1,0:im-1) ! 格子データ(渦度) real(8) :: szeta0(-lm:lm,-km:km) ! スペクトルデータ(t-dt) real(8) :: szeta1(-lm:lm,-km:km) ! スペクトルデータ(t) real(8) :: szeta2(-lm:lm,-km:km) ! スペクトルデータ(t+dt) real(8) :: gpsi(0:jm-1,0:im-1) ! 格子データ(流線) real(8) :: spsi(-lm:lm,-km:km) ! スペクトルデータ real(8) :: gq(0:jm-1,0:im-1) ! 格子データ(地形) real(8) :: sq(-lm:lm,-km:km) ! スペクトルデータ !---- 座標変数など ---- real(8) :: gx(0:jm-1,0:im-1), gy(0:jm-1,0:im-1) real(8), parameter :: xmin=0.0, xmax=100.0 real(8), parameter :: ymin=0.0, ymax=100.0 !---- 時間積分パラメター ---- real(8), parameter :: dt=1e-5 ! 時間ステップ間隔 integer, parameter :: nt=1000000, ndisp=50000 ! 時間積分数, 表示ステップ !---- 物理パラメター ---- real(8), parameter :: rx=0.5 ! 地形の効果 real(8), parameter :: ry=0.5 ! 地形の効果 integer :: i, j, it ! DO 変数 !---------------- 座標値の設定 --------------------- do i=0,im-1 do j=0,jm-1 gx(j,i)= (xmax-xmin)/im*i gy(j,i)= (ymax-ymin)/jm*j enddo enddo call n2initial(im,jm,km,lm,xmax-xmin,ymax-ymin) ! スペクトル初期化 !------------------- 初期値設定 ---------------------- gpsi = 0.0 gq = exp( - (gx - xmax/5)**2/(rx**2) - (gy - ymax/2)**2/(ry**2) ) ! 地形の位置 spsi = s_g(gpsi) szeta1 = s_lapla_s(spsi) szeta0 = szeta1 sq = s_g(gq) call output_gtool4_init ! ヒストリー初期化 call output_gtool4 !------------------- 時間積分 ---------------------- do it=1,nt ! Leap frog による時間積分 szeta2 = szeta0 & + 2 * dt * ( - s_dx_s(sq) & - s_dx_s(szeta0) - s_dx_s(spsi) ) spsi = s_laplainv_s(szeta2) szeta0 = szeta1 ; szeta1 = szeta2 if(mod(it,ndisp) .eq. 0)then ! 出力 gzeta = g_s(szeta1) gpsi = g_s(spsi) call output_gtool4 endif enddo call output_gtool4_close ! ヒストリー後処理 stop contains subroutine output_gtool4_init call HistoryCreate( & ! ヒストリー作成 file='rossby-n2.nc', title=' model', & source='Sample program of gtool_history/gtool4', & institution='GFD_Dennou Club davis project', & dims=(/'x','y','t'/), dimsizes=(/im,jm,0/), & longnames=(/'X-coordinate','Y-coordinate','time '/),& units=(/'1','1','1'/), & origin=0.0, interval=real(ndisp*dt) ) call HistoryPut('x',gx(0,0:im-1)) ! 変数出力 call HistoryPut('y',gy(0:jm-1,0)) ! 変数出力 call HistoryAddVariable( & ! 変数定義 varname='zeta', dims=(/'x','y','t'/), & longname='vorticity', units='1', xtype='double') call HistoryAddVariable( & ! 変数定義 varname='psi', dims=(/'x','y','t'/), & longname='stream function', units='1', xtype='double') call HistoryAddVariable( & ! 変数定義 varname='q', dims=(/'x','y','t'/), & longname='tikei', units='1', xtype='double') end subroutine output_gtool4_init subroutine output_gtool4 write(6,*) 'it = ',it call HistoryPut('zeta',transpose(gzeta)) call HistoryPut('psi',transpose(gpsi)) call HistoryPut('q',transpose(gq)) end subroutine output_gtool4 subroutine output_gtool4_close call HistoryClose end subroutine output_gtool4_close end program n2_rossbywave