AUTHOR:大和田 昇

|前のページに戻る |

2009年のメモ内容



CLAPACKのインストール

参考ページ1:http://tokida.sakura.ne.jp/Hobbies/computer/Lapack.html
参考ページ2-1:http://d.hatena.ne.jp/S-ili/20060413
参考ページ2-2:http://d.hatena.ne.jp/S-ili/20060414
参考ページ3:http://www.cazoo.jp/calcsoft/library/lapack/clapack/index.html
参考ページ4:http://homepage3.nifty.com/~yonishi/Program/CLapack/index.html

################################################
/*Linux(gcc)でCLAPACK付属のBLASを使う!!*/
################################################

・編集中のため信用しないでください!
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の関数名には,最後にアンダーバーが付く

例:{実対称行列の全固有値とオプションとして固有ベクトルを計算する}
int dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, integer *lda,
doublereal *w, doublereal *work, integer *lwork, integer *info);
ここで,d→zとすれば,{エルミート行列の全固有値・・・}となる。

その他の注意は,こちらのページ(cazoo!japan)に簡単にまとめられています。