!======================================= ! 2D cumulus model - kaminari ! - subroutine adv ! ! Author : TAKAHASHI Koko ! Date : 2003/12/19 新規作成 ! Note : u 移流 ! !======================================= program adv use gtool_history implicit none integer(8) :: i,k integer(8) :: its integer(8), parameter :: nts = 10 ! 短い時間ステップ数 integer(8), parameter :: ntb = 5000 ! 短い時間ステップ数 integer(8), parameter :: im = 23 ! 格子点の設定 (x) integer(8), parameter :: km = 19 ! 格子点の設定 (z) real(8), parameter :: dts = 1.0d0 ! 短い時間間隔 d tau real(8), parameter :: dtb = nts*dts ! 長い時間間隔 dt real(8), parameter :: xmin = 0.0d0 ! モデル領域の左側面 real(8), parameter :: xmax = 2.4d4 ! モデル領域の左側面 real(8), parameter :: dx = (xmax-xmin)/(im+1) ! x の格子間隔 real(8), parameter :: zmin = 0.0d0 ! モデル領域の底 real(8), parameter :: zmax = 1.0d4 ! モデル領域の高さ real(8), parameter :: dz = (zmax-zmin)/(km+1) ! z^{*} の格子間隔 real(8), parameter :: nuh = 1.0d-3*dx*dx/dtb ! 水平方向の数値粘性項の係数 real(8), parameter :: nuv = 1.0d-3*dz*dz/dtb ! 鉛直方向の数値粘性項の係数 real(8) :: f(-1:im+1,-1:km+1) real(8) :: f_cal(0:im,0:km) real(8) :: u(-1:im+1,-1:km+1) real(8) :: omg(-1:im+1,-1:km+1) real(8) :: f_adv(-1:im+1,-1:km+1) real(8) :: f_dif(-1:im+1,-1:km+1) real(8) :: x(-1:im+1,-1:km+1) real(8) :: z(-1:im+1,-1:km+1) real(8) :: x_cal(-1:im+1,-1:km+1) real(8) :: z_cal(-1:im+1,-1:km+1) !--- 座標軸 do k = -1,km+1 do i = -1,im+1 x(i,k) = dx*i z(i,k) = dz*k end do end do do k = 0,km do i = 0,im x_cal(i,k) = dx*i z_cal(i,k) = dz*k end do end do call HistoryCreate( & & file='iryu.nc', & & title='2D cumulus model', & & source='kaminari - 2D cumulus model', & & institution='GFD_Dennou Club deepconv project', & & dims=(/'x','z','t'/), & & dimsizes=(/int(im+1,4),int(km+1,4),0/), & & longnames=(/'X-coordinate','Z-coordinate', & & ' Time '/), & & units=(/'m','m','s'/), origin=0.0, & & interval=real(1.0d0)) ! ベクトル量の変数出力 call HistoryPut('x',x_cal(0:im,0)) call HistoryPut('z',z_cal(0,0:km)) call HistoryAddVariable( & & varname='f', dims=(/'x','z','t'/), & & longname='u-velocity', units='m/s', & & xtype='double') do k = -1,km+1 do i = -1,im+1 u(i,k) = 1.0d1 omg(i,k) = 0.0d0 end do end do do k = -1,km+1 do i = -1,im+1 f(i,k) = exp(-(x(i,k) - 1.0d4/2.0d0)**2.0d0/5.0d6 & & -(z(i,k) - 1.0d4/2.0d0)**2.0d0/5.0d6) end do end do do k = 0,km do i = 0,im f_cal(i,k) = f(i,k) end do end do write(*,*) 'its =', its call HistoryPut('f', f_cal) do its = 1,ntb do k = 0,km do i = 0,im !--- 数値粘性項 f_dif(i,k) = nuh*(f(i+1,k) - 2.0d0*f(i,k) + f(i-1,k)) & & /dx**2.0d0 & & + nuv*(f(i,k+1) - 2.0d0*f(i,k) + f(i,k-1)) & & /dz**2.0d0 f_dif(i,k) = 0.0d0 !--- u 移流項 f_adv(i,k) = u(i,k)*(f(i+1,k) - f(i-1,k))/(2.0d0*dx) & & + ( & & omg(i,k+1) + omg(i,k) & & + omg(i-1,k+1) + omg(i-1,k) & & )/4.0d0 & & *(f(i,k+1) - f(i,k-1))/(2.0d0*dz) & & - f_dif(i,k) f(i,k) = f(i,k) - dts*f_adv(i,k) end do end do do k = 0,km do i = 0,im f_cal(i,k) = f(i,k) end do end do write(*,*) 'its =', its call HistoryPut('f', f_cal) end do call HistoryClose end program adv