1 名前:デフォルトの名無しさん [2009/01/24(土) 18:32:01 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用)その3 pc11.2ch.net/test/read.cgi/tech/1196384126/ くだすれFORTRAN(超初心者用)その2 pc11.2ch.net/test/read.cgi/tech/1164121236/ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc11.2ch.net/test/read.cgi/tech/1163319215/
207 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 00:55:29 ] >>206 一般的な回答としては、できない。 不可能ではないという意味では、IF THEN ELSE でやれば出来る。 意図しているイメージに一番近いだろうと思われるのは、TRANSFER関数で型変換をすること。 しかし、FORTRANの規格では論理型の内部状態を定義していないので 0/1に投影できるかは運しだい。普通は0/-1が多い(真:ビット全部0と偽:ビット全部1)。
208 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 01:51:22 ] >>207 早速ありがとうございます 何となくですができました
209 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 21:13:40 ] g77のよく使う高速化のためのコンパイラオプションを教えてくださいませんか。 それかコンパイラオプションをまとめているサイトないですか? gccのまとめを見ればよいのでしょうか?
211 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 21:18:17 ] >>206 どういう用途? 論理型が用意されてる言語なら、特に理由がない限りそういうマネはやめたほうがいいかと シェルスクリプトレベルならよくやるけどさ
212 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 21:34:28 ] >>210 まずググれ。話はそれからだと思う。
213 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 01:13:00 ] でも、コンパイラのドキュメントしっかり読んで全部の仕様を熟知してる人なんて、ほとんどいないよな こんなオプションあんだ・・・でも何に使うんだろ、ってのばっかだ俺w
214 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 12:22:05 ] 論理型と整数型の混用は、非常に有用な場合もないではないけど、 基本的にはやるべきでない。
215 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 20:37:43 ] >>214 バグの元じゃない?
217 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 20:53:39 ] >>216 3つの条件abcのうち2つ以上が真なら、という場合に、 a = 条件式 b = 条件式 c = 条件式 if (a + b + c >= 2) ... とか。Cの場合だけど。
218 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 21:39:08 ] 後でメンテする時、無駄に手間食うからそういうのやめてくれ〜
219 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 22:35:22 ] 1960年代のおばあちゃんの知恵というかライフハックw風のプログラムだな。
220 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 02:46:28 ] >>218 4つの式が近くの行にあればいいけど、すごい離れた所にあるといろいろ嫌だよね
221 名前:デフォルトの名無しさん [2009/05/22(金) 20:21:01 ] LOGON TSS
222 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 22:46:55 ] >>221 READY
223 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:18:35 ] Intel Fortran 10 を使っています。 ifort独自文法のform='binary'でファイルを開いてデータ出力しています。 そのファイルはC言語のファイルフォーマットが公開されているんですが、 unsigned int となっている部分をifortで出力する方法がわかりません。 この部分だけC言語で記述して呼び出す形ならできそうな気がしていますが、 Fortranだけで完結させる方法ってありますか? アドバイスよろしくお願いします。
224 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 01:55:11 ] >>223 32bitのunsighned int? 読み込みのほうはINTEGER*4 でうけて、それをINTEGER*8にTRNASFER関数で 適当な位置にコピーするか、出力サブルーチンを作って負数の場合は INTEGER*8でUINTの場合の数を求めて出すという方法が考えられる。
225 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 12:05:07 ] 倍精度の変数宣言だけど、 real(8) a double precision a どっちやねん、と思ってた。 先日規格を見たら後者だったので、ウヒー! 今後は全部後者で統一する。行が長くなって、チョトいや。
226 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 12:13:09 ] >>225 どっちでもいい。後者は昔風の書き方。 今はむしろ前者が主流だと思う。
227 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 12:40:28 ] >>226 うーん、こんなHPもあるからなぁ・・・ 4.1 Fortranのデータ型 www.nag-j.co.jp/fortran/FI_4.html#AUTOTOC_4_1 コードを見られる可能性がある案件は、規格にならった方が よさそうな気もする。
228 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 17:17:01 ] >>227 それは、規格違反ということを意味しているわけではない。 KIND種が規格で決められていないためにベンダー依存になっていることを 問題視しているのだろう。 kd = SELECTED_REAL_KIND(14) とかで、8などの定数べた書きをやめてkdなどに すれば避けられる。 規格の整合性としては REAL ([KIND =] n) の方が統一的でいいとおもう。 4倍精度が大概のコンパイラでサポートされつつある現状を考えると、REAL(n)の 形式にそろえておいたほうが将来的にものぞましいのではないかと思う。
229 名前:223 mailto:sage [2009/05/23(土) 20:23:06 ] >>224 回答ありがとうございます。 詳しくないですが、32bitです。 各bitにどうデータが並んでいて、、、ってのを学ばないと難しそうですね。 ちょっとがんばってみます。
230 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 20:51:52 ] >>227 むしろreal*8が普通だと思ってた。double precisionはむしろ非推奨って話も聞いたことあるぞ。 >>227 のnagのページは全部鵜呑みにして良いのか甚だ疑問だわ・・・ つーか、この問題の責任は100%規格にあるだろう。規格作ったやつ出てこい!
231 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 22:45:57 ] 詳しくは覚えていないが・・・・ FORTRAN66までは倍精度宣言は DOUBLE PRECISION だけだったのだが、その後の流れで FORTRAN77では REAL*8 Fortran90でREAL([KIND=]8)の形が出てきて、だんだんと REAL([KIND=]8)の形に統一しましょうという流れだと思う。 >>230 Fortran90策定の頃は、ベンダー毎にアーキテクチャーも数値フォーマットも 文字コードもバラバラだったのでこのくらいは許してやってくれ。
233 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:03:22 ] やっぱKIND使った方がお行儀がいいのかなぁ 書き直すのマンドクサイっす ・・・あんま移植性に拘りすぎるのもどうかと思うけどね。どうせみんなインテ(ry
234 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 00:52:40 ] FORTRAN77では、いくつかのサブルーチンの間で共通の定数を使うとき それぞれのサブルーチンで何回も同じ宣言をしなければいけないのですか? このままだと定数の値を変えるのが非常に面倒なので 一回の宣言で済む方法を知りたいです
235 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 01:05:33 ] >>234 定数宣言だけのファイルを1つ作って、各サブルーチンの先頭でINCLUDEする。 FORTRAN77の規格外だが大抵のコンパイラはINCLUDE文に対応している。
236 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 01:08:13 ] >>234 PARAMETER文を用いてなら、標準では無いw COMMON 変数でよければ BLOCK DATA 文で初期化できる。 ベンダー拡張機能を許せば、INCLUDE を使う手もある。 まぁ、横着せずにラインエディターで一括変換すればよろしいw
237 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 01:10:53 ] ありがとうございます とりあえずINCLUDE使ってみます
238 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 01:11:05 ] >>234 モジュールでもいいぞ
239 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 02:04:13 ] >>238 奴はFORTRAN77と縛りを入れている。
240 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 13:47:45 ] >>236 entry文を使えば、何とかならない?
241 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 14:16:15 ] とくに理由がない限り、77からはさっさと足を洗った方がよくない?
242 名前:236 mailto:sage [2009/05/27(水) 23:27:51 ] >>240 たしかにENTRY文という手もあったな。 COMMONが嫌で、グローバル変数を実現する代わりに使ったことがあったが、 やっぱ変数全部がグローバルになるせいでデバッグが面倒で よほど特殊な場合意外はやめたほうが良いと思った。
243 名前:デフォルトの名無しさん [2009/05/31(日) 15:35:51 ] みなさまのお力をお借りしたく。 #FAQならすみませんが、ご容赦ください IVF10.1(11でも)動作したソースを、Linux上のintelに持ち込んでコンパイルしました。 すると、以下のケースに分かれました。 1)あえてコード変換をせずにコンパイル コンパイルOKも、当然、表示は滅茶苦茶(要するに2バイト系がだめ) 2)SJIS->UTF8にしてコンパイル FORMAT文の箇所でエラー発生、これがどうしても直らない。 ちなみにエラーメッセージは以下の通りです
244 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん [2009/05/31(日) 17:12:19 ] 早速ありがとうございます。ひとつ確認しましたので、ご報告をば。 a)kterm Ubuntu9.04にてktermを入れて、確認。 ・UTF8はコンパイル時、文字化け?でダメ ・同じくSJISもだめ ・eucではifortでのコンパイルメッセージの出力が化けている(どれでも同じ??)状況でしたが、実行時は日本語出力OK でした。 となるとintelFortranのインストールもkterm上から行う方がよかったのか? まだすべての確認はできていませんが、うまくいきそうという報告まで。b)も後日、試してみますので結果を報告致します。
247 名前:デフォルトの名無しさん [2009/05/31(日) 17:36:04 ] あ、追加。 うまく表示できているのは、kterm上で、の場合。通常のconsoleでは(当然っちゃぁ当然ですが)化け化けです。
248 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 08:32:25 ] おつ〜。やっぱりktermがいいのね。 245のbのやつは、対で使われることが多い文字 (ichar()関数の返す値が ' が39、Hexでは27 " が41、Hexでは29 ) が93、Hexでは5D ] は34(これはFortranではあまり意味がないか・・) のようなやつ)が全角に混じってるとダメそうな気がする、という程度の意味で書いてみた。 でも、win版やktermインストだと大丈夫なんだよね。 246さんの意見のとおり、インストール時の設定その他に依存する部分が大きそうな気もするな。
249 名前:デフォルトの名無しさん [2009/06/01(月) 18:51:56 ] 文字化けの件、追試結果(w まだf77は試してませんが、どうやら文字コードは確かに影響してるっぽい。 問題はUTF-8で、どうも旧人なので勝手に2バイトと思い込んでましたが、現在は最大4バイトらしい。 このため、見かけ上、1行内では2バイト換算で70文字程度にしていたものがオバフロしていた模様。 よってifortでは、-FI -132という固定ながら132文字にしたら通りました。 いったい何をしていたんだ…わしorz ちなみにIVFでUTF8形式でソース保存して、それをWin上でコンパイルしたら妙なゴミが出てました。 結構コード問題は奥が深そうです。
250 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 23:28:41 ] >>249 知ってる人のような気がする...... tt
251 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 01:58:37 ] > 問題はUTF-8で、どうも旧人なので勝手に2バイトと思い込んでましたが、現在は最大4バイトらしい。 なか〜まw そっか、UTFだとエディタの見かけより実際のはるかに長いんだね。試しに vi でてきとうにUTF使ったファイル開いたら、たしかに row 数が多い。 気を付けよう。
252 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 10:58:03 ] Intel Fortran の使える KIND を関数呼び出しで見ると、ASCII だけになってたような。 確認してないw
253 名前:デフォルトの名無しさん [2009/06/04(木) 23:06:43 ] モンテカルロ法の計算プログラムを流したら、 FORTRAN I/O ERROR 913: OUT OF FREE SPACE って出てきて途中で計算が止まったっぽいです。 なにやらメモリー不足とのことですが、どう解決すればいいのでしょうか?
254 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 23:47:02 ] >>253 ハードディスクを増設しろ!
255 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:14:43 ] >>253 I/O エラーだから、メモリーではなくディスクが足りないんだろう。 /tmp とかのスクラッチ領域がパンパンになっている可能性もあるが。
256 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 01:44:17 ] うほ
257 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 18:31:50 ] いや、I/O処理の最中に何らかのリソースが足りなくなったというメッセージだと思う。 www.uic.edu/depts/accc/software/compilers/forterr.html 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 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 03:03:47 ] 無書式での読み書きも、そのスペースを食うのかね。
259 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 20:16:43 ] >>259 1.歴史と伝統のGOTO文で抜ける。 2.READ文で END=nnn で抜ける。 だが元のままEXITで抜けるのがもっとも行儀が良いとされる。
261 名前:259 mailto:sage [2009/06/06(土) 21:28:47 ] >>260 授業の課題で、exitを使わないで書き上げろという事だったんですが・・・ どうも、ありがとうございました。
262 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:37:33 ] >>261 >exitを使わないで書き上げろ exitで抜けるのが一番良いのに、何でこう言ったんでしょ?
263 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 22:28:50 ] 世に蔓延るGOTO使いまくりのプログラムに慣れさせるため・・・ではないよな、多分。 READ文の指定子の使い方の勉強とかかな。
264 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 10:49:22 ] ここはFortranでプログラムを作ってという図々しいお願いはおk?
265 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 11:41:39 ] >>264 大丈夫。ただし、初心者にありがちな「エスパーさん、○○作って!」はやめて。 知っている情報をそのまますべて載せるべし。
266 名前:259 mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 17:20:58 ] ioの初期化も足りないし。ぐだぐだ。
270 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:24:17 ] exitの偉大さを実感すると言う狙いなのだろう。
271 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:31:01 ] 蛇足だが >>259 の do while ( .true. ) は do だけでおk まあ、 do while (io==0) に直させるためにワザと do while にしたのかもしれないが
272 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:52:10 ] do while (io==0) if (io==0) then たまにこういうセンスなさすぎなコード書く人いるよね 他人が書いたコードをメンテするはめになったときに、こういうの見ると何とも言えない溜息がでるわ・・・ たとえバグはないとしても
273 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:17:11 ] >>272 まぁ待てw Fortran で WHILE を使おうとするだけでも、きわめて開明的な人物ではないか!
274 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:27:58 ] > if (io==0) then これはどこがセンスなさすぎなん?
275 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 03:23:56 ] >>272 は「センス」って言葉を使いたかっただけなんだよ。
276 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 11:45:30 ] >>274 ループの脱出(継続)分岐条件である io==0 が WHILE と IF の二箇所で判断されていることを言ってるんだろ。 >>272 の態度はむかつかせるだけから、くだすれ的には反省すべき。
277 名前:デフォルトの名無しさん [2009/06/10(水) 15:02:05 ] 将来コードをいじったときにそのループをスキップする場合があることを考えて do while (io .EQ. 0) みたいなのは意図的に書くことはあるけどね。 というか、>>266 のは変数 io がゼロに初期化されることを 前提にしている時点であまりいい回答では無いように思うけどな。
278 名前:259 mailto:sage [2009/06/10(水) 16:33:09 ] >>268 さん、>>271 さん どうも、ありがとうございました。 授業はどうもいまいちわかりません(笑) これからも、ちょくちょく質問させていただきますので、 くだすれの皆さん、よろしくお願いします。
279 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 23:43:42 ] Visual Fortranについて質問してもいいですか?(VS2008スレよりもこちらのほうが適切っぽいので・・・) VBやC#でVS2005を使ってたのですが、Intel コンパイラv11を買って Visual Fortranを入れてみたところ、Intellisenseが効きません。 Visual Fortranでは使えないということですか? これだとVSをFortran開発環境とする利点がかなり消えてしまうと思うのですが・・・
280 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 00:01:40 ] >>279 使えない。 そういうものがあることを知らなければ気にならないから、いますぐ忘れるんだ! ただしPolyHedoronがLaheyFortran用のインテリセンスっぽい奴を売っている。 ttp://www.lahey.com/LFVSIntegration.htm
281 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 00:46:40 ] >>280 そうですか・・・ 計算はLinuxクラスタで走らすけど、開発は使い慣れたWindowsのVSで っていう人を見たことがあって、それいいなぁと思って入れてみたんですが・・・ Laheyっていうの初めて知りました。intellisenseっぽいポップアップが出てますね。 これやNAGなど他の開発環境で良いのがないか当たってみようかなぁ ちなみにNAGの↓の比較図ですが、他社製ってやっぱVisual Fortranですかね・・・(苦笑 ttp://www.nag-j.co.jp/nagfor/img/f95comp.jpg
282 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 00:57:25 ] >>281 PGI Visual Fortran というのもあって、これもVSと統合されているのだが、 確か今は米国内の研究機関に所属していればただで使える。 アメリカの研究機関に知り合いがいれば(略 SalfordというかSilverFrostのFTN95もVSと統合できる。 しかし、PGIもSalfordもインテリセンスは無かったような気がする。 最新状況はしらねw IntelFortranは今月中にF2003対応度が高まったv11.1で出るらしいので、 あわてずゆっくりしていってね。
283 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 03:33:59 ] >>282 色々ありがとうございます。 ↓を見みると、SalfordのVS統合はintellisenseみたいなのがあるようです。 www.silverfrost.com/17/ftn95/ftn95_visual_studio_dotnet_integration.aspx というかこれ無料っぽくないですか?太っ腹すぎる・・・ PGIも、ざっくり見た感じIntel VFよりは機能が多そうですね。 試用できるようなので試してみます。 しかしIntel VFはせめてキーワード補完くらいあればいいのに・・・ 性能第一で見やすさ・作りやすさは二の次ってことなんでしょうか(ある意味硬派?
284 名前:279 mailto:sage [2009/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 mailto:sage [2009/06/12(金) 21:44:13 ] ググっていたところ、IntelのForumでどんぴしゃなスレを見つけました。 software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/57076/ 皆思うことは同じのようですねw Steveおじさんも要望をよく理解してくれてるようですが、これまではVS2008への対応で 手一杯だったようです。MSが仕様をコロコロ変えることも妨げの原因だとぼやいてました。 結局、何が根本の原因なのかははっきりと書かれてませんでしたが、IVF以外のVS組込みIDEも IVFと似たような現状なのを考えると、VS側のほうでAPIみたいな道具を提供してくれないと Intellisenseのような高度機能は実装できない、ということなのかもしれません。 Steveさんが言うに、C++,C#,VBのVSで備わっていたこれらの機能が「Visual Studio Shell」 で分離されたので、Fortran上にも実装できそう、とのことです。 早くそうなって欲しいところですが、先月のスレへのSteveさんのレスを見る限り、もう少しかかりそうですね・・・ software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/65546/
286 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 16:09:35 ] 確かにfortranerの開発って時代遅れな感があるな
287 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 22:04:16 ] >>285 スティーブって森の熊さんホモ動画の熊さんの一匹に似てるよね。
288 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 22:36:44 ] Fortranの開発環境のヘボさにうんざりしてCに逃げる人も多いんだろうな ただ、今後のトレンドを考えるとやはりCは…
289 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 22:46:01 ] 紙テープ・パンチカード・ラインエディター上がりも多いFortran界では、スクリーンエディターで シンタックス・カラーリングがあるだけでも極楽浄土のけだるい怠けた世界に見えるのさ。
290 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 23:20:51 ] これから並列数は増える一方だから、最適化は少しの妥協も許されなくなるんだよな そうなるとFortran一択しかなくなる… MSがVisualFortran出してくれれば(^q^)
291 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 23:30:16 ] >>290 っ [MS Fortran PowerStation]
292 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 00:33:41 ] >>291 そう、それをもう一度頼む!(><) MSのFortran部隊はどこ行っちまったんだ?
293 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 00:49:49 ] >>292 Netscapeがブラウザー戦争を仕掛けたせいで、VC++部隊以外が全部IE開発に 回されたという噂が当時あった。 まぁMSの歴史をたどると、BASICの次に作って売ったのはFORTRANだから MS Visual FORTRANは原点回帰といえなくもないが、VBすら捨ててしまうMS様は 容赦ないのだw でも、高い金出してコンパイラ律儀に買ってくれるのはFORTRANユーザーくらい?
294 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 00:55:45 ] >>292 MS → DEC → Compaq → Intel
295 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 13:53:00 ] >>294 MSからDECに流れたとはしらなんだ IntelとMSがもっとみっちり連携してくれればいいんだけど、またWintelって非難が起こりそうだな
296 名前:arrayの地獄 mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 22:27:38 ] >>296 それだけじゃ分からんっつの 時間食うってどれくらい?
298 名前:arrayの地獄 mailto:sage [2009/06/16(火) 22:46:24 ] 92x49回で数秒のオーダー @xeon5160? 1core使用 なんかおかしいな・・もうちょっと調べます。
299 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 22:59:20 ] >>300 TMP(25,25)だったw 0:25と勘違いしたよ。1:25とか俺的にはあり得ないw >>299 データ数が足りないように見受けられる。 F9.5に当たるところでデータが足りないか、変数の数が合わないかしてるのでは?
302 名前:296です。 mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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です。 mailto:sage [2009/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です。 mailto:sage [2009/06/16(火) 23:13:31 ] みにくてすみませんでした。 CPUはcore2の6600 2.4Gでcashe=4Mでした。 yとxの寸法が違うので、y=xにできないはずです。 逆フーリエ変換にかけるとき外を0にしておきたいので、 こんなになっています。 実プログラムでは逆フーリエ変換にかかる時間と 同じくらいの時間がかかって大損しています。
306 名前:296です。 mailto:sage [2009/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です。 mailto:sage [2009/06/16(火) 23:27:05 ] >>299 私もできる範囲で手伝い。 100 FORMAT(A5) が気になります。 実際に実行させたらNにどんな値が入るでしょうか? 思っている値かどうかwrite文で確かめるのが吉かと思います。