1read 100read
2012年1月1期プログラム30: くだすれFORTRAN(超初心者用)その5 (744) TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
31: 【RAD統合環境】 Qt 総合スレ 12 【Win/Mac/Linux】 (757)
32: 推薦図書/必読書のためのスレッド 65 (729)
33: 【入門】Common Lisp その8【質問よろず】 (738)
34: Eclipse統合M32【Java/C++/Ruby/Python/Perl】 (208)

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


1 :10/03/28 〜 最終レス :12/01/09
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)その4
http://pc12.2ch.net/test/read.cgi/tech/1232789521/
くだすれ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/

2 :
>>1
乙! (≧∀≦)b

3 :
お前ハイテンションだな
この手の顔文字って結構イタい

4 :
>>1
おつ
質問です。
integer,parameter::dp=selected_real_kind(20)
a=1._dp
みたいに変数(この例ではdp)で精度を決めてるんだけど、指数部の表現ってどうやるか教えてください。
例えば、0.001を表現する時に倍精度なら1.d-3ってな感じでやってますが、変数を使った場合どうなるでしょう?
今は、1._dp/1e3 という風に表していますが、ちょっと美しくないです。
ご存知の方いらっしゃいましたら、教えていただけませんでしょうか?

5 :
>>4
1.0e-3_kd

6 :
>>3
やっぱ今はやりの顔文字はこれだよな (^p^)b

7 :
●関連スレ【 FORTRAN W 】の URL は変更されていますよ〜。
http://pc12.2ch.net/test/read.cgi/tech/1163319215/

8 :
>>7
専ブラなんで気づかなかった、すまん。

9 :
>>8
いえいえ,俺もお気に入りメニューに入れてたんだけど,
なんで新しいレスが来ないのかなと長時間思ってた。
んで,昨日初めて気が付いたw

10 :
はじめまして、超初心者なので質問させて下さい。
今扱っているデータは1秒ごとに取得した時系列データなのですが
データ取得時に装置の調子が悪くて時々データ抜けが起きてしまっています。
1分ごとに平均値を取りたいのですがデータ抜けのせいで
nを1から10個目までとして平均値を取ってしまうとずれが出てきてしまいます。
ずれを出さないために以下のようにデータを補完したいのですがやりかたが全く判りません。
00:00:04 x4 y4 z4
00:00:05 x5 y5 z5
00:00:06 x6 y6 z6
00:00:10 x7 y7 z7
00:00:11 x8 y8 z8
00:00:12 x9 y9 z9

00:00:04 x4 y4 z4
00:00:05 x5 y5 z5
00:00:06 x6 y6 z6
00:00:07 x7' y7' z7'
00:00:08 x8' y8' z8'
00:00:09 x9' y9' z9'
00:00:10 x7 y7 z7
00:00:11 x8 y8 z8
00:00:12 x9 y9 z9
データの抜けはランダムに起こっています。
フォートランは先生から貰った既存のプログラムを
データにあわせて改造するくらいしかした事がありません、
色々調べたり試したりしてみていますが
もしやりかたが判る方がいらっしゃいましたら教えて頂けると助かりますm(_ _)m

11 :
>>10
FORTRAN以前の話だけど、補間はそれでいいの?
00:00:04 x4 y4 z4
00:00:05 x5 y5 z5
00:00:06 x6 y6 z6
00:00:07 x6 y6 z6
00:00:08 x6 y6 z6
00:00:09 x6 y6 z6
00:00:10 x7 y7 z7
00:00:11 x8 y8 z8
00:00:12 x9 y9 z9
の方が自然だと思うけど。

12 :
>>11
10です、前の値で埋める方法も判ればそれはとても嬉しいです、
それもやってみようとしてうまくいきませんでした...
また、前後の値のみだとそれほど信用高いというわけでも無いので
フーリエか最小二乗法で補完出来ればなお良い、という感じです。
3秒くらいの抜けは良い方でデータ取得時の状態が酷いときには
20秒くらい抜けてしまっていたりして、どうしたものかと思い悩んでいます。

13 :
訂正12>それもやってみようとしてうまくいきませんでした...
やってみたけれど、結果で20秒とか30秒とかの間
同じ値がずらりと続いていておかしな事になった時間帯があり
あまりにも無惨だったのでやめた事を思い出しました。

14 :
>>10
補間なのか補完なのかもよくわからん。
(無いデータを補完しておくのか、抜けたのを内挿するのか)
のちのちのデータ解析にも関わるので、一度指導教官とよく話しあった方がいいぞよ。
詳しいことが分からんからなんとも言えないが、データ読み込み時に、データ補間/補完もできるが、
生データは無加工のままとっておいて、後処理で補完した方がいい気もする。
まぁコメントがつけられるデータ形式なら、補完行にコメントを付けておくこともできるが・・・

15 :
自宅PCが起動しなくなったトラブル&携帯が規制かかってて今まで書き込めませんでした、
すみませんm(_ _)m
>>14
無いデータを補完です、データ抜けでその時間帯のデータが無くなっているので。
生データはちゃんととっておいています、フォートランでデータ加工時に
別名をつけていっているので途中経過も判るようになっています。
先生からは「とりあえず調べてやってみて」と言われまして
色々調べてはいるもののちょっと混乱しているのでこちらに助けを求めに来ました。
もしヒントだけでも教えて頂けるようでしたらお願い致しますm(_ _)m

16 :
>>15
PROGRAM test
IMPLICIT NONE
INTEGER, PARAMETER :: nmax = 100
REAL :: x(nmax, 3), x1, x2, x3
LOGICAL :: qdata(nmax)
INTEGER :: i, k, k0, kh, km, ks, io, ndata

x = 0.0
qdata = .FALSE.
DO i = 1, nmax
READ(10, '(i2, 1x, i2, 1x, i2, 3F5.0)', IOSTAT = io) kh, km, ks, x1, x2, x3
IF (io == -1) EXIT
IF (i == 1) k0 = 3600 * kh + 60 * km + ks - 1
k = 3600 * kh + 60 * km + ks - k0
x(k, 1) = x1
x(k, 2) = x2
x(k, 3) = x3
qdata(k) = .TRUE.
END DO
ndata = k
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DO i = 1, ndata
IF ( .NOT. qdata(i) ) x(i, :) = x(i - 1, :)
END DO
DO i = 1, ndata
PRINT '(i3, ":", L5, 3(1x, F8.2))', i, qdata(i), x(i, :)
END DO
STOP
END PROGRAM test

17 :
データファイル
00:00:04 1.0 2.0 3.0
00:00:05 4.0 5.0 6.0
00:00:06 7.0 8.0 9.0
00:00:10 10.0 11.0 12.0
00:00:11 13.0 14.0 15.0
00:00:12 16.0 17.0 18.0
実行結果
1: T 1.00 2.00 3.00
2: T 4.00 5.00 6.00
3: T 7.00 8.00 9.00
4: F 7.00 8.00 9.00
5: F 7.00 8.00 9.00
6: F 7.00 8.00 9.00
7: T 10.00 11.00 12.00
8: T 13.00 14.00 15.00
9: T 16.00 17.00 18.00
とりあえず、1秒単位であることを仮定。
読み込むときデータが抜けたら、論理型配列 qdata を .FALSE. にしておいた。
抜けたデータは1個前をコピー。故に連続して抜けた場合は同じのが続く。
こんなんでおk?

18 :
ああごめん>>17>>16が書いている。名前欄の>>15は間違い。
>>17のデータは2chだと半角スペースがつめられてしまうのであれだが、
実際は空白が入って小数点が揃うように並べてある。
そうでないと読み込みのところのformatがくるってしまう。
データ読み込みとデータ補間は、それぞれサブルーチンにすればすっきりするだろう。
コメント行で切れ目を入れておいた。
スレ汚しすまん。

19 :
昨晩また規制に引っかかってしまって書き込み出来ませんでしたm(_ _)m
>>16,17,18
ありがとうございます、
抜けたところに前のデータを挿入して補完する方法は以前試したのですが
データ落ちが酷いところでは数十秒くらい同じ値が続く事になってしまって
あまり宜しくないという事で、今回別の方法で補完するやり方を探しているところです。
現在は3次スプライン補完という方法があるらしく色々調べているのですが
結構難しくてまだ理解出来ていません(>_<)もう少し頑張ってみます。

20 :
データ補間してフーリェかけたり平均とったり・・・とか自爆なのを
今でもときどき見るけど、気を付けてね。
走査平均対象の10データ中の有効なものの数でエラーバー決めて解析すればそれでいいと思うけどねぇ。
平均をとる操作と線形あるいは高次補間って同じ事
((非負の係数で)合計が1になる係数をかけて足し算する事に帰着する)だから
とある補間(補完?)した後に平均値をとっても・・・という気はする。
一度、教官に確認した方がいいよ。単なるテストというか簡単な試練を与えられただけなら
それはそれで教育的ともいえるけど・・・危険な香りがする。

21 :
>>17 抜けたデータは1個前をコピー。故に連続して抜けた場合は同じのが続く。
王道だね。できればかけたデータの後半はその後にくる有効なデータで、なら
たぶんもっといいけど面倒だしね。
if (.NOT. qdata(i)) then のあとに、
  j = i
  do while ((.NOT. qdata(j) .OR. (j .LE. ndata))
    j = j + 1
  enddo
  ntrue = j
で次の有効なデータの番地がわかるから・・・あれ、これだとntrueは一個ずれるかも。

22 :
しかも .OR. じゃなかったね・・・

23 :
スレチだけどexcelのグラフでスムージングをオンにするのはマジでやめて欲しい
妙に滑らかなラインが気持ち悪くて仕方ない

24 :
最小二乗法かと思ったら移動平均らしいな>Excelのスムージング
ちゃんと理解して使ってる人は少ないと思うがw

25 :
>>20
ご指摘ありがとうございます、うまく説明出来なくて申し訳ないのですが、
全体の解析の結果から数秒〜数分単位でグラフにして見たい部分とかが判った時に
予め近似曲線が求まっていれば楽でしょう、という感じで現在に至ります。
なんか、何から何まで良くわからない状態で本当に申し訳ありません・・・

26 :
先生の蔵書の中から参考資料を見つけて頂けました、これを使ってまた少し頑張ってみます。
自分でも至らない点や確認出来た点が多かったのでとても助かりました、色々と助言をありがとうございましたm(_ _)m
また判らない事があったらこちらに駆け込むかもしれませんがその時は宜しくお願いします。

27 :
>>26
新M1か、四年生かな頑張れー。

28 :
超初心者なのですが、Intel Visual Fortranを使っていらっしゃる方はいますか?
私にはC言語を白黒画面のコンソール画面でコンパイル&リンクして実行する程度の簡単な経験しかありません。
殆ど統合開発環境を使った事がないのですが、関連ホームページを調べると、魅力的なCPU毎の最適化機能とか、IMSL数値計算ライブラリを使えるようなので興味を持っています。
私が使い始めることになったバージョンは10.1です。

29 :
すいません。つまらない問題なのですが、
複数ファイルに同一の結果を出力する場合どうすればよいのでしょうか。
open(10,file='A.dat',form='formatted')
open(11,file='B.dat',form='formatted')
write(10,101)int((t2-t1)/60),dble((t2-t1)-int((t2-t1)/60)*60)
write(11,101)int((t2-t1)/60),dble((t2-t1)-int((t2-t1)/60)*60)
みたいな表現をコンパクトにしたいのです。

30 :
>>29
DO iunit = 10, 11
WRITE(iunt, 101) ....
END DO

31 :
ありがとうございます。
write(10,101)・・・
write(31,101)・・・
write(*,101)・・・
みたいな場合はその方法だと無理ですよね
やはり一行ごとに処理するのが基本なのでしょうか

32 :
>>31
そう多くないなら1行づつが基本だと思う。
でも一応、
INTEGER.PARAMETER :: iunits(3) = (/10, 31, 6/)
DO i = 1, SIZE(iunits)
WRITE(iunits(i), 101) ....
END DO
とか、あるいは内部サブルーチンにして
CALL wr_info( (/31, 10, 6/) )
......
CONTAINS
SUBROUTINE wr_info(iunits)
INTEGER, INTENT(IN) :: iunits(:)
DO i = 1, SIZE(iunits)
WRITE(iunits(i), 101) ....
END DO
RETURN
END SUBROUTINE wr_info
内部サブルーチンなら、変数は共通。 (/ /) は配列生成子で、これを使えば引数でファイル番号を
並べて指定すればよく、わざわざ配列をメインルーチンで用意する必要がなくなる。
6番は歴史的理由でコンソールになっている(はず)。


33 :
6番=標準、7番エラー出力・・・だっけ忘れた。
なんかStdoutみたいな明示するキーワードあった気がするけど忘れてもうた。

34 :
>>24 最小二乗法
でもxもyも観測量なのに普通のxは誤差無し確定値とみなすやつをへーきで使ってたりするけどねぇ。

35 :
>>24
エクセルなんか使うなよ・・・人文科学かな?

36 :
環境系の同僚に「このあたりのコーディングはだれか詳しい人に助っ人頼んだ方がいいよ」って言ったら
「いや自分でやるのが大事ですから。シミュレーションはエクセルで私がやります」って言われた
本人は、今いいこといったオレ、見たいな風情なのでなにもいえなかった

37 :
放っとけ
構うとお前さんに仕事が飛んでくるぞ

38 :
>>36 「いや自分でやるのが大事ですから。シミュレーションはエクセルで私がやります」
キリッ!
やる夫みたいだw

39 :

program sample444
real :: x(3),y(3),z(3)
integer :: i
open(1, file="aiueo.txt")
do i=1,3
read(1, *) x(i), y(i), z(i)
print *, x(i), y(i), z(i)
end do
close(1)
end program
上記のコマンドでコンパイルしてプログラムを作成しましたのですが
次のようなエラーが出てしまいます!ファイルの入出力だけがうまく進まず
もうここから全然進みません;
どなたかわかるかたよろしくお願いします;
ちなみにtxtファイルは3×3配列の数値がちゃんと入っています;
traceback: not available, compile with -ftrace=frame or -ftrace=full
Fortran runtime error: End of file

40 :
>>39
OSとコンパイラの種類
読み込むデータの例も書いた方が良いよ

41 :
>>40
わかりました。すいません;
んと、windows vistaで、コンパイラはg95です。
読み込むデータはたとえば
25 50 59
34 23 11
45 43 65
とかです。
どうかよろしくお願いします。

42 :
とっさに思いつく限りでは・・・
元データの最後の改行位置は?
open で status="unknown" を追加してみては?
くらいかなぁ。Good Luck!

43 :
読み込むデータがInt型なのにrealで読み込もうとしてるのは良くないと思う
確認してないから他にも間違いがあるかもしれないけど

44 :
>>39 Fortran runtime error: End of file
だから、>>42 のとおりデータの最後の行の右端に改行コードがないんじゃない?
>>43
大事な事だよね。
整数を実数でよんでそのあと整数化すると1小さくなることがあるし。

45 :
>>42
ふむふむ
改行位置で変わったりするのですか?
テキストにも書いていなかったので少し勉強してみます。
ありがとうございました。
>>43
なるほどー
確かにそのとおりですね;
修正しときます!
ありがとうございました。
>>44
改行コードが何か全くしりませんでした;
元データをただ改行するだけじゃだめなんですか?
もう少し勉強してみます;
ありがとうございました!

46 :
連投失礼します!
皆さんの助言でなんとかファイル読み込みできるようになりました!
ですが、1列目しかデータが反映されません;
これも改行コードとやらによるものなんでしょうか?
何回もすいません;

47 :
あまり関係ないかも・・・
Win機上では改行コードが LF/CR かな2つ無いと読めない・・・
ぎゃくにGCCやG95はそれぞれを改行コードとみなしちゃう、とか
・・・今でもあるのかなぁ・・・・?
qkc だっけ、漢字コード変換のソフトがおまけ機能で
改行コードもWin機向けに変えてくれるから、
もし元データがLinux機で作られてたのなら・・・試してちょ。
unix2dos dos2unix っていうのでLinux上でも改行コード変換はできるけど。

48 :
>>33
キーワードの方は知らんけど、標準エラーは 0 だ。
# 理由は知らんが規制が掛かって暫く
# 書き込めなかった。

49 :
thanks

50 :
>>48 理由は知らんが規制が掛かって
そういえば今回は ac.jp ドメインもいくつか規制食らってたなw

51 :
>>50
うち ocn なんだけどね。学校とは縁が切れて、博士号持ちのワープワやってるw

52 :
そうなんだ。
大学院進んだ人とかポスドクっておかねが多少もらえても雇用統計では「自発的失業者」らしいね。
それを聞いて、博士号取得をくじけた人をしっているけどそれは正解でもあるとおもった。
・・・博士号もち仲間よりw

53 :
>>51
うお、うちの会社でアルバイト(年300万研究補助)しね?

54 :
これはひでえなw>自発的失業者

55 :
!?
大学院進んだ人は普通に「学生」みたいな区分だと思ってた。
ポスドクも任期付/非常勤だからパートと同じような扱いかと・・・(´;ω;`)ブワッ

56 :
sage忘れたorz

57 :
泣くんじゃないッ!(´;ω;`)

58 :
fortran90の勉強はじめましたっ!
fortran77は全然知りません :DD

59 :
>>58
遺物と向かい合う必要がない限り、知らんで良い。
でも Fortran90 って良書はあるのかな?
色々出てるみたいだけど、倍精度の説明さえロクに
書いていないのは今も謎だ(個人的に)。

60 :
これから開催される CUDA Fortran のセミナーや講習会,知りませんか?
ググっても3月に東工大のGPUコンピューティング研究会が開催したのしか
検索されてこなくて。
もっと早くチェックしてればよかったなぁ‥‥

61 :
>>52
生活保護対象にならないようにそういう扱いにするというのは聞いたことがある。
にしてもひどい話ではある・・・(´;ω;`)
>>60
CUDAの試作機とかどっかタダで使えるところないかなぁ・・

62 :
nvidiaとか本気で流行らせたいんなら、試作機をリモートでいいから無償提供とかやりゃいいのにね
言語なんていかに裾のが広がってくかが大事なのに

63 :
>>62
? ただで(Cだけど)コンパイラ配ってるし、普通のグラボでも使えるし、Fortranコンパイラにも協力しているしで
十分やってると思うけどね。

64 :
ぼくのマシンはインテルのへっぽこアクセラレータしかないお・・・でも触ってみたいんだよう、
という人はいると思うんだ。すでに大規模&本格的に使ってる人(おおくないとおもうけど)が、
かるいデバッグ作業するとかなら普通サイズのぐらぼマシンに自分で設定して、でもいいとおもうけど、
将来使うかもという程度の興味出始めな人には
横着なだけかもしれないけどコンパイルと実行環境が整った場所があるとやはりうれしい。

65 :
最近になって、がっつり数値計算をする必要がでてfortranを
勉強しだしたんですが、要素数が不明の2次元データをファイルから読んで、
その要素分だけallocateしたいのですが、
とりあえず最後まで読んで要素の数を数えてから配列をつくろうかな、と思ったんですけど、
fortranにおいてend of fileの扱いをどうしたらいいのかわからずに困っています
使用OSはvista,コンパイラはg95です。初歩的とは思いますが、よろしくお願いします。

66 :
open(1,file='data.dat',status='old')
icount = 0
998 continue
read(lun,*,end=999) fjlasdjfkds
icount = icount + 1
goto 998
999 continue
とか、かな。
でもこれ、ファイルの最後の最後が改行コードでおわるか
EOFで終わるか両方無しでいきなり終わるか・・・でいろいろ挙動が変わるかも。

67 :
fortran 90を使用しています.
二次元配列に初期値をparameterとして代入するにはどのようにしたらよいのでしょうか.
implicit none
integer,parameter :: i(2,2) = (/1,2,3,4/)
だとエラーを吐きます.コンパイラーはPGIです.
宜しくお願いします.

68 :
>66
マジでありがとうございます!!
とりあえずreadの一個目にファイル変数渡して
できました。改行からのEOFも即EOFも問題なく動きました。
とりあえず、EOFなしのデータは使わない?と思うので。
あと、個人的な好みなのですが、goto文はあまり使いたくないので、
とりあえずdoループで書いたのですけど、endはやはり、
ちょっとぐぐってみたかんじ、ジャンプさせるしかないようにみえるんですが、
exitで抜けさせることはできないのでしょうか?
もしご存知のかたがいらっしゃいましたら、ご教授おねがいします。
なんにせよ、とりあえず進めそうです!66さんありがとうございます。

69 :
>>67
ttp://www.str.ce.akita-u.ac.jp/~gotou/zyouhou/f90/sec6.html#6.4.4.

70 :
>>69
ありがとうございます.
地道に代入することにします

71 :
>>68
いまコンパイラないから試してないけど、これで走らないかな。
open(1,file='data.dat',status='old')
icont = 0
do
read(1,*,iostat=io) aaa
if(io /= 0 ) exit
icont = icount + 1
end do

72 :
>>67
INTEGER, PARAMETER :: n(2, 2) = RESHAPE([1, 2, 3, 4], [2, 2])
[ = (/
] = )]
ただし Fortran2003

73 :
>>71
iostat つかっての方がきれいで良いね。

74 :
>>73
他のエラーを捉えられなくなるのが難点か。

75 :
エラー番号って規格で決まってるの?

76 :
レス遅くなって、すみません。
iostatの読み込みで、−1がたったらexitするように書いたら
望むとおりの挙動をしてくれました。
なんとなく勝手がわかってきたきがします。
重ね重ね、ありがとうございます!

77 :
>>74
大半は決まってない。
EOF=-1 は、まず大丈夫だが、これが規格なのか、慣例なのか分からん。
たしか EOL=-2 だったか。
Fortran2008の次期規格で、この辺の一部の定数が、INTRINSIC定数として定義されるらしい。

78 :
>>77
EOF=-1は慣例で規格としては決まってない。
だから、EOF=-1と決めつけてプログラムするのは危険。
まぁ、そんな危険はほとんどないが。

79 :
>>78
EOF=-1 は慣例なのかー。
知らんかったぜ。

80 :
すみません、質問させて下さい。
数万行ある(x,y)データを600行ごとに値を読んでサブルーチンで計算させて
そのサブルーチンで出て来た値をまた別のサブルーチンで計算させて最後に出て来た結果を
出力ファイルに書き込むようなメインプログラムの作り方がどうにもわかりません。
判るかたがいましたらご教授頂けると助かります。
f77を覚えたてです、まるっきりの初心者で恐縮ですが宜しくお願いします。

81 :
追記。
数万行のデータのうち始めの600行に対してサブルーチン1、サブルーチン2を実行、その結果を出力ファイルに書き込む
次の600行を同じようにサブルーチン1、2実行、結果を同じ出力ファイルの最後の行から付け足して書き込む
これを入力データの行数分だけ行いたい、という感じです。

82 :
age

83 :
入力データは (f7.0,f9.2) X(I),Y(I) です。
X(I)は0から始まって1,2,3,...600,601,...20000,20001...
という風に1ずつ増えています。

84 :
おまえらソースコードの管理どうしてる?

85 :
open(10,file=infile)
open(20,file=outfile)
N=600
30 continue
DO 20 I=N,N+6001
DO 20 I=0,N+1
20 READ(10,*) X(I),Y(I)
CALL SUB1(X,Y,G,H,N,MP)
DO 40 I=N,N+600
40 WRITE(20,*) X(I),Y(I),G(I),H(I)
WRITE(6,*) X(I),Y(I),G(I),H(I)
N=N+600
goto 30
close (20)
close (10)
STOP
サブルーチンを一つだけにして結果をファイルに出力させてみました。
上記のようにしてみたのですが、どうしてもうまく600行毎に計算できません。
もし判るかたがいらっしゃいましたら助言を頂けると助かります。

86 :
DO 20 I=N,N+6001
DO 20 I=0,N+1
訂正
DO 20 I=N,N+601

87 :
>>84
脳内

88 :
ぬるぽ

89 :
ガッ

90 :
>>85
すくなくとも 
N=1
DO 20 I = N, N + 600
もう一個のDO 20 は要らない。

91 :
>>90
ぬるぽいんたーえくせぷしょん

92 :
>>91
FORTRAN スレなんだから、ABEND だろ!

93 :
>>90
すみません、色々試していてコメントアウトしたところとかを載せてしまっていたので
86で訂正しています。ややこしくて申し訳有りません。
今のところサブルーチン2つまわすやりかたのほうで下のような感じにしています。
N=0
30 continue
DO 20 I=N,N+601
20 READ(10,*) X(I),Y(I)
CALL SUB1(X,Y,G,H,N,MP)
DO 40 I=N,N+600
40 WRITE(20,*) X(I),Y(I),G(I),H(I)
HH=1
DO 30 I=N,N+600
XX=X(N)+HH*I
YY=SUB2(G,H,X,Y,XX,N,MP)
KH=0
DO 50 K=N,N+600
IF(ABS(X(K)-XX).LE,1.d0) THEN
GOTO 50
ENDIF
50 CONTINUE
WRITE(20,fmt)XX,YY
30 CONTINUE
N=N+600
goto 30

94 :
>>80続き(改行が多すぎるのでエラーになってしまったので)
PARAMETER (MP=36000, NW=600)
DIMENSION X(0:MP),Y(0:MP),G(0:MP),H(0:MP)としています、
MPはデータの行数で、ファイル毎に少し違うのですが最大行数を入れてあります。
600行を読み込んで、SUB1とSUB2を計算させて、ファイルに書き出して次の600行をまた・・・
という感じで操作させたいのですが、何故かおそらく始めの600行のSUB1で出て来るHやGを使って
次の600行以降が計算されているような変な結果になってしまいまして。
始めの600行に関しては結果として正しい値が出て来ているのでサブルーチン部分には問題は無いと思います。
本当にすみませんがよろしくお願いします。

95 :
あわわわまた間違えていました!!!30 CONTINUEが2回ありますが
>>93の頭の30 continueは15 continueの間違いで、最後のgoto 30がgoto 15になります!!!
ほんとうに申し訳有りません。。。

96 :
どうもGOTO文やDO..CONTINUE文で混乱しているようだけど,
まだFORTRANを覚え立てなら,わざわざ古い書き方で覚えずに,
Fortran90形式のDO..END DO構文で慣れた方がいいんではないかい?
特にGOTO文を使うのは間違いを誘発しやすいから,使わないようにするのが世界的な流れだし.

97 :
ところでend doとendoはどっちが望ましいの?
個人的にenddoの方が一語にまとまってて好きだけど

98 :
>>90
そうなんですか、理解していませんでした(>_<)
f77とf90だとかなり違うのでしょうか?
例えば参考にしているサイト陣がf90だったりf77だったりそれぞれ違っていたと思うのですが、
取り混ぜてしまっていたらまともなコードにはならない・・・という考えで合っていますか?
教科書は今までf77のものを使っていたので、なんにしてもf90のものを探してみます。

99 :
(>_<) …

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
31: 【RAD統合環境】 Qt 総合スレ 12 【Win/Mac/Linux】 (757)
32: 推薦図書/必読書のためのスレッド 65 (729)
33: 【入門】Common Lisp その8【質問よろず】 (738)
34: Eclipse統合M32【Java/C++/Ruby/Python/Perl】 (208)