[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 10/07 02:37 / Filesize : 345 KB / Number-of Response : 920
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん [2009/01/24(土) 18:32:01 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。


●前スレ
くだすれ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/


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

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

545 名前:デフォルトの名無しさん [2009/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 mailto:sage [2009/08/21(金) 14:48:44 ]
>>544
> >>541
> lapack95のビルドもユーザーズガイドにあった通りにしたんで、たぶんできてるはずです。
> 自前というのはどういう意味ですか?

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



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

basewall.kuciv.kyoto-u.ac.jp/dokuwiki/doku.php?id=ifort

なんかどう?

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

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

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

そです。

それはそうと

echo $INCLUDE

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

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


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

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


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

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

www.ncsa.uiuc.edu/UserInfo/Resources/Hardware/SGIAltix/Doc/mkl10/doc/userguide.pdf
マニュアルこれです。4章のAutomating the Processでmklbars32.sh実行すればいいとあるのですが、
実行してもダメみたいで、mklbars32.sh内のソースを.bash_profileにコピペしました。

550 名前:541 mailto:sage [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 で指定しているディレクトリになる。


(続く)

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


552 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 16:23:33 ]
www.obihiro.ac.jp/~suzukim/masuda/ifc_lapack31.html

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

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

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



553 名前:デフォルトの名無しさん [2009/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 mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 19:38:19 ]
スレ違いで恐縮ですが、どのライブラリにどのサブルーチンや関数が入っているか調べる方法ってありますか?

556 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 19:57:51 ]
>>557
ありがとうございます!

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


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

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

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

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


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

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




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

564 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 23:53:13 ]
>>563

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

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

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

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

566 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 10:19:38 ]
>>566
コンパイル時のコマンドを晒して。

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

-lA -lB

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

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


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

568 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 10:44:26 ]
>>568
> >>567
> ifort test.f90
(長いので中略)
> -Wl,--end-group -liomp5 -lpthread

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


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

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

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

の実行結果は?

www.obihiro.ac.jp/~suzukim/masuda/ifc_lapack31.html

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

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

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

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

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

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

572 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 11:29:08 ]
横からだけど、なんでも
OpenMPのオプションを付けるといくつかのオプションを呼び出すことになって
非OpenMPでも最適化にプラスに作用するので
弊害がなければ付けておくといいよ、と奨められたことがある。
なくても良さそうだけど・・。

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



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

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

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

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

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

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

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

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

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

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

579 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 11:51:40 ]
>>578
「___tls_get_addr」でgoogle先生に聞いてみたらVine Linuxだとglibcが古いのでエラーになるらしい
ttp://biokids.org/?CCP4%2FAdvanced%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB

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

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

580 名前:デフォルトの名無しさん [2009/08/23(日) 12:03:07 ]
>>579
あああぁぁぁああああFedoraいれてみます!!!!

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

581 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 12:14:51 ]
>>578

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

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


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

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

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

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


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

582 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 14:25:29 ]
>>581
スパコンのLinpack競争を知らんのかw



583 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 15:17:54 ]
>>582
知りません。

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

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


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

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

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

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

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

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

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

586 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 17:29:09 ]
なるほどそういう背景だったのか

587 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 18:16:07 ]
GotoBLAS って、そのBLASを後藤さんが最適化したものなの?

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

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

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

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

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

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

591 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 09:54:36 ]
>>589

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

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

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

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

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



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

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

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

の根拠は、

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

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

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

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

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

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

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

596 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/08/27(木) 15:16:39 ]
>>596さんありがとうございます!
さっそく試してみます。

598 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 17:08:14 ]
>>594
まぁそうだわな

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

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

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

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

600 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 18:55:35 ]
荒れてるうちに入らんだろこんなの

601 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 22:38:15 ]
CLAPACKのスレならシミュレーション板にあるw

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



603 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 16:26:19 ]
>>602
slashdot.jp/~t-nissie/journal/450101

こんなんとか

604 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 01:08:16 ]
>>604
エラーメッセージを素直に解釈すると、サブルーチンの宣言で引数が1個しかないので
齟齬が生じていると言っている。

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

606 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 01:47:05 ]
>>606
わからんw

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




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

610 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 13:24:41 ]
>>610
ただLINUXと表現するのではなくて、
ディストリビューションとバージョンをさらすといいかもしれない。


612 名前:610 mailto:sage [2009/09/18(金) 13:27:34 ]
ubuntu 9.04 です。お願いします。



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

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


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

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

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

617 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 00:21:58 ]
黒カエラーwwww



618 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 19:24:10 ]
>>618
integer, private, SAVE :: a

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


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

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

622 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 22:59:45 ]
横からですいませんが、PROCEDUREって何ですか?
90以降の機能ですかね?

624 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 23:51:06 ]
>>623
Fortran2003 の機能です。

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


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

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

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

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

629 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 17:46:13 ]
Fortranの名著的な入門書ってありますか?


630 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 17:56:00 ]
森口繁一のFORTRAN入門?

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

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

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



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

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

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

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


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

637 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 20:23:56 ]
まだFortranを使わせる所もあるんだ。
物理系?

638 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 20:38:02 ]
うん物理

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

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


641 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 00:07:32 ]
>>640
>INTENTとかをガチガチ

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

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


642 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 02:24:23 ]
>>641
> もう95位で仕様凍結してくんないかな・・・

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



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

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

644 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 10:09:52 ]
左側?

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

646 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 20:37:51 ]
>>646
まさにこれです
ようやっと期待通りにコンパイルできました
有難うございました

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

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

649 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/10/15(木) 14:41:54 ]
おお、そういうやり方があるんだ。

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

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

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


652 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 01:29:41 ]
>>653
ありがとうございます!

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

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


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

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

658 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 07:49:59 ]
use 文って便利だけど不便だよねw

659 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 22:49:38 ]
Intel の Steve Lionel が鉄腕アトム劇場版を見て面白かったと言ってるw
ttp://twitter.com/DoctorFortran

じじい受けするのか?


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

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

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

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



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

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

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

666 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 12:41:45 ]
ありがとう。

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

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

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

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

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

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

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




673 名前:672 mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 15:56:59 ]
質問です。
シンプソン法を用いてy=exp(x)の計算プログラムを作っています。
以下のプログラムの15、16行目のfun()の中には、
何を入れればいいのでしょうか?


675 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/10/28(水) 16:19:35 ]
>>672,673
ありがとうございます。

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

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

677 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 12:12:40 ]
そもそもFortranは「任意のサイズの○○」というのがやりにくい言語だよね
そういうもんだと思って諦めてるけど

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

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



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

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

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

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


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

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

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

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

689 名前:671 mailto:sage [2009/10/30(金) 18:45:48 ]
>>679
レス遅くなりましたが、ありがとうございます。調べたところ、要するに
「form='formatted' かつ advance='no' の場合に限り、 eor=文番号 が使える」
ということなんですね。
↓のコードでテストしてみました。

<ソース>
real :: f(5)
write(10,*) 1.0 , 2.0 , 3.0
write(10,*) 4.0 , 5.0 , 6.0
write(10,*) 7.0 , 8.0 , 9.0
rewind(10)

do i=1,2
f=0./0
read(10,'(3f)',advance='no',iostat=io,eor=999) f
print *,'io=',io
print *,f
enddo
stop

999 print *,'EOR detected!'
print *,'io=',io
print *,f
end

<出力>
io= 0
1.000000 2.000000 3.000000 4.000000 5.000000
EOR detected!
io= -2
6.000000 0.0000000E+00 NaN NaN NaN

690 名前:671 mailto:sage [2009/10/30(金) 19:00:00 ]
ふと思ったのですが、「レコード」というのはunformattedの場合の概念であって、
単なるASCIIであるformattedでは関係ないはずですよね。
そうすると、EOR(End Of Record)ではなく、EOL(End Of Line)などと
呼ぶほうが適切なのでは、と思ってしまいました・・・。

いずれにしろ、私的には文番号はデバッグ時を除いて使いたくないので、
>>676の方法がベストですね。


691 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 20:14:11 ]
>>690
IOSTATの番号で見ればいいので文番号は必須ではない。
しかし、いったん1行を文字列に読んで、加工するなりして、
内部ファイルで読むのがいろいろ出来て便利。


EORの呼び名に関しては、御説ごもっともだが、多分ADVANCE=’NO'によって、
逐次型本来の行単位のアクセスではなく、その内部の要素ごとで、ファイルの現在位置を
止めうるようにしたので、ダイレクトアクセス的なネーミングにしたのではないかと想像?



692 名前:671 mailto:sage [2009/11/01(日) 21:01:41 ]
>>691
ほんとですね。ありがとうございます。

iostat= と eor= の少なくともどちらか1つを指定していないと、
EORになった時点で↓のようにエラー終了するようですね。
forrtl: severe (268): end of record during read, unit 10, file ・・・



693 名前:デフォルトの名無しさん [2009/11/04(水) 05:59:17 ]
IOの挙動がらみで複数の行き先指定すると
その後にgotoスパゲッティになることがあるからムズムズする。

694 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 16:22:39 ]
メジャーな環境で動く汎用的なコードを書こうという場合、
安心して使えるFortranのバージョンってどれでしょうか?
少し前は「90にしとけ」って話をよく聞きましたが、最近は
95や2003も問題なく通用すると思って良いんでしょうか?


695 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 01:39:36 ]
>>694
F95が標準の地位を占めたという感じでないか?
更新していないシステムでは、まだF90の環境が結構残っている。
F77はコマンド名として存在していてもF90のコンパイラを固定カラムなどのオプションで
呼び出していることが多い。

F2003はようやくCRAYが完全対応したところで、ベンダーごとに独自の部分的な対応に
とどまっているのが実情。簡単なところから対応しているから大体は重なっているが。




696 名前:デフォルトの名無しさん [2009/11/05(木) 05:21:56 ]
もともとがF77で始めたせいで、いまでは固定書式&左側6文字空白&72文字制限つきで
でも命令文はF77~95の混在したコードになってもうた。プリプロセスも混ぜてるから拡張子は.fppだ。
まあでも、gfortran と intel fortran はちゃんと処理してくれるから、いいや。
FujitsuのもOKみたいだし。

無駄に行数が増えてしまうけど左側が空いてるとなんか安心するw

697 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 14:12:15 ]
>>695
ありがとうございます。
F95で書こうと思います。

698 名前:デフォルトの名無しさん [2009/11/06(金) 02:03:35 ]
今から始めるんならF95でいいと思うよ。Fortranは古いコードと混ぜてもトラブルは
少ないように規格されてるから過去の資源も使い易いし。

2003でスコープ範囲指定が出来るようになるらしいけど、いつ出るんだろう?
まだ見たことないや。

699 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 15:29:10 ]
たいていの商用コードはIntelとAMDのx86環境を前提としてるよね。
昔はIBM、日立、富士通、Sun、SGIって色々あったけど、今はそれらは
ほとんど淘汰されてスパコンレベルしか残ってないし。
ま、コードを開発する側としてはやりやすくなったんだろうけど。

700 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 00:55:13 ]
>>698
>2003でスコープ範囲指定が出来るようになるらしいけど、いつ出るんだろう?
>まだ見たことないや。

変数のスコープか?
PRIVATE、PUBLICは今あるままで、PROTECTED(いわゆるリードオンリー)が加わる程度だと思ったぞ。
他にもあんのかな?


701 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 09:26:51 ]
COMMON文ってmoduleみたいにスコープを指定ってできないの?

702 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 13:05:37 ]
名前を共有するんじゃなくて、メモリブロックを共有するための仕組みだからねえ。



703 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 23:57:09 ]
>>701
おまえふざけてんのか?w


704 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 03:32:54 ]
お寿司ってハンバーグみたいにソースで食べるってできないの?

705 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 08:15:17 ]
ああ、普通そうやって食べる。

706 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 13:00:36 ]
www
両方ともマヨネーズならアリだよな

707 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 13:04:07 ]
>>706
え?

708 名前:デフォルトの名無しさん mailto:sage [2009/11/14(土) 09:03:12 ]
・・・だめ?

709 名前:デフォルトの名無しさん mailto:sage [2009/11/14(土) 16:44:02 ]
本物のプログラマはマヨネーズは使わない。
Quiche Eaterはマヨネーズを使う。

710 名前:デフォルトの名無しさん mailto:sage [2009/11/18(水) 19:18:00 ]
質問です。
割り付け配列って何ですか?

711 名前:710 mailto:sage [2009/11/18(水) 19:33:35 ]
710です。たとえば以下のプログラムの変数A,B,Cを割り付け配列すれば
どこを変更すればいいのですか?

program matrix_wa
implicit none
integer::N,I,J
integer,parameter::IDIM=100
real(8),DIMENSION(IDIM,IDIM)::A,B,C
!
write(*,*) 'INPUT MATRIX DIMENSION'
read(*,*) N
write(*,*) 'INPUT MATRIX ELEMENTS OF A'
do I=1,N
read(*,*) (A(I,J),J=1,N)
enddo
write(*,*)'INPUT MATRIX ELEMENTS OF B'
do I=1,N
read(*,*) (B(I,J),J=1,N)
end do
CALL MATADD(IDIM,N,A,B,C)
CALL MATOUT(IDIM,N,C)
stop
end program matrix_wa

712 名前:デフォルトの名無しさん mailto:sage [2009/11/18(水) 19:34:17 ]
!==============================================
SUBROUTINE MATOUT(IDIM,N,X)
!=============================================
implicit none
integer IDIM,N,I,J
real(8),DIMENSION(IDIM,IDIM)::X
write(*,*)'C='
do I=1,N
write(*,*) (X(I,J),J=1,N)
end do
return
end subroutine MATOUT
!===============================================
SUBROUTINE MATADD(IDIM,N,A,B,C)
!=============================================
implicit none
integer::IDIM,N,I,J
real(8),DIMENSION(IDIM,IDIM)::A,B,C
DO I=1,N
do J=1,N
C(I,J)=A(I,J)+B(I,J)
end do
end do
write(*,*) 'C='
do I=1,N
write(*,*) (C(I,J),J=1,N)
end do
return
end subroutine MATADD



713 名前:デフォルトの名無しさん [2009/11/21(土) 10:18:39 ]
ちょっとお聞きしたいのですが、
3つの物理量の実測(とびとびのデータ)からある答えの物理量
がわかるデータがあるとき、
3つの物理量がある入力値の場合の答えの物理量を出すときに、
データの線形補完をしたいのですが
そういうやり方とかないでしょうか


714 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 12:07:51 ]
>>713
言いたいことがよく分からないのだけど、補完みたいなことをしたいの?

715 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 21:21:33 ]
回帰分析とかいう分野の事?

716 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 21:25:40 ]
>>713
最小二乗法とか?

717 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 00:11:48 ]
>>714-716
ありがとうございます。
あまりうまく伝えられなくて申し訳ないです。。

詳しくないのですが多分回帰の範囲と思います
3変数から一つの解を出す方法なのですが、
データから多項式で式が一発で出せるようなのがあればいいのですが、
そういうのはないでしょうか。。


718 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 02:38:52 ]
それを求めたいのか、求めるプログラムを作りたいのか。
前者ならR言語が使えるらしい。

719 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 12:13:04 ]
>>717
y=a*x1 + b*x2 + c*x3

のような式において、x1、x2、x3、yのリストから係数a、b、cを
導きたいなら、Excelの関数で1発でできる。重回帰分析でググれ。


720 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 12:48:30 ]
>>713
> データの線形補完をしたいのですが

最小二乗法使っとけ。

線型でいいということは測定できる変数x、y、z とそれらから分かる量wの間に

w = a*x + b*y + c*z

という関係があると仮定できるってことでしょ?で、係数a、b、cは分かんない。
この分かってない係数を測定データから決定することで、測定データの中には無
いx、y、zの組のときにwがどんな値になるかを知りたいのだと邪推してみる。
>>713 の頭の中を覗けるわけではないので間違ったこと言ってるかもしれんけど。

それをどうしてもFortranで書かなければならないのなら仕方が無いが、そうでも
なければ >>718 が言うように R でも何でも使ってればいい。

でも最小二乗法ならwのデータも要るのか?元質問だとwは測定して無いっぽいな。
こういうときはどうすんだ?

元質問がグダグダなので無責任に色々と言い放ってみた。グダグダじゃなくても
責任ある発言なんてできないけど。

721 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:09:24 ]
Windows 用の Fortran 95 コンパイラを買おうと思っているのですが,
NAG Fortran Builder 5.2 と Intel Visual Fortran 11.1 日本語版の
どちらにしようか迷っています。すみませんが,以下の疑問それぞれに
ついて判るかた,教えてください。

【1】 以下の項目について,どちらが優れているのでしょうか?
  (A) コンパイルしてできた実行ファイルの処理速度の速さ
  (B) 開発環境の使い勝手の良さ(入力補完など)

【2】 Intel Visual Fortran でも NAG Fortran Builder のように
  GUI アプリケーションが作れるのでしょうか?

【3】 Intel Visual Fortran と NAG Fortran Builder の2つ以外に
  日本語版の Fortran 95 コンパイラはあるのでしょうか?

なお,私のパソコンは,
Windows が XP Home Edition SP3,
CPU が Intel Pentium 4 (2.40GHz),
RAM が 512MB です。


722 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 01:19:25 ]
>>721
1) (A)処理速度で言うならIntel。NAGは文法的な厳格さ、厳密さが売りで速度は二の次。
   (B)Intelの統合環境はMSのVisualStudioで、入力補完などは無い。シンタックスカラーリング程度?
     VS2010あたりで色々対応したいと言うようなことは言っているが未定。
     NAGの方は独自の統合環境で、こちらもシンタックスカラーリング程度だったような。

  Fortranの入力補完は、ほとんど存在しない。
  昔の(10年以上前の)LaheyについてきたWin3.1時代風のEDくらいか。
  Polyhedron社が今のLahey用にVisualStudioの拡張を売っていたような気もするが詳しくは分からん。
  Laheyのサイトを見てくれ。

2.IVFでのGUIは、Win3.0時代から続くQuickWin互換の初歩的なものと、Win32APIを直接叩く方式がある。
  サンプルプログラムが提供されているが、Fortranの呼び出し規約とCの呼び出し規約が違うので
  Win32APIに習熟しているとともに、呼び出し規約等に惑わされない必要があって、理解が困難。
  OpenGLで絵を描くだけならサンプルの改造で済むのでまだやさしい。

3.日本語版があるかは知らないが、Winで動くものとしては
 有料 商用
  ・CUDAに対応するなどアグレッシブなPGIのFortran。
  ・富士通とコンパチなLahey-Fujitsu Fortran (.Net対応とか、SSLライブラリがある)
  ・MacやCrayとの親和性が売りだったAbsoft Fortran (今はその利点もあまり無いが) 
 無料系
  ・広告がうざいが、ただで使えるのがSilverFrostのFTN95。(商用は.Net 対応らしい)
  ・GNU系がよければ、g95 または gfortran. (この二つは同じ先祖から分かれた別物)

参考:非Win
*FreeのSUN OS上でよければ、SUNのFrotran95もただで使える。
*Linux上なら Intel Frotranが学術目的ならただで使える。  




723 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 01:47:53 ]
>>722 OpenGLで絵を描くだけならサンプルの改造で済むのでまだやさしい
なつかしす。結局コレで遊んだ以外はコマンドラインでしか使わなかったな・・・
もっとも自分の古いマシンに乗ってるのは DEC のVisual Fortran だけど、まあ同じようなものだからいいか。

724 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 01:53:34 ]
追加、というか・・・
QQで始まるGUIその他用の拡張命令サブルーチンが一杯あって訳わからんかったなぁw
GUIアプリ作るときには do while ..... enddo でコード全体を無限ループで囲む、
アプリ終了=ループ脱出はwhile()内に来る条件のフラグをいじる、だったような。

Fortran 文法に可能な限り沿いながらGUIアプリに必須な
マウス操作とかのいつ起こるか未然にわからないアクションを扱う苦悩が味わえたw

725 名前:721 mailto:sage [2009/11/25(水) 21:53:03 ]
>>722
すべての質問に対しての丁寧な回答,本当にありがとうございました。
とても助かりました。

726 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 01:17:03 ]
>>724
基本的に割り込み処理ののりだよな。
BASIC全盛時代のINKEY$でリアルタイム・キー入力処理を書いているようなもの。

727 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 05:07:03 ]
>>726
そうそう、そんな感じw
>>721
メモリ少なくね?

728 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 10:11:01 ]
>>722 *Linux上なら Intel Frotranが学術目的ならただで使える

正確には純粋な私用ならタダ、ね。学生がFortranやCで遊ぶだけならLinux版はタダだけど、
それを論文にしたり研究発表で使うデータ計算に使うのならちゃんと有償版を買わないといけない・・ハズ。
まあ、いまのところはIntel自身もあまりねちねちチェックしてないけど、
将来Intelの気が変わるとややこしいことになる大学や研究室や個人は多いと思われる。

小さいメーカとか10万円をけちって将来の生殺与奪の権をIntelに捧げてるところは多いのでは?

729 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 10:49:02 ]
質問です。処理系はintel fortranです。結果に怪しいところが多いので浮動小数点例外を
"アンダーフローは 0.0 にする。他の IEEE 例外は異常終了する (/fpe:0)"にしてます。
以下の行で、floating invalid を吐いて計算が止まります。変数は全て暗黙の型宣言です。


time=time*(xa-xb)/dx

ちなみに直前でそれぞれの中身を表示したところ、
time=5.0E-07
xa=0.5368819

xb=0.5368840

dx=-2.0805840E-06

でした。
上の値はかなり長い計算の途中で出てくるので、手っ取り早く原因を探ろうと、
直前に上の数値を強制的に書き込んで回してみましたが再現しません(止まりません)。
floating invalidが上記の計算の行で起きているのはエラーメッセージのLineから明らかです。

正直意味不明過ぎて何を言ってるのか分からないかもしれませんが、何か
原因に思い当たること、もしくは他に何か必要な情報があれば教えていただけないでしょうか?


730 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 05:56:58 ]
-r8 や -r16 付けて倍精度や4倍精度で計算するとか、かな。

あとは・・・・規格化(無次元化)する際の典型量を見直す、とか。
系全体の長さを1にするのではなく、関心のある現象の空間的なひろがりを1にとるとか。

731 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 09:38:43 ]
dx って負になるのは正しいの?

732 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 10:07:56 ]
>>729
キミに「プログラムは書かれいる通りに動く」という格言を進呈しよう。
とても高い確率でキミが何処かで間違えている。



733 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 10:23:59 ]
>>731
一般論として考えた場合は負でも問題無い。というのは飽くまでも或る点からのズレ(変位)という意味し
かないから。

プログラムの中で何らかの約束がある場合には、その約束のために正の値でなければならないことはあるだ
ろう。そういう時に負になってしまうのはバグでしょ。その場合はプログラムを書いた人の検討不足かタイ
プミスかだ。デバッグができていないんだろう。他の理由もあるんだろうけど思いつかん。

734 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 10:44:21 ]
>>729
> ちなみに直前でそれぞれの中身を表示したところ、
これは本当に直前なのか? 正常に動く一回前の値じゃないのか?

735 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 19:56:50 ]
>>729
多分、ただのゼロ割だろう。

Intelのコンパイラのバージョンはいくつかな?
新しい奴ならNaNにして続行するが、8.1とか古い奴はFloating Invalidで即死する。

状況的には>>734の言っていることが正しいであろう。



736 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 10:33:12 ]
>>730
倍精度は文字どおり精度を上げるのに有効だけど・・・
単精度でコケて倍精度で動く奴は、モデルを間違えてるかコードがおかしいかのどちらかだから
根本的には解決にならないね。

737 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 12:05:49 ]
微妙なケタ落ちを救済する事が出来るが、ケタ落ちが発生しない
アルゴリズム/コードに代える方がまっとうな道。

738 名前:729 mailto:sage [2009/11/29(日) 13:14:09 ]
みなさん、レスありがとうございます。まだ全部追えて無いんですが…

>>730
実は無次元化してません…

>>731
733が仰ってますが、単に変位です。負値は大丈夫です。

>>732
もちろんそうなんですが、どこで間違えてるのか分からなくて。

>>734
計算の一行前にwrite文で表示させてるので一回前の値と言うことはないはずなんですが、
この値で止まるのも同程度におかしいので何か間違えてるんだと思います。

>>735
ver.11です。デフォだとNaNで続行されますけど、NaNだと粒子が行方不明になってしまって困るので
トラップして原因を突き止めようとしてるのです。開放系ならごく稀に粒子が居なくなるくらいは問題ないんですが、
閉鎖系だと粒子がどんどん減ってしまうので…

>>737
こういう問題が発生しないアルゴリズムってどういうものでしょうか?原理的に発生しないんですか?
今自分で思いつくところだとNaNを検出して適当な座標を振りなおしてやるくらいしか思いつかないんですが…

ちなみにゼロ割した場合、floating invalidじゃなくてfloating divide by zeroとでました。分子も0だと
floating invalidになるのでこっちなんでしょうか?まだ不可解なところがあるのでもう少し見直してみます。

739 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 19:58:08 ]
出力のバッファリングで一回前を見ている可能性が有る。
デバッガで調べた方が良い。

740 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 20:15:31 ]
>>739
じゃ、出力先をファイルか標準エラー出力に切り替えてみるのもありだな。
そんで結果を見る。デバッガなんて使いこなすまでに時間が掛かりそうだし。

741 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 00:05:11 ]
バッファリングはファイルの方が積極的。

もうひとつの可能性:
floating invalidは表示ルーチンで出ている。

742 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 00:27:10 ]
>>738
あとの安直な手は別のコンパイラで実行してみることかな。
g95あたりで一回やってみればいいのでは。





743 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 06:49:04 ]
バファリンの半分はやさしさでw
バッファリングの半分は嘘のデータで出来てます。

あとは・・・Write 文つかったデバッグの場合でかつ元のをUnrollingしていると
Write文挿入する・しないで演算順序が変わることがあるから
UnrollingやできればInlineを抑制したコンパイルをすることをお薦めしてみるテスト

744 名前:デフォルトの名無しさん [2009/12/01(火) 05:51:21 ]
Fortranをはじめたばかりです
*
***
*****
*******
を描けという問題で、1.2.3行目のスペースの出し方がわかりません・・・
$を使えばできるのかと思いましたが、わかりません
どなたか教えていただけないでしょうか?


745 名前:744 mailto:sage [2009/12/01(火) 05:52:09 ]
スペース消えてる・・・

>>744はピラミッド形です

746 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 06:14:43 ]
do i = 1, 4
do n = 1, 7
if (n .GE. (5-i)) .AND. (n .LE. (3+i))
write(*,'(A,$)') '*'
else
write(*,'(A,$)') ' '
enddo
enddo
write(*,'(A)') ''
enddo

かな?

747 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 06:15:40 ]
あら、一個
enddo -> endif
にしとかんといかんかったね

748 名前:744 mailto:sage [2009/12/01(火) 06:26:33 ]
>>746
早速のレスありがとうございます

書いてくださったのを参考になんとか書けました><

749 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 09:47:59 ]
お、かけましたかw
if の行に then がなかったりしたけど、
えがったえがった

750 名前:デフォルトの名無しさん [2009/12/01(火) 23:10:57 ]
FORTRAN初心者です。。

1000以下の整数のうち、7で割ると2余る数を全て合計するプログラムをつくりたいのですがわかりません…
どなたか教えてください。

751 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 23:16:50 ]
>>750

integer i, s, n

n = 1000
s = 0

do i = 1, n, 1

s = s + i

end do

write(*,*)'sum =',s

続きは誰かヨロ。みんなで完成させようぜ。

752 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 03:44:10 ]
if (mod(i,7) .EQ. 2) then
s = s + i
write(*,*) i, s
endif

途中経過表示はいらないけどね。



753 名前:sage [2009/12/02(水) 07:28:33 ]
>>751-752

ありがとうございます。
本当に助かりました
自分でやったのでは実行できなかったので;;
また機会があればよろしくお願いします。

754 名前:デフォルトの名無しさん [2009/12/03(木) 13:16:46 ]
初めまして。
最小二乗法のプログラム(放物線近似)をつくっているのですが、
"dot_product"文がうまく使えません。
実行すると下記のようなエラーが出ます。


x4 = dot_product(x2,x2)
1
Error: 'vector_a' argument of 'dot_product' intrinsic at (1) must be of rank 1
In file test02.f90:28

x4 = dot_product(x2,x2)
1
Error: Function 'dot_product' at (1) has no implicit type

長くなりますが↓にプログラムを貼ります。

755 名前:デフォルトの名無しさん [2009/12/03(木) 13:20:29 ]
program saishou

implicit none
real(8)::a,b,x,y,y_b,xi,x2,yi,y2,xy,d,x4,x2y
integer::n,i
allocatable x(:), y(:), y_b(:)
write (*,*) 'input number of data '
read (*,*) n ! input size of dimension
write (*,*) 'number of data is ',n
allocate (x(n),y(n),y_b(n))
!-------------------------
do i = 1,n
read(*,*) x(i), y(i)
write(*,*) x(i), y(i)
end do
!------------------
xi = sum(x); x2 = dot_product(x,x)
yi = sum(y); xy = dot_product(x,y)
x4 = dot_product(x2,x2)
x2y= dot_product(x2,y)
d = n*x4-x2**2
a = ( n *x2y - x2*yi ) / d
b = ( x4*yi - x2*x2y ) / d
write (*,'(1x,2(3x,a,f7.3))') 'a =',a,'b =',b
write (*,'(a8,a9,a10,a11)') 'x','y','y_b','dif'
end program saishou

756 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 13:45:03 ]
dot_productは引数に同じ要素数の配列しかとれない。
x2はスカラーなので引数にできないですよ。
ちなみにdot_productが返すのはベクトルの内積を求めるので、戻り値はスカラー。

・・・とfortran歴1年の俺がいってみる

757 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 14:29:43 ]
前から思ってたんだけど、dot_productみたいなデフォで用意されてる関数を使うのって、
ベクトル化などの高速化・最適化を妨げるリスクはないと思っていいよね?
それとも、doループをいちいち書いた方がやっぱり速くなったりする?

758 名前:デフォルトの名無しさん [2009/12/03(木) 21:10:12 ]
fortranの初心者です
彗星の軌道をプログラミングしたいのですが上手くいきません
どこがおかしいか教えてくださいませんか?
program main
integer i,j
real ms,me,x,y,vx,vy,t,dt,G

ms=1.989*(10**30)
dt=100
G=6.673*(10**(-11))
K=G*ms/R**2

x=0.8826*(10**(11))
y=0.0
R=sqrt(x**2+y**2)
vx=0.0
vy=55000

do i=0,1000

x=x+vx*dt*i
y=y+vy*dt*i
R=sqrt(x**2+y**2)
vx=vx-K*(x/R)*dt*i
vy=vy-K*(y/R)*dt*i

write(6,*) x,y

enddo

end

759 名前:デフォルトの名無しさん [2009/12/03(木) 21:42:09 ]
>>756
なるほど・・・ご指摘ありがとうございます。
では行列の4乗はどう書けばよいのでしょうか。。

760 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 22:15:52 ]
>>759
そういうサブルーチンを自作すれば良い。幸いなことにFortran90からは再帰も使えるしね!

761 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 23:25:57 ]
気付いた所だと、

xnext=x+vx*dt*i
ynext=y+vy*dt*i
R=sqrt(xnext**2+ynext**2)
vx=vx-K*(x/R)*dt*i
vy=vy-K*(y/R)*dt*i
write(6,*) x,y
x=xnext
y=ynext

vx,vyはdtずらす前のx,yを使うのがオイラー法の正しいやり方ですよ。
これだけで直るかは自信がありませんが。

762 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 00:45:27 ]
下記のIを求めるプログラムを組もうとしているのですが、フォートランはさっぱりで…
どなたか本当にお願いします。
Zは3×3の行列で、V、Z、Iの各要素は複素数とするそうです。
確かに複素数を扱うにはCよりはフォートランだとは思うのですが…

[V1] [Z11 Z12 Z13] [I1]
[V2]= [Z21 Z22 Z23] [I2]
[V3] [Z31 Z32 Z33] [I3]

よろしくお願いします。



763 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 02:27:53 ]
>>757
たぶん弊害はない。たぶん、なのは実装によるので。ベクトルがでかくなると、
出来合いのルーチンの方が速いね。そういうチューンしてると期待していいとおもう。
3次元くらいだったら自分でループ書くか、
naiseki=a(1)*b(1)+a(2)*b(2)+a(3)*b(3)
みたく成分を明示したほうがいいことがおおいけど。

764 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 02:29:50 ]
>>762
複素数扱うならFortranのがいいよ。
んで、3x3行列なら (-1)^(i+j) * (小行列の行列式)_{j,i}/(全体の行列式)
を明示した方がいいよ。

765 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 11:04:54 ]
>>763
thx
そのうち自分で試してみようかな

766 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 19:50:53 ]
fortranで複数ファイルの結合ってどうやってやればいいですか?
もちろん中身を読み込んで新しいファイルに書き込むなら出来ますが、
cat みたいな感覚で使える命令ってあるでしょうか?

767 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 23:14:56 ]
>>766
system() を使って cat で繋げるとか?

Fortranが内部で持っている方法は聞いた事が無いです。

768 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 23:47:25 ]
>>758
G=6.673*(10**(-11))
この辺は
G=6.673E-11
とするべし。

あと77なのか90なのか判然としないが、暗黙の型を破る気ならIMPLICIT NONEを
つけておくほうが吉。

>>766
catだって中では読んで書き出しているだけだろうに

769 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 23:54:43 ]
>>768
> >>766
> catだって中では読んで書き出しているだけだろうに

そういえばバイナリファイルをformattedで開く場合ってケッコウ難儀なことになりそうな気がして来た。
catはその辺はクリアしてるけど(でないとバイナリファイルの結合なんて出来ないよね?)。

自分だったらfortranでやらずにシェルでも書いてそっちで済ます。WindowsならPerlか何かを使うかな?
dosのコマンドで出来たっけ?やりたいことによって道具を使い分けるのが良いと思うけど。

770 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 00:05:00 ]
>>766
catと等価な、つまりバイナリレベルでの結合は無理じゃない?
fortranって、せいぜいレコードを扱うくらいで、バイトレベルでの操作は普通しないし、そもそもできないと思うけど

771 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 03:50:13 ]
いちおうAppendで既存ファイルに追記することはできるけどバイナリだと
追記するデータを別なファイルから読み込む段階でコケる事多々アリで面倒だよね。
Bit 単位での操作って Fortranで出来ない&やりにくい典型例だ。

772 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 05:12:47 ]
FORTRANやCOBOLのような古い言語は、
ファイルはレコードの集合という考え方をするから、
前提のないバイト列は扱いにくい。




773 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 05:57:03 ]
NAG Fortran Builder 5.2 をインストールして使ってみたのですが,

program main
  print *, 'Hello World !'
  stop
end

のクイック実行のコンパイル&リンクに12分50秒もかかります。
NAGのコンパイラはこういうものなんでしょうか?
それとも,もっと早くコンパイル&リンクのできる設定が何かあるのでしょうか?

私の環境は,OSはWindows XP,RAMは512MB,
HDDの空き領域は,Cドライブは706MB,Dドライブは1.92GB,
Fortran Builder は Dドライブにインストールしています。

# NAGの統合開発環境は,Intelのと違って,キーワード入力補完機能がありました。


774 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 10:00:55 ]
RAM 少なくね?

775 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 10:02:09 ]
>>758
数字を規格化しようね

776 名前:773 mailto:sage [2009/12/05(土) 10:51:47 ]
>>774
NAGのホームページには 「メモリ:256MB以上(推奨 512MB以上)」 と
書いてあったので,大丈夫かなと思ったんですが,
やっぱり足りないですかね。

他に Fortran Builder 5.2 のユーザーさん,いませんか?
RAMはどれくらい積んでますか?


777 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 12:17:51 ]
>>773
キーワード補完だけじゃ、あってもなくてもほとんど変わらんよなぁ・・・
もっとリッチなFortranのIDEが早くでないものか

778 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 13:20:00 ]
>>776
その前に今どき512MBというのがなあ。増設はできないの?

779 名前:773 mailto:sage [2009/12/05(土) 13:38:40 ]
別のパソコン (let's note) で試してみました。
CPU: Pentium M 1.20GHz
RAM: 1GB
OS: Windows XP Pro. Ver.2002 SP3

これで

program hello
  print *, 'Hello World'
  stop
end program hello

をやってみたんですが,こちらのPCでもコンパイル&リンクに
12分25秒かかりました‥‥ orz

>>778
う〜ん,6年前のVAIOノートなんで,買い替えしたほうが良いかもしれません。


780 名前:773 mailto:sage [2009/12/05(土) 13:52:17 ]
Intel Visual Fortran 11.1 のほうの動作環境ページを見ると
RAM 1GB (2GB 推奨) と書いてあるんですが,
CPU: Pentium M 1.20GHz,RAM: 1GB のPCにインストールしても,
Fortran Builder と同じくコンパイル&リンクに10分くらい
時間かかっちゃうでしょうか?


781 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:01:23 ]
メモリが足りないせいで異常に遅いときは、
大量にスワップが発生しているせいなので、
一定量メモリを増やせば急に早くなるものだが、
512MBでもその有様とはすごいね。
fortran 77でよければ open watcom fortranとかいいんでない?

782 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:06:13 ]
>>779
まさかとは思うが、メモリの空きは大丈夫なんだよね?
動画のエンコしながらコンパイルとかはさすがにないだろうけどw



783 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:15:19 ]
コマンドラインからコンパイルとかできないの?
IDEが重いのかもしれない。

784 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:20:09 ]
あと仮想メモリを増やしてみる。無駄かな?

785 名前:773 mailto:sage [2009/12/05(土) 16:01:16 ]
>>781-784
レスありがとうございます。>>783さんのレスを見て調べたら,
コマンドラインからコンパイルする方法が NAGのサイトの
FAQページに載っていました。
今度は数秒でコンパイルできました!

# しかも,できた実行ファイルのサイズが,IDEのときは 266KBだったのに対して,
   コマンドラインからのときはわずか 18KBとずいぶん小さくなりました
   ちなみに,g95でコンパイルしたときは 339KBでした。

本当にありがとうございました m(_ _)m

786 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 16:37:57 ]
もしかしてNAGが駄目駄目ってオチなのかな?
でもそんな悪い評判は聞いたことないが・・・

787 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 17:25:08 ]
>>770
バイナリファイルも、F2003ならSTREAMファイルとしてあけることで扱える。

F2003以前でもベンダー拡張でSTREAMアクセスできることが多い。
また規格の範囲内でもDIRECTアクセス・ファイルの属性で代替できることがある。
(独自フォーマットのDirectFile形式のベンダーもあるが、垂れ流し的に書いているものも多いので、
実質ストリームとして使える)
ただFortranの規格ではレコード長が処理系依存なので、バイトかワードかが確定できない。
でもコンパイラのオプションで単位をバイトに指定出来ることが多い。



788 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 18:24:30 ]
>>785
それって単にランタイムDLLになっただけじゃ?
IDEの時はスタティックリンクなんでしょ

789 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 18:53:35 ]
IDE経由とコマンドラインの場合とで、デフォルトの動作が違うってこと?
IDE使ったことないんで分からないけど、そういうもんなのかね

でもスタティックリンクにしたら、サイズが増えるのはいいとして
10倍以上の時間がかかるなんて、あり得るの?

790 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 02:17:44 ]
デバックシンボルでも埋め込んであるんだろ
それに実行ファイル自体が最適化がかかってないかもしれない
環境を聞かないと何とも堪えようがない

791 名前:773 mailto:sage [2009/12/06(日) 08:35:45 ]
>>788
> IDEの時はスタティックリンクなんでしょ

IDEの設定を見たら,おっしゃるとおりで,
「nagforランタイムライブラリの非共有(静的)バージョンを結合」
となっていました。ひとつ勉強になりました(汗)。


>>790
> 環境を聞かないと何とも堪えようがない

環境は……

【1つめのパソコン VAIOノート】
OS: Windows XP Home edition Ver.2002 SP3
RAM: 512MB
HDDの空き領域:Cドライブは 706MB,Dドライブは 1.92GB
Fortran Builder 5.2 は Dドライブにインストール。

【2つめのパソコン let's note ノート】
OS: Windows XP Professional edition Ver.2002 SP3
RAM: 1GB
CPU: Pentium M 1.20GHz
HDDの空き領域: Cドライブは数十GB
Fortran Builder 5.2 は Cドライブにインストール。

……です。


792 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 08:39:32 ]
NAGのお値段を考えたら・・・おニュウPCを買うべきだとおもう




793 名前:773 mailto:sage [2009/12/06(日) 08:42:25 ]
あ,【1つめのパソコン VAIOノート】の CPU は
Pentium 4 の 2.40GHzです。


794 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 19:59:53 ]
次の行列の演算を2次元配列を用いて行うプログラムを作りたいのですが;
どなたか教えください。

[123] [13]
[ ]×[23]
[045] [46]

です。
わかりにくいのですが、2行3列と3行2列の乗算です。。

795 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 20:01:50 ]
見づらくてすみません。。
[123] [13]
[   ]×[23]
[045] [46]



796 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 04:24:21 ]
行列成分は実数にした。違いは無い

real a(3,2), b(2,3), o(2,2)
a(1,1) = 1.0
  |
a(3,2) = 5.0
b(1,1) = 1.0
 |
b(2,3) = 6.0

do j = 1, 2
do i = 1, 2
o(i,j) = 0.0
do m = 1, 3
  o(i,j) = o(i,j) + a(m,j) * b(i,m)
enddo
enddo
enddo

で o が結果の2x2行列ね。習慣で(i,j)=(列、行)の番地にしてもうたけどいいやね。
そういや行列のサイズ数をいうときの行と列をよく間違えてしまうw

797 名前:デフォルトの名無しさん [2009/12/07(月) 23:28:25 ]
>>758
x=x+vx*dt*i
y=y+vy*dt*i
R=sqrt(x**2+y**2)
vx=vx-K*(x/R)*dt*i
vy=vy-K*(y/R)*dt*i
上のiがすべていらない。

798 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 23:42:02 ]
>>795
MATMUL 関数を使うんだw



799 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 08:40:35 ]
>>798
同意w
でも知らないうちにコードミスで転置行列にしてしまうことがあるw

800 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 08:58:02 ]
do 800 i = 1, 800
  write(*,*) '800 get'
800 continue

801 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 18:00:32 ]
はじめてきました。
ド素人質問失礼します。
コンパイラはG95で、Fファイルで実行します。
OSはVISTAです。

N個の値(整数値0〜100)の中から最大・最小・偏差値を出したくてこうしました。

DO 10 I=1,N
READ(5,*) SC(I)
MA=MAX0(SC(I))
MI=MIN0(SC(I))
10 CONTINUE
するとエラーが
MA=MAX0(SC(I))
1
MI=MIN0(SC(I))
1

    Intrinsic'max0'at(1)must have at least two arguments
Intrinsic'min0'at(1)must have at least two arguments
と出ます。
配列を組み込み関数の引数に使ってるのが違うのかと思うのですが、配列を使えるようにする方法が何かないかが主に知りたいです。

802 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 18:03:53 ]
>>801
すみません、、、
改行でずれました、、、
MA=MAX0(SC(I))
___1
MI=MIN0(SC(I))
___1
です。




803 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 18:10:43 ]
MAX0というのがどういう関数なのか知らないが、
MAXと同じなら
MA = MAX( MA, SC( I ) ) 
MAは要初期値。

配列に全部読み込んでから最大値を求めるなら
MAXVAL( SC ) 


804 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 18:13:48 ]
>>801
関数が要求する引数の数が少なくとも2個だからじゃない?最も大きい(小さい)ものを返せ、という
関数なんだし。配列の要素は配列じゃないよ(OOPならそれもアリだろうけど)。

その前に折角g95を使っているのなら、F77式の書き方はするべきではない。

homepage.mac.com/galois21/fortran/ref.html

805 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:07:11 ]
フォートランを研究室で指定されて使おうとしてるんですけど
www.salfordsoftware.co.uk/
のどこからダウンロードするのかみつからないんですけど教えてくれますか?
あとフォートランは遺産が多いと聞きましたがうちの研究室は転用が禁止らしいのですが
フォートランの意味はあまりないということでしょうか?
簡単な質問ですがお願いします

806 名前:805 mailto:sage [2009/12/14(月) 02:35:45 ]
なんとかなりそうです
スレ汚し失礼しました

807 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 05:06:18 ]
ああ、Fortran依存症がまたひとり・・・・いらっしゃい!

808 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 10:09:27 ]
>>805
転用禁止は、遺産うんぬんの前に、「理解して勉強しろ」ということだろう。

809 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 17:32:48 ]
結局わからなくてゼミの先輩にインストールするためのプログラム(ftn77pe.exe)を貰ったんですが

64ビットバージョンのwindowsでの非互換性のためプログラムまたは機能である〜〜を開始または実行できません
ソフトウェア製造元に問い合わせて64ビットWindows互換バージョンが利用可能であるかどうか確認してください

とでました。OSはwindows7です。7に対応していないんでしょうか?
こういった場合どういう解決策がありますか?お願いします。

810 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 20:45:06 ]
今、浮動小数点例外を握りつぶす処理を入れてるんですが、
処理を入れた部分以外のところをコンパイルオプションでトラップしたいです。
が、オプションを入れると既に処理を入れた部分の判別条件で引っかかってしまいます。
未処理の部分だけトラップしたいんですが何かいい方法はないでしょうか。

811 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 23:06:15 ]
サイトを隅から隅まで探してもfortranをダウンロードするページみつけれませんでした・・・
64ビットのがあるんでしょうか

812 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 23:34:04 ]
>>810
トラップって何?

具体的にどうしたいのか分からないけど、ソースの或る特定の部分を無視して
コンパイルしたいのであれば、プリプロセッサを使ってみたら?



813 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 23:50:42 ]
>>810
CALL IEEE_SET_HALTING_MODE(云々)
あたりでなんとかならんか?
Fortran2003の機能だが、最近のコンパイラはサポートしているので・・



814 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:03:20 ]
Sun solais10のSunStudio12(SunFortran)で書かれたプログラムが動かなくて困っています

浮動小数点例外でcore吐いて停止していますが
ファイルがバッファに残ったままとまっている為
どこまで進んでから落ちたのか良く判りません
環境変数かなんかでバッファサイズを0若しくは充分小さく出来ないでしょうか?

ソースをゴタゴタと生成している部分がありコンパイルが容易ではなく
出来ればflushを挟んでの再コンパイルを避けたいのです

intelのfortranなら出来るチックな話はぐぐったら出てきましたが......


815 名前:773 mailto:sage [2009/12/17(木) 23:42:36 ]
NAG Fortran Builder 5.2 で,

program main
  print *, 'Hello World !'
  stop
end

のクイック実行のコンパイル&リンクに12分50秒もかかった現象について,先週の土曜日に
ここで質問をした者ですが,パソコンにインストールしているウイルス対策テスト
F-Secure Internet Security 2010 のメーカーであるエフセキュアのサポートセンターにも
問い合わせたところ,解決案を幾つか提示されました。

結局それらのうちの1つの『 ディープガードの無効化 』をすることで,
コンパイル&リンクにかかる時間が通常どおり大幅に短縮されて,約10秒で
終わるようになりました。

アドバイスを下さった方々,ありがとうございました。


816 名前:773 mailto:sage [2009/12/19(土) 11:37:10 ]
↑のその後です。

昨日,エフセキュアのサポートセンターとメールでやり取りし,

「『 ディープガードの無効化』をするとセキュリティレベルが下がるので,
  その代わりに『高度なモニタリング』を無効化する。
  それで駄目なら『ファイルを除外スキャン』でスキャン対象から除外したい
  ファイル・フォルダを選択する」

という対処方法に変わりました。

これで F-Secure Internet Security 2010 の『 ディープガードの無効化』と
『高度なモニタリング』の両方が有効な環境下での NAG Fortran Builder の
動作の正常化が確保できました。


817 名前:773 mailto:sage [2009/12/19(土) 11:43:02 ]
↑書き間違えました。
(誤)『 ディープガードの無効化』と『高度なモニタリング』の両方が有効な環境下
(正)『 ディープガード』と『高度なモニタリング』の両方が有効な環境下


818 名前:デフォルトの名無しさん [2009/12/19(土) 13:30:00 ]
とりあえず、おめ!
なるほど、そっちか

819 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 15:41:50 ]
セキュリティかよw
確かに最近のセキュリティソフトは色々とガチガチだからな

820 名前:デフォルトの名無しさん [2009/12/22(火) 16:23:38 ]
なるほどー

821 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 23:08:05 ]
ググってもなかったんで、質問させてください。

fortranのプログラムみてると、ccccccc 〜〜 ccccccc
って感じでcに囲まれてる文字があるんだけど、このcの意味ってなんなんですか?

すいません。教えてください

822 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 00:28:15 ]
>>821
1桁目が 'C' かアスタリスク '*' の行はコメント行。
だから 'CCC…' はプログラム上は意味はないけど、
人間が読む時に処理の内容や区切りをわかりやすくするため等によく使われる。



823 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 00:32:45 ]
>>822
ありがとうございます。
コメントは「!」とどこかでみたので、cは違うのかと思ってました。
本当にありがとうございました

824 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 04:29:33 ]
>>823
! で始まる部分をコメントとするのは,Fortran 90 以降の自由形式で書かれるソースコード。
この場合は ! は必ずしも1桁目でなくても良い。
2桁目以降でも良いし,実行分の後ろに付けるのでも構わない。

一方,1桁目が C か * で始まるのをコメント行とするのは,FORTRAN 77 の固定形式ソースコード。


825 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 09:11:20 ]
↑[訂正]
× 実行分
○ 実行文

826 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 22:37:19 ]
>>824
丁寧にありがとうございます。
すごい勉強になりました!
今日、入門用の本を買ってきたので、頑張って勉強したいとおもいます。

827 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 08:29:13 ]
すみません,ちょっとスレ違いな質問で申し訳ないのですが‥‥
ここにならご存知の方が誰かいるかもしれないと思ったので,
質問させていただきます。

Fortran の後継言語として Sun が開発中だった Fortress は
今はどうなってるんでしょうか? お蔵入りなのでしょうか?

828 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 09:14:52 ]
とりあえずサイトはここ
ttp://projectfortress.sun.com/Projects/Community/

829 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 14:04:39 ]
>>828
ありがとうございました。

830 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 17:33:31 ]
オラクルに買収されたけど、Sunの手から離れたから関係ないのかな?

831 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 20:11:52 ]
質問です。あるファイルが存在したらそのファイルをread、
存在しなければ別の処理をする、という分岐を作りたいのですが
どうすればよいでしょうか?ファイルの有無で0か1を返すような
関数があれば手っ取り早いんですが、見つかりませんでした。

832 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 21:03:52 ]
>>831
stat() を使ってゴニョゴニョとできんじゃろうか?



833 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 21:22:06 ]
open文でerr=指定子を使うのがfortran流だろう。

834 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 23:28:24 ]
INQUIRE(FILE='hage.dat', EXIST=LHOGE)

835 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 18:43:43 ]
>>832-834
最後のinquire使うのが王道かのぅ。

logical lhoge
character*100 fname
do i = 1, 100
write(fname,'(i5.5,''.dat'')') i
inquire(file=fname,exist=lhoge)
if (lhoge) then
read.....
else
nanka....
endif
enddo

とか、いろいろ。
ERR子はたしか返す値がシステムごとに違った記憶があるから怖い。
・・・気のせいな気もするけどね。

836 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 17:11:51 ]
いままでコンパイルを行うとき、サブルーチンとmainファイルを同じディレクトリに置き
* ifort.f90 でコンパイルしていたのですが,
サブルーチンを別ディレクトリにし,コンパイルするにはどうしたらよいのでしょうか。

たとえばサブルーチンをSubというディレクトリに置き、
mainファイルをMainというディレクトリに置いて実行ファイルを作るにはどうしたらよいのでしょうか。

837 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 20:17:18 ]

ifort90 main.F90 Sub/sub1.F90 Sub/sub2.F90 ...

でいいんじゃね?あと Makefile 書いちゃうとかかな。

何をムズカシイと思っているのかがよく分からない。

838 名前:デフォルトの名無しさん [2010/01/13(水) 15:03:32 ]
>>837
そうしたいのですが,mainファイルをコンパイルしようとするとサブルーチンが定義されていないと言われ,
サブルーチンをコンパイルしようとするとmainファイルがないとエラーがでるんです

839 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 15:47:14 ]
>>838
ifort90ってどこのコンパイラ?
-c付けて.oファイルがどこにできるか確認してみたら?
intel fortranだが普通にカレントディレクトリに全部の.oが出てくるけど

840 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 17:41:05 ]
unixでのコンパイルに耐えられずに、VisualStdioとintelのコンパイラを教官殿に買ってもらった俺と比べてみんな偉いな

841 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 22:27:24 ]
>>839
> ifort90ってどこのコンパイラ?

ifort のことだろうけど、OS は何なんだろうな。どうにも挙動が変態だ。
Windows だと変な動きするとかあるんだろうか?

842 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 02:46:42 ]
前に、担当の人が気を利かせてaliasというかいくつかオプションをつけたコマンドを作ってくれていて
それが他のと干渉して・・という事があった気がするけど、そのifort90 もそれの類の匂いがするが、
いかがか?



843 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 17:02:34 ]
>>838皆様のレスのおかげで解決できました、ありがとうございます
ifort90はifortの打ち間違えです、申し訳ない

844 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 13:52:51 ]
なんという・・・w

845 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 18:18:14 ]
打ち間違え?
じゃあ command not found って出てたはずだよな・・・

まぁ、頑張ってくれや

846 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 18:52:40 ]
すみません
インテル Visual Fortranコンパイラ9.1を使用したいのですが、インストール後
サンプルプログラム(int_sin.f90)をコンパイルしようとしたのですが、下記のエラーがでてしまい、うまくできません。
エラー内容:
ifort: error: unable to run '<Microsoft VC++ Dir>\\Bin'

Microsoft Visual C++ 2008 Express Editionはインストール済みです。
OSはVista Home premium32bitです。
どなたか助けてくださいorz

847 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 01:04:43 ]
>>832,833,834,835
大変遅くなりましたがありがとうございました。
inquire文で行けそうです。
もう一つ質問ですが、動的配列を宣言するときにある次元だけ固定って
できますか?まあ別にそうする必要は無いといえばないんですが、
宣言部を見ただけでどこが動的である必然性があるのか分かった方が
自分としてはスッキリするので。ちなみに

DOUBLE PRECISION,allocatable::a(10,:,:)

allocate (CS(10,10,10))

とやったら金比羅にしかられました。
よろしくおねがいします。


848 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 04:18:14 ]
>>847
> DOUBLE PRECISION,allocatable::a(10,:,:)
> …
> allocate (CS(10,10,10))
>
> とやったら金比羅にしかられました。

CS ってどこで宣言してんだ?

どう呵られたのかはしらんけども、こっちでも呵られた。
ということで無難に

DOUBLE PRECISION,allocatable::a(:,:,:)

としておけば良いと思う。それで問題になることは無いだろうから。

849 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 04:52:48 ]
>>848
すいません、CSじゃなくてaですね。中途半端にコピペしてしまった…
やっぱそうするべきみたいですね。コメントでもつけてそうしておきます。
ありがとうございました。

850 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 17:46:26 ]
一瞬、金比羅って何って思ってしまった
中国系の上司の名前かとw

851 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 17:38:45 ]
下記のようにimplicit none 付きで、
算術関数 cos 及び derf に関する実験をしているのですが、
cosはreal(8) derf のような宣言が必要ないのはなぜでしょうか。
derfに関しては宣言をしないと、コンパイラ(pgf95 ,7.2-4)に文句を言われます。

program main
implicit none
real(8) derf
real(8) x
x = dble(0.7)
print*,derf(x)
print*,cos(x)
end

よろしくお願いいたします。

852 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 22:53:26 ]
>>851
COSはFORTRANの規格で規定されているINTRINSICな関数で、COSは総称名になっている。
引数の型で関数の値の型も決まる。
ただ、66時代の互換性などから、個別の型をあらわに指定するDCOSなどもある。
しかし77時代以降は総称名を使うのが推奨されていたはず。

さて、ERFの方だがこれはFORTRANの規格にはないベンダーの提供する独自関数である。
したがってその実装や用法はベンダーに依存する。
たとえばINTEL FORTRANの場合は、REAL(8)の宣言無しにDERFが使える。
PGIでは、外部関数扱いで、関数の型を宣言しておく必要があるのだろう。

なお、ERFというのはUNIX系の多くのFORTRANで使えた関数で、半ば標準化している。
Fortran2008ではそれらのエラー関数、ベッセル関数などが正規の規格に入ることになっている。






853 名前:851 mailto:sage [2010/01/19(火) 00:21:02 ]
>>852
大変分かりやすい解説をしていただき、ありがとうございました。
derfもintrinsicな関数だと思い込んでいました。

854 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 13:55:21 ]
>>852
>しかし77時代以降は総称名を使うのが推奨されていたはず。
マジ?
律儀にD*使ってた・・・

855 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 14:00:42 ]
人のデータ使う場合、単と倍精度が入れ乱れるし・・・
普通にd* で明示してもいいと思うけどな。
単精度に揃えたい!とかはコンパイルオプションで出来るし。

856 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 21:03:41 ]
やっぱ総称名って使わないほうがいいの?

857 名前:デフォルトの名無しさん [2010/01/19(火) 21:21:43 ]
インテル Visual Fortranコンパイラ9.1を使っているんですが、インストール後
サンプルプログラム(sample.for)をコンパイルしたところ、下記のエラーがでてしまい、うまくできません。
エラー内容:
ifort: error: unable to run '<Microsoft VC++ Dir>\\Bin'

このため、.objファイルは出力されるのですが、exeファイルが出力されません。
よろしくお願いします。


858 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 23:41:44 ]
>>857
MSのSDK入れろ


859 名前:デフォルトの名無しさん [2010/01/24(日) 21:39:26 ]
"2500/500"のような文字を読み込んで、
2500 / 500 = 5
を計算したいのですが、下のコードでは
"/"が読み込めないみたいです。
改善方法を教えていただけないでしょうか?

できれば、"2500"や"500"の部分を任意の桁数でできると幸いです。
コンパイラはG95です。

IMPLICIT NONE
CHARACTER :: A*5, B, C*5
REAL*8 :: Num1, Num2
PRINT*, "Input"
READ*, A, B, C
PRINT*, "A=", A, " B=", B, " C=",C
READ(A(1:), *) Num1
READ(C(1:), *) Num2
PRINT*, Num1/Num2
END

よろしくお願いします。

860 名前:デフォルトの名無しさん mailto:sage [2010/01/24(日) 22:12:58 ]
>>859
FortranのI/Oでは「/」は改行を意味している。
よって文字と解釈していなのだろう。

前にもそんな事を聞いていた奴がいたような・・・

回避する方法は、わからん。
文法書のI/Oのところをじっくり読んで自分で考えてくれ。


861 名前:860 mailto:sage [2010/01/24(日) 22:27:59 ]
>>859
しらべたw
READ文にFORMAT指定をすればよろし。
READ '(3A)', A,B,C
とすれば多分おk


862 名前:859 mailto:sage [2010/01/24(日) 22:57:22 ]
>>860

"/"を文字として認識することができました。
ありがとうございます。



863 名前:860 mailto:sage [2010/01/25(月) 00:38:43 ]
>>859
おk。

任意の桁数でやるには
INTEGER :: kslash
CHARACTER(128) :: text
READ '(A)', text
kslash = INDEX(text, '/')
READ( A(1:kslash - 1), * ) num1
READ( C(kslash + 1:), * ) num2

という感じだろう。TRIMでtextの尻の空白を切ったほうがいいかもしれん。
むろん任意と言ってもREALの範囲内の数だが・・


864 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 00:39:52 ]
訂正www

READ( text(1:kslash - 1), * ) num1
READ( text(kslash + 1:), * ) num2

865 名前:859 mailto:sage [2010/01/25(月) 07:35:21 ]
>> 863

おお!重ね重ねありがとうございます。
無事に作ることができました。

866 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 20:32:37 ]
初心者すぎて笑われるかもしれませんが平面上の3点の座標で三角形つくるときの面積を求めたいのですが
当然ながらヘロンの公式でやりました
辺の長さが出てる場合であればうまくいくのですが長さの計算も入れようとするとどう座標を扱えばいいかちんぷんかんぷんで
X(I)とY(I)で1〜3まで動かしかたがわからないというか…その考えが間違ってるのかもわからないです

867 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 20:57:24 ]
>>863
Fortran兄貴降臨!いつもお疲れさまっす。

ただ、Fortranの思想的に>>859みたいなことは、やるべきではないとは思う。
perlでもpythonでもシェルでもいいが、Fortran実行ファイルを適当なラッパーで
くるむほうが、素直で良いと思う。

868 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 21:11:49 ]
>>866
君なりのソースをここに書けば直して貰えると思うよ。

869 名前:デフォルトの名無しさん mailto:sage [2010/01/25(月) 21:54:30 ]
>>866
数学がわからんの?
Fortranがわからんの?

上の方も書いてるけど、わかってるところまでのソースを書くとよろし。

870 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 01:04:31 ]
>>867
Fortranでパーサー書こうぜ!
再帰があるから、77時代ほど難しくないはず・・・


871 名前:デフォルトの名無しさん [2010/01/26(火) 14:19:14 ]
>>870
とてもうろ覚えだけど・・・
DECのVMSってFortranでかなりの部分は書かれていたような。
IMEというか英語を日本語に変えるやつは堂々Fortranだったような。
・・・とてもうろ覚えだけど。

872 名前:デフォルトの名無しさん [2010/01/29(金) 08:26:49 ]
はじめまして。初心者ですがよろしくお願いします。
突然ですが、この問題を解ける方いらっしゃいますか。
学校の宿題なのですが、どうしても分からないのでここにきました。
お願いします。

問題こちら↓
階乗 n! を計算する関数を作成し,
順列
 n個の異なるものからr個取り出して並べる。
 このときの順列の総数をnPrとあらわす。
 nPr=n(n-1)(n-2)・・・(n-r+1)
を計算する関数を作成し,

組み合わせ
 異なるn個からr個取り出して組を作る。
 このときの組合せの総数をnCrとあらわす。
 nCr = nPr/r!

を計算するプログラムを作成しなさい。(問題終わり)

よろしくお願いします。



873 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 18:29:35 ]
Permut[n_, r_] := Pochhammer[1 + n - r, r]
Permut[n, r]/r!

874 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 19:47:54 ]
オープンしている特定のファイルのバッファを
フラッシュする方法はありますか。コンパイラはifortです。
出来ればクローズしないでフラッシュしたいのですが、
どうしてもバッファにたまってしまいます。
よろしくお願いします。

875 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 01:06:31 ]
872の丸投げぶりはすごいな。
途中まで書いたソースコードでもここに貼ったら?



876 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 01:14:32 ]
C/C++の宿題スレが丸投げだからその流れがこちらまで来たか

877 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 10:34:15 ]
初秋の青空を連想するくらいのすがすがしい
丸投げw

878 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 16:23:48 ]
>>874
CALL FLUSH(ユニット番号)

879 名前:874 mailto:sage [2010/01/31(日) 04:55:24 ]
できました! >>878
ありがとうございます!

880 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 21:11:44 ]
プログラムで値を入力して計算結果を得たいのですが、結果を出力するとNaNが出てしまいます。
NaNが出力される原因だけでもいいのでわかる方いらっしゃったら宜しくお願いします。
ttp://www.dotup.org/uploda/www.dotup.org610825.txt
長いのでろだに上げました。テキストファイルですみません…

881 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 21:24:10 ]
丸投げ、流行ってるな。

882 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 09:17:59 ]
ifort -g -check all traceback
とかでNaNにかぎらず異常値が発生したらその行を教えてくれるような実行ファイルをつくってくれる
オプションがあるはずだから、マニュアルよんでみよう。
>>878
それ、よさそうだね。
ログ生成がゆっくりの場合、あるていど溜るまでディスクには書かれないから不便な事がおおかったけど、
いろいろと助かりそうだ。参考にするよ!



883 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 18:38:34 ]
へぇそんなんあったんだ

884 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:00:51 ]
>>880
66スタイルで何やってるかわからんなw
NUMPACK使っているところを見ると、富士通、名大・九大・京大あたりの流れか。
ライブラリ関数が無いから実行することもできないしもっと詳しく書いてくれないと誰も答えられないだろう。

まぁ定数や関数の一部が単精度のままなので倍精度にしている意味がない可能性が高い。
その辺かな?w


885 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:04:41 ]
>>882
FLUSHはFortran2003で導入された命令。
IntelのHELPはF2003命令がいまいち入ってなかったりしてアレなので、
文法解説書を買って学ぶがよろしい。



886 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 09:14:48 ]
>>885
そうなんだ。何年か前に g77 でサブルーチン版の flush をつかったことあがった。
今確認したら、やっぱり使えた。因みに g95 だと関数版の flush が使えた。関数
版だと戻り値でエラーチェックできるから有り難い。

887 名前:デフォルトの名無しさん [2010/02/07(日) 15:54:15 ]
FFTについて質問させてください。

大学の講義で、離散フーリエ変換のプログラムについて勉強中です。
講義の最後に、「バイオリンの音のデータをフーリエ変換し、
フーリエ変換した結果を横軸:周波数、縦軸:振幅としてグラフ化せよ」
という課題が出ました。
配布されたデータの読み込みを試みたのですが、どう読み込ませたらいいのかが分かりません。
配布されたデータは2列で構成されており、左の列が時刻データ、右の列は音の振幅を表しています。

↓にプログラムを書きます。よろしくお願いします。

888 名前:デフォルトの名無しさん [2010/02/07(日) 15:56:08 ]
--前半--

program fft

implicit none
!========================================================================
include "fftw_f77.i"
integer*8 ::plan
!========================================================================
!サンプリング条件の設定
!サンプリングデータ数N , aの数Ma , bの数Mb
!サンプリング間隔dt = 1/44100 [s] , サンプリング周波数 f0 = 44100 [Hz] , N, Ma, Mb
!周波数分解能df=1/(N・dt)
integer,parameter:: N=10000,Ma=5000,Mb=4999
real(8),parameter:: df=44100/dble(N) , dt=1.0d0/44100
!入力波形のデータの設定fin=100Hz
real(8) ::fin,a0
!作業用の変数
complex(8):: in(N),out(N),c(0:n-1)
integer ::i
real(8) ::t,a(0:Ma),b(1:Mb),x,y

889 名前:デフォルトの名無しさん [2010/02/07(日) 15:57:26 ]
--後半--
!入力データの設定
write(*,*) 'Input data:'
open(unit=11,file='violin.dat')
do i=1,N
※ここが分かりません!※
end do
close (11)
!========================================================================
!ライブラリを利用したフーリエ変換(作業領域作成と実行)
call fftw_f77_create_plan(plan,N,FFTW_FORWARD,FFTW_ESTIMATE) !準備
call fftw_f77_one(plan,in,out) !実行
!========================================================================
!結果の変換
c(0:N-1)=out(1:N)
a(0)=c(0)
a(1:Ma)=dble( c(1:Ma)+c(N-1:N-Ma:-1) )
b(1:Mb)=dble( (c(1:Mb)-c(N-1:N-Mb:-1))*(0.0d0,1.0d0) )
!========================================================================
!結果の出力
write(*,*) 'Output data after forward FFT:'
open(unit=22,file='ab-.csv')
open(unit=21,file='c-.csv')
do i=1,N
write(21,'(i6,'','',1pe16.8,'','',1pe16.8)') i,out(i)
end do
write(22,'(1pe16.8,'','',1pe16.8,'','',1pe16.8)') 0.0,a(0),0.0
write(22,'(1pe16.8,'','',1pe16.8,'','',1pe16.8)') (i*df,a(i),b(i),i=1,Mb)
if (Ma/=Mb) write(22,'(1pe16.8,'','',1pe16.8,'','',1pe16.8)') Ma*df,a(Ma),0.0
close (21)
close (22)

890 名前:デフォルトの名無しさん [2010/02/07(日) 15:59:09 ]
--ラスト--

!========================================================================
!フーリエ変換(作業領域消去)
call fftw_f77_destroy_plan(plan)
end program fft

891 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:29:00 ]
>>889
クラスの友達に聞いた方が早いよ。


892 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:20:13 ]
むしろ、データファイルの中身が必要なんじゃね?



893 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:37:52 ]
>>891
きっとボッチなんだよ。

894 名前:デフォルトの名無しさん [2010/02/07(日) 22:48:06 ]
そうなんすよ。
彼女と遊びすぎて留年しちゃったもんで・・・。

895 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 23:02:40 ]
お前はこのスレを敵にまわした。

896 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 23:10:16 ]
>>894
教えようと思ったがやめた

897 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 03:48:18 ]
自分が今いるサブルーチンの名前を取得する方法ってありますか?
デバッグするときにどのサブルーチンで止まってるか確かめたいんですが。

898 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 07:30:51 ]
終了したのが
なんていうサブルーチンで何行目か、とか
ソースファイルの何行目だったか、とか教えてくれるようにする
オプションってあったと思うけどなぁ。というわけでマニュアルを読もう!

Fujitsuだと超最適化かけてもこの機能はついてくるのが素晴らしいが
PC向けではなかったような・・・。出してくれんかねぇ

899 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 07:59:22 ]
>>898
いえ、それがめんどくさいことに終了せずにどこかで停止してるんですよ。
write文の中身をいちいち変えてもいいんですけど、
出来るだけコード汚さないように書きたいので。

900 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 11:25:45 ]
すみません、もう一つ。subroutineの最後に

return
end

って書くのはなんででしょう。サブルーチンでのendってreturnと
同じ意味じゃないんでしょうか?returnが無いと困るケースってあります?

901 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 12:13:11 ]
ヒント: returnはサブルーチンの最後である必要は無い。

902 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 13:12:13 ]
大昔はEndSubroutineが無かったから、
このEndはサブルーチンのですよ、とチェックをいれる意味で
推奨されてた名残だね。ぶっちゃげ無くてEndだけでもいい。
Returnはサブルーチン抜けを意味するのだからメイン階層では絶対出てこないので。



903 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 18:54:13 ]
900じゃないけどreturnとか使った事ありませんでした
勉強になるスレです

904 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:05:26 ]
>>897
__FILE__ を使って後はゴニョゴニョとよくやってた。
Fortran 自体を使わなくなって数年(足を洗ったので)。

905 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:08:56 ]
>>899
Fortranにはそういう命令はない。
しかしコンパイラのtracebackオプションを使えばいい。
大抵のコンパイラにはそういう機能がある。
だがそれは、処理系に依るのでマニュアルでオプションを調べるしか無い。

コンパイラの種類とバージョンを言えばわかる可能性はある。



906 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:13:26 ]
__LINE__使えるんじゃないの?

907 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 00:35:53 ]
>>906
標準のFortranにはないべ。
Unix系のプリプロセッサの機能だろ。方言のなまりがきつすぎる。


908 名前:ごめんなさい、お願いです。 [2010/02/10(水) 00:51:22 ]
このプログラムを
明日までに作ってください!!お願いします。

Fortranで,

階乗 n! を計算する関数を作成し,

順列
n個の異なるものからr個取り出して並べる。
このときの順列の総数をnPrとあらわす。
nPr=n(n-1)(n-2)・・・(n-r+1)
を計算する関数を作成し,

組み合わせ
異なるn個からr個取り出して組を作る。
このときの組合せの総数をnCrとあらわす。
nCr = nPr/r!
を計算するプログラムを作成してください。
おねがいします。

909 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 01:55:59 ]
>>908
最近勉強しているのでFortran95 で書いてみた。
たぶん君が求めているのはF77ヴァージョンだろうw

MODULE m_2chan
IMPLICIT NONE
CONTAINS

ELEMENTAL INTEGER FUNCTION factorial(n)
INTEGER, INTENT(IN) :: n
INTEGER :: i
factorial = PRODUCT( (/ (i, i = 1, n) /) )
RETURN
END FUNCTION factorial

ELEMENTAL INTEGER FUNCTION permutation(n, r)
INTEGER, INTENT(IN) :: n, r
INTEGER :: i
permutation = PRODUCT( (/ (i, i = n, n - r + 1, -1) /) )
RETURN
END FUNCTION permutation

ELEMENTAL INTEGER FUNCTION combination(n, r)
INTEGER, INTENT(IN) :: n, r
combination = permutation(n, r) / factorial(r)
RETURN
END FUNCTION combination

END MODULE m_2chan
!


910 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 01:57:29 ]
PROGRAM twochannel
USE m_2chan
IMPLICIT NONE
INTEGER :: n, k
PRINT *, 'INPUT n and k'
READ *, n, k
PRINT *, 'nCk = ', combination(n, k)
STOP
END PROGRAM twochannel

77育ちの俺様は、暗黙の型に従っていないのですげー気持ち悪いぜwww


911 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 02:27:41 ]
>>908
数学的にチューニングすべきだが、提示された式のとおりに作った。PROGRAMは改行多杉になるので省略
integer function factorial(n)
implicit none
integer i, n
i = n
factorial = 1
do while(i .gt. 0)
factorial = factorial * i
i = i - 1;
end do
end
integer function permutation(n, r)
implicit none
integer n, r, i
i = 1
permutation = 1;
do while(i .le. r)
permutation = permutation * (n - i + 1)
i = i + 1
end do
end
integer function combination(n, r)
integer n, r, factorial, permutation
combination = permutation(n, r) / factorial(r)
end


912 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 08:48:40 ]
908の人気に嫉妬



913 名前:デフォルトの名無しさん [2010/02/10(水) 08:58:43 ]
>>901
>>902
あ、そうなんですか。別に書かなくてもいいってことですね?

>>904
>>905
>>906
ありがとうございます。でも、エラーが出て終了するんじゃなくて、
ジョブは走ってるんですけどどこかで止まってるっぽいんですよ。
出力ファイルが計算途中で更新されなくなるんです。
で、どこまで進んでどこでどうなってるか調べたいのでいちいちwrite文挟んでるんですが…
tracebackって終了したときしか使えないですよね?

914 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 10:05:57 ]
デバッガー無いのか? アタッチ出来れば楽勝だな。

915 名前:908です。 [2010/02/10(水) 11:57:13 ]
みなさん、ありがとうございました!!(泣

916 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 23:09:07 ]
>>913
仰る通り Traceback は異常終了しないとでない。
しかし、望みの機能が存在しないのは、世の中の人がその機能を欲していないということなので
がんばってPRINT文をばらまいて解決しなさいw

プログラム相談員とか、そういう人に聞くのも、連中の人を小馬鹿にしたような寝言を我慢しないと
駄目だが、有効w


917 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 13:16:13 ]
>>916
>連中の人を小馬鹿にしたような寝言を我慢しないと駄目だが
ワロタw
あの目線はどうにかならんのか

918 名前:デフォルトの名無しさん [2010/02/11(木) 22:18:28 ]
ちょっとお聞きしたいのですが、
fortranでguiプログラミングはできないのでしょうか?

919 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 23:26:53 ]
>>918
C用のライブラリのAPIを呼びまくるという形ではできる。







[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<345KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef