1 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 00:47:10 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用)その4 pc12.2ch.net/test/read.cgi/tech/1232789521/ くだすれFORTRAN(超初心者用)その3 pc11.2ch.net/test/read.cgi/tech/1196384126/ くだすれFORTRAN(超初心者用)その2 pc11.2ch.net/test/read.cgi/tech/1164121236/ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc11.2ch.net/test/read.cgi/tech/1163319215/
2 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 04:40:50 ] >>1 乙! (≧∀≦)b
3 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 08:28:13 ] お前ハイテンションだな この手の顔文字って結構イタい
4 名前:デフォルトの名無しさん mailto:age [2010/03/28(日) 11:16:57 ] >>1 おつ 質問です。 integer,parameter::dp=selected_real_kind(20) a=1._dp みたいに変数(この例ではdp)で精度を決めてるんだけど、指数部の表現ってどうやるか教えてください。 例えば、0.001を表現する時に倍精度なら1.d-3ってな感じでやってますが、変数を使った場合どうなるでしょう? 今は、1._dp/1e3 という風に表していますが、ちょっと美しくないです。 ご存知の方いらっしゃいましたら、教えていただけませんでしょうか?
5 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 12:35:22 ] >>4 1.0e-3_kd
6 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 15:30:08 ] >>3 やっぱ今はやりの顔文字はこれだよな (^p^)b
7 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 19:10:59 ] ●関連スレ【 FORTRAN W 】の URL は変更されていますよ〜。 pc12.2ch.net/test/read.cgi/tech/1163319215/
8 名前:1 mailto:sage [2010/03/28(日) 21:34:38 ] >>7 専ブラなんで気づかなかった、すまん。
9 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 05:06:13 ] >>8 いえいえ,俺もお気に入りメニューに入れてたんだけど, なんで新しいレスが来ないのかなと長時間思ってた。 んで,昨日初めて気が付いたw
10 名前:デフォルトの名無しさん [2010/04/05(月) 16:19:37 ] はじめまして、超初心者なので質問させて下さい。 今扱っているデータは1秒ごとに取得した時系列データなのですが データ取得時に装置の調子が悪くて時々データ抜けが起きてしまっています。 1分ごとに平均値を取りたいのですがデータ抜けのせいで nを1から10個目までとして平均値を取ってしまうとずれが出てきてしまいます。 ずれを出さないために以下のようにデータを補完したいのですがやりかたが全く判りません。 00:00:04 x4 y4 z4 00:00:05 x5 y5 z5 00:00:06 x6 y6 z6 00:00:10 x7 y7 z7 00:00:11 x8 y8 z8 00:00:12 x9 y9 z9 ↓ 00:00:04 x4 y4 z4 00:00:05 x5 y5 z5 00:00:06 x6 y6 z6 00:00:07 x7' y7' z7' 00:00:08 x8' y8' z8' 00:00:09 x9' y9' z9' 00:00:10 x7 y7 z7 00:00:11 x8 y8 z8 00:00:12 x9 y9 z9 データの抜けはランダムに起こっています。 フォートランは先生から貰った既存のプログラムを データにあわせて改造するくらいしかした事がありません、 色々調べたり試したりしてみていますが もしやりかたが判る方がいらっしゃいましたら教えて頂けると助かりますm(_ _)m
11 名前:デフォルトの名無しさん mailto:sage [2010/04/05(月) 17:30:46 ] >>10 FORTRAN以前の話だけど、補間はそれでいいの? 00:00:04 x4 y4 z4 00:00:05 x5 y5 z5 00:00:06 x6 y6 z6 00:00:07 x6 y6 z6 00:00:08 x6 y6 z6 00:00:09 x6 y6 z6 00:00:10 x7 y7 z7 00:00:11 x8 y8 z8 00:00:12 x9 y9 z9 の方が自然だと思うけど。
12 名前:デフォルトの名無しさん [2010/04/05(月) 18:57:27 ] >>11 10です、前の値で埋める方法も判ればそれはとても嬉しいです、 それもやってみようとしてうまくいきませんでした... また、前後の値のみだとそれほど信用高いというわけでも無いので フーリエか最小二乗法で補完出来ればなお良い、という感じです。 3秒くらいの抜けは良い方でデータ取得時の状態が酷いときには 20秒くらい抜けてしまっていたりして、どうしたものかと思い悩んでいます。
13 名前:10 [2010/04/05(月) 19:02:15 ] 訂正12>それもやってみようとしてうまくいきませんでした... やってみたけれど、結果で20秒とか30秒とかの間 同じ値がずらりと続いていておかしな事になった時間帯があり あまりにも無惨だったのでやめた事を思い出しました。
14 名前:デフォルトの名無しさん mailto:sage [2010/04/05(月) 22:56:49 ] >>10 補間なのか補完なのかもよくわからん。 (無いデータを補完しておくのか、抜けたのを内挿するのか) のちのちのデータ解析にも関わるので、一度指導教官とよく話しあった方がいいぞよ。 詳しいことが分からんからなんとも言えないが、データ読み込み時に、データ補間/補完もできるが、 生データは無加工のままとっておいて、後処理で補完した方がいい気もする。 まぁコメントがつけられるデータ形式なら、補完行にコメントを付けておくこともできるが・・・
15 名前:10 [2010/04/07(水) 18:42:20 ] 自宅PCが起動しなくなったトラブル&携帯が規制かかってて今まで書き込めませんでした、 すみませんm(_ _)m >>14 無いデータを補完です、データ抜けでその時間帯のデータが無くなっているので。 生データはちゃんととっておいています、フォートランでデータ加工時に 別名をつけていっているので途中経過も判るようになっています。 先生からは「とりあえず調べてやってみて」と言われまして 色々調べてはいるもののちょっと混乱しているのでこちらに助けを求めに来ました。 もしヒントだけでも教えて頂けるようでしたらお願い致しますm(_ _)m
16 名前:デフォルトの名無しさん mailto:sage [2010/04/08(木) 01:09:01 ] >>15 PROGRAM test IMPLICIT NONE INTEGER, PARAMETER :: nmax = 100 REAL :: x(nmax, 3), x1, x2, x3 LOGICAL :: qdata(nmax) INTEGER :: i, k, k0, kh, km, ks, io, ndata x = 0.0 qdata = .FALSE. DO i = 1, nmax READ(10, '(i2, 1x, i2, 1x, i2, 3F5.0)', IOSTAT = io) kh, km, ks, x1, x2, x3 IF (io == -1) EXIT IF (i == 1) k0 = 3600 * kh + 60 * km + ks - 1 k = 3600 * kh + 60 * km + ks - k0 x(k, 1) = x1 x(k, 2) = x2 x(k, 3) = x3 qdata(k) = .TRUE. END DO ndata = k !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DO i = 1, ndata IF ( .NOT. qdata(i) ) x(i, :) = x(i - 1, :) END DO DO i = 1, ndata PRINT '(i3, ":", L5, 3(1x, F8.2))', i, qdata(i), x(i, :) END DO STOP END PROGRAM test
17 名前:15 mailto:sage [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 mailto:sage [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になる係数をかけて足し算する事に帰着する)だから とある補間(補完?)した後に平均値をとっても・・・という気はする。 一度、教官に確認した方がいいよ。単なるテストというか簡単な試練を与えられただけなら それはそれで教育的ともいえるけど・・・危険な香りがする。
21 名前:デフォルトの名無しさん mailto:sage [2010/04/08(木) 11:16:55 ] >>17 抜けたデータは1個前をコピー。故に連続して抜けた場合は同じのが続く。 王道だね。できればかけたデータの後半はその後にくる有効なデータで、なら たぶんもっといいけど面倒だしね。 if (.NOT. qdata(i)) then のあとに、 j = i do while ((.NOT. qdata(j) .OR. (j .LE. ndata)) j = j + 1 enddo ntrue = j で次の有効なデータの番地がわかるから・・・あれ、これだとntrueは一個ずれるかも。
22 名前:デフォルトの名無しさん mailto:sage [2010/04/08(木) 11:17:54 ] しかも .OR. じゃなかったね・・・
23 名前:デフォルトの名無しさん mailto:sage [2010/04/08(木) 11:20:54 ] スレチだけどexcelのグラフでスムージングをオンにするのはマジでやめて欲しい 妙に滑らかなラインが気持ち悪くて仕方ない
24 名前:デフォルトの名無しさん mailto:sage [2010/04/08(木) 11:31:15 ] 最小二乗法かと思ったら移動平均らしいな>Excelのスムージング ちゃんと理解して使ってる人は少ないと思うがw
25 名前:10 [2010/04/08(木) 13:31:13 ] >>20 ご指摘ありがとうございます、うまく説明出来なくて申し訳ないのですが、 全体の解析の結果から数秒〜数分単位でグラフにして見たい部分とかが判った時に 予め近似曲線が求まっていれば楽でしょう、という感じで現在に至ります。 なんか、何から何まで良くわからない状態で本当に申し訳ありません・・・
26 名前:10 [2010/04/08(木) 17:30:07 ] 先生の蔵書の中から参考資料を見つけて頂けました、これを使ってまた少し頑張ってみます。 自分でも至らない点や確認出来た点が多かったのでとても助かりました、色々と助言をありがとうございましたm(_ _)m また判らない事があったらこちらに駆け込むかもしれませんがその時は宜しくお願いします。
27 名前:デフォルトの名無しさん mailto:sage [2010/04/08(木) 19:11:54 ] >>26 新M1か、四年生かな頑張れー。
28 名前:デフォルトの名無しさん [2010/04/08(木) 19:39:57 ] 超初心者なのですが、Intel Visual Fortranを使っていらっしゃる方はいますか? 私にはC言語を白黒画面のコンソール画面でコンパイル&リンクして実行する程度の簡単な経験しかありません。 殆ど統合開発環境を使った事がないのですが、関連ホームページを調べると、魅力的なCPU毎の最適化機能とか、IMSL数値計算ライブラリを使えるようなので興味を持っています。 私が使い始めることになったバージョンは10.1です。
29 名前:デフォルトの名無しさん mailto:sage [2010/04/08(木) 23:42:47 ] すいません。つまらない問題なのですが、 複数ファイルに同一の結果を出力する場合どうすればよいのでしょうか。 open(10,file='A.dat',form='formatted') open(11,file='B.dat',form='formatted') write(10,101)int((t2-t1)/60),dble((t2-t1)-int((t2-t1)/60)*60) write(11,101)int((t2-t1)/60),dble((t2-t1)-int((t2-t1)/60)*60) みたいな表現をコンパクトにしたいのです。
30 名前:デフォルトの名無しさん mailto:sage [2010/04/09(金) 00:03:25 ] >>29 DO iunit = 10, 11 WRITE(iunt, 101) .... END DO
31 名前:29 mailto:sage [2010/04/09(金) 00:34:57 ] ありがとうございます。 write(10,101)・・・ write(31,101)・・・ write(*,101)・・・ みたいな場合はその方法だと無理ですよね やはり一行ごとに処理するのが基本なのでしょうか
32 名前:デフォルトの名無しさん mailto:sage [2010/04/09(金) 01:05:56 ] >>31 そう多くないなら1行づつが基本だと思う。 でも一応、 INTEGER.PARAMETER :: iunits(3) = (/10, 31, 6/) DO i = 1, SIZE(iunits) WRITE(iunits(i), 101) .... END DO とか、あるいは内部サブルーチンにして CALL wr_info( (/31, 10, 6/) ) ...... CONTAINS SUBROUTINE wr_info(iunits) INTEGER, INTENT(IN) :: iunits(:) DO i = 1, SIZE(iunits) WRITE(iunits(i), 101) .... END DO RETURN END SUBROUTINE wr_info 内部サブルーチンなら、変数は共通。 (/ /) は配列生成子で、これを使えば引数でファイル番号を 並べて指定すればよく、わざわざ配列をメインルーチンで用意する必要がなくなる。 6番は歴史的理由でコンソールになっている(はず)。
33 名前:デフォルトの名無しさん mailto:sage [2010/04/09(金) 03:29:41 ] 6番=標準、7番エラー出力・・・だっけ忘れた。 なんかStdoutみたいな明示するキーワードあった気がするけど忘れてもうた。
34 名前:デフォルトの名無しさん mailto:sage [2010/04/09(金) 03:33:47 ] >>24 最小二乗法 でもxもyも観測量なのに普通のxは誤差無し確定値とみなすやつをへーきで使ってたりするけどねぇ。
35 名前:デフォルトの名無しさん mailto:sage [2010/04/10(土) 09:07:02 ] >>24 エクセルなんか使うなよ・・・人文科学かな?
36 名前:デフォルトの名無しさん mailto:sage [2010/04/10(土) 13:14:38 ] 環境系の同僚に「このあたりのコーディングはだれか詳しい人に助っ人頼んだ方がいいよ」って言ったら 「いや自分でやるのが大事ですから。シミュレーションはエクセルで私がやります」って言われた 本人は、今いいこといったオレ、見たいな風情なのでなにもいえなかった
37 名前:デフォルトの名無しさん mailto:sage [2010/04/10(土) 14:16:13 ] 放っとけ 構うとお前さんに仕事が飛んでくるぞ
38 名前:デフォルトの名無しさん mailto:sage [2010/04/12(月) 08:18:32 ] >>36 「いや自分でやるのが大事ですから。シミュレーションはエクセルで私がやります」 キリッ! やる夫みたいだw
39 名前:デフォルトの名無しさん mailto:sage [2010/04/13(火) 15:30:32 ] program sample444 real :: x(3),y(3),z(3) integer :: i open(1, file="aiueo.txt") do i=1,3 read(1, *) x(i), y(i), z(i) print *, x(i), y(i), z(i) end do close(1) end program 上記のコマンドでコンパイルしてプログラムを作成しましたのですが 次のようなエラーが出てしまいます!ファイルの入出力だけがうまく進まず もうここから全然進みません; どなたかわかるかたよろしくお願いします; ちなみにtxtファイルは3×3配列の数値がちゃんと入っています; traceback: not available, compile with -ftrace=frame or -ftrace=full Fortran runtime error: End of file
40 名前:デフォルトの名無しさん mailto:sage [2010/04/13(火) 20:36:12 ] >>39 OSとコンパイラの種類 読み込むデータの例も書いた方が良いよ
41 名前:デフォルトの名無しさん mailto:sage [2010/04/13(火) 21:08:39 ] >>40 わかりました。すいません; んと、windows vistaで、コンパイラはg95です。 読み込むデータはたとえば 25 50 59 34 23 11 45 43 65 とかです。 どうかよろしくお願いします。
42 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 01:04:24 ] とっさに思いつく限りでは・・・ 元データの最後の改行位置は? open で status="unknown" を追加してみては? くらいかなぁ。Good Luck!
43 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 06:07:06 ] 読み込むデータがInt型なのにrealで読み込もうとしてるのは良くないと思う 確認してないから他にも間違いがあるかもしれないけど
44 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 11:39:21 ] >>39 Fortran runtime error: End of file だから、>>42 のとおりデータの最後の行の右端に改行コードがないんじゃない? >>43 大事な事だよね。 整数を実数でよんでそのあと整数化すると1小さくなることがあるし。
45 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 16:52:11 ] >>42 ふむふむ 改行位置で変わったりするのですか? テキストにも書いていなかったので少し勉強してみます。 ありがとうございました。 >>43 なるほどー 確かにそのとおりですね; 修正しときます! ありがとうございました。 >>44 改行コードが何か全くしりませんでした; 元データをただ改行するだけじゃだめなんですか? もう少し勉強してみます; ありがとうございました!
46 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 18:09:47 ] 連投失礼します! 皆さんの助言でなんとかファイル読み込みできるようになりました! ですが、1列目しかデータが反映されません; これも改行コードとやらによるものなんでしょうか? 何回もすいません;
47 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 15:18:39 ] あまり関係ないかも・・・ Win機上では改行コードが LF/CR かな2つ無いと読めない・・・ ぎゃくにGCCやG95はそれぞれを改行コードとみなしちゃう、とか ・・・今でもあるのかなぁ・・・・? qkc だっけ、漢字コード変換のソフトがおまけ機能で 改行コードもWin機向けに変えてくれるから、 もし元データがLinux機で作られてたのなら・・・試してちょ。 unix2dos dos2unix っていうのでLinux上でも改行コード変換はできるけど。
48 名前:デフォルトの名無しさん mailto:sage [2010/04/19(月) 22:55:45 ] >>33 キーワードの方は知らんけど、標準エラーは 0 だ。 # 理由は知らんが規制が掛かって暫く # 書き込めなかった。
49 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 04:01:32 ] thanks
50 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 11:21:26 ] >>48 理由は知らんが規制が掛かって そういえば今回は ac.jp ドメインもいくつか規制食らってたなw
51 名前:48 mailto:sage [2010/04/21(水) 22:42:13 ] >>50 うち ocn なんだけどね。学校とは縁が切れて、博士号持ちのワープワやってるw
52 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 01:51:47 ] そうなんだ。 大学院進んだ人とかポスドクっておかねが多少もらえても雇用統計では「自発的失業者」らしいね。 それを聞いて、博士号取得をくじけた人をしっているけどそれは正解でもあるとおもった。 ・・・博士号もち仲間よりw
53 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 13:08:56 ] >>51 うお、うちの会社でアルバイト(年300万研究補助)しね?
54 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 21:36:21 ] これはひでえなw>自発的失業者
55 名前:デフォルトの名無しさん [2010/04/27(火) 20:19:15 ] !? 大学院進んだ人は普通に「学生」みたいな区分だと思ってた。 ポスドクも任期付/非常勤だからパートと同じような扱いかと・・・(´;ω;`)ブワッ
56 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 20:19:56 ] sage忘れたorz
57 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 15:51:15 ] 泣くんじゃないッ!(´;ω;`)
58 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 10:52:45 ] fortran90の勉強はじめましたっ! fortran77は全然知りません :DD
59 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 12:08:45 ] >>58 遺物と向かい合う必要がない限り、知らんで良い。 でも Fortran90 って良書はあるのかな? 色々出てるみたいだけど、倍精度の説明さえロクに 書いていないのは今も謎だ(個人的に)。
60 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 04:04:51 ] これから開催される CUDA Fortran のセミナーや講習会,知りませんか? ググっても3月に東工大のGPUコンピューティング研究会が開催したのしか 検索されてこなくて。 もっと早くチェックしてればよかったなぁ‥‥
61 名前:デフォルトの名無しさん [2010/05/10(月) 07:18:31 ] >>52 生活保護対象にならないようにそういう扱いにするというのは聞いたことがある。 にしてもひどい話ではある・・・(´;ω;`) >>60 CUDAの試作機とかどっかタダで使えるところないかなぁ・・
62 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 11:21:13 ] nvidiaとか本気で流行らせたいんなら、試作機をリモートでいいから無償提供とかやりゃいいのにね 言語なんていかに裾のが広がってくかが大事なのに
63 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 22:45:53 ] >>62 ? ただで(Cだけど)コンパイラ配ってるし、普通のグラボでも使えるし、Fortranコンパイラにも協力しているしで 十分やってると思うけどね。
64 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 10:29:26 ] ぼくのマシンはインテルのへっぽこアクセラレータしかないお・・・でも触ってみたいんだよう、 という人はいると思うんだ。すでに大規模&本格的に使ってる人(おおくないとおもうけど)が、 かるいデバッグ作業するとかなら普通サイズのぐらぼマシンに自分で設定して、でもいいとおもうけど、 将来使うかもという程度の興味出始めな人には 横着なだけかもしれないけどコンパイルと実行環境が整った場所があるとやはりうれしい。
65 名前:デフォルトの名無しさん [2010/05/13(木) 15:33:38 ] 最近になって、がっつり数値計算をする必要がでてfortranを 勉強しだしたんですが、要素数が不明の2次元データをファイルから読んで、 その要素分だけallocateしたいのですが、 とりあえず最後まで読んで要素の数を数えてから配列をつくろうかな、と思ったんですけど、 fortranにおいてend of fileの扱いをどうしたらいいのかわからずに困っています 使用OSはvista,コンパイラはg95です。初歩的とは思いますが、よろしくお願いします。
66 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 15:50:10 ] open(1,file='data.dat',status='old') icount = 0 998 continue read(lun,*,end=999) fjlasdjfkds icount = icount + 1 goto 998 999 continue とか、かな。 でもこれ、ファイルの最後の最後が改行コードでおわるか EOFで終わるか両方無しでいきなり終わるか・・・でいろいろ挙動が変わるかも。
67 名前:デフォルトの名無しさん [2010/05/13(木) 16:08:21 ] fortran 90を使用しています. 二次元配列に初期値をparameterとして代入するにはどのようにしたらよいのでしょうか. implicit none integer,parameter :: i(2,2) = (/1,2,3,4/) だとエラーを吐きます.コンパイラーはPGIです. 宜しくお願いします.
68 名前:デフォルトの名無しさん [2010/05/13(木) 16:30:50 ] >66 マジでありがとうございます!! とりあえずreadの一個目にファイル変数渡して できました。改行からのEOFも即EOFも問題なく動きました。 とりあえず、EOFなしのデータは使わない?と思うので。 あと、個人的な好みなのですが、goto文はあまり使いたくないので、 とりあえずdoループで書いたのですけど、endはやはり、 ちょっとぐぐってみたかんじ、ジャンプさせるしかないようにみえるんですが、 exitで抜けさせることはできないのでしょうか? もしご存知のかたがいらっしゃいましたら、ご教授おねがいします。 なんにせよ、とりあえず進めそうです!66さんありがとうございます。
69 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 17:48:17 ] >>67 ttp://www.str.ce.akita-u.ac.jp/~gotou/zyouhou/f90/sec6.html#6.4.4.
70 名前:67 [2010/05/13(木) 18:08:38 ] >>69 ありがとうございます. 地道に代入することにします
71 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 23:22:45 ] >>68 いまコンパイラないから試してないけど、これで走らないかな。 open(1,file='data.dat',status='old') icont = 0 do read(1,*,iostat=io) aaa if(io /= 0 ) exit icont = icount + 1 end do
72 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 00:13:47 ] >>67 INTEGER, PARAMETER :: n(2, 2) = RESHAPE([1, 2, 3, 4], [2, 2]) [ = (/ ] = )] ただし Fortran2003
73 名前:66 mailto:sage [2010/05/14(金) 03:18:41 ] >>71 iostat つかっての方がきれいで良いね。
74 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 11:24:34 ] >>73 他のエラーを捉えられなくなるのが難点か。
75 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 13:25:44 ] エラー番号って規格で決まってるの?
76 名前:65 [2010/05/14(金) 15:29:50 ] レス遅くなって、すみません。 iostatの読み込みで、−1がたったらexitするように書いたら 望むとおりの挙動をしてくれました。 なんとなく勝手がわかってきたきがします。 重ね重ね、ありがとうございます!
77 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 21:51:12 ] >>74 大半は決まってない。 EOF=-1 は、まず大丈夫だが、これが規格なのか、慣例なのか分からん。 たしか EOL=-2 だったか。 Fortran2008の次期規格で、この辺の一部の定数が、INTRINSIC定数として定義されるらしい。
78 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 22:25:30 ] >>77 EOF=-1は慣例で規格としては決まってない。 だから、EOF=-1と決めつけてプログラムするのは危険。 まぁ、そんな危険はほとんどないが。
79 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 22:51:39 ] >>78 EOF=-1 は慣例なのかー。 知らんかったぜ。
80 名前:デフォルトの名無しさん mailto:sage [2010/05/17(月) 03:49:59 ] すみません、質問させて下さい。 数万行ある(x,y)データを600行ごとに値を読んでサブルーチンで計算させて そのサブルーチンで出て来た値をまた別のサブルーチンで計算させて最後に出て来た結果を 出力ファイルに書き込むようなメインプログラムの作り方がどうにもわかりません。 判るかたがいましたらご教授頂けると助かります。 f77を覚えたてです、まるっきりの初心者で恐縮ですが宜しくお願いします。
81 名前:デフォルトの名無しさん mailto:sage [2010/05/17(月) 03:55:24 ] 追記。 数万行のデータのうち始めの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ずつ増えています。
84 名前:デフォルトの名無しさん mailto:sage [2010/05/17(月) 16:56:27 ] おまえらソースコードの管理どうしてる?
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
87 名前:デフォルトの名無しさん mailto:sage [2010/05/17(月) 17:56:32 ] >>84 脳内
88 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 02:50:34 ] ぬるぽ
89 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 17:27:11 ] ガッ
90 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 23:50:40 ] >>85 すくなくとも N=1 DO 20 I = N, N + 600 もう一個のDO 20 は要らない。
91 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 02:05:24 ] >>90 ぬるぽいんたーえくせぷしょん
92 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 11:38:21 ] >>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になります!!! ほんとうに申し訳有りません。。。
96 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 16:47:43 ] どうもGOTO文やDO..CONTINUE文で混乱しているようだけど, まだFORTRANを覚え立てなら,わざわざ古い書き方で覚えずに, Fortran90形式のDO..END DO構文で慣れた方がいいんではないかい? 特にGOTO文を使うのは間違いを誘発しやすいから,使わないようにするのが世界的な流れだし.
97 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 17:05:53 ] ところでend doとendoはどっちが望ましいの? 個人的にenddoの方が一語にまとまってて好きだけど
98 名前:80 [2010/05/19(水) 17:35:55 ] >>90 そうなんですか、理解していませんでした(>_<) f77とf90だとかなり違うのでしょうか? 例えば参考にしているサイト陣がf90だったりf77だったりそれぞれ違っていたと思うのですが、 取り混ぜてしまっていたらまともなコードにはならない・・・という考えで合っていますか? 教科書は今までf77のものを使っていたので、なんにしてもf90のものを探してみます。
99 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 18:49:19 ] (>_<) …
100 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 19:29:53 ] 良いこと思いついた 焚書坑儒して77を滅ぼそう
101 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 23:16:55 ] >>94 色々、妙な点が多いプログラムではあるので、可能性は色々あるが、 サブルーチン側でX(1)〜X(600)までで計算してるんで内科医? そもそも、古い数値がいらないなら、600個の配列に毎回書き換えて読み込めばいいし、 サブルーチン側でも600個を受け取って、1〜600までの要素で計算すれば良い。 全要素を引渡しているようだが、必要なのかな? >>100 77もいいとこあるんだよ。
102 名前:デフォルトの名無しさん [2010/05/20(木) 01:00:59 ] 大学のPCのOSがLinuxでfortranを学び始めました。 家でも練習みたいのをしたのですが、windows vistaでもできるのでしょうか。 例えばメモ帳に書いて、フリーのコンパイラでコンパイルするというのを想定しているのですがこれは無理なんですか。
103 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 01:05:07 ] >>102 知らないから僕ではなく他の人に聞いてみてよ
104 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 01:55:37 ] >>102 pc12.2ch.net/test/read.cgi/tech/1163319215/2-3
105 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 02:26:22 ] >>104 そのスレの3つ目は・・・・w
106 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 03:20:19 ] >>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
108 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 04:01:02 ] まぁまぁ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は大学入るまで使うことが少なくてよくわからなかったのです。 とりあえずいわれたものをダウンロードしてみます。ありがとごいました
111 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 05:04:02 ] >>110 g95だがこのへんとか ttp://d.hatena.ne.jp/arakik10/20090213/p1 あと最近の本だとこれがわかりやすい。 ttp://www.amazon.co.jp/dp/4627847211
112 名前:108 mailto:sage [2010/05/20(木) 07:46:36 ] タダのFortranコンパイラを、と訊かれると 自分が使っている&インストール簡単だった、というそれだけの理由でgfortranを 人にはいつも薦めてるけど・・・じつはg95との違いをよく知らないのよねw ぐぬーライセンスとか内部のオトナの事情はさておき、1ユーザーとしてみると何が違うのかな?
113 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 08:03:21 ] gfortranでは装置番号を環境変数で指定できない
114 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:25:59 ] >>85 ,>>92 → >>107 同じ人が書いたとは思えない!初心者でも1日でこんなに上達するんだな。 >最後のほうのデータが抜けてしまって 表現があいまいすぎて意味分からん。もしかして女の子? 助言を求めているなら、具体的に書かないとなんとも言いようがない。
115 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:27:19 ] × >>85 ,>>92 → >>107 ○ >>85 ,>>93 → >>107
116 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 15:16:53 ] あえて77で書いてる人っているの?
117 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 15:43:03 ] ifortマンセー
118 名前:80,85,93,107 [2010/05/20(木) 19:25:09 ] >>114 わかりにくくて申し訳有りません(>_<)データは30000行入っていて欲しかったのですが どうやら最後のほうや途中がデータ計測の時に抜けてしまったようでした。 抜け自体はそれほど多く無いので線形補間というのをすれば問題は無いそうです。 計算式は渡されて、どうやるかはまだ良く判っていませんが、調べてみます。 >もしかして女の子? はい、最近分野変えで物理系の研究室に転入してきたばかりなのですが 今まではプログラミングには縁もゆかりもありませんでした。 >107は昨晩学校を徘徊して他の研究室に残っていた先輩からもアドバイスを貰いました。 >93については先輩曰く「動くようなプログラムには見えないぞ」との事で つまるところ>>96 と同じような指摘を受けたりなんだりして、手直ししてみました。 自分ではまだまだ勉強が浅いので次に違うプログラムを作る時には また色々戸惑うだろうなぁとは思っています。 これからまたしっかり勉強します、ありがとうございました。
119 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 19:30:16 ] すいません。学校の課題でy=(x+1)(x-3)=0でNEWTON法を使い、収束判定が0.0000001で終わるプログラムを 「READ」「WRITE」「if」「GO TO」「SUBROUTIN」「DIMENSION]だけ使って作るんですけど・・・ SUBROUTINEとDIMENTIONが全く分かりません。誰か教えてください。
120 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 22:22:05 ] >>118 匿名掲示板だから思い切って聞きますが、処女ですか?
121 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 22:38:22 ] >>120 横レスですが違います
122 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 22:57:36 ] >>120 他人ですが・・・うるさーい(>_<)
123 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 00:27:38 ] \ / .::::::::::::::::::::::::;;:;;::,ッ、:::::: ) く ホ す \ l ,ッィrj,rf'"'"'" lミ::::::: く れ モ ま Y ,!ミ::::::: ヽ な 以 な `ヽ、 | くミ:::::::: ノ い 外 い |、__ ャー--_ニゞ `i::::,rく か は ``''ー- ゝ、'l  ゙̄´彑,ヾ }::;! ,ヘ.) ! 帰 ゙ソ """"´` 〉 L_ っ / i , /| て r ≡=- 〈´ ,,.._ i 't-'゙ | ,へ ,r┘ ,、yx=''" `ー{゙ _, -、 ; l レ' ヽr、⌒ヽ' ゙、`--─゙ /! `、 _,,、- ゙、 ー'' / ; `、 -''"_,,、-''" ゙、 /;;' ,' / 、\ -''" / `ー─''ぐ;;;;' ,' ノ // / ヾ_、=ニ゙
124 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 01:01:32 ] 本当に誰か助けてください(TAT) 流れは xを読み込む ↓ y1=(x+1)(x-3)とy2=2x-2のy1、y2をそれぞれ算出 ↓ H=y1/y2を算出 ↓ Hが0.0000001より小さいか判別 ↓ 小さかったらHを出力して終了、大きかったらx-H=Aを算出 ↓ Aをxに代入して0.0000001より小さくなるまで繰り返し計算する こんな感じのプログラムを作りたいんですが・・・全然分からなくてできません・・・ 誰か本当に助けたください
125 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 01:31:01 ] >>124 ガンガレ!
126 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 01:51:09 ] >>90 あたりからの流れ好きだよ俺は
127 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 02:12:18 ] >>124 エラーチェック無し、暴走考慮せず、記述通りで無駄あり、Fortran90だ。 PROGRAM unko IMPLICIT NONE REAL :: x, y1, y2, a, h x = 0.0 DO y1 = (x + 1.0) * (x - 3.0) y2 = 2.0 * x - 2.0 h = y1 / y2 IF (ABS(h) < 1.0e-7) EXIT a = x - h x = a END DO WRITE(*, *) 'result=', h, ': x=', x STOP END PROGRAM unko 実行結果 result= 0.0000000E+00 : x= -1.000000
128 名前:127 mailto:sage [2010/05/21(金) 02:17:54 ] >>124 プログラム出しておいてなんだが、たぶん問題が間違ってるか、問題を写し間違っているか、 質問者が問題を理解しそこねている。 この問題だと、単にy1のゼロ点近傍に近づいたときに終了し、y2の条件があまり意味を持たない。 あまりにイミフw
129 名前:127 mailto:sage [2010/05/21(金) 02:20:07 ] >>124 ごめんw >>119 でNewton法で質問していたのか。Newton法なら意味わかる。 前レスは忘れろwww
130 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 02:29:43 ] >>119 >「READ」「WRITE」「if」「GO TO」「SUBROUTIN」「DIMENSION]だけ使って作る これは出題者がこうしろと言ってるの?
131 名前:デフォルトの名無しさん [2010/05/21(金) 02:41:32 ] >>129 ありがとうございます。そして悲しいことにFORTRANは77なんです(TAT) >>130 そうなんです(汗) 講義で教えられてないのを使うと大目玉をくらうんです。
132 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 02:53:31 ] >>118 よく解らんが、不等間隔のデータを読み込んで、等間隔のデータに補間して出力したいのかな。 > do while ((X(K-1)-XX)*(X(K)-XX) > 0.0d0) この条件式の書き方は昔風で今は流行らない。素直にIF文にした方がいい。 こんな感じの事をしたいのかもしれない。 PROGRAM unko PARAMETER (MP = 600) DIMENSION x(0:MP), y(0:MP) READ(10,*) X(0),Y(0) DO N = 1, 999999 DO I = 1,MP READ(10,*,err=99) X(I),Y(I) END DO CALL SUB1(X,Y,G,H,MP) K = 1 DO I = 0, INT( X(MP - 1) - X(0) ) XX = X(0) + REAL(I) IF ( ( X(K-1) < XX ) .AND. ( XX <= X(K) ) ) THEN YY = SUB2(G,H,X,Y,XX,K,MP) WRITE(20,'(2F15.7)') XX,YY ELSE K = K + 1 END IF END DO X(0) = X(MP) Y(0) = Y(MP) END DO 99 CONTINUE STOP END
133 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 03:18:18 ] >>131 77なら77と最初から言え・・・といいつつ本来の質問を見ていなかった朕。 一応、昔風に芋臭く書いてみた。DIMENSIONをどう使ったらいいのか分からん。 微分もプログラム的にやることにしてみた。ちょっと無理っぽいw あと、ABSを使った。 PROGRAM main WRITE(6, *) 'INPUT START VALUE =' READ(5, *) a 1 x = a CALL newton(x, h) a = x - h IF (ABS(h) .GT. 0.0000001) GOTO 1 WRITE(6, *) 'h=', h, ' x=', x END SUBROUTINE newton(x, h) DIMENSION c(2) c(1) = -1.0 c(2) = 3.0 y1 = (x - c(1)) * (x - c(2)) ! f = (x + 1)(x - 3) y2 = (x - c(1)) + (x - c(2)) ! df/dx = 1(x - 3) + (x + 1)1 h = y1 / y2 RETURN END 実行例1 INPUT START VALUE = 5.0 h= 0.0000000E+00 x= 3.000000 実行例2 INPUT START VALUE = -3.0 h= 0.0000000E+00 x= -1.000000
134 名前:デフォルトの名無しさん [2010/05/21(金) 03:43:09 ] >>133 ありがとうございます。(T∀T) やっぱりDIMENSIONは無理やり使わないと使えないですよね(汗) ちょっと疑問になったんですが、ABSのところをそのまんまhにしてもエラーが おきたりしないですか?
135 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 06:37:05 ] >>134 エラーは発生しない。 それとお礼を言われる程のことはしていない。
136 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 11:08:52 ] >>135 嘘教えんなよwww誰だよw >>134 hが負になる時の事を考えると、ABSが必要。 どうしてもABSを使いたくないなら、 IF (h < -0.0000001) GOTO 1 IF (h > 0.0000001) GOTO 1 とし給へ。
137 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 19:16:24 ] >>136 >嘘教えんなよwww誰だよw >エラーは発生しない。 これは嘘ではないと思うが。 >それとお礼を言われる程のことはしていない。 それともこっちが嘘と言っているの?
138 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 20:34:30 ] プログラマーって短気が多いんだなぁw
139 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 00:06:23 ] >>137 キモイです.....(>_<)
140 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 02:28:39 ] >>136 いやエラーは出ないだろ。
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でやっても良いんですね、ありがとうございます。
142 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 09:48:31 ] >>141 計算機でやる分には、時間がかかってもそのままやらせればいいと思う。 手で切り貼りする作業時間を含めれば、結局トータルでの時間は、計算機でやった方が早いのでは? 時間がかかる原因は、色々ある。 しかしプログラムのどの部分に時間を取られているのか分からないとなんと見えない。 細切れのI/Oが多いと時間はかかる。だが、50000行くらいなら、600行づつ読んでもそれほどでもないような。 元のプログラムだと、毎回最初のデータから条件を満たす位置を探し始めているが、 Xが単調に増加しているのなら、前回の位置から探し始めれば早く適切な場所が見つかると思う。 この辺に、時間がかかっている気がしなくもない。
143 名前:141 [2010/05/22(土) 16:30:49 ] >>142 一桁間違えていました!(>_<)500000行くらいのデータです。 数時間の測定だと100000行以内くらいで済むので5〜6分で計算出来るんですが 200000行くらいだと20〜30分くらい掛かってしまいます。 500000行くらいのデータをやろうとしたら数時間掛かってしまっていました。 Xは単調増加なので前回の位置から探すというやりかたをちょっと考えてみます、 ありがとうございます。
144 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 19:13:23 ] >>143 N= 1 * 10**5, 5. .6min 5 / 1^2 = 5 2 * 10**5, 20.. 30min 20 / 2^2 = 5 5 * 10**5, 60..180min 〜125/ 5^2 = 5 計算時間が要素数の自乗で増えているが、処理内容から言ってそうなるはずのものではない。 計算回数が自乗になりそうな所を探せば解決する気がする。 データを毎回頭から探すような部分はnC_2〜O(n^2)だから、可能性は高い。 あと、それとは別に、今デバッグモードで実行しているなら、リリースモードで実行することにより 2〜10倍くらいはやくなる可能性はある。その辺はコンパイラに依るので先輩などに聞いてみるとよいかな。
145 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 21:37:39 ] >Xは単調増加なので前回の位置から探すというやりかたをちょっと考えてみます、 >>142 が言っている「元のプログラム」って>>85 や>>93 のことではないの? >>107 も>>132 も,すでに前回の位置からREADするようになっているでしょ.
146 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 22:09:28 ] >>143 ちょっとまて! >>107 でやってみたって言ってるけど,SUB1の引数にNが入るのっておかしくないか? >>107 バージョン CALL SUB1(X,Y,G,H,N,MP) >>132 バージョン CALL SUB1(X,Y,G,H,MP) データの補間がしたいと言うことから推察するに,スプライン補間かな?(SUB1は行列を解いてる?) 5番目の引数が配列のサイズを渡しているんだとすれば,>>107 ではNに相当大きな配列サイズが指定されて, 無意味なメモリ領域を読み取ってそのまま解いているんじゃないか? SUB2ではその無意味な計算結果は使われないから,それで正常な結果が得られたとしても納得できそう. ちょっと行き過ぎた推測かも知れないけど... いちど,サブルーチンの引数を確認してみては?
147 名前:142 mailto:sage [2010/05/23(日) 17:10:04 ] >>146 毎回最初からと言っているのは、READではなくて、補間位置を決める、2つのデータに挟まれている位置を 求める部分の話。 >>107 での2重DO−LOOP構造では、DO内でK=1にしているので毎回X(0)から探し始めている DO I=0,INT(X(MP-1)-X(0)) XX=X(0)+real(I) K=1 do while ((X(K-1)-XX)*(X(K)-XX) > 0.0d0) K=K+1 end do ..YY=SUB2(G,H,X,Y,XX,K,MP) end do .. end do 一応>>132 では(Xの単調増加を仮定して)外に出してある。 >>146 読み込んだデータを延々と配列にため込んでいるので、毎回現在のポインタ位置のような意味でNを渡す 必要があるのではないかと思う。
148 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 19:34:40 ] 必要があるといいですね
149 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 19:59:51 ] 前半は納得した. 後半「読み込んだデータを延々と配列にため込んでいるので、」というのは違うと思う. どちらも0:MPの配列を使い回してる. >>107 の抜粋 READ(10,*) X(0),Y(0) do N=1,NW,MP DO I=1,MP READ(10,*,err=99) X(I),Y(I) end do CALL SUB1(X,Y,G,H,N,MP) ...(略)... X(0) = X(MP) Y(0) = Y(MP) end do >>132 の抜粋 READ(10,*) X(0),Y(0) DO N = 1, 999999 DO I = 1,MP READ(10,*,err=99) X(I),Y(I) END DO CALL SUB1(X,Y,G,H,MP) ...(略)... X(0) = X(MP) Y(0) = Y(MP) END DO どちらにしてもサブルーチンの中身が分からないと,X,Yの配列を使い回すのが正しいのかすら推測の域を出ないな. 質問者のレベルから考えると,引数の意味を把握しているか自体が心配. (このスレ,勉強になるなぁ)
150 名前:142 mailto:sage [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がおかしいのでしょうか? もう少しいぢくってみます。。。
152 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 12:47:55 ] >>151 メール欄に sage と書き込んで、スレが上のほうに上がらないようにした方がいいですよ。 スレが上に上がると、通りすがりの冷かしが面白半分なレスを書き込んでくる確率が上がるので(^^
153 名前:デフォルトの名無しさん [2010/06/06(日) 02:50:01 ] i==2 ? x = 0 : x = 2 みたいなのは無理なんですか?
154 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 03:15:10 ] >>153 x=2; IF (i==2) x=0
155 名前:デフォルトの名無しさん [2010/06/06(日) 22:26:58 ] >>154 なるほどサンクスです でもやっぱ?使えた方が見やすいですね
156 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 13:55:06 ] >>153 これって何の言語ですか?
157 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 18:05:16 ] >>156 Ruby java
158 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 00:01:45 ] >>156 おしっこC言語。3項演算子。 しかし、昔風の書き方の気が・・・ 最近はFortranでもCでも、もっとわかりやすく書くように指導されているはずだが・・・
159 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 02:05:16 ] 配列の仮引数に、スカラーの実変数をsize=1の配列として渡すのって、 どうやればいいの? 下の例だと、rank mismatchでcompile通んないし、 reshape(s,1)もダメって言われた。 一回、別の配列に値をコピーするしかないのかな? Program test integer s s = 1 call inc(1,s) print *, s Contains Subroutine inc(n, a) implicit none integer, intent(in) :: n integer, intent(inout) :: a(n) integer i do i = 1,n a(i) = a(i) + 1 end do End subroutine inc End program test
160 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 03:16:01 ] >>159 INTENT(IN) 属性なら、 call inc(1,[s]) ないし call inc(1, (/s/)) でいけるが、INTENT(OUT)で値が返る場合はダメだなあ。
161 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 11:42:43 ] integer s(1) とサイズが1を明示すれば通るけど(intel のやつ)・・・それじゃダメなんだよねぇ・・・・ 思いつきで(邪道とされるw)equivalence 使って Program test integer sdummy(1) integer s equivalence(sdummy, s) s = 1 call inc(1,sdummy) ・・・・・ でも通るけど・・・意味ねぇなw
162 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 11:44:40 ] あ、始めて気づいたけど、 integer s(1) s=1 って通るんだね。コンパイラにも寄るんだろうけど。
163 名前:デフォルトの名無しさん [2010/06/08(火) 12:46:57 ] >>162 たぶんそれ、F90の配列初期化の一括代入になってるだとおもう。
164 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 12:50:56 ] ありがとう。 そっか普段77で書いてるから不慣れというかまったく気付かなかった。 たまに90で書くし初期化で使うのに・・・ Intel (たぶん余所のも) のはF77固定書式で書いても、 その事をコンパイルオプションで明示しないと、 F90の機能をちょっとなら混ぜても 文法が干渉しない限りは有効とみなすんだよね。 ・・・危ないような気もする。
165 名前:159 mailto:sage [2010/06/08(火) 19:06:53 ] >>160 その場合でも結局、一時的な配列に値をコピーしてから渡すって意味になってるんだよ。 >>164 FORTRAN77なら型チェックなんかないし、 配列にスカラー変数を渡すのは正しい操作なんだよね。 内部的にはメモリアドレスを渡してるだけなんだから。 >>161 のequivalenceは、今回のprogram文では意味ないけど、 変数sがサブルーチンの仮引数のときに、 無用なコピーを作らず渡せる唯一の方法かもしれない。
166 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 23:43:04 ] >>165 素直にテンポラリを間にかますのが一番いいと思うけどさw EQUIVALENCE ありなら、なんでもアリだなw POINTERという手はどうだ? Cとの互換POINTERを使えば、RANKとかのチェックは逃れられる。 Program test USE, INTRINSIC :: iso_c_binding IMPLICIT NONE integer :: s s = 1 call inc(1, c_loc(s)) Contains Subroutine inc(n, p) implicit none integer, intent(in) :: n TYPE(C_PTR), intent(in) :: p integer :: a(n) integer i CALL C_F_POINTER(p, a) do i = 1,n a(i) = a(i) + 1 end do End subroutine inc End program test
167 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 13:23:31 ] >>159 みたいなことは御法度なんじゃないの? そのために90以降いろいろと拡張されたわけでしょ?
168 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 22:00:59 ] 質問です。 LAPACKを使うプログラムなんですが、 Intelのコンパイラだとコンパイル出来るのですが、 gfortranだとSyntax errorが出てしまいます。 こういうことってプログラムに間違いが無くても起こりますか?
169 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 22:23:27 ] >>168 起こる。
170 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 22:49:25 ] >>167 そうなんだけど、その辺は70年代的Pascalマンセー的な発想で、型チェックギチギチにしたら 確かにエラーは減ったが、窮屈で困ってしまったというのが、80年代以降というか。 実際、Fortran的にはF95でELEMENTAL型の副プログラムが定義出来るようになって、 スカラーで副プログラムを定義しておけばRANKによらずに配列引数が取れるようになっている。 アルゴリズム部分とデータ構造を、もっと独立したユルユルの関係にしたいというか。
171 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 22:57:12 ] >>169 そうですかー… ありがとうございます
172 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 04:24:29 ] >>168 その LAPACK はだれがどのコンパイラでコンパイルしたの?
173 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 13:10:28 ] >>170 気持ちは分かるなぁ・・・ この辺の善し悪しは開発の規模にもよるんだろうな
174 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 14:47:46 ] >>172 LAPACKはLinuxのパッケージ管理ソフトで入れたんですが、 だからたぶんgccでコンパイルされたものだと思います。
175 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 19:39:21 ] Fortranerの中には数値計算な業界の人も多いと思うけど、ぶっちゃけ聞きますが飯食えてますか? ニッチでそこそこやっていけてるのか、それとも潰しのきかない悲しい境遇なのか
176 名前:デフォルトの名無しさん [2010/06/14(月) 21:57:26 ] 受験者数と受験者の受験番号と点数が分かっている。 10 17 73 5 64 22 67 6 66 7 90 42 88 9 74 11 79 2 63 13 72 (1行目は受験者数、2行目以降の左は受験番号、右は点数) 以上のデータdata.txtを読み込み、以下に示す結果をresult.txtに出力するようなプログラムを作成せよなお、この試験では59点以下はD、60点以上69点以下はC、70点以上79点以下はB、80点以上はAと判定することにする。 ---------------------------------------------- 受験者 x人 A x人 B x人 C x人 D x人 平均点 x 標準偏差 x 中央値 x 順位 受験番号 点数 成績 1 25 85 A 2 41 82 A (以下省略) ---------------------------------------------- ・xには数字が入る。 ・中央値はMOD関数を用いること。 以上の問題が分かりません。誰かよろしくお願いします。
177 名前:デフォルトの名無しさん [2010/06/15(火) 19:18:06 ] e^x,sinx,logxのテーラー展開を求めるプログラムを教えてもらいたいのですが… e^xはできたので、これを参考に教えてください! subroutine expotn (x) c real Tn, ans, err integer n c EPS = 1.0e-6 n = 0 Tn = 1.0 ans = Tn write(6,10) x 10 format('EXP(', f10.5, ') ') 50 if( abs(Tn) .gt. EPS) then n = n + 1 Tn = Tn * x / n ans = ans + Tn err = ans - exp(x) write(6,11) n, ans, err 11 format(I3,' exp(X) = ',f12.7,' err = ',f15.10) go to 50 end if write(6,*) ' Exp( ',x,' )= ',ans return end c
178 名前:デフォルトの名無しさん [2010/06/19(土) 00:40:28 ] MinGWにくっついていたG95コンパイラを用いて、 Fortran77のソースコードをコンパイルしようとすると 以下のようなエラーが出ます。 コンパイルするときのコマンドは以下のとおりです。 >g95 F:\Direct_vs_Ewald.f -freal-loops 問題のソースコードは以下の部分です。 volume=a(1)*(b(2)*c(3)-b(3)*c(2))-a(2)*(b(1)*c(3)-b(3)*c(1)) & +a(3)*(b(1)*c(2)-b(2)*c(1)) この処理の部分で&の下に1が出現します。 Error: Unclassifiable statement at (1) なぜ、このようなエラーが出るのかわかりませんでした。 ()の閉じ忘れは確認したところありませんでした。 &記号が二つの文をひとつにする働きがあることは調べたら出てきましたが、 G95コンパイラにはこのような機能は無いということでしょうか?
179 名前:178 [2010/06/19(土) 02:02:52 ] すみません。いったん寝ます
180 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 02:19:08 ] >>177 SIN(x) = x - x^3 / 3! + x^5 / 5! - x^7 / 7! +..... subroutine sinetn(x) c real Tn, ans, err integer n c EPS = 1.0e-6 n = 0 Tn = x ans = Tn write(6,10) x 10 format('SIN(', f10.5, ') ') 50 if( abs(Tn) .gt. EPS) then n = n + 1 Tn = - Tn * x**2 / ( (2 * n + 1) * 2 * n ) ans = ans + Tn err = ans - sin(x) write(6,11) n, ans, err 11 format(I3,' Sin(X) = ',f12.7,' err = ',f15.10) go to 50 end if write(6,*) ' Sin( ',x,' )= ',ans return end c
181 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 02:24:33 ] >>177 LOG(1 + x) = x - x^2 / 2 + x^3 / 3 - x^4 / 4 +...... 収束半径が小さいので注意。一般の範囲でやりたいなら、LOGの性質を使って範囲を調整汁。 subroutine logtn(x) c real Tn, ans, err integer n c EPS = 1.0e-6 n = 1 Tn = x - 1.0 ans = Tn write(6,10) x 10 format('Log(', f10.5, ') ') 50 if( abs(Tn) .gt. EPS) then n = n + 1 Tn = - Tn * ( x - 1.0 ) ans = ans + Tn / n err = ans - log(x) write(6,11) n, ans, err 11 format(I3,' Log(X) = ',f12.7,' err = ',f15.10) go to 50 end if write(6,*) ' Log(',x,' )= ',ans return end c
182 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 03:07:25 ] >>178 g95で試してみたが、6カラム目に&がくれば問題なくコンパイルできた。 FORTRAN77の継続行指定は6カラム目に無いと駄目。 ずれると、 Error: Unclassifiable statement at (1) が出る。 エラー行と数字の1が出ているはずで、それがエラー位置を指しているので、よく見よ。 ちなみに、Fortran90では&は継続行を意味するが、1行目の尻に書く。 詳しくはマニュアルを読んでくれ。 純粋なFORTRAN77では&は規格外の文字なので本来は使っていけない。 (今となっては余り気にしないが。)
183 名前:178 mailto:sage [2010/06/19(土) 08:06:20 ] >182 ありがとうございます。 Tabでインデントしていたので気づきませんでした。 半角スペース5個をつけた後、&をつけるようにしたら、そのエラーは消えました。 Warning (121): COMMON block 'coor' is 1600004 bytes at (1) and 160004 bytes at ( 2) というエラーは出ましたが、-wオプションをつけることでなんとかコンパイルはできるようになりました
184 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 14:10:25 ] ファイルをdirect accessで読む場合、 open (10,file='hoge.dat',access='direct',recl=4) read(10,rec=10000) j みたいに欲しい場所をすぐ読めますが、sequentialで同じようなことは可能でしょうか? 今まではこんな風に不要な部分は破棄していたんですが、効率が悪いと思いまして。 open (10,file='hoge.dat',access='sequential') do i=1,9999 read(10) jtmp enddo read(10) j
185 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 16:37:37 ] >>184 末尾だったらOPEN時に指定出来るが、任意位置には行けない。 というか行きようが無い。 直接型はレコード長が全要素で共通だから特定の位置までのバイト数がわかるが、 レコード長が不定長の逐次型では原理的に知り得ない。 ところで読み飛ばすときjtmpに読み込まなくても空READだけでおk。 あと後ろに近いなら、尻から始めてBACKSPACEで逆行する技もある。 それが負荷を減らすかどうか知らんwwwww
186 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 18:14:42 ] >>185 やっぱり不可能ですか。 将来ウンTBのデータを扱う時代になったら、データハンドリングはどうなるんでしょうね。 ファイルはダイレクトアクセス、データ構造はレコード長まで完全に把握するというのが 一般的になるんでしょうかね・・・
187 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 23:07:40 ] >>176 受験者 10 人 A 2 人 B 3 人 C 4 人 D 1 人 平均点 68.00000 標準偏差 19.24578 中央値 69.50000 順位 受験番号 点数 成績 1 7 90 A 2 42 88 A 3 11 79 B 4 9 74 B 5 13 72 B 6 22 67 C 7 6 66 C 8 5 64 C 9 2 63 C 10 10 17 D
188 名前:1/3 mailto:sage [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 mailto:sage [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 mailto:sage [2010/06/19(土) 23:12:50 ] SUBROUTINE sort(nmax, n, in) INTEGER in(nmax, 2) DO 10 i = 1, n DO 20 j = 1, n IF ( in(j, 2) .LT. in(i, 2) ) THEN itmp1 = in(i, 1) itmp2 = in(i, 2) in(i, 1) = in(j, 1) in(i, 2) = in(j, 2) in(j, 1) = itmp1 in(j, 2) = itmp2 END IF 20 CONTINUE 10 CONTINUE RETURN END FUNCTION grade(k) CHARACTER grade IF (k .GE. 80) THEN grade = 'A' ELSE IF (k .GE. 70) THEN grade = 'B' ELSE IF (k .GE. 60) THEN grade = 'C' ELSE grade = 'D' END IF RETURN END 考えなしに書いた。なんなん(・∀・)!?
191 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 02:12:48 ] 残差の二乗和を計算するときの精度と実行速度について悩んでます。 速度よりは精度の方を優先したいのですが、 以下の3つのソースで、最もバランスの良いものはどれでしょう? xとaはそれぞれ倍精度実数として、 1. (x-a)**2 2. (x-a)*(x-a) 3. (x-a)*(x+a) よろしくお願いします。
192 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 06:21:47 ] 指数部が整数の時は同じ掛け算をする(はず)。というわけで精度&実行速度の点で、ぼほ1=2と思ってよろし。 でもたとえば、a=1.0 でデータxを3要素で値が(1e-6,1,1e6)とすると、 第3要素のおかげで他の2項の寄与が消えちゃう。 ので、x^2 + 2ax + a^2 の3項にわけで個別に和をとって最後に足す、という事をすると 2ax の部分が残る分マシ。参照値 a とデータ x の分布次第だね。 x が a と同じオーダーなら気にすることは無い。 3は、 x*x - a*a の方が一般には精度という点で推奨される 同じく参照値 a と比べたときの x の値の分布次第、でもあるが 速度については積の演算はCPU毎にコストが違うので、どちらが良いかは一概にはいえない。
193 名前:デフォルトの名無しさん [2010/06/20(日) 17:31:29 ] >>181 ちょっとまた質問です。 例えば、x-1.0=tと自分で置いたら Tn = x - 1.0 → Tn = t write(6,10) x → write(6,10) t Tn = - Tn * ( x - 1.0 ) ← Tn = - Tn * t とおいて、より簡単なプログラムにしてもいいですか? なるべくなら、式が簡単なほうが分かりやすいですし。
194 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 23:29:03 ] >>193 それでもよい。 なお、そのテイラー展開の収束半径は、|x|<1のはずなので、その範囲から外れるような値も 計算できるようにしたいなら、LOG(X*10^N)=LOG(X)+N*LOG(10) などの公式を使って スケールしてやる必要がある。
195 名前:デフォルトの名無しさん [2010/06/21(月) 00:13:24 ] 仮にt=1.5の計算をするときには範囲のプログラムとして>>194 のようなプログラムを施すということでよろしいのでしょうか?
196 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 00:16:37 ] >>195 もう一個スケール処理するサブルーチンを書いて、それがテイラー展開のサブルーチンを呼べばいいんでないかい? サブルーチンからサブルーチンを呼ぶ。
197 名前:デフォルトの名無しさん [2010/06/21(月) 00:30:26 ] >>196 つまりは例として出ているLOG(X*10^N)=LOG(X)+N*LOG(10)という関数のサブルーチンをlog(x)の範囲のところに呼ぶというわけですか?
198 名前:デフォルトの名無しさん [2010/06/23(水) 16:56:50 ] こんにちは。sinxのテーラーのプログラムを以下のように書きましたが、うまくいきません… おそらく、何か足りないのでしょうが…教えてください。 プログラム(1/2) program sinTelor c real x integer which c c begin c EPS = 1.0e-5 write(6,*) 'Taylor Expansion of mathematical function' write(6,*) ' .Sine function' read (5,*) which end
199 名前:デフォルトの名無しさん [2010/06/23(水) 16:57:33 ] プログラム(2/2) c subroutine sine (x) c begin real Tn, ans, err integer n, nstop c nstop=30 EPS = 1.0e-6 n =1 Tn = x ans = Tn write(6,10) x write(6,*) ' sin(x)= ',sin(x) 10 format('SIN(', f10.5, ') ') 50 if( abs(Tn) .gt. EPS .and. n .lt. nstop) then n = n + 1 Tn = - Tn * x **2 / ( (2 * n -1) *( 2 * n-2 )) ans = ans + Tn err = ans - sin(x) write(6,11) n, ans, err 11 format(I3,' sin(X) = ',f12.7,' err = ',f15.10) go to 50 end if write(6,*) ' sin( ',x,' )= ',ans return end return end
200 名前:デフォルトの名無しさん mailto:sage [2010/06/23(水) 18:28:09 ] >>198 >>199 それは君が馬鹿だからです
201 名前:デフォルトの名無しさん mailto:sage [2010/06/24(木) 02:44:17 ] >>198 まずこの 綴りの間違いを何とかしろ!w program sinTelor CALL sine( which ) を書け。サブルーチンを呼び出さずに何をする気だw 兄貴がサブを呼ぶと覚エロ!
202 名前:デフォルトの名無しさん mailto:sage [2010/06/24(木) 09:49:15 ] >兄貴がサブを呼ぶ 解説プリーズ
203 名前:デフォルトの名無しさん mailto:sage [2010/06/25(金) 10:09:02 ] すみません(汗) FORTRAN77で、Gauss-Jordan法のプログラムを 「READ」「WRITE」「GO TO]「IF]「SUBROUTINE」 「DIMENSION」を使って作りたいんですが・・・ 全く分りません。誰か教えてください!
204 名前:デフォルトの名無しさん mailto:sage [2010/06/25(金) 23:49:59 ] >>203 図書館行ってアルゴリズム集から完コピ。マジオススメ
205 名前:デフォルトの名無しさん mailto:sage [2010/06/26(土) 00:03:12 ] >>203 誰か、F77で掃き出し法のサブルーチン作ってテンプレに書いておけよ。
206 名前:デフォルトの名無しさん mailto:sage [2010/06/26(土) 00:58:47 ] >>203 goto は使うな!
207 名前:デフォルトの名無しさん mailto:sage [2010/06/26(土) 02:12:04 ] >>206 それ70年代の話www
208 名前:デフォルトの名無しさん [2010/06/26(土) 12:17:22 ] >>207 え!?
209 名前:デフォルトの名無しさん mailto:sage [2010/06/26(土) 14:07:24 ] >>203 dimensionも使うな!
210 名前:デフォルトの名無しさん mailto:sage [2010/06/26(土) 23:12:28 ] 微笑ましいよね。 きっと課題に「xxx」「yyy」を使え、と明示してあるんだろうね。
211 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 10:00:36 ] 77でgotoを使わないのは、結構苦しいと思うが。
212 名前:デフォルトの名無しさん [2010/06/27(日) 11:19:38 ] 全く無しはしんどいよね。最小限にはすべきだけど。 do while があれば goto を使う機会が激減する・・・と書こうとしたけど、 お題の203さんの課題では do は入ってないね・・。 if goto の組み合わせで何とかしろ、ということなのか。 これはこれでしんどいw
213 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 12:44:34 ] >>203 まじめにアドバイス Fortranがわからないの?Gauss-Jordan法がわからないの? 「知らない数値解法」で「知らない言語」で書け、 という課題が悩ましいのは自分もそうだったのでわかるけど 丸投げだとあまり回答もらえないですよ。 前者なら、どの程度の基礎的なプログラムなら書けるのかを提示して どの部分を調べたらよいかをアドバイスもらい、 後者なら、ネットで調べたり、その解法のどの部分のプログラム化が?なのかを提示 したほうがいいと思います。 正直、その解法で、何を解きたいのかよくわからないし。
214 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 14:11:37 ] >>213 放っておいてあげれば良いと思うよ。
215 名前:デフォルトの名無しさん [2010/07/02(金) 13:45:32 ] A〜Zまでの文字のデータを1つ1つファイルにしておき 小文字で入力された文字列をファイルから読み込んで 大文字で表示するにはどのようにすれば良いのでしょうか? 入力された文字をそれぞれのファイルから 読み込む方法がよくわかりません。お願いします。 F90
216 名前:デフォルトの名無しさん mailto:sage [2010/07/02(金) 16:33:26 ] 質問があいまい&意味不明... ファイル内に記述された特定の文字だけを大文字に変換したいのかな? もしそうなら、Fortranではなくawkやperlを使った方が断然楽だよ。 いちおう、ファイルを読み込むのも、入力文字を読み込むのもREADを使う。
217 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 00:07:10 ] >>215 完全イミフ。 日本語でおk
218 名前:デフォルトの名無しさん [2010/07/03(土) 00:08:49 ] 表示ができるようになったのですが、ファイルの行数を明示しないと End Of Line になってしまうのですが、そこで integer io を宣言して行末を発見して読み込みを止めさせようとしたが うまくできないのです なお data614.txt は株価のデータで 価格(整数),年,月,日 にしてあります。 program hyoujisurudake2 implicit none integer :: i integer :: io=0 integer :: xprice,xyear,xmonth,xday !*4を*8にしたりして試していたけどできなくて、こうしたらできた open(10,file='data614.txt',status='old') i = 0 do !だめだ read(10,iostat=io) ,xprice, xyear, xmonth, xday read(10,*) ,xprice, xyear, xmonth, xday ! if(io <= -1 ) exit if(i>=3406) exit i=i+1 !2 print* , i,xprice print* , i, xprice, xyear, xmonth, xday end do close(10) stop end
219 名前:デフォルトの名無しさん [2010/07/03(土) 00:34:57 ] 多分続けて投稿です 上記の株価データですが本当はこうなっているんです これ 年/月/日,株価 具体的には 1999/12/31,12345 2000/1/1,23456 2000/1/2,23456 てな具合ですがここで大きな問題がある それは 読み込むときに「,」切りはいいとして 「/」での切り方がわからない・・・ fortran だと何文字をどこそこに格納して とかいうのはとくいですが パーサーが無い? ので「,」で切ってから「/」で切るという処理は どうやるのでしょうか
220 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 01:10:19 ] >>218 IOSTATがうまくいかないのは、Fortmat書式を抜いているから。 >>219 INDEX関数使えば出来る。
221 名前:デフォルトの名無しさん mailto: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, '/') ip2 = INDEX(text, '/', BACK = .TRUE.) ip3 = INDEX(text, ',') READ(text( 1:ip1 - 1), *) iyear READ(text(ip1 + 1:ip2 - 1), *) imonth READ(text(ip2 + 1:ip3 - 1), *) iday READ(text(ip3 + 1: ), *) iprice print * , i, iprice, iyear, imonth, iday end do close(10) stop end 1 12345 1999 12 31 2 23456 2000 1 1 3 23456 2000 1 2 続行するには何かキーを押してください . . . この入力データで問題となるのは、FORTRANの書式指定無しの場合、スラッシュ『/』は改行を意味する制御文字に なっている点だ。これを知らないと、何故か入力がなされなくて、地獄へ落ちる!
222 名前:デフォルトの名無しさん [2010/07/03(土) 16:10:31 ] >>203 gotoは1関数に1ラベルなら使ってOKだよ! ソースが見やすくなるからね
223 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 00:50:08 ] >>203 PIVOT処理するのが面倒なのでしてないw SUBROUTINE GJ(a, b, n) ! Gauss-Jordan method DIMENSION a(n, n), b(n) DO 10 irow = 1, n pivot = a(irow, irow) IF (pivot .EQ. 0.0) STOP 'pivot is 0.0!' DO 5 icol = 1, n a(irow, icol) = a(irow, icol) / pivot 5 CONTINUE b(irow) = b(irow) / pivot DO 20 jrow = 1, n IF (irow .NE. jrow) THEN q = a(jrow, irow) DO 30 icol = 1, n a(jrow, icol) = a(jrow, icol) - q * a(irow, icol) 30 CONTINUE b(jrow) = b(jrow) - q * b(irow) END IF 20 CONTINUE 10 CONTINUE RETURN END
224 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 06:34:23 ] >>219 2000年元旦に市場で何があったんだ・・・w >>221 / , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな? text(ip1:ip1) = ' ' (略) READ(text,*) iyear, imonth, iday, iprice 手元にコンパイラがないから・・これで勘弁
225 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 07:24:53 ] >>222 俺もそうだよw 224だけど、どうかな?
226 名前:221 mailto:sage [2010/07/04(日) 14:20:20 ] >>224 >/ , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな? その方がいいな。 ↓コンマは区切り文字になっているから残してもいいのだが、INDEXの代わりにSCAN関数使ってみたかったので消した。 program hyoujisurudake2 implicit none integer :: i, io, ip1, ip2, ip3 CHARACTER(LEN = 80) :: text integer :: iprice, iyear, imonth, iday open(10,file='data614.txt',status='old') i = 0 do read(10, '(a)', iostat = io) text if (io <= -1 ) exit i = i + 1 CALL cutslash(text) READ(text, *) iyear, imonth, iday, iprice print * , i, iprice, iyear, imonth, iday end do close(10) stop CONTAINS SUBROUTINE cutslash(text) CHARACTER(LEN = *), INTENT(IN OUT) :: text INTEGER :: k DO k = SCAN(text, '/,') IF (k == 0) EXIT text(k:k) = ' ' END DO RETURN END SUBROUTINE cutslash end program hyoujisurudake2
227 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 04:43:04 ] >>226 コンマは区切り文字になっているから残してもいい 本当だ! いまの今まで知らんかった・・・。 CSV みたいに','が区切り記号で使われてる ファイルもらったときも御丁寧に置き換えてた・・。
228 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 18:03:28 ] write文での制御編集記述子についての質問です。 100e18.10 と指定してファイルに書いていたのですが、 これを 100es18.10e2 と指定すると、一部がアスタリスクになってしまいます。 マニュアルを読むかぎり 100が書式の繰り返し数 18が小数点上の桁、小数点以下の桁、指数を含めたすべての桁数 10が小数点以下の桁数 2が指数の桁数 と理解したのですが、どこか誤りがあるでしょうか。 教えていただけないでしょうか。
229 名前:デフォルトの名無しさん [2010/07/05(月) 20:56:57 ] 218 219 です >220 さん ありがとう >221 さんコードまで書いてもらってありがとうございます。 うちのPCだとコンパイルがうまくいかないようですが、 それは多分調整のレベルなのでしょう。 ほんとにこんなに早くレスがくるとは思ってもみず 返事が遅くなりました
230 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 21:01:23 ] >>224 > 224 名前:デフォルトの名無しさん [sage]: 2010/07/04(日) 06:34:23 > >>219 > 2000年元旦に市場で何があったんだ・・・w すみません、これ分かりやすくするためのものでして・・・。 「文字の数が変わっちゃうのでこまっていた」ということでした。 > >>221 > / , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな? > text(ip1:ip1) = ' ' > (略) > READ(text,*) iyear, imonth, iday, iprice > 手元にコンパイラがないから・・これで勘弁 いろいろ工夫が必要なのが分かって着ました。 高級言語の割には今時のRubyとかよりずっとマニュアル車っぽくていいようなかんじも・・ ありがとうございました。 これで本題の数値解析に移れます
231 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 21:04:51 ] >>226 > 226 名前:221 [sage]: 2010/07/04(日) 14:20:20 > >>224 > >/ , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな? > その方がいいな。 ↓コンマは区切り文字になっているから残してもいいのだが、INDEXの代わりにSCAN関数使ってみたかったので消した。 > program hyoujisurudake2 218 です いろんなやり方があるんですね。 それだけ皆さんは苦労してきたと想像します
232 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 21:06:49 ] >>227 > 227 名前:デフォルトの名無しさん [sage]: 2010/07/05(月) 04:43:04 > >>226 コンマは区切り文字になっているから残してもいい > > 本当だ! > いまの今まで知らんかった・・・。 CSV みたいに','が区切り記号で使われてる > ファイルもらったときも御丁寧に置き換えてた・・。 219 です すると "," は標準で区切り文字になっているが、それを解除?することは 難しそうですね。きっとできるでしょうが、とっても深い世界
233 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 22:00:36 ] はい
234 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 23:46:10 ] >>228 Fortranの場合、Formatで指定した桁数からあふれると、アスタリスクが出力される。 今の場合、多分指数部分が溢れているんじゃないかと思う。 E-10とかが出ると、ヤバイ。E2の2には符号の分も含まれる。 >>232 >すると "," は標準で区切り文字になっているが、それを解除?することは >難しそうですね。きっとできるでしょうが、とっても深い世界 それはFORMATをあらわに指定すれば出来る。 上の例でも、ファイルの1行を丸々文字列として読み込んでいる。 read(10, '(a)', iostat = io) text この場合は、スラッシュもコンマもただの文字として読み込まれる。
235 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 00:17:16 ] 読み込まれる。
236 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 00:22:20 ] >>235 ひがむなって。百姓・町人みたいだぞ。
237 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 01:27:54 ] >>234 ありがとうございます。 >>228 にある18を25などの大きな値にしてみたのですが、それでも一部でアスタリスクになってしまうことがありました。 一行にかける文字数などなにか別の制約があるのでしょうか。
238 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 02:02:43 ] >>237 全体の幅を増やせば仮数部は大丈夫になるが、その場合でも指数部の幅は変わらないので、指数部が問題なのでは?
239 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 20:13:16 ] >>237 いいよいいよ。
240 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 23:54:42 ] 部分ピボッティング付きのガウス−ジョルダン法。これで対角要素が0でもダイジョブのはず? SUBROUTINE GJ(a, b, n) ! Gauss-Jordan method with partial pivoting DIMENSION a(n, n), b(n), temp(n) DO 10 idiag = 1, n CALL pivoting(a, b, n, idiag) pivot = a(idiag, idiag) DO 5 icol = 1, n a(idiag, icol) = a(idiag, icol) / pivot 5 CONTINUE b(idiag) = b(idiag) / pivot DO 20 jrow = 1, n IF (idiag .NE. jrow) THEN q = a(jrow, idiag) DO 30 icol = 1, n a(jrow, icol) = a(jrow, icol) - q * a(idiag, icol) 30 CONTINUE b(jrow) = b(jrow) - q * b(idiag) END IF 20 CONTINUE 10 CONTINUE RETURN END
241 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 23:56:18 ] SUBROUTINE pivoting(a, b, n, k) DIMENSION a(n, n), b(n) temp = 0.0 ipiv = k DO 10 i = k, n IF (ABS(a(i, k)) .GT. temp) THEN temp = ABS(a(i, k)) ipiv = i END IF 10 CONTINUE DO 20 i = k, n temp = a(ipiv, i) a(ipiv, i) = a(k, i) a(k, i) = temp 20 CONTINUE temp = b(ipiv) b(ipiv) = b(k) b(k) = temp RETURN END メインルーチン:ただしf90機能を使用w PROGRAM test PARAMETER( n = 5 ) REAL a0(n, n), a(n, n), b0(n), b(n) CALL RANDOM_SEED() CALL RANDOM_NUMBER(a0) CALL RANDOM_NUMBER(b0) a = a0 b = b0 CALL GJ(a, b, n) PRINT *, SQRT( SUM( (MATMUL(a0, b) - b0)**2 ) / N ) END
242 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 00:40:13 ] >>238 ありがとうございました。ようやくおっしゃる意味がわかりました。 指数の部分を2桁にしてことが原因ということですね。 納得しました。明日試してみます。
243 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 03:23:33 ] >>221 > 221 名前:デフォルトの名無しさん [sage]: 2010/07/03(土) 01:44:30 > >>219 > program hyoujisurudake2 > implicit none > integer :: i, io, ip1, ip2, ip3 > CHARACTER(LEN = 80) :: text > integer :: iprice, iyear, imonth, iday > open(10,file='data614.txt',status='old') > i = 0 > do > read(10, '(a)', iostat = io) text > if(io <= -1 ) exit !★ここです > i=i+1 > ip1 = INDEX(text, '/') > 中略 > end do > close(10) > stop > end ----- > 3 23456 2000 1 2 16行目の if(io <= -1 ) exit !★ここですが「-1」を「0」とか他の値にしても出ないかEnd of File のエラーになるのですが、これはUbuntu910 + gfortran だからでしょうか? いくつを入れてもうまくいかないです
244 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 03:42:24 ] >>243 自己レスです すみません データーの最後の行に「 / / , 」という空白でータ行が入っていた! だから最後まで読むけど 終わりを過ぎてしまう というエラーが出ていた おろかしー
245 名前:デフォルトの名無しさん mailto:cafexion2@yahoo.co.jp [2010/07/08(木) 15:45:51 ] 3元以上、9元までの連立一次方程式を解くプログラムをg77で作成しているんですが、なかなかエラーなしにすんなりとソースプログラムを作ることができません。 ガウス・ジョルダン法を利用して作れと指示があり、一応作ってみたのですが、エラーがいたるところに出て、エラーの内容もわからないため、訂正をお願いしたいです。 なにせFORTRANを使い始めて間もないため、超初心者でもここまでひどいソースは書かないとおもわれるほどのひどいソースかもしれませんが、どうかお願いします。 Cygwin 1.7.5-1 の fortranコンパイラを使用しています。以下、作った未完成ソースプログラムです。 real i,j,N,k,aij,bij read(5,*) N DO 100 i=1,N DO 110 j=1,N read(5,*) aij 110 continue 100 continue DO 120 i=1,N read(5,*) bi 120 continue call GJ(aij,bi) 130 write(6,*) bi end subroutine GJ(aij,bi) DO 130 k=1,N akj=akj/akk if(i=k) aij=aij else aij=aij-akj*ajk if(i=k) bk=bk/akk else 120 bi=bi-bk*aik DO 130 i=1,N return end
246 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 20:04:08 ] GJのアルゴリズムは確認していないけど、とりあえず配列の作り方を確認してみ。 配列変数には()が必要。 あと、エラー内容をコピペしてみて。
247 名前:デフォルトの名無しさん mailto:cafexion2@yahoo.co.jp [2010/07/08(木) 20:54:40 ] エラーをがんばって見て作りなおしてみましたがエラーがでます。 以下、GJのサブルーチンを抜かしたソースです implicit none integer s,t,n,k real a,b read(5,*) n dimension a(n,n),b(n) DO 100 s=1,n DO 110 t=1,n read(5,*) a(s,t) 110 continue 100 continue DO 120 s=1,n read(5,*) b(s) 120 continue 連投になって申し訳ないですが、次にエラーのコピペします。
248 名前:デフォルトの名無しさん mailto:cafexion2@yahoo.co.jp [2010/07/08(木) 21:01:06 ] >>246 先ほど言い忘れましたが、レスありがとうございます。 全部コピペは入りきらないので最初のエラーかつ一番多い文の一つをコピペしました。 内容は、辞書で調べながらやったのですが、宣言が間違っていると言ってるように思います。 114.for: In program `MAIN__': 114.for:2: integer s,t,n,k 1 114.for:5: (continued): dimension a(n,n),b(n) 2 Invalid declaration of or reference to symbol `n' at (2) [initially seen at (1)] お願いします。
249 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 22:42:33 ] > implicit none > integer s,t,n,k > real a,b > read(5,*) n > dimension a(n,n),b(n) ここの部分が間違っている。 implicit none real a(n,n),b(n) integer s,t,n,k read(5,*) n と書くのが正しい配列の定義の仕方。このばあい、属性を意味する"dimension"は書かなくてok あと注意点だけど、変数定義の途中に実行可能な文を入れてはダメ。 >>247 の場合dimensionの前にreadがはいってるけど、readは変数をすべて定義した後にやる。
250 名前:249 mailto:sage [2010/07/08(木) 22:50:07 ] あ、間違えた。 配列は定義する時点でサイズが決定していないとだめなんだ。 配列サイズをreadする場合には、動的なメモリの割付けが必要で、allocatable属性を指定しなければならない。 readでnを呼んだ後、allocate文で実際にメモリを割り当てる。 implicit none integer s,t,n,k real,allocatable a(:,:),b(:) read(5,*) n allocate( a(n,n), b(n) )
251 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 00:30:22 ] >>250 多分質問者は、F77でかつDIMENSIONとGOTOを使えと言われている人なので、その辺を察してあげないと・・・
252 名前:古い質問者 mailto:cafexion2@yahoo.co.jp [2010/07/09(金) 09:53:09 ] >>251 さんの言う通りで…質問してるのに申し訳ないです。 allocatableというのは聞いたことがないので、使わずにやれということなんだと思います。 >>248 ,>>249 を参考に最初の5行を訂正してみました。 implicit none integer s,t,n,k real a(n,n),b(n) dimension a(n,n),b(n) read(5,*) n エラーは>>248 と全く同様に出力されました。 ちなみにa,b,n,iに関して全く同様のエラーが何回も出力されています。 日をまたいでレス遅れてしまって申し訳ないです。 よろしくお願いします。
253 名前:古い質問者 mailto:cafexion2@yahoo.co.jp [2010/07/09(金) 10:25:09 ] >>252 訂正:a,b,n,iに関して→a,b,iに関して 連投失礼します。
254 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 11:31:04 ] 宣言部は全て最初にやらないといけないんだよなぁ コード真ん中のスコープ内でローカルに宣言できたら便利なのにといつも思う あ、でも次のFortranで実装するって話を聞いたことがあるような 次の次だっけかも
255 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 15:20:01 ] allocatableがつかえないと、余分にメモリを食っちゃうね。 まず、配列変数の定義の時点で real, dimension(100,100) :: a real, dimension(100) :: b と、ある程度大きいメモリ容量を割り付けておいて、すべての変数に0を代入して初期化。 a(:,:) = 0.0 b(:) = 0.0 そのあとnやa,bの要素をreadすればokかな? ここで、nは単なる繰り返し制御のための変数になるけど、まぁ仕方ないか。
256 名前:古い質問者 mailto:cafexion2@yahoo.co.jp [2010/07/09(金) 18:29:02 ] >>255 real, dimension(100,100) :: a real, dimension(100) :: b をそのまま利用すると、Fortran 90 feature at (^) unsupported (対応してない?)といわれ、 realとdimensionを分けてa,bを定義すると Invalid form for DIMENSION statement at (^) (dimensionの宣言形式が違う?) とdimensionを定義する箇所にエラー a(:,:) = 0.0 1 2 Unrecognized statement name at (1) and invalid form for assignment or statement- function definition at (2) a,bに関して同様のエラーがでます。。。 もはやcygwinのfortranコンパイラがダメなきがしてきました。。 何度も申し訳ないです。
257 名前:255 mailto:sage [2010/07/09(金) 18:49:54 ] いやいや、fortran90形式の方法を教えてしまった。 90形式と77形式を混ぜてコンパイルしても問題にならないことが多いから、 いいかと思ったけどだめだったみたいだね。ごめん implicit none integer i, j integer s,t,n,k real, dimension(100,100) a real, dimension(100) b do i = 1, 100 do j = 1, 100 a(i,j) = 0.0 end do b(i) = 0.0 end do read(5,*) n Fortran77形式で書いてみた。古い書き方は全然使わないから、間違っているかも。
258 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 20:23:07 ] 変数宣言の仕方って何が推奨なんですか? ttp://www.nag-j.co.jp/fortran/FI_4.html を見ると、数に関しては 整数型 integer 実数型 real 倍精度実数型 double precision 複素数型 complex 倍精度複素数型 complex(kind(0d0)) となっていますが、実数型はreal*4とすべしと言ってるサイトもありますね。 double precisionなんて長ったらしいし、*で済むのならそれがスマートだと 思うんですが、どうですか?
259 名前:デフォルトの名無しさん mailto:sage [2010/07/10(土) 00:09:34 ] >>258 そのページのすぐ下に書いてあるが、REAL*4とかREAK*8とかは、FORTRANの規格の規定にはない書き方。 ただし、事実上通用する書き方に成っている。 だから規格に厳格に乗っ取りたいという流派なら、使わないという選択になる。 またFortran90以降では、REAL(KIND=4)や省略形REAL(4)などがあるので、そちらを使うのがよりスマート。 そういう文脈を踏まえて、77時代の慣用的な書きかたをしようというなら、REAL*8とかで書くのが主流派だと思う。 >>257 77にはIMPLICIT NONEは無い。 またreal, dimension(100,100) a この書き方もない。 REAL A DIMENSION A(100,100) と分けて書かねばならんはず。
260 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 14:40:48 ] *の数字は変数が占めるトータルのバイト長らしいから、複素数の場合は注意だな やはりkind指定が無難かな 以下、intel fortran 11.0 complex :: c1 complex*8 :: c2 complex(4) :: c3 complex(kind=4) :: c4 complex(kind(0.0)) :: c5 print *, c1 print *, c2 print *, c3 print *, c4 print *, c5 end <出力> (0.0000000E+00,0.0000000E+00) (0.0000000E+00,0.0000000E+00) (0.0000000E+00,0.0000000E+00) (0.0000000E+00,0.0000000E+00) (0.0000000E+00,0.0000000E+00)
261 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 18:14:54 ] Fortranの命名規約って何か習慣的なものはあるんでしょうか? 例えばJavaなどではキャメルケースが一般的ですが
262 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 23:04:40 ] ない
263 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 02:16:41 ] >>261 キャメルケースってボーランド記法のことか。 Fortranは昔は大文字しか使えなかったし、今も大文字小文字の区別がないので、そういう工夫はあまりしない。 また1行の長さに制限があるので、余り冗長な名前も使わない。 77時代までは極めて明快だった。 暗黙の型は厳守。型を守ってないものは、文法的に許されてもエラーの元だし、社会的に誰からも相手にされないので。 名前は6文字までなので(IBMがこだわったので)単語の母音を抜いた子音並べが基本。 この手の命名法は、LAPACKなどライブラリに厳然と残っているので、知っておくと便利。 頭文字がAとかRは単精度実数、Dは倍精度実数、Cは単精度複素数、Zは倍精度複素数(本来は規格外だが)。 F90になってから混迷を深めているが、いちいち変数の型を調べるのに、宣言部分を見る気もしないので、 捨て変数に関してはIMPLICIT NONEを掛けても暗黙型の頭文字をつかっているのでは。 LOOP変数のi,jとか。
264 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/11(日) 15:21:40 ] 変数の命名規則は、開発の仕方や規模によるところが多いんじゃないかな。 他人のコードを頻繁に見るような場合は、パッと見で分かるようなのにしてくれないと死ぬ・・・。
265 名前:デフォルトの名無しさん mailto:sage [2010/07/12(月) 18:20:39 ] 構造型(体?)を使ってみたいのですが、良い参考書等あるでしょうか? FORTRANは本自体少ない上、FORTRAN90以降の新機能について 詳しく言及している本は少ない気がしますが。
266 名前:デフォルトの名無しさん mailto:sage [2010/07/13(火) 02:40:12 ] >>265 ない!手持ちの本で十分だ。がんばれ。
267 名前:デフォルトの名無しさん mailto:sage [2010/07/13(火) 06:42:16 ] >>266 その手持ちの本に構造体書いてりゃな。 書名は何?
268 名前:デフォルトの名無しさん mailto:sage [2010/07/13(火) 11:04:54 ] >>265 (構造体は必要)ない!手持ちの本で十分だ。がんばれ。
269 名前:デフォルトの名無しさん mailto:sage [2010/07/13(火) 23:22:36 ] >>267 F90の本で構造体が書いてないものなんかあるのか? 戸川隼人のしょぼいザ・Fortran90/95にも1章費やして書いてあるぞ。 と思ったら、パラパラと見た感じ牛島省の本には無いな。京大土建屋の英単語つづりデタラメ本だから仕方ないかw 同じ京大の富田の本には2ページくらいおざなりに書いてある。 しかし、富田本は昔の大型計算センターのテキストみたいな分かりにくさの本だな。 イラストとしてキャラクター・グラフィックスで書いた3Dの山とリサージュ図形があれば完璧だったろう。 薄くていいが定価で買う気はしない。京都の古本屋で百円で売ってそう。 構造体で注意すべきなのは、Fortran90ではALLOCATABLE属性は使えなかったので、POINTERを使うしかなかったが Fortran95ではALLOCATABLE属性のメンバーを持てることくらいか。 >>268 マジレスするとwww Fortran2003でのオブジェクト指向は、構造体の中に副プログラムをCONTAINする形になるので、避けられない。
270 名前:デフォルトの名無しさん mailto:sage [2010/07/14(水) 01:01:58 ] 使ったことないからよくわからないけど、Fortran の構造型の命名って制限ある? ピリオドで区切るから・・ .EQ. とかの比較演算子とかぶりそうな気がふとしたので。
271 名前:デフォルトの名無しさん mailto:sage [2010/07/14(水) 02:49:45 ] >>270 区切りは%だぜ。
272 名前:デフォルトの名無しさん mailto:sage [2010/07/14(水) 10:54:03 ] . % のどちらでも実質、両方正しいよ。 . 区切りはDECのだった気がするけど、まあ実質業界標準。
273 名前:デフォルトの名無しさん mailto:sage [2010/07/14(水) 11:55:17 ] >>272 ねーよw Fortran90以降の構造体とDECの構造体は別物だぞ。 . が使えるわけがない。
274 名前:デフォルトの名無しさん mailto:sage [2010/07/14(水) 13:16:16 ] >>269 >構造体で注意すべきなのは、Fortran90ではALLOCATABLE属性は使えなかったので、 Fortran90では構造体の中のメンバはALLOCATABLE属性に出来ないって意味だよね? それともALLOCATABLE自体がFortran95以降なんだっけ?
275 名前:デフォルトの名無しさん mailto:sage [2010/07/14(水) 14:16:28 ] F90でも普通にallocatable出来る
276 名前:デフォルトの名無しさん mailto:sage [2010/07/15(木) 00:49:50 ] >>274 F90では構造体のメンバーがALLOCATABLE属性を取れなかった。 これが大変不評でF95で取れるようになった。
277 名前:デフォルトの名無しさん mailto:sage [2010/07/15(木) 20:25:16 ] なったね
278 名前:デフォルトの名無しさん mailto:sage [2010/07/16(金) 00:53:55 ] たね
279 名前:デフォルトの名無しさん mailto:sage [2010/07/16(金) 02:53:03 ] ね
280 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 15:06:54 ] すみません 初歩的な質問だと思うのですが、 以下のように、行を一つのベクトルと考え、自分の入力したベクトル間の距離を出そうとしたのですが、上手くいきません どこがいけないのかアドバイスお願いします 最初に定義している文字が多いのは気にしないでください program aaa implicit none integer :: i,j,m,k,o,p,q,zenntai real :: c1x,c1y,c2x,c2y integer,parameter :: n=5 real,dimension (n,2) :: a real,dimension (n) :: b,c do m=1,n write(*,*)'a=' read(*,*) (a(m,k),k=1,2) end do write(*,*) 'a=' do i=1,n write(*,'(1x,2F7.3)') (a(i,j),j=1,2) end do c1x=a(1,1) c1y=a(1,2) c2x=a(2,1) c2y=a(2,2) つづく
281 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 15:07:36 ] つづき do o=1,n call kyori(b(o),c1x,c1y,a(o,1),a(o,2)) write(*,*) b(o) end do do p=1,n call kyori(c(p),c2x,c2y,a(p,1),a(p,2)) write(*,*) c(p) end do stop contains subroutine kyori(d,s,t,u,v) implicit none real,intent(in) :: s,t real,intent(in),dimension(n) :: u,v real,intent(out),dimension(n) :: d d=((abs(s-u))**2.0)+((abs(t-v))**2.0) return end subroutine kyori end program aaa
282 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 15:46:51 ] >>280 どう上手くいかんのかもう少し分かりやすく言えよと subroutineにしないでやっても同じなわけ?
283 名前:デフォルトの名無しさん mailto:sage [2010/07/19(月) 16:06:25 ] すみません サブルーチンにしないでやっても結果は同じでした。 a=1 2 1 3 1 4 1 5 1 6 とすると、とりあえずb(o)だけ書きます b(o)=0. 1. 1. 394825 2.4050422E+22 c(p)もb(o)と同様にpが上がると凄い勢いでその値が増えていきました
284 名前:デフォルトの名無しさん mailto:sage [2010/07/21(水) 03:31:59 ] >>283 2点ばかり考えられることを。 1。 入力がフォーマット付きなので、空白を区切りとして数値を二つ与えることはできない。 コンマでしきれば大丈夫だったか? a=1 2 =>1,2 もしくは 1 2 2。 サブルーチン中のここがおかしい。 real,intent(in),dimension(n) :: u,v real,intent(out),dimension(n) :: d スカラーを渡しているのだろうから real,intent(in) :: u,v real,intent(out) :: d のはず。
285 名前:デフォルトの名無しさん mailto:sage [2010/07/21(水) 20:12:07 ] sqrtはなくてもいいの?
286 名前:デフォルトの名無しさん mailto:sage [2010/07/22(木) 00:42:56 ] >>285 そういう内容に踏み込む場合、REALなんだから二乗する前にABSはとらなくてもいいはずとか、 突っ込みどころいっぱいありすぎ。 そもそもループ変数にoとかpとか使ってる時点で、こいつラリッてるのか、酔っ払ってんのか的気持ちw
287 名前:デフォルトの名無しさん mailto:sage [2010/08/25(水) 14:55:56 ] 質問です。 数値計算をしようとfortranでプログラムを書いて、実行してみたんですが 古いPen4のPCだとCPU使用率が100%までいくのに、新しいi7のPCだとCPU使用率が13%以上になりません。 とりあえず、元のプログラムを6個のプログラムに分けて実行してますがいい方法とは思えません・・ どうしたら1つのプログラムでCPUを有効に使えるようになりますか? コンパイラはg95です
288 名前:デフォルトの名無しさん mailto:sage [2010/08/25(水) 14:57:19 ] っ OpenMP & gfortran
289 名前:デフォルトの名無しさん mailto:sage [2010/08/25(水) 16:03:06 ] >>288 ありがとうございます。やってみます
290 名前:デフォルトの名無しさん [2010/09/08(水) 15:28:57 ] はじめまして。 少々悩んでいることがありまして質問させて頂きます。 行列積のプログラミングを組もうと思っているのですが、 入力部分に数字のみならず記号も含まれている場合どうすればよいかわかりません。 色々試してはみたのですが、結局無理でした。 例えば、 1 2 3 4 という係数行列と a b というベクトルをかけて a+2*b 3*a+4*b というふうに出力したいと思っています。 どなたか心ある方、ほんの少しのアドバイスでもよろしいのでお願いいたします。
291 名前:デフォルトの名無しさん [2010/09/08(水) 16:59:43 ] 関数とサブルーチンってどっちが有利? たとえば function hoge(a,b) result(c) c=a+b return end function subroutine hoge(a,b,c) c=a+b return end subroutine と書いた場合、どっちがメモリ的に あるいはスピード的に あるいは可読性的に有利?
292 名前:デフォルトの名無しさん mailto:sage [2010/09/08(水) 17:01:43 ] >>290 fortranに文字計算させるの? 数値計算ってそういう物じゃないと思うんだけどなあ
293 名前:デフォルトの名無しさん mailto:sage [2010/09/09(木) 02:04:02 ] subroutine matvec(inmat,invec,outvec) implicit none intent(in):: inmat, invec intent(out):: outvec real mat(2,2), invec(2), outvec(2) inteter i,j outvec(1) = mat(1,1)*invec(1)+mat(2,1)*invec(2) outvec(2) = mat(1,2)*invec(1)+mat(2,2)*invec(2) return end subroutine ・・・・なにか質問の答えとはずれてるな・・・w
294 名前:デフォルトの名無しさん mailto:sage [2010/09/09(木) 02:06:21 ] function と subroutine の違いって戻り値があるか無いかじゃないのか?
295 名前:デフォルトの名無しさん [2010/09/09(木) 14:58:40 ] >>294 そうなんだけど結果的には同じように扱えるよね? 上の例で言うと変数cがそれになると思うんだけど 可読性という点から見ると関数は、Fortranだと 配列と区別しにくいから少し解りづらいかも
296 名前:デフォルトの名無しさん [2010/09/11(土) 18:56:47 ] 質問です。 現在、ファイル名が 11016.csv 11151.csv : 24141.csv というものが、97個ほどあります。そのファイルを順にOPENして読み込み、作業したいのですが、下のようにopen文を書いたのですが、初めの11016の地点が、何度も出力されてしまいます。連番でないファイルの場合、 この書き方は適当ではないのでしょうか?それとも全体のプログラムを示していないですが、enddoを書く場所が間違っているなどのミスでしょうか? また、read文なのですが、色々詮索した結果、このように行変更してしまいますと、2行以降の変数は読めていませんでした。ファイル内のデータを削除し、プログラムの変数を減らして一行に収めると、正しく出力されました。 なぜなのでしょうか?どうかアドバイスください。もし、より全体のプログラム内容だったり、読み込んでいるファイル内の形式が必要でしたら、 再度載せます。 ---------------------------------------------------------------------- INTEGER :: year, mon, day, data,sum, no,id,pre,wind,winddirection,hightemplowtemp,maxrain,maxwind,code,tmpsunlight CHARACTER(10) :: name REAL :: lon, lat CHARACTER*5 sssss do ispot = 11016,24141 write(sssss,"(i5)") ispot open(50, file=''//sssss//'.csv', status='old',iostat=io) if (io < 0) cycle do i = 1,12000 read(50,*,iostat=io) year,mon,day,id,lon,lat,code,& name,pre,wind,winddirection,temp,hightemp,lowtemp,& tmpsunlight,maxrain,maxwind ----------------------------------------------------------------------
297 名前:デフォルトの名無しさん mailto:sage [2010/09/12(日) 03:25:54 ] マルチポスト?...ではないか。向こうの質問内容は意味不明だ。 oshiete1.watch.impress.co.jp/qa6168042.html cycle文を使う場所が間違っている気がする。 あとは、装置番号を50ではなくispotにして、readしたあとはclose(ispot)するとかかな。 この手のFortranのIOは面倒で、真面目に考える気になれない...
298 名前:デフォルトの名無しさん mailto:sage [2010/09/12(日) 05:54:09 ] うん、変だよね・・・Cycle は使わんでもよさそうだし・・。 いろいろ副作用やら曖昧さをさけた流儀にすると・・ character*9 sssss logical lexist do ispot=11016,24141 write(sssss,'(i5.5,''.csv'')') ispot inquire(file=sssss,exist=lexist) if (lexist) then write(*,*) 'now handling a file : ', sssss open(unit=50,file=sssss,status='old') do .. read(50,*) .... enddo close(50) endif enddo かな・・・。コンパイラ無しな状況で書いてるから自信はないね。
299 名前:デフォルトの名無しさん [2010/09/13(月) 22:30:27 ] 教えていただいたOPENファイルの書き方でうまくいきました! すごいです。こんな方法あるんですね。 勉強になります。 助かりました。ありがとうございました。
300 名前:デフォルトの名無しさん mailto:sage [2010/09/14(火) 10:57:09 ] えがったえがった
301 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 17:22:00 ] 2GBを超えるunformattedなファイルを read(num) (itmp(i),i=1,n) という感じで(nは既知) 読むとエラーになったんですが、 readにオプション iostat=io を加えると大丈夫でした。 2GB以上はiostatが必要ということでしょうか? なお、エラーメッセージは以下の具合です。 Intel Fortran・・・「input statement requires too much data」 PGI Fortran・・・「attempt to read/write past end of record」
302 名前:デフォルトの名無しさん mailto:sage [2010/09/15(水) 19:22:28 ] iostat無しだとエラーを受けて終了してしまい、 iostatありだとエラーをエラーコードとしてioに保存してそのまま読み込みつづけただけじゃないの?
303 名前:301 mailto:sage [2010/09/15(水) 20:35:31 ] >>302 よく考えたら2GB以上だと仕様が変わるなんてあるわけないですよね。 ファイルにはn個データが入っているはずなんですが、もしかしたらデータがおかしいのかもしれません。 もう一度調べてみます。ありがとうございました。
304 名前:デフォルトの名無しさん mailto:sage [2010/09/16(木) 00:56:05 ] >>301 書式無し、でサイズ既知、なら・・・ integer itmp(n) で宣言した後、 read(num) itmp と、添字なし表現で読めない?
305 名前:301 mailto:sage [2010/09/16(木) 01:37:56 ] >>304 read(num) itmp read(num) itmp(1:n) などと試しましたが同じでした。やはりデータが疑わしいようです。
306 名前:デフォルトの名無しさん mailto:sage [2010/09/16(木) 03:51:31 ] ・・あと思いつくのは・・ 無書式だとメモリ上の0・1の値をそのままファイルにぶち込むだけ(な事がほとんど)だから CPU や OS や コンパイラがファイルを生成したものと違う組み合わせで読み込むと 失敗することがあるよ。 人からもらったデータなら、元にお願いしてプレーンテキストにしてらうのが吉。 情報量は変わらないのだから適当な圧縮をかけるとファイルサイズはそう変わらないはずだ。
307 名前:304=306 mailto:sage [2010/09/16(木) 03:53:19 ] Endian とか Padding とかをキーワードにして、いろいろ試してね
308 名前:デフォルトの名無しさん mailto:sage [2010/09/18(土) 00:15:55 ] 文字列として読み込んでみるとか、 何かの値で初期化して IOSTATつきで読みこんでどこでエラーが出ているか確認し、 そのデータ部をバイナリエディタで見てみるとか
309 名前:デフォルトの名無しさん mailto:sage [2010/09/18(土) 00:33:04 ] プレーンってformattedで出すってことだよね バイナリより数倍大きくなるよね そういえばunfortmattedとバイナリって同じ意味なの?
310 名前:デフォルトの名無しさん mailto:sage [2010/09/18(土) 00:53:53 ] >>309 今時2ギガが10ギガになったくらいで騒ぐこともあるまい・・。 とりまわしが面倒なら分割すりゃいいんだし。
311 名前:デフォルトの名無しさん mailto:sage [2010/09/18(土) 00:55:10 ] binary つかったことない・・ Unformatted は306みたいにメモリ上のならびを そのままぶち込む・・と思ってたけど違うのかな?
312 名前:デフォルトの名無しさん mailto:sage [2010/09/18(土) 18:54:43 ] >>310 最近の数値計算じゃテラのオーダーっすよ。 つーかこのスレにいる奴らもそっち系の人ばっかでしょ?
313 名前:デフォルトの名無しさん mailto:sage [2010/09/19(日) 10:09:31 ] >>311 unformattedってデータとデータの間に区切りとしてなぜか8byte(?)ぐらい 埋め込まなかったっけ??asciiで書き出すよりファイル容量でかくなって ビビったような
314 名前:デフォルトの名無しさん mailto:sage [2010/09/19(日) 10:58:46 ] Padding はありそう・・・とうわけでチェック! 単精度・倍精度・文字列・整数・理論、を100要素のものを無書式で書き落とすと サイズは(バイトで)、 800,400,100,400,400+8(intel fortran)または+16(gfortran) だった。OSはLinux、こまかいDistriは知らんw おまけがつくのはそれぞれのコンパイラの仕様かな? ともあれ、整数・実数・文字列はなんとなく想像のうちだけど、論理(logical)は 本来1ビットだけど、8ビット単位にPadding しているようだ(まあ、その方がメモリ内での とりまわしが効率的なんだろうね)・・・即興の実験終わり。 313さんのはどの種類の変数だったの?
315 名前:デフォルトの名無しさん mailto:sage [2010/09/19(日) 11:03:09 ] >本来1ビットだけど、8ビット単位にPadding しているようだ ああ、おお間違い。4バイトね。 中身をみたら当然だけど0パディングばかりでスカスカだった。
316 名前:デフォルトの名無しさん mailto:sage [2010/09/19(日) 11:09:15 ] ああ、もしかすると、301 さんのは データを書き出したコードのコンパイラと読み込みのが別、とか・・かな。 CPU OS コンパイラ の3つ次第でどうにでも変わるのが無書式だし。 単純に同じシステム内で処理をする分には(コーディングも実行速度も) 一番速いけど、他人とのデータのやりとりではやっぱり危険だね。 自分はなるべくプレーンなテキストでやりとりするけど・・・みんなはどうしているんだろう? HDF とかなの?
317 名前:デフォルトの名無しさん mailto:sage [2010/09/19(日) 15:09:39 ] >>313 例えば、1行の read 文で書き出すデータの総バイト数を表す数字を データの両側に付けるのは仕様だった筈。ここが C と違う。 integer a real*8 b read(unit=9)a,b とすると、12バイトのデータ(aとb)の両側に余計にデータがつく。 open 文でエンディアンの指定も出来たように記憶しているが、最後 に触ったのが3年くらい前なので忘却の彼方。
318 名前:デフォルトの名無しさん mailto:sage [2010/09/19(日) 15:55:08 ] >データの両側に付ける direct accessのためにそういう仕様になってるんだっけか ただ、その数字自体のバイト数がコンパイラ依存なんだよな なんで規格でちゃんと決めなかったんだろ >open 文でエンディアンの指定 まじ?聞いたことないけど
319 名前:デフォルトの名無しさん mailto:sage [2010/09/19(日) 19:26:07 ] >>318 > >open 文でエンディアンの指定 > まじ?聞いたことないけど gcc.gnu.org/onlinedocs/gfortran/CONVERT-specifier.html 規格の事は知らんけど、こんなのがあったぞ。 コンパイラ依存だったりして。
320 名前:314 mailto:sage [2010/09/20(月) 04:16:07 ] >317 データの両側に付ける ためになった。 経験上たいていの無書式書き出ししたファイルサイズが ちょびっとだけ大きかったから 何か付帯情報がくっついているんだろうな、くらいには思ってたけど 「両側」に「総バイト数」というのは知らなかったでした。 自分のつくったファイルをみるとたしかにそうなってます! ・・・問題は >>318 さんのとおりコンパイラごとに違うという事か。めんど〜
321 名前:デフォルトの名無しさん mailto:sage [2010/09/21(火) 19:33:02 ] なんか扱いにくいね>unformat 結局binaryが一番ってことか
322 名前:デフォルトの名無しさん mailto:sage [2010/10/05(火) 20:49:12 ] ACCESS="STREAM"
323 名前:デフォルトの名無しさん [2010/10/11(月) 00:11:11 ] fortran90 を使って、n 行の文字列データが格納されている test.dat というファイルの1行1行を読み込んで、 標準出力に出力しようと思っています。 そこで、(抜粋ですが) ------------------------------------------ character(len = 50) :: chara open(1, file='test.dat', status='old') do i = 1, n read(1, *) chara write(*, *) chara end do ------------------------------------------ と書いてみたのですが、文字列データに/や*などが含まれると 文字化けしてしまいます。また、空白が出力されません。 一体、何が原因と考えられますでしょうか。 なお、OSはubuntuで、コンパイラは、gfortranです。 お分かりの方がいらっしゃいましたらお教えいただけると嬉しいです。 よろしくお願いします。
324 名前:デフォルトの名無しさん mailto:sage [2010/10/11(月) 04:58:37 ] 手元にコンパイラ無いから検証なし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 : : といったような感じなのですが。わかりにくいかもしれませんよね。わからにくいところが ありましたら、ご連絡ください。どうかよろしくお願いします。
328 名前:デフォルトの名無しさん mailto:sage [2010/10/11(月) 18:17:51 ] >>326 正直悩み所だわそれ ごちゃ混ぜになってるw
329 名前:デフォルトの名無しさん [2010/10/11(月) 18:26:32 ] >>328 そっかー.最近はjavaっぽく変数名はラクダ,サブルーチン名はパスカルにしてるんだよねー
330 名前:デフォルトの名無しさん [2010/10/12(火) 02:03:50 ] たびたびすみません・・・。 323 ですが、Fortran90 で、文字列や数字がごちゃまぜになっている ファイルから数字だけを抜き出したいのですが、どうすればよろしい のでしょうか? 例えば、(1234567890)という行から、1234567890だけを抜き出したいと 思っています。 試しに、(1234567890 が書いてある行を対象に character(len = 1) :: chara real(kind = 8) :: x read(1, '(a)') chara, x とやってもエラーになり駄目でした。 (chara で左括弧だけを取り除きたかったのですが・・・。) ご存知の方がいらっしゃいましたらお教えいただけるとありがたいです。 よろしくお願いします。
331 名前:デフォルトの名無しさん mailto:sage [2010/10/12(火) 02:17:58 ] 324 数字だけ見つけるには・・・ ichar(x) (長さ1の文字列をアスキー表の整数に変換する奴)で ichar(x) 48 から 57 の範囲をとるからそれで見分けはつくので、 一度、 read(1, '(a)') chara do j = 1, 50 x = chara(j:j) idummy = ichar(x) if ((idummy .LT. 48) .OR. (idummy .GT. 59)) chara(j:j) = ' ' enddo な感じで数字以外を空白に置き換えてから・・・かな? 上の例だと指数部のE (やD)とか小数点(.)や正負(+-)も空白に置き換えるので 必要に応じて変えてちょ。 あと、 write(x,'(i1)',ERR=199) idummy みたいにI/O エラーで判別するやりかたもあるけど、 これは分岐が汚くからichar使うのが無難かなぁ
332 名前:デフォルトの名無しさん mailto:sage [2010/10/12(火) 02:23:08 ] >>327 エクセルでやった方が幸せになりそう。
333 名前:デフォルトの名無しさん mailto:sage [2010/10/12(火) 12:16:14 ] >>327 yy/mm/dd みたいにせめて桁はそろえてほしい・・・ 331 的やりかたで年月日の3つの数字を取り出して ・・・先は長いw
334 名前:デフォルトの名無しさん mailto:sage [2010/10/13(水) 12:29:20 ] Intel Fortranでコンパイル時にOpenMPを指定するだけでオーバーフローになってしまうのですが 何が原因でしょうか? F77のプログラムで、普通にコンパイルすれば問題なく作動します。
335 名前:デフォルトの名無しさん mailto:sage [2010/10/14(木) 10:12:22 ] コンパイルにしくじるんだよね? unlimit か ulimit して制限取っぱらっても変わらないだろうなぁ。 というかOS なに? あとは・・・Private 属性でアホみたいに大きいサイズの配列があると・・・とか、かなぁ。
336 名前:デフォルトの名無しさん [2010/10/16(土) 20:37:47 ] 構造体のメンバを一覧でとってくる方法ってありますか? type(member) integer id integer age real(8) height end type member type(member) person person%id = 1 person%age = 26 person%height = 171.d0 などと宣言して do ??????????????? print *, @@@@@@@ enddo のようにすると 1 26 171.00000 のなるようにメンバ変数でループをまわしたいのです
337 名前:デフォルトの名無しさん mailto:sage [2010/10/19(火) 00:37:23 ] >>335 /AUTO_ALLOCATEでうまくいきますた。
338 名前:デフォルトの名無しさん [2010/10/20(水) 15:11:36 ] はじめまして。 T検定を書いているんですが、 disperは、不偏分散で、valueは、分散の推定値です。 value(doy) = ((ndata(doy)-1)*disper(doy)+(ndata2(doy)-1)*disper2(doy))/& (ndata(doy)+ndata2(doy)-2) t(doy) = abs(sunlight(doy)-sunlight2(doy))/sqrt(value(doy)*((1/ndata(doy))& +(1/ndata2(doy)))) これのt(doy)の出力が、+inf,時々NaNになります。 直後に write(6,*) doy,lon,lat,ndata(doy),ndata2(doy),value(doy),t(doy),& sunlight(doy),sunlight2(doy) で出力した際の一部は 1 141.678 45.4147 7 10 3.97499 +Inf 1.025 0.82 2 141.678 45.4147 7 10 3.57839 +Inf 0.42 0.46000004 3 141.678 45.4147 7 10 5.2759204 +Inf 2.48 0.24000001 です。エクセルで計算した場合、Tの値はでると思うんですが、何が原因の可能性として 考えられるのでしょうか? 宣言文は、全てREAL,dimension(72)です。
339 名前:デフォルトの名無しさん [2010/10/20(水) 15:56:17 ] 338 解決しました。すみません。
340 名前:デフォルトの名無しさん [2010/10/24(日) 19:58:54 ] みんな構造体使ってないのかな
341 名前:デフォルトの名無しさん mailto:sage [2010/10/25(月) 22:45:04 ] 使ってるよ
342 名前:デフォルトの名無しさん [2010/10/28(木) 00:42:15 ] 収束しねーよ・・・。(´;ω;`)
343 名前:デフォルトの名無しさん [2010/10/28(木) 02:52:36 ] 発散しないのなら、変なattracter に はまった•••となると それが系の本質かもしれないから 頑張れ! ただのタイプミスの可能性も残るけどね
344 名前:デフォルトの名無しさん [2010/10/31(日) 20:08:29 ] Fortran90/95の構文色分けが一番見やすいエディタって何ですか?
345 名前:!omikuji mailto:sage [2010/11/01(月) 01:45:22 ] vim 真面目な答え
346 名前:デフォルトの名無しさん mailto:sage [2010/11/01(月) 11:40:41 ] emacs
347 名前:デフォルトの名無しさん [2010/11/01(月) 22:38:20 ] >>345-346 ありがとうございます。 ははー。90以上だと、やっぱりそこらへんですか。 色々試してるんですけど、Fortran対応ってなってるものでも 実質77対応のが多いんですよね… 秀丸+定義ファイルとかもやってみようかな
348 名前:デフォルトの名無しさん mailto:sage [2010/11/01(月) 22:47:27 ] 誰かFortran開発という観点でのエディタ・IDEを評してくれ メジャーな言語だとそういった話題が豊富なんだが、Fortranは寂しい限り
349 名前:デフォルトの名無しさん mailto:sage [2010/11/04(木) 01:11:34 ] The first argument (X) to the intrinsic SQRT must be of REAL or COMPLEX type, not INTEGER(KIND=3) 平方根計算しようとしたらこんなのでるの
350 名前:デフォルトの名無しさん mailto:sage [2010/11/04(木) 02:42:02 ] >>349 SQRT関数の引数は実数か複素数でないといけません。整数はダメです。
351 名前:デフォルトの名無しさん [2010/11/04(木) 14:19:07 ] はじめまして。 前からなぜうまくいかないのか、わからず、違う強引な方法で行っていたのですが、 今回はそうはいかなく、質問させていただきます。 if文なのですが、今、データのなかの日にちを1〜365としています。 それを1〜59、335〜365を冬。60〜151を春、152〜243を夏、244〜334を秋と、if文で 場合分けしたいのですが、うまくいきません。どう書けばよいのでしょうか? do doy = 1,365 if( 60 <= doy <= 151) then ave1 = ave1 + sunlight(iyear,doy) ndatax_sp = ndatax_sp + ndata(iyear,doy) else if(152 <= doy <= 243) then ave5 = ave1 + sunlight(iyear,doy) ndatax_su = ndatax_su + ndata(iyear,doy) else if(244 <= doy <= 334) then ave9 = ave1 + sunlight(iyear,doy) ndatax_au = ndatax_au + ndata(iyear,doy) else ave13 = ave1 + sunlight(iyear,doy) ndatax_wi = ndatax_wi + ndata(iyear,doy) endif end do
352 名前:デフォルトの名無しさん mailto:sage [2010/11/04(木) 19:43:40 ] >>351 とりあえず教科書か↓のページを開いて IF文と論理式について復習するんだ。 www.str.ce.akita-u.ac.jp/~gotou/zyouhou/f90/sec3.html#sec3 Fortran90以降が使えるのなら IF文ではなく、SELECT CASE文で書いた方が きれいに書けるかも。
353 名前:デフォルトの名無しさん mailto:sage [2010/11/05(金) 14:38:18 ] if…else if…else ifって何個も分岐するならselect case文のほうがいいに決まってるけど、 分岐が2、3個の場合でもselect case文でやるべきか結構迷う。 2、3個程度ならパッと見はifのほうがすっきり見えるからねぇ。
354 名前:デフォルトの名無しさん [2010/11/05(金) 15:05:00 ] >>352 ,353 ありがとうございました。case文で書きました。 もう一度復習してみます。
355 名前:デフォルトの名無しさん mailto:sage [2010/11/06(土) 07:33:17 ] エディタ色々試し中です。 Win版geditを使ってみました。 Fortran95に対応してますが、 拡張子見て勝手にFortranモードになってくれるわけではなくて 一々手動でモード切り替えしないといけないこと以外は 結構良いですね
356 名前:デフォルトの名無しさん mailto:sage [2010/11/07(日) 20:52:22 ] 知恵を貸してください。 3次メッシュコード、年齢層、要素の値の3列 で構成されるファイルが要素別に10ファイルあって、 こいつらを1つのファイルにまとめようとしています。 (メッシュコード、年齢層、要素1、…、要素10) 10ファイルに出てくるメッシュコードと年齢層の組み合わせは ファイルごとに異なっていて、重複する場合もあれば1ファイルのみで出現することもあります。 また、あるファイルでは数百行しか格納していないのに対して、 一方では数十万行分のデータを格納しているものもあります。 素人考えで12次元の配列にぶちこんで出力すれば良いかなとも思ったのだが、 3次メッシュコードだけで60万行になってしまうし、 要素1〜10の値がまったく含まれないコードも多々ある訳で。 効率的に要素1〜10の値が1つでも含まれるメッシュコードと年齢層の組み合わせだけを 出力できる良い方法はないでしょうか。
357 名前:デフォルトの名無しさん [2010/11/11(木) 23:58:58 ] 教えてください! 関数 idate に関してですが、 gfortran -c -fdefault-integer-8 -O2 -std=legacy Libtad.f In file Libtad.f:1339 call idate (month,day,year) Error: Too many arguments in call to 'idate' at (1) となり、エラーになってしまいました。 ググったら idate はinteger 3 個でいいと書いてあって なぜエラーになるのか解かりません・・・。 もともとのソースコード(tinker/Libtad.f)は integer year,month,day (略) call idate (month,day,year) と書いてあります。 gamess というソフトをインストールしようとして、コンパイルしたら、 何故かそのライブラリだけがError を起こして上手くインストールできないのです・・・。 (コンパイルは入っていたスクリプトで行っています。) OS:Scientific Linux 5.5 gfortran: gcc4.1.2
358 名前:デフォルトの名無しさん mailto:sage [2010/11/12(金) 04:04:39 ] >>357 gcc.gnu.org/onlinedocs/gfortran/IDATE.html IDATE - Get current local time subroutine (day/month/year) IDATE(VALUES) Fills VALUES with the numerical values at the current local time.
359 名前:デフォルトの名無しさん mailto:sage [2010/11/17(水) 00:16:08 ] >>358 ありがとうございます。 idate の部分上手く解決しました。
360 名前:デフォルトの名無しさん [2010/11/17(水) 20:08:20 ] 教えてください あるtxtファイルから必要なとこだけを抽出したいんです。例として、 120 30 121 30 121 31 120 31 120 30 123 32 124 32 124 33 123 33 123 32 ↓から 120 30 121 30 121 31 120 31 120 30 123 32 123 32 のように、ある範囲(ここではX=123以下かつY=32以下)以外のものをはじきたいのですが、 空行をそのまま残す方法がわかりません。 どなたかご教授願います。
361 名前:デフォルトの名無しさん mailto:sage [2010/11/17(水) 21:41:36 ] 5個ずつのブロックで入ってるのなら, 5個読みこんだら空行を書き出すようにしたら? たとえば do i = 1, n read(10,*) a(i, 1), a(i, 2) if ( a(i, 1) > 132 .or. a(i, 2) > 32) write(20,*) a(i,1 ), a(i, 2) if (mod(i, 5) == 0) write(20,*) enddo とか.
362 名前:デフォルトの名無しさん mailto:sage [2010/11/17(水) 22:18:11 ] モジュールを外部ファイル化して メインファイルとモジュール用のファイルをコンパイルするのって f90 main.f90 mod.f90 でいいの?
363 名前:360 [2010/11/18(木) 15:16:58 ] >>361 お答え頂きありがとうございます。 私の書き方が悪かったのですが、1つのブロックの中の数はバラバラです。 条件によっては書き出し後でそのブロックの中の数が変わることもあります。 >>361 さんのおっしゃる通り、空行まで読むといったん条件を通して 新たなブロックと空行を書くようにすればできそうな感じはするのですが、 「空行まで読むと」という部分はどのようにすればいいのでしょうか?
364 名前:デフォルトの名無しさん mailto:sage [2010/11/18(木) 21:40:58 ] ichar() で空行を読み込むと "32" が返されるから, character(1) :: a(100) open(10, file='hoge.txt') do i = 1, foo read(10,'(a)') a(i) enddo close(10) でもう一回同じファイルを開いて do loop を回して範囲外のものをはじきつつ if( ichar(a(i) == 32) で空行を書き込むとかどうかな? 違ってたらごめん. 正直Fortran で完結させないでシェルスクリプトなり 使った方がラク.
365 名前:デフォルトの名無しさん mailto:sage [2010/11/18(木) 23:42:02 ] >>360 こんな感じで良いの? program extraction implicit none integer::i,j,k,m,is,large_number=10000 character(len=32) c open(10,file='hoge.dat') do i=1,large_number read(10,'(a)',iostat=is) c if(is>0) stop "error" if(is<0) exit m=index(c,' ') if(m/=1) then read(c(1:m-1),*) j read(c(m+1:),*) k if(j<=123.and.k<=32) then write(*,*) j,k end if else write(*,*) end if end do close(10) end program extraction
366 名前:デフォルトの名無しさん mailto:sage [2010/11/18(木) 23:43:57 ] >>362 モジュール先に作るべきなんじゃなかったっけ? f90 -c mod.f90 f90 -c main.f90 f90 mod.o main.o となるのが無難な気がする.
367 名前:デフォルトの名無しさん mailto:sage [2010/11/19(金) 01:23:27 ] program hoge implicit none integer :: x, y, ios character(len=100) :: str open(unit=11, file="input.txt", status="OLD") open(unit=12, file="output.txt", status="UNKNOWN") do read(11, "(A)", iostat=ios) str if (ios /= 0) exit read(str, *, iostat=ios) x, y if ((ios /= 0) .or. ((x <= 123) .and. (y <= 32))) then write(12, "(A)") trim(str) end if end do close(11) close(12) end program hoge
368 名前:365 mailto:sage [2010/11/19(金) 01:33:23 ] index使わなくてよいのか。 勉強になった。 ありがとん。
369 名前:360 mailto:sage [2010/11/20(土) 00:28:16 ] >>364 >>365 >>367 皆様ありがとうございます。 残念ながら、本日はFORTRANを使える環境におらず、 月曜日にもう一度皆様からご教授いただきましたように プログラムを見直し、計算してみようと思います。 また月曜日にご報告させていただきます。 本当にありがとうございます。それではよい週末を〜
370 名前:デフォルトの名無しさん mailto:sage [2010/11/22(月) 15:53:46 ] 結果をご報告いたします >>367 様のプログラムで計算し、出力ファイルを見ると 全データの中から、すべての空行が出力されておりました。 数値は入っておりませんでした。 >>365 様のプログラムでは、 同じように空行のみが出力されておりましたが、数がかなり少なかったので、 範囲内(j<=123.and.k<=32)にある空行が出力されたのではないかと思います。 もう一度じっくり考えてみたいと思いますが、無理そうなら諦めます;; お二方ともありがとうございました。
371 名前:デフォルトの名無しさん mailto:sage [2010/11/22(月) 21:00:33 ] >>366 それでできなかった モジュールのほうはコンパイルできるんだけどメインがモジュール読み込んでなくてコンパイルできない モジュールのほうをコンパイルしたときにoファイルだけ生成されてmodファイルが生成されないことと何か関係あるのかな?
372 名前:デフォルトの名無しさん mailto:sage [2010/11/22(月) 21:25:01 ] >モジュールのほうをコンパイルしたときにoファイルだけ生成されてmodファイルが生成されない これはおかしいね modファイルを作らないコンパイルオプションになっているとか?(そんなオプションあるのか知らないけどw
373 名前:デフォルトの名無しさん mailto:sage [2010/11/22(月) 21:55:39 ] Fortran が複雑になって行っている気しかしない。 77 の頃に戻ってくれんかな。まぁ幾らなんでも 77 ではヒド過ぎるから、90 程度の拡張で。 一体何処に向って行っているのだろう。学習のコ ストが上がるのは良い事ではないと思うのだが。
374 名前:デフォルトの名無しさん mailto:sage [2010/11/22(月) 22:37:57 ] >>372 コンパイルソフトが何か分からないんだけど コンパイルソフト何使ってるか調べるコマンドってある?
375 名前:デフォルトの名無しさん mailto:sage [2010/11/22(月) 22:42:05 ] 学習コスト<学習による恩恵 であれば肯定されるべきだと思うが 言語策定者は「こう使えばシアワセになれるんよ!」ってところを広くアピールしてほしいね まぁそういうことするのは物書きの仕事かもしれないけど でもFortranは少ないからなぁ
376 名前:デフォルトの名無しさん mailto:sage [2010/11/22(月) 22:43:26 ] test
377 名前:デフォルトの名無しさん mailto:sage [2010/11/22(月) 23:03:00 ] >>373 そうは言っても、もはや世界がFortranだけで閉じていないから、インターフェース周りを強化しないと ライブラリのラッパーすらかけない。 伝統的数値計算ライブラリならともかく、MPIとかOSのAPとかIは同じ引数が色々な型を取ったりするから そういうのに対応しようと思うと、多態型とかOOPっぽい機能が必要になるし、Cの呼び出し規格との 共通化も必要になる。 数値FormatがIEEE745に統一された以上、数値計算主役のFortranでは、その代数系を操作する 命令も欲しくなる。組み込み関数ももっと色々欲しくなる。 CPUも並列が当たり前になりつつある今、それに向いた命令も欲しい。 とはいえ他の言語のように、F90を削ったコア部分と標準Moduleみたいな形に分割したほうがいい気はするけど。 過去互換性をかなり保ったまま肥大化したから、命令の直交性なんかが悪くて、新規学習者に負担が 重すぎる気がする。
378 名前:デフォルトの名無しさん mailto:sage [2010/11/22(月) 23:13:55 ] >>377 学習負担そんなに重いかな? Fortran使う分野は特殊なんだし、ユーザもそれなりのレベルを前提としていいと思うけど あと、 >MPIとかOSのAPとかI は >MPIとかOSのAPIとか だよね?
379 名前:デフォルトの名無しさん mailto:sage [2010/11/23(火) 01:53:59 ] >>378 >>MPIとかOSのAPIとか >だよね? んだ。すづれい。 >学習負担そんなに重いかな? 90/95を77を横目に見つつ66以前を無視する形で学ぶ分にはいいかもしれんが、 これに2003が加わるときついような。やや95と挙動が変わっている。 CLASSの作り方とかも不細工だしww
380 名前:デフォルトの名無しさん [2010/11/23(火) 18:06:40 ] 計算時間長いプログラムをデーモンとして走らせたいんですけどどうやったらいいんでしょうか. コンパイラはpgiです.
381 名前:デフォルトの名無しさん mailto:sage [2010/11/23(火) 20:31:46 ] >>380 まあこの場合、コンパイラはPGIでもIntelでも何でもいいんだが www.codereading.com/notebook/moin.cgi/IgnoreTheHangupSignal
382 名前:デフォルトの名無しさん mailto:sage [2010/11/25(木) 16:00:26 ] Fortranで用意されている関数やサブルーチンを詳しく網羅しているサイトってないですか? やはり本家を見るべきですか?(その本家がどこかも知りませんが・・・)
383 名前:デフォルトの名無しさん mailto:sage [2010/11/25(木) 22:01:10 ] サブルーチンは自分で組み込むもんじゃないのか
384 名前:デフォルトの名無しさん mailto:sage [2010/11/25(木) 22:26:19 ] 内蔵してるサブルーチンでしょ system_clockとか
385 名前:デフォルトの名無しさん [2010/11/25(木) 22:46:02 ] intel fortranは拡張機能で、内部手続きを別の手続き に渡すことを許している。他のコンパイラでは、もし 2003に対応していたら、手続きポインタでさして、わ たせば、一応機能しているように見える。が、偶然の 可能性もある。2003の手続きポインタがさせる先は仕様 でどうなっているかを教えていただけないだろうか。
386 名前:デフォルトの名無しさん mailto:sage [2010/11/26(金) 11:36:12 ] Fortranである変数や配列のアドレスを知る演算子はありますでしょうか?
387 名前:デフォルトの名無しさん [2010/11/26(金) 19:02:26 ] 非標準だが、LOCまたは%LOC関数が使えることがある。
388 名前:デフォルトの名無しさん mailto:sage [2010/11/26(金) 19:09:57 ] >>387 ありがとうございます 非常に助かりました!! ちゅっちゅっ
389 名前:デフォルトの名無しさん [2010/11/27(土) 15:57:44 ] >>372 富士通だとデフォルトでは生成されない frt -c -Am -M./ (なんとか.f90) でいけるのではなかろうか。いずれにせよ、 frt -help | less とかやって、"module"で検索を掛けるのが吉。
390 名前:デフォルトの名無しさん mailto:sage [2010/11/27(土) 22:07:56 ] >>389 そのレスを見る前に昔の先輩が書いてたプログラムを見てたらmakeファイルに使用コンパイラがfrtってなってたから ググってもしやと思ったらなんというタイミング・・・ 多分そのとおりだと思う 月曜に試してみてまた報告しにくるわ
391 名前:デフォルトの名無しさん [2010/11/28(日) 16:23:24 ] 1990 4 2 401 45.2448 141.41 稚内 65 27 0 0 0 1990 4 2 402 44.5618 142.3524 北見枝幸 67 18 0 0 0 1990 4 2 404 44.2142 141.4218 羽幌 55 41 0 0 0 1990 4 2 405 44.3442 142.5806 雄武 95 36 0 0 0 1990 4 2 407 43.4612 142.2224 旭川 55 24 0 0 0 1990 4 2 409 44.01 144.17 網走 25 66 0 0 0 1990 4 2 412 43.0324 141.1954 札幌 53 36 0 0 0 1990 4 2 413 43.1236 141.4718 岩見沢 83 29 0 0 0 1990 4 2 418 42.583 144.233 釧路 83 31 0 0 0 1990 4 2 426 42.093 142.4648 浦河 55 60 0 0 0 1990 4 2 428 41.5154 140.0742 江差 53 65 0 0 0 1990 4 2 433 42.5354 140.4542 倶知安 67 34 0 0 0 1990 4 2 435 44.2036 143.2136 紋別 57 49 0 0 0 という形式のデータを読んだ場合(1961~2008年あります)、 do i = 1,137000 read(50,*,iostat=io) year,mon,day,ID,lat,lon,name,aveavecloud,sunsunlight,& prepre,maxmaxhourpre,maxmax10minpre if ( io < 0 ) exit pre(ID,year,mon,day) = prepre / 10.0 sunlight(ID,year,mon,day) = sunsunlight/10.0 avecloud(ID,year,mon,day) = aveavecloud maxhourpre(ID,year,mon,day) = maxmaxhourpre/10.0 max10minpre(ID,year,mon,day) = maxmax10minpre/10.0 ndata(ID,year,mon,day) = ndata(ID,year,mon,day) + 1 write(6,*) year,mon,day,ID,ndata(ID,year,mon,day) end do とし出力させると、ndata(ID,year,mon,day)がIDが402と409だけが2となります。 この原因はなんでしょうか?
392 名前:デフォルトの名無しさん [2010/11/28(日) 16:31:58 ] すみません。 391での説明で追加です。 ndata(ID,year,mon,day)がIDが402と409だけが2となります。と書きましたが 毎回ではないと思います。402と409ではないときもあるかもしれません。この下に2となると止める プログラムを書いているので、1990年の4月にとまり確認できたはじめのケースです。 以下どうなっているのかはまだ確認中です。
393 名前:デフォルトの名無しさん mailto:sage [2010/11/28(日) 20:17:30 ] 1つのソースファイル内で固定形式と自由形式を混ぜるとコンパイルがエラーになりますが、 「この行からこの行までは自由形式で」みたいな指定をしてコンパイルさせる方法が あったりしませんかね?
394 名前:デフォルトの名無しさん [2010/11/29(月) 01:22:16 ] 大学の授業で「エラトステネスのふるい」で3桁の素数を求める問題が出たのですがその解答例で index=1 do n=2,int(max**0.5) if(index(n)==0)cycle index(n**2:max:n)=0 end do ↑のようなものだったのですが(回答の一部抜粋です)indexとcycleの役割がいまいち わからないので教えてください。maxには書いてませんが上で=999と定義しています。 あと別の質問ですが大学では初めに「g77 -o 〜 〜」でコンパイルするように教わり 別の教授からは「intel -o 〜 〜」と教わったのですが具体的に何が違うのですか? 質問長くなってすいません。回答お願いします
395 名前:デフォルトの名無しさん mailto:sage [2010/11/29(月) 21:44:27 ] >>390 だけど 今日試したら無事コンパイルできて実行できた プログラム書くのがだいぶ楽になったわ レスくれた人たちありがとう
396 名前:デフォルトの名無しさん mailto:sage [2010/11/29(月) 23:46:20 ] >>394 > indexとcycleの役割 index は(おそらく整数の)配列だろう。 「ふるい」にかけた後 index(n) == 1となる n が素数。 cycleはDOループの中で次の行からend doまでをスキップする。
397 名前:デフォルトの名無しさん [2010/11/30(火) 00:46:36 ] >393 ないんじゃない? ファイル分けてコンパイルするのが一般的じゃないかしら. >394 エラトステネスのふるい自体はwikipediaにあるので説明なしで. index=1 ! 配列index(999)に整数値1を代入,最初は全部素数だとしておく. do n=2,int(max**0.5) if(index(n)==0)cycle ! index(n)=0のとき(すなわち素数でない場合)enddoまでスキップ. !この場合はこの1行↓をスキップするだけ index(n**2:max:n)=0 !n**2からmaxまでnおきにindexの値を0とする. ! do i=n**2,max,n ! index(i)=0 ! enddo !と同義 end do このプログラムは,既に組み込み関数として用意されているindexとmaxを整数型として利用しているので,あんまり良くない回答例だと思います. g77とintelの違いはコンパイラの違い.
398 名前:デフォルトの名無しさん mailto:sage [2010/11/30(火) 22:01:01 ] indexやmaxどころかINTEGERやIF、THENまで変数等に使えるのがFORTRANの良いところじゃないかwww
399 名前:デフォルトの名無しさん mailto:sage [2010/12/01(水) 01:15:45 ] >>396 ,>>397 ありがとうございます indexってネットで検索したら関数として乗っていたのでてっきりそっちかと思ったら ただの配列だったんですかw おかげで謎が解けました。すっきり
400 名前:デフォルトの名無しさん [2010/12/01(水) 03:57:06 ] interfaceブロックの中には、型定義だけでなく、implicit noneも 及ばないのな。なんで、こんな仕様にしたんだろう。 Fotran2003からimportで取りこめるようになったが、2003完全サポート なコンパイラは少ない。
401 名前:デフォルトの名無しさん mailto:sage [2010/12/01(水) 14:06:37 ] 完全サポートって完全準拠って意味? もうすぐ2011になろうってのに
402 名前:デフォルトの名無しさん mailto:sage [2010/12/01(水) 22:19:38 ] コンパイルすると「do文にパックド命令が出てきます」って表示されるんだけどどういう意味? コンパイラは富士通で一応ちゃんと実行できるんだけどなんか怖い
403 名前:デフォルトの名無しさん mailto:sage [2010/12/02(木) 23:01:00 ] infoseekのweb終了で「フォートランナーのためのFortranあれこれ」っていうサイトが見れなくなってしまいました。 かなり好きなサイトだったのですが・・・ここ見てらしたら是非復活お願いします>作者さん
404 名前:デフォルトの名無しさん mailto:sage [2010/12/06(月) 22:06:18 ] .not. と .and. と .or. の優先順位ってどうでしたっけ?
405 名前:デフォルトの名無しさん mailto:sage [2010/12/06(月) 22:19:57 ] 優先順位: (高) .NOT., .AND., .OR. (低)
406 名前:デフォルトの名無しさん mailto:sage [2010/12/06(月) 22:37:41 ] >>405 thx!
407 名前:デフォルトの名無しさん [2010/12/07(火) 03:35:33 ] 自分は怖いから くどい位に括弧付けてる
408 名前:デフォルトの名無しさん mailto:sage [2010/12/07(火) 05:59:47 ] >>407 オレも。
409 名前:デフォルトの名無しさん mailto:sage [2010/12/08(水) 16:01:22 ] Cの i++ みたいなインクリメント演算って i=i+1 とするより早い(専用の処理をするから)と聞いたのですが Fortranではそういうのないんですか?
410 名前:デフォルトの名無しさん mailto:sage [2010/12/08(水) 16:21:48 ] >>409 そりゃ相当おバカなコンパイラだけ。 普通は最適化で同じコードになる。
411 名前:デフォルトの名無しさん mailto:sage [2010/12/08(水) 21:51:16 ] >>410 そうですか(^^;) 今のご時世気にする必要ないんですね
412 名前:デフォルトの名無しさん mailto:sage [2010/12/08(水) 21:53:58 ] >>409 何もしなくてもコンパイラが勝手に宜しくしてくれるとかないの? 構文解析だけの問題のような気がするけど。
413 名前:デフォルトの名無しさん mailto:sage [2010/12/09(木) 08:46:45 ] 意味的には、 (i++) の式の値はインクリメントする前の i の値で、 (i=i+1) の式の値は代入された加算後の i の値なので、 意味が異なるから構文解析だけの問題ではない。
414 名前:デフォルトの名無しさん mailto:sage [2010/12/09(木) 14:19:01 ] でも ++ や += が使えたら便利だとは思う
415 名前:デフォルトの名無しさん mailto:sage [2010/12/09(木) 16:59:21 ] >>414 ようこそC++の世界へ
416 名前:デフォルトの名無しさん [2010/12/09(木) 22:31:23 ] まあ、 i = i + 1 くらいだったら、表記法を増やさないほうをとるが、 hoge(3,4)%piyo(6)%i = hoge(3,4)%piyo(6)%i + 1 となってくると、C/C++がうらやましくなったりはする。
417 名前:デフォルトの名無しさん mailto:sage [2010/12/10(金) 00:33:08 ] C++って配列演算ってあるっけ?
418 名前:デフォルトの名無しさん mailto:sage [2010/12/10(金) 02:41:10 ] std::valarrayとかか?
419 名前:デフォルトの名無しさん mailto:sage [2010/12/10(金) 23:08:01 ] 配列演算自体はできるみたいね。 速度的にはどうなんでしょ。ググってたらこんなん見つけましたが ir9.jp/prog/ayu/datlog/tech_cpp/1038031395/1038031395_03.html#R560 Fortranを使い続けることの意義を見出したいと思う今日この頃・・・ 徒労かなw
420 名前:デフォルトの名無しさん [2010/12/14(火) 23:55:57 ] >>419 たとえ速くとも、こんなん書きたくないよ、 というのが、正直なところ。ライブラリで、 プログラマビリティを上げるのは限界が、 あって、豊かな配列操作を組み込みでもっ ているfortranにはかなわないでしょう。
421 名前:デフォルトの名無しさん mailto:sage [2010/12/15(水) 00:25:43 ] C/C++のポインタや配列はエイリアスの問題を持っていて最適化の妨げになっているので restrictポインタを使わないとFortranにはかなわないよ
422 名前:デフォルトの名無しさん [2010/12/15(水) 13:58:06 ] Windows版のifort (Intel Visual Fortran)でプロファイルを取る方法を教えてください。 検索すると、 ifort -pg hoge.f90 ./a.out gprof ./a.out gmon.out というのがよく掲載されているのですが、Windows版には、下記のように -pgの対応物がないようです。 map_opts -tw -lf -opts -pg Intel(R) Compiler option mapping tool mapping Linux options to Windows for Fortran '-pg' Linux option maps to --> no equivalent Windows option found
423 名前:デフォルトの名無しさん [2010/12/15(水) 20:41:21 ] あるデータをバイナリ化にするプログラムについての質問です。 あるデータは、2列の33行のデータです。1列目は年、2列目は実数が入っています。 ---------------------------------------------------------------------- implicit none INTEGER :: i,iyear real*4 :: val open( 10, file='a.dat', status='old') open( 90, file='b.bin', status='unknown', access='direct', & recl=1) do i=1,33 read( 10, * ) iyear, val write( 90, rec= i ) val enddo stop end ------------------------------------------------------------------------ これはコンパイルはできるのですが、実行できませ。 At line 12 of file bainari.f90 (Unit 90 "b.bin") Traceback: not available, compile with -ftrace=frame or -ftrace=full Fortran runtime error: Writing more data than the record size (RECL) というエラーがでます。 なにか考えられる原因はありますでしょうか?? どうかよろしくお願いします。
424 名前:デフォルトの名無しさん [2010/12/15(水) 23:33:45 ] 仕様でどうなっているかは忘れた。 正格でないかもしれないが、 いっかいのwrite文でかきだせる長さ はreclで指定した長さ以下でなければ ならない。 ここで問題となるのはreclの単位。 intel機の場合、1バイト、いっぽう書こう としてるvalは4バイトなので、ランタイム エラーが出る。Recl=4としないといけない。
425 名前:デフォルトの名無しさん [2010/12/15(水) 23:38:26 ] とはいえ、元のコードが間違つているわけでもない。 SUNなどの環境ではreclの単位は4バイトである。 (コンパイルオプションで、1バイトにできるが^-^)
426 名前:デフォルトの名無しさん [2010/12/16(木) 12:26:42 ] ありがとうございます。 ちょっとわからないんですが、僕の使っているパソコンはレッツノートでCPUは Intel centrino2と書いています。cygwinを使っています。 直し方ありますか?
427 名前:デフォルトの名無しさん [2010/12/16(木) 12:33:29 ] >424,425 すみません。RECL=4となおしたらできました。 ありがとうございます。描画して合ってるか確かめてみます。
428 名前:デフォルトの名無しさん [2010/12/16(木) 17:29:36 ] 初めて訪問させていただきます。 intel fortran にて error #7836 実引数がスカラーの場合、実引数が形状引継ぎ配列やポインター配列でない配列の要素、またはそれらの要素の部分文字列でなければ、対応する仮引数はスカラーになります。 これはどのようなエラーでしょうか? debugモードだと発生し、releaseモードだと発生しません。 宜しく、宜しくお願いします。
429 名前:デフォルトの名無しさん [2010/12/16(木) 20:20:40 ] 構文チェックを厳しくするオプションがDebugのときは付くのだと思うのだが。 該当箇所(呼び出し元と呼ばれる手続き)を見せれる? 渡ししている変数の型と、読んでいる手続きの引数の型が わかればいいです。
430 名前:428 [2010/12/17(金) 15:40:59 ] >>429 解決しました。 問題の箇所は、変数Aが 親ルーチンで配列 子ルーチンは実働が無いので変数 孫ルーチンで配列 にて宣言されていたためです。 リリースモードではスルーされていました。 ありがとうございました。
431 名前:デフォルトの名無しさん mailto:sage [2010/12/19(日) 16:15:48 ] >>414 それはアセンブラのINC命令とかADD命令に一対一対応していた頃は意味があったかもしれないが、 いまさらただの表記の慣れの問題にすぎんだろ。 >>416 F2003でASSOCIATE命令が出来たから、がまんできるべ? >>420 F95以降ELEMENTAL FUNCTIONをユーザー定義できるようになったから、スカラー用の関数を書けば 多次元配列を引数に出来るので便利。 これはLISPとかのMAPと同じようなもんだが、マクロと実行命令ではスピードが違うから 配列操作が多いならFortran以外ないだろう。
432 名前:デフォルトの名無しさん mailto:sage [2010/12/19(日) 17:43:25 ] 話にあんまついて行けてない・・・ 多分レベル差がありすぎるんだと思う 誰かF2003あたりの本書いてください、オナシャス!
433 名前:デフォルトの名無しさん mailto:sage [2010/12/21(火) 00:42:38 ] 2階常微分方程式の問いを考えていたのですがどう手をつけたらいいかわかりません 問題分は ttp://iup.2ch-library.com/i/i0207521-1292859670.jpg です。 できれば解説付きでお願いします
434 名前:デフォルトの名無しさん mailto:sage [2010/12/21(火) 18:32:42 ] せめて画像回転ぐらいしようや 読ませる気が無いとしか思えん
435 名前:デフォルトの名無しさん mailto:sage [2010/12/22(水) 00:56:32 ] >>433 です 貼る画像間違ってました iup.2ch-library.com/i/i0207930-1292946928.jpg お願いします
436 名前:デフォルトの名無しさん mailto:sage [2010/12/22(水) 06:01:10 ] ルンゲ・クッタ法を教えて下さい、なら Fortran の話題じゃないんじゃね? それこそ、ググ(ry
437 名前:デフォルトの名無しさん [2010/12/22(水) 20:16:33 ] MODULE Integrate IMPLICIT NONE CONTAINS ! ルンゲ・クッタ4次積分子 ! y : (x1,...,xn=t) at t=t0+dt ! x : (x1,...,xn=t) at t=t0 ! f : (x1,...,xn) -> (f1,...,fn) ! (形式) ! f(f_vec, x_vec) ! real(8), dimension(n) :: f_vec, x_vec SUBROUTINE Runge_Kutta4(y,x,f,dt) real(8), dimension(:) :: y,x real(8), dimension(size(x)) :: xx, k1,k2,k3,k4 real(8) :: dt interface subroutine f(deriva,x) real(8), dimension(:) :: deriva, x end subroutine end interface call f(k1,x) xx=x+0.5d0*dt*k1 call f(k2,xx) xx=x+0.5d0*dt*k2 call f(k3,xx) xx=x+dt*k3 call f(k4,xx) y=x+dt/6.0d0*(k1+2.0d0*(k2+k3)+k4) END SUBROUTINE END MODULE
438 名前:デフォルトの名無しさん mailto:sage [2010/12/22(水) 20:33:06 ] そういやルンゲクッタの証明ってどうやんだっけ・・・ たいていのテキストには式しか書いてないよな
439 名前:デフォルトの名無しさん [2010/12/22(水) 21:50:33 ] dx(t)/dt = f(x) の関係を使って、xの高次の時間微分をfのxによる微分に置き換える (いわゆるチェーンルールを使って) 係数を知ったうえで、4次までの展開になっていることを確認したことが あるが、それでもかなり面倒な計算になる。
440 名前:デフォルトの名無しさん mailto:sage [2010/12/23(木) 00:59:16 ] >>437 さんありがとうございます さっそく明日やってみたいと思います
441 名前:デフォルトの名無しさん mailto:sage [2010/12/25(土) 00:33:34 ] >>437 さんのがうまくできなかったんですが どういう手順で考えていくかだけでも教えてもらえませんか?
442 名前:デフォルトの名無しさん [2011/01/05(水) 19:18:52 ] しばらく見てなかったので申し訳ない。使用例を書きます。 例として、調和振動子を考える。これは、位置x, 速度vについての微分方程式 dx/dt = v (1) dv/dt = -x (2) である。形式的に自明な式 dt/dt = 1 (3) を追加して、ベクトル z = (x, v, t)を定義すると、 (1)〜(3)はあるベクトル関数fによって dz/dt = f(z) とかける。このfをFortranで具体的に書くと以下のようになる。 module ho subroutine f(dz_dt,z) real(8), dimension(:) :: v, x dz_dt(1) = z(2) dz_dt(2) = -z(1) dz_dt(3) = 1D0 end subroutine end interface program test use ho real(8) :: z(3), dt z(1) = 1d0 ! x(0) z(2) = 0d0 ! v(0) z(3) = 0d0 ! t = 0 dt = 0.01D0 do while (x(3) .lt. 6.28) call Runge_Kutta4(x,x,f,dt) write(*,*) z end do end subroutine
443 名前:デフォルトの名無しさん [2011/01/06(木) 17:48:39 ] 三重積分の数値計算プログラムについて相談 台形公式を用いたプログラムで分割数nを大きくしていけば精度は上がると思ってるんだけど n=100とn=1000とでは値が何故か全然違うんだ 被積分関数f(x,y,z)=x^2+y^2+z^2で積分区間をx,y,z共通で[0,1]としたとき値Sは1.0になるわけだけど n=100のときS=1.000005054で、n=1000のときS=6.25e-2になってしまう 数学板とで迷ったけどアルゴリズム的なことだったらこっちかなと思って聞いてみる 誰か分かる人いたら教えてください
444 名前:443 mailto:sage [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)
445 名前:444の続き mailto:sage [2011/01/06(木) 17:56:07 ] h5=f(x1,y1,z2) h6=f(x2,y1,z2) h7=f(x1,y2,z2) h8=f(x2,y2,z2) h=(h1+h2+h3+h4+h5+h6+h7+h8)/8.0 s=s+dx*dy*dz*h end do end do end do とまあこんな感じ 今はf(x,y,z)=x^2+y^2+z^2で計算してるけど最終的にはもうちょっと複雑な関数になる
446 名前:デフォルトの名無しさん mailto:sage [2011/01/06(木) 22:33:32 ] 「情報落ち」だな
447 名前:デフォルトの名無しさん [2011/01/07(金) 00:34:52 ] >>446 ?
448 名前:デフォルトの名無しさん mailto:sage [2011/01/07(金) 00:57:29 ] ググれ このごろじゃ計算誤差について何も教えてないのか 最後に合計を見るだけじゃなく 実際に何を足してるのか出力してみろ 何が起きてるのか分かる
449 名前:デフォルトの名無しさん mailto:sage [2011/01/07(金) 01:52:41 ] >>448 把握した 今このプログラムは実数が単精度になってるから倍精度にして h1〜h8まで出力してみて確認してみる
450 名前:デフォルトの名無しさん [2011/01/07(金) 20:40:05 ] あぁああ〜 乱流モデルの差し替え、うまくいかねーーーーーーOTL なぜあぼーとするんだ・・・ だれか助けて・・・
451 名前:デフォルトの名無しさん mailto:sage [2011/01/07(金) 23:27:34 ] じゃあDNSで
452 名前:デフォルトの名無しさん mailto:sage [2011/01/07(金) 23:34:10 ] >>443 だけど単精度から倍精度に変えて情報落ちしてるであろうSの計算方法を変えたら問題解決できますた
453 名前:デフォルトの名無しさん mailto:sage [2011/01/07(金) 23:38:34 ] >>448 昔のほうがしっかりしたカリキュラムだったって話を聞くが本当なのか ゆとり教育ってやつか
454 名前:デフォルトの名無しさん mailto:sage [2011/01/08(土) 21:47:53 ] >>453 昔は電子計算機という前提のカリキュラムだったが、最近は学生全員にノートパソコン買わせてるのに プログラミングも教えないからな・・・
455 名前:デフォルトの名無しさん mailto:sage [2011/01/09(日) 18:56:32 ] なにそれひどい
456 名前:デフォルトの名無しさん mailto:sage [2011/01/12(水) 03:08:24 ] >>442 さんありがとうございます おかげである程度理解できました!
457 名前:デフォルトの名無しさん [2011/01/13(木) 13:52:47 ] FORTRANの課題が出て〆切が月末なんだ。 三問ほど有償で解いてやんよって人いないか。
458 名前:デフォルトの名無しさん mailto:sage [2011/01/13(木) 15:36:12 ] とりあえず問題晒してみそ 誰か解いてくれるかも
459 名前:デフォルトの名無しさん mailto:sage [2011/01/13(木) 23:53:21 ] >>435 なんですが 1:0〜20の区間を適当に分割 2:初期値入力 3:2階常微分方程式を一階常微分に直す dy/dx=z dz/dx=f(x,y,z)=-sin(y)としました。 4:ルンゲクッタ法 y=y+(k1+2*k2+2*k3+k4)/6 k1=h*f(x,y) k2=h*f(x+h/2,y+k1/2) k3=h*f(x+h/2,y+k2/2) k4=h*f(x+h,y+k3) これの()内が3つあるバージョン。分割した回数繰り返す。 5:ファイルにデータ書き込み出力 こういう流れで作りたいんですがどこが間違ってるのか出力すると初期値を 繰り返したデータになってしまいます。2〜5あたりだけでもいいので わかる方いたら教えてもらえませんか? イメージとしては↓のサイトのようにやったんですがうまくいきませんでした www.akita-nct.ac.jp/~yamamoto/lecture/2005/5E/differential_equations/text/html/node3.html
460 名前:デフォルトの名無しさん [2011/01/14(金) 00:02:02 ] お言葉に甘えて失礼します。 とりあえず一問目。 「ある動物園の一日の総入園者数(1行目)と入園者の年齢(2行目以降)が 収納されているファイルからデータを配列に貯えて、平均年齢、及び最高年齢と最低年齢を 求めて出力するとともに、各年代(10歳未満、10代、20代、・・・70代、80歳以上)ごとの 入園者数を出力するプログラムを作れ。 また、平均年齢は小数点以下第1位まで示すこと。」 データはここ。 www5.plala.or.jp/selene-kw/ 宿題代行スレでないのは百も承知だが、ここ以外にFORTRAN師探せなかったんだ。 なにかしら反応もらえると助かる。 よろしくおねがいします。
461 名前:デフォルトの名無しさん mailto:sage [2011/01/14(金) 01:15:44 ] >>459-460 やはり FORTRAN77 か? 90でもいいのか?
462 名前:デフォルトの名無しさん mailto:sage [2011/01/14(金) 02:36:05 ] 90でも77でもいいです といってもあまり違いが分かってるわけじゃないのですが
463 名前:デフォルトの名無しさん mailto:sage [2011/01/14(金) 09:31:01 ] >>460 ここは宿題スレだからスレの趣旨には合ってる
464 名前:デフォルトの名無しさん mailto:sage [2011/01/14(金) 10:24:33 ] >>460 予想してたより簡単で拍子抜けしたw 暇ができた時にまだ誰も解いてなかったら答えるよ
465 名前:デフォルトの名無しさん mailto:sage [2011/01/14(金) 11:56:20 ] でけた 年代別のところは途中で端折ったから自分で補え program main implicit none integer :: i, n, decade(9) integer,allocatable :: age(:) open (99,file="ex5-3.d", status='old', action='read', position='rewind' ) read (99,*) n allocate ( age(n) ) read (99,*) ( age(i) , i=1, n ) close (99) decade = 0 do i=1,n if (age(i)<10) decade(1) = decade(1) + 1 if (age(i)>11 .AND. age(i)<20) decade(2) = decade(2) + 1 end do write (*,'(a8, f5.1)') " ave = ", REAL(sum(age)) / REAL(n) write (*,'(a8, i5)') " min = ", minval(age) write (*,'(a8, i5)') " max = ", maxval(age) write (*,'(a8,i5)') " 0-10 : ", decade(1) write (*,'(a8,i5)') "11-20 : ", decade(2) end program main
466 名前:デフォルトの名無しさん mailto:sage [2011/01/14(金) 11:57:08 ] ありゃ、タブは2chじゃ無視されるんだな 適宜字下げしてくれ
467 名前:デフォルトの名無しさん mailto:sage [2011/01/14(金) 12:05:15 ] あと、連続したスペースも無視されるようだから a8 の中身も適宜修正してくれ intelコンパイラ、f90形式でうまくいくのは確認した
468 名前:デフォルトの名無しさん mailto:sage [2011/01/14(金) 21:04:28 ] スペースを&#160;←これを半角で入れるとちゃんと字下げされるんだけど コピペした時に削らないとコンパイルできないので置換する必要がある
469 名前:デフォルトの名無しさん [2011/01/14(金) 23:17:59 ] 早っΣ(;゜д゜) 親切な回答ありがとうございます!! C言語の代行が企業だと50万かかると検索して出たから 有償とかそれなり覚悟してたんだ。 3問中の1問は自力で解くことにします。 もう1問も類似したプログラム見つけるなりしてみる。 どうしても無理げだったら聞きにこさせてもらうかも。 本当にありがとうございます!
470 名前:デフォルトの名無しさん mailto:sage [2011/01/16(日) 17:31:52 ] >>435 を >>459 みたく解ける方いませんか? もうここに頼るほか解く手段が見つかりません
471 名前:デフォルトの名無しさん mailto:sage [2011/01/16(日) 18:05:00 ] >>470 435の画像が見られないので何ともいえないけど、442では無理なのか?
472 名前:471 mailto:sage [2011/01/16(日) 21:05:21 ] >>470 今どんな状態か報告すれば親切な人がアドバイスしてくれるかもしれないよ
473 名前:デフォルトの名無しさん mailto:sage [2011/01/17(月) 00:12:34 ] >>435 が消えてたので再度貼ってみました iup.2ch-library.com/i/i0224579-1295190437.jpg >>471 437,442のやり方でやってみたんですが自分は77か90しかわからないせい か、単純に勉強不足が原因でわからなくてコンパイルとかできませんでした 私事だけどこの課題が解けないと講義の単位が取れないかもしれないので かなり焦っています。 親切な方ぜひよろしくお願いします。
474 名前:デフォルトの名無しさん mailto:sage [2011/01/17(月) 16:10:37 ] 構造体で配列を定義するとき、配列サイズを以下のように定数で指定すると 「構造体ではattribute指定できない」という旨のコンパイルエラーになりました。 type test integer, parameter :: n = 10 integer :: a(n) end type type(test) :: test1 end parameterを使わず、integer :: a(10) とすればもちろんコンパイルできますが・・・。 やり方・考え方がおかしいんでしょうか?ご助言お願いします。
475 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 00:03:16 ] >>473 です 今日TAの人に助言をもらい完成させることができました。 考えてくれた方がもしいたらありがとうございます
476 名前:デフォルトの名無しさん [2011/01/18(火) 11:39:11 ] (x)=exp(a*x) をm次まで x=0の近傍でTaylor展開した値 g(m)、 f(x)との間の誤差を評価するプログラムをfortranで作成せよ。 またプログラムを実行し、ある1種類のaの値に対し、(xの値も2種類程度でよい) a x exp(a*x) m g(m) の順でデータを並べてファイル ftaylor.dat に出力せよ。 また f(x)-g(m)をmの関数として gnuplotで表示し、誤差がどのように小さくなってい くかを 確認せよ。(特定の関数で |f(x)-g(m)|がフィットできるかどうか見てみてください これをどのようにしていけばいいかおしえてください.
477 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 18:43:27 ] f(x)=exp(a*x)をx=0でテイラー展開(マクローリン展開)すると g(m) = sum_(n=0)^m [ { f'(n)(0) / n! } x^n ] = 1 + a*x + a^2*x^2 / 2! + a^3*x^3 / 3! + … + a^m*x^m / m! になる.実際はg(x,m)という関数なりサブルーチンを作って, f(x)-g(x,m)が,mを増やすごとに0に近付くことを確認すればいい.
478 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 19:03:15 ] >>474 定数を構造体の前に置く integer, parameter :: n = 10 ・・・ type test integer :: a(n) end type ・・・
479 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 19:52:37 ] >>478 ありがとうございました。
480 名前:477 mailto:sage [2011/01/18(火) 20:19:13 ] >>476 とりあえず作った ファイル出力は自力でよろしく 使い方もソース読んで自分の頭をひねりましょう madexpress.ddo.jp/kudafort/5-476.f90
481 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 20:31:31 ] 構造体って数値計算だと遅くなるから使わないって聞きますが本当ですか? クラスも構造体も使えないとなると相当生産性悪いような気がしますが
482 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 20:44:53 ] >>481 構造体使うとメモリアクセスが非連続になるからね この辺の事情はCでも同じじゃないの? 反復計算は配列を何度も読み出すから これが構造体になるとキャッシュヒット率はガタ落ちになる
483 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 21:07:28 ] なるほど でも物理系の数値計算って最終的に Ax=b を解く問題に帰着するケースが多いし 計算時間の大部分はこれが占めますよね そうするとA, bさえ連続な配列にしておけば、残りのデータは構造体でもいい気がします
484 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 21:12:51 ] >物理系の数値計算って最終的に Ax=b を解く問題に帰着するケースが多いし あ、そうとも限らないか^^; 訂正します まあ何事も用途次第ということですかね
485 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 21:21:36 ] ttp://www.mm2d.net/c/c-15.shtml Cでも同じような感じだね ただしメモリ配置を明示できる点で若干のアドバンテージがあると解釈した >>483 例えば,問題,各パラメータ,求解時間を格納する程度なら 構造体使っても差は出ないと思うけど, 行列やベクトルはメモリ上で連続になる配列を使うのがセオリーだね CG法なら探査ベクトルや残差ベクトルもみんな1次元配列 行列も非零要素だけ抜き出した1次元配列とポインタを格納する配列があればいい 物理計算に構造体使ってるプログラムは見たことが無いw
486 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 21:24:30 ] >>484 うんにゃ,その認識で合ってる ほとんどの物理現象は偏微分方程式で書き表わせるし, 偏微分方程式を離散化すれば線形方程式系になるよ
487 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 23:09:20 ] ここの人達は行列ソルバは自作したりします? 自分はLAPACKに頼りっきり… ライブラリがないと何もできないような人間になっちゃいそうで怖いけどw
488 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 23:34:40 ] >>487 私は LAPACK 使ってます。自作できるほどのスキルが無いので。 それでも数値積分は泣く泣く自作した覚えがある。
489 名前:デフォルトの名無しさん mailto:sage [2011/01/18(火) 23:39:57 ] >>488 自分もガウスルジャンドル積分くらいですかね、自作したのは 特殊関数とか自分で書くの無理だよなぁ…あれは
490 名前:デフォルトの名無しさん mailto:sage [2011/01/19(水) 00:41:25 ] ソルバの研究中です まだ駆け出しですが
491 名前:デフォルトの名無しさん [2011/01/19(水) 12:52:04 ] >>480 解答ありがとうございます。
492 名前:デフォルトの名無しさん [2011/01/19(水) 13:21:32 ] 何回もすみません。 b = b * dble(i) g = g + (a**i * x**i / b) write(*,'(2f10.3,e11.3,i6,e11.3)') a, x, f, i, g ここの意味がよく分からないので説明おねがいします。
493 名前:デフォルトの名無しさん [2011/01/19(水) 13:55:47 ] あとgnuplotでのf(x)ーg(m)の表し方が分からないのでおしえてください。
494 名前:デフォルトの名無しさん mailto:sage [2011/01/19(水) 14:50:46 ] >>492 ループ内1行目は>>477 における m! の計算, 2行目は g(m) = g(m-1) + (a^m * x^m / m!) を計算してる マクローリン展開を理解すれば自ずと分かるはず 3行目は問題どおり a x exp(a*x) m g(m) の形で標準出力してるだけ gnuplotぐらい自分で何とか汁 ループ内に m と f-g をファイル出力するコードを追加して それをgnuplotで読み込んで描画すればいい この問題はmが増えるにつれてf(x)=exp(a*x)とg(m)の値が近づくことを確認しろって意図だろう だからmが増えた時に f-g が0に収束していく様子がグラフに描ければいい
495 名前:デフォルトの名無しさん [2011/01/19(水) 16:17:45 ] >>494 ありがとうございます
496 名前:デフォルトの名無しさん [2011/01/19(水) 16:53:21 ] >>476 ではmを手で与えて、データファイルを作成した。 今度は、誤差の絶対値eps(実数)を手で与え、そのeps以内に誤差が収まるためには mがいくら以上であることが必要かを求めるプログラムを作成せよ。 この場合はどうすればよいですか?
497 名前:デフォルトの名無しさん mailto:sage [2011/01/19(水) 17:46:51 ] ループ内で誤差を計算し, ループを do while に書き換えるか if (〜) exit でループを抜ければいい そのときにループが何回回ったかを数えろ つーか質問の丸投げはよそうや 「〜って考え方で合てるか?」とか 「こう書いたが計算が合わない」みたいな質問の仕方にしようぜ 自分で考えた痕跡が無いと答える気が失せてくる
498 名前:デフォルトの名無しさん [2011/01/21(金) 09:52:44 ] すいません わかりました ありがとうございます。
499 名前:デフォルトの名無しさん mailto:sage [2011/01/21(金) 16:25:00 ] sinとdsinみたいな総称名と個別名はどちらを使うべきですか? 総称名はバグの元なので危険という意見もあれば、逆に見通しが良くなってバグも減るという考えもあると思います。 ただ、型変換のreal, float, dbleあたりは常に注意が必要だとは思いますが。
500 名前:デフォルトの名無しさん mailto:sage [2011/01/21(金) 16:35:29 ] >>499 総称名は引数の型を問わないけど 個別名は引数の型が限定される pi が単精度型だと sin(pi) はOKでも dsin(pi) はエラーを起こす ただし前者で得られる答えは単精度だから、 倍精度の答えが必要なら dsin(dble(pi)) とする必要がある 仮に pi が倍精度なら sin(pi) も dsin(pi) も同じ この辺はコンパイラが勝手に辻褄合わせてくれるかもしれんけど
501 名前:デフォルトの名無しさん mailto:sage [2011/01/21(金) 17:48:42 ] >>500 ありがとうございます。確かに Intel Fortran 11ではエラーになりました。 よく考えたら、piが単精度な時点で dsin(dble(pi)) とやっても得られる精度は sin(pi) と 全く変わらないわけですから、結局のところ個別名を使う理由なんてなさそうですね。 つまり、型の間違いによるバグは個別名を用いたところで解決できるものではなく、 型の間違い自体をしないよう代入・演算を気を付けるしかない、ということですね。
502 名前:デフォルトの名無しさん mailto:sage [2011/01/21(金) 19:41:49 ] >>501 >dsin(dble(pi)) とやっても得られる精度は sin(pi) と全く変わらない まぁその通りだけど、sin(pi)を他の倍精度型の数値とかけ合わせたりする時が怖いね 型を明示する時以外は総称名で事足りるけど、 計算バグ除けには個別名が便利なこともあるって認識だな、俺は
503 名前:デフォルトの名無しさん mailto:sage [2011/01/21(金) 22:49:01 ] >>502 確かに、いつも型を個別名にしておけば、書き間違えたときにコンパイラが教えてくれるというのは利点ですね。 やはり、少なくとも単精度・倍精度が入り交じるときは個別名を使ったほうが良さげですね。
504 名前:デフォルトの名無しさん mailto:sage [2011/01/22(土) 22:42:54 ] 内部副プログラムの関数(メインプログラムのcontains以下に書いた関数)の仮引数に optional属性を付けると変なところで関数を抜けてしまうようで、なんだか挙動がおかしいです。 手元の本(数値計算のためのFortran90/95プログラミング入門、牛島)を見ますと、 「モジュール副プログラムではそのまま使えるが、外部副プログラムの場合はインターフェースが必要」 という記述があったのですが、もしかして内部副プログラムではoptional属性は使えないんですか? というか、内部副プログラムの関数とモジュール副プログラムの関数は機能的に同じだと思っていたのですが、違うんですか?
505 名前:デフォルトの名無しさん mailto:sage [2011/01/24(月) 21:21:45 ] >>504 >内部副プログラムではoptional属性は使えないんですか? 問題なく使える。 program main implicit none print *, f1(1.0) print *, f1(3.0, c = 0.5) print *, f1(1.0, 2.0, 3.0) contains real function f1(a, b, c) real, intent(in) :: a real, intent(in), optional :: b, c ! f1 = a + b * c f1 = a if (present(b)) f1 = f1 + b if (present(c)) f1 = f1 * c end function f1 end program main optionalな引数をチェックなしで使ったり 誤って主プログラムで宣言した変数を内部副プログラム内で書き換えたり してるんじゃないかな?
506 名前:471 mailto:sage [2011/01/25(火) 00:05:02 ] >>504 www.geocities.jp/eyeofeconomyandhealth/homepage/fuku7.html ここら辺も参考にどうぞ
507 名前:デフォルトの名無しさん mailto:sage [2011/01/25(火) 00:27:46 ] >>478 便乗質問ですが、定数って構造体の中では作れないんですか? それってちょっと不便じゃないですかね?
508 名前:デフォルトの名無しさん mailto:sage [2011/01/25(火) 15:21:50 ] >>504 さんの実例体験と書籍からすると、 使えるほうが例外なのかもね。 安全な回避策は今のメインを大きな副プログラムにして それを呼ぶだけのメインを新たに作るとか、かなあ。
509 名前:デフォルトの名無しさん [2011/01/25(火) 15:52:23 ] 質問です。 読み込むデータが 1 0 2 4 3 5 : : 24 0 25 6 : : 48 3 : : というようになっており、1万行近く続きます。これを1列目が24の倍数になったらそれまで読んだ行を すべて出力するようなプログラムを書きたいのですが、どう書けばよいのかわかりません。 1~24が1日分、25~48が1日分となっているので、分割して別ファイルに出力したいんです。 それぞれ別ファイルへというプログラムは書けるのですが、僕が思い浮かぶのは一列目に24の倍数がきたら、出力する というプログラムしか思い浮かばず、24の倍数がきたら今まで読んだ行すべてを出力、次にまた24の倍数がきたら前の24の倍数 以後からの行すべてを出力というのはどう書いていいのか。。 どうかアドバイスいただけないでしょうか?
510 名前:471 mailto:sage [2011/01/25(火) 20:25:36 ] mod使って24で割った時の余りの値で制御すれば良いんじゃないかな
511 名前:デフォルトの名無しさん mailto:sage [2011/01/25(火) 20:27:09 ] すまん。上は24で割って整数化しちゃえばのミス
512 名前:デフォルトの名無しさん mailto:sage [2011/01/25(火) 20:33:44 ] 俺だったら m=1 do (ファイル終わるまで) do i = m, m+23 (中略) end do m = m + 24 end do と考えたがスマートじゃないなw
513 名前:デフォルトの名無しさん [2011/01/26(水) 01:11:30 ] >>510 ,511 整数化というのはどういうことでしょうか?できれば、1列目の数字は変えたくないんですよね。 do i = 1 10000 read(50,*) number,sun enddo このiを使って24ずつにしゅつりょく分割できればいいんですが。。 >>512 10000行分書いていくのは、しんどいですよね。ただちょっと書き方参考にさせていただきます。
514 名前:デフォルトの名無しさん mailto:age [2011/01/26(水) 03:30:21 ] >>513 ループのiを24で割ると24行毎に値が変わる 1-24,25-48,...と組を作る為に、iをi-1に変えて k=(i-1)/24として、装置番号に利用すると上手くいく program kudasure implicit none integer :: i integer :: number,sun integer :: k integer,parameter::num=11 !適当な数 character :: output*9,temp*5 do i=1,10000 k=(i-1)/24 write(temp,"(I5.5)") k output=temp//".txt" if(mod(i,24)==1) open(k+num, FILE=output, status="unknown") write(k+num,*)i if(mod(i,24)==0) close(k+num) end do endprogram kudasure
515 名前:デフォルトの名無しさん mailto:sage [2011/01/26(水) 03:44:30 ] 補足すると write(temp,"(I5.5)") k は5桁で空の部分に0を補って数字をtempに書き出す(ex 1→0001)やつだから
516 名前:デフォルトの名無しさん mailto:sage [2011/01/26(水) 12:18:33 ] >>514 UNIT番号は機種依存だが、99までだったりすることが多いぞ。 ファイル名を動的に生成して開くほうが良いアルヨ。
517 名前:デフォルトの名無しさん [2011/01/26(水) 12:20:43 ] >>514 ,515 ご丁寧にありがとうございました。 今日自分で書いてやってみます。 また、わからなかったら書き込むと思いますので、また見かけましたら よろしくお願いします。
518 名前:デフォルトの名無しさん mailto:sage [2011/01/26(水) 13:17:50 ] >>516 そうだったのか 知らなかった。マジサンクス
519 名前:デフォルトの名無しさん [2011/01/30(日) 22:09:50 ] いえいえ
520 名前:デフォルトの名無しさん [2011/03/05(土) 13:56:17.72 ] ふう
521 名前:デフォルトの名無しさん [2011/03/09(水) 18:33:35.88 ] Windowsでg95を入れてプログラミングを始めたんですが、 アイコンへのドラッグ&ドロップを実装したいんですがどうしたらいいんですか? よろしくお願いします。
522 名前:521 mailto:sage [2011/03/09(水) 18:49:58.61 ] 自己解決しました。ありがとうございました。
523 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 22:01:25.92 ] ttp://n.xxad.net/watch/sm13809685 【どうすればこの欲望の渦巻く堕落した世界に私の名を残せるだろうか】 ※名を残したいとは思わないがw。 【狂乱のマシンを残せばいい】 【この狂乱の世界に相応しい野獣のようなマシンを】 【狼が来たからやってきた】 【お前の平和な街は今はもう安全ではない】
524 名前:デフォルトの名無しさん [2011/05/01(日) 07:09:28.70 ] gfortranで可変FORMAT文を使えますか?
525 名前:デフォルトの名無しさん mailto:sage [2011/05/01(日) 18:51:34.81 ] >>524 やってみたら良い。
526 名前:デフォルトの名無しさん mailto:sage [2011/05/01(日) 23:15:36.09 ] < >つけてやってみたけど、できませんでした。 可変使わなくても対応できたので、問題はありませんでしたが。
527 名前:デフォルトの名無しさん mailto:sage [2011/05/09(月) 10:04:24.24 ] 質問です。 Fortran 2003でチェスのプログラムを書いています。 対戦相手の入力待ち時間内に並行してチェスのシミュレーションを行いたいのですがどうしたらいいでしょうか? たとえばreadを使うと入力するまで計算が止まってしまいますが、計算を止めないまま予測計算を継続させられませんでしょうか?
528 名前:デフォルトの名無しさん mailto:sage [2011/05/09(月) 11:34:48.48 ] >>527 F2003規格には、asynchronous I/O というものがある。 理屈の上ではそれを使えば良い。今のコンパイラで実装されているか不明。 野蛮になっていくが、OpenMPとかでOSのAPIでスレッドを投げる手もある。
529 名前:デフォルトの名無しさん mailto:sage [2011/05/09(月) 11:36:31.27 ] >OpenMPとか、MPIとか、コンパイラ並列拡張命令、OSのAPIでスレッドを投げる手もある。
530 名前:デフォルトの名無しさん mailto:sage [2011/05/09(月) 11:42:14.31 ] >>528 サンクス!とりあえずIntel Fortran XE Compilerは対応してるっぽいわ。 ついでに関係ないけどMATLABもAsynchronous inputが2010aからできる。 長年の疑問が解決したわ。チョーありがと。 GPU Fortranで書こうかと思ってたけどCUDA Fortran高いからIntel FortranとMATLAB GPUでコードかくことにします。
531 名前:デフォルトの名無しさん mailto:sage [2011/05/09(月) 12:11:59.64 ] >>530 おっおっ ( ^ω^) MATLAB買う金あるなら、PGIのコンパイラをアメリカからダウンロードで買える気が・・
532 名前:デフォルトの名無しさん mailto:sage [2011/05/09(月) 15:51:02.97 ] >>531 MATLABは海外の大学にいるんだけど工学部全体でまとめ買いしてるからタダなんだわ。 どっちにしろ6000円くらいだよ、アカデミックだと。ツールボックスついてないから無意味だけど。 毎学期技術料で2万くらいとられるけどな!
533 名前:デフォルトの名無しさん mailto:sage [2011/05/09(月) 15:58:19.93 ] >>530 自分にスレだけどMATLABは完全にはAsynchronous I/Oに対応してなかった。。。 もうめんどくさいからC++で書こうかと思う・・・GPU CUDA C++サポートしてるし。 >>529 どちらにしろどうもありがと。
534 名前:デフォルトの名無しさん mailto:sage [2011/05/09(月) 21:59:14.34 ] >>532 アメリカにいるならWindows用のPGI Visual Fortranはただで使えるぞ。CUDAにも対応していたはず。 ttps://www.pgroup.com/purchase/freepvf.php 要件は自分で読んでくれw
535 名前:デフォルトの名無しさん mailto:sage [2011/05/10(火) 01:18:41.53 ] >>534 パソコン一台でしか処理できない点を除けばオールオッケー!
536 名前:デフォルトの名無しさん mailto:sage [2011/05/10(火) 01:42:15.10 ] >>534 注文した!やったね!たえちゃん!
537 名前:デフォルトの名無しさん mailto:sage [2011/05/10(火) 02:30:24.18 ] おっおっ ( ^ω^)<朕に感謝せよwww 日々、国民の皆様がすこやかに過ごされるよう切に願っておりますおっ!www
538 名前:デフォルトの名無しさん mailto:sage [2011/05/10(火) 12:53:33.66 ] fortran95を使ってます 今open、close文をやっているのですが、入力ファイルの作成方法がどんだけやっても、まったくわからないです 作り方もしくは参考になるサイトを教えてください
539 名前:デフォルトの名無しさん mailto:sage [2011/05/10(火) 22:45:52.34 ] openしたら入力ファイルは作成されます。
540 名前:デフォルトの名無しさん mailto:sage [2011/05/16(月) 13:36:38.03 ] fortran90使ってます 読み込んだファイルの列数を表示したいのですが、 なにかうまい方法はないですか?
541 名前:デフォルトの名無しさん mailto:sage [2011/05/16(月) 23:11:42.57 ] >>540 列の区切り文字はなんだ? というか、数えたい例を1行書いとくれ。
542 名前:デフォルトの名無しさん mailto:sage [2011/05/17(火) 13:32:11.97 ] >>541 区切りはスペースあけてます 例えばこんな感じです 1 1 2 6 5 17 18 22 21 2 2 3 7 6 18 19 23 22 3 3 4 8 7 19 20 24 23 4 5 6 10 9 21 22 26 25 具体的に言うと、この様なテキストを動的割付の2次元配列に入れたいのですが、 その時の列数と行数を知りたいといったところです。 行数はカウントできたのですが、列数の仕方がわからなくて・・・
543 名前:デフォルトの名無しさん mailto:sage [2011/05/18(水) 00:21:15.17 ] >>542 区切り文字が決まっているなら、割と簡単。 program vip implicit none character(136) :: text integer :: i, n read(9, '(a)') text n = count( transfer(trim(text), ' ', size = len_trim(text)) == ' ' ) print *, n end program vip
544 名前:デフォルトの名無しさん mailto:sage [2011/05/18(水) 00:42:20.64 ] コンマとかが区切り記号なら。 n = count( transfer(trim(text), ' ', size = len_trim(text)) == ' ,' ) transferで有限長の文字列を1文字の配列に直して、そして区切り記号の数を数えている。 欲しい数は、区切り記号の数+1個。 しか〜し、区切りが任意個のスペースの場合はめんどい。
545 名前:デフォルトの名無しさん mailto:sage [2011/05/18(水) 14:03:39.17 ] >>543-544 とても参考になりました! ありがとうございます
546 名前:デフォルトの名無しさん mailto:sage [2011/05/19(木) 02:12:10.20 ] 任意個空白区切りの場合(素朴法) & >>543 をやや敷衍した物。 1 1 2 6 5 17 18 22 21 データ例 module vip_m implicit none contains integer function idelim(text) character(*), intent(in) :: text integer :: i idelim = 0 do i = 1, len_trim(text) - 1 if (text(i:i) == ' ' .and. text(i+1:i+1) /= ' ') then idelim = idelim + 1 end if end do return end function idelim end module vip_m program vip use vip_m implicit none integer, parameter :: nmax = 136 character(nmax) :: text character(1) :: tmp(nmax) integer :: i, k, n, io read(9, '(a)') text tmp = transfer( trim(text), ' ', nmax ) n = count( tmp == ' ' ) print *, n, idelim(text) end program vip
547 名前:デフォルトの名無しさん mailto:sage [2011/05/24(火) 11:52:30.38 ] モジュール内で定義してある関数を、そのモジュール内のサブルーチンで使う時、 サブルーチンの頭で関数を宣言(real some_func)するとエラーになるようになtった のですが、これは仕様が変わったのでしょうか?
548 名前:デフォルトの名無しさん mailto:sage [2011/05/24(火) 23:16:29.04 ] >>547 そんな事はない。 実例を上げてみてくれ。
549 名前:547 mailto:sage [2011/05/25(水) 14:38:13.10 ] >>548 こんな感じです。「integer :: some_func」をコメントアウトすれば通るのですが。 使う関数名は型宣言するものだと思っていたのですが、勘違いでしょうか。 module some_mod contains integer function some_func(var) integer, intent(in) :: var some_func = var + 1 return end function some_func subroutine some_sub1() integer :: some_func integer :: i do i = 1, 10 write(6,*) i, some_func(i) end do end subroutine some_sub1 end module some_mod program func_test use some_mod call some_sub1() end program func_test
550 名前:デフォルトの名無しさん mailto:sage [2011/05/26(木) 03:48:00.92 ] >>549 勘違いしていた。宣言側ではなく、使用する側での話か。 F77時代っぽい書き方だよな。 F90 では、副プログラムに関しては、INTERFACE BLOCK を書くのが普通になったし、 MODULE にいれておけば、INTERFACE 書かなくていいから、考えたことがなかったw 症状からすると、INTEGER some_func で型宣言すると、EXTERNAL func が暗黙でついてしまうようだが・・・ よほど規格書を詳しく見ないと本来の動作がなんなのか分からん。 こうやって無理やり代替名を与えれば通るようにはなるがw integer function some_func(var) bind(c, name = 'SOME_FUNC') MODULE内の副プログラムでは、この手の宣言しないのが一番普通だと思う。
551 名前:547 mailto:sage [2011/05/26(木) 14:04:36.99 ] >>549 返信ありがとうございます。 とりあえずは、こういう宣言はしなくていいという事が分かって良かったです。 F90 の言語仕様をちゃんと勉強しようと思います。
552 名前:デフォルトの名無しさん mailto:sage [2011/05/28(土) 22:15:44.96 ] allocateにラッパを被せたいのだが、Fortran90の仕様では無理? 配列を割り付けて、そのポインタを返し、 返り値statを見て、エラー処理をしたいのだが。
553 名前:デフォルトの名無しさん mailto:sage [2011/05/28(土) 23:53:31.44 ] >>552 できるとおもうぞ。何を心配している?
554 名前:デフォルトの名無しさん [2011/05/29(日) 12:13:52.73 ] Assertion failed: ( (last != 0) || (node == 0)) && (tree[last>>TREE_SHIFT][last&TREE_MASK].next == 0), file err_treelib.c, line 256 とエラーが出てしまいます。 原因わかる人いたら教えてください
555 名前:デフォルトの名無しさん mailto:sage [2011/06/12(日) 12:20:40.57 ] LOGON TSS ナツカシすなあ
556 名前:デフォルトの名無しさん mailto:sage [2011/06/13(月) 03:02:14.80 ] メムバ、だっけ ディレクトリにあたるの
557 名前:デフォルトの名無しさん mailto:sage [2011/06/13(月) 21:07:17.53 ] フォートランをダウンロードしたいのですがどうすればいいのですか? 散々ググッたにもかかわらずよくわかりません。>< オススメのサイトがあったら教えてください。
558 名前:デフォルトの名無しさん mailto:sage [2011/06/13(月) 23:05:14.85 ] >>557 g95でも落としとけ。
559 名前:557 mailto:sage [2011/06/14(火) 00:59:45.55 ] g95は落としたのですがいざメモ帳にプログラムを書き込み 保存後、コマンドプロンプトで実行するとNo such file or directory とエラーメッセージが出ます。どうすればいいのでしょうか? ちなみにg95をタイプした後エンターキーを押すとNo input file と出るのでフォートランのダウンロードには成功していると思います。
560 名前:デフォルトの名無しさん mailto:sage [2011/06/14(火) 12:54:08.54 ] >>559 とりあえず、思いつくこと。 1.日本語の入ったディレクトリを避ける。 2.メモ帳でセーブするとき、拡張子がtxtにならないように” ”で括るなど注意すること。 3.g95 xxx.F90 のように拡張子も含めたファイル名を与えること。 こんくらい? しょぼい統合環境でいいなら、フォースを使えルーク。 force.lepsch.com/
561 名前:557 mailto:sage [2011/06/14(火) 18:47:00.65 ] ありがとうございます。 とりあえずやってみます。
562 名前:デフォルトの名無しさん mailto:sage [2011/06/17(金) 13:00:27.23 ] gfortran がタダだし 仕事場のマシンと自宅の私物Win機で 挙動がまあ同じでOpenMP使えるし デバッグやチェックがIntelのより 親切だから使ってるけど・・・ g95ってイイの?
563 名前:デフォルトの名無しさん mailto:sage [2011/06/18(土) 21:21:06.09 ] >>562 二つともフォークしたものだから、根本は変わらないのではないかと。 最近の様子は知らんが、g95はOOP機能を入れる方を優先していたが、gfortranはcoarrayとか並列化に熱心だったイメージ。 漏れのあやふやな記憶が正しければ、元々gfortranのオッサンがひとりでコツコツノロノロg77を90以降に拡張していたが、 gccとかとの統合の頃に、いろんな人が参入してスピードアップ。しかし、オッサンは方向性の違いからまた一人でやりたくなって フォークした。
564 名前:デフォルトの名無しさん mailto:sage [2011/06/20(月) 22:58:10.97 ] ガチ初心者です。 c chouwashindoushi psi v no kaisekikai c bm:kansanshitsuryou bar:h-bar implicit real*8(a-h, o-z) c constants bm=1.0d0 fk=1.0d0 ome=sqrt(fk/m) bar=1.0d0 … と打ち込んで(値は適当ですが)コンパイルしようとしたら エラーメッセージに bm=1.0d0 … ^ Invalid form for assignment statement at (^) と出てきました。 何がエラーなのかわかりません! どう問題なんでしょうか?
565 名前:デフォルトの名無しさん mailto:sage [2011/06/20(月) 23:40:14.99 ] 一行一ステートメント 一期一会な >bm=1.0d0 fk=1.0d0 ome=sqrt(fk/m) bar=1.0d0 bm=1.0d0 fk=1.0d0 ome=sqrt(fk/m) bar=1.0d0
566 名前:デフォルトの名無しさん mailto:sage [2011/06/30(木) 15:34:22.41 ] 564です。 返事が遅れましたが、、、 助かりました!感謝です!
567 名前:天使 ◆uL5esZLBSE mailto:sage [2011/07/03(日) 12:30:46.83 ] >>566 -------------------- [[[[[[[ 返事が遅れましたが、、、 ]]]]]]](きリッッッッ!!!! ----(きリきリッ ---- [[[[[[[[[[[[ 助かりました!感謝です! ]]]]]]]]]]]](きリッ!!キリッッ!キリッッ!!きリ!!!ッッッッ!!! 本当にバカだな
568 名前:デフォルトの名無しさん [2011/08/23(火) 17:07:46.74 ] フォートランをやりはじめたばかりの超初心者です サブルーチンに引数として渡すものと、 モジュールで渡すものはどういう根拠で区別すればいいんでしょうか? 全部引数で渡すこともできるとは思うのですが、 モジュールも組み合わせた方が良い場合もあるんだろうと思います 最初のうちに正しい渡し方を覚えておきたいので...
569 名前:デフォルトの名無しさん mailto:sage [2011/09/07(水) 00:55:33.07 ] program quadeq real a,b,c,d,x1,x2,rpart,ipart read(*,*) a,b,c d=b**2-4*a*c if(d.ge.0) then x1=(-b+sqrt(d))/(2*a) x2=(-b-sqrt(d))/(2*a) write(*,*) 'x1=',x1,'x2=',x2 else rpart=(-b)/(2*a) ipart=sqrt(-d)/(2*a) write(*,*) 'real_part = ',rpart,' ', 'imaginary_part = ',ipart end if end コンパイルできないとです;; 原因を教えてください
570 名前:デフォルトの名無しさん mailto:sage [2011/09/07(水) 12:23:27.06 ] Intelのコンパイラ最新版 インストーラでエラーでるんだけど、同じ症状の人いない? たぶん .net Ver.4 絡みだと思うんだけど、インストールしてもうごかん・・・ 英語版と日本語版の違い? VS2010でEDITORの補助が増えたらしいので興味あるんだが・・
571 名前:デフォルトの名無しさん mailto:sage [2011/09/07(水) 12:35:26.37 ] >>569 >'imaginary_part = ',ipart この行を前の行び後ろに続けて1行とするか、6カラム目に継続記号を入れればおk。
572 名前:デフォルトの名無しさん mailto:sage [2011/09/10(土) 20:25:14.21 ] >>568 個人的な考えで回答します。 基本的に、引数として渡す方がプログラムが見やすいと思います。 見やすいということが非常に大切です。 モジュールとしてまとめてしまうと、別の場所(そのサブルーチンとは離れた場所)に 宣言が書かれることになるため、変数が何を意味しているのか、そのサブルーチン独自の 変数なのか、などがぱっと見てわかりにくくなる恐れがあります。 特に、大規模なプログラム、サブルーチン毎に一つのファイルに分けているような 場合には、そのように感じます。 ただ、引数として並べたときに数行になってしまうくらいに引数が多い場合には、 モジュールを利用した方がいいかもしれませんが、その場合でも、サブルーチンを 呼び出すごとに変化するような変数は引数として渡した方がいいでしょう。 一方、全プログラムが一つのファイルに収まってしまうくらいに小規模なものは、 サブルーチンを一つのモジュールの中に入れてしまう方がいいでしょう。ただし、 その場合でも、なるべく引数を使って渡す方がいいと思います。
573 名前:デフォルトの名無しさん mailto:sage [2011/09/11(日) 02:21:13.88 ] 超絶初心者です。 学校のパソコンでfortran77を使っており、自宅のパソコンでもできるようにコンパイラをダウンロードしようとしたのですが、 Salford FTN77 Personal Edition Compilerをインストールする途中で止まってしまいます。 WinZip Self-Extractor-ftn77pe.exeというウインドウのSetupを押したっきり変化がありません。 エディタは学校でCpadを使っているので自宅のパソコンにもダウンロードしたのですが、コンパイラがうまくダウンロードできているのかもわからず コンパイラのパスもわからず、どうしたらよいのかわかりません。 いろいろ調べてはみたのですが…
574 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 10:38:07.44 ] >>572 大変参考になりました、ありがとうごさいます
575 名前:デフォルトの名無しさん [2011/09/15(木) 19:36:21.15 ] fortran 77使ってますが、C++からfortranの関数を呼び出すコードのコンパイルを試みてます。 f77 -c -o main.o main.f f77 -c -o sub.o sub.f g++ -c Jikkou.cxx g++ main.o sub.o Jikkou.o -lg2c するとここで、以下のようなエラー吐きます。 main.o: In function `main_': main.f:(.text+0x12c): undefined reference to `ran_' main.fの中で、乱数出す為にRAN()を使ってるんですが、g++はこの関数が分からないようです。 どうにかg++にRAN()を分からせる方法はありませんか?
576 名前:デフォルトの名無しさん [2011/09/15(木) 22:14:27.19 ] >>575 おれにはわかRAN(笑) なんつって( ^ω^)
577 名前:デフォルトの名無しさん mailto:sage [2011/09/16(金) 02:19:18.16 ] www rand() で試すか・・・乱数生成くらい自分でつくれ。
578 名前:デフォルトの名無しさん mailto:sage [2011/09/16(金) 02:39:47.42 ] >>575 CからのFortran呼び出しでは、サブルーチン名の規約が処理系によって異なるのでマニュアルを良く読むしかない。 頭にアンダースコアがついたり、全部大文字になったり、引数のバイト数が尻についたり千差万別。 コレをエレガントに避けるにはFortran2003の、C呼び出し規約互換の命令があるのでそれを使うべし。 ただいまの場合、Fortranのライブラリをリンクしていないだけもするので、まあマニュアル読んで頑張れ。 安直な手としては、Fortran90の乱数ルーチンを呼べば外部ライブラリ絡みの厄介は避けられると思う。
579 名前:デフォルトの名無しさん mailto:sage [2011/09/18(日) 15:43:36.04 ] Intel Fortran Compilerを使っています。 ファイルから数値を読みとり、配列に値を代入したいのですが、NaNが含まれるためか 「forrtl: severe (24): end-of-file during read, unit 12」 というエラーが出て実行できません。うまく読み取らせる方法はないでしょうか。 real(8) a(100), b(100), c(100), d(100) do i = 1, 100 read(10,*) a(i), b(i), c(i), d(i) enddo 0.1000E+00 0.1234E+01 0.0000E+00 NaN 0.2000E+00 0.5678E+02 0.0000E+00 0.0000E+00 …… 1.0000E+01 0.3456E+04 0.0000E+00 NaN
580 名前:デフォルトの名無しさん mailto:sage [2011/09/18(日) 17:40:25.57 ] 文字列として読めばいいんじゃない?
581 名前:デフォルトの名無しさん mailto:sage [2011/09/18(日) 17:42:08.70 ] あるいは書式に'err=行番号'をつけるとか
582 名前:デフォルトの名無しさん mailto:sage [2011/09/18(日) 18:58:07.35 ] >>580 文字列として読み込めばできました。 ありがとうございました。
583 名前:デフォルトの名無しさん mailto:sage [2011/09/22(木) 23:50:22.17 ] >>579 は本当にそれで解決できたのか? 読み込んだ数値をどう使うのか知らないけど、自分には、 なんで文字列として読み込んで満足できるのかワカラン
584 名前:デフォルトの名無しさん mailto:sage [2011/09/23(金) 07:22:58.89 ] >>579 , 582さん エラーの内容は、基番12のファイルの最後以降を読み込もうとした、 ということ。基番10の'NaN'の読み込みのことではありません。 別の原因、別の場所でエラーが発生していると思います。 本当に解決したの? 583さんと同意見です。
585 名前:デフォルトの名無しさん mailto:sage [2011/10/14(金) 15:08:01.82 ] 4次元配列を2次元に配列にまとめたいのですが、 The shapes of the array expressions do not conform.と出てコンパイルできません なにかうまい方法ってありませんか? 具体的には do i = 1, 10 do j = 1, 10 do k = 1, 100 do l = 1, 100 y(i,j) = y(i,j) + x(k,l,i,j) enddo enddo enddo enddo といった計算を行いたいのですが・・・
586 名前:デフォルトの名無しさん mailto:sage [2011/10/14(金) 19:32:03.42 ] 「4次元配列を2次元に配列にまとめたい」っていう目的と 実際に提示されているコードが自分には結びついていないけど、 配列変数の定義で配列の次元やサイズはちゃんと書いた? real(8) :: x(100, 100, 10, 10) real(8) :: y(10, 10) みたいな記述が必要だと思うけど。
587 名前:デフォルトの名無しさん mailto:sage [2011/10/14(金) 22:21:27.51 ] >>586 配列の定義はしてあります x(k,l,1,1)のkとlの合計10000個の数をy(1,1)に足しこんで 次はx(k,l,1,2)のkとlの合計10000個の数をy(1,2)に足しこんで といった具合にプログラムを書きたいです 説明下手ですいません
588 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 11:16:16.24 ] >>585 で何が不満なんだ。 f95バリバリならこうか?FORALLはうんこ機能と言われているがw program Console1 implicit none ! Variables real :: y(10, 10), x(100, 100, 10, 10) integer :: i, j ! Body of Console1 y = 0.0 x = 1.0 forall (i = 1:10, j = 1:10) y(i, j) = y(i, j) + sum( x(:, :, i, j) ) print *, y(1, 1) stop end program Console1
589 名前:デフォルトの名無しさん [2011/10/15(土) 11:53:28.33 ] forall ってウンコというか 使い間違いし易いのよね。 最初の4重doループグリグリでいいと思うけどね。 コンパイラが勝手に最適化してくれるだろうし。
590 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 14:31:44.29 ] PGI Visual Fortran 11.9 のコマンドラインでのコンパイルについて質問です。 以下のようなソースコード goodbye.f90 を作りました program goodbye write(*,*) 'Good-bye' stop end program goodbye これを C:\tmp\に保存して c:\tmp>pgf90 goodbye.f90 と打ったのですが,カーソルが次の行に行って点滅するだけで, コンパイルはされませんでした。 何がまずかったのでしょうか?
591 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 20:06:47.41 ] >>590 それだけでは分からんw まぁ、end program goodbye の後ろで改行しないまま、end of file に成っている可能性があるかな。
592 名前:590 mailto:sage [2011/10/15(土) 20:33:05.02 ] >>591 レスありがとうございます。 改行はしてありました。 なお,コンパイルを Ctrl + C で強制終了すると, cleaning up after signal(2) というメッセージが表示されます。これについても意味が分からないです。
593 名前:デフォルトの名無しさん mailto:sage [2011/10/15(土) 21:33:14.03 ] >>592 それは強制終了の事後処理というメッセージだろう。 症状としては、end of file が見つからない感じだから、ctrl−Zないしctrl−Dあたりをうってみたらどうかな?
594 名前:590 mailto:sage [2011/10/23(日) 09:32:01.77 ] >>592 報告が遅れすみません。 再々インストールを行ったら,治りました。 ソフテックに訊いたら,ウイルス対策ソフトがブロックしていたらしいです。
595 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 11:15:17.50 ] >>594 そういえば一時期ノートン先生がIntelVisualFortranの実行ファイルを削除しまくって閉口したことがあったわ。
596 名前:こうちゃん [2011/10/24(月) 15:56:38.58 ] mixi.jp/view_bbs.pl?id=65775704&comment_count=0&comm_id=88243 mixiしてる方に質問させていただきます。 この拡散方程式を種々の初期条件、境界条件のもとに解くことによって、 横軸:時間、縦軸:ペイント全体の濃度合計 →ペイント全体の濃度の合計の時間変化を fortranにてプログラム化できますでしょうか。。。
597 名前:デフォルトの名無しさん mailto:sage [2011/10/25(火) 13:20:38.16 ] >>596 具体的にとこで困ってるんですか? 離散化とか、境界条件の設定とか、具体的に言ってください。 あとインプリシット、エクスプリシットどちらで解くつもりですか?
598 名前:こうちゃん [2011/10/25(火) 14:38:30.82 ] >>597 さん 拡散方程式(2階偏微分方程式)の離散化は自分で行えます。 その拡散方程式を種々の初期条件、境界条件で解くプログラム が作りたいのです。 私がわからないのは、拡散方程式や種々の条件をfortranにて示す方法が まったくわかりません。。。 周りに相談できる方がいないので本当に困っています↓↓ この問題は、「ある気体を透過しない母体に、気体透過性のペイント を貼った場合、その透過性のペイントの表面の気体濃度を正弦的に変化 させた場合、ペイント内部ではどのように気体濃度が変化していくか ということを見るためのプログラム」作りたいのです。 言い換えるならば、縦軸:ある時間におけるペイント全体の濃度の合計 横軸:0<=t<=tm(tm→とりうる時間の最大値) を作りたいのです。
599 名前:デフォルトの名無しさん [2011/10/25(火) 21:45:10.83 ] >>597 とは違うけど、インプリシット(陰解法、連立方程式を反復的に解く) とエクスプリシット(陽解法、中心差分のように、漸化式を反復的に繰り 返して解く?だったっけ。もう、忘れた)の意味わかってます? プログラムを作成する前段階のアルゴリズムの定式化は本当にできて いるんですか? 定式化ができた上で、fortaranでの表現法がわからないというのなら fortranの勉強をするべきだと思うけど。 もうMATLABを使ったらと思うけど、取り組んでる問題をみるとMATLAB ではヘタすると数日、計算がかかるかもしれませんね。
600 名前:デフォルトの名無しさん mailto:sage [2011/10/26(水) 01:11:16.64 ] 離散化ができているなら、流動方程式を解くプログラムに、拡散項を組み込むだけですから、そんなに難しくないと思います 流動方程式のプログラムなら適当な参考書にあると思います...
601 名前:デフォルトの名無しさん mailto:sage [2011/10/26(水) 01:23:50.06 ] あと、境界条件が不安のようですけど、ディリクレ境界条件のようですから、ポイントセントラルでプログラムを組めば少しらくだと思います
602 名前:名無しのごんべ [2011/10/26(水) 13:42:02.36 ] const int N = 100; const double q = 10.0, dt = 0.00001, Dm = 30.0, t0 = 2.0, K = 1.0, pi = 3.141592, f = 3.0; double C[N], dC[N]; double dx = q/N; for (int i = 0; i < N; ++i) C[i] = 0; // 初期条件 for (double t = 0; t < t0; t += dt) { C[0] = 0; // 境界条件1 C[N - 1] = K*sin(2*pi*f*t); // 境界条件2 for (int i = 1; i < N - 1; ++i) dC[i] = (Dm*(C[i + 1] - 2*C[i] + C[i - 1])/(dx*dx))*dt; for (int i = 1; i < N - 1; ++i) C[i] += dC[i]; } for (int i = 0; i < N; ++i) cout << C[i] << endl; // t = t0 を誰かfortranに変換できる人いますか?
603 名前:こうちゃん [2011/10/26(水) 13:48:33.22 ] 返信ありがとうございます。 1ふぉrtr
604 名前:こうちゃん [2011/10/26(水) 13:58:15.26 ] 返信ありがとうございます。 fortran始めたばかりなので正直知識不足は否めないです。 おそらくエクスプリシットだと思います。 アルゴリズムの定式化についてはまだ研究初期段階なので今後 修正する可能性はあります。 修正に応じてプログラムの方も修正する予定なのですが、 まずベースとなるプログラムが欲しくて、 このような投稿になってしまいました。 不快でなければ協力のほうをよろしく お願いいたします。
605 名前:デフォルトの名無しさん [2011/10/26(水) 22:52:54.29 ] soudan1.biglobe.ne.jp/qa7094085.html
606 名前:デフォルトの名無しさん mailto:sage [2011/10/26(水) 22:57:26.57 ] program vip implicit none integer, parameter :: n = 100 real(kind = 8), parameter :: q = 10.0d0, dt = 0.00001d0, dm = 30.0d0, t0 = 2.0d0, k = 1.0d0, f = 3.0d0 real(kind = 8), parameter :: pi = 4.0d0 * atan(1.0d0) real(kind = 8) :: c(n), dc(n), t, dx integer :: i dx = q / n c = 0.0d0 t = 0.0d0 do if (t > t0) exit c(1) = 0.0d0 c(n) = k * sin(2.0d0 * pi * f * t) forall (i = 2:n - 1) dc(i) = dt * dm * ( c(i + 1) - 2 * c(i) + c(i - 1) ) / dx**2 c = c + dc t = t + dt end do write(*, *) c stop end program vip 正しいかどうかは知らんw
607 名前:名無しの [2011/10/27(木) 13:30:21.02 ] デフォルトの名無しさんへ ありがとうございます!!!もとになるベースがないので本当に 困っていました↓↓ 返信大変うれしいです!!!
608 名前:デフォルトの名無しさん mailto:sage [2011/10/27(木) 16:47:39.60 ] >>604 ,607 二度と書き込むなよ、このクズ野郎
609 名前:デフォルトの名無しさん mailto:sage [2011/10/27(木) 17:21:38.36 ] どこのスレも変なのがうろついてんな
610 名前:デフォルトの名無しさん [2011/10/27(木) 18:21:51.17 ] 困っちゃん
611 名前:デフォルトの名無しさん mailto:sage [2011/10/27(木) 23:34:13.99 ] 枯れ木も山のにぎわいってことでw
612 名前:デフォルトの名無しさん [2011/10/28(金) 22:27:40.95 ] >>608 お前の方が余程クズで二度と書きこむなよ、と思うけど。 あと、死ね
613 名前:デフォルトの名無しさん [2011/11/08(火) 00:40:01.34 ] 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に変換もしていただきたいです。。。 重複と長文同時に失礼いたしました。 図はqanda.rakuten.ne.jp/qa7112807.html にあります。 全開質問に答えていただいた方、本当にありがとうございました。
614 名前:デフォルトの名無しさん [2011/11/08(火) 01:36:34.98 ] c++ はよくしらんが、} が複数個欠けてるような。 エディタはたいてい対になる(){}[] を色で表示してくれるので、それを助けに頑張れ。 Courant 条件は・・ (1/2) (dx*dx) / Dm= 0.5 *(0.1)^2 / 30.0 > dt なので、よさげ。{}対をチェックしたら、ちゃんと走ると思うよ。
615 名前:デフォルトの名無しさん mailto:sage [2011/11/08(火) 02:33:21.56 ] >>613 Fortran95への移植。内容は見ていないw Sinカーブのように振動しているから、まぁこんなもんではないか? program vip implicit none ! Variables integer, parameter :: n = 100 real(8), parameter :: q = 10.0d0, dt = 0.00001d0, dm = 30.0d0, t0 = 2.0d0, & k = 1.0d0 , pi = 4.0d0 * atan(1.0d0), f = 3.0d0 real(8) :: c(n), dc(n) real(8) :: dx, t, s, s_prev integer :: i ! Body of Console3 dx = q / n c = 0.0d0 t = 0.0d0 s_prev = 0.0d0 do while( t < t0 ) c(1) = c(2) c(n) = k * sin(2.0d0 * pi * f * t) forall(i = 2:n - 1) dc(i) = (dm * (c(i + 1) - 2 * c(i) + c(i - 1)) / dx**2) * dt c = c + dc s = sum(c) * dx write(9,*), 't=', t, (s - s_prev) / dt s_prev = s t = t + dt end do end program vip
616 名前:デフォルトの名無しさん [2011/11/08(火) 03:05:16.60 ] >>615 のバファリンのようなやさしさに感動した
617 名前:デフォルトの名無しさん mailto:sage [2011/11/08(火) 03:36:37.44 ] >>615 の人に質問 DO文ではなくFORALL文を使った理由は何ですか?
618 名前:デフォルトの名無しさん mailto:sage [2011/11/08(火) 09:49:56.87 ] >>617 1行で書けるから。
619 名前:デフォルトの名無しさん [2011/11/08(火) 16:58:07.44 ] f90とf95ってまったくコードの違うものなのですか?
620 名前:デフォルトの名無しさん mailto:sage [2011/11/08(火) 19:28:23.09 ] >>619 f95 は f90 の小改訂版。Fortran は f90 以降、メジャーウップデートと マイナーウップデートを交互にやることになってる。f95 は f90 を使ってみて いや〜んな点を、かゆいとこに手が届くように修正してある。 あと変なの湧くからsageろよ。
621 名前:デフォルトの名無しさん mailto:sage [2011/11/08(火) 23:12:35.84 ] >>620 交互にマイナーとメジャーのアップデートとのことですが、 それなら、今のJIS規格であるFortran2003はメジャーアップデート みないなものなのでしょうか。
622 名前:デフォルトの名無しさん mailto:sage [2011/11/09(水) 00:48:56.02 ] >>621 F2003はメジャーアップデートどえす。 目玉はオブジェクト指向の要素の導入ですが、その他色々便利な改良もあります。 でもあまりに欲張り過ぎて、まだ完全装備のコンパイラが殆ど無いという事実w ちなみにF2008はマイナーアップデートのはずなのに、coarrayのような並列化命令が入った規格が確定した。
623 名前:デフォルトの名無しさん [2011/11/09(水) 01:31:06.92 ] coarray よさげだよね。 でも完全装備は先かな・・・intel はやる気あるみたいだけど。 >>615 ほどんど重箱隅レベルだけど、個人的には c(:) = c(:) + dc(:) s = sum(c(:)) * dx と配列であることを明示したい。・・・ドツボ防止策。
624 名前:デフォルトの名無しさん mailto:sage [2011/11/09(水) 02:21:30.12 ] intel は coarray 結構実装してきてるんじゃない? サンプル以外試してないから詳細は分からんが。 c(:)の配列明示は理念としては理解できるし、f77から移行してきたばかりの昔はやっていたのだが、 f90初期の頃、処理系によってはコロン指定子がつくと無条件にコピーを作って作業して戻すという事をするので、 最適化の観点からなんとなく避けるようになってしまった。最近の処理系はそういうことはしなくなったようだが・・・ サブルーチンの引数でも、生で書くとそのまま渡すが、コロンがつくとcopy in / copy out になって最適化が落ちるとか、 c(0:n) の場合、生で渡すとサブルーチン側でも配列は0から始まるが、コロンがつくとコピーが渡るので1から始まるとか、 その辺の規則がよく分からなっかったので、なんとなく惰性で配列明示しないで生で行ってるw
625 名前:デフォルトの名無しさん mailto:sage [2011/11/09(水) 09:07:31.97 ] >>624 ためになった。 ついでに質問。coarray って分散メモリのシステムでもOKなのかな? MPI とどちらがいいのかなとか、知ってたら書いて。
626 名前:デフォルトの名無しさん mailto:sage [2011/11/09(水) 09:52:45.36 ] >>625 coarray は分散メモリーシステム用だな。 MPIより簡単で同等の性能が出るという主張をしている感じ。 分散メモリーマシン時代になってからのクレイが熱心にやっていて、それが規格に導入された?
627 名前:デフォルトの名無しさん [2011/11/09(水) 10:02:29.00 ] うん
628 名前:デフォルトの名無しさん [2011/11/09(水) 13:18:34.43 ] >615さん ではf90に書き直すとそう変わるのですか??
629 名前:デフォルトの名無しさん mailto:sage [2011/11/09(水) 13:34:19.14 ] ほぼ>>615 に等価だと思う。
630 名前:デフォルトの名無しさん mailto:sage [2011/11/09(水) 21:34:09.30 ] >>626 coarrayて分散メモリー用なの? www.xlsoft.com/jp/products/intel//compilers/fcl/12/comp-for-lin/comp/tutorial/tutorial-4/co_t4b.htm#co_t4b のサンプルを見ると、OpenMP拡張とは混在できないとか書いてあるので、 てっきり、SMP用かと思っていた。
631 名前:デフォルトの名無しさん mailto:sage [2011/11/10(木) 04:41:06.41 ] なんか前に ノード内の共有メモリ空間でも OpenMP で書くより ノード間も含めてもう全部 MPI でやり取りした方が、 速い(+楽!)という意見があったような。 なんだろう、共存が面倒な割にはパフォーマンスがあんまりなので もうしない、という事なんだろうか?
632 名前:デフォルトの名無しさん mailto:sage [2011/11/10(木) 09:40:57.33 ] >>630 coarrayでググるとCrayのパワポとか出てくるから味噌。 現今のcoarrayは結局MPI上に実装されているので、MPI利用した簡便並列という感じ。
633 名前:デフォルトの名無しさん mailto:sage [2011/11/10(木) 14:32:48.86 ] 単純な仕事の分割の場合、MPI で書いた並列プログラムは ループの前後に冗長に似た行が続くだけだから、その部分の追加を ちゃっちゃとやってくれるのなら、うれしいね。
634 名前:デフォルトの名無しさん mailto:sage [2011/11/12(土) 09:53:04.14 ] Open/MPはスレッド並列だが、MPIやCo-arrayはプロセス並列になってる。
635 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 02:01:49.79 ] gfortran, バージョン4:4.4.5-1 に関する質問です。 モジュールのバージョンが違うとかで下記のエラーメッセージが出てきます。 Fatal Error: Parse error when checking module version for file 'functions.mod' これってどう解決すればいいですか?
636 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 09:38:55.28 ] コンパイルしなおせ
637 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 11:43:56.21 ] >>636 え?コンパイルしようとするとこのエラーが出るんですけど gfortran hogehoge.f90 ってな具合です
638 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 13:26:47.01 ] functions.mod というのは、module functions がコンパイルされたときに生成されるインターフェース情報のファイルで これのversion が違うというのだから、これをもう一回コンパイルするべきじゃないかと思う。 最近gfortranをversion upしていたりするならよくある事。 そうでないならば、情報が足りなすぎてなんとも言えない。
639 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 15:05:06.19 ] >>638 あ、そのとおりです。 しかもフォートランを最近うぷしました。 これってuse mod名をメインプログラムに書き込む前に、一度コンパイルしてmodファイルを作成しなくてはいけないということですよね?
640 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 15:30:47.59 ] >>635 Debianスレでも聞いてるじゃねーか
641 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 16:06:52.35 ] >>640 え?聞いてないよ。 今確認したらコピペされててビビった。 信じて
642 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 18:34:27.25 ] 関連するファイルを全部コンパイルしなおせ。
643 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 23:07:26.77 ] たかだか1行の英文エラーメッセージ。単語11個くらい字引で引けや!インテリの端くれだろw ピカチュウの鳴き声を解釈するより易しいだろ。 それで解決したのか?
644 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 00:08:20.43 ] >>643 解決致しました。アニキ 一度プログラム中のuse (mod名) 部をコメントアウトし、コンパイルすることでモジュールファイルを生成。 その後コメントアウトした部分を復活させて、再度コンパイルしたら無事できました
645 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 00:09:24.94 ] >>643 それにしてもググってもこれと同じ症例があまりなかったのに驚いた。 みんなどうしてるのかな〜
646 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 01:52:49.26 ] module functions も、引用する program と一緒のファイルに入れてるのか? それなら、program の前に来るようにして先にコンパイルされるようにすれば問題ないと思うぞ。 gfortran使ってないから分からんが常識的にはそれでおk。 それが駄目なら、ファイルを別々にして分割コンパイルすればよろし。
647 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 02:29:33.32 ] >>646 アニキありがとうっす! それやってみます。
648 名前:デフォルトの名無しさん mailto:sage [2011/11/17(木) 01:36:56.07 ] アニキとサブとファンクチオン
649 名前:デフォルトの名無しさん mailto:sage [2011/11/17(木) 01:50:11.34 ] program moho implicit none logical:: asshappy logical external:: playresult asshappy=.false. call meet_my_aniki() do while (.NE. asshappy) asshappy=playresult() enddo end program moho
650 名前:デフォルトの名無しさん mailto:sage [2011/11/17(木) 11:17:01.88 ] REAL GAY COMMON //ASS, HOLE IF ( ANIKI .AND. SUB ) GOTO 69 69 CONTINUE END
651 名前:デフォルトの名無しさん mailto:sage [2011/11/17(木) 13:29:32.36 ] >>649 (.NOT. asshappy) >>650 リアルホモw でもその文だとなにも変化がないような気がする。
652 名前:デフォルトの名無しさん mailto:sage [2011/11/17(木) 13:36:30.70 ] 今だにGOTO文使ってるとかおっさんかよw
653 名前:デフォルトの名無しさん mailto:sage [2011/11/17(木) 15:18:34.17 ] \ / .::::::::::::::::::::::::;;:;;::,ッ、:::::: ) く ホ す \ l ,ッィrj,rf'"'"'" lミ::::::: く れ モ ま Y ,!ミ::::::: ヽ な 以 な `ヽ、 | くミ:::::::: ノ い 外 い |、__ ャー--_ニゞ `i::::,rく か は ``''ー- ゝ、'l  ゙̄´彑,ヾ }::;! ,ヘ.) ! 帰 ゙ソ """"´` 〉 L_ っ / i , /| て r ≡=- 〈´ ,,.._ i 't-'゙ | ,へ ,r┘ ,、yx=''" `ー{゙ _, -、 ; l レ' ヽr、⌒ヽ' ゙、`--─゙ /! `、 _,,、- ゙、 ー'' / ; `、 -''"_,,、-''" ゙、 /;;' ,' / 、\ -''" / `ー─''ぐ;;;;' ,' ノ // / ヾ_、=ニ゙
654 名前:デフォルトの名無しさん mailto:sage [2011/11/17(木) 15:46:29.13 ] まさかfortranスレでこのAAを見ることがあるとは
655 名前:デフォルトの名無しさん mailto:sage [2011/11/18(金) 19:28:32.69 ] GO TO文に怯えるとは、まだまだ坊やだな。 後藤おじさんが手ほどきしてあげよう。 まず全裸になれ。
656 名前:デフォルトの名無しさん mailto:sage [2011/11/19(土) 12:34:10.85 ] なりました。 つっ次はどうすればいいのでしょうか?
657 名前:デフォルトの名無しさん mailto:sage [2011/11/19(土) 17:28:08.28 ] >>656 次はションベンだ! program o2chan implicit none character(10) :: siri call sub( siri ) print *, siri stop contains subroutine sub( anal ) character :: anal(*) anal(1:10) = transfer('しょんべん', 'a', 10) end subroutine sub end program o2chan
658 名前:デフォルトの名無しさん mailto:sage [2011/11/20(日) 02:00:27.66 ] ∧∧ (д`* ) (⊃⌒*⌒⊂) anal(*) /__ノωヽ__)
659 名前:デフォルトの名無しさん mailto:sage [2011/11/27(日) 18:28:07.12 ] みなさま、はじめまして。 趣味でとある連続計算をしています。 いままで、連立一次を解くサブルーチンをつかっていたのですが、 わけあって逆行列単体でシンプルなサブルーチンが必要となりました。 ネット上にN×Nの非対称行列を逆行列にして返してくれるサブルーチンってありますでしょうか? ご存知なら教えてくださいませ。
660 名前:デフォルトの名無しさん mailto:sage [2011/11/27(日) 18:49:52.55 ] LAPACK?
661 名前:デフォルトの名無しさん mailto:sage [2011/11/27(日) 19:27:54.23 ] >>659 逆行列は、Ax=bのbに(0010..0)のたぐいの単位ベクトルをn本入れて計算するのが基本だぞ。 LU分解のサブルーチンでやればn回繰り返すのも楽勝だ。
662 名前:デフォルトの名無しさん mailto:sage [2011/11/27(日) 22:21:47.18 ] >>660 ぐぐってみました。 ソースがHTMMLでUPされてないと、見る気になりませんでした。 すみません。 fortran 逆行列 でぐぐって一番上にでてきたサイト(とある大学の先生のページ)の 「逆行列を求めるサブルーチン」 を実行したんですが、配列異常のエラーが出ました。
663 名前:デフォルトの名無しさん mailto:sage [2011/11/27(日) 23:04:56.69 ] 連立一次を解くプログラムがあれば、それで逆行列くらい求まるだろ。 それが逆行列を求める定石だぞ。 単位行列のを、1列ごとに連立一次を解いて、それを行列の列が尽きるまで繰り返す。 出てきた答えを、列ベクトルとして並べたものが逆行列だ。 ネットで探して見つからないのは、そうやって計算するから、一次方程式のサブルーチンがあれば十分だからだ。 あるとしても、単に1次方程式を解くルーチンを呼び出すルーチンになってるだけ。 特にLU分解で連立一次方程式を解いてあると、毎回一から解くのではなく、前回の途中経過が利用できるので早く済む。 計算量はN^3に比例するので大きい時はLU分解使わないのは非常識。 問題が小さければ、好きな方式でやっておk。計算法にこだわるほうが非常識。
664 名前:デフォルトの名無しさん [2011/11/28(月) 05:47:09.06 ] くりゅろふ法自作試みて結局投げだして ガウス消去に逃げた事があるw 逆行列計算は奥深いよね。 いまでも計算科学ではメインのテーマの一つ。 で、やっぱりLapack とか MKL とか、かな
665 名前:デフォルトの名無しさん mailto:sage [2011/11/28(月) 23:09:42.87 ] LU分解とか一列ごとに解くとか言ってるけど、直接法ならまとめて解けばいいと思うよ。AX=BのBを単位行列にすれば良いだけの話。
666 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 20:59:03.41 ] inplicitrial*8 とかまだやってるやついるの?
667 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 23:34:15.98 ] 綴り間違えすぎw それに implicit real*8(a-h,o-z) だろw 耄碌しすぎだぞ爺さん。 今のヤングは implicit none で A'GoGo!!
668 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 04:38:02.29 ] さらにヤングwだと コンパイルオプションで暗黙の型宣言は消去!
669 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 21:48:44.74 ] ttp://ksirius.kj.yamagata-u.ac.jp/~shibata/kbg/invmx.f このプログラムを参考にしています implicit real*8(a-h,o-z) double plicision で書きなおしたら、しっかり計算されません。 どうしましょ
670 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 23:52:39.47 ] >>669 全く見ていないがw よくあることなので推測で書くwww 常数のたぐいは手で1.0から1.0d0のように倍精度に直していないからだろう。 特に収束判定に絡んでくると、単精度のままだとゴミビットが入って精度が腐る。
671 名前:デフォルトの名無しさん mailto:sage [2011/12/02(金) 00:01:11.84 ] その前にスペルミスを突っ込みたい。 コンパイルはできたんか?
672 名前:デフォルトの名無しさん mailto:sage [2011/12/02(金) 01:19:07.07 ] すみません1.0d0と1.0_8はなにか違いますか
673 名前:デフォルトの名無しさん mailto:sage [2011/12/02(金) 07:51:24.55 ] >>672 kind種はベンダー依存なので、今の機種でkind=8が倍精度を意味しているからといって 他の機種でそうなるとは限らない。 ただ世間の慣例としてバイト数を置いていることが多いので、大抵は同じ意味。 もっとも上品にはKIND種をパラメータ変数にしておく。日本NAGの書き方推奨ページに行くとグダグダ書いてある。
674 名前:デフォルトの名無しさん mailto:sage [2011/12/04(日) 03:41:53.09 ] オークションシミュレーションのプログラムを作りたいのですが、シミュレーション作成ならfortranだと聞きここにたどり着きました しかし、一体何から始めればいいのかもわかりません なにかアドバイスをしていただけませんか? 一応C言語なら基本は理解しています
675 名前:デフォルトの名無しさん mailto:sage [2011/12/04(日) 11:16:32.16 ] www Fortran にできて C にできないことは少ないので、 C で頑張る、でいいのでは? Fortran は・・・ 古い分、蓄積(タダのライブラリとかが豊富)な点 出来ることが少ない分、コンパイラが最適化しやすい事もあるw 教官がそれしか知らんw ・・・あたりがが学術計算によく使われる理由なのではないだろうか。 お好きな言語でどうぞ。
676 名前:デフォルトの名無しさん mailto:sage [2011/12/04(日) 12:44:25.90 ] 周りに聞ける人がいないなら、ユーザの多い言語がいいよ。 結構な計算するならc++で、簡単な計算ならpythonで良いと思われる。
677 名前:デフォルトの名無しさん mailto:sage [2011/12/04(日) 13:22:39.02 ] >>674 内容の理解の方にエネルギーを割いて、プログラムはすでに知ってる言語で書いたほうが良い。 といいつつ・・・w Fortran95以降プログラム書くのがスゲー楽でかつコードが拍子抜けするくらい短くなる。ピタリとはまる感じと言うか。 昔のプログラムを書きなおしたりすると、1ブロックが1行とかになるので構造がすっきりする。数式そのままで済む感じ。 前は77でも十分だよと思っていたが、言語の進化は大事なんだなと分かったw コンパイラの最適化も進化している。Intelの最新版使うだけですげー早くなる。 INTENTやPUREその他の宣言をきっちりしておくと意外に最適化に効く。 商用コンパイラ市場が未だに生きているのも分からなくない。 最近アメリカとかでC++に走っていた学術ソフトのFortranへの回帰が始まっているらしいが分かる気がする。 配列操作が多い場合はFortranしか無いわ。マクロや動的呼び出しだと最適化が効きにくいし。
678 名前:デフォルトの名無しさん mailto:sage [2011/12/08(木) 21:55:06.99 ] FORTRAN95で台形公式のプログラムをつくって、コンパイルは出来たのですが実行エラーがでます。 かなり初心者です。どこがおかしいか見ていただけないでしょうか。 program main implicit none real(8) :: a,b,s,pi integer:: n,t pi=4.0d0*atan(1.0d0) write(*,'(a10,a20)') 't','daikei' n=100 do t=0, INT(pi), INT(pi/4.0D0) a=t b=t+pi call daikei(a,b,n,s) write(*,'(I10,F20.10)') t,s end do end program main subroutine daikei(a,b,n,s) implicit none real(8):: a,b,s,h,f integer ::n,i h=(b-a)/n s=0.0 do i=0,n-1 s=s+(f(a+i*h)+f(a+(i+1)*h)) end do s=s*h/2 end subroutine daikei function f(x) implicit none real(8) x,f f=(cos(x/4.0d0))**2 end function f
679 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 00:08:11.74 ] program main implicit none real(8) :: a, b, s, t, pi integer :: n, i pi = 4.0d0 * atan(1.0d0) write(*,'(a10,a20)') 't','daikei' n = 100 do i = 0, 4 !INT(pi), INT(pi/4.0D0) t = pi / 4.0d0 * i a = t b = t + pi call daikei(a, b, n, s) write(*,'(2F20.10)') t, s end do end program main subroutine daikei(a,b,n,s) implicit none real(8) :: a,b,s,h,f integer :: n,i h = (b - a) / n s = 0.0 do i = 0, n - 1 s = s + ( f(a + i * h) + f(a + (i + 1) * h) ) end do s = s * h / 2 end subroutine daikei function f(x) implicit none real(8) :: x, f f = ( cos(x / 4.0d0) )**2 ! (cos(x/2) + 1.0d0) / 2 end function f
680 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 00:14:23.03 ] DO LOOP の所がおかしい。積分の開始を0,π/4 ,π/2,3π/4,πと変えたいとみなした。 DO LOOP変数を i にして、積分の開始座標を t =π/4 * i とした。 貼ってあったのは、全角文字のスペースが入っている上に、改行が狂っている所がある。 それ以外はまぁ間違いは無いとおもう。 台形公式は今の形では同じ座標について2回計算しているので無駄。 数学的には正しいが、普通はこうは書かない。 直し忘れたが、 s = 0.0d0 にしておく必要もある。
681 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 23:14:31.80 ] 小数点以下の数字の量を増やすと関わった覚えのない数字が出てきます 1.0000000038 こんな感じに出力されます どうすれば改善できますか?
682 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 00:22:53.11 ] >>681 それは単精度なら、本来有効桁が7〜8しかないから。 無理に桁数多く書かせることはできるが、それには意味がない。 どうしても意味ある数字を出したければ倍精度にすれば、14〜15桁有効桁でおk。
683 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 13:53:49.16 ] a=1.0 write(*,*) a a=1.0d0 write(*,*) a で微妙に違う値が出る時があるよね。
684 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 14:59:00.93 ] IBMの16進浮動小数の時代を思いだすんだ。
685 名前:デフォルトの名無しさん [2011/12/18(日) 01:18:57.88 ] >>683 なんで?このテーマで卒論書けるかな?!
686 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 10:42:25.00 ] 「浮動小数点のCPU内部でのとりまわしの現状について」 ・・・まじめにやれば、ハード・ソフトそれぞれで いろいろする事・知っておかないといけない事があるから、卒論ならいいんじゃない? 学科にもよるけど、文献調査+基礎的な試行錯誤を一人でできる事、ができれば 大学院に行く前の基礎技術習得なり就職前に大学で経験しておくべき経験としての 卒論なら万々歳。 博士課程まで行くつもりで学振を年頭に修士一年目に論文出したい子が 学部4年から論文になりそうな事をせっかちに始める人が多いけど、 業界の基本・基礎的な部分にじっくり思考や文献調査に時間かけたことが無い子が多い。 よくない。
687 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 15:16:23.25 ] >>685 単精度と倍精度の差でしょ? 何をテーマに研究するの?
688 名前:デフォルトの名無しさん [2011/12/19(月) 23:18:59.58 ] ウィキペディアに乗ってそうだな
689 名前:デフォルトの名無しさん mailto:sage [2011/12/25(日) 15:57:41.78 ] 数値フォーマットはめんどい。 今は IEEE754 で統一されたから見えにくいが、Fortran90にやたらと精度絡みの関数が入っているのも、 かつて数値フォーマットが機種依存で千差万別だった頃(66,77時代)に数値フォーマット問題で散々苦労したから。 66,77 の頃広く使われた数値フォーマットの必要な情報を得るための MACHAR というサブルーチンは、今でも LAPACK、Numerical Recipes、IMSL とかあちこちに残っている。 それで求めていた値を Fortran90 では組み込み関数で取れるようになった。 Kahanの数値フォーマット策定思い出話論文を読んで、もうちょっと調べて www.dr-chuck.com/dr-chuck/papers/columns/r3114.pdf 変な例としてこの辺をまとめれば卒論くらいにはなるのでは。 software.intel.com/en-us/forums/showpost.php?p=12904 software.intel.com/en-us/forums/showpost.php?p=12907 software.intel.com/en-us/forums/showpost.php?p=12908 software.intel.com/en-us/forums/showpost.php?p=12911 記憶がはっきりしないが、同じような話題が数年前にスクリプト言語方面で話題になっていた気がするし。 非正規数とアンダーフローの問題も数年前に話題になったので、まとめにいいかも。
690 名前:デフォルトの名無しさん mailto:sage [2011/12/25(日) 16:02:46.56 ] >Kahanの数値フォーマット策定思い出話や論文を読んで、もうちょっと調べて 〜〜 Kahanのサイト www.cs.berkeley.edu/~wkahan/
691 名前:デフォルトの名無しさん mailto:sage [2011/12/25(日) 17:27:18.26 ] 大学でFORTRANを習っています。 プログラミング界だとどんな位置付けですか?
692 名前:デフォルトの名無しさん [2011/12/25(日) 18:00:07.19 ] >>691 fortranは総理大臣 c++は校長先生 phpは地方公務員 htmlは乞食
693 名前:デフォルトの名無しさん mailto:sage [2011/12/25(日) 18:55:11.43 ] FORTRAN教えるようなとこなら真面目にやっといて損はないよ
694 名前:デフォルトの名無しさん mailto:sage [2011/12/25(日) 23:52:44.69 ] 693に同意。
695 名前:デフォルトの名無しさん [2011/12/27(火) 02:03:45.23 ] chracter(25)::F,G,H real,dimension(100000)::A,B,C,D,E integer,dimension(100000)::date,ddate ifile='F' ifile2='G' ifile='H open(10,fie=trim(ifile)) open(20,file=trim(ifile2)) open(2,file=trim(ofile)) do i=1,100000 read(10,*,end=99)date(i),A(i),B(i),C(i),D(i),E(i) enddo do i=1,1000 read(20,*,end=88)dnl dif=abs(dnl-A(i)) sq=sqrt(dif**2) if(sq.le.dmin) then dmin=sq Sdate=date(i) SA=SA(i) SB=SB(i) SC=SC(i) SD=SD(i) SE=SE(i) endif enddo 99close(10) 88close(20) write(2,'(6f10.3)')Sdate,SA,SB,SC,SD,SE close(2) stop end
696 名前:デフォルトの名無しさん [2011/12/27(火) 02:09:35.70 ] 上のプログラムですが、ifileのAが、ifile2のdnlに一番近いところを計算させて 、そのときのSdate,SA,SB,SC,SD,SEを表示させるプログラムを作ろうとしています。 ifileは約15000行、ifile2は約300行のデータです。 まず、はじめにデータを読み込んだ二回目のdo文がうまく回っていません。なぜでしょう? そして、目的とする答えがでません。よろしくお願いします
697 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 02:34:51.95 ] 突っ込みどころがありすぎて困るが、これは元プログラムをいじって切り出したものなのか? 情報が少なすぎて困る。 せめてコンソールの出力も見せてくれ。 与えられた範囲では、整数型に文字列を入れていて、66時代ならありだが、コレのせいで二番目によむファイルが上手く読めなくて ENDofFILEでさっさと抜けているのではとしか思えない。
698 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 08:02:11.42 ] とりあえず、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を使用しています いかがでしょうか?
701 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 19:33:19.69 ] endの前にstopを置く習慣はどんな経緯から?
702 名前:695の者です [2011/12/27(火) 19:46:37.19 ] 701さん これは先輩から教わりました
703 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 20:10:20.46 ] 大昔は program stop end subroutine/function return end しないと挙動が怪しかったw
704 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 20:41:14.36 ] >>701 むか〜し、むかし、お前の生まれるよりずっと昔。 この世にはアセンブラとFORTRANしか無かった頃の話じゃ。 FORTRAN I には、END文は無くて STOP 文でプログラムは終わっていたのじゃ。 STOP文の後ろに8進法の数字を書いておくと、それに合わせてコンソールのランプが明るく光ったのじゃ。 エラーコードの先祖じゃ。今でもSTOP文の後ろに整数が書けるのはその頃の名残じゃわい。 ところでその頃は、サブルーチンもファンクションもなくて、文関数しか存在していなかった。 しばらくして FORTRAN II の時代になると、卵からサブルーチンとファンクションが出てきたのじゃ。 ところが、JOBカードのなかでメイン・プログラムと副プログラムの区切りがつかなくなって村人たちは困ったのじゃ。 するとどこからとも無く END文がやってきて、区切りがつくことになったのじゃ。 それ以来、FORTRAN では、STOP END と書くようになったのじゃ。 STOPを抜かすのは下品で育ちの悪い人とみなされるのじゃよ。 とっぴんぱらりのぷ。
705 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 23:52:01.62 ] >>699 第一のループは10万行のデータを読み込もうとしている。ところがデータは一万五千行しか無い。 故に途中でEOFに出会う。するとEND=99によってラベル99に飛ぶ。よって第二のループは実行されない。 ところが出力はされる。結果は腐っている。 ではどうすれば良いのか?ラベル99の行を第一のループと第二のループの間に置けば良かろうかと思う。
706 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 11:30:49.67 ] >>704 自分は>>701 ではないけど, へぇ〜,へぇ〜,へぇ〜
707 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 21:48:09.89 ] fortranってなんで土木系で好まれているの?
708 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 23:54:10.80 ] 土木系に限らず固体を扱う場合はfortranが多い気がする。 abaqusやmarkのユーザサブルーチンもfortranだし。 土木でも計画やってる人はスクリプト言語含めいろんな言語使ってる。
709 名前:デフォルトの名無しさん [2011/12/29(木) 09:24:32.38 ] fortranのくだ質です。 main.f90 に使う変数の数が膨大な数なので別ファイルにて 管理したいのですが (hensu.f90 とか?)、そういうことって 実現できたりしますか?
710 名前:デフォルトの名無しさん [2011/12/29(木) 13:23:18.90 ] .outとかのファイルにすればいいじゃ?
711 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 13:46:23.41 ] >>709 理屈の上では昔のCOMMON文のノリでMODULEにまとめればよい。 しかし、それはほぼ逆走に近い行為w
712 名前:デフォルトの名無しさん [2011/12/29(木) 14:28:31.76 ] >>711 逆走に近いとは…? fortran 設計の理念に反するとかそういうことですかね? パラメータだけで1000ステップ超えてるのでなんとかしたい んですよねぇ。 理想としては、これからもパラメータが増える予定なので パラメータを追加する際、main program をいじらないで 別のファイルで管理しているものに追加していきたい。 またそれに伴って、自分で定義関数関係も増えるので 関数も別にプラグイン的なノリで管理したいんですが。
713 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 15:06:10.13 ] >>712 MODULEに入れるのは大域変数ということになる。 詳しい事情は分からんが、とりあえずは以下のようにすればいい。関数も入れられる。 file1.f90 MODULE m_param REAL, PARAMETER :: a1 = 1.0, a2 = 2.0 云々 END MODULE m_param 普通の変数でも構わない。 file2.f90 PROGRAM main USE m_param IMPLICIT NONE 云々 END PROGFRAM main C上がりの人とかだったら、INCLUDE文を使う手もある。 正式な構文ではないが、大抵のコンパイラで実装している。
714 名前:デフォルトの名無しさん [2011/12/29(木) 22:41:09.14 ] >>705 さん 確かに二回目のdo文もまわりましたが、結果は変でした・・・
715 名前:デフォルトの名無しさん mailto:sage [2011/12/30(金) 00:05:47.84 ] 装置番号がよく分からないけど、2乗して2乗根もよく分からないぞ
716 名前:デフォルトの名無しさん mailto:sage [2011/12/30(金) 00:26:07.87 ] >>709 可能。 まとめてコンパイルすればよい。 オブジェクトファイルを生成するのが正しい姿勢。 moduleは本質的な答えではないので注意。
717 名前:デフォルトの名無しさん mailto:sage [2011/12/30(金) 00:29:35.83 ] >>714 全ての変数の型を宣言してよ。 あと、何がしたいのかよく分からん。
718 名前:デフォルトの名無しさん mailto:sage [2011/12/30(金) 01:27:23.72 ] >>714 あんた質問の仕方が下手だなw Googleとかと同じで、上手く質問しないと中々正解にたどり着かないぞ。 ラベル99の文を動かした結果、第二ループが回ったのか? 結果がおかしいとは何を以てそう言っているのか? おじちゃんに正直に話してご覧。ポッキーあげるから。 ━━━━━━━一 ━━━━━━━一 ━━━━━━━一 ━━━━━━━一 ━━━━━━━一 ━━━━━━━一
719 名前:デフォルトの名無しさん mailto:sage [2011/12/30(金) 19:38:46.97 ] スティック状の線香じゃないんだから、ポッキーは ━━━━一 こんなもんだろ。
720 名前:デフォルトの名無しさん mailto:sage [2011/12/30(金) 21:44:26.92 ] 長いぜオレのチンポッキー ━━━━━━━一ω
721 名前:デフォルトの名無しさん mailto:sage [2011/12/30(金) 22:37:50.88 ] 震災のとき、なにしてた?
722 名前:デフォルトの名無しさん [2011/12/30(金) 23:22:17.74 ] >>721 プログラミングかな。もちろんFortranでね。
723 名前:デフォルトの名無しさん [2011/12/31(土) 15:01:30.29 ] >>716 ご返信ありがとうございます。 オブジェクトファイルを生成するようコーディングすればいいのですね。 ということは module はまた違ってくるわけですね。
724 名前:723 [2011/12/31(土) 19:22:48.34 ] ちなみにオブジェクトファイルを生成するにはどういったおまじないが必要なのでしょう? main.f90 の他にパラメータ群をコーティングしたファイル parameter.f90 があったとして。
725 名前:デフォルトの名無しさん mailto:sage [2011/12/31(土) 20:24:44.33 ] .forと .f90 の違いは? 大学時代、ずっと.forだったんだけど
726 名前:デフォルトの名無しさん mailto:sage [2011/12/31(土) 20:59:34.96 ] >>725 .for ないし .f は固定カラム形式 .f90 は自由形式 を意味する。 .f95 とか .f2k とかは無定義。正式なものではない。
727 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 16:18:43.42 ] ifort -r8 -FI hoge.f90 とか、固定書式な部分はコンパイラに任せちゃう。 なんか左8つくらい空白じゃないとムズムズしてしまうので・・。
728 名前:デフォルトの名無しさん [2012/01/04(水) 23:05:46.54 ] 優良スレ 普通 クソスレ ┝━━━━━━━━━━┿━━━━━━━━━━┥ 88彡ミ8。 /) 8ノ/ノ^^ヾ8。( i ))) |(| ∩ ∩|| / / <ココ! 从ゝ__▽_.从 / /||_、_|| / / (___) \(ミl_,_( /. _ \ /_ / \ _.〉 / / / / (二/ (二)
729 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 01:05:31.83 ] ここは「くそみそ」ハッテン場なんだが・・・お前はじめてか?
730 名前:デフォルトの名無しさん [2012/01/07(土) 20:10:23.57 ] だれかー 分かんない問題あるんだけどー
731 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 20:14:46.67 ] 書いてみろ。といてやる。
732 名前:デフォルトの名無しさん [2012/01/07(土) 20:28:51.35 ] ある動物園の1日の総入園者数(1行目)と入園者の年齢(2行目以降)が、以 下のような書式でファイルに格納されている。このファイルからデータを配列に 貯えて、各年代ごと(10歳未満、10代、20代、30代、・・・)の入園者 数、平均年齢、および最高年齢と最低年齢を求め以下の書式で出力するプログラ ムを書きなさい。 データファイル(入力) 57 5 12 28 3 62 32 15 43 51 68 15 2 1 29 21 22 67 41 10 9 11 63 31 2 6 8 65 13 26 35 55 31 9 15 67 36 13 3 62 58 5 53 48 2 66 39 7 9 11 69 61 4 63 13 60 8 65 (出力) 平均年齢 n1 才 最高年齢 n2 才 最低年齢 n3 才 0 から 9 才 n1 人 10 から 19 才 n2 人 20 から 29 才 n3 人 30 から 39 才 n4 人 40 から 49 才 n5 人 50 から 59 才 n6 人 60 から 69 才 n7 人 ドキドキ
733 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 20:46:58.43 ] FORTRAN77で書いて欲しいかね90でいいのかね? おじちゃんに言ってみなさい。
734 名前:デフォルトの名無しさん [2012/01/07(土) 21:22:57.17 ] 90で願います(´Д`)
735 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 21:51:13.92 ] program zoo implicit none integer :: i, ntotal, iyoungest, ioldest, idist(7) integer, allocatable :: ivisitor(:) real :: ave read(10, *) ntotal allocate( ivisitor(ntotal) ) read(10, *) ivisitor iyoungest = minval(ivisitor) ioldest = maxval(ivisitor) ave = sum(ivisitor) / ntotal forall (i = 0:6) idist(i + 1) = count(ivisitor / 10 == i) write(*, '(a, f5.1, a)') '平均年齢 ', ave, '才' write(*, '(a, i3, a, i3, a)') '最高年齢 ', ioldest,' 才 最低年齢 ', iyoungest, '才' do i = 0, 6 write(*, '(i3, a, i3, a, i3, a)') 10 * i, 'から', 10 * i + 9 , '才 ', idist(i + 1), '人' end do stop end program zoo 結果を確認していないw
736 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 21:52:36.14 ] 出力 平均年齢 30.0才 最高年齢 69 才 最低年齢 1才 0から 9才 16人 10から 19才 10人 20から 29才 5人 30から 39才 6人 40から 49才 3人 50から 59才 4人 60から 69才 13人 入力のところは、場合によっては修正しないと駄目かもしれん。
737 名前:デフォルトの名無しさん [2012/01/07(土) 23:10:49.23 ] あっざーす 学校のPCじゃないと試せないんでとりあえずありがとうございます
738 名前:デフォルトの名無しさん mailto:sage [2012/01/08(日) 00:06:45.05 ] オンラインコンパイラ。 こことか www.sourcelair.com/ ここで www.onlinecompiler.net/fortran 試せる。 まぁ制限があるので、そのままでは動かないがw
739 名前:デフォルトの名無しさん [2012/01/08(日) 02:59:55.74 ] ::ってなんですか?習った覚えがないんですよ・・・
740 名前:デフォルトの名無しさん [2012/01/08(日) 05:15:48.13 ] >>739 ステマって意味^^
741 名前:デフォルトの名無しさん mailto:sage [2012/01/08(日) 10:02:47.49 ] >>739 習ったのは77だな。90ではつけるんだ。まぁなくてもいいんだがw
742 名前:デフォルトの名無しさん [2012/01/09(月) 01:57:17.33 ] >>741 未だに77教えてるクソ学校あるのか?w
743 名前:デフォルトの名無しさん mailto:sage [2012/01/09(月) 06:15:21.79 ] 【ソウル聯合ニュース】国策シンクタンクの韓国開発研究院(KDI)は8日に公表した経済動向報告書で、 韓国経済の成長が輸出・内需ともに鈍化していると評価した。 前年同月比の輸出増加率をみると、12月は12.5%で前月(13.8%)よりやや悪化した。11月の 消費販売額指数は0.5%増にとどまり、前月の増加率(2.2%)を下回った。 産業生産は鉱工業、サービス業がともに振るわず、前月より減少した。また、需要不振などで在庫が 拡大して生産増加の制約要因に作用すると、KDIは予想した。 設備投資は前月と比べれば、減少幅がやや改善したが、全般的に不振が続いている。回復ペースを 見せていた建設投資も足踏み状態にある。 KDIは先進国一部の景気指標がやや改善したが、成長鈍化や財政危機などで下振れリスクが依然 として残ると指摘した。 聨合ニュース: 2012/01/08 14:03 japanese.yonhapnews.co.kr/economy/2012/01/08/0500000000AJP20120108000900882.HTML
744 名前:デフォルトの名無しさん mailto:sage [2012/01/09(月) 09:56:41.79 ] といてくれという宿題を見ているとまだまだ現役w それに90を教えているといっても、ほとんど77な発想に、ちょっと90の機能使いました的なのが普通。 実用という面では77読めないと仕事できない。
745 名前:デフォルトの名無しさん [2012/01/10(火) 02:50:03.32 ] >>744 そうなのか^^; 俺は独学で fortran95 学んでシミュレーションしてる 口だからそういう事情しらんかったw やっぱり古いソースを使う機会が未だに多いということなのかね
746 名前:デフォルトの名無しさん mailto:sage [2012/01/10(火) 03:01:13.70 ] まあ言語の機能よりは 問題ごとに確立された手法の蓄積が肝心だからね
747 名前:デフォルトの名無しさん [2012/01/10(火) 15:15:40.88 ] >>732 fortran77でやる場合はどうなるんですかね?
748 名前:デフォルトの名無しさん [2012/01/10(火) 17:20:29.98 ] リダイレクションして出力するってこと忘れてました。申し訳ないです。
749 名前:デフォルトの名無しさん mailto:sage [2012/01/10(火) 22:58:32.86 ] 77で書くのはめんどい。90なら1行で書けることが5行くらいかかる。 連休前の軽い気分ならやってやるが、♪今はもう動かない、おじちゃんのや〜る〜き〜。
750 名前:デフォルトの名無しさん [2012/01/10(火) 23:05:21.42 ] Real aver(1:5),s,ep, Integer exam(1:100,1:5),sum(1;5),psum(1:100),I,j,n Read(5,*)n, ((exam(I,j),j=1,5,1),i=1,n,1) Do 20 j=1,5,1 Sum(j)=0 Do 10 i=1,n,1 Sum(j)=sum(j)+exam(I,j) 10 continue Aver(j)=sum(j)/real(n) 20 continue Do 40 i=1,n,1 Psum(i)=0 Do 30 j=1,5,1 Psum(i)=pasum(i)+exam(I,j) 30continue Paver(i)=pasum(i)/5.0 40continue
751 名前:デフォルトの名無しさん [2012/01/10(火) 23:06:41.39 ] 続き Write(6,100) 100 format(14x,’score of examitation’/ * 2x,no. eng mat jap soc sci ‘, * 3x,’psum paver’ Do 50 i=1,n,1 Write(6,200) I,(exam(I,j),j=1,5,1) Psum(i),paver(i) 200 forma(1x,i3,5i6,i7,f6.1) 50 continue Write(6,400) ( sum(j),j=1,5,1) 400 format(/1x,’sum’,5i6) Write(6,500) (aver(j),j=1,5,1) 500format(/1x,’aver’,2x,5f5.1) Stop End を改造して 各科目の標準偏差を求めそれを利用することで各個人の偏差値を求め、個人の 得点の下に偏差値をしめすプログラムの作り方がわかりません。。。。 偏差値=(P−M)/s*10+50 標準偏差は各科目ごとにs=√1/nΣ(P-M)*(P-M) p=得点、M=平均値 AVER:科目平均 SUM:科目の合計 PSUM:個人の合計 PAVER:個人の平均
752 名前:デフォルトの名無しさん [2012/01/10(火) 23:07:12.79 ] 続き データファイル 51 80 70 90 50 70 40 65 70 40 60 78 75 80 70 90 80 85 70 95 40 70 55 60 60 80 50 85 75 80 お願いします!! FORTRAN90です。 いろいろと試みたんですがわからなかったので。。。。。
753 名前:デフォルトの名無しさん mailto:sage [2012/01/10(火) 23:20:30.66 ] >>752 jap ってなんだよ。朝鮮学校の宿題かよ。大体それ77だぞ。金正日の糞でも食ってろw
754 名前:デフォルトの名無しさん [2012/01/10(火) 23:28:23.22 ] 国語です。初心者でわかりませんでした↓
755 名前:デフォルトの名無しさん mailto:sage [2012/01/11(水) 00:08:28.87 ] 77のDOってCONTINUEで終わらないといけないものとばかり思ってた事を思い出した
756 名前:デフォルトの名無しさん mailto:sage [2012/01/11(水) 01:14:00.26 ] こんな本でてるw www.amazon.com/Missile-Flight-Simulation-Jeffrey-Strickland/dp/1105102815 Missile Flight Simulation Fortran and ADA are the principal Government-approved langeages.
757 名前:デフォルトの名無しさん [2012/01/11(水) 03:07:45.89 ] >>751 同じ大学の予感
758 名前:デフォルトの名無しさん mailto:sage [2012/01/11(水) 16:55:21.54 ] program vipper implicit none integer, parameter :: nop = 5 integer, allocatable :: iexam(:, :) real, allocatable :: sts(:, :) real :: ave(nop), std(nop) integer :: i, j, nos read(*, *) nos allocate( iexam(nop, nos), sts(nop, nos) ) read(*, *) iexam ave = sum( iexam, dim = 2 ) / nos forall (i = 1:nop) std(i) = sqrt( sum( (iexam(i, :) - ave(i))**2 ) / nos ) forall (i = 1:nop) sts(i, :) = ( iexam(i, :) - ave(i) ) / std(i) * 10.0 + 50.0 write(*, '(7(4x, a, 1x))') ' 英', ' 数', ' 国', ' 社', ' 理', ' 計', '平均' write(*, '(58("=")/, 7f8.1/, 58("="))') ave, sum(ave), sum(ave) / nop do i = 1, nos write(*, '(7(i7, x))') iexam(:, i), sum(iexam(:, i)), sum(iexam(:, i)) / nop write(*, '(5f8.1/)') sts(:, i) end do stop end program vipper 6 100 80 70 90 50 70 40 65 70 40 60 78 75 80 70 90 80 85 70 95 40 70 55 60 60 80 50 85 75 80
759 名前:デフォルトの名無しさん mailto:sage [2012/01/11(水) 16:55:48.76 ] 英 数 国 社 理 計 平均 ========================================================== 73.0 66.0 72.0 74.0 65.0 350.0 70.0 ========================================================== 100 80 70 90 50 390 78 63.7 58.9 48.1 67.2 41.8 70 40 65 70 40 285 57 48.5 33.5 43.5 45.7 36.4 60 78 75 80 70 363 72 43.4 57.6 52.8 56.4 52.7 90 80 85 70 95 420 84 58.6 58.9 62.1 45.7 66.3 40 70 55 60 60 285 57 33.3 52.5 34.1 35.0 47.3 80 50 85 75 80 370 74 53.5 39.8 62.1 51.1 58.2
760 名前:デフォルトの名無しさん [2012/01/11(水) 19:26:28.74 ] ありがとうございます
761 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 23:03:52.43 ] gfortranでスタックサイズを変えるにはどのコンパイルオプションを指定すればいいんですか? 配列サイズが大きくて実行時にエラーになります。 「-fmax-stack-var-size=n」はn=200000000でエラーがになるのにn=10でエラーがなかったりする のでよくわかりません。 「-fstack-arrays」はコンパイル時に f951.exe: error: unrecognized command line option '-fstack-arrays' という エラーが出ます。
762 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 23:35:12.81 ] >>761 >「-fmax-stack-var-size=n」 これはスタックにとる配列サイズの設定であって、スタックのサイズではないよ。 ここで設定したサイズより大きい配列はスタックに置かれないから、 この値をスタックサイズより小さくすればオーバーフローが回避できる。
763 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 23:40:07.24 ] >>762 そうだったんですか。ありがとうございます。 あと、スタックサイズって調べられるんですか?
764 名前:デフォルトの名無しさん [2012/01/13(金) 23:42:51.78 ] fortranを仕事で使ってる奴いる? みんあエクセルにながれちゃん?
765 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 23:55:44.27 ] >>763 linuxだったらulimit -sで表示も設定もできる
766 名前:デフォルトの名無しさん mailto:sage [2012/01/14(土) 01:04:20.84 ] >>765 すみません書いてなかったです。OSはwin7x64です。 ulimit -s コマンドプロンプトでやってみたけどダメでした。
767 名前:デフォルトの名無しさん mailto:sage [2012/01/14(土) 01:29:00.98 ] >>761 つーか、automaticでデカい配列取ると常にスタック問題に悩まされるので、 素直にALLOCATEABLEにしてALLOCATEすれば良い。 まぁIntelFortranは、スタック問題の質問が殺到したために、デカ目の配列は勝手にheapにとるようになったw
768 名前:デフォルトの名無しさん mailto:sage [2012/01/14(土) 02:00:12.07 ] >>767 allocateつかったらエラー出ませんでした。ありがとうございます。
769 名前:デフォルトの名無しさん [2012/01/17(火) 11:57:00.85 ] Error: Syntax error, found END-OF-STATEMENT when expecting one of: , ) このエラーは構文のミスですか? かっこが多いとかですかね?
770 名前:デフォルトの名無しさん mailto:sage [2012/01/17(火) 12:12:29.80 ] むしろ足りない。 固定フォーマットで72カラムをはみ出していると見た。
771 名前:デフォルトの名無しさん [2012/01/17(火) 12:28:23.23 ] >>770 72文字制限は守っています。 エラーが出ている行を何度見直しても括弧の数はあっているのですが・・・ その前後に問題がある場合もありますか?
772 名前:デフォルトの名無しさん mailto:sage [2012/01/17(火) 12:57:01.80 ] , または ) で結ばれる前に、行末が来てしまったと言っているしな。 フォーマット文が狂ってるか、72カラムからうっかりはみ出した場合が多いような。 その行だけここに出して味噌。
773 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 00:30:36.98 ] 解決したのかよ。続きが知りたいだが。
774 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 20:13:57.62 ] write (*,'(a,f5.2,a,5.2,a)') 'y=',alfa,'+',beta,'x' 1 Warning (100): Unexpected element in format string at (1) 何がおかしいか分かりませんお願いします 1は「'」の下です
775 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 20:46:38.00 ] 2つ目の5.2は何か
776 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 21:33:52.63 ] >>775 ありがとうございます 解決しました
777 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 18:24:38.41 ] gfortran でstackoverflow にならなくても他のコンパイラではなる場合、 gfortranでもうまくいってない可能性は高いでしょうか?
778 名前:デフォルトの名無しさん mailto:sage [2012/01/19(木) 23:03:26.61 ] >>777 細部を見ないと断言できないが、AUTOMATIC変数が大きくてSTACK OVERFLOWが起きているののならば、 DEFAULTのSTACKサイズがコンパイラ毎に違っているので、そういうことが起きてもおかしくない。 オプションによって、STACKではなくHEAPにAUTOMATIC変数をとるようにも出来る場合もあるし、 初めからそういう設定になっていることもある。 しかし、別の原因でSTACK OVERFLOWを起こしているのなら、話しは別だ。 それぞれのコンパイラのマニュアルを一字一句舐めるように読んでDEFAULTのSTACKサイズを調べて味噌。
779 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 00:39:04.83 ] fortranって非対称マトリクスの扱い弱くない?
780 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 00:46:53.78 ] gfortranを使ってるものですが。 配列の宣言について質問です。 例えば、 subroutine sub(a,b,n,j) implicit real*8(a-h,o-z),integer*4(i-n) dimension a(n,n+1),b(n*n,j) ・ ・ ・ というような宣言はおかしいでしょうか? スタックの原因になったりしますか? 一応コンパイルはこれでできるのですが。 形状引継ぎや形状明示のことだと思うのですが・・・。 説明不足かもしれませんが、エスパーな方教えてやってください。
781 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 00:55:53.58 ] それは親ルーチンから引き継いだ配列だからスタックに効かない。 そのサブルーチンで新たに定義した配列が大きいとスタックがあふれる。 言ってることが分からないなら、他の宣言文も全部出せ。 77でやっているならそういうことは起きにくいのだが、変数をSTATICにとるようなオプションを付けてコンパイルするとか。 本来の規格では77でのサブルーチン変数は動的にとられるが、歴史的な事情から、静的に確保されることが多い。 (SAVE変数に成っている)その辺の問題かな。 いまは77形式も90系と同じコンパイラが単にオプションを変えて走っているだけなので、そのオプションがなんなのか 個別に調べないと分からん。
782 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 01:21:25.60 ] >>781 ありがとうございます。 宣言は implicit real*8(a-h,o-z),integer*4(i-n) parameter(nx=10,ny=10,nt=nx*ny) call sub1(nt) return end subroutine sub1(nt) implicit real*8(a-h,o-z),integer*4(i-n) dimension a(nt,nt+1) call sub2(a,nt) return end subroutine sub2(a,nt) implicit real*8(a-h,o-z),integer*4(i-n) dimension a(nt,nt+1) return end という感じでsub1で大きな配列を宣言するとあふれるということですかね?また、スタックがあふれるときはコンパイルの時点でエラーが出るんでしょうか?
783 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 01:27:25.10 ] 100*101程度では溢れないが、基本的にはそういうこと。 コンパイル時にはエラーはでない。
784 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 01:29:44.50 ] >>779 そんなことはない
785 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 01:34:01.82 ] >>783 なるほど、親ルーチンで宣言してれば問題にならないんですか?
786 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 02:31:30.26 ] >>785 いや、コンパイル時にはエラーはでないが、実行時にエラーが出る。
787 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 02:37:51.52 ] 親プログラムで配列を確保しておけばという事ならエラーはでない。
788 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 02:40:36.33 ] >>786 実行時のエラーというのはプログラムが強制終了するってこと? それとも数値計算の値がずれたりする?
789 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 02:51:51.77 ] STACK OVERFLOWの話をしているのではないのか?
790 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 03:07:16.46 ] >>789 質問が初歩的すぎてスマン。 実行時にクラッシュするわけですね・・・。
791 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 03:14:15.59 ] >>777 >>780 >>782 >>785 >>788 >>790 というのもgfortranでコンパイルしたら普通にプログラムも動いて、数値計算ができるんだが、 他のコンパイラを使うとスタックオーバーフローになるみたいで、 gfortranでやった場合の計算結果が合ってるかがわからなかったんです。 とても参考になりました。本当にありがとうございます。
792 名前:デフォルトの名無しさん mailto:sage [2012/01/22(日) 11:07:18.17 ] basicだとグラフ掛けるけど、 fortranはどうなん??
793 名前:デフォルトの名無しさん mailto:sage [2012/01/22(日) 12:08:40.04 ] 標準ではできない・・・とおもう。 だいぶ前になるけど、 Digital visual Fortran では出来たな。 GUI その他拡張機能 を全部 qq で始まる名前の副プログラムで提供していた。 ・・・Intel Fortran の中の人は旧DECの人と聞いたことがあるけど、どうなんだろうか?
794 名前:デフォルトの名無しさん mailto:sage [2012/01/22(日) 17:29:37.20 ] QQで始まるのはMS-FORTRANに源流を持つMSのQuick-Winだな。 DOS時代から綿々と続いて今もIntelVisualFortranに受け継がれている。 DEC時代にはFGLで始まるOpenGLの機能の一部が簡単に使えるライブラリが用意されていたが、 最近はF90GLとかのフリーのルーチンでやってくれということで削除された。 大型計算機以来のXYプロッタ的なルーチンは、幾つかフリーのものが出回っている。 標準でグラフィック機能というのはもちろん無い。
795 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 04:13:00.77 ] 広義にはpgplot gnuplot 辺りも>>792 の 希望に叶うのかな? MS Fortran の中身はDEC が作ったと記憶。 当時のMSに開発環境を作る能力は・・
796 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 09:47:41.02 ] >>795 それは間違い。 MSがBASICの次に売った言語はCP/M用のFORTRANサブセット。 DOS用のMS-FORTRAN3.0,4.0,5.0ときて、5.0にはQuickWinが付いている。 その後Win3.1,NT用まではMSで出した。 DECに渡したのはWin95の頃。QuickWinはMS仕様のままさほど発展せずに今に至っている。
797 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 11:04:18.07 ] ここはためになるインターネッツですね
798 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 11:43:42.33 ] MS Fortran PowerStation って95の時だっけ? fpsfl32.exe /4Yb mufufu.for かな、/4Yb オプションつけたときの バグ発見効率の素晴らしさに感動したのも昔の話。
799 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 11:47:58.19 ] PowerStation1.0/NT はWin3.1/NT3.5 PowerStation4.0がWin95 4.0に急に飛んだのはVC++の4.0に合わせたため。ここで環境の統合がなされた。 それまでは個別のWorkBench、ここからDevStudio。
800 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 11:55:33.35 ] FPS4.0まではMSが出したが、これが結構バグバグでDECに後をかませた。 DECは潰れてCompaqに買収され、CompaqはHPと合併して、FortranチームをIntelに売って今に至っている。 QuickWinを見捨てずに今まで残しているところは偉い。
801 名前:798 mailto:sage [2012/01/23(月) 12:22:09.28 ] ああそうだ、自分が使ってたのは4だ・・とおもうw ためになるよ。ありがとう >799,800 ついで、というか・・・自分の記憶だとそのあと Digital Visual Fortran っていうのがあって DEC Alpha の NT 上で初めてF90 規格をさわって・・・ module use あたりに最初頭が馴染めず苦労した記憶が・・なつかしいのう。
802 名前:デフォルトの名無しさん [2012/01/24(火) 23:53:15.40 ] fortranで童貞捨てたいんですが、、、、
803 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 13:36:34.70 ] ヽ/l l ニ|ニ ,.、-''"..;:;:;:;:;:;:;:... `'ヽ、 ( ( ̄  ̄) /....:::;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;.....ヽ、/ ̄ ̄ ̄ ̄\/  ̄  ̄ i_;;、:_;、;_;、;、;、、ィッ.;:;:;:;:;: / 興 男 >>802 ,.、-──-- 、.,_ ,、 | ,,,,,, / ;:;:;:;:;:;: | 味 の : ``''--イ ,),、,! ''''' \ ;;;;;;;;;_| が は : ヾー'゙ |ヒニニュ ャニ,ニニ、> 〉;; / _| あ だ ノ l ハ l ヾ トイ `!゙l)_j ' iリ__, ` }ii l f'ト〉 る か _,,.ノ _ノ / ノ ノ ノノ!_丿 | l ` " ''' }ii リノ | の に |\__ ノ ,、ィ'-=z=F [_ .l! .{ 、 ィ!ii;}' ノ| か | -‐''゙_ノ ,ノ '゙ (ソ ヽ {! ゙ー<⌒' ,ミi;i;}ー'゙ | ね | 、 ィッ>f「 _,,二- ヽ. }i、 -===-' リiii;ツ | ? | `〒T〔!| r ,_ノ _ノ}lli, -r=‐ ,i;llilili| > _____/`ヽ、 ゙、ヽ`! l _ _」 // '}llli, ,;i|i;, ,,ii;ilililll'゙リ /  ̄ l l ,、 ''⌒゙ヽ、 `ト.、! lj (__l、/ | ゙ト!llllllllllliillllllllヅ_、-゙ /,l l / l ゙ト、 t'゙ | | | |、'lトllトllトツ "´ // l l / ,ィ、化ァ ',\ l 〉 | | | ゙、 //∧ / / l l l (爪((、`ー'′ ', `''t‐--'′〉ト、 | | |. Vハ彡 ∧ / |_L、 i | /  ̄ ̄ ̄`¨`''ー--ニL_ `!、 `! l ̄`''┴--┴'-'゙-─…''"´_,, ィ| l |/ ヽ ` ', | O``''────…'''"´ O',゙:、 l |/
804 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 17:16:42.14 ] どうしてフォートランしないのッ
805 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 17:03:35.64 ] アフリカ象が好き!
806 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 12:24:42.93 ] ぱぉぉぉん!
807 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 13:58:29.66 ] 八丈島のキョン!
808 名前:デフォルトの名無しさん [2012/01/31(火) 17:38:04.01 ] error LNK2001: unresolved external symbol _MAIN__ fatal error LNK1120: 1 unresolved externals 以上のエラーが解決できません。 定義していない引数を出しているとかでしょうか? LNK1120の説明が多くて難儀しています。。。
809 名前:808 [2012/01/31(火) 17:45:33.71 ] 上のものはbuildできなくて困っています。
810 名前:デフォルトの名無しさん [2012/01/31(火) 22:58:16.57 ] あ〜それ、あれだよアレwww
811 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 23:00:47.97 ] ライブラリにリンクできてないんじゃない?
812 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 15:54:23.60 ] main program が無いんでね? モジュールしかないファイルをビルドしているとか。 コンパイルのファイル並びが悪いとか。
813 名前:デフォルトの名無しさん [2012/02/04(土) 11:53:25.56 ] フォートラン95で、10個のデータを 読み込み絶対値が最も大きいものの番号ともとの値を表示する プログラムの作り方を教えてください.
814 名前:デフォルトの名無しさん mailto:sage [2012/02/04(土) 12:31:18.78 ] 特定した
815 名前:デフォルトの名無しさん mailto:sage [2012/02/04(土) 14:12:32.03 ] maxvalとmaxloc
816 名前:デフォルトの名無しさん mailto:sage [2012/02/04(土) 19:24:28.09 ] 有限要素法の二次元梁要素のfortranソースどこかに落っこちてないですか??
817 名前:デフォルトの名無しさん mailto:sage [2012/02/06(月) 14:24:01.49 ] program gayboy implicit none integer, parameter :: nmax = 10 real :: xdat(nmax), xmax integer :: kmax open(10, file = 'hole19.dat') read(10, *) xdat kmax = maxloc(abs(xdat), 1) xmax = xdat(kmax) print *, 'max pos, dat', kmax, xmax stop end program gayboy 豆ポイント maxlocは元の配列のRANKと同じ配列で結果を返すので、1次元配列では 要素数1の配列で値を返してきて困る。この時、第二引数の次元指定で 問題回避できる。
818 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 19:16:27.77 ] FORTRANで整数変数の暗黙宣言がI〜Nになっていることの根拠を知りたいと いう人がいた気がするが、まだ解決していないなら朕がその謎を解いてやろう。 John Backus 本人がそのものずばりを質疑で答えている。 ちなみに質問は会場の爆笑を誘っているw J.A.N. Lee. Transcript of question and answer session: "The History of Fortran I, II, and III". In in: R. Wexelblat, editor. History of Programming Languages, ACM Monograph Series, Academic Press, 1981, pages 68-71. www.softwarepreservation.org/projects/FORTRAN/paper/p68-lee.pdf LEE: Helen Gigley asks: "Why were the letters I through N chosen to designate integers?" [Laughter and applause] BACKUS: Well, it just seemed for a while that people always used I, J, and K for subscripts, and we thought we'd be generous and add a few more. ようするに適当w まぁ数学では記法としてΣ_i^Nとかが一般的で、添え字にO以降は使われないから、 I〜Nまでを整数とするのは適切な気がする。
819 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 19:19:26.81 ] ついでに言うと、伝説と異なりFORTRAN I で配列のRankが3以下に制限されたのは インデックス・レジスタが3個しかないせいではないとも言明している。
820 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/03/31(土) 22:08:22.00 ] F77形式で書かれたプログラムのmakeファイルをg95でコンパイルしようとしたのですが、 メッセージ番号 0x2331 のメッセージ文が application のメッセージ ファイルに見つかりません というエラーメッセージが出てきてできませんでした。 この現象についてわかる方がいたら教えてください。 ちなみに私のパソコンはWINDOWSですが、知人によると、知人のMacでは普通にコンパイルできたようです。
821 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 22:14:38.55 ] エラーメッセージをコピペして貼りつけろ。 それでは情報が少なすぎて分からん。
822 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/03(火) 01:04:40.93 ] 関係演算子のge,gt,le,ltの意味を教えてください eq,nqだったらequalとnot equalの略という意味です
823 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 01:43:51.66 ] GE greater than or equal LE less than or equal GT greater than LT less than 英語マニュアル見ればそのままズバリ書いてあると思う。
824 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 01:45:33.44 ] equal の後に to もあるかな。 equal to
825 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 01:56:23.98 ] >>823 ,824 ありがとうございます
826 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/05(木) 02:10:04.20 ] common文は分かりにくいorバグが出やすいから、モジュールを使いましょう という文章をfortranのサイトなのでよく見かけるのですが、 common文は何が問題なのでしょうか? 自分は、変数をまとめてcommon文で定義したファイルを 各サブルーチンでincludeしていますが、 これは推奨されていないやり方なのでしょうか? そもそも、グローバル変数を使うこと自体よくないというのを 聞いたこともありますが、 グローバル変数を使わないで数値計算するというのが想像できないです。
827 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/05(木) 02:11:02.29 ] 追記ですが、自分はモジュールのことやオブジェクト指向のことを まったく理解していないです。 それらの重要性なども、できれば教えてほしいです。
828 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 03:02:15.16 ] 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だけを変えればいい。 と思うのですが、この方法だと何か問題があるのでしょうか?
830 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 09:04:39.53 ] >>828 別にそれでいいし、コピペとかでそうやるけど、COMMONの持っている潜在的な能力を使いきっているわけではない。 単に記憶領域の割付の問題だから、サイズや型が違っているものを割りつけてもいい。
831 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/05(木) 10:26:37.44 ] >>830 先ほどからいろいろ自分でも調べたんですが、 >>829 とまったく同じことをモジュールでもやってるみたいですね? 同じことをあえてモジュールでやる意義がよくわからないです。 推奨しない、とは書いてあるんですが その理由がはっきり書いてなかったりで。
832 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 10:55:01.62 ] むしろ>>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に全て移動させました。 よろしくお願いします。
835 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 11:04:49.27 ] mainプログラムがないって言ってっぞ。 あとスレ上げんなよ。変なのが湧いてくるから。
836 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 13:54:15.42 ] >>835 すみませんでした、気をつけます。 ライブラリの使い方が全く分からないです。 とりあえず、サンプルコードに use f95_LAPACK call LA_GETRF(r,ipiv) call LA_GETRI(r,ipiv) という文を入れています。(あるサイトにあったサンプルそのままです) ディレクトリに、*.aはちゃんと入っているので LAPACKのインストールは成功しているともうのですが。
837 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 22:56:57.64 ] >$ ifort -module sampleLAPACK.f90 ~/lib/lapack95.a ~/lib/liblapack.a ~/lib/librefblas.a -------------------↑ ここにスペースが足りねぇ、なんて落ちじゃないよな?
838 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 23:23:47.86 ] 質問です。 サブルーチンのなかでサブルーチンを使うことは出来ますか? (自分でやってみたところ、計算は出来たのですが バグとか起きたりしないですよね?)
839 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 23:29:26.56 ] >>838 出来るぞ!兄貴がサブを呼び、サブが子サブを呼んで、子サブが孫サブを呼んでもいいぞ!
840 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 00:06:50.04 ] >>839 知らないで、いちいちメインプログラムに書いてました!! ありやす!!
841 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 10:15:57.63 ] >>834 MKLを使おう。 LAPACKも入ってる。
842 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 22:33:02.45 ] ライブラリの仕組みが分からないので、教えてください。 複数のオブジェクトファイルの集まりというところまでは 理解できたのですが コンパイルしたときに、どうやって必要なファイルを抜き出すのですか? 例えば、メインプログラムに call sub*** とか書いたら、ライブラリのなかにあるsub***を自動で検索してくれるのでしょうか?
843 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 22:49:05.89 ] LINKERが探してくれるので任せておけ。
844 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 01:07:31.75 ] すみません、助けてください。 program main implicit none use variable !このなかにmmaxをパラメータ属性で定義している real(8) :: phi(0:mmax) call subA(phi) call subB(phi) end program main subroutine subA use variable implicit none double precision,intent(out) :: phi(0:mmax) ここらへんでphiを計算して出力 end subroutine subA subroutine subB use variable implicit none double precision,intent(in) :: phi(0:mmax) ここらへんでphiを使って他の量を計算 end subroutine subB という感じのプログラムなんですが、 intent文をつけると、 この配列名はこのコンテキストでは無効です(error #6420) と出てしまいます。 intent文を外すと、コンパイルできます。 ずっとここで悩んでいます。助けてください。
845 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 01:08:19.41 ] 半角でスペースしたので 字下げが反映されませんでした。見辛くてすみません。
846 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 01:48:45.99 ] intentはサブルーチンの引数になってないと駄目だぞ。 subroutine subB(phi) のようにな。 イメージ画像 ,,x-ー:: "::::: サブ ,x '":::::::::::::::::::: ,、'":::::::::::::,, x-‐ ァ: ,,x '"::::::,,、- '" |::: `"i`ー'" ヾ ! 、 、,,,,,,,,,;;;;;;;;;彡ミ |,,,,ノi `ーヾ;; '"----、 ヾ::ヽ -┴'~ ~|:/ ' ' ' `ー ' "'" /_ l '' ) i ヽ,,、'~` U ゙, __ ,-、_,ノ` |/ ゙, `'" ,,y |// 彡 ゙、`-'" /| i ! ,, -'" | `ー '"|:: | /|||ヽ /|||||/心 |ヾ/ /`ー
847 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 01:58:14.86 ] >>846 基本的なサブルーチンの使い方が出来ていませんでした! もっと早く聞けばよかった!ありがとうございました!
848 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 19:37:19.69 ] Fortranスレがなぜか落ちてる・・・なぜだ? こっちで質問させてください module real(8),parameter :: n = 500 type ADM real(8) :: a(0:n),b(0:n),c(0:n) end type ADM interface subroutine subini(phi,ADM_new) real(8),intent(in) :: phi(0:n) type(ADM),intent(out) :: ADM_new end subroutine subini end interface end module interface文を付け加える前はコンパイルできていました interface文を付け加えたところ、 宣言式オブジェクトは仮引数あるいは親子結合、参照結合によって アクセス可能なオブジェクトでなければなりません。MMAX と この派生型名は宣言されていません。[ADM] というエラーが出ます。 mmaxとADMはちゃんと上に宣言しているんですが interface文のなかに書く必要がありますか? mmaxとADMは共有されているはずなんですが・・・。
849 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:31:47.35 ] >>848 まず、real(8),parameter :: n = 500 はintegerの間違いだろう。 さて本題だが、importをつければいくはず。 interface subroutine subini(phi,ADM_new) import real(8)云々 説明は面倒なので、reference manual のimportの部分を呼んでくれ玉へ。
850 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 23:21:19.78 ] 980を超えて一定時間書き込みがないスレは落ちる。 気になるなら「即死判定」でググれ
851 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 04:01:29.62 ] >>849 出来ました。ありがとうございます。 関連する質問をもう一つしてもよいですか? メインプログラムと外部サブルーチンの引数の受け渡しが 安全に行われるために、 モジュールにinterface文を加えたのですが、 試しに、メインでreal(8)と宣言した引数を サブルーチン側でinteger,intent(in)としてみたんです。 そしたら、コンパイル出来てしまったんですけど、 なぜなのでしょうか?interface文が役に立ってません・・・。 >>850 知りませんでした。ありがとうございます。
852 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 08:34:10.82 ] >>851 MODULEに突っ込んだルーチンのインターフェースは自動で生成されるから基本的に必要ない。 細部によるから全面的に成り立つわけではないが。 とんでもなく非常識なことを指定なければ、INTERFACEが必要な状況は限られる。
853 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 09:51:38.53 ] >>851 いい忘れたが、import命令はFortran2003のの命令なので、F95文法に厳格に従うなら原理主義に従うなら使えない。 その場合はTYPE宣言だけを独立したMODULEにして、そのMODULEをUSEしたMODULEで色々やる必要がある。
854 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 10:09:10.56 ] >>852 モジュールのなかにサブルーチンは入ってません。 ファイル1=>メインプログラムとサブルーチン。 ただし、containsはしておらず、ただ同じテキストに書いているだけ。 ファイル2=>モジュール。グローバル変数の宣言、タイプ文の定義、 インターフェイス。 です。 Fortan2003でもOKです。
855 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 12:43:10.69 ] >>854 悪いこと言わんからサブルーチンや関数はmoduleの中に入れとけ。 interfaceを書かなくて済むんだからこんなありがたいものはない。
856 名前:デフォルトの名無しさん [2012/04/19(木) 04:24:58.78 ] 質問があります。 連番のファイル作るコードがありますよね。 たとえば character(len=12) filename ... do i=1,100... write(filename,'(a,i4.4,a)') 'hoge',i,'.dat' open(10,file=filename)... write(10,*) ... close(10) end do みたいな感じのやつです。 これを使うとき、 character(len=16) filename do h=1,10 ... do i=1,100... write(filename,'(a,h4.4,i4.4,a)') 'hoge',h,i,'.dat' open(10,file=filename)... write(10,*) ... close(10) end do enddo という風に二重にはできないのでしょうか? 上のようにプログラムを書いたら正常に動きましたが、下に書いたようにプログラムを変更したらコンパイルはできたのですが、動かすと startint: error in format apparent state: internal I/O last format: (a,l2.2,i2.2,a) lately writing sequential formatted internal IO Aborted (コアダンプ) とでてしまいます。 何か解決策はないでしょうか?
857 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 09:44:57.14 ] >write(filename,'(a,h4.4,i4.4,a)') 'hoge',h,i,'.dat' エラーメッセージにも書いてあるように h4.4 がおかしい。i4.4 (または i は二桁だから i2.2) にすればいいんでね?
858 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 20:45:16.28 ] Windows 用の Fortran コンパイラの中で,実行ファイルの速度が 一番高いのはどれでしょうか? (‥‥なんか日本語変だな) Absoft Pro Fortran 2012 なんかは,どうなんでしょう?
859 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 22:25:30.52 ] >>858 速いのはインテルかPGIでないかな。文法に正格で厳しいのはNAG。 intel CPUならintelだろうが、AMD向けにコンパイラの最適化をやっていなかったとして公正取引委員会から叱られたからAMDの場合は微妙かも。 Absoftは元々はMacがメインだったという歴史的経緯もある。 IntelはDECのF95、AbsoftはCrayのF90フロントエンドを使っていたのでそういう因縁があればそれで選ぶのもよいかも。Laheyは富士通。 とはいえもう10年ぐらい前の話か。
860 名前:858 mailto:sage [2012/04/21(土) 22:31:03.30 ] >>859 早速の詳しいお答え,ありがとうございました m(_ _)m
861 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 12:46:26.21 ] parameter ではなくて、実行文中で一度値を代入したら 以降は値を変えられないような型はありますか?
862 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 15:35:21.79 ] MODULE変数にPROTECTED属性をつければ、MUDULE内部ルーチンからなら変えられるが、外部からは変えられない。 参考 www.nag-j.co.jp/fortran/fortran2003/Fortran2003_4_3.html
863 名前:デフォルトの名無しさん mailto:sage [2012/04/24(火) 00:05:18.04 ] ありがとうございます
864 名前:デフォルトの名無しさん [2012/04/24(火) 22:35:39.99 ] 1/2,1/3,1/4・・・を順に加えていって、何個加えたら10を超えるか調べるプログラム DO WHILE文を用いる ぜんぜんわからないのでよろしくお願いします
865 名前:デフォルトの名無しさん mailto:sage [2012/04/24(火) 23:13:38.99 ] iの初期値=1 jの初期値は0(整数型だと間違いなので注意) @ i=i+1 j=j+(1/i) j=<10でループアウト j条件にならないなら@にもどる。 i-1回だよ
866 名前:デフォルトの名無しさん mailto:sage [2012/04/24(火) 23:31:00.10 ] program nichan implicit none real :: x integer :: i i = 0 x = 0.0 do while (x < 10.0) i = i + 1 x = x + 1.0 / REAL(i) end do print *, i, x stop end program nichan オイラー常数を考えると、Σ1/i 〜 ln N + 0.577 >10 , ln N 〜 9.423, exp(9.423) =12369.6 プログラムを実行すると 12,367
867 名前:デフォルトの名無しさん mailto:sage [2012/04/24(火) 23:34:26.79 ] ホストをIntelに既定せずにOpenCLなどでGPGPUにすればPCレベルでも演算は速いよ。 安物でもTflopでるよ。 安物の場合は計算が正しいか事前チェック要 最適解を求めるなら最適解の値とその前の値を保存すれば その値を使い結果を普通に検算すればいい。 フィルタの最適化などなら十分使える。 コンパイルが適切で計算式が適切でも結果が正しいとは限らない事があるので検算は大切。
868 名前:デフォルトの名無しさん mailto:sage [2012/04/24(火) 23:36:35.80 ] 設問に1/1は入っていないのだが
869 名前:デフォルトの名無しさん mailto:sage [2012/04/24(火) 23:58:21.64 ] 答えをそのまま書いては学習にならんだろう
870 名前:デフォルトの名無しさん mailto:sage [2012/04/25(水) 23:27:40.03 ] FortranとOpenCLの組み合わせの場合も、やっぱGPU側に送るルーチンは特殊なCで書くのか?
871 名前:デフォルトの名無しさん [2012/04/26(木) 01:55:24.39 ] 整数Nを読み込み、1+1/1!+1/2!+1/3!+・・・+1/n!の値を計算して出力するプログラム このプログラムを級数の項数Nを入力するかわりに、DO WHILE文を用いて級数の項の大きさが10**(-4)以下になったとき、級数の和の計算を止めるプログラムに書き換える さらに、結果の出力として 1)収束した時の項番N 2)級数の和S 3)級数の和SとEXP(1.0)との差 を表示する 夜遅くにすいません。よろしくお願いします
872 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 01:10:24.07 ] 宿題スレなのか? n = 1 s = 1 x = 1 do while (log10(x) < 4.0D) ! 階乗の逆数を s に足し込み ! n と x を更新 end do ! 結果出力
873 名前:お願いします [2012/04/30(月) 19:21:28.96 ] fortranについて 2次元配列において(1000,1000)このデータのうち(200:300、100:400)だけ取り出しました。 このときwrite文で書きだす時、取り出したデータだけでなく、配列の個数自体とりだしたいのですがどうすれば よろしいでしょう? たとえば 結果が 200 100 10.4←これは配列の中身のデータ 201 100 2.0 202 100 4.8 203 100 5.7 ・ ・ ・ 200 101 5.6 201 101 7,9 202 101 7,9 203 101 8,0 ・ ・ ・ 200 102 6.8 201 102 15.9 202 102 26.1 ・ ・ ・ 298 400 2.2 299 400 3.2 300 400 3.6 このような感じです。よろしくお願いし
874 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 19:40:00.17 ] 質問の意味がよく分からんが、取り出した部分の総要素数という事なら、COUNT命令でおk? COUNT( x(200:300, 100:400) )
875 名前:デフォルトの名無しさん [2012/05/03(木) 21:48:11.69 ] 初期値X(0)=1としてK=1,2,3・・・の順にX(K)=cos(X(K-1))を繰り返して、|X(K)-X(K-1)|<0.00001になったら反復を打ち切り、 1)反復回数K、2)Xの近似解、3)近似解の誤差を出力するプログラム。DO WHILE文を用いる
876 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 22:09:42.36 ] 簡単過ぎる。もっと難しいの持って来い。
877 名前:デフォルトの名無しさん [2012/05/04(金) 00:01:35.98 ] 基礎演習の宿題なんでお願いします
878 名前:デフォルトの名無しさん mailto:sage [2012/05/04(金) 10:11:32.40 ] program twochannel implicit none real :: x integer :: k k = 0 x = 1.0 do while ( abs(cos(x) - x) >= 0.00001 ) k = k + 1 x = cos(x) end do print *, 'number of iterations', k, ' root', x, ' error', abs(x - cos(x)) stop end program twochannel
879 名前:デフォルトの名無しさん mailto:sage [2012/05/08(火) 11:36:16.14 ] もう一つあったFortran スレ落ちたねw
880 名前:デフォルトの名無しさん [2012/05/09(水) 01:30:31.73 ] 二次探索法のアルゴリズムに従って、解の存在範囲の上限XRと下限XRの初期値を入力し f(x)=x-cos(x)=0の解を繰り返し処理(DO WHILE)で求め、 1)近似解、2)繰り返し計算の回数、3)方程式f(x)の誤差を表示するプログラム(収束の許容精度EPSは10の-5乗)
881 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 01:36:39.70 ] 二分探索法だろ、問題分もまともに写せないのかよ。小学校からやり直せ!
882 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 01:57:45.71 ] 適当に問題文を書き写して末尾に「プログラム。」と書くと 頼まなくても答を書いてくれるプログラム。
883 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 02:16:52.55 ] 教員側もこのスレ見てたりして
884 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 02:20:11.69 ] 答え書いてとお願いしているわけではないからセーフ。
885 名前:デフォルトの名無しさん [2012/05/09(水) 13:45:54.29 ] 答えもらって丸写ししたら カンニングと同じなんだけど 底辺大学あたりだと 「人に聞いた」事が評価されるからなぁ
886 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 19:04:29.06 ] >>883 見ているw
887 名前:デフォルトの名無しさん mailto:sage [2012/05/09(水) 23:58:47.57 ] program twochan implicit none real, parameter :: eps = 1.0e-5 real :: x, xroof, xfloor, xr, xf integer :: i 1 print *, 'input lower and upper range of x' read *, xfloor, xroof if ( f(xfloor) * f(xroof) > 0.0 ) then print *, 'inappropriate inputs! ' goto 1 end if xf = xfloor xr = xroof x = 0.5 * (xf + xr) i = 0 do while ( abs( f(x) ) > eps ) i = i + 1 if ( f(x) * f(xr) > 0.0 ) then xr = x else xf = x end if x = 0.5 * (xf + xr) end do print *, 'a root of equation x - cos(x) = 0 ', x, ' no. of iterations =', i, ' absolute difference ', abs(f(x)) stop contains real function f(x) real, intent(in) :: x f = x - cos(x) end function f end program twochan
888 名前:デフォルトの名無しさん mailto:sage [2012/05/10(木) 00:01:01.37 ] 入力例 input lower and upper range of x 0.5 0.7 inappropriate inputs! input lower and upper range of x 0.5 0.8 a root of equation x - cos(x) = 0 0.7390808 no. of iterations = 13 absolute difference 7.1525574E-06 続行するには何かキーを押してください . . . 先生! おれ DO WHILE 嫌いなんで、条件緩めて下さいw IF () EXIT ; END DO の REPEAT UNTIL 派なんです。