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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
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デフォルトの名無しさん:2010/03/28(日) 04:40:50
>>1
乙! (≧∀≦)b
3デフォルトの名無しさん:2010/03/28(日) 08:28:13
お前ハイテンションだな
この手の顔文字って結構イタい
4デフォルトの名無しさん:2010/03/28(日) 11:16:57
>>1
おつ

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

6デフォルトの名無しさん:2010/03/28(日) 15:30:08
>>3
やっぱ今はやりの顔文字はこれだよな (^p^)b
7デフォルトの名無しさん:2010/03/28(日) 19:10:59
●関連スレ【 FORTRAN W 】の URL は変更されていますよ〜。
http://pc12.2ch.net/test/read.cgi/tech/1163319215/
81:2010/03/28(日) 21:34:38
>>7
専ブラなんで気づかなかった、すまん。
9デフォルトの名無しさん:2010/03/29(月) 05:06:13
>>8
いえいえ,俺もお気に入りメニューに入れてたんだけど,
なんで新しいレスが来ないのかなと長時間思ってた。
んで,昨日初めて気が付いたw
10デフォルトの名無しさん:2010/04/05(月) 16:19:37
はじめまして、超初心者なので質問させて下さい。

今扱っているデータは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デフォルトの名無しさん:2010/04/05(月) 17:30:46
>>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デフォルトの名無しさん:2010/04/05(月) 18:57:27
>>11
10です、前の値で埋める方法も判ればそれはとても嬉しいです、
それもやってみようとしてうまくいきませんでした...
また、前後の値のみだとそれほど信用高いというわけでも無いので
フーリエか最小二乗法で補完出来ればなお良い、という感じです。

3秒くらいの抜けは良い方でデータ取得時の状態が酷いときには
20秒くらい抜けてしまっていたりして、どうしたものかと思い悩んでいます。
1310:2010/04/05(月) 19:02:15
訂正12>それもやってみようとしてうまくいきませんでした...

やってみたけれど、結果で20秒とか30秒とかの間
同じ値がずらりと続いていておかしな事になった時間帯があり
あまりにも無惨だったのでやめた事を思い出しました。
14デフォルトの名無しさん:2010/04/05(月) 22:56:49
>>10
補間なのか補完なのかもよくわからん。
(無いデータを補完しておくのか、抜けたのを内挿するのか)
のちのちのデータ解析にも関わるので、一度指導教官とよく話しあった方がいいぞよ。

詳しいことが分からんからなんとも言えないが、データ読み込み時に、データ補間/補完もできるが、
生データは無加工のままとっておいて、後処理で補完した方がいい気もする。

まぁコメントがつけられるデータ形式なら、補完行にコメントを付けておくこともできるが・・・

1510:2010/04/07(水) 18:42:20
自宅PCが起動しなくなったトラブル&携帯が規制かかってて今まで書き込めませんでした、
すみませんm(_ _)m

>>14
無いデータを補完です、データ抜けでその時間帯のデータが無くなっているので。
生データはちゃんととっておいています、フォートランでデータ加工時に
別名をつけていっているので途中経過も判るようになっています。

先生からは「とりあえず調べてやってみて」と言われまして
色々調べてはいるもののちょっと混乱しているのでこちらに助けを求めに来ました。
もしヒントだけでも教えて頂けるようでしたらお願い致しますm(_ _)m
16デフォルトの名無しさん:2010/04/08(木) 01:09:01
>>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
1715:2010/04/08(木) 01:14:06
データファイル
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?
1817:2010/04/08(木) 01:27:38
ああごめん>>17>>16が書いている。名前欄の>>15は間違い。

>>17のデータは2chだと半角スペースがつめられてしまうのであれだが、
実際は空白が入って小数点が揃うように並べてある。
そうでないと読み込みのところのformatがくるってしまう。

データ読み込みとデータ補間は、それぞれサブルーチンにすればすっきりするだろう。
コメント行で切れ目を入れておいた。

スレ汚しすまん。
1910:2010/04/08(木) 07:30:01
昨晩また規制に引っかかってしまって書き込み出来ませんでしたm(_ _)m

>>16,17,18
ありがとうございます、
抜けたところに前のデータを挿入して補完する方法は以前試したのですが
データ落ちが酷いところでは数十秒くらい同じ値が続く事になってしまって
あまり宜しくないという事で、今回別の方法で補完するやり方を探しているところです。

現在は3次スプライン補完という方法があるらしく色々調べているのですが
結構難しくてまだ理解出来ていません(>_<)もう少し頑張ってみます。
20デフォルトの名無しさん:2010/04/08(木) 11:05:39
データ補間してフーリェかけたり平均とったり・・・とか自爆なのを
今でもときどき見るけど、気を付けてね。
走査平均対象の10データ中の有効なものの数でエラーバー決めて解析すればそれでいいと思うけどねぇ。

平均をとる操作と線形あるいは高次補間って同じ事
((非負の係数で)合計が1になる係数をかけて足し算する事に帰着する)だから
とある補間(補完?)した後に平均値をとっても・・・という気はする。
一度、教官に確認した方がいいよ。単なるテストというか簡単な試練を与えられただけなら
それはそれで教育的ともいえるけど・・・危険な香りがする。
21デフォルトの名無しさん:2010/04/08(木) 11:16:55
>>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デフォルトの名無しさん:2010/04/08(木) 11:17:54
しかも .OR. じゃなかったね・・・
23デフォルトの名無しさん:2010/04/08(木) 11:20:54
スレチだけどexcelのグラフでスムージングをオンにするのはマジでやめて欲しい
妙に滑らかなラインが気持ち悪くて仕方ない
24デフォルトの名無しさん:2010/04/08(木) 11:31:15
最小二乗法かと思ったら移動平均らしいな>Excelのスムージング
ちゃんと理解して使ってる人は少ないと思うがw
2510:2010/04/08(木) 13:31:13
>>20
ご指摘ありがとうございます、うまく説明出来なくて申し訳ないのですが、
全体の解析の結果から数秒〜数分単位でグラフにして見たい部分とかが判った時に
予め近似曲線が求まっていれば楽でしょう、という感じで現在に至ります。

なんか、何から何まで良くわからない状態で本当に申し訳ありません・・・
2610:2010/04/08(木) 17:30:07
先生の蔵書の中から参考資料を見つけて頂けました、これを使ってまた少し頑張ってみます。
自分でも至らない点や確認出来た点が多かったのでとても助かりました、色々と助言をありがとうございましたm(_ _)m
また判らない事があったらこちらに駆け込むかもしれませんがその時は宜しくお願いします。
27デフォルトの名無しさん:2010/04/08(木) 19:11:54
>>26
新M1か、四年生かな頑張れー。
28デフォルトの名無しさん:2010/04/08(木) 19:39:57
超初心者なのですが、Intel Visual Fortranを使っていらっしゃる方はいますか?
私にはC言語を白黒画面のコンソール画面でコンパイル&リンクして実行する程度の簡単な経験しかありません。
殆ど統合開発環境を使った事がないのですが、関連ホームページを調べると、魅力的なCPU毎の最適化機能とか、IMSL数値計算ライブラリを使えるようなので興味を持っています。
私が使い始めることになったバージョンは10.1です。
29デフォルトの名無しさん:2010/04/08(木) 23:42:47
すいません。つまらない問題なのですが、
複数ファイルに同一の結果を出力する場合どうすればよいのでしょうか。

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デフォルトの名無しさん:2010/04/09(金) 00:03:25
>>29
DO iunit = 10, 11
WRITE(iunt, 101) ....
END DO

3129:2010/04/09(金) 00:34:57
ありがとうございます。
write(10,101)・・・
write(31,101)・・・
write(*,101)・・・

みたいな場合はその方法だと無理ですよね
やはり一行ごとに処理するのが基本なのでしょうか
32デフォルトの名無しさん:2010/04/09(金) 01:05:56
>>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デフォルトの名無しさん:2010/04/09(金) 03:29:41
6番=標準、7番エラー出力・・・だっけ忘れた。
なんかStdoutみたいな明示するキーワードあった気がするけど忘れてもうた。
34デフォルトの名無しさん:2010/04/09(金) 03:33:47
>>24 最小二乗法
でもxもyも観測量なのに普通のxは誤差無し確定値とみなすやつをへーきで使ってたりするけどねぇ。
35デフォルトの名無しさん:2010/04/10(土) 09:07:02
>>24
エクセルなんか使うなよ・・・人文科学かな?
36デフォルトの名無しさん:2010/04/10(土) 13:14:38
環境系の同僚に「このあたりのコーディングはだれか詳しい人に助っ人頼んだ方がいいよ」って言ったら
「いや自分でやるのが大事ですから。シミュレーションはエクセルで私がやります」って言われた
本人は、今いいこといったオレ、見たいな風情なのでなにもいえなかった
37デフォルトの名無しさん:2010/04/10(土) 14:16:13
放っとけ
構うとお前さんに仕事が飛んでくるぞ
38デフォルトの名無しさん:2010/04/12(月) 08:18:32
>>36 「いや自分でやるのが大事ですから。シミュレーションはエクセルで私がやります」

キリッ!
やる夫みたいだw
39デフォルトの名無しさん:2010/04/13(火) 15:30:32

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デフォルトの名無しさん:2010/04/13(火) 20:36:12
>>39
OSとコンパイラの種類
読み込むデータの例も書いた方が良いよ
41デフォルトの名無しさん:2010/04/13(火) 21:08:39
>>40
わかりました。すいません;
んと、windows vistaで、コンパイラはg95です。
読み込むデータはたとえば
25 50 59
34 23 11
45 43 65
とかです。
どうかよろしくお願いします。
42デフォルトの名無しさん:2010/04/14(水) 01:04:24
とっさに思いつく限りでは・・・

元データの最後の改行位置は?
open で status="unknown" を追加してみては?

くらいかなぁ。Good Luck!
43デフォルトの名無しさん:2010/04/14(水) 06:07:06
読み込むデータがInt型なのにrealで読み込もうとしてるのは良くないと思う
確認してないから他にも間違いがあるかもしれないけど
44デフォルトの名無しさん:2010/04/14(水) 11:39:21
>>39 Fortran runtime error: End of file
だから、>>42 のとおりデータの最後の行の右端に改行コードがないんじゃない?
>>43
大事な事だよね。
整数を実数でよんでそのあと整数化すると1小さくなることがあるし。
45デフォルトの名無しさん:2010/04/14(水) 16:52:11
>>42
ふむふむ
改行位置で変わったりするのですか?
テキストにも書いていなかったので少し勉強してみます。
ありがとうございました。

>>43
なるほどー
確かにそのとおりですね;
修正しときます!
ありがとうございました。

>>44
改行コードが何か全くしりませんでした;
元データをただ改行するだけじゃだめなんですか?
もう少し勉強してみます;
ありがとうございました!
46デフォルトの名無しさん:2010/04/14(水) 18:09:47
連投失礼します!
皆さんの助言でなんとかファイル読み込みできるようになりました!
ですが、1列目しかデータが反映されません;
これも改行コードとやらによるものなんでしょうか?
何回もすいません;
47デフォルトの名無しさん:2010/04/15(木) 15:18:39
あまり関係ないかも・・・
Win機上では改行コードが LF/CR かな2つ無いと読めない・・・
ぎゃくにGCCやG95はそれぞれを改行コードとみなしちゃう、とか
・・・今でもあるのかなぁ・・・・?

qkc だっけ、漢字コード変換のソフトがおまけ機能で
改行コードもWin機向けに変えてくれるから、
もし元データがLinux機で作られてたのなら・・・試してちょ。
unix2dos dos2unix っていうのでLinux上でも改行コード変換はできるけど。
48デフォルトの名無しさん:2010/04/19(月) 22:55:45
>>33

キーワードの方は知らんけど、標準エラーは 0 だ。

# 理由は知らんが規制が掛かって暫く
# 書き込めなかった。
49デフォルトの名無しさん:2010/04/20(火) 04:01:32
thanks
50デフォルトの名無しさん:2010/04/21(水) 11:21:26
>>48 理由は知らんが規制が掛かって

そういえば今回は ac.jp ドメインもいくつか規制食らってたなw
5148:2010/04/21(水) 22:42:13
>>50
うち ocn なんだけどね。学校とは縁が切れて、博士号持ちのワープワやってるw
52デフォルトの名無しさん:2010/04/22(木) 01:51:47
そうなんだ。

大学院進んだ人とかポスドクっておかねが多少もらえても雇用統計では「自発的失業者」らしいね。
それを聞いて、博士号取得をくじけた人をしっているけどそれは正解でもあるとおもった。
・・・博士号もち仲間よりw
53デフォルトの名無しさん:2010/04/22(木) 13:08:56
>>51
うお、うちの会社でアルバイト(年300万研究補助)しね?
54デフォルトの名無しさん:2010/04/23(金) 21:36:21
これはひでえなw>自発的失業者
55デフォルトの名無しさん:2010/04/27(火) 20:19:15
!?
大学院進んだ人は普通に「学生」みたいな区分だと思ってた。
ポスドクも任期付/非常勤だからパートと同じような扱いかと・・・(´;ω;`)ブワッ
56デフォルトの名無しさん:2010/04/27(火) 20:19:56
sage忘れたorz
57デフォルトの名無しさん:2010/04/28(水) 15:51:15
泣くんじゃないッ!(´;ω;`)
58デフォルトの名無しさん:2010/04/29(木) 10:52:45
fortran90の勉強はじめましたっ!
fortran77は全然知りません :DD
59デフォルトの名無しさん:2010/04/29(木) 12:08:45
>>58
遺物と向かい合う必要がない限り、知らんで良い。
でも Fortran90 って良書はあるのかな?
色々出てるみたいだけど、倍精度の説明さえロクに
書いていないのは今も謎だ(個人的に)。
60デフォルトの名無しさん:2010/05/02(日) 04:04:51
これから開催される CUDA Fortran のセミナーや講習会,知りませんか?
ググっても3月に東工大のGPUコンピューティング研究会が開催したのしか
検索されてこなくて。
もっと早くチェックしてればよかったなぁ‥‥
61デフォルトの名無しさん:2010/05/10(月) 07:18:31
>>52
生活保護対象にならないようにそういう扱いにするというのは聞いたことがある。
にしてもひどい話ではある・・・(´;ω;`)
>>60
CUDAの試作機とかどっかタダで使えるところないかなぁ・・
62デフォルトの名無しさん:2010/05/10(月) 11:21:13
nvidiaとか本気で流行らせたいんなら、試作機をリモートでいいから無償提供とかやりゃいいのにね
言語なんていかに裾のが広がってくかが大事なのに
63デフォルトの名無しさん:2010/05/10(月) 22:45:53
>>62
? ただで(Cだけど)コンパイラ配ってるし、普通のグラボでも使えるし、Fortranコンパイラにも協力しているしで
十分やってると思うけどね。
64デフォルトの名無しさん:2010/05/11(火) 10:29:26
ぼくのマシンはインテルのへっぽこアクセラレータしかないお・・・でも触ってみたいんだよう、
という人はいると思うんだ。すでに大規模&本格的に使ってる人(おおくないとおもうけど)が、
かるいデバッグ作業するとかなら普通サイズのぐらぼマシンに自分で設定して、でもいいとおもうけど、
将来使うかもという程度の興味出始めな人には
横着なだけかもしれないけどコンパイルと実行環境が整った場所があるとやはりうれしい。
65デフォルトの名無しさん:2010/05/13(木) 15:33:38
最近になって、がっつり数値計算をする必要がでてfortranを
勉強しだしたんですが、要素数が不明の2次元データをファイルから読んで、
その要素分だけallocateしたいのですが、
とりあえず最後まで読んで要素の数を数えてから配列をつくろうかな、と思ったんですけど、
fortranにおいてend of fileの扱いをどうしたらいいのかわからずに困っています
使用OSはvista,コンパイラはg95です。初歩的とは思いますが、よろしくお願いします。
66デフォルトの名無しさん:2010/05/13(木) 15:50:10
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デフォルトの名無しさん:2010/05/13(木) 16:08:21
fortran 90を使用しています.
二次元配列に初期値をparameterとして代入するにはどのようにしたらよいのでしょうか.

implicit none
integer,parameter :: i(2,2) = (/1,2,3,4/)

だとエラーを吐きます.コンパイラーはPGIです.
宜しくお願いします.
68デフォルトの名無しさん:2010/05/13(木) 16:30:50
>66
マジでありがとうございます!!
とりあえずreadの一個目にファイル変数渡して
できました。改行からのEOFも即EOFも問題なく動きました。
とりあえず、EOFなしのデータは使わない?と思うので。
あと、個人的な好みなのですが、goto文はあまり使いたくないので、
とりあえずdoループで書いたのですけど、endはやはり、
ちょっとぐぐってみたかんじ、ジャンプさせるしかないようにみえるんですが、
exitで抜けさせることはできないのでしょうか?
もしご存知のかたがいらっしゃいましたら、ご教授おねがいします。
なんにせよ、とりあえず進めそうです!66さんありがとうございます。
69デフォルトの名無しさん:2010/05/13(木) 17:48:17
7067:2010/05/13(木) 18:08:38
>>69
ありがとうございます.
地道に代入することにします
71デフォルトの名無しさん:2010/05/13(木) 23:22:45
>>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デフォルトの名無しさん:2010/05/14(金) 00:13:47
>>67
INTEGER, PARAMETER :: n(2, 2) = RESHAPE([1, 2, 3, 4], [2, 2])

[ = (/
] = )]
ただし Fortran2003

7366:2010/05/14(金) 03:18:41
>>71
iostat つかっての方がきれいで良いね。
74デフォルトの名無しさん:2010/05/14(金) 11:24:34
>>73
他のエラーを捉えられなくなるのが難点か。
75デフォルトの名無しさん:2010/05/14(金) 13:25:44
エラー番号って規格で決まってるの?
7665:2010/05/14(金) 15:29:50
レス遅くなって、すみません。
iostatの読み込みで、−1がたったらexitするように書いたら
望むとおりの挙動をしてくれました。
なんとなく勝手がわかってきたきがします。
重ね重ね、ありがとうございます!
77デフォルトの名無しさん:2010/05/14(金) 21:51:12
>>74
大半は決まってない。
EOF=-1 は、まず大丈夫だが、これが規格なのか、慣例なのか分からん。
たしか EOL=-2 だったか。

Fortran2008の次期規格で、この辺の一部の定数が、INTRINSIC定数として定義されるらしい。
78デフォルトの名無しさん:2010/05/14(金) 22:25:30
>>77
EOF=-1は慣例で規格としては決まってない。
だから、EOF=-1と決めつけてプログラムするのは危険。
まぁ、そんな危険はほとんどないが。
79デフォルトの名無しさん:2010/05/15(土) 22:51:39
>>78
EOF=-1 は慣例なのかー。
知らんかったぜ。
80デフォルトの名無しさん:2010/05/17(月) 03:49:59
すみません、質問させて下さい。

数万行ある(x,y)データを600行ごとに値を読んでサブルーチンで計算させて
そのサブルーチンで出て来た値をまた別のサブルーチンで計算させて最後に出て来た結果を
出力ファイルに書き込むようなメインプログラムの作り方がどうにもわかりません。
判るかたがいましたらご教授頂けると助かります。
f77を覚えたてです、まるっきりの初心者で恐縮ですが宜しくお願いします。
81デフォルトの名無しさん:2010/05/17(月) 03:55:24
追記。
数万行のデータのうち始めの600行に対してサブルーチン1、サブルーチン2を実行、その結果を出力ファイルに書き込む
次の600行を同じようにサブルーチン1、2実行、結果を同じ出力ファイルの最後の行から付け足して書き込む
これを入力データの行数分だけ行いたい、という感じです。
82デフォルトの名無しさん:2010/05/17(月) 08:09:42
age
8380,81:2010/05/17(月) 08:16:19
入力データは (f7.0,f9.2) X(I),Y(I) です。
X(I)は0から始まって1,2,3,...600,601,...20000,20001...
という風に1ずつ増えています。
84デフォルトの名無しさん:2010/05/17(月) 16:56:27
おまえらソースコードの管理どうしてる?
8580,81:2010/05/17(月) 17:20:37
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行毎に計算できません。
もし判るかたがいらっしゃいましたら助言を頂けると助かります。
8680,81:2010/05/17(月) 17:22:19
DO 20 I=N,N+6001
DO 20 I=0,N+1
訂正
DO 20 I=N,N+601
87デフォルトの名無しさん:2010/05/17(月) 17:56:32
>>84
脳内
88デフォルトの名無しさん:2010/05/18(火) 02:50:34
ぬるぽ
89デフォルトの名無しさん:2010/05/18(火) 17:27:11
ガッ
90デフォルトの名無しさん:2010/05/18(火) 23:50:40
>>85
すくなくとも 

N=1

DO 20 I = N, N + 600
もう一個のDO 20 は要らない。




91デフォルトの名無しさん:2010/05/19(水) 02:05:24
>>90
ぬるぽいんたーえくせぷしょん
92デフォルトの名無しさん:2010/05/19(水) 11:38:21
>>91
FORTRAN スレなんだから、ABEND だろ!
9380:2010/05/19(水) 16:10:18
>>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
9480:2010/05/19(水) 16:12:46
>>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行に関しては結果として正しい値が出て来ているのでサブルーチン部分には問題は無いと思います。
本当にすみませんがよろしくお願いします。
9580:2010/05/19(水) 16:15:46
あわわわまた間違えていました!!!30 CONTINUEが2回ありますが
>>93の頭の30 continueは15 continueの間違いで、最後のgoto 30がgoto 15になります!!!
ほんとうに申し訳有りません。。。
96デフォルトの名無しさん:2010/05/19(水) 16:47:43
どうもGOTO文やDO..CONTINUE文で混乱しているようだけど,
まだFORTRANを覚え立てなら,わざわざ古い書き方で覚えずに,
Fortran90形式のDO..END DO構文で慣れた方がいいんではないかい?

特にGOTO文を使うのは間違いを誘発しやすいから,使わないようにするのが世界的な流れだし.
97デフォルトの名無しさん:2010/05/19(水) 17:05:53
ところでend doとendoはどっちが望ましいの?
個人的にenddoの方が一語にまとまってて好きだけど
9880:2010/05/19(水) 17:35:55
>>90
そうなんですか、理解していませんでした(>_<)

f77とf90だとかなり違うのでしょうか?
例えば参考にしているサイト陣がf90だったりf77だったりそれぞれ違っていたと思うのですが、
取り混ぜてしまっていたらまともなコードにはならない・・・という考えで合っていますか?

教科書は今までf77のものを使っていたので、なんにしてもf90のものを探してみます。
99デフォルトの名無しさん:2010/05/19(水) 18:49:19
(>_<) …
100デフォルトの名無しさん:2010/05/19(水) 19:29:53
良いこと思いついた
焚書坑儒して77を滅ぼそう
101デフォルトの名無しさん:2010/05/19(水) 23:16:55
>>94
色々、妙な点が多いプログラムではあるので、可能性は色々あるが、
サブルーチン側でX(1)〜X(600)までで計算してるんで内科医?

そもそも、古い数値がいらないなら、600個の配列に毎回書き換えて読み込めばいいし、
サブルーチン側でも600個を受け取って、1〜600までの要素で計算すれば良い。

全要素を引渡しているようだが、必要なのかな?

>>100
77もいいとこあるんだよ。
102デフォルトの名無しさん:2010/05/20(木) 01:00:59
大学のPCのOSがLinuxでfortranを学び始めました。
家でも練習みたいのをしたのですが、windows vistaでもできるのでしょうか。
例えばメモ帳に書いて、フリーのコンパイラでコンパイルするというのを想定しているのですがこれは無理なんですか。
103デフォルトの名無しさん:2010/05/20(木) 01:05:07
>>102
知らないから僕ではなく他の人に聞いてみてよ
104デフォルトの名無しさん:2010/05/20(木) 01:55:37
105デフォルトの名無しさん:2010/05/20(木) 02:26:22
>>104
そのスレの3つ目は・・・・w
106デフォルトの名無しさん:2010/05/20(木) 03:20:19
>>102

これが所謂ゆとりというものなのか
10780:2010/05/20(木) 03:55:52
>>101
助言ありがとうございます、毎回書き換えてみる方法を色々試してみました。
下のようにメインプログラムを書き換えてみたのですが、
READ(10,*) X(0),Y(0)
do N=1,NW,MP
DO I=1,MP
READ(10,*,err=99) X(I),Y(I)
end do
CALL SUB1(X,Y,G,H,N,MP)
DO I=0,INT(X(MP-1)-X(0))
XX=X(0)+real(I)
K=1
do while ((X(K-1)-XX)*(X(K)-XX) > 0.0d0)
K=K+1
end do
YY=SUB2(G,H,X,Y,XX,K,MP)
WRITE(20,2100) XX,YY
end do
X(0) = X(MP)
Y(0) = Y(MP)
end do
close (20)
close (10)
STOP
108デフォルトの名無しさん:2010/05/20(木) 04:01:02
まぁまぁw
Win機だと gfortran が一番かな?
タダだし、Linux版その他あってWin機でテストしたコードをよそに持っていっても
規格やら互換の問題がとても少ない・・・とおもう。OpenMPも使えるし。
コマンドプロンプト内の処理しかなく、Linuxコンソールと基本同じ使い勝手。
インスト(といってもファイルを展開するだけなのだが)楽チン。環境変数設定はめんどいw
10980:2010/05/20(木) 04:02:28
107続き
最後のほうのデータが抜けてしまって、現在はどうしたものかと悩んでいます。
取り敢えずサブルーチンのDIMENSIONの設定とかをもう少し見直してみます。
110102:2010/05/20(木) 04:47:12
>>108
すいません。。PCは大学入るまで使うことが少なくてよくわからなかったのです。
とりあえずいわれたものをダウンロードしてみます。ありがとごいました
111デフォルトの名無しさん:2010/05/20(木) 05:04:02
>>110
g95だがこのへんとか
ttp://d.hatena.ne.jp/arakik10/20090213/p1

あと最近の本だとこれがわかりやすい。
ttp://www.amazon.co.jp/dp/4627847211
112108:2010/05/20(木) 07:46:36
タダのFortranコンパイラを、と訊かれると
自分が使っている&インストール簡単だった、というそれだけの理由でgfortranを
人にはいつも薦めてるけど・・・じつはg95との違いをよく知らないのよねw

ぐぬーライセンスとか内部のオトナの事情はさておき、1ユーザーとしてみると何が違うのかな?
113デフォルトの名無しさん:2010/05/20(木) 08:03:21
gfortranでは装置番号を環境変数で指定できない
114デフォルトの名無しさん:2010/05/20(木) 10:25:59
>>85,>>92>>107
同じ人が書いたとは思えない!初心者でも1日でこんなに上達するんだな。

>最後のほうのデータが抜けてしまって
表現があいまいすぎて意味分からん。もしかして女の子?
助言を求めているなら、具体的に書かないとなんとも言いようがない。
115デフォルトの名無しさん:2010/05/20(木) 10:27:19
× >>85,>>92>>107
○ >>85,>>93>>107
116デフォルトの名無しさん:2010/05/20(木) 15:16:53
あえて77で書いてる人っているの?
117デフォルトの名無しさん:2010/05/20(木) 15:43:03
ifortマンセー
11880,85,93,107:2010/05/20(木) 19:25:09
>>114
わかりにくくて申し訳有りません(>_<)データは30000行入っていて欲しかったのですが
どうやら最後のほうや途中がデータ計測の時に抜けてしまったようでした。
抜け自体はそれほど多く無いので線形補間というのをすれば問題は無いそうです。
計算式は渡されて、どうやるかはまだ良く判っていませんが、調べてみます。

>もしかして女の子?
はい、最近分野変えで物理系の研究室に転入してきたばかりなのですが
今まではプログラミングには縁もゆかりもありませんでした。

>107は昨晩学校を徘徊して他の研究室に残っていた先輩からもアドバイスを貰いました。
>93については先輩曰く「動くようなプログラムには見えないぞ」との事で
つまるところ>>96と同じような指摘を受けたりなんだりして、手直ししてみました。

自分ではまだまだ勉強が浅いので次に違うプログラムを作る時には
また色々戸惑うだろうなぁとは思っています。
これからまたしっかり勉強します、ありがとうございました。
119デフォルトの名無しさん:2010/05/20(木) 19:30:16
すいません。学校の課題でy=(x+1)(x-3)=0でNEWTON法を使い、収束判定が0.0000001で終わるプログラムを
「READ」「WRITE」「if」「GO TO」「SUBROUTIN」「DIMENSION]だけ使って作るんですけど・・・
SUBROUTINEとDIMENTIONが全く分かりません。誰か教えてください。
120デフォルトの名無しさん:2010/05/20(木) 22:22:05
>>118
匿名掲示板だから思い切って聞きますが、処女ですか?
121デフォルトの名無しさん:2010/05/20(木) 22:38:22
>>120
横レスですが違います
122デフォルトの名無しさん:2010/05/20(木) 22:57:36
>>120
他人ですが・・・うるさーい(>_<)
123デフォルトの名無しさん:2010/05/21(金) 00:27:38
\   / .::::::::::::::::::::::::;;:;;::,ッ、::::::   )  く   ホ  す
  \ l  ,ッィrj,rf'"'"'"    lミ::::::: く   れ  モ  ま
     Y           ,!ミ::::::: ヽ  な  以  な
`ヽ、  |           くミ:::::::: ノ   い  外  い
     |、__  ャー--_ニゞ `i::::,rく   か  は
``''ー- ゝ、'l   ゙̄´彑,ヾ   }::;! ,ヘ.)  !  帰
      ゙ソ   """"´`     〉 L_      っ
      /          i  ,  /|    て    r
≡=- 〈´ ,,.._        i  't-'゙ | ,へ     ,r┘
,、yx=''" `ー{゙ _, -、    ;  l   レ'  ヽr、⌒ヽ'
        ゙、`--─゙      /!         `、
  _,,、-     ゙、 ー''    / ;           `、
-''"_,,、-''"    ゙、    /;;' ,'  /         、\
-''"    /   `ー─''ぐ;;;;' ,'  ノ      
   //    /     ヾ_、=ニ゙
124デフォルトの名無しさん:2010/05/21(金) 01:01:32
本当に誰か助けてください(TAT)
流れは
xを読み込む

y1=(x+1)(x-3)とy2=2x-2のy1、y2をそれぞれ算出

H=y1/y2を算出

Hが0.0000001より小さいか判別

小さかったらHを出力して終了、大きかったらx-H=Aを算出

Aをxに代入して0.0000001より小さくなるまで繰り返し計算する

こんな感じのプログラムを作りたいんですが・・・全然分からなくてできません・・・
誰か本当に助けたください
125デフォルトの名無しさん:2010/05/21(金) 01:31:01
>>124
ガンガレ!
126デフォルトの名無しさん:2010/05/21(金) 01:51:09
>>90あたりからの流れ好きだよ俺は
127デフォルトの名無しさん:2010/05/21(金) 02:12:18
>>124
エラーチェック無し、暴走考慮せず、記述通りで無駄あり、Fortran90だ。
PROGRAM unko
IMPLICIT NONE
REAL :: x, y1, y2, a, h
x = 0.0
DO
y1 = (x + 1.0) * (x - 3.0)
y2 = 2.0 * x - 2.0
h = y1 / y2
IF (ABS(h) < 1.0e-7) EXIT
a = x - h
x = a
END DO
WRITE(*, *) 'result=', h, ': x=', x
STOP
END PROGRAM unko

実行結果
result= 0.0000000E+00 : x= -1.000000
128127:2010/05/21(金) 02:17:54
>>124
プログラム出しておいてなんだが、たぶん問題が間違ってるか、問題を写し間違っているか、
質問者が問題を理解しそこねている。

この問題だと、単にy1のゼロ点近傍に近づいたときに終了し、y2の条件があまり意味を持たない。
あまりにイミフw
129127:2010/05/21(金) 02:20:07
>>124
ごめんw >>119でNewton法で質問していたのか。Newton法なら意味わかる。
前レスは忘れろwww
130デフォルトの名無しさん:2010/05/21(金) 02:29:43
>>119
>「READ」「WRITE」「if」「GO TO」「SUBROUTIN」「DIMENSION]だけ使って作る

これは出題者がこうしろと言ってるの?
131デフォルトの名無しさん:2010/05/21(金) 02:41:32
>>129
ありがとうございます。そして悲しいことにFORTRANは77なんです(TAT)


>>130
そうなんです(汗)
講義で教えられてないのを使うと大目玉をくらうんです。


132デフォルトの名無しさん:2010/05/21(金) 02:53:31
>>118
よく解らんが、不等間隔のデータを読み込んで、等間隔のデータに補間して出力したいのかな。
> do while ((X(K-1)-XX)*(X(K)-XX) > 0.0d0)
この条件式の書き方は昔風で今は流行らない。素直にIF文にした方がいい。

こんな感じの事をしたいのかもしれない。
PROGRAM unko
PARAMETER (MP = 600)
DIMENSION x(0:MP), y(0:MP)
READ(10,*) X(0),Y(0)
DO N = 1, 999999
DO I = 1,MP
READ(10,*,err=99) X(I),Y(I)
END DO
CALL SUB1(X,Y,G,H,MP)
K = 1
DO I = 0, INT( X(MP - 1) - X(0) )
XX = X(0) + REAL(I)
IF ( ( X(K-1) < XX ) .AND. ( XX <= X(K) ) ) THEN
YY = SUB2(G,H,X,Y,XX,K,MP)
WRITE(20,'(2F15.7)') XX,YY
ELSE
K = K + 1
END IF
END DO
X(0) = X(MP)
Y(0) = Y(MP)
END DO
99 CONTINUE
STOP
END
133デフォルトの名無しさん:2010/05/21(金) 03:18:18
>>131
77なら77と最初から言え・・・といいつつ本来の質問を見ていなかった朕。
一応、昔風に芋臭く書いてみた。DIMENSIONをどう使ったらいいのか分からん。
微分もプログラム的にやることにしてみた。ちょっと無理っぽいw  あと、ABSを使った。

PROGRAM main
WRITE(6, *) 'INPUT START VALUE ='
READ(5, *) a
1 x = a
CALL newton(x, h)
a = x - h
IF (ABS(h) .GT. 0.0000001) GOTO 1
WRITE(6, *) 'h=', h, ' x=', x
END

SUBROUTINE newton(x, h)
DIMENSION c(2)
c(1) = -1.0
c(2) = 3.0
y1 = (x - c(1)) * (x - c(2)) ! f = (x + 1)(x - 3)
y2 = (x - c(1)) + (x - c(2)) ! df/dx = 1(x - 3) + (x + 1)1
h = y1 / y2
RETURN
END
実行例1
INPUT START VALUE =
5.0
h= 0.0000000E+00 x= 3.000000
実行例2
INPUT START VALUE =
-3.0
h= 0.0000000E+00 x= -1.000000
134デフォルトの名無しさん:2010/05/21(金) 03:43:09
>>133
ありがとうございます。(T∀T)
やっぱりDIMENSIONは無理やり使わないと使えないですよね(汗)
ちょっと疑問になったんですが、ABSのところをそのまんまhにしてもエラーが
おきたりしないですか?
135デフォルトの名無しさん:2010/05/21(金) 06:37:05
>>134
エラーは発生しない。
それとお礼を言われる程のことはしていない。
136デフォルトの名無しさん:2010/05/21(金) 11:08:52
>>135
嘘教えんなよwww誰だよw

>>134
hが負になる時の事を考えると、ABSが必要。
どうしてもABSを使いたくないなら、
IF (h < -0.0000001) GOTO 1
IF (h > 0.0000001) GOTO 1
とし給へ。
137デフォルトの名無しさん:2010/05/21(金) 19:16:24
>>136
>嘘教えんなよwww誰だよw

>エラーは発生しない。
これは嘘ではないと思うが。

>それとお礼を言われる程のことはしていない。
それともこっちが嘘と言っているの?
138デフォルトの名無しさん:2010/05/21(金) 20:34:30
プログラマーって短気が多いんだなぁw
139デフォルトの名無しさん:2010/05/22(土) 00:06:23
>>137
キモイです.....(>_<)

140デフォルトの名無しさん:2010/05/22(土) 02:28:39
>>136
いやエラーは出ないだろ。
14180,107,118:2010/05/22(土) 05:49:11
>>132
これは書き方が判りやすくて助かります!おっしゃる通りのようなプログラムです、
どうやら抜け落ちたデータの補間もこれで出来るらしい?です。

107に書いたやりかたで取り敢えず動くのでやってみたのですが
50000行くらいの大きなデータだと、結果が出るまでもの凄く時間が掛かってしまいました。
変なところにバッファしてるんじゃないの?と言われたのですが良く判らず
10000ずつ計算させて切り貼りしています。どうしたものかと悩んでいます。

> do while ((X(K-1)-XX)*(X(K)-XX) > 0.0d0)
先輩が教えてくれたのですが、イマイチ意味が判っていませんでした、
普通にIFでやっても良いんですね、ありがとうございます。
142デフォルトの名無しさん:2010/05/22(土) 09:48:31
>>141
計算機でやる分には、時間がかかってもそのままやらせればいいと思う。
手で切り貼りする作業時間を含めれば、結局トータルでの時間は、計算機でやった方が早いのでは?

時間がかかる原因は、色々ある。
しかしプログラムのどの部分に時間を取られているのか分からないとなんと見えない。
細切れのI/Oが多いと時間はかかる。だが、50000行くらいなら、600行づつ読んでもそれほどでもないような。

元のプログラムだと、毎回最初のデータから条件を満たす位置を探し始めているが、
Xが単調に増加しているのなら、前回の位置から探し始めれば早く適切な場所が見つかると思う。
この辺に、時間がかかっている気がしなくもない。
143141:2010/05/22(土) 16:30:49
>>142
一桁間違えていました!(>_<)500000行くらいのデータです。
数時間の測定だと100000行以内くらいで済むので5〜6分で計算出来るんですが
200000行くらいだと20〜30分くらい掛かってしまいます。
500000行くらいのデータをやろうとしたら数時間掛かってしまっていました。

Xは単調増加なので前回の位置から探すというやりかたをちょっと考えてみます、
ありがとうございます。
144デフォルトの名無しさん:2010/05/22(土) 19:13:23
>>143
N=
1 * 10**5, 5. .6min   5 / 1^2 = 5
2 * 10**5, 20.. 30min   20 / 2^2 = 5
5 * 10**5, 60..180min 〜125/ 5^2 = 5

計算時間が要素数の自乗で増えているが、処理内容から言ってそうなるはずのものではない。
計算回数が自乗になりそうな所を探せば解決する気がする。

データを毎回頭から探すような部分はnC_2〜O(n^2)だから、可能性は高い。

あと、それとは別に、今デバッグモードで実行しているなら、リリースモードで実行することにより
2〜10倍くらいはやくなる可能性はある。その辺はコンパイラに依るので先輩などに聞いてみるとよいかな。

145デフォルトの名無しさん:2010/05/22(土) 21:37:39
>Xは単調増加なので前回の位置から探すというやりかたをちょっと考えてみます、
>>142が言っている「元のプログラム」って>>85>>93のことではないの?

>>107>>132も,すでに前回の位置からREADするようになっているでしょ.
146デフォルトの名無しさん:2010/05/22(土) 22:09:28
>>143ちょっとまて!
>>107でやってみたって言ってるけど,SUB1の引数にNが入るのっておかしくないか?
>>107バージョン CALL SUB1(X,Y,G,H,N,MP)
>>132バージョン CALL SUB1(X,Y,G,H,MP)

データの補間がしたいと言うことから推察するに,スプライン補間かな?(SUB1は行列を解いてる?)
5番目の引数が配列のサイズを渡しているんだとすれば,>>107ではNに相当大きな配列サイズが指定されて,
無意味なメモリ領域を読み取ってそのまま解いているんじゃないか?
SUB2ではその無意味な計算結果は使われないから,それで正常な結果が得られたとしても納得できそう.
ちょっと行き過ぎた推測かも知れないけど...

いちど,サブルーチンの引数を確認してみては?
147142:2010/05/23(日) 17:10:04
>>146
毎回最初からと言っているのは、READではなくて、補間位置を決める、2つのデータに挟まれている位置を
求める部分の話。

>>107での2重DO−LOOP構造では、DO内でK=1にしているので毎回X(0)から探し始めている
DO I=0,INT(X(MP-1)-X(0))
XX=X(0)+real(I)
K=1
do while ((X(K-1)-XX)*(X(K)-XX) > 0.0d0)
K=K+1
end do
..YY=SUB2(G,H,X,Y,XX,K,MP)
end do
..
end do

一応>>132では(Xの単調増加を仮定して)外に出してある。

>>146
読み込んだデータを延々と配列にため込んでいるので、毎回現在のポインタ位置のような意味でNを渡す
必要があるのではないかと思う。

148デフォルトの名無しさん:2010/05/23(日) 19:34:40
必要があるといいですね
149デフォルトの名無しさん:2010/05/23(日) 19:59:51
前半は納得した.
後半「読み込んだデータを延々と配列にため込んでいるので、」というのは違うと思う.
どちらも0:MPの配列を使い回してる.
>>107の抜粋
 READ(10,*) X(0),Y(0)
 do N=1,NW,MP
     DO I=1,MP
         READ(10,*,err=99) X(I),Y(I)
     end do
     CALL SUB1(X,Y,G,H,N,MP)
     ...(略)...
     X(0) = X(MP)
     Y(0) = Y(MP)
 end do

>>132の抜粋
 READ(10,*) X(0),Y(0)
 DO N = 1, 999999
     DO I = 1,MP
         READ(10,*,err=99) X(I),Y(I)
     END DO
     CALL SUB1(X,Y,G,H,MP)
     ...(略)...
     X(0) = X(MP)
     Y(0) = Y(MP)
 END DO

どちらにしてもサブルーチンの中身が分からないと,X,Yの配列を使い回すのが正しいのかすら推測の域を出ないな.
質問者のレベルから考えると,引数の意味を把握しているか自体が心配.
(このスレ,勉強になるなぁ)
150142:2010/05/23(日) 22:24:25
>>149
おk把握した。
古い方のプログラムと混乱していた。

古い方は、データをため込んでいるので、現在位置をサブルーチンに渡す必要があるから、
Nを渡していると理解していた。

とすると>>107では、Nの値が狂っているなw N=1で固定しなきゃないかな?w
151141:2010/05/24(月) 02:20:17
>>144->>150
今理解するのにちょっと時間が掛かっています(>_<)皆様有り難うございますm(_ _)m

>>146さんの言う通りサブルーチンの中身はスプライン補間になっていました。
SUB1で行列を解いていて、SUB2で間隔1毎の値を計算している?感じです。
引数の意味はまだ良く理解出来ていません、SUB1のNがおかしいのでしょうか?
もう少しいぢくってみます。。。
152デフォルトの名無しさん:2010/05/24(月) 12:47:55
>>151
メール欄に sage と書き込んで、スレが上のほうに上がらないようにした方がいいですよ。
スレが上に上がると、通りすがりの冷かしが面白半分なレスを書き込んでくる確率が上がるので(^^
153デフォルトの名無しさん:2010/06/06(日) 02:50:01
i==2 ? x = 0 : x = 2
みたいなのは無理なんですか?
154デフォルトの名無しさん:2010/06/06(日) 03:15:10
>>153
x=2; IF (i==2) x=0
155デフォルトの名無しさん:2010/06/06(日) 22:26:58
>>154
なるほどサンクスです
でもやっぱ?使えた方が見やすいですね
156デフォルトの名無しさん:2010/06/07(月) 13:55:06
>>153
これって何の言語ですか?
157デフォルトの名無しさん:2010/06/07(月) 18:05:16
>>156
Ruby java
158デフォルトの名無しさん:2010/06/08(火) 00:01:45
>>156
おしっこC言語。3項演算子。

しかし、昔風の書き方の気が・・・
最近はFortranでもCでも、もっとわかりやすく書くように指導されているはずだが・・・
159デフォルトの名無しさん:2010/06/08(火) 02:05:16
配列の仮引数に、スカラーの実変数をsize=1の配列として渡すのって、
どうやればいいの?
下の例だと、rank mismatchでcompile通んないし、
reshape(s,1)もダメって言われた。
一回、別の配列に値をコピーするしかないのかな?

Program test
integer s

s = 1
call inc(1,s)
print *, s

Contains

Subroutine inc(n, a)
implicit none
integer, intent(in) :: n
integer, intent(inout) :: a(n)

integer i

do i = 1,n
a(i) = a(i) + 1
end do
End subroutine inc

End program test
160デフォルトの名無しさん:2010/06/08(火) 03:16:01
>>159
INTENT(IN) 属性なら、
call inc(1,[s]) ないし call inc(1, (/s/))
でいけるが、INTENT(OUT)で値が返る場合はダメだなあ。


161デフォルトの名無しさん:2010/06/08(火) 11:42:43
integer s(1)
とサイズが1を明示すれば通るけど(intel のやつ)・・・それじゃダメなんだよねぇ・・・・
思いつきで(邪道とされるw)equivalence 使って

Program test
integer sdummy(1)
integer s
equivalence(sdummy, s)
s = 1
call inc(1,sdummy)
・・・・・
でも通るけど・・・意味ねぇなw
162デフォルトの名無しさん:2010/06/08(火) 11:44:40
あ、始めて気づいたけど、
integer s(1)
s=1
って通るんだね。コンパイラにも寄るんだろうけど。
163デフォルトの名無しさん:2010/06/08(火) 12:46:57
>>162
たぶんそれ、F90の配列初期化の一括代入になってるだとおもう。
164デフォルトの名無しさん:2010/06/08(火) 12:50:56
ありがとう。

そっか普段77で書いてるから不慣れというかまったく気付かなかった。
たまに90で書くし初期化で使うのに・・・
Intel (たぶん余所のも) のはF77固定書式で書いても、
その事をコンパイルオプションで明示しないと、
F90の機能をちょっとなら混ぜても
文法が干渉しない限りは有効とみなすんだよね。
・・・危ないような気もする。
165159:2010/06/08(火) 19:06:53
>>160
その場合でも結局、一時的な配列に値をコピーしてから渡すって意味になってるんだよ。

>>164
FORTRAN77なら型チェックなんかないし、
配列にスカラー変数を渡すのは正しい操作なんだよね。
内部的にはメモリアドレスを渡してるだけなんだから。

>>161のequivalenceは、今回のprogram文では意味ないけど、
変数sがサブルーチンの仮引数のときに、
無用なコピーを作らず渡せる唯一の方法かもしれない。
166デフォルトの名無しさん:2010/06/08(火) 23:43:04
>>165
素直にテンポラリを間にかますのが一番いいと思うけどさw

EQUIVALENCE ありなら、なんでもアリだなw
POINTERという手はどうだ?
Cとの互換POINTERを使えば、RANKとかのチェックは逃れられる。

Program test
USE, INTRINSIC :: iso_c_binding
IMPLICIT NONE
integer :: s

s = 1
call inc(1, c_loc(s))

Contains

Subroutine inc(n, p)
implicit none
integer, intent(in) :: n
TYPE(C_PTR), intent(in) :: p
integer :: a(n)
integer i

CALL C_F_POINTER(p, a)

do i = 1,n
a(i) = a(i) + 1
end do
End subroutine inc

End program test
167デフォルトの名無しさん:2010/06/09(水) 13:23:31
>>159みたいなことは御法度なんじゃないの?
そのために90以降いろいろと拡張されたわけでしょ?
168デフォルトの名無しさん:2010/06/09(水) 22:00:59
質問です。
LAPACKを使うプログラムなんですが、
Intelのコンパイラだとコンパイル出来るのですが、
gfortranだとSyntax errorが出てしまいます。
こういうことってプログラムに間違いが無くても起こりますか?
169デフォルトの名無しさん:2010/06/09(水) 22:23:27
>>168
起こる。
170デフォルトの名無しさん:2010/06/09(水) 22:49:25
>>167
そうなんだけど、その辺は70年代的Pascalマンセー的な発想で、型チェックギチギチにしたら
確かにエラーは減ったが、窮屈で困ってしまったというのが、80年代以降というか。

実際、Fortran的にはF95でELEMENTAL型の副プログラムが定義出来るようになって、
スカラーで副プログラムを定義しておけばRANKによらずに配列引数が取れるようになっている。

アルゴリズム部分とデータ構造を、もっと独立したユルユルの関係にしたいというか。

171デフォルトの名無しさん:2010/06/09(水) 22:57:12
>>169
そうですかー…
ありがとうございます
172デフォルトの名無しさん:2010/06/10(木) 04:24:29
>>168

その LAPACK はだれがどのコンパイラでコンパイルしたの?
173デフォルトの名無しさん:2010/06/10(木) 13:10:28
>>170
気持ちは分かるなぁ・・・
この辺の善し悪しは開発の規模にもよるんだろうな
174デフォルトの名無しさん:2010/06/10(木) 14:47:46
>>172
LAPACKはLinuxのパッケージ管理ソフトで入れたんですが、
だからたぶんgccでコンパイルされたものだと思います。
175デフォルトの名無しさん:2010/06/14(月) 19:39:21
Fortranerの中には数値計算な業界の人も多いと思うけど、ぶっちゃけ聞きますが飯食えてますか?
ニッチでそこそこやっていけてるのか、それとも潰しのきかない悲しい境遇なのか
176デフォルトの名無しさん:2010/06/14(月) 21:57:26
受験者数と受験者の受験番号と点数が分かっている。
10
17 73
5 64
22 67
6 66
7 90
42 88
9 74
11 79
2 63
13 72
(1行目は受験者数、2行目以降の左は受験番号、右は点数)
以上のデータdata.txtを読み込み、以下に示す結果をresult.txtに出力するようなプログラムを作成せよなお、この試験では59点以下はD、60点以上69点以下はC、70点以上79点以下はB、80点以上はAと判定することにする。
----------------------------------------------
受験者   x人
A   x人
B   x人
C   x人
D   x人
平均点     x
標準偏差 x
中央値 x
順位  受験番号   点数 成績
1 25 85 A
2 41 82 A
(以下省略)
----------------------------------------------
・xには数字が入る。
・中央値はMOD関数を用いること。

以上の問題が分かりません。誰かよろしくお願いします。
177デフォルトの名無しさん:2010/06/15(火) 19:18:06
e^x,sinx,logxのテーラー展開を求めるプログラムを教えてもらいたいのですが…
e^xはできたので、これを参考に教えてください!

subroutine expotn (x)
c
real Tn, ans, err
integer n
c
EPS = 1.0e-6
n = 0
Tn = 1.0
ans = Tn
write(6,10) x
10 format('EXP(', f10.5, ') ')
50 if( abs(Tn) .gt. EPS) then
n = n + 1
Tn = Tn * x / n
ans = ans + Tn
err = ans - exp(x)
write(6,11) n, ans, err
11 format(I3,' exp(X) = ',f12.7,' err = ',f15.10)
go to 50
end if
write(6,*) ' Exp( ',x,' )= ',ans
return
end
c
178デフォルトの名無しさん:2010/06/19(土) 00:40:28
MinGWにくっついていたG95コンパイラを用いて、
Fortran77のソースコードをコンパイルしようとすると
以下のようなエラーが出ます。
コンパイルするときのコマンドは以下のとおりです。
>g95 F:\Direct_vs_Ewald.f -freal-loops
問題のソースコードは以下の部分です。
volume=a(1)*(b(2)*c(3)-b(3)*c(2))-a(2)*(b(1)*c(3)-b(3)*c(1))
& +a(3)*(b(1)*c(2)-b(2)*c(1))
この処理の部分で&の下に1が出現します。
Error: Unclassifiable statement at (1)
なぜ、このようなエラーが出るのかわかりませんでした。
()の閉じ忘れは確認したところありませんでした。
&記号が二つの文をひとつにする働きがあることは調べたら出てきましたが、
G95コンパイラにはこのような機能は無いということでしょうか?
179178:2010/06/19(土) 02:02:52
すみません。いったん寝ます
180デフォルトの名無しさん:2010/06/19(土) 02:19:08
>>177
SIN(x) = x - x^3 / 3! + x^5 / 5! - x^7 / 7! +.....

subroutine sinetn(x)
c
real Tn, ans, err
integer n
c
EPS = 1.0e-6
n = 0
Tn = x
ans = Tn
write(6,10) x
10 format('SIN(', f10.5, ') ')
50 if( abs(Tn) .gt. EPS) then
n = n + 1
Tn = - Tn * x**2 / ( (2 * n + 1) * 2 * n )
ans = ans + Tn
err = ans - sin(x)
write(6,11) n, ans, err
11 format(I3,' Sin(X) = ',f12.7,' err = ',f15.10)
go to 50
end if
write(6,*) ' Sin( ',x,' )= ',ans
return
end
c
181デフォルトの名無しさん:2010/06/19(土) 02:24:33
>>177
LOG(1 + x) = x - x^2 / 2 + x^3 / 3 - x^4 / 4 +......
収束半径が小さいので注意。一般の範囲でやりたいなら、LOGの性質を使って範囲を調整汁。

subroutine logtn(x)
c
real Tn, ans, err
integer n
c
EPS = 1.0e-6
n = 1
Tn = x - 1.0
ans = Tn
write(6,10) x
10 format('Log(', f10.5, ') ')
50 if( abs(Tn) .gt. EPS) then
n = n + 1
Tn = - Tn * ( x - 1.0 )
ans = ans + Tn / n
err = ans - log(x)
write(6,11) n, ans, err
11 format(I3,' Log(X) = ',f12.7,' err = ',f15.10)
go to 50
end if
write(6,*) ' Log(',x,' )= ',ans
return
end
c
182デフォルトの名無しさん:2010/06/19(土) 03:07:25
>>178
g95で試してみたが、6カラム目に&がくれば問題なくコンパイルできた。
FORTRAN77の継続行指定は6カラム目に無いと駄目。

ずれると、
Error: Unclassifiable statement at (1)
が出る。

エラー行と数字の1が出ているはずで、それがエラー位置を指しているので、よく見よ。


ちなみに、Fortran90では&は継続行を意味するが、1行目の尻に書く。
詳しくはマニュアルを読んでくれ。

純粋なFORTRAN77では&は規格外の文字なので本来は使っていけない。
(今となっては余り気にしないが。)

183178:2010/06/19(土) 08:06:20
>182
ありがとうございます。
Tabでインデントしていたので気づきませんでした。
半角スペース5個をつけた後、&をつけるようにしたら、そのエラーは消えました。
Warning (121): COMMON block 'coor' is 1600004 bytes at (1) and 160004 bytes at (
2)
というエラーは出ましたが、-wオプションをつけることでなんとかコンパイルはできるようになりました
184デフォルトの名無しさん:2010/06/19(土) 14:10:25
ファイルをdirect accessで読む場合、
open (10,file='hoge.dat',access='direct',recl=4)
read(10,rec=10000) j
みたいに欲しい場所をすぐ読めますが、sequentialで同じようなことは可能でしょうか?

今まではこんな風に不要な部分は破棄していたんですが、効率が悪いと思いまして。
open (10,file='hoge.dat',access='sequential')
do i=1,9999
read(10) jtmp
enddo
read(10) j
185デフォルトの名無しさん:2010/06/19(土) 16:37:37
>>184
末尾だったらOPEN時に指定出来るが、任意位置には行けない。
というか行きようが無い。
直接型はレコード長が全要素で共通だから特定の位置までのバイト数がわかるが、
レコード長が不定長の逐次型では原理的に知り得ない。

ところで読み飛ばすときjtmpに読み込まなくても空READだけでおk。
あと後ろに近いなら、尻から始めてBACKSPACEで逆行する技もある。
それが負荷を減らすかどうか知らんwwwww
186デフォルトの名無しさん:2010/06/19(土) 18:14:42
>>185
やっぱり不可能ですか。
将来ウンTBのデータを扱う時代になったら、データハンドリングはどうなるんでしょうね。
ファイルはダイレクトアクセス、データ構造はレコード長まで完全に把握するというのが
一般的になるんでしょうかね・・・
187デフォルトの名無しさん:2010/06/19(土) 23:07:40
>>176
受験者 10 人
A 2 人
B 3 人
C 4 人
D 1 人
平均点 68.00000
標準偏差 19.24578
中央値 69.50000
順位  受験番号   点数 成績
1 7 90 A
2 42 88 A
3 11 79 B
4 9 74 B
5 13 72 B
6 22 67 C
7 6 66 C
8 5 64 C
9 2 63 C
10 10 17 D
1881/3:2010/06/19(土) 23:08:59
PROGRAM test
PARAMETER(nmax = 999)
INTEGER id(nmax, 2), idistr(4)
CHARACTER grade

OPEN(10, FILE = 'data.txt' , STATUS = 'old' )
OPEN( 9, FILE = 'result.txt', STATUS = 'unknown')

DO 10 i = 1, nmax
READ(10, *, END = 99) id(i, 1), id(i, 2)
10 CONTINUE
STOP 'error: too many data! increase nmax'

99 ndata = i - 1
sum = 0.0
DO 20 i = 1, ndata
sum = sum + id(i, 2)
20 CONTINUE
ave = sum / ndata

sum = 0.0
DO 30 i = 1, ndata
sum = sum + (id(i, 2) - ave)**2
30 CONTINUE
rms = SQRT(sum / ndata)

CALL sort(nmax, ndata, id)

DO 40 i = 1, 4
idistr(i) = 0
40 CONTINUE
1892/3:2010/06/19(土) 23:09:40
DO 50 i = 1, ndata
IF ( grade( id(i, 2) ) .EQ. 'A') idistr(1) = idistr(1) + 1
IF ( grade( id(i, 2) ) .EQ. 'B') idistr(2) = idistr(2) + 1
IF ( grade( id(i, 2) ) .EQ. 'C') idistr(3) = idistr(3) + 1
IF ( grade( id(i, 2) ) .EQ. 'D') idistr(4) = idistr(4) + 1
50 CONTINUE

IF (MOD(ndata, 2) .EQ. 1) THEN
xmean = id(ndata / 2 + 1, 2)
ELSE
xmean = ( id(ndata / 2, 2) + id(ndata / 2 + 1, 2) ) / 2.0
ENDIF

WRITE(9, *) '受験者 ', ndata, '人'
WRITE(9, *) 'A ', idistr(1), '人'
WRITE(9, *) 'B ', idistr(2), '人'
WRITE(9, *) 'C ', idistr(3), '人'
WRITE(9, *) 'D ', idistr(4), '人'
WRITE(9, *) '平均点 ', ave
WRITE(9, *) '標準偏差', rms
WRITE(9, *) '中央値', xmean

WRITE(9, *) '順位  受験番号   点数 成績'
DO i = 1, ndata
WRITE(9, '(i5, 2i11, a5)') i, id(i, 1), id(i, 2), grade(id(i, 2))
END DO

STOP
END
C
1903/3:2010/06/19(土) 23:12:50
SUBROUTINE sort(nmax, n, in)
INTEGER in(nmax, 2)
DO 10 i = 1, n
DO 20 j = 1, n
IF ( in(j, 2) .LT. in(i, 2) ) THEN
itmp1 = in(i, 1)
itmp2 = in(i, 2)
in(i, 1) = in(j, 1)
in(i, 2) = in(j, 2)
in(j, 1) = itmp1
in(j, 2) = itmp2
END IF
20 CONTINUE
10 CONTINUE

RETURN
END

FUNCTION grade(k)
CHARACTER grade
IF (k .GE. 80) THEN
grade = 'A'
ELSE IF (k .GE. 70) THEN
grade = 'B'
ELSE IF (k .GE. 60) THEN
grade = 'C'
ELSE
grade = 'D'
END IF
RETURN
END
考えなしに書いた。なんなん(・∀・)!?
191デフォルトの名無しさん:2010/06/20(日) 02:12:48
残差の二乗和を計算するときの精度と実行速度について悩んでます。
速度よりは精度の方を優先したいのですが、
以下の3つのソースで、最もバランスの良いものはどれでしょう?

xとaはそれぞれ倍精度実数として、

1.
(x-a)**2

2.
(x-a)*(x-a)

3.
(x-a)*(x+a)

よろしくお願いします。
192デフォルトの名無しさん:2010/06/20(日) 06:21:47
指数部が整数の時は同じ掛け算をする(はず)。というわけで精度&実行速度の点で、ぼほ1=2と思ってよろし。
でもたとえば、a=1.0 でデータxを3要素で値が(1e-6,1,1e6)とすると、
第3要素のおかげで他の2項の寄与が消えちゃう。
ので、x^2 + 2ax + a^2
の3項にわけで個別に和をとって最後に足す、という事をすると
2ax の部分が残る分マシ。参照値 a とデータ x の分布次第だね。
x が a と同じオーダーなら気にすることは無い。

3は、 x*x - a*a の方が一般には精度という点で推奨される
同じく参照値 a と比べたときの x の値の分布次第、でもあるが
速度については積の演算はCPU毎にコストが違うので、どちらが良いかは一概にはいえない。
193デフォルトの名無しさん:2010/06/20(日) 17:31:29
>>181
ちょっとまた質問です。
例えば、x-1.0=tと自分で置いたら

Tn = x - 1.0 → Tn = t

write(6,10) x → write(6,10) t

Tn = - Tn * ( x - 1.0 ) ← Tn = - Tn * t

とおいて、より簡単なプログラムにしてもいいですか?
なるべくなら、式が簡単なほうが分かりやすいですし。
194デフォルトの名無しさん:2010/06/20(日) 23:29:03
>>193
それでもよい。
なお、そのテイラー展開の収束半径は、|x|<1のはずなので、その範囲から外れるような値も
計算できるようにしたいなら、LOG(X*10^N)=LOG(X)+N*LOG(10) などの公式を使って
スケールしてやる必要がある。

195デフォルトの名無しさん:2010/06/21(月) 00:13:24
仮にt=1.5の計算をするときには範囲のプログラムとして>>194のようなプログラムを施すということでよろしいのでしょうか?
196デフォルトの名無しさん:2010/06/21(月) 00:16:37
>>195
もう一個スケール処理するサブルーチンを書いて、それがテイラー展開のサブルーチンを呼べばいいんでないかい?
サブルーチンからサブルーチンを呼ぶ。
197デフォルトの名無しさん:2010/06/21(月) 00:30:26
>>196
つまりは例として出ているLOG(X*10^N)=LOG(X)+N*LOG(10)という関数のサブルーチンをlog(x)の範囲のところに呼ぶというわけですか?
198デフォルトの名無しさん:2010/06/23(水) 16:56:50
こんにちは。sinxのテーラーのプログラムを以下のように書きましたが、うまくいきません…
おそらく、何か足りないのでしょうが…教えてください。
プログラム(1/2)

program sinTelor
c
real x
integer which
c
c begin
c EPS = 1.0e-5
write(6,*) 'Taylor Expansion of mathematical function'
write(6,*) ' .Sine function'
read (5,*) which
end

199デフォルトの名無しさん:2010/06/23(水) 16:57:33
プログラム(2/2)
c

subroutine sine (x)
c begin
real Tn, ans, err
integer n, nstop
c
nstop=30
EPS = 1.0e-6
n =1
Tn = x
ans = Tn
write(6,10) x
write(6,*) ' sin(x)= ',sin(x)
10 format('SIN(', f10.5, ') ')
50 if( abs(Tn) .gt. EPS .and. n .lt. nstop) then
n = n + 1
Tn = - Tn * x **2 / ( (2 * n -1) *( 2 * n-2 ))
ans = ans + Tn
err = ans - sin(x)
write(6,11) n, ans, err
11 format(I3,' sin(X) = ',f12.7,' err = ',f15.10)
go to 50
end if
write(6,*) ' sin( ',x,' )= ',ans
return
end
return
end
200デフォルトの名無しさん:2010/06/23(水) 18:28:09
>>198>>199
それは君が馬鹿だからです
201デフォルトの名無しさん:2010/06/24(木) 02:44:17
>>198
まずこの 綴りの間違いを何とかしろ!w
program sinTelor

CALL sine( which )

を書け。サブルーチンを呼び出さずに何をする気だw

兄貴がサブを呼ぶと覚エロ!

202デフォルトの名無しさん:2010/06/24(木) 09:49:15
>兄貴がサブを呼ぶ
解説プリーズ
203デフォルトの名無しさん:2010/06/25(金) 10:09:02
すみません(汗)
FORTRAN77で、Gauss-Jordan法のプログラムを
「READ」「WRITE」「GO TO]「IF]「SUBROUTINE」
「DIMENSION」を使って作りたいんですが・・・
全く分りません。誰か教えてください!
204デフォルトの名無しさん:2010/06/25(金) 23:49:59
>>203
図書館行ってアルゴリズム集から完コピ。マジオススメ
205デフォルトの名無しさん:2010/06/26(土) 00:03:12
>>203
誰か、F77で掃き出し法のサブルーチン作ってテンプレに書いておけよ。
206デフォルトの名無しさん:2010/06/26(土) 00:58:47
>>203
goto は使うな!
207デフォルトの名無しさん:2010/06/26(土) 02:12:04
>>206
それ70年代の話www
208デフォルトの名無しさん:2010/06/26(土) 12:17:22
>>207
え!?
209デフォルトの名無しさん:2010/06/26(土) 14:07:24
>>203
dimensionも使うな!
210デフォルトの名無しさん:2010/06/26(土) 23:12:28
微笑ましいよね。
きっと課題に「xxx」「yyy」を使え、と明示してあるんだろうね。
211デフォルトの名無しさん:2010/06/27(日) 10:00:36
77でgotoを使わないのは、結構苦しいと思うが。
212デフォルトの名無しさん:2010/06/27(日) 11:19:38
全く無しはしんどいよね。最小限にはすべきだけど。
do while
があれば goto を使う機会が激減する・・・と書こうとしたけど、
お題の203さんの課題では do は入ってないね・・。
if goto の組み合わせで何とかしろ、ということなのか。
これはこれでしんどいw
213デフォルトの名無しさん:2010/06/27(日) 12:44:34
>>203
まじめにアドバイス
Fortranがわからないの?Gauss-Jordan法がわからないの?

「知らない数値解法」で「知らない言語」で書け、
という課題が悩ましいのは自分もそうだったのでわかるけど
丸投げだとあまり回答もらえないですよ。

前者なら、どの程度の基礎的なプログラムなら書けるのかを提示して
どの部分を調べたらよいかをアドバイスもらい、

後者なら、ネットで調べたり、その解法のどの部分のプログラム化が?なのかを提示
したほうがいいと思います。
正直、その解法で、何を解きたいのかよくわからないし。
214デフォルトの名無しさん:2010/06/27(日) 14:11:37
>>213
放っておいてあげれば良いと思うよ。
215デフォルトの名無しさん:2010/07/02(金) 13:45:32
A〜Zまでの文字のデータを1つ1つファイルにしておき
小文字で入力された文字列をファイルから読み込んで
大文字で表示するにはどのようにすれば良いのでしょうか?

入力された文字をそれぞれのファイルから
読み込む方法がよくわかりません。お願いします。 F90
216デフォルトの名無しさん:2010/07/02(金) 16:33:26
質問があいまい&意味不明...

ファイル内に記述された特定の文字だけを大文字に変換したいのかな?
もしそうなら、Fortranではなくawkやperlを使った方が断然楽だよ。

いちおう、ファイルを読み込むのも、入力文字を読み込むのもREADを使う。
217デフォルトの名無しさん:2010/07/03(土) 00:07:10
>>215
完全イミフ。
日本語でおk
218デフォルトの名無しさん:2010/07/03(土) 00:08:49
表示ができるようになったのですが、ファイルの行数を明示しないと
End Of Line になってしまうのですが、そこで
integer io を宣言して行末を発見して読み込みを止めさせようとしたが
うまくできないのです

なお data614.txt は株価のデータで
価格(整数),年,月,日
にしてあります。

program hyoujisurudake2
implicit none
integer :: i
integer :: io=0
integer :: xprice,xyear,xmonth,xday
!*4を*8にしたりして試していたけどできなくて、こうしたらできた
open(10,file='data614.txt',status='old')
i = 0
do
!だめだ read(10,iostat=io) ,xprice, xyear, xmonth, xday
read(10,*) ,xprice, xyear, xmonth, xday
! if(io <= -1 ) exit
if(i>=3406) exit
i=i+1
!2 print* , i,xprice
print* , i, xprice, xyear, xmonth, xday
end do
close(10)
stop
end
219デフォルトの名無しさん:2010/07/03(土) 00:34:57
多分続けて投稿です
上記の株価データですが本当はこうなっているんです
これ
年/月/日,株価

具体的には
1999/12/31,12345
2000/1/1,23456
2000/1/2,23456
てな具合ですがここで大きな問題がある それは
読み込むときに「,」切りはいいとして
「/」での切り方がわからない・・・
fortran だと何文字をどこそこに格納して とかいうのはとくいですが
パーサーが無い? ので「,」で切ってから「/」で切るという処理は
どうやるのでしょうか

220デフォルトの名無しさん:2010/07/03(土) 01:10:19
>>218
IOSTATがうまくいかないのは、Fortmat書式を抜いているから。


>>219
INDEX関数使えば出来る。
221デフォルトの名無しさん:2010/07/03(土) 01:44:30
>>219
program hyoujisurudake2
implicit none
integer :: i, io, ip1, ip2, ip3
CHARACTER(LEN = 80) :: text
integer :: iprice, iyear, imonth, iday
open(10,file='data614.txt',status='old')
i = 0
do
read(10, '(a)', iostat = io) text
if(io <= -1 ) exit
i=i+1
ip1 = INDEX(text, '/')
ip2 = INDEX(text, '/', BACK = .TRUE.)
ip3 = INDEX(text, ',')
READ(text( 1:ip1 - 1), *) iyear
READ(text(ip1 + 1:ip2 - 1), *) imonth
READ(text(ip2 + 1:ip3 - 1), *) iday
READ(text(ip3 + 1: ), *) iprice
print * , i, iprice, iyear, imonth, iday
end do
close(10)
stop
end

1 12345 1999 12 31
2 23456 2000 1 1
3 23456 2000 1 2
続行するには何かキーを押してください . . .

この入力データで問題となるのは、FORTRANの書式指定無しの場合、スラッシュ『/』は改行を意味する制御文字に
なっている点だ。これを知らないと、何故か入力がなされなくて、地獄へ落ちる!
222デフォルトの名無しさん:2010/07/03(土) 16:10:31
>>203
gotoは1関数に1ラベルなら使ってOKだよ!
ソースが見やすくなるからね
223デフォルトの名無しさん:2010/07/04(日) 00:50:08
>>203
PIVOT処理するのが面倒なのでしてないw 

SUBROUTINE GJ(a, b, n) ! Gauss-Jordan method
DIMENSION a(n, n), b(n)
DO 10 irow = 1, n
pivot = a(irow, irow)
IF (pivot .EQ. 0.0) STOP 'pivot is 0.0!'
DO 5 icol = 1, n
a(irow, icol) = a(irow, icol) / pivot
5 CONTINUE
b(irow) = b(irow) / pivot
DO 20 jrow = 1, n
IF (irow .NE. jrow) THEN
q = a(jrow, irow)
DO 30 icol = 1, n
a(jrow, icol) = a(jrow, icol) - q * a(irow, icol)
30 CONTINUE
b(jrow) = b(jrow) - q * b(irow)
END IF
20 CONTINUE
10 CONTINUE
RETURN
END
224デフォルトの名無しさん:2010/07/04(日) 06:34:23
>>219
2000年元旦に市場で何があったんだ・・・w
>>221
/ , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな?
text(ip1:ip1) = ' '
(略)
READ(text,*) iyear, imonth, iday, iprice
手元にコンパイラがないから・・これで勘弁
225デフォルトの名無しさん:2010/07/04(日) 07:24:53
>>222
俺もそうだよw

224だけど、どうかな?
226221:2010/07/04(日) 14:20:20
>>224
>/ , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな?
その方がいいな。 ↓コンマは区切り文字になっているから残してもいいのだが、INDEXの代わりにSCAN関数使ってみたかったので消した。
program hyoujisurudake2
implicit none
integer :: i, io, ip1, ip2, ip3
CHARACTER(LEN = 80) :: text
integer :: iprice, iyear, imonth, iday
open(10,file='data614.txt',status='old')
i = 0
do
read(10, '(a)', iostat = io) text
if (io <= -1 ) exit
i = i + 1
CALL cutslash(text)
READ(text, *) iyear, imonth, iday, iprice
print * , i, iprice, iyear, imonth, iday
end do
close(10)
stop
CONTAINS
SUBROUTINE cutslash(text)
CHARACTER(LEN = *), INTENT(IN OUT) :: text
INTEGER :: k
DO
k = SCAN(text, '/,')
IF (k == 0) EXIT
text(k:k) = ' '
END DO
RETURN
END SUBROUTINE cutslash
end program hyoujisurudake2
227デフォルトの名無しさん:2010/07/05(月) 04:43:04
>>226 コンマは区切り文字になっているから残してもいい

本当だ!
いまの今まで知らんかった・・・。 CSV みたいに','が区切り記号で使われてる
ファイルもらったときも御丁寧に置き換えてた・・。
228デフォルトの名無しさん:2010/07/05(月) 18:03:28
write文での制御編集記述子についての質問です。

100e18.10
と指定してファイルに書いていたのですが、
これを
100es18.10e2
と指定すると、一部がアスタリスクになってしまいます。
マニュアルを読むかぎり
100が書式の繰り返し数
18が小数点上の桁、小数点以下の桁、指数を含めたすべての桁数
10が小数点以下の桁数
2が指数の桁数
と理解したのですが、どこか誤りがあるでしょうか。
教えていただけないでしょうか。
229デフォルトの名無しさん:2010/07/05(月) 20:56:57
218 219 です
>220
さん ありがとう

>221
さんコードまで書いてもらってありがとうございます。
うちのPCだとコンパイルがうまくいかないようですが、
それは多分調整のレベルなのでしょう。

ほんとにこんなに早くレスがくるとは思ってもみず 返事が遅くなりました
230デフォルトの名無しさん:2010/07/05(月) 21:01:23
>>224
> 224 名前:デフォルトの名無しさん [sage]: 2010/07/04(日) 06:34:23
> >>219
> 2000年元旦に市場で何があったんだ・・・w

すみません、これ分かりやすくするためのものでして・・・。
「文字の数が変わっちゃうのでこまっていた」ということでした。


> >>221
> / , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな?
> text(ip1:ip1) = ' '
> (略)
> READ(text,*) iyear, imonth, iday, iprice
> 手元にコンパイラがないから・・これで勘弁

いろいろ工夫が必要なのが分かって着ました。
高級言語の割には今時のRubyとかよりずっとマニュアル車っぽくていいようなかんじも・・

ありがとうございました。

これで本題の数値解析に移れます

231デフォルトの名無しさん:2010/07/05(月) 21:04:51
>>226
> 226 名前:221 [sage]: 2010/07/04(日) 14:20:20
> >>224
> >/ , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな?
> その方がいいな。 ↓コンマは区切り文字になっているから残してもいいのだが、INDEXの代わりにSCAN関数使ってみたかったので消した。
> program hyoujisurudake2

218 です いろんなやり方があるんですね。
それだけ皆さんは苦労してきたと想像します
232デフォルトの名無しさん:2010/07/05(月) 21:06:49
>>227
> 227 名前:デフォルトの名無しさん [sage]: 2010/07/05(月) 04:43:04
> >>226 コンマは区切り文字になっているから残してもいい
>
> 本当だ!
> いまの今まで知らんかった・・・。 CSV みたいに','が区切り記号で使われてる
> ファイルもらったときも御丁寧に置き換えてた・・。

219 です
すると "," は標準で区切り文字になっているが、それを解除?することは
難しそうですね。きっとできるでしょうが、とっても深い世界
233デフォルトの名無しさん:2010/07/05(月) 22:00:36
はい
234デフォルトの名無しさん:2010/07/05(月) 23:46:10
>>228
Fortranの場合、Formatで指定した桁数からあふれると、アスタリスクが出力される。
今の場合、多分指数部分が溢れているんじゃないかと思う。
E-10とかが出ると、ヤバイ。E2の2には符号の分も含まれる。

>>232
>すると "," は標準で区切り文字になっているが、それを解除?することは
>難しそうですね。きっとできるでしょうが、とっても深い世界
それはFORMATをあらわに指定すれば出来る。
上の例でも、ファイルの1行を丸々文字列として読み込んでいる。
read(10, '(a)', iostat = io) text
この場合は、スラッシュもコンマもただの文字として読み込まれる。
235デフォルトの名無しさん:2010/07/06(火) 00:17:16
読み込まれる。
236デフォルトの名無しさん:2010/07/06(火) 00:22:20
>>235
ひがむなって。百姓・町人みたいだぞ。
237デフォルトの名無しさん:2010/07/06(火) 01:27:54
>>234
ありがとうございます。
>>228
にある18を25などの大きな値にしてみたのですが、それでも一部でアスタリスクになってしまうことがありました。

一行にかける文字数などなにか別の制約があるのでしょうか。
238デフォルトの名無しさん:2010/07/06(火) 02:02:43
>>237
全体の幅を増やせば仮数部は大丈夫になるが、その場合でも指数部の幅は変わらないので、指数部が問題なのでは?


239デフォルトの名無しさん:2010/07/06(火) 20:13:16
>>237
いいよいいよ。
240デフォルトの名無しさん:2010/07/06(火) 23:54:42
部分ピボッティング付きのガウス−ジョルダン法。これで対角要素が0でもダイジョブのはず?

SUBROUTINE GJ(a, b, n) ! Gauss-Jordan method with partial pivoting
DIMENSION a(n, n), b(n), temp(n)
DO 10 idiag = 1, n
CALL pivoting(a, b, n, idiag)
pivot = a(idiag, idiag)
DO 5 icol = 1, n
a(idiag, icol) = a(idiag, icol) / pivot
5 CONTINUE
b(idiag) = b(idiag) / pivot
DO 20 jrow = 1, n
IF (idiag .NE. jrow) THEN
q = a(jrow, idiag)
DO 30 icol = 1, n
a(jrow, icol) = a(jrow, icol) - q * a(idiag, icol)
30 CONTINUE
b(jrow) = b(jrow) - q * b(idiag)
END IF
20 CONTINUE
10 CONTINUE
RETURN
END
241デフォルトの名無しさん:2010/07/06(火) 23:56:18
SUBROUTINE pivoting(a, b, n, k)
DIMENSION a(n, n), b(n)
temp = 0.0
ipiv = k
DO 10 i = k, n
IF (ABS(a(i, k)) .GT. temp) THEN
temp = ABS(a(i, k))
ipiv = i
END IF
10 CONTINUE
DO 20 i = k, n
temp = a(ipiv, i)
a(ipiv, i) = a(k, i)
a(k, i) = temp
20 CONTINUE
temp = b(ipiv)
b(ipiv) = b(k)
b(k) = temp
RETURN
END
メインルーチン:ただしf90機能を使用w
   PROGRAM test
PARAMETER( n = 5 )
REAL a0(n, n), a(n, n), b0(n), b(n)
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(a0)
CALL RANDOM_NUMBER(b0)
a = a0
b = b0
CALL GJ(a, b, n)
PRINT *, SQRT( SUM( (MATMUL(a0, b) - b0)**2 ) / N )
END
242デフォルトの名無しさん:2010/07/07(水) 00:40:13
>>238
ありがとうございました。ようやくおっしゃる意味がわかりました。
指数の部分を2桁にしてことが原因ということですね。
納得しました。明日試してみます。
243デフォルトの名無しさん:2010/07/07(水) 03:23:33
>>221
> 221 名前:デフォルトの名無しさん [sage]: 2010/07/03(土) 01:44:30
> >>219
> program hyoujisurudake2
> implicit none
> integer :: i, io, ip1, ip2, ip3
> CHARACTER(LEN = 80) :: text
> integer :: iprice, iyear, imonth, iday
> open(10,file='data614.txt',status='old')
> i = 0
> do
> read(10, '(a)', iostat = io) text
> if(io <= -1 ) exit !★ここです
> i=i+1
> ip1 = INDEX(text, '/')
> 中略
> end do
> close(10)
> stop
> end
-----
> 3 23456 2000 1 2
16行目の if(io <= -1 ) exit !★ここですが「-1」を「0」とか他の値にしても出ないかEnd of File のエラーになるのですが、これはUbuntu910 + gfortran だからでしょうか?
いくつを入れてもうまくいかないです
244デフォルトの名無しさん:2010/07/07(水) 03:42:24
>>243
自己レスです
すみません データーの最後の行に「 / / , 」という空白でータ行が入っていた!
だから最後まで読むけど 終わりを過ぎてしまう というエラーが出ていた おろかしー
245デフォルトの名無しさん:2010/07/08(木) 15:45:51
3元以上、9元までの連立一次方程式を解くプログラムをg77で作成しているんですが、なかなかエラーなしにすんなりとソースプログラムを作ることができません。
ガウス・ジョルダン法を利用して作れと指示があり、一応作ってみたのですが、エラーがいたるところに出て、エラーの内容もわからないため、訂正をお願いしたいです。
なにせFORTRANを使い始めて間もないため、超初心者でもここまでひどいソースは書かないとおもわれるほどのひどいソースかもしれませんが、どうかお願いします。
Cygwin 1.7.5-1 の fortranコンパイラを使用しています。以下、作った未完成ソースプログラムです。
real i,j,N,k,aij,bij
read(5,*) N
DO 100 i=1,N
DO 110 j=1,N
read(5,*) aij
110 continue
100 continue
DO 120 i=1,N
read(5,*) bi
120 continue
call GJ(aij,bi)
130 write(6,*) bi
end
subroutine GJ(aij,bi)
DO 130 k=1,N
akj=akj/akk
if(i=k)
aij=aij
else
aij=aij-akj*ajk
if(i=k)
bk=bk/akk
else
120 bi=bi-bk*aik
DO 130 i=1,N
return
end
246デフォルトの名無しさん:2010/07/08(木) 20:04:08
GJのアルゴリズムは確認していないけど、とりあえず配列の作り方を確認してみ。
配列変数には()が必要。

あと、エラー内容をコピペしてみて。
247デフォルトの名無しさん:2010/07/08(木) 20:54:40
エラーをがんばって見て作りなおしてみましたがエラーがでます。
以下、GJのサブルーチンを抜かしたソースです
    implicit none
integer s,t,n,k
real a,b
read(5,*) n
dimension a(n,n),b(n)
DO 100 s=1,n
DO 110 t=1,n
read(5,*) a(s,t)
110 continue
100 continue
DO 120 s=1,n
read(5,*) b(s)
120 continue
連投になって申し訳ないですが、次にエラーのコピペします。
248デフォルトの名無しさん:2010/07/08(木) 21:01:06
>>246
先ほど言い忘れましたが、レスありがとうございます。
全部コピペは入りきらないので最初のエラーかつ一番多い文の一つをコピペしました。
内容は、辞書で調べながらやったのですが、宣言が間違っていると言ってるように思います。
114.for: In program `MAIN__':
114.for:2:
integer s,t,n,k
1
114.for:5: (continued):
dimension a(n,n),b(n)
2
Invalid declaration of or reference to symbol `n' at (2) [initially seen at (1)]
お願いします。
249デフォルトの名無しさん:2010/07/08(木) 22:42:33
> implicit none
> integer s,t,n,k
> real a,b
> read(5,*) n
> dimension a(n,n),b(n)

ここの部分が間違っている。

implicit none
real a(n,n),b(n)
integer s,t,n,k
read(5,*) n

と書くのが正しい配列の定義の仕方。このばあい、属性を意味する"dimension"は書かなくてok

あと注意点だけど、変数定義の途中に実行可能な文を入れてはダメ。
>>247の場合dimensionの前にreadがはいってるけど、readは変数をすべて定義した後にやる。
250249:2010/07/08(木) 22:50:07
あ、間違えた。

配列は定義する時点でサイズが決定していないとだめなんだ。
配列サイズをreadする場合には、動的なメモリの割付けが必要で、allocatable属性を指定しなければならない。
readでnを呼んだ後、allocate文で実際にメモリを割り当てる。

implicit none
integer s,t,n,k
real,allocatable a(:,:),b(:)
read(5,*) n
allocate( a(n,n), b(n) )
251デフォルトの名無しさん:2010/07/09(金) 00:30:22
>>250
多分質問者は、F77でかつDIMENSIONとGOTOを使えと言われている人なので、その辺を察してあげないと・・・
252古い質問者:2010/07/09(金) 09:53:09
>>251さんの言う通りで…質問してるのに申し訳ないです。
allocatableというのは聞いたことがないので、使わずにやれということなんだと思います。
>>248,>>249を参考に最初の5行を訂正してみました。

implicit none
integer s,t,n,k
real a(n,n),b(n)
dimension a(n,n),b(n)
read(5,*) n

エラーは>>248と全く同様に出力されました。
ちなみにa,b,n,iに関して全く同様のエラーが何回も出力されています。
日をまたいでレス遅れてしまって申し訳ないです。
よろしくお願いします。


253古い質問者:2010/07/09(金) 10:25:09
>>252
訂正:a,b,n,iに関して→a,b,iに関して
連投失礼します。
254デフォルトの名無しさん:2010/07/09(金) 11:31:04
宣言部は全て最初にやらないといけないんだよなぁ
コード真ん中のスコープ内でローカルに宣言できたら便利なのにといつも思う

あ、でも次のFortranで実装するって話を聞いたことがあるような
次の次だっけかも
255デフォルトの名無しさん:2010/07/09(金) 15:20:01
allocatableがつかえないと、余分にメモリを食っちゃうね。
まず、配列変数の定義の時点で
real, dimension(100,100) :: a
real, dimension(100) :: b
と、ある程度大きいメモリ容量を割り付けておいて、すべての変数に0を代入して初期化。
a(:,:) = 0.0
b(:) = 0.0

そのあとnやa,bの要素をreadすればokかな?
ここで、nは単なる繰り返し制御のための変数になるけど、まぁ仕方ないか。
256古い質問者:2010/07/09(金) 18:29:02
>>255
real, dimension(100,100) :: a
real, dimension(100) :: b
をそのまま利用すると、Fortran 90 feature at (^) unsupported (対応してない?)といわれ、
realとdimensionを分けてa,bを定義すると
Invalid form for DIMENSION statement at (^) (dimensionの宣言形式が違う?)
とdimensionを定義する箇所にエラー
a(:,:) = 0.0
1 2
Unrecognized statement name at (1) and invalid form for assignment or statement-
function definition at (2)
a,bに関して同様のエラーがでます。。。
もはやcygwinのfortranコンパイラがダメなきがしてきました。。
何度も申し訳ないです。
257255:2010/07/09(金) 18:49:54
いやいや、fortran90形式の方法を教えてしまった。
90形式と77形式を混ぜてコンパイルしても問題にならないことが多いから、
いいかと思ったけどだめだったみたいだね。ごめん

implicit none
integer i, j
integer s,t,n,k
real, dimension(100,100) a
real, dimension(100) b
do i = 1, 100
do j = 1, 100
a(i,j) = 0.0
end do
b(i) = 0.0
end do
read(5,*) n

Fortran77形式で書いてみた。古い書き方は全然使わないから、間違っているかも。
258デフォルトの名無しさん:2010/07/09(金) 20:23:07
変数宣言の仕方って何が推奨なんですか?
ttp://www.nag-j.co.jp/fortran/FI_4.html を見ると、数に関しては

整数型  integer
実数型  real
倍精度実数型  double precision
複素数型  complex
倍精度複素数型  complex(kind(0d0))

となっていますが、実数型はreal*4とすべしと言ってるサイトもありますね。
double precisionなんて長ったらしいし、*で済むのならそれがスマートだと
思うんですが、どうですか?
259デフォルトの名無しさん:2010/07/10(土) 00:09:34
>>258
そのページのすぐ下に書いてあるが、REAL*4とかREAK*8とかは、FORTRANの規格の規定にはない書き方。
ただし、事実上通用する書き方に成っている。
だから規格に厳格に乗っ取りたいという流派なら、使わないという選択になる。
またFortran90以降では、REAL(KIND=4)や省略形REAL(4)などがあるので、そちらを使うのがよりスマート。
そういう文脈を踏まえて、77時代の慣用的な書きかたをしようというなら、REAL*8とかで書くのが主流派だと思う。

>>257
77にはIMPLICIT NONEは無い。
またreal, dimension(100,100) a この書き方もない。
REAL A
DIMENSION A(100,100)
と分けて書かねばならんはず。


260名無しさん@そうだ選挙に行こう:2010/07/10(土) 14:40:48
*の数字は変数が占めるトータルのバイト長らしいから、複素数の場合は注意だな
やはりkind指定が無難かな

以下、intel fortran 11.0

complex :: c1
complex*8 :: c2
complex(4) :: c3
complex(kind=4) :: c4
complex(kind(0.0)) :: c5

print *, c1
print *, c2
print *, c3
print *, c4
print *, c5

end

<出力>
(0.0000000E+00,0.0000000E+00)
(0.0000000E+00,0.0000000E+00)
(0.0000000E+00,0.0000000E+00)
(0.0000000E+00,0.0000000E+00)
(0.0000000E+00,0.0000000E+00)
261名無しさん@そうだ選挙に行こう:2010/07/10(土) 18:14:54
Fortranの命名規約って何か習慣的なものはあるんでしょうか?
例えばJavaなどではキャメルケースが一般的ですが
262名無しさん@そうだ選挙に行こう:2010/07/10(土) 23:04:40
ない
263名無しさん@そうだ選挙に行こう:2010/07/11(日) 02:16:41
>>261
キャメルケースってボーランド記法のことか。
Fortranは昔は大文字しか使えなかったし、今も大文字小文字の区別がないので、そういう工夫はあまりしない。
また1行の長さに制限があるので、余り冗長な名前も使わない。

77時代までは極めて明快だった。
暗黙の型は厳守。型を守ってないものは、文法的に許されてもエラーの元だし、社会的に誰からも相手にされないので。
名前は6文字までなので(IBMがこだわったので)単語の母音を抜いた子音並べが基本。

この手の命名法は、LAPACKなどライブラリに厳然と残っているので、知っておくと便利。
頭文字がAとかRは単精度実数、Dは倍精度実数、Cは単精度複素数、Zは倍精度複素数(本来は規格外だが)。

F90になってから混迷を深めているが、いちいち変数の型を調べるのに、宣言部分を見る気もしないので、
捨て変数に関してはIMPLICIT NONEを掛けても暗黙型の頭文字をつかっているのでは。
LOOP変数のi,jとか。




264名無しさん@そうだ選挙に行こう:2010/07/11(日) 15:21:40
変数の命名規則は、開発の仕方や規模によるところが多いんじゃないかな。
他人のコードを頻繁に見るような場合は、パッと見で分かるようなのにしてくれないと死ぬ・・・。
265デフォルトの名無しさん:2010/07/12(月) 18:20:39
構造型(体?)を使ってみたいのですが、良い参考書等あるでしょうか?
FORTRANは本自体少ない上、FORTRAN90以降の新機能について
詳しく言及している本は少ない気がしますが。
266デフォルトの名無しさん:2010/07/13(火) 02:40:12
>>265
ない!手持ちの本で十分だ。がんばれ。
267デフォルトの名無しさん:2010/07/13(火) 06:42:16
>>266
その手持ちの本に構造体書いてりゃな。
書名は何?
268デフォルトの名無しさん:2010/07/13(火) 11:04:54
>>265
(構造体は必要)ない!手持ちの本で十分だ。がんばれ。
269デフォルトの名無しさん:2010/07/13(火) 23:22:36
>>267
F90の本で構造体が書いてないものなんかあるのか?
戸川隼人のしょぼいザ・Fortran90/95にも1章費やして書いてあるぞ。
と思ったら、パラパラと見た感じ牛島省の本には無いな。京大土建屋の英単語つづりデタラメ本だから仕方ないかw
同じ京大の富田の本には2ページくらいおざなりに書いてある。
しかし、富田本は昔の大型計算センターのテキストみたいな分かりにくさの本だな。
イラストとしてキャラクター・グラフィックスで書いた3Dの山とリサージュ図形があれば完璧だったろう。
薄くていいが定価で買う気はしない。京都の古本屋で百円で売ってそう。

構造体で注意すべきなのは、Fortran90ではALLOCATABLE属性は使えなかったので、POINTERを使うしかなかったが
Fortran95ではALLOCATABLE属性のメンバーを持てることくらいか。

>>268
マジレスするとwww
Fortran2003でのオブジェクト指向は、構造体の中に副プログラムをCONTAINする形になるので、避けられない。
270デフォルトの名無しさん:2010/07/14(水) 01:01:58
使ったことないからよくわからないけど、Fortran の構造型の命名って制限ある?
ピリオドで区切るから・・ .EQ. とかの比較演算子とかぶりそうな気がふとしたので。
271デフォルトの名無しさん:2010/07/14(水) 02:49:45
>>270
区切りは%だぜ。
272デフォルトの名無しさん:2010/07/14(水) 10:54:03
. % のどちらでも実質、両方正しいよ。
. 区切りはDECのだった気がするけど、まあ実質業界標準。
273デフォルトの名無しさん:2010/07/14(水) 11:55:17
>>272
ねーよw
Fortran90以降の構造体とDECの構造体は別物だぞ。
. が使えるわけがない。
274デフォルトの名無しさん:2010/07/14(水) 13:16:16
>>269
>構造体で注意すべきなのは、Fortran90ではALLOCATABLE属性は使えなかったので、

Fortran90では構造体の中のメンバはALLOCATABLE属性に出来ないって意味だよね?
それともALLOCATABLE自体がFortran95以降なんだっけ?
275デフォルトの名無しさん:2010/07/14(水) 14:16:28
F90でも普通にallocatable出来る
276デフォルトの名無しさん:2010/07/15(木) 00:49:50
>>274
F90では構造体のメンバーがALLOCATABLE属性を取れなかった。
これが大変不評でF95で取れるようになった。
277デフォルトの名無しさん:2010/07/15(木) 20:25:16
なったね
278デフォルトの名無しさん:2010/07/16(金) 00:53:55
たね
279デフォルトの名無しさん:2010/07/16(金) 02:53:03
280デフォルトの名無しさん:2010/07/19(月) 15:06:54
すみません
初歩的な質問だと思うのですが、
以下のように、行を一つのベクトルと考え、自分の入力したベクトル間の距離を出そうとしたのですが、上手くいきません
どこがいけないのかアドバイスお願いします
最初に定義している文字が多いのは気にしないでください

program aaa
implicit none
integer :: i,j,m,k,o,p,q,zenntai
real :: c1x,c1y,c2x,c2y
integer,parameter :: n=5
real,dimension (n,2) :: a
real,dimension (n) :: b,c

do m=1,n
write(*,*)'a='
read(*,*) (a(m,k),k=1,2)
end do

write(*,*) 'a='
do i=1,n
write(*,'(1x,2F7.3)') (a(i,j),j=1,2)
end do

c1x=a(1,1)
c1y=a(1,2)
c2x=a(2,1)
c2y=a(2,2)

つづく
281デフォルトの名無しさん:2010/07/19(月) 15:07:36
つづき
do o=1,n

call kyori(b(o),c1x,c1y,a(o,1),a(o,2))
write(*,*) b(o)

end do

do p=1,n

call kyori(c(p),c2x,c2y,a(p,1),a(p,2))
write(*,*) c(p)

end do

stop
contains

subroutine kyori(d,s,t,u,v)
implicit none
real,intent(in) :: s,t
real,intent(in),dimension(n) :: u,v
real,intent(out),dimension(n) :: d

d=((abs(s-u))**2.0)+((abs(t-v))**2.0)

return

end subroutine kyori
end program aaa
282デフォルトの名無しさん:2010/07/19(月) 15:46:51
>>280
どう上手くいかんのかもう少し分かりやすく言えよと
subroutineにしないでやっても同じなわけ?
283デフォルトの名無しさん:2010/07/19(月) 16:06:25
すみません

サブルーチンにしないでやっても結果は同じでした。
a=1  2
1  3
1  4
1  5
1  6
とすると、とりあえずb(o)だけ書きます
b(o)=0.
1.
1.
394825
2.4050422E+22
c(p)もb(o)と同様にpが上がると凄い勢いでその値が増えていきました
284デフォルトの名無しさん:2010/07/21(水) 03:31:59
>>283
2点ばかり考えられることを。
1。
入力がフォーマット付きなので、空白を区切りとして数値を二つ与えることはできない。
コンマでしきれば大丈夫だったか?
a=1  2 =>1,2 もしくは       1      2


2。
サブルーチン中のここがおかしい。
real,intent(in),dimension(n) :: u,v
real,intent(out),dimension(n) :: d

スカラーを渡しているのだろうから
real,intent(in) :: u,v
real,intent(out) :: d
のはず。
285デフォルトの名無しさん:2010/07/21(水) 20:12:07
sqrtはなくてもいいの?
286デフォルトの名無しさん:2010/07/22(木) 00:42:56
>>285
そういう内容に踏み込む場合、REALなんだから二乗する前にABSはとらなくてもいいはずとか、
突っ込みどころいっぱいありすぎ。
そもそもループ変数にoとかpとか使ってる時点で、こいつラリッてるのか、酔っ払ってんのか的気持ちw
287デフォルトの名無しさん:2010/08/25(水) 14:55:56
質問です。
数値計算をしようとfortranでプログラムを書いて、実行してみたんですが
古いPen4のPCだとCPU使用率が100%までいくのに、新しいi7のPCだとCPU使用率が13%以上になりません。
とりあえず、元のプログラムを6個のプログラムに分けて実行してますがいい方法とは思えません・・
どうしたら1つのプログラムでCPUを有効に使えるようになりますか?

コンパイラはg95です
288デフォルトの名無しさん:2010/08/25(水) 14:57:19
っ OpenMP & gfortran
289デフォルトの名無しさん:2010/08/25(水) 16:03:06
>>288
ありがとうございます。やってみます
290デフォルトの名無しさん:2010/09/08(水) 15:28:57
はじめまして。
少々悩んでいることがありまして質問させて頂きます。
行列積のプログラミングを組もうと思っているのですが、
入力部分に数字のみならず記号も含まれている場合どうすればよいかわかりません。
色々試してはみたのですが、結局無理でした。
例えば、
1 2
3 4
という係数行列と
a
b
というベクトルをかけて
a+2*b
3*a+4*b
というふうに出力したいと思っています。
どなたか心ある方、ほんの少しのアドバイスでもよろしいのでお願いいたします。
291デフォルトの名無しさん:2010/09/08(水) 16:59:43
関数とサブルーチンってどっちが有利?
たとえば

function hoge(a,b) result(c)
c=a+b
return
end function

subroutine hoge(a,b,c)
c=a+b
return
end subroutine

と書いた場合、どっちがメモリ的に
あるいはスピード的に
あるいは可読性的に有利?
292デフォルトの名無しさん:2010/09/08(水) 17:01:43
>>290
fortranに文字計算させるの?
数値計算ってそういう物じゃないと思うんだけどなあ
293デフォルトの名無しさん:2010/09/09(木) 02:04:02
subroutine matvec(inmat,invec,outvec)
implicit none
intent(in):: inmat, invec
intent(out):: outvec
real mat(2,2), invec(2), outvec(2)
inteter i,j
outvec(1) = mat(1,1)*invec(1)+mat(2,1)*invec(2)
outvec(2) = mat(1,2)*invec(1)+mat(2,2)*invec(2)
return
end subroutine

・・・・なにか質問の答えとはずれてるな・・・w
294デフォルトの名無しさん:2010/09/09(木) 02:06:21
function と subroutine の違いって戻り値があるか無いかじゃないのか?
295デフォルトの名無しさん:2010/09/09(木) 14:58:40
>>294
そうなんだけど結果的には同じように扱えるよね?
上の例で言うと変数cがそれになると思うんだけど

可読性という点から見ると関数は、Fortranだと
配列と区別しにくいから少し解りづらいかも
296デフォルトの名無しさん:2010/09/11(土) 18:56:47
質問です。

現在、ファイル名が
11016.csv
11151.csv

24141.csv
というものが、97個ほどあります。そのファイルを順にOPENして読み込み、作業したいのですが、下のようにopen文を書いたのですが、初めの11016の地点が、何度も出力されてしまいます。連番でないファイルの場合、
この書き方は適当ではないのでしょうか?それとも全体のプログラムを示していないですが、enddoを書く場所が間違っているなどのミスでしょうか?

また、read文なのですが、色々詮索した結果、このように行変更してしまいますと、2行以降の変数は読めていませんでした。ファイル内のデータを削除し、プログラムの変数を減らして一行に収めると、正しく出力されました。
なぜなのでしょうか?どうかアドバイスください。もし、より全体のプログラム内容だったり、読み込んでいるファイル内の形式が必要でしたら、
再度載せます。
----------------------------------------------------------------------
INTEGER :: year, mon, day, data,sum, no,id,pre,wind,winddirection,hightemplowtemp,maxrain,maxwind,code,tmpsunlight
CHARACTER(10) :: name
   REAL :: lon, lat
CHARACTER*5 sssss

do ispot = 11016,24141
write(sssss,"(i5)") ispot
open(50, file=''//sssss//'.csv', status='old',iostat=io)
if (io < 0) cycle
do i = 1,12000

read(50,*,iostat=io) year,mon,day,id,lon,lat,code,&
name,pre,wind,winddirection,temp,hightemp,lowtemp,&
tmpsunlight,maxrain,maxwind

----------------------------------------------------------------------
297デフォルトの名無しさん:2010/09/12(日) 03:25:54
マルチポスト?...ではないか。向こうの質問内容は意味不明だ。
http://oshiete1.watch.impress.co.jp/qa6168042.html

cycle文を使う場所が間違っている気がする。
あとは、装置番号を50ではなくispotにして、readしたあとはclose(ispot)するとかかな。

この手のFortranのIOは面倒で、真面目に考える気になれない...
298デフォルトの名無しさん:2010/09/12(日) 05:54:09
うん、変だよね・・・Cycle は使わんでもよさそうだし・・。
いろいろ副作用やら曖昧さをさけた流儀にすると・・

character*9 sssss
logical lexist
do ispot=11016,24141
write(sssss,'(i5.5,''.csv'')') ispot
inquire(file=sssss,exist=lexist)
if (lexist) then
write(*,*) 'now handling a file : ', sssss
open(unit=50,file=sssss,status='old')
do ..
read(50,*) ....
enddo
close(50)
endif
enddo

かな・・・。コンパイラ無しな状況で書いてるから自信はないね。
299デフォルトの名無しさん:2010/09/13(月) 22:30:27
教えていただいたOPENファイルの書き方でうまくいきました!
すごいです。こんな方法あるんですね。 勉強になります。
助かりました。ありがとうございました。
300デフォルトの名無しさん:2010/09/14(火) 10:57:09
えがったえがった
301デフォルトの名無しさん:2010/09/15(水) 17:22:00
2GBを超えるunformattedなファイルを read(num) (itmp(i),i=1,n) という感じで(nは既知)
読むとエラーになったんですが、 readにオプション iostat=io を加えると大丈夫でした。
2GB以上はiostatが必要ということでしょうか?

なお、エラーメッセージは以下の具合です。
Intel Fortran・・・「input statement requires too much data」
PGI Fortran・・・「attempt to read/write past end of record」
302デフォルトの名無しさん:2010/09/15(水) 19:22:28
iostat無しだとエラーを受けて終了してしまい、
iostatありだとエラーをエラーコードとしてioに保存してそのまま読み込みつづけただけじゃないの?
303301:2010/09/15(水) 20:35:31
>>302
よく考えたら2GB以上だと仕様が変わるなんてあるわけないですよね。
ファイルにはn個データが入っているはずなんですが、もしかしたらデータがおかしいのかもしれません。

もう一度調べてみます。ありがとうございました。
304デフォルトの名無しさん:2010/09/16(木) 00:56:05
>>301
書式無し、でサイズ既知、なら・・・
integer itmp(n)
で宣言した後、
read(num) itmp
と、添字なし表現で読めない?
305301:2010/09/16(木) 01:37:56
>>304
read(num) itmp
read(num) itmp(1:n)
などと試しましたが同じでした。やはりデータが疑わしいようです。
306デフォルトの名無しさん:2010/09/16(木) 03:51:31
・・あと思いつくのは・・
無書式だとメモリ上の0・1の値をそのままファイルにぶち込むだけ(な事がほとんど)だから
CPU や OS や コンパイラがファイルを生成したものと違う組み合わせで読み込むと
失敗することがあるよ。

人からもらったデータなら、元にお願いしてプレーンテキストにしてらうのが吉。
情報量は変わらないのだから適当な圧縮をかけるとファイルサイズはそう変わらないはずだ。
307304=306:2010/09/16(木) 03:53:19
Endian とか Padding とかをキーワードにして、いろいろ試してね
308デフォルトの名無しさん:2010/09/18(土) 00:15:55
文字列として読み込んでみるとか、

何かの値で初期化して
IOSTATつきで読みこんでどこでエラーが出ているか確認し、
そのデータ部をバイナリエディタで見てみるとか

309デフォルトの名無しさん:2010/09/18(土) 00:33:04
プレーンってformattedで出すってことだよね
バイナリより数倍大きくなるよね

そういえばunfortmattedとバイナリって同じ意味なの?
310デフォルトの名無しさん:2010/09/18(土) 00:53:53
>>309
今時2ギガが10ギガになったくらいで騒ぐこともあるまい・・。
とりまわしが面倒なら分割すりゃいいんだし。
311デフォルトの名無しさん:2010/09/18(土) 00:55:10
binary つかったことない・・
Unformatted は306みたいにメモリ上のならびを
そのままぶち込む・・と思ってたけど違うのかな?
312デフォルトの名無しさん:2010/09/18(土) 18:54:43
>>310
最近の数値計算じゃテラのオーダーっすよ。
つーかこのスレにいる奴らもそっち系の人ばっかでしょ?
313デフォルトの名無しさん:2010/09/19(日) 10:09:31
>>311
unformattedってデータとデータの間に区切りとしてなぜか8byte(?)ぐらい
埋め込まなかったっけ??asciiで書き出すよりファイル容量でかくなって
ビビったような
314デフォルトの名無しさん:2010/09/19(日) 10:58:46
Padding はありそう・・・とうわけでチェック!
単精度・倍精度・文字列・整数・理論、を100要素のものを無書式で書き落とすと
サイズは(バイトで)、
800,400,100,400,400+8(intel fortran)または+16(gfortran)
だった。OSはLinux、こまかいDistriは知らんw
おまけがつくのはそれぞれのコンパイラの仕様かな?
ともあれ、整数・実数・文字列はなんとなく想像のうちだけど、論理(logical)は
本来1ビットだけど、8ビット単位にPadding しているようだ(まあ、その方がメモリ内での
とりまわしが効率的なんだろうね)・・・即興の実験終わり。

313さんのはどの種類の変数だったの?
315デフォルトの名無しさん:2010/09/19(日) 11:03:09
>本来1ビットだけど、8ビット単位にPadding しているようだ
ああ、おお間違い。4バイトね。
中身をみたら当然だけど0パディングばかりでスカスカだった。
316デフォルトの名無しさん:2010/09/19(日) 11:09:15
ああ、もしかすると、301 さんのは
データを書き出したコードのコンパイラと読み込みのが別、とか・・かな。
CPU OS コンパイラ の3つ次第でどうにでも変わるのが無書式だし。

単純に同じシステム内で処理をする分には(コーディングも実行速度も)
一番速いけど、他人とのデータのやりとりではやっぱり危険だね。
自分はなるべくプレーンなテキストでやりとりするけど・・・みんなはどうしているんだろう?
HDF とかなの?
317デフォルトの名無しさん:2010/09/19(日) 15:09:39
>>313
例えば、1行の read 文で書き出すデータの総バイト数を表す数字を
データの両側に付けるのは仕様だった筈。ここが C と違う。

integer a
real*8 b

read(unit=9)a,b

とすると、12バイトのデータ(aとb)の両側に余計にデータがつく。

open 文でエンディアンの指定も出来たように記憶しているが、最後
に触ったのが3年くらい前なので忘却の彼方。
318デフォルトの名無しさん:2010/09/19(日) 15:55:08
>データの両側に付ける
direct accessのためにそういう仕様になってるんだっけか
ただ、その数字自体のバイト数がコンパイラ依存なんだよな
なんで規格でちゃんと決めなかったんだろ

>open 文でエンディアンの指定
まじ?聞いたことないけど
319デフォルトの名無しさん:2010/09/19(日) 19:26:07
>>318
> >open 文でエンディアンの指定
> まじ?聞いたことないけど

http://gcc.gnu.org/onlinedocs/gfortran/CONVERT-specifier.html

規格の事は知らんけど、こんなのがあったぞ。
コンパイラ依存だったりして。
320314:2010/09/20(月) 04:16:07
>317 データの両側に付ける
ためになった。
経験上たいていの無書式書き出ししたファイルサイズが
ちょびっとだけ大きかったから
何か付帯情報がくっついているんだろうな、くらいには思ってたけど
「両側」に「総バイト数」というのは知らなかったでした。
自分のつくったファイルをみるとたしかにそうなってます!
・・・問題は >>318 さんのとおりコンパイラごとに違うという事か。めんど〜
321デフォルトの名無しさん:2010/09/21(火) 19:33:02
なんか扱いにくいね>unformat
結局binaryが一番ってことか
322デフォルトの名無しさん:2010/10/05(火) 20:49:12
ACCESS="STREAM"
323デフォルトの名無しさん:2010/10/11(月) 00:11:11
fortran90 を使って、n 行の文字列データが格納されている
test.dat というファイルの1行1行を読み込んで、
標準出力に出力しようと思っています。
そこで、(抜粋ですが)

------------------------------------------
character(len = 50) :: chara

open(1, file='test.dat', status='old')

do i = 1, n
read(1, *) chara
write(*, *) chara
end do
------------------------------------------

と書いてみたのですが、文字列データに/や*などが含まれると
文字化けしてしまいます。また、空白が出力されません。
一体、何が原因と考えられますでしょうか。
なお、OSはubuntuで、コンパイラは、gfortranです。
お分かりの方がいらっしゃいましたらお教えいただけると嬉しいです。
よろしくお願いします。
324デフォルトの名無しさん:2010/10/11(月) 04:58:37
手元にコンパイラ無いから検証なしw

read(1,'(a)') chara
write(*,'(a)') chara

で試してちょ。たぶんうまくいくとおもうけど。
長さ指定無しのA は便利。
325323:2010/10/11(月) 14:34:43
>> 324 さん
早速お答え頂きありがとうございました!
試してみたところ、文字化けせず上手く出力されました!
お教え頂きありがとうございます!!
326デフォルトの名無しさん:2010/10/11(月) 17:56:08
みんなラクダ記法とアンダーバー記法どっちで書いてる?
327デフォルトの名無しさん:2010/10/11(月) 18:03:07
現在、30年分の日別のデータがずらっとあります。
その生のデータを初めに、5日ごとの半旬平均したあとに30年平均したい場合、
どう書いていいのか想像つかないのですが。5日ごとの半旬平均する場合、
欠損値があれば、数えずに平均したいんです。
1半旬(1〜5日間の平均)、2半旬(6〜10日間の平均)、3半旬(11〜15日間の平均)、4半旬(16〜20日間の平均)、
5半旬(21〜25日間の平均)、6半旬(26〜30日間の平均)が12カ月分で、まず1年を72半旬にしたいのです。
6半旬は、月によっては、(26〜28日間の平均)や(26〜31日間の平均)の場合もあります。

例えば、
1/1 10
1/2  8
1/4  6
1/5  2
1/6  1
1/9  2 
1/10  9
:  :


とあった場合、

1月1半旬  (10+8+6+2)/4 = 6.5
1月2半旬 (1+2+9)/3 = 4
:          :

といったような感じなのですが。わかりにくいかもしれませんよね。わからにくいところが
ありましたら、ご連絡ください。どうかよろしくお願いします。
328デフォルトの名無しさん:2010/10/11(月) 18:17:51
>>326
正直悩み所だわそれ
ごちゃ混ぜになってるw
329デフォルトの名無しさん:2010/10/11(月) 18:26:32
>>328
そっかー.最近はjavaっぽく変数名はラクダ,サブルーチン名はパスカルにしてるんだよねー
330デフォルトの名無しさん:2010/10/12(火) 02:03:50
たびたびすみません・・・。
323 ですが、Fortran90 で、文字列や数字がごちゃまぜになっている
ファイルから数字だけを抜き出したいのですが、どうすればよろしい
のでしょうか?
例えば、(1234567890)という行から、1234567890だけを抜き出したいと
思っています。

試しに、(1234567890 が書いてある行を対象に

character(len = 1) :: chara
real(kind = 8) :: x
read(1, '(a)') chara, x

とやってもエラーになり駄目でした。
(chara で左括弧だけを取り除きたかったのですが・・・。)
ご存知の方がいらっしゃいましたらお教えいただけるとありがたいです。
よろしくお願いします。
331デフォルトの名無しさん:2010/10/12(火) 02:17:58
324

数字だけ見つけるには・・・
ichar(x) (長さ1の文字列をアスキー表の整数に変換する奴)で
ichar(x) 48 から 57 の範囲をとるからそれで見分けはつくので、
一度、
 read(1, '(a)') chara
 do j = 1, 50
  x = chara(j:j)
  idummy = ichar(x)
  if ((idummy .LT. 48) .OR. (idummy .GT. 59)) chara(j:j) = ' '
 enddo

な感じで数字以外を空白に置き換えてから・・・かな?
上の例だと指数部のE (やD)とか小数点(.)や正負(+-)も空白に置き換えるので
必要に応じて変えてちょ。

あと、
write(x,'(i1)',ERR=199) idummy
みたいにI/O エラーで判別するやりかたもあるけど、
これは分岐が汚くからichar使うのが無難かなぁ
332デフォルトの名無しさん:2010/10/12(火) 02:23:08
>>327
エクセルでやった方が幸せになりそう。
333デフォルトの名無しさん:2010/10/12(火) 12:16:14
>>327
yy/mm/dd みたいにせめて桁はそろえてほしい・・・
331 的やりかたで年月日の3つの数字を取り出して
・・・先は長いw
334デフォルトの名無しさん:2010/10/13(水) 12:29:20
Intel Fortranでコンパイル時にOpenMPを指定するだけでオーバーフローになってしまうのですが
何が原因でしょうか?

F77のプログラムで、普通にコンパイルすれば問題なく作動します。
335デフォルトの名無しさん:2010/10/14(木) 10:12:22
コンパイルにしくじるんだよね?
unlimit か ulimit して制限取っぱらっても変わらないだろうなぁ。
というかOS なに?

あとは・・・Private 属性でアホみたいに大きいサイズの配列があると・・・とか、かなぁ。
336デフォルトの名無しさん:2010/10/16(土) 20:37:47
構造体のメンバを一覧でとってくる方法ってありますか?
type(member)
integer id
integer age
real(8) height
end type member

type(member) person
person%id = 1
person%age = 26
person%height = 171.d0

などと宣言して

do ???????????????
print *, @@@@@@@
enddo

のようにすると
1
26
171.00000
のなるようにメンバ変数でループをまわしたいのです
337デフォルトの名無しさん:2010/10/19(火) 00:37:23
>>335
/AUTO_ALLOCATEでうまくいきますた。
338デフォルトの名無しさん:2010/10/20(水) 15:11:36
はじめまして。

T検定を書いているんですが、
disperは、不偏分散で、valueは、分散の推定値です。

value(doy) = ((ndata(doy)-1)*disper(doy)+(ndata2(doy)-1)*disper2(doy))/&
(ndata(doy)+ndata2(doy)-2)
t(doy) = abs(sunlight(doy)-sunlight2(doy))/sqrt(value(doy)*((1/ndata(doy))&
+(1/ndata2(doy))))

これのt(doy)の出力が、+inf,時々NaNになります。
直後に

write(6,*) doy,lon,lat,ndata(doy),ndata2(doy),value(doy),t(doy),&
sunlight(doy),sunlight2(doy)

で出力した際の一部は
1 141.678 45.4147 7 10 3.97499 +Inf 1.025 0.82
2 141.678 45.4147 7 10 3.57839 +Inf 0.42 0.46000004
3 141.678 45.4147 7 10 5.2759204 +Inf 2.48 0.24000001
です。エクセルで計算した場合、Tの値はでると思うんですが、何が原因の可能性として
考えられるのでしょうか?
宣言文は、全てREAL,dimension(72)です。
339デフォルトの名無しさん:2010/10/20(水) 15:56:17
338

解決しました。すみません。
340デフォルトの名無しさん:2010/10/24(日) 19:58:54
みんな構造体使ってないのかな
341デフォルトの名無しさん:2010/10/25(月) 22:45:04
使ってるよ
342デフォルトの名無しさん:2010/10/28(木) 00:42:15
収束しねーよ・・・。(´;ω;`)
343デフォルトの名無しさん:2010/10/28(木) 02:52:36
発散しないのなら、変なattracter に
はまった•••となると
それが系の本質かもしれないから
頑張れ!
ただのタイプミスの可能性も残るけどね
344デフォルトの名無しさん:2010/10/31(日) 20:08:29
Fortran90/95の構文色分けが一番見やすいエディタって何ですか?
345!omikuji:2010/11/01(月) 01:45:22
vim

真面目な答え
346デフォルトの名無しさん:2010/11/01(月) 11:40:41
emacs
347デフォルトの名無しさん:2010/11/01(月) 22:38:20
>>345-346
ありがとうございます。

ははー。90以上だと、やっぱりそこらへんですか。
色々試してるんですけど、Fortran対応ってなってるものでも
実質77対応のが多いんですよね…

秀丸+定義ファイルとかもやってみようかな
348デフォルトの名無しさん:2010/11/01(月) 22:47:27
誰かFortran開発という観点でのエディタ・IDEを評してくれ
メジャーな言語だとそういった話題が豊富なんだが、Fortranは寂しい限り
349デフォルトの名無しさん:2010/11/04(木) 01:11:34
The first argument (X) to the intrinsic SQRT must be of REAL or COMPLEX type, not INTEGER(KIND=3)

平方根計算しようとしたらこんなのでるの
350デフォルトの名無しさん:2010/11/04(木) 02:42:02
>>349
SQRT関数の引数は実数か複素数でないといけません。整数はダメです。
351デフォルトの名無しさん:2010/11/04(木) 14:19:07
はじめまして。

前からなぜうまくいかないのか、わからず、違う強引な方法で行っていたのですが、
今回はそうはいかなく、質問させていただきます。
if文なのですが、今、データのなかの日にちを1〜365としています。
それを1〜59、335〜365を冬。60〜151を春、152〜243を夏、244〜334を秋と、if文で
場合分けしたいのですが、うまくいきません。どう書けばよいのでしょうか?

do doy = 1,365

if( 60 <= doy <= 151) then
ave1 = ave1 + sunlight(iyear,doy)
ndatax_sp = ndatax_sp + ndata(iyear,doy)
else if(152 <= doy <= 243) then
ave5 = ave1 + sunlight(iyear,doy)
ndatax_su = ndatax_su + ndata(iyear,doy)
else if(244 <= doy <= 334) then
ave9 = ave1 + sunlight(iyear,doy)
ndatax_au = ndatax_au + ndata(iyear,doy)
else
ave13 = ave1 + sunlight(iyear,doy)
ndatax_wi = ndatax_wi + ndata(iyear,doy)
endif
end do
352デフォルトの名無しさん:2010/11/04(木) 19:43:40
>>351
とりあえず教科書か↓のページを開いて IF文と論理式について復習するんだ。
http://www.str.ce.akita-u.ac.jp/~gotou/zyouhou/f90/sec3.html#sec3

Fortran90以降が使えるのなら IF文ではなく、SELECT CASE文で書いた方が
きれいに書けるかも。
353デフォルトの名無しさん:2010/11/05(金) 14:38:18
if…else if…else ifって何個も分岐するならselect case文のほうがいいに決まってるけど、
分岐が2、3個の場合でもselect case文でやるべきか結構迷う。
2、3個程度ならパッと見はifのほうがすっきり見えるからねぇ。
354デフォルトの名無しさん:2010/11/05(金) 15:05:00
>>352,353

ありがとうございました。case文で書きました。
もう一度復習してみます。
355デフォルトの名無しさん:2010/11/06(土) 07:33:17
エディタ色々試し中です。
Win版geditを使ってみました。
Fortran95に対応してますが、
拡張子見て勝手にFortranモードになってくれるわけではなくて
一々手動でモード切り替えしないといけないこと以外は
結構良いですね
356デフォルトの名無しさん:2010/11/07(日) 20:52:22
知恵を貸してください。

3次メッシュコード、年齢層、要素の値の3列
で構成されるファイルが要素別に10ファイルあって、
こいつらを1つのファイルにまとめようとしています。
(メッシュコード、年齢層、要素1、…、要素10)

10ファイルに出てくるメッシュコードと年齢層の組み合わせは
ファイルごとに異なっていて、重複する場合もあれば1ファイルのみで出現することもあります。
また、あるファイルでは数百行しか格納していないのに対して、
一方では数十万行分のデータを格納しているものもあります。

素人考えで12次元の配列にぶちこんで出力すれば良いかなとも思ったのだが、
3次メッシュコードだけで60万行になってしまうし、
要素1〜10の値がまったく含まれないコードも多々ある訳で。
効率的に要素1〜10の値が1つでも含まれるメッシュコードと年齢層の組み合わせだけを
出力できる良い方法はないでしょうか。
357デフォルトの名無しさん:2010/11/11(木) 23:58:58
教えてください!
関数 idate に関してですが、

gfortran -c -fdefault-integer-8 -O2 -std=legacy Libtad.f

In file Libtad.f:1339
call idate (month,day,year)
Error: Too many arguments in call to 'idate' at (1)

となり、エラーになってしまいました。
ググったら idate はinteger 3 個でいいと書いてあって
なぜエラーになるのか解かりません・・・。
もともとのソースコード(tinker/Libtad.f)は

integer year,month,day
(略)
call idate (month,day,year)

と書いてあります。
gamess というソフトをインストールしようとして、コンパイルしたら、
何故かそのライブラリだけがError を起こして上手くインストールできないのです・・・。
(コンパイルは入っていたスクリプトで行っています。)

OS:Scientific Linux 5.5
gfortran: gcc4.1.2
358デフォルトの名無しさん:2010/11/12(金) 04:04:39
>>357
http://gcc.gnu.org/onlinedocs/gfortran/IDATE.html
IDATE - Get current local time subroutine (day/month/year)
IDATE(VALUES) Fills VALUES with the numerical values at the current local time.
359デフォルトの名無しさん:2010/11/17(水) 00:16:08
>>358
ありがとうございます。
idate の部分上手く解決しました。
360デフォルトの名無しさん:2010/11/17(水) 20:08:20
教えてください
あるtxtファイルから必要なとこだけを抽出したいんです。例として、

120 30
121 30
121 31
120 31
120 30

123 32
124 32
124 33
123 33
123 32

↓から

120 30
121 30
121 31
120 31
120 30

123 32
123 32

のように、ある範囲(ここではX=123以下かつY=32以下)以外のものをはじきたいのですが、
空行をそのまま残す方法がわかりません。
どなたかご教授願います。
361デフォルトの名無しさん:2010/11/17(水) 21:41:36
5個ずつのブロックで入ってるのなら,
5個読みこんだら空行を書き出すようにしたら?
たとえば

do i = 1, n
read(10,*) a(i, 1), a(i, 2)
if ( a(i, 1) > 132 .or. a(i, 2) > 32) write(20,*) a(i,1 ), a(i, 2)
if (mod(i, 5) == 0) write(20,*)
enddo

とか.
362デフォルトの名無しさん:2010/11/17(水) 22:18:11
モジュールを外部ファイル化して
メインファイルとモジュール用のファイルをコンパイルするのって
f90 main.f90 mod.f90
でいいの?
363360:2010/11/18(木) 15:16:58
>>361
お答え頂きありがとうございます。

私の書き方が悪かったのですが、1つのブロックの中の数はバラバラです。
条件によっては書き出し後でそのブロックの中の数が変わることもあります。

>>361さんのおっしゃる通り、空行まで読むといったん条件を通して
新たなブロックと空行を書くようにすればできそうな感じはするのですが、
「空行まで読むと」という部分はどのようにすればいいのでしょうか?
364デフォルトの名無しさん:2010/11/18(木) 21:40:58
ichar() で空行を読み込むと "32" が返されるから,

character(1) :: a(100)

open(10, file='hoge.txt')
do i = 1, foo
read(10,'(a)') a(i)
enddo
close(10)

でもう一回同じファイルを開いて do loop を回して範囲外のものをはじきつつ
if( ichar(a(i) == 32) で空行を書き込むとかどうかな?

違ってたらごめん. 正直Fortran で完結させないでシェルスクリプトなり
使った方がラク.
365デフォルトの名無しさん:2010/11/18(木) 23:42:02
>>360
こんな感じで良いの?

program extraction
implicit none
integer::i,j,k,m,is,large_number=10000
character(len=32) c
open(10,file='hoge.dat')
do i=1,large_number
read(10,'(a)',iostat=is) c
if(is>0) stop "error"
if(is<0) exit
m=index(c,' ')
if(m/=1) then
read(c(1:m-1),*) j
read(c(m+1:),*) k
if(j<=123.and.k<=32) then
write(*,*) j,k
end if
else
write(*,*)
end if
end do
close(10)
end program extraction
366デフォルトの名無しさん:2010/11/18(木) 23:43:57
>>362
モジュール先に作るべきなんじゃなかったっけ?
f90 -c mod.f90
f90 -c main.f90
f90 mod.o main.o
となるのが無難な気がする.
367デフォルトの名無しさん:2010/11/19(金) 01:23:27
program hoge
implicit none
integer :: x, y, ios
character(len=100) :: str
open(unit=11, file="input.txt", status="OLD")
open(unit=12, file="output.txt", status="UNKNOWN")
do
read(11, "(A)", iostat=ios) str
if (ios /= 0) exit
read(str, *, iostat=ios) x, y
if ((ios /= 0) .or. ((x <= 123) .and. (y <= 32))) then
write(12, "(A)") trim(str)
end if
end do
close(11)
close(12)
end program hoge
368365:2010/11/19(金) 01:33:23
index使わなくてよいのか。
勉強になった。
ありがとん。
369360:2010/11/20(土) 00:28:16
>>364>>365>>367
皆様ありがとうございます。

残念ながら、本日はFORTRANを使える環境におらず、
月曜日にもう一度皆様からご教授いただきましたように
プログラムを見直し、計算してみようと思います。

また月曜日にご報告させていただきます。
本当にありがとうございます。それではよい週末を〜
370デフォルトの名無しさん:2010/11/22(月) 15:53:46
結果をご報告いたします

>>367様のプログラムで計算し、出力ファイルを見ると
全データの中から、すべての空行が出力されておりました。
数値は入っておりませんでした。

>>365様のプログラムでは、
同じように空行のみが出力されておりましたが、数がかなり少なかったので、
範囲内(j<=123.and.k<=32)にある空行が出力されたのではないかと思います。

もう一度じっくり考えてみたいと思いますが、無理そうなら諦めます;;
お二方ともありがとうございました。
371デフォルトの名無しさん:2010/11/22(月) 21:00:33
>>366
それでできなかった
モジュールのほうはコンパイルできるんだけどメインがモジュール読み込んでなくてコンパイルできない
モジュールのほうをコンパイルしたときにoファイルだけ生成されてmodファイルが生成されないことと何か関係あるのかな?
372デフォルトの名無しさん:2010/11/22(月) 21:25:01
>モジュールのほうをコンパイルしたときにoファイルだけ生成されてmodファイルが生成されない
これはおかしいね
modファイルを作らないコンパイルオプションになっているとか?(そんなオプションあるのか知らないけどw
373デフォルトの名無しさん:2010/11/22(月) 21:55:39
Fortran が複雑になって行っている気しかしない。
77 の頃に戻ってくれんかな。まぁ幾らなんでも
77 ではヒド過ぎるから、90 程度の拡張で。

一体何処に向って行っているのだろう。学習のコ
ストが上がるのは良い事ではないと思うのだが。
374デフォルトの名無しさん:2010/11/22(月) 22:37:57
>>372
コンパイルソフトが何か分からないんだけど
コンパイルソフト何使ってるか調べるコマンドってある?
375デフォルトの名無しさん:2010/11/22(月) 22:42:05
学習コスト<学習による恩恵 であれば肯定されるべきだと思うが
言語策定者は「こう使えばシアワセになれるんよ!」ってところを広くアピールしてほしいね
まぁそういうことするのは物書きの仕事かもしれないけど
でもFortranは少ないからなぁ
376デフォルトの名無しさん:2010/11/22(月) 22:43:26
test
377デフォルトの名無しさん:2010/11/22(月) 23:03:00
>>373
そうは言っても、もはや世界がFortranだけで閉じていないから、インターフェース周りを強化しないと
ライブラリのラッパーすらかけない。

伝統的数値計算ライブラリならともかく、MPIとかOSのAPとかIは同じ引数が色々な型を取ったりするから
そういうのに対応しようと思うと、多態型とかOOPっぽい機能が必要になるし、Cの呼び出し規格との
共通化も必要になる。

数値FormatがIEEE745に統一された以上、数値計算主役のFortranでは、その代数系を操作する
命令も欲しくなる。組み込み関数ももっと色々欲しくなる。

CPUも並列が当たり前になりつつある今、それに向いた命令も欲しい。


とはいえ他の言語のように、F90を削ったコア部分と標準Moduleみたいな形に分割したほうがいい気はするけど。
過去互換性をかなり保ったまま肥大化したから、命令の直交性なんかが悪くて、新規学習者に負担が
重すぎる気がする。
378デフォルトの名無しさん:2010/11/22(月) 23:13:55
>>377
学習負担そんなに重いかな?
Fortran使う分野は特殊なんだし、ユーザもそれなりのレベルを前提としていいと思うけど

あと、
>MPIとかOSのAPとかI

>MPIとかOSのAPIとか
だよね?
379デフォルトの名無しさん:2010/11/23(火) 01:53:59
>>378
>>MPIとかOSのAPIとか
>だよね?
んだ。すづれい。

>学習負担そんなに重いかな?
90/95を77を横目に見つつ66以前を無視する形で学ぶ分にはいいかもしれんが、
これに2003が加わるときついような。やや95と挙動が変わっている。
CLASSの作り方とかも不細工だしww
380デフォルトの名無しさん:2010/11/23(火) 18:06:40
計算時間長いプログラムをデーモンとして走らせたいんですけどどうやったらいいんでしょうか.
コンパイラはpgiです.
381デフォルトの名無しさん:2010/11/23(火) 20:31:46
>>380
まあこの場合、コンパイラはPGIでもIntelでも何でもいいんだが
http://www.codereading.com/notebook/moin.cgi/IgnoreTheHangupSignal
382デフォルトの名無しさん:2010/11/25(木) 16:00:26
Fortranで用意されている関数やサブルーチンを詳しく網羅しているサイトってないですか?
やはり本家を見るべきですか?(その本家がどこかも知りませんが・・・)
383デフォルトの名無しさん:2010/11/25(木) 22:01:10
サブルーチンは自分で組み込むもんじゃないのか
384デフォルトの名無しさん:2010/11/25(木) 22:26:19
内蔵してるサブルーチンでしょ
system_clockとか
385デフォルトの名無しさん:2010/11/25(木) 22:46:02
intel fortranは拡張機能で、内部手続きを別の手続き
に渡すことを許している。他のコンパイラでは、もし
2003に対応していたら、手続きポインタでさして、わ
たせば、一応機能しているように見える。が、偶然の
可能性もある。2003の手続きポインタがさせる先は仕様
でどうなっているかを教えていただけないだろうか。  
386デフォルトの名無しさん:2010/11/26(金) 11:36:12
Fortranである変数や配列のアドレスを知る演算子はありますでしょうか?
387デフォルトの名無しさん:2010/11/26(金) 19:02:26
非標準だが、LOCまたは%LOC関数が使えることがある。
388デフォルトの名無しさん:2010/11/26(金) 19:09:57
>>387
ありがとうございます
非常に助かりました!!
ちゅっちゅっ
389デフォルトの名無しさん:2010/11/27(土) 15:57:44
>>372
富士通だとデフォルトでは生成されない
frt -c -Am -M./ (なんとか.f90)
でいけるのではなかろうか。いずれにせよ、
frt -help | less
とかやって、"module"で検索を掛けるのが吉。
390デフォルトの名無しさん:2010/11/27(土) 22:07:56
>>389
そのレスを見る前に昔の先輩が書いてたプログラムを見てたらmakeファイルに使用コンパイラがfrtってなってたから
ググってもしやと思ったらなんというタイミング・・・
多分そのとおりだと思う
月曜に試してみてまた報告しにくるわ
391デフォルトの名無しさん:2010/11/28(日) 16:23:24
1990 4 2 401 45.2448 141.41 稚内 65 27 0 0 0
1990 4 2 402 44.5618 142.3524 北見枝幸 67 18 0 0 0
1990 4 2 404 44.2142 141.4218 羽幌 55 41 0 0 0
1990 4 2 405 44.3442 142.5806 雄武 95 36 0 0 0
1990 4 2 407 43.4612 142.2224 旭川 55 24 0 0 0
1990 4 2 409 44.01 144.17 網走 25 66 0 0 0
1990 4 2 412 43.0324 141.1954 札幌 53 36 0 0 0
1990 4 2 413 43.1236 141.4718 岩見沢 83 29 0 0 0
1990 4 2 418 42.583 144.233 釧路 83 31 0 0 0
1990 4 2 426 42.093 142.4648 浦河 55 60 0 0 0
1990 4 2 428 41.5154 140.0742 江差 53 65 0 0 0
1990 4 2 433 42.5354 140.4542 倶知安 67 34 0 0 0
1990 4 2 435 44.2036 143.2136 紋別 57 49 0 0 0

という形式のデータを読んだ場合(1961~2008年あります)、

do i = 1,137000
read(50,*,iostat=io) year,mon,day,ID,lat,lon,name,aveavecloud,sunsunlight,&
prepre,maxmaxhourpre,maxmax10minpre
if ( io < 0 ) exit
pre(ID,year,mon,day) = prepre / 10.0
sunlight(ID,year,mon,day) = sunsunlight/10.0
avecloud(ID,year,mon,day) = aveavecloud
maxhourpre(ID,year,mon,day) = maxmaxhourpre/10.0
max10minpre(ID,year,mon,day) = maxmax10minpre/10.0
ndata(ID,year,mon,day) = ndata(ID,year,mon,day) + 1
write(6,*) year,mon,day,ID,ndata(ID,year,mon,day)
end do
とし出力させると、ndata(ID,year,mon,day)がIDが402と409だけが2となります。
この原因はなんでしょうか?
392デフォルトの名無しさん:2010/11/28(日) 16:31:58
すみません。
391での説明で追加です。

ndata(ID,year,mon,day)がIDが402と409だけが2となります。と書きましたが
毎回ではないと思います。402と409ではないときもあるかもしれません。この下に2となると止める
プログラムを書いているので、1990年の4月にとまり確認できたはじめのケースです。
以下どうなっているのかはまだ確認中です。
393デフォルトの名無しさん:2010/11/28(日) 20:17:30
1つのソースファイル内で固定形式と自由形式を混ぜるとコンパイルがエラーになりますが、
「この行からこの行までは自由形式で」みたいな指定をしてコンパイルさせる方法が
あったりしませんかね?
394デフォルトの名無しさん:2010/11/29(月) 01:22:16
大学の授業で「エラトステネスのふるい」で3桁の素数を求める問題が出たのですがその解答例で

index=1
do n=2,int(max**0.5)
if(index(n)==0)cycle
index(n**2:max:n)=0
end do

↑のようなものだったのですが(回答の一部抜粋です)indexとcycleの役割がいまいち
わからないので教えてください。maxには書いてませんが上で=999と定義しています。


あと別の質問ですが大学では初めに「g77 -o 〜 〜」でコンパイルするように教わり
別の教授からは「intel -o 〜 〜」と教わったのですが具体的に何が違うのですか?


質問長くなってすいません。回答お願いします
395デフォルトの名無しさん:2010/11/29(月) 21:44:27
>>390だけど
今日試したら無事コンパイルできて実行できた
プログラム書くのがだいぶ楽になったわ レスくれた人たちありがとう
396デフォルトの名無しさん:2010/11/29(月) 23:46:20
>>394
> indexとcycleの役割

index は(おそらく整数の)配列だろう。
「ふるい」にかけた後 index(n) == 1となる n が素数。

cycleはDOループの中で次の行からend doまでをスキップする。
397デフォルトの名無しさん:2010/11/30(火) 00:46:36
>393
ないんじゃない?
ファイル分けてコンパイルするのが一般的じゃないかしら.

>394
エラトステネスのふるい自体はwikipediaにあるので説明なしで.
index=1 ! 配列index(999)に整数値1を代入,最初は全部素数だとしておく.
do n=2,int(max**0.5)
if(index(n)==0)cycle ! index(n)=0のとき(すなわち素数でない場合)enddoまでスキップ.
!この場合はこの1行↓をスキップするだけ
index(n**2:max:n)=0 !n**2からmaxまでnおきにindexの値を0とする.
! do i=n**2,max,n
! index(i)=0
! enddo !と同義
end do
このプログラムは,既に組み込み関数として用意されているindexとmaxを整数型として利用しているので,あんまり良くない回答例だと思います.

g77とintelの違いはコンパイラの違い.
398デフォルトの名無しさん:2010/11/30(火) 22:01:01
indexやmaxどころかINTEGERやIF、THENまで変数等に使えるのがFORTRANの良いところじゃないかwww
399デフォルトの名無しさん:2010/12/01(水) 01:15:45
>>396,>>397
ありがとうございます
indexってネットで検索したら関数として乗っていたのでてっきりそっちかと思ったら
ただの配列だったんですかw
おかげで謎が解けました。すっきり
400デフォルトの名無しさん:2010/12/01(水) 03:57:06
interfaceブロックの中には、型定義だけでなく、implicit noneも
及ばないのな。なんで、こんな仕様にしたんだろう。
Fotran2003からimportで取りこめるようになったが、2003完全サポート
なコンパイラは少ない。
401デフォルトの名無しさん:2010/12/01(水) 14:06:37
完全サポートって完全準拠って意味?
もうすぐ2011になろうってのに
402デフォルトの名無しさん:2010/12/01(水) 22:19:38
コンパイルすると「do文にパックド命令が出てきます」って表示されるんだけどどういう意味?
コンパイラは富士通で一応ちゃんと実行できるんだけどなんか怖い
403デフォルトの名無しさん:2010/12/02(木) 23:01:00
infoseekのweb終了で「フォートランナーのためのFortranあれこれ」っていうサイトが見れなくなってしまいました。
かなり好きなサイトだったのですが・・・ここ見てらしたら是非復活お願いします>作者さん
404デフォルトの名無しさん:2010/12/06(月) 22:06:18
.not. と .and. と .or. の優先順位ってどうでしたっけ?
405デフォルトの名無しさん:2010/12/06(月) 22:19:57
優先順位: (高) .NOT., .AND., .OR. (低)
406デフォルトの名無しさん:2010/12/06(月) 22:37:41
>>405
thx!
407デフォルトの名無しさん:2010/12/07(火) 03:35:33
自分は怖いから
くどい位に括弧付けてる
408デフォルトの名無しさん:2010/12/07(火) 05:59:47
>>407
オレも。
409デフォルトの名無しさん:2010/12/08(水) 16:01:22
Cの i++ みたいなインクリメント演算って i=i+1 とするより早い(専用の処理をするから)と聞いたのですが
Fortranではそういうのないんですか?
410デフォルトの名無しさん:2010/12/08(水) 16:21:48
>>409
そりゃ相当おバカなコンパイラだけ。
普通は最適化で同じコードになる。
411デフォルトの名無しさん:2010/12/08(水) 21:51:16
>>410
そうですか(^^;)
今のご時世気にする必要ないんですね
412デフォルトの名無しさん:2010/12/08(水) 21:53:58
>>409
何もしなくてもコンパイラが勝手に宜しくしてくれるとかないの?
構文解析だけの問題のような気がするけど。
413デフォルトの名無しさん:2010/12/09(木) 08:46:45
意味的には、
(i++) の式の値はインクリメントする前の i の値で、
(i=i+1) の式の値は代入された加算後の i の値なので、
意味が異なるから構文解析だけの問題ではない。
414デフォルトの名無しさん:2010/12/09(木) 14:19:01
でも ++ や += が使えたら便利だとは思う
415デフォルトの名無しさん:2010/12/09(木) 16:59:21
>>414
ようこそC++の世界へ
416デフォルトの名無しさん:2010/12/09(木) 22:31:23
まあ、
i = i + 1 くらいだったら、表記法を増やさないほうをとるが、
hoge(3,4)%piyo(6)%i = hoge(3,4)%piyo(6)%i + 1
となってくると、C/C++がうらやましくなったりはする。
417デフォルトの名無しさん:2010/12/10(金) 00:33:08
C++って配列演算ってあるっけ?
418デフォルトの名無しさん:2010/12/10(金) 02:41:10
std::valarrayとかか?
419デフォルトの名無しさん:2010/12/10(金) 23:08:01
配列演算自体はできるみたいね。
速度的にはどうなんでしょ。ググってたらこんなん見つけましたが

http://ir9.jp/prog/ayu/datlog/tech_cpp/1038031395/1038031395_03.html#R560

Fortranを使い続けることの意義を見出したいと思う今日この頃・・・
徒労かなw
420デフォルトの名無しさん:2010/12/14(火) 23:55:57
>>419
たとえ速くとも、こんなん書きたくないよ、
というのが、正直なところ。ライブラリで、
プログラマビリティを上げるのは限界が、
あって、豊かな配列操作を組み込みでもっ
ているfortranにはかなわないでしょう。
421デフォルトの名無しさん:2010/12/15(水) 00:25:43
C/C++のポインタや配列はエイリアスの問題を持っていて最適化の妨げになっているので
restrictポインタを使わないとFortranにはかなわないよ
422デフォルトの名無しさん:2010/12/15(水) 13:58:06
Windows版のifort (Intel Visual Fortran)でプロファイルを取る方法を教えてください。

検索すると、
ifort -pg hoge.f90
./a.out
gprof ./a.out gmon.out
というのがよく掲載されているのですが、Windows版には、下記のように
-pgの対応物がないようです。

map_opts -tw -lf -opts -pg

Intel(R) Compiler option mapping tool

mapping Linux options to Windows for Fortran

'-pg' Linux option maps to
--> no equivalent Windows option found

423デフォルトの名無しさん:2010/12/15(水) 20:41:21
あるデータをバイナリ化にするプログラムについての質問です。
あるデータは、2列の33行のデータです。1列目は年、2列目は実数が入っています。
----------------------------------------------------------------------
implicit none

INTEGER :: i,iyear
real*4 :: val

open( 10, file='a.dat', status='old')
open( 90, file='b.bin', status='unknown', access='direct', &
recl=1)

do i=1,33
read( 10, * ) iyear, val
write( 90, rec= i ) val
enddo

stop
end
------------------------------------------------------------------------
これはコンパイルはできるのですが、実行できませ。
At line 12 of file bainari.f90 (Unit 90 "b.bin")
Traceback: not available, compile with -ftrace=frame or -ftrace=full
Fortran runtime error: Writing more data than the record size (RECL)
というエラーがでます。
なにか考えられる原因はありますでしょうか??
どうかよろしくお願いします。
424デフォルトの名無しさん:2010/12/15(水) 23:33:45
仕様でどうなっているかは忘れた。
正格でないかもしれないが、
いっかいのwrite文でかきだせる長さ
はreclで指定した長さ以下でなければ
ならない。

ここで問題となるのはreclの単位。
intel機の場合、1バイト、いっぽう書こう
としてるvalは4バイトなので、ランタイム
エラーが出る。Recl=4としないといけない。
425デフォルトの名無しさん:2010/12/15(水) 23:38:26
とはいえ、元のコードが間違つているわけでもない。
SUNなどの環境ではreclの単位は4バイトである。
(コンパイルオプションで、1バイトにできるが^-^)
426デフォルトの名無しさん:2010/12/16(木) 12:26:42
ありがとうございます。
ちょっとわからないんですが、僕の使っているパソコンはレッツノートでCPUは
Intel centrino2と書いています。cygwinを使っています。
直し方ありますか?
427デフォルトの名無しさん:2010/12/16(木) 12:33:29
>424,425

すみません。RECL=4となおしたらできました。
ありがとうございます。描画して合ってるか確かめてみます。
428デフォルトの名無しさん:2010/12/16(木) 17:29:36
初めて訪問させていただきます。
intel fortran にて
error #7836
実引数がスカラーの場合、実引数が形状引継ぎ配列やポインター配列でない配列の要素、またはそれらの要素の部分文字列でなければ、対応する仮引数はスカラーになります。
これはどのようなエラーでしょうか?
debugモードだと発生し、releaseモードだと発生しません。

宜しく、宜しくお願いします。
429デフォルトの名無しさん:2010/12/16(木) 20:20:40
構文チェックを厳しくするオプションがDebugのときは付くのだと思うのだが。
該当箇所(呼び出し元と呼ばれる手続き)を見せれる?

渡ししている変数の型と、読んでいる手続きの引数の型が
わかればいいです。

430428:2010/12/17(金) 15:40:59
>>429
解決しました。
問題の箇所は、変数Aが
 親ルーチンで配列
 子ルーチンは実働が無いので変数
 孫ルーチンで配列
にて宣言されていたためです。
リリースモードではスルーされていました。
ありがとうございました。
431デフォルトの名無しさん:2010/12/19(日) 16:15:48
>>414
それはアセンブラのINC命令とかADD命令に一対一対応していた頃は意味があったかもしれないが、
いまさらただの表記の慣れの問題にすぎんだろ。

>>416
F2003でASSOCIATE命令が出来たから、がまんできるべ?

>>420
F95以降ELEMENTAL FUNCTIONをユーザー定義できるようになったから、スカラー用の関数を書けば
多次元配列を引数に出来るので便利。
これはLISPとかのMAPと同じようなもんだが、マクロと実行命令ではスピードが違うから
配列操作が多いならFortran以外ないだろう。
432デフォルトの名無しさん:2010/12/19(日) 17:43:25
話にあんまついて行けてない・・・
多分レベル差がありすぎるんだと思う
誰かF2003あたりの本書いてください、オナシャス!
433デフォルトの名無しさん:2010/12/21(火) 00:42:38
2階常微分方程式の問いを考えていたのですがどう手をつけたらいいかわかりません
問題分は
ttp://iup.2ch-library.com/i/i0207521-1292859670.jpg
です。
できれば解説付きでお願いします
434デフォルトの名無しさん:2010/12/21(火) 18:32:42
せめて画像回転ぐらいしようや
読ませる気が無いとしか思えん
435デフォルトの名無しさん:2010/12/22(水) 00:56:32
>>433です
貼る画像間違ってました
http://iup.2ch-library.com/i/i0207930-1292946928.jpg
お願いします
436デフォルトの名無しさん:2010/12/22(水) 06:01:10
ルンゲ・クッタ法を教えて下さい、なら Fortran の話題じゃないんじゃね?
それこそ、ググ(ry
437デフォルトの名無しさん:2010/12/22(水) 20:16:33
MODULE Integrate
IMPLICIT NONE
CONTAINS
! ルンゲ・クッタ4次積分子
! y : (x1,...,xn=t) at t=t0+dt
! x : (x1,...,xn=t) at t=t0
! f : (x1,...,xn) -> (f1,...,fn)
! (形式)
! f(f_vec, x_vec)
! real(8), dimension(n) :: f_vec, x_vec
SUBROUTINE Runge_Kutta4(y,x,f,dt)
real(8), dimension(:) :: y,x
real(8), dimension(size(x)) :: xx, k1,k2,k3,k4
real(8) :: dt
interface
subroutine f(deriva,x)
real(8), dimension(:) :: deriva, x
end subroutine
end interface
call f(k1,x)
xx=x+0.5d0*dt*k1
call f(k2,xx)
xx=x+0.5d0*dt*k2
call f(k3,xx)
xx=x+dt*k3
call f(k4,xx)
y=x+dt/6.0d0*(k1+2.0d0*(k2+k3)+k4)
END SUBROUTINE
END MODULE
438デフォルトの名無しさん:2010/12/22(水) 20:33:06
そういやルンゲクッタの証明ってどうやんだっけ・・・
たいていのテキストには式しか書いてないよな
439デフォルトの名無しさん:2010/12/22(水) 21:50:33
dx(t)/dt = f(x)
の関係を使って、xの高次の時間微分をfのxによる微分に置き換える
(いわゆるチェーンルールを使って)
係数を知ったうえで、4次までの展開になっていることを確認したことが
あるが、それでもかなり面倒な計算になる。
440デフォルトの名無しさん:2010/12/23(木) 00:59:16
>>437さんありがとうございます
さっそく明日やってみたいと思います
441デフォルトの名無しさん:2010/12/25(土) 00:33:34
>>437さんのがうまくできなかったんですが
どういう手順で考えていくかだけでも教えてもらえませんか?
442デフォルトの名無しさん:2011/01/05(水) 19:18:52
しばらく見てなかったので申し訳ない。使用例を書きます。
例として、調和振動子を考える。これは、位置x, 速度vについての微分方程式
 dx/dt = v (1)
 dv/dt = -x (2)
である。形式的に自明な式
 dt/dt = 1 (3)
を追加して、ベクトル z = (x, v, t)を定義すると、
(1)〜(3)はあるベクトル関数fによって
 dz/dt = f(z)
とかける。このfをFortranで具体的に書くと以下のようになる。
module ho
subroutine f(dz_dt,z)
real(8), dimension(:) :: v, x
dz_dt(1) = z(2)
dz_dt(2) = -z(1)
dz_dt(3) = 1D0
end subroutine
end interface
program test
use ho
real(8) :: z(3), dt
z(1) = 1d0 ! x(0)
z(2) = 0d0 ! v(0)
z(3) = 0d0 ! t = 0
dt = 0.01D0
do while (x(3) .lt. 6.28)
call Runge_Kutta4(x,x,f,dt)
write(*,*) z
end do
end subroutine
443デフォルトの名無しさん:2011/01/06(木) 17:48:39
三重積分の数値計算プログラムについて相談
台形公式を用いたプログラムで分割数nを大きくしていけば精度は上がると思ってるんだけど
n=100とn=1000とでは値が何故か全然違うんだ
被積分関数f(x,y,z)=x^2+y^2+z^2で積分区間をx,y,z共通で[0,1]としたとき値Sは1.0になるわけだけど
n=100のときS=1.000005054で、n=1000のときS=6.25e-2になってしまう
数学板とで迷ったけどアルゴリズム的なことだったらこっちかなと思って聞いてみる
誰か分かる人いたら教えてください
444443:2011/01/06(木) 17:54:37
メインプログラムはこんな感じ

n=1000(あるいは=100)

xs=0.0
xe=1.0
ys=0.0
ye=1.0
zs=0.0
ze=1.0
dx=(xe-xs)/float(n)
dy=(ye-ys)/float(n)
dz=(ze-zs)/float(n)
s=0.0

do iz=1,n
z1=zs+dz*float(iz-1)
z2=zs+dz*float(iz)
do iy=1,n
y1=ys+dy*float(iy-1)
y2=ys+dy*float(iy)
do ix=1,n
x1=xs+dx*float(ix-1)
x2=xs+dx*float(ix)

h1=f(x1,y1,z1)
h2=f(x2,y1,z1)
h3=f(x1,y2,z1)
h4=f(x2,y2,z1)
445444の続き:2011/01/06(木) 17:56:07
h5=f(x1,y1,z2)
h6=f(x2,y1,z2)
h7=f(x1,y2,z2)
h8=f(x2,y2,z2)

h=(h1+h2+h3+h4+h5+h6+h7+h8)/8.0
s=s+dx*dy*dz*h

end do
end do
end do

とまあこんな感じ
今はf(x,y,z)=x^2+y^2+z^2で計算してるけど最終的にはもうちょっと複雑な関数になる
446デフォルトの名無しさん:2011/01/06(木) 22:33:32
「情報落ち」だな
447デフォルトの名無しさん:2011/01/07(金) 00:34:52
>>446
448デフォルトの名無しさん:2011/01/07(金) 00:57:29
ググれ
このごろじゃ計算誤差について何も教えてないのか

最後に合計を見るだけじゃなく
実際に何を足してるのか出力してみろ
何が起きてるのか分かる
449デフォルトの名無しさん:2011/01/07(金) 01:52:41
>>448
把握した
今このプログラムは実数が単精度になってるから倍精度にして
h1〜h8まで出力してみて確認してみる
450デフォルトの名無しさん:2011/01/07(金) 20:40:05
あぁああ〜
乱流モデルの差し替え、うまくいかねーーーーーーOTL
なぜあぼーとするんだ・・・
だれか助けて・・・
451デフォルトの名無しさん:2011/01/07(金) 23:27:34
じゃあDNSで
452デフォルトの名無しさん:2011/01/07(金) 23:34:10
>>443だけど単精度から倍精度に変えて情報落ちしてるであろうSの計算方法を変えたら問題解決できますた
453デフォルトの名無しさん:2011/01/07(金) 23:38:34
>>448
昔のほうがしっかりしたカリキュラムだったって話を聞くが本当なのか
ゆとり教育ってやつか
454デフォルトの名無しさん:2011/01/08(土) 21:47:53
>>453
昔は電子計算機という前提のカリキュラムだったが、最近は学生全員にノートパソコン買わせてるのに
プログラミングも教えないからな・・・
455デフォルトの名無しさん:2011/01/09(日) 18:56:32
なにそれひどい
456デフォルトの名無しさん:2011/01/12(水) 03:08:24
>>442さんありがとうございます
おかげである程度理解できました!
457デフォルトの名無しさん:2011/01/13(木) 13:52:47
FORTRANの課題が出て〆切が月末なんだ。
三問ほど有償で解いてやんよって人いないか。
458デフォルトの名無しさん:2011/01/13(木) 15:36:12
とりあえず問題晒してみそ
誰か解いてくれるかも
459デフォルトの名無しさん:2011/01/13(木) 23:53:21
>>435なんですが
1:0〜20の区間を適当に分割
2:初期値入力
3:2階常微分方程式を一階常微分に直す
  dy/dx=z dz/dx=f(x,y,z)=-sin(y)としました。
4:ルンゲクッタ法
  y=y+(k1+2*k2+2*k3+k4)/6
k1=h*f(x,y)
k2=h*f(x+h/2,y+k1/2)
k3=h*f(x+h/2,y+k2/2)
k4=h*f(x+h,y+k3)
  これの()内が3つあるバージョン。分割した回数繰り返す。
5:ファイルにデータ書き込み出力

こういう流れで作りたいんですがどこが間違ってるのか出力すると初期値を
繰り返したデータになってしまいます。2〜5あたりだけでもいいので
わかる方いたら教えてもらえませんか?
イメージとしては↓のサイトのようにやったんですがうまくいきませんでした
http://www.akita-nct.ac.jp/~yamamoto/lecture/2005/5E/differential_equations/text/html/node3.html
460デフォルトの名無しさん:2011/01/14(金) 00:02:02
お言葉に甘えて失礼します。
とりあえず一問目。

「ある動物園の一日の総入園者数(1行目)と入園者の年齢(2行目以降)が
収納されているファイルからデータを配列に貯えて、平均年齢、及び最高年齢と最低年齢を
求めて出力するとともに、各年代(10歳未満、10代、20代、・・・70代、80歳以上)ごとの
入園者数を出力するプログラムを作れ。
また、平均年齢は小数点以下第1位まで示すこと。」

データはここ。
http://www5.plala.or.jp/selene-kw/

宿題代行スレでないのは百も承知だが、ここ以外にFORTRAN師探せなかったんだ。
なにかしら反応もらえると助かる。
よろしくおねがいします。
461デフォルトの名無しさん:2011/01/14(金) 01:15:44
>>459-460
やはり FORTRAN77 か? 90でもいいのか?
462デフォルトの名無しさん:2011/01/14(金) 02:36:05
90でも77でもいいです
といってもあまり違いが分かってるわけじゃないのですが
463デフォルトの名無しさん:2011/01/14(金) 09:31:01
>>460
ここは宿題スレだからスレの趣旨には合ってる
464デフォルトの名無しさん:2011/01/14(金) 10:24:33
>>460
予想してたより簡単で拍子抜けしたw
暇ができた時にまだ誰も解いてなかったら答えるよ
465デフォルトの名無しさん:2011/01/14(金) 11:56:20
でけた
年代別のところは途中で端折ったから自分で補え

program main

implicit none

integer :: i, n, decade(9)
integer,allocatable :: age(:)

open (99,file="ex5-3.d", status='old', action='read', position='rewind' )
read (99,*) n
allocate ( age(n) )
read (99,*) ( age(i) , i=1, n )
close (99)

decade = 0
do i=1,n
if (age(i)<10) decade(1) = decade(1) + 1
if (age(i)>11 .AND. age(i)<20) decade(2) = decade(2) + 1
end do

write (*,'(a8, f5.1)') " ave = ", REAL(sum(age)) / REAL(n)
write (*,'(a8, i5)') " min = ", minval(age)
write (*,'(a8, i5)') " max = ", maxval(age)

write (*,'(a8,i5)') " 0-10 : ", decade(1)
write (*,'(a8,i5)') "11-20 : ", decade(2)

end program main
466デフォルトの名無しさん:2011/01/14(金) 11:57:08
ありゃ、タブは2chじゃ無視されるんだな
適宜字下げしてくれ
467デフォルトの名無しさん:2011/01/14(金) 12:05:15
あと、連続したスペースも無視されるようだから a8 の中身も適宜修正してくれ
intelコンパイラ、f90形式でうまくいくのは確認した
468デフォルトの名無しさん:2011/01/14(金) 21:04:28
スペースを&#160;←これを半角で入れるとちゃんと字下げされるんだけど
コピペした時に削らないとコンパイルできないので置換する必要がある
469デフォルトの名無しさん:2011/01/14(金) 23:17:59
早っΣ(;゜д゜) 親切な回答ありがとうございます!!
C言語の代行が企業だと50万かかると検索して出たから
有償とかそれなり覚悟してたんだ。

3問中の1問は自力で解くことにします。
もう1問も類似したプログラム見つけるなりしてみる。
どうしても無理げだったら聞きにこさせてもらうかも。

本当にありがとうございます!
470デフォルトの名無しさん:2011/01/16(日) 17:31:52
>>435
>>459みたく解ける方いませんか?
もうここに頼るほか解く手段が見つかりません
471デフォルトの名無しさん:2011/01/16(日) 18:05:00
>>470
435の画像が見られないので何ともいえないけど、442では無理なのか?
472471:2011/01/16(日) 21:05:21
>>470
今どんな状態か報告すれば親切な人がアドバイスしてくれるかもしれないよ
473デフォルトの名無しさん:2011/01/17(月) 00:12:34
>>435が消えてたので再度貼ってみました

http://iup.2ch-library.com/i/i0224579-1295190437.jpg

>>471
437,442のやり方でやってみたんですが自分は77か90しかわからないせい
か、単純に勉強不足が原因でわからなくてコンパイルとかできませんでした

私事だけどこの課題が解けないと講義の単位が取れないかもしれないので
かなり焦っています。
親切な方ぜひよろしくお願いします。
474デフォルトの名無しさん:2011/01/17(月) 16:10:37
構造体で配列を定義するとき、配列サイズを以下のように定数で指定すると
「構造体ではattribute指定できない」という旨のコンパイルエラーになりました。

type test
integer, parameter :: n = 10
integer :: a(n)
end type
type(test) :: test1
end

parameterを使わず、integer :: a(10) とすればもちろんコンパイルできますが・・・。
やり方・考え方がおかしいんでしょうか?ご助言お願いします。
475デフォルトの名無しさん:2011/01/18(火) 00:03:16
>>473です
今日TAの人に助言をもらい完成させることができました。
考えてくれた方がもしいたらありがとうございます
476デフォルトの名無しさん:2011/01/18(火) 11:39:11
(x)=exp(a*x) をm次まで x=0の近傍でTaylor展開した値 g(m)、
f(x)との間の誤差を評価するプログラムをfortranで作成せよ。


またプログラムを実行し、ある1種類のaの値に対し、(xの値も2種類程度でよい)

a x exp(a*x) m g(m)


の順でデータを並べてファイル ftaylor.dat に出力せよ。
また f(x)-g(m)をmの関数として gnuplotで表示し、誤差がどのように小さくなってい くかを
確認せよ。(特定の関数で |f(x)-g(m)|がフィットできるかどうか見てみてください
これをどのようにしていけばいいかおしえてください.
477デフォルトの名無しさん:2011/01/18(火) 18:43:27
f(x)=exp(a*x)をx=0でテイラー展開(マクローリン展開)すると

g(m) = sum_(n=0)^m [ { f'(n)(0) / n! } x^n ]
    = 1 + a*x + a^2*x^2 / 2! + a^3*x^3 / 3! + … + a^m*x^m / m!

になる.実際はg(x,m)という関数なりサブルーチンを作って,
f(x)-g(x,m)が,mを増やすごとに0に近付くことを確認すればいい.
478デフォルトの名無しさん:2011/01/18(火) 19:03:15
>>474
定数を構造体の前に置く

integer, parameter :: n = 10

・・・

type test
integer :: a(n)
end type

・・・
479デフォルトの名無しさん:2011/01/18(火) 19:52:37
>>478
ありがとうございました。
480477:2011/01/18(火) 20:19:13
>>476
とりあえず作った
ファイル出力は自力でよろしく
使い方もソース読んで自分の頭をひねりましょう

http://madexpress.ddo.jp/kudafort/5-476.f90
481デフォルトの名無しさん:2011/01/18(火) 20:31:31
構造体って数値計算だと遅くなるから使わないって聞きますが本当ですか?
クラスも構造体も使えないとなると相当生産性悪いような気がしますが
482デフォルトの名無しさん:2011/01/18(火) 20:44:53
>>481
構造体使うとメモリアクセスが非連続になるからね
この辺の事情はCでも同じじゃないの?

反復計算は配列を何度も読み出すから
これが構造体になるとキャッシュヒット率はガタ落ちになる
483デフォルトの名無しさん:2011/01/18(火) 21:07:28
なるほど
でも物理系の数値計算って最終的に Ax=b を解く問題に帰着するケースが多いし
計算時間の大部分はこれが占めますよね
そうするとA, bさえ連続な配列にしておけば、残りのデータは構造体でもいい気がします
484デフォルトの名無しさん:2011/01/18(火) 21:12:51
>物理系の数値計算って最終的に Ax=b を解く問題に帰着するケースが多いし
あ、そうとも限らないか^^; 訂正します
まあ何事も用途次第ということですかね
485デフォルトの名無しさん:2011/01/18(火) 21:21:36
ttp://www.mm2d.net/c/c-15.shtml
Cでも同じような感じだね
ただしメモリ配置を明示できる点で若干のアドバンテージがあると解釈した

>>483
例えば,問題,各パラメータ,求解時間を格納する程度なら
構造体使っても差は出ないと思うけど,
行列やベクトルはメモリ上で連続になる配列を使うのがセオリーだね
CG法なら探査ベクトルや残差ベクトルもみんな1次元配列
行列も非零要素だけ抜き出した1次元配列とポインタを格納する配列があればいい

物理計算に構造体使ってるプログラムは見たことが無いw
486デフォルトの名無しさん:2011/01/18(火) 21:24:30
>>484
うんにゃ,その認識で合ってる

ほとんどの物理現象は偏微分方程式で書き表わせるし,
偏微分方程式を離散化すれば線形方程式系になるよ
487デフォルトの名無しさん:2011/01/18(火) 23:09:20
ここの人達は行列ソルバは自作したりします?
自分はLAPACKに頼りっきり…
ライブラリがないと何もできないような人間になっちゃいそうで怖いけどw
488デフォルトの名無しさん:2011/01/18(火) 23:34:40
>>487
私は LAPACK 使ってます。自作できるほどのスキルが無いので。
それでも数値積分は泣く泣く自作した覚えがある。
489デフォルトの名無しさん:2011/01/18(火) 23:39:57
>>488
自分もガウスルジャンドル積分くらいですかね、自作したのは
特殊関数とか自分で書くの無理だよなぁ…あれは
490デフォルトの名無しさん:2011/01/19(水) 00:41:25
ソルバの研究中です
まだ駆け出しですが
491デフォルトの名無しさん:2011/01/19(水) 12:52:04
>>480
解答ありがとうございます。
492デフォルトの名無しさん:2011/01/19(水) 13:21:32
何回もすみません。


b = b * dble(i)
g = g + (a**i * x**i / b)
write(*,'(2f10.3,e11.3,i6,e11.3)') a, x, f, i, g
ここの意味がよく分からないので説明おねがいします。
493デフォルトの名無しさん:2011/01/19(水) 13:55:47
あとgnuplotでのf(x)ーg(m)の表し方が分からないのでおしえてください。
494デフォルトの名無しさん:2011/01/19(水) 14:50:46
>>492
ループ内1行目は>>477における m! の計算,
2行目は g(m) = g(m-1) + (a^m * x^m / m!) を計算してる
マクローリン展開を理解すれば自ずと分かるはず
3行目は問題どおり a x exp(a*x) m g(m) の形で標準出力してるだけ

gnuplotぐらい自分で何とか汁
ループ内に m と f-g をファイル出力するコードを追加して
それをgnuplotで読み込んで描画すればいい

この問題はmが増えるにつれてf(x)=exp(a*x)とg(m)の値が近づくことを確認しろって意図だろう
だからmが増えた時に f-g が0に収束していく様子がグラフに描ければいい
495デフォルトの名無しさん:2011/01/19(水) 16:17:45
>>494
ありがとうございます
496デフォルトの名無しさん:2011/01/19(水) 16:53:21
>>476ではmを手で与えて、データファイルを作成した。
今度は、誤差の絶対値eps(実数)を手で与え、そのeps以内に誤差が収まるためには
mがいくら以上であることが必要かを求めるプログラムを作成せよ。
この場合はどうすればよいですか?
497デフォルトの名無しさん:2011/01/19(水) 17:46:51
ループ内で誤差を計算し,
ループを do while に書き換えるか if (〜) exit でループを抜ければいい
そのときにループが何回回ったかを数えろ

つーか質問の丸投げはよそうや
「〜って考え方で合てるか?」とか
「こう書いたが計算が合わない」みたいな質問の仕方にしようぜ

自分で考えた痕跡が無いと答える気が失せてくる
498デフォルトの名無しさん:2011/01/21(金) 09:52:44
すいません
わかりました
ありがとうございます。
499デフォルトの名無しさん:2011/01/21(金) 16:25:00
sinとdsinみたいな総称名と個別名はどちらを使うべきですか?
総称名はバグの元なので危険という意見もあれば、逆に見通しが良くなってバグも減るという考えもあると思います。

ただ、型変換のreal, float, dbleあたりは常に注意が必要だとは思いますが。
500デフォルトの名無しさん:2011/01/21(金) 16:35:29
>>499
総称名は引数の型を問わないけど
個別名は引数の型が限定される

pi が単精度型だと
sin(pi) はOKでも dsin(pi) はエラーを起こす
ただし前者で得られる答えは単精度だから、
倍精度の答えが必要なら dsin(dble(pi)) とする必要がある

仮に pi が倍精度なら sin(pi) も dsin(pi) も同じ

この辺はコンパイラが勝手に辻褄合わせてくれるかもしれんけど
501デフォルトの名無しさん:2011/01/21(金) 17:48:42
>>500
ありがとうございます。確かに Intel Fortran 11ではエラーになりました。

よく考えたら、piが単精度な時点で dsin(dble(pi)) とやっても得られる精度は sin(pi) と
全く変わらないわけですから、結局のところ個別名を使う理由なんてなさそうですね。

つまり、型の間違いによるバグは個別名を用いたところで解決できるものではなく、
型の間違い自体をしないよう代入・演算を気を付けるしかない、ということですね。
502デフォルトの名無しさん:2011/01/21(金) 19:41:49
>>501
>dsin(dble(pi)) とやっても得られる精度は sin(pi) と全く変わらない
まぁその通りだけど、sin(pi)を他の倍精度型の数値とかけ合わせたりする時が怖いね

型を明示する時以外は総称名で事足りるけど、
計算バグ除けには個別名が便利なこともあるって認識だな、俺は
503デフォルトの名無しさん:2011/01/21(金) 22:49:01
>>502
確かに、いつも型を個別名にしておけば、書き間違えたときにコンパイラが教えてくれるというのは利点ですね。
やはり、少なくとも単精度・倍精度が入り交じるときは個別名を使ったほうが良さげですね。
504デフォルトの名無しさん:2011/01/22(土) 22:42:54
内部副プログラムの関数(メインプログラムのcontains以下に書いた関数)の仮引数に
optional属性を付けると変なところで関数を抜けてしまうようで、なんだか挙動がおかしいです。

手元の本(数値計算のためのFortran90/95プログラミング入門、牛島)を見ますと、
「モジュール副プログラムではそのまま使えるが、外部副プログラムの場合はインターフェースが必要」
という記述があったのですが、もしかして内部副プログラムではoptional属性は使えないんですか?
というか、内部副プログラムの関数とモジュール副プログラムの関数は機能的に同じだと思っていたのですが、違うんですか?
505デフォルトの名無しさん:2011/01/24(月) 21:21:45
>>504
>内部副プログラムではoptional属性は使えないんですか?

問題なく使える。

program main
implicit none

print *, f1(1.0)
print *, f1(3.0, c = 0.5)
print *, f1(1.0, 2.0, 3.0)

contains
real function f1(a, b, c)
real, intent(in) :: a
real, intent(in), optional :: b, c
! f1 = a + b * c
f1 = a
if (present(b)) f1 = f1 + b
if (present(c)) f1 = f1 * c
end function f1
end program main

optionalな引数をチェックなしで使ったり
誤って主プログラムで宣言した変数を内部副プログラム内で書き換えたり
してるんじゃないかな?
506471:2011/01/25(火) 00:05:02
507デフォルトの名無しさん:2011/01/25(火) 00:27:46
>>478
便乗質問ですが、定数って構造体の中では作れないんですか?
それってちょっと不便じゃないですかね?
508デフォルトの名無しさん:2011/01/25(火) 15:21:50
>>504 さんの実例体験と書籍からすると、
使えるほうが例外なのかもね。
安全な回避策は今のメインを大きな副プログラムにして
それを呼ぶだけのメインを新たに作るとか、かなあ。
509デフォルトの名無しさん:2011/01/25(火) 15:52:23
質問です。
読み込むデータが
1 0
2 4
3 5
: :
24 0
25 6
: :
48 3
: :

というようになっており、1万行近く続きます。これを1列目が24の倍数になったらそれまで読んだ行を
すべて出力するようなプログラムを書きたいのですが、どう書けばよいのかわかりません。
1~24が1日分、25~48が1日分となっているので、分割して別ファイルに出力したいんです。
それぞれ別ファイルへというプログラムは書けるのですが、僕が思い浮かぶのは一列目に24の倍数がきたら、出力する
というプログラムしか思い浮かばず、24の倍数がきたら今まで読んだ行すべてを出力、次にまた24の倍数がきたら前の24の倍数
以後からの行すべてを出力というのはどう書いていいのか。。
どうかアドバイスいただけないでしょうか?
510471:2011/01/25(火) 20:25:36
mod使って24で割った時の余りの値で制御すれば良いんじゃないかな
511デフォルトの名無しさん:2011/01/25(火) 20:27:09
すまん。上は24で割って整数化しちゃえばのミス
512デフォルトの名無しさん:2011/01/25(火) 20:33:44
俺だったら

m=1
do (ファイル終わるまで)
do i = m, m+23
(中略)
end do
m = m + 24
end do

と考えたがスマートじゃないなw
513デフォルトの名無しさん:2011/01/26(水) 01:11:30
>>510,511
整数化というのはどういうことでしょうか?できれば、1列目の数字は変えたくないんですよね。
do i = 1 10000
read(50,*) number,sun
enddo
このiを使って24ずつにしゅつりょく分割できればいいんですが。。

>>512
10000行分書いていくのは、しんどいですよね。ただちょっと書き方参考にさせていただきます。
514デフォルトの名無しさん:2011/01/26(水) 03:30:21
>>513
ループのiを24で割ると24行毎に値が変わる
1-24,25-48,...と組を作る為に、iをi-1に変えて
k=(i-1)/24として、装置番号に利用すると上手くいく

program kudasure
implicit none

integer :: i
integer :: number,sun
integer :: k
integer,parameter::num=11 !適当な数
character :: output*9,temp*5

do i=1,10000
k=(i-1)/24
write(temp,"(I5.5)") k
output=temp//".txt"

if(mod(i,24)==1) open(k+num, FILE=output, status="unknown")
write(k+num,*)i
if(mod(i,24)==0) close(k+num)
end do

endprogram kudasure
515デフォルトの名無しさん:2011/01/26(水) 03:44:30
補足すると

write(temp,"(I5.5)") k

は5桁で空の部分に0を補って数字をtempに書き出す(ex 1→0001)やつだから
516デフォルトの名無しさん:2011/01/26(水) 12:18:33
>>514
UNIT番号は機種依存だが、99までだったりすることが多いぞ。
ファイル名を動的に生成して開くほうが良いアルヨ。
517デフォルトの名無しさん:2011/01/26(水) 12:20:43
>>514,515

ご丁寧にありがとうございました。
今日自分で書いてやってみます。
また、わからなかったら書き込むと思いますので、また見かけましたら
よろしくお願いします。
518デフォルトの名無しさん:2011/01/26(水) 13:17:50
>>516
そうだったのか
知らなかった。マジサンクス
519デフォルトの名無しさん:2011/01/30(日) 22:09:50
いえいえ
520デフォルトの名無しさん:2011/03/05(土) 13:56:17.72
ふう
521デフォルトの名無しさん:2011/03/09(水) 18:33:35.88
Windowsでg95を入れてプログラミングを始めたんですが、
アイコンへのドラッグ&ドロップを実装したいんですがどうしたらいいんですか?
よろしくお願いします。
522521:2011/03/09(水) 18:49:58.61
自己解決しました。ありがとうございました。
523デフォルトの名無しさん:2011/03/15(火) 22:01:25.92

ttp://n.xxad.net/watch/sm13809685

【どうすればこの欲望の渦巻く堕落した世界に私の名を残せるだろうか】
※名を残したいとは思わないがw。
【狂乱のマシンを残せばいい】

【この狂乱の世界に相応しい野獣のようなマシンを】

【狼が来たからやってきた】

【お前の平和な街は今はもう安全ではない】
524デフォルトの名無しさん:2011/05/01(日) 07:09:28.70
gfortranで可変FORMAT文を使えますか?
525デフォルトの名無しさん:2011/05/01(日) 18:51:34.81
>>524
やってみたら良い。
526デフォルトの名無しさん:2011/05/01(日) 23:15:36.09
< >つけてやってみたけど、できませんでした。
可変使わなくても対応できたので、問題はありませんでしたが。
527デフォルトの名無しさん:2011/05/09(月) 10:04:24.24
質問です。


Fortran 2003でチェスのプログラムを書いています。

対戦相手の入力待ち時間内に並行してチェスのシミュレーションを行いたいのですがどうしたらいいでしょうか?

たとえばreadを使うと入力するまで計算が止まってしまいますが、計算を止めないまま予測計算を継続させられませんでしょうか?

528デフォルトの名無しさん:2011/05/09(月) 11:34:48.48
>>527
F2003規格には、asynchronous I/O というものがある。
理屈の上ではそれを使えば良い。今のコンパイラで実装されているか不明。

野蛮になっていくが、OpenMPとかでOSのAPIでスレッドを投げる手もある。
529デフォルトの名無しさん:2011/05/09(月) 11:36:31.27
>OpenMPとか、MPIとか、コンパイラ並列拡張命令、OSのAPIでスレッドを投げる手もある。
530デフォルトの名無しさん:2011/05/09(月) 11:42:14.31
>>528

サンクス!とりあえずIntel Fortran XE Compilerは対応してるっぽいわ。
ついでに関係ないけどMATLABもAsynchronous inputが2010aからできる。

長年の疑問が解決したわ。チョーありがと。

GPU Fortranで書こうかと思ってたけどCUDA Fortran高いからIntel FortranとMATLAB GPUでコードかくことにします。
531デフォルトの名無しさん:2011/05/09(月) 12:11:59.64
>>530
おっおっ ( ^ω^)

MATLAB買う金あるなら、PGIのコンパイラをアメリカからダウンロードで買える気が・・
532デフォルトの名無しさん:2011/05/09(月) 15:51:02.97
>>531

MATLABは海外の大学にいるんだけど工学部全体でまとめ買いしてるからタダなんだわ。
どっちにしろ6000円くらいだよ、アカデミックだと。ツールボックスついてないから無意味だけど。

毎学期技術料で2万くらいとられるけどな!
533デフォルトの名無しさん:2011/05/09(月) 15:58:19.93
>>530
自分にスレだけどMATLABは完全にはAsynchronous I/Oに対応してなかった。。。
もうめんどくさいからC++で書こうかと思う・・・GPU CUDA C++サポートしてるし。
>>529
どちらにしろどうもありがと。
534デフォルトの名無しさん:2011/05/09(月) 21:59:14.34
>>532
アメリカにいるならWindows用のPGI Visual Fortranはただで使えるぞ。CUDAにも対応していたはず。
ttps://www.pgroup.com/purchase/freepvf.php
要件は自分で読んでくれw
535デフォルトの名無しさん:2011/05/10(火) 01:18:41.53
>>534

パソコン一台でしか処理できない点を除けばオールオッケー!
536デフォルトの名無しさん:2011/05/10(火) 01:42:15.10
>>534
注文した!やったね!たえちゃん!
537デフォルトの名無しさん:2011/05/10(火) 02:30:24.18
おっおっ ( ^ω^)<朕に感謝せよwww 
日々、国民の皆様がすこやかに過ごされるよう切に願っておりますおっ!www
538デフォルトの名無しさん:2011/05/10(火) 12:53:33.66
fortran95を使ってます

今open、close文をやっているのですが、入力ファイルの作成方法がどんだけやっても、まったくわからないです

作り方もしくは参考になるサイトを教えてください
539デフォルトの名無しさん:2011/05/10(火) 22:45:52.34
openしたら入力ファイルは作成されます。
540デフォルトの名無しさん:2011/05/16(月) 13:36:38.03
fortran90使ってます

読み込んだファイルの列数を表示したいのですが、
なにかうまい方法はないですか?
541デフォルトの名無しさん:2011/05/16(月) 23:11:42.57
>>540
列の区切り文字はなんだ? というか、数えたい例を1行書いとくれ。
542デフォルトの名無しさん:2011/05/17(火) 13:32:11.97
>>541

区切りはスペースあけてます
例えばこんな感じです

1 1 2 6 5 17 18 22 21
2 2 3 7 6 18 19 23 22
3 3 4 8 7 19 20 24 23
4 5 6 10 9 21 22 26 25

具体的に言うと、この様なテキストを動的割付の2次元配列に入れたいのですが、
その時の列数と行数を知りたいといったところです。
行数はカウントできたのですが、列数の仕方がわからなくて・・・
543デフォルトの名無しさん:2011/05/18(水) 00:21:15.17
>>542
区切り文字が決まっているなら、割と簡単。
program vip
implicit none
character(136) :: text
integer :: i, n
read(9, '(a)') text
n = count( transfer(trim(text), ' ', size = len_trim(text)) == ' ' )
print *, n
end program vip
544デフォルトの名無しさん:2011/05/18(水) 00:42:20.64
コンマとかが区切り記号なら。
n = count( transfer(trim(text), ' ', size = len_trim(text)) == ' ,' )

transferで有限長の文字列を1文字の配列に直して、そして区切り記号の数を数えている。
欲しい数は、区切り記号の数+1個。

しか〜し、区切りが任意個のスペースの場合はめんどい。
545デフォルトの名無しさん:2011/05/18(水) 14:03:39.17
>>543-544
とても参考になりました!
ありがとうございます
546デフォルトの名無しさん:2011/05/19(木) 02:12:10.20
任意個空白区切りの場合(素朴法) & >>543 をやや敷衍した物。
1  1 2 6 5 17 18  22  21 データ例
module vip_m
implicit none
contains
integer function idelim(text)
  character(*), intent(in) :: text
  integer :: i
  idelim = 0
  do i = 1, len_trim(text) - 1
   if (text(i:i) == ' ' .and. text(i+1:i+1) /= ' ') then
 idelim = idelim + 1
 end if
 end do
 return
end function idelim
end module vip_m

program vip
use vip_m
implicit none
integer, parameter :: nmax = 136
character(nmax) :: text
character(1) :: tmp(nmax)
integer :: i, k, n, io

read(9, '(a)') text
tmp = transfer( trim(text), ' ', nmax )
n = count( tmp == ' ' )
print *, n, idelim(text)

end program vip
547デフォルトの名無しさん:2011/05/24(火) 11:52:30.38
モジュール内で定義してある関数を、そのモジュール内のサブルーチンで使う時、
サブルーチンの頭で関数を宣言(real some_func)するとエラーになるようになtった
のですが、これは仕様が変わったのでしょうか?
548デフォルトの名無しさん:2011/05/24(火) 23:16:29.04
>>547
そんな事はない。
実例を上げてみてくれ。
549547:2011/05/25(水) 14:38:13.10
>>548
こんな感じです。「integer :: some_func」をコメントアウトすれば通るのですが。
使う関数名は型宣言するものだと思っていたのですが、勘違いでしょうか。

module some_mod
contains
integer function some_func(var)
integer, intent(in) :: var
some_func = var + 1
return
end function some_func
subroutine some_sub1()
integer :: some_func
integer :: i
do i = 1, 10
write(6,*) i, some_func(i)
end do
end subroutine some_sub1
end module some_mod
program func_test
use some_mod
call some_sub1()
end program func_test
550デフォルトの名無しさん:2011/05/26(木) 03:48:00.92
>>549
勘違いしていた。宣言側ではなく、使用する側での話か。

F77時代っぽい書き方だよな。
F90 では、副プログラムに関しては、INTERFACE BLOCK を書くのが普通になったし、
MODULE にいれておけば、INTERFACE 書かなくていいから、考えたことがなかったw

症状からすると、INTEGER some_func で型宣言すると、EXTERNAL func が暗黙でついてしまうようだが・・・
よほど規格書を詳しく見ないと本来の動作がなんなのか分からん。

こうやって無理やり代替名を与えれば通るようにはなるがw
integer function some_func(var) bind(c, name = 'SOME_FUNC')

MODULE内の副プログラムでは、この手の宣言しないのが一番普通だと思う。 
551547:2011/05/26(木) 14:04:36.99
>>549 返信ありがとうございます。

とりあえずは、こういう宣言はしなくていいという事が分かって良かったです。
F90 の言語仕様をちゃんと勉強しようと思います。
552デフォルトの名無しさん:2011/05/28(土) 22:15:44.96
allocateにラッパを被せたいのだが、Fortran90の仕様では無理?
配列を割り付けて、そのポインタを返し、
返り値statを見て、エラー処理をしたいのだが。
553デフォルトの名無しさん:2011/05/28(土) 23:53:31.44
>>552
できるとおもうぞ。何を心配している?
554デフォルトの名無しさん:2011/05/29(日) 12:13:52.73
Assertion failed: ( (last != 0) || (node == 0)) && (tree[last>>TREE_SHIFT][last&TREE_MASK].next == 0), file err_treelib.c, line 256
とエラーが出てしまいます。
原因わかる人いたら教えてください
555デフォルトの名無しさん:2011/06/12(日) 12:20:40.57
LOGON TSS
ナツカシすなあ
556デフォルトの名無しさん:2011/06/13(月) 03:02:14.80
メムバ、だっけ
ディレクトリにあたるの
557デフォルトの名無しさん:2011/06/13(月) 21:07:17.53
フォートランをダウンロードしたいのですがどうすればいいのですか?
散々ググッたにもかかわらずよくわかりません。><
オススメのサイトがあったら教えてください。
558デフォルトの名無しさん:2011/06/13(月) 23:05:14.85
>>557
g95でも落としとけ。
559557:2011/06/14(火) 00:59:45.55
g95は落としたのですがいざメモ帳にプログラムを書き込み
保存後、コマンドプロンプトで実行するとNo such file or directory
とエラーメッセージが出ます。どうすればいいのでしょうか?
ちなみにg95をタイプした後エンターキーを押すとNo input file
と出るのでフォートランのダウンロードには成功していると思います。
560デフォルトの名無しさん:2011/06/14(火) 12:54:08.54
>>559
とりあえず、思いつくこと。
1.日本語の入ったディレクトリを避ける。
2.メモ帳でセーブするとき、拡張子がtxtにならないように” ”で括るなど注意すること。
3.g95 xxx.F90 のように拡張子も含めたファイル名を与えること。
こんくらい?

しょぼい統合環境でいいなら、フォースを使えルーク。
http://force.lepsch.com/
561557:2011/06/14(火) 18:47:00.65
ありがとうございます。
とりあえずやってみます。
562デフォルトの名無しさん:2011/06/17(金) 13:00:27.23
gfortran がタダだし
仕事場のマシンと自宅の私物Win機で
挙動がまあ同じでOpenMP使えるし
デバッグやチェックがIntelのより
親切だから使ってるけど・・・
g95ってイイの?
563デフォルトの名無しさん:2011/06/18(土) 21:21:06.09
>>562
二つともフォークしたものだから、根本は変わらないのではないかと。
最近の様子は知らんが、g95はOOP機能を入れる方を優先していたが、gfortranはcoarrayとか並列化に熱心だったイメージ。

漏れのあやふやな記憶が正しければ、元々gfortranのオッサンがひとりでコツコツノロノロg77を90以降に拡張していたが、
gccとかとの統合の頃に、いろんな人が参入してスピードアップ。しかし、オッサンは方向性の違いからまた一人でやりたくなって
フォークした。
564デフォルトの名無しさん:2011/06/20(月) 22:58:10.97
ガチ初心者です。

c chouwashindoushi psi v no kaisekikai

c bm:kansanshitsuryou bar:h-bar


implicit real*8(a-h, o-z)

c constants

bm=1.0d0 fk=1.0d0 ome=sqrt(fk/m) bar=1.0d0

と打ち込んで(値は適当ですが)コンパイルしようとしたら
エラーメッセージに
bm=1.0d0 …
     ^
Invalid form for assignment statement at (^)

と出てきました。
何がエラーなのかわかりません!
どう問題なんでしょうか?
565デフォルトの名無しさん:2011/06/20(月) 23:40:14.99
一行一ステートメント 一期一会な
>bm=1.0d0 fk=1.0d0 ome=sqrt(fk/m) bar=1.0d0
bm=1.0d0
fk=1.0d0
ome=sqrt(fk/m)
bar=1.0d0
566デフォルトの名無しさん:2011/06/30(木) 15:34:22.41
564です。
返事が遅れましたが、、、
助かりました!感謝です!
567天使 ◆uL5esZLBSE :2011/07/03(日) 12:30:46.83
>>566
--------------------
[[[[[[[ 返事が遅れましたが、、、 ]]]]]]](きリッッッッ!!!!
----(きリきリッ
----
[[[[[[[[[[[[ 助かりました!感謝です! ]]]]]]]]]]]](きリッ!!キリッッ!キリッッ!!きリ!!!ッッッッ!!!
本当にバカだな
568デフォルトの名無しさん:2011/08/23(火) 17:07:46.74
フォートランをやりはじめたばかりの超初心者です
サブルーチンに引数として渡すものと、
モジュールで渡すものはどういう根拠で区別すればいいんでしょうか?
全部引数で渡すこともできるとは思うのですが、
モジュールも組み合わせた方が良い場合もあるんだろうと思います
最初のうちに正しい渡し方を覚えておきたいので...
569デフォルトの名無しさん:2011/09/07(水) 00:55:33.07
program quadeq

real a,b,c,d,x1,x2,rpart,ipart
read(*,*) a,b,c
d=b**2-4*a*c

if(d.ge.0) then
x1=(-b+sqrt(d))/(2*a)
x2=(-b-sqrt(d))/(2*a)
write(*,*) 'x1=',x1,'x2=',x2
else
rpart=(-b)/(2*a)
ipart=sqrt(-d)/(2*a)
write(*,*) 'real_part = ',rpart,' ',
'imaginary_part = ',ipart
end if
end

コンパイルできないとです;;
原因を教えてください
570デフォルトの名無しさん:2011/09/07(水) 12:23:27.06
Intelのコンパイラ最新版 インストーラでエラーでるんだけど、同じ症状の人いない?
たぶん .net Ver.4 絡みだと思うんだけど、インストールしてもうごかん・・・
英語版と日本語版の違い?
VS2010でEDITORの補助が増えたらしいので興味あるんだが・・
571デフォルトの名無しさん:2011/09/07(水) 12:35:26.37
>>569
>'imaginary_part = ',ipart
この行を前の行び後ろに続けて1行とするか、6カラム目に継続記号を入れればおk。
572デフォルトの名無しさん:2011/09/10(土) 20:25:14.21
>>568
個人的な考えで回答します。
基本的に、引数として渡す方がプログラムが見やすいと思います。
見やすいということが非常に大切です。
モジュールとしてまとめてしまうと、別の場所(そのサブルーチンとは離れた場所)に
宣言が書かれることになるため、変数が何を意味しているのか、そのサブルーチン独自の
変数なのか、などがぱっと見てわかりにくくなる恐れがあります。
特に、大規模なプログラム、サブルーチン毎に一つのファイルに分けているような
場合には、そのように感じます。
ただ、引数として並べたときに数行になってしまうくらいに引数が多い場合には、
モジュールを利用した方がいいかもしれませんが、その場合でも、サブルーチンを
呼び出すごとに変化するような変数は引数として渡した方がいいでしょう。

一方、全プログラムが一つのファイルに収まってしまうくらいに小規模なものは、
サブルーチンを一つのモジュールの中に入れてしまう方がいいでしょう。ただし、
その場合でも、なるべく引数を使って渡す方がいいと思います。

573デフォルトの名無しさん:2011/09/11(日) 02:21:13.88
超絶初心者です。
学校のパソコンでfortran77を使っており、自宅のパソコンでもできるようにコンパイラをダウンロードしようとしたのですが、
Salford FTN77 Personal Edition Compilerをインストールする途中で止まってしまいます。
WinZip Self-Extractor-ftn77pe.exeというウインドウのSetupを押したっきり変化がありません。
エディタは学校でCpadを使っているので自宅のパソコンにもダウンロードしたのですが、コンパイラがうまくダウンロードできているのかもわからず
コンパイラのパスもわからず、どうしたらよいのかわかりません。
いろいろ調べてはみたのですが…
574デフォルトの名無しさん:2011/09/15(木) 10:38:07.44
>>572 大変参考になりました、ありがとうごさいます
575デフォルトの名無しさん:2011/09/15(木) 19:36:21.15
fortran 77使ってますが、C++からfortranの関数を呼び出すコードのコンパイルを試みてます。

f77 -c -o main.o main.f
f77 -c -o sub.o sub.f
g++ -c Jikkou.cxx
g++ main.o sub.o Jikkou.o -lg2c

するとここで、以下のようなエラー吐きます。

main.o: In function `main_':
main.f:(.text+0x12c): undefined reference to `ran_'

main.fの中で、乱数出す為にRAN()を使ってるんですが、g++はこの関数が分からないようです。
どうにかg++にRAN()を分からせる方法はありませんか?
576デフォルトの名無しさん:2011/09/15(木) 22:14:27.19
>>575
おれにはわかRAN(笑) なんつって( ^ω^)
577デフォルトの名無しさん:2011/09/16(金) 02:19:18.16
www

rand() で試すか・・・乱数生成くらい自分でつくれ。
578デフォルトの名無しさん:2011/09/16(金) 02:39:47.42
>>575
CからのFortran呼び出しでは、サブルーチン名の規約が処理系によって異なるのでマニュアルを良く読むしかない。
頭にアンダースコアがついたり、全部大文字になったり、引数のバイト数が尻についたり千差万別。

コレをエレガントに避けるにはFortran2003の、C呼び出し規約互換の命令があるのでそれを使うべし。

ただいまの場合、Fortranのライブラリをリンクしていないだけもするので、まあマニュアル読んで頑張れ。
安直な手としては、Fortran90の乱数ルーチンを呼べば外部ライブラリ絡みの厄介は避けられると思う。
579デフォルトの名無しさん:2011/09/18(日) 15:43:36.04
Intel Fortran Compilerを使っています。
ファイルから数値を読みとり、配列に値を代入したいのですが、NaNが含まれるためか
「forrtl: severe (24): end-of-file during read, unit 12」
というエラーが出て実行できません。うまく読み取らせる方法はないでしょうか。

real(8) a(100), b(100), c(100), d(100)
do i = 1, 100
read(10,*) a(i), b(i), c(i), d(i)
enddo

0.1000E+00 0.1234E+01 0.0000E+00     NaN
0.2000E+00 0.5678E+02 0.0000E+00 0.0000E+00
……
1.0000E+01 0.3456E+04 0.0000E+00     NaN
580デフォルトの名無しさん:2011/09/18(日) 17:40:25.57
文字列として読めばいいんじゃない?
581デフォルトの名無しさん:2011/09/18(日) 17:42:08.70
あるいは書式に'err=行番号'をつけるとか
582デフォルトの名無しさん:2011/09/18(日) 18:58:07.35
>>580
文字列として読み込めばできました。
ありがとうございました。
583デフォルトの名無しさん:2011/09/22(木) 23:50:22.17
>>579は本当にそれで解決できたのか?
読み込んだ数値をどう使うのか知らないけど、自分には、
なんで文字列として読み込んで満足できるのかワカラン
584デフォルトの名無しさん:2011/09/23(金) 07:22:58.89
>>579, 582さん
エラーの内容は、基番12のファイルの最後以降を読み込もうとした、
ということ。基番10の'NaN'の読み込みのことではありません。
別の原因、別の場所でエラーが発生していると思います。

本当に解決したの?  583さんと同意見です。
585デフォルトの名無しさん:2011/10/14(金) 15:08:01.82
4次元配列を2次元に配列にまとめたいのですが、
The shapes of the array expressions do not conform.と出てコンパイルできません
なにかうまい方法ってありませんか?

具体的には
do i = 1, 10
do j = 1, 10
do k = 1, 100
do l = 1, 100
y(i,j) = y(i,j) + x(k,l,i,j)
enddo
enddo
enddo
enddo

といった計算を行いたいのですが・・・
586デフォルトの名無しさん:2011/10/14(金) 19:32:03.42
「4次元配列を2次元に配列にまとめたい」っていう目的と
実際に提示されているコードが自分には結びついていないけど、
配列変数の定義で配列の次元やサイズはちゃんと書いた?
real(8) :: x(100, 100, 10, 10)
real(8) :: y(10, 10)
みたいな記述が必要だと思うけど。
587デフォルトの名無しさん:2011/10/14(金) 22:21:27.51
>>586
配列の定義はしてあります

x(k,l,1,1)のkとlの合計10000個の数をy(1,1)に足しこんで
次はx(k,l,1,2)のkとlの合計10000個の数をy(1,2)に足しこんで

といった具合にプログラムを書きたいです
説明下手ですいません
588デフォルトの名無しさん:2011/10/15(土) 11:16:16.24
>>585 で何が不満なんだ。

f95バリバリならこうか?FORALLはうんこ機能と言われているがw
program Console1
implicit none
! Variables
real :: y(10, 10), x(100, 100, 10, 10)
integer :: i, j
! Body of Console1
y = 0.0
x = 1.0
forall (i = 1:10, j = 1:10) y(i, j) = y(i, j) + sum( x(:, :, i, j) )
print *, y(1, 1)
stop
end program Console1
589デフォルトの名無しさん:2011/10/15(土) 11:53:28.33
forall ってウンコというか
使い間違いし易いのよね。
最初の4重doループグリグリでいいと思うけどね。
コンパイラが勝手に最適化してくれるだろうし。
590デフォルトの名無しさん:2011/10/15(土) 14:31:44.29
PGI Visual Fortran 11.9 のコマンドラインでのコンパイルについて質問です。

以下のようなソースコード goodbye.f90 を作りました


program goodbye
write(*,*) 'Good-bye'
stop
end program goodbye



これを C:\tmp\に保存して


c:\tmp>pgf90 goodbye.f90


と打ったのですが,カーソルが次の行に行って点滅するだけで,
コンパイルはされませんでした。
何がまずかったのでしょうか?
591デフォルトの名無しさん:2011/10/15(土) 20:06:47.41
>>590
それだけでは分からんw
まぁ、end program goodbye の後ろで改行しないまま、end of file に成っている可能性があるかな。
592590:2011/10/15(土) 20:33:05.02
>>591
レスありがとうございます。
改行はしてありました。

なお,コンパイルを Ctrl + C で強制終了すると,

cleaning up after signal(2)

というメッセージが表示されます。これについても意味が分からないです。
593デフォルトの名無しさん:2011/10/15(土) 21:33:14.03
>>592
それは強制終了の事後処理というメッセージだろう。

症状としては、end of file が見つからない感じだから、ctrl−Zないしctrl−Dあたりをうってみたらどうかな?
594590:2011/10/23(日) 09:32:01.77
>>592
報告が遅れすみません。
再々インストールを行ったら,治りました。
ソフテックに訊いたら,ウイルス対策ソフトがブロックしていたらしいです。
595デフォルトの名無しさん:2011/10/23(日) 11:15:17.50
>>594
そういえば一時期ノートン先生がIntelVisualFortranの実行ファイルを削除しまくって閉口したことがあったわ。
596こうちゃん:2011/10/24(月) 15:56:38.58
http://mixi.jp/view_bbs.pl?id=65775704&comment_count=0&comm_id=88243
mixiしてる方に質問させていただきます。
この拡散方程式を種々の初期条件、境界条件のもとに解くことによって、
横軸:時間、縦軸:ペイント全体の濃度合計
→ペイント全体の濃度の合計の時間変化を
fortranにてプログラム化できますでしょうか。。。
597デフォルトの名無しさん:2011/10/25(火) 13:20:38.16
>>596
具体的にとこで困ってるんですか?
離散化とか、境界条件の設定とか、具体的に言ってください。

あとインプリシット、エクスプリシットどちらで解くつもりですか?
598こうちゃん:2011/10/25(火) 14:38:30.82
>>597さん
拡散方程式(2階偏微分方程式)の離散化は自分で行えます。
その拡散方程式を種々の初期条件、境界条件で解くプログラム
が作りたいのです。
私がわからないのは、拡散方程式や種々の条件をfortranにて示す方法が
まったくわかりません。。。
周りに相談できる方がいないので本当に困っています↓↓
この問題は、「ある気体を透過しない母体に、気体透過性のペイント
を貼った場合、その透過性のペイントの表面の気体濃度を正弦的に変化
させた場合、ペイント内部ではどのように気体濃度が変化していくか
ということを見るためのプログラム」作りたいのです。
言い換えるならば、縦軸:ある時間におけるペイント全体の濃度の合計
横軸:0<=t<=tm(tm→とりうる時間の最大値)
を作りたいのです。
599デフォルトの名無しさん:2011/10/25(火) 21:45:10.83
>>597

とは違うけど、インプリシット(陰解法、連立方程式を反復的に解く)
とエクスプリシット(陽解法、中心差分のように、漸化式を反復的に繰り
返して解く?だったっけ。もう、忘れた)の意味わかってます?

プログラムを作成する前段階のアルゴリズムの定式化は本当にできて
いるんですか?

定式化ができた上で、fortaranでの表現法がわからないというのなら
fortranの勉強をするべきだと思うけど。

もうMATLABを使ったらと思うけど、取り組んでる問題をみるとMATLAB
ではヘタすると数日、計算がかかるかもしれませんね。
600デフォルトの名無しさん:2011/10/26(水) 01:11:16.64
離散化ができているなら、流動方程式を解くプログラムに、拡散項を組み込むだけですから、そんなに難しくないと思います

流動方程式のプログラムなら適当な参考書にあると思います...
601デフォルトの名無しさん:2011/10/26(水) 01:23:50.06
あと、境界条件が不安のようですけど、ディリクレ境界条件のようですから、ポイントセントラルでプログラムを組めば少しらくだと思います
602名無しのごんべ:2011/10/26(水) 13:42:02.36
const int N = 100;
const double q = 10.0, dt = 0.00001, Dm = 30.0, t0 = 2.0, K = 1.0, pi = 3.141592, f = 3.0;
double C[N], dC[N];
double dx = q/N;
for (int i = 0; i < N; ++i) C[i] = 0; // 初期条件
for (double t = 0; t < t0; t += dt) {
 C[0] = 0; // 境界条件1
 C[N - 1] = K*sin(2*pi*f*t); // 境界条件2
 for (int i = 1; i < N - 1; ++i) dC[i] = (Dm*(C[i + 1] - 2*C[i] + C[i - 1])/(dx*dx))*dt;
 for (int i = 1; i < N - 1; ++i) C[i] += dC[i];
}
for (int i = 0; i < N; ++i) cout << C[i] << endl; // t = t0
を誰かfortranに変換できる人いますか?
603こうちゃん:2011/10/26(水) 13:48:33.22
返信ありがとうございます。
1ふぉrtr
604こうちゃん:2011/10/26(水) 13:58:15.26
返信ありがとうございます。
fortran始めたばかりなので正直知識不足は否めないです。
おそらくエクスプリシットだと思います。

アルゴリズムの定式化についてはまだ研究初期段階なので今後
修正する可能性はあります。
修正に応じてプログラムの方も修正する予定なのですが、
まずベースとなるプログラムが欲しくて、
このような投稿になってしまいました。
不快でなければ協力のほうをよろしく
お願いいたします。
605デフォルトの名無しさん:2011/10/26(水) 22:52:54.29
606デフォルトの名無しさん:2011/10/26(水) 22:57:26.57
program vip
implicit none
integer, parameter :: n = 100
real(kind = 8), parameter :: q = 10.0d0, dt = 0.00001d0, dm = 30.0d0, t0 = 2.0d0, k = 1.0d0, f = 3.0d0
real(kind = 8), parameter :: pi = 4.0d0 * atan(1.0d0)
real(kind = 8) :: c(n), dc(n), t, dx
integer :: i
dx = q / n
c = 0.0d0
t = 0.0d0
do
if (t > t0) exit
c(1) = 0.0d0
c(n) = k * sin(2.0d0 * pi * f * t)
forall (i = 2:n - 1) dc(i) = dt * dm * ( c(i + 1) - 2 * c(i) + c(i - 1) ) / dx**2
c = c + dc
t = t + dt
end do
write(*, *) c
stop
end program vip
正しいかどうかは知らんw
607名無しの:2011/10/27(木) 13:30:21.02
デフォルトの名無しさんへ
ありがとうございます!!!もとになるベースがないので本当に
困っていました↓↓
返信大変うれしいです!!!
608デフォルトの名無しさん:2011/10/27(木) 16:47:39.60
>>604,607
二度と書き込むなよ、このクズ野郎
609デフォルトの名無しさん:2011/10/27(木) 17:21:38.36
どこのスレも変なのがうろついてんな
610デフォルトの名無しさん:2011/10/27(木) 18:21:51.17
困っちゃん
611デフォルトの名無しさん:2011/10/27(木) 23:34:13.99
枯れ木も山のにぎわいってことでw
612デフォルトの名無しさん:2011/10/28(金) 22:27:40.95
>>608

お前の方が余程クズで二度と書きこむなよ、と思うけど。







あと、死ね
613デフォルトの名無しさん:2011/11/08(火) 00:40:01.34
http://qanda.rakuten.ne.jp/qa7112807.htmlにある質問なのですが
これをFORTRANでできる方はいらっしゃいますか?

あとこのプログラミングをC++でやってみたところ
const int N = 100;
const double q = 10.0, dt = 0.00001, Dm = 30.0, t0 = 2.0,
K = 1.0, pi = 3.141592, f = 3.0;
double C[N], dC[N];
double dx = q/N;
for (int i = 0; i < N; ++i) C[i] = 0; // 初期条件
for (double t = 0; t < t0; t += dt) {
 C[0] = C[1]; // 境界条件1
 C[N - 1] = K*sin(2*pi*f*t); // 境界条件2
 for (int i = 1; i < N - 1; ++i) dC[i] = (Dm*(C[i + 1] - 2*C[i] + C[i - 1])/(dx*dx))*dt;
 for (int i = 1; i < N - 1; ++i) C[i] += dC[i];
double s = 0;
double s_prev;
for (int i = 1; i < N - 1; ++i) s += C[i]*dx;
if (t) {
 double ss = (s - s_prev)/dt;
 cout << ss << endl; // ∂s/∂t を出力
s_prev = s;
}
といちおやってみたのですが、間違いを指摘できる方はいますか?
あとできればこのプログラムをFORTRANに変換もしていただきたいです。。。
重複と長文同時に失礼いたしました。
図はhttp://qanda.rakuten.ne.jp/qa7112807.htmlにあります
全開質問に答えていただいた方、本当にありがとうございました。
614デフォルトの名無しさん:2011/11/08(火) 01:36:34.98
c++ はよくしらんが、} が複数個欠けてるような。
エディタはたいてい対になる(){}[] を色で表示してくれるので、それを助けに頑張れ。

Courant 条件は・・
(1/2) (dx*dx) / Dm= 0.5 *(0.1)^2 / 30.0 > dt
なので、よさげ。{}対をチェックしたら、ちゃんと走ると思うよ。
615デフォルトの名無しさん:2011/11/08(火) 02:33:21.56
>>613
Fortran95への移植。内容は見ていないw Sinカーブのように振動しているから、まぁこんなもんではないか?
program vip
implicit none
! Variables
integer, parameter :: n = 100
real(8), parameter :: q = 10.0d0, dt = 0.00001d0, dm = 30.0d0, t0 = 2.0d0, &
k = 1.0d0 , pi = 4.0d0 * atan(1.0d0), f = 3.0d0
real(8) :: c(n), dc(n)
real(8) :: dx, t, s, s_prev
integer :: i
! Body of Console3
dx = q / n
c = 0.0d0
t = 0.0d0
s_prev = 0.0d0
do while( t < t0 )
c(1) = c(2)
c(n) = k * sin(2.0d0 * pi * f * t)
forall(i = 2:n - 1) dc(i) = (dm * (c(i + 1) - 2 * c(i) + c(i - 1)) / dx**2) * dt
c = c + dc
s = sum(c) * dx
write(9,*), 't=', t, (s - s_prev) / dt
s_prev = s
t = t + dt
end do
end program vip
616デフォルトの名無しさん:2011/11/08(火) 03:05:16.60
>>615 のバファリンのようなやさしさに感動した
617デフォルトの名無しさん:2011/11/08(火) 03:36:37.44
>>615の人に質問
DO文ではなくFORALL文を使った理由は何ですか?
618デフォルトの名無しさん:2011/11/08(火) 09:49:56.87
>>617
1行で書けるから。
619デフォルトの名無しさん:2011/11/08(火) 16:58:07.44
f90とf95ってまったくコードの違うものなのですか?
620デフォルトの名無しさん:2011/11/08(火) 19:28:23.09
>>619
f95 は f90 の小改訂版。Fortran は f90 以降、メジャーウップデートと
マイナーウップデートを交互にやることになってる。f95 は f90 を使ってみて
いや〜んな点を、かゆいとこに手が届くように修正してある。

あと変なの湧くからsageろよ。
621デフォルトの名無しさん:2011/11/08(火) 23:12:35.84
>>620
交互にマイナーとメジャーのアップデートとのことですが、
それなら、今のJIS規格であるFortran2003はメジャーアップデート
みないなものなのでしょうか。
622デフォルトの名無しさん:2011/11/09(水) 00:48:56.02
>>621
F2003はメジャーアップデートどえす。
目玉はオブジェクト指向の要素の導入ですが、その他色々便利な改良もあります。
でもあまりに欲張り過ぎて、まだ完全装備のコンパイラが殆ど無いという事実w

ちなみにF2008はマイナーアップデートのはずなのに、coarrayのような並列化命令が入った規格が確定した。
623デフォルトの名無しさん:2011/11/09(水) 01:31:06.92
coarray よさげだよね。
でも完全装備は先かな・・・intel はやる気あるみたいだけど。
>>615
ほどんど重箱隅レベルだけど、個人的には
c(:) = c(:) + dc(:)
s = sum(c(:)) * dx
と配列であることを明示したい。・・・ドツボ防止策。
624デフォルトの名無しさん:2011/11/09(水) 02:21:30.12
intel は coarray 結構実装してきてるんじゃない? サンプル以外試してないから詳細は分からんが。

c(:)の配列明示は理念としては理解できるし、f77から移行してきたばかりの昔はやっていたのだが、
f90初期の頃、処理系によってはコロン指定子がつくと無条件にコピーを作って作業して戻すという事をするので、
最適化の観点からなんとなく避けるようになってしまった。最近の処理系はそういうことはしなくなったようだが・・・

サブルーチンの引数でも、生で書くとそのまま渡すが、コロンがつくとcopy in / copy out になって最適化が落ちるとか、
c(0:n) の場合、生で渡すとサブルーチン側でも配列は0から始まるが、コロンがつくとコピーが渡るので1から始まるとか、
その辺の規則がよく分からなっかったので、なんとなく惰性で配列明示しないで生で行ってるw
625デフォルトの名無しさん:2011/11/09(水) 09:07:31.97
>>624
ためになった。

ついでに質問。coarray って分散メモリのシステムでもOKなのかな?
MPI とどちらがいいのかなとか、知ってたら書いて。
626デフォルトの名無しさん:2011/11/09(水) 09:52:45.36
>>625
coarray は分散メモリーシステム用だな。
MPIより簡単で同等の性能が出るという主張をしている感じ。
分散メモリーマシン時代になってからのクレイが熱心にやっていて、それが規格に導入された?
627デフォルトの名無しさん:2011/11/09(水) 10:02:29.00
うん
628デフォルトの名無しさん:2011/11/09(水) 13:18:34.43
>615さん
ではf90に書き直すとそう変わるのですか??
629デフォルトの名無しさん:2011/11/09(水) 13:34:19.14
ほぼ>>615に等価だと思う。
630デフォルトの名無しさん:2011/11/09(水) 21:34:09.30
>>626
coarrayて分散メモリー用なの?
http://www.xlsoft.com/jp/products/intel//compilers/fcl/12/comp-for-lin/comp/tutorial/tutorial-4/co_t4b.htm#co_t4b
のサンプルを見ると、OpenMP拡張とは混在できないとか書いてあるので、
てっきり、SMP用かと思っていた。

631デフォルトの名無しさん:2011/11/10(木) 04:41:06.41
なんか前に
ノード内の共有メモリ空間でも OpenMP で書くより
ノード間も含めてもう全部 MPI でやり取りした方が、
速い(+楽!)という意見があったような。

なんだろう、共存が面倒な割にはパフォーマンスがあんまりなので
もうしない、という事なんだろうか?
632デフォルトの名無しさん:2011/11/10(木) 09:40:57.33
>>630
coarrayでググるとCrayのパワポとか出てくるから味噌。
現今のcoarrayは結局MPI上に実装されているので、MPI利用した簡便並列という感じ。
633デフォルトの名無しさん:2011/11/10(木) 14:32:48.86
単純な仕事の分割の場合、MPI で書いた並列プログラムは
ループの前後に冗長に似た行が続くだけだから、その部分の追加を
ちゃっちゃとやってくれるのなら、うれしいね。
634デフォルトの名無しさん:2011/11/12(土) 09:53:04.14
Open/MPはスレッド並列だが、MPIやCo-arrayはプロセス並列になってる。
635デフォルトの名無しさん:2011/11/15(火) 02:01:49.79
gfortran, バージョン4:4.4.5-1 に関する質問です。

モジュールのバージョンが違うとかで下記のエラーメッセージが出てきます。
Fatal Error: Parse error when checking module version for file 'functions.mod'

これってどう解決すればいいですか?
636デフォルトの名無しさん:2011/11/15(火) 09:38:55.28
コンパイルしなおせ
637デフォルトの名無しさん:2011/11/15(火) 11:43:56.21
>>636
え?コンパイルしようとするとこのエラーが出るんですけど

gfortran hogehoge.f90
ってな具合です
638デフォルトの名無しさん:2011/11/15(火) 13:26:47.01
functions.mod というのは、module functions がコンパイルされたときに生成されるインターフェース情報のファイルで
これのversion が違うというのだから、これをもう一回コンパイルするべきじゃないかと思う。
最近gfortranをversion upしていたりするならよくある事。

そうでないならば、情報が足りなすぎてなんとも言えない。
639デフォルトの名無しさん:2011/11/15(火) 15:05:06.19
>>638
あ、そのとおりです。
しかもフォートランを最近うぷしました。

これってuse mod名をメインプログラムに書き込む前に、一度コンパイルしてmodファイルを作成しなくてはいけないということですよね?
640デフォルトの名無しさん:2011/11/15(火) 15:30:47.59
>>635
Debianスレでも聞いてるじゃねーか
641デフォルトの名無しさん:2011/11/15(火) 16:06:52.35
>>640
え?聞いてないよ。
今確認したらコピペされててビビった。
信じて
642デフォルトの名無しさん:2011/11/15(火) 18:34:27.25
関連するファイルを全部コンパイルしなおせ。
643デフォルトの名無しさん:2011/11/15(火) 23:07:26.77
たかだか1行の英文エラーメッセージ。単語11個くらい字引で引けや!インテリの端くれだろw
ピカチュウの鳴き声を解釈するより易しいだろ。
それで解決したのか?
644デフォルトの名無しさん:2011/11/16(水) 00:08:20.43
>>643
解決致しました。アニキ

一度プログラム中のuse (mod名) 部をコメントアウトし、コンパイルすることでモジュールファイルを生成。
その後コメントアウトした部分を復活させて、再度コンパイルしたら無事できました
645デフォルトの名無しさん:2011/11/16(水) 00:09:24.94
>>643
それにしてもググってもこれと同じ症例があまりなかったのに驚いた。
みんなどうしてるのかな〜
646デフォルトの名無しさん:2011/11/16(水) 01:52:49.26
module functions も、引用する program と一緒のファイルに入れてるのか?
それなら、program の前に来るようにして先にコンパイルされるようにすれば問題ないと思うぞ。
gfortran使ってないから分からんが常識的にはそれでおk。

それが駄目なら、ファイルを別々にして分割コンパイルすればよろし。
647デフォルトの名無しさん:2011/11/16(水) 02:29:33.32
>>646
アニキありがとうっす!
それやってみます。
648デフォルトの名無しさん:2011/11/17(木) 01:36:56.07
アニキとサブとファンクチオン
649デフォルトの名無しさん:2011/11/17(木) 01:50:11.34
program moho
implicit none
logical:: asshappy
logical external:: playresult
asshappy=.false.
call meet_my_aniki()
do while (.NE. asshappy)
asshappy=playresult()
enddo
end program moho
650デフォルトの名無しさん:2011/11/17(木) 11:17:01.88
REAL GAY
COMMON //ASS, HOLE
IF ( ANIKI .AND. SUB ) GOTO 69
69 CONTINUE
END
651デフォルトの名無しさん:2011/11/17(木) 13:29:32.36
>>649
(.NOT. asshappy)
>>650
リアルホモw
でもその文だとなにも変化がないような気がする。
652デフォルトの名無しさん:2011/11/17(木) 13:36:30.70
今だにGOTO文使ってるとかおっさんかよw
653デフォルトの名無しさん:2011/11/17(木) 15:18:34.17
\   / .::::::::::::::::::::::::;;:;;::,ッ、::::::   )  く   ホ  す
  \ l  ,ッィrj,rf'"'"'"    lミ::::::: く   れ  モ  ま
     Y           ,!ミ::::::: ヽ  な  以  な
`ヽ、  |           くミ:::::::: ノ   い  外  い
     |、__  ャー--_ニゞ `i::::,rく   か  は
``''ー- ゝ、'l   ゙̄´彑,ヾ   }::;! ,ヘ.)  !  帰
      ゙ソ   """"´`     〉 L_      っ
      /          i  ,  /|    て    r
≡=- 〈´ ,,.._        i  't-'゙ | ,へ     ,r┘
,、yx=''" `ー{゙ _, -、    ;  l   レ'  ヽr、⌒ヽ'
        ゙、`--─゙      /!         `、
  _,,、-     ゙、 ー''    / ;           `、
-''"_,,、-''"    ゙、    /;;' ,'  /         、\
-''"    /   `ー─''ぐ;;;;' ,'  ノ      
   //    /     ヾ_、=ニ゙
654デフォルトの名無しさん:2011/11/17(木) 15:46:29.13
まさかfortranスレでこのAAを見ることがあるとは
655デフォルトの名無しさん:2011/11/18(金) 19:28:32.69
GO TO文に怯えるとは、まだまだ坊やだな。
後藤おじさんが手ほどきしてあげよう。
まず全裸になれ。
656デフォルトの名無しさん:2011/11/19(土) 12:34:10.85
なりました。
つっ次はどうすればいいのでしょうか?
657デフォルトの名無しさん:2011/11/19(土) 17:28:08.28
>>656
次はションベンだ!
program o2chan

implicit none
character(10) :: siri

call sub( siri )
print *, siri
stop

contains

subroutine sub( anal )
character :: anal(*)
anal(1:10) = transfer('しょんべん', 'a', 10)
end subroutine sub

end program o2chan
658デフォルトの名無しさん:2011/11/20(日) 02:00:27.66
       ∧∧
       (д`* )
       (⊃⌒*⌒⊂)  anal(*)
        /__ノωヽ__)
659デフォルトの名無しさん:2011/11/27(日) 18:28:07.12
みなさま、はじめまして。
趣味でとある連続計算をしています。
いままで、連立一次を解くサブルーチンをつかっていたのですが、
わけあって逆行列単体でシンプルなサブルーチンが必要となりました。
ネット上にN×Nの非対称行列を逆行列にして返してくれるサブルーチンってありますでしょうか?
ご存知なら教えてくださいませ。

660デフォルトの名無しさん:2011/11/27(日) 18:49:52.55
LAPACK?
661デフォルトの名無しさん:2011/11/27(日) 19:27:54.23
>>659
逆行列は、Ax=bのbに(0010..0)のたぐいの単位ベクトルをn本入れて計算するのが基本だぞ。
LU分解のサブルーチンでやればn回繰り返すのも楽勝だ。
662デフォルトの名無しさん:2011/11/27(日) 22:21:47.18
>>660
ぐぐってみました。
ソースがHTMMLでUPされてないと、見る気になりませんでした。
すみません。

fortran 逆行列
でぐぐって一番上にでてきたサイト(とある大学の先生のページ)の
「逆行列を求めるサブルーチン」
を実行したんですが、配列異常のエラーが出ました。
663デフォルトの名無しさん:2011/11/27(日) 23:04:56.69
連立一次を解くプログラムがあれば、それで逆行列くらい求まるだろ。
それが逆行列を求める定石だぞ。
単位行列のを、1列ごとに連立一次を解いて、それを行列の列が尽きるまで繰り返す。
出てきた答えを、列ベクトルとして並べたものが逆行列だ。

ネットで探して見つからないのは、そうやって計算するから、一次方程式のサブルーチンがあれば十分だからだ。
あるとしても、単に1次方程式を解くルーチンを呼び出すルーチンになってるだけ。

特にLU分解で連立一次方程式を解いてあると、毎回一から解くのではなく、前回の途中経過が利用できるので早く済む。
計算量はN^3に比例するので大きい時はLU分解使わないのは非常識。
問題が小さければ、好きな方式でやっておk。計算法にこだわるほうが非常識。
664デフォルトの名無しさん:2011/11/28(月) 05:47:09.06
くりゅろふ法自作試みて結局投げだして
ガウス消去に逃げた事があるw

逆行列計算は奥深いよね。
いまでも計算科学ではメインのテーマの一つ。

で、やっぱりLapack とか MKL とか、かな
665デフォルトの名無しさん:2011/11/28(月) 23:09:42.87
LU分解とか一列ごとに解くとか言ってるけど、直接法ならまとめて解けばいいと思うよ。AX=BのBを単位行列にすれば良いだけの話。
666デフォルトの名無しさん:2011/11/30(水) 20:59:03.41


inplicitrial*8
とかまだやってるやついるの?
667デフォルトの名無しさん:2011/11/30(水) 23:34:15.98
綴り間違えすぎw それに implicit real*8(a-h,o-z)  だろw
耄碌しすぎだぞ爺さん。

今のヤングは implicit none で A'GoGo!!
668デフォルトの名無しさん:2011/12/01(木) 04:38:02.29
さらにヤングwだと
コンパイルオプションで暗黙の型宣言は消去!
669デフォルトの名無しさん:2011/12/01(木) 21:48:44.74

ttp://ksirius.kj.yamagata-u.ac.jp/~shibata/kbg/invmx.f
このプログラムを参考にしています
implicit real*8(a-h,o-z)
double plicision
で書きなおしたら、しっかり計算されません。
どうしましょ
670デフォルトの名無しさん:2011/12/01(木) 23:52:39.47
>>669
全く見ていないがw よくあることなので推測で書くwww
常数のたぐいは手で1.0から1.0d0のように倍精度に直していないからだろう。
特に収束判定に絡んでくると、単精度のままだとゴミビットが入って精度が腐る。
671デフォルトの名無しさん:2011/12/02(金) 00:01:11.84
その前にスペルミスを突っ込みたい。
コンパイルはできたんか?
672デフォルトの名無しさん:2011/12/02(金) 01:19:07.07
すみません1.0d0と1.0_8はなにか違いますか
673デフォルトの名無しさん:2011/12/02(金) 07:51:24.55
>>672
kind種はベンダー依存なので、今の機種でkind=8が倍精度を意味しているからといって
他の機種でそうなるとは限らない。
ただ世間の慣例としてバイト数を置いていることが多いので、大抵は同じ意味。

もっとも上品にはKIND種をパラメータ変数にしておく。日本NAGの書き方推奨ページに行くとグダグダ書いてある。
674デフォルトの名無しさん:2011/12/04(日) 03:41:53.09
オークションシミュレーションのプログラムを作りたいのですが、シミュレーション作成ならfortranだと聞きここにたどり着きました

しかし、一体何から始めればいいのかもわかりません
なにかアドバイスをしていただけませんか?

一応C言語なら基本は理解しています
675デフォルトの名無しさん:2011/12/04(日) 11:16:32.16
www
Fortran にできて C にできないことは少ないので、
C で頑張る、でいいのでは? Fortran は・・・
古い分、蓄積(タダのライブラリとかが豊富)な点
出来ることが少ない分、コンパイラが最適化しやすい事もあるw
教官がそれしか知らんw
・・・あたりがが学術計算によく使われる理由なのではないだろうか。
お好きな言語でどうぞ。
676デフォルトの名無しさん:2011/12/04(日) 12:44:25.90
周りに聞ける人がいないなら、ユーザの多い言語がいいよ。
結構な計算するならc++で、簡単な計算ならpythonで良いと思われる。
677デフォルトの名無しさん:2011/12/04(日) 13:22:39.02
>>674
内容の理解の方にエネルギーを割いて、プログラムはすでに知ってる言語で書いたほうが良い。


といいつつ・・・w
Fortran95以降プログラム書くのがスゲー楽でかつコードが拍子抜けするくらい短くなる。ピタリとはまる感じと言うか。
昔のプログラムを書きなおしたりすると、1ブロックが1行とかになるので構造がすっきりする。数式そのままで済む感じ。
前は77でも十分だよと思っていたが、言語の進化は大事なんだなと分かったw

コンパイラの最適化も進化している。Intelの最新版使うだけですげー早くなる。
INTENTやPUREその他の宣言をきっちりしておくと意外に最適化に効く。
商用コンパイラ市場が未だに生きているのも分からなくない。

最近アメリカとかでC++に走っていた学術ソフトのFortranへの回帰が始まっているらしいが分かる気がする。
配列操作が多い場合はFortranしか無いわ。マクロや動的呼び出しだと最適化が効きにくいし。
678デフォルトの名無しさん:2011/12/08(木) 21:55:06.99
FORTRAN95で台形公式のプログラムをつくって、コンパイルは出来たのですが実行エラーがでます。
かなり初心者です。どこがおかしいか見ていただけないでしょうか。

program main
implicit none
real(8) :: a,b,s,pi
integer:: n,t
pi=4.0d0*atan(1.0d0)
write(*,'(a10,a20)') 't','daikei'
n=100
do t=0, INT(pi), INT(pi/4.0D0)
a=t b=t+pi
call daikei(a,b,n,s)
write(*,'(I10,F20.10)') t,s
end do
end program main
subroutine daikei(a,b,n,s)
implicit none
real(8):: a,b,s,h,f
integer ::n,i
h=(b-a)/n s=0.0
do i=0,n-1
s=s+(f(a+i*h)+f(a+(i+1)*h))
end do
s=s*h/2
end subroutine daikei
function f(x)
implicit none
real(8) x,f
f=(cos(x/4.0d0))**2
end function f
679デフォルトの名無しさん:2011/12/09(金) 00:08:11.74
program main
implicit none
real(8) :: a, b, s, t, pi
integer :: n, i
pi = 4.0d0 * atan(1.0d0)
write(*,'(a10,a20)') 't','daikei'
n = 100
do i = 0, 4 !INT(pi), INT(pi/4.0D0)
t = pi / 4.0d0 * i
a = t
b = t + pi
call daikei(a, b, n, s)
write(*,'(2F20.10)') t, s
end do
end program main
subroutine daikei(a,b,n,s)
implicit none
real(8) :: a,b,s,h,f
integer :: n,i
h = (b - a) / n
s = 0.0
do i = 0, n - 1
s = s + ( f(a + i * h) + f(a + (i + 1) * h) )
end do
s = s * h / 2
end subroutine daikei
function f(x)
implicit none
real(8) :: x, f
f = ( cos(x / 4.0d0) )**2 ! (cos(x/2) + 1.0d0) / 2
end function f
680デフォルトの名無しさん:2011/12/09(金) 00:14:23.03
DO LOOP の所がおかしい。積分の開始を0,π/4 ,π/2,3π/4,πと変えたいとみなした。
DO LOOP変数を i にして、積分の開始座標を t =π/4 * i とした。

貼ってあったのは、全角文字のスペースが入っている上に、改行が狂っている所がある。
それ以外はまぁ間違いは無いとおもう。

台形公式は今の形では同じ座標について2回計算しているので無駄。
数学的には正しいが、普通はこうは書かない。

直し忘れたが、 s = 0.0d0 にしておく必要もある。
681デフォルトの名無しさん:2011/12/09(金) 23:14:31.80
小数点以下の数字の量を増やすと関わった覚えのない数字が出てきます
1.0000000038
こんな感じに出力されます
どうすれば改善できますか?
682デフォルトの名無しさん:2011/12/10(土) 00:22:53.11
>>681
それは単精度なら、本来有効桁が7〜8しかないから。
無理に桁数多く書かせることはできるが、それには意味がない。

どうしても意味ある数字を出したければ倍精度にすれば、14〜15桁有効桁でおk。
683デフォルトの名無しさん:2011/12/10(土) 13:53:49.16
a=1.0
write(*,*) a
a=1.0d0
write(*,*) a

で微妙に違う値が出る時があるよね。
684デフォルトの名無しさん:2011/12/10(土) 14:59:00.93
IBMの16進浮動小数の時代を思いだすんだ。
685デフォルトの名無しさん:2011/12/18(日) 01:18:57.88
>>683
なんで?このテーマで卒論書けるかな?!
686デフォルトの名無しさん:2011/12/18(日) 10:42:25.00
「浮動小数点のCPU内部でのとりまわしの現状について」
・・・まじめにやれば、ハード・ソフトそれぞれで
いろいろする事・知っておかないといけない事があるから、卒論ならいいんじゃない?
学科にもよるけど、文献調査+基礎的な試行錯誤を一人でできる事、ができれば
大学院に行く前の基礎技術習得なり就職前に大学で経験しておくべき経験としての
卒論なら万々歳。

博士課程まで行くつもりで学振を年頭に修士一年目に論文出したい子が
学部4年から論文になりそうな事をせっかちに始める人が多いけど、
業界の基本・基礎的な部分にじっくり思考や文献調査に時間かけたことが無い子が多い。
よくない。
687デフォルトの名無しさん:2011/12/18(日) 15:16:23.25
>>685
単精度と倍精度の差でしょ?
何をテーマに研究するの?
688デフォルトの名無しさん:2011/12/19(月) 23:18:59.58
ウィキペディアに乗ってそうだな
689デフォルトの名無しさん:2011/12/25(日) 15:57:41.78
数値フォーマットはめんどい。

今は IEEE754 で統一されたから見えにくいが、Fortran90にやたらと精度絡みの関数が入っているのも、
かつて数値フォーマットが機種依存で千差万別だった頃(66,77時代)に数値フォーマット問題で散々苦労したから。
66,77 の頃広く使われた数値フォーマットの必要な情報を得るための MACHAR というサブルーチンは、今でも
LAPACK、Numerical Recipes、IMSL とかあちこちに残っている。
それで求めていた値を Fortran90 では組み込み関数で取れるようになった。


Kahanの数値フォーマット策定思い出話論文を読んで、もうちょっと調べて
http://www.dr-chuck.com/dr-chuck/papers/columns/r3114.pdf
変な例としてこの辺をまとめれば卒論くらいにはなるのでは。
http://software.intel.com/en-us/forums/showpost.php?p=12904
http://software.intel.com/en-us/forums/showpost.php?p=12907
http://software.intel.com/en-us/forums/showpost.php?p=12908
http://software.intel.com/en-us/forums/showpost.php?p=12911
記憶がはっきりしないが、同じような話題が数年前にスクリプト言語方面で話題になっていた気がするし。

非正規数とアンダーフローの問題も数年前に話題になったので、まとめにいいかも。
690デフォルトの名無しさん:2011/12/25(日) 16:02:46.56
>Kahanの数値フォーマット策定思い出話や論文を読んで、もうちょっと調べて
                         〜〜
Kahanのサイト
http://www.cs.berkeley.edu/~wkahan/
691デフォルトの名無しさん:2011/12/25(日) 17:27:18.26
大学でFORTRANを習っています。
プログラミング界だとどんな位置付けですか?
692デフォルトの名無しさん:2011/12/25(日) 18:00:07.19
>>691
fortranは総理大臣
c++は校長先生
phpは地方公務員
htmlは乞食
693デフォルトの名無しさん:2011/12/25(日) 18:55:11.43
FORTRAN教えるようなとこなら真面目にやっといて損はないよ
694デフォルトの名無しさん:2011/12/25(日) 23:52:44.69
693に同意。
695デフォルトの名無しさん:2011/12/27(火) 02:03:45.23
chracter(25)::F,G,H
real,dimension(100000)::A,B,C,D,E
integer,dimension(100000)::date,ddate
ifile='F'
ifile2='G'
ifile='H
open(10,fie=trim(ifile))
open(20,file=trim(ifile2))
open(2,file=trim(ofile))
do i=1,100000
read(10,*,end=99)date(i),A(i),B(i),C(i),D(i),E(i)
enddo
do i=1,1000
read(20,*,end=88)dnl
dif=abs(dnl-A(i))
sq=sqrt(dif**2)
if(sq.le.dmin) then
dmin=sq
Sdate=date(i)
SA=SA(i)
SB=SB(i)
SC=SC(i)
SD=SD(i)
SE=SE(i)
endif
enddo
99close(10)
88close(20)
write(2,'(6f10.3)')Sdate,SA,SB,SC,SD,SE
close(2)
stop
end
696デフォルトの名無しさん:2011/12/27(火) 02:09:35.70
上のプログラムですが、ifileのAが、ifile2のdnlに一番近いところを計算させて
、そのときのSdate,SA,SB,SC,SD,SEを表示させるプログラムを作ろうとしています。
ifileは約15000行、ifile2は約300行のデータです。
まず、はじめにデータを読み込んだ二回目のdo文がうまく回っていません。なぜでしょう?
そして、目的とする答えがでません。よろしくお願いします
697デフォルトの名無しさん:2011/12/27(火) 02:34:51.95
突っ込みどころがありすぎて困るが、これは元プログラムをいじって切り出したものなのか?
情報が少なすぎて困る。
せめてコンソールの出力も見せてくれ。

与えられた範囲では、整数型に文字列を入れていて、66時代ならありだが、コレのせいで二番目によむファイルが上手く読めなくて
ENDofFILEでさっさと抜けているのではとしか思えない。
698デフォルトの名無しさん:2011/12/27(火) 08:02:11.42
とりあえず、ifileを宣言してないよ。
implicit none をつけてコンパイル出来るようにしてから、質問するとまともな回答が帰ってくると思います。
699695の者です:2011/12/27(火) 19:24:19.39
character(25)::ifile,ifile2,ofile
real,dimension(100000)::A,B,C,D,E
integer,dimension(100000)::date,ddate
ifile='F'
ifile2='G'
ofile='H'
open(10,file=trim(ifile))
open(20,file=trim(ifile2))
open(2,file=trim(ofile))
do i=1,100000
read(10,*,end=99)date(i),A(i),B(i),C(i),D(i),E(i)
enddo
do i=1,1000
read(20,*,end=88)dnl
dif=abs(dnl-A(i))
sq=sqrt(dif**2)
if(sq.le.dmin) then
dmin=sq
Sdate=date(i)
SA=A(i)
SB=B(i)
SC=C(i)
SD=D(i)
SE=E(i)
endif
enddo
99 close(10)
88 close(20)
write(2,'(6f10.3)')Sdate,SA,SB,SC,SD,SE
close(2)
stop
end
700695の者です:2011/12/27(火) 19:25:49.40
[mm5@envisat AMSR-E]$ pgf90 match-up2.f
OSはlinux fortran90を使用しています
いかがでしょうか?
701デフォルトの名無しさん:2011/12/27(火) 19:33:19.69
endの前にstopを置く習慣はどんな経緯から?
702695の者です:2011/12/27(火) 19:46:37.19
701さん
これは先輩から教わりました
703デフォルトの名無しさん:2011/12/27(火) 20:10:20.46
大昔は
program stop end
subroutine/function return end
しないと挙動が怪しかったw
704デフォルトの名無しさん:2011/12/27(火) 20:41:14.36
>>701
むか〜し、むかし、お前の生まれるよりずっと昔。
この世にはアセンブラとFORTRANしか無かった頃の話じゃ。

FORTRAN I には、END文は無くて STOP 文でプログラムは終わっていたのじゃ。
STOP文の後ろに8進法の数字を書いておくと、それに合わせてコンソールのランプが明るく光ったのじゃ。
エラーコードの先祖じゃ。今でもSTOP文の後ろに整数が書けるのはその頃の名残じゃわい。

ところでその頃は、サブルーチンもファンクションもなくて、文関数しか存在していなかった。
しばらくして FORTRAN II の時代になると、卵からサブルーチンとファンクションが出てきたのじゃ。
ところが、JOBカードのなかでメイン・プログラムと副プログラムの区切りがつかなくなって村人たちは困ったのじゃ。
するとどこからとも無く END文がやってきて、区切りがつくことになったのじゃ。

それ以来、FORTRAN では、STOP END と書くようになったのじゃ。
STOPを抜かすのは下品で育ちの悪い人とみなされるのじゃよ。
とっぴんぱらりのぷ。
705デフォルトの名無しさん:2011/12/27(火) 23:52:01.62
>>699
第一のループは10万行のデータを読み込もうとしている。ところがデータは一万五千行しか無い。
故に途中でEOFに出会う。するとEND=99によってラベル99に飛ぶ。よって第二のループは実行されない。
ところが出力はされる。結果は腐っている。

ではどうすれば良いのか?ラベル99の行を第一のループと第二のループの間に置けば良かろうかと思う。
706デフォルトの名無しさん:2011/12/28(水) 11:30:49.67
>>704
自分は>>701ではないけど,

へぇ〜,へぇ〜,へぇ〜
707デフォルトの名無しさん:2011/12/28(水) 21:48:09.89
fortranってなんで土木系で好まれているの?
708デフォルトの名無しさん:2011/12/28(水) 23:54:10.80
土木系に限らず固体を扱う場合はfortranが多い気がする。
abaqusやmarkのユーザサブルーチンもfortranだし。
土木でも計画やってる人はスクリプト言語含めいろんな言語使ってる。
709デフォルトの名無しさん:2011/12/29(木) 09:24:32.38
fortranのくだ質です。
main.f90 に使う変数の数が膨大な数なので別ファイルにて
管理したいのですが (hensu.f90 とか?)、そういうことって
実現できたりしますか?
710デフォルトの名無しさん:2011/12/29(木) 13:23:18.90
.outとかのファイルにすればいいじゃ?
711デフォルトの名無しさん:2011/12/29(木) 13:46:23.41
>>709
理屈の上では昔のCOMMON文のノリでMODULEにまとめればよい。
しかし、それはほぼ逆走に近い行為w
712デフォルトの名無しさん:2011/12/29(木) 14:28:31.76
>>711
逆走に近いとは…?
fortran 設計の理念に反するとかそういうことですかね?
パラメータだけで1000ステップ超えてるのでなんとかしたい
んですよねぇ。

理想としては、これからもパラメータが増える予定なので
パラメータを追加する際、main program をいじらないで
別のファイルで管理しているものに追加していきたい。
またそれに伴って、自分で定義関数関係も増えるので
関数も別にプラグイン的なノリで管理したいんですが。
713デフォルトの名無しさん:2011/12/29(木) 15:06:10.13
>>712
MODULEに入れるのは大域変数ということになる。


詳しい事情は分からんが、とりあえずは以下のようにすればいい。関数も入れられる。

file1.f90
MODULE m_param
 REAL, PARAMETER :: a1 = 1.0, a2 = 2.0
 云々
END MODULE m_param

普通の変数でも構わない。

file2.f90

PROGRAM main
USE m_param
IMPLICIT NONE
云々
END PROGFRAM main


C上がりの人とかだったら、INCLUDE文を使う手もある。
正式な構文ではないが、大抵のコンパイラで実装している。
714デフォルトの名無しさん:2011/12/29(木) 22:41:09.14
>>705さん 確かに二回目のdo文もまわりましたが、結果は変でした・・・
715デフォルトの名無しさん:2011/12/30(金) 00:05:47.84
装置番号がよく分からないけど、2乗して2乗根もよく分からないぞ
716デフォルトの名無しさん:2011/12/30(金) 00:26:07.87
>>709
可能。
まとめてコンパイルすればよい。
オブジェクトファイルを生成するのが正しい姿勢。

moduleは本質的な答えではないので注意。
717デフォルトの名無しさん:2011/12/30(金) 00:29:35.83
>>714
全ての変数の型を宣言してよ。
あと、何がしたいのかよく分からん。
718デフォルトの名無しさん:2011/12/30(金) 01:27:23.72
>>714
あんた質問の仕方が下手だなw Googleとかと同じで、上手く質問しないと中々正解にたどり着かないぞ。

ラベル99の文を動かした結果、第二ループが回ったのか?
結果がおかしいとは何を以てそう言っているのか?

おじちゃんに正直に話してご覧。ポッキーあげるから。
         ━━━━━━━一
         ━━━━━━━一   
         ━━━━━━━一
         ━━━━━━━一   
         ━━━━━━━一
         ━━━━━━━一   
719デフォルトの名無しさん:2011/12/30(金) 19:38:46.97
スティック状の線香じゃないんだから、ポッキーは
━━━━一
こんなもんだろ。
720デフォルトの名無しさん:2011/12/30(金) 21:44:26.92
長いぜオレのチンポッキー ━━━━━━━一ω
721デフォルトの名無しさん:2011/12/30(金) 22:37:50.88
震災のとき、なにしてた?
722デフォルトの名無しさん:2011/12/30(金) 23:22:17.74
>>721
プログラミングかな。もちろんFortranでね。
723デフォルトの名無しさん:2011/12/31(土) 15:01:30.29
>>716
ご返信ありがとうございます。
オブジェクトファイルを生成するようコーディングすればいいのですね。
ということは module はまた違ってくるわけですね。
724723:2011/12/31(土) 19:22:48.34
ちなみにオブジェクトファイルを生成するにはどういったおまじないが必要なのでしょう?
main.f90 の他にパラメータ群をコーティングしたファイル parameter.f90 があったとして。
725デフォルトの名無しさん:2011/12/31(土) 20:24:44.33
.forと
.f90
の違いは?

大学時代、ずっと.forだったんだけど
726デフォルトの名無しさん:2011/12/31(土) 20:59:34.96
>>725
.for ないし .f は固定カラム形式
.f90 は自由形式 を意味する。

.f95 とか .f2k とかは無定義。正式なものではない。
727デフォルトの名無しさん:2012/01/02(月) 16:18:43.42
ifort -r8 -FI hoge.f90
とか、固定書式な部分はコンパイラに任せちゃう。
なんか左8つくらい空白じゃないとムズムズしてしまうので・・。
728デフォルトの名無しさん:2012/01/04(水) 23:05:46.54

           優良スレ            普通            クソスレ
             ┝━━━━━━━━━━┿━━━━━━━━━━┥
                                     88彡ミ8。   /)
                                    8ノ/ノ^^ヾ8。( i )))
                                     |(| ∩ ∩|| / /   <ココ!
                                    从ゝ__▽_.从 /
                                     /||_、_|| /
                                    / (___)
                                   \(ミl_,_(
                                    /.  _ \
                                   /_ /  \ _.〉
                                 / /   / /
                                (二/     (二)
729デフォルトの名無しさん:2012/01/05(木) 01:05:31.83
ここは「くそみそ」ハッテン場なんだが・・・お前はじめてか?
730デフォルトの名無しさん:2012/01/07(土) 20:10:23.57
だれかー
分かんない問題あるんだけどー
731デフォルトの名無しさん:2012/01/07(土) 20:14:46.67
書いてみろ。といてやる。
732デフォルトの名無しさん:2012/01/07(土) 20:28:51.35
ある動物園の1日の総入園者数(1行目)と入園者の年齢(2行目以降)が、以
下のような書式でファイルに格納されている。このファイルからデータを配列に
貯えて、各年代ごと(10歳未満、10代、20代、30代、・・・)の入園者
数、平均年齢、および最高年齢と最低年齢を求め以下の書式で出力するプログラ
ムを書きなさい。

データファイル(入力)
57
5 12 28 3 62 32 15 43 51 68
15 2 1 29 21 22 67 41 10 9
11 63 31 2 6 8 65 13 26 35
55 31 9 15 67 36 13 3 62 58
5 53 48 2 66 39 7 9 11 69
61 4 63 13 60 8 65

(出力)
平均年齢 n1 才
最高年齢 n2 才 最低年齢 n3 才

0 から 9 才 n1 人
10 から 19 才 n2 人
20 から 29 才 n3 人
30 から 39 才 n4 人
40 から 49 才 n5 人
50 から 59 才 n6 人
60 から 69 才 n7 人


ドキドキ
733デフォルトの名無しさん:2012/01/07(土) 20:46:58.43
FORTRAN77で書いて欲しいかね90でいいのかね?
おじちゃんに言ってみなさい。
734デフォルトの名無しさん:2012/01/07(土) 21:22:57.17
90で願います(´Д`)
735デフォルトの名無しさん:2012/01/07(土) 21:51:13.92
program zoo
implicit none
integer :: i, ntotal, iyoungest, ioldest, idist(7)
integer, allocatable :: ivisitor(:)
real :: ave
read(10, *) ntotal
allocate( ivisitor(ntotal) )
read(10, *) ivisitor
iyoungest = minval(ivisitor)
ioldest = maxval(ivisitor)
ave = sum(ivisitor) / ntotal
forall (i = 0:6) idist(i + 1) = count(ivisitor / 10 == i)
write(*, '(a, f5.1, a)') '平均年齢 ', ave, '才'
write(*, '(a, i3, a, i3, a)') '最高年齢 ', ioldest,' 才 最低年齢 ', iyoungest, '才'
do i = 0, 6
write(*, '(i3, a, i3, a, i3, a)') 10 * i, 'から', 10 * i + 9 , '才 ', idist(i + 1), '人'
end do
stop
end program zoo

結果を確認していないw
736デフォルトの名無しさん:2012/01/07(土) 21:52:36.14
出力

平均年齢 30.0才
最高年齢 69 才 最低年齢 1才
0から 9才 16人
10から 19才 10人
20から 29才 5人
30から 39才 6人
40から 49才 3人
50から 59才 4人
60から 69才 13人



入力のところは、場合によっては修正しないと駄目かもしれん。
737デフォルトの名無しさん:2012/01/07(土) 23:10:49.23
あっざーす
学校のPCじゃないと試せないんでとりあえずありがとうございます
738デフォルトの名無しさん:2012/01/08(日) 00:06:45.05
オンラインコンパイラ。
こことか
http://www.sourcelair.com/
ここで
http://www.onlinecompiler.net/fortran
試せる。

まぁ制限があるので、そのままでは動かないがw
739デフォルトの名無しさん:2012/01/08(日) 02:59:55.74
::ってなんですか?習った覚えがないんですよ・・・
740デフォルトの名無しさん:2012/01/08(日) 05:15:48.13
>>739
ステマって意味^^
741デフォルトの名無しさん:2012/01/08(日) 10:02:47.49
>>739
習ったのは77だな。90ではつけるんだ。まぁなくてもいいんだがw
742デフォルトの名無しさん:2012/01/09(月) 01:57:17.33
>>741
未だに77教えてるクソ学校あるのか?w
743デフォルトの名無しさん:2012/01/09(月) 06:15:21.79
【ソウル聯合ニュース】国策シンクタンクの韓国開発研究院(KDI)は8日に公表した経済動向報告書で、
韓国経済の成長が輸出・内需ともに鈍化していると評価した。

 前年同月比の輸出増加率をみると、12月は12.5%で前月(13.8%)よりやや悪化した。11月の
消費販売額指数は0.5%増にとどまり、前月の増加率(2.2%)を下回った。

 産業生産は鉱工業、サービス業がともに振るわず、前月より減少した。また、需要不振などで在庫が
拡大して生産増加の制約要因に作用すると、KDIは予想した。

 設備投資は前月と比べれば、減少幅がやや改善したが、全般的に不振が続いている。回復ペースを
見せていた建設投資も足踏み状態にある。

 KDIは先進国一部の景気指標がやや改善したが、成長鈍化や財政危機などで下振れリスクが依然
として残ると指摘した。


聨合ニュース: 2012/01/08 14:03
http://japanese.yonhapnews.co.kr/economy/2012/01/08/0500000000AJP20120108000900882.HTML
744デフォルトの名無しさん:2012/01/09(月) 09:56:41.79
といてくれという宿題を見ているとまだまだ現役w
それに90を教えているといっても、ほとんど77な発想に、ちょっと90の機能使いました的なのが普通。
実用という面では77読めないと仕事できない。
745デフォルトの名無しさん:2012/01/10(火) 02:50:03.32
>>744
そうなのか^^;
俺は独学で fortran95 学んでシミュレーションしてる
口だからそういう事情しらんかったw
やっぱり古いソースを使う機会が未だに多いということなのかね
746デフォルトの名無しさん:2012/01/10(火) 03:01:13.70
まあ言語の機能よりは
問題ごとに確立された手法の蓄積が肝心だからね
747デフォルトの名無しさん:2012/01/10(火) 15:15:40.88
>>732 fortran77でやる場合はどうなるんですかね?
748デフォルトの名無しさん:2012/01/10(火) 17:20:29.98
リダイレクションして出力するってこと忘れてました。申し訳ないです。
749デフォルトの名無しさん:2012/01/10(火) 22:58:32.86
77で書くのはめんどい。90なら1行で書けることが5行くらいかかる。
連休前の軽い気分ならやってやるが、♪今はもう動かない、おじちゃんのや〜る〜き〜。
750デフォルトの名無しさん:2012/01/10(火) 23:05:21.42
Real aver(1:5),s,ep,
Integer exam(1:100,1:5),sum(1;5),psum(1:100),I,j,n

Read(5,*)n, ((exam(I,j),j=1,5,1),i=1,n,1)

Do 20 j=1,5,1
Sum(j)=0
Do 10 i=1,n,1
Sum(j)=sum(j)+exam(I,j)
10 continue
Aver(j)=sum(j)/real(n)
20 continue
Do 40 i=1,n,1
Psum(i)=0
Do 30 j=1,5,1
Psum(i)=pasum(i)+exam(I,j)
30continue
Paver(i)=pasum(i)/5.0
40continue
751デフォルトの名無しさん:2012/01/10(火) 23:06:41.39
続き
Write(6,100)
100 format(14x,’score of examitation’/
* 2x,no. eng mat jap soc sci ‘,
* 3x,’psum paver’
Do 50 i=1,n,1
Write(6,200) I,(exam(I,j),j=1,5,1)
Psum(i),paver(i)
200 forma(1x,i3,5i6,i7,f6.1)
50 continue

Write(6,400) ( sum(j),j=1,5,1)
400 format(/1x,’sum’,5i6)
Write(6,500) (aver(j),j=1,5,1)
500format(/1x,’aver’,2x,5f5.1)
Stop
End
を改造して
各科目の標準偏差を求めそれを利用することで各個人の偏差値を求め、個人の
得点の下に偏差値をしめすプログラムの作り方がわかりません。。。。
偏差値=(P−M)/s*10+50
標準偏差は各科目ごとにs=√1/nΣ(P-M)*(P-M)
p=得点、M=平均値


AVER:科目平均 SUM:科目の合計  PSUM:個人の合計 PAVER:個人の平均
752デフォルトの名無しさん:2012/01/10(火) 23:07:12.79
続き
データファイル
 51 80 70 90 50
70 40 65 70 40
60 78 75 80 70
90 80 85 70 95
40 70 55 60 60
80 50 85 75 80

お願いします!!
FORTRAN90です。
いろいろと試みたんですがわからなかったので。。。。。
753デフォルトの名無しさん:2012/01/10(火) 23:20:30.66
>>752
jap ってなんだよ。朝鮮学校の宿題かよ。大体それ77だぞ。金正日の糞でも食ってろw
754デフォルトの名無しさん:2012/01/10(火) 23:28:23.22
国語です。初心者でわかりませんでした↓
755デフォルトの名無しさん:2012/01/11(水) 00:08:28.87
77のDOってCONTINUEで終わらないといけないものとばかり思ってた事を思い出した
756デフォルトの名無しさん:2012/01/11(水) 01:14:00.26
こんな本でてるw
http://www.amazon.com/Missile-Flight-Simulation-Jeffrey-Strickland/dp/1105102815
Missile Flight Simulation

Fortran and ADA are the principal Government-approved langeages.

757デフォルトの名無しさん:2012/01/11(水) 03:07:45.89
>>751 同じ大学の予感
758デフォルトの名無しさん:2012/01/11(水) 16:55:21.54
program vipper
implicit none
integer, parameter :: nop = 5
integer, allocatable :: iexam(:, :)
real, allocatable :: sts(:, :)
real :: ave(nop), std(nop)
integer :: i, j, nos
read(*, *) nos
allocate( iexam(nop, nos), sts(nop, nos) )
read(*, *) iexam
ave = sum( iexam, dim = 2 ) / nos
forall (i = 1:nop) std(i) = sqrt( sum( (iexam(i, :) - ave(i))**2 ) / nos )
forall (i = 1:nop) sts(i, :) = ( iexam(i, :) - ave(i) ) / std(i) * 10.0 + 50.0
write(*, '(7(4x, a, 1x))') ' 英', ' 数', ' 国', ' 社', ' 理', ' 計', '平均'
write(*, '(58("=")/, 7f8.1/, 58("="))') ave, sum(ave), sum(ave) / nop
do i = 1, nos
write(*, '(7(i7, x))') iexam(:, i), sum(iexam(:, i)), sum(iexam(:, i)) / nop
write(*, '(5f8.1/)') sts(:, i)
end do
stop
end program vipper

6
100 80 70 90 50
70 40 65 70 40
60 78 75 80 70
90 80 85 70 95
40 70 55 60 60
80 50 85 75 80
759デフォルトの名無しさん:2012/01/11(水) 16:55:48.76
英 数 国 社 理 計 平均
==========================================================
73.0 66.0 72.0 74.0 65.0 350.0 70.0
==========================================================
100 80 70 90 50 390 78
63.7 58.9 48.1 67.2 41.8

70 40 65 70 40 285 57
48.5 33.5 43.5 45.7 36.4

60 78 75 80 70 363 72
43.4 57.6 52.8 56.4 52.7

90 80 85 70 95 420 84
58.6 58.9 62.1 45.7 66.3

40 70 55 60 60 285 57
33.3 52.5 34.1 35.0 47.3

80 50 85 75 80 370 74
53.5 39.8 62.1 51.1 58.2
760デフォルトの名無しさん:2012/01/11(水) 19:26:28.74
ありがとうございます
761デフォルトの名無しさん:2012/01/13(金) 23:03:52.43
gfortranでスタックサイズを変えるにはどのコンパイルオプションを指定すればいいんですか?
配列サイズが大きくて実行時にエラーになります。

「-fmax-stack-var-size=n」はn=200000000でエラーがになるのにn=10でエラーがなかったりする
のでよくわかりません。
「-fstack-arrays」はコンパイル時に f951.exe: error: unrecognized command line option '-fstack-arrays' という
エラーが出ます。
762デフォルトの名無しさん:2012/01/13(金) 23:35:12.81
>>761
>「-fmax-stack-var-size=n」
これはスタックにとる配列サイズの設定であって、スタックのサイズではないよ。
ここで設定したサイズより大きい配列はスタックに置かれないから、
この値をスタックサイズより小さくすればオーバーフローが回避できる。
763デフォルトの名無しさん:2012/01/13(金) 23:40:07.24
>>762
そうだったんですか。ありがとうございます。
あと、スタックサイズって調べられるんですか?
764デフォルトの名無しさん:2012/01/13(金) 23:42:51.78
fortranを仕事で使ってる奴いる?
みんあエクセルにながれちゃん?
765デフォルトの名無しさん:2012/01/13(金) 23:55:44.27
>>763
linuxだったらulimit -sで表示も設定もできる
766デフォルトの名無しさん:2012/01/14(土) 01:04:20.84
>>765
すみません書いてなかったです。OSはwin7x64です。
ulimit -s コマンドプロンプトでやってみたけどダメでした。
767デフォルトの名無しさん:2012/01/14(土) 01:29:00.98
>>761
つーか、automaticでデカい配列取ると常にスタック問題に悩まされるので、
素直にALLOCATEABLEにしてALLOCATEすれば良い。

まぁIntelFortranは、スタック問題の質問が殺到したために、デカ目の配列は勝手にheapにとるようになったw
768デフォルトの名無しさん:2012/01/14(土) 02:00:12.07
>>767
allocateつかったらエラー出ませんでした。ありがとうございます。
769デフォルトの名無しさん:2012/01/17(火) 11:57:00.85
Error: Syntax error, found END-OF-STATEMENT when expecting one of: , )

このエラーは構文のミスですか?
かっこが多いとかですかね?
770デフォルトの名無しさん:2012/01/17(火) 12:12:29.80
むしろ足りない。

固定フォーマットで72カラムをはみ出していると見た。
771デフォルトの名無しさん:2012/01/17(火) 12:28:23.23
>>770

72文字制限は守っています。

エラーが出ている行を何度見直しても括弧の数はあっているのですが・・・
その前後に問題がある場合もありますか?
772デフォルトの名無しさん:2012/01/17(火) 12:57:01.80
, または ) で結ばれる前に、行末が来てしまったと言っているしな。
フォーマット文が狂ってるか、72カラムからうっかりはみ出した場合が多いような。

その行だけここに出して味噌。
773デフォルトの名無しさん:2012/01/18(水) 00:30:36.98
解決したのかよ。続きが知りたいだが。
774デフォルトの名無しさん:2012/01/18(水) 20:13:57.62
write (*,'(a,f5.2,a,5.2,a)') 'y=',alfa,'+',beta,'x'
     1
Warning (100): Unexpected element in format string at (1)

何がおかしいか分かりませんお願いします
1は「'」の下です
775デフォルトの名無しさん:2012/01/18(水) 20:46:38.00
2つ目の5.2は何か
776デフォルトの名無しさん:2012/01/18(水) 21:33:52.63
>>775
ありがとうございます
解決しました
777デフォルトの名無しさん:2012/01/19(木) 18:24:38.41
gfortran でstackoverflow にならなくても他のコンパイラではなる場合、
gfortranでもうまくいってない可能性は高いでしょうか?
778デフォルトの名無しさん:2012/01/19(木) 23:03:26.61
>>777
細部を見ないと断言できないが、AUTOMATIC変数が大きくてSTACK OVERFLOWが起きているののならば、
DEFAULTのSTACKサイズがコンパイラ毎に違っているので、そういうことが起きてもおかしくない。

オプションによって、STACKではなくHEAPにAUTOMATIC変数をとるようにも出来る場合もあるし、
初めからそういう設定になっていることもある。

しかし、別の原因でSTACK OVERFLOWを起こしているのなら、話しは別だ。

それぞれのコンパイラのマニュアルを一字一句舐めるように読んでDEFAULTのSTACKサイズを調べて味噌。
779デフォルトの名無しさん:2012/01/20(金) 00:39:04.83
fortranって非対称マトリクスの扱い弱くない?
780デフォルトの名無しさん:2012/01/20(金) 00:46:53.78
gfortranを使ってるものですが。
配列の宣言について質問です。

例えば、

subroutine sub(a,b,n,j)
implicit real*8(a-h,o-z),integer*4(i-n)

dimension a(n,n+1),b(n*n,j)

  ・
  ・



というような宣言はおかしいでしょうか?
スタックの原因になったりしますか?
一応コンパイルはこれでできるのですが。
形状引継ぎや形状明示のことだと思うのですが・・・。

説明不足かもしれませんが、エスパーな方教えてやってください。
781デフォルトの名無しさん:2012/01/20(金) 00:55:53.58
それは親ルーチンから引き継いだ配列だからスタックに効かない。
そのサブルーチンで新たに定義した配列が大きいとスタックがあふれる。

言ってることが分からないなら、他の宣言文も全部出せ。

77でやっているならそういうことは起きにくいのだが、変数をSTATICにとるようなオプションを付けてコンパイルするとか。
本来の規格では77でのサブルーチン変数は動的にとられるが、歴史的な事情から、静的に確保されることが多い。
(SAVE変数に成っている)その辺の問題かな。

いまは77形式も90系と同じコンパイラが単にオプションを変えて走っているだけなので、そのオプションがなんなのか
個別に調べないと分からん。
782デフォルトの名無しさん:2012/01/20(金) 01:21:25.60
>>781
ありがとうございます。

宣言は

implicit real*8(a-h,o-z),integer*4(i-n)
parameter(nx=10,ny=10,nt=nx*ny)

call sub1(nt)

return
end

subroutine sub1(nt)
implicit real*8(a-h,o-z),integer*4(i-n)
dimension a(nt,nt+1)

call sub2(a,nt)

return
end

subroutine sub2(a,nt)
implicit real*8(a-h,o-z),integer*4(i-n)
dimension a(nt,nt+1)

return
end
という感じでsub1で大きな配列を宣言するとあふれるということですかね?また、スタックがあふれるときはコンパイルの時点でエラーが出るんでしょうか?


783デフォルトの名無しさん:2012/01/20(金) 01:27:25.10
100*101程度では溢れないが、基本的にはそういうこと。
コンパイル時にはエラーはでない。
784デフォルトの名無しさん:2012/01/20(金) 01:29:44.50
>>779
そんなことはない
785デフォルトの名無しさん:2012/01/20(金) 01:34:01.82
>>783
なるほど、親ルーチンで宣言してれば問題にならないんですか?
786デフォルトの名無しさん:2012/01/20(金) 02:31:30.26
>>785
いや、コンパイル時にはエラーはでないが、実行時にエラーが出る。
787デフォルトの名無しさん:2012/01/20(金) 02:37:51.52
親プログラムで配列を確保しておけばという事ならエラーはでない。
788デフォルトの名無しさん:2012/01/20(金) 02:40:36.33
>>786
実行時のエラーというのはプログラムが強制終了するってこと?
それとも数値計算の値がずれたりする?
789デフォルトの名無しさん:2012/01/20(金) 02:51:51.77
STACK OVERFLOWの話をしているのではないのか?
790デフォルトの名無しさん:2012/01/20(金) 03:07:16.46
>>789
質問が初歩的すぎてスマン。
実行時にクラッシュするわけですね・・・。
791デフォルトの名無しさん:2012/01/20(金) 03:14:15.59
>>777>>780>>782>>785>>788>>790
というのもgfortranでコンパイルしたら普通にプログラムも動いて、数値計算ができるんだが、
他のコンパイラを使うとスタックオーバーフローになるみたいで、
gfortranでやった場合の計算結果が合ってるかがわからなかったんです。

とても参考になりました。本当にありがとうございます。
792デフォルトの名無しさん:2012/01/22(日) 11:07:18.17
basicだとグラフ掛けるけど、
fortranはどうなん??
793デフォルトの名無しさん:2012/01/22(日) 12:08:40.04
標準ではできない・・・とおもう。

だいぶ前になるけど、 Digital visual Fortran では出来たな。
GUI その他拡張機能 を全部 qq で始まる名前の副プログラムで提供していた。
・・・Intel Fortran の中の人は旧DECの人と聞いたことがあるけど、どうなんだろうか?
794デフォルトの名無しさん:2012/01/22(日) 17:29:37.20
QQで始まるのはMS-FORTRANに源流を持つMSのQuick-Winだな。
DOS時代から綿々と続いて今もIntelVisualFortranに受け継がれている。

DEC時代にはFGLで始まるOpenGLの機能の一部が簡単に使えるライブラリが用意されていたが、
最近はF90GLとかのフリーのルーチンでやってくれということで削除された。

大型計算機以来のXYプロッタ的なルーチンは、幾つかフリーのものが出回っている。
標準でグラフィック機能というのはもちろん無い。
795デフォルトの名無しさん:2012/01/23(月) 04:13:00.77
広義にはpgplot gnuplot 辺りも>>792
希望に叶うのかな?

MS Fortran の中身はDEC が作ったと記憶。
当時のMSに開発環境を作る能力は・・
796デフォルトの名無しさん:2012/01/23(月) 09:47:41.02
>>795
それは間違い。
MSがBASICの次に売った言語はCP/M用のFORTRANサブセット。
DOS用のMS-FORTRAN3.0,4.0,5.0ときて、5.0にはQuickWinが付いている。
その後Win3.1,NT用まではMSで出した。
DECに渡したのはWin95の頃。QuickWinはMS仕様のままさほど発展せずに今に至っている。
797デフォルトの名無しさん:2012/01/23(月) 11:04:18.07
ここはためになるインターネッツですね
798デフォルトの名無しさん:2012/01/23(月) 11:43:42.33
MS Fortran PowerStation って95の時だっけ?
fpsfl32.exe /4Yb mufufu.for
かな、/4Yb オプションつけたときの
バグ発見効率の素晴らしさに感動したのも昔の話。
799デフォルトの名無しさん:2012/01/23(月) 11:47:58.19
PowerStation1.0/NT はWin3.1/NT3.5 PowerStation4.0がWin95
4.0に急に飛んだのはVC++の4.0に合わせたため。ここで環境の統合がなされた。
それまでは個別のWorkBench、ここからDevStudio。
800デフォルトの名無しさん:2012/01/23(月) 11:55:33.35
FPS4.0まではMSが出したが、これが結構バグバグでDECに後をかませた。
DECは潰れてCompaqに買収され、CompaqはHPと合併して、FortranチームをIntelに売って今に至っている。
QuickWinを見捨てずに今まで残しているところは偉い。
801798:2012/01/23(月) 12:22:09.28
ああそうだ、自分が使ってたのは4だ・・とおもうw
ためになるよ。ありがとう >799,800

ついで、というか・・・自分の記憶だとそのあと
Digital Visual Fortran っていうのがあって
DEC Alpha の NT 上で初めてF90 規格をさわって・・・
module use あたりに最初頭が馴染めず苦労した記憶が・・なつかしいのう。
802デフォルトの名無しさん:2012/01/24(火) 23:53:15.40
fortranで童貞捨てたいんですが、、、、
803デフォルトの名無しさん:2012/01/25(水) 13:36:34.70
 ヽ/l l ニ|ニ           ,.、-''"..;:;:;:;:;:;:;:... `'ヽ、
  (   ( ̄   ̄)      /....:::;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;.....ヽ、/ ̄ ̄ ̄ ̄\/
    ̄    ̄         i_;;、:_;、;_;、;、;、、ィッ.;:;:;:;:;: /  興  男    >>802
 ,.、-──-- 、.,_     ,、  |      ,,,,,,  / ;:;:;:;:;:;: |   味   の      :
          ``''--イ ,),、,! '''''        \ ;;;;;;;;;_|   が   は      :
              ヾー'゙ |ヒニニュ ャニ,ニニ、> 〉;; / _|   あ  だ
       ノ l  ハ  l ヾ トイ `!゙l)_j   ' iリ__, `  }ii l f'ト〉   る  か
    _,,.ノ _ノ / ノ ノ ノノ!_丿 |   l   ` " '''   }ii リノ |   の   に  |\__
      ノ ,、ィ'-=z=F [_   .l! .{   、     ィ!ii;}' ノ|   か       |
   -‐''゙_ノ ,ノ  '゙ (ソ   ヽ   {! ゙ー<⌒'     ,ミi;i;}ー'゙ |   ね       |
  、 ィッ>f「  _,,二-   ヽ.  }i、  -===-'  リiii;ツ   |   ?       |
   `〒T〔!|       r ,_ノ _ノ}lli,  -r=‐  ,i;llilili|   > _____/`ヽ、
     ゙、ヽ`!  l   _ _」 // '}llli, ,;i|i;, ,,ii;ilililll'゙リ /  ̄ l l      ,、 ''⌒゙ヽ、
     `ト.、!  lj  (__l、/  |   ゙ト!llllllllllliillllllllヅ_、-゙    /,l l       /
     l ゙ト、     t'゙ |   |  | |、'lトllトllトツ "´    // l l       /
   ,ィ、化ァ ',\       l 〉  |   | | ゙、 //∧    / /  l l     l
(爪((、`ー'′ ', `''t‐--'′〉ト、 |   | |. Vハ彡 ∧  /    |_L、  i | /
 ̄ ̄ ̄`¨`''ー--ニL_   `!、 `! l ̄`''┴--┴'-'゙-─…''"´_,, ィ|  l |/
               ヽ ` ', | O``''────…'''"´  O',゙:、  l |/
804デフォルトの名無しさん:2012/01/25(水) 17:16:42.14
どうしてフォートランしないのッ
805デフォルトの名無しさん:2012/01/26(木) 17:03:35.64
アフリカ象が好き!
806デフォルトの名無しさん:2012/01/27(金) 12:24:42.93
ぱぉぉぉん!
807デフォルトの名無しさん:2012/01/27(金) 13:58:29.66
八丈島のキョン!
808デフォルトの名無しさん:2012/01/31(火) 17:38:04.01
error LNK2001: unresolved external symbol _MAIN__

fatal error LNK1120: 1 unresolved externals

以上のエラーが解決できません。

定義していない引数を出しているとかでしょうか?
LNK1120の説明が多くて難儀しています。。。
809808:2012/01/31(火) 17:45:33.71
上のものはbuildできなくて困っています。
810デフォルトの名無しさん:2012/01/31(火) 22:58:16.57
あ〜それ、あれだよアレwww
811デフォルトの名無しさん:2012/01/31(火) 23:00:47.97
ライブラリにリンクできてないんじゃない?
812デフォルトの名無しさん:2012/02/01(水) 15:54:23.60
main program が無いんでね?

モジュールしかないファイルをビルドしているとか。
コンパイルのファイル並びが悪いとか。
813デフォルトの名無しさん:2012/02/04(土) 11:53:25.56
フォートラン95で、10個のデータを
読み込み絶対値が最も大きいものの番号ともとの値を表示する
プログラムの作り方を教えてください.
814デフォルトの名無しさん:2012/02/04(土) 12:31:18.78
特定した
815デフォルトの名無しさん:2012/02/04(土) 14:12:32.03
maxvalとmaxloc
816デフォルトの名無しさん:2012/02/04(土) 19:24:28.09
有限要素法の二次元梁要素のfortranソースどこかに落っこちてないですか??
817デフォルトの名無しさん:2012/02/06(月) 14:24:01.49
program gayboy
implicit none
integer, parameter :: nmax = 10
real :: xdat(nmax), xmax
integer :: kmax
open(10, file = 'hole19.dat')
read(10, *) xdat
kmax = maxloc(abs(xdat), 1)
xmax = xdat(kmax)
print *, 'max pos, dat', kmax, xmax
stop
end program gayboy

豆ポイント
maxlocは元の配列のRANKと同じ配列で結果を返すので、1次元配列では
要素数1の配列で値を返してきて困る。この時、第二引数の次元指定で
問題回避できる。
818デフォルトの名無しさん:2012/02/08(水) 19:16:27.77
FORTRANで整数変数の暗黙宣言がI〜Nになっていることの根拠を知りたいと
いう人がいた気がするが、まだ解決していないなら朕がその謎を解いてやろう。

John Backus 本人がそのものずばりを質疑で答えている。 
ちなみに質問は会場の爆笑を誘っているw
J.A.N. Lee. Transcript of question and answer session: "The History of Fortran I, II, and III".
In in: R. Wexelblat, editor. History of Programming Languages, ACM Monograph Series, Academic Press, 1981, pages 68-71.

http://www.softwarepreservation.org/projects/FORTRAN/paper/p68-lee.pdf

LEE: Helen Gigley asks: "Why were the letters I through N chosen to designate integers?"
[Laughter and applause]

BACKUS: Well, it just seemed for a while that people always used I, J, and K for subscripts,
and we thought we'd be generous and add a few more.

ようするに適当w 
まぁ数学では記法としてΣ_i^Nとかが一般的で、添え字にO以降は使われないから、
I〜Nまでを整数とするのは適切な気がする。
819デフォルトの名無しさん:2012/02/08(水) 19:19:26.81
ついでに言うと、伝説と異なりFORTRAN I で配列のRankが3以下に制限されたのは
インデックス・レジスタが3個しかないせいではないとも言明している。
820営利利用に関するLR審議中@詳細は自治スレへ:2012/03/31(土) 22:08:22.00
F77形式で書かれたプログラムのmakeファイルをg95でコンパイルしようとしたのですが、
メッセージ番号 0x2331 のメッセージ文が application のメッセージ ファイルに見つかりません
というエラーメッセージが出てきてできませんでした。
この現象についてわかる方がいたら教えてください。
ちなみに私のパソコンはWINDOWSですが、知人によると、知人のMacでは普通にコンパイルできたようです。
エラーメッセージをコピペして貼りつけろ。
それでは情報が少なすぎて分からん。
822営利利用に関するLR審議中@詳細は自治スレへ:2012/04/03(火) 01:04:40.93
関係演算子のge,gt,le,ltの意味を教えてください
eq,nqだったらequalとnot equalの略という意味です
GE greater than or equal
LE less than or equal
GT greater than
LT less than
英語マニュアル見ればそのままズバリ書いてあると思う。
equal の後に to もあるかな。 equal to
>>823,824
ありがとうございます
826営利利用に関するLR審議中@詳細は自治スレへ:2012/04/05(木) 02:10:04.20
common文は分かりにくいorバグが出やすいから、モジュールを使いましょう
という文章をfortranのサイトなのでよく見かけるのですが、
common文は何が問題なのでしょうか?

自分は、変数をまとめてcommon文で定義したファイルを
各サブルーチンでincludeしていますが、
これは推奨されていないやり方なのでしょうか?
そもそも、グローバル変数を使うこと自体よくないというのを
聞いたこともありますが、
グローバル変数を使わないで数値計算するというのが想像できないです。
827営利利用に関するLR審議中@詳細は自治スレへ:2012/04/05(木) 02:11:02.29
追記ですが、自分はモジュールのことやオブジェクト指向のことを
まったく理解していないです。
それらの重要性なども、できれば教えてほしいです。
COMMON文は、メモリー領域の共有だから、並べた順番に意味があって、名前には意味がない。
subroutine1
COMMON/A,B,C/ 
subroutine2
COMMON/C,B,A/
とある時、A=C、B=B、C=Aとなる。

これにたいし、MODULEの場合は元々の名前が引用される側でそのまま使われるので、最近の新参言語に慣れた人や初心者の直観像に近い。
COMMON文は元々メモリーの一滴が血の一滴だった頃に、メモリー領域をぎりぎりまで共有して使うための機能。なれれば気持ちいい。
ところが最近の言語しか知らないちびっ子は大域変数と混同してトンチンカンで間抜けな寝言をほざいている。
手動で領域確保とガベージコレクションをやっているようなもんと言えばありがたがるかもしれんw

とはいえ、最近はCOMMON文は、コンパイラの自動最適化の障害になるので使わなくて済むなら、
使わないほうが速いプログラムが出来るという理由で避けたほうがいいとされる。
EQUIVALENCEも同じく最適化の障害になるので、TRANSFER関数を使えと言われている。



MODULEは、F77までは裸でサブルーチンを並べていたのを、箱に入れておくような物。ありがたい点は、分割コンパイルしても
引数の型チェックなどが可能になること。C言語みたいに自分でインターフェースを書かなくても、コンパイラが自動でヘッダーファイルに
相当するものを作ってくれる。MODULEは便利なので、サブルーチンの箱と思って使うとよろしい。
また、これにより大域最適化も昔より用意になっていると言われている。

オブジェクト指向は、引数の型チェックを緩める仕掛けというのが最大の使い道の気がするw
829営利利用に関するLR審議中@詳細は自治スレへ:2012/04/05(木) 03:26:23.90
>>828
>COMMON文は、メモリー領域の共有だから、並べた順番に意味があって、名前には意味がない。
そうです、これをどのサイトでも見かけるのですが、

例えば、
COMMON/A,B,C/ という記述をCOM.txtというファイルに保存して
全てのサブルーチンに
subtoutine1
include COM,txt

doubroutine2
include COM.txt

とやっておけば、順番を間違えたせいで変数が入れ替わることもないし
あとで変更を加えたければ、COM.txtだけを変えればいい。
と思うのですが、この方法だと何か問題があるのでしょうか?
>>828
別にそれでいいし、コピペとかでそうやるけど、COMMONの持っている潜在的な能力を使いきっているわけではない。
単に記憶領域の割付の問題だから、サイズや型が違っているものを割りつけてもいい。
831営利利用に関するLR審議中@詳細は自治スレへ:2012/04/05(木) 10:26:37.44
>>830
先ほどからいろいろ自分でも調べたんですが、
>>829とまったく同じことをモジュールでもやってるみたいですね?
同じことをあえてモジュールでやる意義がよくわからないです。

推奨しない、とは書いてあるんですが
その理由がはっきり書いてなかったりで。
むしろ>>829のような使い方しかしないなら、COMMONを使うまでもなくMODULEを使うほうがいい。

メモリーが少なく、動的な割付が出来なかった時代に、同じメモリー領域を共有地としてサブルーチン毎に色々な割付で使うことが出来たのが
COMMONの利点。
COMMONの欠点は、名前の並びがメモリー上の並びに対応するというモデルが、現代の計算機に適切でないため。
今のコンパイラは最適化を優先して変数を自由に並べ換えてる、64bitの切れ目の良い番地と単精度の32bitの切れ目が対応しないとか、
動的割付や分散メモリーの前にはCOMMONのモデルの前提は縛りがきつすぎて最適化が制限されてしまう。

大域変数として使う程度ならMODULEで十分。
833営利利用に関するLR審議中@詳細は自治スレへ:2012/04/06(金) 10:49:13.59
>>832
ありがとうございました。
いまから、コードのCOMMONをぜんぶMODULEに書き換えますw
834営利利用に関するLR審議中@詳細は自治スレへ:2012/04/06(金) 10:54:27.04
質問です。

LinuxにLAPACKを入れたのですが、コンパイル時にエラーが出てしまいます。
エラーの意味がよくわからないので
対処方法を教えてください。

]$ ifort -module sampleLAPACK.f90 ~/lib/lapack95.a ~/lib/liblapack.a ~/lib/librefblas.a
/ifortのあるディレクトリ/for_main.o:
In function `main':
/export/users/nbtester/x86linux_nightly/branch-12_0/20101117_010000/libdev/frtl/src/libfor/for_main.c:
(.text+0x50): undefined reference to `MAIN__'

コンパイラはifort
LAPACK-3.4.0とLAPACK95を入れ、
~/libに全て移動させました。

よろしくお願いします。
mainプログラムがないって言ってっぞ。

あとスレ上げんなよ。変なのが湧いてくるから。
>>835
すみませんでした、気をつけます。

ライブラリの使い方が全く分からないです。
とりあえず、サンプルコードに
use f95_LAPACK
call LA_GETRF(r,ipiv)
call LA_GETRI(r,ipiv)
という文を入れています。(あるサイトにあったサンプルそのままです)

ディレクトリに、*.aはちゃんと入っているので
LAPACKのインストールは成功しているともうのですが。
>$ ifort -module sampleLAPACK.f90 ~/lib/lapack95.a ~/lib/liblapack.a ~/lib/librefblas.a
-------------------↑
ここにスペースが足りねぇ、なんて落ちじゃないよな?
質問です。

サブルーチンのなかでサブルーチンを使うことは出来ますか?
(自分でやってみたところ、計算は出来たのですが
 バグとか起きたりしないですよね?)
>>838
出来るぞ!兄貴がサブを呼び、サブが子サブを呼んで、子サブが孫サブを呼んでもいいぞ!
>>839
知らないで、いちいちメインプログラムに書いてました!!
ありやす!!
>>834
MKLを使おう。
LAPACKも入ってる。
ライブラリの仕組みが分からないので、教えてください。

複数のオブジェクトファイルの集まりというところまでは
理解できたのですが
コンパイルしたときに、どうやって必要なファイルを抜き出すのですか?
例えば、メインプログラムに
call sub***
とか書いたら、ライブラリのなかにあるsub***を自動で検索してくれるのでしょうか?
LINKERが探してくれるので任せておけ。
844デフォルトの名無しさん:2012/04/13(金) 01:07:31.75
すみません、助けてください。

program main
implicit none
use variable !このなかにmmaxをパラメータ属性で定義している
real(8) :: phi(0:mmax)

call subA(phi)
call subB(phi)

end program main

subroutine subA
use variable
implicit none
double precision,intent(out) :: phi(0:mmax)
ここらへんでphiを計算して出力
end subroutine subA
subroutine subB
use variable
implicit none
double precision,intent(in) :: phi(0:mmax)
ここらへんでphiを使って他の量を計算
end subroutine subB

という感じのプログラムなんですが、
intent文をつけると、
この配列名はこのコンテキストでは無効です(error #6420)
と出てしまいます。
intent文を外すと、コンパイルできます。
ずっとここで悩んでいます。助けてください。
845デフォルトの名無しさん:2012/04/13(金) 01:08:19.41
半角でスペースしたので
字下げが反映されませんでした。見辛くてすみません。
846デフォルトの名無しさん:2012/04/13(金) 01:48:45.99
intentはサブルーチンの引数になってないと駄目だぞ。

subroutine subB(phi)

のようにな。


     イメージ画像
         ,,x-ー:: ":::::
サブ     ,x '"::::::::::::::::::::
      ,、'":::::::::::::,, x-‐ ァ:
    ,,x '"::::::,,、- '"     |:::
    `"i`ー'"        ヾ
      !  、 、,,,,,,,,,;;;;;;;;;彡ミ
     |,,,,ノi `ーヾ;; '"----、
     ヾ::ヽ     -┴'~
      ~|:/ ' ' ' `ー ' "'"
      /_
     l    '' )    i
      ヽ,,、'~`      U
       ゙, __ ,-、_,ノ`
 |/      ゙, `'" ,,y
 |//  彡  ゙、`-'"
   /|      i
            !    ,, -'"
    |     `ー '"|::
    |      /|||ヽ
          /|||||/心
          |ヾ/ /`ー
847デフォルトの名無しさん:2012/04/13(金) 01:58:14.86
>>846
基本的なサブルーチンの使い方が出来ていませんでした!
もっと早く聞けばよかった!ありがとうございました!
848デフォルトの名無しさん:2012/04/17(火) 19:37:19.69
Fortranスレがなぜか落ちてる・・・なぜだ?

こっちで質問させてください

module

real(8),parameter :: n = 500
type ADM
 real(8) :: a(0:n),b(0:n),c(0:n)
end type ADM

interface
 subroutine subini(phi,ADM_new)
  real(8),intent(in) :: phi(0:n)
  type(ADM),intent(out) :: ADM_new
 end subroutine subini
end interface

end module

interface文を付け加える前はコンパイルできていました
interface文を付け加えたところ、
宣言式オブジェクトは仮引数あるいは親子結合、参照結合によって
アクセス可能なオブジェクトでなければなりません。MMAX

この派生型名は宣言されていません。[ADM]

というエラーが出ます。
mmaxとADMはちゃんと上に宣言しているんですが
interface文のなかに書く必要がありますか?
mmaxとADMは共有されているはずなんですが・・・。
849デフォルトの名無しさん:2012/04/17(火) 22:31:47.35
>>848
まず、real(8),parameter :: n = 500 はintegerの間違いだろう。

さて本題だが、importをつければいくはず。
interface
 subroutine subini(phi,ADM_new)
   import
real(8)云々

説明は面倒なので、reference manual のimportの部分を呼んでくれ玉へ。
850デフォルトの名無しさん:2012/04/17(火) 23:21:19.78
980を超えて一定時間書き込みがないスレは落ちる。
気になるなら「即死判定」でググれ
851デフォルトの名無しさん:2012/04/18(水) 04:01:29.62
>>849
出来ました。ありがとうございます。
関連する質問をもう一つしてもよいですか?
メインプログラムと外部サブルーチンの引数の受け渡しが
安全に行われるために、
モジュールにinterface文を加えたのですが、
試しに、メインでreal(8)と宣言した引数を
サブルーチン側でinteger,intent(in)としてみたんです。
そしたら、コンパイル出来てしまったんですけど、
なぜなのでしょうか?interface文が役に立ってません・・・。

>>850
知りませんでした。ありがとうございます。
852デフォルトの名無しさん:2012/04/18(水) 08:34:10.82
>>851
MODULEに突っ込んだルーチンのインターフェースは自動で生成されるから基本的に必要ない。

細部によるから全面的に成り立つわけではないが。
とんでもなく非常識なことを指定なければ、INTERFACEが必要な状況は限られる。
853デフォルトの名無しさん:2012/04/18(水) 09:51:38.53
>>851
いい忘れたが、import命令はFortran2003のの命令なので、F95文法に厳格に従うなら原理主義に従うなら使えない。
その場合はTYPE宣言だけを独立したMODULEにして、そのMODULEをUSEしたMODULEで色々やる必要がある。
854デフォルトの名無しさん:2012/04/18(水) 10:09:10.56
>>852
モジュールのなかにサブルーチンは入ってません。
ファイル1=>メインプログラムとサブルーチン。
ただし、containsはしておらず、ただ同じテキストに書いているだけ。
ファイル2=>モジュール。グローバル変数の宣言、タイプ文の定義、
インターフェイス。
です。

Fortan2003でもOKです。
855デフォルトの名無しさん:2012/04/18(水) 12:43:10.69
>>854
悪いこと言わんからサブルーチンや関数はmoduleの中に入れとけ。
interfaceを書かなくて済むんだからこんなありがたいものはない。
856デフォルトの名無しさん:2012/04/19(木) 04:24:58.78
質問があります。
連番のファイル作るコードがありますよね。
たとえば
character(len=12) filename
...
do i=1,100...
write(filename,'(a,i4.4,a)') 'hoge',i,'.dat'
open(10,file=filename)...
write(10,*) ...
close(10)
end do

みたいな感じのやつです。
これを使うとき、
character(len=16) filename
do h=1,10 ...
do i=1,100...
write(filename,'(a,h4.4,i4.4,a)') 'hoge',h,i,'.dat'
open(10,file=filename)...
write(10,*) ...
close(10)
end do
enddo

という風に二重にはできないのでしょうか?
上のようにプログラムを書いたら正常に動きましたが、下に書いたようにプログラムを変更したらコンパイルはできたのですが、動かすと
startint: error in format  apparent state: internal I/O last format: (a,l2.2,i2.2,a)  lately writing sequential formatted internal IO  Aborted (コアダンプ)
とでてしまいます。
何か解決策はないでしょうか?
857デフォルトの名無しさん:2012/04/19(木) 09:44:57.14
>write(filename,'(a,h4.4,i4.4,a)') 'hoge',h,i,'.dat'

エラーメッセージにも書いてあるように h4.4 がおかしい。i4.4 (または i は二桁だから i2.2) にすればいいんでね?
858デフォルトの名無しさん:2012/04/21(土) 20:45:16.28
Windows 用の Fortran コンパイラの中で,実行ファイルの速度が
一番高いのはどれでしょうか? (‥‥なんか日本語変だな)

Absoft Pro Fortran 2012 なんかは,どうなんでしょう?
859デフォルトの名無しさん:2012/04/21(土) 22:25:30.52
>>858
速いのはインテルかPGIでないかな。文法に正格で厳しいのはNAG。
intel CPUならintelだろうが、AMD向けにコンパイラの最適化をやっていなかったとして公正取引委員会から叱られたからAMDの場合は微妙かも。
Absoftは元々はMacがメインだったという歴史的経緯もある。
IntelはDECのF95、AbsoftはCrayのF90フロントエンドを使っていたのでそういう因縁があればそれで選ぶのもよいかも。Laheyは富士通。
とはいえもう10年ぐらい前の話か。
860858:2012/04/21(土) 22:31:03.30
>>859
早速の詳しいお答え,ありがとうございました m(_ _)m
861デフォルトの名無しさん:2012/04/22(日) 12:46:26.21
parameter ではなくて、実行文中で一度値を代入したら
以降は値を変えられないような型はありますか?
862デフォルトの名無しさん:2012/04/22(日) 15:35:21.79
MODULE変数にPROTECTED属性をつければ、MUDULE内部ルーチンからなら変えられるが、外部からは変えられない。
参考
http://www.nag-j.co.jp/fortran/fortran2003/Fortran2003_4_3.html
863デフォルトの名無しさん:2012/04/24(火) 00:05:18.04
ありがとうございます
864デフォルトの名無しさん:2012/04/24(火) 22:35:39.99
1/2,1/3,1/4・・・を順に加えていって、何個加えたら10を超えるか調べるプログラム
DO WHILE文を用いる
ぜんぜんわからないのでよろしくお願いします
865デフォルトの名無しさん:2012/04/24(火) 23:13:38.99
iの初期値=1
jの初期値は0(整数型だと間違いなので注意)
@
i=i+1
j=j+(1/i)
j=<10でループアウト
j条件にならないなら@にもどる。
i-1回だよ
866デフォルトの名無しさん:2012/04/24(火) 23:31:00.10
program nichan
implicit none
real :: x
integer :: i
i = 0
x = 0.0
do while (x < 10.0)
i = i + 1
x = x + 1.0 / REAL(i)
end do
print *, i, x
stop
end program nichan

オイラー常数を考えると、Σ1/i 〜 ln N + 0.577 >10 , ln N 〜 9.423, exp(9.423) =12369.6
プログラムを実行すると 12,367
867デフォルトの名無しさん:2012/04/24(火) 23:34:26.79
ホストをIntelに既定せずにOpenCLなどでGPGPUにすればPCレベルでも演算は速いよ。
安物でもTflopでるよ。
安物の場合は計算が正しいか事前チェック要

最適解を求めるなら最適解の値とその前の値を保存すれば
その値を使い結果を普通に検算すればいい。
フィルタの最適化などなら十分使える。

コンパイルが適切で計算式が適切でも結果が正しいとは限らない事があるので検算は大切。
868デフォルトの名無しさん:2012/04/24(火) 23:36:35.80
設問に1/1は入っていないのだが
869デフォルトの名無しさん:2012/04/24(火) 23:58:21.64
答えをそのまま書いては学習にならんだろう
870デフォルトの名無しさん:2012/04/25(水) 23:27:40.03
FortranとOpenCLの組み合わせの場合も、やっぱGPU側に送るルーチンは特殊なCで書くのか?
871デフォルトの名無しさん:2012/04/26(木) 01:55:24.39
整数Nを読み込み、1+1/1!+1/2!+1/3!+・・・+1/n!の値を計算して出力するプログラム
このプログラムを級数の項数Nを入力するかわりに、DO WHILE文を用いて級数の項の大きさが10**(-4)以下になったとき、級数の和の計算を止めるプログラムに書き換える
さらに、結果の出力として
       1)収束した時の項番N
       2)級数の和S
       3)級数の和SとEXP(1.0)との差
を表示する

夜遅くにすいません。よろしくお願いします
872デフォルトの名無しさん:2012/04/28(土) 01:10:24.07
宿題スレなのか?

n = 1
s = 1
x = 1
do while (log10(x) < 4.0D)
 ! 階乗の逆数を s に足し込み
 ! n と x を更新
end do
! 結果出力
873お願いします:2012/04/30(月) 19:21:28.96
fortranについて

2次元配列において(1000,1000)このデータのうち(200:300、100:400)だけ取り出しました。
このときwrite文で書きだす時、取り出したデータだけでなく、配列の個数自体とりだしたいのですがどうすれば
よろしいでしょう?
たとえば
結果が
200 100 10.4←これは配列の中身のデータ
201 100 2.0
202 100 4.8
203 100 5.7



200 101 5.6
201 101 7,9
202 101 7,9
203 101 8,0



200 102 6.8
201 102 15.9
202 102 26.1



298 400 2.2
299 400 3.2
300 400 3.6
このような感じです。よろしくお願いし
874デフォルトの名無しさん:2012/04/30(月) 19:40:00.17
質問の意味がよく分からんが、取り出した部分の総要素数という事なら、COUNT命令でおk?
COUNT( x(200:300, 100:400) )
875デフォルトの名無しさん:2012/05/03(木) 21:48:11.69
初期値X(0)=1としてK=1,2,3・・・の順にX(K)=cos(X(K-1))を繰り返して、|X(K)-X(K-1)|<0.00001になったら反復を打ち切り、
1)反復回数K、2)Xの近似解、3)近似解の誤差を出力するプログラム。DO WHILE文を用いる
876デフォルトの名無しさん:2012/05/03(木) 22:09:42.36
簡単過ぎる。もっと難しいの持って来い。
877デフォルトの名無しさん:2012/05/04(金) 00:01:35.98
基礎演習の宿題なんでお願いします
878デフォルトの名無しさん:2012/05/04(金) 10:11:32.40
program twochannel
implicit none
real :: x
integer :: k
k = 0
x = 1.0
do while ( abs(cos(x) - x) >= 0.00001 )
k = k + 1
x = cos(x)
end do
print *, 'number of iterations', k, ' root', x, ' error', abs(x - cos(x))
stop
end program twochannel
879デフォルトの名無しさん:2012/05/08(火) 11:36:16.14
もう一つあったFortran スレ落ちたねw
880デフォルトの名無しさん:2012/05/09(水) 01:30:31.73
二次探索法のアルゴリズムに従って、解の存在範囲の上限XRと下限XRの初期値を入力し
f(x)=x-cos(x)=0の解を繰り返し処理(DO WHILE)で求め、
1)近似解、2)繰り返し計算の回数、3)方程式f(x)の誤差を表示するプログラム(収束の許容精度EPSは10の-5乗)
881デフォルトの名無しさん:2012/05/09(水) 01:36:39.70
二分探索法だろ、問題分もまともに写せないのかよ。小学校からやり直せ!
882デフォルトの名無しさん:2012/05/09(水) 01:57:45.71
適当に問題文を書き写して末尾に「プログラム。」と書くと
頼まなくても答を書いてくれるプログラム。
883デフォルトの名無しさん:2012/05/09(水) 02:16:52.55
教員側もこのスレ見てたりして
884デフォルトの名無しさん:2012/05/09(水) 02:20:11.69
答え書いてとお願いしているわけではないからセーフ。
885デフォルトの名無しさん:2012/05/09(水) 13:45:54.29
答えもらって丸写ししたら
カンニングと同じなんだけど
底辺大学あたりだと
「人に聞いた」事が評価されるからなぁ
886デフォルトの名無しさん:2012/05/09(水) 19:04:29.06
>>883
見ているw
887デフォルトの名無しさん:2012/05/09(水) 23:58:47.57
program twochan
implicit none
real, parameter :: eps = 1.0e-5
real :: x, xroof, xfloor, xr, xf
integer :: i
1 print *, 'input lower and upper range of x'
read *, xfloor, xroof
if ( f(xfloor) * f(xroof) > 0.0 ) then
print *, 'inappropriate inputs! '
goto 1
end if
xf = xfloor
xr = xroof
x = 0.5 * (xf + xr)
i = 0
do while ( abs( f(x) ) > eps )
i = i + 1
if ( f(x) * f(xr) > 0.0 ) then
xr = x
else
xf = x
end if
x = 0.5 * (xf + xr)
end do
print *, 'a root of equation x - cos(x) = 0 ', x, ' no. of iterations =', i, ' absolute difference ', abs(f(x))
stop
contains
real function f(x)
real, intent(in) :: x
f = x - cos(x)
end function f
end program twochan
888デフォルトの名無しさん:2012/05/10(木) 00:01:01.37
入力例
input lower and upper range of x
0.5 0.7
inappropriate inputs!
input lower and upper range of x
0.5 0.8
a root of equation x - cos(x) = 0 0.7390808
no. of iterations = 13
absolute difference 7.1525574E-06
続行するには何かキーを押してください . . .

先生! おれ DO WHILE 嫌いなんで、条件緩めて下さいw IF () EXIT ; END DO の REPEAT UNTIL 派なんです。
889ザリガニ料理人:2012/05/10(木) 14:06:47.28
マックで自動並列したいのですがどうすればいいですか?
コンパイラはgfortranです
890デフォルトの名無しさん:2012/05/10(木) 22:57:34.18
gfortranって自動並列化は無かった気がするから、ちまちまOpenMPのディレクティブを入れるしか無いんでね?
coArrayが実装されたようだからそれを使ってみるてもあるが、いずれにせよGNUでは性能は期待できない。
891ザリガニ料理人:2012/05/10(木) 23:42:46.96
かたじけない!
892デフォルトの名無しさん:2012/05/11(金) 14:47:47.00
最近はマルチコアなcpuがノートでも
普通にあるから、OpenMP があるのは
助かるよね。
893デフォルトの名無しさん:2012/05/11(金) 19:38:07.24
プリプロセッサーの質問です。
#ifdef debug, #endif
というのを使っているのですが、
fppでコンパイルしたときは問題ないのですけれども、
普通にコンパイルすると
「プリプロセッサー行が正しくありません」と出ます。
本来なら、囲ったところをコメントアウトしてくれるはずなのですが。

コンパイラはifortで、ちゃんとその機能はもっているはずです。
894デフォルトの名無しさん:2012/05/11(金) 23:23:22.33
よく知らんが、fppがプリプロセッサなんだからifortだけで駄目なんじゃ?
895デフォルトの名無しさん:2012/05/12(土) 01:46:47.28
-fpp は必須。
896デフォルトの名無しさん:2012/05/12(土) 20:09:13.36
>>894>>895
fppをつけたら無事できました。
ありがとうございました。

このページには、
http://www.rivhiro-weather.com/blog/index.php?viewModule=Blog&viewCenterPage=Entry.php&userID=rivhiro&entryID=4a10c109cf1e0
>ifort test.f90
>とコンパイルすると、
>#ifdef debug 〜 #endif の間はコンパイラによって無視される。

と書いてあるんですが、間違いですかね?
あと、Emacsがプリプロセッサ文を色分けしないので
気持ち悪いです。
897デフォルトの名無しさん:2012/05/13(日) 01:49:32.44
ifort ならインテル本家にくどいくらい丁寧な
オンライン・マニュアルがあるよ。英語だけど。
898デフォルトの名無しさん:2012/05/24(木) 15:33:29.05
見つからないバグがあります。

do i = 1, N
call sub(XXX,YYY)
enddo

のようなループでサブルーチンを呼び出しています。
XXXは構造体で、intent(out)属性をつけています。
YYYも構造体で、intent(in)です。
YYYを読み込んで、XXXを吐きだすサブルーチンです。
最初、XXXはゼロで、サブルーチンから出力されると値が入ります。
それで、二回目のループに入るんですが、
そうすると、出力されるXXXがゼロになってしまいます。
なぜこのようになるのか、わかりません。
教えてください。よろしくお願いします。
899デフォルトの名無しさん:2012/05/24(木) 15:51:19.34
XXX がintent(out) でコンパイルが通ったということは、
YYY の値が変更されない限り
XXX は何度目の n でも同じ値になりそう・・。
なんか根本的にコードの構造を間違ってない?

自分なら
YYY の値が狂った、
引数に出てこない module common 渡しの変数が狂った
可能性を取り敢えず、疑って見るが。
900デフォルトの名無しさん:2012/05/24(木) 15:58:01.96
>>890
>coArrayが実装されたようだから

CoArray 使った事ある人いたら
OpenMP MPI との比較とか
パフォーマンスとか、
感想聞かせて
901デフォルトの名無しさん:2012/05/24(木) 22:55:04.67
intent(out) でいいんだな? intent(in out)のつもりじゃないよな。

サブルーチンはPUREなのか?それともSAVE的なものがあるのか?
PUREならYYYにしか依存しないから、YYYを確かめるべし。
そうでなくて、状態依存、ヒステリシスを持つルーチンならそれ絡みの変数をみるしかない。
902デフォルトの名無しさん:2012/05/25(金) 03:16:23.21
>>899>>901
他の場所の単純なバグでした
失礼しました。
903デフォルトの名無しさん:2012/05/25(金) 09:30:28.37
www
また来いよ
904デフォルトの名無しさん:2012/05/30(水) 00:13:00.57
fortranで計算した結果を.aviで出力することは可能ですか???
905デフォルトの名無しさん:2012/05/30(水) 00:39:01.19
原理的・技術的に可能かという意味でなら、可能。
実際に出来るかという意味では、そういうライブラリがあればできるが、あるかどうか分からん。gif動画にするのなら見たことある。
906 【豚】 :2012/06/01(金) 09:36:56.58
pgplot だっけ・・・名前忘れたけど
fortran で書かれたコードで gif を出力する作図パッケージはあったな。
gif に変換する部分まで fortran なのかはしらないけど。
ppm とか書式が簡単なやつで吐き出して、そのあと
変換ソフトで avi 化するとか、が無難かなぁ。
907デフォルトの名無しさん:2012/06/03(日) 20:22:38.29
どういうデータを計算しているのかにもよるけど、
ParaViewやVisItみたいなフリーの可視化ツールで動画作成するのもあり。
どちらも、aviフォーマットで動画を保存できたはず。
908デフォルトの名無しさん:2012/06/12(火) 09:03:11.70
すみません、課題がわからないので質問させていただきます。
FORTRANは全くの素人で最近やり始めた形です。
課題でメルセンヌツイスタで生成した乱数を使って計算を行う課題があるのですがちんぷんかんぷんです。
乱数生成はhttp://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/FORTRAN/fortran.html
上のページのmt19937.fを使います。

たとえば、乱数X1,X2を生成して足し合わせるといったプログラムを作るとしたらどのようにすればようのでしょうか?
これを読めばいい、などでもよいので何か手がかりをいただけないでしょうか?
909デフォルトの名無しさん:2012/06/12(火) 11:52:11.44
>>908
mt19937.fはメインプログラム付きのサンプルじゃん。それを読むのが一番だべさ。
910デフォルトの名無しさん:2012/06/12(火) 12:49:23.73
>>908
X1,X2が何を意図するのかわからんけど、
sgrndで乱数種設定して、grndで乱数生成。
そのページはメルセンヌツイスタを考案した人のところだから、
メルセンヌツイスタ自体を知りたいならそこ読んどけ。
加算の仕方が分からんとかいうなら手元の教科書見とけ。
911デフォルトの名無しさん:2012/06/22(金) 16:35:02.48
f951: error: unrecognized command line option "-finit-local-zero"

っていうエラーがコンパイル時に出るんですが、
どなたか原因が分かりそうな方はいらっしゃいますか?
912デフォルトの名無しさん:2012/06/22(金) 22:50:01.87
コマンドラインのオプションが無効なんだから、それを消せ!
913デフォルトの名無しさん:2012/06/22(金) 22:57:31.95
>>912
このオプションは使いたいんですが、どうしても無理なのでしょうか?
914デフォルトの名無しさん:2012/06/22(金) 23:09:27.12
ぐぐってみたが、それはg77のオプションで、gfortranでは別の名前に成っている。
gfortranのマニュアル嫁。
915デフォルトの名無しさん:2012/06/23(土) 07:24:50.93
朝鮮半島海域の貝類からプルトニウム

検出された放射能物質プルトニウムの濃縮係数は、国際原子力機構(IAEA)が
定める勧告値より最大2.11倍高かった。複数の韓国メディアが伝えた。

  濃縮係数は、海水中の放射性物質が、貝や海藻など生物に取り込まれ蓄積された
濃度を示す。貝類から検出されたプルトニウム濃縮係数の平均値は2813で、
IAEAの勧告値<3000>を下回ったが、江陵近海で採取した貝は6341に達した。

海草類からは放射性物質ストロンチウム90が検出された。濃縮係数の平均値は14でIAEAの
勧告値<10>よりも高く、江陵近海のわかめは17、仁川近海のわかめは10だった。
2005―09年の平均値も15で勧告値を超えていた。
朝鮮半島の周辺海域20カ所で採取した表層海水からは、プルトニウム239・240が検出され、
平均濃度は1キログラムあたり2.91―6.82マイクロベクレルだった。


韓国ソウルの道路は毎時3マイクロシーベルト 福 島 緊 急 避 難 区 域 よ り 上
http://blog-imgs-49-origin.fc2.com/f/x/y/fxya/wwwdotuporg2243941.jpg

韓国の量販店の食器から毎時23マイクロシーベルト
http://keyframe.imnews.imbc.com/today/2012/01/17/2/Large_3425047.jpg

K-POPでチケット詐欺発生か? 突如ライブ中止&代金返還不可 (´・ω・`)
http://long.2chan.tv/jlab-long/10/s/long289597.jpg


韓国食品の危険性 ネット販売のキムチから幼虫とカエル
http://www.nicovideo.jp/watch/sm16732021
不衛生すぎる韓国のキムチ工場 冷蔵庫にはウジ虫・・
http://www.nicovideo.jp/watch/sm16731897
韓国産キムチの日本向け輸出衛生検査が免除<`∀´>
http://www.nicovideo.jp/watch/sm14634923
916デフォルトの名無しさん:2012/06/23(土) 10:43:56.84
>>915
ν速で一生やってろ。出てくるなヴォケ
917デフォルトの名無しさん:2012/06/23(土) 11:02:13.36
チョンは出ていけ。スレからも日本からも。
918デフォルトの名無しさん:2012/06/23(土) 12:36:31.41
>>914
もう少し状況を詳しく説明しますと、

コンパイラがg77のときは正常にコンパイルできるのですが、
コンパイラをmpif77に変更するとそのエラーが出るようになります。

しかも同様のこと(コンパイラの変更)を別のPCでやってもエラーは出ないのです。
一体どういうことなのでしょうか。
919デフォルトの名無しさん:2012/06/23(土) 13:39:55.14
mpif77はコンパイラドライバなので、色々なコンパイラが呼び出せる。
デフォルトはg77のようだがそのPCではg77以外のコンパイラが指定されているのだろう。
mpif77 の MAN ないし設定を調べて味噌。
920デフォルトの名無しさん:2012/07/08(日) 13:25:36.12
質問です
いま、ファイルを分類しフォルダへ仕分けるプログラムを書こうとしているのですが、ファイルをフォルダへ移すコマンドがわかりません

例えば、ファイル1をreadで読み込んで、中身のテキストが1ならばフォルダ1へ、中身のテキストが2ならフォルダ2へそのファイルを移す、というようなプログラムを書きたいのです
判定分はif分で書いてあります
判定した結果、フォルダへ移すコマンドを知らない上に手持ちの教科書には記述がないので困っています
ヒントでも良いのでどなたか教えてください
921デフォルトの名無しさん:2012/07/08(日) 15:17:12.59
そういう命令は規格にはない。Fortranが出来た頃のファイルシステムには、フォルダ・ディレクトリの概念は無かったから。
それをやろうとするなら、ベンダー拡張の命令を使う必要があるので、使っているコンパイラのマニュアルの付録のあたりを調べるしか無い。
たぶん system とかそんな名前だと思う。
ちなみに Fortran2008 では、execute_command_line というサブルーチンが用意されたのでそれを使える。

ただ一般的にはFortranでやるよりスクリプト系の言語でやれと言われるだろう。
風に逆らう赤いトラクターのごとく頑張れw
922920:2012/07/08(日) 20:09:04.99
>>921

ありがとうございます
道理で本とかにもそういう記述がないわけだww

数値計算結果が膨大なんで軽い気持ちでやりだしたのにこれは手強そうですね
なんとも初心者には荷が重い
923デフォルトの名無しさん:2012/07/08(日) 20:19:24.31
いわゆるファイラーみたいなことは面倒だろうが
別の場所にファイルを作れば分類だけはできるでしょ
924デフォルトの名無しさん:2012/07/08(日) 21:04:47.68
Fortranはバッチで動かすのが本命で、バッチファイルでファイル位置とかを指定するのが普通だから
機種互換性のないI/O絡みの機能は充実してないのよ。

最近はワード長-OS-文字コード-数値フォーマットが、8bitの倍数-UNIX-ASCII-IEEE754で統一されたが、
昔はベンダー毎にOSどころか、ワード長、文字コードに数値フォーマットまでまちまちで、それらに依存しない部分が
規格になってたから仕方ないね。
925920:2012/07/09(月) 00:24:40.38
>>923,924
いろいろありがとうございます。

詳しい計算結果内容には言及できないんですけど元から別の場所にファイルを作って分類ってのが無理なんですよね(^^;)
なので、あとからファイルの内容読み込んで判定後フォルダ分けするプログラムを作りたかったんです。
ほかにやりようがないか考えてみます。
926デフォルトの名無しさん:2012/07/09(月) 00:43:48.59
OSがUNIX系だと、OPEN文でフルパスで書けばいけたような気がする。
POSIX互換のルーチンが用意されていることが多いから、それでいけるんじゃないかい?
927920:2012/07/09(月) 01:20:31.43
>>926
OSはWINDOWSでcygwin使ってます。
いちおできるかどうか試してみます。
わざわざありがとうございます
928デフォルトの名無しさん:2012/07/11(水) 03:35:05.48
ファイルをOPENする際にファイルの名前をdo loopのループ回数と同期させたうえで相対パスで別のフォルダに保存したいんですがやり方がわかりません。
ファイル名に番号振るだけならこのサイトttp://www.str.ce.akita-u.ac.jp/cgi-bin/gwiki/wiki.cgi?fortran%A5%E1%A5%E2#i14の手順でできたんですが、相対パスを使う場合どう書けばいいのか全く分からないのでわかる方がいたら教えてください
929デフォルトの名無しさん:2012/07/11(水) 08:59:35.43
program nichan
implicit none
character (len = 80) :: buff
integer :: i
do i = 1, 5
write(buff, '(a, i2.2)') '..\tests2\io\file_', i
print *, trim(buff)
open(9, file = trim(buff), status = 'unknown')
write(9, *) 'heart catch precure', i
close(9)
end do
stop
end program nichan
930デフォルトの名無しさん:2012/07/11(水) 09:05:41.75
ディレクトリを変えるのは以下。ただし、ディレクトリは予め存在していないといけない。
dir_01,dir_02,dir_03 の下に、file_001, file002, file_003 ができあがる。

program nichan
implicit none
character (len = 80) :: buff
integer :: i
do i = 1, 3
write(buff, '(a, i2.2, a, i3.3)') '..\tests2\dir_', i,'\file_', i
print *, trim(buff)
open(9, file = trim(buff), status = 'unknown')
write(9, *) 'heart catch precure', i
close(9)
end do
stop
end program nichan

出力
..\tests2\dir_01\file_001
..\tests2\dir_02\file_002
..\tests2\dir_03\file_003
続行するには何かキーを押してください . . .
931デフォルトの名無しさん:2012/07/12(木) 01:11:47.57
Intel Fortran の POSIX 互換ルーチンでディレクトリを作りながらファイル出力例
実行しているのはWindowsだがw アクセス制御はWindowsでは無意味。飾りですよ。

program nichan
use ifposix
implicit none
character(len = 72) :: path, fn
integer :: i, iaccess, ierr
do i = 1, 5
write(path, '(a, i2.2)') '.\shicko_', i
iaccess = o'777'
call pxfmkdir(trim(path), len_trim(path), iaccess, ierr)
write(fn, '(a, i3.3)') '\shonven_', i
open(9, file = trim(path)//trim(fn), status = 'unknown')
write(9, *) 'Senator Glodwater ', i
close(9)
end do
stop
end program nichan
932デフォルトの名無しさん:2012/07/15(日) 16:56:52.09
doループ内の配列名をループ回数と同期させたいんですが、可能ですか?

do i=1,100
do j=1,10
A1(i) = 0
enddo
enddo

ここでA1ってのをdo j=1,10のループの回数に合わせて、A2、A3・・・とする感じです。
わかりづらくてすいません
933デフォルトの名無しさん:2012/07/15(日) 17:14:55.76
無理じゃね?
934デフォルトの名無しさん:2012/07/15(日) 17:34:50.00
配列変数で充分だと思うけど、何か理由があって?
935デフォルトの名無しさん:2012/07/15(日) 17:55:04.17
既存のプログラムで配列A1を対象にした奴があって、
それをA2、A3・・・みたいな感じで使いたいのでそれができたら便利だなあと・・・

聞いた感じ無理っぽいんでプログラムコピーしてそれぞれ作ります
ありがとうございました
936デフォルトの名無しさん:2012/07/16(月) 05:12:38.99
コピーしたものを副プログラムとして使うなら、
そのなかで変数名を変えなくても済むとだろうけど、
他人のコードを「すこし変更して」使うのは諸刃だから
慎重にね。ぐっどらっく
937uy:2012/07/22(日) 22:21:37.99
> > コピーしたものを副プログラムとして使うなら、
> そのなかで変数名を変えなくても済むとだろうけど、
> > 他人のコードを「すこし変更して」使うのは諸刃だから
>v 慎重にね。ぐっどらっく
> 慎重にね。ぐっどらっく
> 慎重にね。ぐっどらっく
> 慎重にね。ぐっどらっく







きめえ
938デフォルトの名無しさん:2012/07/23(月) 22:34:21.31
コピペもままならない生き物が
人様を気持ち悪がってもなぁ・・・
939デフォルトの名無しさん:2012/07/23(月) 23:43:05.91
相手すな
940デフォルトの名無しさん:2012/07/26(木) 09:12:14.64
941デフォルトの名無しさん:2012/07/27(金) 04:14:51.02
Fortress死亡確認 AA(ry

chapel lX10 はダラダラ生きて、陣営を分裂させたままにして欲しいww 
942デフォルトの名無しさん:2012/08/06(月) 13:15:26.41
ガウスの消去法(連立方程式の解を解く方)の中に部分ピボット選択入れたいんだけど仕方がわからないので教えてください
入れるならこの中だと思うんですがどう入れればいいんですか?

DO I=1,N-1
DO J=I+1,N
DO K=I+1,N
A(J,K)=A(J,K)-A(J,I)*A(I,K)/A(I,I)
END DO
B(J)=B(J)-B(I)*A(J,I)/A(I,I)
END DO
END DO
943デフォルトの名無しさん:2012/08/07(火) 00:02:40.32
割る数 A(I,I) が 0 または 0 っぽいと困るからピボット選択するんだろう
したがって I のループで J が動く前に入れるべし
944デフォルトの名無しさん:2012/08/08(水) 04:00:34.06
>>943
ありがとうございます。
でも次はピボット選択の仕方がわからない...お恥ずかしい
ネットで探しても詳しい説明が書いてないんですが出来れば上の式に入れた形で教えてもらえないでしょうか?
945944:2012/08/08(水) 06:29:10.41
自己解決しました。
ありがとうございました。
946デフォルトの名無しさん:2012/08/11(土) 19:59:21.32

質問です。メモ帳のデータをfortranで読み込んだ後、指定したデータを掛け算し、
その合計値を算出したいいのですが、どのようにプログラミングしたらいいでしょうか?

depth 0, 5 cm P, S, P+S
1 .000E+00 .121E+06 .121E+06 .000E+00 .859E+06 .859E+06
2 .320E+02 .325E+06 .325E+06 .170E+02 .798E+06 .798E+06
3 .300E+01 .671E+06 .671E+06 .100E+01 .116E+07 .116E+07
4 .247E+05 .173E+07 .175E+07 .120E+05 .160E+07 .161E+07
5 .440E+06 .151E+07 .195E+07 .229E+06 .152E+07 .175E+07
6 .146E+07 .474E+06 .194E+07 .793E+06 .899E+06 .169E+07
7 .253E+07 .124E+06 .266E+07 .143E+07 .763E+06 .219E+07
8 .329E+07 .280E+05 .332E+07 .191E+07 .757E+06 .267E+07
9 .373E+07 .526E+04 .373E+07 .222E+07 .753E+06 .297E+07
10 .391E+07 .315E+04 .392E+07 .239E+07 .732E+06 .312E+07
11 .394E+07 .516E+05 .399E+07 .245E+07 .772E+06 .322E+07
12 .387E+07 .910E+02 .387E+07 .245E+07 .636E+06 .309E+07
13 .375E+07 .480E+02 .375E+07 .242E+07 .583E+06 .300E+07

 ↓
 ↓
 400 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00

上記のデータの説明をさせていただきます。深さ0cmと5cmのそれぞれにP,S,P+Sという3種類のデータ
が存在し、まず、5cmのP+Sのデータを縦に読み込み、X=1〜400とおいて各数字をX*50-25と変更した後、
5cmのP+Sの行と対応した「1〜400の変更した値」で順番に掛けてその合計を計算するようにプログラミング
したいのですが、うまくできず、困っています。
(5cmのP+Sのデータは、左から数えて7番目のデータです。.859E+06から始まる行になります。)

具体的には、1〜400までの数字をそれぞれ1の場合、(1×50-25)×.859E+06という計算を縦に行っていき、
(400×50-25)×.000E+00まで計算し、その合計値を算出できるようにプログラミングしたいと考えています。
947946:2012/08/11(土) 20:01:39.94
sage忘れてました、すみません。よろしくお願いします。
948デフォルトの名無しさん:2012/08/12(日) 22:10:20.34
f90でいいのかね? テキトーだが。

program test
implicit none
integer, parameter :: nmax = 400
real :: depth(2), p(nmax, 2), s(nmax, 2), ps(nmax, 2), tmp(nmax), res
character (len = 5) :: dummy
integer :: i, k, n, io
open(10, file = 'fort.10', status = 'old')
read(10, *) dummy, depth(1), depth(2)
do i = 1, nmax
read(10, *, iostat = io) k, p(i, 1), s(i, 1), ps(i, 1), p(i, 2), s(i, 2), ps(i, 2)
if (io == -1) exit
if (i /= k) print *, ' input error! check input file!'
end do
print *, 'number of data =', i
n = i
forall (i = 1:n) tmp(i) = (50 * i - 25) * ps(i, 2)
res = sum(tmp)
print *, 'result =', res
stop
end program test
949デフォルトの名無しさん:2012/08/13(月) 16:18:58.05
エラーチェックなぞしなければ・・・
program test
implicit none
integer, parameter :: nmax = 13 ! 400
real :: x(6), s, t
integer :: i, k
s = 0.0
read(10, *)
do i = 1, nmax
read(10, *) k, x
s = s + (k * 50.0 - 25.0) * x(6)
end do
print *, 'sum =', s
stop
end program test
950946:2012/08/14(火) 15:27:57.34
>>948>>949
返信遅れてすみません。ありがとうございます。自分はプログラミング
初心者で、ある時突然fortranを使ってプログラミングをしなければ
ならなくなり、途方に暮れていました。本当に感謝しています。
あとすみません。>>946に書いたメモ帳のデータですが、全部のデータを読み込む
場合どういう命令文にしたらいいでしょうか?







951946:2012/08/14(火) 15:36:07.03
いらない列1
いらない列2
いらない列3
いらない列4
いらない列5
いらない列6
1 .000E+00 .121E+06 .121E+06 .000E+00 .859E+06 .859E+06 .000E+00 .128E+07 .128E+07 .000E+00 .135E+07 .135E+07 .000E+00 .115E+07 .115E+07 .000E+00 .703E+06 .703E+06

読み込みたいデータは1〜19行あり、これらすべてを読み込み、上からいらない列1〜6を読み込まないようにプログラミングしたい
のですが、どのようにプログラムしたらいいでしょうか
952デフォルトの名無しさん:2012/08/14(火) 16:19:41.14
read(10, *) dummy
read(10, *) dummy
read(10, *) dummy
read(10, *) dummy
read(10, *) dummy
read(10, *) 読み込む数字の数だけ変数を並べて
953デフォルトの名無しさん:2012/08/14(火) 16:20:24.58
read(10, *) dummy
が1列少なかったゴメン
954デフォルトの名無しさん:2012/08/14(火) 17:47:33.25
>>952>>953
迅速な対応ありがとうございます。951の説明で行→列と列→行の間違いです。
すみませんでした。表記の仕方ですが、以下のようにopen,readを行えば、
一つのエクセルデータファイルを一部読み飛ばしてすべて読み込めますか?


real :: v(1,18)s,x1,x2,x3,y1,y2,y3 !x1〜x3はエクセルデータ
integer :: i,idum

open(1,file='input1,tet')
read(1, *) dummy
read(1, *) dummy
read(1, *) dummy
read(1, *) dummy
read(1, *) dummy
read(1, *) dummy
read(*,*)((a2(j,k),j=1,18),k=7,406)!入力データが400あるので。
955954:2012/08/14(火) 17:48:11.13
再びsageわすれました。すみません。
956デフォルトの名無しさん:2012/08/14(火) 18:09:26.25
do i = 1, 6
read(1, *) ! 空でいい
end do
do i = 1, 400
read(1, *) (a2(j, k), j = 1, 18)
end do

こう書くと read(*,*)((a2(j,k),j=1,18),k=7,406) 本来的には1行の連続したデータを読むことになったと思う。
957954:2012/08/14(火) 18:47:50.55
>>956
ご指摘ありがとうございます。以下で実行してみたのですが、
4,8行目でエラーが出ちゃいました(泣)なんででしょうか・・・
 
program
   implicit none
character*80 cdum
real :: v(1,18)s,x1,x2,x3,y1,y2,y3
integer :: i,idum
   open(1,file='input1,txt')
   do i = 1, 6
read(1, *)
end do
do i = 1, 400
read(1, *) (a2(j, k), j = 1, 18)
end do
open(2,file='input2,txt')
read(2,'(a)') cdum
open(3,file='input3,txt')
read(3,'(a)') cdum
以下計算式
958デフォルトの名無しさん:2012/08/14(火) 19:01:18.05
>>957
変数kは宣言されていないよ

あるいは
read(1,*)a2(1:18,1:400)
みたいにできなかったっけ
959デフォルトの名無しさん:2012/08/14(火) 19:15:02.21
4行目
real :: v(1,18)s,x1,x2,x3,y1,y2,y3
       ↑
sの前にコンマが抜けている。

8行目はエラー無い。

画面に表示されたエラーメッセージをコピペして聞くのが早い。
960954:2012/08/14(火) 19:23:32.24
>>958
両方試してみたんですが、だめでした。申し訳ない。

>>959
v(1,18)s自体消して958さんに習った通り実行してみたんですが、
エラーが出ちゃいました。以下にエラーメッセージを添付します。
よろしくお願いします。

for(4): error FOR3852: syntax error detected between ) and S
for(8): error FOR3852: syntax error detected between ( and *


961デフォルトの名無しさん:2012/08/14(火) 19:48:55.44
ファイル名もカンマになってるけどいいのか?
962デフォルトの名無しさん:2012/08/14(火) 20:27:01.08
8行目はエラー出るわけないので、ホンモノのプログラムを10行目くらいまで貼れや。
もしくは全角のスペースとかが入っていて文句を言われているのかもしれない。
963954:2012/08/14(火) 20:29:09.04
自分の作りたいプログラムの内容を載せさせてください。連投になってしまいますが、すみませんお許しください。

メモ帳のデータで読み込みたいデータが1〜18列あり、メモ帳内のデータすべてを読み込み、上から「いらない行1〜6」を読み飛ばすようにプログラミングし、
1〜18列の中の任意の列のみを計算に組み込ませたいと考えています。(一度の計算処理で3列目のみとか6列目のみ指定して計算させたいです。)

いらない行1
いらない行2
いらない行3
いらない行4
いらない行5
いらない行6
1 .000E+00 .121E+06→→→.115E+07 .000E+00 .703E+06 .703E+06(18列)



(全部で400行のデータが存在します。)

さらに以下のエクセルデータx,yを読み込んで合計値を算出、除算を行いたいと考えています。
 エクセルデータxを組み込んだ計算式:sx=s+(real(i)*50.0-25.0)*?*x3
 エクセルデータyを組み込んだ計算式:sy=s+(real(i)*50.0-25.0)*?*y3
(x3,y3は上記エクセルデータの左から3行目のデータを読み込ませているつもりです。)
(?にはメモ帳の1〜18列を任意で選択できるようにプログラムしたいです。)
を作ってこれら二つを除算し、その結果を記録していくようにプログラムしたいと考えています。
プログラミングでいうと、下記エクセルデータの各行にx1,x2,x3,y1,y2,y3と名前を付け、x3,y3のみ読み込んで
計算過程に組み込ませたいです。
964954:2012/08/14(火) 20:29:57.59
エクセルデータx
2.50E+01 5.31E-01 2.75E-01
5.00E+01 2.27E-01 4.22E-02
 ↓       ↓       ↓
(x1 x2 x3)
(1〜400個まで存在します。)
-------------------------------------------
エクセルデータy
2.50E+01 5.04E-01 2.70E-01
5.00E+01 2.08E-01 4.10E-02
 ↓       ↓       ↓
(y1 y2 y3)
(こちらも1〜400個まで存在します。)

sx=0.0
sy=0.0
do i=1,400
read(1,*) idum,?
read(2,*) x1,x2,x3
read(3,*) y1,y2,y3

sx=sx+(real(i)*50.0-25.0)*?*x3(?は仮の表記です。)
sy=sy+(real(i)*50.0-25.0)*?*y3
enddo
s=sx/sy

として計算処理が行えるようにしたいと考えています。
965954:2012/08/14(火) 20:36:06.83
今現在アドバイスをいただいて作ったプログラムがこちらになります。
  program
   implicit none
character*80 cdum
real ::j, k,x1,x2,x3,y1,y2,y3 !x1〜x3はエクセルデータです。
integer :: i,idum
    open(1,file='input1,txt')
do i = 1,6
read(1,*)
end do
do i = 1, 400
read(1,*)(a2(j, k), j = 1, 18)
end do
open(2,file='input2,txt')
read(2,'(a)') cdum
open(3,file='input3,txt')
read(3,'(a)') cdum
sx=0.0
sy=0.0
do i=1,400
read(1,*) idum,v(1,18)s
read(2,*) x1,x2,x3
read(3,*) y1,y2,y3
sx=sx+(real(i)*50.0-25.0)*?*x3
sy=sy+(real(i)*50.0-25.0)*?*y3
enddo
s=sx/sy

966デフォルトの名無しさん:2012/08/14(火) 20:41:38.43
一気にやろうとしないで、まず読み込ませるだけ、次にそれを表示させるだけ
みたいに順を追ってやってみなよ
967デフォルトの名無しさん:2012/08/14(火) 20:48:33.69
>>965 
プログラム文のあとのプログラム名が抜けている。
また全角文字が入り込んでいる。
色々突っ込みどころ満載なので、あせらずゆっくりやりなさい。
他の人が解決してくれるかもしれないが、吾輩は夜中に戻ってくるwww

コンパイラはMS-Fortran Power Station Ver4.0か? 古い上にI/Oにメモリーリークのバグがあるぞ。まぁ小さい計算なら大丈夫だw
9681/2:2012/08/14(火) 23:31:31.70
program test
implicit none
integer, parameter :: ndata = 400
real :: a(18, ndata), x(3, ndata), y(3, ndata)
real :: s, sx, sy, tx(ndata), ty(ndata)
integer :: i, j, icol
open(11, file = 'input1.txt')
open(12, file = 'input2.txt')
open(13, file = 'input3.txt')
!
do i = 1, 6 ! skip 6 lines
read(11, *)
end do
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do
! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
! exel data y
do i = 1, ndata
read(12, *) (y(j, i), j = 1, 3)
end do
!
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
9692/2:2012/08/14(火) 23:32:08.44

print *, 'input column '
read *, icol
sx = sum( tx * a(icol, :) )
sy = sum( ty * a(icol, :) )
s = sx / sy
print *, s
stop
end program test

分かりやすく書いてみた。動くかどうかは知らんwww
970954:2012/08/15(水) 00:08:34.58
帰宅中だったので返信遅れてすみません。 おまけに自宅付近で規制がかかっているみたいで書き込みができずすみません。
今ネットカフェで書き込み、これから帰宅します。

>>966
アドバイスありがとうございます。順を追ってやってみようと思います。

>>967
ご指摘のように古いバージョンになります。詳しいことは明日聞いてみないと
わかりませんがMS-Fortranだと思います。
エラーの原因は書式の問題かもしれませんので、チェックしてみます。
ご指摘ありがとうございます。引き続きよろしくお願いします。

971954:2012/08/15(水) 00:17:25.44
>>968>>969
すごい!としか言いようがないです。私はこの1週間図書館でfortranに関連した本を読み込んでみたり
アマゾンでレビューの良い本を買ってプログラムしようとしたんですが、
どの本もエクセルデータやメモ帳からの読み込みに関する記述がありませんでした。
やっぱり大学生までで色々授業とかで習われるんですか?
お世辞抜きで天才としか言いようがないです。明日古いバージョンのfortranで実行
してみます。ようやくこれで満足に睡眠がとれるかもしれません(泣)ありがとうございます。
またアドバイスよろしくお願いします。
972954:2012/08/15(水) 00:25:19.77
>>968>>969
追記ですみません。
open(11, file = 'input1.txt')←メモ帳
open(12, file = 'input2.txt')← エクセルデータ
open(13, file = 'input3.txt')← エクセルデータ

の箇所ですが、入力データが順に「mydata1,mydata2,mydata3」という名称
の場合は、

open(11, file = 'mydata1.dat.txt')
open(12, file = 'mydata2.csv.txt')
open(13, file = 'mydata3.csv.txt')

とすればいいですか?
973デフォルトの名無しさん:2012/08/15(水) 00:30:34.15
からかってるようにしか思えないなwww
974デフォルトの名無しさん:2012/08/15(水) 00:34:13.61
たぶん
open(11, file = 'mydata1.dat')
open(12, file = 'mydata2.csv')
open(13, file = 'mydata3.csv')
でいいとおもう。

でもメモ帳で変にいじって保存すると、おしりにtxtの拡張子がついてしまうから、.txtつきになるかもしれんw
その辺ばかりは、ファイル持ってる本人にしか分からん。
975954:2012/08/15(水) 00:40:16.20
>>973
私はプログラミング自体が初心者なので、おふざけ抜きで
教えていただきたいんです。すみませんがご教授下さい。
976954:2012/08/15(水) 00:42:05.15
>>974
すみません、ありがとうございます。
からかいではなく、本当にマニュアルには載っていないことだらけなので
助かります。
977デフォルトの名無しさん:2012/08/15(水) 01:33:26.43
そこで致命的に足りてないのは「FORTRANの知識」じゃなくて
WindowsやExcelの知識。それも観察力だけでどうにかなる類のなんで
まず落ち着いてほしい
978デフォルトの名無しさん:2012/08/15(水) 04:34:53.34
excel 自体は関係ない気もするし、windows の知識っても広義すぎるだろ。
「初心者にとって」マニュアルに書いていないことが多いのは分かるが。
(不親切ではなく、そんな細かくて自明か、または場合によって
異なるような、本題と関係ない話をいちいち書かないということだと思われ)
979デフォルトの名無しさん:2012/08/15(水) 09:04:05.45
広義すぎて「全部Excelでできなくないか」って方向へ行っちゃうだろ
980デフォルトの名無しさん:2012/08/15(水) 09:12:22.85
マニュアルにそのまんま書いてないってだけで
何を調べるべきかは書いてあると思うんだわ
981デフォルトの名無しさん:2012/08/15(水) 13:50:27.83
急に伸びて次スレの季節になってしまった
スレ立て能力無いので、どなたかよろしく
982デフォルトの名無しさん:2012/08/15(水) 15:07:23.45
>>980
スレ立て頼むぞ。
983954:2012/08/15(水) 17:29:05.56

先日はプログラムを作成していただき、ありがとうございました。エクセルやウィンドウズのことをもっと勉強します。
すみません。
本日朝から試しているのですが、
4行目と8行目のエラーはでなくなったものの下記で5つのエラーがでちゃいました。
以前は20個ほど出ていたんですが、あと5個がどうしても解決できず、どうしたらいいでしょうか?
以前ご指摘いただいたようにMS Fortranを使用しています。保全するとき「.f90」でfortran90で保存されるんでしょうか?
それでも同じく5つのエラーが出ちゃいます。

for(14): error FOR2290: implicit type for SX detected between SX and =
for(15): error FOR2290: implicit type for SY detected between SY and =
for(17): error FOR2290: implicit type for V6
for(26): error FOR2290: implicit type for S detected between S and =
for(32): error FOR3542: END DO without DO
for(41): warning FOR4270: unused symbol V6S

不思議に思ったのが、一度消してファイルも新規でプログラムを入力したのにV6がエラーで出てくるのが
さっぱりわかりません。
984デフォルトの名無しさん:2012/08/15(水) 19:14:15.07
どうやったらそんなエラー出せんだよw コピペして貼るだけだろ。
プロジェクトから新規で作りなおせ。
Fortran以前に統合環境の使い方とかそういう問題だから、エスパーでもない限り答えようがない。

エラーは多分SX,SY,V6,Sが宣言されていないから出ている。V6Sという変数も使われている。
ソースコードがそうなってるファイルがコンパイルされるように成っている状況だと推測される。

>>968
! exel data y
do i = 1, ndata
read(12, *) (y(j, i), j = 1, 3)
    ↑
    13ね。
end do
985954:2012/08/15(水) 19:38:11.82
>>984
「Fortran Power Station4.0」の「Microsoft Developer Studio」で作成
しているんですが、画面左上のFile→New→Text.Fileから新規ファイルとして
るんですが、Projectという表記が自分の画面で見当たらないのでこういう方法で
開いているのですが、ここから間違ってますか?
986954:2012/08/15(水) 19:45:05.32
プログラミングができずかれこれ1週間以上経過してしまい、
今日エラーの件で周囲に相談したところ「Visual Basic6.0」で
作ってみては、という提案があったのですが、作成していただいた
データをそのまま使う事って無理ですよね...(泣)
VBの方も初心者なのでもうどうしていいか...
987デフォルトの名無しさん:2012/08/15(水) 20:12:58.22
1−1.Insert->project
http://www.dotup.org/uploda/www.dotup.org3314392.png
1−2.Console application → Name 適当にプロジェクト名をつける。
http://www.dotup.org/uploda/www.dotup.org3314393.png
2−1.Insert->files into project 
http://www.dotup.org/uploda/www.dotup.org3314394.png
2−2.ここで手打ちしたF90ファイルを選択する。
http://www.dotup.org/uploda/www.dotup.org3314398.png
3.プロジェクトの中に作ったファイルが登録されている。
http://www.dotup.org/uploda/www.dotup.org3314400.png

この先は Build-> Build xxxx.exe でコンパイル。


つーかこのへんは一通りはじめに教えてもらえよw たぶんVB6に走っても状況は変わらんぞ。
そもそも物干し竿屋じゃあるまいし、20年前のFortranPowerStation4.0とVB6では、研究室元々のプログラム環境が悪すぎる。
おっさんか爺さんしかいなくて聞きにくいのだろうが、うまく先輩に聞くとか身近で聞け。2chで聞くよりはるかに効率いい。


988デフォルトの名無しさん:2012/08/16(木) 14:20:17.73
>>985 Fortran Power Station4.0
しかしこりゃまた懐かしい。
fpsfl32.exe だっけ、DOS窓でのコンパイラコマンド。

Hewlett P にまだオンライン説明があったきがするよ。
989954:2012/08/16(木) 17:14:42.61
>>987

返信遅れてすみません。

>おっさんか爺さんしかいなくて聞きにくいのだろうが、うまく先輩に聞くとか身近で聞け。2chで聞くよりはるかに効率いい。

この節なんですが、すごく当たってる気がします。ただ私の場合、先輩がいない上にfortranに詳しい人がいないのでこちらで
お聞きした次第です。恩師の方も最近は使用しないそうなので、どこがだめかがわからないみたいで、VBなら...とアドバイス
してもらったわけです。
私もポンッと手渡されて余分に何十万もするソフト買わなくて済むと楽観的になっていたのでいけないんです。はぁ...
最近はvisual basic2010?とかも出てるみたいで売ってる本で操作手順の画面を見たことがあるんですが、私が操作したものより
大分使いやすそうな印象を受けました。とはいえど素人の所見なんであてになりませんけど。
やはり私のようなダメな人間には古いソフトは扱えないみたいですね(泣)
自分の置かれている環境を少し理解できたと思います。ありがとうございます。

新規ファイルの作成手順を画像も付けて教えていただき感謝いたします。今までソフトを起動させると前回作成したデータ?が勝手に
出てくるのでソフトそのもののインストールミスかと勝手に思ってて今まで使用してました。
fortranにしてもvisual basicにしてもアップグレードしてくれないかな...20年前のソフトを今まで私は
使ってたんですねビックリしました。
990954:2012/08/16(木) 18:08:52.60
度々すみません。
open(11, file = 'input1.txt')の箇所なんですが、 一番目のメモ帳のデータなんですが、
エクセルデータ2つは固定でメモ帳のみ300個ほど、計算を一回ごとに終わったら次のメモ帳
のデータを入力して計算させていくことってできますか?
991デフォルトの名無しさん:2012/08/16(木) 18:31:54.25
>>990
できるよ。いったんclose(11)で閉じた後、またopen で開き直せばいい。
ファイル名は文字変数にしておけばいろいろ変えられる。
input1 input2 ・・・見たいに番号を変えていきたいとか言うなら、それも出来るが、
それは入門書には書いていないテクニックが必要なのでまた聞け。

あと、プログラムはじめてで一週間でI/O絡みのデータ処理をしようというのは無謀な望みなので、
時間がかかっていることは気にしなさんな。I/OはFortranに関わらず鬼門。
992954:2012/08/16(木) 20:20:54.85

>>991
アドバイスありがとうございます。
こういうことでしょうか?
program test
implicit none
integer, parameter :: ndata = 400
real :: a(18, ndata), x(3, ndata), y(3, ndata)
real :: s, sx, sy, tx(ndata), ty(ndata),w,q!ここにw,qを付け加えました。
integer :: i, j, icol
open(11, file = 'input1.txt')
close(11)
open(11,file='w')!ここを変えてみました。

あと結果を一回ごとに記録するようにプログラミングしたいんですが、こういう
ふうに入力したらいいですか?

sx = sum( tx * a(icol, :) )
sy = sum( ty * a(icol, :) )
s = sx / sy
stop

open(14,file='mydata14.dat')
write(14,*)s
close(14)
open(14,file='q')
end program test

計算結果を保存する保存先のファイルも一回ごとに新規ファイルを作成できるように
プログラミングできますか?
993デフォルトの名無しさん:2012/08/16(木) 21:02:11.72
次スレ
くだすれFORTRAN(超初心者用)その6
http://toro.2ch.net/test/read.cgi/tech/1345118280/
994デフォルトの名無しさん:2012/08/16(木) 21:36:41.09
>real :: s, sx, sy, tx(ndata), ty(ndata),w,q!ここにw,qを付け加えました。
これは要らない。


open(11, file = 'input1.txt')
 計算
close(11)

open(14,file='mydata14.dat')
write(14,*)s
close(14)



open(11,file='w')
再度計算
colse(11)

open(14,file='q')
write(14,*)s
close(14)

あんたホントに分かっとらんねwww まぁ暑いし気長にやれや
995954:2012/08/17(金) 00:47:35.53
>>994
おっしゃる通りダメな人間で、すみません。ただ、気長にやりたいんですが
「まだやれてないのか!」って怒り口調で言われましてのんびりはしてられなさそうです(泣)

それはさておき教えていただきありがとうございます。>>994さんの方法なんですが最初のopen(11, file = 'input1.txt')
が指定したメモ帳1個だけ固定になってしまいませんか?素人で申し訳ありません。
下記のプログラムにして、
「入力するメモ帳のファイル名、各メモ帳の1〜18列のどの列を入力するか、結果を出力する新規ファイル名」
を作成したアプリケーションで手入力していけばうまく計算処理できませんか?

program test
implicit none
integer, parameter :: ndata = 400
real :: a(18, ndata), x(3, ndata), y(3, ndata)
real :: s, sx, sy, tx(ndata), ty(ndata)
integer :: i, j, icol

character filenm*20       !←変更点です。
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(11,file=filenm)

open(12, file = 'input2.txt')
open(13, file = 'input3.txt')
!
do i = 1, 6 ! skip 6 lines
read(11, *)
end do
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do
996954954:2012/08/17(金) 00:48:28.34
! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
! exel data y
do i = 1, ndata
read(12, *) (y(j, i), j = 1, 3)
end do
!
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do

print *, 'input column '
read *, icol
sx = sum( tx * a(icol, :) )
sy = sum( ty * a(icol, :) )
s = sx / sy

character filenm*20       !←変更点です。
write(*,'(a,$)')s 'File Name : '
read(*,'(a)') filenm
open(14,file=filenm)
close(14)
stop
end program test

結果を書き出すプログラムは上記でも大丈夫でしょうか?

997デフォルトの名無しさん:2012/08/17(金) 01:05:46.49
アンタがダメってことはないぞ。
素人がプログラムはじめたらこんなもん。標準。
それにしても暑いお盆の時期に初心者に適切な指導もなくプログラム書かせているのはアカハラの域に達してるな。

お爺ちゃんの環境は20年前で止まってるし、プログラムの相場観わかってないようだし、言うこと真に受けないほうがいいぞ。
ニヤニヤ笑いながら『お爺ちゃん早くお盆のお迎え来い』と内心思ってろw

プログラムの方は相変わらず問題だらけだな。少し待ってろw
998デフォルトの名無しさん:2012/08/17(金) 01:13:08.76
>>997
できたらこちらの方でもまた面倒みてやってください。

くだすれFORTRAN(超初心者用)その6
http://toro.2ch.net/test/read.cgi/tech/1345118280/

自宅では書き込み規制がかかってるのでここ最近ネカフェに行く回数が増えて
財布がどんどん軽くなってます(泣)。
そろそろネカフェから出ようと思うのでお先に失礼します。
よろしくお願いします。
999デフォルトの名無しさん:2012/08/17(金) 02:00:03.89
>character filenm*20       !←変更点です。
character (len = 20) :: filenm
元のままでもいいけど、Fortran90ではこうか。

>write(*,'(a,$)') 'File Name : '
write(*,'(a,$)') これでいいけど、$記号での改行抑止はFortran非標準だから。念のため。

>read(*,'(a)') filenm
>open(11,file=filenm)

open(11,file= TRIM(filenm) ) ! TRIM関数でおしりにつおている空白を消したほうがいいだろう。


>character filenm*20       !←変更点です。
変数の宣言は冒頭でやる。filenmはもう宣言されているのでしなくていい。この行要らない。
>write(*,'(a,$)')s 'File Name : '
write(*,'(a,$)') 'File Name : '
sが余計

>read(*,'(a)') filenm
>open(14,file=filenm)
write(14, *) s
>close(14)
1000954:2012/08/17(金) 19:53:54.48
>>999
返信遅れて申し訳ないです。
アドバイスありがとうございます。

くだすれFORTRAN(超初心者用)その6
http://toro.2ch.net/test/read.cgi/tech/1345118280/

の方に修正点を書き込むので、見てやってください。
これまで色々面倒を見ていただいた方々に感謝いたします。
引き続きよろしくお願いします。

10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。