fortran における複素数の入力
以下のファイルの中身を複素数の変数に読み込ませたいとする。
# test input file: test.inp 1.00000 2.00000
結構探したが、fortranで外部から複素数を読み込ませるときの上手い方法が見つからなかった。
結局、実数変数に一時的に格納し、後で複素数に変換するという形しか無さそう。
program test implicit none integer, parameter :: INPUT = 10 integer, parameter :: DP = selected_real_kind( 8 ) complex( DP ), parameter :: I = cmplx( 0, 1 ) real( DP ) :: temp( 2 ) complex( DP ) :: c character( 99 ) :: filename filename = 'test.inp' open( INPUT, file = filename, status = 'old' ) read( INPUT, * ) temp( 1 : 2 ) c = cmplx( temp( 1 ), temp( 2 ) ) ! or c = temp( 1 ) + I * temp( 2 ) end program test
fortran で End of file を検出する。
fortranでファイルを限界まで読み続けると、End of file でエラーが返って来る。この辺がなんとも原始的な香りを感じさせる。
この End of file を検出/処理するためには、以下の二通りが考えられる。
- END で行番号へ飛ぶ。
implicit none character( 99 ) :: input open( UNIT, FILE, STATUS = 'old' ) do while ( .true. ) read( UNIT, FORMAT, END = 999 ) input print *, input end do 999 print *, 'end of file'
End of file 時に、指定した行番号へ飛び、処理を続ける。
しかし、GoTo文がダサいという認識の下では、行番号に飛ぶのは度し難く感じる。
- IOSTAT で検出する。
【fortran】ファイル読み込みのコツ open, read | 理系夫婦の方程式
implicit none integer :: ios character( 99 ) :: input open( UNIT, FILE, STATUS = 'old' ) do while ( .true. ) read( UNIT, FORMAT, IOSTAT = ios ) input if ( ios == -1 ) then print *, 'end of file' exit end if print *, input end do
End of file 時に、IOSTATに -1 が代入され、処理が続けられる。こちらの方がスマートであろう。
ちなみに、End of file 時には変数(input)への代入は行われないため、最後の行の情報がそのまま変数inputの中に入っていることになる。
LAPACK・LAPACK95の使い方。
LAPACKの使い方でいつも困るので自分用も兼ねてまとめる。
LAPACKのインストールの仕方については沢山サイトがあるので割愛。
- サブルーチンのリスト(マニュアル)
LAPACK95 -- Fortran95 interface to LAPACK
Index of LAPACK95 Routines
LAPACK95のサブルーチンのリスト。
スタンダードな感じの無味乾燥としたページ。
LAPACK95についてはこれで事足りる気がする。
LAPACKサンプルプログラム目次
nagによるサブルーチン(LAPACK)のリスト。
サンプルプログラムのソースも載っているが、nag独自のmoduleもガンガン使っているので、そのままコピペしても動かない。
入力データと出力結果の例が見れるのは良いと思うが、ページの見方に慣れが必要。
結局はリンク先のマニュアルページを見ることになる。
LAPACK
NECによるサブルーチン(LAPACK)のリスト。
一ページにサブルーチンの名前と簡単な説明が全部載っているので、何があるかザっと見るには良いページだと思う。
サブルーチン名をクリックした先にある詳細な説明も見易くて良い。
- LAPACKとLAPACK95について(1)
LAPACKでは、サブルーチンの名前は「"接頭辞" + "名前"」になっており、変数の型によって接頭辞を変える必要がある。
とは言っても、数値計算では倍精度の実数か複素数を使うことになるので、慣れれば気にならない。
一方、LAPACK95では、「"LA_" + "名前"」がサブルーチンの名前になっていて、変数の型を気にせずに呼び出すことができる。
- LAPACKとLAPACK95について(2)
LAPACK・LAPACK95を利用するには、対応したモジュールを使用することをプログラム内で宣言する必要がある。
use f77_lapack ! LAPACK use f95_lapack ! LAPACK95
両方を宣言する必要はない。LAPACKのサブルーチンを使いたいのか、LAPACK95のサブルーチンを使いたいのか、どちらかだけで良い。
この「f77_lapack, f95_lapack」というのは、moduleファイル(*.mod)ファイルの名前でもある。コンパイルする際には「f77_lapack.mod, f95_lapack.mod」が存在するPATHをincludeする必要がある。上手くコンパイルできないときは、一度確認することをお勧めする。筆者の場合には、"include"ディレクトリの中の"lapack95_modules"にmoduleファイルが入っていたため、"include"ディレクトリを指定しても上手く行かなかった。
- LAPACKとLAPACK95について(3)
LAPACK と LAPACK95 で引数が異なることがある。
大体の場合、LAPACK95の方が楽ちんだと(勝手に)思っている。
例えば、複素エルミート行列の固有値と固有ベクトルを求める「ZHEEV or LA_HEEV」を見てみると、
! LAPACK SUBROUTINE ZHEEV (JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, INFO) ! LAPACK95 SUBROUTINE LA_HEEV( A, W, JOBZ=jobz, UPLO=uplo, INFO=info )
LA_HEEVの場合には、二個引数を入れるだけで動いてくれる(後ろの3つはoptionalだから指定しなくても可)が、ZHEEVは毎回全ての引数を用意しないといけない。
また、両者で引数の順番が違うことにも注意。LAPACKの方を知っているからといって、LAPACK95をマニュアル無しで使おうとすると失敗する。
試しにLA_HEEVを使うと、
program check_lapack95 use f95_lapack, only : LA_HEEV implicit none integer, parameter :: dp = selected_real_kind( 8 ) real( dp ) :: W( 2 ) complex( dp ) :: A( 2, 2 ) ! input/output matrix A = reshape( [ cmplx( 1, 0 ), cmplx( 0, 2 ), cmplx( 0, -2 ), cmplx( 1, 0 ) ], shape( A ), order = [ 2, 1 ] ) ! LA_HEEV( A, W, (JOBS, UPLO, INFO) ) call LA_HEEV( A, W, 'V' ) ! 'V': eigenvector will be stored in A ! A( 1, : ) = i/sqrt{2}, -1/sqrt{2} ! A( 2, : ) = i/sqrt{2}, 1/sqrt{2} ! W = -1, 3 end program check_lapack95
オンサイトクーロンの波数表示。
ハバードモデルにあるオンサイトクーロン項の波数表示
を証明する。
証明には、以下の関係式が必要である。
これらは以下の記事で扱ったことがある。
koideforest.hatenadiary.com
koideforest.hatenadiary.com
よって、
時間順序演算子を用いた時間発展演算子の表現。
時間発展演算子は、一般のハミルトニアンに対して次のように表される。
注意として、の順番は勝手に変えてはいけない。
順番を変えて良いのは、同じ時刻の時にのみ限る。
二番目の積分を変形していくが、以下の積分は変数変換をするわけではなく、厳密に同じ積分を表す。
補足すると、が動く最終的な範囲は両者で等しく、また積分結果も一致するため、同じ積分と言える。
したがって、
今の二次の場合には、時間変数が二個であり、どちらの時間が速いかで分割した結果が掛かかっている。
これを一般化すると、n次で時間変数が個ある場合、時間を速い順に並べる並べ方は、単純に順列として扱えるため、個ある。
したがって、
というように非常に簡潔に書ける。
参考文献:Fetter-Walecka