1 名前:デフォルトの名無しさん [2006/01/24(火) 09:48:23 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済をお願いします。
953 名前:デフォルトの名無しさん [2006/10/25(水) 23:39:38 ] >>951 オートマチック変数または自動変数とは、サブルーチンが呼び出されたときに 一時的に割り付けられる変数だ。 SUBROUTINE unko(a, n) IMPLICITE NONE REAL, INTENT(IN) :: a(n) REAL :: work(SIZE(a)) 云々 とあったとすると、配列workが自動変数にあたる。 これはあまり大きなものを取ることを想定しておらず、スタック領域に割り付ける。 こういう使い方で大きな配列などを取っていると、スタックオーバーフローがおきる。 サブルーチンを呼び出すと、戻る場所などの情報をスタックに保存することになる。 またサブルーチンで一時的に使用するメモリー等もスタックに取る。 サブルーチンの呼び出しが過剰に多いか(再帰関数が無限ループとか)、 一時変数が領域を食いすぎるとオーバーフローが出る可能性がある。 エラーメッセージからするとDEC系のコンパイラの感じだが、トレースバック情報などの デバッグ情報を吐き出させるオプションをつけてコンパイルし実行してみるのも手だ。 まぁ、もう少し詳しい情報が無いと助言のしようが無い。
954 名前:stack overflow [2006/10/26(木) 00:19:00 ] programを省略して書くと、 (宣言文) open(21,file='filelist') do allocate read(21,*,end=1000)unko open(51,file=unko) (計算) close(51) deallocate end do 1000 close(21) stop end データのファイル(具体的には地震動の波形)がたくさんあって 1つ1つに同じ処理をして出力ファイルを作成したかったので、 cmdで入力ファイルのパスのリストを作って、リストのファイルが読み終わるまで、 doループで繰り返すように動かしたいのです。 大体2000回くらいループを繰り返すとstack overflowします。(動かして20分ぐらい) mainで使う配列はすべて、doループのなかでallocateとdeallocateを繰り返しています。 subroutine内でも引数でない配列は、allocateとdeallocateをしています。 こんな風な動かし方ってできないんですかね? OSはWindowsXP、programはvisual studioで動かしています。
955 名前:デフォルトの名無しさん [2006/10/26(木) 00:43:27 ] >>954 その範囲内では問題ないと思われる。 20分はちゃんと動いているとすれば、結構厄介なBugかもしれない。 Visual Studioを使っているという事は、コンパイラはIntelのものでいいのか? 昔のMSPowerStationだとI/OにメモリーリークがあるのでI/Oを繰り返すと 死にメモリーが増えて行きどこかで死亡することになっていた。 これはタスクモニターでメモリー使用量を観察していると分かる。 Intelではそういう事は無いと思うのだが、もしかしたらそういう可能性が無いともいえない。 ALLOCATEとDEALLOCATEの対応が狂って、きちんとメモリーが解放されていない場合も タスクモニターでメモリー使用量を見ていると、どんどん使用メモリーが増えてゆくので 見て取れる。 ところで実行はDEBUG MODEでためしているだろうか?
956 名前:stack overflow [2006/10/26(木) 00:47:04 ] プログラム概要を記します。 (宣言文) open(21,file='filelist') do allocate read(21,end=1000)unko open(51,file=unko) read(51) (計算) close(51) deallocate enddo 1000 close(21) deallocate stop end データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、 1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、 2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。 mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。 subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。 こんな使い方しませんか? OSはwindowsXPで、visual studioでプログラムを作ってます。
957 名前:stack overflow [2006/10/26(木) 00:47:56 ] プログラム概要を記します。 (宣言文) open(21,file='filelist') do allocate read(21,end=1000)unko open(51,file=unko) read(51) (計算) close(51) deallocate enddo 1000 close(21) deallocate stop end
958 名前:stack overflow [2006/10/26(木) 00:48:58 ] 957の続き データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、 1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、 2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。 mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。 subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。 こんな使い方しませんか? OSはwindowsXPで、visual studioでプログラムを作ってます。
959 名前:stack overflow [2006/10/26(木) 00:50:11 ] 957の続き データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、 1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、 2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。 mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。 subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。 こんな使い方しませんか? OSはwindowsXPで、visual studioでプログラムを作ってます。
960 名前:stack overflow [2006/10/26(木) 00:51:33 ] すいません。 同じ内容を何度も書き込んでしまいました。
961 名前:stack overflow [2006/10/26(木) 01:17:54 ] ファイルリストがいくつもあるのでバッチファイルで動かしていました。 filelistをcall getargで読み込ませています。 DEBUG MODEでやった方がいいですか? タスクモニターを見ながらもう一度動かしてみようと思います。
962 名前:stack overflow [2006/10/26(木) 01:43:26 ] つかぬ事をお聞きしますが、タスクモニタのどこをみればよいのでしょうか? 見ながら動かして見ましたが、あまり変わりません。 コンパイラはIntel FORTRANです。
963 名前:948 mailto:sage [2006/10/26(木) 01:58:24 ] >>952 なるほど、精度保障のための関数でしたか。勉強になりました。 一度、自分の使っているFORTRANのバージョンを確認してみます。 お答えいただき、どうもありがとうございました!
964 名前:stack overflow [2006/10/26(木) 02:15:31 ] !!!!なぜか、急に動くようになりました。???? もう少し長い時間動くかどうか、やってみます。結果は明日報告します。 ご丁寧に説明していただき、ありがとうございました。お時間取らせてしまってすいません。 and同じ書き込み何度もして、すいません。
965 名前:デフォルトの名無しさん [2006/10/26(木) 02:39:52 ] >>961 一応DEBUG MODEで1回は動かしておくのがいい。 時間はかかるので小さめのデータを用意して確かめておくのがマナー。 いきなりリリースモードに行くのは、体を洗わずに湯船につかるようなものw >>962 概略ならパフォーマンスのところを見るとグラフが書かれているのでそれで傾向を知れる。 プロセスのところでMEMUSAGEをみれば、数値でどのくらい使われているかが分かる。
966 名前:デフォルトの名無しさん [2006/10/26(木) 05:22:04 ] f90glを使いたいのですが、導入の方法からつまづいています。 math.nist.gov/f90gl/f90gl-1.2.12.zip を取ってきたあと、どうすれば導入&コンパイルできるのですか? 環境はWindowsXP、cygwinでインストールしたOpenGLを使っています。 コンパイラは何を使うのでしょう?gfortran?g95?
967 名前:stack overflow [2006/10/26(木) 09:07:18 ] >>965 お騒がせしました。program無事に終了しています。 stack overflowが出る前は、debug modeで試すというのはやっていましたが、 そのあとの修正が反映されてなかったってことなのかな・・・ コンパイルはしてたはずだったんですが・・・ 初心者なもんでお許しを 何がともあれできてよかったっす。ありがとうございました。
968 名前:stack overflow [2006/10/26(木) 10:53:04 ] できたと思ったのですが、やっぱりできていませんでした。 昨日か一昨日、どこでメモリが食われているのか、調べるために 出力の部分をコメントアウトしたりしていたのですが、 コメントアウトしたままで実行したので動いていたようです。 やはり、出力時にメモリが使われているようです。 出力はバイナリ形式なんですが、なにか関係があるのかなあ・・・
969 名前:デフォルトの名無しさん mailto:sage [2006/10/26(木) 22:03:07 ] >>966 まず、f90glから使える GLUTが必要。 これは(少々バージョンが古いようだが)ソースとWindows用にコンパイルした物が f90gl Softwareのページから拾える。 次に f90gl-*/INSTALL, mf_keyをよく読んで自分の使っているOS/C/Fortranコンパイラに 合ったMakefile(mf*)またはバッチファイル(mf8n*.bat)を探す。 適切な物が見つかれば、それを自分の環境に合わせて修正し makeまたはバッチファイルを実行し、ライブラリとモジュールファイルを作る。 適切な物がなければ、似たような物から自分でMakefile/バッチファイルを作るか Makefile/バッチファイルの処理内容を見て手動でコンパイルする。 f90gl-1.2.12.zipにはcygwin gcc + g95/gfortran用のmf*は含まれていないようなので 自分でMakefileを作るしかないようだな。
970 名前:デフォルトの名無しさん [2006/10/26(木) 22:54:26 ] >968 or1cedar.cps.intel.com/ISN/Community/en-US/forums/thread/30223289.aspx まずはここを嫁 コメントアウトして動くようになった行をうpれ!
971 名前:デフォルトの名無しさん [2006/10/26(木) 23:43:58 ] VC++を勉強しようと思うのですが、お勧めの参考書があれば教えてください!!
972 名前:デフォルトの名無しさん [2006/10/27(金) 00:14:28 ] >>971 つ ttp://www.amazon.co.jp/gp/product/4320029658
973 名前:stack overflow [2006/10/27(金) 00:38:09 ] >>970 コメントアウトの行は、出力部分で、 ファイル形式が某企業のもので詳しく載せれません。 open文×10 write文×20 close×10 もうそろそろ諦めます。 最後に紹介して頂いたintelのサイトに書いてあるのは、誰かが出したエラーの原因か何かですか? 英語苦手なんで、どういうサイトなのかだけ教えてください。
974 名前:966 mailto:sage [2006/10/27(金) 02:15:38 ] >969 丁寧にありがとうございます!
975 名前:デフォルトの名無しさん [2006/10/27(金) 03:39:20 ] >>973 あれはintelのサポートページにある掲示板だ。 SteveLionelというのがDEC→Compaq→HP→INTELとずーっと一貫してサポートの前面に 立ってきた人間なので、とりあえず奴の書き込みだけを見れば足るだろう。 あれ以外にもStackOverflowに関する一般的な説明があった。 それは上のほうにあった書き込みと似ている内容だったが、INTELコンパイラは将来的には 巨大なAutomatic変数は自動的にHeap領域に割り当てるように改良を考えているらしい。 念のためコンパイラは最新版にupdateしておくとよい。 またコンパイラの問題かどうかの参考にするには、別の会社のコンパイラでやってみるという 手もある。チェックだけなのでftn95とか、g95とか、あとどっかの2週間のおためしと版とか で試して同じ症状が出るかどうかみてみるという手もある。 DEBUGオプションでやってみるのが基本なのだが。
976 名前:stack overflow [2006/10/27(金) 14:33:52 ] >>975 分かりました。 どうもありがとうございます。m(_ _)m
977 名前:デフォルトの名無しさん [2006/10/28(土) 22:55:00 ] 以下のようにしてテキストファイル内の行数を数えたいのですが、 テキストファイル最後の行の判別はどう書けばよいのでしょうか? (つまり、DO WHILEの条件はどう書けばいいのですか?) . OPEN(11,FILE='01.dat',STATUS='old') . READ(11,*) x,y,z . DO WHILE(x /= NULL) !←NULL . max_line = max_line + 1 . READ(11,*) x,y,z . END DO . CLOSE(11) 教えてください、お願いします!
978 名前:デフォルトの名無しさん [2006/10/28(土) 23:37:18 ] >>977 . READ(11,*, IOSTAT=IOSS) x,y,z とすると、ファイルの終わりに達したら IOSS に負の値が入る。 ちなみに エラーが起きたら正の整数値、それ以外ならゼロが入る。 正、負の具体的な値は処理系依存。 または . READ(11,*, END=文番号) x,y,z とすると、ファイルの終わりに達したら (文番号) に分岐する。
979 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 02:07:11 ] >978できました!ありがとうございます。
980 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 16:38:30 ] do i=20,90,1 でi=70だけを飛ばしたいときはどのようにしたらよいのでしょうか?
981 名前:980 mailto:sage [2006/10/31(火) 16:47:36 ] 自己解決しました if文を入れてi=70だけを飛ばしました。
982 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 20:54:05 ] スマソ、助けてください。 例えば、この連立一次方程式 3x1+2x2+7x3+x4=8 x1+5x2+x3−x4=5 4x1+x2+3x3−2x4=7 x1+6x2+4x3+3x4=13 これをガウスジョルダン法で解きたいんですが open文でデータを開いて計算したいんです。 プログラムはどのようにすればよいでしょうか?
983 名前:982 mailto:sage [2006/10/31(火) 20:56:03 ] ちなみに77でお願いします。
984 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 22:30:19 ] >>982 program hoge parameter (N=4) real a(N,N+1) open(11, file='data.txt', status='old') read(11,*) ((a(i,j), j=1,N+1), i=1, N) close(11) do 101 i=1, N piv = a(i,i) do 201 j=i, N+1 a(i,j) = a(i,j) / piv 201 continue do 202 j=1, N if (j .ne. i) then t = a(j, i) do 301 k = i, N+1 a(j,k) = a(j,k) - t * a(i, k) 301 continue end if 202 continue 101 continue write(*,*) (a(i, N+1), i=1, N) stop end エラーチェックは省いたので「不正なデータ」を読ますとランタイムエラーになるw
985 名前:982 mailto:sage [2006/10/31(火) 22:44:32 ] >>984 おー、こんなに短くなるもんなんですね。 後は自分でやってみます。 ありがとうございますた(`・ω・´)
986 名前:982の1/2 [2006/10/31(火) 23:55:25 ] 再度質問ですが PARAMETER (NN=10) DIMENSION A(NN,NN),B(NN),X(NN) WRITE(*,*)'何元の連立方程式か、元数を入れてください。' READ (*,*) N WRITE(*,*) 'N=',N OPEN(10, FILE='TEXT1.TXT', STATUS='OLD') DO 1 I=1,N READ (10,*) (A(I,J), J=1,N),B(I) WRITE(10,*) (A(I,J), J=1,N),B(I) 1 CONTINUE CLOSE(10) DO 100 K=1,N-1 P=A(K,K) DO 2 J=K+1,N A(K,J)=A(K,J)/P 2 CONTINUE
987 名前:982の2/2 [2006/10/31(火) 23:56:57 ] B(K)=B(K)/P DO 3 I=K+1,N Q=A(I,N) DO 4 J=K+1,N A(I,J)=A(I,J)-Q*A(K,J) 4 CONTINUE B(I)=B(I)-Q*B(K) 3 CONTINUE 100 CONTINUE X(N)=B(N)/A(N,N) DO 200 K=N-1,1,-1 S=B(K) DO 5 J=K+1,N S=S-A(K,J)*X(J) 5 CONTINUE X(K)=S 200 CONTINUE WRITE(*,*) ' 解 X ' DO 6 I=1,N WRITE(*,*) X(I) 6 CONTINUE STOP END ここまでは自分でアレンジしましたが、プログラムが回りません。 どこが間違っていますか?
988 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 20:47:30 ] >>986 > DO 1 I=1,N のループの中で ファイルからデータを読み込んだすぐ後に 同じファイルに上書きしてる。 > DO 3 I=K+1,N のすぐ下 Q=A(I,N) → Q=A(I,K) こんなところかな。
989 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 14:34:42 ] >988 出力形式になってなかったですね。 激しく感謝です。
990 名前:デフォルトの名無しさん [2006/11/03(金) 00:40:49 ] そろそろ次スレたのむ、 テンプレも進化させてw
991 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 12:47:20 ] Formula 1
992 名前:デフォルトの名無しさん [2006/11/04(土) 13:00:21 ] 2007年はFORTRAN50周年だ。 俺達も盛大に祝おうぜ!!
993 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 16:32:22 ] FORTRAN = FORmula TRANslation
994 名前:フォートランを初めて3日目 [2006/11/04(土) 19:37:05 ] 今、ワードのようなテキストデータの中に1961年から2005年までの乱雑した年 数だけわかっていて、そこから連続した数を抽出し、発生頻度と見なしてその 発生確率からポアソン分布による乱数を行なえるようなプログラムを知りたい のですが、よければ、教えてくれませんか?
995 名前:デフォルトの名無しさん [2006/11/04(土) 20:44:32 ] >>994 そのようにファイルから読み出すのは初心者には難しいだろう。 発生確率にするまで教えてやろう。 データ例を出せ。 そこから先の後半は、カテゴリーが違うので後だ。 まずは作業を概念的に分割して小さい単位で作れ。
996 名前:フォートランを初めて3日目 [2006/11/05(日) 11:34:08 ] データ例と言われましても、初めてでよくわからないのですけど、’nenpow.txt' というようなワードの文章の中に112行1列(要は縦に一つずつの年報が並んでいる) になっています。ちょっと描いてみると 1行目:1961 2行目:1961 3行目:1962 … 112行目:2005 というようになっており、ここからそれぞれの年報をまとめて発生個数として ポアソン分布を作成し、それによる確率的な乱数を発生させるようにしたいの ですけど・・・。 初めてなので、こういう解釈になってしまうのですけど、わかりますか?
997 名前:フォートランを初めて3日目 [2006/11/05(日) 11:38:56 ] できれはFORTRAN77と、90の両方でお願いしたいのですけど
998 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 12:14:28 ] >>997 PARAMETER (NYMIN=1961, NYMAX=2005, NTOTL=112) INTEGER NUM(NYMIN:NYMAX) DO I=NYMIN, NYMAX NUM(I) = 0 END DO OPEN(11, FILE='nenpow.txt', STATUS='OLD') DO I=1, NTOTL READ(11,*) NY IF ((NY .LT. NYMIN) .OR. (NY .GT. NYMAX)) THEN WRITE(*,*) 'ERROR:', I, NY ELSE NUM(NY) = NUM(NY) + 1 END IF END DO CLOSE(11) DO I=NYMIN, NYMAX WRITE(*,*) I, NUM(I) END DO STOP END 長くなりそうなので、 ファイルから年を読んで NUM(1961)〜NUM(2005) に各年の出現数を格納する 所まで 残りは誰かが次スレでw
999 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 17:39:02 ] FORTRAN = FORmula TRANslation
1000 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 17:39:39 ] 次スレ FORTRAN III pc8.2ch.net/test/read.cgi/tech/1104724162/l50
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。