Excelシートに入力された値をVBAで取得し,BLASやLAPACKで記述されたプログラムを実行する。 その実行結果を,Excelシートに反映するプログラム。
sequenceDiagram
Excel VBA->>lapack.dll: ma, mb, mc, va, vb, vc
Note left of lapack.dll:VBAデータ授受
Note right of lapack.dll:バイナリデータ授受
lapack.dll->>lapack.exe: lapack_input
Note right of lapack.exe:プログラム実行
lapack.exe->>lapack.dll: lapack_output
lapack.dll->>Excel VBA: ma, mb, mc, va, vb, vc
ma: 行列A, mb:行列B, mc:行列C, va:ベクトルa, vb:ベクトルb, vc:ベクトルc
lapack_input: lapack.exeプログラムへの入力バイナリデータ
lapack_output: lapack.exeプログラムから出力バイナリデータ(lapack.dllへの入力バイナリデータ)
- BLAS77とLAPACK77のライブラリを作成
- BLAS95とLAPACK95 インターフェースライブラリを作成
- ユーザーコンソールプログラムと Excel をリンクするDLLを作成
- Excel VBA プロシージャ・ワークシートを作成
- BLAS/LAPACK95のユーザーコンソールプログラムを作成
手順1--3は初回のみ実施すればよい. 2回目以降は,手順4と5を実施する.
次のインストールマニュアルとライブラリソースコードでライブラリを作成する.
-
インストールマニュアル
-
ライブラリソースコード
ビルドしたフォルダ内のlib フォルダ内にライブラリが作成される.
libblas.a
liblapack.a
この2つのライブラリをコピーし開発環境の lib 内に保存する.
他のファイルは不要である.
ソースコードは,開発環境の lib/interfaces 内に保存されている.
これらのものは,Intel Math Kernel Library(無料)から取得したもの.
src をコマンドプロンプトのカレントディレクトリにして,次のコマンドを入力してライブラリを作成する.
> make lib
開発環境の lib 内に次の2つのライブラリが作成される.
この他,6つのモジュールファイルが同フォルダ内に同時に作成される.
libblas95.a
liblapack95.a
前手順で作成したライブラリと合わせて,合計4つのライブラリが作成された.
ソースコード:src/lapack_dll.f90
> make dll
開発環境の bin 内に次の2つのDLLが作成される.
lapack_32bit.dll
test_64bit.dll
- デバッグ用のユーザーコンソールプログラムを作成する.
デバッグ用プログラムは,テストデータ src/set_test_data.f90 を用いたBLASやLAPACKの計算結果を コンソールに表示する. 次のソースコードは, BLASのルーチン(gemm; 一般行列積)を実装した例である. 行列 A (ma) x 行列 B (mb) + 行列 C (mc) を計算する. BLASとLAPACKのルーチンについては,man にあるマニュアルを参照のこと.
src/lapack_sub.f90
subroutine s02 ()
call gemm ( ma, mb, mc )
end subroutine
src のディレクトリで次のコマンドを入力して,プログラムを作成する.
> make debug
開発環境の bin 内に次のコンソールプログラムが作成される.
debug.exe
デバッグが終了したら本コンソールプログラムは不要である.
- ユーザーコンソールプログラムを作成する.
src のディレクトリで次のコマンドを入力して,プログラムを作成する.
> make release
開発環境の bin 内に次のコンソールプログラムが作成される.
lapack.exe
このコンソールプログラムは,カレントディレクトリか Windows のパスが通った場所に保存する.
(参考)次のコマンド入力で上記の手順(lib, dll, debug, release)すべてを実行する。
> make all
bin のディレクトリに保存されたExcel実装例を参考にしてExcelプロシージャやワークシートを作成してください。
Excel VBAのモジュールファイルに記載されたDLLインターフェース
Private Declare PtrSafe Sub lapack Lib "lapack_32bit.dll" ( _
isub As Long, _
a1 As Long, b1 As Long, c1 As Long, _
a2 As Long, b2 As Long, c2 As Long, _
a3 As Long, b3 As Long, c3 As Long, _
ma As Double, mb As Double, mc As Double, _
va As Double, vb As Double, vc As Double)
プロシージャ(サブルーチンや関数)内で次のようにコール
Call lapack( _
isub, _
a1, b1, c1, _
a2, b2, c2, _
a3, b3, c3, _
ma(1, 1), mb(1, 1), mc(1, 1), _
va(1), vb(1), vc(1))
以 上