くだすれFORTRAN(超初心者用)その4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/01/24(土) 18:32:01もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/
●関連スレ
FORTRAN �W
http://pc11.2ch.net/test/read.cgi/tech/1163319215/
0557デフォルトの名無しさん
2009/08/21(金) 19:52:17こんなんではダメですか?
% nm liblapack.a | head -20
liblapack.a(sgbbrd.o):
U _lsame_
00000000 T _sgbbrd_
U _slargv_
U _slartg_
U _slartv_
U _slaset_
U _srot_
U _xerbla_
U dyld_stub_binding_helper
liblapack.a(sgbcon.o):
U _isamax_
U _lsame_
U _saxpy_
U _sdot_
00000000 T _sgbcon_
U _slacon_
U _slamch_
0558デフォルトの名無しさん
2009/08/21(金) 19:57:51ありがとうございます!
0559デフォルトの名無しさん
2009/08/21(金) 20:06:14勉強になります。ウチの Debian は1年ほど前に急に起動しなくなってから放置してますが。
>>558
それで問題なかったのなら何よりです。
0560デフォルトの名無しさん
2009/08/21(金) 20:28:18サイズが大きくなって多少遅くなる?
0561デフォルトの名無しさん
2009/08/21(金) 21:27:53丁寧に説明していただきありがとうございます。
やってみましたがなぜかエラーですwwwwwwwwwwwwww
>>556
環境変数の設定はできてるみたいです。ありがとうございます。
みなさんありがとうございました。もうちょいがんばってみようと思います。
0562デフォルトの名無しさん
2009/08/21(金) 22:38:05無事にコンパイルできる?ここで転けてたら話にならない。
0563デフォルトの名無しさん
2009/08/21(金) 23:22:39簡単なソースのコンパイルはできます。
mklとリンクしてコンパイルすると、.aと.soファイル内に、
定義されてないサブルーチンを使用しようとしていますとか警告出ます。。
0564デフォルトの名無しさん
2009/08/21(金) 23:53:13> mklとリンクしてコンパイルすると、.aと.soファイル内に、
> 定義されてないサブルーチンを使用しようとしていますとか警告出ます。。
これは簡単なソースをコンパイルするときに出るの?簡単なソース(Hello, World. 程度)と
ライブラリをリンクするときに出るのであれば設定が可笑しいと思う。それかコンパイル時
のコマンドの書き方か。両方の可能性もあるけど。
普通は、リンクするライブラリの中にある関数を使っていなくても、そんなことにはならな
い。例えば sin( 1.00D0 ) を計算して表示するだけのソースと FFT のライブラリをリンクし
ても文句は言われない。コンパイラはスルーすれば済むから。呼んでもないものをくっ付け
る必要は無い。
0565デフォルトの名無しさん
2009/08/22(土) 00:00:54その通りにやればコンパイル/リンクできるはずだが。
0566デフォルトの名無しさん
2009/08/22(土) 10:01:37/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
その通りにやってるつもりなんですが・・・
0567デフォルトの名無しさん
2009/08/22(土) 10:19:38コンパイル時のコマンドを晒して。
あとリンクの順番を間違えるとエラーになることがある。要するに
ライブラリ A と B をリンクするとき A が B にある関数を呼んでい
るなら、例えば A の中にある関数 funcA がその中で B の中にある
関数 funcB を呼んでいるとき
-lA -lB
という順番でリンクしないと転ける。
リンクするときは .a だけで良いはず。あとは勝手にやるはずなん
だけどライブラリに依るかもしれんので何も。
マニュアル通りにしていると言う割には勝手なことをしている気が
する。
0568デフォルトの名無しさん
2009/08/22(土) 10:25:02ifort 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フォルダにいれていいんでしょうか?
0569デフォルトの名無しさん
2009/08/22(土) 10:44:08ifort 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'
0570デフォルトの名無しさん
2009/08/22(土) 10:44:26> >>567
> ifort test.f90
(長いので中略)
> -Wl,--end-group -liomp5 -lpthread
このようにしなさいという説明は何処にあるのでしょう。
> が、lapackの.aファイルがないんですが、勝手に持ってきてlibフォルダにいれていいんでしょうか?
ということはビルドしていないということでは?やり方はマニュアルに書いているはず。因みに無いという
根拠はなんですか?それと
find /opt/intel -name "libmkl_*.a"
の実行結果は?
http://www.obihiro.ac.jp/~suzukim/masuda/ifc_lapack31.html
にも書いていますが、LAPACK95 はラッパーのようなので、単体では動かないと思います。勝手に持って
来るったって何処から持って来るのだろう。そんなことしても意味ないと思うケド。あと
> -lmkl_lapack95 -lmkl_lapack -Wl,--start-group
これって BLAS はリンクしてないみたいだけど、しなくて良いの?
0571デフォルトの名無しさん
2009/08/22(土) 10:52:24>このようにしなさいという説明は何処にあるのでしょう。
ユーザーズガイドのexampleにありました。
>find /opt/intel -name "libmkl_*.a"
lapack95.aはあります。.soはありません。逆にlapac.soはあって.aはありません。
lapack95のビルドはしました。が、.soはないです;
BLASリンクしてもダメでした;
0572デフォルトの名無しさん
2009/08/22(土) 11:12:20> これでコンパイルしようとすると以下のエラーが出ます;
>
> /opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `___tls_get_addr'
iomp5 って OpenMP 用のものみたいだから、並列でもしない限りイラネ。と思うけど、どうなんだろ?
ということで、外してやってみて。
取り敢えずオプション付けとけって感じにしか見えない。それぞれのオプションの意味を調べ直した方が
早い気がして来た。どっかに日本語版も落ちてたし。場所は忘れた。
0573デフォルトの名無しさん
2009/08/22(土) 11:29:08OpenMPのオプションを付けるといくつかのオプションを呼び出すことになって
非OpenMPでも最適化にプラスに作用するので
弊害がなければ付けておくといいよ、と奨められたことがある。
なくても良さそうだけど・・。
0574デフォルトの名無しさん
2009/08/22(土) 15:51:38そんな話があるんですね。だったら最初から最適化しとけよ、と思わなくもないですが。
ずっと疑問なんですけど、元質問者ってそもそも何がしたいんだろう。
Fortran の勉強または単に Lapack を使う必要があるという程度なら、gfortran でも使っていれば良い。
Lapack なんてディストリビューションの公式ビルド(?)もあるだろうから、準備には手間取らない。
Debian なら Synaptic でも起動して検索すれば良いし、CentOS なら yum かな。
それでも基本的な知識が欠けているように見えるけど、考え過ぎかな。PATH の話を読んだときは噴き
ました。こちらが立ち入る話ではないんですが、何となく迷走しているように見えたので。
0575デフォルトの名無しさん
2009/08/22(土) 19:06:12それってopenmp以外のオプションを何も付けてない場合じゃないの?
-fastや-O3などの普通の最適化オプションを付けている状態でopenmpオプションを足しても意味ないような
0576デフォルトの名無しさん
2009/08/23(日) 08:01:41どうだろうね。openmp 単独では最適化はデフォルトレベル以上はしないからどのみち -fast あたりと
いっしょに使う前提だろうけど。
0577デフォルトの名無しさん
2009/08/23(日) 08:04:41アドレスがらみのエラーが防げそう、とか
古い習慣のsave属性を仮定しないで処理する、とかがメリットなのではなかろうか。
0578デフォルトの名無しさん
2009/08/23(日) 09:35:37iomp5外したらlapackとか使わない簡単なソースはコンパイルできました!!!
が、exampleのソースをコンパイルできないです。。。やっぱり同じエラーでます。。。
>>574
今やりたいことは逆行列求めるだけなんでlapackだけでいいし、
それぐらい自分で本見てプログラミングしろよって話なんですけど、
後々並列とかも使えるようにしたいのでmklを入れようとしたのです。
2週間ぐらい前に初めてvineインストールして、
環境変数とかも最近知ったので知識はまったくありませんorz
0579デフォルトの名無しさん
2009/08/23(日) 11:51:40「___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互換ではあるし)
0580デフォルトの名無しさん
2009/08/23(日) 12:03:07あああぁぁぁああああFedoraいれてみます!!!!
みなさんありがとうございました!!!
0581デフォルトの名無しさん
2009/08/23(日) 12:14:51> が、exampleのソースをコンパイルできないです。。。やっぱり同じエラーでます。。。
エラー内容は分からんが設定が出来ていないか、コンパイル時の指定にミスがあるかのどちら
かだろう。
> >>574
> 今やりたいことは逆行列求めるだけなんでlapackだけでいいし、
> それぐらい自分で本見てプログラミングしろよって話なんですけど、
> 後々並列とかも使えるようにしたいのでmklを入れようとしたのです。
だったら gfortran でいい。並列も出来る。MPI が使えることは確認済み。OpenMP は知らん。
使ってる PC に複数の CPU があるのなら並列で動かす努力に意味もあるが、マトモに Fortran
のコードを書けないうちから並列をやり始めても先に進めないまま時間が過ぎるだけのような
気がする。
知識も無いのに無理して intel を使う必要は無い。
ということで、自分でソース書けばよろし。あと Lapack のルーチンは処理内容に対して命名
規則があるので、それは自分で調べること。
しかし逆行列を求める程度のことで並列するヤツは居ないと思うが、そうでもない?>識者
0582デフォルトの名無しさん
2009/08/23(日) 14:25:29スパコンのLinpack競争を知らんのかw
0583デフォルトの名無しさん
2009/08/23(日) 15:17:54知りません。
並列については無知なので、だいぶイイカゲンなことを言っているとは思い
ます。でも3×3行列程度で並列というのはそれ自体がナンセンスな気はしま
す。3 が 10 でも 100 でも同様かと。100000 程度になれば意味はあるのか
もしれませんが。元質問者がどの程度の規模のことをしたいのかによって選
択肢も変わって来るでしょう。
そもそも Lapack って並列を意識して書かれてないと思いますが、そんなこ
とはないとか?
私は並列はやったことが無いですし、この先もやらないと思います。以前に
gfortran で MPI が動くことを確認したときも、リンクの仕方は私が調べて
から、「リンクの仕方は知らないけど、実行の仕方は知っている」コーハイ
君に簡単なプログラムで実行確認をしてもらっただけです。そのコーハイ君
はマトモなソースを書けな(ry
対象データを N 分割して、N 個の CPU に振り分け、個々の CPU で計算した
後に、それを1箇所にかき集めるというイメージしか無いです。間違ってる
かもしれませんが。
0584デフォルトの名無しさん
2009/08/23(日) 16:47:13問題は行列の性質。密行列なのか疎なのか、とか
0585デフォルトの名無しさん
2009/08/23(日) 17:24:37逆行列計算にこそ並列化の最適化が進んでいる。
MKLなんか使えばCPU数に比例した効果が得られる。密行列だが。
そういう意味で、質問者は一応理にかなっている。
逆行列計算は、普通線形方程式を解く形で求めるが、線型方程式はアメリカの分散型の
スパコンに非常に向いていて、自分に有利なようにLINPACKという線形方程式用のパッケージで
スパコンベンチマークが行われている。
当然、その部分へのアルゴリズム研究や最適化がもっとも進んでいる。
ちなみに、おおよそLAPACK=LINPACK+EISPACK。LINPACKは線形演算、EISPACKは固有値演算
ライブラリで、1970〜80年代の米英国家プロジェクトの産物。原型はFORTRAN66で書かれていて
NETLIB辺りに行けば今も拾えるはず。LAPACKは、それをFORTRAN77で統合したもの。
詳細は忘れたので間違ってるかもしれん(笑)LAPACKの前書きあたりを詳しく読んでくれ給へ。
これらの基底にBLASという基本サブルーチン集があって、この部分を書き換えることで
ハードウェアのアーキテクチャーの違いをうまく吸収して何十年も生き残っている。
0586デフォルトの名無しさん
2009/08/23(日) 17:29:090587デフォルトの名無しさん
2009/08/23(日) 18:16:070588デフォルトの名無しさん
2009/08/23(日) 18:46:54密より疎のほうが一般的だよな
0589デフォルトの名無しさん
2009/08/23(日) 19:24:46そのはず。
昔はベンダーがよくBLASだけアセンブラで最適化したのを配っていた。
ベクトル機時代はBLAS2あたりの行列*ベクトルが、今はBLAS3あたりの
行列*行列の最適化が肝らしい。
>>588
元々は密行列のみ。scaLapackとか、疎もじわじわやっている。
疎行列はベクトル機に向いていたので80年代以降すごく流行った。
数値計算のアルゴリズムも、ハードウェア・アーキテクチャに合わせて流行が変わる。
最近の並列計算機の進歩のせいで、たとえスカスカの疎行列でもメモリーに載るなら、
密に展開して密行列のライブラリを呼んだほうが有利なことがあるらし。
アメリカ人が必死になって分散メモリー・スパコン用のアルゴリズム開発をしている。
固有値問題も教科書的にはO(N^3)だが、並列機で密行列のO(N^2)のアルゴリズムが
見つかったとかいう話。詳しくは知らん(笑
0590589
2009/08/23(日) 19:35:34上記は、話半分嘘半分で読んでおいてくれ(笑)
0591デフォルトの名無しさん
2009/08/24(月) 09:54:36> 最近の並列計算機の進歩のせいで、たとえスカスカの疎行列でもメモリーに載るなら、
> 密に展開して密行列のライブラリを呼んだほうが有利なことがあるらし。
これってどんなメリットがあるの?
単純にメモリー消費の事考えると、無駄多すぎて話にならんし。
構造格子のFDMを例に取ると、隣接点が6だから、
マトリクスのサイズが100万だと、メモリー効率が16万倍くらい違う。
(本当はポインタやらあるけど、単純化すると)
それを帳消しにするだけのメリットというのがわからんのだけど。
0592デフォルトの名無しさん
2009/08/24(月) 22:19:00スピードつーものは考えんのか?
スパースったって色々あるだろが、お前の帯行列だけがスパースなのかよ。
つーか帯行列は帯行列で別のカテゴリになってるだろ。
あんた相当頭が固くて視野が狭いから、お刺身の上にタンポポを載せるような仕事のほうが向いてると思うよ。
0593デフォルトの名無しさん
2009/08/24(月) 22:37:06最近はメモリのペナルティーが大きすぎるから10倍ぐらい計算量が多くても
ストールしないアルゴリズムを選んだ方が速くなるという話の一環だと思う
0594591
2009/08/25(火) 11:27:29> 密に展開して密行列のライブラリを呼んだほうが有利なことがある
の根拠は、
> 最近はメモリのペナルティーが大きすぎるから10倍ぐらい計算量が多くても
> ストールしないアルゴリズムを選んだ方が速くなるという話の一環だと思う
とういう話があるということか。なるほど。
ただ、これってかなり特殊なマトリクスに限定した話の気がするな。
物理シミュレーションの世界で出てくるスパース行列だと、
離散点の値を使って平衡方程式解くときには、微小領域近傍の値だけを使うので、
一行あたりの非ゼロ項の個数はせいぜい数十〜数百のオーダーになるのが普通。
大規模なスパース行列だと10倍どころじゃなく超スカスカになるんで、
上記の根拠をもとにスパースを密行列で置き換えるのは難しいと思う。
と書くと、また頭が固いとか視野が狭いとか言われてしまうかw
>>592
プライド傷つけてごめんねw
0595デフォルトの名無しさん
2009/08/26(水) 18:45:09プログラム1で出力した座標データを
プログラム2でもう一度読み込みたいのです。
データの受け渡しの際に、x,y,z のように一行に三つの数字が並んでしまっている状態なのですが、
1.プログラム1において出力する座標データの桁数をそろえて座標データファイルを作り、
2.プログラム2において座標データファイル内のx,y,zの3つの数字をそれぞれ関数に読み込みたい
と思っているのですがプログラム1のwrite文とread文をどのように書いてよいかが分からず困っています。
どなたか教えていただけますでしょか?
0596デフォルトの名無しさん
2009/08/27(木) 02:07:26write(unit=11,fmt='(3(x,f10.5))') x,y,z
とか、かな。fmt= はなくてもいい。
複数の連続する空白はひとつの区切りとみなされるから
読み込む側では書式指定は必要でないから
write(unit=11,fmt=*) x,y,z でも可。数字の11の部分は適当に自分で決める。
0597デフォルトの名無しさん
2009/08/27(木) 15:16:39さっそく試してみます。
0598デフォルトの名無しさん
2009/08/27(木) 17:08:14まぁそうだわな
> たとえスカスカの疎行列でもメモリーに載るなら、
> 密に展開して密行列のライブラリを呼んだほうが有利なことがある
は、せいぜい10^3以下のちっこいマトリクスにしか当てはまらんと思う
応用の人達にとってマトリクスソルバの開発・実装に時間なんて割きたくないし
数値計算の研究者には大いに頑張ってもらいたいね
0599デフォルトの名無しさん
2009/08/27(木) 18:37:260600デフォルトの名無しさん
2009/08/27(木) 18:55:350601デフォルトの名無しさん
2009/08/27(木) 22:38:150602名無しさん@そうだ選挙に行こう
2009/08/30(日) 16:16:28Cのqsortはvoidポインタやら関数ポインタやら使ってるからfortranではやはり無理なのでしょうか?
0603名無しさん@そうだ選挙に行こう
2009/08/30(日) 16:26:19http://slashdot.jp/~t-nissie/journal/450101
こんなんとか
0604デフォルトの名無しさん
2009/09/12(土) 21:29:22・
・
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文を作って変数を共有してますが、何か気持ち悪いので考えられる原因を教えて頂けますか?
0605デフォルトの名無しさん
2009/09/13(日) 01:08:16エラーメッセージを素直に解釈すると、サブルーチンの宣言で引数が1個しかないので
齟齬が生じていると言っている。
SUBROUTINE DISTの宣言の数行を貼ってもらえれば、なにか分かるかも。
0606デフォルトの名無しさん
2009/09/14(月) 16:21:33うーん。でも下の例では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...の部分は呼び出し元にはありません。
0607デフォルトの名無しさん
2009/09/15(火) 01:47:05わからんw
中間MODファイルが更新されてないとか、ありえなさげな事しか思いつかない。
まぁDIST2222とかありえ無そうな名前に変えて見てようすを見てみるとか。
0608デフォルトの名無しさん
2009/09/15(火) 08:38:02MODファイルの事は思ったな〜。念のため別なディレクトリでテストするとか・・・かな。あとは
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
みたいに結果に影響しない行を一つ二つ添えてみるとか。う〜ん。
0609デフォルトの名無しさん
2009/09/16(水) 10:31:39>>608
ホンットすみません。DIST2222にしたら通りました。んで、OS再起動して元の名前にしても通りました。
なんかの理由で「中間MODファイルが更新されてない」になってたっぽいです。
プログラム上の問題じゃなかったですね…申し訳ない。
0610デフォルトの名無しさん
2009/09/18(金) 13:09:44LINUXで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,
それぞれ指定されたファイルを見てもよくわからなかったので、
どうしたらコンパイルできるようになるか、ご教授おねがいいたします。
0611デフォルトの名無しさん
2009/09/18(金) 13:24:41ただLINUXと表現するのではなくて、
ディストリビューションとバージョンをさらすといいかもしれない。
0612610
2009/09/18(金) 13:27:340613デフォルトの名無しさん
2009/09/18(金) 13:41:00「intelコンパイラが想定しているc++の標準ライブラリより新しいものが入ってる」
に一票
どっかから, libstdc++.so.5を拾ってくるしかないと思われる
# これ以上は聞かないで, 犬のことはくわしく知らないw
0614デフォルトの名無しさん
2009/09/18(金) 13:55:39ttp://beken.cc.miyakonojo-nct.ac.jp/wp2/?p=1208 によると
> 私の環境で前もってインストールしておくべきだったものは、以下のパッケージです。
> どちらも[システム]>[システム管理]>[Synaptic パッケージ・マネージャ]でインストールしました。
>
> * g++
> * libstdc++5
>
> libstdc++6は既にインストールされていましたが、libstdc++5はインストールされていませんでした。
> またlibstdc++5をインストールしなくてもifort自体はインストールできちゃいますが、
> プログラムのコンパイルの時に必要になります。インストールしておきましょう。
0615デフォルトの名無しさん
2009/09/18(金) 14:01:50こういう数値計算に使うときは少し古めのにするか、もう少し安定志向な
ディストリにするのが良いと思う。豆知識な。
0616デフォルトの名無しさん
2009/09/24(木) 00:31:120617デフォルトの名無しさん
2009/09/25(金) 00:21:580618デフォルトの名無しさん
2009/09/26(土) 02:36:35したいこと:モジュールに関数オブジェクトを保持させたい。
例えば、モジュールに変数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
というものを書くことが出来ます。
同じように、モジュールに関数を保持させることは可能でしょうか?
0619デフォルトの名無しさん
2009/09/26(土) 02:43:36subroutine 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)
というのを呼び出すだけ、みたいなのにしたいのです。
0620デフォルトの名無しさん
2009/09/26(土) 19:24:10integer, private, SAVE :: a
にすればおk?
save無くても大概大丈夫だと思うが。
0621デフォルトの名無しさん
2009/09/26(土) 19:50:23値じゃなくて、できれば関数保持する方法が。
>>618は何したいのかわかりやすくする為の例だったんですけど、
我ながら読むと分かりにくい。
似たような感じで、関数を保持させたいんです。
0622デフォルトの名無しさん
2009/09/26(土) 22:21:48PROCEDURE 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
0623デフォルトの名無しさん
2009/09/26(土) 22:59:4590以降の機能ですかね?
0624デフォルトの名無しさん
2009/09/26(土) 23:51:06Fortran2003 の機能です。
副プログラムのインターフェースを、一括化できたりします。
インターフェースを書く代わりに、 Procedure (sub0) :: sub1, sub2 など。
type っぽいかんじで。
0625デフォルトの名無しさん
2009/09/27(日) 00:28:40なるほど。ありがとうございます!
0626デフォルトの名無しさん
2009/09/27(日) 05:28:41ありがとうございます。
でも、gfortranの4.2じゃできないっぽいですね。
v4.3以降でサポートなので、v4.3入れてやってみます!
0627デフォルトの名無しさん
2009/09/27(日) 07:50:230628デフォルトの名無しさん
2009/09/28(月) 07:04:01implicit none
do while (.true.)
write(*,*) '627 ありがとう'
end do
end program orei
0629デフォルトの名無しさん
2009/10/03(土) 17:46:130630デフォルトの名無しさん
2009/10/03(土) 17:56:000631デフォルトの名無しさん
2009/10/03(土) 18:18:32あえて理由がない限りは、77はすっとばして90の勉強をしたほうがいいと思うけど
0632デフォルトの名無しさん
2009/10/03(土) 18:18:59やっぱ
プログラミングの入門者には迷著かもしれないが
0633デフォルトの名無しさん
2009/10/03(土) 19:00:12そうは言うがな、大佐。
F90以降は入門書どころか日本語の書籍自体少ないし・・・
0634デフォルトの名無しさん
2009/10/03(土) 19:35:16記憶無いんだが。
90 といえば bit の別冊であったけど、あれも絶版だよね。
単行本にしたらいいのに。あとソフトバンクからも90の本
は大昔に出てたそうだな。どっちも持ってないけど。
0635デフォルトの名無しさん
2009/10/04(日) 02:12:27Bit別冊はMetcalf&ReidのFortran90 Explainedの訳本だから、まぁ今は最新版の原著を買えばいい?
入門書とはいえない気もするが。
0636デフォルトの名無しさん
2009/10/04(日) 19:45:15templateとかクラスがなくて心細いよ
0637デフォルトの名無しさん
2009/10/04(日) 20:23:56物理系?
0638デフォルトの名無しさん
2009/10/04(日) 20:38:020639デフォルトの名無しさん
2009/10/04(日) 21:56:45しかもFortran77
過去の資産有りすぎ
Fortranのサブルーチンは変数が参照渡しだから
他の言語に移植するときめんどい
0640デフォルトの名無しさん
2009/10/04(日) 23:59:4990/95とかだと膜ごしに触っているような感触と言うか。
でもINTENTとかをガチガチに書いた90の方が全般的には気持ちいいが。
2003は実行時の多態化とか入れて便利そうなのは分かるが、また実行時バグが増えそうで
微妙な感じがする。
0641デフォルトの名無しさん
2009/10/05(月) 00:07:32>INTENTとかをガチガチ
計算用の言語としては、この辺で十分な気がする。
十分具体的で十分美しい。かつ十分便利。
もう95位で仕様凍結してくんないかな・・・
0642デフォルトの名無しさん
2009/10/05(月) 02:24:23> もう95位で仕様凍結してくんないかな・・・
同意。色々と弄られるとついて行けなくなりそう。個人的には
Fortran90 で十分と思ってしまうのだが、これは少数派かも。
0643デフォルトの名無しさん
2009/10/05(月) 08:27:30interface 文で呼び出す側で心つもりも教え
pure 属性をつけてインラインしやすくしてあげる
だけど固定書式をつらぬくのが漢!
うそだけど。
固定書式に目が慣れてるといまさら自由書式にしにくいのよね。
右側7文字が空いてないとそわそわしてしまう。
0644デフォルトの名無しさん
2009/10/06(火) 10:09:520645デフォルトの名無しさん
2009/10/09(金) 16:19:470646デフォルトの名無しさん
2009/10/13(火) 19:46:13こんな感じ?
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
0647デフォルトの名無しさん
2009/10/13(火) 20:37:51まさにこれです
ようやっと期待通りにコンパイルできました
有難うございました
0648デフォルトの名無しさん
2009/10/15(木) 04:55:19この例のは、引数の型で振舞を変える事ができるから、標準のmaxやmin関数を連想した。
・・・引数の変数名の数の違いで振舞を変えるもの作れるのかな?
0649デフォルトの名無しさん
2009/10/15(木) 13:56:19任意個数引数の副プログラムは作れないと思う。
Array Constructor で、見かけ上引数を沢山並べるが、引数的には配列として受け取るようにすれば
実現できる気もする。
Call sub( [a, b, c, d, e, f, g] )
Subroutine Sub( x )
Real, Intent (in) :: x(:)
みたいな。
0650デフォルトの名無しさん
2009/10/15(木) 14:41:54今コンパイラを使えない状況にいるので・・、
とりいぞぎお礼まで。
0651デフォルトの名無しさん
2009/10/16(金) 00:37:33補足するならば、[ ] はfortran2003での導入なので、f90的には(/ /)となる。
確定した有限個まででよければ、optional引数を使うとか、1個からn個までのサブルーチンを用意して、
総称名を与える方法も考えられる。
0652デフォルトの名無しさん
2009/10/16(金) 20:54:23最初の宣言部であるパラメータのベクトル 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
というエラーメッセージが表示されました。ただ、このメッセージの
意味さえ解せない状況です。どなたか正しい方法を教えていただけ
ないでしょうか。よろしくお願いします。
0653デフォルトの名無しさん
2009/10/17(土) 00:53:45こうすれば、お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
0654デフォルトの名無しさん
2009/10/17(土) 01:29:41ありがとうございます!
0655デフォルトの名無しさん
2009/10/17(土) 20:19:27そのサブルーチンの中で使ってないmoduleをuseしたりすると
(バグの温床になる以外に)何か弊害ってありますか?
どの変数を使ってるか確認する手間が大きくなり過ぎた場合に
全てのmoduleをどさっとuseしても構わないもんでしょうか?
0656デフォルトの名無しさん
2009/10/18(日) 12:57:28依存関係が無くても、USEされているためにリコンパイルされる可能性があるが、
文法的には問題ないような。
■ このスレッドは過去ログ倉庫に格納されています