ページ 1 / 1
CLAPACKを利用した連立一次方程式
Posted: 2011年2月13日(日) 17:33
by kikori
CLAPACKを用いて行列の連立方程式を解いているのですが,Bus errorが出てしまい,動きません.ソースはCLAPACKのライブラリとリンクさせてコンパイルしています.ちなみに,コンパイル時には,オブジェクト型ファイルを生成した後,次のように gcc exa.c lapack_LINUX.a blas_LINUX.a libf2c.a tmglib_LINUX.a -lmとコマンドを打った後, ls -Fを打っています.以下にソース示しますので原因分かる方おられましたら,教えてください.
#include<stdio.h>
#include<math.h>
main()
{
int i;
int n=3, nrhs=1, info, ipiv[n];
double A[n*n];
double x[n];
A[0]=2.; A[1]=1.; A[2]=3.;
A[3]=1.; A[4]=3.; A[5]=2.;
A[6]=3.; A[7]=2.; A[8]=1.;
x[0]=13.; x[1]=13.; x[2]=10.;
printf("N=%d\n",n);
dgesv_(&n,&nrhs,A,&n,ipiv,x,&n,&info);
for(i=0;i<n;++i){
printf("%lf\n",x);
}
}
Re: CLAPACKを利用した連立一次方程式
Posted: 2011年2月13日(日) 19:44
by うしお
CLAPACKは知りませんが、
double x[n];のように、変数を配列の宣言に使うことは出来ません。
const int n = 10;などのように定数である必要があります。
ご確認ください
Re: CLAPACKを利用した連立一次方程式
Posted: 2011年2月13日(日) 20:14
by kikori
>うしおさん
回答有り難うございます.
参考までにCLAPACKで連立一次方程式をとくサイトがあったので,掲示させていただきます.
http://homepage3.nifty.com/~yonishi/Pro ... index.html
宣言の表記的には,CLAPACKを使うので,問題ないかと思います.
自分自身まだCLAPACKについてはよくわかってないのですが,CLAPACKの表記に準じたプログラムを書き,それをCLAPACKに渡して計算している感じです.
Re: CLAPACKを利用した連立一次方程式
Posted: 2011年2月13日(日) 20:41
by うしお
うーむそれでないとすると、残念ながら答えられません
printfはdoubleでもfloatでも lfではなくfがただしいようです。
(これが原因ではないかと思いますが・・・)
お力になれず、すみません
Re: CLAPACKを利用した連立一次方程式
Posted: 2011年2月14日(月) 03:01
by コスモ
>CLAPACKを用いて行列の連立方程式を解いているのですが,Bus errorが出てしまい,動きません.ソースはCLAPACKのライブラリとリンクさせてコンパイルしています.
とあるのでこちらのUbuntu10.10 32bit(gcc 4.4.5)の環境で
$ sudo apt-get install libblas-dev liblapack-dev libatlas-base-dev
と必要なパッケージを導入してからコンパイルしてみました。
まず、kikoriさんのコンパイル方法でコンパイルをしようとすると、
-------------------------------
gcc: lapack_LINUX.a: そのようなファイルやディレクトリはありません
gcc: blas_LINUX.a: そのようなファイルやディレクトリはありません
gcc: libf2c.a: そのようなファイルやディレクトリはありません
gcc: tmglib_LINUX.a: そのようなファイルやディレクトリはありません
-------------------------------
と出てコンパイルが上手くいきませんでした…
こちらで調べた方法では、
$ gcc -o exa exa.c -llapack -lblas
としてコンパイルしてやるとdgesv_関数がきちんと値を出してくれました。
--------------------
N=3
1.000000
2.000000
3.000000
--------------------
また、kikoriさんの提示されているソース
のように配列の要素数が変数としてなっていると、
MSVC(WindowsのVC++コンパイラ)ではコンパイルできない為ポータビリティが無くなるので注意しておきます。
gccではコンパイルできます。
Re: CLAPACKを利用した連立一次方程式
Posted: 2011年2月14日(月) 12:45
by kikori
>うしおさん
いえいえ,ありがとうございました
>cosmoさん
回答有り難うございます.
自分の環境でgcc -o exa exa.c -llapack -lblas を行うと,
cannot find -llapack
と出たので,コマンドオプションが登録されていない??ようです.
ちなみにCLAPACKのインストールはCLAPACK-3.1.1.1をインストールしております.
Re: CLAPACKを利用した連立一次方程式
Posted: 2011年2月15日(火) 01:47
by コスモ
kikori さんが書きました:
自分の環境でgcc -o exa exa.c -llapack -lblas を行うと,
cannot find -llapack
と出たので,コマンドオプションが登録されていない??ようです.
ちなみにCLAPACKのインストールはCLAPACK-3.1.1.1をインストールしております.
細かいバージョンがこちらと違っていたみたいですね・・・。
こちらはapt-getで入手出来たパッケージをそのままインストールしてしまったので、
CLAPACKのバージョンは3.2.1-8でした。
バージョンにより上手く動いていないことも考えられます。
バージョンを上げてみたらどうなるでしょうか。
また、CLAPACKはLinuxのディストリビューションにより、
・debパッケージ(Debian/Ubuntu etc.)や
・rpmパッケージ(RedHat/CentOS etc.)
が提供されていることもあるのでそちらのインストールを試みてみるのもいいと思います。
こちらの方法のほうが安全です。
追記ですが、kikoriさんの使われているLinuxのディストリビューションは何でしょうか。
一応ですが、静的ライブラリファイルにLINUXとあるので気になりました。
また、他のC言語のソースでも同様にBus Errorが出るのでしょうか。
このエラーはどうやらメモリが足りない事や、ライブラリが破損している時に出るエラーなようです。
Re: CLAPACKを利用した連立一次方程式
Posted: 2011年2月15日(火) 19:20
by kikori
>cosmoさん
ご丁寧にありがとうございます.
OSはFreeBSDを使っています.
一応計算機は学校にある研究用のスーパーコンピュータ使っているので,メモリ不足はないと思います.
あと,最新バージョンはインストールが上手くいかず,その関係でちょっと古いバージョンをインストールしました.