0. 必要ファイルのダウンロード (ココ)からCLAPACKのページにいき,clapack.tgz(for CLAPACK, version 3.1.1.1)をdownload。[2008.11.28時点で最新]
1. $tar -zxvf clapack.tgz
// まず適当なディレクトリに解凍します。
$cd [作成されたディレクトリ]
// 作成されたディレクトリに移動。
2. $cp make.inc.example make.inc
// "make.inc"ファイルをコピー
3. $make f2clib
//
4. $make blaslib
//
5. $cd SRC
// ディレクトリに移動
6. $make
//
// ここでlapack_LINUX.aができます
7. $cd ../TESTING/MATGEN/
// ディレクトリに移動
8. $make
//
9. $cd ../../
// "手順1."で作成したディレクトリに戻る
/*-------以上でライブラリの作成は終了--------*/
case1.ルート権限を持っている場合 ->手順10へ。
case2.ルート権限を持っていない場合 ->手順15へ。
/*-------------------------------------------*/
((case1))
ルートになる:
#su
10.#cp lapack_LINUX.a /usr/local/lib/liblapack.a
// コピー
11.#cp blas_LINUX.a /usr/local/lib/libblas.a
// コピー
12.#cp F2CLIBS/libf2c.a /usr/local/lib/
// コピー(名前はそのまま)
13.#/sbin/ldconfig
※コンパイルは,$ gcc hoge.c -o hoge -lm -Wall -llapack -lblas -lf2c
((case2))
適当なディレクトリを作成し,そこにライブラリファイルを置き,毎回読み込む。
ここでは,home/(user_name)下にlibというディレクトリを作成し,そこから読み込む。
15.$mkdir /home/(user_name)/lib
//"lib"ディレクトリを作成
16.$cp lapack_LINUX.a /home/(user_name)/lib/liblapack.a
// コピー
17.$cp blas_LINUX.a /home/(user_name)/lib/libblas.a
// コピー
18.$cp F2CLIBS/libf2c.a /home/(user_name)/lib/
// コピー(名前はそのまま)
※コンパイルは,$ gcc hoge.c -o hoge -lm -Wall -L /home/(user_name)/lib/ -llapack -lblas -lf2c
================================================================================================
================================================================================================
サンプルプログラム 複素行列の固有値分解 [参考ページ2-2より]
================================================================================================
================================================================================================
#include <stdio.h>
#include <math.h>
#include <complex.h>
#define N 2
int main () {
long int dim = N, lda = N, ldvl = 1, ldvr = N, lwork = 2*N, info;
double _Complex A[N*N], EValue[N], EVector[N*N];
double _Complex work[2*N], rwork[2*N];
int i;
A[0] = 1; A[1] = 1+I;
A[2] = 1-I; A[3] = 1;
zgeev_("N", "V", &dim, A, &lda, EValue, NULL, &ldvl, EVector, &ldvr, work, &lwork, rwork, &info);
printf("info=%ld\n", info);
for (i = 0; i < N; i++) {
printf ("EigenValue%1d=%4lf+%4lfI\n", i+1, creal(EValue[i]), cimag(EValue[i]));
}
printf ("Eigen Vectors are shown bellow\n");
for (i = 0; i < N*N; i++) {
printf ("%lf+%lfI\n", creal(EVector[i]), cimag(EVector[i]));
}
return 0;
}
以上
#################################################################
関数名のルール
↓↓↓↓↓↓↓↓↓↓↓↓↓↓
最初の文字 d・・・倍精度浮動小数点数に対するルーチン
z・・・倍精度複素数
s・・・実数
c・・・複素数
2文字目 ge・・・一般行列
sy・・・実対称行列
gb・・・一般帯行列
残りの文字sv・・・線形方程式
ev・・・固有方程式
gv・・・一般化固有値方程式
※CLAPACKの関数名には,最後にアンダーバーが付く