1 名前:デフォルトの名無しさん [2006/11/12(日) 17:13:35 ] FORTRAN総合スレッドです。 FORTRAN77/90/95/2003, HPF等、FORTRAN全般に関する話題を書き込んで下さい。 ・FORTRAN関連情報 お約束だが、まずは自分で調べよう www.google.co.jp/ x86で動作するFortranコンパイラ www.nminoru.jp/~nminoru/programming/x86-fortran.html The Fortran Company www.fortran.com/ Polyhedron Software www.polyhedron.co.uk/ Google Directory - Fortran directory.google.com/Top/Computers/Programming/Languages/Fortran/ ・前スレ FORTRAN III pc8.2ch.net/test/read.cgi/tech/1104724162/ FORTRAN II pc5.2ch.net/test/read.cgi/tech/1068351911/ Fortran pc2.2ch.net/test/read.cgi/tech/1003214738/
404 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 18:23:17 ] >>403 LAPACK か ATLAS ではダメ?そんな大規模な計算をやった事が 無いので、使い物になるかどうかは分かりません。 Linux ならパッケージでインストールできるはず。 ウチの Debian には aptitude で入れた。
405 名前:403 mailto:sage [2008/03/16(日) 18:44:46 ] >>404 さん レスサンクスです。 LAPACKとATLASも使ってます!MKLもLAPACKとかLAPACK95を使います。素晴らしい ライブラリだと思います。 漏れがやりたいのは、疎行列連立方程式なので、LAPACKとかATLASをベースにして そのラッパーが欲しいという感じです。LAPACKがすでにBLAS/ATLASのラッパーなわけ ですが。。。
406 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 19:57:43 ] >>405 一般論からすれば、反復法か直説法かの選択は行列の内容によるんでね? たちの悪い行列でなければ、反復法の方が有利だと思うけど。 直説法なら確実に有限回で終了することが分かっているが、反復法は直交性が数値誤差で腐るから 数学的にはおかしいが、現実には有限回で終わらなかったりするし。 行列が、ほんとにスカスカの疎か、singularに近いか、固有値が縮退しまくっているかとか、 その辺は使用者しか分からんから、なんともいえないような。 中身の分からん奴に機械的に使わせるから安全第一で行きたいとか、運用面にも依存するし。
407 名前:405 mailto:sage [2008/03/16(日) 21:00:50 ] >>406 さん 仰るとおりっす。 とりあえず、自分一人で使う(研究)ので、ブラックボックス的で安全なものでなくとも 高速で、導入やコーディングが楽なのが希望です。 行列の状態は悪いです。4x4のブロックに分かれてる感じで、離散化を細かくやると 主対角が卓越して、対角ブロックのみに不完全分解系の前処理掛けると、 それなりに収束しますが、係数行列のサイズが増大するというジレンマです。 疎行列性は、5万x5万で、非零要素が0.1%切ってるくらいです。 ご指摘のように、問題依存性が高いので、なかなかご意見いただくのは難しいかなとは おもっております。 とりあえず、みなさん、10万x10万くらいの疎行列連立方程式(差分法や有限要素法 なら頻出だと思います)を解くときって、どんな言語で、どんな実装してるんですかね。。。 反復法ソルバもSaadのtemplateの擬似コードから自分で書いてるのか、とりあえず いろいろソルバライブラリ試してるのか。。。たぶん、疎行列の格納形式から考える必要が あると思うので、そのあたり、Fortran使いの皆さんがどうやってるのか知りたいです。
408 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 16:41:03 ] Steve Lionel (Intel) のコラムで、A=B+CとA(:)=B(:)+C(:)での後者の問題点について 触れられていた。最近のインテルコンパイラは少し賢くなって、この程度の単純な場合なら 後者で無駄なテンポラリへのコピーをしないようになったようだ。 とはいえ、まだ問題ありと。 ttp://softwareblogs.intel.com/2008/03/31/doctor-it-hurts-when-i-do-this/
409 名前:デフォルトの名無しさん [2008/05/17(土) 02:00:17 ] EXCEL VBAである計算をしてたのですが、時間がかかって仕方がないので PCにFORTRANをインストールしてfortranでプログラミングやろうかと 思っています。学生時代にFORTRAN 77を使った経験がある程度。 たしかMS FORTRAN ぱわーすてーしょんつうのも使ったことがあります。 専門家の多そうなこのスレで恐縮なのですが、現行のwinXPが入ってるPCで 動かすとよさげなFORTRANコンパイラは何がいいでしょうか・・。 計算内容は簡単なモンテカルロ法です。
410 名前:デフォルトの名無しさん [2008/05/17(土) 10:28:08 ] >>409 www.nminoru.jp/~nminoru/programming/x86-fortran.html 見れ。無料でとりあえず試すならcygwin+g77 かminGW+g77でしょう。 コストパフォーマンスならインテルコンパイラか。 どっちにせよ今EXCEL VBAで組めているのなら、今からわざわざFortranなんぞやらずに、 コンパイラ買う金で速いCPU買ったほうがマシだと思うけどね。
411 名前:デフォルトの名無しさん [2008/05/17(土) 22:05:46 ] >>どっちにせよ今EXCEL VBAで組めているのなら、今からわざわざFortranなんぞやらずに、 >>コンパイラ買う金で速いCPU買ったほうがマシだと思うけどね。 レスありがとうです。 VBAって異常に遅いなと思っていたのですが、CPU速くすれば FORTRANに追いつける程度なのか・・・。 そこらへんがよくわかってないので。
412 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 22:13:50 ] VB2008Expressでも使えば? VBAよりはだいぶ速いしタダだよ
413 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 22:41:52 ] どのくらいスピードを要するのか知らんがVBはインタープリタだろう? SilverFrostのFTN95とかフリーコンパイラも転がっていることだし、 77でよければWatcomとか昔なつかしいのもあるし、g77のWin用もあるし、 Fortranで素直にやらせてやれw
414 名前:デフォルトの名無しさん [2008/05/19(月) 22:54:50 ] モンテカルロ法とかだとCPU周波数にほぼ比例して 速くなると思っておいていいのですか・・・
415 名前:デフォルトの名無しさん [2008/05/19(月) 23:35:44 ] >>411 その速いCPUで動かせばFortranはもっと速くwwww マジレスするとパラメータサーベイとかなら今の4コアとか使えばかなり効率はあがる。 さすがにBASICがFORTRANを超えることは無理。 自分のプログラミングスキルと作るコードの複雑さから、コーディングやデバッグの 労力を見積もって自分で判断すべし。別にfortranとかVBAに限らんけどな。 VBAはクソ遅いと聞くが使ったことがないのでなんともだが、 Free BASIC VS intel Fortran ではFORTRANが速いといっても高々数倍程度〜コードによってはBASICが勝っている。 shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=all&lang=ifc&lang2=fbasic さすがにIntel Fortranはgnu fortranやJava, Mono Ruby なんかには楽々勝利。 >>414 だいだいYES。と言いたいがモンテカルロ法だけでは「乱数を使った確率的解法」ぐらいしか わからんからなんとも。ランダムウォークのシミュレーションなんかだとCPU周波数に 比例してくれるようなコーディングができる場合が多い。
416 名前:デフォルトの名無しさん [2008/05/22(木) 09:28:10 ] 質問です。 salfordのf77を使っているのですがgoto文のループ内で配列を毎回初期化してたら ループが途中で終わってしまうのですがどうしたら良いでしょうか? 何でか分からないのですが、初期化しないと繰り返してくれます。あと、以下のプログラムの文 で初期化がi,j共に31の繰り返しだと少し長く繰り返します。 goto文の中にはガウスの消去法のサブルーチンがあります。 100 continue do i=1,32 do j=1,32 kakunou(i,j)=0 enddo enddo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 中略(以下このkakunou(32,32)に計算値を代入してます) 途中でガウスの消去法のサブルーチンを呼び出してます ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ goto 100 すいませんが、どなたか教えてください。
417 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 11:44:17 ] >>416 正直質問の意味がよく分からん。 コンパイラのバグでなければ、ありえない症状なので ここに書いてない部分がおかしいとしか言いようが無い。 f77の範囲ならg77とか他のコンパイラもあるのでそれで試してみるとか、 salfordのf95で試してみるとかして見るのも一つの案。
418 名前:初心者 [2008/05/23(金) 15:40:54 ] 失礼します. Compaq Visual fortran 6.1を使用しているものですが, 練習で以下のプログラムを書いたのですが,cpmpileを押し, 「.F」に変換しても「1errors」が出てしまいます. なぜ出るのか教えていただけないでしょうか? 初歩中の初歩で申し訳ないです. INTEGER WIDTH,HEIGHT,AREA READ(5,*) WIDTH,HEIGHT AREA=WIDTH*HEIGHT WRITE(6,*) WIDTH,HEIGHT,AREA STOP END
419 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 23:58:39 ] >>418 エラーでないぞw エラーメッセージをコピーしてみせてくれ。
420 名前:初心者 [2008/05/26(月) 12:58:26 ] デフォルトの名無しさん 早速の返信ありがとうございます. エラーは以下のように出ます --------------------Configuration: Text1 - Win32 Debug-------------------- Compiling Fortran... C:\Documents and Settings\Admin\デスクトップ\Text1.F f90: Severe: Invalid argument ... file is 'C:\Documents and Settings\Admin\デスクトップ\Text1.F' Error executing df.exe. Text1.obj - 1 error(s), 0 warning(s) 自分も以前OSが2000を使用していたときは何のエラーも出なかったのですが, XPに変えてからエラーが出るようになったように感じます. お手数をかけて申し訳ないです. よろしくお願いします.
421 名前:デフォルトの名無しさん [2008/05/26(月) 17:55:54 ] そりゃおめぇ,”デスクトップ”で実行しようたって無理な話よ マイドキュメントに移動させな
422 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 23:07:33 ] >>421 お前ひどい奴だなwww >>420 最初ッからそう言ってくれれば、すぐに答えられる。 それはCVF時代のFAQで、日本語のパスやファイル名が入るとコンパイラが対応していない のでエラーを吐く。2バイト文字を使わないディレクトリでやればおk。
423 名前:初心者 [2008/05/27(火) 13:41:47 ] デフォルトの名無しさん 解決しました!!! 簡単な質問に親切に答えていただいてありがとうございました!!!
424 名前:初心者 [2008/05/30(金) 15:38:10 ] 重ね重ね質問すみません. fortranをまわした結果をexcelかテキストファイルに出力したいのですが, どのようなコマンドを打てばよいのでしょうか? また,長い結果(10万桁以上)をファイルに出力したいのですが, 御教授お願いします.
425 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 16:32:44 ] 本人はできるだけ鼻につかない文章で丁寧に質問してるつもりなんだろうな。
426 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 17:59:33 ] >>424 それ、先生に聞いた方がいいよ。お金払ってるんでしょ。
427 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 19:26:16 ] program main integer :: i = 1 open(unit=10,file='hoge.txt',status='unknown') do write(10,'(i4)') i i = i + 1 end do close(10) end program main 「ご教示」を「ご教授」って書いちゃう男の人って。。。
428 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 00:19:23 ] >>427 hogeはUNIX系の連中の使う言葉だ。 メインフレームの誇りを持つFortrannerは使っちゃいかんw
429 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 11:14:03 ] foo bar baz は?
430 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 16:02:34 ] 鋼鉄の撃墜王
431 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 18:28:25 ] >>415 これみるとIntel C/C++使ったほうがいいみたいだな
432 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 19:41:18 ] >>431 単にFortranの書き方知らないだけだべ。
433 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 19:44:49 ] つまりFortranを知ってる人が少ないと。 技術者を集めにくいと。
434 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 01:08:45 ] >>431 INTEL Fortran と C++ はバックエンド部は共通だろうから、そもそもそれほど大きな違いが 出るはずが無い。
435 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 20:13:52 ] 慶大の生協運営の書店に FORTRAN入門(FORTRAN77入門)が普通において有って驚いた
436 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 20:25:26 ] >>435 浦昭二君、名誉教授だから当然でしょ
437 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 20:33:09 ] もうf77は教えないほうがいいだろ。常識的に考えて。
438 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 20:50:45 ] >>437 講義の教科書ではなくて、研究室用だと思うよ。 研究室にはf77の遺産があるから、参考図書として必須。
439 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:48:11 ] >>435 大学の生協なら売ってるのが普通だと思ってた。 俺は慶応じゃないけどね
440 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:29:15 ] 阪大にも置いてあるよ。 どこでも置いてあると思う。
441 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:51:54 ] 浦昭二のFortran66の方はさすがに絶版になってしまったな。
442 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:30:36 ] >>441 遺産プログラムがFortran66(ブロックIFなし)で書かれていて驚愕した orz
443 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:26:31 ] >>442 俺のもらった遺産プログラムは、拡張DO LOOPを使っていたせいでコンパイラを通らず すごく困った。 拡張DO LOOPとは、DO LOOP の中からGOTOで飛び出して、なんかやった後DO LOOPの 中に帰ると、またさっきのLOOPの続きが出来るというもので、当時の俺の想定外の悶絶機能で 何がおきているのか全く理解できなかったw FORTRAN77で廃止になったはずなんだが、たいがいのコンパイラは密かに対応していた。 まぁ、怖いので書き直したがw そういう事もあるのでFORTRAN66の教科書も無くしてはいけないと思うですよ。
444 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 11:39:03 ] そうか、塾生は君付けなんだなw
445 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 02:23:23 ] 今、本屋で買える範囲で、おすすめのFortranの教科書は何ですか? 絶版は困ります。アマゾンの古本で買えるならいいですが。
446 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 04:13:42 ] Michael Metcalf, John Ker Reid, "Fortran 90/95 Explained"
447 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 10:04:59 ] >>445 Fortranを勉強する目的などを明確にせよ。 規格:わからない、f77、f90以上 目的:講義対応、研究室対応、趣味、業務対応 以下はとりあえずの推薦 規格わからない 講義対応 Fortran 90プログラミング 冨田博之 www.amazon.co.jp/dp/4563014095/ f77規格 講義対応 FORTRAN77入門 浦昭二 www.amazon.co.jp/dp/4563013587 f90規格 研究室対応 数値計算のためのFortran90/95プログラミング入門 牛島省 www.amazon.co.jp/dp/4627847211/
448 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 10:10:18 ] テンプレに追加きぼん
449 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 00:50:25 ] >>446-447 さんくす
450 名前:デフォルトの名無しさん [2008/06/29(日) 02:12:38 ] >>434 バックエンド共通ってだけで速度が同じになるなんてありえない。 字句解析や最適化は言語仕様とコンパイラ実装に強く依存する。 Fortranのシンプルさはその点強みだったけど、 最近のFortranはその他言語にどんどん近づいているからねえ。
451 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 03:11:59 ] >>450 >>415 のベンチマークの話だから。
452 名前:デフォルトの名無しさん [2008/07/03(木) 00:26:47 ] >>450 ベンチマークサイトのような、汎用アルゴリズムならfortranは速くなくて不思議は無いですよ。 C/C++とfortranのユーザー数考えたら、intelだってどちらにリソース割くかは自明でしょう。 ナンバークランチング用途ならfortranは多分まだ速いと思いますけど。
453 名前:デフォルトの名無しさん [2008/09/06(土) 00:53:21 ] Intel Fortran の次期バージョンベータテストが始まっている。 V.11が来年一月までの期限付きだが、無条件に配布されている。 Windows版はVisualStudio(Fortran 専用)つきで。 気になる人はチェキラ!w
454 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 14:52:15 ] もともとIntel FortranとC++は非商用目的なら無料で使えるんじゃない?
455 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 23:57:43 ] >>454 無期限はLinuxだけじゃないか?
456 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 15:10:37 ] Linux版だけだな Linux版ならIntel FortranとIntel C++が無期限で無償で使える
457 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 15:12:37 ] 非商用目的限定の話だけどね
458 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 00:50:36 ] 1秒間プロセスを寝かせるのはsleepという関数があるけど, 10msとか100msとか,ミリセカンドオーダーで寝かせるようにするには どうすればいいですか? Intelコンパイラを使っているので,Intelコンパイラ依存の関数でも いいです. 今は,無駄な計算ループを作って待たせているのですが, それだとCPU負荷になるので,できればCPU負荷にならないで 10msとか100msとか待たせられると嬉しいです.
459 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 01:03:04 ] >>458 Windowsなら、USE IFWIN して Win32 の API の Sleep 関数でやれた気がする。 Linux は知らないが、同じようにやれると思う。
460 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 01:30:30 ] nanosleep(2)
461 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 03:06:27 ] >>458 ifort依存ならWin/Linux共に SLEEPQQ で USE IFPORT CALL SLEEPQQ(3000) とミリ秒で指定できる。 但しあくまでも指定できるだけであって実際の休止時間をミリ秒単位の精度で 制御できるかどうかは別だが。
462 名前:458 mailto:sage [2008/10/07(火) 10:32:59 ] >>459-461 皆さん,ありがとうございます. 461さんのやり方でできました. それほど正確性を求めていないので,このやり方で十分です. ありがとうございました.
463 名前:デフォルトの名無しさん [2008/10/24(金) 15:08:54 ] おまいら、CUDAでFORTRANがサポされたらどうする?逝く?
464 名前:デフォルトの名無しさん [2008/10/24(金) 17:01:26 ] キュダってなに?
465 名前:デフォルトの名無しさん [2008/10/24(金) 20:17:32 ] >>464 GPGPUの開発環境 >CUDA GPUを計算に転用して10倍以上の高速化を実現するらす journal.mycom.co.jp/articles/2008/07/23/gpgpu/
466 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 10:45:52 ] 倍精度に対応したのか
467 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 02:36:04 ] CUDAよりインテルのLarrabeeが来そうだな。 ベクトル長を長くする方向だから80年代のプログラミングモデルが復活するし、 Intelのコンパイラは必ずサポートするだろうし。
468 名前:467 [2008/11/11(火) 14:06:01 ] ルンゲ・クッタ・ギル法を用いて連立の方程式を解きたいのですが, 時間刻みを小さくしても発散してしまうのですが,何かサブルーチン内に欠陥があるのでしょうか? QA0=QA CKA0=H*FNCT1(X0,YA0,YB0,W0,W1,A,A0,A1,B,B1,H0,L,PI) RA1=(CKA0-2.0*QA0)/2.0 YA1=YA0+RA1 QA1=QA0+RA1*3.0-CKA0/2.0 XX=X0+H/2.0 CKA1=H*FNCT1(XX,YA1,YB1,W0,W1,A,A0,A1,B,B1,H0,L,PI) RA2=(1.0-1.0/sqrt(2.0))*(CKA1-QA1) YA2=YA1+RA2 QA2=QA1+RA2*3.0-(1.0-1.0/sqrt(2.0))*CKA1 CKA2=H*FNCT1(XX,YA2,YB2,W0,W1,A,A0,A1,B,B1,H0,L,PI) RA3=(1.0+1.0/sqrt(2.0))*(CKA2-QA2) YA3=YA2+RA3 QA3=QA2+3.0*RA3-(1.0+1.0/sqrt(2.0))*CKA2 XX=X0+H CKA3=H*FNCT1(XX,YA3,YB3,W0,W1,A,A0,A1,B,B1,H0,L,PI) RA4=(CKA3-2.0*QA3)/6.0 YA=YA3+RA4 X=X0+H QA=QA3+3.0*RA4-CKA3/2.0 return end function FNCT1(X0,YA0,YB0,W0,W1,A,A0,A1,B,B1,H0,L,PI) FNCT1=-2.0*W1*H0*YA0-(W1**2.0+(W0**2.0)*(A/A0+(B**2.0)/(2.0*L*A0)-(L*A1*B)/(2.0*A0)))*YB0+((W0**2.0)*(3.0*L*A1)*(YB0**2.0))/(PI*A0) * -((W0**2.0)*(PI**2.0)*(YB0**3.0))/(4.0*L*A0)+(W0**2.0)*((-2.0*B1)/(PI*(W0**2.0))+(4.0*(L**2.0)*A1*A)/((PI**3.0)*A0)+(2.0*L*A1*(A**2.0))/((PI**3.0)*A0) * -(2.0*(L**3.0)*(A1**2.0)*B)/((PI**3.0)*A0)) return end 長々と申し訳ないです.お願いします
469 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 00:29:13 ] >>468 長すぎて考える気にならん。 関数のパラメータも多すぎて、条件も分からん。 ある特定のパラメータで発散するのか?ルンゲ喰ったギル法だけで異常が出るのか? どういう状況なのかも分からん。 答えようも考えようも無い。 もう少し親切心を持って聞けw
470 名前:468 [2008/11/12(水) 03:21:51 ] >>469さん すみません.どう書いたらよく伝わるのか分からず,書いてしまいました. 反省しております. 方程式は,T"(t)+T'(t)+ωT(t)+B1(t)T(t)+B2(t)T^2(t)+B3(t)T^3(t)=B4(t) のような方程式で, B1〜B4の中にも変数が存在してtが変化した際には変数も変化させたいのです. パラメータを変えた際には異常が現れなかったりします. わかりにくくて申し訳ありません.よろしくお願いします
471 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:42:56 ] ブックオフで培風館のFORTRAN77入門が100円だった さすがブックオフ本の価値が分かってない
472 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 00:52:36 ] >>471 古本屋での相場は美本で350円くらいだったと思う。 漏れは66版を150円で買ったような気がするw >>470 >T"(t)+T'(t)+ωT(t)+B1(t)T(t)+B2(t)T^2(t)+B3(t)T^3(t)=B4(t) よく分からんが、第三項はω^2じゃ無いか? それでBx(t)が微小量だとすれば、なんとなく意図が分からなくも無い。 減衰振動の単振り子に非線形項と強制振動項が加わったものなるので、 なんとなく動きのイメージがつかめるのでは。 パラメータによっては、当然発散も大いにありうるだろう。 そもそも正しく計算できているのか自信が無いのなら、Bx(t)を全部0に置けば、 へたれて行く減衰振動になるので、そういう解析解のあるところからチェックしてゆけば 自分のプログラムの挙動に自信がもてるのでは? 詳しく知りたければランダウ=リフシッツの力学の非線形振動における共鳴の節を読めwwwww
473 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 01:00:09 ] >>471 教科書で使ってたりするから、古本の流通量は結構多い気がする。
474 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 02:46:31 ] カバーの焼けはあるけどおそらく新品 改訂版じゃなくて初版の方だったので返品在庫の放出かしら 配列のとこやってるけど、配列への入力とかあってすごいね 宣言なしで唐突に出てくるループカウンタにもびっくりするが
475 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 10:19:44 ] >>474 えぇ〜? 暗黙に型宣言されてるぜ! 最近のスクリプト言語で、これに近い形に先祖がえりしているのがワロス
476 名前:デフォルトの名無しさん [2008/11/13(木) 14:07:56 ] implicit none しても結局は暗黙のやつに則ることは多いよね。 character,logicalは無いので c と l で始めるようにしたり。 暗黙の型宣言はあれはあれで良いものだ。
477 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 21:11:06 ] いや、Cが複素数でZが倍精度複素数だろ
478 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 00:55:13 ] >>476 lは1と見間違いやすいからあまり使わないが、貴重な整数型なのでもったいない。
479 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 05:22:43 ] >>478 Lは大文字で使う
480 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 00:36:10 ] >>479 ボーランド記法? 昔PASCALに散々いじめられたから嫌w
481 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:49:36 ] >>477 c を複素数に振るときには character 型は s で始めるようにしてるな。 >>478 l は先頭でだけ使うようにしてる。 先頭が数字の変数ははじかれるから 混同しなくてすむ。
482 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 01:24:43 ] 東京で先週開かれたISOのFortran部会でCoArrayFortranに関する扱いで 何か進展はあったのでしょうか? つまりCAFを排除できたのでしょうか?
483 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:57:56 ] >>482 東京会議の結論がうpされたようだ。 www.nag.co.uk/sc22wg5/
484 名前:デフォルトの名無しさん [2008/12/06(土) 18:55:27 ] The shapes of the array expressions do not conform. って出てくるのですが、どういうことですか?
485 名前:デフォルトの名無しさん [2008/12/11(木) 16:23:19 ] 配列間違ってないか?
486 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 02:11:30 ] C Pad for Salford FTN77 でCPU TIME を出力できるようにする方法はありますか?
487 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:02:53 ] >>486 HIGH_RES_CLOCK@ 使い方は Library Reference に載ってる。
488 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 09:11:38 ] >>487 亀ですが ありがとうございます。 出来ました!
489 名前:デフォルトの名無しさん [2009/01/24(土) 19:01:34 ] 関連スレが新しくなりました。 くだすれFORTRAN(超初心者用)その4 pc11.2ch.net/test/read.cgi/tech/1232789521/l50
490 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 00:23:26 ] うちの研究室の人たちがFortranでプログラミングしているけれど お前らgoto使いすぎ・・・ というか自分の提出したプログラムがgoto文に書き換えられている・・・ subroutine、functionを使いすぎるのはスパコン計算に向かないと言っていたけれど 勉強してきた構造化プログラミングの手法自体がfortran向きでないということなの?
491 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 02:32:22 ] >>490 インラインされるようにしろw コンパイラが安心してグローバル最適化できるように、付加的な情報を与えてやれ。 グローバルな構造が人間が見て分かりやすいならコンパイラも見て分かりやすい。 INTENT指定はつける。 FUNCTIONは、PURE (可能ならELEMENTAL)にする とかすればDO..LOOP内で関数呼び出しとかしても並列化やベクトル化してくれるはず。 コンパイラによるが。 実際にベンチマークを取って、自分が勝利すれば、後は文句いわれないべw
492 名前:デフォルトの名無しさん [2009/02/12(木) 12:52:18 ] >>491 intent属性つけると微妙に速くなるよね。 特にloop内で頻繁に呼ばれるやつだと全体で5から20%くらい違ってくる。 最近のコンパイラはF77で書いててもintentをわかってくれるから楽だ。 で・・・・pure,elementalの事はよくわからないので詳しく!
493 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 00:04:13 ] >>492 PUREもELEMENTALもFortran95で導入されたキーワードで、関数やサブルーチンの 副プログラムの性質をコンパイラに教える修飾語。 PURE FUNCTION unko(x) などのように宣言の頭につけて使う。 PUREというのは、大雑把には副作用がないこと。それゆえ、並列に動作させても 値が変わらないので、コンパイラは並列化など最適化をやれる。 (PUREを満たさねばならない条件はいくつかあるので、kwskはマニュアル見てくれ) ELEMENTALはPUREの中でさらにいい性質を持ったもの。 本来は1変数で定義してあっても、配列を引数にとって、配列を返すように使ってもいいもの。 たとえば、 REAL :: a(10), b(10) b = SIN(a) こういう使い方が組み込み関数では出来るわけだが、自作の関数でもこうやって使っても いい場合にELEMENTAL (要素毎の意味) をつける。 これもコンパイラが利口なら、最適化をかけてくれるはず。 普通、DO..LOOP内に関数やサブルーチンの呼び出しがあると、呼び出し先で何が あるかわからないので、最適化が抑止されるが、PUREやELEMENTALがあれば、 安心してコンパイラが最適化できる。(原理的にはw)
494 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 08:29:24 ] >>493 ありがとう。pure 属性は使い易そうだ。
495 名前:494 mailto:sage [2009/02/13(金) 11:01:13 ] loop内で頻繁に呼ばれる4個つくらいの function や subroutine に pure 属性つけただけで 並列(OpenMP)の時にちょびっと速くなった。わーい。 もともとdo-loopで一つずつ処理しているので elemental を使える状況は少ないけど、 もう少し理解してから使ってみよう。 inlineを少し深くするようになったからかコンパイル時間がすこし長くなったけどまあ気にしない。
496 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 22:12:50 ] >>491 なるほど、ためになったわ。サンキュー。PUREを付けるだけで簡単に速くなったわ。 担当のは基本的に古い人間だから、あまりコンパイラ任せにするなとか言うんよな…。 Fortran90っぽい77形式の文も、「完成した後で直します」とか言ってそのままだったり。 implicit realもcommon文もどうにかしたいけれど、きっと文句言うんだろうな。
497 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 02:22:54 ] >>496 PURE 属性はもともと HPF で導入されたものなので、それなりのメーカならコンパイラ にも最適化のノウハウの蓄積があるはず? ELEMENTAL も一変数用にサブルーチン書いて、配列を渡せばいいので、DO..LOOPを あからさまに書かずにすむ。時々ソースがすごくすっきりして楽になることがある。 でも、ついでだから古い人間を擁護してみるかw FORTRAN77 にも、むきだしの良さがあるw Fortran90 以降だとソース上は簡潔になっても、影で動的にテンポラリ配列とか取るので 気持ち悪いところもある。長時間並んだJOB がStackOverflow とかで止まっていたり すると殺してやりたくなる。古い時代の人はその辺が嫌なのかもしれないw COMMON もグローバル変数だと思うとむかつくだろうが、 自分でガベージコレクション しながら、変数領域を自由自在に再利用して操っていると思うと、結構気持ち良い。 メモリーが貴重だった時代には、利用価値が高かった。 IMPLICIT に関していえば IMPLICIT NONE をつけた上で、頭文字を守ればいい。 C と違ってローカルスコープの捨て変数が使えないから、頭文字を守らないと いちいち宣言部に戻って型を確かめないといけないのでめんどい。 Fortran では数値の精度が致命的に重要で、倍精度計算中に1個単精度が混じるだけでも すべての結果が単精度のゴミになるのだから、数値精度に無頓着の他のおしゃれ言語の 連中の言説を信じると痛い目に会わされるw
498 名前:デフォルトの名無しさん [2009/02/18(水) 13:19:26 ] pure属性付けたサブルーチン内で pure属性付けた他のサブルーチン呼ぶ時には interfaceで引数部分の性質を教えて置かないといけないんだね。 f77書式で書いてるのに interface intent が 現れるのでムズムズするけどムズムズするだけなのでそのまま。
499 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 16:08:37 ] OpenMPを試してみてるんだけど、いまいちうまくいかないんだが・・・ ifort -QParallel でコンパイル+実行するとうまくいくんだけど、 同じソースをifort -Qopenmp でコンパイル+実行すると Program Exception - stack overflow っていうエラーが出る ソース中にOpenMP構文は use omp_lib だけ これってどうしたらいいのかな?
500 名前:499 mailto:sage [2009/02/26(木) 16:22:10 ] おk事故解決 -auto_scalar オプションでいけた
501 名前:デフォルトの名無しさん [2009/02/26(木) 16:49:38 ] >>500 だたの -auto や -static でうまく行くこともあるよ。あとは実行時の環境変数の setenv KMP_STACKSIZE 16M とかデフォより大きめに取ると幸せなことが多い気がする。
502 名前:デフォルトの名無しさん [2009/02/26(木) 16:50:50 ] >>500 ていうか、 -auto_scalar ってデフォルトになってない?
503 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 17:23:54 ] -openmpだとデフォで動的(-auto)になるんだっけか >>499 は単にスタック不足なだけでは? ところで、KMP_STACKSIZEってunlimitedに設定できないの?
504 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 17:58:56 ] 動的っていってもヒープとスタックがあるよね。 Fotranの場合ってどういう風に割り当てられるんだろう・・・そういやあまり意識したことなかった。
505 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 02:43:33 ] >>504 元々はAUTOMATIC変数の類はスタックに、ALLOCATE命令のときはヒープだった気がする。 ただ歴史的経緯のせいでサブルーチン側で巨大な配列をとっているプログラムが多くて それがSTACKOVERFLOWを引き起こすから、IntelFortranなんかはデフォールトでは スカラー変数はスタックで、配列の類はヒープで確保するようになった気がする。 インテルの掲示板に、デフォールト・オプション切り替えの話が出ていた旗もするのだが 昔のことなので記憶がはっきりしない。 OpenMPを指定すると、オプションが切り替わってしまう話はこのスレに出ている。 software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/59627/ FortranはFORTRAN66時代がSTATICに変数をとっていた関係で、 FORTRAN77で規格の上ではサブルーチン類の変数はAUTOMATICでありうるように なったにもかかわらず、互換性の観点からデフォールトでSTATICに変数を とっていることが多くて、それはFortran90でもしばらく続いていたという歴史的経緯がある。
506 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 11:54:19 ] >>505 そのスレのSteveさんが言ってるlocal scalar variablesって、配列じゃない(次元1の)フツーの変数のことだよね? だとしたら、 If you say /Qopenmp (or /Qopenmp-stubs), this changes to /automatic - ALL local scalar variables are allocated on the stack. のALL local scalar variablesはALL local variables(つまりローカルスカラ変数だけじゃなく、ローカル配列変数も含む)の間違いじゃないかな? 勘違いしてたらすいません
507 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 13:12:01 ] >>506 そうなんじゃないかな? 配列までスタックにとるからoverflowしていると考えるとつじつまが合う?
508 名前:506 mailto:sage [2009/02/27(金) 13:52:41 ] >>507 そうだよね。SteveさんIntelのスタッフなんだし書き間違わないでくれよぉ・・・ OpenMPの場合にデフォルトで全てのローカル変数(スカラも配列も)がスタックになるのは スレッドセーフのためってあるけど、逆に言えばそれらをstaticに扱ったらスレッドセーフに ならないってことだよね。それってやっちゃまずいことなんだろうか? OpenMPまともに使った経験がないもんで・・・識者の方コメントおながいします
509 名前:デフォルトの名無しさん [2009/02/27(金) 14:48:49 ] -openmp つけてコンパイルすると、仮にautomaticは嫌いだっと -noauto つけても消されるはず。なのでopenMPを読んだ状態だと 有無をいわさずにぜんぶautomaticになる・・・と理解しているけど。 shared属性をつけてかつcommonブロックに貼り付けるとかして やや無理なことをしないとstatic領域には配置されないと思ふ。 -staticはその名のイメージとは違って共有ライブラリを使わない (というか実行ファイルに埋め込んじゃう)オプションだし。 spec.orgにあるOMP2001の情報のところに試した人たちが 実際に使ったオプションが載ってるので、自分のところのシステムに 近い(or 同じ)マシンがあったらそれと同じモノをだいたい使っているけど、 まあ大間違いではないと思う。お薦めできるのかは分らないけど・・・。
510 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 15:30:30 ] え、OpenMPだとサブルーチン内ではstatic配置ってできないわけ? 数値計算では馬鹿でかい配列は可能な限りstaticにするのが基本じゃない? サブルーチン渡る度に配列をコピーとかやってられんでしょ? その代わりメモリのアロケーションはコーディングする側がきちんと考えてあげないといけないけど。 この辺がリソースをある意味富豪的に使うことが前提とされるJavaやC#などのオブジェクト系言語との違いだね。
511 名前:デフォルトの名無しさん [2009/02/27(金) 16:56:15 ] 510はちょっと尋ね方が変だな。 副プログラムが並列のloop内にあるのか、 副プログラム内で並列のloopがあるのかで答は変わる。
512 名前:510 mailto:sage [2009/02/27(金) 19:38:52 ] 的外れな質問してたのかな、ごめん・・・。 >>511 の両方のケースとも知りたいので、よかったら教えてほしい。 流体とかの数値計算では行列の反復法とかはサブルーチン内でやるけど、 そういうケースでメモリのアロケーションはどうすべきなのか、という視点で興味があります。
513 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 00:58:18 ] >>512 引数に載ってれば、Fortranは参照呼出しなんだから配列のコピーが生じるはずもない。 CやPASCALとは違う。(まぁ最近はVALUE属性も出来るようになったが) ここでは副プログラム内で新たに割り付けられる配列の話だろう。 それが動的に取られるとして、スタックに取られるか、ヒープに取られるかの違い。
514 名前:510 mailto:sage [2009/02/28(土) 01:28:49 ] >>513 >副プログラム内で新たに割り付けられる配列 あ、そういう話か・・・ありがとう。 自分は一時作業用の配列も全部メイン側で用意してやって引数渡ししてるんだけど、 そういうのはサブルーチン内でスタックやヒープで取ってやる方がいいのかな? 皆さんどうしてますか?
515 名前:デフォルトの名無しさん [2009/03/03(火) 06:16:03 ] allocatableを副プログラム内で作ってそれ(先頭アドレスやらサイズその他)を メイン階層や他の副プログラムに行き渡らせるのが割りと 面倒臭いのでメイン階層でやってる。 メイン階層が長くなるのは正直あまり好みではない、けど まあ好みの問題なだけなので気にしないようにしている。 allocatable使うと場合によってはプログラム内で明示するサイズより大きいメモリを扱えたり (コンパイラはハンドルできるメモリサイズ < OSがハンドル出来るメモリサイズ、なので)、 格子数(データ数)の違う処理を同じ実行イメージで出来る(コンパイルしなおさなくて良い)のが いいけど、最近ではサイズをプログラム内で固定変数で明示していちいちコンパイルしている。 その方がミスは少ない気がする。気のせいかもしれないけど。
516 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 12:11:34 ] 何がスタックやヒープに割り当てられるのか分からんかったのでググった。 ブログだけどw ttp://monologuemidnight.blogspot.com/2009/01/blog-post_03.html module中の大域的な変数、save属性付きの変数→.bss allocatable属性な配列→ヒープ 普通にサイズが宣言されている自動配列→スタック 手続き中の変数(mainでも同様)→スタック ってことらしいが…。 この辺は規格ではないっぽいので、コンパイラの仕様をちゃんと確認したほうがいいな。
517 名前:デフォルトの名無しさん [2009/03/11(水) 18:46:48 ] ifortで複数の数字を出力すると勝手に改行されるんだけど、改行を抑制するオプションってある? gforntranでは改行されないんだけど。 real(8) a(5) write(*,*) a(:) とするとa(3)とa(4)の間で改行されちゃう。
518 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 04:57:59 ] >>517 気持ち悪いけど、下記のようにしてもだめかな? クラシックな書き方だけど。 write(*, '(100f10.5)') a(:)
519 名前:デフォルトの名無しさん [2009/03/12(木) 09:37:42 ] >518 ありがとん。 write(*,'(100f)') a(:) でいけた。
520 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 01:01:35 ] 改行抑制なら、write文ならadvance='no'を付ければできるはず 出力するものが決まってるなら、改行してしまう書式の箇所に\(バックスラッシュ)を入れてもいい
521 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 11:34:42 ] >520 advanceはフォーマット文がいるから、結局519と同じでは?
522 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 03:12:33 ] >>521 '(100f)' なんて書くよりはスマートな気がするけど? ま、どうでもいいことだな
523 名前:デフォルトの名無しさん [2009/03/18(水) 04:24:12 ] do i = 1, 5 write(*, '(f10.5,$)') a(i) enddo write(*,*) '' はダメかな? 改行するなよ、の$は非標準だけどDEC以来ほぼ標準と思っていいのではないだろうか
524 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 21:51:40 ] ちょっとテストしてみた@Intel Fortran 10.1 integer::i integer,parameter::imax=5 real(8)::f(imax) do i=1,imax ; f(i)=i ; enddo print *, "print *,f" print *, f print *, '---' print *, "write(*,'(f)') f" write(*, '(f)') f print *, '---' print *, "write(*,'(f)') (f(i),i=1,imax)" write(*, '(f)') (f(i),i=1,imax) print *, '---' print *, "write(*,'(f\)') f" write(*, '(f\)') f print *, '---' print *, "write(*,'(f)',advance='no') f" write(*, '(f)',advance='no') f print *, '---' print *, "write(*,'(f)',advance='no') (f(i),i=1,imax)" write(*, '(f)',advance='no') (f(i),i=1,imax) print *, '---' end
525 名前:>>524の結果 mailto:sage [2009/03/18(水) 21:52:34 ] print *,f 1.00000000000000 2.00000000000000 3.00000000000000 4.00000000000000 5.00000000000000 --- write(*,'(f)') f 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 --- write(*,'(f)') (f(i),i=1,imax) 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 --- write(*,'(f\)') f 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 --- write(*,'(f)',advance='no') f 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 --- write(*,'(f)',advance='no') (f(i),i=1,imax) 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 ---
526 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 22:07:03 ] ごめん。 print文かwrite文か、また出力並びをfとするか(f(i),i=1,imax)とするかで、 出力結果が違うのかと思ってやってみたが、違いはないっぽい。 というわけで、>>524 をもっとすっきりさせた。 integer::i real(8)::f(3) do i=1,3 ; f(i)=i ; enddo print *, "write(*,*) f" write(*,*) f print *, '---' print *, "write(*,'(f)') f" write(*,'(f)') f print *, '---' print *, "write(*,'(f\)') f" write(*,'(f\)') f print *, '---' print *, "write(*,'(f)',advance='no') f" write(*,'(f)',advance='no') f print *, '---' end
527 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 22:19:08 ] ↑の結果 write(*,*) f 1.00000000000000 2.00000000000000 3.00000000000000 4.00000000000000 5.00000000000000 --- write(*,'(f)') f 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 --- write(*,'(f\)') f 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 --- write(*,'(f)',advance='no') f 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 --- 結論 @書式省略すると、適当な位置で改行してくれる(規格で決まってるんかな?) A書式指定すると、書式の中身が終わる度に改行 B書式に\を付けると改行抑制 C書式にadvance='no'(デフォルトはyes)を付けるとwrite文が終了したときに行う改行を抑制(Aとの違いに注意) って感じかな。 改行抑制の\と改行指定の/が混ざるとどんな出力になるんだろう。
528 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 22:20:24 ] ごめん、>>526 は real(8)::f(3) do i=1,3 ; f(i)=i ; enddo は↓に修正。 real(8)::f(5) do i=1,5 ; f(i)=i ; enddo
529 名前:デフォルトの名無しさん [2009/03/22(日) 01:30:43 ] >@書式省略すると、適当な位置で改行してくれる(規格で決まってるんかな?) コマンドプロンプトの右端で改行だと思う 違うかなー
530 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 10:23:20 ] >>529 他のコンパイラでは改行しないので、コンパイラのせいだと思います。 >>524-528 ありがとうございます。 参考になりました。 write(*,'(f\)') f が良さそうですね。
531 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 15:14:13 ] >>529 Fortranに限らず、プロンプトのサイズは関係ないよ