差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

Both sides previous revision Previous revision
Next revision
Previous revision
fortran [2009/10/06 12:03]
saito
fortran [2009/12/01 13:59] (現在)
saito
ライン 1: ライン 1:
 ====== Fortranのtips ====== ====== Fortranのtips ======
 +  * intelのコンパイラは[[ifort]]参照のこと.
  
 ===== コンパイラオプション ===== ===== コンパイラオプション =====
ライン 31: ライン 31:
 </​code>​ </​code>​
  
-このファイルをperlに食わせて処理する便利かも+処理は[[movie]]参照のこと.
  
  
-===== ifortで改行を抑制する ===== 
- 
-ifortでは出力時に勝手に改行する仕様になっている。改行を抑制するためには、Format文を使用すればよい。 
-<code fortran> 
-integer n 
-real(8),​allocatable::​a(:​) 
-n=9 
-allocate(a(9)) 
-do i=1,n 
-   ​a(i)=i 
-end do 
-write(*,'​(<​n>​f)'​) a 
-end program 
-</​code>​ 
  
  
ライン 94: ライン 80:
  
 ===== データファイルの読み込み ===== ===== データファイルの読み込み =====
-データファイルの中に何行あるか分からないときにはendを使う.+ 
 +データファイルの中に何行あるか分からないときにはiostatかendを使う. 
 +iostatの方がスマートなやり方かも. 
 + 
 +==== やり方その1 ==== 
 +read文にiostatのオプションを付ける. 
 +iostatが正の数を返す場合はエラー,負の値を返す場合は行の終わりを意味するらしい. 
 +<code fortran>​ 
 +program hoge 
 +  implicit none 
 +  real a,b 
 +  integer i,​inputstatus 
 +  do i=1,10 
 +     ​read(*,​*,​iostat=inputstatus) a,b 
 +     ​if(inputstatus>​0) stop "​error"​ 
 +     ​if(inputstatus<​0) exit 
 +     ​write(*,​*) a,​b,​a**2-b 
 +  end do 
 +end program hoge 
 +</​code>​ 
 +==== やり方その2 ==== 
 + 
 +endを使う. 
 + 
 +以下サンプル.プログラムの中では10回ループを回すが,読み込むのは5行分だけ
  
 <code bash> <code bash>
ライン 100: ライン 110:
 ./a.out < hoge.dat ./a.out < hoge.dat
 </​code>​ </​code>​
- 
-以下サンプル.プログラムの中では10回ループを回すが,読み込むのは5行分だけ. 
  
 hoge.f90 hoge.f90
ライン 122: ライン 130:
 5. 25. 5. 25.
 </​code>​ </​code>​
 +
 +===== NaNの検出 =====
 +
 +
 +浮動小数点演算例外を検出するコンパイラオプションがあるので、それを使用する。 ​
 +
 +===== Makefile =====
 +保存するためのmakefile
 +<code bash>
 +DATE=  `date +%y%m%d%H%M`
 +TAR = backup/​backup${DATE}.tgz
 +backup :
 +     tar czvf ${TAR} Makefile *.f90
 +</​code>​
 +
 +
 +===== implicit none =====
 +宣言文で宣言した変数以外を利用しないようにする。
 +長いプログラムを書く場合はミスを避けるためにも使用するべき。
 +自由形式の場合はuse文の後に使用。
 +<code fortran>
 +program hoge
 +  use hoge_lib
 +  implicit none
 +  real(8) a,b,c,
 +  ...
 +</​code>​
 +===== 装置番号 =====
 +write(?,​*)やread(?,​*)の?​に入る番号。
 +通常、5が標準入力(キーボード)、6が標準出力(ディスプレイ上の端末)に使用されるので、
 +5と6を使ってopenするのは避けるべき。
 +slatecのI1MACHを使えば、標準入力、標準出力の番号が調べられる。
 +装置番号にはcharacterも入る。
 +
 +
 +
 +===== 連番のファイル名をつける。 =====
 +ファイル名をcharacter変数に代入して使う。ファイル名の変更にはwrite文を使う。
 +逐次計算に使える。
 +<code fortran>
 +character(len=12) filename
 +...
 +do i=1,100
 +  write(filename,'​(a,​i4.4,​a)'​) '​hoge',​i,'​.dat'​
 +  open(10,​file=filename)
 +  ...
 +    write(10,*) ...
 +  ...
 +  close(10)
 +end do
 +</​code>​
 +
 +
 +
 +===== 簡単なシェルスクリプト =====
 +連続してプログラムを実行したいとき、shファイルが便利。
 +端末で入力する内容をあらかじめファイルに書いておき、それを実行すれば、上から順に実行してくれる。
 +windowsで言うバッチファイル。
 +
 +<code bash>
 +gfortran hoge.f90
 +cd case10
 +../a.out
 +cd ../case20
 +../a.out
 +cd ../case30
 +../a.out
 +</​code>​
 +<​code>​
 +$ sh hoge.sh
 +</​code>​
 +
 +
 +
fortran.1254798234.txt.gz · 最終更新: 2009/10/06 12:03 by saito
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0