くだすれFORTRAN(超初心者用)

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2006/10/25(水) 23:28:30
>>950
あれはFORTRAN90以降で導入された精度保障のための関数だ。
kind=SELECTED_REAL_KIND(10)
これは有効数字10桁を保障するような型に対応する種類(KIND)を返す。
普通のFORTRANは短精度と倍精度を持つが、短精度の有効桁は7〜8、
倍精度は14〜15なので、倍精度に相当する値を返す。
FORTRAN77で言えばREAL(8)に相当する。

これでコンパイラのエラーが出るとすると、FORTRAN90完全準拠で無いと思われる。
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系のコンパイラの感じだが、トレースバック情報などの
デバッグ情報を吐き出させるオプションをつけてコンパイルし実行してみるのも手だ。

まぁ、もう少し詳しい情報が無いと助言のしようが無い。


954stack 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でためしているだろうか?
956stack 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でプログラムを作ってます。
957stack 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
958stack 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でプログラムを作ってます。
959stack 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でプログラムを作ってます。
960stack overflow :2006/10/26(木) 00:51:33
すいません。
同じ内容を何度も書き込んでしまいました。
961stack overflow :2006/10/26(木) 01:17:54
ファイルリストがいくつもあるのでバッチファイルで動かしていました。
filelistをcall getargで読み込ませています。
DEBUG MODEでやった方がいいですか?
タスクモニターを見ながらもう一度動かしてみようと思います。
962stack overflow :2006/10/26(木) 01:43:26
つかぬ事をお聞きしますが、タスクモニタのどこをみればよいのでしょうか?
見ながら動かして見ましたが、あまり変わりません。

コンパイラはIntel FORTRANです。
963948:2006/10/26(木) 01:58:24
>>952
なるほど、精度保障のための関数でしたか。勉強になりました。
一度、自分の使っているFORTRANのバージョンを確認してみます。
お答えいただき、どうもありがとうございました!
964stack 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を使いたいのですが、導入の方法からつまづいています。

http://math.nist.gov/f90gl/f90gl-1.2.12.zip
を取ってきたあと、どうすれば導入&コンパイルできるのですか?
環境はWindowsXP、cygwinでインストールしたOpenGLを使っています。
コンパイラは何を使うのでしょう?gfortran?g95?
967stack overflow :2006/10/26(木) 09:07:18
>>965
お騒がせしました。program無事に終了しています。
stack overflowが出る前は、debug modeで試すというのはやっていましたが、
そのあとの修正が反映されてなかったってことなのかな・・・
コンパイルはしてたはずだったんですが・・・
初心者なもんでお許しを
何がともあれできてよかったっす。ありがとうございました。
968stack overflow :2006/10/26(木) 10:53:04
できたと思ったのですが、やっぱりできていませんでした。
昨日か一昨日、どこでメモリが食われているのか、調べるために
出力の部分をコメントアウトしたりしていたのですが、
コメントアウトしたままで実行したので動いていたようです。
やはり、出力時にメモリが使われているようです。
出力はバイナリ形式なんですが、なにか関係があるのかなあ・・・
969デフォルトの名無しさん: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
http://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
973stack overflow :2006/10/27(金) 00:38:09
>>970
コメントアウトの行は、出力部分で、
ファイル形式が某企業のもので詳しく載せれません。
open文×10
write文×20
close×10

もうそろそろ諦めます。
最後に紹介して頂いたintelのサイトに書いてあるのは、誰かが出したエラーの原因か何かですか?
英語苦手なんで、どういうサイトなのかだけ教えてください。
974966: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オプションでやってみるのが基本なのだが。
976stack 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デフォルトの名無しさん:2006/10/29(日) 02:07:11
>978できました!ありがとうございます。
980デフォルトの名無しさん:2006/10/31(火) 16:38:30
do i=20,90,1
でi=70だけを飛ばしたいときはどのようにしたらよいのでしょうか?
981980:2006/10/31(火) 16:47:36
自己解決しました
if文を入れてi=70だけを飛ばしました。
982デフォルトの名無しさん: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文でデータを開いて計算したいんです。
プログラムはどのようにすればよいでしょうか?



 
983982:2006/10/31(火) 20:56:03
ちなみに77でお願いします。
984デフォルトの名無しさん: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
985982:2006/10/31(火) 22:44:32
>>984
おー、こんなに短くなるもんなんですね。
後は自分でやってみます。
ありがとうございますた(`・ω・´)
986982の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
987982の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デフォルトの名無しさん: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デフォルトの名無しさん:2006/11/02(木) 14:34:42
>988
出力形式になってなかったですね。
激しく感謝です。
990デフォルトの名無しさん:2006/11/03(金) 00:40:49
そろそろ次スレたのむ、
テンプレも進化させてw
991デフォルトの名無しさん:2006/11/03(金) 12:47:20
Formula 1
992デフォルトの名無しさん:2006/11/04(土) 13:00:21
2007年はFORTRAN50周年だ。

俺達も盛大に祝おうぜ!!

993デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/11/05(日) 17:39:02
FORTRAN = FORmula TRANslation
1000デフォルトの名無しさん:2006/11/05(日) 17:39:39
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。