ISPACK F90 の使い方ガイド


ISPACK F90 とは?

ISPACK F90 とは, 流体方程式をスペクトル法で数値計算するための Fortran77 サブルーチン集である ISPACK (石岡圭一氏謹製)を, Fortran90 の関数として使えるようにかぶせものをしたモジュール群です.

ISPACK F90 を使うことの利点として以下のような点があります.

このような利点の反面として, このモジュール群を用いた プログラミングでは計算速度や効率を高めることが しづらいかも知れません.

以下では簡単なプログラムを例に, ISPACK F90 モジュールの使い方を 説明します.


準備 : 必要なもの


使い方

  1. プログラム
    ISPACK F90 の関数を使うためには Fortran90 プログラムにおいて以下の 手順が必要となります. 初期化ルーチン以後, 関数を使っての計算ができるようになります.

  2. コンパイル・リンク
    コンパイルする際にはあらかじめモジュールを作成しておくか, メインプログラムと一緒にモジュールのソースをコンパイルします. Fujitsu Fortran なら以下のような感じ.
        % frt -o prog n2pack.f90 program.f90 -L/usr/local/lib -lisp
        


使用例

次のような β面上の2 次元非圧縮流体の支配方程式を矩形領域で解くことを考えましょう.

∂ζ/∂t + J(ψ,ζ) + β∂ψ/∂x = ν(∂xx + ∂yy)ζ,
ζ=(∂xx + ∂yy)ψ,

境界条件は x,y 方向とも周期的であるとします.

以下が ISPACK F90 を使ったこの方程式を解くためのプログラムです.

  ! Sample program for gtool_history/gtool4 and ISPACK   2001/09/23 S.Takehiro
  ! 
  ! Solving 2-D non-divergent (barotropic) fluid system
  !     d\zeta/dt + J(\psi,\zeta) + beta d\psi/dx = \nabla^2\zeta,
  !     \nabla\psi = \zeta
  !
  program baro

    use n2pack                                ! モジュール使用宣言

    integer,parameter      :: im=32, jm=32    ! 格子点の設定(X,Y)
    integer,parameter      :: km=15, lm=15    ! 切断波数の設定(X,Y)

    double precision, dimension(0:jm-1,0:im-1) :: psi, zeta   ! 格子データ(ψ,ζ)
    double precision, dimension(-lm:lm,-km:km) :: spsi,szeta  ! スペクトルデータ(ψ,ζ)
    double precision, dimension(0:jm-1,0:im-1) :: x, y        ! 座標変数(X,Y)

    double precision, parameter :: xmin=0.0, xmax=1.0  ! 計算範囲(X)
    double precision, parameter :: ymin=0.0, ymax=1.0  ! 計算範囲(Y)

    double precision, parameter :: beta=1.0, nu=1e-8   ! パラメター
    double precision, parameter :: dt=1e-1             ! 時間積分刻み
    integer, parameter          :: nt=1000, ndisp=10   ! 時間ステップ数

    double precision, parameter  :: x1=(xmax-xmin)*0.5    ! 初期渦用パラメター
    double precision, parameter  :: y1=(ymax-ymin)*0.5    ! 初期渦用パラメター
    double precision, parameter  :: sigma=0.05, zeta0=0.2 ! 初期渦用パラメター

    integer :: i,j, k,l

   !-------------------- 座標設定 -----------------------
    do i=0,im-1
       do j=0,jm-1
	  x(j,i)= (xmax-xmin)/im*i
	  y(j,i)= (ymax-ymin)/jm*j
       enddo
    enddo
    
    call n2initial(im,jm,km,lm,xmax-xmin,ymax-ymin)   ! スペクトル変換初期設定

   !------------------- 初期値設定 ----------------------
    zeta=  zeta0*exp(-((x-x1)**2+(y-y1)**2)/(2*sigma**2))   ! 初期渦分布
    szeta = s_g(zeta)                           ! スペクトルデータへ変換
    szeta(0,0)=0.0                              ! 渦度の平均値は 0. 
    psi=s_laplainv_s(szeta)                     ! 流線へ変換

   !-------------------- 時間積分 -----------------------
    do it=1,nt
       szeta = szeta + &
	      dt*(  - s_jac_ss(spsi,szeta) &
		   -beta*s_dx_s(spsi) + nu*s_lapla_s(szeta)  )

       spsi = s_laplainv_s(szeta)

       if(mod(it,ndisp) .eq. 0)then             ! 出力処理
	  call output
       endif
    enddo
    stop

  contains
    subroutine output
       write(6,*) 'it=', it
       write(6,*) g_s(spsi)
    end subroutine output

  end program baro

実際にはスペクトルデータの時間積分を行っているのですが, その時間発展の式は, n2pack モジュールの関数を使うことで あたかも実空間の方程式をそのまま書き下している形に書くことができます.

このプログラムを実行するには n2pack.f90 と一緒にコンパイルするのが 一番簡単です. プログラムと n2pack.f90 を同じディレクトリにおいて コンパイルし ISPACK ライブラリをリンクすれば OK です. 例えば Linux 上の Fujitsu Fortran ならば以下のようになります.

    % frt -o baro.out n2pack.f90 baro.f90 -L/usr/local/lib -lisp
  
-L オプションに続くディレクトリは ISPACK ライブラリの在処を 表しています.

n2pack.f90 : 2 次元矩形領域, 周期境界条件

c2pack.f90 : 2 次元水路領域

snpack.f90 : 球面多層モデル


地球流体電脳倶楽部 SPMODEL プロジェクト
spmodel(at)gfd-dennou.org

2001/09/29 作成 (竹広真一)