お前ハイテンションだな この手の顔文字って結構イタい
>>1 おつ
質問です。
integer,parameter::dp=selected_real_kind(20)
a=1._dp
みたいに変数(この例ではdp)で精度を決めてるんだけど、指数部の表現ってどうやるか教えてください。
例えば、0.001を表現する時に倍精度なら1.d-3ってな感じでやってますが、変数を使った場合どうなるでしょう?
今は、1._dp/1e3 という風に表していますが、ちょっと美しくないです。
ご存知の方いらっしゃいましたら、教えていただけませんでしょうか?
>>3 やっぱ今はやりの顔文字はこれだよな (^p^)b
8 :
1 :2010/03/28(日) 21:34:38
>>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
>>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秒くらい抜けてしまっていたりして、どうしたものかと思い悩んでいます。
13 :
10 :2010/04/05(月) 19:02:15
訂正12>それもやってみようとしてうまくいきませんでした... やってみたけれど、結果で20秒とか30秒とかの間 同じ値がずらりと続いていておかしな事になった時間帯があり あまりにも無惨だったのでやめた事を思い出しました。
>>10 補間なのか補完なのかもよくわからん。
(無いデータを補完しておくのか、抜けたのを内挿するのか)
のちのちのデータ解析にも関わるので、一度指導教官とよく話しあった方がいいぞよ。
詳しいことが分からんからなんとも言えないが、データ読み込み時に、データ補間/補完もできるが、
生データは無加工のままとっておいて、後処理で補完した方がいい気もする。
まぁコメントがつけられるデータ形式なら、補完行にコメントを付けておくこともできるが・・・
15 :
10 :2010/04/07(水) 18:42:20
自宅PCが起動しなくなったトラブル&携帯が規制かかってて今まで書き込めませんでした、
すみませんm(_ _)m
>>14 無いデータを補完です、データ抜けでその時間帯のデータが無くなっているので。
生データはちゃんととっておいています、フォートランでデータ加工時に
別名をつけていっているので途中経過も判るようになっています。
先生からは「とりあえず調べてやってみて」と言われまして
色々調べてはいるもののちょっと混乱しているのでこちらに助けを求めに来ました。
もしヒントだけでも教えて頂けるようでしたらお願い致しますm(_ _)m
>>15 PROGRAM test
IMPLICIT NONE
INTEGER, PARAMETER :: nmax = 100
REAL :: x(nmax, 3), x1, x2, x3
LOGICAL :: qdata(nmax)
INTEGER :: i, k, k0, kh, km, ks, io, ndata
x = 0.0
qdata = .FALSE.
DO i = 1, nmax
READ(10, '(i2, 1x, i2, 1x, i2, 3F5.0)', IOSTAT = io) kh, km, ks, x1, x2, x3
IF (io == -1) EXIT
IF (i == 1) k0 = 3600 * kh + 60 * km + ks - 1
k = 3600 * kh + 60 * km + ks - k0
x(k, 1) = x1
x(k, 2) = x2
x(k, 3) = x3
qdata(k) = .TRUE.
END DO
ndata = k
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DO i = 1, ndata
IF ( .NOT. qdata(i) ) x(i, :) = x(i - 1, :)
END DO
DO i = 1, ndata
PRINT '(i3, ":", L5, 3(1x, F8.2))', i, qdata(i), x(i, :)
END DO
STOP
END PROGRAM test
17 :
15 :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?
18 :
17 :2010/04/08(木) 01:27:38
ああごめん
>>17 は
>>16 が書いている。名前欄の
>>15 は間違い。
>>17 のデータは2chだと半角スペースがつめられてしまうのであれだが、
実際は空白が入って小数点が揃うように並べてある。
そうでないと読み込みのところのformatがくるってしまう。
データ読み込みとデータ補間は、それぞれサブルーチンにすればすっきりするだろう。
コメント行で切れ目を入れておいた。
スレ汚しすまん。
19 :
10 :2010/04/08(木) 07:30:01
昨晩また規制に引っかかってしまって書き込み出来ませんでしたm(_ _)m
>>16 ,17,18
ありがとうございます、
抜けたところに前のデータを挿入して補完する方法は以前試したのですが
データ落ちが酷いところでは数十秒くらい同じ値が続く事になってしまって
あまり宜しくないという事で、今回別の方法で補完するやり方を探しているところです。
現在は3次スプライン補完という方法があるらしく色々調べているのですが
結構難しくてまだ理解出来ていません(>_<)もう少し頑張ってみます。
20 :
デフォルトの名無しさん :2010/04/08(木) 11:05:39
データ補間してフーリェかけたり平均とったり・・・とか自爆なのを 今でもときどき見るけど、気を付けてね。 走査平均対象の10データ中の有効なものの数でエラーバー決めて解析すればそれでいいと思うけどねぇ。 平均をとる操作と線形あるいは高次補間って同じ事 ((非負の係数で)合計が1になる係数をかけて足し算する事に帰着する)だから とある補間(補完?)した後に平均値をとっても・・・という気はする。 一度、教官に確認した方がいいよ。単なるテストというか簡単な試練を与えられただけなら それはそれで教育的ともいえるけど・・・危険な香りがする。
>>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は一個ずれるかも。
しかも .OR. じゃなかったね・・・
スレチだけどexcelのグラフでスムージングをオンにするのはマジでやめて欲しい 妙に滑らかなラインが気持ち悪くて仕方ない
最小二乗法かと思ったら移動平均らしいな>Excelのスムージング ちゃんと理解して使ってる人は少ないと思うがw
25 :
10 :2010/04/08(木) 13:31:13
>>20 ご指摘ありがとうございます、うまく説明出来なくて申し訳ないのですが、
全体の解析の結果から数秒~数分単位でグラフにして見たい部分とかが判った時に
予め近似曲線が求まっていれば楽でしょう、という感じで現在に至ります。
なんか、何から何まで良くわからない状態で本当に申し訳ありません・・・
26 :
10 :2010/04/08(木) 17:30:07
先生の蔵書の中から参考資料を見つけて頂けました、これを使ってまた少し頑張ってみます。 自分でも至らない点や確認出来た点が多かったのでとても助かりました、色々と助言をありがとうございましたm(_ _)m また判らない事があったらこちらに駆け込むかもしれませんがその時は宜しくお願いします。
28 :
デフォルトの名無しさん :2010/04/08(木) 19:39:57
超初心者なのですが、Intel Visual Fortranを使っていらっしゃる方はいますか? 私にはC言語を白黒画面のコンソール画面でコンパイル&リンクして実行する程度の簡単な経験しかありません。 殆ど統合開発環境を使った事がないのですが、関連ホームページを調べると、魅力的なCPU毎の最適化機能とか、IMSL数値計算ライブラリを使えるようなので興味を持っています。 私が使い始めることになったバージョンは10.1です。
すいません。つまらない問題なのですが、 複数ファイルに同一の結果を出力する場合どうすればよいのでしょうか。 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) みたいな表現をコンパクトにしたいのです。
>>29 DO iunit = 10, 11
WRITE(iunt, 101) ....
END DO
31 :
29 :2010/04/09(金) 00:34:57
ありがとうございます。 write(10,101)・・・ write(31,101)・・・ write(*,101)・・・ みたいな場合はその方法だと無理ですよね やはり一行ごとに処理するのが基本なのでしょうか
>>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番は歴史的理由でコンソールになっている(はず)。
6番=標準、7番エラー出力・・・だっけ忘れた。 なんかStdoutみたいな明示するキーワードあった気がするけど忘れてもうた。
>>24 最小二乗法
でもxもyも観測量なのに普通のxは誤差無し確定値とみなすやつをへーきで使ってたりするけどねぇ。
>>24 エクセルなんか使うなよ・・・人文科学かな?
環境系の同僚に「このあたりのコーディングはだれか詳しい人に助っ人頼んだ方がいいよ」って言ったら 「いや自分でやるのが大事ですから。シミュレーションはエクセルで私がやります」って言われた 本人は、今いいこといったオレ、見たいな風情なのでなにもいえなかった
放っとけ 構うとお前さんに仕事が飛んでくるぞ
>>36 「いや自分でやるのが大事ですから。シミュレーションはエクセルで私がやります」
キリッ!
やる夫みたいだw
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
>>39 OSとコンパイラの種類
読み込むデータの例も書いた方が良いよ
>>40 わかりました。すいません;
んと、windows vistaで、コンパイラはg95です。
読み込むデータはたとえば
25 50 59
34 23 11
45 43 65
とかです。
どうかよろしくお願いします。
とっさに思いつく限りでは・・・ 元データの最後の改行位置は? open で status="unknown" を追加してみては? くらいかなぁ。Good Luck!
読み込むデータがInt型なのにrealで読み込もうとしてるのは良くないと思う 確認してないから他にも間違いがあるかもしれないけど
>>39 Fortran runtime error: End of file
だから、
>>42 のとおりデータの最後の行の右端に改行コードがないんじゃない?
>>43 大事な事だよね。
整数を実数でよんでそのあと整数化すると1小さくなることがあるし。
>>42 ふむふむ
改行位置で変わったりするのですか?
テキストにも書いていなかったので少し勉強してみます。
ありがとうございました。
>>43 なるほどー
確かにそのとおりですね;
修正しときます!
ありがとうございました。
>>44 改行コードが何か全くしりませんでした;
元データをただ改行するだけじゃだめなんですか?
もう少し勉強してみます;
ありがとうございました!
連投失礼します! 皆さんの助言でなんとかファイル読み込みできるようになりました! ですが、1列目しかデータが反映されません; これも改行コードとやらによるものなんでしょうか? 何回もすいません;
あまり関係ないかも・・・ Win機上では改行コードが LF/CR かな2つ無いと読めない・・・ ぎゃくにGCCやG95はそれぞれを改行コードとみなしちゃう、とか ・・・今でもあるのかなぁ・・・・? qkc だっけ、漢字コード変換のソフトがおまけ機能で 改行コードもWin機向けに変えてくれるから、 もし元データがLinux機で作られてたのなら・・・試してちょ。 unix2dos dos2unix っていうのでLinux上でも改行コード変換はできるけど。
>>33 キーワードの方は知らんけど、標準エラーは 0 だ。
# 理由は知らんが規制が掛かって暫く
# 書き込めなかった。
thanks
>>48 理由は知らんが規制が掛かって
そういえば今回は ac.jp ドメインもいくつか規制食らってたなw
51 :
48 :2010/04/21(水) 22:42:13
>>50 うち ocn なんだけどね。学校とは縁が切れて、博士号持ちのワープワやってるw
そうなんだ。 大学院進んだ人とかポスドクっておかねが多少もらえても雇用統計では「自発的失業者」らしいね。 それを聞いて、博士号取得をくじけた人をしっているけどそれは正解でもあるとおもった。 ・・・博士号もち仲間よりw
>>51 うお、うちの会社でアルバイト(年300万研究補助)しね?
これはひでえなw>自発的失業者
55 :
デフォルトの名無しさん :2010/04/27(火) 20:19:15
!? 大学院進んだ人は普通に「学生」みたいな区分だと思ってた。 ポスドクも任期付/非常勤だからパートと同じような扱いかと・・・(´;ω;`)ブワッ
sage忘れたorz
泣くんじゃないッ!(´;ω;`)
fortran90の勉強はじめましたっ! fortran77は全然知りません :DD
>>58 遺物と向かい合う必要がない限り、知らんで良い。
でも Fortran90 って良書はあるのかな?
色々出てるみたいだけど、倍精度の説明さえロクに
書いていないのは今も謎だ(個人的に)。
これから開催される CUDA Fortran のセミナーや講習会,知りませんか? ググっても3月に東工大のGPUコンピューティング研究会が開催したのしか 検索されてこなくて。 もっと早くチェックしてればよかったなぁ‥‥
61 :
デフォルトの名無しさん :2010/05/10(月) 07:18:31
>>52 生活保護対象にならないようにそういう扱いにするというのは聞いたことがある。
にしてもひどい話ではある・・・(´;ω;`)
>>60 CUDAの試作機とかどっかタダで使えるところないかなぁ・・
nvidiaとか本気で流行らせたいんなら、試作機をリモートでいいから無償提供とかやりゃいいのにね 言語なんていかに裾のが広がってくかが大事なのに
>>62 ? ただで(Cだけど)コンパイラ配ってるし、普通のグラボでも使えるし、Fortranコンパイラにも協力しているしで
十分やってると思うけどね。
ぼくのマシンはインテルのへっぽこアクセラレータしかないお・・・でも触ってみたいんだよう、 という人はいると思うんだ。すでに大規模&本格的に使ってる人(おおくないとおもうけど)が、 かるいデバッグ作業するとかなら普通サイズのぐらぼマシンに自分で設定して、でもいいとおもうけど、 将来使うかもという程度の興味出始めな人には 横着なだけかもしれないけどコンパイルと実行環境が整った場所があるとやはりうれしい。
65 :
デフォルトの名無しさん :2010/05/13(木) 15:33:38
最近になって、がっつり数値計算をする必要がでてfortranを 勉強しだしたんですが、要素数が不明の2次元データをファイルから読んで、 その要素分だけallocateしたいのですが、 とりあえず最後まで読んで要素の数を数えてから配列をつくろうかな、と思ったんですけど、 fortranにおいてend of fileの扱いをどうしたらいいのかわからずに困っています 使用OSはvista,コンパイラはg95です。初歩的とは思いますが、よろしくお願いします。
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さんありがとうございます。
70 :
67 :2010/05/13(木) 18:08:38
>>69 ありがとうございます.
地道に代入することにします
>>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
>>67 INTEGER, PARAMETER :: n(2, 2) = RESHAPE([1, 2, 3, 4], [2, 2])
[ = (/
] = )]
ただし Fortran2003
73 :
66 :2010/05/14(金) 03:18:41
>>71 iostat つかっての方がきれいで良いね。
>>73 他のエラーを捉えられなくなるのが難点か。
エラー番号って規格で決まってるの?
76 :
65 :2010/05/14(金) 15:29:50
レス遅くなって、すみません。 iostatの読み込みで、-1がたったらexitするように書いたら 望むとおりの挙動をしてくれました。 なんとなく勝手がわかってきたきがします。 重ね重ね、ありがとうございます!
>>74 大半は決まってない。
EOF=-1 は、まず大丈夫だが、これが規格なのか、慣例なのか分からん。
たしか EOL=-2 だったか。
Fortran2008の次期規格で、この辺の一部の定数が、INTRINSIC定数として定義されるらしい。
>>77 EOF=-1は慣例で規格としては決まってない。
だから、EOF=-1と決めつけてプログラムするのは危険。
まぁ、そんな危険はほとんどないが。
>>78 EOF=-1 は慣例なのかー。
知らんかったぜ。
すみません、質問させて下さい。 数万行ある(x,y)データを600行ごとに値を読んでサブルーチンで計算させて そのサブルーチンで出て来た値をまた別のサブルーチンで計算させて最後に出て来た結果を 出力ファイルに書き込むようなメインプログラムの作り方がどうにもわかりません。 判るかたがいましたらご教授頂けると助かります。 f77を覚えたてです、まるっきりの初心者で恐縮ですが宜しくお願いします。
追記。 数万行のデータのうち始めの600行に対してサブルーチン1、サブルーチン2を実行、その結果を出力ファイルに書き込む 次の600行を同じようにサブルーチン1、2実行、結果を同じ出力ファイルの最後の行から付け足して書き込む これを入力データの行数分だけ行いたい、という感じです。
82 :
デフォルトの名無しさん :2010/05/17(月) 08:09:42
age
83 :
80,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ずつ増えています。
おまえらソースコードの管理どうしてる?
85 :
80,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行毎に計算できません。 もし判るかたがいらっしゃいましたら助言を頂けると助かります。
86 :
80,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
ぬるぽ
ガッ
>>85 すくなくとも
N=1
DO 20 I = N, N + 600
もう一個のDO 20 は要らない。
>>91 FORTRAN スレなんだから、ABEND だろ!
93 :
80 :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
94 :
80 :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行に関しては結果として正しい値が出て来ているのでサブルーチン部分には問題は無いと思います。
本当にすみませんがよろしくお願いします。
95 :
80 :2010/05/19(水) 16:15:46
あわわわまた間違えていました!!!30 CONTINUEが2回ありますが
>>93 の頭の30 continueは15 continueの間違いで、最後のgoto 30がgoto 15になります!!!
ほんとうに申し訳有りません。。。
どうもGOTO文やDO..CONTINUE文で混乱しているようだけど, まだFORTRANを覚え立てなら,わざわざ古い書き方で覚えずに, Fortran90形式のDO..END DO構文で慣れた方がいいんではないかい? 特にGOTO文を使うのは間違いを誘発しやすいから,使わないようにするのが世界的な流れだし.
ところでend doとendoはどっちが望ましいの? 個人的にenddoの方が一語にまとまってて好きだけど
98 :
80 :2010/05/19(水) 17:35:55
>>90 そうなんですか、理解していませんでした(>_<)
f77とf90だとかなり違うのでしょうか?
例えば参考にしているサイト陣がf90だったりf77だったりそれぞれ違っていたと思うのですが、
取り混ぜてしまっていたらまともなコードにはならない・・・という考えで合っていますか?
教科書は今までf77のものを使っていたので、なんにしてもf90のものを探してみます。
(>_<) …
良いこと思いついた 焚書坑儒して77を滅ぼそう
>>94 色々、妙な点が多いプログラムではあるので、可能性は色々あるが、
サブルーチン側でX(1)~X(600)までで計算してるんで内科医?
そもそも、古い数値がいらないなら、600個の配列に毎回書き換えて読み込めばいいし、
サブルーチン側でも600個を受け取って、1~600までの要素で計算すれば良い。
全要素を引渡しているようだが、必要なのかな?
>>100 77もいいとこあるんだよ。
102 :
デフォルトの名無しさん :2010/05/20(木) 01:00:59
大学のPCのOSがLinuxでfortranを学び始めました。 家でも練習みたいのをしたのですが、windows vistaでもできるのでしょうか。 例えばメモ帳に書いて、フリーのコンパイラでコンパイルするというのを想定しているのですがこれは無理なんですか。
>>102 知らないから僕ではなく他の人に聞いてみてよ
107 :
80 :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
まぁまぁw Win機だと gfortran が一番かな? タダだし、Linux版その他あってWin機でテストしたコードをよそに持っていっても 規格やら互換の問題がとても少ない・・・とおもう。OpenMPも使えるし。 コマンドプロンプト内の処理しかなく、Linuxコンソールと基本同じ使い勝手。 インスト(といってもファイルを展開するだけなのだが)楽チン。環境変数設定はめんどいw
109 :
80 :2010/05/20(木) 04:02:28
107続き 最後のほうのデータが抜けてしまって、現在はどうしたものかと悩んでいます。 取り敢えずサブルーチンのDIMENSIONの設定とかをもう少し見直してみます。
110 :
102 :2010/05/20(木) 04:47:12
>>108 すいません。。PCは大学入るまで使うことが少なくてよくわからなかったのです。
とりあえずいわれたものをダウンロードしてみます。ありがとごいました
112 :
108 :2010/05/20(木) 07:46:36
タダのFortranコンパイラを、と訊かれると 自分が使っている&インストール簡単だった、というそれだけの理由でgfortranを 人にはいつも薦めてるけど・・・じつはg95との違いをよく知らないのよねw ぐぬーライセンスとか内部のオトナの事情はさておき、1ユーザーとしてみると何が違うのかな?
gfortranでは装置番号を環境変数で指定できない
>>85 ,
>>92 →
>>107 同じ人が書いたとは思えない!初心者でも1日でこんなに上達するんだな。
>最後のほうのデータが抜けてしまって
表現があいまいすぎて意味分からん。もしかして女の子?
助言を求めているなら、具体的に書かないとなんとも言いようがない。
あえて77で書いてる人っているの?
ifortマンセー
118 :
80,85,93,107 :2010/05/20(木) 19:25:09
>>114 わかりにくくて申し訳有りません(>_<)データは30000行入っていて欲しかったのですが
どうやら最後のほうや途中がデータ計測の時に抜けてしまったようでした。
抜け自体はそれほど多く無いので線形補間というのをすれば問題は無いそうです。
計算式は渡されて、どうやるかはまだ良く判っていませんが、調べてみます。
>もしかして女の子?
はい、最近分野変えで物理系の研究室に転入してきたばかりなのですが
今まではプログラミングには縁もゆかりもありませんでした。
>107は昨晩学校を徘徊して他の研究室に残っていた先輩からもアドバイスを貰いました。
>93については先輩曰く「動くようなプログラムには見えないぞ」との事で
つまるところ
>>96 と同じような指摘を受けたりなんだりして、手直ししてみました。
自分ではまだまだ勉強が浅いので次に違うプログラムを作る時には
また色々戸惑うだろうなぁとは思っています。
これからまたしっかり勉強します、ありがとうございました。
すいません。学校の課題でy=(x+1)(x-3)=0でNEWTON法を使い、収束判定が0.0000001で終わるプログラムを 「READ」「WRITE」「if」「GO TO」「SUBROUTIN」「DIMENSION]だけ使って作るんですけど・・・ SUBROUTINEとDIMENTIONが全く分かりません。誰か教えてください。
>>118 匿名掲示板だから思い切って聞きますが、処女ですか?
\ / .::::::::::::::::::::::::;;:;;::,ッ、:::::: ) く ホ す \ l ,ッィrj,rf'"'"'" lミ::::::: く れ モ ま Y ,!ミ::::::: ヽ な 以 な `ヽ、 | くミ:::::::: ノ い 外 い |、__ ャー--_ニゞ `i::::,rく か は ``''ー- ゝ、'l  ゙̄´彑,ヾ }::;! ,ヘ.) ! 帰 ゙ソ """"´` 〉 L_ っ / i , /| て r ≡=- 〈´ ,,.._ i 't-'゙ | ,へ ,r┘ ,、yx=''" `ー{゙ _, -、 ; l レ' ヽr、⌒ヽ' ゙、`--─゙ /! `、 _,,、- ゙、 ー'' / ; `、 -''"_,,、-''" ゙、 /;;' ,' / 、\ -''" / `ー─''ぐ;;;;' ,' ノ // / ヾ_、=ニ゙
本当に誰か助けてください(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より小さくなるまで繰り返し計算する こんな感じのプログラムを作りたいんですが・・・全然分からなくてできません・・・ 誰か本当に助けたください
>>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
128 :
127 :2010/05/21(金) 02:17:54
>>124 プログラム出しておいてなんだが、たぶん問題が間違ってるか、問題を写し間違っているか、
質問者が問題を理解しそこねている。
この問題だと、単にy1のゼロ点近傍に近づいたときに終了し、y2の条件があまり意味を持たない。
あまりにイミフw
129 :
127 :2010/05/21(金) 02:20:07
>>124 ごめんw
>>119 でNewton法で質問していたのか。Newton法なら意味わかる。
前レスは忘れろwww
>>119 >「READ」「WRITE」「if」「GO TO」「SUBROUTIN」「DIMENSION]だけ使って作る
これは出題者がこうしろと言ってるの?
131 :
デフォルトの名無しさん :2010/05/21(金) 02:41:32
>>129 ありがとうございます。そして悲しいことにFORTRANは77なんです(TAT)
>>130 そうなんです(汗)
講義で教えられてないのを使うと大目玉をくらうんです。
>>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
>>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にしてもエラーが
おきたりしないですか?
>>134 エラーは発生しない。
それとお礼を言われる程のことはしていない。
>>135 嘘教えんなよwww誰だよw
>>134 hが負になる時の事を考えると、ABSが必要。
どうしてもABSを使いたくないなら、
IF (h < -0.0000001) GOTO 1
IF (h > 0.0000001) GOTO 1
とし給へ。
>>136 >嘘教えんなよwww誰だよw
>エラーは発生しない。
これは嘘ではないと思うが。
>それとお礼を言われる程のことはしていない。
それともこっちが嘘と言っているの?
プログラマーって短気が多いんだなぁw
141 :
80,107,118 :2010/05/22(土) 05:49:11
>>132 これは書き方が判りやすくて助かります!おっしゃる通りのようなプログラムです、
どうやら抜け落ちたデータの補間もこれで出来るらしい?です。
107に書いたやりかたで取り敢えず動くのでやってみたのですが
50000行くらいの大きなデータだと、結果が出るまでもの凄く時間が掛かってしまいました。
変なところにバッファしてるんじゃないの?と言われたのですが良く判らず
10000ずつ計算させて切り貼りしています。どうしたものかと悩んでいます。
> do while ((X(K-1)-XX)*(X(K)-XX) > 0.0d0)
先輩が教えてくれたのですが、イマイチ意味が判っていませんでした、
普通にIFでやっても良いんですね、ありがとうございます。
>>141 計算機でやる分には、時間がかかってもそのままやらせればいいと思う。
手で切り貼りする作業時間を含めれば、結局トータルでの時間は、計算機でやった方が早いのでは?
時間がかかる原因は、色々ある。
しかしプログラムのどの部分に時間を取られているのか分からないとなんと見えない。
細切れのI/Oが多いと時間はかかる。だが、50000行くらいなら、600行づつ読んでもそれほどでもないような。
元のプログラムだと、毎回最初のデータから条件を満たす位置を探し始めているが、
Xが単調に増加しているのなら、前回の位置から探し始めれば早く適切な場所が見つかると思う。
この辺に、時間がかかっている気がしなくもない。
143 :
141 :2010/05/22(土) 16:30:49
>>142 一桁間違えていました!(>_<)500000行くらいのデータです。
数時間の測定だと100000行以内くらいで済むので5~6分で計算出来るんですが
200000行くらいだと20~30分くらい掛かってしまいます。
500000行くらいのデータをやろうとしたら数時間掛かってしまっていました。
Xは単調増加なので前回の位置から探すというやりかたをちょっと考えてみます、
ありがとうございます。
>>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倍くらいはやくなる可能性はある。その辺はコンパイラに依るので先輩などに聞いてみるとよいかな。
>Xは単調増加なので前回の位置から探すというやりかたをちょっと考えてみます、
>>142 が言っている「元のプログラム」って
>>85 や
>>93 のことではないの?
>>107 も
>>132 も,すでに前回の位置からREADするようになっているでしょ.
>>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ではその無意味な計算結果は使われないから,それで正常な結果が得られたとしても納得できそう.
ちょっと行き過ぎた推測かも知れないけど...
いちど,サブルーチンの引数を確認してみては?
147 :
142 :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を渡す
必要があるのではないかと思う。
必要があるといいですね
前半は納得した.
後半「読み込んだデータを延々と配列にため込んでいるので、」というのは違うと思う.
どちらも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の配列を使い回すのが正しいのかすら推測の域を出ないな.
質問者のレベルから考えると,引数の意味を把握しているか自体が心配.
(このスレ,勉強になるなぁ)
150 :
142 :2010/05/23(日) 22:24:25
>>149 おk把握した。
古い方のプログラムと混乱していた。
古い方は、データをため込んでいるので、現在位置をサブルーチンに渡す必要があるから、
Nを渡していると理解していた。
とすると
>>107 では、Nの値が狂っているなw N=1で固定しなきゃないかな?w
151 :
141 :2010/05/24(月) 02:20:17
>>144-
>>150 今理解するのにちょっと時間が掛かっています(>_<)皆様有り難うございますm(_ _)m
>>146 さんの言う通りサブルーチンの中身はスプライン補間になっていました。
SUB1で行列を解いていて、SUB2で間隔1毎の値を計算している?感じです。
引数の意味はまだ良く理解出来ていません、SUB1のNがおかしいのでしょうか?
もう少しいぢくってみます。。。
>>151 メール欄に sage と書き込んで、スレが上のほうに上がらないようにした方がいいですよ。
スレが上に上がると、通りすがりの冷かしが面白半分なレスを書き込んでくる確率が上がるので(^^
153 :
デフォルトの名無しさん :2010/06/06(日) 02:50:01
i==2 ? x = 0 : x = 2 みたいなのは無理なんですか?
155 :
デフォルトの名無しさん :2010/06/06(日) 22:26:58
>>154 なるほどサンクスです
でもやっぱ?使えた方が見やすいですね
>>156 おしっこC言語。3項演算子。
しかし、昔風の書き方の気が・・・
最近はFortranでもCでも、もっとわかりやすく書くように指導されているはずだが・・・
配列の仮引数に、スカラーの実変数を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
>>159 INTENT(IN) 属性なら、
call inc(1,[s]) ないし call inc(1, (/s/))
でいけるが、INTENT(OUT)で値が返る場合はダメだなあ。
integer s(1) とサイズが1を明示すれば通るけど(intel のやつ)・・・それじゃダメなんだよねぇ・・・・ 思いつきで(邪道とされるw)equivalence 使って Program test integer sdummy(1) integer s equivalence(sdummy, s) s = 1 call inc(1,sdummy) ・・・・・ でも通るけど・・・意味ねぇなw
あ、始めて気づいたけど、 integer s(1) s=1 って通るんだね。コンパイラにも寄るんだろうけど。
163 :
デフォルトの名無しさん :2010/06/08(火) 12:46:57
>>162 たぶんそれ、F90の配列初期化の一括代入になってるだとおもう。
ありがとう。 そっか普段77で書いてるから不慣れというかまったく気付かなかった。 たまに90で書くし初期化で使うのに・・・ Intel (たぶん余所のも) のはF77固定書式で書いても、 その事をコンパイルオプションで明示しないと、 F90の機能をちょっとなら混ぜても 文法が干渉しない限りは有効とみなすんだよね。 ・・・危ないような気もする。
165 :
159 :2010/06/08(火) 19:06:53
>>160 その場合でも結局、一時的な配列に値をコピーしてから渡すって意味になってるんだよ。
>>164 FORTRAN77なら型チェックなんかないし、
配列にスカラー変数を渡すのは正しい操作なんだよね。
内部的にはメモリアドレスを渡してるだけなんだから。
>>161 のequivalenceは、今回のprogram文では意味ないけど、
変数sがサブルーチンの仮引数のときに、
無用なコピーを作らず渡せる唯一の方法かもしれない。
>>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
>>159 みたいなことは御法度なんじゃないの?
そのために90以降いろいろと拡張されたわけでしょ?
質問です。 LAPACKを使うプログラムなんですが、 Intelのコンパイラだとコンパイル出来るのですが、 gfortranだとSyntax errorが出てしまいます。 こういうことってプログラムに間違いが無くても起こりますか?
>>167 そうなんだけど、その辺は70年代的Pascalマンセー的な発想で、型チェックギチギチにしたら
確かにエラーは減ったが、窮屈で困ってしまったというのが、80年代以降というか。
実際、Fortran的にはF95でELEMENTAL型の副プログラムが定義出来るようになって、
スカラーで副プログラムを定義しておけばRANKによらずに配列引数が取れるようになっている。
アルゴリズム部分とデータ構造を、もっと独立したユルユルの関係にしたいというか。
>>168 その LAPACK はだれがどのコンパイラでコンパイルしたの?
>>170 気持ちは分かるなぁ・・・
この辺の善し悪しは開発の規模にもよるんだろうな
>>172 LAPACKはLinuxのパッケージ管理ソフトで入れたんですが、
だからたぶんgccでコンパイルされたものだと思います。
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コンパイラにはこのような機能は無いということでしょうか?
179 :
178 :2010/06/19(土) 02:02:52
すみません。いったん寝ます
>>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
>>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
>>178 g95で試してみたが、6カラム目に&がくれば問題なくコンパイルできた。
FORTRAN77の継続行指定は6カラム目に無いと駄目。
ずれると、
Error: Unclassifiable statement at (1)
が出る。
エラー行と数字の1が出ているはずで、それがエラー位置を指しているので、よく見よ。
ちなみに、Fortran90では&は継続行を意味するが、1行目の尻に書く。
詳しくはマニュアルを読んでくれ。
純粋なFORTRAN77では&は規格外の文字なので本来は使っていけない。
(今となっては余り気にしないが。)
183 :
178 :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オプションをつけることでなんとかコンパイルはできるようになりました
ファイルを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
>>184 末尾だったらOPEN時に指定出来るが、任意位置には行けない。
というか行きようが無い。
直接型はレコード長が全要素で共通だから特定の位置までのバイト数がわかるが、
レコード長が不定長の逐次型では原理的に知り得ない。
ところで読み飛ばすときjtmpに読み込まなくても空READだけでおk。
あと後ろに近いなら、尻から始めてBACKSPACEで逆行する技もある。
それが負荷を減らすかどうか知らんwwwww
>>185 やっぱり不可能ですか。
将来ウンTBのデータを扱う時代になったら、データハンドリングはどうなるんでしょうね。
ファイルはダイレクトアクセス、データ構造はレコード長まで完全に把握するというのが
一般的になるんでしょうかね・・・
>>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
188 :
1/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
189 :
2/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
190 :
3/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 考えなしに書いた。なんなん(・∀・)!?
残差の二乗和を計算するときの精度と実行速度について悩んでます。 速度よりは精度の方を優先したいのですが、 以下の3つのソースで、最もバランスの良いものはどれでしょう? xとaはそれぞれ倍精度実数として、 1. (x-a)**2 2. (x-a)*(x-a) 3. (x-a)*(x+a) よろしくお願いします。
指数部が整数の時は同じ掛け算をする(はず)。というわけで精度&実行速度の点で、ぼほ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
とおいて、より簡単なプログラムにしてもいいですか?
なるべくなら、式が簡単なほうが分かりやすいですし。
>>193 それでもよい。
なお、そのテイラー展開の収束半径は、|x|<1のはずなので、その範囲から外れるような値も
計算できるようにしたいなら、LOG(X*10^N)=LOG(X)+N*LOG(10) などの公式を使って
スケールしてやる必要がある。
195 :
デフォルトの名無しさん :2010/06/21(月) 00:13:24
仮にt=1.5の計算をするときには範囲のプログラムとして
>>194 のようなプログラムを施すということでよろしいのでしょうか?
>>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
>>198 まずこの 綴りの間違いを何とかしろ!w
program sinTelor
CALL sine( which )
を書け。サブルーチンを呼び出さずに何をする気だw
兄貴がサブを呼ぶと覚エロ!
>兄貴がサブを呼ぶ 解説プリーズ
すみません(汗) FORTRAN77で、Gauss-Jordan法のプログラムを 「READ」「WRITE」「GO TO]「IF]「SUBROUTINE」 「DIMENSION」を使って作りたいんですが・・・ 全く分りません。誰か教えてください!
>>203 図書館行ってアルゴリズム集から完コピ。マジオススメ
>>203 誰か、F77で掃き出し法のサブルーチン作ってテンプレに書いておけよ。
208 :
デフォルトの名無しさん :2010/06/26(土) 12:17:22
微笑ましいよね。 きっと課題に「xxx」「yyy」を使え、と明示してあるんだろうね。
77でgotoを使わないのは、結構苦しいと思うが。
212 :
デフォルトの名無しさん :2010/06/27(日) 11:19:38
全く無しはしんどいよね。最小限にはすべきだけど。 do while があれば goto を使う機会が激減する・・・と書こうとしたけど、 お題の203さんの課題では do は入ってないね・・。 if goto の組み合わせで何とかしろ、ということなのか。 これはこれでしんどいw
>>203 まじめにアドバイス
Fortranがわからないの?Gauss-Jordan法がわからないの?
「知らない数値解法」で「知らない言語」で書け、
という課題が悩ましいのは自分もそうだったのでわかるけど
丸投げだとあまり回答もらえないですよ。
前者なら、どの程度の基礎的なプログラムなら書けるのかを提示して
どの部分を調べたらよいかをアドバイスもらい、
後者なら、ネットで調べたり、その解法のどの部分のプログラム化が?なのかを提示
したほうがいいと思います。
正直、その解法で、何を解きたいのかよくわからないし。
215 :
デフォルトの名無しさん :2010/07/02(金) 13:45:32
A~Zまでの文字のデータを1つ1つファイルにしておき 小文字で入力された文字列をファイルから読み込んで 大文字で表示するにはどのようにすれば良いのでしょうか? 入力された文字をそれぞれのファイルから 読み込む方法がよくわかりません。お願いします。 F90
質問があいまい&意味不明... ファイル内に記述された特定の文字だけを大文字に変換したいのかな? もしそうなら、Fortranではなくawkやperlを使った方が断然楽だよ。 いちおう、ファイルを読み込むのも、入力文字を読み込むのもREADを使う。
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 だと何文字をどこそこに格納して とかいうのはとくいですが パーサーが無い? ので「,」で切ってから「/」で切るという処理は どうやるのでしょうか
>>218 IOSTATがうまくいかないのは、Fortmat書式を抜いているから。
>>219 INDEX関数使えば出来る。
>>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だよ!
ソースが見やすくなるからね
>>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
>>219 2000年元旦に市場で何があったんだ・・・w
>>221 / , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな?
text(ip1:ip1) = ' '
(略)
READ(text,*) iyear, imonth, iday, iprice
手元にコンパイラがないから・・これで勘弁
>>222 俺もそうだよw
224だけど、どうかな?
226 :
221 :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
>>226 コンマは区切り文字になっているから残してもいい
本当だ!
いまの今まで知らんかった・・・。 CSV みたいに','が区切り記号で使われてる
ファイルもらったときも御丁寧に置き換えてた・・。
write文での制御編集記述子についての質問です。 100e18.10 と指定してファイルに書いていたのですが、 これを 100es18.10e2 と指定すると、一部がアスタリスクになってしまいます。 マニュアルを読むかぎり 100が書式の繰り返し数 18が小数点上の桁、小数点以下の桁、指数を含めたすべての桁数 10が小数点以下の桁数 2が指数の桁数 と理解したのですが、どこか誤りがあるでしょうか。 教えていただけないでしょうか。
229 :
デフォルトの名無しさん :2010/07/05(月) 20:56:57
218 219 です >220 さん ありがとう >221 さんコードまで書いてもらってありがとうございます。 うちのPCだとコンパイルがうまくいかないようですが、 それは多分調整のレベルなのでしょう。 ほんとにこんなに早くレスがくるとは思ってもみず 返事が遅くなりました
>>224 > 224 名前:デフォルトの名無しさん [sage]: 2010/07/04(日) 06:34:23
>
>>219 > 2000年元旦に市場で何があったんだ・・・w
すみません、これ分かりやすくするためのものでして・・・。
「文字の数が変わっちゃうのでこまっていた」ということでした。
>
>>221 > / , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな?
> text(ip1:ip1) = ' '
> (略)
> READ(text,*) iyear, imonth, iday, iprice
> 手元にコンパイラがないから・・これで勘弁
いろいろ工夫が必要なのが分かって着ました。
高級言語の割には今時のRubyとかよりずっとマニュアル車っぽくていいようなかんじも・・
ありがとうございました。
これで本題の数値解析に移れます
>>226 > 226 名前:221 [sage]: 2010/07/04(日) 14:20:20
>
>>224 > >/ , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな?
> その方がいいな。 ↓コンマは区切り文字になっているから残してもいいのだが、INDEXの代わりにSCAN関数使ってみたかったので消した。
> program hyoujisurudake2
218 です いろんなやり方があるんですね。
それだけ皆さんは苦労してきたと想像します
>>227 > 227 名前:デフォルトの名無しさん [sage]: 2010/07/05(月) 04:43:04
>
>>226 コンマは区切り文字になっているから残してもいい
>
> 本当だ!
> いまの今まで知らんかった・・・。 CSV みたいに','が区切り記号で使われてる
> ファイルもらったときも御丁寧に置き換えてた・・。
219 です
すると "," は標準で区切り文字になっているが、それを解除?することは
難しそうですね。きっとできるでしょうが、とっても深い世界
はい
>>228 Fortranの場合、Formatで指定した桁数からあふれると、アスタリスクが出力される。
今の場合、多分指数部分が溢れているんじゃないかと思う。
E-10とかが出ると、ヤバイ。E2の2には符号の分も含まれる。
>>232 >すると "," は標準で区切り文字になっているが、それを解除?することは
>難しそうですね。きっとできるでしょうが、とっても深い世界
それはFORMATをあらわに指定すれば出来る。
上の例でも、ファイルの1行を丸々文字列として読み込んでいる。
read(10, '(a)', iostat = io) text
この場合は、スラッシュもコンマもただの文字として読み込まれる。
読み込まれる。
>>234 ありがとうございます。
>>228 にある18を25などの大きな値にしてみたのですが、それでも一部でアスタリスクになってしまうことがありました。
一行にかける文字数などなにか別の制約があるのでしょうか。
>>237 全体の幅を増やせば仮数部は大丈夫になるが、その場合でも指数部の幅は変わらないので、指数部が問題なのでは?
部分ピボッティング付きのガウス-ジョルダン法。これで対角要素が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
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
>>238 ありがとうございました。ようやくおっしゃる意味がわかりました。
指数の部分を2桁にしてことが原因ということですね。
納得しました。明日試してみます。
>>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 だからでしょうか?
いくつを入れてもうまくいかないです
>>243 自己レスです
すみません データーの最後の行に「 / / , 」という空白でータ行が入っていた!
だから最後まで読むけど 終わりを過ぎてしまう というエラーが出ていた おろかしー
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
GJのアルゴリズムは確認していないけど、とりあえず配列の作り方を確認してみ。 配列変数には()が必要。 あと、エラー内容をコピペしてみて。
エラーをがんばって見て作りなおしてみましたがエラーがでます。 以下、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 連投になって申し訳ないですが、次にエラーのコピペします。
>>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)]
お願いします。
> 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は変数をすべて定義した後にやる。
250 :
249 :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) )
>>250 多分質問者は、F77でかつDIMENSIONとGOTOを使えと言われている人なので、その辺を察してあげないと・・・
>>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に関して全く同様のエラーが何回も出力されています。
日をまたいでレス遅れてしまって申し訳ないです。
よろしくお願いします。
>>252 訂正:a,b,n,iに関して→a,b,iに関して
連投失礼します。
宣言部は全て最初にやらないといけないんだよなぁ コード真ん中のスコープ内でローカルに宣言できたら便利なのにといつも思う あ、でも次のFortranで実装するって話を聞いたことがあるような 次の次だっけかも
allocatableがつかえないと、余分にメモリを食っちゃうね。 まず、配列変数の定義の時点で real, dimension(100,100) :: a real, dimension(100) :: b と、ある程度大きいメモリ容量を割り付けておいて、すべての変数に0を代入して初期化。 a(:,:) = 0.0 b(:) = 0.0 そのあとnやa,bの要素をreadすればokかな? ここで、nは単なる繰り返し制御のための変数になるけど、まぁ仕方ないか。
>>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コンパイラがダメなきがしてきました。。
何度も申し訳ないです。
257 :
255 :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形式で書いてみた。古い書き方は全然使わないから、間違っているかも。
変数宣言の仕方って何が推奨なんですか?
ttp://www.nag-j.co.jp/fortran/FI_4.html を見ると、数に関しては
整数型 integer
実数型 real
倍精度実数型 double precision
複素数型 complex
倍精度複素数型 complex(kind(0d0))
となっていますが、実数型はreal*4とすべしと言ってるサイトもありますね。
double precisionなんて長ったらしいし、*で済むのならそれがスマートだと
思うんですが、どうですか?
>>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)
と分けて書かねばならんはず。
*の数字は変数が占めるトータルのバイト長らしいから、複素数の場合は注意だな やはり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)
Fortranの命名規約って何か習慣的なものはあるんでしょうか? 例えばJavaなどではキャメルケースが一般的ですが
ない
>>261 キャメルケースってボーランド記法のことか。
Fortranは昔は大文字しか使えなかったし、今も大文字小文字の区別がないので、そういう工夫はあまりしない。
また1行の長さに制限があるので、余り冗長な名前も使わない。
77時代までは極めて明快だった。
暗黙の型は厳守。型を守ってないものは、文法的に許されてもエラーの元だし、社会的に誰からも相手にされないので。
名前は6文字までなので(IBMがこだわったので)単語の母音を抜いた子音並べが基本。
この手の命名法は、LAPACKなどライブラリに厳然と残っているので、知っておくと便利。
頭文字がAとかRは単精度実数、Dは倍精度実数、Cは単精度複素数、Zは倍精度複素数(本来は規格外だが)。
F90になってから混迷を深めているが、いちいち変数の型を調べるのに、宣言部分を見る気もしないので、
捨て変数に関してはIMPLICIT NONEを掛けても暗黙型の頭文字をつかっているのでは。
LOOP変数のi,jとか。
変数の命名規則は、開発の仕方や規模によるところが多いんじゃないかな。 他人のコードを頻繁に見るような場合は、パッと見で分かるようなのにしてくれないと死ぬ・・・。
構造型(体?)を使ってみたいのですが、良い参考書等あるでしょうか? FORTRANは本自体少ない上、FORTRAN90以降の新機能について 詳しく言及している本は少ない気がしますが。
>>266 その手持ちの本に構造体書いてりゃな。
書名は何?
>>265 (構造体は必要)ない!手持ちの本で十分だ。がんばれ。
>>267 F90の本で構造体が書いてないものなんかあるのか?
戸川隼人のしょぼいザ・Fortran90/95にも1章費やして書いてあるぞ。
と思ったら、パラパラと見た感じ牛島省の本には無いな。京大土建屋の英単語つづりデタラメ本だから仕方ないかw
同じ京大の富田の本には2ページくらいおざなりに書いてある。
しかし、富田本は昔の大型計算センターのテキストみたいな分かりにくさの本だな。
イラストとしてキャラクター・グラフィックスで書いた3Dの山とリサージュ図形があれば完璧だったろう。
薄くていいが定価で買う気はしない。京都の古本屋で百円で売ってそう。
構造体で注意すべきなのは、Fortran90ではALLOCATABLE属性は使えなかったので、POINTERを使うしかなかったが
Fortran95ではALLOCATABLE属性のメンバーを持てることくらいか。
>>268 マジレスするとwww
Fortran2003でのオブジェクト指向は、構造体の中に副プログラムをCONTAINする形になるので、避けられない。
使ったことないからよくわからないけど、Fortran の構造型の命名って制限ある? ピリオドで区切るから・・ .EQ. とかの比較演算子とかぶりそうな気がふとしたので。
. % のどちらでも実質、両方正しいよ。 . 区切りはDECのだった気がするけど、まあ実質業界標準。
>>272 ねーよw
Fortran90以降の構造体とDECの構造体は別物だぞ。
. が使えるわけがない。
>>269 >構造体で注意すべきなのは、Fortran90ではALLOCATABLE属性は使えなかったので、
Fortran90では構造体の中のメンバはALLOCATABLE属性に出来ないって意味だよね?
それともALLOCATABLE自体がFortran95以降なんだっけ?
F90でも普通にallocatable出来る
>>274 F90では構造体のメンバーがALLOCATABLE属性を取れなかった。
これが大変不評でF95で取れるようになった。
なったね
たね
ね
すみません 初歩的な質問だと思うのですが、 以下のように、行を一つのベクトルと考え、自分の入力したベクトル間の距離を出そうとしたのですが、上手くいきません どこがいけないのかアドバイスお願いします 最初に定義している文字が多いのは気にしないでください 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) つづく
つづき 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
>>280 どう上手くいかんのかもう少し分かりやすく言えよと
subroutineにしないでやっても同じなわけ?
すみません サブルーチンにしないでやっても結果は同じでした。 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が上がると凄い勢いでその値が増えていきました
>>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
のはず。
sqrtはなくてもいいの?
>>285 そういう内容に踏み込む場合、REALなんだから二乗する前にABSはとらなくてもいいはずとか、
突っ込みどころいっぱいありすぎ。
そもそもループ変数にoとかpとか使ってる時点で、こいつラリッてるのか、酔っ払ってんのか的気持ちw
質問です。 数値計算をしようとfortranでプログラムを書いて、実行してみたんですが 古いPen4のPCだとCPU使用率が100%までいくのに、新しいi7のPCだとCPU使用率が13%以上になりません。 とりあえず、元のプログラムを6個のプログラムに分けて実行してますがいい方法とは思えません・・ どうしたら1つのプログラムでCPUを有効に使えるようになりますか? コンパイラはg95です
っ OpenMP & gfortran
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 と書いた場合、どっちがメモリ的に あるいはスピード的に あるいは可読性的に有利?
>>290 fortranに文字計算させるの?
数値計算ってそういう物じゃないと思うんだけどなあ
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
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 ----------------------------------------------------------------------
うん、変だよね・・・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ファイルの書き方でうまくいきました! すごいです。こんな方法あるんですね。 勉強になります。 助かりました。ありがとうございました。
えがったえがった
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」
iostat無しだとエラーを受けて終了してしまい、 iostatありだとエラーをエラーコードとしてioに保存してそのまま読み込みつづけただけじゃないの?
303 :
301 :2010/09/15(水) 20:35:31
>>302 よく考えたら2GB以上だと仕様が変わるなんてあるわけないですよね。
ファイルにはn個データが入っているはずなんですが、もしかしたらデータがおかしいのかもしれません。
もう一度調べてみます。ありがとうございました。
>>301 書式無し、でサイズ既知、なら・・・
integer itmp(n)
で宣言した後、
read(num) itmp
と、添字なし表現で読めない?
305 :
301 :2010/09/16(木) 01:37:56
>>304 read(num) itmp
read(num) itmp(1:n)
などと試しましたが同じでした。やはりデータが疑わしいようです。
・・あと思いつくのは・・ 無書式だとメモリ上の0・1の値をそのままファイルにぶち込むだけ(な事がほとんど)だから CPU や OS や コンパイラがファイルを生成したものと違う組み合わせで読み込むと 失敗することがあるよ。 人からもらったデータなら、元にお願いしてプレーンテキストにしてらうのが吉。 情報量は変わらないのだから適当な圧縮をかけるとファイルサイズはそう変わらないはずだ。
Endian とか Padding とかをキーワードにして、いろいろ試してね
文字列として読み込んでみるとか、 何かの値で初期化して IOSTATつきで読みこんでどこでエラーが出ているか確認し、 そのデータ部をバイナリエディタで見てみるとか
プレーンってformattedで出すってことだよね バイナリより数倍大きくなるよね そういえばunfortmattedとバイナリって同じ意味なの?
>>309 今時2ギガが10ギガになったくらいで騒ぐこともあるまい・・。
とりまわしが面倒なら分割すりゃいいんだし。
binary つかったことない・・ Unformatted は306みたいにメモリ上のならびを そのままぶち込む・・と思ってたけど違うのかな?
>>310 最近の数値計算じゃテラのオーダーっすよ。
つーかこのスレにいる奴らもそっち系の人ばっかでしょ?
>>311 unformattedってデータとデータの間に区切りとしてなぜか8byte(?)ぐらい
埋め込まなかったっけ??asciiで書き出すよりファイル容量でかくなって
ビビったような
Padding はありそう・・・とうわけでチェック! 単精度・倍精度・文字列・整数・理論、を100要素のものを無書式で書き落とすと サイズは(バイトで)、 800,400,100,400,400+8(intel fortran)または+16(gfortran) だった。OSはLinux、こまかいDistriは知らんw おまけがつくのはそれぞれのコンパイラの仕様かな? ともあれ、整数・実数・文字列はなんとなく想像のうちだけど、論理(logical)は 本来1ビットだけど、8ビット単位にPadding しているようだ(まあ、その方がメモリ内での とりまわしが効率的なんだろうね)・・・即興の実験終わり。 313さんのはどの種類の変数だったの?
>本来1ビットだけど、8ビット単位にPadding しているようだ ああ、おお間違い。4バイトね。 中身をみたら当然だけど0パディングばかりでスカスカだった。
ああ、もしかすると、301 さんのは データを書き出したコードのコンパイラと読み込みのが別、とか・・かな。 CPU OS コンパイラ の3つ次第でどうにでも変わるのが無書式だし。 単純に同じシステム内で処理をする分には(コーディングも実行速度も) 一番速いけど、他人とのデータのやりとりではやっぱり危険だね。 自分はなるべくプレーンなテキストでやりとりするけど・・・みんなはどうしているんだろう? HDF とかなの?
>>313 例えば、1行の read 文で書き出すデータの総バイト数を表す数字を
データの両側に付けるのは仕様だった筈。ここが C と違う。
integer a
real*8 b
read(unit=9)a,b
とすると、12バイトのデータ(aとb)の両側に余計にデータがつく。
open 文でエンディアンの指定も出来たように記憶しているが、最後
に触ったのが3年くらい前なので忘却の彼方。
>データの両側に付ける direct accessのためにそういう仕様になってるんだっけか ただ、その数字自体のバイト数がコンパイラ依存なんだよな なんで規格でちゃんと決めなかったんだろ >open 文でエンディアンの指定 まじ?聞いたことないけど
320 :
314 :2010/09/20(月) 04:16:07
>317 データの両側に付ける
ためになった。
経験上たいていの無書式書き出ししたファイルサイズが
ちょびっとだけ大きかったから
何か付帯情報がくっついているんだろうな、くらいには思ってたけど
「両側」に「総バイト数」というのは知らなかったでした。
自分のつくったファイルをみるとたしかにそうなってます!
・・・問題は
>>318 さんのとおりコンパイラごとに違うという事か。めんど~
なんか扱いにくいね>unformat 結局binaryが一番ってことか
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です。 お分かりの方がいらっしゃいましたらお教えいただけると嬉しいです。 よろしくお願いします。
手元にコンパイラ無いから検証なしw read(1,'(a)') chara write(*,'(a)') chara で試してちょ。たぶんうまくいくとおもうけど。 長さ指定無しのA は便利。
325 :
323 :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 : : といったような感じなのですが。わかりにくいかもしれませんよね。わからにくいところが ありましたら、ご連絡ください。どうかよろしくお願いします。
>>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 で左括弧だけを取り除きたかったのですが・・・。) ご存知の方がいらっしゃいましたらお教えいただけるとありがたいです。 よろしくお願いします。
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使うのが無難かなぁ
>>327 yy/mm/dd みたいにせめて桁はそろえてほしい・・・
331 的やりかたで年月日の3つの数字を取り出して
・・・先は長いw
Intel Fortranでコンパイル時にOpenMPを指定するだけでオーバーフローになってしまうのですが 何が原因でしょうか? F77のプログラムで、普通にコンパイルすれば問題なく作動します。
コンパイルにしくじるんだよね? 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 のなるようにメンバ変数でループをまわしたいのです
>>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
みんな構造体使ってないのかな
使ってるよ
342 :
デフォルトの名無しさん :2010/10/28(木) 00:42:15
収束しねーよ・・・。(´;ω;`)
343 :
デフォルトの名無しさん :2010/10/28(木) 02:52:36
発散しないのなら、変なattracter に はまった•••となると それが系の本質かもしれないから 頑張れ! ただのタイプミスの可能性も残るけどね
344 :
デフォルトの名無しさん :2010/10/31(日) 20:08:29
Fortran90/95の構文色分けが一番見やすいエディタって何ですか?
vim 真面目な答え
emacs
347 :
デフォルトの名無しさん :2010/11/01(月) 22:38:20
>>345-346 ありがとうございます。
ははー。90以上だと、やっぱりそこらへんですか。
色々試してるんですけど、Fortran対応ってなってるものでも
実質77対応のが多いんですよね…
秀丸+定義ファイルとかもやってみようかな
誰かFortran開発という観点でのエディタ・IDEを評してくれ メジャーな言語だとそういった話題が豊富なんだが、Fortranは寂しい限り
The first argument (X) to the intrinsic SQRT must be of REAL or COMPLEX type, not INTEGER(KIND=3) 平方根計算しようとしたらこんなのでるの
>>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
if…else if…else ifって何個も分岐するならselect case文のほうがいいに決まってるけど、 分岐が2、3個の場合でもselect case文でやるべきか結構迷う。 2、3個程度ならパッと見はifのほうがすっきり見えるからねぇ。
354 :
デフォルトの名無しさん :2010/11/05(金) 15:05:00
>>352 ,353
ありがとうございました。case文で書きました。
もう一度復習してみます。
エディタ色々試し中です。 Win版geditを使ってみました。 Fortran95に対応してますが、 拡張子見て勝手にFortranモードになってくれるわけではなくて 一々手動でモード切り替えしないといけないこと以外は 結構良いですね
知恵を貸してください。 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 ありがとうございます。
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以下)以外のものをはじきたいのですが、 空行をそのまま残す方法がわかりません。 どなたかご教授願います。
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 とか.
モジュールを外部ファイル化して メインファイルとモジュール用のファイルをコンパイルするのって f90 main.f90 mod.f90 でいいの?
363 :
360 :2010/11/18(木) 15:16:58
>>361 お答え頂きありがとうございます。
私の書き方が悪かったのですが、1つのブロックの中の数はバラバラです。
条件によっては書き出し後でそのブロックの中の数が変わることもあります。
>>361 さんのおっしゃる通り、空行まで読むといったん条件を通して
新たなブロックと空行を書くようにすればできそうな感じはするのですが、
「空行まで読むと」という部分はどのようにすればいいのでしょうか?
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 で完結させないでシェルスクリプトなり 使った方がラク.
>>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
>>362 モジュール先に作るべきなんじゃなかったっけ?
f90 -c mod.f90
f90 -c main.f90
f90 mod.o main.o
となるのが無難な気がする.
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
368 :
365 :2010/11/19(金) 01:33:23
index使わなくてよいのか。 勉強になった。 ありがとん。
369 :
360 :2010/11/20(土) 00:28:16
>>364 >>365 >>367 皆様ありがとうございます。
残念ながら、本日はFORTRANを使える環境におらず、
月曜日にもう一度皆様からご教授いただきましたように
プログラムを見直し、計算してみようと思います。
また月曜日にご報告させていただきます。
本当にありがとうございます。それではよい週末を~
結果をご報告いたします
>>367 様のプログラムで計算し、出力ファイルを見ると
全データの中から、すべての空行が出力されておりました。
数値は入っておりませんでした。
>>365 様のプログラムでは、
同じように空行のみが出力されておりましたが、数がかなり少なかったので、
範囲内(j<=123.and.k<=32)にある空行が出力されたのではないかと思います。
もう一度じっくり考えてみたいと思いますが、無理そうなら諦めます;;
お二方ともありがとうございました。
>>366 それでできなかった
モジュールのほうはコンパイルできるんだけどメインがモジュール読み込んでなくてコンパイルできない
モジュールのほうをコンパイルしたときにoファイルだけ生成されてmodファイルが生成されないことと何か関係あるのかな?
>モジュールのほうをコンパイルしたときにoファイルだけ生成されてmodファイルが生成されない これはおかしいね modファイルを作らないコンパイルオプションになっているとか?(そんなオプションあるのか知らないけどw
Fortran が複雑になって行っている気しかしない。 77 の頃に戻ってくれんかな。まぁ幾らなんでも 77 ではヒド過ぎるから、90 程度の拡張で。 一体何処に向って行っているのだろう。学習のコ ストが上がるのは良い事ではないと思うのだが。
>>372 コンパイルソフトが何か分からないんだけど
コンパイルソフト何使ってるか調べるコマンドってある?
学習コスト<学習による恩恵 であれば肯定されるべきだと思うが 言語策定者は「こう使えばシアワセになれるんよ!」ってところを広くアピールしてほしいね まぁそういうことするのは物書きの仕事かもしれないけど でもFortranは少ないからなぁ
test
>>373 そうは言っても、もはや世界がFortranだけで閉じていないから、インターフェース周りを強化しないと
ライブラリのラッパーすらかけない。
伝統的数値計算ライブラリならともかく、MPIとかOSのAPとかIは同じ引数が色々な型を取ったりするから
そういうのに対応しようと思うと、多態型とかOOPっぽい機能が必要になるし、Cの呼び出し規格との
共通化も必要になる。
数値FormatがIEEE745に統一された以上、数値計算主役のFortranでは、その代数系を操作する
命令も欲しくなる。組み込み関数ももっと色々欲しくなる。
CPUも並列が当たり前になりつつある今、それに向いた命令も欲しい。
とはいえ他の言語のように、F90を削ったコア部分と標準Moduleみたいな形に分割したほうがいい気はするけど。
過去互換性をかなり保ったまま肥大化したから、命令の直交性なんかが悪くて、新規学習者に負担が
重すぎる気がする。
>>377 学習負担そんなに重いかな?
Fortran使う分野は特殊なんだし、ユーザもそれなりのレベルを前提としていいと思うけど
あと、
>MPIとかOSのAPとかI
は
>MPIとかOSのAPIとか
だよね?
>>378 >>MPIとかOSのAPIとか
>だよね?
んだ。すづれい。
>学習負担そんなに重いかな?
90/95を77を横目に見つつ66以前を無視する形で学ぶ分にはいいかもしれんが、
これに2003が加わるときついような。やや95と挙動が変わっている。
CLASSの作り方とかも不細工だしww
380 :
デフォルトの名無しさん :2010/11/23(火) 18:06:40
計算時間長いプログラムをデーモンとして走らせたいんですけどどうやったらいいんでしょうか. コンパイラはpgiです.
Fortranで用意されている関数やサブルーチンを詳しく網羅しているサイトってないですか? やはり本家を見るべきですか?(その本家がどこかも知りませんが・・・)
サブルーチンは自分で組み込むもんじゃないのか
内蔵してるサブルーチンでしょ system_clockとか
385 :
デフォルトの名無しさん :2010/11/25(木) 22:46:02
intel fortranは拡張機能で、内部手続きを別の手続き に渡すことを許している。他のコンパイラでは、もし 2003に対応していたら、手続きポインタでさして、わ たせば、一応機能しているように見える。が、偶然の 可能性もある。2003の手続きポインタがさせる先は仕様 でどうなっているかを教えていただけないだろうか。
Fortranである変数や配列のアドレスを知る演算子はありますでしょうか?
387 :
デフォルトの名無しさん :2010/11/26(金) 19:02:26
非標準だが、LOCまたは%LOC関数が使えることがある。
>>387 ありがとうございます
非常に助かりました!!
ちゅっちゅっ
389 :
デフォルトの名無しさん :2010/11/27(土) 15:57:44
>>372 富士通だとデフォルトでは生成されない
frt -c -Am -M./ (なんとか.f90)
でいけるのではなかろうか。いずれにせよ、
frt -help | less
とかやって、"module"で検索を掛けるのが吉。
>>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月にとまり確認できたはじめのケースです。 以下どうなっているのかはまだ確認中です。
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 ~ ~」と教わったのですが具体的に何が違うのですか? 質問長くなってすいません。回答お願いします
>>390 だけど
今日試したら無事コンパイルできて実行できた
プログラム書くのがだいぶ楽になったわ レスくれた人たちありがとう
>>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の違いはコンパイラの違い.
indexやmaxどころかINTEGERやIF、THENまで変数等に使えるのがFORTRANの良いところじゃないかwww
>>396 ,
>>397 ありがとうございます
indexってネットで検索したら関数として乗っていたのでてっきりそっちかと思ったら
ただの配列だったんですかw
おかげで謎が解けました。すっきり
400 :
デフォルトの名無しさん :2010/12/01(水) 03:57:06
interfaceブロックの中には、型定義だけでなく、implicit noneも 及ばないのな。なんで、こんな仕様にしたんだろう。 Fotran2003からimportで取りこめるようになったが、2003完全サポート なコンパイラは少ない。
完全サポートって完全準拠って意味? もうすぐ2011になろうってのに
コンパイルすると「do文にパックド命令が出てきます」って表示されるんだけどどういう意味? コンパイラは富士通で一応ちゃんと実行できるんだけどなんか怖い
infoseekのweb終了で「フォートランナーのためのFortranあれこれ」っていうサイトが見れなくなってしまいました。 かなり好きなサイトだったのですが・・・ここ見てらしたら是非復活お願いします>作者さん
.not. と .and. と .or. の優先順位ってどうでしたっけ?
優先順位: (高) .NOT., .AND., .OR. (低)
407 :
デフォルトの名無しさん :2010/12/07(火) 03:35:33
自分は怖いから くどい位に括弧付けてる
Cの i++ みたいなインクリメント演算って i=i+1 とするより早い(専用の処理をするから)と聞いたのですが Fortranではそういうのないんですか?
>>409 そりゃ相当おバカなコンパイラだけ。
普通は最適化で同じコードになる。
>>410 そうですか(^^;)
今のご時世気にする必要ないんですね
>>409 何もしなくてもコンパイラが勝手に宜しくしてくれるとかないの?
構文解析だけの問題のような気がするけど。
意味的には、 (i++) の式の値はインクリメントする前の i の値で、 (i=i+1) の式の値は代入された加算後の i の値なので、 意味が異なるから構文解析だけの問題ではない。
でも ++ や += が使えたら便利だとは思う
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++がうらやましくなったりはする。
C++って配列演算ってあるっけ?
std::valarrayとかか?
420 :
デフォルトの名無しさん :2010/12/14(火) 23:55:57
>>419 たとえ速くとも、こんなん書きたくないよ、
というのが、正直なところ。ライブラリで、
プログラマビリティを上げるのは限界が、
あって、豊かな配列操作を組み込みでもっ
ているfortranにはかなわないでしょう。
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のときは付くのだと思うのだが。 該当箇所(呼び出し元と呼ばれる手続き)を見せれる? 渡ししている変数の型と、読んでいる手続きの引数の型が わかればいいです。
430 :
428 :2010/12/17(金) 15:40:59
>>429 解決しました。
問題の箇所は、変数Aが
親ルーチンで配列
子ルーチンは実働が無いので変数
孫ルーチンで配列
にて宣言されていたためです。
リリースモードではスルーされていました。
ありがとうございました。
>>414 それはアセンブラのINC命令とかADD命令に一対一対応していた頃は意味があったかもしれないが、
いまさらただの表記の慣れの問題にすぎんだろ。
>>416 F2003でASSOCIATE命令が出来たから、がまんできるべ?
>>420 F95以降ELEMENTAL FUNCTIONをユーザー定義できるようになったから、スカラー用の関数を書けば
多次元配列を引数に出来るので便利。
これはLISPとかのMAPと同じようなもんだが、マクロと実行命令ではスピードが違うから
配列操作が多いならFortran以外ないだろう。
話にあんまついて行けてない・・・ 多分レベル差がありすぎるんだと思う 誰かF2003あたりの本書いてください、オナシャス!
せめて画像回転ぐらいしようや 読ませる気が無いとしか思えん
ルンゲ・クッタ法を教えて下さい、なら 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
そういやルンゲクッタの証明ってどうやんだっけ・・・ たいていのテキストには式しか書いてないよな
439 :
デフォルトの名無しさん :2010/12/22(水) 21:50:33
dx(t)/dt = f(x) の関係を使って、xの高次の時間微分をfのxによる微分に置き換える (いわゆるチェーンルールを使って) 係数を知ったうえで、4次までの展開になっていることを確認したことが あるが、それでもかなり面倒な計算になる。
>>437 さんありがとうございます
さっそく明日やってみたいと思います
>>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になってしまう 数学板とで迷ったけどアルゴリズム的なことだったらこっちかなと思って聞いてみる 誰か分かる人いたら教えてください
444 :
443 :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)
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で計算してるけど最終的にはもうちょっと複雑な関数になる
「情報落ち」だな
447 :
デフォルトの名無しさん :2011/01/07(金) 00:34:52
ググれ このごろじゃ計算誤差について何も教えてないのか 最後に合計を見るだけじゃなく 実際に何を足してるのか出力してみろ 何が起きてるのか分かる
>>448 把握した
今このプログラムは実数が単精度になってるから倍精度にして
h1~h8まで出力してみて確認してみる
450 :
デフォルトの名無しさん :2011/01/07(金) 20:40:05
あぁああ~ 乱流モデルの差し替え、うまくいかねーーーーーーOTL なぜあぼーとするんだ・・・ だれか助けて・・・
じゃあDNSで
>>443 だけど単精度から倍精度に変えて情報落ちしてるであろうSの計算方法を変えたら問題解決できますた
>>448 昔のほうがしっかりしたカリキュラムだったって話を聞くが本当なのか
ゆとり教育ってやつか
>>453 昔は電子計算機という前提のカリキュラムだったが、最近は学生全員にノートパソコン買わせてるのに
プログラミングも教えないからな・・・
なにそれひどい
>>442 さんありがとうございます
おかげである程度理解できました!
457 :
デフォルトの名無しさん :2011/01/13(木) 13:52:47
FORTRANの課題が出て〆切が月末なんだ。 三問ほど有償で解いてやんよって人いないか。
とりあえず問題晒してみそ 誰か解いてくれるかも
460 :
デフォルトの名無しさん :2011/01/14(金) 00:02:02
お言葉に甘えて失礼します。
とりあえず一問目。
「ある動物園の一日の総入園者数(1行目)と入園者の年齢(2行目以降)が
収納されているファイルからデータを配列に貯えて、平均年齢、及び最高年齢と最低年齢を
求めて出力するとともに、各年代(10歳未満、10代、20代、・・・70代、80歳以上)ごとの
入園者数を出力するプログラムを作れ。
また、平均年齢は小数点以下第1位まで示すこと。」
データはここ。
http://www5.plala.or.jp/selene-kw/ 宿題代行スレでないのは百も承知だが、ここ以外にFORTRAN師探せなかったんだ。
なにかしら反応もらえると助かる。
よろしくおねがいします。
90でも77でもいいです といってもあまり違いが分かってるわけじゃないのですが
>>460 ここは宿題スレだからスレの趣旨には合ってる
>>460 予想してたより簡単で拍子抜けしたw
暇ができた時にまだ誰も解いてなかったら答えるよ
でけた 年代別のところは途中で端折ったから自分で補え 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
ありゃ、タブは2chじゃ無視されるんだな 適宜字下げしてくれ
あと、連続したスペースも無視されるようだから a8 の中身も適宜修正してくれ intelコンパイラ、f90形式でうまくいくのは確認した
スペースを&#160;←これを半角で入れるとちゃんと字下げされるんだけど コピペした時に削らないとコンパイルできないので置換する必要がある
469 :
デフォルトの名無しさん :2011/01/14(金) 23:17:59
早っΣ(;゜д゜) 親切な回答ありがとうございます!! C言語の代行が企業だと50万かかると検索して出たから 有償とかそれなり覚悟してたんだ。 3問中の1問は自力で解くことにします。 もう1問も類似したプログラム見つけるなりしてみる。 どうしても無理げだったら聞きにこさせてもらうかも。 本当にありがとうございます!
>>470 435の画像が見られないので何ともいえないけど、442では無理なのか?
472 :
471 :2011/01/16(日) 21:05:21
>>470 今どんな状態か報告すれば親切な人がアドバイスしてくれるかもしれないよ
構造体で配列を定義するとき、配列サイズを以下のように定数で指定すると 「構造体ではattribute指定できない」という旨のコンパイルエラーになりました。 type test integer, parameter :: n = 10 integer :: a(n) end type type(test) :: test1 end parameterを使わず、integer :: a(10) とすればもちろんコンパイルできますが・・・。 やり方・考え方がおかしいんでしょうか?ご助言お願いします。
>>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)|がフィットできるかどうか見てみてください これをどのようにしていけばいいかおしえてください.
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に近付くことを確認すればいい.
>>474 定数を構造体の前に置く
integer, parameter :: n = 10
・・・
type test
integer :: a(n)
end type
・・・
480 :
477 :2011/01/18(火) 20:19:13
構造体って数値計算だと遅くなるから使わないって聞きますが本当ですか? クラスも構造体も使えないとなると相当生産性悪いような気がしますが
>>481 構造体使うとメモリアクセスが非連続になるからね
この辺の事情はCでも同じじゃないの?
反復計算は配列を何度も読み出すから
これが構造体になるとキャッシュヒット率はガタ落ちになる
なるほど でも物理系の数値計算って最終的に Ax=b を解く問題に帰着するケースが多いし 計算時間の大部分はこれが占めますよね そうするとA, bさえ連続な配列にしておけば、残りのデータは構造体でもいい気がします
>物理系の数値計算って最終的に Ax=b を解く問題に帰着するケースが多いし あ、そうとも限らないか^^; 訂正します まあ何事も用途次第ということですかね
ttp://www.mm2d.net/c/c-15.shtml Cでも同じような感じだね
ただしメモリ配置を明示できる点で若干のアドバンテージがあると解釈した
>>483 例えば,問題,各パラメータ,求解時間を格納する程度なら
構造体使っても差は出ないと思うけど,
行列やベクトルはメモリ上で連続になる配列を使うのがセオリーだね
CG法なら探査ベクトルや残差ベクトルもみんな1次元配列
行列も非零要素だけ抜き出した1次元配列とポインタを格納する配列があればいい
物理計算に構造体使ってるプログラムは見たことが無いw
>>484 うんにゃ,その認識で合ってる
ほとんどの物理現象は偏微分方程式で書き表わせるし,
偏微分方程式を離散化すれば線形方程式系になるよ
ここの人達は行列ソルバは自作したりします? 自分はLAPACKに頼りっきり… ライブラリがないと何もできないような人間になっちゃいそうで怖いけどw
>>487 私は LAPACK 使ってます。自作できるほどのスキルが無いので。
それでも数値積分は泣く泣く自作した覚えがある。
>>488 自分もガウスルジャンドル積分くらいですかね、自作したのは
特殊関数とか自分で書くの無理だよなぁ…あれは
ソルバの研究中です まだ駆け出しですが
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)の表し方が分からないのでおしえてください。
>>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がいくら以上であることが必要かを求めるプログラムを作成せよ。
この場合はどうすればよいですか?
ループ内で誤差を計算し, ループを do while に書き換えるか if (~) exit でループを抜ければいい そのときにループが何回回ったかを数えろ つーか質問の丸投げはよそうや 「~って考え方で合てるか?」とか 「こう書いたが計算が合わない」みたいな質問の仕方にしようぜ 自分で考えた痕跡が無いと答える気が失せてくる
498 :
デフォルトの名無しさん :2011/01/21(金) 09:52:44
すいません わかりました ありがとうございます。
sinとdsinみたいな総称名と個別名はどちらを使うべきですか? 総称名はバグの元なので危険という意見もあれば、逆に見通しが良くなってバグも減るという考えもあると思います。 ただ、型変換のreal, float, dbleあたりは常に注意が必要だとは思いますが。
>>499 総称名は引数の型を問わないけど
個別名は引数の型が限定される
pi が単精度型だと
sin(pi) はOKでも dsin(pi) はエラーを起こす
ただし前者で得られる答えは単精度だから、
倍精度の答えが必要なら dsin(dble(pi)) とする必要がある
仮に pi が倍精度なら sin(pi) も dsin(pi) も同じ
この辺はコンパイラが勝手に辻褄合わせてくれるかもしれんけど
>>500 ありがとうございます。確かに Intel Fortran 11ではエラーになりました。
よく考えたら、piが単精度な時点で dsin(dble(pi)) とやっても得られる精度は sin(pi) と
全く変わらないわけですから、結局のところ個別名を使う理由なんてなさそうですね。
つまり、型の間違いによるバグは個別名を用いたところで解決できるものではなく、
型の間違い自体をしないよう代入・演算を気を付けるしかない、ということですね。
>>501 >dsin(dble(pi)) とやっても得られる精度は sin(pi) と全く変わらない
まぁその通りだけど、sin(pi)を他の倍精度型の数値とかけ合わせたりする時が怖いね
型を明示する時以外は総称名で事足りるけど、
計算バグ除けには個別名が便利なこともあるって認識だな、俺は
>>502 確かに、いつも型を個別名にしておけば、書き間違えたときにコンパイラが教えてくれるというのは利点ですね。
やはり、少なくとも単精度・倍精度が入り交じるときは個別名を使ったほうが良さげですね。
内部副プログラムの関数(メインプログラムのcontains以下に書いた関数)の仮引数に optional属性を付けると変なところで関数を抜けてしまうようで、なんだか挙動がおかしいです。 手元の本(数値計算のためのFortran90/95プログラミング入門、牛島)を見ますと、 「モジュール副プログラムではそのまま使えるが、外部副プログラムの場合はインターフェースが必要」 という記述があったのですが、もしかして内部副プログラムではoptional属性は使えないんですか? というか、内部副プログラムの関数とモジュール副プログラムの関数は機能的に同じだと思っていたのですが、違うんですか?
>>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な引数をチェックなしで使ったり
誤って主プログラムで宣言した変数を内部副プログラム内で書き換えたり
してるんじゃないかな?
506 :
471 :2011/01/25(火) 00:05:02
>>478 便乗質問ですが、定数って構造体の中では作れないんですか?
それってちょっと不便じゃないですかね?
>>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の倍数 以後からの行すべてを出力というのはどう書いていいのか。。 どうかアドバイスいただけないでしょうか?
510 :
471 :2011/01/25(火) 20:25:36
mod使って24で割った時の余りの値で制御すれば良いんじゃないかな
すまん。上は24で割って整数化しちゃえばのミス
俺だったら 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行分書いていくのは、しんどいですよね。ただちょっと書き方参考にさせていただきます。
>>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
補足すると write(temp,"(I5.5)") k は5桁で空の部分に0を補って数字をtempに書き出す(ex 1→0001)やつだから
>>514 UNIT番号は機種依存だが、99までだったりすることが多いぞ。
ファイル名を動的に生成して開くほうが良いアルヨ。
517 :
デフォルトの名無しさん :2011/01/26(水) 12:20:43
>>514 ,515
ご丁寧にありがとうございました。
今日自分で書いてやってみます。
また、わからなかったら書き込むと思いますので、また見かけましたら
よろしくお願いします。
>>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を入れてプログラミングを始めたんですが、 アイコンへのドラッグ&ドロップを実装したいんですがどうしたらいいんですか? よろしくお願いします。
522 :
521 :2011/03/09(水) 18:49:58.61
自己解決しました。ありがとうございました。
524 :
デフォルトの名無しさん :2011/05/01(日) 07:09:28.70
gfortranで可変FORMAT文を使えますか?
< >つけてやってみたけど、できませんでした。 可変使わなくても対応できたので、問題はありませんでしたが。
質問です。 Fortran 2003でチェスのプログラムを書いています。 対戦相手の入力待ち時間内に並行してチェスのシミュレーションを行いたいのですがどうしたらいいでしょうか? たとえばreadを使うと入力するまで計算が止まってしまいますが、計算を止めないまま予測計算を継続させられませんでしょうか?
>>527 F2003規格には、asynchronous I/O というものがある。
理屈の上ではそれを使えば良い。今のコンパイラで実装されているか不明。
野蛮になっていくが、OpenMPとかでOSのAPIでスレッドを投げる手もある。
>OpenMPとか、MPIとか、コンパイラ並列拡張命令、OSのAPIでスレッドを投げる手もある。
>>528 サンクス!とりあえずIntel Fortran XE Compilerは対応してるっぽいわ。
ついでに関係ないけどMATLABもAsynchronous inputが2010aからできる。
長年の疑問が解決したわ。チョーありがと。
GPU Fortranで書こうかと思ってたけどCUDA Fortran高いからIntel FortranとMATLAB GPUでコードかくことにします。
>>530 おっおっ ( ^ω^)
MATLAB買う金あるなら、PGIのコンパイラをアメリカからダウンロードで買える気が・・
>>531 MATLABは海外の大学にいるんだけど工学部全体でまとめ買いしてるからタダなんだわ。
どっちにしろ6000円くらいだよ、アカデミックだと。ツールボックスついてないから無意味だけど。
毎学期技術料で2万くらいとられるけどな!
>>530 自分にスレだけどMATLABは完全にはAsynchronous I/Oに対応してなかった。。。
もうめんどくさいからC++で書こうかと思う・・・GPU CUDA C++サポートしてるし。
>>529 どちらにしろどうもありがと。
>>534 パソコン一台でしか処理できない点を除けばオールオッケー!
おっおっ ( ^ω^)<朕に感謝せよwww 日々、国民の皆様がすこやかに過ごされるよう切に願っておりますおっ!www
fortran95を使ってます 今open、close文をやっているのですが、入力ファイルの作成方法がどんだけやっても、まったくわからないです 作り方もしくは参考になるサイトを教えてください
openしたら入力ファイルは作成されます。
fortran90使ってます 読み込んだファイルの列数を表示したいのですが、 なにかうまい方法はないですか?
>>540 列の区切り文字はなんだ? というか、数えたい例を1行書いとくれ。
>>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次元配列に入れたいのですが、
その時の列数と行数を知りたいといったところです。
行数はカウントできたのですが、列数の仕方がわからなくて・・・
>>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
コンマとかが区切り記号なら。 n = count( transfer(trim(text), ' ', size = len_trim(text)) == ' ,' ) transferで有限長の文字列を1文字の配列に直して、そして区切り記号の数を数えている。 欲しい数は、区切り記号の数+1個。 しか~し、区切りが任意個のスペースの場合はめんどい。
任意個空白区切りの場合(素朴法) &
>>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
モジュール内で定義してある関数を、そのモジュール内のサブルーチンで使う時、 サブルーチンの頭で関数を宣言(real some_func)するとエラーになるようになtった のですが、これは仕様が変わったのでしょうか?
>>547 そんな事はない。
実例を上げてみてくれ。
549 :
547 :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
>>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内の副プログラムでは、この手の宣言しないのが一番普通だと思う。
551 :
547 :2011/05/26(木) 14:04:36.99
>>549 返信ありがとうございます。
とりあえずは、こういう宣言はしなくていいという事が分かって良かったです。
F90 の言語仕様をちゃんと勉強しようと思います。
allocateにラッパを被せたいのだが、Fortran90の仕様では無理? 配列を割り付けて、そのポインタを返し、 返り値statを見て、エラー処理をしたいのだが。
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 とエラーが出てしまいます。 原因わかる人いたら教えてください
LOGON TSS ナツカシすなあ
メムバ、だっけ ディレクトリにあたるの
フォートランをダウンロードしたいのですがどうすればいいのですか? 散々ググッたにもかかわらずよくわかりません。>< オススメのサイトがあったら教えてください。
559 :
557 :2011/06/14(火) 00:59:45.55
g95は落としたのですがいざメモ帳にプログラムを書き込み 保存後、コマンドプロンプトで実行するとNo such file or directory とエラーメッセージが出ます。どうすればいいのでしょうか? ちなみにg95をタイプした後エンターキーを押すとNo input file と出るのでフォートランのダウンロードには成功していると思います。
>>559 とりあえず、思いつくこと。
1.日本語の入ったディレクトリを避ける。
2.メモ帳でセーブするとき、拡張子がtxtにならないように” ”で括るなど注意すること。
3.g95 xxx.F90 のように拡張子も含めたファイル名を与えること。
こんくらい?
しょぼい統合環境でいいなら、フォースを使えルーク。
http://force.lepsch.com/
561 :
557 :2011/06/14(火) 18:47:00.65
ありがとうございます。 とりあえずやってみます。
gfortran がタダだし 仕事場のマシンと自宅の私物Win機で 挙動がまあ同じでOpenMP使えるし デバッグやチェックがIntelのより 親切だから使ってるけど・・・ g95ってイイの?
>>562 二つともフォークしたものだから、根本は変わらないのではないかと。
最近の様子は知らんが、g95はOOP機能を入れる方を優先していたが、gfortranはcoarrayとか並列化に熱心だったイメージ。
漏れのあやふやな記憶が正しければ、元々gfortranのオッサンがひとりでコツコツノロノロg77を90以降に拡張していたが、
gccとかとの統合の頃に、いろんな人が参入してスピードアップ。しかし、オッサンは方向性の違いからまた一人でやりたくなって
フォークした。
ガチ初心者です。 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 (^) と出てきました。 何がエラーなのかわかりません! どう問題なんでしょうか?
一行一ステートメント 一期一会な >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
564です。 返事が遅れましたが、、、 助かりました!感謝です!
>>566 --------------------
[[[[[[[ 返事が遅れましたが、、、 ]]]]]]](きリッッッッ!!!!
----(きリきリッ
----
[[[[[[[[[[[[ 助かりました!感謝です! ]]]]]]]]]]]](きリッ!!キリッッ!キリッッ!!きリ!!!ッッッッ!!!
本当にバカだな
568 :
デフォルトの名無しさん :2011/08/23(火) 17:07:46.74
フォートランをやりはじめたばかりの超初心者です サブルーチンに引数として渡すものと、 モジュールで渡すものはどういう根拠で区別すればいいんでしょうか? 全部引数で渡すこともできるとは思うのですが、 モジュールも組み合わせた方が良い場合もあるんだろうと思います 最初のうちに正しい渡し方を覚えておきたいので...
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 コンパイルできないとです;; 原因を教えてください
Intelのコンパイラ最新版 インストーラでエラーでるんだけど、同じ症状の人いない? たぶん .net Ver.4 絡みだと思うんだけど、インストールしてもうごかん・・・ 英語版と日本語版の違い? VS2010でEDITORの補助が増えたらしいので興味あるんだが・・
>>569 >'imaginary_part = ',ipart
この行を前の行び後ろに続けて1行とするか、6カラム目に継続記号を入れればおk。
>>568 個人的な考えで回答します。
基本的に、引数として渡す方がプログラムが見やすいと思います。
見やすいということが非常に大切です。
モジュールとしてまとめてしまうと、別の場所(そのサブルーチンとは離れた場所)に
宣言が書かれることになるため、変数が何を意味しているのか、そのサブルーチン独自の
変数なのか、などがぱっと見てわかりにくくなる恐れがあります。
特に、大規模なプログラム、サブルーチン毎に一つのファイルに分けているような
場合には、そのように感じます。
ただ、引数として並べたときに数行になってしまうくらいに引数が多い場合には、
モジュールを利用した方がいいかもしれませんが、その場合でも、サブルーチンを
呼び出すごとに変化するような変数は引数として渡した方がいいでしょう。
一方、全プログラムが一つのファイルに収まってしまうくらいに小規模なものは、
サブルーチンを一つのモジュールの中に入れてしまう方がいいでしょう。ただし、
その場合でも、なるべく引数を使って渡す方がいいと思います。
超絶初心者です。 学校のパソコンでfortran77を使っており、自宅のパソコンでもできるようにコンパイラをダウンロードしようとしたのですが、 Salford FTN77 Personal Edition Compilerをインストールする途中で止まってしまいます。 WinZip Self-Extractor-ftn77pe.exeというウインドウのSetupを押したっきり変化がありません。 エディタは学校でCpadを使っているので自宅のパソコンにもダウンロードしたのですが、コンパイラがうまくダウンロードできているのかもわからず コンパイラのパスもわからず、どうしたらよいのかわかりません。 いろいろ調べてはみたのですが…
>>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(笑) なんつって( ^ω^)
www rand() で試すか・・・乱数生成くらい自分でつくれ。
>>575 CからのFortran呼び出しでは、サブルーチン名の規約が処理系によって異なるのでマニュアルを良く読むしかない。
頭にアンダースコアがついたり、全部大文字になったり、引数のバイト数が尻についたり千差万別。
コレをエレガントに避けるにはFortran2003の、C呼び出し規約互換の命令があるのでそれを使うべし。
ただいまの場合、Fortranのライブラリをリンクしていないだけもするので、まあマニュアル読んで頑張れ。
安直な手としては、Fortran90の乱数ルーチンを呼べば外部ライブラリ絡みの厄介は避けられると思う。
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
文字列として読めばいいんじゃない?
あるいは書式に'err=行番号'をつけるとか
>>580 文字列として読み込めばできました。
ありがとうございました。
>>579 は本当にそれで解決できたのか?
読み込んだ数値をどう使うのか知らないけど、自分には、
なんで文字列として読み込んで満足できるのかワカラン
>>579 , 582さん
エラーの内容は、基番12のファイルの最後以降を読み込もうとした、
ということ。基番10の'NaN'の読み込みのことではありません。
別の原因、別の場所でエラーが発生していると思います。
本当に解決したの? 583さんと同意見です。
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 といった計算を行いたいのですが・・・
「4次元配列を2次元に配列にまとめたい」っていう目的と 実際に提示されているコードが自分には結びついていないけど、 配列変数の定義で配列の次元やサイズはちゃんと書いた? real(8) :: x(100, 100, 10, 10) real(8) :: y(10, 10) みたいな記述が必要だと思うけど。
>>586 配列の定義はしてあります
x(k,l,1,1)のkとlの合計10000個の数をy(1,1)に足しこんで
次はx(k,l,1,2)のkとlの合計10000個の数をy(1,2)に足しこんで
といった具合にプログラムを書きたいです
説明下手ですいません
>>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ループグリグリでいいと思うけどね。 コンパイラが勝手に最適化してくれるだろうし。
PGI Visual Fortran 11.9 のコマンドラインでのコンパイルについて質問です。 以下のようなソースコード goodbye.f90 を作りました program goodbye write(*,*) 'Good-bye' stop end program goodbye これを C:\tmp\に保存して c:\tmp>pgf90 goodbye.f90 と打ったのですが,カーソルが次の行に行って点滅するだけで, コンパイルはされませんでした。 何がまずかったのでしょうか?
>>590 それだけでは分からんw
まぁ、end program goodbye の後ろで改行しないまま、end of file に成っている可能性があるかな。
592 :
590 :2011/10/15(土) 20:33:05.02
>>591 レスありがとうございます。
改行はしてありました。
なお,コンパイルを Ctrl + C で強制終了すると,
cleaning up after signal(2)
というメッセージが表示されます。これについても意味が分からないです。
>>592 それは強制終了の事後処理というメッセージだろう。
症状としては、end of file が見つからない感じだから、ctrl-Zないしctrl-Dあたりをうってみたらどうかな?
594 :
590 :2011/10/23(日) 09:32:01.77
>>592 報告が遅れすみません。
再々インストールを行ったら,治りました。
ソフテックに訊いたら,ウイルス対策ソフトがブロックしていたらしいです。
>>594 そういえば一時期ノートン先生がIntelVisualFortranの実行ファイルを削除しまくって閉口したことがあったわ。
596 :
こうちゃん :2011/10/24(月) 15:56:38.58
>>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
ではヘタすると数日、計算がかかるかもしれませんね。
離散化ができているなら、流動方程式を解くプログラムに、拡散項を組み込むだけですから、そんなに難しくないと思います 流動方程式のプログラムなら適当な参考書にあると思います...
あと、境界条件が不安のようですけど、ディリクレ境界条件のようですから、ポイントセントラルでプログラムを組めば少しらくだと思います
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
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
デフォルトの名無しさんへ ありがとうございます!!!もとになるベースがないので本当に 困っていました↓↓ 返信大変うれしいです!!!
>>604 ,607
二度と書き込むなよ、このクズ野郎
どこのスレも変なのがうろついてんな
610 :
デフォルトの名無しさん :2011/10/27(木) 18:21:51.17
困っちゃん
枯れ木も山のにぎわいってことで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 なので、よさげ。{}対をチェックしたら、ちゃんと走ると思うよ。
>>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 のバファリンのようなやさしさに感動した
>>615 の人に質問
DO文ではなくFORALL文を使った理由は何ですか?
619 :
デフォルトの名無しさん :2011/11/08(火) 16:58:07.44
f90とf95ってまったくコードの違うものなのですか?
>>619 f95 は f90 の小改訂版。Fortran は f90 以降、メジャーウップデートと
マイナーウップデートを交互にやることになってる。f95 は f90 を使ってみて
いや~んな点を、かゆいとこに手が届くように修正してある。
あと変なの湧くからsageろよ。
>>620 交互にマイナーとメジャーのアップデートとのことですが、
それなら、今のJIS規格であるFortran2003はメジャーアップデート
みないなものなのでしょうか。
>>621 F2003はメジャーアップデートどえす。
目玉はオブジェクト指向の要素の導入ですが、その他色々便利な改良もあります。
でもあまりに欲張り過ぎて、まだ完全装備のコンパイラが殆ど無いという事実w
ちなみにF2008はマイナーアップデートのはずなのに、coarrayのような並列化命令が入った規格が確定した。
623 :
デフォルトの名無しさん :2011/11/09(水) 01:31:06.92
coarray よさげだよね。
でも完全装備は先かな・・・intel はやる気あるみたいだけど。
>>615 ほどんど重箱隅レベルだけど、個人的には
c(:) = c(:) + dc(:)
s = sum(c(:)) * dx
と配列であることを明示したい。・・・ドツボ防止策。
intel は coarray 結構実装してきてるんじゃない? サンプル以外試してないから詳細は分からんが。 c(:)の配列明示は理念としては理解できるし、f77から移行してきたばかりの昔はやっていたのだが、 f90初期の頃、処理系によってはコロン指定子がつくと無条件にコピーを作って作業して戻すという事をするので、 最適化の観点からなんとなく避けるようになってしまった。最近の処理系はそういうことはしなくなったようだが・・・ サブルーチンの引数でも、生で書くとそのまま渡すが、コロンがつくとcopy in / copy out になって最適化が落ちるとか、 c(0:n) の場合、生で渡すとサブルーチン側でも配列は0から始まるが、コロンがつくとコピーが渡るので1から始まるとか、 その辺の規則がよく分からなっかったので、なんとなく惰性で配列明示しないで生で行ってるw
>>624 ためになった。
ついでに質問。coarray って分散メモリのシステムでもOKなのかな?
MPI とどちらがいいのかなとか、知ってたら書いて。
>>625 coarray は分散メモリーシステム用だな。
MPIより簡単で同等の性能が出るという主張をしている感じ。
分散メモリーマシン時代になってからのクレイが熱心にやっていて、それが規格に導入された?
627 :
デフォルトの名無しさん :2011/11/09(水) 10:02:29.00
うん
628 :
デフォルトの名無しさん :2011/11/09(水) 13:18:34.43
>615さん ではf90に書き直すとそう変わるのですか??
なんか前に ノード内の共有メモリ空間でも OpenMP で書くより ノード間も含めてもう全部 MPI でやり取りした方が、 速い(+楽!)という意見があったような。 なんだろう、共存が面倒な割にはパフォーマンスがあんまりなので もうしない、という事なんだろうか?
>>630 coarrayでググるとCrayのパワポとか出てくるから味噌。
現今のcoarrayは結局MPI上に実装されているので、MPI利用した簡便並列という感じ。
単純な仕事の分割の場合、MPI で書いた並列プログラムは ループの前後に冗長に似た行が続くだけだから、その部分の追加を ちゃっちゃとやってくれるのなら、うれしいね。
Open/MPはスレッド並列だが、MPIやCo-arrayはプロセス並列になってる。
gfortran, バージョン4:4.4.5-1 に関する質問です。 モジュールのバージョンが違うとかで下記のエラーメッセージが出てきます。 Fatal Error: Parse error when checking module version for file 'functions.mod' これってどう解決すればいいですか?
コンパイルしなおせ
>>636 え?コンパイルしようとするとこのエラーが出るんですけど
gfortran hogehoge.f90
ってな具合です
functions.mod というのは、module functions がコンパイルされたときに生成されるインターフェース情報のファイルで これのversion が違うというのだから、これをもう一回コンパイルするべきじゃないかと思う。 最近gfortranをversion upしていたりするならよくある事。 そうでないならば、情報が足りなすぎてなんとも言えない。
>>638 あ、そのとおりです。
しかもフォートランを最近うぷしました。
これってuse mod名をメインプログラムに書き込む前に、一度コンパイルしてmodファイルを作成しなくてはいけないということですよね?
>>635 Debianスレでも聞いてるじゃねーか
>>640 え?聞いてないよ。
今確認したらコピペされててビビった。
信じて
関連するファイルを全部コンパイルしなおせ。
たかだか1行の英文エラーメッセージ。単語11個くらい字引で引けや!インテリの端くれだろw ピカチュウの鳴き声を解釈するより易しいだろ。 それで解決したのか?
>>643 解決致しました。アニキ
一度プログラム中のuse (mod名) 部をコメントアウトし、コンパイルすることでモジュールファイルを生成。
その後コメントアウトした部分を復活させて、再度コンパイルしたら無事できました
>>643 それにしてもググってもこれと同じ症例があまりなかったのに驚いた。
みんなどうしてるのかな~
module functions も、引用する program と一緒のファイルに入れてるのか? それなら、program の前に来るようにして先にコンパイルされるようにすれば問題ないと思うぞ。 gfortran使ってないから分からんが常識的にはそれでおk。 それが駄目なら、ファイルを別々にして分割コンパイルすればよろし。
>>646 アニキありがとうっす!
それやってみます。
アニキとサブとファンクチオン
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
REAL GAY COMMON //ASS, HOLE IF ( ANIKI .AND. SUB ) GOTO 69 69 CONTINUE END
>>649 (.NOT. asshappy)
>>650 リアルホモw
でもその文だとなにも変化がないような気がする。
今だにGOTO文使ってるとかおっさんかよw
\ / .::::::::::::::::::::::::;;:;;::,ッ、:::::: ) く ホ す \ l ,ッィrj,rf'"'"'" lミ::::::: く れ モ ま Y ,!ミ::::::: ヽ な 以 な `ヽ、 | くミ:::::::: ノ い 外 い |、__ ャー--_ニゞ `i::::,rく か は ``''ー- ゝ、'l  ゙̄´彑,ヾ }::;! ,ヘ.) ! 帰 ゙ソ """"´` 〉 L_ っ / i , /| て r ≡=- 〈´ ,,.._ i 't-'゙ | ,へ ,r┘ ,、yx=''" `ー{゙ _, -、 ; l レ' ヽr、⌒ヽ' ゙、`--─゙ /! `、 _,,、- ゙、 ー'' / ; `、 -''"_,,、-''" ゙、 /;;' ,' / 、\ -''" / `ー─''ぐ;;;;' ,' ノ // / ヾ_、=ニ゙
まさかfortranスレでこのAAを見ることがあるとは
GO TO文に怯えるとは、まだまだ坊やだな。 後藤おじさんが手ほどきしてあげよう。 まず全裸になれ。
なりました。 つっ次はどうすればいいのでしょうか?
>>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
∧∧ (д`* ) (⊃⌒*⌒⊂) anal(*) /__ノωヽ__)
みなさま、はじめまして。 趣味でとある連続計算をしています。 いままで、連立一次を解くサブルーチンをつかっていたのですが、 わけあって逆行列単体でシンプルなサブルーチンが必要となりました。 ネット上にN×Nの非対称行列を逆行列にして返してくれるサブルーチンってありますでしょうか? ご存知なら教えてくださいませ。
LAPACK?
>>659 逆行列は、Ax=bのbに(0010..0)のたぐいの単位ベクトルをn本入れて計算するのが基本だぞ。
LU分解のサブルーチンでやればn回繰り返すのも楽勝だ。
>>660 ぐぐってみました。
ソースがHTMMLでUPされてないと、見る気になりませんでした。
すみません。
fortran 逆行列
でぐぐって一番上にでてきたサイト(とある大学の先生のページ)の
「逆行列を求めるサブルーチン」
を実行したんですが、配列異常のエラーが出ました。
連立一次を解くプログラムがあれば、それで逆行列くらい求まるだろ。 それが逆行列を求める定石だぞ。 単位行列のを、1列ごとに連立一次を解いて、それを行列の列が尽きるまで繰り返す。 出てきた答えを、列ベクトルとして並べたものが逆行列だ。 ネットで探して見つからないのは、そうやって計算するから、一次方程式のサブルーチンがあれば十分だからだ。 あるとしても、単に1次方程式を解くルーチンを呼び出すルーチンになってるだけ。 特にLU分解で連立一次方程式を解いてあると、毎回一から解くのではなく、前回の途中経過が利用できるので早く済む。 計算量はN^3に比例するので大きい時はLU分解使わないのは非常識。 問題が小さければ、好きな方式でやっておk。計算法にこだわるほうが非常識。
664 :
デフォルトの名無しさん :2011/11/28(月) 05:47:09.06
くりゅろふ法自作試みて結局投げだして ガウス消去に逃げた事があるw 逆行列計算は奥深いよね。 いまでも計算科学ではメインのテーマの一つ。 で、やっぱりLapack とか MKL とか、かな
LU分解とか一列ごとに解くとか言ってるけど、直接法ならまとめて解けばいいと思うよ。AX=BのBを単位行列にすれば良いだけの話。
inplicitrial*8 とかまだやってるやついるの?
綴り間違えすぎw それに implicit real*8(a-h,o-z) だろw 耄碌しすぎだぞ爺さん。 今のヤングは implicit none で A'GoGo!!
さらにヤングwだと コンパイルオプションで暗黙の型宣言は消去!
>>669 全く見ていないがw よくあることなので推測で書くwww
常数のたぐいは手で1.0から1.0d0のように倍精度に直していないからだろう。
特に収束判定に絡んでくると、単精度のままだとゴミビットが入って精度が腐る。
その前にスペルミスを突っ込みたい。 コンパイルはできたんか?
すみません1.0d0と1.0_8はなにか違いますか
>>672 kind種はベンダー依存なので、今の機種でkind=8が倍精度を意味しているからといって
他の機種でそうなるとは限らない。
ただ世間の慣例としてバイト数を置いていることが多いので、大抵は同じ意味。
もっとも上品にはKIND種をパラメータ変数にしておく。日本NAGの書き方推奨ページに行くとグダグダ書いてある。
オークションシミュレーションのプログラムを作りたいのですが、シミュレーション作成ならfortranだと聞きここにたどり着きました しかし、一体何から始めればいいのかもわかりません なにかアドバイスをしていただけませんか? 一応C言語なら基本は理解しています
www Fortran にできて C にできないことは少ないので、 C で頑張る、でいいのでは? Fortran は・・・ 古い分、蓄積(タダのライブラリとかが豊富)な点 出来ることが少ない分、コンパイラが最適化しやすい事もあるw 教官がそれしか知らんw ・・・あたりがが学術計算によく使われる理由なのではないだろうか。 お好きな言語でどうぞ。
周りに聞ける人がいないなら、ユーザの多い言語がいいよ。 結構な計算するならc++で、簡単な計算ならpythonで良いと思われる。
>>674 内容の理解の方にエネルギーを割いて、プログラムはすでに知ってる言語で書いたほうが良い。
といいつつ・・・w
Fortran95以降プログラム書くのがスゲー楽でかつコードが拍子抜けするくらい短くなる。ピタリとはまる感じと言うか。
昔のプログラムを書きなおしたりすると、1ブロックが1行とかになるので構造がすっきりする。数式そのままで済む感じ。
前は77でも十分だよと思っていたが、言語の進化は大事なんだなと分かったw
コンパイラの最適化も進化している。Intelの最新版使うだけですげー早くなる。
INTENTやPUREその他の宣言をきっちりしておくと意外に最適化に効く。
商用コンパイラ市場が未だに生きているのも分からなくない。
最近アメリカとかでC++に走っていた学術ソフトのFortranへの回帰が始まっているらしいが分かる気がする。
配列操作が多い場合はFortranしか無いわ。マクロや動的呼び出しだと最適化が効きにくいし。
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
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
DO LOOP の所がおかしい。積分の開始を0,π/4 ,π/2,3π/4,πと変えたいとみなした。 DO LOOP変数を i にして、積分の開始座標を t =π/4 * i とした。 貼ってあったのは、全角文字のスペースが入っている上に、改行が狂っている所がある。 それ以外はまぁ間違いは無いとおもう。 台形公式は今の形では同じ座標について2回計算しているので無駄。 数学的には正しいが、普通はこうは書かない。 直し忘れたが、 s = 0.0d0 にしておく必要もある。
小数点以下の数字の量を増やすと関わった覚えのない数字が出てきます 1.0000000038 こんな感じに出力されます どうすれば改善できますか?
>>681 それは単精度なら、本来有効桁が7~8しかないから。
無理に桁数多く書かせることはできるが、それには意味がない。
どうしても意味ある数字を出したければ倍精度にすれば、14~15桁有効桁でおk。
a=1.0 write(*,*) a a=1.0d0 write(*,*) a で微妙に違う値が出る時があるよね。
IBMの16進浮動小数の時代を思いだすんだ。
685 :
デフォルトの名無しさん :2011/12/18(日) 01:18:57.88
>>683 なんで?このテーマで卒論書けるかな?!
「浮動小数点のCPU内部でのとりまわしの現状について」 ・・・まじめにやれば、ハード・ソフトそれぞれで いろいろする事・知っておかないといけない事があるから、卒論ならいいんじゃない? 学科にもよるけど、文献調査+基礎的な試行錯誤を一人でできる事、ができれば 大学院に行く前の基礎技術習得なり就職前に大学で経験しておくべき経験としての 卒論なら万々歳。 博士課程まで行くつもりで学振を年頭に修士一年目に論文出したい子が 学部4年から論文になりそうな事をせっかちに始める人が多いけど、 業界の基本・基礎的な部分にじっくり思考や文献調査に時間かけたことが無い子が多い。 よくない。
>>685 単精度と倍精度の差でしょ?
何をテーマに研究するの?
688 :
デフォルトの名無しさん :2011/12/19(月) 23:18:59.58
ウィキペディアに乗ってそうだな
大学でFORTRANを習っています。 プログラミング界だとどんな位置付けですか?
692 :
デフォルトの名無しさん :2011/12/25(日) 18:00:07.19
>>691 fortranは総理大臣
c++は校長先生
phpは地方公務員
htmlは乞食
FORTRAN教えるようなとこなら真面目にやっといて損はないよ
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文がうまく回っていません。なぜでしょう? そして、目的とする答えがでません。よろしくお願いします
突っ込みどころがありすぎて困るが、これは元プログラムをいじって切り出したものなのか? 情報が少なすぎて困る。 せめてコンソールの出力も見せてくれ。 与えられた範囲では、整数型に文字列を入れていて、66時代ならありだが、コレのせいで二番目によむファイルが上手く読めなくて ENDofFILEでさっさと抜けているのではとしか思えない。
とりあえず、ifileを宣言してないよ。 implicit none をつけてコンパイル出来るようにしてから、質問するとまともな回答が帰ってくると思います。
699 :
695の者です :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
700 :
695の者です :2011/12/27(火) 19:25:49.40
[mm5@envisat AMSR-E]$ pgf90 match-up2.f OSはlinux fortran90を使用しています いかがでしょうか?
endの前にstopを置く習慣はどんな経緯から?
702 :
695の者です :2011/12/27(火) 19:46:37.19
701さん これは先輩から教わりました
大昔は program stop end subroutine/function return end しないと挙動が怪しかったw
>>701 むか~し、むかし、お前の生まれるよりずっと昔。
この世にはアセンブラとFORTRANしか無かった頃の話じゃ。
FORTRAN I には、END文は無くて STOP 文でプログラムは終わっていたのじゃ。
STOP文の後ろに8進法の数字を書いておくと、それに合わせてコンソールのランプが明るく光ったのじゃ。
エラーコードの先祖じゃ。今でもSTOP文の後ろに整数が書けるのはその頃の名残じゃわい。
ところでその頃は、サブルーチンもファンクションもなくて、文関数しか存在していなかった。
しばらくして FORTRAN II の時代になると、卵からサブルーチンとファンクションが出てきたのじゃ。
ところが、JOBカードのなかでメイン・プログラムと副プログラムの区切りがつかなくなって村人たちは困ったのじゃ。
するとどこからとも無く END文がやってきて、区切りがつくことになったのじゃ。
それ以来、FORTRAN では、STOP END と書くようになったのじゃ。
STOPを抜かすのは下品で育ちの悪い人とみなされるのじゃよ。
とっぴんぱらりのぷ。
>>699 第一のループは10万行のデータを読み込もうとしている。ところがデータは一万五千行しか無い。
故に途中でEOFに出会う。するとEND=99によってラベル99に飛ぶ。よって第二のループは実行されない。
ところが出力はされる。結果は腐っている。
ではどうすれば良いのか?ラベル99の行を第一のループと第二のループの間に置けば良かろうかと思う。
fortranってなんで土木系で好まれているの?
土木系に限らず固体を扱う場合は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とかのファイルにすればいいじゃ?
>>709 理屈の上では昔のCOMMON文のノリでMODULEにまとめればよい。
しかし、それはほぼ逆走に近い行為w
712 :
デフォルトの名無しさん :2011/12/29(木) 14:28:31.76
>>711 逆走に近いとは…?
fortran 設計の理念に反するとかそういうことですかね?
パラメータだけで1000ステップ超えてるのでなんとかしたい
んですよねぇ。
理想としては、これからもパラメータが増える予定なので
パラメータを追加する際、main program をいじらないで
別のファイルで管理しているものに追加していきたい。
またそれに伴って、自分で定義関数関係も増えるので
関数も別にプラグイン的なノリで管理したいんですが。
>>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文もまわりましたが、結果は変でした・・・
装置番号がよく分からないけど、2乗して2乗根もよく分からないぞ
>>709 可能。
まとめてコンパイルすればよい。
オブジェクトファイルを生成するのが正しい姿勢。
moduleは本質的な答えではないので注意。
>>714 全ての変数の型を宣言してよ。
あと、何がしたいのかよく分からん。
>>714 あんた質問の仕方が下手だなw Googleとかと同じで、上手く質問しないと中々正解にたどり着かないぞ。
ラベル99の文を動かした結果、第二ループが回ったのか?
結果がおかしいとは何を以てそう言っているのか?
おじちゃんに正直に話してご覧。ポッキーあげるから。
━━━━━━━一
━━━━━━━一
━━━━━━━一
━━━━━━━一
━━━━━━━一
━━━━━━━一
スティック状の線香じゃないんだから、ポッキーは ━━━━一 こんなもんだろ。
長いぜオレのチンポッキー ━━━━━━━一ω
震災のとき、なにしてた?
722 :
デフォルトの名無しさん :2011/12/30(金) 23:22:17.74
>>721 プログラミングかな。もちろんFortranでね。
723 :
デフォルトの名無しさん :2011/12/31(土) 15:01:30.29
>>716 ご返信ありがとうございます。
オブジェクトファイルを生成するようコーディングすればいいのですね。
ということは module はまた違ってくるわけですね。
724 :
723 :2011/12/31(土) 19:22:48.34
ちなみにオブジェクトファイルを生成するにはどういったおまじないが必要なのでしょう? main.f90 の他にパラメータ群をコーティングしたファイル parameter.f90 があったとして。
.forと .f90 の違いは? 大学時代、ずっと.forだったんだけど
>>725 .for ないし .f は固定カラム形式
.f90 は自由形式 を意味する。
.f95 とか .f2k とかは無定義。正式なものではない。
ifort -r8 -FI hoge.f90 とか、固定書式な部分はコンパイラに任せちゃう。 なんか左8つくらい空白じゃないとムズムズしてしまうので・・。
728 :
デフォルトの名無しさん :2012/01/04(水) 23:05:46.54
優良スレ 普通 クソスレ ┝━━━━━━━━━━┿━━━━━━━━━━┥ 88彡ミ8。 /) 8ノ/ノ^^ヾ8。( i ))) |(| ∩ ∩|| / / <ココ! 从ゝ__▽_.从 / /||_、_|| / / (___) \(ミl_,_( /. _ \ /_ / \ _.〉 / / / / (二/ (二)
ここは「くそみそ」ハッテン場なんだが・・・お前はじめてか?
730 :
デフォルトの名無しさん :2012/01/07(土) 20:10:23.57
だれかー 分かんない問題あるんだけどー
書いてみろ。といてやる。
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 人 ドキドキ
FORTRAN77で書いて欲しいかね90でいいのかね? おじちゃんに言ってみなさい。
734 :
デフォルトの名無しさん :2012/01/07(土) 21:22:57.17
90で願います(´Д`)
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
出力 平均年齢 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じゃないと試せないんでとりあえずありがとうございます
739 :
デフォルトの名無しさん :2012/01/08(日) 02:59:55.74
::ってなんですか?習った覚えがないんですよ・・・
740 :
デフォルトの名無しさん :2012/01/08(日) 05:15:48.13
>>739 習ったのは77だな。90ではつけるんだ。まぁなくてもいいんだがw
742 :
デフォルトの名無しさん :2012/01/09(月) 01:57:17.33
>>741 未だに77教えてるクソ学校あるのか?w
【ソウル聯合ニュース】国策シンクタンクの韓国開発研究院(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
といてくれという宿題を見ているとまだまだ現役w それに90を教えているといっても、ほとんど77な発想に、ちょっと90の機能使いました的なのが普通。 実用という面では77読めないと仕事できない。
745 :
デフォルトの名無しさん :2012/01/10(火) 02:50:03.32
>>744 そうなのか^^;
俺は独学で fortran95 学んでシミュレーションしてる
口だからそういう事情しらんかったw
やっぱり古いソースを使う機会が未だに多いということなのかね
まあ言語の機能よりは 問題ごとに確立された手法の蓄積が肝心だからね
747 :
デフォルトの名無しさん :2012/01/10(火) 15:15:40.88
>>732 fortran77でやる場合はどうなるんですかね?
748 :
デフォルトの名無しさん :2012/01/10(火) 17:20:29.98
リダイレクションして出力するってこと忘れてました。申し訳ないです。
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です。 いろいろと試みたんですがわからなかったので。。。。。
>>752 jap ってなんだよ。朝鮮学校の宿題かよ。大体それ77だぞ。金正日の糞でも食ってろw
754 :
デフォルトの名無しさん :2012/01/10(火) 23:28:23.22
国語です。初心者でわかりませんでした↓
77のDOってCONTINUEで終わらないといけないものとばかり思ってた事を思い出した
757 :
デフォルトの名無しさん :2012/01/11(水) 03:07:45.89
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
英 数 国 社 理 計 平均 ========================================================== 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
ありがとうございます
gfortranでスタックサイズを変えるにはどのコンパイルオプションを指定すればいいんですか? 配列サイズが大きくて実行時にエラーになります。 「-fmax-stack-var-size=n」はn=200000000でエラーがになるのにn=10でエラーがなかったりする のでよくわかりません。 「-fstack-arrays」はコンパイル時に f951.exe: error: unrecognized command line option '-fstack-arrays' という エラーが出ます。
>>761 >「-fmax-stack-var-size=n」
これはスタックにとる配列サイズの設定であって、スタックのサイズではないよ。
ここで設定したサイズより大きい配列はスタックに置かれないから、
この値をスタックサイズより小さくすればオーバーフローが回避できる。
>>762 そうだったんですか。ありがとうございます。
あと、スタックサイズって調べられるんですか?
764 :
デフォルトの名無しさん :2012/01/13(金) 23:42:51.78
fortranを仕事で使ってる奴いる? みんあエクセルにながれちゃん?
>>763 linuxだったらulimit -sで表示も設定もできる
>>765 すみません書いてなかったです。OSはwin7x64です。
ulimit -s コマンドプロンプトでやってみたけどダメでした。
>>761 つーか、automaticでデカい配列取ると常にスタック問題に悩まされるので、
素直にALLOCATEABLEにしてALLOCATEすれば良い。
まぁIntelFortranは、スタック問題の質問が殺到したために、デカ目の配列は勝手にheapにとるようになったw
>>767 allocateつかったらエラー出ませんでした。ありがとうございます。
769 :
デフォルトの名無しさん :2012/01/17(火) 11:57:00.85
Error: Syntax error, found END-OF-STATEMENT when expecting one of: , ) このエラーは構文のミスですか? かっこが多いとかですかね?
むしろ足りない。 固定フォーマットで72カラムをはみ出していると見た。
771 :
デフォルトの名無しさん :2012/01/17(火) 12:28:23.23
>>770 72文字制限は守っています。
エラーが出ている行を何度見直しても括弧の数はあっているのですが・・・
その前後に問題がある場合もありますか?
, または ) で結ばれる前に、行末が来てしまったと言っているしな。 フォーマット文が狂ってるか、72カラムからうっかりはみ出した場合が多いような。 その行だけここに出して味噌。
解決したのかよ。続きが知りたいだが。
write (*,'(a,f5.2,a,5.2,a)') 'y=',alfa,'+',beta,'x' 1 Warning (100): Unexpected element in format string at (1) 何がおかしいか分かりませんお願いします 1は「'」の下です
2つ目の5.2は何か
gfortran でstackoverflow にならなくても他のコンパイラではなる場合、 gfortranでもうまくいってない可能性は高いでしょうか?
>>777 細部を見ないと断言できないが、AUTOMATIC変数が大きくてSTACK OVERFLOWが起きているののならば、
DEFAULTのSTACKサイズがコンパイラ毎に違っているので、そういうことが起きてもおかしくない。
オプションによって、STACKではなくHEAPにAUTOMATIC変数をとるようにも出来る場合もあるし、
初めからそういう設定になっていることもある。
しかし、別の原因でSTACK OVERFLOWを起こしているのなら、話しは別だ。
それぞれのコンパイラのマニュアルを一字一句舐めるように読んでDEFAULTのSTACKサイズを調べて味噌。
fortranって非対称マトリクスの扱い弱くない?
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) ・ ・ ・ というような宣言はおかしいでしょうか? スタックの原因になったりしますか? 一応コンパイルはこれでできるのですが。 形状引継ぎや形状明示のことだと思うのですが・・・。 説明不足かもしれませんが、エスパーな方教えてやってください。
それは親ルーチンから引き継いだ配列だからスタックに効かない。 そのサブルーチンで新たに定義した配列が大きいとスタックがあふれる。 言ってることが分からないなら、他の宣言文も全部出せ。 77でやっているならそういうことは起きにくいのだが、変数をSTATICにとるようなオプションを付けてコンパイルするとか。 本来の規格では77でのサブルーチン変数は動的にとられるが、歴史的な事情から、静的に確保されることが多い。 (SAVE変数に成っている)その辺の問題かな。 いまは77形式も90系と同じコンパイラが単にオプションを変えて走っているだけなので、そのオプションがなんなのか 個別に調べないと分からん。
>>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で大きな配列を宣言するとあふれるということですかね?また、スタックがあふれるときはコンパイルの時点でエラーが出るんでしょうか?
100*101程度では溢れないが、基本的にはそういうこと。 コンパイル時にはエラーはでない。
>>783 なるほど、親ルーチンで宣言してれば問題にならないんですか?
>>785 いや、コンパイル時にはエラーはでないが、実行時にエラーが出る。
親プログラムで配列を確保しておけばという事ならエラーはでない。
>>786 実行時のエラーというのはプログラムが強制終了するってこと?
それとも数値計算の値がずれたりする?
STACK OVERFLOWの話をしているのではないのか?
>>789 質問が初歩的すぎてスマン。
実行時にクラッシュするわけですね・・・。
>>777 >>780 >>782 >>785 >>788 >>790 というのもgfortranでコンパイルしたら普通にプログラムも動いて、数値計算ができるんだが、
他のコンパイラを使うとスタックオーバーフローになるみたいで、
gfortranでやった場合の計算結果が合ってるかがわからなかったんです。
とても参考になりました。本当にありがとうございます。
basicだとグラフ掛けるけど、 fortranはどうなん??
標準ではできない・・・とおもう。 だいぶ前になるけど、 Digital visual Fortran では出来たな。 GUI その他拡張機能 を全部 qq で始まる名前の副プログラムで提供していた。 ・・・Intel Fortran の中の人は旧DECの人と聞いたことがあるけど、どうなんだろうか?
QQで始まるのはMS-FORTRANに源流を持つMSのQuick-Winだな。 DOS時代から綿々と続いて今もIntelVisualFortranに受け継がれている。 DEC時代にはFGLで始まるOpenGLの機能の一部が簡単に使えるライブラリが用意されていたが、 最近はF90GLとかのフリーのルーチンでやってくれということで削除された。 大型計算機以来のXYプロッタ的なルーチンは、幾つかフリーのものが出回っている。 標準でグラフィック機能というのはもちろん無い。
広義にはpgplot gnuplot 辺りも
>>792 の
希望に叶うのかな?
MS Fortran の中身はDEC が作ったと記憶。
当時のMSに開発環境を作る能力は・・
>>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仕様のままさほど発展せずに今に至っている。
ここはためになるインターネッツですね
MS Fortran PowerStation って95の時だっけ? fpsfl32.exe /4Yb mufufu.for かな、/4Yb オプションつけたときの バグ発見効率の素晴らしさに感動したのも昔の話。
PowerStation1.0/NT はWin3.1/NT3.5 PowerStation4.0がWin95 4.0に急に飛んだのはVC++の4.0に合わせたため。ここで環境の統合がなされた。 それまでは個別のWorkBench、ここからDevStudio。
FPS4.0まではMSが出したが、これが結構バグバグでDECに後をかませた。 DECは潰れてCompaqに買収され、CompaqはHPと合併して、FortranチームをIntelに売って今に至っている。 QuickWinを見捨てずに今まで残しているところは偉い。
801 :
798 :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で童貞捨てたいんですが、、、、
ヽ/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 |/
どうしてフォートランしないのッ
アフリカ象が好き!
ぱぉぉぉん!
八丈島のキョン!
808 :
デフォルトの名無しさん :2012/01/31(火) 17:38:04.01
error LNK2001: unresolved external symbol _MAIN__ fatal error LNK1120: 1 unresolved externals 以上のエラーが解決できません。 定義していない引数を出しているとかでしょうか? LNK1120の説明が多くて難儀しています。。。
809 :
808 :2012/01/31(火) 17:45:33.71
上のものはbuildできなくて困っています。
810 :
デフォルトの名無しさん :2012/01/31(火) 22:58:16.57
あ~それ、あれだよアレwww
ライブラリにリンクできてないんじゃない?
main program が無いんでね? モジュールしかないファイルをビルドしているとか。 コンパイルのファイル並びが悪いとか。
813 :
デフォルトの名無しさん :2012/02/04(土) 11:53:25.56
フォートラン95で、10個のデータを 読み込み絶対値が最も大きいものの番号ともとの値を表示する プログラムの作り方を教えてください.
特定した
maxvalとmaxloc
有限要素法の二次元梁要素のfortranソースどこかに落っこちてないですか??
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の配列で値を返してきて困る。この時、第二引数の次元指定で 問題回避できる。
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までを整数とするのは適切な気がする。
ついでに言うと、伝説と異なり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
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が探してくれるので任せておけ。
すみません、助けてください。 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文を外すと、コンパイルできます。 ずっとここで悩んでいます。助けてください。
半角でスペースしたので 字下げが反映されませんでした。見辛くてすみません。
intentはサブルーチンの引数になってないと駄目だぞ。 subroutine subB(phi) のようにな。 イメージ画像 ,,x-ー:: "::::: サブ ,x '":::::::::::::::::::: ,、'":::::::::::::,, x-‐ ァ: ,,x '"::::::,,、- '" |::: `"i`ー'" ヾ ! 、 、,,,,,,,,,;;;;;;;;;彡ミ |,,,,ノi `ーヾ;; '"----、 ヾ::ヽ -┴'~ ~|:/ ' ' ' `ー ' "'" /_ l '' ) i ヽ,,、'~` U ゙, __ ,-、_,ノ` |/ ゙, `'" ,,y |// 彡 ゙、`-'" /| i ! ,, -'" | `ー '"|:: | /|||ヽ /|||||/心 |ヾ/ /`ー
>>846 基本的なサブルーチンの使い方が出来ていませんでした!
もっと早く聞けばよかった!ありがとうございました!
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は共有されているはずなんですが・・・。
>>848 まず、real(8),parameter :: n = 500 はintegerの間違いだろう。
さて本題だが、importをつければいくはず。
interface
subroutine subini(phi,ADM_new)
import
real(8)云々
説明は面倒なので、reference manual のimportの部分を呼んでくれ玉へ。
980を超えて一定時間書き込みがないスレは落ちる。 気になるなら「即死判定」でググれ
>>849 出来ました。ありがとうございます。
関連する質問をもう一つしてもよいですか?
メインプログラムと外部サブルーチンの引数の受け渡しが
安全に行われるために、
モジュールにinterface文を加えたのですが、
試しに、メインでreal(8)と宣言した引数を
サブルーチン側でinteger,intent(in)としてみたんです。
そしたら、コンパイル出来てしまったんですけど、
なぜなのでしょうか?interface文が役に立ってません・・・。
>>850 知りませんでした。ありがとうございます。
>>851 MODULEに突っ込んだルーチンのインターフェースは自動で生成されるから基本的に必要ない。
細部によるから全面的に成り立つわけではないが。
とんでもなく非常識なことを指定なければ、INTERFACEが必要な状況は限られる。
>>851 いい忘れたが、import命令はFortran2003のの命令なので、F95文法に厳格に従うなら原理主義に従うなら使えない。
その場合はTYPE宣言だけを独立したMODULEにして、そのMODULEをUSEしたMODULEで色々やる必要がある。
>>852 モジュールのなかにサブルーチンは入ってません。
ファイル1=>メインプログラムとサブルーチン。
ただし、containsはしておらず、ただ同じテキストに書いているだけ。
ファイル2=>モジュール。グローバル変数の宣言、タイプ文の定義、
インターフェイス。
です。
Fortan2003でもOKです。
>>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 (コアダンプ) とでてしまいます。 何か解決策はないでしょうか?
>write(filename,'(a,h4.4,i4.4,a)') 'hoge',h,i,'.dat' エラーメッセージにも書いてあるように h4.4 がおかしい。i4.4 (または i は二桁だから i2.2) にすればいいんでね?
Windows 用の Fortran コンパイラの中で,実行ファイルの速度が 一番高いのはどれでしょうか? (‥‥なんか日本語変だな) Absoft Pro Fortran 2012 なんかは,どうなんでしょう?
>>858 速いのはインテルかPGIでないかな。文法に正格で厳しいのはNAG。
intel CPUならintelだろうが、AMD向けにコンパイラの最適化をやっていなかったとして公正取引委員会から叱られたからAMDの場合は微妙かも。
Absoftは元々はMacがメインだったという歴史的経緯もある。
IntelはDECのF95、AbsoftはCrayのF90フロントエンドを使っていたのでそういう因縁があればそれで選ぶのもよいかも。Laheyは富士通。
とはいえもう10年ぐらい前の話か。
860 :
858 :2012/04/21(土) 22:31:03.30
>>859 早速の詳しいお答え,ありがとうございました m(_ _)m
parameter ではなくて、実行文中で一度値を代入したら 以降は値を変えられないような型はありますか?
ありがとうございます
864 :
デフォルトの名無しさん :2012/04/24(火) 22:35:39.99
1/2,1/3,1/4・・・を順に加えていって、何個加えたら10を超えるか調べるプログラム DO WHILE文を用いる ぜんぜんわからないのでよろしくお願いします
iの初期値=1 jの初期値は0(整数型だと間違いなので注意) ① i=i+1 j=j+(1/i) j=<10でループアウト j条件にならないなら①にもどる。 i-1回だよ
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
ホストをIntelに既定せずにOpenCLなどでGPGPUにすればPCレベルでも演算は速いよ。 安物でもTflopでるよ。 安物の場合は計算が正しいか事前チェック要 最適解を求めるなら最適解の値とその前の値を保存すれば その値を使い結果を普通に検算すればいい。 フィルタの最適化などなら十分使える。 コンパイルが適切で計算式が適切でも結果が正しいとは限らない事があるので検算は大切。
設問に1/1は入っていないのだが
答えをそのまま書いては学習にならんだろう
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)との差 を表示する 夜遅くにすいません。よろしくお願いします
宿題スレなのか? 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 このような感じです。よろしくお願いし
質問の意味がよく分からんが、取り出した部分の総要素数という事なら、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文を用いる
簡単過ぎる。もっと難しいの持って来い。
877 :
デフォルトの名無しさん :2012/05/04(金) 00:01:35.98
基礎演習の宿題なんでお願いします
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
もう一つあった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乗)
二分探索法だろ、問題分もまともに写せないのかよ。小学校からやり直せ!
適当に問題文を書き写して末尾に「プログラム。」と書くと 頼まなくても答を書いてくれるプログラム。
教員側もこのスレ見てたりして
答え書いてとお願いしているわけではないからセーフ。
885 :
デフォルトの名無しさん :2012/05/09(水) 13:45:54.29
答えもらって丸写ししたら カンニングと同じなんだけど 底辺大学あたりだと 「人に聞いた」事が評価されるからなぁ
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
入力例 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 派なんです。
マックで自動並列したいのですがどうすればいいですか? コンパイラはgfortranです
gfortranって自動並列化は無かった気がするから、ちまちまOpenMPのディレクティブを入れるしか無いんでね? coArrayが実装されたようだからそれを使ってみるてもあるが、いずれにせよGNUでは性能は期待できない。
かたじけない!
最近はマルチコアなcpuがノートでも 普通にあるから、OpenMP があるのは 助かるよね。
プリプロセッサーの質問です。 #ifdef debug, #endif というのを使っているのですが、 fppでコンパイルしたときは問題ないのですけれども、 普通にコンパイルすると 「プリプロセッサー行が正しくありません」と出ます。 本来なら、囲ったところをコメントアウトしてくれるはずなのですが。 コンパイラはifortで、ちゃんとその機能はもっているはずです。
よく知らんが、fppがプリプロセッサなんだからifortだけで駄目なんじゃ?
-fpp は必須。
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がゼロになってしまいます。 なぜこのようになるのか、わかりません。 教えてください。よろしくお願いします。
XXX がintent(out) でコンパイルが通ったということは、 YYY の値が変更されない限り XXX は何度目の n でも同じ値になりそう・・。 なんか根本的にコードの構造を間違ってない? 自分なら YYY の値が狂った、 引数に出てこない module common 渡しの変数が狂った 可能性を取り敢えず、疑って見るが。
>>890 >coArrayが実装されたようだから
CoArray 使った事ある人いたら
OpenMP MPI との比較とか
パフォーマンスとか、
感想聞かせて
intent(out) でいいんだな? intent(in out)のつもりじゃないよな。 サブルーチンはPUREなのか?それともSAVE的なものがあるのか? PUREならYYYにしか依存しないから、YYYを確かめるべし。 そうでなくて、状態依存、ヒステリシスを持つルーチンならそれ絡みの変数をみるしかない。
902 :
デフォルトの名無しさん :2012/05/25(金) 03:16:23.21
903 :
デフォルトの名無しさん :2012/05/25(金) 09:30:28.37
www また来いよ
fortranで計算した結果を.aviで出力することは可能ですか???
原理的・技術的に可能かという意味でなら、可能。 実際に出来るかという意味では、そういうライブラリがあればできるが、あるかどうか分からん。gif動画にするのなら見たことある。
906 :
【豚】 :2012/06/01(金) 09:36:56.58
pgplot だっけ・・・名前忘れたけど fortran で書かれたコードで gif を出力する作図パッケージはあったな。 gif に変換する部分まで fortran なのかはしらないけど。 ppm とか書式が簡単なやつで吐き出して、そのあと 変換ソフトで avi 化するとか、が無難かなぁ。
どういうデータを計算しているのかにもよるけど、 ParaViewやVisItみたいなフリーの可視化ツールで動画作成するのもあり。 どちらも、aviフォーマットで動画を保存できたはず。
908 :
デフォルトの名無しさん :2012/06/12(火) 09:03:11.70
>>908 mt19937.fはメインプログラム付きのサンプルじゃん。それを読むのが一番だべさ。
>>908 X1,X2が何を意図するのかわからんけど、
sgrndで乱数種設定して、grndで乱数生成。
そのページはメルセンヌツイスタを考案した人のところだから、
メルセンヌツイスタ自体を知りたいならそこ読んどけ。
加算の仕方が分からんとかいうなら手元の教科書見とけ。
911 :
デフォルトの名無しさん :2012/06/22(金) 16:35:02.48
f951: error: unrecognized command line option "-finit-local-zero" っていうエラーがコンパイル時に出るんですが、 どなたか原因が分かりそうな方はいらっしゃいますか?
コマンドラインのオプションが無効なんだから、それを消せ!
913 :
デフォルトの名無しさん :2012/06/22(金) 22:57:31.95
>>912 このオプションは使いたいんですが、どうしても無理なのでしょうか?
ぐぐってみたが、それはg77のオプションで、gfortranでは別の名前に成っている。 gfortranのマニュアル嫁。
チョンは出ていけ。スレからも日本からも。
918 :
デフォルトの名無しさん :2012/06/23(土) 12:36:31.41
>>914 もう少し状況を詳しく説明しますと、
コンパイラがg77のときは正常にコンパイルできるのですが、
コンパイラをmpif77に変更するとそのエラーが出るようになります。
しかも同様のこと(コンパイラの変更)を別のPCでやってもエラーは出ないのです。
一体どういうことなのでしょうか。
mpif77はコンパイラドライバなので、色々なコンパイラが呼び出せる。 デフォルトはg77のようだがそのPCではg77以外のコンパイラが指定されているのだろう。 mpif77 の MAN ないし設定を調べて味噌。
920 :
デフォルトの名無しさん :2012/07/08(日) 13:25:36.12
質問です いま、ファイルを分類しフォルダへ仕分けるプログラムを書こうとしているのですが、ファイルをフォルダへ移すコマンドがわかりません 例えば、ファイル1をreadで読み込んで、中身のテキストが1ならばフォルダ1へ、中身のテキストが2ならフォルダ2へそのファイルを移す、というようなプログラムを書きたいのです 判定分はif分で書いてあります 判定した結果、フォルダへ移すコマンドを知らない上に手持ちの教科書には記述がないので困っています ヒントでも良いのでどなたか教えてください
そういう命令は規格にはない。Fortranが出来た頃のファイルシステムには、フォルダ・ディレクトリの概念は無かったから。 それをやろうとするなら、ベンダー拡張の命令を使う必要があるので、使っているコンパイラのマニュアルの付録のあたりを調べるしか無い。 たぶん system とかそんな名前だと思う。 ちなみに Fortran2008 では、execute_command_line というサブルーチンが用意されたのでそれを使える。 ただ一般的にはFortranでやるよりスクリプト系の言語でやれと言われるだろう。 風に逆らう赤いトラクターのごとく頑張れw
922 :
920 :2012/07/08(日) 20:09:04.99
>>921 ありがとうございます
道理で本とかにもそういう記述がないわけだww
数値計算結果が膨大なんで軽い気持ちでやりだしたのにこれは手強そうですね
なんとも初心者には荷が重い
いわゆるファイラーみたいなことは面倒だろうが 別の場所にファイルを作れば分類だけはできるでしょ
Fortranはバッチで動かすのが本命で、バッチファイルでファイル位置とかを指定するのが普通だから 機種互換性のないI/O絡みの機能は充実してないのよ。 最近はワード長-OS-文字コード-数値フォーマットが、8bitの倍数-UNIX-ASCII-IEEE754で統一されたが、 昔はベンダー毎にOSどころか、ワード長、文字コードに数値フォーマットまでまちまちで、それらに依存しない部分が 規格になってたから仕方ないね。
925 :
920 :2012/07/09(月) 00:24:40.38
>>923 ,924
いろいろありがとうございます。
詳しい計算結果内容には言及できないんですけど元から別の場所にファイルを作って分類ってのが無理なんですよね(^^;)
なので、あとからファイルの内容読み込んで判定後フォルダ分けするプログラムを作りたかったんです。
ほかにやりようがないか考えてみます。
OSがUNIX系だと、OPEN文でフルパスで書けばいけたような気がする。 POSIX互換のルーチンが用意されていることが多いから、それでいけるんじゃないかい?
927 :
920 :2012/07/09(月) 01:20:31.43
>>926 OSはWINDOWSでcygwin使ってます。
いちおできるかどうか試してみます。
わざわざありがとうございます
928 :
デフォルトの名無しさん :2012/07/11(水) 03:35:05.48
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
ディレクトリを変えるのは以下。ただし、ディレクトリは予め存在していないといけない。 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 続行するには何かキーを押してください . . .
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
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
無理じゃね?
配列変数で充分だと思うけど、何か理由があって?
既存のプログラムで配列A1を対象にした奴があって、 それをA2、A3・・・みたいな感じで使いたいのでそれができたら便利だなあと・・・ 聞いた感じ無理っぽいんでプログラムコピーしてそれぞれ作ります ありがとうございました
コピーしたものを副プログラムとして使うなら、 そのなかで変数名を変えなくても済むとだろうけど、 他人のコードを「すこし変更して」使うのは諸刃だから 慎重にね。ぐっどらっく
937 :
uy :2012/07/22(日) 22:21:37.99
> > コピーしたものを副プログラムとして使うなら、 > そのなかで変数名を変えなくても済むとだろうけど、 > > 他人のコードを「すこし変更して」使うのは諸刃だから >v 慎重にね。ぐっどらっく > 慎重にね。ぐっどらっく > 慎重にね。ぐっどらっく > 慎重にね。ぐっどらっく きめえ
938 :
デフォルトの名無しさん :2012/07/23(月) 22:34:21.31
コピペもままならない生き物が 人様を気持ち悪がってもなぁ・・・
相手すな
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
割る数 A(I,I) が 0 または 0 っぽいと困るからピボット選択するんだろう したがって I のループで J が動く前に入れるべし
>>943 ありがとうございます。
でも次はピボット選択の仕方がわからない...お恥ずかしい
ネットで探しても詳しい説明が書いてないんですが出来れば上の式に入れた形で教えてもらえないでしょうか?
945 :
944 :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まで計算し、その合計値を算出できるようにプログラミングしたいと考えています。
947 :
946 :2012/08/11(土) 20:01:39.94
sage忘れてました、すみません。よろしくお願いします。
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
エラーチェックなぞしなければ・・・ 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
950 :
946 :2012/08/14(火) 15:27:57.34
>>948 >>949 返信遅れてすみません。ありがとうございます。自分はプログラミング
初心者で、ある時突然fortranを使ってプログラミングをしなければ
ならなくなり、途方に暮れていました。本当に感謝しています。
あとすみません。
>>946 に書いたメモ帳のデータですが、全部のデータを読み込む
場合どういう命令文にしたらいいでしょうか?
951 :
946 :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を読み込まないようにプログラミングしたい のですが、どのようにプログラムしたらいいでしょうか
read(10, *) dummy read(10, *) dummy read(10, *) dummy read(10, *) dummy read(10, *) dummy read(10, *) 読み込む数字の数だけ変数を並べて
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あるので。
955 :
954 :2012/08/14(火) 17:48:11.13
再びsageわすれました。すみません。
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行の連続したデータを読むことになったと思う。
957 :
954 :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
以下計算式
>>957 変数kは宣言されていないよ
あるいは
read(1,*)a2(1:18,1:400)
みたいにできなかったっけ
4行目 real :: v(1,18)s,x1,x2,x3,y1,y2,y3 ↑ sの前にコンマが抜けている。 8行目はエラー無い。 画面に表示されたエラーメッセージをコピペして聞くのが早い。
960 :
954 :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 *
ファイル名もカンマになってるけどいいのか?
8行目はエラー出るわけないので、ホンモノのプログラムを10行目くらいまで貼れや。 もしくは全角のスペースとかが入っていて文句を言われているのかもしれない。
963 :
954 :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のみ読み込んで 計算過程に組み込ませたいです。
964 :
954 :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 として計算処理が行えるようにしたいと考えています。
965 :
954 :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
一気にやろうとしないで、まず読み込ませるだけ、次にそれを表示させるだけ みたいに順を追ってやってみなよ
>>965 プログラム文のあとのプログラム名が抜けている。
また全角文字が入り込んでいる。
色々突っ込みどころ満載なので、あせらずゆっくりやりなさい。
他の人が解決してくれるかもしれないが、吾輩は夜中に戻ってくるwww
コンパイラはMS-Fortran Power Station Ver4.0か? 古い上にI/Oにメモリーリークのバグがあるぞ。まぁ小さい計算なら大丈夫だw
968 :
1/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
969 :
2/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
970 :
954 :2012/08/15(水) 00:08:34.58
帰宅中だったので返信遅れてすみません。 おまけに自宅付近で規制がかかっているみたいで書き込みができずすみません。
今ネットカフェで書き込み、これから帰宅します。
>>966 アドバイスありがとうございます。順を追ってやってみようと思います。
>>967 ご指摘のように古いバージョンになります。詳しいことは明日聞いてみないと
わかりませんがMS-Fortranだと思います。
エラーの原因は書式の問題かもしれませんので、チェックしてみます。
ご指摘ありがとうございます。引き続きよろしくお願いします。
971 :
954 :2012/08/15(水) 00:17:25.44
>>968 >>969 すごい!としか言いようがないです。私はこの1週間図書館でfortranに関連した本を読み込んでみたり
アマゾンでレビューの良い本を買ってプログラムしようとしたんですが、
どの本もエクセルデータやメモ帳からの読み込みに関する記述がありませんでした。
やっぱり大学生までで色々授業とかで習われるんですか?
お世辞抜きで天才としか言いようがないです。明日古いバージョンのfortranで実行
してみます。ようやくこれで満足に睡眠がとれるかもしれません(泣)ありがとうございます。
またアドバイスよろしくお願いします。
972 :
954 :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')
とすればいいですか?
からかってるようにしか思えないなwww
たぶん open(11, file = 'mydata1.dat') open(12, file = 'mydata2.csv') open(13, file = 'mydata3.csv') でいいとおもう。 でもメモ帳で変にいじって保存すると、おしりにtxtの拡張子がついてしまうから、.txtつきになるかもしれんw その辺ばかりは、ファイル持ってる本人にしか分からん。
975 :
954 :2012/08/15(水) 00:40:16.20
>>973 私はプログラミング自体が初心者なので、おふざけ抜きで
教えていただきたいんです。すみませんがご教授下さい。
976 :
954 :2012/08/15(水) 00:42:05.15
>>974 すみません、ありがとうございます。
からかいではなく、本当にマニュアルには載っていないことだらけなので
助かります。
そこで致命的に足りてないのは「FORTRANの知識」じゃなくて WindowsやExcelの知識。それも観察力だけでどうにかなる類のなんで まず落ち着いてほしい
excel 自体は関係ない気もするし、windows の知識っても広義すぎるだろ。 「初心者にとって」マニュアルに書いていないことが多いのは分かるが。 (不親切ではなく、そんな細かくて自明か、または場合によって 異なるような、本題と関係ない話をいちいち書かないということだと思われ)
広義すぎて「全部Excelでできなくないか」って方向へ行っちゃうだろ
マニュアルにそのまんま書いてないってだけで 何を調べるべきかは書いてあると思うんだわ
急に伸びて次スレの季節になってしまった スレ立て能力無いので、どなたかよろしく
983 :
954 :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がエラーで出てくるのが さっぱりわかりません。
どうやったらそんなエラー出せんだよ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
985 :
954 :2012/08/15(水) 19:38:11.82
>>984 「Fortran Power Station4.0」の「Microsoft Developer Studio」で作成
しているんですが、画面左上のFile→New→Text.Fileから新規ファイルとして
るんですが、Projectという表記が自分の画面で見当たらないのでこういう方法で
開いているのですが、ここから間違ってますか?
986 :
954 :2012/08/15(水) 19:45:05.32
プログラミングができずかれこれ1週間以上経過してしまい、 今日エラーの件で周囲に相談したところ「Visual Basic6.0」で 作ってみては、という提案があったのですが、作成していただいた データをそのまま使う事って無理ですよね...(泣) VBの方も初心者なのでもうどうしていいか...
>>985 Fortran Power Station4.0
しかしこりゃまた懐かしい。
fpsfl32.exe だっけ、DOS窓でのコンパイラコマンド。
Hewlett P にまだオンライン説明があったきがするよ。
989 :
954 :2012/08/16(木) 17:14:42.61
>>987 返信遅れてすみません。
>おっさんか爺さんしかいなくて聞きにくいのだろうが、うまく先輩に聞くとか身近で聞け。2chで聞くよりはるかに効率いい。
この節なんですが、すごく当たってる気がします。ただ私の場合、先輩がいない上にfortranに詳しい人がいないのでこちらで
お聞きした次第です。恩師の方も最近は使用しないそうなので、どこがだめかがわからないみたいで、VBなら...とアドバイス
してもらったわけです。
私もポンッと手渡されて余分に何十万もするソフト買わなくて済むと楽観的になっていたのでいけないんです。はぁ...
最近はvisual basic2010?とかも出てるみたいで売ってる本で操作手順の画面を見たことがあるんですが、私が操作したものより
大分使いやすそうな印象を受けました。とはいえど素人の所見なんであてになりませんけど。
やはり私のようなダメな人間には古いソフトは扱えないみたいですね(泣)
自分の置かれている環境を少し理解できたと思います。ありがとうございます。
新規ファイルの作成手順を画像も付けて教えていただき感謝いたします。今までソフトを起動させると前回作成したデータ?が勝手に
出てくるのでソフトそのもののインストールミスかと勝手に思ってて今まで使用してました。
fortranにしてもvisual basicにしてもアップグレードしてくれないかな...20年前のソフトを今まで私は
使ってたんですねビックリしました。
990 :
954 :2012/08/16(木) 18:08:52.60
度々すみません。 open(11, file = 'input1.txt')の箇所なんですが、 一番目のメモ帳のデータなんですが、 エクセルデータ2つは固定でメモ帳のみ300個ほど、計算を一回ごとに終わったら次のメモ帳 のデータを入力して計算させていくことってできますか?
>>990 できるよ。いったんclose(11)で閉じた後、またopen で開き直せばいい。
ファイル名は文字変数にしておけばいろいろ変えられる。
input1 input2 ・・・見たいに番号を変えていきたいとか言うなら、それも出来るが、
それは入門書には書いていないテクニックが必要なのでまた聞け。
あと、プログラムはじめてで一週間でI/O絡みのデータ処理をしようというのは無謀な望みなので、
時間がかかっていることは気にしなさんな。I/OはFortranに関わらず鬼門。
992 :
954 :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
↑
計算結果を保存する保存先のファイルも一回ごとに新規ファイルを作成できるように
プログラミングできますか?
>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 まぁ暑いし気長にやれや
995 :
954 :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
! 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 ↑ 結果を書き出すプログラムは上記でも大丈夫でしょうか?
アンタがダメってことはないぞ。 素人がプログラムはじめたらこんなもん。標準。 それにしても暑いお盆の時期に初心者に適切な指導もなくプログラム書かせているのはアカハラの域に達してるな。 お爺ちゃんの環境は20年前で止まってるし、プログラムの相場観わかってないようだし、言うこと真に受けないほうがいいぞ。 ニヤニヤ笑いながら『お爺ちゃん早くお盆のお迎え来い』と内心思ってろw プログラムの方は相変わらず問題だらけだな。少し待ってろw
>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)
1000 :
954 :2012/08/17(金) 19:53:54.48
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。