ひげさん @ ウィキ
Fortran使った関数、コマンドまとめ
最終更新:
kisohige
-
view
「ですます」と「である」調が混ざってますが勘弁してください。書いた時のテンションでだいぶ書き方に違いが…orz
Fortranへ戻る。
演算
- 累乗 X**Y XのY乗
- 絶対値 ABS(X) Xの絶対値
- 平方根 sqrt(X) Xの平方根
- 余り MOD(X,N) XをNで割った余り
- 最大値 MAX(A,B,…) A,B,…の最大値
- 最小値 MIN(A,B,…)
- 自然対数 LOG(X)
- 常用対数 LOG10(X)
- 指数関数 EXP(X) e^x
- 三角関数 sin(x),cos(x),tan(x)
※三角関数のxはラジアンで入力
- 逆三角関数 arcsin(x),arccos(x),arctan(x)
- ハイパボリックサインとか sinh(x),cosh(x),tanh(x)
DO文
始まりの値から、刻み幅で数えていって、終わりの値になるまでDO文中の処理を繰り返す。
始まりの値もちゃんと変数を定義する必要がある。
例
DO N=1,10,1
始まりの値もちゃんと変数を定義する必要がある。
例
DO N=1,10,1
処理
END DO
意味:Nを1から10になるまで1ずつ数えてやってNが10になったら処理終了。
数えてゆく変数は整数じゃないと怒られたました。多分整数がいいでしょう。
ファイルへの書き出し
open(装置番号,file='ファイル名.拡張子',status='replace')
statusはほかにもある。このreplaceは作ったファイルと同名のものがあったら、 上書きしろ、という命令。
CSVへのかきこみ
write(装置番号[openと揃える],*)変数,",",変数
CSVに出力する時のために、コンマをうつならこんな感じに書き込む。
配列を書き込む
後述の配列を書き込むとき
write(装置番号,*) A(1),",",A(2),",",…とかやってるとソースコードがきたなくなる。
そこで
write(装置番号,*) A(1),",",A(2),",",…とかやってるとソースコードがきたなくなる。
そこで
write(装置番号,*) (A(I),I=1,10)
とかくとA(I)という配列を10個書き並べろ、ということになる。
またCSV出力をする場合は
またCSV出力をする場合は
write(装置番号,*) (A(I),"," , I=1,10)
とする。
close(装置番号[揃える])
close(装置番号[揃える])
1次元配列
型宣言の時
INTEGER,DIMENSION(8) : a
と行った感じで,DIMENSION(次元数)をくわえてやる。
aという変数はa(1),a(2),…a(8)という具合に8こデータを確保してやることが可能。
かっこ内の数字は高校数学の教科書で言う添字に相当する。いわゆる
a1,a2…
といった書き方。
かっこ内の数字は高校数学の教科書で言う添字に相当する。いわゆる
a1,a2…
といった書き方。
a(1:3)=1 !aの1番目~3番目に1を代入 a(4) =2 !aの4番目に2を代入 a(5:8)=3
といった具合に部分部分で初期化、もしくは何らかの処理が行える。
また、まとめて型宣言時に初期化する手段もあるが、個人的には型宣言のあたりが汚くなるのでおすすめしない。
また、まとめて型宣言時に初期化する手段もあるが、個人的には型宣言のあたりが汚くなるのでおすすめしない。
サブルーチン、関数
サブルーチン、関数は副プログラムとして使っています。
メインプログラムが冗長になると、見にくいわバグチェックが大変だわで面倒なことになります。
プログラムを見やすくするためにつかうもの、と見ていいでしょう。
メインプログラムが冗長になると、見にくいわバグチェックが大変だわで面倒なことになります。
プログラムを見やすくするためにつかうもの、と見ていいでしょう。
使い方
だらだらと使い方をかいても分かりにくくなるのがオチなので、使っているサブルーチン、関数を使っているプログラムのソースコードを載せ、そこに補足しようと思います。
EXTERNALとINTRINSIC文
関数やサブルーチンを作って定義しておくと何かと便利な場合があります。上の例で、度数表記(45°とか)をラジアンに直す関数をわざわざ作りました。こういった自分で作った関数を外部関数といいます。
一方、Fortranにはたくさんの内部関数(SINとかSQRTとか)があります。しかも把握しきれる量じゃありません。また、今後バージョンアップするとまた内部関数が増えるかもしれません。
一方、Fortranにはたくさんの内部関数(SINとかSQRTとか)があります。しかも把握しきれる量じゃありません。また、今後バージョンアップするとまた内部関数が増えるかもしれません。
このとき自分でつくった関数の名前が、仮にFortranの内部関数の名前とおなじであった場合、バグの原因になります。
そこでプログラムの最初のほうに
そこでプログラムの最初のほうに
EXTERNAL 関数の名前
としておけば、この名前の関数は外部関数の奴を使え、という命令になります。ベッセル関数とか、デルタ関数とかつくったときはこれを宣言しておけばあんしんかもしれません。例の中のradもつかっておくべきでしたね。ありそうですし。
個人的な見解ですが、Excelで使える関数名を外部関数に振った場合は使ったほうがいいと思います。
配列と関数を同時に使う
FUNCという関数を配列化する場合
FUNK(引数,次元数)となります。