超音波流体屋のプログラム備忘録
CLapack
最終更新:
usapfrog
-
view
インストール (on CentOS 64bit 6.2)
- yumから以下をインストールする。
blas, blas-devel, atlas, atlas-devel, lapack, lapack-devel, arpack
- Linux で CLAPACK バージョン 3.2.1 のビルドとインストールに従ってclapack.tgzを落としてくる。
- make.incの変更点は以下のとおり
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"の名前で追加する。
ソースのある場所か適当なインクルードパスに置く。
windowsでのインクルードパスの指定方法は環境変数に"INCLUDE"の名前で追加する。
ライブラリは予めコンパイルしてあるものを使うと楽。
CLAPACK PREBUILT LIBRARIES FOR WINDOWS MACHINE から
libf2c.lib, clapack_nowrap.lib, BLAS_nowrap.lib, tmglib_nowrap.libを落としてくる。
ソースの近場かライブラリパスに追加する。
CLAPACK PREBUILT LIBRARIES FOR WINDOWS MACHINE から
libf2c.lib, clapack_nowrap.lib, BLAS_nowrap.lib, tmglib_nowrap.libを落としてくる。
ソースの近場かライブラリパスに追加する。
ソース中で以下のようにライブラリを指定する。(libをソースそばに置いた場合)
- #include "f2c.h"
- #include "clapack.h"
-
- #pragma comment(lib, "tmglib_nowrap.lib")
- #pragma comment(lib, "libf2c.lib")
- #pragma comment(lib, "BLAS_nowrap.lib")
- #pragma comment(lib, "clapack_nowrap.lib")
Visual StudioのバージョンによってはLIBCMT.libと干渉するので、
プロジェクト(P) > (プロジェクト名)のプロパティから、構成プロパティ > リンカー > 入力の、
「特定の規定のライブラリの無視」に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劣決定システムの最小二乗解, いわゆるフィッティング)は以下の手順。
- //Ax=bを解く
- long ROW, COL;
- double A[ROW*COL], b[ROW];
-
- //おまじない的にいる引数
- long aROW=ROW;
- long bCOL=1;
- long LDA=ROW;
- long LDB=ROW;
- long INFO;
- double IPIV[ROW];
-
- //結果はb[0-COL]に格納される
- dgesv_(&aROW, &bCOL, A, &LDA, IPIV, B, &LDB, &INFO);
-
- //過剰決定なら以下、やっぱりb[0-COL]に結果が格納される。
- long aCOL=COL;
- double work[ROW+COL];
- LDW=ROW+COL;
- dgels_('N', &aROW, &aCOL, &bCOL, A, &LDA, B, &LDB, work, &LDW, &INFO);
-