1 名前:デフォルトの名無しさん [2009/01/24(土) 18:32:01 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用)その3 pc11.2ch.net/test/read.cgi/tech/1196384126/ くだすれFORTRAN(超初心者用)その2 pc11.2ch.net/test/read.cgi/tech/1164121236/ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc11.2ch.net/test/read.cgi/tech/1163319215/
574 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:51:38 ] >>573 そんな話があるんですね。だったら最初から最適化しとけよ、と思わなくもないですが。 ずっと疑問なんですけど、元質問者ってそもそも何がしたいんだろう。 Fortran の勉強または単に Lapack を使う必要があるという程度なら、gfortran でも使っていれば良い。 Lapack なんてディストリビューションの公式ビルド(?)もあるだろうから、準備には手間取らない。 Debian なら Synaptic でも起動して検索すれば良いし、CentOS なら yum かな。 それでも基本的な知識が欠けているように見えるけど、考え過ぎかな。PATH の話を読んだときは噴き ました。こちらが立ち入る話ではないんですが、何となく迷走しているように見えたので。
575 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 19:06:12 ] >>573 それってopenmp以外のオプションを何も付けてない場合じゃないの? -fastや-O3などの普通の最適化オプションを付けている状態でopenmpオプションを足しても意味ないような
576 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 08:01:41 ] openmp つけると明示的に抑制しなければ auto やら (p)thread やらほかのも呼ぶはずけど、 どうだろうね。openmp 単独では最適化はデフォルトレベル以上はしないからどのみち -fast あたりと いっしょに使う前提だろうけど。
577 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 08:04:41 ] たぶん最適化されて速くなる、というよりは アドレスがらみのエラーが防げそう、とか 古い習慣のsave属性を仮定しないで処理する、とかがメリットなのではなかろうか。
578 名前:デフォルトの名無しさん [2009/08/23(日) 09:35:37 ] >>572 iomp5外したらlapackとか使わない簡単なソースはコンパイルできました!!! が、exampleのソースをコンパイルできないです。。。やっぱり同じエラーでます。。。 >>574 今やりたいことは逆行列求めるだけなんでlapackだけでいいし、 それぐらい自分で本見てプログラミングしろよって話なんですけど、 後々並列とかも使えるようにしたいのでmklを入れようとしたのです。 2週間ぐらい前に初めてvineインストールして、 環境変数とかも最近知ったので知識はまったくありませんorz
579 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 11:51:40 ] >>578 「___tls_get_addr」でgoogle先生に聞いてみたらVine Linuxだとglibcが古いのでエラーになるらしい ttp://biokids.org/?CCP4%2FAdvanced%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB CentOS5では>>569 のライブラリ指定で問題なくコンパイル/リンク出来ているので Vineの使っているglibcの問題じゃないかな? つーか、なんでVine? 特にVineを使う必要がなければIntelで動作確認してるディストリで試してみたら? #CentOS使っててこんな事言うのも何だが(まあ一応RHEL互換ではあるし)
580 名前:デフォルトの名無しさん [2009/08/23(日) 12:03:07 ] >>579 あああぁぁぁああああFedoraいれてみます!!!! みなさんありがとうございました!!!
581 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 12:14:51 ] >>578 > が、exampleのソースをコンパイルできないです。。。やっぱり同じエラーでます。。。 エラー内容は分からんが設定が出来ていないか、コンパイル時の指定にミスがあるかのどちら かだろう。 > >>574 > 今やりたいことは逆行列求めるだけなんでlapackだけでいいし、 > それぐらい自分で本見てプログラミングしろよって話なんですけど、 > 後々並列とかも使えるようにしたいのでmklを入れようとしたのです。 だったら gfortran でいい。並列も出来る。MPI が使えることは確認済み。OpenMP は知らん。 使ってる PC に複数の CPU があるのなら並列で動かす努力に意味もあるが、マトモに Fortran のコードを書けないうちから並列をやり始めても先に進めないまま時間が過ぎるだけのような 気がする。 知識も無いのに無理して intel を使う必要は無い。 ということで、自分でソース書けばよろし。あと Lapack のルーチンは処理内容に対して命名 規則があるので、それは自分で調べること。 しかし逆行列を求める程度のことで並列するヤツは居ないと思うが、そうでもない?>識者
582 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 14:25:29 ] >>581 スパコンのLinpack競争を知らんのかw
583 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 15:17:54 ] >>582 知りません。 並列については無知なので、だいぶイイカゲンなことを言っているとは思い ます。でも3×3行列程度で並列というのはそれ自体がナンセンスな気はしま す。3 が 10 でも 100 でも同様かと。100000 程度になれば意味はあるのか もしれませんが。元質問者がどの程度の規模のことをしたいのかによって選 択肢も変わって来るでしょう。 そもそも Lapack って並列を意識して書かれてないと思いますが、そんなこ とはないとか? 私は並列はやったことが無いですし、この先もやらないと思います。以前に gfortran で MPI が動くことを確認したときも、リンクの仕方は私が調べて から、「リンクの仕方は知らないけど、実行の仕方は知っている」コーハイ 君に簡単なプログラムで実行確認をしてもらっただけです。そのコーハイ君 はマトモなソースを書けな(ry 対象データを N 分割して、N 個の CPU に振り分け、個々の CPU で計算した 後に、それを1箇所にかき集めるというイメージしか無いです。間違ってる かもしれませんが。
584 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 16:47:13 ] 難しい話じゃなくて、サイズがでかけりゃ並列化するでしょ普通 問題は行列の性質。密行列なのか疎なのか、とか
585 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 17:24:37 ] >>583 逆行列計算にこそ並列化の最適化が進んでいる。 MKLなんか使えばCPU数に比例した効果が得られる。密行列だが。 そういう意味で、質問者は一応理にかなっている。 逆行列計算は、普通線形方程式を解く形で求めるが、線型方程式はアメリカの分散型の スパコンに非常に向いていて、自分に有利なようにLINPACKという線形方程式用のパッケージで スパコンベンチマークが行われている。 当然、その部分へのアルゴリズム研究や最適化がもっとも進んでいる。 ちなみに、おおよそLAPACK=LINPACK+EISPACK。LINPACKは線形演算、EISPACKは固有値演算 ライブラリで、1970〜80年代の米英国家プロジェクトの産物。原型はFORTRAN66で書かれていて NETLIB辺りに行けば今も拾えるはず。LAPACKは、それをFORTRAN77で統合したもの。 詳細は忘れたので間違ってるかもしれん(笑)LAPACKの前書きあたりを詳しく読んでくれ給へ。 これらの基底にBLASという基本サブルーチン集があって、この部分を書き換えることで ハードウェアのアーキテクチャーの違いをうまく吸収して何十年も生き残っている。
586 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 17:29:09 ] なるほどそういう背景だったのか
587 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 18:16:07 ] GotoBLAS って、そのBLASを後藤さんが最適化したものなの?
588 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 18:46:54 ] LAPACKって疎行列も対応してるの? 密より疎のほうが一般的だよな
589 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 19:24:46 ] >>587 そのはず。 昔はベンダーがよくBLASだけアセンブラで最適化したのを配っていた。 ベクトル機時代はBLAS2あたりの行列*ベクトルが、今はBLAS3あたりの 行列*行列の最適化が肝らしい。 >>588 元々は密行列のみ。scaLapackとか、疎もじわじわやっている。 疎行列はベクトル機に向いていたので80年代以降すごく流行った。 数値計算のアルゴリズムも、ハードウェア・アーキテクチャに合わせて流行が変わる。 最近の並列計算機の進歩のせいで、たとえスカスカの疎行列でもメモリーに載るなら、 密に展開して密行列のライブラリを呼んだほうが有利なことがあるらし。 アメリカ人が必死になって分散メモリー・スパコン用のアルゴリズム開発をしている。 固有値問題も教科書的にはO(N^3)だが、並列機で密行列のO(N^2)のアルゴリズムが 見つかったとかいう話。詳しくは知らん(笑
590 名前:589 mailto:sage [2009/08/23(日) 19:35:34 ] なぐり書いたがscaLapackは疎じゃなかったな。 上記は、話半分嘘半分で読んでおいてくれ(笑)
591 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 09:54:36 ] >>589 > 最近の並列計算機の進歩のせいで、たとえスカスカの疎行列でもメモリーに載るなら、 > 密に展開して密行列のライブラリを呼んだほうが有利なことがあるらし。 これってどんなメリットがあるの? 単純にメモリー消費の事考えると、無駄多すぎて話にならんし。 構造格子のFDMを例に取ると、隣接点が6だから、 マトリクスのサイズが100万だと、メモリー効率が16万倍くらい違う。 (本当はポインタやらあるけど、単純化すると) それを帳消しにするだけのメリットというのがわからんのだけど。
592 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 22:19:00 ] >>591 スピードつーものは考えんのか? スパースったって色々あるだろが、お前の帯行列だけがスパースなのかよ。 つーか帯行列は帯行列で別のカテゴリになってるだろ。 あんた相当頭が固くて視野が狭いから、お刺身の上にタンポポを載せるような仕事のほうが向いてると思うよ。
593 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 22:37:06 ] 正しいことを言っているのに書き方一つで尊敬されなくなる好例 最近はメモリのペナルティーが大きすぎるから10倍ぐらい計算量が多くても ストールしないアルゴリズムを選んだ方が速くなるという話の一環だと思う
594 名前:591 mailto:sage [2009/08/25(火) 11:27:29 ] > たとえスカスカの疎行列でもメモリーに載るなら、 > 密に展開して密行列のライブラリを呼んだほうが有利なことがある の根拠は、 > 最近はメモリのペナルティーが大きすぎるから10倍ぐらい計算量が多くても > ストールしないアルゴリズムを選んだ方が速くなるという話の一環だと思う とういう話があるということか。なるほど。 ただ、これってかなり特殊なマトリクスに限定した話の気がするな。 物理シミュレーションの世界で出てくるスパース行列だと、 離散点の値を使って平衡方程式解くときには、微小領域近傍の値だけを使うので、 一行あたりの非ゼロ項の個数はせいぜい数十〜数百のオーダーになるのが普通。 大規模なスパース行列だと10倍どころじゃなく超スカスカになるんで、 上記の根拠をもとにスパースを密行列で置き換えるのは難しいと思う。 と書くと、また頭が固いとか視野が狭いとか言われてしまうかw >>592 プライド傷つけてごめんねw
595 名前:デフォルトの名無しさん [2009/08/26(水) 18:45:09 ] 大学の研究室でfortranを使い始めたんですけど、 プログラム1で出力した座標データを プログラム2でもう一度読み込みたいのです。 データの受け渡しの際に、x,y,z のように一行に三つの数字が並んでしまっている状態なのですが、 1.プログラム1において出力する座標データの桁数をそろえて座標データファイルを作り、 2.プログラム2において座標データファイル内のx,y,zの3つの数字をそれぞれ関数に読み込みたい と思っているのですがプログラム1のwrite文とread文をどのように書いてよいかが分からず困っています。 どなたか教えていただけますでしょか?
596 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 02:07:26 ] read(unit=11,fmt='(3(x,f10.5))') x,y,z write(unit=11,fmt='(3(x,f10.5))') x,y,z とか、かな。fmt= はなくてもいい。 複数の連続する空白はひとつの区切りとみなされるから 読み込む側では書式指定は必要でないから write(unit=11,fmt=*) x,y,z でも可。数字の11の部分は適当に自分で決める。
597 名前:デフォルトの名無しさん [2009/08/27(木) 15:16:39 ] >>596 さんありがとうございます! さっそく試してみます。
598 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 17:08:14 ] >>594 まぁそうだわな > たとえスカスカの疎行列でもメモリーに載るなら、 > 密に展開して密行列のライブラリを呼んだほうが有利なことがある は、せいぜい10^3以下のちっこいマトリクスにしか当てはまらんと思う 応用の人達にとってマトリクスソルバの開発・実装に時間なんて割きたくないし 数値計算の研究者には大いに頑張ってもらいたいね
599 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 18:37:26 ] Lapack スレとかあったらどんな具合に荒れるんだろうなどと考えてしまった。
600 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 18:55:35 ] 荒れてるうちに入らんだろこんなの
601 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 22:38:15 ] CLAPACKのスレならシミュレーション板にあるw
602 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 16:16:28 ] fortran 90/95にはCのqsortのような汎用ソート関数は無いのでしょうか? Cのqsortはvoidポインタやら関数ポインタやら使ってるからfortranではやはり無理なのでしょうか?
603 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 16:26:19 ] >>602 slashdot.jp/~t-nissie/journal/450101 こんなんとか
604 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 21:29:22 ] subroutineを呼び出すときに、 ・ ・ IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) THEN CALL DIST(N) END IF ・ ・ ・ SUBROUTINE DIST(N) ・ ・ だと普通に呼び出せるんですが、 IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) THEN CALL DIST(N,M) END IF ・ ・ SUBROUTINE DIST(N,M) とすると「実引数の数は仮引数の数より多く出来ません」(callの行にエラー)と怒られます。 N,Mはそれぞれ暗黙の型宣言による整数で、念のためちゃんと宣言してみても同じエラーが出てコンパイルできません。 整数型2個で同じなはずだと思うんですが… ちなみに呼び出す側も別のサブルーチンの一部で、どちらも多くのmoduleをuse文で使ってますが関係ないですよね? 今のところ仕方ないんで別にmodule文を作って変数を共有してますが、何か気持ち悪いので考えられる原因を教えて頂けますか?
605 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 01:08:16 ] >>604 エラーメッセージを素直に解釈すると、サブルーチンの宣言で引数が1個しかないので 齟齬が生じていると言っている。 SUBROUTINE DISTの宣言の数行を貼ってもらえれば、なにか分かるかも。
606 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 16:21:33 ] >>605 うーん。でも下の例ではN,Mの二つを取ってるんですが。 >>SUBROUTINE DISTの宣言の数行 というのはこのサブルーチンの中の変数とかの宣言部ということですか? SUBROUTINE DIST(N,M) use cell use sample use comp use gas DOUBLE PRECISION VEL(3),T,TROT,DBOLTZ use文は単に変数の定義を行っているmodule文に対するもので、 呼び出し元でも同様にuse文で参照してます。 DOUBLE PRECISION...の部分は呼び出し元にはありません。
607 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 01:47:05 ] >>606 わからんw 中間MODファイルが更新されてないとか、ありえなさげな事しか思いつかない。 まぁDIST2222とかありえ無そうな名前に変えて見てようすを見てみるとか。
608 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 08:38:02 ] >>607 MODファイルの事は思ったな〜。念のため別なディレクトリでテストするとか・・・かな。あとは IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) THEN CALL DIST(N,M) END IF を、 IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) CALL DIST(N,M) だけにするとか、 IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) THEN Iminashi=1 1374 continue CALL DIST(N,M) END IF みたいに結果に影響しない行を一つ二つ添えてみるとか。う〜ん。
609 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 10:31:39 ] >>607 >>608 ホンットすみません。DIST2222にしたら通りました。んで、OS再起動して元の名前にしても通りました。 なんかの理由で「中間MODファイルが更新されてない」になってたっぽいです。 プログラム上の問題じゃなかったですね…申し訳ない。
610 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 13:09:44 ] 初心者ですみませんが質問させてください。 LINUXでintelのコンパイラ11をインストールしたのですが、 ifort 実行ファイル で命令すると、次のようなエラーが出てしまいます。 error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory ifort: error #10273: Fatal error in /opt/intel/bin/ia32/fortcom, それぞれ指定されたファイルを見てもよくわからなかったので、 どうしたらコンパイルできるようになるか、ご教授おねがいいたします。
611 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 13:24:41 ] >>610 ただLINUXと表現するのではなくて、 ディストリビューションとバージョンをさらすといいかもしれない。
612 名前:610 mailto:sage [2009/09/18(金) 13:27:34 ] ubuntu 9.04 です。お願いします。
613 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 13:41:00 ] >>610 「intelコンパイラが想定しているc++の標準ライブラリより新しいものが入ってる」 に一票 どっかから, libstdc++.so.5を拾ってくるしかないと思われる # これ以上は聞かないで, 犬のことはくわしく知らないw
614 名前:デフォルトの名無しさん [2009/09/18(金) 13:55:39 ] >>610 ttp://beken.cc.miyakonojo-nct.ac.jp/wp2/?p=1208 によると > 私の環境で前もってインストールしておくべきだったものは、以下のパッケージです。 > どちらも[システム]>[システム管理]>[Synaptic パッケージ・マネージャ]でインストールしました。 > > * g++ > * libstdc++5 > > libstdc++6は既にインストールされていましたが、libstdc++5はインストールされていませんでした。 > またlibstdc++5をインストールしなくてもifort自体はインストールできちゃいますが、 > プログラムのコンパイルの時に必要になります。インストールしておきましょう。
615 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 14:01:50 ] ubuntuとかfedoraとかは新しいのを積極的に取り入れるタイプだから、 こういう数値計算に使うときは少し古めのにするか、もう少し安定志向な ディストリにするのが良いと思う。豆知識な。
616 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 00:31:12 ] ifort 11.1、error #5082: 構文エラー やっと直った。
617 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 00:21:58 ] 黒カエラーwwww
618 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 02:36:35 ] 処理系:gfortran v4.2 したいこと:モジュールに関数オブジェクトを保持させたい。 例えば、モジュールに変数3をセットし後に取得するプログラム module Test implicit none integer,private::a contains subroutine set(x) integer,intent(in)::x a = x end subroutine integer function get() integer::get get = a end function end module program main use Test implicit none call set(3) print *,get() end program というものを書くことが出来ます。 同じように、モジュールに関数を保持させることは可能でしょうか?
619 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 02:43:36 ] オイラー法のプログラムを書こうと思っているのですが、関数渡しで subroutine proceed(f,x,y,step) interface double precision function f(x) double precision::x end function end interface ... end subroutine と引用仕様記述を書くのではなく、例えばtarget_functionという変数名 に保持してしまって、後は target_function(x) というのを呼び出すだけ、みたいなのにしたいのです。
620 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 19:24:10 ] >>618 integer, private, SAVE :: a にすればおk? save無くても大概大丈夫だと思うが。
621 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 19:50:23 ] >>620 値じゃなくて、できれば関数保持する方法が。 >>618 は何したいのかわかりやすくする為の例だったんですけど、 我ながら読むと分かりにくい。 似たような感じで、関数を保持させたいんです。
622 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 22:21:48 ] >>621 PROCEDURE POINTER で駄目かな? インターフェースは要るが。 MODULE m_unko IMPLICIT NONE INTERFACE REAL FUNCTION f1(x) REAL, INTENT(IN) :: x END FUNCTION f1 END INTERFACE PROCEDURE(f1), POINTER :: unko REAL, PARAMETER :: pi = 4.0 * ATAN(1.0) END MODULE m_unko ! PROGRAM omeko USE m_unko IMPLICIT NONE unko => SIN PRINT *, unko(pi) unko => COS PRINT *, unko(pi) STOP END PROGRAM omeko
623 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 22:59:45 ] 横からですいませんが、PROCEDUREって何ですか? 90以降の機能ですかね?
624 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 23:51:06 ] >>623 Fortran2003 の機能です。 副プログラムのインターフェースを、一括化できたりします。 インターフェースを書く代わりに、 Procedure (sub0) :: sub1, sub2 など。 type っぽいかんじで。
625 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 00:28:40 ] >>624 なるほど。ありがとうございます!
626 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 05:28:41 ] >>622 ありがとうございます。 でも、gfortranの4.2じゃできないっぽいですね。 v4.3以降でサポートなので、v4.3入れてやってみます!
627 名前:デフォルトの名無しさん [2009/09/27(日) 07:50:23 ] お礼はいりませんよ。
628 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 07:04:01 ] program orei implicit none do while (.true.) write(*,*) '627 ありがとう' end do end program orei
629 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 17:46:13 ] Fortranの名著的な入門書ってありますか?
630 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 17:56:00 ] 森口繁一のFORTRAN入門?
631 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 18:18:32 ] それって77じゃない? あえて理由がない限りは、77はすっとばして90の勉強をしたほうがいいと思うけど
632 名前:デフォルトの名無しさん [2009/10/03(土) 18:18:59 ] 浦昭二編のFORTRAN77入門改訂版だろう やっぱ プログラミングの入門者には迷著かもしれないが
633 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 19:00:12 ] >>631 そうは言うがな、大佐。 F90以降は入門書どころか日本語の書籍自体少ないし・・・
634 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 19:35:16 ] 倍精度の説明をキッチリやってる本ってあったっけ?見た 記憶無いんだが。 90 といえば bit の別冊であったけど、あれも絶版だよね。 単行本にしたらいいのに。あとソフトバンクからも90の本 は大昔に出てたそうだな。どっちも持ってないけど。
635 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 02:12:27 ] >>634 Bit別冊はMetcalf&ReidのFortran90 Explainedの訳本だから、まぁ今は最新版の原著を買えばいい? 入門書とはいえない気もするが。
636 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 19:45:15 ] C++は数年使ってるんだが大学で初めてFortran使わされることになった templateとかクラスがなくて心細いよ
637 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 20:23:56 ] まだFortranを使わせる所もあるんだ。 物理系?
638 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 20:38:02 ] うん物理
639 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 21:56:45 ] 分野にもよるけど地球物理系もFortranがバリバリ現役 しかもFortran77 過去の資産有りすぎ Fortranのサブルーチンは変数が参照渡しだから 他の言語に移植するときめんどい
640 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 23:59:49 ] 77はダイレクトに変数とかに触っている気がして気持ちいい。 90/95とかだと膜ごしに触っているような感触と言うか。 でもINTENTとかをガチガチに書いた90の方が全般的には気持ちいいが。 2003は実行時の多態化とか入れて便利そうなのは分かるが、また実行時バグが増えそうで 微妙な感じがする。
641 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 00:07:32 ] >>640 >INTENTとかをガチガチ 計算用の言語としては、この辺で十分な気がする。 十分具体的で十分美しい。かつ十分便利。 もう95位で仕様凍結してくんないかな・・・
642 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 02:24:23 ] >>641 > もう95位で仕様凍結してくんないかな・・・ 同意。色々と弄られるとついて行けなくなりそう。個人的には Fortran90 で十分と思ってしまうのだが、これは少数派かも。
643 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 08:27:30 ] intent の in out で変数値書き換えチェック interface 文で呼び出す側で心つもりも教え pure 属性をつけてインラインしやすくしてあげる だけど固定書式をつらぬくのが漢! うそだけど。 固定書式に目が慣れてるといまさら自由書式にしにくいのよね。 右側7文字が空いてないとそわそわしてしまう。
644 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 10:09:52 ] 左側?
645 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 16:19:47 ] ひとつのモジュールのなかにオーバーロード?用のinterfaceと実装をまとめて記述したいんですがどう書いたらいいんでしょうか?
646 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 19:46:13 ] >>645 こんな感じ? module mod1 interface sub module procedure sub_int, sub_real end interface contains subroutine sub_int(n) integer, intent(in) :: n print *, "INTEGER", n end subroutine sub_int subroutine sub_real(x) real, intent(in) :: x print *, "REAL", x end subroutine sub_real end module mod1 ! --------------- program prog1 use mod1 call sub(1) call sub(2.0) end program prog1
647 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 20:37:51 ] >>646 まさにこれです ようやっと期待通りにコンパイルできました 有難うございました
648 名前:デフォルトの名無しさん [2009/10/15(木) 04:55:19 ] 通りすがりだけど、参考にしよう。 この例のは、引数の型で振舞を変える事ができるから、標準のmaxやmin関数を連想した。 ・・・引数の変数名の数の違いで振舞を変えるもの作れるのかな?
649 名前:デフォルトの名無しさん mailto:sage [2009/10/15(木) 13:56:19 ] >>648 任意個数引数の副プログラムは作れないと思う。 Array Constructor で、見かけ上引数を沢山並べるが、引数的には配列として受け取るようにすれば 実現できる気もする。 Call sub( [a, b, c, d, e, f, g] ) Subroutine Sub( x ) Real, Intent (in) :: x(:) みたいな。
650 名前:デフォルトの名無しさん [2009/10/15(木) 14:41:54 ] おお、そういうやり方があるんだ。 今コンパイラを使えない状況にいるので・・、 とりいぞぎお礼まで。
651 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 00:37:33 ] >>650 補足するならば、[ ] はfortran2003での導入なので、f90的には(/ /)となる。 確定した有限個まででよければ、optional引数を使うとか、1個からn個までのサブルーチンを用意して、 総称名を与える方法も考えられる。
652 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 20:54:23 ] たった今Fortranをやり始めたものです。コンパイラーはg95を使ってます。 最初の宣言部であるパラメータのベクトル p を宣言しようと思って、 real, parameter, dimension(3) :: p(1)=0.5, p(2)=0.8, p(3)=1.6 のように入力したのですが、 Error: Symbol 'p' at (1) already has basic type of REAL というエラーメッセージが表示されました。ただ、このメッセージの 意味さえ解せない状況です。どなたか正しい方法を教えていただけ ないでしょうか。よろしくお願いします。
653 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 00:53:45 ] >>652 こうすれば、おk。 PROGRAM test IMPLICIT NONE REAL, PARAMETER :: p(3) = (/ 1.0, 2.0, 3.0 /) ! f90/f95 !REAL, PARAMETER :: p(3) = [1.0, 2.0, 3.0] ! f2003 PRINT *, p STOP END PROGRAM test
654 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 01:29:41 ] >>653 ありがとうございます!
655 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 20:19:27 ] common文の代わりにmoduleを変数の共有に使ってるんですが、 そのサブルーチンの中で使ってないmoduleをuseしたりすると (バグの温床になる以外に)何か弊害ってありますか? どの変数を使ってるか確認する手間が大きくなり過ぎた場合に 全てのmoduleをどさっとuseしても構わないもんでしょうか?
656 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 12:57:28 ] >>655 依存関係が無くても、USEされているためにリコンパイルされる可能性があるが、 文法的には問題ないような。
657 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 17:41:02 ] >>655 ローカルの変数とコンフリクトしたらコンパイラが教えてくれるので ぜんぜん問題ないと思うけど・・・ どっさりuseしなきゃならんサブルーチンの構成は、 見直した方が幸せになれるかもね
658 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 07:49:59 ] use 文って便利だけど不便だよねw
659 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 22:49:38 ] Intel の Steve Lionel が鉄腕アトム劇場版を見て面白かったと言ってるw ttp://twitter.com/DoctorFortran じじい受けするのか?
660 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 04:02:09 ] NaNが出てきちゃった時、どうやって原因を突き止めますか?NaNが発生してると思しきところと 発覚するところが離れてる上に乱数使う手法で、しかもたまにしか起こらないので手の付けようがありません。 ズバッと解決はしないかもしれないけど何か助言をもらえればうれしいです。
661 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 05:20:01 ] >>660 乱数を使っているなら、種を特定すれば良いんじゃないか?種を手で与える方法もあるんだし。 現象が起きるときの種が分かっていればバグ取りは出来るはず。それだけでは足りないかもし れないけど、何も情報が無いよりはマシ。 あと、NaNが出る式の実行直前に、式で使う変数の中身を書き出せば何か分かるかもしれん。 何をやっているのか分からんので、それくらいしか言いようが無い。
662 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 05:43:13 ] なるほど…ありがとうございます。ちょっとその方向で試してみます。 Xの値を調べて場合分けするんですが、XがNaNなのでエラーが出て発覚する、って感じです。 その場合分けしてる位置よりかなり以前の複数の場所でXが代入されてる上にXの代入が多すぎて 全部調べるのが厳しいんです。といってもそれしか思いつかずちまちまやってました。
663 名前:デフォルトの名無しさん [2009/10/26(月) 06:44:30 ] 宣言した範囲外の配列値を参照すると subscription out of range のエラーを出さずに NaNや変な値を返して計算をぶっ続けるシステムもあるよね。一応配列もチェックすることをお薦めする。 システムごとにNaNやInf検出して停止させる機能があると思うけどな。 発生した場所をソースの行番号で教えてくれる・・・はず。 富士通Fortranはデバッグ機能が神がかり的に優秀だけどIntelその他にも似た機能はあるだろう。 自分で直接追求するときにはとりあえず if (.NOT. ((x .GT. -1.0) .OR. (x .LT. 1.0))) then ... の判定で場所を特定してるけど・・・みんなはどうやってNaN発生を見つけてるの?
664 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 07:03:59 ] >>663 配列の宣言外領域へのアクセスについては、実行時にチェックするオプションを 付けてコンパイルしている。でも個々の変数の中身がNaNになったら止める方法 は知らない。あれば知りたいくらいだ。 しかし変数にNaNが入った時点でプログラム自体に問題があるように思うのは間 違ってるだろうか?初期化の時にNaNを入れるのも可笑しいしなぁ。
665 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 23:19:35 ] >>664 Fortran2003ならIEEE754例外を拾う関数がある。 F2003でなくても最近のコンパイラはベンダー拡張サブルーチンでIEEE例外を検知できることが多い。
666 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 02:55:23 ] >>665 有り難うございます。貧乏なので gfortran しか持ってません。並列とかするわけでもないので 特に困る事もないのですが。で、その gfortran のマニュアルを見ていたら、isnan() という関 数がありました。これで検知だけは出来そうです。オプションでも -ffpe-trap というのがあり ましたが、使ってみたら実行時に警告が出ただけで、プログラム自体は正常終了してた。使えな いのかな。それとも PPC なのが悪いのか。取り敢えず気になる変数だけ、isnan() を使ってチ ェックすれば良いかな、と思うことにしました。 C マニュアルに載ってたサンプル: test_nan.F90 とでもする program test_nan implicit none real :: x x = -1.0 x = sqrt(x) if (isnan(x)) stop '"x" is a NaN' end program test_nan % gfortran test_nan.F90 -ffpe-trap=invalid % ./a.out Fortran runtime warning: IEEE 'invalid operation' exception not supported. STOP "x" is a NaN % echo $? 0
667 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 08:51:44 ] 通りすがりがテストしてみた。 % gfortran test_nan.f90 -ffpe-trap=invalid In file test_nan.f90:6 if (isnan(x)) stop '"x" is a NaN' 1 Error: Function 'isnan' at (1) has no IMPLICIT type コンパイル止まったお! バージョンにも依るのかな? SPARCかな、CPUによってはNaNやInfが出てくるとハード的にフラグをたててくれるみたいだけど 一般的じゃないからなあ。 >>663 の条件式はハードやコンパイラ関係無くNaNは見つけてくれそうだけど、 システムによっては+/-Infは判定できないんじゃないかな。
668 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 09:43:51 ] >>666 です >>667 うちは % gfortran --version GNU Fortran (GCC) 4.4.1 だった。マニュアル(但し 4.4.2 版)によると、isnan は論理型とのこと。オプションの -ffpe-trap=invalid は無くても isnan 自体には問題なかった。 自宅にある唯一の Fortran90 の本「Fortran90/95 explained (2nd ed.)」によると、ieee_arithmetic という モジュール?には ieee_is_nan という関数があるとのことだけど、モジュールってどうやって使うの?ずっと 77でやってきたから知りません。イイカゲン90の勉強をした方が良さそうな気がして来たが、もうFortranを 使う用事ってないんだよなぁ。趣味で数値計算でもしない限り。 あと、名前付き定数?(named constants)というヤツの中に ieee_nan というのがあるらしい。取り敢えず 同書から引用しておきます。 ieee_nan The scoping unit must support NaNs for at least one kind of real. これを何の目的でどう使うのかは分かりません。ゴメンナサイ。
669 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 12:41:45 ] ありがとう。 GNU Fortran (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42) ・・・2年前のだった。 こんど再挑戦してみるよ。
670 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 18:07:40 ] そんな難しいことする前に、 ゼロ割とSQRTチェックがまだだったら、 そこ見た方がいいよ。 もうチェック済ならスマン
671 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 22:09:11 ] 列の数が任意のテキストデータ(列間は空白など)を読む方法を 考えているのですが、上手い方法が思いつきません。 行の場合は、EOFのチェックをすればいいので簡単なのですが・・・
672 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 02:02:02 ] >>671 EOR end of record のチェックをするという手もある。自由フォーマットだとうまく行かないが。 あとは、一度一行を文字列として読んで、次にその文字列を内部ファイルとして、それから読み出す というやり方も考えられる。 データの幅が一定フォーマットなら比較的楽。 空白で切ってるだけで可変長の場合は、ややめんどいかな?
673 名前:672 mailto:sage [2009/10/28(水) 02:11:12 ] PROGRAM test IMPLICIT NONE ! INTEGER, PARAMETER :: iostat_eor = -2, iostat_end = -1 REAL :: a(20) INTEGER :: io, i, k CHARACTER (LEN = 136) :: text ! prepare data DO i = 1, 10 WRITE(9, '( 10(F10.5, X) )') (REAL(k), k = 1, i) END DO CLOSE(9) ! (2) ! DO READ(9, '(a)', IOSTAT = io) text IF (is_iostat_end(io)) EXIT ! f2003 a = a / 0.0 ! NaN READ(text, *, IOSTAT = io) a IF (is_iostat_eor(io)) EXIT ! f2003 PRINT *, a END DO STOP ! (1) ! DO READ(9, '(10F10.5)', IOSTAT = io) a IF (is_iostat_eor(io)) EXIT ! f2003 IF (is_iostat_end(io)) EXIT ! f2003 PRINT *, a(1:10) END DO STOP END PROGRAM test
674 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 15:56:59 ] 質問です。 シンプソン法を用いてy=exp(x)の計算プログラムを作っています。 以下のプログラムの15、16行目のfun()の中には、 何を入れればいいのでしょうか?