くだすれFORTRAN(超初心者用)その4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/01/24(土) 18:32:01もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/
●関連スレ
FORTRAN �W
http://pc11.2ch.net/test/read.cgi/tech/1163319215/
0032デフォルトの名無しさん
2009/01/29(木) 16:36:30んだ。超厄介
>>30
キャッシュ内ですっぽり収まる程度の長さのループなら
ループの頭でlocalな変数に大配列の一部を複写してからの方が
編集やバグ探しが楽になるからまあ良いんだけど。
いまはだいぶ楽ちんだけど、ちょっと前はある長さを境にして
ガクンと遅くなることがあったな。他人のコードってあんまり見た
こと無いから判らないけど,ループは長いor短い方が良い、
とかtemporalな変数にうつすor大きい配列をガンガン右辺に持ってこよう、
とか、今の流行というか推奨はどっちなんだろう。
003319
2009/01/29(木) 17:45:46見てみることにします。情報を小出しにしちゃって申し訳ないんですが、
一番問題なのは、上の処理をすると、領域ぎりぎりに粒子があったとき、
50までしかセルがないのに51セル目を見ようとしちゃうことですね。
このエラー自体が不可避ならとりあえずそこの例外処理だけは入れといたほうがよさそうですね。
いろいろありがとうございます。上記件について何かいいアイデアあればぜひ。
0034デフォルトの名無しさん
2009/01/29(木) 23:00:0650セルがMaxなら、いったん10000倍なり拡大して整数に入れて、その整数の世界で
切り分ければいい。
整数がオーバーフローすると問題だが、50セルがMaxなら大丈夫だろう。
0035デフォルトの名無しさん
2009/01/30(金) 00:07:25拡大係数行列Pに対して、部分ぴぼっと選択と行基本変形を繰り返して、
ガウスの消去法をするプログラムを書きました。
ここでPのある縦列が全て0のとき、たとえぴぼっと選択していても、
(*)のところで0の割算が出てしまいます。
これを回避するうまい方法or常套手段はありますか?
003635
2009/01/30(金) 00:07:53do j = 1,sizeN
ValMax = 0.0d0
ImaxHeld = 0
do k = j, sizeN
if( ValMax < abs( P(j,k) ) )then
ImaxHeld = k
ValMax = abs( P(j,k) )
end if
end do
write(*,*) 'ImaxHeld=', ImaxHeld, 'ValMax=', ValMax
! Two rows are exchanged so that the maximum factor is placed at a diagonal
tmp(:) = P(:,j)
P(:,j) = P(:,ImaxHeld)
P(:,ImaxHeld) = tmp(:)
! Now the diagonal factor P(j,j) is a pibot
P(:,j) = P(:,j) / P(j,j) ! <=(*)
do i = 1, sizeN
if (i /= j) then
P(:,i) = P(:,i) - P(j,i)*P(:,j)
end if
end do
end do
0037デフォルトの名無しさん
2009/01/30(金) 01:55:43一列全部0なら、シンギュラーな行列なんだから、そもそも解が無いだろ!
線形代数の教科書を100回読み直せ!w
0038デフォルトの名無しさん
2009/01/30(金) 07:23:57003935
2009/01/30(金) 11:25:16『行列式も0になって、クラメールも使えなくてどうしよう』などと考えてしまいました。
やりたいことは最小二乗法の正規方程式を解くことなのですが、問題は
データの与えかたによって、解が有ったり無かったりする
(列が全部0になったり、ならなかったりする)事です。
こんなとき、システマティックにやる方法はありますか?
004035
2009/01/30(金) 11:31:51間違ってsin(0)を与えていたために係数行列の列が全て0になっていました。
>>37さんありがとうございました。
0041デフォルトの名無しさん
2009/02/07(土) 00:28:19ついでにFortran2008にも部分対応らしいな。
といっても、CoArrayはもともとCRAYがやっていたので当然なんだが(笑
0042デフォルトの名無しさん
2009/02/07(土) 02:48:210043デフォルトの名無しさん
2009/02/07(土) 11:42:24Crayはここ10年くらいのアメリカの護主義のおかげで復活してる。
一時期の低迷は脱している。
そういえば、東工大のつばめに刺さっていたクリアスピード社が、イギリスの経済壊滅の
余波で株価急落、資金繰りにもつまってきたというニュースが先週流れてきてた。
ETA10の夢ふたたびw
0044デフォルトの名無しさん
2009/02/07(土) 16:20:54つーかCrayってもう石は作ってないんだよな?
その他大勢の単なるシステム屋さんに成り下がっちまった
0045デフォルトの名無しさん
2009/02/07(土) 22:16:59アセンブルコードを吐かせてサイズを比較しろ
0046デフォルトの名無しさん
2009/02/08(日) 07:53:421CPUなら後者が速いことが多い・・・とおもう。
並列だとたぶん前者・・・とおもう。並列処理すると代償でマスキング処理が抑制されることがあるから。
個人的にはif-endifで処理しない・する範囲を明示する方が好き。
0047デフォルトの名無しさん
2009/02/08(日) 16:14:46違ったらごめん
0048デフォルトの名無しさん
2009/02/08(日) 18:01:42先輩からいただいたプログラムのファイルは2つあり、ひとつが本プログラム、もうひとつがサブルーチンプログラムです。
この状況で、もうひとつのサブルーチンプログラムをworkspaceのところで作成し、compile、excecutionをしたのですが、
どうもerrorなどはないのですが、write文などの結果が既存のサブルーチンプログラムからの結果が出力され、
新しいプログラムでの結果が出力できません。どうやったら、新しいプログラムの結果が
出力できるのか、教えていただけますでしょうか。
大変、初心者の質問で申し訳ございません。
0049デフォルトの名無しさん
2009/02/08(日) 18:08:07無視してください。また、お世話になるかと思いますが、どうぞよろしくお願いいたします。
0050デフォルトの名無しさん
2009/02/08(日) 19:23:15あってるよ。
でも並列処理するときに誤作動防止で
ベクトル処理を抑制することがあるというのはありそうではある
0051デフォルトの名無しさん
2009/02/10(火) 15:42:39Matlabから移行してきたんですが、公式マニュアル見てもプログラミング関係の単語がわからずで。ラッパーとか。
数値計算に関しては、噂に聞いてたよりも使いやすいなあ、と思ってるんですが。
よろしくお願いします
0052デフォルトの名無しさん
2009/02/10(火) 17:32:15gfortran -i8 '-mcmodel=medium' -fdefault-integer-8 -O2 -mtune=opteron -m64 -c hoge.f
In file hoge.f
C(1) = LShift(I1,32).or.(I2.and.NM32)
1
Error: Operands of logical operator '.and.' at (1) are INTEGER(8)/INTEGER(8)
似たような問題を見つけましたが、対処方法がよく分かりません。
ttp://gcc.gnu.org/ml/fortran/2005-07/msg00416.html
どなたか教えて頂けないでしょうか。
ENV: RedHat 4, GCC 4.1.2
0053デフォルトの名無しさん
2009/02/11(水) 00:36:13何をしたいのか、それだけでは意味不明だが、『hoge』などというUNIX系の方言を
しゃべるところを見ると、C言語とかと混同して論理演算とビット操作を勘違いしていると邪推?
> C(1) = LShift(I1,32).or.(I2.and.NM32)
(LShift という関数は、Fortranの標準関数には存在しない。が、ベンダー拡張の
ビット操作演算子としてよく存在しているので、ビット操作演算子だと仮定する。)
これは、論理演算とビット操作と論理演算を混用しているので、コンパイラが怒っていると
思われる。
正しくは、
INTEGER(8) :: i1, i2, nm32
INTEGER(8) :: ic(整数)
ic(1) = IOR( ISHFT(i1, 32), IAND(i2, nm32) )
Fortranには、論理型と整数型の区別がある。 .and. や .or. は論理演算子であって
真偽の二値しかもたない論理型の変数(あるいは定数)に作用する。
一方、整数型の変数(や定数)に対するビット演算子も存在している。
それは二引数をとる関数で IAND や IOR、あるいはビットシフト演算子 ISHFT である。
cを整数として使うのは、暗黙の型に反するので、どうしてもと言う理由がなければ
やめたほうがいいと思う。
なお、Fortranの論理変数の内部表現は規格では不定であって、処理系によってことなる。
一般的にLSBが1か0かで真偽を区別していることが多い。
C言語のように0が偽で、その他が真というわけでない。
よって、論理演算を行ってもLSBしか変化していなかったりする。
しりたければEQUIVALENCEをかけるか、TRANSFER関数で内部表現を見れば分かる。
0054デフォルトの名無しさん
2009/02/11(水) 10:15:01的確かつ詳細な回答有り難う御座います。大変参考になりました。
お察しの通りC言語の経験者ですが、Fortranは皆無です。
ご指摘を参考に勉強致します。有り難う御座いました:-)
0055デフォルトの名無しさん
2009/02/15(日) 15:04:380056デフォルトの名無しさん
2009/02/16(月) 22:01:19Vistaに対応した無料FORTRANが出来るようになるサイトを教えてください。
申し訳ありませんが、よろしくお願いします。
0057デフォルトの名無しさん
2009/02/16(月) 23:42:15http://pc11.2ch.net/test/read.cgi/tech/1163319215/2
0058デフォルトの名無しさん
2009/02/17(火) 11:11:13俺的にこれがお勧め
ttp://www.download.com/Silverfrost-FTN95/3000-2069_4-10491439.html
Plato3と言うソフトが一緒にインストールされるから、それを起動して
File->Newもしくは左上の白いアイコンをクリックするとNew Fileと言うウィンドウが出る
FORTRAN77のコードを書きたいならFixed Format Fortran fileを
Fortran90/95のコードを書くならFree Fomat Forrtran fileを選択しOpenボタンを押す。
あとはコードを書いて、左上に青い再生ボタンがあるのでクリック、変なダイアログが出ても
OKおせばおk。あと、黒いウインドウを閉じる時は、右上の×じゃなくて、キーボードの
Enterを押さないと落ちる事があるので注意
0059デフォルトの名無しさん
2009/02/19(木) 17:28:260060デフォルトの名無しさん
2009/02/19(木) 18:30:000061デフォルトの名無しさん
2009/02/19(木) 19:56:36bug fixが中心だろう
Memory allocation error in for_array_copy_in()
とか
11.0 message catalog produces garbled messages with Japanese compiler
とかあったから、とりあえず入れといた
0062デフォルトの名無しさん
2009/02/19(木) 23:33:4111.0でコンパイルしなおしただけで計算時間が1/3になってワロタ
別に最適化オプション何も使ってないデフォルトなんだけどな
これでOpenMPで最適化したら一体どうなるんだ
0063デフォルトの名無しさん
2009/02/20(金) 04:02:32黒カエラーはまだ直ってないなw
誰もIntelに通報してないのか?
0064デフォルトの名無しさん
2009/02/20(金) 13:43:567になった時にですごく良くなった気がする。
あとはあまり変化は大きくない気がする。
・・・といって今使ってるのが9のままなので10,11でまた進歩があったのかな?
SSE絡みでは順次良くなったそうだけど
明示的にそれを使うことは少ないからなあ。
0065デフォルトの名無しさん
2009/02/20(金) 14:23:19見違えるように良くなったって話だが
0066デフォルトの名無しさん
2009/02/21(土) 00:20:220067デフォルトの名無しさん
2009/02/21(土) 10:32:37みなさんはエラー系の出力はwrite(0,*)を使っていますか?
それとも、標準出力もエラー出力も全部print *を使っていますか?
0068デフォルトの名無しさん
2009/02/21(土) 19:42:57標準出力とエラー出力があるっていうのはUNIXの話だから、
メインフレーム上がりでUNIXをおもちゃと馬鹿にしているおっさんたちは、
そんなもの存在も知らず、相変わらず6番に出力していると思う。
0069デフォルトの名無しさん
2009/02/22(日) 00:56:09integer, allocatable :: imem(:)
msize = 1000*1000 * 200
call alloc4i(imem, msize)
c :
stop
end
subroutine alloc4i(imem, msize)
integer, allocatable :: imem(:)
if ( .not. allocated(imem) ) then
allocate( imem(msize), stat=ier )
if (ier .ne. 0) stop
else
stop
endif
return
end
こんな感じでメモリ割付をするサブルーチンを作りたいのですが、サブルーチン側の
配列宣言でコンパイルエラーになってしまいます。このように親側でallocatableにした
配列は、サブルーチン側でどのようにallocateするのでしょうか?
0071デフォルトの名無しさん
2009/02/22(日) 01:47:54外部サブルーチンだからエラーが出んじゃない?
内部サブルーチンやモジュールで使ってるけど
エラーは出ないよ
007269
2009/02/22(日) 02:58:23program memtest
integer, allocatable :: imem(:)
msize = 1000*1000 * 200
call alloc4i
stop
contains
subroutine alloc4i
if ( .not. allocated(imem) ) then
allocate ( imem(msize), stat=ier )
if (ier .ne. 0) stop
else
stop
endif
return
end subroutine
end program
レスどうもです。こんな感じでしょうか?
たしかにコンパイルは通りました。ただ、ライブラリ化
したいため、分割コンパイルしたいのです。何とか
外部プログラムで実現できないでしょうか・・・
0073デフォルトの名無しさん
2009/02/22(日) 04:39:47MODULEに入れるか、本体側でINTERFACEを書けばいいんでね?
ALLOCATABLE属性をつけても、77式に裸にしておくと、引数がマッチしているのか分からんから
怒られるんだと思うが。
007469
2009/02/22(日) 09:30:19module malloc
integer, allocatable :: imem(:)
contains
subroutine alloc4i(imem, msize)
integer::imem(:)
integer::msize
allocate ( imem(msize), stat=ier )
if (ier .ne. 0) stop
return
end subroutine
end module
program memtest
use malloc
integer::msize
msize = 1000*1000 * 200
call alloc4i(imem, msize)
stop
end program
う〜ん・・・ f90に疎くて、こんなコードしか書けませんでしたorz
ホントは、下みたいな感じで、program側で複数の配列確保に使える
サブルーチンが欲しいのですが・・・
program memtest
:
call alloc4i(imem1,msize)
call alloc4i(imem2,msize)
:
0075デフォルトの名無しさん
2009/02/22(日) 13:30:21やりたいのはこんな感じかな?
MODULE m_test
CONTAINS
subroutine alloc4i(imem, msize)
integer, allocatable, INTENT(OUT) :: imem(:)
integer, INTENT(IN) :: msize
if ( .not. allocated(imem) ) then
allocate( imem(msize), stat=ier )
if (ier .ne. 0) stop
else
stop
endif
return
end subroutine alloc4i
END MODULE m_test
program mtest
USE m_test
integer, allocatable :: imem1(:), imem2(:)
msize = 1000*1000 * 200
call alloc4i(imem1, msize)
call alloc4i(imem2, msize)
stop
end
007669
2009/02/22(日) 20:12:35レスどうもです。
ズバリ75のコードなのですが、私のコンパイラ(Fortran PowerStation 4.0)ではエラーが出ます。
4行めがイカンと言っているようです。
malloc.f90(4):error FOR3435: symbol IMEM is a dummy argument
- cannot be ALLOCATABLE detected between IMEM and (
文法的には間違っていないと思うのですが・・・
別のコンパイラでも試してみようと思います。
コードの調整までして下さり、本当にありがとうございました。
0077デフォルトの名無しさん
2009/02/22(日) 23:41:01俺のおぼろげな記憶では、ALLOCATABLE な配列をサブルーチン側で ALLOCATE して
返せるようになったのは Fortran95 以降だった気がする。
Fortran90ではPointerでやるんじゃなかったかな?
文法書で確かめてくれw ガセネタだったらすまんこ。
007869
2009/02/23(月) 06:31:29統合環境のオンラインマニュアルを良く読むと、以下の記載がありました。
>Remarks
>You can only use the ALLOCATABLE attribute to declare an array
> that is not a dummy argument or a function result.
不注意でしたorz
どうやら仰る通りのようです。ポインタを勉強したいと思います。
実は、先輩がメインフレームで使っていたコードを引き継いだのですが、昔風のメモリ管理を
していて、ブロック名を直接メモリ域に書き込んだりしていたので、PC上ではコンパイル
出来ずに困っていました。それで、Fortran90を使って書きなおそうと考えた次第です。
重ね々々ありがとうございました。
0079デフォルトの名無しさん
2009/02/24(火) 00:15:50POINTERに直すだけなら簡単。
ただALLOCATABLEに比べて自由度が大きい分最適化やチェックに支障が出るらし。
MODULE m_test
CONTAINS
subroutine alloc4i(imem, msize)
integer, POINTER :: imem(:)
integer, INTENT(IN) :: msize
if ( .not. ASSOCIATED(imem) ) then
allocate( imem(msize), stat=ier )
if (ier .ne. 0) stop
else
stop
endif
return
end subroutine alloc4i
END MODULE m_test
program mtest
USE m_test
integer, POINTER :: imem1(:), imem2(:)
msize = 100*100 * 200
call alloc4i(imem1, msize)
call alloc4i(imem2, msize)
PRINT *, SIZE(imem1), SIZE(imem2)
stop
end
ASSOCIATED だけでいいのか今一自信なし。
008069
2009/02/24(火) 07:04:42何から何まで申し訳ありません。
コードはコンパイル1発でOKでした。
allocate後は配列と同じように使えるみたいですし、cのポインタより保護されている感が
あっていいですね。危険性に関しては、昔のメモリマネジメントより随分安全と感じますが、
別ルーチンでしっかりチェックするつもりです。
ただ、f90は利用情報が少ないので、少しずつ勉強しながら使って行こうと思います
(周りに利用者がいない。f77かcかVB)。特にPCの処理系では、方言等ありそうですね。
規格にも目を通したいと思います。
色々とありがとうございました。
0081デフォルトの名無しさん
2009/03/11(水) 02:17:57008281
2009/03/12(木) 21:16:17もう一つお聞きしたいんですが、INTERFACEって使ってますか?
外部プログラムを書いてから、また同じようなのをイチイチ書くのは
面倒臭いし、モジュールで全部代用できる気がするんですが・・・。
008381
2009/03/12(木) 21:27:41sub2でもi=1だったので、変数iはsave属性なのかと思ったためでした。
同じモジュール中の変数をuseしたから同じもの(実体)を見てるだけで
あって、save属性が付いているわけではない、が正解でしょうか?
以下、ソース(行頭タブは全角スペースにしてます)
module module0
implicit none
integer::i
contains
subroutine set(j)
integer,intent(in)::j
i=j
end subroutine
end module
subroutine sub1
use module0
call set(1)
print *, 'in sub1 : i=' , i
end subroutine
subroutine sub2
use module0
print *, 'in sub2 : i=' , i
end subroutine
program main
call sub1
call sub2
end program
0084デフォルトの名無しさん
2009/03/13(金) 08:47:00変数のスコープや寿命について勉強してみてはどうかな?
0085デフォルトの名無しさん
2009/03/13(金) 13:10:10interface は使わないで済む事が多いよね。
pure 属性つけたサブルーチン内で
pure 属性つけたサブルーチンを呼ぶ時には
interface で前もって教えておかないとintel fortran に怒られるようなので
使うけど。これも多分使わないですむやり方がありそうな気もする。
>>83
愛が・・・
008683
2009/03/13(金) 14:02:12考えてたのが混乱の原因だったようです。
で、結局>>83の理解は間違っていますか?
教科書にモジュール変数をグローバル変数とする場合はsaveを付けろと
あるんですが、実際>>83のmodule0のiにsaveを付けても付けなくても、
module0をuseしたプログラムでiの値を確認すると、値が保持されているようです。
0087デフォルトの名無しさん
2009/03/13(金) 22:22:24教科書に書いてることは正しい。
Fortranの規格からすると、Module変数はSAVE属性は無い。
Fortran Handbook なんかにもわざわざ書いてある。
本来の規格の上では >>83 でiが消えてもいいように思う。
NAGあたりの規格への忠実さを目指したコンパイラで試してみればいいのではないかと思う。
>>82
INTERFACE は、ソースが無くてバイナリ-だけで配られているような、
ライブラリを呼ぶようなときに必要になるもんだと思う。
ソースが揃っているなら、Moduleにまとめておけばおk?
008885
2009/03/14(土) 03:06:21正統なFortranではOKとおもう。が、
ソースが揃ってるか一つのファイルにまとまっているなら interface文は無くてもいい子・・・
と思ってたらifortは文句行ってきた・・。まあ害が無いなら、interface を呼ぶ側でぺたぺた
使ってもいいと思う。
呼ばれるサブルーチンの頭の部分を変更した時に、呼ぶ側全部でそれを意識していたかを確認できるし。
手間が増えるだけな気もするけど、勘違いやバグ防止の対価と思えば高くもない、かな。
0089デフォルトの名無しさん
2009/03/15(日) 02:09:34たしかにそうね
先人が書いた得体の知れないFORTRAN77な外部副プログラムを安全に呼ぶために使う、とか
つーかinterfaceって名前が、javaやc#と意味が全然違くて紛らわしいというか、いまいち気に入らんw
009083
2009/03/15(日) 20:19:01>本来の規格の上では >>83 でiが消えてもいいように思う。
とすると、>>83は実際には規格外の動作ということですか?
コンパイラはIntel Fortran 10.1です。(確かにintelはけっこう拡張してるからなぁ・・・)
メンバ変数みたいな真似をmoduleでやらせようかと思ってたんですが、
この方法じゃ駄目ぽいですね。そういうオブジェクト指向的なことって
Fortran2003をちゃんと勉強すればできるのかしら・・・?
0091デフォルトの名無しさん
2009/03/16(月) 22:18:43module間で相互にmoduleを参照(use)するとエラーが出て、悲しい状態です。
誰か教えてください。
ちなみに、moduleについて詳しく書いてある本があればそれも教えてください。
0092デフォルトの名無しさん
2009/03/17(火) 03:15:21確かにmoduleはよく考えて使わないと面倒な目に合うな
個人的にはFortranやるなら、あんまり細かく部品化しすぎないほうがいいと思う
0093デフォルトの名無しさん
2009/03/17(火) 06:23:06module の前方参照のみしか許していないコンパイラーが多いよね。
ソースの前方に書いたmodule だけをuse するようにしてごらん。
0094デフォルトの名無しさん
2009/03/17(火) 14:24:33コンパイラは何?
009591
2009/03/21(土) 12:36:18>92
サブルーチンは使いまくってます。
サブルーチンがないと不便です…。
>93
前方参照はmoduleをprogramより前に書けってことですよね?
moduleは別ファイルです。こんな感じになってます。
ファイルa.f90
module a
use b
contains
subroutine foo
...
end module a
ファイルb.f90
module b
use a
contains
subroutine bar
...
end module b
わかりにくい質問ですんませんでした。
>94
コンパイラはifort(ver.11)です。
inteface使えよって意見は出ないもんなんですね。
みなさんはサブルーチン使うとき、どうやってるでしょう?
0096デフォルトの名無しさん
2009/03/21(土) 19:50:38>module間で相互にmoduleを参照(use)する
相互にuseするのって不可能じゃないの?
コンパイルするときにuseするモジュールの.modファイルが必要だし。
というか、fortranに限らず相互に呼び合うようなのは概念的に許されるのかな・・・?
もし許されるとしても、混乱の元だろうし非常にまずいような・・・・
>inteface使えよって意見は出ないもんなんですね。
>みなさんはサブルーチン使うとき、どうやってるでしょう?
interfaceの主な用途としては、fortran77で書いた外部サブルーチンを
そのままいじらずに、より安全に使いたいとき、などじゃないかな。
形状引継ぎ配列や割付け配列などの機能を使いたいときは、
いずれにしろそのサブルーチンの修正が必要になるので、そのときは大人しく
モジュールで囲ってモジュールサブルーチンに変更すべきかと思うが。
009791
2009/03/22(日) 10:19:29ありがとうございます。
相互に呼び出さないようにするためにはツリー構造を考えないといけないですね。
ちょっと面倒くさい気がします。
0098デフォルトの名無しさん
2009/03/23(月) 20:26:55009991
2009/03/24(火) 08:27:42ただ、皆さんがどういう風に対応してるのか知りたかったのです。
お相手ありがとうございました。
0100デフォルトの名無しさん
2009/03/25(水) 12:58:20オレ、一個の超特大module にしている。
0101デフォルトの名無しさん
2009/03/28(土) 00:56:59めったに使わんが、関数なんかを引数にする汎関数?っぽいサブルーチンなんかでは
インターフェースを書いて引(関)数を指定せざるおえないな。
77時代はExternalを書いておけばよかったが、90だとInterface書かないと文句言われる。
F2003では、Methodの記述用にPROCEDURE(..)宣言子が新設されたので、
場合によってはインターフェース代わりに使えるのかもしれないが。
0102デフォルトの名無しさん
2009/03/28(土) 12:21:25並列計算を意識してか想定しているシステムの種類を
増やさないといけない関係かも知れないけど、
男は黙ってインライン、とはいかないのか。
0103デフォルトの名無しさん
2009/03/28(土) 22:43:15思ってるんですけど、何か気をつけるべきことやありがちな落とし穴とかありますかね?
もちろん自分でテストはしますが、後の運用性とか未然にバグを防ぐとかでもっと上手く出来そうなら
指摘してもらえますか?例えばこんな感じです。
PARAMETER (MNM=5000,MNC=100)
DOUBLE PRECISION CC(MNC)
COMMON /CELL/ CC,CG(6,MNC),NCX,NCY
COMMON /MOLS/ NM,PP(3,MNM),PV(3,MNM)
ってのが使用される各サブルーチン先頭に書いてあったのを
↓
module mnpara
PARAMETER MNM=5000,MNC=100
end module
module cell
use mnpara
DOUBLE PRECISION CC(MNC)
real CG(6,MNC)
integer NCX,NCY
end module
module mols
use mnpara
real PP(3,MNM),PV(3,MNM)
integer NM
end module
と、mainの前に書いて、各サブルーチン中でuse cellなりuse molsなりと。
double precisionと型宣言の扱いがこれでいいか良くわからんのですがこれで大丈夫でしょうか?
0104デフォルトの名無しさん
2009/03/28(土) 22:56:59もちろん書き換えた後テストはしますが、もっと上手く出来るこれはよろしくないとかあれば指摘してください。
PARAMETER MNC=8000,MNSP=2,MNS=5
DOUBLE PRECISION COL(MNSP,MNSP),MOVT
COMMON /SAMP / COL,NCOL,MOVT,SELT,SEPT,CS
COMMON /CELLS / CC(MNC),CG(3,MNC),IC(2,MNC,MNS)
というのが各サブルーチンの先頭にあったのを
module mnpara
PARAMETER MNC=8000,MNSP=2,MNS=5
end module
module samp
use mnpara
DOUBLE PRECISION COL(MNSP,MNSP),MOVT,NCOL
real selt,sept,cs
integer ncol
end module
module cells
use mnpara
real CC(MNC),CG(3,MNC)
integer IC(2,MNC,MNS)
end module
と、mainの前に書いて各サブルーチンの先頭でuse samp;use cells
でよろしいでしょうか?double precisionと型宣言の扱いがこれでいいか少し不安ですが…
よろしくおねがいします。
0105デフォルトの名無しさん
2009/03/28(土) 22:59:42申し訳ないです。
0106デフォルトの名無しさん
2009/03/29(日) 00:50:31COMMON変数は、EQUIVALENCEっぽいというか、名前ではなく順番で、つまり
メモリーの位置で対応しあっているので、サブルーチンごとでCOMMON変数の名前が
変えてあると本体の変数名も直さねばならず一気に面倒になる。
あとから変数の受け渡しが必要になったらしくて、いくつかのCOMMON文の末尾だけに新しい
変数が加わっていたりするのも昔のプログラムでは良くあること。
一括変換で機械的に直せないことがままある。
幸運を祈る。
0107104
2009/04/02(木) 05:02:49回答有難う御座います。
すみません、common文が内部的にどう働いてるか実は良く
分かってないので的外れな質問かもしれませんが、
もしいくつかのcommon文の末尾だけに変数を書き加えて、
同一名のcommon文のサイズが違ったとすると、例えば別のcommon文の要素とかを
書き換えちゃいそうな気がするんですけど、そんなことしてまともに動くんでしょうか?
幸いそういうのは今のところ無さそうなんですけど、純粋に知識として気になって。
0108デフォルトの名無しさん
2009/04/02(木) 05:30:01ま,includeすればそんな心配もない訳だが。
0109104
2009/04/02(木) 07:12:26規格上定められてないのでどうなるかはコンパイラ等に依存するってことですか?
それともう一つお聞きしたいんですが、そのサブルーチン内で使ってない
moduleを呼び出した時の弊害ってあるでしょうか?無駄に呼ぶと速度とかに影響します?
0110デフォルトの名無しさん
2009/04/02(木) 09:30:17変数の数が違うとフツーは警告を出すだろうが,エラーになるコンパイラもあるかもね。
なんにせよ,そんな間違いをしない方法を考えた方が有益だろよ。
moduleの方は判らないなぁ・・・
0111デフォルトの名無しさん
2009/04/02(木) 11:15:23無名COMMONでは、各COMMONブロックごとのサイズは異なっていい。
(その代わりBLOCK DATA文で初期化できない)
文法書を読めば書いてある。
名前つきCOMMONはすべて共通の大きさでなければならないのだが、
名前つきCOMMONでもサイズが違っているプログラムはごろごろ転がっていた。
昔はハードウェアもOSもてんでんばらばらだったので、すべては処理系に依存する。
0112デフォルトの名無しさん
2009/04/02(木) 14:42:53たいていのfortranコンパイラは警告を出すけど、そのまま作業を続けるよね。
関係ないけど、アメリカのSGIが潰れてしまった・・・。
alphaマシンがまた一つ・・。
0113デフォルトの名無しさん
2009/04/02(木) 16:40:180114デフォルトの名無しさん
2009/04/03(金) 00:39:20だな。
2ch的にはアルファは法則発動であぼーんと言うべきか。
0115デフォルトの名無しさん
2009/04/03(金) 03:53:41だね。
片手間?で「Alpha始めました」の張り紙を出したところが出始めは案外評判が良くって、
注力しはじめたところでAlphaが本領を発揮してアボン。
ifort ってバージョンの9あたりから、シェフお薦め最適化オプション -fast 付けるより
デフォの方が早かったりしない?
自分のコードが変なだけかもしれないけど、そういうケースに気付くようになった。
0116115
2009/04/03(金) 03:54:480117デフォルトの名無しさん
2009/04/03(金) 21:45:54Altixも終わりかな?
0118デフォルトの名無しさん
2009/04/03(金) 22:17:35デフォってオプション何もなしってこと?
-fastは-O3も含んでるけど、そんなことあり得るのかな?
0119デフォルトの名無しさん
2009/04/04(土) 01:06:57いや、悪くないんじゃ?w>男は黙ってインライン
いずれにしろFortranは速度も優先せざるを得ない以上、他の言語のように
抽象化しまくって直交性高めまくるやり方を期待するのは土台無理というもの。
やはりFortranerに一番必要なものとは「漢気」である。
0120デフォルトの名無しさん
2009/04/04(土) 03:15:30-fast = -O3 -ipo -static
が基本オプションかな?微妙にifortのバージョンで変わるみたいだから、
シェフお薦め、というのはそうだな。ip(o) が混じるから副作用があるのかも。
0121120
2009/04/04(土) 03:23:26-O3 は unrolling促進やら含んだとおもうし、-staticも何か悪さする場合もありそうな気もする。
-fast -unroll0 で
あんろーりんぐ無しの最適化を試してみるといいのかも(順番大事だよ)。
0122デフォルトの名無しさん
2009/04/04(土) 04:15:42何にしても-fastで遅くなるなんて悲しすぎるから、ちゃんと見直したほうがいいかと
0123デフォルトの名無しさん
2009/04/04(土) 07:55:360124デフォルトの名無しさん
2009/04/04(土) 14:58:48おすえて
昔派の漏れは static の方が安心な気がするのだが、最近のデフォは dll だっけ?
0125デフォルトの名無しさん
2009/04/04(土) 15:05:45自分が経験した例では、バージョン8くらいまでは -ftz つけると速くなったけど
9以降だと遅くなった、こととかかな。
intelも工夫してるんだろうけど、使う側もいろいろ試してちょ、という事か?
0126デフォルトの名無しさん
2009/04/04(土) 16:46:45-O2ってデフォでかかるの?
>>124
dllのほうが一般に速いという話を聞いたことが
0127デフォルトの名無しさん
2009/04/04(土) 17:06:46かけると、
-O0 disable optimizations
-O1 optimize for maximum speed, but disable some optimizations which,,,,,,
-O2 enable optimizations (DEFAULT)
-O3 enable -O2 plus more aggressive optimizations that may not improve
-O same as -O2
と出るね。linuxに入ってたversion9.1ではこうだった。
0128デフォルトの名無しさん
2009/04/04(土) 17:08:32-fast や -O3
つけたらかえって遅くなっても
製造元の想定の範囲内って事で気にしないのが良いのかも知れないね。
0129デフォルトの名無しさん
2009/04/04(土) 17:13:45ほんとだ、v10.1でもそうだった
thx
0130デフォルトの名無しさん
2009/04/05(日) 04:50:08インテルはあっさりしてるよね。ゼロ・松竹梅の4つ。
マクドナルドと吉野家くらいメニューが違う。
0131デフォルトの名無しさん
2009/04/05(日) 12:52:09細かいオプションとかカテゴリーの違うものを比較してないか?
■ このスレッドは過去ログ倉庫に格納されています