#nike #vandal #lapack #clicklinkinbio #nikes #vandals
seen from China

seen from Türkiye

seen from Australia
seen from India

seen from Maldives
seen from China
seen from China
seen from United Kingdom
seen from China

seen from Norway
seen from Norway
seen from United States

seen from China

seen from United States
seen from United States

seen from France
seen from Germany
seen from France
seen from Türkiye
seen from Malaysia
#nike #vandal #lapack #clicklinkinbio #nikes #vandals

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
On March 30, 2022, ACM, the Association for Computing Machinery, named Jack J. Dongarra the recipient of the 2021 ACM A.M.Turing Award for p
Open-source linear algebra software FTW!
This shit really was a game changer. Before LINPACK/LAPACK, you had to license commercial software like MA27 from the Harwell Subroutine Library (now, of course, superseded by MA57).
Now you can just
pip install numpy
Lapack release 1
ifortでNumeric error無しのLAPACK
以前の記事でintelコンパイラでnetlibのLAPACKをビルドして、make testすると数値エラーがあると書きました。 http://sage-t.tumblr.com/post/82682033843/lapack-check-install 今度はその数値エラーをいかに無くすか、試してみました。 make testに至るまでのビルド方法の詳細は、以前の記事を参照してください。 Intel コンパイラに関する噂として、最適化する際ビットのエラーを気にせず演算の順番を入れ替えたりとか何かするというのがあります。 そこで最適化フラグをO0と明示してみましょう。cmakeのフラグを以下の様にします。
CMAKE_Fortran_FLAGS -O0
CMAKE_Fortran_FLAGS_MINSIZERELEASE -O0
CMAKE_Fortran_FLAGS_RELEASE -O0
たぶん下二つは必須ではないと思いますが、まあ一応。 これでビルドしてmake testして見ます。
--> LAPACK TESTING SUMMARY <-- Processing LAPACK Testing output found in the TESTING direcory SUMMARY nb test run numerical error other error ================ =========== ================= ================ REAL 1079349 0 (0.000%) 0 (0.000%) DOUBLE PRECISION 1079349 0 (0.000%) 0 (0.000%) COMPLEX 556022 0 (0.000%) 0 (0.000%) COMPLEX16 545818 3 (0.001%) 0 (0.000%) --> ALL PRECISIONS 3260538 3 (0.000%) 0 (0.000%)
一気に減りました。だけど0になったわけではありません。 で、いろいろ調べていると、もっと直接的に浮動小数点演算の精度を指定できるオプションがありました。 https://software.intel.com/sites/products/documentation/doclib/stdxe/2013/composerxe/compiler/fortran-mac/GUID-63514789-6BE7-4FA8-9389-F3B618A2EE1A.htm ということで、CMAKE_Fortran_FLAGSに-fp-model preciseと入れてビルド。
$ make (中略) ifort: command line warning #10212: -fp-model precise evaluates in source precision with Fortran. ifort: command line error: use of '-fp-model <arg>' option along with a floating point precision option not supported make[2]: *** [BLAS/SRC/CMakeFiles/blas.dir/isamax.f.o] Error 1 make[1]: *** [BLAS/SRC/CMakeFiles/blas.dir/all] Error 2
といわれます。どういうことだ、とbuildディレクトリ(作業ディレクトリ)に生成されたソースコードのコンパイルオプションをチェック。
$ cat BLAS/SRC/CMakeFiles/blas.dir/flags.make # CMAKE generated file: DO NOT EDIT! # Generated by "Unix Makefiles" Generator, CMake Version 2.8 # compile Fortran with /opt/intel/bin/ifort Fortran_FLAGS = -fp-model precise -fltconsistency -fp_port Fortran_DEFINES =
6行目の -fp-model precise -fltconsistency -fp_port が、「 use of '-fp-model <arg>' option along with a floating point precision option not supported」に該当しているようです。つまり-fp-modelオプションと他のfpオプションの併用はサポートされていないからだめ、と。 一応-fltconsistencyとか-fp_port も調べてみたのですが、これらも浮動小数点演算の精度に関するオプションでした。Lapackは精度重視したいのか、これらを自動で加えているようです。 fltconsistency http://wwweic.eri.u-tokyo.ac.jp/computer/manual/altix/compile/Fortran/Intel_Fdoc91/main_for/mergedProjects/copts_for/fortran_options/option_fltconsistency.htm fp_port https://software.intel.com/sites/products/documentation/doclib/stdxe/2013/composerxe/compiler/fortran-lin/GUID-3B693484-8CB1-4F34-A4A8-ADD0E0D73364.htm けどまあ-fp-model preciseはこれらの上位互換みたいな?よく知りませんが。 ということで、CMAKE generated file: DO NOT EDIT!とか言われるこれらflags.makeからこういったオプションを削り、
Fortran_FLAGS = -fp-model precise
としてみます。 この後ビルドを進めていくと、また同様に-fp系オプションの競合が出たので、逐次-fltconsistency -fp_port を削っていきます。 flags.makeのほかに、link.txtからも削る必要がありました。 またディレクトリ構成も、BLAS、LAPACK、テスト用プログラムのそれぞれに分けられてて、そのすべてに設定ファイルがありますので、編集対象のファイルは地味に多いです。
SRC/CMakeFiles/lapack.dir/flags.make
BLAS/SRC/CMakeFiles/blas.dir/flags.make
TESTING/MATGEN/CMakeFiles/tmglib.dir/flags.make
がflags.makeだけ編集すればよいディレクトリ。
BLAS/TESTING/CMakeFiles/ の中に xblat1c.dir/ xblat1s.dir/ xblat2c.dir/ xblat2s.dir/ xblat3c.dir/ xblat3s.dir/ xblat1d.dir/ xblat1z.dir/ xblat2d.dir/ xblat2z.dir/ xblat3d.dir/ xblat3z.dir/
TESTING/LIN/CMakeFiles/ の中に xlintstc.dir/ xlintstds.dir/ xlintstrfd.dir/ xlintstrfz.dir/ xlintstzc.dir/ xlintstd.dir/ xlintstrfc.dir/ xlintstrfs.dir/ xlintsts.dir/ xlintstz.dir/
TESTING/EIG/CMakeFiles/ の中に xeigtstc.dir/ xeigtstd.dir/ xeigtsts.dir/ xeigtstz.dir/
というテスト用プログラムを分けたディレクトリがあり、それぞれがflags.makeとlink.txt をもっていて、それら全てを書き直す必要があります。 perlを使えば比較的楽に編集できます。たとえば、
perl -p -i.bak -e 's/-fltconsistency -fp_port//g' TESTING/LIN/CMakeFiles/xlint*.dir/link.txt perl -p -i.bak -e 's/-fltconsistency -fp_port//g' TESTING/LIN/CMakeFiles/xlint*.dir/flags.make
の二行で、TESTING/LIN/CMakeFiles/にある全てのflags.makeとlink.txtは編集ができて、flags.make.bakとバックアップが取れています(-i.bakオプション)。 これでビルドします。-fp-model preciseオプションで「ソースコードレベルの精度でビルドするよ」ていう警告がうっとうしいですが、とりあえず完了します。警告を抑えるには-wオプションを加えます。 でmake test。
--> LAPACK TESTING SUMMARY <-- Processing LAPACK Testing output found in the TESTING direcory SUMMARY nb test run numerical error other error ================ =========== ================= ================ REAL 1079349 0 (0.000%) 0 (0.000%) DOUBLE PRECISION 1079349 0 (0.000%) 0 (0.000%) COMPLEX 556022 0 (0.000%) 0 (0.000%) COMPLEX16 556834 0 (0.000%) 0 (0.000%) --> ALL PRECISIONS 3271554 0 (0.000%) 0 (0.000%)
めでたしめでたし。 ですがうまく言ったとはいえ、これはLapackのテストで大丈夫というだけで、全ての演算で精度が大丈夫というわけではないです。 まあ-fltconsistency(浮動小数点の一貫性)と-fp_port(丸め順番)がnetlib Lapack的には最低限守ってほしい精度なんだというnetlibからのメッセージなのでしょうか。 自分のプロジェクトでも大丈夫という保証ではないと思いますので、改めて自分のプログラム向けのテストもすると完璧でしょう。 テストプログラムにはぜひFortranを。
LAPACK3.4以前のmake.inc編集形式だと、INSTALLフォルダにmake.inc.ifortがあるかと思います。これをコピーしてきてmake.incにリネーム。そのあとmake.incをvimかemacsなどお好みのエディタで開き、NOOPTの-fltconsistencyと-fp_portを削除、NOOPTとOPTSに-fp-model preciseを追加してやればいいようです。 -Onなどの最適化オプションは関係ない模様。
GCCの方はどうかといいますと、ビットの精度のほうを優先しているようです。たとえばa*a*a*a*a*aは単純に5回掛け算なのですが、a3 = a*a*a、a3*a3とすると3回の掛け算になります。ですがビット精度があるので、前者のように律儀にかけていくようにしています。 http://stackoverflow.com/questions/6430448/why-doesnt-gcc-optimize-aaaaaa-to-aaaaaa まあこのリンク先にもあるように、GCCにも-ffast-mathというこのような計算順序を速度の観点で最適化するオプションがあります。 ということで、CMAKE_Fortran_FLAGSに-ffast-mathを指定しますと、
--> LAPACK TESTING SUMMARY <-- Processing LAPACK Testing output found in the TESTING direcory SUMMARY nb test run numerical error other error ================ =========== ================= ================ REAL 914117 547 (0.060%) 0 (0.000%) DOUBLE PRECISION 918867 477 (0.052%) 0 (0.000%) COMPLEX 320666 9626 (3.002%) 0 (0.000%) COMPLEX16 323275 9637 (2.981%) 0 (0.000%) --> ALL PRECISIONS 2476925 20287 (0.819%) 0 (0.000%)
こんな風にエラーがいっぱい出ます。Intelの浮動小数点操作を気にしなかったときよりだいぶひどい。Intel fortranは精度を犠牲にしているとはいえそれなりに工夫しているのかもしれません。
LAPACKのcheck install
LAPACKを有名なコンパイラ2つでビルドして比較します。 なんかコンパイラごとにビルドして、それぞれでテストをしてみてエラーを割合を調べたいと思います。 clang系のもやってみたかったのですが、flangもlfortも完成していない模様。 ということで、gfortranとifortを試します。 まずはLAPACKのビルドから。 ビルドくらいできらぁ、という方は横線で区切っているところまで読み飛ばしてください。
LAPACKのソースコードをこ↑こ↓から入手。 http://www.netlib.org/lapack/ バージョン3.5になってからcmakeを使って設定するようになりました。 普通のLINUXのパッケージマネージャでなら普通にcmakeがあると思います。
sudo yum install cmake sudo apt-get install cmake
など。ですが、ディストリビューションによっては、cmakeのバージョンが古いとか言われるかもしれません。その時は、ここからcmakeを取ってきます。 http://www.cmake.org/
mkdir /home/sage/cmake2.8 wget http://www.cmake.org/files/v2.8/cmake-2.8.12.2.tar.gz tar xvzf cmake-2.8.12.2.tar.gz cd cmake-2.8.12.2 ./configure --prefix=/home/sage/cmake2.8 --qt-gui make -j4 make install
--qt-guiのためにはQt 4.2以上が必要です。おそらくlibqt4-develとその依存関係をインストールすればいいかと。 wgetのURLが勝手にaタグでリンク化してしまってます。数値文字参照表記(&hogehoge;というの)にしても回避できませんでした。すみません。 準備ができたら、LAPACKのソースコードをnetlibから落としてきてビルドします。
mkdir /home/sage/lapack/ wget http://www.netlib.org/lapack/lapack-3.5.0.tgz tar xvzf lapack-3.5.0.tgz cd lapack-3.5.0 mkdir build cd build cmake-gui .. もしくは /home/sage/cmake2.8/bin/cmake-gui ..
するとcmakeのGUIが開きます。
cmake .. -i
とやってターミナル上にて対話的に設定もできますが、ミスると1からになったり、いちいちEnterを押していくのがめんどいとかありますので、GUIをお勧めします。 Xが使えなかったり、Qtライブラリにミスがあったら、仕方なくCUIのcmakeを使いましょう。 CMAKE_INSTALL_PREFIXでLapackライブラリを放り込みたいディレクトリを指定します。ここでは/home/sage/lapackとします。 Configure、generateをクリックしてmakefileを生成。buildディレクトリ内でlsコマンドを打てば、cmakeが作ったファイル群が見れるでしょう。 なんでインストールディレクトリをデフォルトの/usr/hogehogeのままにしないかというと、コンパイラやオプションごとに違うライブラリにしたいというのがあります。このときはインストールディレクトリをhomeで分けるのが楽かな、と。permissionもありますし。 違うオプションとしては、たとえば整数を4バイトから8バイトにするというのがあります。
gfortran -fdefault-integer-8 もしくは ifort -i8
C系だとlong,intなどと整数のバイト数は決まっています。fortranでもinteger(kind=hogehoge)としたら指定できますが、integerだけだとデフォルトのサイズとなります。普通は4バイトで、BLAS・LAPACKの中ではintegerはデフォルトの4バイトです。 で、自分のプロジェクトからLapackに渡す整数が8バイトだと、それ用にコンパイルし直す必要があります。 おそらく整数は配列のポインタとして使っているので、8バイト(Cならlong long)でないと、配列サイズが3GBとかいくような場合だと問題があるかもしれません。 とりあえず、LAPACKをリンクする予定のプロジェクトで、渡されている整数が何バイトなのかを確かめておきましょう。 なお、8バイト整数版を作るためにオプションをコンパイラに渡すには、CMAKEのエントリでいうとCMAKE_Fortran_FLAGSですので、ここに対応するオプションを入れましょう。 閑話休題。 C\MAKEの設定とMakefile生成がつつがなく終わったら、上のほうのx印をクリックしてウィンドウを閉じて、ターミナルに戻ります。
make make install
これでインストールが終わりました。 なおこの設定でLAPACKへリンクするには、
gfortran hoge.f90 -L/home/sage/lapack/lib -llapack -lblas
とします。
ここからこの記事の目的、TESTをしてライブラリの精度を確認します。 OpenSUSEのgfortran4.7.2では。
make test -j4 (中略) なんかエラー、けどテストプログラム自体は終わってるので、次のコマンドで結果表示 ./lapack_testing.py (中略) --> LAPACK TESTING SUMMARY <-- Processing LAPACK Testing output found in the TESTING direcory SUMMARY nb test run numerical error other error ================ =========== ================= ================ REAL 756979 0 (0.000%) 0 (0.000%) DOUBLE PRECISION 1079349 0 (0.000%) 0 (0.000%) COMPLEX 556022 0 (0.000%) 0 (0.000%) COMPLEX16 556834 0 (0.000%) 0 (0.000%) --> ALL PRECISIONS 2949184 0 (0.000%) 0 (0.000%)
ばっちりです。 CentOSにgfortran4.7をビルドした日記でもあるように、そちらでもTestは大丈夫でした。
ではUbuntu12にあるintel ComposerXE 14.0.0のifort。だいぶ前に非商用版を貰ってきました。 cmake-guiのときにLogが無い状態でconfigureをクリックするとコンパイラを指定できます。ここで開くダイアログでspecify native copmilerにして次に進むと、fortran、C、C++を指定できます。ここでpathが通ったifortを指定。 その後Makefileをgenerateしたあとmake、make test。
make test (中略) --> LAPACK TESTING SUMMARY <-- Processing LAPACK Testing output found in the TESTING direcory SUMMARY nb test run numerical error other error ================ =========== ================= ================ REAL 1070295 99 (0.009%) 0 (0.000%) DOUBLE PRECISION 1072059 241 (0.022%) 0 (0.000%) COMPLEX 556022 0 (0.000%) 0 (0.000%) COMPLEX16 545818 3 (0.001%) 0 (0.000%) --> ALL PRECISIONS 3244194 343 (0.011%) 0 (0.000%)
どうもエラーが出ます。 微妙な数値エラーのようです。 Intel compilerは速度を求めるあまり、最下位数ビットの精度は気にしないという話があります。 そこらへんは気を付けたほうがいいかもしれません。 実際とあるプログラムで、gfortranとifortで比較すると下数桁がずれているということもありました。 実際にどんなエラーが出てるかは、また今度。

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
Fortran2003でLAPACK 目次
これもFFTW同様ページがえらい増えたので、目次をまとめておきます。 まずはすべての元となる抽象クラスの定義。 Fortran2003でLAPACK 続いて拡張クラスの定義。ここまではまだインターフェースのみ。 Extend type 拡張クラスの関数の中身を定義していきます。 一般行列編 対称行列編 対角行列編 最後に抽象クラスで使われる関数の定義。 抽象クラス編 実際に行列の簡単な計算をやって設計を確かめました。 テスト実行 実践としてシュレーディンガー方程式を解きます。 まずは系をクラスにしておきます。 実践編1 それを呼び出し実際の系で計算。 実践編2 快適なFortran2003&行列計算ライフを。
Fortran2003でLAPACK 実践編2
波動方程式ソルバとしてQMsolverを実装しました。ということで具体的な系として、
調和振動子 U(x) = kx2
周期境界化の自由粒子 U(x) = 0、∀f(x),∀x ⇒ f(x) = f(x + L)
をやってみましょう。 原子単位系では、質量1とすると、調和振動子(k = 0.5)のエネルギーは En = (n + 1)/2 (n = 0,1,2, ・・・) となり、波動関数は多項式にガウシアンを掛けた形になります。また周期境界条件下(L = √2π)の自由粒子のエネルギーは En = n2 (n = 0,±1,±2,・・・) となって、波動関数は三角関数です。量子数の正負が反転するとエネルギーは等しいけど位相が違う状態が得られます。 これらの状態は、ハミルトニアンを行列として書いてその行列を対角化してやれば、その波動関数は固有ベクトル、エネルギーは固有値として得られます。 では実際にやってみて確かめてみます。 qmtest.f03
program qmtest use QMsolver_module implicit none type(QMsolver) :: system double precision :: dx,x,mass,en integer :: npoint,i,j,nunit double precision,allocatable :: pot(:) mass = 1.d0 read(*,*)dx read(*,*)npoint allocate(pot(npoint)) call system%new(dx = dx,npoint = npoint, mass = mass) do i = 1,npoint read(*,*) pot(i) enddo call system%setpotential(pot) call system%setHamiltonian call system%solve nunit = 6 do i = 1,npoint x = dx*dble(i) write(nunit,'(2e18.10e2)') x,pot(i) enddo write(nunit,*) write(nunit,*) do i = 1,npoint en = system%getEnergy(i) call system%getWF(i,pot) do j = 1,npoint x = dx*dble(j) write(nunit,'(3e18.10e2)')x,pot(j),en enddo write(nunit,*) write(nunit,*) enddo call system%destructor stop end program qmtest
標準入力から、点と点の間の距離dx、点の数npointを読み込んだ後、npoint分のポテンシャル関数を入力します。U(0)からdxの等間隔でnpointだけ入れてください。U(i*dx) = i回目に入れた数値となります。 配列potを、ポテンシャル入力と波動関数出力に使いまわしています。 このqmtestで定義されたのは孤立系です。つまり周期境界条件はOFF。 ONにしたいときは
call system%togglePeriod call system%setpotential(pot) call system%setHamiltonian call system%solve
という順で呼び出しましょう。1と2は逆でも大丈夫かもしれない。 ビルドには
gfortran -c matrix.f03 gfortran -c QMsolver.f03 gfortran -c qmtest.f03 gfortran -o QMtest matrix.o QMsolver.o qmtest.o -L/path/to/lapack -llapack -lblas
とします。調和振動子の方の実行。例によって入力ファイルをseqとawkを使って作ります。
echo 0.1 > qminput.txt echo 128 >> qminput.txt seq 0 127 | awk '{x = ($1 - 63.5)*0.1; p = 0.5*x*x; printf(" %%f \n",p)}' >> qminput.txt QMtest < qminput.txt > qmoutput.log
周期境界の自由粒子の方は、周期境界条件ONにしてビルドしなおして、
echo 128 | awk '{dx = sqrt(2)*3.14159265358979/$1; printf("%%f \n",dx)}' > qminput.txt echo 128 >> qminput.txt seq 0 127 | awk '{printf("0.0\n")}' >> qminput.txt QMtest < qminput.txt > qmoutput.log
としましょう。 出来上がったものについて、たとえば調和振動子の方ならgnuplotにて、
p "qmoutput.log" i 0 w l lw 6 t "potential" rep "qmoutput.log" i 1 u 1:3 w l lw 3 t "" rep "qmoutput.log" i 1 u 1:($3 + $2) w l lw 3 t "" rep "qmoutput.log" i 2 u 1:3 w l lw 3 t "" rep "qmoutput.log" i 2 u 1:($3 + $2) w l lw 3 t "" rep "qmoutput.log" i 3 u 1:3 w l lw 3 t "" rep "qmoutput.log" i 3 u 1:($3 + $2) w l lw 3 t "" rep "qmoutput.log" i 4 u 1:3 w l lw 3 t "" rep "qmoutput.log" i 4 u 1:($3 + $2) w l lw 3 t ""
としてあげたら、このようなグラフが得られるかと思います。
同様に、周期境界自由粒子のほうも、量子数の偶数奇数を適宜分けてやることで、こんな感じのグラフが描けるかと思います。
どっちがどおちか忘れましたが、偶奇の違いでちゃんと位相がずれています。 ちなみに自由粒子のほう、周期境界条件をOFFのままにしてると箱型ポテンシャルになりますね。 くぅ~疲れましたw これにて完結です!
目次に戻る
【送料無料】なっとくする量子力学 [ 都筑卓司 ] 価格:2,916円(税込、送料込)
Fortran2003でLAPACK 実践編1
とりあえず、行列の基本的な演算を行うmatrixクラスを実装できました。そして簡単な計算をして、計算ができることを確かめました。では実際になにか問題を解いてみましょう。その例として、はじめに言ったとおり1次元の定常状態シュレーディンガー方程式を解きます。 なぜ行列で解けるようになるかというと、ググって一番上に来るページ http://d.hatena.ne.jp/rikunora/20120829/p1 を参考にしてみてください。 ここでは、微分の演算子を少し工夫して、5点での微分にしてみます。(3点微分でもできるようにしようと思ったんですが、前に自分で使うように書いたのが5点微分で、それを流用することにしたというか3点使ったのを新しく考えるのがめんどくさくなって) なお5点で微分すると、帯行列の幅が広くなって、3重帯行列に特化したルーチンが使えなくなるとか何とか。 まずは、系を特徴付ける運動量、エネルギー、ハミルトニアンの情報を持つ構造体と、それに付随するメソッドを考えてQMsolverクラスを作ります。 等間隔に並んだnpoint個の点と、点の幅がdxになっている離散的な関数を考えます。 qmsolver.f03
module QMsolver_module use class_matrix implicit none private type, public :: QMsolver private integer :: npoint logical :: diff5, enkan double precision :: dx,mass double precision,allocatable :: potential(:) type(diagMat),allocatable :: P type(synMat),allocatable :: T,H contains procedure,public :: new => new_QMsolver procedure,public :: setpotential => qmsolver_setpotential procedure,public :: setHamiltonian => qmsolver_setHamiltonian procedure,public :: togglePeriod => qmsolver_togglePeriod procedure,public :: solve => qmsolver_solve procedure,public :: getEnergy => qmsolver_getEnergy procedure,public :: getWF => qmsolver_getWF procedure,public :: destructor end type QMsolver contains subroutine new_QMsolver(self,dx,npoint,mass) class(QMsolver), intent(inout) :: self integer,intent(in),optional :: npoint double precision,intent(in),optional :: dx,mass if(.not.present(npoint))then write(*,*) "npoint does not exist on new_qmsolver" return endif if(.not.present(mass))then write(*,*) "mass does not exist on new_qmsolver" return endif if(.not.present(dx))then write(*,*) "Lack of argument on constructor QMsolver" return endif self%npoint = npoint self%dx = dx self%mass = mass self%diff5 = .true. self%enkan = .false. allocate(diagMat :: self%P) allocate(synMat :: self%T) allocate(synMat :: self%H) end subroutine subroutine qmsolver_setpotential(self,pot) class(QMsolver),intent(inout) :: self double precision,intent(in) :: pot(self%npoint) self%P = diagMat(self%npoint,pot(:)) end subroutine qmsolver_setpotential subroutine qmsolver_togglePeriod(self) class(QMsolver),intent(inout) :: self self%enkan = .not. self%enkan end subroutine qmsolver_togglePeriod subroutine qmsolver_setHamiltonian(self) class(QMsolver),intent(inout) :: self double precision,allocatable :: dfdx(:) double precision :: hw_m ! hbar/2m integer :: n,i,j,k hw_m = 1.d0/(2.d0*self%mass*(self%dx ** 2)) n = self%npoint allocate(dfdx(n*(n + 1)/2)) if(.not. self%diff5) return do i = 1,n do j = 1,i k = i*(i - 1)/2 + j if(i == j)then dfdx(k) = 2.5d0 * hw_m else if((i - j) == 1)then dfdx(k) = - 4.d0/3.d0 * hw_m else if((i - j) == 2)then dfdx(k) = hw_m/12.d0 else dfdx(k) = 0.d0 end if enddo enddo if(self%enkan) then k = n*(n - 1)/2 + 1 dfdx(k) = - 4.d0/3.d0 * hw_m k = n*(n - 1)/2 + 2 dfdx(k) = hw_m/12.d0 k = (n - 1)*(n - 2)/2 + 1 dfdx(k) = hw_m/12.d0 endif self%T = synMat(n,dfdx) self%H = self%T + self%P end subroutine qmsolver_setHamiltonian subroutine qmsolver_solve(self) class(QMsolver),intent(inout) :: self call self%H%calcEV end subroutine qmsolver_solve function qmsolver_getEnergy(self,n) result(en) class(QMsolver),intent(inout) :: self integer,intent(in) :: n double precision :: en en = self%H%getEVal(n) end function qmsolver_getEnergy subroutine qmsolver_getWF(self,n,v) class(QMsolver),intent(inout) :: self integer,intent(in) :: n double precision,intent(out) :: v(self%npoint) call self%H%getEVec(n,v) end subroutine qmsolver_getWF subroutine destructor(self) class(QMsolver), intent(inout) :: self if(allocated(self%potential))deallocate(self%potential) call self%P%destruct() call self%T%destruct() call self%H%destruct() end subroutine end module QMsolver_module
ハミルトニアンH = T + P、運動項(二回微分)TそしてポテンシャルPはn行n列の行列。 enkanは周期境界条件を入れるかどうかのフラグ。もし周期境界にすると、x0、x1とxn、xn - 1が相互作用するというか、隣同士に来るので、微分用の行列にもそれを反映させます。具体的には左下と右上、つまりT1nとかTn1などの要素を足す。 これのコンパイルには、matrix.f03のコンパイルでできたclass_matrix.modをインクルードしましょう。同じディレクトリだったら大丈夫。 また、これはintel fortranではcompileできません。
self%H = self%T + self%P
の行で、 An arithmetic or LOGICAL type is required in this context. [T] This binary operation is invalid for this data type. [T] と言われます。ちょっと調べましたが、解決法が分かりませんでした。どなたかご教授いただけたら幸いです。twitter ID:sage_k (露骨な誘導) gfortranなら大丈夫ということで。 次に、具体的な系について使ってみましょう。
目次に戻る 次の記事へ
【送料無料】なっとくする量子力学 [ 都筑卓司 ] 価格:2,916円(税込、送料込)