09/02/07 02:48:21
caryってまだ生きてたんだ・・・
43:デフォルトの名無しさん
09/02/07 11:42:24
>>42
Crayはここ10年くらいのアメリカの護主義のおかげで復活してる。
一時期の低迷は脱している。
そういえば、東工大のつばめに刺さっていたクリアスピード社が、イギリスの経済壊滅の
余波で株価急落、資金繰りにもつまってきたというニュースが先週流れてきてた。
ETA10の夢ふたたびw
44:デフォルトの名無しさん
09/02/07 16:20:54
この不況でスパコン業界の勢力図も相当変わるだろうな
つーかCrayってもう石は作ってないんだよな?
その他大勢の単なるシステム屋さんに成り下がっちまった
45:デフォルトの名無しさん
09/02/07 22:16:59
>9
アセンブルコードを吐かせてサイズを比較しろ
46:デフォルトの名無しさん
09/02/08 07:53:42
>>9
1CPUなら後者が速いことが多い・・・とおもう。
並列だとたぶん前者・・・とおもう。並列処理すると代償でマスキング処理が抑制されることがあるから。
個人的にはif-endifで処理しない・する範囲を明示する方が好き。
47:デフォルトの名無しさん
09/02/08 16:14:46
if文の行うマスク処理って、ベクトル処理のときの話じゃない?
違ったらごめん
48:デフォルトの名無しさん
09/02/08 18:01:42
超初心者で恥ずかしながらご質問させていただきます。Compaqのvisual fortranを使ってます。
先輩からいただいたプログラムのファイルは2つあり、ひとつが本プログラム、もうひとつがサブルーチンプログラムです。
この状況で、もうひとつのサブルーチンプログラムをworkspaceのところで作成し、compile、excecutionをしたのですが、
どうもerrorなどはないのですが、write文などの結果が既存のサブルーチンプログラムからの結果が出力され、
新しいプログラムでの結果が出力できません。どうやったら、新しいプログラムの結果が
出力できるのか、教えていただけますでしょうか。
大変、初心者の質問で申し訳ございません。
49:デフォルトの名無しさん
09/02/08 18:08:07
↑ちょうど友達から電話があり、教えていただきました。どうもご迷惑をおかけいたしました。
無視してください。また、お世話になるかと思いますが、どうぞよろしくお願いいたします。
50:デフォルトの名無しさん
09/02/08 19:23:15
>>47
あってるよ。
でも並列処理するときに誤作動防止で
ベクトル処理を抑制することがあるというのはありそうではある
51:デフォルトの名無しさん
09/02/10 15:42:39
MKL(というかライブラリ一般)の使い方を初心者に解説してるサイトや本ってありませんか(英語可)
Matlabから移行してきたんですが、公式マニュアル見てもプログラミング関係の単語がわからずで。ラッパーとか。
数値計算に関しては、噂に聞いてたよりも使いやすいなあ、と思ってるんですが。
よろしくお願いします
52:デフォルトの名無しさん
09/02/10 17:32:15
gfortranでコンパイル時、下記のエラーが発生して困っています。
gfortran -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)
似たような問題を見つけましたが、対処方法がよく分かりません。
URLリンク(gcc.gnu.org)
どなたか教えて頂けないでしょうか。
ENV: RedHat 4, GCC 4.1.2
53:デフォルトの名無しさん
09/02/11 00:36:13
>>52
何をしたいのか、それだけでは意味不明だが、『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関数で内部表現を見れば分かる。
54:デフォルトの名無しさん
09/02/11 10:15:01
>>53
的確かつ詳細な回答有り難う御座います。大変参考になりました。
お察しの通りC言語の経験者ですが、Fortranは皆無です。
ご指摘を参考に勉強致します。有り難う御座いました:-)
55:デフォルトの名無しさん
09/02/15 15:04:38
Intel Visual Fortran の update 通知が来てたけど、F2003対応は進展したかい?
56:デフォルトの名無しさん
09/02/16 22:01:19
FORTRANのG77をダウンロードしたいのですが、よくわかりません。
Vistaに対応した無料FORTRANが出来るようになるサイトを教えてください。
申し訳ありませんが、よろしくお願いします。
57:デフォルトの名無しさん
09/02/16 23:42:15
>>56
スレリンク(tech板:2番)
58:デフォルトの名無しさん
09/02/17 11:11:13
>>56
俺的にこれがお勧め
URLリンク(www.download.com)
Plato3と言うソフトが一緒にインストールされるから、それを起動して
File->Newもしくは左上の白いアイコンをクリックするとNew Fileと言うウィンドウが出る
FORTRAN77のコードを書きたいならFixed Format Fortran fileを
Fortran90/95のコードを書くならFree Fomat Forrtran fileを選択しOpenボタンを押す。
あとはコードを書いて、左上に青い再生ボタンがあるのでクリック、変なダイアログが出ても
OKおせばおk。あと、黒いウインドウを閉じる時は、右上の×じゃなくて、キーボードの
Enterを押さないと落ちる事があるので注意
59:デフォルトの名無しさん
09/02/19 17:28:26
Intel Fortran11が出たけど、初物には飛びつかんほうがいいかなーやっぱ
60:デフォルトの名無しさん
09/02/19 18:30:00
そういえばWindows XP SP3の対応って11からだっけ?>Intel Fortran
61:デフォルトの名無しさん
09/02/19 19:56:36
>>55
bug fixが中心だろう
Memory allocation error in for_array_copy_in()
とか
11.0 message catalog produces garbled messages with Japanese compiler
とかあったから、とりあえず入れといた
62:デフォルトの名無しさん
09/02/19 23:33:41
IntelFortran6.0使ってたんだけど、
11.0でコンパイルしなおしただけで計算時間が1/3になってワロタ
別に最適化オプション何も使ってないデフォルトなんだけどな
これでOpenMPで最適化したら一体どうなるんだ
63:デフォルトの名無しさん
09/02/20 04:02:32
>>61
黒カエラーはまだ直ってないなw
誰もIntelに通報してないのか?
64:デフォルトの名無しさん
09/02/20 13:43:56
>>62
7になった時にですごく良くなった気がする。
あとはあまり変化は大きくない気がする。
・・・といって今使ってるのが9のままなので10,11でまた進歩があったのかな?
SSE絡みでは順次良くなったそうだけど
明示的にそれを使うことは少ないからなあ。
65:デフォルトの名無しさん
09/02/20 14:23:19
DECのエンジニアが入ったのが7からだっけ?
見違えるように良くなったって話だが
66:デフォルトの名無しさん
09/02/21 00:20:22
昔のはVisualC++へのプラグインだったからなぁ。
67:デフォルトの名無しさん
09/02/21 10:32:37
つまらないことなんですけど
みなさんはエラー系の出力はwrite(0,*)を使っていますか?
それとも、標準出力もエラー出力も全部print *を使っていますか?
68:デフォルトの名無しさん
09/02/21 19:42:57
>>67
標準出力とエラー出力があるっていうのはUNIXの話だから、
メインフレーム上がりでUNIXをおもちゃと馬鹿にしているおっさんたちは、
そんなもの存在も知らず、相変わらず6番に出力していると思う。
69:デフォルトの名無しさん
09/02/22 00:56:09
program mtest
integer, 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するのでしょうか?
70:69
09/02/22 00:57:29
>>69
先頭のスペースが全て削除されてしまったようです。
c: の行は無視してください。
71:デフォルトの名無しさん
09/02/22 01:47:54
>>69
外部サブルーチンだからエラーが出んじゃない?
内部サブルーチンやモジュールで使ってるけど
エラーは出ないよ
72:69
09/02/22 02:58:23
>>71
program 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
レスどうもです。こんな感じでしょうか?
たしかにコンパイルは通りました。ただ、ライブラリ化
したいため、分割コンパイルしたいのです。何とか
外部プログラムで実現できないでしょうか・・・
73:デフォルトの名無しさん
09/02/22 04:39:47
>>72
MODULEに入れるか、本体側でINTERFACEを書けばいいんでね?
ALLOCATABLE属性をつけても、77式に裸にしておくと、引数がマッチしているのか分からんから
怒られるんだと思うが。
74:69
09/02/22 09:30:19
>>73
module 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)
:
75:デフォルトの名無しさん
09/02/22 13:30:21
>>74
やりたいのはこんな感じかな?
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
76:69
09/02/22 20:12:35
>>75
レスどうもです。
ズバリ75のコードなのですが、私のコンパイラ(Fortran PowerStation 4.0)ではエラーが出ます。
4行めがイカンと言っているようです。
malloc.f90(4):error FOR3435: symbol IMEM is a dummy argument
- cannot be ALLOCATABLE detected between IMEM and (
文法的には間違っていないと思うのですが・・・
別のコンパイラでも試してみようと思います。
コードの調整までして下さり、本当にありがとうございました。
77:デフォルトの名無しさん
09/02/22 23:41:01
>>76
俺のおぼろげな記憶では、ALLOCATABLE な配列をサブルーチン側で ALLOCATE して
返せるようになったのは Fortran95 以降だった気がする。
Fortran90ではPointerでやるんじゃなかったかな?
文法書で確かめてくれw ガセネタだったらすまんこ。
78:69
09/02/23 06:31:29
>>77
統合環境のオンラインマニュアルを良く読むと、以下の記載がありました。
>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を使って書きなおそうと考えた次第です。
重ね々々ありがとうございました。
79:デフォルトの名無しさん
09/02/24 00:15:50
>>78
POINTERに直すだけなら簡単。
ただ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 だけでいいのか今一自信なし。
80:69
09/02/24 07:04:42
>>79
何から何まで申し訳ありません。
コードはコンパイル1発でOKでした。
allocate後は配列と同じように使えるみたいですし、cのポインタより保護されている感が
あっていいですね。危険性に関しては、昔のメモリマネジメントより随分安全と感じますが、
別ルーチンでしっかりチェックするつもりです。
ただ、f90は利用情報が少ないので、少しずつ勉強しながら使って行こうと思います
(周りに利用者がいない。f77かcかVB)。特にPCの処理系では、方言等ありそうですね。
規格にも目を通したいと思います。
色々とありがとうございました。
81:デフォルトの名無しさん
09/03/11 02:17:57
モジュールで宣言した変数って自動的にsaveになるんですか?
82:81
09/03/12 21:16:17
すいません。>>81は勘違いでした。
もう一つお聞きしたいんですが、INTERFACEって使ってますか?
外部プログラムを書いてから、また同じようなのをイチイチ書くのは
面倒臭いし、モジュールで全部代用できる気がするんですが・・・。
83:81
09/03/12 21:27:41
ちなみに何故>>81で勘違いしたかですが、下のようなテストをしたところ
sub2でも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
84:デフォルトの名無しさん
09/03/13 08:47:00
>>83
変数のスコープや寿命について勉強してみてはどうかな?
85:デフォルトの名無しさん
09/03/13 13:10:10
>>82
interface は使わないで済む事が多いよね。
pure 属性つけたサブルーチン内で
pure 属性つけたサブルーチンを呼ぶ時には
interface で前もって教えておかないとintel fortran に怒られるようなので
使うけど。これも多分使わないですむやり方がありそうな気もする。
>>83
愛が・・・
86:83
09/03/13 14:02:12
どうもmoduleのuseを、Cでいうクラスのインスタンス生成みたいに
考えてたのが混乱の原因だったようです。
で、結局>>83の理解は間違っていますか?
教科書にモジュール変数をグローバル変数とする場合はsaveを付けろと
あるんですが、実際>>83のmodule0のiにsaveを付けても付けなくても、
module0をuseしたプログラムでiの値を確認すると、値が保持されているようです。
87:デフォルトの名無しさん
09/03/13 22:22:24
>>86
教科書に書いてることは正しい。
Fortranの規格からすると、Module変数はSAVE属性は無い。
Fortran Handbook なんかにもわざわざ書いてある。
本来の規格の上では >>83 でiが消えてもいいように思う。
NAGあたりの規格への忠実さを目指したコンパイラで試してみればいいのではないかと思う。
>>82
INTERFACE は、ソースが無くてバイナリ-だけで配られているような、
ライブラリを呼ぶようなときに必要になるもんだと思う。
ソースが揃っているなら、Moduleにまとめておけばおk?
88:85
09/03/14 03:06:21
>>87 の後半
正統なFortranではOKとおもう。が、
ソースが揃ってるか一つのファイルにまとまっているなら interface文は無くてもいい子・・・
と思ってたらifortは文句行ってきた・・。まあ害が無いなら、interface を呼ぶ側でぺたぺた
使ってもいいと思う。
呼ばれるサブルーチンの頭の部分を変更した時に、呼ぶ側全部でそれを意識していたかを確認できるし。
手間が増えるだけな気もするけど、勘違いやバグ防止の対価と思えば高くもない、かな。
89:デフォルトの名無しさん
09/03/15 02:09:34
>勘違いやバグ防止の対価と思えば高くもない
たしかにそうね
先人が書いた得体の知れないFORTRAN77な外部副プログラムを安全に呼ぶために使う、とか
つーかinterfaceって名前が、javaやc#と意味が全然違くて紛らわしいというか、いまいち気に入らんw
90:83
09/03/15 20:19:01
>>87
>本来の規格の上では >>83 でiが消えてもいいように思う。
とすると、>>83は実際には規格外の動作ということですか?
コンパイラはIntel Fortran 10.1です。(確かにintelはけっこう拡張してるからなぁ・・・)
メンバ変数みたいな真似をmoduleでやらせようかと思ってたんですが、
この方法じゃ駄目ぽいですね。そういうオブジェクト指向的なことって
Fortran2003をちゃんと勉強すればできるのかしら・・・?
91:デフォルトの名無しさん
09/03/16 22:18:43
サブルーチンがたくさんあるプログラムを作る時はmoduleよりもinterfaceの方が良いですか?
module間で相互にmoduleを参照(use)するとエラーが出て、悲しい状態です。
誰か教えてください。
ちなみに、moduleについて詳しく書いてある本があればそれも教えてください。
92:デフォルトの名無しさん
09/03/17 03:15:21
そのエラーがどんなものか分からないことには何とも・・・
確かにmoduleはよく考えて使わないと面倒な目に合うな
個人的にはFortranやるなら、あんまり細かく部品化しすぎないほうがいいと思う
93:デフォルトの名無しさん
09/03/17 06:23:06
>>91
module の前方参照のみしか許していないコンパイラーが多いよね。
ソースの前方に書いたmodule だけをuse するようにしてごらん。
94:デフォルトの名無しさん
09/03/17 14:24:33
>>91
コンパイラは何?
95:91
09/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使えよって意見は出ないもんなんですね。
みなさんはサブルーチン使うとき、どうやってるでしょう?
96:デフォルトの名無しさん
09/03/21 19:50:38
>>91
>module間で相互にmoduleを参照(use)する
相互にuseするのって不可能じゃないの?
コンパイルするときにuseするモジュールの.modファイルが必要だし。
というか、fortranに限らず相互に呼び合うようなのは概念的に許されるのかな・・・?
もし許されるとしても、混乱の元だろうし非常にまずいような・・・・
>inteface使えよって意見は出ないもんなんですね。
>みなさんはサブルーチン使うとき、どうやってるでしょう?
interfaceの主な用途としては、fortran77で書いた外部サブルーチンを
そのままいじらずに、より安全に使いたいとき、などじゃないかな。
形状引継ぎ配列や割付け配列などの機能を使いたいときは、
いずれにしろそのサブルーチンの修正が必要になるので、そのときは大人しく
モジュールで囲ってモジュールサブルーチンに変更すべきかと思うが。
97:91
09/03/22 10:19:29
>>96
ありがとうございます。
相互に呼び出さないようにするためにはツリー構造を考えないといけないですね。
ちょっと面倒くさい気がします。
98:デフォルトの名無しさん
09/03/23 20:26:55
結局>>91のエラーは解決したの?
99:91
09/03/24 08:27:42
相互参照しないように書けば、エラーは消えます。
ただ、皆さんがどういう風に対応してるのか知りたかったのです。
お相手ありがとうございました。
100:デフォルトの名無しさん
09/03/25 12:58:20
>>99
オレ、一個の超特大module にしている。
101:デフォルトの名無しさん
09/03/28 00:56:59
>>96
めったに使わんが、関数なんかを引数にする汎関数?っぽいサブルーチンなんかでは
インターフェースを書いて引(関)数を指定せざるおえないな。
77時代はExternalを書いておけばよかったが、90だとInterface書かないと文句言われる。
F2003では、Methodの記述用にPROCEDURE(..)宣言子が新設されたので、
場合によってはインターフェース代わりに使えるのかもしれないが。
102:デフォルトの名無しさん
09/03/28 12:21:25
なんか、副プログラムの引数やら型を渡す儀式のパターンが増えちゃったよね。
並列計算を意識してか想定しているシステムの種類を
増やさないといけない関係かも知れないけど、
男は黙ってインライン、とはいかないのか。
103:デフォルトの名無しさん
09/03/28 22:43:15
ちょっと便乗して質問します。今、不便を我慢して使ってきたcommon文を全部module文にしようかと
思ってるんですけど、何か気をつけるべきことやありがちな落とし穴とかありますかね?
もちろん自分でテストはしますが、後の運用性とか未然にバグを防ぐとかでもっと上手く出来そうなら
指摘してもらえますか?例えばこんな感じです。
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と型宣言の扱いがこれでいいか良くわからんのですがこれで大丈夫でしょうか?
104:デフォルトの名無しさん
09/03/28 22:56:59
微妙に便乗して質問します。今、common文をmodule文に書き換えようとしてるんですが、
もちろん書き換えた後テストはしますが、もっと上手く出来るこれはよろしくないとかあれば指摘してください。
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と型宣言の扱いがこれでいいか少し不安ですが…
よろしくおねがいします。
105:デフォルトの名無しさん
09/03/28 22:59:42
すみません…なんか書き込み失敗したと勘違いして連投してしまいました。
申し訳ないです。
106:デフォルトの名無しさん
09/03/29 00:50:31
>>103
COMMON変数は、EQUIVALENCEっぽいというか、名前ではなく順番で、つまり
メモリーの位置で対応しあっているので、サブルーチンごとでCOMMON変数の名前が
変えてあると本体の変数名も直さねばならず一気に面倒になる。
あとから変数の受け渡しが必要になったらしくて、いくつかのCOMMON文の末尾だけに新しい
変数が加わっていたりするのも昔のプログラムでは良くあること。
一括変換で機械的に直せないことがままある。
幸運を祈る。
107:104
09/04/02 05:02:49
>>106
回答有難う御座います。
すみません、common文が内部的にどう働いてるか実は良く
分かってないので的外れな質問かもしれませんが、
もしいくつかのcommon文の末尾だけに変数を書き加えて、
同一名のcommon文のサイズが違ったとすると、例えば別のcommon文の要素とかを
書き換えちゃいそうな気がするんですけど、そんなことしてまともに動くんでしょうか?
幸いそういうのは今のところ無さそうなんですけど、純粋に知識として気になって。
108:デフォルトの名無しさん
09/04/02 05:30:01
「動作は未定義」じゃないのかね。
ま,includeすればそんな心配もない訳だが。
109:104
09/04/02 07:12:26
すいません、未定義と言うのはどういうことでしょうか?
規格上定められてないのでどうなるかはコンパイラ等に依存するってことですか?
それともう一つお聞きしたいんですが、そのサブルーチン内で使ってない
moduleを呼び出した時の弊害ってあるでしょうか?無駄に呼ぶと速度とかに影響します?
110:デフォルトの名無しさん
09/04/02 09:30:17
>>109
変数の数が違うとフツーは警告を出すだろうが,エラーになるコンパイラもあるかもね。
なんにせよ,そんな間違いをしない方法を考えた方が有益だろよ。
moduleの方は判らないなぁ・・・
111:デフォルトの名無しさん
09/04/02 11:15:23
>>109
無名COMMONでは、各COMMONブロックごとのサイズは異なっていい。
(その代わりBLOCK DATA文で初期化できない)
文法書を読めば書いてある。
名前つきCOMMONはすべて共通の大きさでなければならないのだが、
名前つきCOMMONでもサイズが違っているプログラムはごろごろ転がっていた。
昔はハードウェアもOSもてんでんばらばらだったので、すべては処理系に依存する。
112:デフォルトの名無しさん
09/04/02 14:42:53
>>111
たいていのfortranコンパイラは警告を出すけど、そのまま作業を続けるよね。
関係ないけど、アメリカのSGIが潰れてしまった・・・。
alphaマシンがまた一つ・・。
113:デフォルトの名無しさん
09/04/02 16:40:18
SGIって伝統的にMIPSじゃなかった?
114:デフォルトの名無しさん
09/04/03 00:39:20
>>113
だな。
2ch的にはアルファは法則発動であぼーんと言うべきか。
115:デフォルトの名無しさん
09/04/03 03:53:41
>>113
だね。
片手間?で「Alpha始めました」の張り紙を出したところが出始めは案外評判が良くって、
注力しはじめたところでAlphaが本領を発揮してアボン。
ifort ってバージョンの9あたりから、シェフお薦め最適化オプション -fast 付けるより
デフォの方が早かったりしない?
自分のコードが変なだけかもしれないけど、そういうケースに気付くようになった。
116:115
09/04/03 03:54:48
sgiの場合AlphaよりはItaniumが疫病神か
117:デフォルトの名無しさん
09/04/03 21:45:54
疫病神ヒドスw
Altixも終わりかな?
118:デフォルトの名無しさん
09/04/03 22:17:35
>>115
デフォってオプション何もなしってこと?
-fastは-O3も含んでるけど、そんなことあり得るのかな?
119:デフォルトの名無しさん
09/04/04 01:06:57
>>102
いや、悪くないんじゃ?w>男は黙ってインライン
いずれにしろFortranは速度も優先せざるを得ない以上、他の言語のように
抽象化しまくって直交性高めまくるやり方を期待するのは土台無理というもの。
やはりFortranerに一番必要なものとは「漢気」である。
120:デフォルトの名無しさん
09/04/04 03:15:30
>>118,115
-fast = -O3 -ipo -static
が基本オプションかな?微妙にifortのバージョンで変わるみたいだから、
シェフお薦め、というのはそうだな。ip(o) が混じるから副作用があるのかも。
121:120
09/04/04 03:23:26
ipoはインライン促進だからあまり副作用の心配はいらないか。
-O3 は unrolling促進やら含んだとおもうし、-staticも何か悪さする場合もありそうな気もする。
-fast -unroll0 で
あんろーりんぐ無しの最適化を試してみるといいのかも(順番大事だよ)。
122:デフォルトの名無しさん
09/04/04 04:15:42
あ、インライン使うときは、リンクするライブラリはインテルアーカイバ(xiarだっけ?)で作ったほうがいいかも
何にしても-fastで遅くなるなんて悲しすぎるから、ちゃんと見直したほうがいいかと
123:デフォルトの名無しさん
09/04/04 07:55:36
version9あたりからデフォ(-O2)が速くなった気がするのは気のせいかな?
124:デフォルトの名無しさん
09/04/04 14:58:48
static と dll でどっちを選んだほうがいいの?
おすえて
昔派の漏れは static の方が安心な気がするのだが、最近のデフォは dll だっけ?
125:デフォルトの名無しさん
09/04/04 15:05:45
ちょっと前はstatic推奨だったけどな。なんかバージョン毎の違いも大きそう。
自分が経験した例では、バージョン8くらいまでは -ftz つけると速くなったけど
9以降だと遅くなった、こととかかな。
intelも工夫してるんだろうけど、使う側もいろいろ試してちょ、という事か?
126:デフォルトの名無しさん
09/04/04 16:46:45
>>123
-O2ってデフォでかかるの?
>>124
dllのほうが一般に速いという話を聞いたことが
127:デフォルトの名無しさん
09/04/04 17:06:46
ifort --help
かけると、
-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ではこうだった。
128:デフォルトの名無しさん
09/04/04 17:08:32
というわけで
-fast や -O3
つけたらかえって遅くなっても
製造元の想定の範囲内って事で気にしないのが良いのかも知れないね。
129:デフォルトの名無しさん
09/04/04 17:13:45
>>127
ほんとだ、v10.1でもそうだった
thx
130:デフォルトの名無しさん
09/04/05 04:50:08
g77 は最適化のレベルがたくさんあった気がするけど、
インテルはあっさりしてるよね。ゼロ・松竹梅の4つ。
マクドナルドと吉野家くらいメニューが違う。
131:デフォルトの名無しさん
09/04/05 12:52:09
>>130
細かいオプションとかカテゴリーの違うものを比較してないか?
132:デフォルトの名無しさん
09/04/05 20:46:12
今はgfortranだっけか
完全フリーでgnuより速いコンパイラって出ないもんかね
133:130
09/04/06 07:50:51
>>131
ごめんよ。書いた後でこりゃ変だと思ったよ。
>>132
出ないものかね。でも、
いまのintelのポリシーだと、個人で商用目的でFortran/Cを使う人以外、そこそこ満足だからね。
フリーな奴の開発プロジェクトを立ち上げたり維持するだけの理由があまり無い気もする。
134:デフォルトの名無しさん
09/04/09 21:37:01
なんて言っている大学関係者はたいてい犯罪者だけどな
Note that academic use of the products does not qualify for a non-commercial license.
Intel offers heavily discounted licenses to academic developers through our Academic Developer Program.
135:133
09/04/10 02:07:44
>>134
ちょっと知ったかぶり、というか早合点、というかまぬけ。
それ、大学関係者じゃ自明じゃね?
まわりの奴は知らないだろうと得意がる子供は・・・
136:デフォルトの名無しさん
09/04/10 11:03:54
まぁもちけつ・・・良スレで喧嘩はいかんよ
実際使っちゃってる香具師は少なくはないだろう
内部告発とか食らうとやばいかも?w
ちなみにAdobeとか違反使用に厳格なところは大学に何億って賠償請求することもある
Intelはあんまそういう話を聞かないが、寛容なのかなw
137:デフォルトの名無しさん
09/04/10 12:13:43
133だけど・・・なにこれ?ひどす。
134のはまっとうな指摘だと思うよ。
いろんなソフトでアカデミックパック版があるしフリーソフトが当たり前にあるから、
特に大学に長くいる人はなんとなくライセンスに鈍感というか、
タダであることを当然と思うところがあるから。
>>136
フリーでつかって学習して潜在的なユーザーが増えると良いな、という事だろうけど、
論文に使った計算と、購入検討のための試運転の区別が付きにくい、という事はあるから
なかなかintelが積極的にライセンスチェックするのはコスト的にも難しいのかも。
というか計算結果にコンパイラ毎のクセが出るようでは困るw
それこそ内部告発でもなければintelも動けないだろうね。
その点あたりまえだけど純粋なソフト屋はその辺もっとシビアで迅速だよね。
138:デフォルトの名無しさん
09/04/11 00:37:18
質問よろしいでしょうか??
大学に入って初めてfortranにさわりました。
Frotran77を使用し、ソースプログラムは何とか書けましたが、次の作業の
コンパイルというものがよくわかりません。
OSはLinuxを使用しています。何か別のソフトをインストールして作業しないと
いけないんでしょうか?
よろしくお願いします。
139:デフォルトの名無しさん
09/04/11 01:24:23
>>138
普通はg77とかgfortranとか入ってるだろうけど
学校で使ってるのなら、まずは教官に聞け。
140:デフォルトの名無しさん
09/04/11 17:28:30
どうでもいい話かもしれんけど、コンパイラの開発ってどれくらいの規模と金かかるもんなんだろ
ハッカーな天才を何人か高給で雇えばいっちょ上がり、ってわけでもないよね?
141:デフォルトの名無しさん
09/04/11 17:48:34
普通のソースコードを読んで、特定のマシンでとにかく動けばいいレベルの
コードを吐くだけなら、学生が1ヶ月かければ作れる。
仕様の細かいところまで厳密に対応し、高度な最適化をかけ、複数の
ターゲットに対応し、etc... となると複数人で継続してメンテナンスされる
プロジェクトになる。
142:デフォルトの名無しさん
09/04/12 12:51:36
質問させてください。fortran90ソースをpgf90 でコンパイルしています。
write (*, 20) ( A(k),k=1,10)
20 format('A=',(' ',10i2))
例えば、上記のように、write文でdo形反復を用いて、配列Aの要素十個を
横並びに書き出すことは出来るのですが、
書き出したい要素数を n としたとき、n個を横並びに書き出すことは出来ますでしょうか。
下記の方法では、出来ませんでした。
write (*, 20) ( A(k),k=1,n)
20 format('A=',(' ',ni2))
よろしくお願いいたします。
143:デフォルトの名無しさん
09/04/12 13:40:06
この板にあるもう一つのFortranスレで似た質問を見た気がするから捜してみて。
多分それと違う答は・・・・
character*4 fmtstring
(中略)
write(fmtstring,'(i2.2,''i2'')') n
write(*,fmt=fmtstring) ( A(k),k=1,n)
かなあ。最初の文字列定義はプログラムの頭の方でしてね。
2行目でformatの中身を文字列で指定して
3行目で使ってる。でもこれダメなシステムもあった気がする・・。
intel と 富士通ではOKだったけど、pgfでは果たしてどうだろうか?まあ試してみて。
144:142
09/04/12 16:42:18
ご提案ありがとうございます。
その方法を試してみましたところ、
コンパイルに文句を言われることは無くなりました!!
しかし、セグフォルトが出たので、これからデバッグかんばリます。。。
145:デフォルトの名無しさん
09/04/12 16:57:10
その配列aに入っている値は二桁以下の整数(または一桁の負の整数)って
確定しているの?
i2だと二桁までだからもし3桁以上の数字が来ると、
そこで**とか出るだろうけど、どうも一部のシステムでは
そこでsegmentation faultになることもある。
なので特段の理由がなければi9くらいに
めけんとうで大きめな桁数にしとくと吉。
146:142
09/04/12 18:35:39
はい、確かに2桁以下とは限りませんでした。
i9くらいにして、charactor の宣言も、それを許容できるくらいに取っていれば安心ですね。
ありがとうございます。
セグフォルトは他で出ているようです。
実は、ifort 用のソースをpgf90に書き換えているのですが、とても難航しています。
何かご助言を頂けないでしょうか。
147:デフォルトの名無しさん
09/04/12 22:15:49
本の書いてある通りにプログラムを組んだが、どうやってもランタイムエラーになってしまう。
誰か教えてほしい。
integer fulls,maxval,minval,sum,N,P
real avr
character subjct*30,FNAME*20
read(5,*) FNAME
open(1,FILE=FNAME)
read(1,*) sucjct,fulls
N=0
maxval=-9999
minval=fulls
sum=0
10 read(1,*,END=20) P
write(6,*) P
if((0.le.P).and.(P.le.fulls)) then
N=N+1
sum=sum+P
maxval=max(maxval,P)
minval=min(minval,P)
else
write(6,*)'Incorrect data! ignored'
end if
goto 10
20 close(1)
end
出典は、原田賢一 、2007:Fortran77プログラミング、サイエンス社 PP57
148:デフォルトの名無しさん
09/04/12 22:45:35
gfortran (mingw build, ver 4.4.0) で -fno-automatic が効いてないみたいなんですけど
これって既出ですか?
以下再現するコードと実行結果です。
C------ a.f ------
program main
call test
call test
end program main
subroutine test
write(*,*) i
i = i+1
return
end
C-----------------
> gfortran -finit-local-zero -fno-automatic -oa a.f
> a
0
0
他のコンパイラ(g77 や ifort -save)だとちゃんと 0 1 と出力されます。
149:デフォルトの名無しさん
09/04/12 22:49:30
>>147
6行目
read(1,*) sucjct,fulls => read(1,*) sucbct,fulls
150:149
09/04/12 22:50:40
間違えた subjct ね
151:デフォルトの名無しさん
09/04/12 23:39:12
>>150
ありがたい。しかし、そこを直してもランタイムエラーが発生する。
コンパイラはSalfort FTN77だが、問題ないだろうか。
また、>>147で示した書籍で勉強した人はこの例題をどうしたのか良ければ教えてほしい。
152:デフォルトの名無しさん
09/04/12 23:46:11
>>151
入力ファイルと、エラーメッセージがないと教えようがないです
153:デフォルトの名無しさん
09/04/13 01:26:13
>>148
実はIntelFortranのwin32のdebug mode でも同じ問題がずっと存在しているw
releaseやx64ならおk。漏れはx64メインなのでバグレポートしてないw
ごめんな、スチーブ
154:デフォルトの名無しさん
09/04/13 01:37:10
スチーブww
155:デフォルトの名無しさん
09/04/13 01:59:50
>>151
>>152のいうとおり、入力データファイルや、エラーメッセージを見ないとなんとも
答えようがない。テキストも持ってないし。
ただ、エスパー的に推測すると、入力ファイルの最後の行で数値データの
最後で改行していないためだろう。処理系によるが、空行がないとEND=nnに
引っかからない。
あと、
>if((0.le.P).and.(P.le.fulls)) then
これは多分 (0.ge.P) ではないかと思われる。
入門テキストであることをかんがみるに、科目ごとの平均点を求めるプログラムだろうが
点数が負のテストは少しばかり酔狂すぎる。
156:153
09/04/13 02:03:34
ごめんw
>>148 の逆の問題だったかもしれない。
Automaticで0 clear を選択してもクリアされない。
157:148
09/04/13 20:49:55
>>148の現象ですがどうやら既知の問題だったみたいです。
URLリンク(groups.google.co.jp)
しょうがないのでしばらくはsave文つけて対応することにしました。
>>156
148のa.fを使って試してみたところ、
Linuxのifort 10.1でも再現しました。
$ ifort -zero a.f
$ ./a.out
0
0
$ ifort -g -zero a.f
$ ./a.out
5820432
5820433
158:デフォルトの名無しさん
09/04/13 22:32:07
>>152
>>155
>>147だが動かすことが出来た。読み込むファイルの場所を間違えた場所に保存して
いたのが原因だった。終わってみれば単純なミスで申し訳なく恥ずかしい限りだ。
ただ、自分としてはFortranについて多くのことを学べた。ありがとう。
159:デフォルトの名無しさん
09/04/14 01:04:12
初歩的な質問かもしれませんが・・・
Intel Fortran+Visual studio2005でOpenMPを利用して
ライブラリなどがインストールされていない環境でコンパイルしたプログラムを走らせたいのですが
「libiomp5md.dllがありません」と出てしまって、走らせることができません。
ライブラリのない環境で使いたいとき、どのようにコマンドを指定すればよいのでしょうか。
160:デフォルトの名無しさん
09/04/14 10:50:58
ライブラリをstaticにリンクすればいいんでないの?
161:デフォルトの名無しさん
09/04/15 15:40:48
>>148
gfortranはなんか色々変わりすぎてて気に入らないので、自分はもうしばらく手を出すつもりはないなぁ
>>156
0 clearって-zeroオプションのこと?
-zeroはsaved属性でかつ初期化されてない変数を0にするものだよね
-automaticはローカル変数をスタックに置いちゃうから、-zero付けても初期化されないと思う・・・多分
>>157
-gってデバッグ関係だよね?
save効果もあるんだ
162:デフォルトの名無しさん
09/04/16 01:40:49
>>161
>0 clearって-zeroオプションのこと?
>-zeroはsaved属性でかつ初期化されてない変数を0にするものだよね
>-automaticはローカル変数をスタックに置いちゃうから、-zero付けても初期化されないと思う・・・多分
いや、32bit debugの時だけ変数0初期化が効かない。releaseではzero optionの有無で
0が出るか、ゴミが出るかが変わる。
最近、文法書を読んでいて知ったのだが、変数宣言時に初期値を与えると自動的に
SAVE属性になるそうな。漏れは、automaticなら、なんとなく毎回宣言時初期値に
初期化されるものだと思っていたよw
163:デフォルトの名無しさん
09/04/16 11:18:58
>>162
>いや、32bit debugの時だけ変数0初期化が効かない。
>releaseではzero optionの有無で0が出るか、ゴミが出るかが変わる。
じゃあやっぱりバグかぁ
>変数宣言時に初期値を与えると自動的にSAVE属性になるそうな。
そうそう、これ意外と盲点だと思う
164:デフォルトの名無しさん
09/04/18 20:23:47
今後、数百・数千CPU以上の並列計算になると、ファイル数を並列数分だけ分割するのは
管理上煩雑なので何とかしたいところですが、何か良い方法はないでしょうか?
例えば、今まで並列数分だけ分けていたファイルを1個のファイルにまとめ、
Fortran内でデータの場所(アドレス)を指定することで直接アクセスする
ようなことができれば、かなり便利だと思うのですが。
165:デフォルトの名無しさん
09/04/18 23:37:04
>>164
DIRECT ACCESS でだめなのか?
サイズが一定でないと困るが
166:デフォルトの名無しさん
09/04/19 14:15:43
>>164
MPI2にそんな機能があったような
167:164
09/04/19 20:21:55
>>165
directアクセスの存在を始めて知りました。
レコード長を把握しておく必要はありますが、効率は良さそうですね。
実際の使い方としては、recl指定子の値をデータの最小サイズで与え、
読みたいレコードの位置を逆算してread文のrec指定子に与える、
という方法で合っていますか?
>>166
なるほど。ということは、Fortranの実装とは別の機能を用いる方法もある、
つまりやり方は色々ある、ということでしょうか。
168:164
09/04/19 20:54:59
>>167の補足ですが
>recl指定子の値をデータの最小サイズで与え、
と言うより、そのファイルを作ったときのwrite文のreclと同じ値をread文のreclに与える、
と言ったほうが適切でしょうね。
あと、使っていて気づいたことなのですが、statusを指定せずにopenしてwriteする場合
sequential・・・いったん元のファイルを消した上で書き込み
direct・・・ファイルのレコード位置に対する書き込み
という違いに気をつけないといけませんね。文法的に正確に書けば
sequential・・・強制的にstatus='replace'
direct・・・ファイルがあればstatus='old'、なければstatus='new'
でしょうか。
169:デフォルトの名無しさん
09/04/20 17:42:55
ちょっと質問というか確認
ディスクがフラグメンテーションしてる場合、データの分断を許すような
実装だと、ディスクへのアクセスはアドレスのテーブルみたいのを参照
しながらじゃないと原理的にできないよね
フラグメンテーションしててもデータの分断を許さないような実装なら、
ディスクスペースの使用効率は下がるかもしれないけど、テーブル参照が
不要になるからアクセスが速くなるはず・・・だよね?
速度を要するスパコン用のファイルシステムって、そういう実装なのかなぁと想像・・・
170:デフォルトの名無しさん
09/04/20 23:17:11
>>167
ダイレクトアクセス知らなかったのか。
>直接アクセスする
とか書いているから知ってるかとw
昔の映画のコンピュータで磁気テープがグルグル回っているのはダイレクトアクセス
ファイルを読み書きしているんだべなぁ。
171:デフォルトの名無しさん
09/04/21 03:39:52
テープが
今で言う、ディスクとメモリの両方を兼ねてたからね。
ほんのちょっと前にFACOMのやつにテープはめるのをした。
あれ、テープのはしっこを挿入口に近づけると空気で吸い込んでくれるのね。
人間の手で全部とりまわさないといけないのかと思ってたよ。
172:164
09/04/22 15:52:56
>>170
不勉強故、失礼しました。
ところで、磁気テープというのは今も使われているものなのでしょうか?
今、20半ばの院生ですが、テープというのを見たことがありません。
173:デフォルトの名無しさん
09/04/23 01:43:48
fortranで円やら球を離散化?させたい。
円の場合
function X(a)
X=cos(3.14*a/360)
end
function Y(b)
Y=sin(3.14*b/360)
end
こいつを回せば、円をつくることはできる。でもXは小数点の数字になっているよね。
でもやりたいことは、2次元配列を作成して、F(x,y)のx-yのメッシュの中で
円を作成するには、x-yは整数である必要がある。どうすればいいの?
わかる人いますか?
この円・球構造について、拡散方程式やら偏微分方程式を解きたいと思っているんだけど、
こういうことってできますか?
174:デフォルトの名無しさん
09/04/23 03:11:15
すなおに極座標なり円柱座標にするがよろし
175:デフォルトの名無しさん
09/04/23 06:57:36
>>173
メッシュが正方格子でなければならない理由はあるんかいな?
Yesならメッシュを細かくするしかないなぁ・・・
節点座標値が整数でなければならない理由はないと思うょ
176:デフォルトの名無しさん
09/04/23 09:04:46
球や円を特徴的な構造として持つ系にカルテジアンを無理矢理持ち込むのは無理があるにょ
ギザギザがでるし、30度とか45度回転させた初期値境界値で同じ計算すると結果が結構違うにょ。
査読受けたら絶対そこを突っ込まれるにょ。
んで満足いく事例を出せなかったらそこで終わりにょ。
学部生より上なら極座標なり175の言う通り非構造格子にしてきちんとするのがいいにょ。
学部生なら、卒研としてならまあ許されると思うにょ。・・・Fortranと関係なかったにょ。
177:デフォルトの名無しさん
09/04/24 00:48:54
>>173
どうしても直交座標にしたいなら、かなり細かくメッシュを区切って、
計算結果にある値をかけて、整数にするとか。
新しく買ったCorei7で計算させたら、滅茶苦茶速くてびっくりした。
PenMのノートで10分かかる計算が1分で出来て、しかも8個同時に走らせても余裕。
64bitOSを積んだから、というのもあるのかな。
178:デフォルトの名無しさん
09/04/24 05:33:49
>PenMのノートで10分かかる計算が1分で出来て、
まあ、これはそうだろうなあ。
>しかも8個同時に走らせても余裕
へえ。よさそうだね。
余裕、というのは「一個の時のまあ8割くらいのスピードで8個とも動く」くらいなの?
179:デフォルトの名無しさん
09/04/24 16:38:50
>>175 メッシュが正方格子でなければならない理由はあるんかいな?
教官から貰ったコードが正方格子のだったけど、
変更できない、とかかな?
そもそも173のやりたいことがいまいちよくわからない。
Fortranとは関係ないし、ここまでかな
180:デフォルトの名無しさん
09/04/25 00:30:02
>>178
特に並列化をしていない(というよりも、並列化がうまくいかなくて結局諦めた)ものを走らせると
大体16%ぐらいのCPU使用率になるから、
8個ぐらい走らせると100%使い切るようになるからね。
この使用率からすると、たぶんそれぞれ8~9割で動いているといったところかな。
うまいこともっと最適化できないかな・・・。
181:デフォルトの名無しさん
09/04/25 00:40:55
>>180
物理CPUは4個だろうから、よほど例外的な場合でなければ多分4つより大だと帰って遅くなるだろう。
182:デフォルトの名無しさん
09/04/25 14:40:15
178です
>>180
ありがとう。
少なくともOSが認識する使用可能なリソースはフルに使い切れるんだね。
>>181
Xeonの2コアが4つ乗ったマシンでOpenMPを走らせると
きれいに8倍になってくれたけど、これとはまたいろいろ設計が違うんだろうな。
183:デフォルトの名無しさん
09/04/26 01:08:12
>>181
よく考えたらそうだよなあ…
実際時間を計ってみたら、8個計算の時間 / 2 > 4個計算の時間だし。
ただ、実際には数百から数千個計算するし、それぞれ条件が違うから時間もバラバラで、
その待ち時間を埋めるために、まとめて計算するほうが速かったなあ。
プログラム内でうまく並列化をしてフルに使い切れればいいけれど、なかなかうまくいかないんだよな…。
OpenMPをコマンドを入れたら、かなり遅くなったし。
184:デフォルトの名無しさん
09/04/26 11:27:08
>>183
なるほど~。
どちらかというとたくさんある計算をぼんぼん
放り込んでおける、事がメリットなのかもね。
そうなるとqueueの管理の仕方がみそ?
185:デフォルトの名無しさん
09/04/26 13:12:42
>>183
Corei7は、物理4コアをハイパースレッディングで見かけ8コアにしている。
純粋に計算などが重い場合ハイパースレッディングは足を引っ張るだけ。
そのばあいは4スレッドで動かすほうがいい。
MKLのLinpackのBenchmarkをやってみるとどのくらい遅くなるかわかる。
OpenMPのオプションでスレッド数を物理コア数に合わせるようにすると本来の力を発揮する。
あるいはBIOSでハイパースレッディングを切るとかいう手もある。
ただハイパースレッディングが有効な場合もあるので、個別の事情に依る。
自分で試すしかない。
186:デフォルトの名無しさん
09/04/26 15:36:02
MPIなりOpenMPで4並列のジョブを放り込んだばあい、
ちゃんと1プロセス/1CPUにふってくれるのかな?
187:デフォルトの名無しさん
09/04/26 23:50:26
>>186
いや、なんか環境変数にそれなりの指定をしないと、1スレッド1物理プロセッサに
必ず行くとは限らないので遅いまま。
OpenMPのマニュアルの環境変数のところを読めば書いてあったはずだが、
詳しくは忘れたw
188:デフォルトの名無しさん
09/04/27 12:50:57
なるほど・・・。
どちらかというと、dplace や mpirun みたいな並列実行の環境を調えるソフトの
とりあつかう領域だね。dplaceだと
dplace -c1,3,5,7
かな?実機でもってるわけでもないし、いまマニュアルが見れないからわかんねw
HTがあると並列しながら、ふつうの文房具的にPCやWSを使えるわけだから
使い方次第では結構いいかもなあ。
189:デフォルトの名無しさん
09/05/02 11:50:18
冗長な部分があってもいいから現在使っている配列の全てをバイナリに書き出して計算の中断ファイルを
作りたいんですけど、書き出す配列を全部列記する以外に楽な方法ってないでしょうか?
190:デフォルトの名無しさん
09/05/02 19:37:29
>>189
もう一回計算しなおせ!w
データを後生大事に取っておくのは演算コストが高かった時代の名残。
むろん演算量にもよるがw
191:デフォルトの名無しさん
09/05/02 20:33:05
>>189
目的がよく分からないんだけど
コード中の全ての配列をはき出すってこと?
192:デフォルトの名無しさん
09/05/02 22:53:03
>>189
行列がスパースなら,非ゼロ項を書き出すことにすれば,ちょっとはマシな気がする。
193:デフォルトの名無しさん
09/05/03 04:00:14
>>189
配列の全ての成分を書き出せば良いのであれば
integer a(1:10000)
real b(1:100,1:100)
write(10)a,b
とかではダメか?
194:デフォルトの名無しさん
09/05/06 06:16:46
>>190
デバッグとかあるし。
大型計算機とかだと、1計算の時間上限があるからね。
再開するのに必要な情報を全部ファイルとして書き出す選択肢は
持っていた方が良いと思うにょ。
>>193
それがいちばんだね。
書式指定無しでファイルにたたき落とす
違うシステムでは役に立たないけど、メモリの内容をそのままファイルに落とすので
書き込みも読み込み+計算再開も速い。
書式付きもできるけど、めちゃくちゃ遅いし。
195:デフォルトの名無しさん
09/05/08 14:33:24
>>194
デバッグ目的以外で、メモリの中身を全部ダンプする必要性が分からないんだが・・・
今時の計算は反復計算などの単純なループ部が計算のほとんどを占めてて
ループ開始前の前処理なんて全体から見れば知れてるわけで、
次回リスタート用のためにわざわざメモリのスナップショットを取る的な発想は今時ないでしょ。
メモリとストレージの速度差が開く一方の今日じゃなおさら・・・・
196:デフォルトの名無しさん
09/05/09 04:28:25
理由は194が最初に書いてね?
195はあまり大きな計算はしたことがないんだろうな
197:189
09/05/09 15:11:48
遅くなりました。
あー…書き方があいまいですいません、答えてくださった方ありがとうございます。
えと、粒子法的計算なんですけど、191さんがおっしゃっている通りです。
コード中のすべての配列をはきだしたいです。
193さんのやり方は当然わかりますけど、それだとwriteの後に吐き出したい配列を
列記しないといけませんよね。そういうの無しで全配列をばーっと吐き出す方法ないかな、
と思ったわけです。やっぱ使う配列をコツコツ列記するしかないみたいですね。
>>195
非定常計算なんで状況によっては計算途中の段階から少しだけ条件を変えて
計算したいとかあるんですよ。正直にやったら一週間近くかかるので。
198:デフォルトの名無しさん
09/05/09 16:24:49
>>197
質問がひどすぎw
まぁベンダー拡張命令でメモリー全ダンプみたいなことが出来る機種もあった気がするw
199:195
09/05/09 16:47:04
自分には>>189の理由がいまだに分からん・・・(別に分かんなくてもいいけどさ)
たしかに、スパコンでは数日~1週間程度の計算しかしたことない。
大きい計算とは言えんか。
スパコンのジョブってたいてい時間制限が数時間のオーダーだから、
例えば30000ステップ計算したいとしたら3000ステップのジョブを
10回投げるってのが普通だよな。
粒子法はよく知らないけど、格子点はどんくらいなの?
200:195
09/05/09 16:49:29
あ、粒子法ってメッシュないんだっけか?
粒子数だっけ?
201:デフォルトの名無しさん
09/05/09 16:54:07
背景場を途中から変えた計算をしたいのかな?
普通は計算再開に必要な変数の数(配列の大きさではないよ)って知れてるよね。
粒子法なら、粒子の位置・速度と経過時間くらいか。
あとはiterationのプロセス毎に計算する量や座標系のように
再生成に計算量のかからないものがほとんどだろうから、
それをとっておく必要はないし。
ふつうに193のやり方で落とせばいいんじゃね?たいした手間でもなし。
ところで、ダンプして落としたとして、変数の変更はどういう風に再開時に反映させる
つもりだったんだろうか?
202:デフォルトの名無しさん
09/05/09 16:59:47
>>199
同意。細切れ計算するときに継承すべき情報はあるけど、ダンプする理由はないやね。
ふと、189の「配列全部」は別にダンプではないのでは、と思ったけどオイラの勘違いかな?
203:デフォルトの名無しさん
09/05/09 17:01:58
読み返すと、「ダンプ」を最初に使ったのは195さんだw
204:195
09/05/09 17:17:34
ダンプっていうのは大げさでしたなw
イメージ的に使ってしまった
205:デフォルトの名無しさん
09/05/09 17:55:35
無料のfortran77向けのコンパイラで、高速なものはありますか?
用途はCFDです。
まあ趣味なので大きな計算は必要ないのですが。
206:デフォルトの名無しさん
09/05/09 23:52:54
fortran歴1週間の質問です
論理型を整数型その他に変換できますか?
例えば、いくつかの言語では
(a>b)
等とすると0または1が得られますが
これと同等なことをFORTRANでも行いたいのですが方法がわかりません
無理ならすんなり諦めます
207:デフォルトの名無しさん
09/05/10 00:55:29
>>206
一般的な回答としては、できない。
不可能ではないという意味では、IF THEN ELSE でやれば出来る。
意図しているイメージに一番近いだろうと思われるのは、TRANSFER関数で型変換をすること。
しかし、FORTRANの規格では論理型の内部状態を定義していないので
0/1に投影できるかは運しだい。普通は0/-1が多い(真:ビット全部0と偽:ビット全部1)。
208:デフォルトの名無しさん
09/05/10 01:51:22
>>207
早速ありがとうございます
何となくですができました
209:デフォルトの名無しさん
09/05/10 05:17:13
logical lonlon
real a, b
a=1.0
b=2.0
lonlon = (a .GT. b)
write(*,'(i3)') lonlon
なるものをつくると、
最後の行で型が合わないと怒られる
0がでてくる
1がでてくる
-1がでてくる、
の4パターンあったw
危険だw
210:デフォルトの名無しさん
09/05/10 21:13:40
g77のよく使う高速化のためのコンパイラオプションを教えてくださいませんか。
それかコンパイラオプションをまとめているサイトないですか?
gccのまとめを見ればよいのでしょうか?
211:デフォルトの名無しさん
09/05/10 21:18:17
>>206
どういう用途?
論理型が用意されてる言語なら、特に理由がない限りそういうマネはやめたほうがいいかと
シェルスクリプトレベルならよくやるけどさ
212:デフォルトの名無しさん
09/05/10 21:34:28
>>210
まずググれ。話はそれからだと思う。
213:デフォルトの名無しさん
09/05/11 01:13:00
でも、コンパイラのドキュメントしっかり読んで全部の仕様を熟知してる人なんて、ほとんどいないよな
こんなオプションあんだ・・・でも何に使うんだろ、ってのばっかだ俺w
214:デフォルトの名無しさん
09/05/11 12:22:05
論理型と整数型の混用は、非常に有用な場合もないではないけど、
基本的にはやるべきでない。
215:デフォルトの名無しさん
09/05/11 20:00:38
ちょっとインチキして
logical:: L(1)
L = (2.0 < 1.0)
write(*,*) count(L)
L = (1.0 < 2.0)
write(*,*) count(L)
とか
216:デフォルトの名無しさん
09/05/11 20:37:43
>>214 バグの元じゃない?
217:デフォルトの名無しさん
09/05/11 20:53:39
>>216
3つの条件abcのうち2つ以上が真なら、という場合に、
a = 条件式
b = 条件式
c = 条件式
if (a + b + c >= 2) ...
とか。Cの場合だけど。
218:デフォルトの名無しさん
09/05/11 21:39:08
後でメンテする時、無駄に手間食うからそういうのやめてくれ~
219:デフォルトの名無しさん
09/05/11 22:35:22
1960年代のおばあちゃんの知恵というかライフハックw風のプログラムだな。
220:デフォルトの名無しさん
09/05/13 02:46:28
>>218
4つの式が近くの行にあればいいけど、すごい離れた所にあるといろいろ嫌だよね
221:デフォルトの名無しさん
09/05/22 20:21:01
LOGON TSS
222:デフォルトの名無しさん
09/05/22 22:46:55
>>221
READY
223:デフォルトの名無しさん
09/05/22 23:18:35
Intel Fortran 10 を使っています。
ifort独自文法のform='binary'でファイルを開いてデータ出力しています。
そのファイルはC言語のファイルフォーマットが公開されているんですが、
unsigned int となっている部分をifortで出力する方法がわかりません。
この部分だけC言語で記述して呼び出す形ならできそうな気がしていますが、
Fortranだけで完結させる方法ってありますか?
アドバイスよろしくお願いします。
224:デフォルトの名無しさん
09/05/23 01:55:11
>>223
32bitのunsighned int?
読み込みのほうはINTEGER*4 でうけて、それをINTEGER*8にTRNASFER関数で
適当な位置にコピーするか、出力サブルーチンを作って負数の場合は
INTEGER*8でUINTの場合の数を求めて出すという方法が考えられる。
225:デフォルトの名無しさん
09/05/23 12:05:07
倍精度の変数宣言だけど、
real(8) a
double precision a
どっちやねん、と思ってた。
先日規格を見たら後者だったので、ウヒー!
今後は全部後者で統一する。行が長くなって、チョトいや。
226:デフォルトの名無しさん
09/05/23 12:13:09
>>225
どっちでもいい。後者は昔風の書き方。
今はむしろ前者が主流だと思う。
227:デフォルトの名無しさん
09/05/23 12:40:28
>>226
うーん、こんなHPもあるからなぁ・・・
4.1 Fortranのデータ型
URLリンク(www.nag-j.co.jp)
コードを見られる可能性がある案件は、規格にならった方が
よさそうな気もする。
228:デフォルトの名無しさん
09/05/23 17:17:01
>>227
それは、規格違反ということを意味しているわけではない。
KIND種が規格で決められていないためにベンダー依存になっていることを
問題視しているのだろう。
kd = SELECTED_REAL_KIND(14) とかで、8などの定数べた書きをやめてkdなどに
すれば避けられる。
規格の整合性としては REAL ([KIND =] n) の方が統一的でいいとおもう。
4倍精度が大概のコンパイラでサポートされつつある現状を考えると、REAL(n)の
形式にそろえておいたほうが将来的にものぞましいのではないかと思う。
229:223
09/05/23 20:23:06
>>224
回答ありがとうございます。
詳しくないですが、32bitです。
各bitにどうデータが並んでいて、、、ってのを学ばないと難しそうですね。
ちょっとがんばってみます。
230:デフォルトの名無しさん
09/05/23 20:51:52
>>227
むしろreal*8が普通だと思ってた。double precisionはむしろ非推奨って話も聞いたことあるぞ。
>>227のnagのページは全部鵜呑みにして良いのか甚だ疑問だわ・・・
つーか、この問題の責任は100%規格にあるだろう。規格作ったやつ出てこい!
231:デフォルトの名無しさん
09/05/23 22:29:44
>>228
module xx
integer, parameter :: kd_re = selected_real_kind(16)
:
programm yy
use xx
real(kd_re) a
みたいな感じかな? 一理あるね。
>>230
JIS X3001-1に
『DOUBLE PRECISION型指定子は、組込みの
倍精度実数型のデータ要素を宣言するのに用いる』
とあるから、非推奨ってこともないだろ。
232:デフォルトの名無しさん
09/05/23 22:45:57
詳しくは覚えていないが・・・・
FORTRAN66までは倍精度宣言は DOUBLE PRECISION
だけだったのだが、その後の流れで FORTRAN77では REAL*8
Fortran90でREAL([KIND=]8)の形が出てきて、だんだんと
REAL([KIND=]8)の形に統一しましょうという流れだと思う。
>>230
Fortran90策定の頃は、ベンダー毎にアーキテクチャーも数値フォーマットも
文字コードもバラバラだったのでこのくらいは許してやってくれ。
233:デフォルトの名無しさん
09/05/23 23:03:22
やっぱKIND使った方がお行儀がいいのかなぁ
書き直すのマンドクサイっす
・・・あんま移植性に拘りすぎるのもどうかと思うけどね。どうせみんなインテ(ry
234:デフォルトの名無しさん
09/05/27 00:52:40
FORTRAN77では、いくつかのサブルーチンの間で共通の定数を使うとき
それぞれのサブルーチンで何回も同じ宣言をしなければいけないのですか?
このままだと定数の値を変えるのが非常に面倒なので
一回の宣言で済む方法を知りたいです
235:デフォルトの名無しさん
09/05/27 01:05:33
>>234
定数宣言だけのファイルを1つ作って、各サブルーチンの先頭でINCLUDEする。
FORTRAN77の規格外だが大抵のコンパイラはINCLUDE文に対応している。
236:デフォルトの名無しさん
09/05/27 01:08:13
>>234
PARAMETER文を用いてなら、標準では無いw
COMMON 変数でよければ BLOCK DATA 文で初期化できる。
ベンダー拡張機能を許せば、INCLUDE を使う手もある。
まぁ、横着せずにラインエディターで一括変換すればよろしいw
237:デフォルトの名無しさん
09/05/27 01:10:53
ありがとうございます
とりあえずINCLUDE使ってみます
238:デフォルトの名無しさん
09/05/27 01:11:05
>>234
モジュールでもいいぞ
239:デフォルトの名無しさん
09/05/27 02:04:13
>>238
奴はFORTRAN77と縛りを入れている。
240:デフォルトの名無しさん
09/05/27 13:47:45
>>236
entry文を使えば、何とかならない?
241:デフォルトの名無しさん
09/05/27 14:16:15
とくに理由がない限り、77からはさっさと足を洗った方がよくない?
242:236
09/05/27 23:27:51
>>240
たしかにENTRY文という手もあったな。
COMMONが嫌で、グローバル変数を実現する代わりに使ったことがあったが、
やっぱ変数全部がグローバルになるせいでデバッグが面倒で
よほど特殊な場合意外はやめたほうが良いと思った。
243:デフォルトの名無しさん
09/05/31 15:35:51
みなさまのお力をお借りしたく。
#FAQならすみませんが、ご容赦ください
IVF10.1(11でも)動作したソースを、Linux上のintelに持ち込んでコンパイルしました。
すると、以下のケースに分かれました。
1)あえてコード変換をせずにコンパイル
コンパイルOKも、当然、表示は滅茶苦茶(要するに2バイト系がだめ)
2)SJIS->UTF8にしてコンパイル
FORMAT文の箇所でエラー発生、これがどうしても直らない。
ちなみにエラーメッセージは以下の通りです
244:デフォルトの名無しさん
09/05/31 15:37:35
test.for(14): error #5120: 終了していない文字定数です。
*//' ... ログ出力ファイルを入れて')
--------^
test.for(14): error #5082: 構文エラー、END-OF-STATEMENT が見つかりました、 <FORMAT_ELEMENT> <FORMAT_INTEGER> < ) <CHAR_CON_KIND_PARAM> <CHAR_NAM_KIND_PARAM> ... の 1 つを指定してください。
*//' ... ログ出力ファイルを入れて')
----------------------------------------------------------------------------------------^
このソースは、
100 FORMAT(//' *** test を始めます。***',
* //' ... ログ出力ファイルを入れて')
です。
他にも日本語からの問題なのでしょうか、"認識できないトークンを'?'をスキップしました"というエラーもでます。
なおf77でも同様で、この場合には、
Error on line 14: unbalanced quotes; closing quote supplied
Error on line 14: unbalanced parentheses, statement skipped
となります。
お気づきの点があれば、すみませんが、ご指摘ください。
よろしくお願いいたします。
245:デフォルトの名無しさん
09/05/31 16:06:32
>>244
a) kterm上でトライ
b) 使ってる全角文字の中に ' ) あたりの半角と同じ値が混じっている
くらいしか思いつかないや。
少なくともf77のケースでのエラーはb の事を言ってるみたいだけど。
英数字以外は使わないのが一番だけどなあ~。どうしても使いたかったら
character*2 zenkaku
read(*,*) zenkaku
write(*,*) ichar(zenkaku(1:1)),ichar(zenaku(2:2))
で全角一文字の対応する半角2文字のアスキーコード数がわかるので、強引に出来そうな気もするけどな。
winだと実際上の3行の部分は動くとおもうけど、linuxだとよくわからんね。
linux + fortran+ 2バイト全角文字 の話題はあまりお話を聞かないからうまく行ったらここにも報告してよ。
246:デフォルトの名無しさん
09/05/31 17:12:19
早速ありがとうございます。ひとつ確認しましたので、ご報告をば。
a)kterm
Ubuntu9.04にてktermを入れて、確認。
・UTF8はコンパイル時、文字化け?でダメ
・同じくSJISもだめ
・eucではifortでのコンパイルメッセージの出力が化けている(どれでも同じ??)状況でしたが、実行時は日本語出力OK
でした。
となるとintelFortranのインストールもkterm上から行う方がよかったのか?
まだすべての確認はできていませんが、うまくいきそうという報告まで。b)も後日、試してみますので結果を報告致します。
247:デフォルトの名無しさん
09/05/31 17:36:04
あ、追加。
うまく表示できているのは、kterm上で、の場合。通常のconsoleでは(当然っちゃぁ当然ですが)化け化けです。
248:デフォルトの名無しさん
09/06/01 08:32:25
おつ~。やっぱりktermがいいのね。
245のbのやつは、対で使われることが多い文字
(ichar()関数の返す値が
' が39、Hexでは27
" が41、Hexでは29
) が93、Hexでは5D
] は34(これはFortranではあまり意味がないか・・)
のようなやつ)が全角に混じってるとダメそうな気がする、という程度の意味で書いてみた。
でも、win版やktermインストだと大丈夫なんだよね。
246さんの意見のとおり、インストール時の設定その他に依存する部分が大きそうな気もするな。
249:デフォルトの名無しさん
09/06/01 18:51:56
文字化けの件、追試結果(w
まだf77は試してませんが、どうやら文字コードは確かに影響してるっぽい。
問題はUTF-8で、どうも旧人なので勝手に2バイトと思い込んでましたが、現在は最大4バイトらしい。
このため、見かけ上、1行内では2バイト換算で70文字程度にしていたものがオバフロしていた模様。
よってifortでは、-FI -132という固定ながら132文字にしたら通りました。
いったい何をしていたんだ…わしorz
ちなみにIVFでUTF8形式でソース保存して、それをWin上でコンパイルしたら妙なゴミが出てました。
結構コード問題は奥が深そうです。
250:デフォルトの名無しさん
09/06/01 23:28:41
>>249
知ってる人のような気がする......
tt
251:デフォルトの名無しさん
09/06/02 01:58:37
> 問題はUTF-8で、どうも旧人なので勝手に2バイトと思い込んでましたが、現在は最大4バイトらしい。
なか~まw
そっか、UTFだとエディタの見かけより実際のはるかに長いんだね。試しに
vi でてきとうにUTF使ったファイル開いたら、たしかに row 数が多い。
気を付けよう。
252:デフォルトの名無しさん
09/06/02 10:58:03
Intel Fortran の使える KIND を関数呼び出しで見ると、ASCII だけになってたような。
確認してないw
253:デフォルトの名無しさん
09/06/04 23:06:43
モンテカルロ法の計算プログラムを流したら、
FORTRAN I/O ERROR 913: OUT OF FREE SPACE
って出てきて途中で計算が止まったっぽいです。
なにやらメモリー不足とのことですが、どう解決すればいいのでしょうか?
254:デフォルトの名無しさん
09/06/04 23:47:02
>>253
ハードディスクを増設しろ!
255:デフォルトの名無しさん
09/06/05 00:14:43
>>253
I/O エラーだから、メモリーではなくディスクが足りないんだろう。
/tmp とかのスクラッチ領域がパンパンになっている可能性もあるが。
256:デフォルトの名無しさん
09/06/05 01:44:17
うほ
257:デフォルトの名無しさん
09/06/05 18:31:50
いや、I/O処理の最中に何らかのリソースが足りなくなったというメッセージだと思う。
URLリンク(www.uic.edu)
913 OUT OF FREE SPACE
Library cannot allocate an I/O block (from an OPEN statement), parse array (for formats
assembled at run-time), file name string (from OPEN), characters from list-directed read,
ISAM key descriptor, shared COMMON descriptor, variable-format descriptor, or file buffer.
The program may be trying to overwrite a shared memory segment defined by another process.
Allocate more free space in the heap area (see the beginning of this chapter); open fewer
files; use FORMAT statements in place of assembling formats at run time in character arrays;
read fewer characters; user fewer ISAM keys; use fewer shared COMMON areas; use fewer
variable-format expressions; or reduce the maximum size of file records.
258:デフォルトの名無しさん
09/06/06 03:03:47
無書式での読み書きも、そのスペースを食うのかね。
259:デフォルトの名無しさん
09/06/06 20:04:27
fortranの超絶初心者です。
以下のプログラムをexitを使わないで同様の結果を得るには、
どうすればいいのでしょうか?
ご教授願います。fortran90を使っています。
program
real :: r,a
integer :: io !入力結果の状態を表す変数
!
print *, 'CTRl-D を入力すると終了'
!
do while ( .true. )
read(5,*,IOSTAT=io) r
if(io /= 0 )then
exit
endif
a = 4 *3.141592* r ** 2
print *, r, a
end do
!
end program
260:デフォルトの名無しさん
09/06/06 20:16:43
>>259
1.歴史と伝統のGOTO文で抜ける。
2.READ文で END=nnn で抜ける。
だが元のままEXITで抜けるのがもっとも行儀が良いとされる。
261:259
09/06/06 21:28:47
>>260
授業の課題で、exitを使わないで書き上げろという事だったんですが・・・
どうも、ありがとうございました。
262:デフォルトの名無しさん
09/06/08 21:37:33
>>261
>exitを使わないで書き上げろ
exitで抜けるのが一番良いのに、何でこう言ったんでしょ?
263:デフォルトの名無しさん
09/06/08 22:28:50
世に蔓延るGOTO使いまくりのプログラムに慣れさせるため・・・ではないよな、多分。
READ文の指定子の使い方の勉強とかかな。
264:デフォルトの名無しさん
09/06/09 10:49:22
ここはFortranでプログラムを作ってという図々しいお願いはおk?
265:デフォルトの名無しさん
09/06/09 11:41:39
>>264
大丈夫。ただし、初心者にありがちな「エスパーさん、○○作って!」はやめて。
知っている情報をそのまますべて載せるべし。
266:259
09/06/09 16:56:11
>>262さん >>263さん
どうやら、説明が足りなかったようで、すいません。
今日授業に出たところ、
program
real ::r,a
integer ::io
print *,'CTRL-Dを入力すると終了'
do while (io==0)
if (io==0) then
read (5,*,iostat=io) r
a=4*3.141592*r**2
print *,'半径=',r,'面積=',a
end if
end do
stop
end program
が、答えだそうです。
でもこれを実行すると、CTRL-Dで終了するとき、
前回の計算結果が表示されてしまいます。
またまたすいませんが、何を付け加えればいいのでしょうか?
267:デフォルトの名無しさん
09/06/09 17:09:31
なんかアホらしい授業だけど。
program
real ::r,a
integer ::io
print *,'CTRL-Dを入力すると終了'
do while (io==0)
if (io==0) then
read (5,*,iostat=io) r
if (io==0) then
a=4*3.141592*r**2
print *,'半径=',r,'面積=',a
end if
end if
end do
stop
end program
どう考えてもexitを使うほうが素直だ。
268:デフォルトの名無しさん
09/06/09 17:11:10
ありゃ、間違えた。
program
real ::r,a
integer ::io
print *,'CTRL-Dを入力すると終了'
do while (io==0)
read (5,*,iostat=io) r
if (io==0) then
a=4*3.141592*r**2
print *,'半径=',r,'面積=',a
end if
end do
stop
end program
readをifの外側に出さないといかん。
269:デフォルトの名無しさん
09/06/09 17:20:58
ioの初期化も足りないし。ぐだぐだ。
270:デフォルトの名無しさん
09/06/09 20:24:17
exitの偉大さを実感すると言う狙いなのだろう。
271:デフォルトの名無しさん
09/06/09 20:31:01
蛇足だが >>259 の
do while ( .true. )
は
do
だけでおk
まあ、
do while (io==0)
に直させるためにワザと do while にしたのかもしれないが
272:デフォルトの名無しさん
09/06/09 21:52:10
do while (io==0)
if (io==0) then
たまにこういうセンスなさすぎなコード書く人いるよね
他人が書いたコードをメンテするはめになったときに、こういうの見ると何とも言えない溜息がでるわ・・・
たとえバグはないとしても
273:デフォルトの名無しさん
09/06/09 23:17:11
>>272
まぁ待てw
Fortran で WHILE を使おうとするだけでも、きわめて開明的な人物ではないか!
274:デフォルトの名無しさん
09/06/09 23:27:58
> if (io==0) then
これはどこがセンスなさすぎなん?
275:デフォルトの名無しさん
09/06/10 03:23:56
>>272 は「センス」って言葉を使いたかっただけなんだよ。
276:デフォルトの名無しさん
09/06/10 11:45:30
>>274
ループの脱出(継続)分岐条件である io==0 が
WHILE と IF の二箇所で判断されていることを言ってるんだろ。
>>272の態度はむかつかせるだけから、くだすれ的には反省すべき。
277:デフォルトの名無しさん
09/06/10 15:02:05
将来コードをいじったときにそのループをスキップする場合があることを考えて
do while (io .EQ. 0)
みたいなのは意図的に書くことはあるけどね。
というか、>>266 のは変数 io がゼロに初期化されることを
前提にしている時点であまりいい回答では無いように思うけどな。
278:259
09/06/10 16:33:09
>>268さん、>>271さん
どうも、ありがとうございました。
授業はどうもいまいちわかりません(笑)
これからも、ちょくちょく質問させていただきますので、
くだすれの皆さん、よろしくお願いします。
279:デフォルトの名無しさん
09/06/11 23:43:42
Visual Fortranについて質問してもいいですか?(VS2008スレよりもこちらのほうが適切っぽいので・・・)
VBやC#でVS2005を使ってたのですが、Intel コンパイラv11を買って
Visual Fortranを入れてみたところ、Intellisenseが効きません。
Visual Fortranでは使えないということですか?
これだとVSをFortran開発環境とする利点がかなり消えてしまうと思うのですが・・・
280:デフォルトの名無しさん
09/06/12 00:01:40
>>279
使えない。
そういうものがあることを知らなければ気にならないから、いますぐ忘れるんだ!
ただしPolyHedoronがLaheyFortran用のインテリセンスっぽい奴を売っている。
URLリンク(www.lahey.com)
281:デフォルトの名無しさん
09/06/12 00:46:40
>>280
そうですか・・・
計算はLinuxクラスタで走らすけど、開発は使い慣れたWindowsのVSで
っていう人を見たことがあって、それいいなぁと思って入れてみたんですが・・・
Laheyっていうの初めて知りました。intellisenseっぽいポップアップが出てますね。
これやNAGなど他の開発環境で良いのがないか当たってみようかなぁ
ちなみにNAGの↓の比較図ですが、他社製ってやっぱVisual Fortranですかね・・・(苦笑
URLリンク(www.nag-j.co.jp)
282:デフォルトの名無しさん
09/06/12 00:57:25
>>281
PGI Visual Fortran というのもあって、これもVSと統合されているのだが、
確か今は米国内の研究機関に所属していればただで使える。
アメリカの研究機関に知り合いがいれば(略
SalfordというかSilverFrostのFTN95もVSと統合できる。
しかし、PGIもSalfordもインテリセンスは無かったような気がする。
最新状況はしらねw
IntelFortranは今月中にF2003対応度が高まったv11.1で出るらしいので、
あわてずゆっくりしていってね。
283:デフォルトの名無しさん
09/06/12 03:33:59
>>282
色々ありがとうございます。
↓を見みると、SalfordのVS統合はintellisenseみたいなのがあるようです。
URLリンク(www.silverfrost.com)
というかこれ無料っぽくないですか?太っ腹すぎる・・・
PGIも、ざっくり見た感じIntel VFよりは機能が多そうですね。
試用できるようなので試してみます。
しかしIntel VFはせめてキーワード補完くらいあればいいのに・・・
性能第一で見やすさ・作りやすさは二の次ってことなんでしょうか(ある意味硬派?
284:279
09/06/12 21:26:08
さっそく以下の3つを試しました。
Silverfrost FTN95 Express
PGI Visual Fortran
NAG Fortran Builder
SilverfrostとPGIはVS組み込みタイプで、IVFと同じくintellisense等の高度なものはありませんでした。
それ以外も、パッと見特に違いはなさそうで、結局は好みの問題ということになるんでしょうか。
NAGのIDEはVS組み込みではなくオリジナルで、唯一これだけキーワード補完ができましたが、
変数や関数の補完は×でした。
うーん、こうなるとこのままIVFを使い続けたほうがよさそうです・・・
285:279
09/06/12 21:44:13
ググっていたところ、IntelのForumでどんぴしゃなスレを見つけました。
URLリンク(software.intel.com)
皆思うことは同じのようですねw
Steveおじさんも要望をよく理解してくれてるようですが、これまではVS2008への対応で
手一杯だったようです。MSが仕様をコロコロ変えることも妨げの原因だとぼやいてました。
結局、何が根本の原因なのかははっきりと書かれてませんでしたが、IVF以外のVS組込みIDEも
IVFと似たような現状なのを考えると、VS側のほうでAPIみたいな道具を提供してくれないと
Intellisenseのような高度機能は実装できない、ということなのかもしれません。
Steveさんが言うに、C++,C#,VBのVSで備わっていたこれらの機能が「Visual Studio Shell」
で分離されたので、Fortran上にも実装できそう、とのことです。
早くそうなって欲しいところですが、先月のスレへのSteveさんのレスを見る限り、もう少しかかりそうですね・・・
URLリンク(software.intel.com)
286:デフォルトの名無しさん
09/06/13 16:09:35
確かにfortranerの開発って時代遅れな感があるな
287:デフォルトの名無しさん
09/06/14 22:04:16
>>285
スティーブって森の熊さんホモ動画の熊さんの一匹に似てるよね。
288:デフォルトの名無しさん
09/06/15 22:36:44
Fortranの開発環境のヘボさにうんざりしてCに逃げる人も多いんだろうな
ただ、今後のトレンドを考えるとやはりCは…
289:デフォルトの名無しさん
09/06/15 22:46:01
紙テープ・パンチカード・ラインエディター上がりも多いFortran界では、スクリーンエディターで
シンタックス・カラーリングがあるだけでも極楽浄土のけだるい怠けた世界に見えるのさ。
290:デフォルトの名無しさん
09/06/15 23:20:51
これから並列数は増える一方だから、最適化は少しの妥協も許されなくなるんだよな
そうなるとFortran一択しかなくなる…
MSがVisualFortran出してくれれば(^q^)
291:デフォルトの名無しさん
09/06/15 23:30:16
>>290
っ [MS Fortran PowerStation]
292:デフォルトの名無しさん
09/06/16 00:33:41
>>291
そう、それをもう一度頼む!(><)
MSのFortran部隊はどこ行っちまったんだ?
293:デフォルトの名無しさん
09/06/16 00:49:49
>>292
Netscapeがブラウザー戦争を仕掛けたせいで、VC++部隊以外が全部IE開発に
回されたという噂が当時あった。
まぁMSの歴史をたどると、BASICの次に作って売ったのはFORTRANだから
MS Visual FORTRANは原点回帰といえなくもないが、VBすら捨ててしまうMS様は
容赦ないのだw
でも、高い金出してコンパイラ律儀に買ってくれるのはFORTRANユーザーくらい?
294:デフォルトの名無しさん
09/06/16 00:55:45
>>292
MS → DEC → Compaq → Intel
295:デフォルトの名無しさん
09/06/16 13:53:00
>>294
MSからDECに流れたとはしらなんだ
IntelとMSがもっとみっちり連携してくれればいいんだけど、またWintelって非難が起こりそうだな
296:arrayの地獄
09/06/16 22:24:17
時間がかかって仕方ないのだが何とかなりませんか?
ifort 9.1です。
real(8)::x(25,25),y(50,50)
x=なんたら
y=0
y(1:25,1:25)=x(1:25,1:25)
y=cshift(y,12,1)
y=cshift(y,12,2)
特にy=xのところ。
なんでこんなんに時間食う??
(メモリ書き込みに難儀してるのはわかるが、
y全体がキャッシュ上に乗るから、キャッシュで整えてから書けば時間かからんはず・・)
297:デフォルトの名無しさん
09/06/16 22:27:38
>>296
それだけじゃ分からんっつの
時間食うってどれくらい?
298:arrayの地獄
09/06/16 22:46:24
92x49回で数秒のオーダー
@xeon5160? 1core使用
なんかおかしいな・・もうちょっと調べます。
299:デフォルトの名無しさん
09/06/16 22:49:48
ド初心者ですが質問です。コンパイルできたファイルを実行すると
fmt: end of file
apparent state: unit 10 named inp-2.dat
last format: (F9.5)
lately reading sequential formatted external IO
となるのですが何が問題なんでしょうか?プログラムは外部データ(inp-2.dat)から数値を読み最大値を求めるものです
数値は実数です
300:デフォルトの名無しさん
09/06/16 22:56:05
>>296
>y(1:25,1:25)=x(1:25,1:25)
なぜ素直にy=xとしない。
多分
ALLOCATE(TMP(26,26))
TMP=x
y=TMP
DEALLOCATE(TMP)
のように展開されるから遅いんだろ。
301:デフォルトの名無しさん
09/06/16 22:59:20
>>300
TMP(25,25)だったw 0:25と勘違いしたよ。1:25とか俺的にはあり得ないw
>>299
データ数が足りないように見受けられる。
F9.5に当たるところでデータが足りないか、変数の数が合わないかしてるのでは?
302:296です。
09/06/16 23:06:23
[hoge@xeon prog20]$ cat test.f90
program test
implicit none
integer,parameter::nx=25,ny=50
real(8)::x(nx,nx),y(ny,ny)
integer::i
x=reshape((/1:25*25/),shape(x))
do i=1,100000
call sub1(x,y,nx,ny)
call sub2(x,y,nx,ny)
end do
end program test
subroutine sub1(x,y,nx,ny)
implicit none
real(8)::x(nx,nx),y(ny,ny)
integer::nx,ny
y=0
y(1:nx,1:nx)=x(1:nx,1:nx)
y=cshift(y,12,1)
y=cshift(y,12,2)
end subroutine
subroutine sub2(x,y,nx,ny)
implicit none
real(8)::x(nx,nx),y(nx,nx) !nyでなくnx
integer::nx,ny
y=0
y(1:nx,1:nx)=x(1:nx,1:nx)
y=cshift(y,12,1)
y=cshift(y,12,2)
end subroutine 続く
303:デフォルトの名無しさん
09/06/16 23:07:10
>>301
データ数ですか。それは入力元のファイルの値に問題ありということですか?プログラムは
IMPLICIT REAL(A-H,O-Z)
DIMENSION X(100)
OPEN(UNIT=10,FILE='inp-2.dat',STATUS='old',FORM='FORMATTED')
OPEN(UNIT=11,FILE='list-2.dat',STATUS='UNKNOWN',FORM='FORMATTED')
READ(10,100)N
DO 20 I=1,N
READ(10,200)X(I)
20 CONTINUE
IMAX=0.0
DO 30 I=1,N
IF(X(I).GT.IMAX)MAXN=I
IF(X(I).GT.IMAX)IMAX=X(I)
30 CONTINUE
WRITE(11,300)'MAX=',IMAX,'NO.=',MAXN
100 FORMAT(A5)
200 FORMAT(F9.5)
300 FORMAT(A4,F10.5,A4,I3)
CLOSE(10)
CLOSE(11)
STOP
END
となってます。サンプルプログラムを改変しただけなのでおかしいところが多いと思います。入力ファイルはとりあえず実数を5つ縦に並べてあります
304:296です。
09/06/16 23:07:11
[hoge@xeon prog20]$ ifort test.f90 -p
[hoge@xeon prog20]$ time a.out
real 0m2.359s
user 0m2.357s
sys 0m0.002s
[hoge@xeon prog20]$ gprof -b
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
71.83 1.53 1.53 100000 0.00 0.00 sub1_
28.17 2.13 0.60 100000 0.00 0.00 sub2_
0.00 2.13 0.00 1 0.00 2.13 MAIN__
305:296です。
09/06/16 23:13:31
みにくてすみませんでした。
CPUはcore2の6600 2.4Gでcashe=4Mでした。
yとxの寸法が違うので、y=xにできないはずです。
逆フーリエ変換にかけるとき外を0にしておきたいので、
こんなになっています。
実プログラムでは逆フーリエ変換にかかる時間と
同じくらいの時間がかかって大損しています。
306:296です。
09/06/16 23:18:31
まとめると、
y(1:25,1:25)=x(1:25,1:25)
を100000回実行すると、
real(8)::x(25,25),y(50,50) のとき =>1.53秒かかる。
real(8)::x(25,25),y(25,25) のとき =>0.60秒かかる。
2.5倍もかからんでええやろ
ということです。
307:296です。
09/06/16 23:27:05
>>299
私もできる範囲で手伝い。
100 FORMAT(A5) が気になります。
実際に実行させたらNにどんな値が入るでしょうか?
思っている値かどうかwrite文で確かめるのが吉かと思います。
308:デフォルトの名無しさん
09/06/16 23:32:44
>>307
このままだと実行すらできないんですよね・・・
READ(~)N のあとに
N=5 としてみましたが実行エラーの文は変わりませんでした
309:デフォルトの名無しさん
09/06/16 23:40:27
>>296
corei7のifort 11ですが
$ cat test.f90
integer,parameter::n=25
real(8)::x(n,n),y(2*n,2*n)
x=0
y=1
!y=x
y(1:n,1:n)=x(1:n,1:n)
end
$ time ./a.out
real 0m0.001s
user 0m0.000s
sys 0m0.001s
n=25000だと
real 0m1.974s
user 0m0.754s
sys 0m1.217s
何か環境おかしいんじゃないんでしょうか?他のホストで試したどうっすかね
310:296です。
09/06/16 23:44:15
>>299
適当にinp-2.datに
5
1
12
123
1234
12345
123456
と入れてます。
read(~)Nのあとにwrite(*,*)Nとすれば、ここまでは走りませんか?
これで走らせると、私の場合はN= 538976288と、とんでもないことになってました。
数字を数として読み込みたいのに、文字として読み込んだらまずいですよね、やっぱり。
A5はI5ぐらいかと思いますが、どうでしょう?
311:296です。
09/06/16 23:49:47
>>309
情報ありがとうです。
corei7+ifort 11ですか・・
なるほど。別のマシンで試してみます。
312:デフォルトの名無しさん
09/06/16 23:54:28
>>310
inp-2.datに小数点以下1桁を含んだ実数を適当に5つ入れて、writeしてみたところN=1073741824となってました。
フォーマットをi5にすると実数を受け取れないのでF5.5にしてみたのですが、Nは上記の通りです。何が起こってるんですかね・・・?
313:296です。
09/06/16 23:55:32
>>309
すんません。メインルーチンで
do i=1,100000
と回してますので、timeの結果が直接比較できないです。
すみませんが追加でテストお願いできませんか?
314:デフォルトの名無しさん
09/06/17 00:14:43
>>313
いやメインルーチンとかじゃなくて
>>309でテストすりゃいいじゃん
315:296です。
09/06/17 00:18:42
>>299
Nはデータの個数ですよね。実数じゃまずいのでは?
inp-2.datは
データの個数
データ1
データ2
:
というような構造じゃありませんか?
少なくとも最初のデータだけは整数かな。
それとIMAXを実数宣言しなきゃいけないようです。
316:デフォルトの名無しさん
09/06/17 00:27:14
>>315
datファイルにデータの個数を入れてなかったんですね・・・やっとわかりました!ありがとうございます。実行できました
プログラム自体はうまくいってないんですが・・・w
実行結果がMAX=0.000・・・、No.=2となっているんでうまくいってないですね
317:296です。
09/06/17 00:33:29
>>314
お世話になってます。
確かにこちらでも結果0秒になりました。
いやしかし、たぶん0.000,0060秒(6マイクロ秒)くらいかかっているのが、
timeコマンドの分解能不足で測れてないだけの様な気がしてますです。
実際は100000x100000回とかもっとぐらい実行するので、何とかしたいです。
>>316
IMAXの方もよろしく。
318:309
09/06/17 00:39:12
>>317
問題点を整理(できればテストコードを用意)して頂ければ協力できますよ
他のマシンもいくつかあります
319:デフォルトの名無しさん
09/06/17 00:53:40
>>317
実数宣言とは何でしょうか?imax=0.0ではダメなんですよね?
320:300
09/06/17 01:02:12
>>305
>yとxの寸法が違うので、y=xにできないはずです。
すまんこw ようつべ見ながらだったので、よく見なかったww
こんなものに時間がかかるも糞もないだろと思ったが、
10^5*10^5回も繰り返すなら気になるかw
部分配列でメモリーが連続していないので、コンパイラのバージョンが古いと
余計なテンポラリを暗黙にとっている可能性が高いと思う。
DO i = 1, 25
y(1:25, i) = x(:, i)
END DO
と、でもすれば早くなるべ。最適化でアンローリングとかもあろうし。