LAPACKをEXCELで使う

sponsored

LAPACKのDLLを作成してEXCELから使用することを試みました。

LAPACKは3.0.0としました。理由はMakefileの中身がシンプルだからです。

DLLの作成にあたり、LAPACKとBLASを分けるのを止めます。元はblasとlapackで別々のライブラリを作成するのですが、DLLとしたときLAPACK.DLLからBLAS.DLLの呼び出しを解決できませんでした。対策として、LAPACKとBLASを一緒にコンパイルしてDLLにしました。

windows環境で作業するためにmingw64をインストールします。ここではc:\mingw64にインストールしています。

makeはmingw32-makeと名前が長いので、リンクを張ります。

管理者権限でターミナルを起動して、c:\mingw64\binに移動します。そこで、

>mklink make.exe mingw32-make.exe

としました。

次に、LAPACKのソースコードをダウンロードしてきます。先にも書きましたがバージョンは3.0.0です。

LAPACK3.0.0.tarをmingw64の下に展開します。
その後、BLAS/SRCの中身をSRCの下に移動させます。
同じ名前のファイルがありますが、同じものなので上書きします。

SRCのなかのMakefileを編集します。
コンパイラやオプションフラグの関係は次のようにしました。DLLの作成と動作を優先して最適化は見送りました。

FORTRAN = gfortran
OPTS = -O0
DRVOPTS = $(OPTS)
NOOPT = -O0
LOADER = gfortran
LOADOPTS =

ターゲットのファイルを指定します。LAPACKのファイルをつらつらと繋げた後にBLASのファイル名を繋げています。同じ名前があるとmake時にエラーとなるので、重複しないように。
また、*second.fはmake時にエラーとなるしIBMのマシン用に思えたので削除しました。

ALLOBJ = ilaenv.o ieeeck.o lsamen.o \
sbdsdc.o \
sbdsqr.o sdisna.o slabad.o slacpy.o sladiv.o slae2.o slaebz.o \
slaed0.o slaed1.o slaed2.o slaed3.o slaed4.o slaed5.o slaed6.o \
slaed7.o slaed8.o slaed9.o slaeda.o slaev2.o slagtf.o \
slagts.o slamch.o slamrg.o slanst.o \
slapy2.o slapy3.o slarnv.o \
slarrb.o slarre.o slarrf.o \
slartg.o slaruv.o slas2.o slascl.o \
slasd0.o slasd1.o slasd2.o slasd3.o slasd4.o slasd5.o slasd6.o \
slasd7.o slasd8.o slasd9.o slasda.o slasdq.o slasdt.o \
slaset.o slasq1.o slasq2.o slasq3.o slasq4.o slasq5.o slasq6.o \
slasr.o slasrt.o slassq.o slasv2.o spttrf.o sstebz.o sstedc.o \
ssteqr.o ssterf.o \
sgbbrd.o sgbcon.o sgbequ.o sgbrfs.o sgbsv.o \
sgbsvx.o sgbtf2.o sgbtrf.o sgbtrs.o sgebak.o sgebal.o sgebd2.o \
sgebrd.o sgecon.o sgeequ.o sgees.o sgeesx.o sgeev.o sgeevx.o \
sgegs.o sgegv.o sgehd2.o sgehrd.o sgelq2.o sgelqf.o \
sgels.o sgelsd.o sgelss.o sgelsx.o sgelsy.o sgeql2.o sgeqlf.o \
sgeqp3.o sgeqpf.o sgeqr2.o sgeqrf.o sgerfs.o sgerq2.o sgerqf.o \
sgesc2.o sgesdd.o sgesv.o sgesvd.o sgesvx.o sgetc2.o sgetf2.o \
sgetrf.o sgetri.o \
sgetrs.o sggbak.o sggbal.o sgges.o sggesx.o sggev.o sggevx.o \
sggglm.o sgghrd.o sgglse.o sggqrf.o \
sggrqf.o sggsvd.o sggsvp.o sgtcon.o sgtrfs.o sgtsv.o \
sgtsvx.o sgttrf.o sgttrs.o sgtts2.o shgeqz.o \
shsein.o shseqr.o slabrd.o slacon.o \
slaein.o slaexc.o slag2.o slags2.o slagtm.o slagv2.o slahqr.o \
slahrd.o slaic1.o slaln2.o slals0.o slalsa.o slalsd.o \
slangb.o slange.o slangt.o slanhs.o slansb.o slansp.o \
slansy.o slantb.o slantp.o slantr.o slanv2.o \
slapll.o slapmt.o \
slaqgb.o slaqge.o slaqp2.o slaqps.o slaqsb.o slaqsp.o slaqsy.o \
slaqtr.o slar1v.o slar2v.o \
slarf.o slarfb.o slarfg.o slarft.o slarfx.o slargv.o \
slarrv.o slartv.o \
slarz.o slarzb.o slarzt.o slaswp.o slasy2.o slasyf.o \
slatbs.o slatdf.o slatps.o slatrd.o slatrs.o slatrz.o slatzm.o \
slauu2.o slauum.o sopgtr.o sopmtr.o sorg2l.o sorg2r.o \
sorgbr.o sorghr.o sorgl2.o sorglq.o sorgql.o sorgqr.o sorgr2.o \
sorgrq.o sorgtr.o sorm2l.o sorm2r.o \
sormbr.o sormhr.o sorml2.o sormlq.o sormql.o sormqr.o sormr2.o \
sormr3.o sormrq.o sormrz.o sormtr.o spbcon.o spbequ.o spbrfs.o \
spbstf.o spbsv.o spbsvx.o \
spbtf2.o spbtrf.o spbtrs.o spocon.o spoequ.o sporfs.o sposv.o \
sposvx.o spotf2.o spotrf.o spotri.o spotrs.o sppcon.o sppequ.o \
spprfs.o sppsv.o sppsvx.o spptrf.o spptri.o spptrs.o sptcon.o \
spteqr.o sptrfs.o sptsv.o sptsvx.o spttrs.o sptts2.o srscl.o \
ssbev.o ssbevd.o ssbevx.o ssbgst.o ssbgv.o ssbgvd.o ssbgvx.o \
ssbtrd.o sspcon.o sspev.o sspevd.o sspevx.o sspgst.o \
sspgv.o sspgvd.o sspgvx.o ssprfs.o sspsv.o sspsvx.o ssptrd.o \
ssptrf.o ssptri.o ssptrs.o sstegr.o sstein.o sstev.o sstevd.o sstevr.o \
sstevx.o ssycon.o ssyev.o ssyevd.o ssyevr.o ssyevx.o ssygs2.o \
ssygst.o ssygv.o ssygvd.o ssygvx.o ssyrfs.o ssysv.o ssysvx.o \
ssytd2.o ssytf2.o ssytrd.o ssytrf.o ssytri.o ssytrs.o stbcon.o \
stbrfs.o stbtrs.o stgevc.o stgex2.o stgexc.o stgsen.o \
stgsja.o stgsna.o stgsy2.o stgsyl.o stpcon.o stprfs.o stptri.o \
stptrs.o \
strcon.o strevc.o strexc.o strrfs.o strsen.o strsna.o strsyl.o \
strti2.o strtri.o strtrs.o stzrqf.o stzrzf.o \
cbdsqr.o cgbbrd.o cgbcon.o cgbequ.o cgbrfs.o cgbsv.o cgbsvx.o \
cgbtf2.o cgbtrf.o cgbtrs.o cgebak.o cgebal.o cgebd2.o cgebrd.o \
cgecon.o cgeequ.o cgees.o cgeesx.o cgeev.o cgeevx.o \
cgegs.o cgegv.o cgehd2.o cgehrd.o cgelq2.o cgelqf.o \
cgels.o cgelsd.o cgelss.o cgelsx.o cgelsy.o cgeql2.o cgeqlf.o cgeqp3.o \
cgeqpf.o cgeqr2.o cgeqrf.o cgerfs.o cgerq2.o cgerqf.o \
cgesc2.o cgesdd.o cgesv.o cgesvd.o cgesvx.o cgetc2.o cgetf2.o cgetrf.o \
cgetri.o cgetrs.o \
cggbak.o cggbal.o cgges.o cggesx.o cggev.o cggevx.o cggglm.o \
cgghrd.o cgglse.o cggqrf.o cggrqf.o \
cggsvd.o cggsvp.o \
cgtcon.o cgtrfs.o cgtsv.o cgtsvx.o cgttrf.o cgttrs.o cgtts2.o chbev.o \
chbevd.o chbevx.o chbgst.o chbgv.o chbgvd.o chbgvx.o chbtrd.o \
checon.o cheev.o cheevd.o cheevr.o cheevx.o chegs2.o chegst.o \
chegv.o chegvd.o chegvx.o cherfs.o chesv.o chesvx.o chetd2.o \
chetf2.o chetrd.o \
chetrf.o chetri.o chetrs.o chgeqz.o chpcon.o chpev.o chpevd.o \
chpevx.o chpgst.o chpgv.o chpgvd.o chpgvx.o chprfs.o chpsv.o \
chpsvx.o \
chptrd.o chptrf.o chptri.o chptrs.o chsein.o chseqr.o clabrd.o \
clacgv.o clacon.o clacp2.o clacpy.o clacrm.o clacrt.o cladiv.o \
claed0.o claed7.o claed8.o \
claein.o claesy.o claev2.o clags2.o clagtm.o \
clahef.o clahqr.o \
clahrd.o claic1.o clals0.o clalsa.o clalsd.o clangb.o clange.o clangt.o \
clanhb.o clanhe.o \
clanhp.o clanhs.o clanht.o clansb.o clansp.o clansy.o clantb.o \
clantp.o clantr.o clapll.o clapmt.o clarcm.o claqgb.o claqge.o \
claqhb.o claqhe.o claqhp.o claqp2.o claqps.o claqsb.o \
claqsp.o claqsy.o clar1v.o clar2v.o clarf.o clarfb.o clarfg.o clarft.o \
clarfx.o clargv.o clarnv.o clarrv.o clartg.o clartv.o \
clarz.o clarzb.o clarzt.o clascl.o claset.o clasr.o classq.o \
claswp.o clasyf.o clatbs.o clatdf.o clatps.o clatrd.o clatrs.o clatrz.o \
clatzm.o clauu2.o clauum.o cpbcon.o cpbequ.o cpbrfs.o cpbstf.o cpbsv.o \
cpbsvx.o cpbtf2.o cpbtrf.o cpbtrs.o cpocon.o cpoequ.o cporfs.o \
cposv.o cposvx.o cpotf2.o cpotrf.o cpotri.o cpotrs.o cppcon.o \
cppequ.o cpprfs.o cppsv.o cppsvx.o cpptrf.o cpptri.o cpptrs.o \
cptcon.o cpteqr.o cptrfs.o cptsv.o cptsvx.o cpttrf.o cpttrs.o cptts2.o \
crot.o cspcon.o cspmv.o cspr.o csprfs.o cspsv.o \
cspsvx.o csptrf.o csptri.o csptrs.o csrot.o csrscl.o cstedc.o \
cstegr.o cstein.o csteqr.o csycon.o csymv.o \
csyr.o csyrfs.o csysv.o csysvx.o csytf2.o csytrf.o csytri.o \
csytrs.o ctbcon.o ctbrfs.o ctbtrs.o ctgevc.o ctgex2.o \
ctgexc.o ctgsen.o ctgsja.o ctgsna.o ctgsy2.o ctgsyl.o ctpcon.o \
ctprfs.o ctptri.o \
ctptrs.o ctrcon.o ctrevc.o ctrexc.o ctrrfs.o ctrsen.o ctrsna.o \
ctrsyl.o ctrti2.o ctrtri.o ctrtrs.o ctzrqf.o ctzrzf.o cung2l.o cung2r.o \
cungbr.o cunghr.o cungl2.o cunglq.o cungql.o cungqr.o cungr2.o \
cungrq.o cungtr.o cunm2l.o cunm2r.o cunmbr.o cunmhr.o cunml2.o \
cunmlq.o cunmql.o cunmqr.o cunmr2.o cunmr3.o cunmrq.o cunmrz.o \
cunmtr.o cupgtr.o cupmtr.o icmax1.o scsum1.o \
zbdsqr.o zgbbrd.o zgbcon.o zgbequ.o zgbrfs.o zgbsv.o zgbsvx.o \
zgbtf2.o zgbtrf.o zgbtrs.o zgebak.o zgebal.o zgebd2.o zgebrd.o \
zgecon.o zgeequ.o zgees.o zgeesx.o zgeev.o zgeevx.o \
zgegs.o zgegv.o zgehd2.o zgehrd.o zgelq2.o zgelqf.o \
zgels.o zgelsd.o zgelss.o zgelsx.o zgelsy.o zgeql2.o zgeqlf.o zgeqp3.o \
zgeqpf.o zgeqr2.o zgeqrf.o zgerfs.o zgerq2.o zgerqf.o \
zgesc2.o zgesdd.o zgesv.o zgesvd.o zgesvx.o zgetc2.o zgetf2.o zgetrf.o \
zgetri.o zgetrs.o \
zggbak.o zggbal.o zgges.o zggesx.o zggev.o zggevx.o zggglm.o \
zgghrd.o zgglse.o zggqrf.o zggrqf.o \
zggsvd.o zggsvp.o \
zgtcon.o zgtrfs.o zgtsv.o zgtsvx.o zgttrf.o zgttrs.o zgtts2.o zhbev.o \
zhbevd.o zhbevx.o zhbgst.o zhbgv.o zhbgvd.o zhbgvx.o zhbtrd.o \
zhecon.o zheev.o zheevd.o zheevr.o zheevx.o zhegs2.o zhegst.o \
zhegv.o zhegvd.o zhegvx.o zherfs.o zhesv.o zhesvx.o zhetd2.o \
zhetf2.o zhetrd.o \
zhetrf.o zhetri.o zhetrs.o zhgeqz.o zhpcon.o zhpev.o zhpevd.o \
zhpevx.o zhpgst.o zhpgv.o zhpgvd.o zhpgvx.o zhprfs.o zhpsv.o \
zhpsvx.o \
zhptrd.o zhptrf.o zhptri.o zhptrs.o zhsein.o zhseqr.o zlabrd.o \
zlacgv.o zlacon.o zlacp2.o zlacpy.o zlacrm.o zlacrt.o zladiv.o \
zlaed0.o zlaed7.o zlaed8.o \
zlaein.o zlaesy.o zlaev2.o zlags2.o zlagtm.o \
zlahef.o zlahqr.o \
zlahrd.o zlaic1.o zlals0.o zlalsa.o zlalsd.o zlangb.o zlange.o \
zlangt.o zlanhb.o \
zlanhe.o \
zlanhp.o zlanhs.o zlanht.o zlansb.o zlansp.o zlansy.o zlantb.o \
zlantp.o zlantr.o zlapll.o zlapmt.o zlaqgb.o zlaqge.o \
zlaqhb.o zlaqhe.o zlaqhp.o zlaqp2.o zlaqps.o zlaqsb.o \
zlaqsp.o zlaqsy.o zlar1v.o zlar2v.o zlarcm.o zlarf.o zlarfb.o \
zlarfg.o zlarft.o \
zlarfx.o zlargv.o zlarnv.o zlarrv.o zlartg.o zlartv.o \
zlarz.o zlarzb.o zlarzt.o zlascl.o zlaset.o zlasr.o \
zlassq.o zlaswp.o zlasyf.o \
zlatbs.o zlatdf.o zlatps.o zlatrd.o zlatrs.o zlatrz.o zlatzm.o zlauu2.o \
zlauum.o zpbcon.o zpbequ.o zpbrfs.o zpbstf.o zpbsv.o \
zpbsvx.o zpbtf2.o zpbtrf.o zpbtrs.o zpocon.o zpoequ.o zporfs.o \
zposv.o zposvx.o zpotf2.o zpotrf.o zpotri.o zpotrs.o zppcon.o \
zppequ.o zpprfs.o zppsv.o zppsvx.o zpptrf.o zpptri.o zpptrs.o \
zptcon.o zpteqr.o zptrfs.o zptsv.o zptsvx.o zpttrf.o zpttrs.o zptts2.o \
zrot.o zspcon.o zspmv.o zspr.o zsprfs.o zspsv.o \
zspsvx.o zsptrf.o zsptri.o zsptrs.o zdrot.o zdrscl.o zstedc.o \
zstegr.o zstein.o zsteqr.o zsycon.o zsymv.o \
zsyr.o zsyrfs.o zsysv.o zsysvx.o zsytf2.o zsytrf.o zsytri.o \
zsytrs.o ztbcon.o ztbrfs.o ztbtrs.o ztgevc.o ztgex2.o \
ztgexc.o ztgsen.o ztgsja.o ztgsna.o ztgsy2.o ztgsyl.o ztpcon.o \
ztprfs.o ztptri.o \
ztptrs.o ztrcon.o ztrevc.o ztrexc.o ztrrfs.o ztrsen.o ztrsna.o \
ztrsyl.o ztrti2.o ztrtri.o ztrtrs.o ztzrqf.o ztzrzf.o zung2l.o \
zung2r.o zungbr.o zunghr.o zungl2.o zunglq.o zungql.o zungqr.o zungr2.o \
zungrq.o zungtr.o zunm2l.o zunm2r.o zunmbr.o zunmhr.o zunml2.o \
zunmlq.o zunmql.o zunmqr.o zunmr2.o zunmr3.o zunmrq.o zunmrz.o \
zunmtr.o zupgtr.o \
zupmtr.o izmax1.o dzsum1.o \
dbdsdc.o \
dbdsqr.o ddisna.o dlabad.o dlacpy.o dladiv.o dlae2.o dlaebz.o \
dlaed0.o dlaed1.o dlaed2.o dlaed3.o dlaed4.o dlaed5.o dlaed6.o \
dlaed7.o dlaed8.o dlaed9.o dlaeda.o dlaev2.o dlagtf.o \
dlagts.o dlamch.o dlamrg.o dlanst.o \
dlapy2.o dlapy3.o dlarnv.o \
dlarrb.o dlarre.o dlarrf.o \
dlartg.o dlaruv.o dlas2.o dlascl.o \
dlasd0.o dlasd1.o dlasd2.o dlasd3.o dlasd4.o dlasd5.o dlasd6.o \
dlasd7.o dlasd8.o dlasd9.o dlasda.o dlasdq.o dlasdt.o \
dlaset.o dlasq1.o dlasq2.o dlasq3.o dlasq4.o dlasq5.o dlasq6.o \
dlasr.o dlasrt.o dlassq.o dlasv2.o dpttrf.o dstebz.o dstedc.o \
dsteqr.o dsterf.o \
dgbbrd.o dgbcon.o dgbequ.o dgbrfs.o dgbsv.o \
dgbsvx.o dgbtf2.o dgbtrf.o dgbtrs.o dgebak.o dgebal.o dgebd2.o \
dgebrd.o dgecon.o dgeequ.o dgees.o dgeesx.o dgeev.o dgeevx.o \
dgegs.o dgegv.o dgehd2.o dgehrd.o dgelq2.o dgelqf.o \
dgels.o dgelsd.o dgelss.o dgelsx.o dgelsy.o dgeql2.o dgeqlf.o \
dgeqp3.o dgeqpf.o dgeqr2.o dgeqrf.o dgerfs.o dgerq2.o dgerqf.o \
dgesc2.o dgesdd.o dgesv.o dgesvd.o dgesvx.o dgetc2.o dgetf2.o \
dgetrf.o dgetri.o \
dgetrs.o dggbak.o dggbal.o dgges.o dggesx.o dggev.o dggevx.o \
dggglm.o dgghrd.o dgglse.o dggqrf.o \
dggrqf.o dggsvd.o dggsvp.o dgtcon.o dgtrfs.o dgtsv.o \
dgtsvx.o dgttrf.o dgttrs.o dgtts2.o dhgeqz.o \
dhsein.o dhseqr.o dlabrd.o dlacon.o \
dlaein.o dlaexc.o dlag2.o dlags2.o dlagtm.o dlagv2.o dlahqr.o \
dlahrd.o dlaic1.o dlaln2.o dlals0.o dlalsa.o dlalsd.o \
dlangb.o dlange.o dlangt.o dlanhs.o dlansb.o dlansp.o \
dlansy.o dlantb.o dlantp.o dlantr.o dlanv2.o \
dlapll.o dlapmt.o \
dlaqgb.o dlaqge.o dlaqp2.o dlaqps.o dlaqsb.o dlaqsp.o dlaqsy.o \
dlaqtr.o dlar1v.o dlar2v.o \
dlarf.o dlarfb.o dlarfg.o dlarft.o dlarfx.o dlargv.o \
dlarrv.o dlartv.o \
dlarz.o dlarzb.o dlarzt.o dlaswp.o dlasy2.o dlasyf.o \
dlatbs.o dlatdf.o dlatps.o dlatrd.o dlatrs.o dlatrz.o dlatzm.o dlauu2.o \
dlauum.o dopgtr.o dopmtr.o dorg2l.o dorg2r.o \
dorgbr.o dorghr.o dorgl2.o dorglq.o dorgql.o dorgqr.o dorgr2.o \
dorgrq.o dorgtr.o dorm2l.o dorm2r.o \
dormbr.o dormhr.o dorml2.o dormlq.o dormql.o dormqr.o dormr2.o \
dormr3.o dormrq.o dormrz.o dormtr.o dpbcon.o dpbequ.o dpbrfs.o \
dpbstf.o dpbsv.o dpbsvx.o \
dpbtf2.o dpbtrf.o dpbtrs.o dpocon.o dpoequ.o dporfs.o dposv.o \
dposvx.o dpotf2.o dpotrf.o dpotri.o dpotrs.o dppcon.o dppequ.o \
dpprfs.o dppsv.o dppsvx.o dpptrf.o dpptri.o dpptrs.o dptcon.o \
dpteqr.o dptrfs.o dptsv.o dptsvx.o dpttrs.o dptts2.o drscl.o \
dsbev.o dsbevd.o dsbevx.o dsbgst.o dsbgv.o dsbgvd.o dsbgvx.o \
dsbtrd.o dspcon.o dspev.o dspevd.o dspevx.o dspgst.o \
dspgv.o dspgvd.o dspgvx.o dsprfs.o dspsv.o dspsvx.o dsptrd.o \
dsptrf.o dsptri.o dsptrs.o dstegr.o dstein.o dstev.o dstevd.o dstevr.o \
dstevx.o dsycon.o dsyev.o dsyevd.o dsyevr.o \
dsyevx.o dsygs2.o dsygst.o dsygv.o dsygvd.o dsygvx.o dsyrfs.o \
dsysv.o dsysvx.o \
dsytd2.o dsytf2.o dsytrd.o dsytrf.o dsytri.o dsytrs.o dtbcon.o \
dtbrfs.o dtbtrs.o dtgevc.o dtgex2.o dtgexc.o dtgsen.o \
dtgsja.o dtgsna.o dtgsy2.o dtgsyl.o dtpcon.o dtprfs.o dtptri.o \
dtptrs.o \
dtrcon.o dtrevc.o dtrexc.o dtrrfs.o dtrsen.o dtrsna.o dtrsyl.o \
dtrti2.o dtrtri.o dtrtrs.o dtzrqf.o dtzrzf.o \
sdot.o \
srot.o srotg.o sswap.o \
scasum.o scnrm2.o icamax.o caxpy.o ccopy.o \
cdotc.o cdotu.o csscal.o crotg.o cscal.o cswap.o \
ddot.o \
drot.o drotg.o dswap.o \
dcabs1.o dzasum.o dznrm2.o izamax.o zaxpy.o zcopy.o \
zdotc.o zdotu.o zdscal.o zrotg.o zscal.o zswap.o \
isamax.o sasum.o saxpy.o scopy.o snrm2.o sscal.o \
idamax.o dasum.o daxpy.o dcopy.o dnrm2.o dscal.o \
lsame.o xerbla.o \
sgemv.o sgbmv.o ssymv.o ssbmv.o sspmv.o \
strmv.o stbmv.o stpmv.o strsv.o stbsv.o stpsv.o \
sger.o ssyr.o sspr.o ssyr2.o sspr2.o \
cgemv.o cgbmv.o chemv.o chbmv.o chpmv.o \
ctrmv.o ctbmv.o ctpmv.o ctrsv.o ctbsv.o ctpsv.o \
cgerc.o cgeru.o cher.o chpr.o cher2.o chpr2.o \
dgemv.o dgbmv.o dsymv.o dsbmv.o dspmv.o \
dtrmv.o dtbmv.o dtpmv.o dtrsv.o dtbsv.o dtpsv.o \
dger.o dsyr.o dspr.o dsyr2.o dspr2.o \
zgemv.o zgbmv.o zhemv.o zhbmv.o zhpmv.o \
ztrmv.o ztbmv.o ztpmv.o ztrsv.o ztbsv.o ztpsv.o \
zgerc.o zgeru.o zher.o zhpr.o zher2.o zhpr2.o \
sgemm.o ssymm.o ssyrk.o ssyr2k.o strmm.o strsm.o \
cgemm.o csymm.o csyrk.o csyr2k.o ctrmm.o ctrsm.o \
chemm.o cherk.o cher2k.o \
dgemm.o dsymm.o dsyrk.o dsyr2k.o dtrmm.o dtrsm.o \
zgemm.o zsymm.o zsyrk.o zsyr2k.o ztrmm.o ztrsm.o \
zhemm.o zherk.o zher2k.o

この後はmakeのルールを記入します。

.f.o:
    $(FORTRAN) $(OPTS) -c $*.f

shared: $(ALLOBJ) 
    gfortran -shared -mrtd $(ALLOBJ)  -o lapack300.dll

Makefileを作成したら

>make shared

これでlapack300.dllが作成されますが、ここで問題が起きました。DLLの依存性を確認したところ、

>objdump -p lapack300.dll | findstr "dll"

libgccやlibgfortranとかに依存していることがわかります。このままではminGW64のない環境では実行時にエラーとなってしまいます。

そこで、make時のコンパイラオプションを次のように変更しました。

shared: $(ALLOBJ)
    gfortran -shared -mrtd $(ALLOBJ) -static-libgfortran -static-libgcc \
        -static-libquadmath -o lapack300.dll

作成されたlapack300.dllをチェックすると、

minGW64のdllに依存していません。

lapack300.dllのサイズは大きくなってしまいますが、やむなしとしています。

dllの作成が終わったので、EXCEL側の作業を行います。

EXCELの開発>VisualBasicでVBAのエディタを起動します。そして標準モジュールに使用する関数の情報を記述します。今回は64bit版のEXCELでBLASのDCOPYとLAPACKのDGESVを使うので次のようになります。

Public Declare PtrSafe Sub DCOPY Lib "d:\lapack300.dll" Alias "dcopy_" (ByRef N As Long, ByRef SX As Double, ByRef INCX As Long, ByRef SY As Double, ByRef INCY As Long)
Public Declare PtrSafe Sub DGESV Lib "d:\lapack300.dll" Alias "dgesv_" (ByRef N As Long, ByRef NRHS As Long, ByRef A As Double, ByRef LDA As Long, ByRef IPIV As Long, ByRef B As Double, ByRef LDB As Long, ByRef INFO As Long)

ポイントはfortranの関数名は”○○〇_”と後ろにアンダースコアが付きます。煩わしいのでAliasで対応しています。変数のサイズは次の様になります。

Fortran側VBA側
IntegerLong
RealSingle
double precisionDouble

複素数は、VBAの標準モジュール内で次のように定義します。

Type complex
X As Single
Y As Single
End Type
Type Dcomplex
X As Double
Y As Double
End Type

fortranはアドレス渡しなのでVBA側はByRefです。配列は先頭を渡します。(追記:CHARACTER型に渡すときはByValとします。)
DCOPYのテストに使用したVBAです。

Sub main2()
Dim N As Long, IX As Long, IY As Long
Dim A() As Double, B() As Double
ReDim A(5) 
ReDim B(9) 

N = 4 
IX = 1 
IY = 2 
A(1) = 1# 
A(2) = 6# 
A(3) = 3# 
A(4) = 3# 
B(1) = 0# 
B(2) = 0# 
Call DCOPY(N, A(1), IX, B(1), IY) 
Debug.Print (B(1))
End Sub
配列B 初期状態
配列B DCOPY後

配列Aから配列Bに1つづつ間隔を開けながらコピーされました。

DGESVのテストです。

Sub test_dgesv()
Dim N As Long, NRHS As Long, LDA As Long, LDB As Long, INFO As Long
Dim IPIV() As Long
Dim A() As Double, B() As Double
Dim Z As Single, O As Single

    ReDim A(4, 4)
    ReDim B(4)
    ReDim IPIV(8)
    
    O = 1
    Z = 0
    N = 4
    LDA = 4
    LDB = 4
    NRHS = 1
    A(1, 1) = 1.8
    A(2, 1) = 5.25
    A(3, 1) = 1.58
    A(4, 1) = -1.11
    A(1, 2) = 2.88
    A(2, 2) = -2.95
    A(3, 2) = -2.69
    A(4, 2) = -0.66
    A(1, 3) = 2.05
    A(2, 3) = -0.95
    A(3, 3) = -2.9
    A(4, 3) = -0.59
    A(1, 4) = -0.89
    A(2, 4) = -3.8
    A(3, 4) = -1.04
    A(4, 4) = 0.8
    B(1) = 9.52
    B(2) = 24.35
    B(3) = 0.77
    B(4) = -6.22
    Call DGESV(N, NRHS, A(1, 1), LDA, IPIV(1), B(1), LDB, INFO)

    Debug.Print (LDA)
End Sub

実行結果です。

DGESV実行前
DGESV実行後

配列Bの値は参考と同じ値となりました。

複素数についてCCOPYを使って確認しました。標準モジュールに次の設定を記述します。

Public Declare PtrSafe Sub CCOPY Lib "d:\lapack300.dll" Alias "ccopy_" (N As Long, ByRef CX As complex, INCX As Long, ByRef CY As complex, INCY As Long)

VBAのコードです。

Sub TEST_CCOPY()
Dim m1 As Long
Dim X(5) As complex
Dim m2 As Long
Dim Y(5) As complex
Dim N As Long

For N = 1 To 5
Y(N).X = 0!
Y(N).Y = 0!
Next N

N = 5
X(1).X = 4!
X(1).Y = -4!
X(2).X = 0.1!
X(2).Y = 0.2!
X(3).X = 5!
X(3).Y = 1!
X(4).X = -0.8!
X(4).Y = -0.8!
X(5).X = 6!
X(5).Y = 0.5!
m1 = 1
m2 = 1

Call CCOPY(N, X(1), m1, Y(1), m2)

Debug.Print (Y(1).X)
Debug.Print (Y(1).Y)
Debug.Print (Y(2).X)
Debug.Print (Y(2).Y)
Debug.Print (Y(3).X)
Debug.Print (Y(3).Y)
Debug.Print (Y(4).X)
Debug.Print (Y(4).Y)
Debug.Print (Y(5).X)
Debug.Print (Y(5).Y)
End Sub

実行結果です。

配列Y CCOPY前
配列Y CCOPY後

配列XからYへ実部と虚部がコピーされました。

以上となります。参考になれば幸いです。ご使用は自己責任でお願いしますね。

コメント

タイトルとURLをコピーしました