• ベストアンサー

FORTRANプログラムについてお聞きします。

仕事で1970年代にFORTRAN77で作られた技術計算(発電所の熱精算)プログラムを使っています。(私はプログラムは使っていても、作ったことのない、ほとんど素人です) このプログラムの規模として、総ステップ数が約60kステップ有ります。 このたび、このプログラムをMATLABに移植することになりました。 移植の理由は、FORTRANそのものが古い言語で、機能拡張などのメンテナンスを依頼しているソフト会社には、FORTRANの分かるエンジニアがいなくなったこと、だそうです。 (MATLAB使用は会社の指示です) そこでお聞きしたいのは以下の点です。 1.FORTRANとは、そんなに古い言語になってしまったのか? 2.MATLABはある精度内で収束するように繰り返し計算するようなプログラムに向いているのか? 3.MATLABのネット記事のほとんどが大学関係者ばかり。企業では使われていないのか?だとしたら、その理由は? 4.MATLABの利点と欠点を述べた記事などがあったら紹介して下さい。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.5

No.4のお礼欄について >演算時間はMaxでも2秒程度です どの程度のコンピュータの場合の時間でしょうか? FORTRANやCのようなコンパイラを使った場合とMATLABのようなインタープリタの場合とを比べると同じ様なコードだと2桁から3桁遅くなると思っておいてください。ただし行列計算のような内蔵されている機能に置き換えるとそんなに速度低下はおこりません。1桁程度見込んでいたらよいと思います。1970年代に実用的な速度が出ていたのでしたら、その当時と比べれば遅くなることはないと思います。 >「FORTRANからの脱却」 FORTRANのコードを変換するのではなく、仕様書から作りゼロからつくることになると思いますので、MATLABのライセンス料で悩む必要はないと思います。それとは桁違いの金額が必要にはずですので。 「FORTRANからの脱却」には反しますが、 計算部分は問題が無く、ユーザインターフェースを改善したいというときの方法として 1) 元のコードの計算部分をいくつかのサブルーチンにして、新しく作るプログラムからライブラリとして呼び出す。  全部CやFORTRANで書く必要はないので、メンテナンスしやすい言語で新しく作り、計算部分だけは基本的に元のコードを利用する。 2) 元のプログラムをそのまま使い、元のプログラムが解釈できる入力と、その出力を解釈できるプログラムを作成し、ユーザーインターフェースを改善する。 私自身は2)の方法もよく使います。自分だけや部署内で使う程度であればこれで十分ですので。仕事の合間をみて一週間程度で書いてしまいます。

ggep3930
質問者

補足

現在のプログラムは、古いなりにシステム化しています。 一つのデータ処理システムの中の計算本体(EXE)で、入出力はTXTファイルで行います。 システムはPC(Core2Duo/WinXP)に搭載しているので、ユーザは入力にCSVを使ったりしています。 (このPC上での演算時間が2秒程度です) また、出力データ(約500種類)にはアドレス番号を振っておいて、必要であれば、内部処理でExcelに貼り付けることができます。Excelはリンクを張ったりマクロを設定して後続の作業に利用します。 また、計算結果は管理図書なので、マクロ処理(フォントや余白)でTXTからWordに変換しており、MATLABでも同様の処理をすることになります。

その他の回答 (4)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.4

No.3の続きです。 MATLABとFORTRANは配列の扱いがずいぶん違います。この時代のFORTRANは配列の要素を1つずつ計算していくのですが、MATLABでは行列式やベクトル式のような扱いを普通します。幸い配列のインデックスは両方とも1からですので、まあそのまま置き換えることはできるかもしれませんが、MATLABの簡潔性は失われます。これくらい違うと移植というよりは、一から作り直す覚悟でやるほうが将来のメンテナンスを考えると良いように思います。 MATLABからFORTRANを呼び出し可能でしたら、ユーザーインターフェース部分をMATLABで書き、計算部分をFORTRANで残しておくのも手かと思います。 >「継続性のない使い捨てのプログラムをその場で書くのには適しているが...」 Scilabを使いこなした訳ではないですが、ある意味言い当てているように思います。 逆の言い方をすると、計算部分をサブルーチンなどの形で分けておくことで(MATLABのサブルーチンでも良い)、手軽にユーザーインターフェース部分や計算条件を変えられるメリットがあります。私自身は計算部分は独自Classやモジュールを使ったライブラリにし、それを数十行程度までの本体部分から呼び出す手法を多用しています。本体部分はずっと使う場合もありますし、使い捨てに近いものも多くあります。

ggep3930
質問者

お礼

ありがとうございます。 MATLABで将来の拡張性&メンテナンス性を持たせた作り込みとなると、現在のFORTRANから完全に乗り換えするしか方法は無いでしょう。この件は「FORTRANからの脱却」という方針なので、問題にならないと思います。 ただ、現場の何よりの懸念は「演算時間が桁違いにかかること」と「高額なライセンス料」です。 FORTRANでは、1ヶの計算ファイル(入力データ)に最大で30種類のケースをセットできて、演算時間はMaxでも2秒程度です。この時間で(昔のラインプリンターのイメージで)、7000行の解が得られます。 MATLAB代理店から詳細な話を聞いていませんが、会社のLAN下で使う場合は「ネットワークライセンス」&「同時にアクセスできるのは2~3人」のようなことで、かなり高額なライセンス料金のようです。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

1) No.1、No.2でも触れられていますが、FORTRANは古くから言語ですが、ある意味Hotな言語でもあります。 というのも、現在でも高速なプログラムを一番書きやすい言語ですので、スーパーコンピュータなどで数値計算使われるプログラムの多くは FORTRANで書かれています。かなり注意して書いたCと普通に書かれたFORTRANで比較しますと、FORTRANは同程度かより高速なプログラムを書けます。コンパイラが最適化しやすいのが大きな理由です。 2) 収束をともなう数値計算の場合でも普通は倍精度浮動小数点程度の精度ですので、計算桁数でも多分問題ないと思います。 ただし、実行速度はFORTRANに比べて2桁以上遅いことを覚悟しておいた方がよいと思います。ただし作成した当時に比べて、2桁以上のCPUが高速化していますので、当時よりは速いものができると思います。 MATLABのようなスクリプト言語の場合は、コンパイラ言語で書かれた計算ライブラリが手に入ることが多いので、それを利用すれば速度低下はほとんどありません。 3)はパス。 4) No.2でありますのように、「言語屋としてはとっつきにくいソフト」に一票 類似したScilab、Octave, Rなどいろいろ使いましたが、それぞれ独特の癖があります。1つだけのスクリプト言語で完成すればよいのですが、適材適所でいろいろ使い分けていた時期がありますが、頭の中が混乱してきました。結局下記のようにしています。 最近の私のプログラムの作り方ですが、スクリプト言語(Ruby)をメインにして、 計算時間のかかる部分は必要に応じてFORTRANやCで書かれたライブラリをそれから利用し、グラフ化には(R)をそれから呼び出して使っています。 一時MATLABに似たScilabを使っていましたが、C等で書かれたライブラリやRなどを呼び出す方法が分からなかったので、現在は利用していません。

ggep3930
質問者

お礼

回答ありがとうございます。 MATLABのことをネット記事から見ていますが、皆さんが仰るように、扱いにくい面を持っているようですね。 中には、「継続性のない使い捨てのプログラムをその場で書くのには適しているが...」のような、手厳しい意見もありました。 未だ多くの記事を調べてはいませんが、FORTRANプログラムの持つ良さ(プログラムを書く側・使う側)が改めて実感されます。

回答No.2

2つも詳しくはないですが、答えれる部分のみ書いておきます。 1. 少なくとも20代のSEの間では化石扱いされています。 2. 「(割り切れないような)演算をしていくうちに誤差が出てきて、最終的な値が極端に狂うかどうか」と言う意味ならば、 シンボリック計算が実装されているので、最終的な値を、ある精度で丸めることはできると思います。 そうではなく、C言語のような誤差を予め考慮した演算を任意の桁数で連続で行いたいという意味ならば、 digitsによって演算精度を予め決めておくことで可能なようです。 3. 企業でも用いられています。知っている範囲では車関係の実験、制御が多いです。 4. あまり詳しくはないので、個人的な意見を言わせて戴くと、 「言語屋としてはとっつきにくいソフト」です。 知り合いの実験屋は重宝しているようです。

ggep3930
質問者

お礼

回答ありがとうございます。 現在のプログラムは、蒸気・水の質量流量や電気出力を、0.01%の精度で収束するように繰り返し計算をさせています。演算結果は単なる結果ではなく、それが保証値となることがあります。 MATLABを使った自社開発か、市販ソフトのカスタマイズの両案で考えてみたいと思います。

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.1

FORTRANの数値計算の後、研究者になってリタイアした者です。 1 古い古くないで言えば、一番古い高級言語ですね。 70年代から使っているとなるとFPRTRAN66かFORTRAN77で書かれたプログラムでしょうから、最近のアーキテクチャではチューニングが難しいと思います。特にFORTRAN66にはIF-THEN-ELSE構文がありませんから、論理構造がIF文による条件分岐か、計算型、割り当て型のGOTO文で構成されているはずで、これらの構文は構造化プログラムの領域外で、チューニングツールが対応していません。まあ、ダイクストラが構造化プログラミングを出版したのが1967年ですから、それ以前のFORTRAN66にこういった構造化要素を求めるのは無理でしょう(もっとも、ダイクストラもヴィルトのALGOLでの業績がなければ出来なかったでしょう。ヴィルトが1958年に既にALGOLを作っていたのは驚異です)。 2 誤差を扱うというのはプログラマのセンスで、言語仕様には依存しません。COBOLやPL/Iの十進計算は別ですが、言語仕様にはそもそも誤差の概念がなく、FORTRANもアーキテクチャ依存です。 3 企業ではスパコンを使うこともあるし、継承資産という家達でFORTRANを使っているケースも多いでしょう。また、企業では解析的問題にはNASTRAN、統計的問題ではSASのようなパッケージを使うことも大いです。研究的課題とは違うビヘービアがあります。 4 存じ上げませんが、数式がちゃんと定義されていて、テイラー展開できれば、私なら大概のプログラムはFORTRANで作れます(デバイス制御はアセンブラ併用ですが)。

ggep3930
質問者

お礼

早速の回答ありがとうございます。 MATLABにしてもソフトは、先ず慣れることだと思っていますが、FORTRANをうまく移植(ではなく、別なプログラムを作る?)できるのか、そこが最大の問題です。 実は、MATLAB採用の背景が分かりません。ただ、これまでの経験では、一つのソフトで多分野に対応できる物は少ないと思っています。FORTRANをMATLABに移植することと、カスタマイズして使える市販ソフトを当たってみることで、会社へ状況報告をしようと考えています。 ありがとうございました。

関連するQ&A

  • fortranプログラミングでの数値計算と可視化環

    現在fortran77により数値計算し、可視化する環境を探しています。素人なので、アドバイス頂ければ幸いです。 背景:matlabで既にプログラム済みファイルを、fortranで書き直したい。プログラムは数値計算をしてその結果をグラフ(2D,3D)で可視化する物。matlab環境では計算時間がかかる為、fortranで時間短縮したい。 環境:Win XPへ所有しているマイクロソフトビジュアルFortran77(Ver調査中。7年くらい前の物)をインストールして、それを使おうと考えています。 疑問:どうやって計算結果を可視化するか?ポストプロセッサーとして、gnueplotやmatlabを使用するのは可能だと思うがそれが一番効率的なのでしょうか?ビジュアルFortranには可視化ライブラリみたいな物があるのでしょうか? 不足情報あればアップいたします。初心者ですが、アドバイスを宜しくお願いします。 追伸:研究室の過去の資産の関係でFortranを考えています。多言語でのメリットもあれば教えて頂たいですが、基本古い言語使用に対する中傷「のみ」はご遠慮下さい。

  • C言語をFortranに変換するソフトを教えてください

    数値計算をFortranで行っています。 C言語で書かれたプログラムをFortranに書き直すツールがあるとうわさで聞いたのですが、あるのでしょうか?あれば大変役に立つのでほしいのですが。。。 お願いします!

  • Fortran90のプログラムコードからインターフェース(ソフト)を作成する方法を教えてください。

    まったくの素人です。 Fortran90で作った大規模なプログラムコードがあります。 多くのパラメーターを入力して計算するプログラムです。 これを利用して、入力を簡易にし、計算結果をグラフ等で確認できる、インターフェースを開発しようかどうかと思案中です。 市販の一般的なソフト(Wordやexcel)のように、 ツールバーなどを備えていて、誰でも簡単に取り扱えるようにしたい、と考えているのです。 そこで、ご質問なのですが、 Fortran90からこのようなインターフェースを開発するためには、どのようなステップあるいはどのようなソフトが必要になるのでしょうか?

  • Fortranでの記号「./」について

    Fortran 90で書かれた数値計算プログラムを、より専門的な言語に書き換える作業を行っています。 Fortranを学んだことがないのでインターネット等で関数の意味や書式を調べながら作業しているのですが、 「X./Y」という式の意味がわからずに困っています。 単純に「X/Y」とはどう違うのでしょうか。 初歩的な質問で申し訳ありませんが、よろしくお願いします。

  • FORTRANとC言語のデータ受け渡し。

    卒業論文で計算プログラムをくんでいるのですが、 教授から、とりあえずa,bをCでscanfしてそれをFortranに渡し、 足し算させ和cを出し、それをC言語に持って行き、printfさせるプログラム を組んでみろと。C言語はそれなりにわかるつもりですが、Fortranはさっぱりです。データの受け渡しわかる方教えてください。

  • Javaによる数値計算 高速化

    大きな2次元配列を使った数値計算を実施しています。 これまではFortranをメインで使用していましたが、モデルへの機能追加などが容易なことから オブジェクト指向言語に取り組み、ようやくJavaに移植が完了しました。 事前に調べた所では、Fortran、C++、Javaいずれも速度に大きな差は無いとありました。 (そもそもこれは本当でしょうか?) 1~2割程度遅いのなら許容出来るつもりでしたが、いざ実行してみると、 Fortranで3ステップ進む時にJavaでようやく1ステップ進むといった感じで、少々困っております。 ⇒ そんなことあり得ないということであれば、自分のプログラムのバグを疑いますが。ただ、計算結果は概ね良好のようです。 それで、気になったのが、Fortranでは、コンパイル時に最適化してくれるのですが、 今調べたところJavaにはそれがないようです。 言われてみると、Fortranで最適化オプションを実施しなかった時にはこのくらいの遅さだったように思えます。 それで、前置きが長くなりましたが、Javaで最適化あるいは高速化する方法は無いのでしょうか? プログラミング自体が専門ではないので、できれば人間に分かりやすいコーディングのまま使いたいのですが。 初心者が陥りがちなところで、これを直せば、だいぶ速くなるというような一般的な注意事項などありましたら教えていただきたく存じます。

    • ベストアンサー
    • Java
  • プログラムを捜しています

    昔コンピューターが開発された初期にFORTRANという プログラム言語があり、たとえば 1 FOR X=1 TO 5,1 2 Y=X^2+1 3 Print Y と入力すると、Y=X^2+1をX=1から5まで 1飛びに計算して  2, 5, 10, 17, 26 と出力することができました。これに相当する 方法は現在どうすればよいのでしょうか。 教えて下さい。

  • Fortranによるオブジェく志向プログラミング

    私は、ずっと、手続き型のプログラミングをやってきて、言語はFortranであり、そのプログラミングの内容は四則計算、ループ、分岐、ファイル入出力みたいなものに限定されていました。 ところが、最近はじめて知ったのですが、Fortranの2003ぐらいになるとオブジェクト指向プログラミングに対応していてクラス、メソッド、インスタンスなどのような概念が出てきたようです(だいぶ前からあったのかもですが、最近まで知りませんでした)。 そこで2つ質問なのですが、従来使っていた手続き型のプログラムはすべて原理的にオブジェクト指向プログラムに移行可能なのでしょうか。無理に移行しなくてもいいとは思いますが、そういう越境のようなことができるのかということですが(手間だけかかって時間の無駄かもしれませんが、訓練という価値はあります)。そして、最終的にはプログラミングというものがすべてオブジェクト指向に収斂してしまうということになるのでしょうか。 もう1つはFortranでオブジェクト指向プログラムができるという場合、バージョンとかそれに応じた仕様とかでその度合いに違いがあるのでしょうか。今までFortranで手続き型のプログラミング(四則計算等)をやっていたのでコンパイラの選択による違いに大差ないという感じでした(あまり方言がないとか)。オブジェクト指向ということになると”これはできるけど、あれはできない”とか際どい問題があるように思います。C++とかJavaの参考書に載っていたようなことがFortranで本当にどこまでできるのかという疑問です。これが明確にならないとただでさえ難しいオブジェクト指向プログラムで私のアルゴリズムにミスがあるのか、アルゴリズムは問題ないけどコンパイラがそれに対応してないという問題の区別がつかなくなると思うのですが。 Fortranのオブジェクト指向の解説本を見たことがないのでお尋ねしました。よろしくお願いします。

  • Fortranのインストールについて

     今晩は、質問させていただきます。どうぞよろしくお願いいたします。  環境:Win7 Home SP1 64bit メモリ16GB でございます。  大分前にFortran77を使用していた経験が少しございます。この度、Fortran90/95を インストールしたい次第でございますが、どれをインストールすれば良いのかが分かりません。。。 お詳しい方にご指導いただきたく質問させていただく次第でございます。  欲しい機能といたしましては、 ・テキストで書かれた数値計算プログラムをコンパイル →実行・計算できる。 ・もし計算精度や速度に違いがあるようでしたら、スペックの良い物。  (予算5万円程度以内でお願いいたします。) でございます。(ネットで検索しておりましたが、g95なるフリーの物の説明ばかり出てまいります。。。)  F77時代は、コマンドプロンプト上で計算していた記憶がございます。先ほど、 試しに「oi_ftn95_personalexe.exe」なるものをDL&インストールしてみまして、 Platoというソフトが入っておりましたが、こういった物は高速演算に不向きなのかな(?)などと勝手に考えております。(Visual Studio(少し触った事がございます)のような「ソフト開発用ソフト」イメージを受けましたので。。。)  できれば、沢山の演算を早く計算できるような物を入手したい次第でございます。  もしお詳しい方がいらっしゃいましたら,どうぞよろしくお願いいたします。

  • 熱伝導方程式を差分法で解くプログラム

    前回熱伝導方程式の差分法の解き方について質問させて頂いたものです。 https://sp.okwave.jp/qa/q9363032.html 回答ありがとうございました。おかげさまで差分法で解くプログラムを書くことができました。 書けたのは良いのですが、間違っている可能性が大きいです。 私の考えでは、安定性条件を満たしていれば dt,dxを小さくすればするほど、収束温度は変わらず計算精度が高くなっていくと思ったのですが、 私の書いたプログラムではdxdtの値を変えると収束温度まで変わってしまいます。 プログラムに関しても初心者なので説明が難しいのですが、やはり収束温度が値によって変わるということはプログラムがどこか間違っているということでしょうか。 度々すみませんが、回答いただけるとありがたいです。よろしくお願いいたします。