- 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/
- 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に限らず、プロンプトのサイズは関係ないよ
|

|