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側 |
Integer | Long |
Real | Single |
double precision | Double |
複素数は、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
配列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
実行結果です。
複素数について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
実行結果です。
配列XからYへ実部と虚部がコピーされました。
以上となります。参考になれば幸いです。ご使用は自己責任でお願いしますね。
コメント