Lapackをコンパイルしてみる
Lapackのコードを読んでみたいと思います。
まずはgithub Lapackからダウンロードします。
LapackのfortranのコードはSRCフォルダーに入っているのでそれをコンパイルしてみましょう。
SRCフォルダーをどこかにコピーします。
そのときmake.inc.exampleもコピーしてmake.incに名前を変えておきましょう。
SRCの中にMakefileがあるのでmakeしてみましょう。
cd SRC make
すると最後にarコマンドでエラーがでました。
MakefileをみてみるとINSTALLフォルダーのオブジェクトファイルを探して失敗しているようです。
ALLAUX = ilaenv.o ieeeck.o lsamen.o xerbla.o xerbla_array.o iparmq.o iparam2stage.o \ ilaprec.o ilatrans.o ilauplo.o iladiag.o chla_transtype.o \ ../INSTALL/ilaver.o ../INSTALL/lsame.o ../INSTALL/slamch.o SCLAUX = \ 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 slamrg.o slanst.o \ slapy2.o slapy3.o slarnv.o \ slarra.o slarrb.o slarrc.o slarrd.o slarre.o slarrf.o slarrj.o \ slarrk.o slarrr.o slaneg.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 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 slaisnan.o sisnan.o \ slartgp.o slartgs.o \ ../INSTALL/second_$(TIMER).o DZLAUX = \ 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 dlamrg.o dlanst.o \ dlapy2.o dlapy3.o dlarnv.o \ dlarra.o dlarrb.o dlarrc.o dlarrd.o dlarre.o dlarrf.o dlarrj.o \ dlarrk.o dlarrr.o dlaneg.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 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 dlaisnan.o disnan.o \ dlartgp.o dlartgs.o \ ../INSTALL/dlamch.o ../INSTALL/dsecnd_$(TIMER).o
なにかの依存関係でしょう。
消しましょう。
INSTALLのあるラインをコメントしてもう一度make。
ALLAUX = ilaenv.o ieeeck.o lsamen.o xerbla.o xerbla_array.o iparmq.o iparam2stage.o \ ilaprec.o ilatrans.o ilauplo.o iladiag.o chla_transtype.o \ # ../INSTALL/ilaver.o ../INSTALL/lsame.o ../INSTALL/slamch.o SCLAUX = \ 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 slamrg.o slanst.o \ slapy2.o slapy3.o slarnv.o \ slarra.o slarrb.o slarrc.o slarrd.o slarre.o slarrf.o slarrj.o \ slarrk.o slarrr.o slaneg.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 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 slaisnan.o sisnan.o \ slartgp.o slartgs.o \ # ../INSTALL/second_$(TIMER).o DZLAUX = \ 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 dlamrg.o dlanst.o \ dlapy2.o dlapy3.o dlarnv.o \ dlarra.o dlarrb.o dlarrc.o dlarrd.o dlarre.o dlarrf.o dlarrj.o \ dlarrk.o dlarrr.o dlaneg.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 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 dlaisnan.o disnan.o \ dlartgp.o dlartgs.o \ # ../INSTALL/dlamch.o ../INSTALL/dsecnd_$(TIMER).o
liblapack.aができあがります。
なにかこの中にある関数を呼んでみましょう。
CLACRT( N, CX, INCX, CY, INCY, C, S )を呼んでみましょう。
この関数はCXとCYの配列に入っている座標を時計回りに回転させる関数です。
program main INTEGER INCX, INCY, N INTEGER DEG COMPLEX C, S COMPLEX,dimension(3)::CX = sqrt(2.0) COMPLEX,dimension(3)::CY = 0 REAL,PARAMETER::PI = 3.14 print *, CX print *, CY DEG = 45 INCX = 1 INCY = 1 N = 3 C = cos(DEG * (PI/180)) S = sin(DEG * (PI/180)) call CLACRT( N, CX, INCX, CY, INCY, C, S ) print *, CX print *, CY end program main
こんな感じで3つの(√2,0)の座標を45度回転させています。 このコードをtest.f90としてコンパイルしてみます。
gfortran -o test test.f90 SRC/clacrt.f -llapack -L.
./にあるliblapack.aファイルをリンクしています。
( 1.00039804 , 0.00000000 ) ( 1.00039804 , 0.00000000 ) ( 1.00039804 , 0.00000000 ) (-0.999601781 , 0.00000000 ) (-0.999601781 , 0.00000000 ) (-0.999601781 , 0.00000000 )
実行してみるとCX, CY が(1,-1)になってprintされました。