くだすれFORTRAN(超初心者用)その4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/01/24(土) 18:32:01もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/
●関連スレ
FORTRAN �W
http://pc11.2ch.net/test/read.cgi/tech/1163319215/
0459デフォルトの名無しさん
2009/07/21(火) 23:49:16Windowsプログラムを作ろうとは思わないが、
計算に使うのには理想的だと思う。
頼むから、もういじらないでくれ・・・
0460デフォルトの名無しさん
2009/07/22(水) 00:55:31流行らないけど、廃れないから、一生役に立つ。
0461デフォルトの名無しさん
2009/07/22(水) 11:30:52100 個の変数の組: a1 = 1, a2 = 2, ..., a100 = 100
を作りたいのですが、どうすればよろしいのでしょうか?
(新しい変数名における数字は、配列の添え字 k に対応
させたいです。)
素人質問ですみませんが、どうぞよろしくお願いします。
0462デフォルトの名無しさん
2009/07/22(水) 12:44:32それ無理!
強いて言えばポインターをつかうか。
しかし考え方を変えた方がいい。
0463デフォルトの名無しさん
2009/07/22(水) 13:50:31>依存症にした後は骨まで搾り取る
ドカタ量産ですね^^
0464デフォルトの名無しさん
2009/07/22(水) 13:53:02無理ですか・・・。今、A x = b (行列 A は複素三重対角行列) の
固有値問題を解こうと思っているのですが、手元のライブラリ
(NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
多次元の場合には対応していないようなのです。
ですので、面倒ですが一旦行列 A(k) を A1, A2, ..., Ak に変換し、
その後に
call subroutine(A1, b1, ...)
call subroutine(A2, b2, ...)
call subroutine(A3, b3, ...)
...
call subroutine(Ak, bk, ...)
と全ての k の場合について毎回サブルーチンを呼ぼうと考えていました。
たとえこのようなことが原理的に可能であったとしても、k が大きい場合には
現実的ではなさそうですね。
多次元の三重対角行列を高速に解くようなライブラリ(非商用含む)が
あればいいのですが、何かありますでしょうか?
0465デフォルトの名無しさん
2009/07/22(水) 14:25:40> >> 462 さん
> 無理ですか・・・。今、A x = b (行列 A は複素三重対角行列) の
> 固有値問題を解こうと思っているのですが、
一瞬、連立方程式に見えた。A の固有値問題を解きたいということで、以下。
> 手元のライブラリ
> (NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
> 多次元の場合には対応していないようなのです。
対応していないのが信じられん。そんなもんワシなら金を出したくない。
http://www.nec.co.jp/APSOFT/SX/asl/BBGMSL.html
の連立1次方程式の例ではそんなことないようだが?
https://www.jss.jaxa.jp/sss/nqsII-web/img/man-r141/ASL/ASL/pdf/1aslsxpj.htm
から適当に探せ。ちょっと見る限りでも普通に使えそうなんだけど。
一般複素行列で考えた方が楽かも?
> 多次元の三重対角行列を高速に解くようなライブラリ(非商用含む)が
> あればいいのですが、何かありますでしょうか?
自分でインストールできるなら、LAPACK か ATLAS という選択肢もある。
既に入ってるかもしれないけどね。速度については知らん。
0466465
2009/07/22(水) 14:29:55だったら、どうして良いか分かりません。外部ファイルにデータで置いておいて、1つ
ずつ処理するとか?
0467デフォルトの名無しさん
2009/07/22(水) 15:36:37まあライブラリが一番得意なところまで
問題をdeductするのは人間の仕事だから・・・・・がんばってね!
0468465
2009/07/22(水) 16:18:24> テンソルのちょい面倒な計算なのかもな。
どうなんでしょうね。最初に
> 今、A x = b (行列 A は複素三重対角行列) の
> 固有値問題を解こうと思っているのですが
とあったので、単に行列 A の固有値問題だと即断しました。この書き方だと
単純な連立1次方程式を解きたいようにも見えるのは私だけでしょうか?
で、その後に
> 手元のライブラリ
> (NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
> 多次元の場合には対応していないようなのです
と来るので余計に混乱しました。「多次元の行列」、「多次元のベクトル」と
いう言葉をどういう意味で使っているのか分からない。単純に N×N 行列の N
の値が大きいという意味に解釈しました。
そういうわけで、行列 A の固有値問題を解きたいということと看做しました。
質問者自身が問題を理解していないという恐ろしい事態も有り得ますね…。
0469デフォルトの名無しさん
2009/07/22(水) 16:36:170470デフォルトの名無しさん
2009/07/22(水) 16:42:060471デフォルトの名無しさん
2009/07/22(水) 17:17:40integer :: n, k
complex(8) :: A(n,n,k), b(n,k), v(n,k), det(k)
do i = 1, k
call subroutine(A(1,1,i),b(1,i),v(1,i), det(i))
end do
もしくは
integer :: n, k
complex(8) :: A(n,n,k), b(n,k), v(n,k), det(k)
complex(8) :: A1(n,n), b1(n), v1(n), det
do i = 1, k
A1(:,:) = A(:,:,i) ; b1(;) = b(:,i)
call subroutine(A1(1,1),b1(1),v(1),det)
v(:,i) = v(:) ; det(i) = det
end do
マトリクスやベクトルをあらかじめ何組か準備して、
次々に解きたいだけじゃないかと解釈したが。
0472464
2009/07/22(水) 17:18:39混乱もありくだらない質問をしているとは思いますが、どうぞご容赦ください。
>> 465 さん
>> 若しかして、A が多次元というのは、例えば多次元配列 A の各要素が行列という意味?
言葉足らずですみません。今、数値的に解こうとしている方程式は2 次元複素ポアソン方程式
△f = g です。(△ はラプラス演算子。)
y 方向にフーリエ展開 (f = Σ_{k} f(k, i)*expiky) し、x 方向のみ有限差分法 (分割数 n)
で解こうとしています。各フーリエモードについて以下の n 個の連立方程式が得られますが、
a1_{k, i-1}*f_{k, i-1} + a2_{k, i}*f_{k, i} + a3_{k, i+1}*f_{k, i+1} = g_{k, i}
ここで、
A : n 行 n 列の三重対角行列
x : f_{k, i} を要素に持つ n 次元の列ベクトル
b : g_{k, i} を要素に持つ n 次元の列ベクトル
とすると、各モードについて A x = b を解くことになります。A が多次元と言いましたのは、
このモード数の次元のことを指しておりました。
モード数が 1 の場合には、紹介して頂いた連立 1 次方程式のルーチンを使えば良いと思うのですが、
複数のモード数について解く場合には、毎回サブルーチンを呼ぶ必要があるのでしょうか?
k 個の n 行 n 列の三重対角行列を一度に解く方法があればと思うのですが・・・。
>> 467 さん
ありがとうございます。人間の仕事まで落としたいのですが、甚だ修行不足で・・・頑張ります。
>> 469 さん、470 さん
A を多次元と言ったことは言葉足らずでした。混乱を招きすみません。
0473465
2009/07/22(水) 17:36:55> a1_{k, i-1}*f_{k, i-1} + a2_{k, i}*f_{k, i} + a3_{k, i+1}*f_{k, i+1} = g_{k, i}
>
> ここで、
>
> A : n 行 n 列の三重対角行列
> x : f_{k, i} を要素に持つ n 次元の列ベクトル
> b : g_{k, i} を要素に持つ n 次元の列ベクトル
>
> とすると、各モードについて A x = b を解くことになります。A が多次元と言いましたのは、
> このモード数の次元のことを指しておりました。
> モード数が 1 の場合には、紹介して頂いた連立 1 次方程式のルーチンを使えば良いと思うのですが、
> 複数のモード数について解く場合には、毎回サブルーチンを呼ぶ必要があるのでしょうか?
> k 個の n 行 n 列の三重対角行列を一度に解く方法があればと思うのですが・・・。
この中で未知数は x だとして、それでも a1 や a2 がイミフなので勝手に解釈します。
1 <= k, i <= n として
行列 A は固定する(つまり共通)。
縦ベクトル x_i の第 k 成分を f_{k,i} とする。b についても同様。
行列 X を X = ( x_1, x_2, ..., x_n ) で定義する。==> n×n 行列
行列 B を B = ( b_1, b_2, ..., b_n ) で定義する。==> n×n 行列
AX = B を解くということで終わらんか?要するに X = A^{-1}B で計算できるでしょ?
det A = 0 ではないとして。
線型代数のマトモなテキストには書いている話だと思うケド。
0474465
2009/07/22(水) 17:44:47で、私が問題を誤解している可能性は否定しない。莫迦でゴメンね。
0475デフォルトの名無しさん
2009/07/22(水) 21:09:48昔のFORTRANならEQUIVALENCEで処理するところだけど、
ModernなFORTRANでは、どうするべ?
0476464
2009/07/22(水) 21:59:49> マトリクスやベクトルをあらかじめ何組か準備して、
> 次々に解きたいだけじゃないかと解釈したが。
仰せの通りです。おっしゃる通りに書き換えてみたところ、
無事にライブラリを使うことができました!また、数値解と
解析解との一致も確認しました。
説明不足で大変混乱を招いたことと思いますが、的確なご助言
を頂き、誠にありがとうございました!
>> 465 さん
説明不足なのは申し訳なかったですが、この問題は>> 471 さんが
おっしゃっているように、「複数の行列 A (n × n 行列) と
ベクトル b (n 次元の列ベクトル)の組について、次々に
固有値を求めていく」ということでした。ですので、おっしゃる
ように固有値問題でした。
>> 475 さん
EQUIVALENCE で、考えている配列から特定の要素を抽出することが
できるんですね。これでも同様にできますね。アドバイス頂き
ありがとうこざいました。
0477デフォルトの名無しさん
2009/07/22(水) 23:23:48教科書には明示的には書いてないが、ちょっと複雑なプログラムするときには必ず使う。
他人のプログラムを見て覚えるのが普通のコースだから、2chで聞いてというのは
今風でもっともかな?
0478デフォルトの名無しさん
2009/07/24(金) 22:14:20プログラムを作ろうとおもったんですが、何度実行してもX座標が負の
値になってしまうのですがなぜでしょうか?
PROGRAM VAT
IMPLICIT NONE
REAL::V,A,T,X,Y
WRITE(*,*)'このプログラムは初速度V、角度A方向に斜方投射された物体のT秒後の位置を求めます'
WRITE(*,*)'重力加速度は9.8m/s2とします'
WRITE(*,*)'初速度V(m/s)を入力してください'
READ(*,*) V
WRITE(*,*)'投射角度A(ラジアン)を入力してください'
READ(*,*) A
WRITE(*,*)'T(秒後)を入力してください'
READ(*,*) T
X=V*COS(A)*T
Y=V*SIN(A)*T-9.80619920*T*T/2.0
OPEN(1,FILE='XandY.TXT')
WRITE(1,*)'X=',X,'(m)','Y=',Y,'(m)'
CLOSE(1)
STOP
END PROGRAM VAT
0479デフォルトの名無しさん
2009/07/24(金) 22:43:26実行結果も貼れ。こちらで試したところ、x 座標は正だった。
あとこの程度のプログラムでわざわざファイルに結果を書き込む理由が分からん。
これは好き好きだけど。
0480デフォルトの名無しさん
2009/07/24(金) 22:49:05予想される原因:角度を弧度法ではなく、度数法で入れた
0481デフォルトの名無しさん
2009/07/24(金) 23:09:46ラジアンで入れましたが、A=3.141593/3.0で入力しました
0482デフォルトの名無しさん
2009/07/24(金) 23:19:27> ラジアンで入れましたが、A=3.141593/3.0で入力しました
それだと 3.141593 で解釈される。結果を比べてみたらいい。
だから cos( A ) = -1.00 となる。
0483デフォルトの名無しさん
2009/07/24(金) 23:27:34ほんとだ・・。π/3を表したい場合はどうすればいいんですか?
0484デフォルトの名無しさん
2009/07/24(金) 23:31:01> >>482
> ほんとだ・・。π/3を表したい場合はどうすればいいんですか?
電卓で計算して出た値を直に突っ込むくらいしか思いつかない。
他には敢えて度数法で入れて、中で弧度法に変換するか。
0485デフォルトの名無しさん
2009/07/24(金) 23:40:12解決しました。
ありがとうございました
0486デフォルトの名無しさん
2009/07/24(金) 23:59:100487デフォルトの名無しさん
2009/07/25(土) 00:21:01いや、 3.2だよ
ttp://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%8A%E5%B7%9E%E5%86%86%E5%91%A8%E7%8E%87%E6%B3%95%E6%A1%88
0488デフォルトの名無しさん
2009/07/25(土) 15:00:29内接正六角形で円周を近似すれば3となる。
根拠なしに妙な数を覚えさせるよりましとも考えられる。
逆に、根拠無くともマジックナンバーを覚えさせるのが重要だという考えもある。
近年の教育界の風潮では、素朴な情緒的な根拠付けを求めて、
それ以外(とりあえず覚えとけ的なものや複雑で論理的なもの)を拒否するので
正六角形で円周を近似させる方向に行くのもさもありなんと思える。
3.14で切れてると思っている輩も居るし、有理数だと思っている輩も居る。
素朴なモンテカルロ法でやっても中々小数点以下二桁までは出ない。
理系でも超越数であることを知らないものは多い。
古代エジプトでは円の面積は直径の(1-1/9)=8/9の自乗とされたが、これだと3.16だったか。
電卓で確認してくれw これはエジプト分数(分子は1)的にはかなりいい値。
0489デフォルトの名無しさん
2009/07/25(土) 15:15:303.14と思い込ませるのも悪くないかと思うけど。
数学的素養のない一般人にはそれで十分でしょ。
「円周率?3だろ(キリッ」って言われるよかよっぽど良い。
0490デフォルトの名無しさん
2009/07/25(土) 15:25:01こういう隠蔽が積み重なってあとで取り返しがつかなくなるんだよ
1度でいいからいろいろな性質があることを説明して、ポカーンとしてるところで
「でも今は君たちにはわからんだろうからおよそ3で覚えてください」
とはっきり言ってくれればおk
0491デフォルトの名無しさん
2009/07/25(土) 15:34:32> 理系でも超越数であることを知らないものは多い。
事実として知っては居るが、証明できない。どのような知識が要るんだろう。
0492デフォルトの名無しさん
2009/07/25(土) 16:08:23具体的には代数的数ではない、んだっけ、ってことしか知らないな。
0493デフォルトの名無しさん
2009/07/25(土) 16:28:450494デフォルトの名無しさん
2009/08/06(木) 05:28:00このエラーを解決するには???
0495デフォルトの名無しさん
2009/08/06(木) 06:25:47それだけで解決方法が分かったら素晴らしいエスパーだな。
0496デフォルトの名無しさん
2009/08/06(木) 10:11:35英語を日本語に翻訳してほしいんですか?
forttl: 深刻 (67): INPUT文が要求するデータ量が多すぎます。 ユニット 50
0497デフォルトの名無しさん
2009/08/06(木) 10:56:06その発想は無かった。他に翻訳してくれそうなところ無いかな?
Excite
forrtl: 厳しい(67): 入力文はあまりに多くのデータ、ユニット50を必要とします。
Yahoo!
forrtl:厳しい(67):入力声明は、あまりにたくさんのデータ(単位50)を必要とします
forrtl :重度( 67 ) :入力文、大量のデータが、 50単位が必要
0498デフォルトの名無しさん
2009/08/06(木) 11:36:05READ(50,*)
のように書いてあるところの変数の数を疑え
0499デフォルトの名無しさん
2009/08/06(木) 23:07:21入力データの数が足りない。
0500デフォルトの名無しさん
2009/08/08(土) 00:21:42allocatbleの配列A:0.3GB程度、配列B:1.8GB程度、配列C:0.3GB程度を使用するとします。
1)まず、配列Aをallocateし、使用後にdeallocate、
2)次に、配列Bをallocate、使用後に同様にdeallocateを行い
3)最後に、配列Cをallocateし、最終処理を行う。
上記一連の作業であれば、2GBの環境で動作すると考えたのですが、
○実行すると最後の配列Cのallocateでメモリオーバーで落ちてしまいます。
○試しに、EM64Tの環境(メモリ8GB)で実行し、topコマンドでチェックしたところ、
確かに最後の配列Cのallocate部分でメモリ使用量が2.1GB程度となっていることが分かりました。
つまり、配列Bのdeallocateを行っても、この部分のメモリが解放されていないということだと思いますが、
配列Bのallocate自体はできているので、配列Aのdeallocateによるメモリ解放はできているということになると思います。
allocatbleの配列でメモリが解放される場合と、されない場合というのはどのような条件で決まるのでしょうか。
(使用コンパイラーはIntel fortran Version 9.1)
0501デフォルトの名無しさん
2009/08/08(土) 01:06:54silverfrost FTN95 compilerとcpad for FTN77でコンパイルしようとしているのですが、
うまくいきません。以下のエラーメッセージがでます。
コンパイルに失敗しました
ファイル"D:\My Documents\FORTRAN\sample.exe"は存在しません。
メッセージ
*** Invalid executable file suffix - only .EXE is permitted
どこに原因があるか教えていただけないでしょうか。
まだコンパイルすらしたこと無いド初心者ですが、よろしくおねがいします。
0502デフォルトの名無しさん
2009/08/08(土) 01:52:53CPad for FTN77 は名前の通りFTN77用なので、そのままではFTN95では使えない。
どうしてもCPadを使いたければコマンドラインの並びを変えるバッチファイルを間に噛ますか
FTN77をDLしてきて使えば良い。
他のIDEでよければFTN95 Personal Edition に付属のPlatoを使うか(但し日本語未対応)
Visual Studioが付いてきてフリーなFTN95 Expressを使えば良い。
0503501
2009/08/08(土) 03:22:49ありがとうございます。
salfordからFTN77をダウンロードできなくなっているようなのでFTN95が使えれば…と思っていたのですが
やはりそこに無理があったようですね。platoを使うことにします。
連続で申し訳ないのですが、質問させてください。
platoで無事コンパイルはできるようになったのですが、コンパイル後にstart(緑の三角)ボタンを押しても
"Press RETURN to close window . . ."と表示されたコマンドプロンプトが開くだけでプログラムが走りません。
exeファイルは生成されているのでそちらから直接起動することはできるのですが、plato上で実行する方法は無いでしょうか。
また、起動したプログラムウインドウが一瞬で勝手に閉じてしまうのですが、表示させたままにしておくことはできますか。
0504デフォルトの名無しさん
2009/08/08(土) 04:21:07FTN とかいうのを使ったことが無いので、少し調べてみました。で、分かった範囲のことを元に書きますので
結果は保証できません。
●先ず、どのようなプログラムを書いているか。
例えば例題でよくある2つの整数を入力すると、その和、差、積、商を表示するプログラムだとします。ボタ
ンを押してプログラムを実行すると、入力待ちになる筈です。で、2つの整数を入力すると次の処理に移って
計算をし、結果を表示して、プログラムを終了します。その時点で【プログラムとしてやりたいことが全て終
了して、やることが無くなった】ので、窓を閉じてしまう(とエスパー)。
●じゃぁどうしよっか。
計算結果を表示後に、更に何かを実行させる。例えば
続けて計算しますか?(Y/N)
みたいなので、次の動作を入れる。これだと入力待ちになる(ちゃんと書けばね)ので、窓は出たまま。用が
済んだら N を入力して閉じれば良いし、また別の数でやりたかったら Y を入力すれば良い。C の do while 相
当の処理が FORTRAN に有るのかは知らないけど、goto か無限ループで実現できると思う。
というのは駄目ですか?
0505デフォルトの名無しさん
2009/08/09(日) 11:07:49「y=x**3-5*(x**2)-2*x+24 のグラフを23行80桁の画面上に描画するプログラムを作成せよ。ただし、次の条件を守れ。
1)描画範囲のx (例 -1 から +6まで)をキーボードから入力し、
その範囲を画面全体に描画せよ
2)描画範囲のグラフが画面に収まるよう、
y軸の描画範囲を自動的に調整せよ。」
という課題をやっているのですが、完全に行き詰りました。
以下にとりあえずやってみたプログラムを
張って行きますので、
皆さんのお力で完成させていただけないでしょうか?
グラフの詳細は↓
ttp://skm.vip2ch.com/-/hirame/hirame051462.jpg
に、はっておきました。
何卒、よろしくお願いします。
0506デフォルトの名無しさん
2009/08/09(日) 11:08:54read *,readminx
print *,"最大値は?"
read *,readmaxx
!
real function rtransx(i,readminx,readmaxx)
real,parameter::readminx,readmaxx
real,parameter::crtminx=1.0,crtmaxx=23
integer::i
rtransx=((readmaxx-readminx)/(crtmaxx-crtminx))*(i-crtminx)+readminx
return
end function rtransx
real function func(x)
real::x
func=x**3-5*(x**2)-2*x+24
return
end function func
integer function transy(y)
real,parameter::miny,maxy
real,parameter::crtminy=1.0,crtmaxy=80
real::y
transy=(crtmaxy-crtminy)/(maxy-miny)*(y-miny)+crtminy
return
end function transy
0507デフォルトの名無しさん
2009/08/09(日) 11:10:07integer::i,iy
character*80::line
real::x,y
do i=1,23
line(1:80)=' '
x=rtransx(i,readminx,readmaxx)
y=func(x)
iy=transy(y)
line(iy:iy)='*'
print'(a80)',line
end do
end program
0508デフォルトの名無しさん
2009/08/09(日) 13:37:15> コンパイル後にstart(緑の三角)ボタンを押しても
> "Press RETURN to close window . . ."と表示されたコマンドプロンプトが開くだけでプログラムが走りません。
それでプログラムは走っている。
Plato上でプログラムを走らせると「Plato IDE」というタイトルのウインドウが開いて
そこで画面/キーボードからの入出力を行う。
「Press RETURN to close window . . .」はプログラムが終了すると表示される。
もしそれが望み通りの結果でないのなら、それはあなたのプログラムが間違っているのだ。
> また、起動したプログラムウインドウが一瞬で勝手に閉じてしまうのですが、
エクスプローラ上で実行ファイルをダブルクリックするとそうなる。
コマンドプロンプトから実行すればよい。
0509デフォルトの名無しさん
2009/08/10(月) 12:40:55今日で人生が変わった!
0510デフォルトの名無しさん
2009/08/10(月) 14:34:43地獄に片足つっこんだん?
0511デフォルトの名無しさん
2009/08/10(月) 15:14:56また犠牲者が一人・・・(´;ω;`)
0512デフォルトの名無しさん
2009/08/10(月) 19:25:07どなたか、アドバイスください。
fortran90を使っています。
0513501
2009/08/11(火) 01:11:27レスありがとうございます!
アドバイスを参考にいろいろと試してみたいと思います。
まずはプログラムの書き方の基本から身につけないといけませんね。
0514デフォルトの名無しさん
2009/08/11(火) 03:37:27Fortranでやりにくい(出来ないわけではないけどシステム依存が強すぎるからいやだ)部分って
Argumentをコマンドラインから取り込むとか、バイナリファイルの読み込みくらいだけど。
・・・ってf77の話だな。F90や95だとどうなってるんだろう?
0515デフォルトの名無しさん
2009/08/11(火) 14:27:51> Argumentをコマンドラインから取り込むとか、バイナリファイルの読み込みくらいだけど。
どっちも普通にできたと思うけど、環境依存大きいの?バイナリファイルの読み書きに関しては C と Fortran では
違いがあるので、成る可く Fortran で済ませてしまった方が良いと思うが…。
ただ市販の Fortran の本でこの辺を説明しているものは見た事が無い。あと倍精度実数も。科学技術計算云々とい
う割にその辺手抜きなのが解せん。そ〜いやプリプロセッサの話も書いてないな。洋書は知らんけど。
0516デフォルトの名無しさん
2009/08/11(火) 22:12:23STREAM I/O や コマンドライン引数の扱いはFortran2003で規格に入って統一された。
まぁそれ以前もベンダー依存の機能で実現できたが。
>>515
浮動小数点も世界がIEEE754で天下統一されて、かつその機能をFortran2003規格で
Fortran内部からアクセス出来るようになっている。
0517デフォルトの名無しさん
2009/08/12(水) 02:10:53いきなり画面に書かずに、まず画面に対応する文字配列に書くといいと思う。
そうすると、座標軸とかキャプションのたぐいも別々に処理できる。
最後に配列を一括で出力する。
昔のマイコンのキャラクター用ビデオRAMの感じ?って言ってもわかんないかなw
お盆までまってくれ。
0518デフォルトの名無しさん
2009/08/12(水) 12:11:00> お盆までまってくれ。
アンタ優しいな。
0519デフォルトの名無しさん
2009/08/12(水) 14:14:45せっかくだから、本とか出版してみたらどうだ?
10万までなら出すw
0520デフォルトの名無しさん
2009/08/12(水) 14:22:30これって、浮動小数点のビット配列とか丸め誤差が、
以前は処理系依存だったってこと?
>>515
処理系依存のものは本じゃなくて、
コンパイラのマニュアルを見るしかないんだろうね。
0521デフォルトの名無しさん
2009/08/12(水) 15:09:35>これって、浮動小数点のビット配列とか丸め誤差が、
>以前は処理系依存だったってこと?
処理系依存というか、CPUアーキテクチャに依存していたでしょ。
太古のIBM S/360の浮動小数点とか、CDC 7600の浮動小数点とか。
0522デフォルトの名無しさん
2009/08/12(水) 18:06:31そうなんですか。勉強になります。
ちょいとググってみたら、
S/360、CDC7600は60年代のメインフレームですね。
(初めてコンピュータ・アーキテクチャの概念が使われたとか、
初めてこれまでモニタと呼ばれていたOSが、
360からOSと呼ばれるようになったとか書いてある)
IEEE754が1985年だから、S/360からおよそ20年後で、
それからさらに20年ぐらいたって、Fortran2003に導入されたということですか。
それはそうと、
処理系がCPUアーキテクチャに特化してるんだから、
処理系依存という言い方はまずいんでしょうか?
0523デフォルトの名無しさん
2009/08/12(水) 19:16:5310年前くらいまでは、浮動小数点はベンダー固有のものだった。
IBM、CRAY、DEC、NECとかはそれぞれに固有のフォーマットを持っていた。
IEEEフォーマットが支配的になったのは90年代後半くらいでは無いかな?
SX−3か4あたりは、IEEE(Big,Little Endian)、IBM、CRAYの4つのフォーマットに対応していた記憶がある。
数値コプロがCPUに標準装備される前のパソコンの浮動小数演算はソフトウェア毎に
実装が異なっていて、しかも精度はメチャクチャというのが普通。
Fortran90に精度に関する関数が多いのは、IEEEが普及する前だったため。
0524デフォルトの名無しさん
2009/08/13(木) 03:06:38最小値は?
-1
最大値は?
6
| *
|
| *
| *
|
| *
|
| *
| *
| *
|
************** *
*** | *** *
| *** *
| *** *
| *** *
| ** *
| *** **
| ** *
| *** **
| *** **
| **** ****
-----------|----------------------------------**********------------------------
続行するには何かキーを押してください . . .
>>524 セルフアンカー
0525デフォルトの名無しさん
2009/08/13(木) 03:12:00寝る前に全く考えずに作ったし、バグ取りしてないw 参考程度に
正直、自分で満足できないww でも休みに遊びに行くことになったので。
間違ってたら、ごめんw でも賠償はしない。
MODULE m_screen
IMPLICIT NONE
!
INTEGER, PARAMETER :: nx = 80, ny= 23
CHARACTER(LEN = 1) :: screen(nx, ny) = ' '
REAL :: valx(nx), valy(nx)
!
CONTAINS
!-----------------------------------
SUBROUTINE calc_range(xmin, xmax, fun)
REAL, INTENT(IN) :: xmin, xmax
INTERFACE
REAL FUNCTION fun(x)
REAL, INTENT(IN) :: x
END FUNCTION fun
END INTERFACE
INTEGER :: i
DO i = 1, nx
valx(i) = (xmax - xmin) * (i - 1) / (nx - 1) + xmin
valy(i) = fun( valx(i) )
END DO
RETURN
END SUBROUTINE calc_range
0526デフォルトの名無しさん
2009/08/13(木) 03:12:52INTEGER FUNCTION iposy(i)
INTEGER, INTENT(IN) :: i
iposy = NINT( ( valy(i) - MINVAL(valy) ) / ( MAXVAL(valy) - MINVAL(valy) ) * (ny - 1) ) + 1
RETURN
END FUNCTION iposy
!-----------------------------------
SUBROUTINE plot_screen()
INTEGER :: ix, iy
DO ix = 1, nx
iy = iposy(ix)
screen(ix, iy) = '*'
END DO
RETURN
END SUBROUTINE plot_screen
!-----------------------------------
SUBROUTINE print_screen()
INTEGER :: iy
DO iy = ny, 1, -1
PRINT '(80A1)', screen(:, iy)
END DO
RETURN
END SUBROUTINE print_screen
!-----------------------------------
0527デフォルトの名無しさん
2009/08/13(木) 03:13:44INTEGER :: ix, iy, k(1)
IF ( MINVAL(valy) * MAXVAL(valy) < 0 ) THEN ! cross x-axis
k = MINLOC(valy)
iy = iposy(k(1))
DO ix = 1, nx
screen(ix, iy) = '-'
END DO
END IF
RETURN
END SUBROUTINE plot_xaxis
!-----------------------------------
SUBROUTINE plot_yaxis() !
INTEGER :: ix(1), iy
IF ( MINVAL(valx) * MAXVAL(valx) < 0 ) THEN ! cross y-axis
ix = MINLOC(ABS(valx))
DO iy = 1, ny
screen(ix(1), iy) = '|'
END DO
END IF
RETURN
END SUBROUTINE plot_yaxis
!-----------------------------------
END MODULE m_screen
0528デフォルトの名無しさん
2009/08/13(木) 03:14:27PROGRAM graph
USE m_screen
IMPLICIT NONE
REAL :: read_minx, read_maxx
!
PRINT *, "最小値は?"
READ *, read_minx
PRINT *, "最大値は?"
READ *, read_maxx
!
CALL calc_range(read_minx, read_maxx, func)
CALL plot_xaxis()
CALL plot_yaxis()
CALL plot_screen()
CALL print_screen()
STOP
CONTAINS
!-------------------------------------
REAL FUNCTION func(x)
REAL, INTENT(IN) :: x
func = x**3 - 5 * x**2 - 2 * x + 24
RETURN
END FUNCTION func
!-------------------------------------
END PROGRAM graph
うざくて、ごめんw
0529デフォルトの名無しさん
2009/08/13(木) 03:38:49SUBROUTINE plot_xaxis()
INTEGER :: ix, iy, k(1)
IF ( MINVAL(valy) * MAXVAL(valy) < 0 ) THEN ! cross x-axis
k = MINLOC(ABS(valy))
〜〜〜〜〜〜
ABS( ) が抜けてた。入れといて。
連続投稿規制でかけない
汚しすまそ
0530505,512
2009/08/13(木) 10:55:12ありがとうございました!
凄いです・・・
このスレは猛者の集まりですw
実行してみたところ、完璧に動きました。
まだまだ、私が知らない構文がいっぱいあるんですね!
これを元に、またちょっと勉強してみたいと思います。
本当に、ありがとうございました。
0531デフォルトの名無しさん
2009/08/17(月) 05:06:52gfortranをVistaにいれてみた。
gfortran関連のpathを一番前に持ってこないと、実行ファイル作成リンクで落ちた。
ん〜、なんだか。まあ自宅PCであそぶには十分か。OpenMPできるし。
0532デフォルトの名無しさん
2009/08/18(火) 20:18:12という話は聞いたことがある。Windows は色々とメンドクサイよね。もう使ってないから知らな
いけど。
0533デフォルトの名無しさん
2009/08/19(水) 02:41:35せめてpath管理だけはテキストファイルで「も」出来る仕様を残しておいてほしかった。
Ghostscript、Latex入れると自然とパスが長くなるし。
Fortranの話でないけど・・・
0534デフォルトの名無しさん
2009/08/19(水) 22:55:320535デフォルトの名無しさん
2009/08/20(木) 00:01:45ほぼどうでも良いことだが。
0536デフォルトの名無しさん
2009/08/20(木) 03:38:47そうそう。自分はgfortran用とlatex用の2つバッチ作ってる。Me以降はpathの管理が面倒だしね。
・・・・・なんだかwin3.1かDOS5.0の頃に戻ったようだw
setx.exe は使いかたがよくかわんないから使ってないけど、便利?
>>535
Win嫌いな人だとかえってPath関連は熱心になるんじゃないかなぁ?
どうだろう。
0537536
2009/08/20(木) 03:42:55で文句を言ってこなくなるまでソースを訂正すると、
他のシステムでもちょびっと速くなる気がする。気がするだけかもしれないけど。
gfortranって中で何やってるのかいまいちよくわからん。
0538デフォルトの名無しさん
2009/08/20(木) 11:06:25-Wall の意味を考えると、気のせいだと思う。でも最低限 -Wall は付けている。
0539デフォルトの名無しさん
2009/08/21(金) 13:39:17ユーザーズガイド通りに環境変数を設定。
でlapac95をビルドした後サンプルのコードをコンパイルしようとするとエラーでます。
ifort gesv.f90 -L -I-lmkl_lapack95 -lmkl_intel -lmkl_thread -lmkl_core -lguid -lpthread
gesv.f90(31): error #7002: Error in opening the compiled module file. Check INCLUDE paths. [MKL95_PRECISION]
USE MKL95_PRECISION, ONLY: WP => SP
----------^
gesv.f90(32): error #7002: Error in opening the compiled module file. Check INCLUDE paths. [MKL95_LAPACK]
USE MKL95_LAPACK, ONLY: GESV
----------^
gesv.f90(39): error #6683: A kind type parameter must be a compile-time constant. [WP]
REAL(WP), ALLOCATABLE :: A(:,:), AA(:,:), B(:,:), BB(:,:)
-----------^
gesv.f90(64): error #6406: Conflicting attributes or multiple declaration of name. [GESV]
CALL GESV( A, B )
-----------^
gesv.f90(71): error #6406: Conflicting attributes or multiple declaration of name. [GESV]
CALL GESV( AA, BB(:,1), IPIV, INFO )
-----------^
gesv.f90(31): error #6581: Unresolved rename. [WP]
USE MKL95_PRECISION, ONLY: WP => SP
---------------------------------^
gesv.f90(32): error #6580: Name in only-list does not exist. [GESV]
USE MKL95_LAPACK, ONLY: GESV
------------------------------^
compilation aborted for gesv.f90 (code 1)
何がいけないんでしょうか?よろしくお願いします。
0540デフォルトの名無しさん
2009/08/21(金) 14:23:24>Error in opening the compiled module file. Check INCLUDE paths. [MKL95_PRECISION]
0541デフォルトの名無しさん
2009/08/21(金) 14:26:04> vineにintel fortran Compilerとmkl10.2.1インストールして、
> ユーザーズガイド通りに環境変数を設定。
>
> でlapac95をビルドした後サンプルのコードをコンパイルしようとするとエラーでます。
lapack95 は自前でビルド?
> ifort gesv.f90 -L -I-lmkl_lapack95 -lmkl_intel -lmkl_thread -lmkl_core -lguid -lpthread
gfortran しか使わんので、この辺は知らん。
> -----------^
> gesv.f90(64): error #6406: Conflicting attributes or multiple declaration of name. [GESV]
> CALL GESV( A, B )
> -----------^
> gesv.f90(71): error #6406: Conflicting attributes or multiple declaration of name. [GESV]
> CALL GESV( AA, BB(:,1), IPIV, INFO )
> -----------^
これは明らかに可笑しくないか?そんな名前のサブルーチンは lapck にあるかどうか知らんが。
ウチに入れた lapack だと少なくとも man では引っ掛からなかった。
0542デフォルトの名無しさん
2009/08/21(金) 14:28:36/opt/intel/mkl/10.2.1.017/include/にINCLUDE path通してます。
コンパイル時に必要なファイルは.modのファイルですか?
/opt/intel/mkl/10.2.1.017/include/32の中に
lapack95関係の.modのファイルが入ってるんですがそっちにパス通してもうまくいきませんorz
0543デフォルトの名無しさん
2009/08/21(金) 14:30:33どうやって PATH を通してるの?
0544デフォルトの名無しさん
2009/08/21(金) 14:37:34lapack95のビルドもユーザーズガイドにあった通りにしたんで、たぶんできてるはずです。
自前というのはどういう意味ですか?
opt/intel/mkl/10.2.1.017/examples/lapack95/source/内のサンプルコードなんでサブルーチンはあるはず?
0545デフォルトの名無しさん
2009/08/21(金) 14:42:34if [ -z "${INCLUDE}" ]
then
export INCLUDE="${MKLROOT}/include"
else
export INCLUDE="${MKLROOT}/include:$INCLUDE"
fi
・
・
・
/opt/intel/mkl/10.2.1.017/tools/environment/mklvars32.shを実行すれば、
環境変数設定されるみたいにユーザーズガイドに書いてあったんですけど、
実行しても設定されないようなので上の文を.bash_profileにつけたしました。
0546541
2009/08/21(金) 14:48:44> >>541
> lapack95のビルドもユーザーズガイドにあった通りにしたんで、たぶんできてるはずです。
> 自前というのはどういう意味ですか?
公式サイトからソースを拾って来て、自分で make すること。私はそれで lapack を入れてる。
特に何もしなければ lapack.a、blas.a というファイルが出来る。で、これをリンクすると。
lapack95 はやったことがない。
と、ここまで書いてぐぐってみた。
http://basewall.kuciv.kyoto-u.ac.jp/dokuwiki/doku.php?id=ifort
なんかどう?
0547デフォルトの名無しさん
2009/08/21(金) 14:57:32ソースは元々あって、それを自分でmakeしました。
リンクするっていうのはコンパイルのときの例えば-lmkl_lapack95とかのことですか?
そのホームページも見てやってみたんですが・・・
もうちょっとやってみます!!
0548541
2009/08/21(金) 15:11:42> >>546
> ソースは元々あって、それを自分でmakeしました。
> リンクするっていうのはコンパイルのときの例えば-lmkl_lapack95とかのことですか?
そです。
それはそうと
echo $INCLUDE
の結果って、問題ないですか?設定さえチャンと出来ていれば、後はマニュアル通りにしたら
出来るはずなんですけどね。そのマニュアルってフリーで転がってんのかな。
エラーの中身見たら設定が出来てないようにも見えるけど…気のせいかな?
>>541
> これは明らかに可笑しくないか?
この部分、実は問題無いみたいですね。でもこれ、私にはとっても変態な仕様にしか見えない。
90 は余り使わないから、そう思うのかもしれない。そろそろ 90 もリハビリした方が良さそう。
再帰を書けるのは知っているけど書き方知らないし。
探せば他にも出て来ると思いますヨ。> 纏めページ
0549デフォルトの名無しさん
2009/08/21(金) 15:30:57これで大丈夫ですか?
http://www.ncsa.uiuc.edu/UserInfo/Resources/Hardware/SGIAltix/Doc/mkl10/doc/userguide.pdf
マニュアルこれです。4章のAutomating the Processでmklbars32.sh実行すればいいとあるのですが、
実行してもダメみたいで、mklbars32.sh内のソースを.bash_profileにコピペしました。
0550541
2009/08/21(金) 16:03:10>>549
> echo $INCLUDEの結果は /opt/intel/mkl/10.2.1.017/include
> これで大丈夫ですか?
それが正しいかどうかは、mklvars32.sh が無いのでなんとも。晒さなくていいですよ。
やると問題になりそうですし。
あと、気になったんですが、コンパイル時のコマンドの書式はどこから拾って来たのですか?
私が先に挙げたリンク先のサンプルでは
$ ifort /opt/intel/mkl/10.1.0.015/examples/lapack95/source/gesv.f90
-L/opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/em64t/
-I /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/em64t
-lmkl_lapack95 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lguide -lpthread
$ ./a.out < /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/data/gesv.d
となっています。$ はプロンプトです。ここでは見易さのために改行して引用していますが、実際は改行無し。
バージョンのことはキニシナイ。
-lmkl_lapack95 ということは、libmkl_lapack95.a というファイルが何処かに在る。
多くの場合は -L で指定しているディレクトリになる。
(続く)
0551541
2009/08/21(金) 16:06:20>>549
> 4章のAutomating the Processでmklbars32.sh実行すればいいとあるのですが、
> 実行してもダメみたいで、mklbars32.sh内のソースを.bash_profileにコピペしました。
そんなこと書いてないみたいですが?
In the above commands, mklvars<arch> stands for each of mklvars32, mklvarsem64t
or mklvars64.
だから
. <absolute_path_to_installed_MKL>/tools/environment/mklvars<arch>.sh
の mklvars<arch>.sh は mklvars32.sh か mklvarsem64t.sh に読み替えればいいのでは?最初の . は必要ですヨ。
0552デフォルトの名無しさん
2009/08/21(金) 16:23:33この辺も何かの参考にはなるかも?
というか気になってたんですけど、身近に質問できる人は居ないんでしょうか?
学生だと思うんだけどなぁ(何となく)。
## 2ch で聞くなよ、とかいうことではありません。念のため。
0553デフォルトの名無しさん
2009/08/21(金) 16:51:46-Lで指定しているディレクトリにパスを通してる(echo $PATHで表示される)ので、
-Lと-lの後のフォルダの指定は省いてるんですがダメですか?
コンパイルのコマンドは挙げていただいたサイトのをちょっといじって書きました。
ifort gesv.f90 -L -I-lmkl_lapack95 -lmkl_intel -lmkl_thread -lmkl_core -lguid -lpthread
>>551
最初の.が抜けてました。ありがとうございます。
>>552
linuxいじってる奴もfortran使いもいないんですwwwwwwwwwwwwww
やっぱりエラーなりますorz
何がいけないのか・・・
0554541
2009/08/21(金) 19:18:08> >>550
> -Lで指定しているディレクトリにパスを通してる(echo $PATHで表示される)ので、
> -Lと-lの後のフォルダの指定は省いてるんですがダメですか?
ダメです。環境変数 PATH は ls や gcc、make などのコマンドが在るディレクトリを登録するものです。
なので、ここに何を書いていようとライブラリは無関係。普通はね。
> >>552
> linuxいじってる奴もfortran使いもいないんですwwwwwwwwwwwwww
>
> やっぱりエラーなりますorz
> 何がいけないのか・・・
-L などを抜いたことが原因でしょうね。それだけが原因ではない気もしますが。コンパイラによって違います
が、-v または -V というオプションを付けてコンパイルすると、ライブラリなどの検索ディレクトリを表示し
ます。コンパイルもしますが、そういうものを画面に表示します。まぁ見てみると良いと思います。
で、デフォルトで登録されていない所に在るライブラリなどはコンパイル時に自分で指定しないとリンクして
くれません。しなかった場合は、そんなもの無いということでコンパイルに失敗します。例えば私の環境だと
/opt/lib に liblapack.a と libblas.a が在ります。標準的には /opt/lib なんて登録されませんし、登録する方法
も知りません。lapack のサブルーチンを使っているソースをコンパイルするときは
$ gfortran sample.F90 -L/opt/lib -llapack -lblas
とします。こうすることで、/opt/lib に在る liblapack.a と libblas.a をリンクするしろ、と指定しています。
0555デフォルトの名無しさん
2009/08/21(金) 19:38:190556デフォルトの名無しさん
2009/08/21(金) 19:45:12> /opt/intel/mkl/10.2.1.017/tools/environment/mklvars32.shを実行すれば、
> 環境変数設定されるみたいにユーザーズガイドに書いてあったんですけど、
> 実行しても設定されないようなので上の文を.bash_profileにつけたしました。
shellがbashなら .bash_profile に
source /opt/intel/fc/<IFCのバージョン>/bin/ifortvars.sh
source /opt/intel/mkl/<MKLのバージョン>/tools/environment/mklvars32.sh
を追加しとけ。
MKLは(IFCも)バージョンUP時にディレクトリ構成や必要なライブラリが変わることがあるんでヤヤコシイわ。
0557デフォルトの名無しさん
2009/08/21(金) 19:52:17こんなんではダメですか?
% nm liblapack.a | head -20
liblapack.a(sgbbrd.o):
U _lsame_
00000000 T _sgbbrd_
U _slargv_
U _slartg_
U _slartv_
U _slaset_
U _srot_
U _xerbla_
U dyld_stub_binding_helper
liblapack.a(sgbcon.o):
U _isamax_
U _lsame_
U _saxpy_
U _sdot_
00000000 T _sgbcon_
U _slacon_
U _slamch_
0558デフォルトの名無しさん
2009/08/21(金) 19:57:51ありがとうございます!
■ このスレッドは過去ログ倉庫に格納されています