超音波流体屋のプログラム備忘録

CLapack

最終更新:

usapfrog

- view
管理者のみ編集可

インストール (on CentOS 64bit 6.2)

  • yumから以下をインストールする。
blas, blas-devel, atlas, atlas-devel, lapack, lapack-devel, arpack
CC = gcc -DNO_BLAS_WRAP -m64 -fPIC -fomit-frame-pointer -O3 -fno-tree-vectorize -fexceptions -march=native -fopenmp
(64bit, core-i7のため, 32bitとからなら -m64含めた先は不要らしい)
LOADOPTS = -L/usr/lib64/atlas
BLASLIB = /usr/lib64/atlas/libptf77blas.a -latlas -lpthread -lgomp
(rpm -ql atlasでatlasの場所を調べたらここだった)
  • 上記サイト通りに、 make -kでビルド。
  • エラーがでるが、lapack_LINUX.a, tmglib_LINUX.aとかができてる。
  • 以下の3ライブラリを/usr/local/lib64とかにコピーする。
sudo cp lapack_LINUX.a /usr/local/lib64/libclapack.a
sudo cp tmglib_LINUX.a /usr/local/lib64/libtmglib.a
sudo cp F2CLIBS/libf2c.a /usr/local/lib64/libf2c.a
  • ヘッダを/usr/local/includeにコピーする。読み取り権限を変更しておく。
sudo cp INCLUDE/*h /usr/local/include
sudo chmod 644 /usr/local/include/*.h

コンパイルの仕方

  • ソース内でこの順でインクルードするのに注意。
#include <f2c.h>
#include <clapack.h>
  • コンパイル
gcc hoge.c -o hoge.out -lclapack -lblas -lm -lf2c

Visual Studioでの使い方

CLAPACK (f2c'ed version of LAPACK)からはヘッダファイル(clapack.h, f2c.h)だけ落としてくる。
ソースのある場所か適当なインクルードパスに置く。
windowsでのインクルードパスの指定方法は環境変数に"INCLUDE"の名前で追加する。

ライブラリは予めコンパイルしてあるものを使うと楽。
CLAPACK PREBUILT LIBRARIES FOR WINDOWS MACHINE から
libf2c.lib, clapack_nowrap.lib, BLAS_nowrap.lib, tmglib_nowrap.libを落としてくる。
ソースの近場かライブラリパスに追加する。

ソース中で以下のようにライブラリを指定する。(libをソースそばに置いた場合)
  1. #include "f2c.h"
  2. #include "clapack.h"
  3.  
  4. #pragma comment(lib, "tmglib_nowrap.lib")
  5. #pragma comment(lib, "libf2c.lib")
  6. #pragma comment(lib, "BLAS_nowrap.lib")
  7. #pragma comment(lib, "clapack_nowrap.lib")

Visual StudioのバージョンによってはLIBCMT.libと干渉するので、
プロジェクト(P) > (プロジェクト名)のプロパティから、構成プロパティ > リンカー > 入力の、
「特定の規定のライブラリの無視」にLIBCMT.libを追加する


使い方

  • 行列は配列の形で与える。 A(3x3)なら double A[9]。
  • 格納順はColumn-majorつまり 1列1行→1列2行→1列3行→・・・→2列1行 なのに注意。
A =         なら 
8   1   6      A[0]=8.0; A[3]=1.0; A[6]=6.0;
3   5   7      A[1]=3.0; A[4]=5.0; A[7]=7.0;
4   9   2      A[2]=4.0; A[5]=9.0; A[8]=2.0;
  • dgesv(連立方程式解く)のとdgels(過剰決定or劣決定システムの最小二乗解, いわゆるフィッティング)は以下の手順。
  1. //Ax=bを解く
  2. long ROW, COL;
  3. double A[ROW*COL], b[ROW];
  4.  
  5. //おまじない的にいる引数
  6. long aROW=ROW;
  7. long bCOL=1;
  8. long LDA=ROW;
  9. long LDB=ROW;
  10. long INFO;
  11. double IPIV[ROW];
  12.  
  13. //結果はb[0-COL]に格納される
  14. dgesv_(&aROW, &bCOL, A, &LDA, IPIV, B, &LDB, &INFO);
  15.  
  16. //過剰決定なら以下、やっぱりb[0-COL]に結果が格納される。
  17. long aCOL=COL;
  18. double work[ROW+COL];
  19. LDW=ROW+COL;
  20. dgels_('N', &aROW, &aCOL, &bCOL, A, &LDA, B, &LDB, work, &LDW, &INFO);
  21.  
目安箱バナー