くだすれFORTRAN(超初心者用)その4at TECH
くだすれFORTRAN(超初心者用)その4 - 暇つぶし2ch461:デフォルトの名無しさん
09/07/22 11:30:52
1 次元配列 a(k) = k (k は 1 から 100 まで) から、新たに
100 個の変数の組: a1 = 1, a2 = 2, ..., a100 = 100
を作りたいのですが、どうすればよろしいのでしょうか?
(新しい変数名における数字は、配列の添え字 k に対応
させたいです。)
素人質問ですみませんが、どうぞよろしくお願いします。

462:デフォルトの名無しさん
09/07/22 12:44:32
>>461
それ無理!

強いて言えばポインターをつかうか。
しかし考え方を変えた方がいい。

463:デフォルトの名無しさん
09/07/22 13:50:31
>>457
>依存症にした後は骨まで搾り取る
ドカタ量産ですね^^

464:デフォルトの名無しさん
09/07/22 13:53:02
>> 462 さん
無理ですか・・・。今、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 が大きい場合には
現実的ではなさそうですね。
多次元の三重対角行列を高速に解くようなライブラリ(非商用含む)が
あればいいのですが、何かありますでしょうか?

465:デフォルトの名無しさん
09/07/22 14:25:40
>>464
> >> 462 さん
> 無理ですか・・・。今、A x = b (行列 A は複素三重対角行列) の
> 固有値問題を解こうと思っているのですが、

一瞬、連立方程式に見えた。A の固有値問題を解きたいということで、以下。

> 手元のライブラリ
> (NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
> 多次元の場合には対応していないようなのです。

対応していないのが信じられん。そんなもんワシなら金を出したくない。

URLリンク(www.nec.co.jp)

の連立1次方程式の例ではそんなことないようだが?


URLリンク(www.jss.jaxa.jp)

から適当に探せ。ちょっと見る限りでも普通に使えそうなんだけど。
一般複素行列で考えた方が楽かも?


> 多次元の三重対角行列を高速に解くようなライブラリ(非商用含む)が
> あればいいのですが、何かありますでしょうか?

自分でインストールできるなら、LAPACK か ATLAS という選択肢もある。
既に入ってるかもしれないけどね。速度については知らん。

466:465
09/07/22 14:29:55
若しかして、A が多次元というのは、例えば多次元配列 A の各要素が行列という意味?
だったら、どうして良いか分かりません。外部ファイルにデータで置いておいて、1つ
ずつ処理するとか?

467:デフォルトの名無しさん
09/07/22 15:36:37
テンソルのちょい面倒な計算なのかもな。

まあライブラリが一番得意なところまで
問題をdeductするのは人間の仕事だから・・・・・がんばってね!

468:465
09/07/22 16:18:24
>>467
> テンソルのちょい面倒な計算なのかもな。

どうなんでしょうね。最初に

> 今、A x = b (行列 A は複素三重対角行列) の
> 固有値問題を解こうと思っているのですが

とあったので、単に行列 A の固有値問題だと即断しました。この書き方だと
単純な連立1次方程式を解きたいようにも見えるのは私だけでしょうか?

で、その後に

> 手元のライブラリ
> (NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
> 多次元の場合には対応していないようなのです

と来るので余計に混乱しました。「多次元の行列」、「多次元のベクトル」と
いう言葉をどういう意味で使っているのか分からない。単純に N×N 行列の N
の値が大きいという意味に解釈しました。

そういうわけで、行列 A の固有値問題を解きたいということと看做しました。

質問者自身が問題を理解していないという恐ろしい事態も有り得ますね…。

469:デフォルトの名無しさん
09/07/22 16:36:17
質問者はDimensionとRankを混同しているのではあるまいか。


470:デフォルトの名無しさん
09/07/22 16:42:06
むしろ、計算機科学でいうDimesionと、行列のDimensionの違いかな。

471:デフォルトの名無しさん
09/07/22 17:17:40
これじゃだめか?

integer :: 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

マトリクスやベクトルをあらかじめ何組か準備して、
次々に解きたいだけじゃないかと解釈したが。

472:464
09/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 を多次元と言ったことは言葉足らずでした。混乱を招きすみません。

473:465
09/07/22 17:36:55
>>472

> 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 ではないとして。

線型代数のマトモなテキストには書いている話だと思うケド。

474:465
09/07/22 17:44:47
結局、固有値問題ではないのね?

で、私が問題を誤解している可能性は否定しない。莫迦でゴメンね。

475:デフォルトの名無しさん
09/07/22 21:09:48
>>472
昔のFORTRANならEQUIVALENCEで処理するところだけど、
ModernなFORTRANでは、どうするべ?

476:464
09/07/22 21:59:49
>> 471 さん
> マトリクスやベクトルをあらかじめ何組か準備して、
> 次々に解きたいだけじゃないかと解釈したが。
仰せの通りです。おっしゃる通りに書き換えてみたところ、
無事にライブラリを使うことができました!また、数値解と
解析解との一致も確認しました。
説明不足で大変混乱を招いたことと思いますが、的確なご助言
を頂き、誠にありがとうございました!

>> 465 さん
説明不足なのは申し訳なかったですが、この問題は>> 471 さんが
おっしゃっているように、「複数の行列 A (n × n 行列) と
ベクトル b (n 次元の列ベクトル)の組について、次々に
固有値を求めていく」ということでした。ですので、おっしゃる
ように固有値問題でした。

>> 475 さん
EQUIVALENCE で、考えている配列から特定の要素を抽出することが
できるんですね。これでも同様にできますね。アドバイス頂き
ありがとうこざいました。

477:デフォルトの名無しさん
09/07/22 23:23:48
>>471の言っていることは、77時代の基本的テクニック。
教科書には明示的には書いてないが、ちょっと複雑なプログラムするときには必ず使う。


他人のプログラムを見て覚えるのが普通のコースだから、2chで聞いてというのは
今風でもっともかな?

478:デフォルトの名無しさん
09/07/24 22:14:20
何でもいいからつくれといわれたので斜方投射のXY座標を求める
プログラムを作ろうとおもったんですが、何度実行しても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

479:デフォルトの名無しさん
09/07/24 22:43:26
>>478
実行結果も貼れ。こちらで試したところ、x 座標は正だった。

あとこの程度のプログラムでわざわざファイルに結果を書き込む理由が分からん。
これは好き好きだけど。


480:デフォルトの名無しさん
09/07/24 22:49:05
>>478
予想される原因:角度を弧度法ではなく、度数法で入れた

481:デフォルトの名無しさん
09/07/24 23:09:46
>>479
ラジアンで入れましたが、A=3.141593/3.0で入力しました

482:デフォルトの名無しさん
09/07/24 23:19:27
>>481
> ラジアンで入れましたが、A=3.141593/3.0で入力しました

それだと 3.141593 で解釈される。結果を比べてみたらいい。
だから cos( A ) = -1.00 となる。

483:デフォルトの名無しさん
09/07/24 23:27:34
>>482
ほんとだ・・。π/3を表したい場合はどうすればいいんですか?

484:デフォルトの名無しさん
09/07/24 23:31:01
>>483
> >>482
> ほんとだ・・。π/3を表したい場合はどうすればいいんですか?

電卓で計算して出た値を直に突っ込むくらいしか思いつかない。
他には敢えて度数法で入れて、中で弧度法に変換するか。

485:デフォルトの名無しさん
09/07/24 23:40:12
>>484
解決しました。
ありがとうございました

486:デフォルトの名無しさん
09/07/24 23:59:10
関係ないけど、πって今は3なんだっけ?

487:デフォルトの名無しさん
09/07/25 00:21:01
>>486
いや、 3.2だよ
URLリンク(ja.wikipedia.org)

488:デフォルトの名無しさん
09/07/25 15:00:29
>>486
内接正六角形で円周を近似すれば3となる。
根拠なしに妙な数を覚えさせるよりましとも考えられる。
逆に、根拠無くともマジックナンバーを覚えさせるのが重要だという考えもある。

近年の教育界の風潮では、素朴な情緒的な根拠付けを求めて、
それ以外(とりあえず覚えとけ的なものや複雑で論理的なもの)を拒否するので
正六角形で円周を近似させる方向に行くのもさもありなんと思える。


3.14で切れてると思っている輩も居るし、有理数だと思っている輩も居る。
素朴なモンテカルロ法でやっても中々小数点以下二桁までは出ない。
理系でも超越数であることを知らないものは多い。

古代エジプトでは円の面積は直径の(1-1/9)=8/9の自乗とされたが、これだと3.16だったか。
電卓で確認してくれw これはエジプト分数(分子は1)的にはかなりいい値。

489:デフォルトの名無しさん
09/07/25 15:15:30
実用レベルでは有効数字3桁あればおkって場合が多いから、
3.14と思い込ませるのも悪くないかと思うけど。
数学的素養のない一般人にはそれで十分でしょ。
「円周率?3だろ(キリッ」って言われるよかよっぽど良い。

490:デフォルトの名無しさん
09/07/25 15:25:01
背後にあるものを隠蔽して気がつかせないようにする教育は理由があっても気に入らないな
こういう隠蔽が積み重なってあとで取り返しがつかなくなるんだよ

1度でいいからいろいろな性質があることを説明して、ポカーンとしてるところで
「でも今は君たちにはわからんだろうからおよそ3で覚えてください」
とはっきり言ってくれればおk

491:デフォルトの名無しさん
09/07/25 15:34:32
>>488
> 理系でも超越数であることを知らないものは多い。

事実として知っては居るが、証明できない。どのような知識が要るんだろう。

492:デフォルトの名無しさん
09/07/25 16:08:23
超越数って名前だけは知ってるが(あとπとeがそうらしいということも)、
具体的には代数的数ではない、んだっけ、ってことしか知らないな。

493:デフォルトの名無しさん
09/07/25 16:28:45
超越数って、たしか係数が全て有理数な多項式の解ではないものを言うんだっけ

494:デフォルトの名無しさん
09/08/06 05:28:00
forrtl: severe (67): input statement requires too much data, unit 50

このエラーを解決するには???

495:デフォルトの名無しさん
09/08/06 06:25:47
>>494
それだけで解決方法が分かったら素晴らしいエスパーだな。

496:デフォルトの名無しさん
09/08/06 10:11:35
>>494
英語を日本語に翻訳してほしいんですか?
forttl: 深刻 (67): INPUT文が要求するデータ量が多すぎます。 ユニット 50

497:デフォルトの名無しさん
09/08/06 10:56:06
>>496
その発想は無かった。他に翻訳してくれそうなところ無いかな?


Excite
forrtl: 厳しい(67): 入力文はあまりに多くのデータ、ユニット50を必要とします。

Yahoo!
forrtl:厳しい(67):入力声明は、あまりにたくさんのデータ(単位50)を必要とします

Google
forrtl :重度( 67 ) :入力文、大量のデータが、 50単位が必要


498:デフォルトの名無しさん
09/08/06 11:36:05
>>494
READ(50,*)
のように書いてあるところの変数の数を疑え

499:デフォルトの名無しさん
09/08/06 23:07:21
>>494
入力データの数が足りない。

500:デフォルトの名無しさん
09/08/08 00:21:42
fortran90のallocateに関してですが、メモリ2GBの環境で、
allocatbleの配列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)

501:デフォルトの名無しさん
09/08/08 01:06:54
質問させてください。
silverfrost FTN95 compilerとcpad for FTN77でコンパイルしようとしているのですが、
うまくいきません。以下のエラーメッセージがでます。

コンパイルに失敗しました
ファイル"D:\My Documents\FORTRAN\sample.exe"は存在しません。

メッセージ
*** Invalid executable file suffix - only .EXE is permitted

どこに原因があるか教えていただけないでしょうか。
まだコンパイルすらしたこと無いド初心者ですが、よろしくおねがいします。

502:デフォルトの名無しさん
09/08/08 01:52:53
>>501
CPad for FTN77 は名前の通りFTN77用なので、そのままではFTN95では使えない。

どうしてもCPadを使いたければコマンドラインの並びを変えるバッチファイルを間に噛ますか
FTN77をDLしてきて使えば良い。

他のIDEでよければFTN95 Personal Edition に付属のPlatoを使うか(但し日本語未対応)
Visual Studioが付いてきてフリーなFTN95 Expressを使えば良い。

503:501
09/08/08 03:22:49
>>502
ありがとうございます。
salfordからFTN77をダウンロードできなくなっているようなのでFTN95が使えれば…と思っていたのですが
やはりそこに無理があったようですね。platoを使うことにします。

連続で申し訳ないのですが、質問させてください。
platoで無事コンパイルはできるようになったのですが、コンパイル後にstart(緑の三角)ボタンを押しても
"Press RETURN to close window . . ."と表示されたコマンドプロンプトが開くだけでプログラムが走りません。
exeファイルは生成されているのでそちらから直接起動することはできるのですが、plato上で実行する方法は無いでしょうか。
また、起動したプログラムウインドウが一瞬で勝手に閉じてしまうのですが、表示させたままにしておくことはできますか。



504:デフォルトの名無しさん
09/08/08 04:21:07
>>503
FTN とかいうのを使ったことが無いので、少し調べてみました。で、分かった範囲のことを元に書きますので
結果は保証できません。

●先ず、どのようなプログラムを書いているか。
例えば例題でよくある2つの整数を入力すると、その和、差、積、商を表示するプログラムだとします。ボタ
ンを押してプログラムを実行すると、入力待ちになる筈です。で、2つの整数を入力すると次の処理に移って
計算をし、結果を表示して、プログラムを終了します。その時点で【プログラムとしてやりたいことが全て終
了して、やることが無くなった】ので、窓を閉じてしまう(とエスパー)。

●じゃぁどうしよっか。
計算結果を表示後に、更に何かを実行させる。例えば

続けて計算しますか?(Y/N)

みたいなので、次の動作を入れる。これだと入力待ちになる(ちゃんと書けばね)ので、窓は出たまま。用が
済んだら N を入力して閉じれば良いし、また別の数でやりたかったら Y を入力すれば良い。C の do while 相
当の処理が FORTRAN に有るのかは知らないけど、goto か無限ループで実現できると思う。


というのは駄目ですか?

505:デフォルトの名無しさん
09/08/09 11:07:49
お助けお願いします。
「y=x**3-5*(x**2)-2*x+24 のグラフを23行80桁の画面上に描画するプログラムを作成せよ。ただし、次の条件を守れ。
1)描画範囲のx (例 -1 から +6まで)をキーボードから入力し、
その範囲を画面全体に描画せよ
2)描画範囲のグラフが画面に収まるよう、
y軸の描画範囲を自動的に調整せよ。」
という課題をやっているのですが、完全に行き詰りました。
以下にとりあえずやってみたプログラムを
張って行きますので、
皆さんのお力で完成させていただけないでしょうか?
グラフの詳細は↓
URLリンク(skm.vip2ch.com)
に、はっておきました。
何卒、よろしくお願いします。

506:デフォルトの名無しさん
09/08/09 11:08:54
print *,"最小値は?"
read *,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

507:デフォルトの名無しさん
09/08/09 11:10:07
program
 integer::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

508:デフォルトの名無しさん
09/08/09 13:37:15
>>503
> コンパイル後にstart(緑の三角)ボタンを押しても
> "Press RETURN to close window . . ."と表示されたコマンドプロンプトが開くだけでプログラムが走りません。

それでプログラムは走っている。
Plato上でプログラムを走らせると「Plato IDE」というタイトルのウインドウが開いて
そこで画面/キーボードからの入出力を行う。
「Press RETURN to close window . . .」はプログラムが終了すると表示される。
もしそれが望み通りの結果でないのなら、それはあなたのプログラムが間違っているのだ。

> また、起動したプログラムウインドウが一瞬で勝手に閉じてしまうのですが、

エクスプローラ上で実行ファイルをダブルクリックするとそうなる。
コマンドプロンプトから実行すればよい。

509:デフォルトの名無しさん
09/08/10 12:40:55
fortran最高!
今日で人生が変わった!

510:デフォルトの名無しさん
09/08/10 14:34:43
>>509
地獄に片足つっこんだん?

511:デフォルトの名無しさん
09/08/10 15:14:56
>>509
また犠牲者が一人・・・(´;ω;`)

512:デフォルトの名無しさん
09/08/10 19:25:07
あの、>>505です・・・
どなたか、アドバイスください。
fortran90を使っています。

513:501
09/08/11 01:11:27
>>504,508
レスありがとうございます!
アドバイスを参考にいろいろと試してみたいと思います。
まずはプログラムの書き方の基本から身につけないといけませんね。

514:デフォルトの名無しさん
09/08/11 03:37:27
Fortranでどうにもならん部分だけCで書いてリンクすればいいしな。
Fortranでやりにくい(出来ないわけではないけどシステム依存が強すぎるからいやだ)部分って
Argumentをコマンドラインから取り込むとか、バイナリファイルの読み込みくらいだけど。

・・・ってf77の話だな。F90や95だとどうなってるんだろう?

515:デフォルトの名無しさん
09/08/11 14:27:51
>>514
> Argumentをコマンドラインから取り込むとか、バイナリファイルの読み込みくらいだけど。

どっちも普通にできたと思うけど、環境依存大きいの?バイナリファイルの読み書きに関しては C と Fortran では
違いがあるので、成る可く Fortran で済ませてしまった方が良いと思うが…。

ただ市販の Fortran の本でこの辺を説明しているものは見た事が無い。あと倍精度実数も。科学技術計算云々とい
う割にその辺手抜きなのが解せん。そ~いやプリプロセッサの話も書いてないな。洋書は知らんけど。

516:デフォルトの名無しさん
09/08/11 22:12:23
>>514
STREAM I/O や コマンドライン引数の扱いはFortran2003で規格に入って統一された。
まぁそれ以前もベンダー依存の機能で実現できたが。

>>515
浮動小数点も世界がIEEE754で天下統一されて、かつその機能をFortran2003規格で
Fortran内部からアクセス出来るようになっている。

517:デフォルトの名無しさん
09/08/12 02:10:53
>>512
いきなり画面に書かずに、まず画面に対応する文字配列に書くといいと思う。
そうすると、座標軸とかキャプションのたぐいも別々に処理できる。
最後に配列を一括で出力する。
昔のマイコンのキャラクター用ビデオRAMの感じ?って言ってもわかんないかなw

お盆までまってくれ。

518:デフォルトの名無しさん
09/08/12 12:11:00
>>517
> お盆までまってくれ。

アンタ優しいな。


519:デフォルトの名無しさん
09/08/12 14:14:45
このスレには相当のベテランがいるんだろうな
せっかくだから、本とか出版してみたらどうだ?
10万までなら出すw

520:デフォルトの名無しさん
09/08/12 14:22:30
>>516
これって、浮動小数点のビット配列とか丸め誤差が、
以前は処理系依存だったってこと?

>>515
処理系依存のものは本じゃなくて、
コンパイラのマニュアルを見るしかないんだろうね。

521:デフォルトの名無しさん
09/08/12 15:09:35
>>520
>これって、浮動小数点のビット配列とか丸め誤差が、
>以前は処理系依存だったってこと?
処理系依存というか、CPUアーキテクチャに依存していたでしょ。
太古のIBM S/360の浮動小数点とか、CDC 7600の浮動小数点とか。


522:デフォルトの名無しさん
09/08/12 18:06:31
>>521
そうなんですか。勉強になります。

ちょいとググってみたら、
S/360、CDC7600は60年代のメインフレームですね。
(初めてコンピュータ・アーキテクチャの概念が使われたとか、
 初めてこれまでモニタと呼ばれていたOSが、
 360からOSと呼ばれるようになったとか書いてある)

IEEE754が1985年だから、S/360からおよそ20年後で、
それからさらに20年ぐらいたって、Fortran2003に導入されたということですか。

それはそうと、
処理系がCPUアーキテクチャに特化してるんだから、
処理系依存という言い方はまずいんでしょうか?

523:デフォルトの名無しさん
09/08/12 19:16:53
>>522
10年前くらいまでは、浮動小数点はベンダー固有のものだった。
IBM、CRAY、DEC、NECとかはそれぞれに固有のフォーマットを持っていた。
IEEEフォーマットが支配的になったのは90年代後半くらいでは無いかな?
SX-3か4あたりは、IEEE(Big,Little Endian)、IBM、CRAYの4つのフォーマットに対応していた記憶がある。

数値コプロがCPUに標準装備される前のパソコンの浮動小数演算はソフトウェア毎に
実装が異なっていて、しかも精度はメチャクチャというのが普通。


Fortran90に精度に関する関数が多いのは、IEEEが普及する前だったため。

524:デフォルトの名無しさん
09/08/13 03:06:38
>>512
最小値は?
-1
最大値は?
6
| *
|
| *
| *
|
| *
|
| *
| *
| *
|
************** *
*** | *** *
| *** *
| *** *
| *** *
| ** *
| *** **
| ** *
| *** **
| *** **
| **** ****
-----------|----------------------------------**********------------------------
続行するには何かキーを押してください . . .
>>524 セルフアンカー

525:デフォルトの名無しさん
09/08/13 03:12:00
>>505
寝る前に全く考えずに作ったし、バグ取りしてない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

526:デフォルトの名無しさん
09/08/13 03:12:52
!-----------------------------------
INTEGER 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
!-----------------------------------

527:デフォルトの名無しさん
09/08/13 03:13:44
SUBROUTINE plot_xaxis() !
INTEGER :: 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

528:デフォルトの名無しさん
09/08/13 03:14:27
!=====================================
PROGRAM 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 

529:デフォルトの名無しさん
09/08/13 03:38:49
ごめw バグってるw X軸がちゃんと書かれない。

SUBROUTINE plot_xaxis()
INTEGER :: ix, iy, k(1)
IF ( MINVAL(valy) * MAXVAL(valy) < 0 ) THEN ! cross x-axis
k = MINLOC(ABS(valy))
        ~~~~~~

ABS( ) が抜けてた。入れといて。

連続投稿規制でかけない
汚しすまそ

530:505,512
09/08/13 10:55:12
>>524>>529さん
ありがとうございました!
凄いです・・・
このスレは猛者の集まりですw
実行してみたところ、完璧に動きました。
まだまだ、私が知らない構文がいっぱいあるんですね!
これを元に、またちょっと勉強してみたいと思います。
本当に、ありがとうございました。

531:デフォルトの名無しさん
09/08/17 05:06:52
まったく関係ないが・・・
gfortranをVistaにいれてみた。
gfortran関連のpathを一番前に持ってこないと、実行ファイル作成リンクで落ちた。
ん~、なんだか。まあ自宅PCであそぶには十分か。OpenMPできるし。

532:デフォルトの名無しさん
09/08/18 20:18:12
Fortran の話ではないけど、PATH が異様に長いときに PATH の末尾に追加すると上手く動かない
という話は聞いたことがある。Windows は色々とメンドクサイよね。もう使ってないから知らな
いけど。

533:デフォルトの名無しさん
09/08/19 02:41:35
autoexe.bat なくしたのは失敗な気もするなあ。
せめてpath管理だけはテキストファイルで「も」出来る仕様を残しておいてほしかった。
Ghostscript、Latex入れると自然とパスが長くなるし。

Fortranの話でないけど・・・

534:デフォルトの名無しさん
09/08/19 22:55:32
まあ、バッチファイルとかsetxとか使えばそれなりに管理できる > PATH

535:デフォルトの名無しさん
09/08/20 00:01:45
でも若い人はそういうことを何処で学ぶんだろう。Windows 嫌いで使わない私には
ほぼどうでも良いことだが。

536:デフォルトの名無しさん
09/08/20 03:38:47
>>534
そうそう。自分はgfortran用とlatex用の2つバッチ作ってる。Me以降はpathの管理が面倒だしね。
・・・・・なんだかwin3.1かDOS5.0の頃に戻ったようだw
setx.exe は使いかたがよくかわんないから使ってないけど、便利?
>>535
Win嫌いな人だとかえってPath関連は熱心になるんじゃないかなぁ?
どうだろう。

537:536
09/08/20 03:42:55
gfortran -Wall foo.for
で文句を言ってこなくなるまでソースを訂正すると、
他のシステムでもちょびっと速くなる気がする。気がするだけかもしれないけど。
gfortranって中で何やってるのかいまいちよくわからん。

538:デフォルトの名無しさん
09/08/20 11:06:25
>>537
-Wall の意味を考えると、気のせいだと思う。でも最低限 -Wall は付けている。

539:デフォルトの名無しさん
09/08/21 13:39:17
vineにintel fortran Compilerとmkl10.2.1インストールして、
ユーザーズガイド通りに環境変数を設定。

で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)


何がいけないんでしょうか?よろしくお願いします。

540:デフォルトの名無しさん
09/08/21 14:23:24
>>539
>Error in opening the compiled module file. Check INCLUDE paths. [MKL95_PRECISION]


541:デフォルトの名無しさん
09/08/21 14:26:04
>>539
> 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 では引っ掛からなかった。


542:デフォルトの名無しさん
09/08/21 14:28:36
>>540
/opt/intel/mkl/10.2.1.017/include/にINCLUDE path通してます。
コンパイル時に必要なファイルは.modのファイルですか?

/opt/intel/mkl/10.2.1.017/include/32の中に
lapack95関係の.modのファイルが入ってるんですがそっちにパス通してもうまくいきませんorz

543:デフォルトの名無しさん
09/08/21 14:30:33
>>542
どうやって PATH を通してるの?

544:デフォルトの名無しさん
09/08/21 14:37:34
>>541
lapack95のビルドもユーザーズガイドにあった通りにしたんで、たぶんできてるはずです。
自前というのはどういう意味ですか?

opt/intel/mkl/10.2.1.017/examples/lapack95/source/内のサンプルコードなんでサブルーチンはあるはず?

545:デフォルトの名無しさん
09/08/21 14:42:34
export MKLROOT="/opt/intel/mkl/10.2.1.017"

if [ -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につけたしました。

546:541
09/08/21 14:48:44
>>544
> >>541
> lapack95のビルドもユーザーズガイドにあった通りにしたんで、たぶんできてるはずです。
> 自前というのはどういう意味ですか?

公式サイトからソースを拾って来て、自分で make すること。私はそれで lapack を入れてる。
特に何もしなければ lapack.a、blas.a というファイルが出来る。で、これをリンクすると。
lapack95 はやったことがない。



と、ここまで書いてぐぐってみた。

URLリンク(basewall.kuciv.kyoto-u.ac.jp)

なんかどう?

547:デフォルトの名無しさん
09/08/21 14:57:32
>>546
ソースは元々あって、それを自分でmakeしました。
リンクするっていうのはコンパイルのときの例えば-lmkl_lapack95とかのことですか?

そのホームページも見てやってみたんですが・・・
もうちょっとやってみます!!

548:541
09/08/21 15:11:42
>>547
> >>546
> ソースは元々あって、それを自分でmakeしました。
> リンクするっていうのはコンパイルのときの例えば-lmkl_lapack95とかのことですか?

そです。

それはそうと

echo $INCLUDE

の結果って、問題ないですか?設定さえチャンと出来ていれば、後はマニュアル通りにしたら
出来るはずなんですけどね。そのマニュアルってフリーで転がってんのかな。

エラーの中身見たら設定が出来てないようにも見えるけど…気のせいかな?


>>541
> これは明らかに可笑しくないか?

この部分、実は問題無いみたいですね。でもこれ、私にはとっても変態な仕様にしか見えない。
90 は余り使わないから、そう思うのかもしれない。そろそろ 90 もリハビリした方が良さそう。
再帰を書けるのは知っているけど書き方知らないし。


探せば他にも出て来ると思いますヨ。> 纏めページ

549:デフォルトの名無しさん
09/08/21 15:30:57
echo $INCLUDEの結果は /opt/intel/mkl/10.2.1.017/include
これで大丈夫ですか?

URLリンク(www.ncsa.uiuc.edu)
マニュアルこれです。4章のAutomating the Processでmklbars32.sh実行すればいいとあるのですが、
実行してもダメみたいで、mklbars32.sh内のソースを.bash_profileにコピペしました。

550:541
09/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 で指定しているディレクトリになる。


(続く)

551:541
09/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 に読み替えればいいのでは?最初の . は必要ですヨ。


552:デフォルトの名無しさん
09/08/21 16:23:33
URLリンク(www.obihiro.ac.jp)

この辺も何かの参考にはなるかも?

というか気になってたんですけど、身近に質問できる人は居ないんでしょうか?
学生だと思うんだけどなぁ(何となく)。

## 2ch で聞くなよ、とかいうことではありません。念のため。

553:デフォルトの名無しさん
09/08/21 16:51:46
>>550
-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
何がいけないのか・・・

554:541
09/08/21 19:18:08
>>553
> >>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 をリンクするしろ、と指定しています。

555:デフォルトの名無しさん
09/08/21 19:38:19
スレ違いで恐縮ですが、どのライブラリにどのサブルーチンや関数が入っているか調べる方法ってありますか?

556:デフォルトの名無しさん
09/08/21 19:45:12
>>545
> /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時にディレクトリ構成や必要なライブラリが変わることがあるんでヤヤコシイわ。

557:デフォルトの名無しさん
09/08/21 19:52:17
>>555
こんなんではダメですか?

% 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_

558:デフォルトの名無しさん
09/08/21 19:57:51
>>557
ありがとうございます!

559:デフォルトの名無しさん
09/08/21 20:06:14
>>556
勉強になります。ウチの Debian は1年ほど前に急に起動しなくなってから放置してますが。


>>558
それで問題なかったのなら何よりです。

560:デフォルトの名無しさん
09/08/21 20:28:18
使わないライブラリってリンクしたらまずいですか?
サイズが大きくなって多少遅くなる?

561:デフォルトの名無しさん
09/08/21 21:27:53
>>554
丁寧に説明していただきありがとうございます。
やってみましたがなぜかエラーですwwwwwwwwwwwwww

>>556
環境変数の設定はできてるみたいです。ありがとうございます。


みなさんありがとうございました。もうちょいがんばってみようと思います。

562:デフォルトの名無しさん
09/08/21 22:38:05
確認したいんだけど、せいぜい Hello, world. を表示する程度のソースは
無事にコンパイルできる?ここで転けてたら話にならない。


563:デフォルトの名無しさん
09/08/21 23:22:39
>>562
簡単なソースのコンパイルはできます。
mklとリンクしてコンパイルすると、.aと.soファイル内に、
定義されてないサブルーチンを使用しようとしていますとか警告出ます。。

564:デフォルトの名無しさん
09/08/21 23:53:13
>>563

> mklとリンクしてコンパイルすると、.aと.soファイル内に、
> 定義されてないサブルーチンを使用しようとしていますとか警告出ます。。

これは簡単なソースをコンパイルするときに出るの?簡単なソース(Hello, World. 程度)と
ライブラリをリンクするときに出るのであれば設定が可笑しいと思う。それかコンパイル時
のコマンドの書き方か。両方の可能性もあるけど。

普通は、リンクするライブラリの中にある関数を使っていなくても、そんなことにはならな
い。例えば sin( 1.00D0 ) を計算して表示するだけのソースと FFT のライブラリをリンクし
ても文句は言われない。コンパイラはスルーすれば済むから。呼んでもないものをくっ付け
る必要は無い。

565:デフォルトの名無しさん
09/08/22 00:00:54
MKLのUser’s Guideに環境別に必要なライブラリファイルと使い方の例が載ってるから
その通りにやればコンパイル/リンクできるはずだが。

566:デフォルトの名無しさん
09/08/22 10:01:37
>>564

/opt/intel/Compiler/11.1/046/mkl/lib/32//libmkl_lapack.so: undefined reference to `mkl_serv_load_fun'
/opt/intel/Compiler/11.1/046/mkl/lib/32//libmkl_lapack.so: undefined reference to `mkl_serv_load_dll'
/opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `___tls_get_addr'

このエラーが出ます。
リンクするときって.aと.soは混ぜない方がいいんでしょうか?

>>565
その通りにやってるつもりなんですが・・・

567:デフォルトの名無しさん
09/08/22 10:19:38
>>566
コンパイル時のコマンドを晒して。

あとリンクの順番を間違えるとエラーになることがある。要するに
ライブラリ A と B をリンクするとき A が B にある関数を呼んでい
るなら、例えば A の中にある関数 funcA がその中で B の中にある
関数 funcB を呼んでいるとき

-lA -lB

という順番でリンクしないと転ける。

リンクするときは .a だけで良いはず。あとは勝手にやるはずなん
だけどライブラリに依るかもしれんので何も。


マニュアル通りにしていると言う割には勝手なことをしている気が
する。

568:デフォルトの名無しさん
09/08/22 10:25:02
>>567
ifort test.f90
-L/opt/intel/Compiler/11.1/046/mkl/lib/32/
-I/opt/intel/Compiler/11.1/046/mkl/include/ -I/opt/intel/Compiler/11.1/046/mkl/include/32/
-lmkl_lapack95 -lmkl_lapack -Wl,--start-group
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel.a
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel_thread.a
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_core.a
-Wl,--end-group -liomp5 -lpthread

ちなみに簡単なソースでリンク無しだとコンパイルできます。
lapac95は.aなんですけどlapackは.soです。
ググってみたら全部.aでやる必要があるみたいです。
が、lapackの.aファイルがないんですが、勝手に持ってきてlibフォルダにいれていいんでしょうか?

569:デフォルトの名無しさん
09/08/22 10:44:08
>>567
ifort test.f90
-L/opt/intel/Compiler/11.1/046/mkl/lib/32/
-I/opt/intel/Compiler/11.1/046/mkl/include/
-I/opt/intel/Compiler/11.1/046/mkl/include/32/
-lmkl_lapack95
-Wl,--start-group
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel.a
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel_thread.a
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_core.a -Wl,--end-group
-liomp5 -lpthread

-libmkl_lapackいらないみたいです。
これでコンパイルしようとすると以下のエラーが出ます;

/opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `___tls_get_addr'

570:デフォルトの名無しさん
09/08/22 10:44:26
>>568
> >>567
> ifort test.f90
(長いので中略)
> -Wl,--end-group -liomp5 -lpthread

このようにしなさいという説明は何処にあるのでしょう。


> が、lapackの.aファイルがないんですが、勝手に持ってきてlibフォルダにいれていいんでしょうか?

ということはビルドしていないということでは?やり方はマニュアルに書いているはず。因みに無いという
根拠はなんですか?それと

find /opt/intel -name "libmkl_*.a"

の実行結果は?

URLリンク(www.obihiro.ac.jp)

にも書いていますが、LAPACK95 はラッパーのようなので、単体では動かないと思います。勝手に持って
来るったって何処から持って来るのだろう。そんなことしても意味ないと思うケド。あと

> -lmkl_lapack95 -lmkl_lapack -Wl,--start-group

これって BLAS はリンクしてないみたいだけど、しなくて良いの?

571:デフォルトの名無しさん
09/08/22 10:52:24
>>570
>このようにしなさいという説明は何処にあるのでしょう。
ユーザーズガイドのexampleにありました。

>find /opt/intel -name "libmkl_*.a"
lapack95.aはあります。.soはありません。逆にlapac.soはあって.aはありません。
lapack95のビルドはしました。が、.soはないです;

BLASリンクしてもダメでした;

572:デフォルトの名無しさん
09/08/22 11:12:20
>>569
> これでコンパイルしようとすると以下のエラーが出ます;
>
> /opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `___tls_get_addr'

iomp5 って OpenMP 用のものみたいだから、並列でもしない限りイラネ。と思うけど、どうなんだろ?
ということで、外してやってみて。

取り敢えずオプション付けとけって感じにしか見えない。それぞれのオプションの意味を調べ直した方が
早い気がして来た。どっかに日本語版も落ちてたし。場所は忘れた。

573:デフォルトの名無しさん
09/08/22 11:29:08
横からだけど、なんでも
OpenMPのオプションを付けるといくつかのオプションを呼び出すことになって
非OpenMPでも最適化にプラスに作用するので
弊害がなければ付けておくといいよ、と奨められたことがある。
なくても良さそうだけど・・。

574:デフォルトの名無しさん
09/08/22 15:51:38
>>573
そんな話があるんですね。だったら最初から最適化しとけよ、と思わなくもないですが。



ずっと疑問なんですけど、元質問者ってそもそも何がしたいんだろう。

Fortran の勉強または単に Lapack を使う必要があるという程度なら、gfortran でも使っていれば良い。
Lapack なんてディストリビューションの公式ビルド(?)もあるだろうから、準備には手間取らない。
Debian なら Synaptic でも起動して検索すれば良いし、CentOS なら yum かな。

それでも基本的な知識が欠けているように見えるけど、考え過ぎかな。PATH の話を読んだときは噴き
ました。こちらが立ち入る話ではないんですが、何となく迷走しているように見えたので。

575:デフォルトの名無しさん
09/08/22 19:06:12
>>573
それってopenmp以外のオプションを何も付けてない場合じゃないの?
-fastや-O3などの普通の最適化オプションを付けている状態でopenmpオプションを足しても意味ないような

576:デフォルトの名無しさん
09/08/23 08:01:41
openmp つけると明示的に抑制しなければ auto やら (p)thread やらほかのも呼ぶはずけど、
どうだろうね。openmp 単独では最適化はデフォルトレベル以上はしないからどのみち -fast あたりと
いっしょに使う前提だろうけど。

577:デフォルトの名無しさん
09/08/23 08:04:41
たぶん最適化されて速くなる、というよりは
アドレスがらみのエラーが防げそう、とか
古い習慣のsave属性を仮定しないで処理する、とかがメリットなのではなかろうか。

578:デフォルトの名無しさん
09/08/23 09:35:37
>>572
iomp5外したらlapackとか使わない簡単なソースはコンパイルできました!!!

が、exampleのソースをコンパイルできないです。。。やっぱり同じエラーでます。。。

>>574
今やりたいことは逆行列求めるだけなんでlapackだけでいいし、
それぐらい自分で本見てプログラミングしろよって話なんですけど、
後々並列とかも使えるようにしたいのでmklを入れようとしたのです。

2週間ぐらい前に初めてvineインストールして、
環境変数とかも最近知ったので知識はまったくありませんorz

579:デフォルトの名無しさん
09/08/23 11:51:40
>>578
「___tls_get_addr」でgoogle先生に聞いてみたらVine Linuxだとglibcが古いのでエラーになるらしい
URLリンク(biokids.org)

CentOS5では>>569のライブラリ指定で問題なくコンパイル/リンク出来ているので
Vineの使っているglibcの問題じゃないかな?

つーか、なんでVine?
特にVineを使う必要がなければIntelで動作確認してるディストリで試してみたら?
#CentOS使っててこんな事言うのも何だが(まあ一応RHEL互換ではあるし)

580:デフォルトの名無しさん
09/08/23 12:03:07
>>579
あああぁぁぁああああFedoraいれてみます!!!!

みなさんありがとうございました!!!

581:デフォルトの名無しさん
09/08/23 12:14:51
>>578

> が、exampleのソースをコンパイルできないです。。。やっぱり同じエラーでます。。。

エラー内容は分からんが設定が出来ていないか、コンパイル時の指定にミスがあるかのどちら
かだろう。


> >>574
> 今やりたいことは逆行列求めるだけなんでlapackだけでいいし、
> それぐらい自分で本見てプログラミングしろよって話なんですけど、
> 後々並列とかも使えるようにしたいのでmklを入れようとしたのです。

だったら gfortran でいい。並列も出来る。MPI が使えることは確認済み。OpenMP は知らん。
使ってる PC に複数の CPU があるのなら並列で動かす努力に意味もあるが、マトモに Fortran
のコードを書けないうちから並列をやり始めても先に進めないまま時間が過ぎるだけのような
気がする。

知識も無いのに無理して intel を使う必要は無い。

ということで、自分でソース書けばよろし。あと Lapack のルーチンは処理内容に対して命名
規則があるので、それは自分で調べること。


しかし逆行列を求める程度のことで並列するヤツは居ないと思うが、そうでもない?>識者

582:デフォルトの名無しさん
09/08/23 14:25:29
>>581
スパコンのLinpack競争を知らんのかw

583:デフォルトの名無しさん
09/08/23 15:17:54
>>582
知りません。

並列については無知なので、だいぶイイカゲンなことを言っているとは思い
ます。でも3×3行列程度で並列というのはそれ自体がナンセンスな気はしま
す。3 が 10 でも 100 でも同様かと。100000 程度になれば意味はあるのか
もしれませんが。元質問者がどの程度の規模のことをしたいのかによって選
択肢も変わって来るでしょう。

そもそも Lapack って並列を意識して書かれてないと思いますが、そんなこ
とはないとか?


私は並列はやったことが無いですし、この先もやらないと思います。以前に
gfortran で MPI が動くことを確認したときも、リンクの仕方は私が調べて
から、「リンクの仕方は知らないけど、実行の仕方は知っている」コーハイ
君に簡単なプログラムで実行確認をしてもらっただけです。そのコーハイ君
はマトモなソースを書けな(ry

対象データを N 分割して、N 個の CPU に振り分け、個々の CPU で計算した
後に、それを1箇所にかき集めるというイメージしか無いです。間違ってる
かもしれませんが。

584:デフォルトの名無しさん
09/08/23 16:47:13
難しい話じゃなくて、サイズがでかけりゃ並列化するでしょ普通
問題は行列の性質。密行列なのか疎なのか、とか

585:デフォルトの名無しさん
09/08/23 17:24:37
>>583
逆行列計算にこそ並列化の最適化が進んでいる。
MKLなんか使えばCPU数に比例した効果が得られる。密行列だが。
そういう意味で、質問者は一応理にかなっている。

逆行列計算は、普通線形方程式を解く形で求めるが、線型方程式はアメリカの分散型の
スパコンに非常に向いていて、自分に有利なようにLINPACKという線形方程式用のパッケージで
スパコンベンチマークが行われている。
当然、その部分へのアルゴリズム研究や最適化がもっとも進んでいる。

ちなみに、おおよそLAPACK=LINPACK+EISPACK。LINPACKは線形演算、EISPACKは固有値演算
ライブラリで、1970~80年代の米英国家プロジェクトの産物。原型はFORTRAN66で書かれていて
NETLIB辺りに行けば今も拾えるはず。LAPACKは、それをFORTRAN77で統合したもの。
詳細は忘れたので間違ってるかもしれん(笑)LAPACKの前書きあたりを詳しく読んでくれ給へ。

これらの基底にBLASという基本サブルーチン集があって、この部分を書き換えることで
ハードウェアのアーキテクチャーの違いをうまく吸収して何十年も生き残っている。

586:デフォルトの名無しさん
09/08/23 17:29:09
なるほどそういう背景だったのか

587:デフォルトの名無しさん
09/08/23 18:16:07
GotoBLAS って、そのBLASを後藤さんが最適化したものなの?

588:デフォルトの名無しさん
09/08/23 18:46:54
LAPACKって疎行列も対応してるの?
密より疎のほうが一般的だよな

589:デフォルトの名無しさん
09/08/23 19:24:46
>>587
そのはず。
昔はベンダーがよくBLASだけアセンブラで最適化したのを配っていた。
ベクトル機時代はBLAS2あたりの行列*ベクトルが、今はBLAS3あたりの
行列*行列の最適化が肝らしい。

>>588
元々は密行列のみ。scaLapackとか、疎もじわじわやっている。
疎行列はベクトル機に向いていたので80年代以降すごく流行った。
数値計算のアルゴリズムも、ハードウェア・アーキテクチャに合わせて流行が変わる。

最近の並列計算機の進歩のせいで、たとえスカスカの疎行列でもメモリーに載るなら、
密に展開して密行列のライブラリを呼んだほうが有利なことがあるらし。

アメリカ人が必死になって分散メモリー・スパコン用のアルゴリズム開発をしている。
固有値問題も教科書的にはO(N^3)だが、並列機で密行列のO(N^2)のアルゴリズムが
見つかったとかいう話。詳しくは知らん(笑

590:589
09/08/23 19:35:34
なぐり書いたがscaLapackは疎じゃなかったな。
上記は、話半分嘘半分で読んでおいてくれ(笑)

591:デフォルトの名無しさん
09/08/24 09:54:36
>>589

> 最近の並列計算機の進歩のせいで、たとえスカスカの疎行列でもメモリーに載るなら、
> 密に展開して密行列のライブラリを呼んだほうが有利なことがあるらし。

これってどんなメリットがあるの?
単純にメモリー消費の事考えると、無駄多すぎて話にならんし。

構造格子のFDMを例に取ると、隣接点が6だから、
マトリクスのサイズが100万だと、メモリー効率が16万倍くらい違う。
(本当はポインタやらあるけど、単純化すると)
それを帳消しにするだけのメリットというのがわからんのだけど。

592:デフォルトの名無しさん
09/08/24 22:19:00
>>591
スピードつーものは考えんのか?
スパースったって色々あるだろが、お前の帯行列だけがスパースなのかよ。
つーか帯行列は帯行列で別のカテゴリになってるだろ。

あんた相当頭が固くて視野が狭いから、お刺身の上にタンポポを載せるような仕事のほうが向いてると思うよ。

593:デフォルトの名無しさん
09/08/24 22:37:06
正しいことを言っているのに書き方一つで尊敬されなくなる好例

最近はメモリのペナルティーが大きすぎるから10倍ぐらい計算量が多くても
ストールしないアルゴリズムを選んだ方が速くなるという話の一環だと思う

594:591
09/08/25 11:27:29
> たとえスカスカの疎行列でもメモリーに載るなら、
> 密に展開して密行列のライブラリを呼んだほうが有利なことがある

の根拠は、

> 最近はメモリのペナルティーが大きすぎるから10倍ぐらい計算量が多くても
> ストールしないアルゴリズムを選んだ方が速くなるという話の一環だと思う

とういう話があるということか。なるほど。
ただ、これってかなり特殊なマトリクスに限定した話の気がするな。

物理シミュレーションの世界で出てくるスパース行列だと、
離散点の値を使って平衡方程式解くときには、微小領域近傍の値だけを使うので、
一行あたりの非ゼロ項の個数はせいぜい数十~数百のオーダーになるのが普通。
大規模なスパース行列だと10倍どころじゃなく超スカスカになるんで、
上記の根拠をもとにスパースを密行列で置き換えるのは難しいと思う。

と書くと、また頭が固いとか視野が狭いとか言われてしまうかw
>>592
プライド傷つけてごめんねw

595:デフォルトの名無しさん
09/08/26 18:45:09
大学の研究室でfortranを使い始めたんですけど、
プログラム1で出力した座標データを
プログラム2でもう一度読み込みたいのです。

データの受け渡しの際に、x,y,z のように一行に三つの数字が並んでしまっている状態なのですが、
1.プログラム1において出力する座標データの桁数をそろえて座標データファイルを作り、
2.プログラム2において座標データファイル内のx,y,zの3つの数字をそれぞれ関数に読み込みたい
と思っているのですがプログラム1のwrite文とread文をどのように書いてよいかが分からず困っています。

どなたか教えていただけますでしょか?

596:デフォルトの名無しさん
09/08/27 02:07:26
read(unit=11,fmt='(3(x,f10.5))') x,y,z
write(unit=11,fmt='(3(x,f10.5))') x,y,z
とか、かな。fmt= はなくてもいい。
複数の連続する空白はひとつの区切りとみなされるから
読み込む側では書式指定は必要でないから
write(unit=11,fmt=*) x,y,z でも可。数字の11の部分は適当に自分で決める。

597:デフォルトの名無しさん
09/08/27 15:16:39
>>596さんありがとうございます!
さっそく試してみます。

598:デフォルトの名無しさん
09/08/27 17:08:14
>>594
まぁそうだわな

> たとえスカスカの疎行列でもメモリーに載るなら、
> 密に展開して密行列のライブラリを呼んだほうが有利なことがある

は、せいぜい10^3以下のちっこいマトリクスにしか当てはまらんと思う

応用の人達にとってマトリクスソルバの開発・実装に時間なんて割きたくないし
数値計算の研究者には大いに頑張ってもらいたいね

599:デフォルトの名無しさん
09/08/27 18:37:26
Lapack スレとかあったらどんな具合に荒れるんだろうなどと考えてしまった。

600:デフォルトの名無しさん
09/08/27 18:55:35
荒れてるうちに入らんだろこんなの

601:デフォルトの名無しさん
09/08/27 22:38:15
CLAPACKのスレならシミュレーション板にあるw

602:名無しさん@そうだ選挙に行こう
09/08/30 16:16:28
fortran 90/95にはCのqsortのような汎用ソート関数は無いのでしょうか?
Cのqsortはvoidポインタやら関数ポインタやら使ってるからfortranではやはり無理なのでしょうか?

603:名無しさん@そうだ選挙に行こう
09/08/30 16:26:19
>>602
URLリンク(slashdot.jp)

こんなんとか

604:デフォルトの名無しさん
09/09/12 21:29:22
subroutineを呼び出すときに、


IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) THEN
  CALL DIST(N)
END IF



SUBROUTINE DIST(N)


だと普通に呼び出せるんですが、

IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) THEN
  CALL DIST(N,M)
END IF


SUBROUTINE DIST(N,M)
とすると「実引数の数は仮引数の数より多く出来ません」(callの行にエラー)と怒られます。
N,Mはそれぞれ暗黙の型宣言による整数で、念のためちゃんと宣言してみても同じエラーが出てコンパイルできません。
整数型2個で同じなはずだと思うんですが…
ちなみに呼び出す側も別のサブルーチンの一部で、どちらも多くのmoduleをuse文で使ってますが関係ないですよね?
今のところ仕方ないんで別にmodule文を作って変数を共有してますが、何か気持ち悪いので考えられる原因を教えて頂けますか?

605:デフォルトの名無しさん
09/09/13 01:08:16
>>604
エラーメッセージを素直に解釈すると、サブルーチンの宣言で引数が1個しかないので
齟齬が生じていると言っている。

SUBROUTINE DISTの宣言の数行を貼ってもらえれば、なにか分かるかも。

606:デフォルトの名無しさん
09/09/14 16:21:33
>>605
うーん。でも下の例ではN,Mの二つを取ってるんですが。

>>SUBROUTINE DISTの宣言の数行

というのはこのサブルーチンの中の変数とかの宣言部ということですか?

SUBROUTINE DIST(N,M)

use cell
use sample
use comp
use gas

DOUBLE PRECISION VEL(3),T,TROT,DBOLTZ

use文は単に変数の定義を行っているmodule文に対するもので、
呼び出し元でも同様にuse文で参照してます。
DOUBLE PRECISION...の部分は呼び出し元にはありません。

607:デフォルトの名無しさん
09/09/15 01:47:05
>>606
わからんw

中間MODファイルが更新されてないとか、ありえなさげな事しか思いつかない。
まぁDIST2222とかありえ無そうな名前に変えて見てようすを見てみるとか。




608:デフォルトの名無しさん
09/09/15 08:38:02
>>607
MODファイルの事は思ったな~。念のため別なディレクトリでテストするとか・・・かな。あとは
IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) THEN
  CALL DIST(N,M)
END IF
を、
IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) CALL DIST(N,M)
だけにするとか、
IF ((N.eq.3950).or.(N.eq.2050).or.(N.eq.50)) THEN
  Iminashi=1
 1374 continue
  CALL DIST(N,M)
END IF
みたいに結果に影響しない行を一つ二つ添えてみるとか。う~ん。

609:デフォルトの名無しさん
09/09/16 10:31:39
>>607
>>608
ホンットすみません。DIST2222にしたら通りました。んで、OS再起動して元の名前にしても通りました。
なんかの理由で「中間MODファイルが更新されてない」になってたっぽいです。
プログラム上の問題じゃなかったですね…申し訳ない。

610:デフォルトの名無しさん
09/09/18 13:09:44
初心者ですみませんが質問させてください。

LINUXでintelのコンパイラ11をインストールしたのですが、
ifort 実行ファイル
で命令すると、次のようなエラーが出てしまいます。
error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory
ifort: error #10273: Fatal error in /opt/intel/bin/ia32/fortcom,

それぞれ指定されたファイルを見てもよくわからなかったので、
どうしたらコンパイルできるようになるか、ご教授おねがいいたします。


611:デフォルトの名無しさん
09/09/18 13:24:41
>>610
ただLINUXと表現するのではなくて、
ディストリビューションとバージョンをさらすといいかもしれない。


612:610
09/09/18 13:27:34
ubuntu 9.04 です。お願いします。

613:デフォルトの名無しさん
09/09/18 13:41:00
>>610
「intelコンパイラが想定しているc++の標準ライブラリより新しいものが入ってる」
に一票
どっかから, libstdc++.so.5を拾ってくるしかないと思われる

# これ以上は聞かないで, 犬のことはくわしく知らないw


614:デフォルトの名無しさん
09/09/18 13:55:39
>>610
URLリンク(beken.cc.miyakonojo-nct.ac.jp) によると
> 私の環境で前もってインストールしておくべきだったものは、以下のパッケージです。
> どちらも[システム]>[システム管理]>[Synaptic パッケージ・マネージャ]でインストールしました。
>
> * g++
> * libstdc++5
>
> libstdc++6は既にインストールされていましたが、libstdc++5はインストールされていませんでした。
> またlibstdc++5をインストールしなくてもifort自体はインストールできちゃいますが、
> プログラムのコンパイルの時に必要になります。インストールしておきましょう。

615:デフォルトの名無しさん
09/09/18 14:01:50
ubuntuとかfedoraとかは新しいのを積極的に取り入れるタイプだから、
こういう数値計算に使うときは少し古めのにするか、もう少し安定志向な
ディストリにするのが良いと思う。豆知識な。

616:デフォルトの名無しさん
09/09/24 00:31:12
ifort 11.1、error #5082: 構文エラー やっと直った。

617:デフォルトの名無しさん
09/09/25 00:21:58
黒カエラーwwww



618:デフォルトの名無しさん
09/09/26 02:36:35
処理系:gfortran v4.2
したいこと:モジュールに関数オブジェクトを保持させたい。
例えば、モジュールに変数3をセットし後に取得するプログラム
module Test
   implicit none
   integer,private::a
contains
   subroutine set(x)
     integer,intent(in)::x
     a = x
   end subroutine
   integer function get()
     integer::get
     get = a
   end function
end module
program main
   use Test
   implicit none
   call set(3)
   print *,get()
end program
というものを書くことが出来ます。

同じように、モジュールに関数を保持させることは可能でしょうか?


619:デフォルトの名無しさん
09/09/26 02:43:36
オイラー法のプログラムを書こうと思っているのですが、関数渡しで
subroutine proceed(f,x,y,step)
  interface
   double precision function f(x)
     double precision::x
   end function
  end interface
  ...
end subroutine
と引用仕様記述を書くのではなく、例えばtarget_functionという変数名
に保持してしまって、後は
target_function(x)
というのを呼び出すだけ、みたいなのにしたいのです。

620:デフォルトの名無しさん
09/09/26 19:24:10
>>618
integer, private, SAVE :: a

にすればおk?
save無くても大概大丈夫だと思うが。


621:デフォルトの名無しさん
09/09/26 19:50:23
>>620
値じゃなくて、できれば関数保持する方法が。
>>618は何したいのかわかりやすくする為の例だったんですけど、
我ながら読むと分かりにくい。

似たような感じで、関数を保持させたいんです。

622:デフォルトの名無しさん
09/09/26 22:21:48
>>621
PROCEDURE POINTER で駄目かな?
インターフェースは要るが。

MODULE m_unko
IMPLICIT NONE
INTERFACE
REAL FUNCTION f1(x)
REAL, INTENT(IN) :: x
END FUNCTION f1
END INTERFACE

PROCEDURE(f1), POINTER :: unko
REAL, PARAMETER :: pi = 4.0 * ATAN(1.0)

END MODULE m_unko
!
PROGRAM omeko
USE m_unko
IMPLICIT NONE
unko => SIN
PRINT *, unko(pi)
unko => COS
PRINT *, unko(pi)

STOP
END PROGRAM omeko

623:デフォルトの名無しさん
09/09/26 22:59:45
横からですいませんが、PROCEDUREって何ですか?
90以降の機能ですかね?

624:デフォルトの名無しさん
09/09/26 23:51:06
>>623
Fortran2003 の機能です。

副プログラムのインターフェースを、一括化できたりします。
インターフェースを書く代わりに、 Procedure (sub0) :: sub1, sub2 など。
type っぽいかんじで。


625:デフォルトの名無しさん
09/09/27 00:28:40
>>624
なるほど。ありがとうございます!

626:デフォルトの名無しさん
09/09/27 05:28:41
>>622
ありがとうございます。
でも、gfortranの4.2じゃできないっぽいですね。
v4.3以降でサポートなので、v4.3入れてやってみます!

627:デフォルトの名無しさん
09/09/27 07:50:23
お礼はいりませんよ。

628:デフォルトの名無しさん
09/09/28 07:04:01
program orei
implicit none
do while (.true.)
 write(*,*) '627 ありがとう'
end do
end program orei

629:デフォルトの名無しさん
09/10/03 17:46:13
Fortranの名著的な入門書ってありますか?


630:デフォルトの名無しさん
09/10/03 17:56:00
森口繁一のFORTRAN入門?

631:デフォルトの名無しさん
09/10/03 18:18:32
それって77じゃない?
あえて理由がない限りは、77はすっとばして90の勉強をしたほうがいいと思うけど

632:デフォルトの名無しさん
09/10/03 18:18:59
浦昭二編のFORTRAN77入門改訂版だろう
やっぱ

プログラミングの入門者には迷著かもしれないが

633:デフォルトの名無しさん
09/10/03 19:00:12
>>631
そうは言うがな、大佐。
F90以降は入門書どころか日本語の書籍自体少ないし・・・

634:デフォルトの名無しさん
09/10/03 19:35:16
倍精度の説明をキッチリやってる本ってあったっけ?見た
記憶無いんだが。

90 といえば bit の別冊であったけど、あれも絶版だよね。
単行本にしたらいいのに。あとソフトバンクからも90の本
は大昔に出てたそうだな。どっちも持ってないけど。

635:デフォルトの名無しさん
09/10/04 02:12:27
>>634
Bit別冊はMetcalf&ReidのFortran90 Explainedの訳本だから、まぁ今は最新版の原著を買えばいい?
入門書とはいえない気もするが。


636:デフォルトの名無しさん
09/10/04 19:45:15
C++は数年使ってるんだが大学で初めてFortran使わされることになった
templateとかクラスがなくて心細いよ

637:デフォルトの名無しさん
09/10/04 20:23:56
まだFortranを使わせる所もあるんだ。
物理系?

638:デフォルトの名無しさん
09/10/04 20:38:02
うん物理

639:デフォルトの名無しさん
09/10/04 21:56:45
分野にもよるけど地球物理系もFortranがバリバリ現役
しかもFortran77
過去の資産有りすぎ
Fortranのサブルーチンは変数が参照渡しだから
他の言語に移植するときめんどい

640:デフォルトの名無しさん
09/10/04 23:59:49
77はダイレクトに変数とかに触っている気がして気持ちいい。
90/95とかだと膜ごしに触っているような感触と言うか。
でもINTENTとかをガチガチに書いた90の方が全般的には気持ちいいが。
2003は実行時の多態化とか入れて便利そうなのは分かるが、また実行時バグが増えそうで
微妙な感じがする。


641:デフォルトの名無しさん
09/10/05 00:07:32
>>640
>INTENTとかをガチガチ

計算用の言語としては、この辺で十分な気がする。
十分具体的で十分美しい。かつ十分便利。

もう95位で仕様凍結してくんないかな・・・


642:デフォルトの名無しさん
09/10/05 02:24:23
>>641
> もう95位で仕様凍結してくんないかな・・・

同意。色々と弄られるとついて行けなくなりそう。個人的には
Fortran90 で十分と思ってしまうのだが、これは少数派かも。

643:デフォルトの名無しさん
09/10/05 08:27:30
intent の in out で変数値書き換えチェック
interface 文で呼び出す側で心つもりも教え
pure 属性をつけてインラインしやすくしてあげる
だけど固定書式をつらぬくのが漢!

うそだけど。
固定書式に目が慣れてるといまさら自由書式にしにくいのよね。
右側7文字が空いてないとそわそわしてしまう。

644:デフォルトの名無しさん
09/10/06 10:09:52
左側?

645:デフォルトの名無しさん
09/10/09 16:19:47
ひとつのモジュールのなかにオーバーロード?用のinterfaceと実装をまとめて記述したいんですがどう書いたらいいんでしょうか?

646:デフォルトの名無しさん
09/10/13 19:46:13
>>645
こんな感じ?

module mod1
 interface sub
  module procedure sub_int, sub_real
 end interface

contains
 subroutine sub_int(n)
  integer, intent(in) :: n
  print *, "INTEGER", n
 end subroutine sub_int

 subroutine sub_real(x)
  real, intent(in) :: x
  print *, "REAL", x
 end subroutine sub_real
end module mod1

! ---------------
program prog1
 use mod1
 call sub(1)
 call sub(2.0)
end program prog1



647:デフォルトの名無しさん
09/10/13 20:37:51
>>646
まさにこれです
ようやっと期待通りにコンパイルできました
有難うございました

648:デフォルトの名無しさん
09/10/15 04:55:19
通りすがりだけど、参考にしよう。

この例のは、引数の型で振舞を変える事ができるから、標準のmaxやmin関数を連想した。
・・・引数の変数名の数の違いで振舞を変えるもの作れるのかな?

649:デフォルトの名無しさん
09/10/15 13:56:19
>>648
任意個数引数の副プログラムは作れないと思う。
Array Constructor で、見かけ上引数を沢山並べるが、引数的には配列として受け取るようにすれば
実現できる気もする。

Call sub( [a, b, c, d, e, f, g] )

Subroutine Sub( x )
Real, Intent (in) :: x(:)

みたいな。

650:デフォルトの名無しさん
09/10/15 14:41:54
おお、そういうやり方があるんだ。

今コンパイラを使えない状況にいるので・・、
とりいぞぎお礼まで。

651:デフォルトの名無しさん
09/10/16 00:37:33
>>650
補足するならば、[ ] はfortran2003での導入なので、f90的には(/ /)となる。

確定した有限個まででよければ、optional引数を使うとか、1個からn個までのサブルーチンを用意して、
総称名を与える方法も考えられる。


652:デフォルトの名無しさん
09/10/16 20:54:23
たった今Fortranをやり始めたものです。コンパイラーはg95を使ってます。


最初の宣言部であるパラメータのベクトル p を宣言しようと思って、

real, parameter, dimension(3) :: p(1)=0.5, p(2)=0.8, p(3)=1.6

のように入力したのですが、

Error: Symbol 'p' at (1) already has basic type of REAL

というエラーメッセージが表示されました。ただ、このメッセージの
意味さえ解せない状況です。どなたか正しい方法を教えていただけ
ないでしょうか。よろしくお願いします。

653:デフォルトの名無しさん
09/10/17 00:53:45
>>652
こうすれば、おk。

PROGRAM test
IMPLICIT NONE
REAL, PARAMETER :: p(3) = (/ 1.0, 2.0, 3.0 /) ! f90/f95
!REAL, PARAMETER :: p(3) = [1.0, 2.0, 3.0] ! f2003
PRINT *, p
STOP
END PROGRAM test

654:デフォルトの名無しさん
09/10/17 01:29:41
>>653
ありがとうございます!

655:デフォルトの名無しさん
09/10/17 20:19:27
common文の代わりにmoduleを変数の共有に使ってるんですが、
そのサブルーチンの中で使ってないmoduleをuseしたりすると
(バグの温床になる以外に)何か弊害ってありますか?
どの変数を使ってるか確認する手間が大きくなり過ぎた場合に
全てのmoduleをどさっとuseしても構わないもんでしょうか?

656:デフォルトの名無しさん
09/10/18 12:57:28
>>655
依存関係が無くても、USEされているためにリコンパイルされる可能性があるが、
文法的には問題ないような。


657:デフォルトの名無しさん
09/10/18 17:41:02
>>655
ローカルの変数とコンフリクトしたらコンパイラが教えてくれるので
ぜんぜん問題ないと思うけど・・・

どっさりuseしなきゃならんサブルーチンの構成は、
見直した方が幸せになれるかもね

658:デフォルトの名無しさん
09/10/21 07:49:59
use 文って便利だけど不便だよねw

659:デフォルトの名無しさん
09/10/25 22:49:38
Intel の Steve Lionel が鉄腕アトム劇場版を見て面白かったと言ってるw
URLリンク(twitter.com)

じじい受けするのか?


660:デフォルトの名無しさん
09/10/26 04:02:09
NaNが出てきちゃった時、どうやって原因を突き止めますか?NaNが発生してると思しきところと
発覚するところが離れてる上に乱数使う手法で、しかもたまにしか起こらないので手の付けようがありません。
ズバッと解決はしないかもしれないけど何か助言をもらえればうれしいです。

661:デフォルトの名無しさん
09/10/26 05:20:01
>>660
乱数を使っているなら、種を特定すれば良いんじゃないか?種を手で与える方法もあるんだし。
現象が起きるときの種が分かっていればバグ取りは出来るはず。それだけでは足りないかもし
れないけど、何も情報が無いよりはマシ。

あと、NaNが出る式の実行直前に、式で使う変数の中身を書き出せば何か分かるかもしれん。
何をやっているのか分からんので、それくらいしか言いようが無い。

662:デフォルトの名無しさん
09/10/26 05:43:13
なるほど…ありがとうございます。ちょっとその方向で試してみます。
Xの値を調べて場合分けするんですが、XがNaNなのでエラーが出て発覚する、って感じです。
その場合分けしてる位置よりかなり以前の複数の場所でXが代入されてる上にXの代入が多すぎて
全部調べるのが厳しいんです。といってもそれしか思いつかずちまちまやってました。

663:デフォルトの名無しさん
09/10/26 06:44:30
宣言した範囲外の配列値を参照すると subscription out of range のエラーを出さずに
NaNや変な値を返して計算をぶっ続けるシステムもあるよね。一応配列もチェックすることをお薦めする。

システムごとにNaNやInf検出して停止させる機能があると思うけどな。
発生した場所をソースの行番号で教えてくれる・・・はず。
富士通Fortranはデバッグ機能が神がかり的に優秀だけどIntelその他にも似た機能はあるだろう。

自分で直接追求するときにはとりあえず
if (.NOT. ((x .GT. -1.0) .OR. (x .LT. 1.0))) then ...
の判定で場所を特定してるけど・・・みんなはどうやってNaN発生を見つけてるの?

664:デフォルトの名無しさん
09/10/26 07:03:59
>>663
配列の宣言外領域へのアクセスについては、実行時にチェックするオプションを
付けてコンパイルしている。でも個々の変数の中身がNaNになったら止める方法
は知らない。あれば知りたいくらいだ。

しかし変数にNaNが入った時点でプログラム自体に問題があるように思うのは間
違ってるだろうか?初期化の時にNaNを入れるのも可笑しいしなぁ。

665:デフォルトの名無しさん
09/10/26 23:19:35
>>664
Fortran2003ならIEEE754例外を拾う関数がある。
F2003でなくても最近のコンパイラはベンダー拡張サブルーチンでIEEE例外を検知できることが多い。

666:デフォルトの名無しさん
09/10/27 02:55:23
>>665
有り難うございます。貧乏なので gfortran しか持ってません。並列とかするわけでもないので
特に困る事もないのですが。で、その gfortran のマニュアルを見ていたら、isnan() という関
数がありました。これで検知だけは出来そうです。オプションでも -ffpe-trap というのがあり
ましたが、使ってみたら実行時に警告が出ただけで、プログラム自体は正常終了してた。使えな
いのかな。それとも PPC なのが悪いのか。取り敢えず気になる変数だけ、isnan() を使ってチ
ェックすれば良いかな、と思うことにしました。


C マニュアルに載ってたサンプル: test_nan.F90 とでもする
program test_nan
implicit none
real :: x
x = -1.0
x = sqrt(x)
if (isnan(x)) stop '"x" is a NaN'
end program test_nan


% gfortran test_nan.F90 -ffpe-trap=invalid
% ./a.out
Fortran runtime warning: IEEE 'invalid operation' exception not supported.
STOP "x" is a NaN
% echo $?
0


667:デフォルトの名無しさん
09/10/27 08:51:44
通りすがりがテストしてみた。

% gfortran test_nan.f90 -ffpe-trap=invalid

In file test_nan.f90:6
if (isnan(x)) stop '"x" is a NaN'
    1
Error: Function 'isnan' at (1) has no IMPLICIT type

コンパイル止まったお! バージョンにも依るのかな?

SPARCかな、CPUによってはNaNやInfが出てくるとハード的にフラグをたててくれるみたいだけど
一般的じゃないからなあ。
>>663 の条件式はハードやコンパイラ関係無くNaNは見つけてくれそうだけど、
システムによっては+/-Infは判定できないんじゃないかな。

668:デフォルトの名無しさん
09/10/27 09:43:51
>>666 です

>>667
うちは

% gfortran --version
GNU Fortran (GCC) 4.4.1

だった。マニュアル(但し 4.4.2 版)によると、isnan は論理型とのこと。オプションの -ffpe-trap=invalid
は無くても isnan 自体には問題なかった。

自宅にある唯一の Fortran90 の本「Fortran90/95 explained (2nd ed.)」によると、ieee_arithmetic という
モジュール?には ieee_is_nan という関数があるとのことだけど、モジュールってどうやって使うの?ずっと
77でやってきたから知りません。イイカゲン90の勉強をした方が良さそうな気がして来たが、もうFortranを
使う用事ってないんだよなぁ。趣味で数値計算でもしない限り。

あと、名前付き定数?(named constants)というヤツの中に ieee_nan というのがあるらしい。取り敢えず
同書から引用しておきます。

ieee_nan The scoping unit must support NaNs for at least one kind of real.

これを何の目的でどう使うのかは分かりません。ゴメンナサイ。

669:デフォルトの名無しさん
09/10/27 12:41:45
ありがとう。

GNU Fortran (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42)
・・・2年前のだった。
こんど再挑戦してみるよ。

670:デフォルトの名無しさん
09/10/27 18:07:40
そんな難しいことする前に、
ゼロ割とSQRTチェックがまだだったら、
そこ見た方がいいよ。

もうチェック済ならスマン

671:デフォルトの名無しさん
09/10/27 22:09:11
列の数が任意のテキストデータ(列間は空白など)を読む方法を
考えているのですが、上手い方法が思いつきません。
行の場合は、EOFのチェックをすればいいので簡単なのですが・・・

672:デフォルトの名無しさん
09/10/28 02:02:02
>>671
EOR end of record のチェックをするという手もある。自由フォーマットだとうまく行かないが。

あとは、一度一行を文字列として読んで、次にその文字列を内部ファイルとして、それから読み出す
というやり方も考えられる。

データの幅が一定フォーマットなら比較的楽。
空白で切ってるだけで可変長の場合は、ややめんどいかな?


673:672
09/10/28 02:11:12
PROGRAM test
IMPLICIT NONE
! INTEGER, PARAMETER :: iostat_eor = -2, iostat_end = -1
REAL :: a(20)
INTEGER :: io, i, k
CHARACTER (LEN = 136) :: text
! prepare data
DO i = 1, 10
WRITE(9, '( 10(F10.5, X) )') (REAL(k), k = 1, i)
END DO
CLOSE(9)
! (2)
!
DO
READ(9, '(a)', IOSTAT = io) text
IF (is_iostat_end(io)) EXIT ! f2003
a = a / 0.0 ! NaN
READ(text, *, IOSTAT = io) a
IF (is_iostat_eor(io)) EXIT ! f2003
PRINT *, a
END DO
STOP
! (1)
!
DO
READ(9, '(10F10.5)', IOSTAT = io) a
IF (is_iostat_eor(io)) EXIT ! f2003
IF (is_iostat_end(io)) EXIT ! f2003
PRINT *, a(1:10)
END DO
STOP
END PROGRAM test

674:デフォルトの名無しさん
09/10/28 15:56:59
質問です。
シンプソン法を用いてy=exp(x)の計算プログラムを作っています。
以下のプログラムの15、16行目のfun()の中には、
何を入れればいいのでしょうか?


675:デフォルトの名無しさん
09/10/28 15:58:29
program simpson1
implicit none
integer::m,i
real(8)::a,b,s,s1,s2,h,x,fun
external fun
1 continue
write(*,*)'INPUT DATA'
write(*,*)'A,B,M ?'
read(*,*)a,b,m
if(m<=0)stop
h=(b-a)/m
s1=0.D0
s2=0.D0
do i=1,m/2-1
s1=s1+fun(i)
s2=s2+fun(i)
end do
s1=s1+fun((m-1)*h+a)
s=h/3*(fun(a)+fun(b)+4*s1+2*s2)
write(6,100) s
100 format(2x,'IR=',D16.6)
end program simpson1
!
function fun(x)
implicit none
real(8)::fun,x
fun=exp(x)
return
end function fun


676:671
09/10/28 16:19:35
>>672,673
ありがとうございます。

「一度一行を文字列として読んでから、その文字列を内部ファイルで読み出す」は応用が利いて便利ですね。
区切りを空白とする以外はフォーマットを限定しない仕様にしたかったので、
この方法がベストだと思いました。NaNのチェックはisnan()を使いました。

最後にもう一点お聞きしたいのですが、EORはformattedで読む場合も関係あるのでしょうか?
また、どういう使い方をするのでしょうか?

677:デフォルトの名無しさん
09/10/28 17:00:51
サブルーチンについての質問したいことがあるのでソース貼らせていただきます。
お忙しいとは思いますが、よろしくお願いします。まず下のソースを見てください。
このプログラム自体は完成しているのですが、
DO 1040 a=1,M
DO 1030 k=1,24
AVE(a)=AVE(a)+(sl(k,a))
1030 continue
WRITE(2,*)AVE(a)/24
1040 continue
の部分をサブルーチンで直して来いといわれたので、
サブルーチンについて調べて色々やりくりしてみたのですが
サブルーチンについての理解が乏しいため上手くいきません。
もしこの箇所をサブルーチンを利用して書き換えるならどのようになるのか教えていただけませんか?
よろしくお願いします。


678:デフォルトの名無しさん
09/10/28 17:02:47
上の続き(ソース)です。よろしくお願いします。
   implicit none
integer MM,KK,M,K,a
parameter (MM=400,KK=100)
integer year(MM),month(MM),day(MM),sl(KK,MM),AVE(MM)
character cdummy,CFNAME*110,CFNAME2*80
M=0
CFNAME='/home/maekawa/numeric/kure.txt'
open(1,file=CFNAME,status='old')
1010 M=M+1
read(1,10,END=1020)cdummy,year(M),cdummy,month(M),
@ cdummy,day(M),(cdummy,sl(k,M),k=1,24)
10 format(A5,I2,A1,I2,A1,I2,24(a1,I3))
write(6,*)year(M),month(M),day(M),(sl(k,M),k=1,24)
goto 1010
1020 close(1)
M=M-1
CFNAME2='/home/maekawa/numeric/aki.txt'
open(2,file=CFNAME2,status='old')
DO 1040 a=1,M
DO 1030 k=1,24
AVE(a)=AVE(a)+(sl(k,a))
1030 continue
WRITE(2,*)AVE(a)/24
1040 continue
CLOSE(2)
end


679:デフォルトの名無しさん
09/10/29 02:45:00
>>676
EORはF90以降だったようだ。
昨日は勘違いして77時代からあった気になっていた。使い方を良くわかっていなかったww
文法書を見てもらった方が早いが、そもそもFORMATつきでADVANCE='NO'でないと駄目のもよう。

77だとIOSTATでエラー番号を見ればEORを検出できるが、I/Oエラー番号はベンダー依存。
他のI/Oエラーが出ない自信があれば、ERR=nnで飛ぶことも可能。

77だとブランクを数値ゼロに解釈するので、文字列を内部ファイルとして読む場合に
色々前処理をしないとうまくいかないかもしれない。
90なら文字列をTRIMするなり、フォーマットをBNにするなりで対処しやすい。

まとまり無くてスマソ

680:デフォルトの名無しさん
09/10/29 12:12:40
そもそもFortranは「任意のサイズの○○」というのがやりにくい言語だよね
そういうもんだと思って諦めてるけど

681:デフォルトの名無しさん
09/10/29 14:11:01
最初に1回から読みして要素数(行数)確認してから
Allocate...とか、かな。
でもこの辺の取り回しはどの言語も同じだよね。
使っていくうちに増える場合には
一度既存のデータ配列と同じサイズのTempな変数をAllocateしてそこに移して、
元のを開放してからまた同名で要素一個大きいのをAllocateして
TEMPのを移して、TEMP開放、の流れは基本同じだし。

682:デフォルトの名無しさん
09/10/29 14:13:51
終始一貫変化しない任意のサイズ、でなかったら77だときついな。
データを一度ファイルに落として、そのファイルの行数を数えてから
自動配列で配列生成してそのファイルを読む・・・・・とか。
不可能じゃないけどイヤだなw。

683:デフォルトの名無しさん
09/10/29 18:38:33
>>681
Fortranに限らず、データの個数が任意に変わる場合は
ポインタ使ったリスト構造を作るのが普通じゃない?

>>682
結局は、「Fortranでそういうことスンナ」って話になるよねw
速度的にも宜しくないし、データ量の多い科学計算には相容れない

684:デフォルトの名無しさん
09/10/30 04:46:30
・・・馬鹿でかい配列を最初に定義してそこで処理するのもなあ。
メモリがもったいない事は今はあまりないけどやはり非効率だし
場合によっては十分大きくとったつもりでも足りなかったり。

685:デフォルトの名無しさん
09/10/30 09:47:58
IBMのFortranのオンラインマニュアルにも、Fortran77と違って
大きな配列を最初に定義しなくて良くなりますよ~、という事を
Allocateのメリットの例にしてるくらいだからな。


686:デフォルトの名無しさん
09/10/30 13:27:32
FORTRANは言語仕様が堅くて大変だねえ
C/C++ならそういう問題で頭を悩ます必要もないのに

687:デフォルトの名無しさん
09/10/30 14:46:45
>>686
最適化がしやすいようにわざと堅く作ってあるんだよ
C/C++は確かに自由な文法だが最適化がしにくい

688:デフォルトの名無しさん
09/10/30 15:49:03
最適化しにくいし、コンパイラ毎に推奨される書き方の違いは
Fortranより大きいと思う。個人的にはこっちがいやで
Fortranを中心に使っている。

でもやはりというかCのI/Oその他の自由度の高さゆえに
最終的には混ぜこぜコードの出来上がり、になる事も多いけど。
Cはコーディングの自由がありすぎて、結局サイトや教科書の
部分的丸写しが多くなっちゃうから上達しないだけなんだろうけどな。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch