核熱水力計算に手をつけることになったんですが,



とりあえず二つほどよさげなコードを見繕って,ベンチマーク解析とかしようとしたんです.

んで入手したんですが,その両者ともに,

"MS-DOSでの使用を前提"

"MS Fortran PowerStationで組んである"

ことが発覚.

fl32とかないし使ったことも無いって話ですよ.

ちょっと調べてみたらあんまり評判よくないみたいだし.



でも仕方ないのでとりあえずLinuxに持ってきてインテルコンパイラでコンパイルしようとしたら,

ものっそいエラー出てきてコンパイルできないんですよ.



ソース見たら結構ぐちゃぐちゃ.

Fは最初っから90で来た若造にとっては

COMMONとかGO TOとかが入り乱れるソースは嫌気が指しますよね...



つってもしょうがないので地道に記述を直してコンパイル.

できたー



さっそくサンプルインプットを流してみた.

エラー.

コンパイラエラーではなく,

プログラムエラー.

ぶちギレですよ.



これに悪戦苦闘.



結論から言うと,コンパイルオプションをつけてやることで解決できました.

つけたのはsaveとzero.

古いコードだと,前述のようにCOMMONやら何やらが入り乱れてる場合が多く

そういうスパゲッティコードだと,あるSUBROUTINEからあるSUBROUTINEに受け渡すはずの変数が

受け渡される前にメモリ上で新しい値が上書きされて消し飛んで,あらぬ値が入ってあぼーん

ってことがままあるらしく.

若造故の無知だったわけですが.



ってことでsaveオプションつけて静的メモリを確保してやることと

念のためにzeroオプションつけて未代入の変数の値を0にしてやることで

大概は解決できるそうです.はい.



Fortranは過去の遺産が多いとは言うけども

一概に良いとは言えないなーと痛感しました.
AD

[Fortran][note] 入力要素数の取得

テーマ:
Fortranでテキストファイルを読みこんで処理するとき,

セオリーとして,

ファイルを全部文字変数buffでだーっと読んで,

iostatが0のときは終了,ってしといて

indexとか使ってタグワードが引っかかったらほしい要素の書式付readする,って流れはよくやる手.



んで今まで機会が無くてあんまりやったことがなかったのが,

"読み込む要素の数が不定"な場合.



今日ちょっとその話になった.



したら,文字をコードに変換して,空白か文字列か数字か,っていうのを判断して,

buffのどの位置にどんな要素があるか,というのから判断するという手を聞いた.



そのときはあんまし深く考えず,へぇー,って終わったんですけど.



よく考えたら,コードに変換するってことはたぶんそれichar使うよね.って思って.



icharの引数で与えられる文字列サイズは1だから,buffのサイズ分doまわして…

ってなことをやるってこと?毎回?



効率わるくね?



てなことをちょっと思った.

いや,もしかしたら僕の知らない文字関数があるのかも…

って思ってちょっと調べてみたけど,見つけられなかったorz



あと,PHITSなんかではタグワード中に空白なんかがあっても認識するようになってるらしい.



タグワードが"HOGE"だったとしたら,"[H o g e]"みたいにしてもいいんだって.

これをやるのにぱっと上手いやりかたは思いつかなくて,

やっぱ空白全部とって,文字列だけにしてindexかけるのかな?

だとしたら,やっぱ効率わるいと感じる..



まぁソース読んでみれ,って話なんだけど.

手元にないし.



基本的にプログラミングは我流なので,アルゴリズムな話はちょっと弱いな~自分

と感じました.

まだまだ勉強不足...
AD