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/
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()の中には、 何を入れればいいのでしょうか?
675 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 15:58:29 ] program simpson1 implicit none integer::m,i real(8)::a,b,s,s1,s2,h,x,fun external fun 1 continue write(*,*)'INPUT DATA' write(*,*)'A,B,M ?' read(*,*)a,b,m if(m<=0)stop h=(b-a)/m s1=0.D0 s2=0.D0 do i=1,m/2-1 s1=s1+fun(i) s2=s2+fun(i) end do s1=s1+fun((m-1)*h+a) s=h/3*(fun(a)+fun(b)+4*s1+2*s2) write(6,100) s 100 format(2x,'IR=',D16.6) end program simpson1 ! function fun(x) implicit none real(8)::fun,x fun=exp(x) return end function fun
676 名前:671 mailto:sage [2009/10/28(水) 16:19:35 ] >>672 ,673 ありがとうございます。 「一度一行を文字列として読んでから、その文字列を内部ファイルで読み出す」は応用が利いて便利ですね。 区切りを空白とする以外はフォーマットを限定しない仕様にしたかったので、 この方法がベストだと思いました。NaNのチェックはisnan()を使いました。 最後にもう一点お聞きしたいのですが、EORはformattedで読む場合も関係あるのでしょうか? また、どういう使い方をするのでしょうか?
677 名前:デフォルトの名無しさん [2009/10/28(水) 17:00:51 ] サブルーチンについての質問したいことがあるのでソース貼らせていただきます。 お忙しいとは思いますが、よろしくお願いします。まず下のソースを見てください。 このプログラム自体は完成しているのですが、 DO 1040 a=1,M DO 1030 k=1,24 AVE(a)=AVE(a)+(sl(k,a)) 1030 continue WRITE(2,*)AVE(a)/24 1040 continue の部分をサブルーチンで直して来いといわれたので、 サブルーチンについて調べて色々やりくりしてみたのですが サブルーチンについての理解が乏しいため上手くいきません。 もしこの箇所をサブルーチンを利用して書き換えるならどのようになるのか教えていただけませんか? よろしくお願いします。
678 名前:デフォルトの名無しさん [2009/10/28(水) 17:02:47 ] 上の続き(ソース)です。よろしくお願いします。 implicit none integer MM,KK,M,K,a parameter (MM=400,KK=100) integer year(MM),month(MM),day(MM),sl(KK,MM),AVE(MM) character cdummy,CFNAME*110,CFNAME2*80 M=0 CFNAME='/home/maekawa/numeric/kure.txt' open(1,file=CFNAME,status='old') 1010 M=M+1 read(1,10,END=1020)cdummy,year(M),cdummy,month(M), @ cdummy,day(M),(cdummy,sl(k,M),k=1,24) 10 format(A5,I2,A1,I2,A1,I2,24(a1,I3)) write(6,*)year(M),month(M),day(M),(sl(k,M),k=1,24) goto 1010 1020 close(1) M=M-1 CFNAME2='/home/maekawa/numeric/aki.txt' open(2,file=CFNAME2,status='old') DO 1040 a=1,M DO 1030 k=1,24 AVE(a)=AVE(a)+(sl(k,a)) 1030 continue WRITE(2,*)AVE(a)/24 1040 continue CLOSE(2) end
679 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 02:45:00 ] >>676 EORはF90以降だったようだ。 昨日は勘違いして77時代からあった気になっていた。使い方を良くわかっていなかったww 文法書を見てもらった方が早いが、そもそもFORMATつきでADVANCE='NO'でないと駄目のもよう。 77だとIOSTATでエラー番号を見ればEORを検出できるが、I/Oエラー番号はベンダー依存。 他のI/Oエラーが出ない自信があれば、ERR=nnで飛ぶことも可能。 77だとブランクを数値ゼロに解釈するので、文字列を内部ファイルとして読む場合に 色々前処理をしないとうまくいかないかもしれない。 90なら文字列をTRIMするなり、フォーマットをBNにするなりで対処しやすい。 まとまり無くてスマソ
680 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 12:12:40 ] そもそもFortranは「任意のサイズの○○」というのがやりにくい言語だよね そういうもんだと思って諦めてるけど
681 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 14:11:01 ] 最初に1回から読みして要素数(行数)確認してから Allocate...とか、かな。 でもこの辺の取り回しはどの言語も同じだよね。 使っていくうちに増える場合には 一度既存のデータ配列と同じサイズのTempな変数をAllocateしてそこに移して、 元のを開放してからまた同名で要素一個大きいのをAllocateして TEMPのを移して、TEMP開放、の流れは基本同じだし。
682 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 14:13:51 ] 終始一貫変化しない任意のサイズ、でなかったら77だときついな。 データを一度ファイルに落として、そのファイルの行数を数えてから 自動配列で配列生成してそのファイルを読む・・・・・とか。 不可能じゃないけどイヤだなw。
683 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 18:38:33 ] >>681 Fortranに限らず、データの個数が任意に変わる場合は ポインタ使ったリスト構造を作るのが普通じゃない? >>682 結局は、「Fortranでそういうことスンナ」って話になるよねw 速度的にも宜しくないし、データ量の多い科学計算には相容れない
684 名前:デフォルトの名無しさん [2009/10/30(金) 04:46:30 ] ・・・馬鹿でかい配列を最初に定義してそこで処理するのもなあ。 メモリがもったいない事は今はあまりないけどやはり非効率だし 場合によっては十分大きくとったつもりでも足りなかったり。
685 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 09:47:58 ] IBMのFortranのオンラインマニュアルにも、Fortran77と違って 大きな配列を最初に定義しなくて良くなりますよ〜、という事を Allocateのメリットの例にしてるくらいだからな。
686 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 13:27:32 ] FORTRANは言語仕様が堅くて大変だねえ C/C++ならそういう問題で頭を悩ます必要もないのに
687 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 14:46:45 ] >>686 最適化がしやすいようにわざと堅く作ってあるんだよ C/C++は確かに自由な文法だが最適化がしにくい
688 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 15:49:03 ] 最適化しにくいし、コンパイラ毎に推奨される書き方の違いは Fortranより大きいと思う。個人的にはこっちがいやで Fortranを中心に使っている。 でもやはりというかCのI/Oその他の自由度の高さゆえに 最終的には混ぜこぜコードの出来上がり、になる事も多いけど。 Cはコーディングの自由がありすぎて、結局サイトや教科書の 部分的丸写しが多くなっちゃうから上達しないだけなんだろうけどな。
689 名前:671 mailto:sage [2009/10/30(金) 18:45:48 ] >>679 レス遅くなりましたが、ありがとうございます。調べたところ、要するに 「form='formatted' かつ advance='no' の場合に限り、 eor=文番号 が使える」 ということなんですね。 ↓のコードでテストしてみました。 <ソース> real :: f(5) write(10,*) 1.0 , 2.0 , 3.0 write(10,*) 4.0 , 5.0 , 6.0 write(10,*) 7.0 , 8.0 , 9.0 rewind(10) do i=1,2 f=0./0 read(10,'(3f)',advance='no',iostat=io,eor=999) f print *,'io=',io print *,f enddo stop 999 print *,'EOR detected!' print *,'io=',io print *,f end <出力> io= 0 1.000000 2.000000 3.000000 4.000000 5.000000 EOR detected! io= -2 6.000000 0.0000000E+00 NaN NaN NaN
690 名前:671 mailto:sage [2009/10/30(金) 19:00:00 ] ふと思ったのですが、「レコード」というのはunformattedの場合の概念であって、 単なるASCIIであるformattedでは関係ないはずですよね。 そうすると、EOR(End Of Record)ではなく、EOL(End Of Line)などと 呼ぶほうが適切なのでは、と思ってしまいました・・・。 いずれにしろ、私的には文番号はデバッグ時を除いて使いたくないので、 >>676 の方法がベストですね。
691 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 20:14:11 ] >>690 IOSTATの番号で見ればいいので文番号は必須ではない。 しかし、いったん1行を文字列に読んで、加工するなりして、 内部ファイルで読むのがいろいろ出来て便利。 EORの呼び名に関しては、御説ごもっともだが、多分ADVANCE=’NO'によって、 逐次型本来の行単位のアクセスではなく、その内部の要素ごとで、ファイルの現在位置を 止めうるようにしたので、ダイレクトアクセス的なネーミングにしたのではないかと想像?
692 名前:671 mailto:sage [2009/11/01(日) 21:01:41 ] >>691 ほんとですね。ありがとうございます。 iostat= と eor= の少なくともどちらか1つを指定していないと、 EORになった時点で↓のようにエラー終了するようですね。 forrtl: severe (268): end of record during read, unit 10, file ・・・
693 名前:デフォルトの名無しさん [2009/11/04(水) 05:59:17 ] IOの挙動がらみで複数の行き先指定すると その後にgotoスパゲッティになることがあるからムズムズする。
694 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 16:22:39 ] メジャーな環境で動く汎用的なコードを書こうという場合、 安心して使えるFortranのバージョンってどれでしょうか? 少し前は「90にしとけ」って話をよく聞きましたが、最近は 95や2003も問題なく通用すると思って良いんでしょうか?
695 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 01:39:36 ] >>694 F95が標準の地位を占めたという感じでないか? 更新していないシステムでは、まだF90の環境が結構残っている。 F77はコマンド名として存在していてもF90のコンパイラを固定カラムなどのオプションで 呼び出していることが多い。 F2003はようやくCRAYが完全対応したところで、ベンダーごとに独自の部分的な対応に とどまっているのが実情。簡単なところから対応しているから大体は重なっているが。
696 名前:デフォルトの名無しさん [2009/11/05(木) 05:21:56 ] もともとがF77で始めたせいで、いまでは固定書式&左側6文字空白&72文字制限つきで でも命令文はF77~95の混在したコードになってもうた。プリプロセスも混ぜてるから拡張子は.fppだ。 まあでも、gfortran と intel fortran はちゃんと処理してくれるから、いいや。 FujitsuのもOKみたいだし。 無駄に行数が増えてしまうけど左側が空いてるとなんか安心するw
697 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 14:12:15 ] >>695 ありがとうございます。 F95で書こうと思います。
698 名前:デフォルトの名無しさん [2009/11/06(金) 02:03:35 ] 今から始めるんならF95でいいと思うよ。Fortranは古いコードと混ぜてもトラブルは 少ないように規格されてるから過去の資源も使い易いし。 2003でスコープ範囲指定が出来るようになるらしいけど、いつ出るんだろう? まだ見たことないや。
699 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 15:29:10 ] たいていの商用コードはIntelとAMDのx86環境を前提としてるよね。 昔はIBM、日立、富士通、Sun、SGIって色々あったけど、今はそれらは ほとんど淘汰されてスパコンレベルしか残ってないし。 ま、コードを開発する側としてはやりやすくなったんだろうけど。
700 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 00:55:13 ] >>698 >2003でスコープ範囲指定が出来るようになるらしいけど、いつ出るんだろう? >まだ見たことないや。 変数のスコープか? PRIVATE、PUBLICは今あるままで、PROTECTED(いわゆるリードオンリー)が加わる程度だと思ったぞ。 他にもあんのかな?
701 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 09:26:51 ] COMMON文ってmoduleみたいにスコープを指定ってできないの?
702 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 13:05:37 ] 名前を共有するんじゃなくて、メモリブロックを共有するための仕組みだからねえ。
703 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 23:57:09 ] >>701 おまえふざけてんのか?w
704 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 03:32:54 ] お寿司ってハンバーグみたいにソースで食べるってできないの?
705 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 08:15:17 ] ああ、普通そうやって食べる。
706 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 13:00:36 ] www 両方ともマヨネーズならアリだよな
707 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 13:04:07 ] >>706 え?
708 名前:デフォルトの名無しさん mailto:sage [2009/11/14(土) 09:03:12 ] ・・・だめ?
709 名前:デフォルトの名無しさん mailto:sage [2009/11/14(土) 16:44:02 ] 本物のプログラマはマヨネーズは使わない。 Quiche Eaterはマヨネーズを使う。
710 名前:デフォルトの名無しさん mailto:sage [2009/11/18(水) 19:18:00 ] 質問です。 割り付け配列って何ですか?
711 名前:710 mailto:sage [2009/11/18(水) 19:33:35 ] 710です。たとえば以下のプログラムの変数A,B,Cを割り付け配列すれば どこを変更すればいいのですか? program matrix_wa implicit none integer::N,I,J integer,parameter::IDIM=100 real(8),DIMENSION(IDIM,IDIM)::A,B,C ! write(*,*) 'INPUT MATRIX DIMENSION' read(*,*) N write(*,*) 'INPUT MATRIX ELEMENTS OF A' do I=1,N read(*,*) (A(I,J),J=1,N) enddo write(*,*)'INPUT MATRIX ELEMENTS OF B' do I=1,N read(*,*) (B(I,J),J=1,N) end do CALL MATADD(IDIM,N,A,B,C) CALL MATOUT(IDIM,N,C) stop end program matrix_wa
712 名前:デフォルトの名無しさん mailto:sage [2009/11/18(水) 19:34:17 ] !============================================== SUBROUTINE MATOUT(IDIM,N,X) !============================================= implicit none integer IDIM,N,I,J real(8),DIMENSION(IDIM,IDIM)::X write(*,*)'C=' do I=1,N write(*,*) (X(I,J),J=1,N) end do return end subroutine MATOUT !=============================================== SUBROUTINE MATADD(IDIM,N,A,B,C) !============================================= implicit none integer::IDIM,N,I,J real(8),DIMENSION(IDIM,IDIM)::A,B,C DO I=1,N do J=1,N C(I,J)=A(I,J)+B(I,J) end do end do write(*,*) 'C=' do I=1,N write(*,*) (C(I,J),J=1,N) end do return end subroutine MATADD
713 名前:デフォルトの名無しさん [2009/11/21(土) 10:18:39 ] ちょっとお聞きしたいのですが、 3つの物理量の実測(とびとびのデータ)からある答えの物理量 がわかるデータがあるとき、 3つの物理量がある入力値の場合の答えの物理量を出すときに、 データの線形補完をしたいのですが そういうやり方とかないでしょうか
714 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 12:07:51 ] >>713 言いたいことがよく分からないのだけど、補完みたいなことをしたいの?
715 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 21:21:33 ] 回帰分析とかいう分野の事?
716 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 21:25:40 ] >>713 最小二乗法とか?
717 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 00:11:48 ] >>714-716 ありがとうございます。 あまりうまく伝えられなくて申し訳ないです。。 詳しくないのですが多分回帰の範囲と思います 3変数から一つの解を出す方法なのですが、 データから多項式で式が一発で出せるようなのがあればいいのですが、 そういうのはないでしょうか。。
718 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 02:38:52 ] それを求めたいのか、求めるプログラムを作りたいのか。 前者ならR言語が使えるらしい。
719 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 12:13:04 ] >>717 y=a*x1 + b*x2 + c*x3 のような式において、x1、x2、x3、yのリストから係数a、b、cを 導きたいなら、Excelの関数で1発でできる。重回帰分析でググれ。
720 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 12:48:30 ] >>713 > データの線形補完をしたいのですが 最小二乗法使っとけ。 線型でいいということは測定できる変数x、y、z とそれらから分かる量wの間に w = a*x + b*y + c*z という関係があると仮定できるってことでしょ?で、係数a、b、cは分かんない。 この分かってない係数を測定データから決定することで、測定データの中には無 いx、y、zの組のときにwがどんな値になるかを知りたいのだと邪推してみる。 >>713 の頭の中を覗けるわけではないので間違ったこと言ってるかもしれんけど。 それをどうしてもFortranで書かなければならないのなら仕方が無いが、そうでも なければ >>718 が言うように R でも何でも使ってればいい。 でも最小二乗法ならwのデータも要るのか?元質問だとwは測定して無いっぽいな。 こういうときはどうすんだ? 元質問がグダグダなので無責任に色々と言い放ってみた。グダグダじゃなくても 責任ある発言なんてできないけど。
721 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:09:24 ] Windows 用の Fortran 95 コンパイラを買おうと思っているのですが, NAG Fortran Builder 5.2 と Intel Visual Fortran 11.1 日本語版の どちらにしようか迷っています。すみませんが,以下の疑問それぞれに ついて判るかた,教えてください。 【1】 以下の項目について,どちらが優れているのでしょうか? (A) コンパイルしてできた実行ファイルの処理速度の速さ (B) 開発環境の使い勝手の良さ(入力補完など) 【2】 Intel Visual Fortran でも NAG Fortran Builder のように GUI アプリケーションが作れるのでしょうか? 【3】 Intel Visual Fortran と NAG Fortran Builder の2つ以外に 日本語版の Fortran 95 コンパイラはあるのでしょうか? なお,私のパソコンは, Windows が XP Home Edition SP3, CPU が Intel Pentium 4 (2.40GHz), RAM が 512MB です。
722 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 01:19:25 ] >>721 1) (A)処理速度で言うならIntel。NAGは文法的な厳格さ、厳密さが売りで速度は二の次。 (B)Intelの統合環境はMSのVisualStudioで、入力補完などは無い。シンタックスカラーリング程度? VS2010あたりで色々対応したいと言うようなことは言っているが未定。 NAGの方は独自の統合環境で、こちらもシンタックスカラーリング程度だったような。 Fortranの入力補完は、ほとんど存在しない。 昔の(10年以上前の)LaheyについてきたWin3.1時代風のEDくらいか。 Polyhedron社が今のLahey用にVisualStudioの拡張を売っていたような気もするが詳しくは分からん。 Laheyのサイトを見てくれ。 2.IVFでのGUIは、Win3.0時代から続くQuickWin互換の初歩的なものと、Win32APIを直接叩く方式がある。 サンプルプログラムが提供されているが、Fortranの呼び出し規約とCの呼び出し規約が違うので Win32APIに習熟しているとともに、呼び出し規約等に惑わされない必要があって、理解が困難。 OpenGLで絵を描くだけならサンプルの改造で済むのでまだやさしい。 3.日本語版があるかは知らないが、Winで動くものとしては 有料 商用 ・CUDAに対応するなどアグレッシブなPGIのFortran。 ・富士通とコンパチなLahey-Fujitsu Fortran (.Net対応とか、SSLライブラリがある) ・MacやCrayとの親和性が売りだったAbsoft Fortran (今はその利点もあまり無いが) 無料系 ・広告がうざいが、ただで使えるのがSilverFrostのFTN95。(商用は.Net 対応らしい) ・GNU系がよければ、g95 または gfortran. (この二つは同じ先祖から分かれた別物) 参考:非Win *FreeのSUN OS上でよければ、SUNのFrotran95もただで使える。 *Linux上なら Intel Frotranが学術目的ならただで使える。
723 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 01:47:53 ] >>722 OpenGLで絵を描くだけならサンプルの改造で済むのでまだやさしい なつかしす。結局コレで遊んだ以外はコマンドラインでしか使わなかったな・・・ もっとも自分の古いマシンに乗ってるのは DEC のVisual Fortran だけど、まあ同じようなものだからいいか。
724 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 01:53:34 ] 追加、というか・・・ QQで始まるGUIその他用の拡張命令サブルーチンが一杯あって訳わからんかったなぁw GUIアプリ作るときには do while ..... enddo でコード全体を無限ループで囲む、 アプリ終了=ループ脱出はwhile()内に来る条件のフラグをいじる、だったような。 Fortran 文法に可能な限り沿いながらGUIアプリに必須な マウス操作とかのいつ起こるか未然にわからないアクションを扱う苦悩が味わえたw
725 名前:721 mailto:sage [2009/11/25(水) 21:53:03 ] >>722 すべての質問に対しての丁寧な回答,本当にありがとうございました。 とても助かりました。
726 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 01:17:03 ] >>724 基本的に割り込み処理ののりだよな。 BASIC全盛時代のINKEY$でリアルタイム・キー入力処理を書いているようなもの。
727 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 05:07:03 ] >>726 そうそう、そんな感じw >>721 メモリ少なくね?
728 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 10:11:01 ] >>722 *Linux上なら Intel Frotranが学術目的ならただで使える 正確には純粋な私用ならタダ、ね。学生がFortranやCで遊ぶだけならLinux版はタダだけど、 それを論文にしたり研究発表で使うデータ計算に使うのならちゃんと有償版を買わないといけない・・ハズ。 まあ、いまのところはIntel自身もあまりねちねちチェックしてないけど、 将来Intelの気が変わるとややこしいことになる大学や研究室や個人は多いと思われる。 小さいメーカとか10万円をけちって将来の生殺与奪の権をIntelに捧げてるところは多いのでは?
729 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 10:49:02 ] 質問です。処理系はintel fortranです。結果に怪しいところが多いので浮動小数点例外を "アンダーフローは 0.0 にする。他の IEEE 例外は異常終了する (/fpe:0)"にしてます。 以下の行で、floating invalid を吐いて計算が止まります。変数は全て暗黙の型宣言です。 time=time*(xa-xb)/dx ちなみに直前でそれぞれの中身を表示したところ、 time=5.0E-07 xa=0.5368819 xb=0.5368840 dx=-2.0805840E-06 でした。 上の値はかなり長い計算の途中で出てくるので、手っ取り早く原因を探ろうと、 直前に上の数値を強制的に書き込んで回してみましたが再現しません(止まりません)。 floating invalidが上記の計算の行で起きているのはエラーメッセージのLineから明らかです。 正直意味不明過ぎて何を言ってるのか分からないかもしれませんが、何か 原因に思い当たること、もしくは他に何か必要な情報があれば教えていただけないでしょうか?
730 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 05:56:58 ] -r8 や -r16 付けて倍精度や4倍精度で計算するとか、かな。 あとは・・・・規格化(無次元化)する際の典型量を見直す、とか。 系全体の長さを1にするのではなく、関心のある現象の空間的なひろがりを1にとるとか。
731 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 09:38:43 ] dx って負になるのは正しいの?
732 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 10:07:56 ] >>729 キミに「プログラムは書かれいる通りに動く」という格言を進呈しよう。 とても高い確率でキミが何処かで間違えている。
733 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 10:23:59 ] >>731 一般論として考えた場合は負でも問題無い。というのは飽くまでも或る点からのズレ(変位)という意味し かないから。 プログラムの中で何らかの約束がある場合には、その約束のために正の値でなければならないことはあるだ ろう。そういう時に負になってしまうのはバグでしょ。その場合はプログラムを書いた人の検討不足かタイ プミスかだ。デバッグができていないんだろう。他の理由もあるんだろうけど思いつかん。
734 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 10:44:21 ] >>729 > ちなみに直前でそれぞれの中身を表示したところ、 これは本当に直前なのか? 正常に動く一回前の値じゃないのか?
735 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 19:56:50 ] >>729 多分、ただのゼロ割だろう。 Intelのコンパイラのバージョンはいくつかな? 新しい奴ならNaNにして続行するが、8.1とか古い奴はFloating Invalidで即死する。 状況的には>>734 の言っていることが正しいであろう。
736 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 10:33:12 ] >>730 倍精度は文字どおり精度を上げるのに有効だけど・・・ 単精度でコケて倍精度で動く奴は、モデルを間違えてるかコードがおかしいかのどちらかだから 根本的には解決にならないね。
737 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 12:05:49 ] 微妙なケタ落ちを救済する事が出来るが、ケタ落ちが発生しない アルゴリズム/コードに代える方がまっとうな道。
738 名前:729 mailto:sage [2009/11/29(日) 13:14:09 ] みなさん、レスありがとうございます。まだ全部追えて無いんですが… >>730 実は無次元化してません… >>731 733が仰ってますが、単に変位です。負値は大丈夫です。 >>732 もちろんそうなんですが、どこで間違えてるのか分からなくて。 >>734 計算の一行前にwrite文で表示させてるので一回前の値と言うことはないはずなんですが、 この値で止まるのも同程度におかしいので何か間違えてるんだと思います。 >>735 ver.11です。デフォだとNaNで続行されますけど、NaNだと粒子が行方不明になってしまって困るので トラップして原因を突き止めようとしてるのです。開放系ならごく稀に粒子が居なくなるくらいは問題ないんですが、 閉鎖系だと粒子がどんどん減ってしまうので… >>737 こういう問題が発生しないアルゴリズムってどういうものでしょうか?原理的に発生しないんですか? 今自分で思いつくところだとNaNを検出して適当な座標を振りなおしてやるくらいしか思いつかないんですが… ちなみにゼロ割した場合、floating invalidじゃなくてfloating divide by zeroとでました。分子も0だと floating invalidになるのでこっちなんでしょうか?まだ不可解なところがあるのでもう少し見直してみます。
739 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 19:58:08 ] 出力のバッファリングで一回前を見ている可能性が有る。 デバッガで調べた方が良い。
740 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 20:15:31 ] >>739 じゃ、出力先をファイルか標準エラー出力に切り替えてみるのもありだな。 そんで結果を見る。デバッガなんて使いこなすまでに時間が掛かりそうだし。
741 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 00:05:11 ] バッファリングはファイルの方が積極的。 もうひとつの可能性: floating invalidは表示ルーチンで出ている。
742 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 00:27:10 ] >>738 あとの安直な手は別のコンパイラで実行してみることかな。 g95あたりで一回やってみればいいのでは。
743 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 06:49:04 ] バファリンの半分はやさしさでw バッファリングの半分は嘘のデータで出来てます。 あとは・・・Write 文つかったデバッグの場合でかつ元のをUnrollingしていると Write文挿入する・しないで演算順序が変わることがあるから UnrollingやできればInlineを抑制したコンパイルをすることをお薦めしてみるテスト
744 名前:デフォルトの名無しさん [2009/12/01(火) 05:51:21 ] Fortranをはじめたばかりです * *** ***** ******* を描けという問題で、1.2.3行目のスペースの出し方がわかりません・・・ $を使えばできるのかと思いましたが、わかりません どなたか教えていただけないでしょうか?
745 名前:744 mailto:sage [2009/12/01(火) 05:52:09 ] スペース消えてる・・・ >>744 はピラミッド形です
746 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 06:14:43 ] do i = 1, 4 do n = 1, 7 if (n .GE. (5-i)) .AND. (n .LE. (3+i)) write(*,'(A,$)') '*' else write(*,'(A,$)') ' ' enddo enddo write(*,'(A)') '' enddo かな?
747 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 06:15:40 ] あら、一個 enddo -> endif にしとかんといかんかったね
748 名前:744 mailto:sage [2009/12/01(火) 06:26:33 ] >>746 早速のレスありがとうございます 書いてくださったのを参考になんとか書けました><
749 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 09:47:59 ] お、かけましたかw if の行に then がなかったりしたけど、 えがったえがった
750 名前:デフォルトの名無しさん [2009/12/01(火) 23:10:57 ] FORTRAN初心者です。。 1000以下の整数のうち、7で割ると2余る数を全て合計するプログラムをつくりたいのですがわかりません… どなたか教えてください。
751 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 23:16:50 ] >>750 integer i, s, n n = 1000 s = 0 do i = 1, n, 1 s = s + i end do write(*,*)'sum =',s 続きは誰かヨロ。みんなで完成させようぜ。
752 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 03:44:10 ] if (mod(i,7) .EQ. 2) then s = s + i write(*,*) i, s endif 途中経過表示はいらないけどね。
753 名前:sage [2009/12/02(水) 07:28:33 ] >>751-752 ありがとうございます。 本当に助かりました 自分でやったのでは実行できなかったので;; また機会があればよろしくお願いします。
754 名前:デフォルトの名無しさん [2009/12/03(木) 13:16:46 ] 初めまして。 最小二乗法のプログラム(放物線近似)をつくっているのですが、 "dot_product"文がうまく使えません。 実行すると下記のようなエラーが出ます。 x4 = dot_product(x2,x2) 1 Error: 'vector_a' argument of 'dot_product' intrinsic at (1) must be of rank 1 In file test02.f90:28 x4 = dot_product(x2,x2) 1 Error: Function 'dot_product' at (1) has no implicit type 長くなりますが↓にプログラムを貼ります。
755 名前:デフォルトの名無しさん [2009/12/03(木) 13:20:29 ] program saishou implicit none real(8)::a,b,x,y,y_b,xi,x2,yi,y2,xy,d,x4,x2y integer::n,i allocatable x(:), y(:), y_b(:) write (*,*) 'input number of data ' read (*,*) n ! input size of dimension write (*,*) 'number of data is ',n allocate (x(n),y(n),y_b(n)) !------------------------- do i = 1,n read(*,*) x(i), y(i) write(*,*) x(i), y(i) end do !------------------ xi = sum(x); x2 = dot_product(x,x) yi = sum(y); xy = dot_product(x,y) x4 = dot_product(x2,x2) x2y= dot_product(x2,y) d = n*x4-x2**2 a = ( n *x2y - x2*yi ) / d b = ( x4*yi - x2*x2y ) / d write (*,'(1x,2(3x,a,f7.3))') 'a =',a,'b =',b write (*,'(a8,a9,a10,a11)') 'x','y','y_b','dif' end program saishou
756 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 13:45:03 ] dot_productは引数に同じ要素数の配列しかとれない。 x2はスカラーなので引数にできないですよ。 ちなみにdot_productが返すのはベクトルの内積を求めるので、戻り値はスカラー。 ・・・とfortran歴1年の俺がいってみる
757 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 14:29:43 ] 前から思ってたんだけど、dot_productみたいなデフォで用意されてる関数を使うのって、 ベクトル化などの高速化・最適化を妨げるリスクはないと思っていいよね? それとも、doループをいちいち書いた方がやっぱり速くなったりする?
758 名前:デフォルトの名無しさん [2009/12/03(木) 21:10:12 ] fortranの初心者です 彗星の軌道をプログラミングしたいのですが上手くいきません どこがおかしいか教えてくださいませんか? program main integer i,j real ms,me,x,y,vx,vy,t,dt,G ms=1.989*(10**30) dt=100 G=6.673*(10**(-11)) K=G*ms/R**2 x=0.8826*(10**(11)) y=0.0 R=sqrt(x**2+y**2) vx=0.0 vy=55000 do i=0,1000 x=x+vx*dt*i y=y+vy*dt*i R=sqrt(x**2+y**2) vx=vx-K*(x/R)*dt*i vy=vy-K*(y/R)*dt*i write(6,*) x,y enddo end
759 名前:デフォルトの名無しさん [2009/12/03(木) 21:42:09 ] >>756 なるほど・・・ご指摘ありがとうございます。 では行列の4乗はどう書けばよいのでしょうか。。
760 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 22:15:52 ] >>759 そういうサブルーチンを自作すれば良い。幸いなことにFortran90からは再帰も使えるしね!
761 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 23:25:57 ] 気付いた所だと、 xnext=x+vx*dt*i ynext=y+vy*dt*i R=sqrt(xnext**2+ynext**2) vx=vx-K*(x/R)*dt*i vy=vy-K*(y/R)*dt*i write(6,*) x,y x=xnext y=ynext vx,vyはdtずらす前のx,yを使うのがオイラー法の正しいやり方ですよ。 これだけで直るかは自信がありませんが。
762 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 00:45:27 ] 下記のIを求めるプログラムを組もうとしているのですが、フォートランはさっぱりで… どなたか本当にお願いします。 Zは3×3の行列で、V、Z、Iの各要素は複素数とするそうです。 確かに複素数を扱うにはCよりはフォートランだとは思うのですが… [V1] [Z11 Z12 Z13] [I1] [V2]= [Z21 Z22 Z23] [I2] [V3] [Z31 Z32 Z33] [I3] よろしくお願いします。
763 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 02:27:53 ] >>757 たぶん弊害はない。たぶん、なのは実装によるので。ベクトルがでかくなると、 出来合いのルーチンの方が速いね。そういうチューンしてると期待していいとおもう。 3次元くらいだったら自分でループ書くか、 naiseki=a(1)*b(1)+a(2)*b(2)+a(3)*b(3) みたく成分を明示したほうがいいことがおおいけど。
764 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 02:29:50 ] >>762 複素数扱うならFortranのがいいよ。 んで、3x3行列なら (-1)^(i+j) * (小行列の行列式)_{j,i}/(全体の行列式) を明示した方がいいよ。
765 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 11:04:54 ] >>763 thx そのうち自分で試してみようかな
766 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 19:50:53 ] fortranで複数ファイルの結合ってどうやってやればいいですか? もちろん中身を読み込んで新しいファイルに書き込むなら出来ますが、 cat みたいな感覚で使える命令ってあるでしょうか?
767 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 23:14:56 ] >>766 system() を使って cat で繋げるとか? Fortranが内部で持っている方法は聞いた事が無いです。
768 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 23:47:25 ] >>758 G=6.673*(10**(-11)) この辺は G=6.673E-11 とするべし。 あと77なのか90なのか判然としないが、暗黙の型を破る気ならIMPLICIT NONEを つけておくほうが吉。 >>766 catだって中では読んで書き出しているだけだろうに
769 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 23:54:43 ] >>768 > >>766 > catだって中では読んで書き出しているだけだろうに そういえばバイナリファイルをformattedで開く場合ってケッコウ難儀なことになりそうな気がして来た。 catはその辺はクリアしてるけど(でないとバイナリファイルの結合なんて出来ないよね?)。 自分だったらfortranでやらずにシェルでも書いてそっちで済ます。WindowsならPerlか何かを使うかな? dosのコマンドで出来たっけ?やりたいことによって道具を使い分けるのが良いと思うけど。
770 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 00:05:00 ] >>766 catと等価な、つまりバイナリレベルでの結合は無理じゃない? fortranって、せいぜいレコードを扱うくらいで、バイトレベルでの操作は普通しないし、そもそもできないと思うけど
771 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 03:50:13 ] いちおうAppendで既存ファイルに追記することはできるけどバイナリだと 追記するデータを別なファイルから読み込む段階でコケる事多々アリで面倒だよね。 Bit 単位での操作って Fortranで出来ない&やりにくい典型例だ。
772 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 05:12:47 ] FORTRANやCOBOLのような古い言語は、 ファイルはレコードの集合という考え方をするから、 前提のないバイト列は扱いにくい。
773 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 05:57:03 ] NAG Fortran Builder 5.2 をインストールして使ってみたのですが, program main print *, 'Hello World !' stop end のクイック実行のコンパイル&リンクに12分50秒もかかります。 NAGのコンパイラはこういうものなんでしょうか? それとも,もっと早くコンパイル&リンクのできる設定が何かあるのでしょうか? 私の環境は,OSはWindows XP,RAMは512MB, HDDの空き領域は,Cドライブは706MB,Dドライブは1.92GB, Fortran Builder は Dドライブにインストールしています。 # NAGの統合開発環境は,Intelのと違って,キーワード入力補完機能がありました。
774 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 10:00:55 ] RAM 少なくね?
775 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 10:02:09 ] >>758 数字を規格化しようね
776 名前:773 mailto:sage [2009/12/05(土) 10:51:47 ] >>774 NAGのホームページには 「メモリ:256MB以上(推奨 512MB以上)」 と 書いてあったので,大丈夫かなと思ったんですが, やっぱり足りないですかね。 他に Fortran Builder 5.2 のユーザーさん,いませんか? RAMはどれくらい積んでますか?
777 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 12:17:51 ] >>773 キーワード補完だけじゃ、あってもなくてもほとんど変わらんよなぁ・・・ もっとリッチなFortranのIDEが早くでないものか
778 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 13:20:00 ] >>776 その前に今どき512MBというのがなあ。増設はできないの?
779 名前:773 mailto:sage [2009/12/05(土) 13:38:40 ] 別のパソコン (let's note) で試してみました。 CPU: Pentium M 1.20GHz RAM: 1GB OS: Windows XP Pro. Ver.2002 SP3 これで program hello print *, 'Hello World' stop end program hello をやってみたんですが,こちらのPCでもコンパイル&リンクに 12分25秒かかりました‥‥ orz >>778 う〜ん,6年前のVAIOノートなんで,買い替えしたほうが良いかもしれません。
780 名前:773 mailto:sage [2009/12/05(土) 13:52:17 ] Intel Visual Fortran 11.1 のほうの動作環境ページを見ると RAM 1GB (2GB 推奨) と書いてあるんですが, CPU: Pentium M 1.20GHz,RAM: 1GB のPCにインストールしても, Fortran Builder と同じくコンパイル&リンクに10分くらい 時間かかっちゃうでしょうか?
781 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:01:23 ] メモリが足りないせいで異常に遅いときは、 大量にスワップが発生しているせいなので、 一定量メモリを増やせば急に早くなるものだが、 512MBでもその有様とはすごいね。 fortran 77でよければ open watcom fortranとかいいんでない?
782 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:06:13 ] >>779 まさかとは思うが、メモリの空きは大丈夫なんだよね? 動画のエンコしながらコンパイルとかはさすがにないだろうけどw
783 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:15:19 ] コマンドラインからコンパイルとかできないの? IDEが重いのかもしれない。
784 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:20:09 ] あと仮想メモリを増やしてみる。無駄かな?
785 名前:773 mailto:sage [2009/12/05(土) 16:01:16 ] >>781-784 レスありがとうございます。>>783 さんのレスを見て調べたら, コマンドラインからコンパイルする方法が NAGのサイトの FAQページに載っていました。 今度は数秒でコンパイルできました! # しかも,できた実行ファイルのサイズが,IDEのときは 266KBだったのに対して, コマンドラインからのときはわずか 18KBとずいぶん小さくなりました ちなみに,g95でコンパイルしたときは 339KBでした。 本当にありがとうございました m(_ _)m
786 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 16:37:57 ] もしかしてNAGが駄目駄目ってオチなのかな? でもそんな悪い評判は聞いたことないが・・・
787 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 17:25:08 ] >>770 バイナリファイルも、F2003ならSTREAMファイルとしてあけることで扱える。 F2003以前でもベンダー拡張でSTREAMアクセスできることが多い。 また規格の範囲内でもDIRECTアクセス・ファイルの属性で代替できることがある。 (独自フォーマットのDirectFile形式のベンダーもあるが、垂れ流し的に書いているものも多いので、 実質ストリームとして使える) ただFortranの規格ではレコード長が処理系依存なので、バイトかワードかが確定できない。 でもコンパイラのオプションで単位をバイトに指定出来ることが多い。
788 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 18:24:30 ] >>785 それって単にランタイムDLLになっただけじゃ? IDEの時はスタティックリンクなんでしょ
789 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 18:53:35 ] IDE経由とコマンドラインの場合とで、デフォルトの動作が違うってこと? IDE使ったことないんで分からないけど、そういうもんなのかね でもスタティックリンクにしたら、サイズが増えるのはいいとして 10倍以上の時間がかかるなんて、あり得るの?
790 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 02:17:44 ] デバックシンボルでも埋め込んであるんだろ それに実行ファイル自体が最適化がかかってないかもしれない 環境を聞かないと何とも堪えようがない
791 名前:773 mailto:sage [2009/12/06(日) 08:35:45 ] >>788 > IDEの時はスタティックリンクなんでしょ IDEの設定を見たら,おっしゃるとおりで, 「nagforランタイムライブラリの非共有(静的)バージョンを結合」 となっていました。ひとつ勉強になりました(汗)。 >>790 > 環境を聞かないと何とも堪えようがない 環境は…… 【1つめのパソコン VAIOノート】 OS: Windows XP Home edition Ver.2002 SP3 RAM: 512MB HDDの空き領域:Cドライブは 706MB,Dドライブは 1.92GB Fortran Builder 5.2 は Dドライブにインストール。 【2つめのパソコン let's note ノート】 OS: Windows XP Professional edition Ver.2002 SP3 RAM: 1GB CPU: Pentium M 1.20GHz HDDの空き領域: Cドライブは数十GB Fortran Builder 5.2 は Cドライブにインストール。 ……です。
792 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 08:39:32 ] NAGのお値段を考えたら・・・おニュウPCを買うべきだとおもう
793 名前:773 mailto:sage [2009/12/06(日) 08:42:25 ] あ,【1つめのパソコン VAIOノート】の CPU は Pentium 4 の 2.40GHzです。
794 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 19:59:53 ] 次の行列の演算を2次元配列を用いて行うプログラムを作りたいのですが; どなたか教えください。 [123] [13] [ ]×[23] [045] [46] です。 わかりにくいのですが、2行3列と3行2列の乗算です。。
795 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 20:01:50 ] 見づらくてすみません。。 [123] [13] [ ]×[23] [045] [46]
796 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 04:24:21 ] 行列成分は実数にした。違いは無い real a(3,2), b(2,3), o(2,2) a(1,1) = 1.0 | a(3,2) = 5.0 b(1,1) = 1.0 | b(2,3) = 6.0 do j = 1, 2 do i = 1, 2 o(i,j) = 0.0 do m = 1, 3 o(i,j) = o(i,j) + a(m,j) * b(i,m) enddo enddo enddo で o が結果の2x2行列ね。習慣で(i,j)=(列、行)の番地にしてもうたけどいいやね。 そういや行列のサイズ数をいうときの行と列をよく間違えてしまうw
797 名前:デフォルトの名無しさん [2009/12/07(月) 23:28:25 ] >>758 x=x+vx*dt*i y=y+vy*dt*i R=sqrt(x**2+y**2) vx=vx-K*(x/R)*dt*i vy=vy-K*(y/R)*dt*i 上のiがすべていらない。
798 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 23:42:02 ] >>795 MATMUL 関数を使うんだw
799 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 08:40:35 ] >>798 同意w でも知らないうちにコードミスで転置行列にしてしまうことがあるw
800 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 08:58:02 ] do 800 i = 1, 800 write(*,*) '800 get' 800 continue
801 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 18:00:32 ] はじめてきました。 ド素人質問失礼します。 コンパイラはG95で、Fファイルで実行します。 OSはVISTAです。 N個の値(整数値0〜100)の中から最大・最小・偏差値を出したくてこうしました。 DO 10 I=1,N READ(5,*) SC(I) MA=MAX0(SC(I)) MI=MIN0(SC(I)) 10 CONTINUE するとエラーが MA=MAX0(SC(I)) 1 MI=MIN0(SC(I)) 1 に Intrinsic'max0'at(1)must have at least two arguments Intrinsic'min0'at(1)must have at least two arguments と出ます。 配列を組み込み関数の引数に使ってるのが違うのかと思うのですが、配列を使えるようにする方法が何かないかが主に知りたいです。
802 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 18:03:53 ] >>801 すみません、、、 改行でずれました、、、 MA=MAX0(SC(I)) ___1 MI=MIN0(SC(I)) ___1 です。
803 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 18:10:43 ] MAX0というのがどういう関数なのか知らないが、 MAXと同じなら MA = MAX( MA, SC( I ) ) MAは要初期値。 配列に全部読み込んでから最大値を求めるなら MAXVAL( SC )
804 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 18:13:48 ] >>801 関数が要求する引数の数が少なくとも2個だからじゃない?最も大きい(小さい)ものを返せ、という 関数なんだし。配列の要素は配列じゃないよ(OOPならそれもアリだろうけど)。 その前に折角g95を使っているのなら、F77式の書き方はするべきではない。 homepage.mac.com/galois21/fortran/ref.html
805 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:07:11 ] フォートランを研究室で指定されて使おうとしてるんですけど www.salfordsoftware.co.uk/ のどこからダウンロードするのかみつからないんですけど教えてくれますか? あとフォートランは遺産が多いと聞きましたがうちの研究室は転用が禁止らしいのですが フォートランの意味はあまりないということでしょうか? 簡単な質問ですがお願いします
806 名前:805 mailto:sage [2009/12/14(月) 02:35:45 ] なんとかなりそうです スレ汚し失礼しました
807 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 05:06:18 ] ああ、Fortran依存症がまたひとり・・・・いらっしゃい!
808 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 10:09:27 ] >>805 転用禁止は、遺産うんぬんの前に、「理解して勉強しろ」ということだろう。
809 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 17:32:48 ] 結局わからなくてゼミの先輩にインストールするためのプログラム(ftn77pe.exe)を貰ったんですが 64ビットバージョンのwindowsでの非互換性のためプログラムまたは機能である〜〜を開始または実行できません ソフトウェア製造元に問い合わせて64ビットWindows互換バージョンが利用可能であるかどうか確認してください とでました。OSはwindows7です。7に対応していないんでしょうか? こういった場合どういう解決策がありますか?お願いします。
810 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 20:45:06 ] 今、浮動小数点例外を握りつぶす処理を入れてるんですが、 処理を入れた部分以外のところをコンパイルオプションでトラップしたいです。 が、オプションを入れると既に処理を入れた部分の判別条件で引っかかってしまいます。 未処理の部分だけトラップしたいんですが何かいい方法はないでしょうか。
811 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 23:06:15 ] サイトを隅から隅まで探してもfortranをダウンロードするページみつけれませんでした・・・ 64ビットのがあるんでしょうか
812 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 23:34:04 ] >>810 トラップって何? 具体的にどうしたいのか分からないけど、ソースの或る特定の部分を無視して コンパイルしたいのであれば、プリプロセッサを使ってみたら?
813 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 23:50:42 ] >>810 CALL IEEE_SET_HALTING_MODE(云々) あたりでなんとかならんか? Fortran2003の機能だが、最近のコンパイラはサポートしているので・・
814 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:03:20 ] Sun solais10のSunStudio12(SunFortran)で書かれたプログラムが動かなくて困っています 浮動小数点例外でcore吐いて停止していますが ファイルがバッファに残ったままとまっている為 どこまで進んでから落ちたのか良く判りません 環境変数かなんかでバッファサイズを0若しくは充分小さく出来ないでしょうか? ソースをゴタゴタと生成している部分がありコンパイルが容易ではなく 出来ればflushを挟んでの再コンパイルを避けたいのです intelのfortranなら出来るチックな話はぐぐったら出てきましたが......
815 名前:773 mailto:sage [2009/12/17(木) 23:42:36 ] NAG Fortran Builder 5.2 で, program main print *, 'Hello World !' stop end のクイック実行のコンパイル&リンクに12分50秒もかかった現象について,先週の土曜日に ここで質問をした者ですが,パソコンにインストールしているウイルス対策テスト F-Secure Internet Security 2010 のメーカーであるエフセキュアのサポートセンターにも 問い合わせたところ,解決案を幾つか提示されました。 結局それらのうちの1つの『 ディープガードの無効化 』をすることで, コンパイル&リンクにかかる時間が通常どおり大幅に短縮されて,約10秒で 終わるようになりました。 アドバイスを下さった方々,ありがとうございました。
816 名前:773 mailto:sage [2009/12/19(土) 11:37:10 ] ↑のその後です。 昨日,エフセキュアのサポートセンターとメールでやり取りし, 「『 ディープガードの無効化』をするとセキュリティレベルが下がるので, その代わりに『高度なモニタリング』を無効化する。 それで駄目なら『ファイルを除外スキャン』でスキャン対象から除外したい ファイル・フォルダを選択する」 という対処方法に変わりました。 これで F-Secure Internet Security 2010 の『 ディープガードの無効化』と 『高度なモニタリング』の両方が有効な環境下での NAG Fortran Builder の 動作の正常化が確保できました。
817 名前:773 mailto:sage [2009/12/19(土) 11:43:02 ] ↑書き間違えました。 (誤)『 ディープガードの無効化』と『高度なモニタリング』の両方が有効な環境下 (正)『 ディープガード』と『高度なモニタリング』の両方が有効な環境下
818 名前:デフォルトの名無しさん [2009/12/19(土) 13:30:00 ] とりあえず、おめ! なるほど、そっちか
819 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 15:41:50 ] セキュリティかよw 確かに最近のセキュリティソフトは色々とガチガチだからな
820 名前:デフォルトの名無しさん [2009/12/22(火) 16:23:38 ] なるほどー
821 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:08:05 ] ググってもなかったんで、質問させてください。 fortranのプログラムみてると、ccccccc 〜〜 ccccccc って感じでcに囲まれてる文字があるんだけど、このcの意味ってなんなんですか? すいません。教えてください
822 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 00:28:15 ] >>821 1桁目が 'C' かアスタリスク '*' の行はコメント行。 だから 'CCC…' はプログラム上は意味はないけど、 人間が読む時に処理の内容や区切りをわかりやすくするため等によく使われる。
823 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 00:32:45 ] >>822 ありがとうございます。 コメントは「!」とどこかでみたので、cは違うのかと思ってました。 本当にありがとうございました
824 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 04:29:33 ] >>823 ! で始まる部分をコメントとするのは,Fortran 90 以降の自由形式で書かれるソースコード。 この場合は ! は必ずしも1桁目でなくても良い。 2桁目以降でも良いし,実行分の後ろに付けるのでも構わない。 一方,1桁目が C か * で始まるのをコメント行とするのは,FORTRAN 77 の固定形式ソースコード。
825 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 09:11:20 ] ↑[訂正] × 実行分 ○ 実行文
826 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 22:37:19 ] >>824 丁寧にありがとうございます。 すごい勉強になりました! 今日、入門用の本を買ってきたので、頑張って勉強したいとおもいます。
827 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 08:29:13 ] すみません,ちょっとスレ違いな質問で申し訳ないのですが‥‥ ここにならご存知の方が誰かいるかもしれないと思ったので, 質問させていただきます。 Fortran の後継言語として Sun が開発中だった Fortress は 今はどうなってるんでしょうか? お蔵入りなのでしょうか?
828 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 09:14:52 ] とりあえずサイトはここ ttp://projectfortress.sun.com/Projects/Community/
829 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 14:04:39 ] >>828 ありがとうございました。
830 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 17:33:31 ] オラクルに買収されたけど、Sunの手から離れたから関係ないのかな?
831 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 20:11:52 ] 質問です。あるファイルが存在したらそのファイルをread、 存在しなければ別の処理をする、という分岐を作りたいのですが どうすればよいでしょうか?ファイルの有無で0か1を返すような 関数があれば手っ取り早いんですが、見つかりませんでした。
832 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 21:03:52 ] >>831 stat() を使ってゴニョゴニョとできんじゃろうか?
833 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 21:22:06 ] open文でerr=指定子を使うのがfortran流だろう。
834 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 23:28:24 ] INQUIRE(FILE='hage.dat', EXIST=LHOGE)
835 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 18:43:43 ] >>832-834 最後のinquire使うのが王道かのぅ。 logical lhoge character*100 fname do i = 1, 100 write(fname,'(i5.5,''.dat'')') i inquire(file=fname,exist=lhoge) if (lhoge) then read..... else nanka.... endif enddo とか、いろいろ。 ERR子はたしか返す値がシステムごとに違った記憶があるから怖い。 ・・・気のせいな気もするけどね。
836 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 17:11:51 ] いままでコンパイルを行うとき、サブルーチンとmainファイルを同じディレクトリに置き * ifort.f90 でコンパイルしていたのですが, サブルーチンを別ディレクトリにし,コンパイルするにはどうしたらよいのでしょうか。 たとえばサブルーチンをSubというディレクトリに置き、 mainファイルをMainというディレクトリに置いて実行ファイルを作るにはどうしたらよいのでしょうか。
837 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 20:17:18 ] ifort90 main.F90 Sub/sub1.F90 Sub/sub2.F90 ... でいいんじゃね?あと Makefile 書いちゃうとかかな。 何をムズカシイと思っているのかがよく分からない。
838 名前:デフォルトの名無しさん [2010/01/13(水) 15:03:32 ] >>837 そうしたいのですが,mainファイルをコンパイルしようとするとサブルーチンが定義されていないと言われ, サブルーチンをコンパイルしようとするとmainファイルがないとエラーがでるんです
839 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 15:47:14 ] >>838 ifort90ってどこのコンパイラ? -c付けて.oファイルがどこにできるか確認してみたら? intel fortranだが普通にカレントディレクトリに全部の.oが出てくるけど
840 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 17:41:05 ] unixでのコンパイルに耐えられずに、VisualStdioとintelのコンパイラを教官殿に買ってもらった俺と比べてみんな偉いな
841 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 22:27:24 ] >>839 > ifort90ってどこのコンパイラ? ifort のことだろうけど、OS は何なんだろうな。どうにも挙動が変態だ。 Windows だと変な動きするとかあるんだろうか?
842 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 02:46:42 ] 前に、担当の人が気を利かせてaliasというかいくつかオプションをつけたコマンドを作ってくれていて それが他のと干渉して・・という事があった気がするけど、そのifort90 もそれの類の匂いがするが、 いかがか?
843 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 17:02:34 ] >>838 皆様のレスのおかげで解決できました、ありがとうございます ifort90はifortの打ち間違えです、申し訳ない
844 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 13:52:51 ] なんという・・・w
845 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 18:18:14 ] 打ち間違え? じゃあ command not found って出てたはずだよな・・・ まぁ、頑張ってくれや
846 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 18:52:40 ] すみません インテル Visual Fortranコンパイラ9.1を使用したいのですが、インストール後 サンプルプログラム(int_sin.f90)をコンパイルしようとしたのですが、下記のエラーがでてしまい、うまくできません。 エラー内容: ifort: error: unable to run '<Microsoft VC++ Dir>\\Bin' Microsoft Visual C++ 2008 Express Editionはインストール済みです。 OSはVista Home premium32bitです。 どなたか助けてくださいorz
847 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 01:04:43 ] >>832 ,833,834,835 大変遅くなりましたがありがとうございました。 inquire文で行けそうです。 もう一つ質問ですが、動的配列を宣言するときにある次元だけ固定って できますか?まあ別にそうする必要は無いといえばないんですが、 宣言部を見ただけでどこが動的である必然性があるのか分かった方が 自分としてはスッキリするので。ちなみに DOUBLE PRECISION,allocatable::a(10,:,:) … allocate (CS(10,10,10)) とやったら金比羅にしかられました。 よろしくおねがいします。
848 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 04:18:14 ] >>847 > DOUBLE PRECISION,allocatable::a(10,:,:) > … > allocate (CS(10,10,10)) > > とやったら金比羅にしかられました。 CS ってどこで宣言してんだ? どう呵られたのかはしらんけども、こっちでも呵られた。 ということで無難に DOUBLE PRECISION,allocatable::a(:,:,:) としておけば良いと思う。それで問題になることは無いだろうから。
849 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 04:52:48 ] >>848 すいません、CSじゃなくてaですね。中途半端にコピペしてしまった… やっぱそうするべきみたいですね。コメントでもつけてそうしておきます。 ありがとうございました。
850 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 17:46:26 ] 一瞬、金比羅って何って思ってしまった 中国系の上司の名前かとw
851 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 17:38:45 ] 下記のようにimplicit none 付きで、 算術関数 cos 及び derf に関する実験をしているのですが、 cosはreal(8) derf のような宣言が必要ないのはなぜでしょうか。 derfに関しては宣言をしないと、コンパイラ(pgf95 ,7.2-4)に文句を言われます。 program main implicit none real(8) derf real(8) x x = dble(0.7) print*,derf(x) print*,cos(x) end よろしくお願いいたします。
852 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 22:53:26 ] >>851 COSはFORTRANの規格で規定されているINTRINSICな関数で、COSは総称名になっている。 引数の型で関数の値の型も決まる。 ただ、66時代の互換性などから、個別の型をあらわに指定するDCOSなどもある。 しかし77時代以降は総称名を使うのが推奨されていたはず。 さて、ERFの方だがこれはFORTRANの規格にはないベンダーの提供する独自関数である。 したがってその実装や用法はベンダーに依存する。 たとえばINTEL FORTRANの場合は、REAL(8)の宣言無しにDERFが使える。 PGIでは、外部関数扱いで、関数の型を宣言しておく必要があるのだろう。 なお、ERFというのはUNIX系の多くのFORTRANで使えた関数で、半ば標準化している。 Fortran2008ではそれらのエラー関数、ベッセル関数などが正規の規格に入ることになっている。
853 名前:851 mailto:sage [2010/01/19(火) 00:21:02 ] >>852 大変分かりやすい解説をしていただき、ありがとうございました。 derfもintrinsicな関数だと思い込んでいました。
854 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 13:55:21 ] >>852 >しかし77時代以降は総称名を使うのが推奨されていたはず。 マジ? 律儀にD*使ってた・・・
855 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 14:00:42 ] 人のデータ使う場合、単と倍精度が入れ乱れるし・・・ 普通にd* で明示してもいいと思うけどな。 単精度に揃えたい!とかはコンパイルオプションで出来るし。
856 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 21:03:41 ] やっぱ総称名って使わないほうがいいの?
857 名前:デフォルトの名無しさん [2010/01/19(火) 21:21:43 ] インテル Visual Fortranコンパイラ9.1を使っているんですが、インストール後 サンプルプログラム(sample.for)をコンパイルしたところ、下記のエラーがでてしまい、うまくできません。 エラー内容: ifort: error: unable to run '<Microsoft VC++ Dir>\\Bin' このため、.objファイルは出力されるのですが、exeファイルが出力されません。 よろしくお願いします。
858 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 23:41:44 ] >>857 MSのSDK入れろ
859 名前:デフォルトの名無しさん [2010/01/24(日) 21:39:26 ] "2500/500"のような文字を読み込んで、 2500 / 500 = 5 を計算したいのですが、下のコードでは "/"が読み込めないみたいです。 改善方法を教えていただけないでしょうか? できれば、"2500"や"500"の部分を任意の桁数でできると幸いです。 コンパイラはG95です。 IMPLICIT NONE CHARACTER :: A*5, B, C*5 REAL*8 :: Num1, Num2 PRINT*, "Input" READ*, A, B, C PRINT*, "A=", A, " B=", B, " C=",C READ(A(1:), *) Num1 READ(C(1:), *) Num2 PRINT*, Num1/Num2 END よろしくお願いします。
860 名前:デフォルトの名無しさん mailto:sage [2010/01/24(日) 22:12:58 ] >>859 FortranのI/Oでは「/」は改行を意味している。 よって文字と解釈していなのだろう。 前にもそんな事を聞いていた奴がいたような・・・ 回避する方法は、わからん。 文法書のI/Oのところをじっくり読んで自分で考えてくれ。
861 名前:860 mailto:sage [2010/01/24(日) 22:27:59 ] >>859 しらべたw READ文にFORMAT指定をすればよろし。 READ '(3A)', A,B,C とすれば多分おk
862 名前:859 mailto:sage [2010/01/24(日) 22:57:22 ] >>860 "/"を文字として認識することができました。 ありがとうございます。
863 名前:860 mailto:sage [2010/01/25(月) 00:38:43 ] >>859 おk。 任意の桁数でやるには INTEGER :: kslash CHARACTER(128) :: text READ '(A)', text kslash = INDEX(text, '/') READ( A(1:kslash - 1), * ) num1 READ( C(kslash + 1:), * ) num2 という感じだろう。TRIMでtextの尻の空白を切ったほうがいいかもしれん。 むろん任意と言ってもREALの範囲内の数だが・・
864 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 00:39:52 ] 訂正www READ( text(1:kslash - 1), * ) num1 READ( text(kslash + 1:), * ) num2
865 名前:859 mailto:sage [2010/01/25(月) 07:35:21 ] >> 863 おお!重ね重ねありがとうございます。 無事に作ることができました。
866 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 20:32:37 ] 初心者すぎて笑われるかもしれませんが平面上の3点の座標で三角形つくるときの面積を求めたいのですが 当然ながらヘロンの公式でやりました 辺の長さが出てる場合であればうまくいくのですが長さの計算も入れようとするとどう座標を扱えばいいかちんぷんかんぷんで X(I)とY(I)で1〜3まで動かしかたがわからないというか…その考えが間違ってるのかもわからないです
867 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 20:57:24 ] >>863 Fortran兄貴降臨!いつもお疲れさまっす。 ただ、Fortranの思想的に>>859 みたいなことは、やるべきではないとは思う。 perlでもpythonでもシェルでもいいが、Fortran実行ファイルを適当なラッパーで くるむほうが、素直で良いと思う。
868 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 21:11:49 ] >>866 君なりのソースをここに書けば直して貰えると思うよ。
869 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 21:54:30 ] >>866 数学がわからんの? Fortranがわからんの? 上の方も書いてるけど、わかってるところまでのソースを書くとよろし。
870 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 01:04:31 ] >>867 Fortranでパーサー書こうぜ! 再帰があるから、77時代ほど難しくないはず・・・
871 名前:デフォルトの名無しさん [2010/01/26(火) 14:19:14 ] >>870 とてもうろ覚えだけど・・・ DECのVMSってFortranでかなりの部分は書かれていたような。 IMEというか英語を日本語に変えるやつは堂々Fortranだったような。 ・・・とてもうろ覚えだけど。
872 名前:デフォルトの名無しさん [2010/01/29(金) 08:26:49 ] はじめまして。初心者ですがよろしくお願いします。 突然ですが、この問題を解ける方いらっしゃいますか。 学校の宿題なのですが、どうしても分からないのでここにきました。 お願いします。 問題こちら↓ 階乗 n! を計算する関数を作成し, 順列 n個の異なるものからr個取り出して並べる。 このときの順列の総数をnPrとあらわす。 nPr=n(n-1)(n-2)・・・(n-r+1) を計算する関数を作成し, 組み合わせ 異なるn個からr個取り出して組を作る。 このときの組合せの総数をnCrとあらわす。 nCr = nPr/r! を計算するプログラムを作成しなさい。(問題終わり) よろしくお願いします。
873 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 18:29:35 ] Permut[n_, r_] := Pochhammer[1 + n - r, r] Permut[n, r]/r!
874 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 19:47:54 ] オープンしている特定のファイルのバッファを フラッシュする方法はありますか。コンパイラはifortです。 出来ればクローズしないでフラッシュしたいのですが、 どうしてもバッファにたまってしまいます。 よろしくお願いします。
875 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 01:06:31 ] 872の丸投げぶりはすごいな。 途中まで書いたソースコードでもここに貼ったら?
876 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 01:14:32 ] C/C++の宿題スレが丸投げだからその流れがこちらまで来たか
877 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 10:34:15 ] 初秋の青空を連想するくらいのすがすがしい 丸投げw
878 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 16:23:48 ] >>874 CALL FLUSH(ユニット番号)
879 名前:874 mailto:sage [2010/01/31(日) 04:55:24 ] できました! >>878 ありがとうございます!
880 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 21:11:44 ] プログラムで値を入力して計算結果を得たいのですが、結果を出力するとNaNが出てしまいます。 NaNが出力される原因だけでもいいのでわかる方いらっしゃったら宜しくお願いします。 ttp://www.dotup.org/uploda/www.dotup.org610825.txt 長いのでろだに上げました。テキストファイルですみません…
881 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 21:24:10 ] 丸投げ、流行ってるな。
882 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 09:17:59 ] ifort -g -check all traceback とかでNaNにかぎらず異常値が発生したらその行を教えてくれるような実行ファイルをつくってくれる オプションがあるはずだから、マニュアルよんでみよう。 >>878 それ、よさそうだね。 ログ生成がゆっくりの場合、あるていど溜るまでディスクには書かれないから不便な事がおおかったけど、 いろいろと助かりそうだ。参考にするよ!
883 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 18:38:34 ] へぇそんなんあったんだ
884 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:00:51 ] >>880 66スタイルで何やってるかわからんなw NUMPACK使っているところを見ると、富士通、名大・九大・京大あたりの流れか。 ライブラリ関数が無いから実行することもできないしもっと詳しく書いてくれないと誰も答えられないだろう。 まぁ定数や関数の一部が単精度のままなので倍精度にしている意味がない可能性が高い。 その辺かな?w
885 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:04:41 ] >>882 FLUSHはFortran2003で導入された命令。 IntelのHELPはF2003命令がいまいち入ってなかったりしてアレなので、 文法解説書を買って学ぶがよろしい。
886 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 09:14:48 ] >>885 そうなんだ。何年か前に g77 でサブルーチン版の flush をつかったことあがった。 今確認したら、やっぱり使えた。因みに g95 だと関数版の flush が使えた。関数 版だと戻り値でエラーチェックできるから有り難い。
887 名前:デフォルトの名無しさん [2010/02/07(日) 15:54:15 ] FFTについて質問させてください。 大学の講義で、離散フーリエ変換のプログラムについて勉強中です。 講義の最後に、「バイオリンの音のデータをフーリエ変換し、 フーリエ変換した結果を横軸:周波数、縦軸:振幅としてグラフ化せよ」 という課題が出ました。 配布されたデータの読み込みを試みたのですが、どう読み込ませたらいいのかが分かりません。 配布されたデータは2列で構成されており、左の列が時刻データ、右の列は音の振幅を表しています。 ↓にプログラムを書きます。よろしくお願いします。
888 名前:デフォルトの名無しさん [2010/02/07(日) 15:56:08 ] --前半-- program fft implicit none !======================================================================== include "fftw_f77.i" integer*8 ::plan !======================================================================== !サンプリング条件の設定 !サンプリングデータ数N , aの数Ma , bの数Mb !サンプリング間隔dt = 1/44100 [s] , サンプリング周波数 f0 = 44100 [Hz] , N, Ma, Mb !周波数分解能df=1/(N・dt) integer,parameter:: N=10000,Ma=5000,Mb=4999 real(8),parameter:: df=44100/dble(N) , dt=1.0d0/44100 !入力波形のデータの設定fin=100Hz real(8) ::fin,a0 !作業用の変数 complex(8):: in(N),out(N),c(0:n-1) integer ::i real(8) ::t,a(0:Ma),b(1:Mb),x,y
889 名前:デフォルトの名無しさん [2010/02/07(日) 15:57:26 ] --後半-- !入力データの設定 write(*,*) 'Input data:' open(unit=11,file='violin.dat') do i=1,N ※ここが分かりません!※ end do close (11) !======================================================================== !ライブラリを利用したフーリエ変換(作業領域作成と実行) call fftw_f77_create_plan(plan,N,FFTW_FORWARD,FFTW_ESTIMATE) !準備 call fftw_f77_one(plan,in,out) !実行 !======================================================================== !結果の変換 c(0:N-1)=out(1:N) a(0)=c(0) a(1:Ma)=dble( c(1:Ma)+c(N-1:N-Ma:-1) ) b(1:Mb)=dble( (c(1:Mb)-c(N-1:N-Mb:-1))*(0.0d0,1.0d0) ) !======================================================================== !結果の出力 write(*,*) 'Output data after forward FFT:' open(unit=22,file='ab-.csv') open(unit=21,file='c-.csv') do i=1,N write(21,'(i6,'','',1pe16.8,'','',1pe16.8)') i,out(i) end do write(22,'(1pe16.8,'','',1pe16.8,'','',1pe16.8)') 0.0,a(0),0.0 write(22,'(1pe16.8,'','',1pe16.8,'','',1pe16.8)') (i*df,a(i),b(i),i=1,Mb) if (Ma/=Mb) write(22,'(1pe16.8,'','',1pe16.8,'','',1pe16.8)') Ma*df,a(Ma),0.0 close (21) close (22)
890 名前:デフォルトの名無しさん [2010/02/07(日) 15:59:09 ] --ラスト-- !======================================================================== !フーリエ変換(作業領域消去) call fftw_f77_destroy_plan(plan) end program fft
891 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:29:00 ] >>889 クラスの友達に聞いた方が早いよ。
892 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:20:13 ] むしろ、データファイルの中身が必要なんじゃね?
893 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:37:52 ] >>891 きっとボッチなんだよ。
894 名前:デフォルトの名無しさん [2010/02/07(日) 22:48:06 ] そうなんすよ。 彼女と遊びすぎて留年しちゃったもんで・・・。
895 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 23:02:40 ] お前はこのスレを敵にまわした。
896 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 23:10:16 ] >>894 教えようと思ったがやめた
897 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 03:48:18 ] 自分が今いるサブルーチンの名前を取得する方法ってありますか? デバッグするときにどのサブルーチンで止まってるか確かめたいんですが。
898 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 07:30:51 ] 終了したのが なんていうサブルーチンで何行目か、とか ソースファイルの何行目だったか、とか教えてくれるようにする オプションってあったと思うけどなぁ。というわけでマニュアルを読もう! Fujitsuだと超最適化かけてもこの機能はついてくるのが素晴らしいが PC向けではなかったような・・・。出してくれんかねぇ
899 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 07:59:22 ] >>898 いえ、それがめんどくさいことに終了せずにどこかで停止してるんですよ。 write文の中身をいちいち変えてもいいんですけど、 出来るだけコード汚さないように書きたいので。
900 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 11:25:45 ] すみません、もう一つ。subroutineの最後に return end って書くのはなんででしょう。サブルーチンでのendってreturnと 同じ意味じゃないんでしょうか?returnが無いと困るケースってあります?
901 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 12:13:11 ] ヒント: returnはサブルーチンの最後である必要は無い。
902 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 13:12:13 ] 大昔はEndSubroutineが無かったから、 このEndはサブルーチンのですよ、とチェックをいれる意味で 推奨されてた名残だね。ぶっちゃげ無くてEndだけでもいい。 Returnはサブルーチン抜けを意味するのだからメイン階層では絶対出てこないので。
903 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 18:54:13 ] 900じゃないけどreturnとか使った事ありませんでした 勉強になるスレです
904 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:05:26 ] >>897 __FILE__ を使って後はゴニョゴニョとよくやってた。 Fortran 自体を使わなくなって数年(足を洗ったので)。
905 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:08:56 ] >>899 Fortranにはそういう命令はない。 しかしコンパイラのtracebackオプションを使えばいい。 大抵のコンパイラにはそういう機能がある。 だがそれは、処理系に依るのでマニュアルでオプションを調べるしか無い。 コンパイラの種類とバージョンを言えばわかる可能性はある。
906 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:13:26 ] __LINE__使えるんじゃないの?
907 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 00:35:53 ] >>906 標準のFortranにはないべ。 Unix系のプリプロセッサの機能だろ。方言のなまりがきつすぎる。
908 名前:ごめんなさい、お願いです。 [2010/02/10(水) 00:51:22 ] このプログラムを 明日までに作ってください!!お願いします。 Fortranで, 階乗 n! を計算する関数を作成し, 順列 n個の異なるものからr個取り出して並べる。 このときの順列の総数をnPrとあらわす。 nPr=n(n-1)(n-2)・・・(n-r+1) を計算する関数を作成し, 組み合わせ 異なるn個からr個取り出して組を作る。 このときの組合せの総数をnCrとあらわす。 nCr = nPr/r! を計算するプログラムを作成してください。 おねがいします。
909 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 01:55:59 ] >>908 最近勉強しているのでFortran95 で書いてみた。 たぶん君が求めているのはF77ヴァージョンだろうw MODULE m_2chan IMPLICIT NONE CONTAINS ELEMENTAL INTEGER FUNCTION factorial(n) INTEGER, INTENT(IN) :: n INTEGER :: i factorial = PRODUCT( (/ (i, i = 1, n) /) ) RETURN END FUNCTION factorial ELEMENTAL INTEGER FUNCTION permutation(n, r) INTEGER, INTENT(IN) :: n, r INTEGER :: i permutation = PRODUCT( (/ (i, i = n, n - r + 1, -1) /) ) RETURN END FUNCTION permutation ELEMENTAL INTEGER FUNCTION combination(n, r) INTEGER, INTENT(IN) :: n, r combination = permutation(n, r) / factorial(r) RETURN END FUNCTION combination END MODULE m_2chan !
910 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 01:57:29 ] PROGRAM twochannel USE m_2chan IMPLICIT NONE INTEGER :: n, k PRINT *, 'INPUT n and k' READ *, n, k PRINT *, 'nCk = ', combination(n, k) STOP END PROGRAM twochannel 77育ちの俺様は、暗黙の型に従っていないのですげー気持ち悪いぜwww
911 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 02:27:41 ] >>908 数学的にチューニングすべきだが、提示された式のとおりに作った。PROGRAMは改行多杉になるので省略 integer function factorial(n) implicit none integer i, n i = n factorial = 1 do while(i .gt. 0) factorial = factorial * i i = i - 1; end do end integer function permutation(n, r) implicit none integer n, r, i i = 1 permutation = 1; do while(i .le. r) permutation = permutation * (n - i + 1) i = i + 1 end do end integer function combination(n, r) integer n, r, factorial, permutation combination = permutation(n, r) / factorial(r) end
912 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 08:48:40 ] 908の人気に嫉妬
913 名前:デフォルトの名無しさん [2010/02/10(水) 08:58:43 ] >>901 >>902 あ、そうなんですか。別に書かなくてもいいってことですね? >>904 >>905 >>906 ありがとうございます。でも、エラーが出て終了するんじゃなくて、 ジョブは走ってるんですけどどこかで止まってるっぽいんですよ。 出力ファイルが計算途中で更新されなくなるんです。 で、どこまで進んでどこでどうなってるか調べたいのでいちいちwrite文挟んでるんですが… tracebackって終了したときしか使えないですよね?
914 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 10:05:57 ] デバッガー無いのか? アタッチ出来れば楽勝だな。
915 名前:908です。 [2010/02/10(水) 11:57:13 ] みなさん、ありがとうございました!!(泣
916 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 23:09:07 ] >>913 仰る通り Traceback は異常終了しないとでない。 しかし、望みの機能が存在しないのは、世の中の人がその機能を欲していないということなので がんばってPRINT文をばらまいて解決しなさいw プログラム相談員とか、そういう人に聞くのも、連中の人を小馬鹿にしたような寝言を我慢しないと 駄目だが、有効w
917 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 13:16:13 ] >>916 >連中の人を小馬鹿にしたような寝言を我慢しないと駄目だが ワロタw あの目線はどうにかならんのか
918 名前:デフォルトの名無しさん [2010/02/11(木) 22:18:28 ] ちょっとお聞きしたいのですが、 fortranでguiプログラミングはできないのでしょうか?
919 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 23:26:53 ] >>918 C用のライブラリのAPIを呼びまくるという形ではできる。