1 名前:デフォルトの名無しさん [2006/11/22(水) 00:00:36 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc8.2ch.net/test/read.cgi/tech/1163319215/
528 名前:デフォルトの名無しさん [2007/05/24(木) 19:38:37 ] fortranでフィボナッチ数列A0 = 0 , A1 = 1 , Ai+1 = Ai + Ai-1 (i =2,3...)を計算するプログラムを作っています。 得られた値が奇数の時には、数値の右横に*をつけ、奇数かつ3の倍数なら**をつけます。以下のようにプログラムしましたが、*印が偶数時にもついてしまい、また**の付け方にも困っています。どこが、間違っているのか、アドバイス手本よろしくお願いします。 IMPLICIT REAL (A-H,O-Z) A0 = 0 A1 = 1 A2 = 1 WRITE(6,*)'A 0 = 0' WRITE(6,*)'A 1 = 1' DO 20 L = 2,20,1 A2 = A1 + A0 I = A2-INT(A2/2)*2 J = A2-INT(A2/3)*3 IF(J.NE.O.AND.I.NE.O) THEN WRITE(6,*) 'A',L,'=',A2,'*' ELSE IF(J.NE.O.AND.I.EQ.O) THEN WRITE(6,*) 'A',L,'=',A2,'*' ELSE WRITE(6,*) 'A',L,'=',A2 END IF A0 = A1 A1 = A2 20 CONTINUE STOP END 結果 A 0 = 0 A 1 = 1 A 2= 1.* A 3= 2.* A 4= 3.* A 5= 5.* A 6= 8.* A 7= 13.* A 8= 21.* A 9= 34.* A 10= 55.* A 11= 89.* A 12= 144.* A 13= 233.* A 14= 377.* A 15= 610.* A 16= 987.* A 17= 1597.* A 18= 2584.* A 19= 4181.* A 20= 6765.*
529 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 21:10:22 ] >>528 ・FORTRANにはMODという便利な関数がある。 ・「奇数」、「奇数かつ3の倍数」の判定条件が変。 ・せっかくIF/ELSE IFで条件分けしているのにWRITE文がまったく同じ。 ・プログラムの頭に「IMPLICIT NONE」をつけてみよう。
530 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 21:13:41 ] >>528 実数で計算する必要があるのか?
531 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 07:16:18 ] >>528 Ai+1 = Ai + Ai-1 を計算するなら、次のように配列を使う方が簡単だと思います。 A(i+1) = A(i) + A(i-1)
532 名前:デフォルトの名無しさん [2007/05/25(金) 10:37:01 ] >>530 絶対にない >>526 絶対に3x3なら式を9個並べろ 規則性が分かったらループ回せ さすればkxn ・nxjでも簡単に計算できる
533 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 10:59:00 ] >>526 行列の積の定義を線形代数の本で見よ. 定義式をそのまま計算すればよろしい. 3x3が保障されてるなら532の言うように,式を9本かけばよい.
534 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 13:52:19 ] テキストファイルから行列を読み込む方法が分らないんじゃないかな。
535 名前:532 [2007/05/26(土) 00:25:52 ] open(2) "mat.txt" C ループ回すなら工夫して回せ read(2,*) A(I,J) read(2,*) B(K,L) C calc statment どーのこーの close(2) stop end I,JとK,Lで変えたけど分かってるならB(I,J)でも良い open文でstatus=oldかunknownが必要なら書け。 つーか、そしたら質問者は何も理解してないな。
536 名前:デフォルトの名無しさん [2007/05/26(土) 10:47:59 ] >>526 c = matmul(a, b) じゃだめなの?
537 名前:デフォルトの名無しさん [2007/05/26(土) 17:02:20 ] >>536 多分77の課題なんでね?それでいいとすると、あまりにあまり(正笑
538 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [2007/05/26(土) 17:41:55 ] !(Φ_Φ+){???} Ai+1 = Ai + Ai-1 ↓↓↓ 「全てに一致する」 i『option』 + 1 ≫『代入する』≪ 「全てに一致する」 i『option』 + 「全てに一致する」 i『option』 -1 A(i+1) = A(i) + A(i-1) ↓↓↓ 「全てに一致する」 (i『option』 + 1) ≫『代入する』≪ 「全てに一致する」 (i『option』) + 「全てに一致する」 (i『option』- 1)
539 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [2007/05/26(土) 17:50:49 ] !(Φ_Φ+){???} 『「全てに一致する」(command) i{option}』 == 『文字列、配列順に一致を優先する + i{option}』
540 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [2007/05/26(土) 17:55:32 ] 〆{この様に?} Ж √ζ {Ж}
541 名前:デフォルトの名無しさん mailto:sage [2007/06/02(土) 13:14:21 ] do i=1,10 end do の場合、このループを抜けた後iの値は11になるのですか?
542 名前:デフォルトの名無しさん mailto:sage [2007/06/02(土) 13:50:47 ] yes
543 名前:デフォルトの名無しさん [2007/06/02(土) 20:30:31 ] 大変初歩的なこととは思いますが質問です x : 1 2 3 4 5 ... y : -0.1 -0.02 0.03 0.1 0.7 ... のように,無数のxに対応するyの値を記録させるアルゴリズムがすでにあります. ここで,yの符号が変わったときの,対応するxを記録する(ここでいうx=3) 命令を組みたいのですが・・・ どうもわかりません. わかる方いれば教えていただけないでしょうか?
544 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 00:27:01 ] >>543 データ量が少ないなら、頭から1こづつ見ていっても対して変わらん。 それが嫌なら、単純なのは二分法。ぐぐればよろし。
545 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 12:03:57 ] ×づつ ○ずつ
546 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 17:50:33 ] >>545 歴史的仮名遣いでは『づつ』の方が正しい。 Fortran使いは、古いほうを好むべし。
547 名前:デフォルトの名無しさん [2007/06/03(日) 19:04:51 ] x-1とxのyを掛けて負ならば記憶させたら良いだけじゃ?
548 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 23:27:29 ] グローバル変数みたいなことしたいなら、commonじゃなくモジュール使えって言われますが commonだとどの変がまずいんですか?正確に複写しないとダメ、という他に 速度などの面でデメリットとかあるんでしょうか?
549 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:41:21 ] >>548 COMMONは色々厄介なのよ。 メモリーの先頭番地を合わせるだけなので、まったく別の名前で別の並びでも成立する。 サイズが合わなくてもいい。(処理系に依存するが最初に出た大きさになることが多いと思う) 昔はメモリー節約のために、今で言う動的割付のようにプログラマーがCOMMONを 自己責任で様々に再利用した。プログラムの前半と後半で、同じCOMMONブロックを まったく別の割付で用いるとか。COMMONの前半分は共通で、後ろ半分が次々変化するとか。 そういうプログラムは非常にデバッグが難しい。読まされるほうは地獄。 そういう過去の怨念が溜まっているので、COMMONはとても忌み嫌われているのだ。 単なるGlobal変数として使う分には、その恐ろしさが分からないだろうが、COOMONは ほとんど無制限のメモリー領域の共有だと理解したほうが適切。 速度的にはむしろ早いんではないかと思ったりもする。
550 名前:548 mailto:sage [2007/06/04(月) 01:29:46 ] >>549 >プログラムの前半と後半で、同じCOMMONブロックを >まったく別の割付で用いるとか。COMMONの前半分は共通で、後ろ半分が次々変化するとか。 昔はそんなことをしてたんですか・・・壮絶ですね でも逆に考えると、割と単純な科学技術計算とかで、複雑なことはしないが 速度はひたすらに要求されるような場合は、あえてcommonを使ったりするんでしょうか? 今は普通に引数で渡してますが、これ変えたら速くなるかなぁ
551 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 04:27:52 ] あらゆるところで変更されうるから、 common に起因するバグがあった場合、 バグのあるとろを探すのが大変、 というのはよく言われるところ。 ただ、common を避ける事で引数がもの凄く多くなるとなると、 それはそれで問題になる事もあったり。
552 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 11:42:58 ] >>550 最適化の問題などもあるので、今となってはCOMMONにする利益は無いのではないかと思う。 MODULEで渡しても変わらないのではないかと推測する。 FORTRANは参照渡し、すなわち変数のアドレスしか渡さないので、 変数のコピーを渡す値渡しと違って、それほど引数渡しのオーバーヘッドの問題は少ないと思う。 ただFortran90になってから、配列を受け渡すときに、サイズや次元の情報まで渡すようになったが・・ (FORTRAN77までは配列の先頭要素の番地しか渡さない)。 Fortran90の配列引渡しのとき、x(:)とかx(5:10)などと : 指定子を使って部分配列を渡そうとすると いまのFortranの実装では、呼び出し前に暗黙のダミー配列にコピーをつくり、それを渡して 戻ってきた結果を再び元の配列にコピーしている。したがってオーバーヘッドが大きくなる。 意味的には同じだが、xを渡す場合とx(:)を渡す場合だと、後者のほうが少し遅くなる。 巨大な配列は部分配列で受け渡さないほうがいい。
553 名前:548 mailto:sage [2007/06/04(月) 16:11:30 ] 詳しい解説ありがとうございます。勉強になります。 いつまでもFORTRAN77ではさすがに時代遅れになるかも・・・という漠然とした不安から、 上のバージョンへの移行を考えていたのですが、よく検討したほうが良さそうですね。 Fortran95とか新しいやつはオブジェクト指向とかも取り入れてるんでしたっけ。 速度を求めてる人にとっては論外なんでしょうね。。
554 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 23:15:07 ] >>553 Fortran95はFORTRAN77を含んでいるので、中途半端に移行してもいいんで内科医。 部分配列の引数受け渡しが遅くなるといっても、よほどのことが無い限り差はでないだろう。 オブジェクト指向はFortran2000からで、Fortran95ならPASCALが半分混じったような感じなので、 80年代とかに教育を受けた人には親しみやすいところがあると思う。 FORTRAN77を長く使った後で、Fortran90/95を使うと、痒いところに手が届くというか、 こんな機能があったらな、と思っていたような機能が色々入っているので、学んで損は無いと思う。
555 名前:デフォルトの名無しさん [2007/06/06(水) 00:25:16 ] IntelのコンパイラがVer10になった?
556 名前:デフォルトの名無しさん [2007/06/06(水) 00:55:42 ] 全日空の旧システムはFORTRANで書かれていた! ttp://itpro.nikkeibp.co.jp/article/JIREI/20070530/273051/
557 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 00:58:07 ] うn レジストレーション・センターに置いてあった。 IntelやXLsoftからはまだアナウンスがないけど、Windows版はなにやら Microsoft Visual Studio 2005 Premier Partner Edition Included だそうで。
558 名前:デフォルトの名無しさん [2007/06/06(水) 02:57:06 ] >>557 >Microsoft Visual Studio 2005 Premier Partner Edition Included kwsk
559 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 03:41:57 ] >>558 ttp://www.intel.com/cd/software/products/asmo-na/eng/compilers/fwin/278834.htm VSの簡易版(?)が付いて単体で使えるようになった。 あとPro版にMKLが付くようになった。
560 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 11:51:28 ] Product name Full product Support renewal IntelR Visual Fortran Compiler, Standard Edition, for Windows* $599 $2801 IntelR Visual Fortran Compiler, Professional Edition, for Windows* Includes IntelR Math Kernel Library $699 $280 IntelR Visual Fortran Compiler, Professional Edition, for Windows* with IMSL* Includes IntelR Math Kernel Library and IMSL Fortran Library $1,599 $749 1Support renewal qualifies you for upgrade to the Professional Edition ttp://www.intel.com/cd/software/products/asmo-na/eng/compilers/279613.htm よく分からんが、いままでのスタンダード版の更新料が$280に値上げになるが、 MKLも付くようになるという事でいいのかな?
561 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 14:07:06 ] fortran90って外部コマンド実行できますか? perlで言うsystem()みたいな ちなみにlinux環境です
562 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 14:08:42 ] 何でとりあえずやってみようとしないの?
563 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 14:22:40 ] fortranで外部コマンドなんて使えるの?いったいどういう仕組みで・・・ perlとかなら分かるけど
564 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 15:07:33 ] なんで使えないと思うのかが理解できない。
565 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 19:21:03 ] Fortran77の宿題なんですが・・、下のような行列を絶対値の小さいものから1行目に順に 並べるプログラムをつくれというものなんですが、分かりません。どなたかよろしくお願いします。 ‖2.0 1.0 -4.5‖ ‖0.0 -0.5 1.1‖ ↓ ‖0.0 -0.5 1.0‖ ‖1.1 2.0 -4.5‖
566 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 19:36:53 ] >>560 スタンダード版は新規のみでサポート更新がなくなったからプロ版(のサポート更新)にアップグレードしろ ということかと。
567 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 23:26:44 ] アップグレードで得られる権利: 各 プロフェッショナル・エディション に含まれる製品に対する使用権を所有します。 サポート期間が所有製品の現在の終了日より 1 年間更新されます。 例 ) インテル C++ コンパイラー 9.1 Windows 版 を 2006 年 10 月に購入した場合 ( この場合、サポートサービスが 2007 年 10 月まで有効 ) 、インテル C++ コンパイラー Windows 版プロフェッショナル・エディション SSR を購入することで、インテル C++ コンパイラー Windows 版プロフェッショナル・エディション に含まれるインテル C++ コンパイラーおよびすべてのライブラリー (IPP 、 MKL 、 TBB) のサポートサービスが 2008 年 10 月まで有効になります。 ttp://www.xlsoft.com/jp/products/intel/compilers/comp10_faq.html よく和歌欄が、今すぐ更新すれば従来の更新期間1年延長で、MKL付きの版に変わるという事か?
568 名前:デフォルトの名無しさん [2007/06/07(木) 03:04:51 ] >>565 2行3列に見えるのは、俺の目の錯覚? 「ソート」で調べて絶対値を被せたら良いだけじゃ?
569 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 15:36:43 ] 古いコンパイラで -Nl50 というオプションの効果がわかる方がいれば教えてください。
570 名前:デフォルトの名無しさん [2007/06/08(金) 17:06:33 ] >>569 コンパイラの種類は?バージョンは?
571 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 20:25:46 ] バージョンは分かりません。種類はFortranのコンパイラです。
572 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 23:55:35 ] >>571 お前はアホか! エスパーだって答えられないぞ! しょんべんで顔洗って出直せ! コンパイラのヘルプを見れなり、バナーを出すなりして、それをこのスレにコピペしろ。 それも出来ないなら、せめてコンピュータ名やOSくらいは書け。 脳みそがたりないようだから、何も考えるな、言われたままやれ。
573 名前:デフォルトの名無しさん [2007/06/09(土) 10:52:57 ] >571 まあ、とりあえず、そのコンパイラでコンパイルするときに打つコマンドは何? frt とか g77 とか、そんなんでわかるばあいもあるし。
574 名前:デフォルトの名無しさん [2007/06/09(土) 21:47:03 ] windows xp のコマンドプロンプトで f90のコンパイルして実行するとstack overflowしちゃいます. visual studio だとスタックサイズ増やせたんですが, コマンドプロンプト上でやりたいんです. どうしたらスタックサイズ増やせますか.
575 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 21:52:27 ] >>574 >>572-573
576 名前:574 [2007/06/09(土) 22:03:48 ] >>575 俺の頭が悪いのか理解できません 噛み砕くと?
577 名前:574 [2007/06/09(土) 22:28:12 ] 事故解決しました.おさわがせしました.
578 名前:デフォルトの名無しさん mailto:sage [2007/06/09(土) 23:01:17 ] >>574 解決結果を書いておくと、備忘録になり、他の人の助けにもなる。 まぁ一般的に言えば、大概のコンパイラでは /help とか /? で、オプション一覧が出るので それを見れば解決するのだが・・・
579 名前:574 mailto:sage [2007/06/10(日) 00:25:33 ] じゃぁ。 自分ができた方法を・・・ 普通にコンパイル ↓ editbin /stack:十分な値(デフォルトは1Mだから、それ以上の数字) program.exe ↓ program.exe で、できました。もっと効率のよい方法もあるのかも、、、
580 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 03:01:07 ] >>579 コンパイラは何? Visual Studio上で動くFortranコンパイラにしても色々あるわけだが
581 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 05:35:56 ] ry、 / / } _/ノ.. /、 / < } ry、 {k_ _/`;, ノノ パンパン / / } ;' `i、 _/ノ../、 _/ 入/ / `ヽ, ノノ / r;ァ }''i" ̄.  ̄r'_ノ"'ヽ.i ) ―☆ {k_ _/,,.' ;. :. l、 ノ \ ` 、 ,i. .:, :, ' / / \ ,;ゝr;,;_二∠r;,_ェ=-ー'" r,_,/ ☆ 【ラッキーレス】 このレスを見た人はコピペでもいいので 10分以内に3つのスレへ貼り付けてください。 そうすれば14日後好きな人から告白されるわ宝くじは当たるわ 出世しまくるわ体の悪い所全部治るわでえらい事です
582 名前:574 [2007/06/11(月) 09:59:23 ] >>580 まぁ、前に書いたんですが・・・・ f90です
583 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 10:02:32 ] ( ゚д゚)
584 名前:デフォルトの名無しさん [2007/06/11(月) 10:48:04 ] >582 俺が不勉強なのかもしれんがf90というコンパイラは聞いたことがない。 そのソフト買ったとき、箱に f90 って書いてあった? なんていうメーカーの製品?
585 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 12:55:24 ] その製品を知ってれば答えられるが知らないなら答えられないというなら、 その製品が何かを聞き返すこと自体、意味がない気がしないでもない。
586 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 14:13:24 ] f90 は汎用コマンド名であって、コンパイラ名ではないな。
587 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 15:13:13 ] 任意の文字列C、整数Nを入力して、これらを連結してファイル名に使いたいのですが、 どうやればできるでしょうか?
588 名前:デフォルトの名無しさん [2007/06/11(月) 15:57:22 ] >>587 WRITE文を使えば簡単ですよ PROGRAM test IMPLICIT NONE CHARACTER(20) :: str1 = "test", str2 INTEGER :: i DO i=1,10 WRITE(str2,'(A,I3.3,".dat")') trim(str1), i WRITE(*,'(A)') trim(str2) END DO END PROGRAM test 出力結果 test001.dat test002.dat test003.dat test004.dat test005.dat test006.dat test007.dat test008.dat test009.dat test010.dat
589 名前:587 mailto:sage [2007/06/11(月) 18:02:38 ] ありがとうございます。trim関数ですか ただFORTRAN77なんですよね・・・
590 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 19:57:45 ] >>589 PROGRAM HOGE IMPLICIT NONE CHARACTER*10 C CHARACTER*20 STR INTEGER N, I READ(*,*) C READ(*,*) N I = INDEX(C,' ') - 1 IF (I .LE. 0) I = LEN(C) WRITE(STR, '(A, I3.3, ''.dat'')') C(1:I), N WRITE(*,*) STR STOP END
591 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 22:39:22 ] >>587 またこの質問かwwww 次からテンプレに入れておけ!(正笑
592 名前:587 mailto:sage [2007/06/11(月) 22:57:31 ] >>590 知りませんでした・・・>INDEX ありがとうございました
593 名前:デフォルトの名無しさん [2007/06/12(火) 03:04:08 ] //でくっ付けろよ。
594 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 09:11:28 ] >>593 まぁ、内部ファイルでやると1行で出来るからな。
595 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 00:06:45 ] N行N列の逆行列を求めるプログラムの作り方を教えてください・・・ ちなみにfortran90です LAPACK使えって言うのは無しで・・・
596 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 00:26:26 ] >>595 線形代数の行列の所で、掃き出し法によって逆行列を求める方法をやったでしょ。 それをそのままプログラムにすればOK、習って無くても、どの線形代数の本にもに載ってる と思うからから、調べてみて。数値計算だとガウス・ジョルダン法と呼ばれてる方法かな?
597 名前:デフォルトの名無しさん [2007/06/15(金) 10:15:01 ] LU分解 掃き出し法 スカイライン 色々あるよ。つーか数値計算の本読め。
598 名前:595 mailto:sage [2007/06/15(金) 11:11:08 ] 返事が遅くなって申し訳ない 助言ありがとうございます とりあえず、自力でまずはプログラム化してみます
599 名前:デフォルトの名無しさん [2007/06/15(金) 14:20:39 ] 教えて下さい。 H(l)を以下のように計算したいのですが、走らせても答えが「NaN」と表示されます。 どこがおかしいか教えて下さい。お願いします。 program FILTER c implicit real*8(a-h,o-z) dimension H(100000) open(115,file='H.dat') c do 10 l=1,n/2+1 f=df*(l-1) e=f/10.0 H(l)=((1.0/f)**0.5)*((1.0+(0.694*(e**2))+(0.241*(e**4)) &+(0.0557*(e**6))+(0.009664*(e**8))+(0.00134*(e**10)) &+(0.000155*(e**12)))**(-0.5))*((1.0-(dexp(-(f/0.5)**3)))**0.5) write(115,*) H(l) 10 continue c pause stop end (注)&は数式が長くなったため、改行している事を意味しているようです。
600 名前:デフォルトの名無しさん [2007/06/15(金) 14:29:00 ] >>599 n の値が不定 df の値も不定
601 名前:デフォルトの名無しさん [2007/06/15(金) 15:58:37 ] >>600 ありがとうございました。
602 名前:デフォルトの名無しさん [2007/06/17(日) 21:24:23 ] >>599 暇なんで書き換えてみた。 i=1 のときは、f がゼロだから 1/f が計算できないからパス。 program filter implicit integer(i-n) implicit real*8(a-h,o-z) real*8 ek(1:6) ek = (/ 0.69400d0, 0.24100d0, 0.055700d0, & 0.09664d0, 0.00134d0, 0.000155d0 /) df = 0.01d0 n = 20 do 1 i = 2, n / 2 + 1 f = df * (i-1) ee = f * f * 0.01d0 ex = 1.d0 ss = 1.d0 do 2 j = 1, 6 ex = ex * ee ss = ss + ex * ek(j) 2 continue sx = 1.d0 - dexp(-(f+f)**3) H = dsqrt( sx / (f*ss) ) write(*,*) i, H 1 continue stop end
603 名前:デフォルトの名無しさん [2007/06/18(月) 00:54:21 ] たぶんファイルからNを読み。 H.datの中のN個分のデータからH(I)を作りたいじゃ? もとのプログラムではHを配列にする必要ないけど。 dexp(-(f/0.5)**3)のf/0.5は 2*fの方が見やすいと思うけど。 元の定義式がこうなってるのかな?
604 名前:デフォルトの名無しさん [2007/06/19(火) 01:02:38 ] 複素数 C=(1.d0/3.d0,0.d0)のように分数などを打つとエラーが出るのはなんでですか? ちなみにC=(dlog(2.d0),0.d0)もエラーがでました。
605 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 01:26:40 ] >>604 cmplx()にしたらコンパイルできる。 次に質問するときはエラーメッセージくらいは 書いたほうが良いぞ。
606 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 01:28:40 ] 倍精度にしたそうだから dcmplx じゃないかな。 それともどっちでも自動的に補正してくれたっけ?
607 名前:デフォルトの名無しさん [2007/06/19(火) 01:30:16 ] >>604 ダメな理由はしらんが、 C = cmplx(1.d0/3.d0, 0.d0) でOK。
608 名前:デフォルトの名無しさん [2007/06/19(火) 02:09:37 ] >>605 >>606 >>607 ありがとうございました。 はじめにcomplex*16::c(100,100)と宣言しているので、そのままいけると思ってました。
609 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 02:10:49 ] 要するに (***, ***) で1つのリテラルだから、 その中に演算子とか(符号以外)入れれないんだろう。
610 名前:デフォルトの名無しさん [2007/06/20(水) 11:28:28 ] 質問させていただきます。 以下のプログラムで、y1とy3は答えとともにオープンしてくれるのですが、y2のオープンしたファイルが何も表示されません。 サブルーチン文はy1y2y3ともに引数は表示してくれてます。何か問題がありましたら教えて下さい。 お願いします。 program IFFT implicit real*8(a-h,o-z) dimension y1(1000000),y2(1000000),y3(1000000) complex*8 w1(1000000),w2(1000000),w3(1000000) dimension H(1000000),f(1000000) c open(114,file='d.dat') open(115,file='e.dat') open(116,file='f.dat') c m=15.d0 dt=0.01 n=2.0**m tp=n*dt df=1.0/tp c call SPECFILT(w1,w2,w3) do 21 j=n/2+2,n w1(j)=conjg(w1(n-j+2)) w2(j)=conjg(w2(n-j+2)) w3(j)=conjg(w3(n-j+2)) 21 continue c
611 名前:デフォルトの名無しさん [2007/06/20(水) 11:30:38 ] call nlogn(m,w1,1.0) do 24 k=1,n y1(k)=real(w1(k))/dt t=dt*(k-1) write(114,*) y1(k) 24 continue call nlogn(m,w2,1.0) do 25 k=1,n y2(k)=real(w2(k))/dt t=dt*(k-1) write(115,*) y2(k) 25 continue call nlogn(m,w3,1.0) do 26 k=1,n y3(k)=real(w3(k))/dt t=dt*(k-1) write(116,*) y3(k) 26 continue c stop end
612 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:01:49 ] >>610-611 入力ファイルが空なんだろう。 だいたい3つのファイルが同じ処理をしているなら、一つ用のサブルーチンを作って それを3回呼ぶようにすれば、このような疑問は生じない。 どうせ同じことだと横着して、同じ処理を3回書くから、どこかで間違ったかもと余計な時間を食う。 反省しろ! Fortranの神様に謝罪と賠償しろ!
613 名前:デフォルトの名無しさん [2007/06/20(水) 12:31:11 ] 612> それが入力ファイルもオープンしたらちゃんと値が表示されていたんですよ。
614 名前:デフォルトの名無しさん [2007/06/20(水) 12:54:58 ] >>610 質問と関係ないけど、 m=15.d0 dt=0.01 n=2.0**m tp=n*dt df=1.0/tp これ気持ち悪い。整数と倍精度実数はっきり区別して書く。 m = 15 n = 2**m dt = 1.0d-2 tp = dble(n) * dt df = 1.0d0 / tp f77も複素数型も使うことないので、あやふやだけど、 complex*8 は、実部と虚部の合計で8バイトで、実部と虚部それぞれは4バイト(単精度実数)、 complex*16は、実部と虚部の合計で16バイトで、実部と虚部それぞれは8バイト(倍精度実数)じゃなかったっけ? y1-y3 は real*8 なんだから、complex*16 のが良い気がする。 ちなみに、F90 以降の complex(8) みたいな宣言の方法だと、 実部・虚部それぞれが8バイトだったような気がする。
615 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 20:11:02 ] Microsoft PowerstationをWindowsXpにインストールしてFortranを使おう と思ったのですが、コンパイル時に Error executing fl32.exe. Text1.obj - 1 error(s), 0 warning(s) とエラーが出て先に進めません。 どうすれば解決するのでしょうか よろしくお願いします
616 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:04:58 ] >>615 どの文でエラーが起こったか分からないと 答えようがないんで… 文法間違いでないならサンプルで試してみたら 良いのでは?
617 名前:デフォルトの名無しさん [2007/06/21(木) 03:44:49 ] >>611 do 25 k=1,n の直前にnの値が何か書くように汁。
618 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 12:12:35 ] >>615 PowerStationはバグがあるから、新しいコンパイラ買え。
619 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 21:06:33 ] DO 100 L = 1 , 5 READ(IOT) & (((FTR(I,J,K,L),I=1,A),J=1,B),K=1,C) 100 CONTINUE というプログラムで、値は全てファイルから読み込ませます。 予めAとBとCは読み込みをさせています。 それでこのプログラムを実行させようとすると input statement requires too much data, unit200, file "ファイル名" と表示されて実行出来ません。どうやらデータの読みすぎのようなのですが、 心当たりがありません。 考えられる原因は何があるのでしょうか。 A,B,Cは200×100×50くらいの値です。
620 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:43:44 ] >>619 ttp://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/em/em01_03.htm >evere (67): Input statement requires too much data >FOR$IOS_INPSTAREQ。書式なし READ 文または PAD='NO' で開かれたファイルからの書式付き順番 READ 文で既存の記録以上のデータを読み取ろうとしました。
621 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 23:23:17 ] >>619 A*B*C〜1,000,000〜1M 単精度なら4倍して4M データファイルの大きさがこれくらいあるか? まぁファイルの読み取りが、ここだけとしての話だがw
622 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:04:04 ] ありがとうございました
623 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:50:59 ] ハードウェアで4倍精度演算をサポートしてないと劇遅だよな
624 名前:デフォルトの名無しさん [2007/06/22(金) 15:10:51 ] end file premeture で終わるタイプと違う?ただのエラー表示の違い?
625 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:55:05 ] >>623 当然だろw コプロが無かった時代のパソコンでの計算を思い出せw
626 名前:デフォルトの名無しさん [2007/06/24(日) 22:37:16 ] 初歩的な質問でしたら申し訳ないのですが、調べてもわからないので質問させて下さい。 fortranで作ったプログラムを実行ファイル(EXE形式)にするにはどうすればいいのでしょうか。 (プログラムを実行するたびにfortranを起動して[コンパイル]→[ビルド]→[実行]するのは面倒なので、 .exeをダブルクリックするだけにしたいのです)
627 名前:デフォルトの名無しさん [2007/06/24(日) 22:46:43 ] >>626 一度、ビルドしてたら、実行ファイルできてないですか? フォルダが作成されてたらその中とかに。
628 名前:626 mailto:sage [2007/06/24(日) 23:03:43 ] >>627 「Debug」フォルダの中に実行ファイルできてました。 どうやらアホな質問をしてしまったようで申し訳ないです。 どうもありがとうございました。