数値計算ライブラリ:itensor:1サイト
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
数値計算ライブラリ:itensor:1サイト [2017/06/13 18:01] – [プログラムの解説] koudai | 数値計算ライブラリ:itensor:1サイト [2021/06/27 22:04] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 2: | Line 2: | ||
もっとも簡単な例として、シングルサイトにおけるスピン演算子と波動関数を定義する。 | もっとも簡単な例として、シングルサイトにおけるスピン演算子と波動関数を定義する。 | ||
- | |||
- | |||
====== 理論 ====== | ====== 理論 ====== | ||
Line 37: | Line 35: | ||
S^x = | S^x = | ||
\begin{pmatrix} | \begin{pmatrix} | ||
- | 0 & 1 \\ | + | 0 & 1/2 \\ |
- | 1 & 0 | + | 1/2 & 0 |
\end{pmatrix} | \end{pmatrix} | ||
, \qquad | , \qquad | ||
S^z = | S^z = | ||
\begin{pmatrix} | \begin{pmatrix} | ||
- | 1 & 0 \\ | + | 1/2 & 0 \\ |
- | 0 & -1 | + | 0 & -1/2 |
\end{pmatrix} | \end{pmatrix} | ||
\end{equation} | \end{equation} | ||
Line 50: | Line 48: | ||
たとえばある状態にスピン演算子の$x$成分$S^x$を作用させれば | たとえばある状態にスピン演算子の$x$成分$S^x$を作用させれば | ||
\begin{equation} | \begin{equation} | ||
- | S^x | \psi \rangle = \psi_1 | 2 \rangle + \psi_2 | 1 \rangle | + | S^x | \psi \rangle = \frac{1}{2}\psi_1 | 2 \rangle + \frac{1}{2} |
\end{equation} | \end{equation} | ||
となる。 | となる。 | ||
+ | 状態$| \psi \rangle$におけるスピン演算子の期待値は | ||
+ | \begin{equation} | ||
+ | | ||
+ | \end{equation} | ||
+ | となる。 | ||
====== ソースコード ====== | ====== ソースコード ====== | ||
Line 138: | Line 141: | ||
} | } | ||
</ | </ | ||
- | |||
- | Makefileの APP=one を APP=01_tutorial_code に書き換える。 | ||
- | |||
- | <sxh; first-line: 1; highlight: [6]; title: Makefile> | ||
- | LIBRARY_DIR=../ | ||
- | |||
- | ifdef app | ||
- | APP=$(app) | ||
- | else | ||
- | APP=01_tutorial_code | ||
- | endif | ||
- | |||
- | CCFILES=$(APP).cc | ||
- | |||
- | ################################################################# | ||
- | ################################################################# | ||
- | ################################################################# | ||
- | ################################################################# | ||
- | |||
- | |||
- | include $(LIBRARY_DIR)/ | ||
- | include $(LIBRARY_DIR)/ | ||
- | |||
- | TENSOR_HEADERS=$(LIBRARY_DIR)/ | ||
- | |||
- | #Mappings -------------- | ||
- | OBJECTS=$(patsubst %.cc,%.o, $(CCFILES)) | ||
- | GOBJECTS=$(patsubst %, | ||
- | |||
- | #Rules ------------------ | ||
- | |||
- | %.o: %.cc $(HEADERS) $(TENSOR_HEADERS) | ||
- | $(CCCOM) -c $(CCFLAGS) -o $@ $< | ||
- | |||
- | .debug_objs/ | ||
- | $(CCCOM) -c $(CCGFLAGS) -o $@ $< | ||
- | |||
- | #Targets ----------------- | ||
- | |||
- | build: $(APP) | ||
- | debug: $(APP)-g | ||
- | |||
- | $(APP): $(OBJECTS) $(ITENSOR_LIBS) | ||
- | $(CCCOM) $(CCFLAGS) $(OBJECTS) -o $(APP) $(LIBFLAGS) | ||
- | |||
- | $(APP)-g: mkdebugdir $(GOBJECTS) $(ITENSOR_GLIBS) | ||
- | $(CCCOM) $(CCGFLAGS) $(GOBJECTS) -o $(APP)-g $(LIBGFLAGS) | ||
- | |||
- | clean: | ||
- | rm -fr .debug_objs *.o $(APP) $(APP)-g | ||
- | |||
- | mkdebugdir: | ||
- | mkdir -p .debug_objs | ||
- | </ | ||
- | |||
- | プログラムのコンパイルと実行は、プログラムのあるディレクトリに入って次のようにする。 | ||
- | |||
- | > \$ make | ||
- | > \$ ./ | ||
- | |||
====== プログラムの解説 ====== | ====== プログラムの解説 ====== | ||
Line 204: | Line 147: | ||
求めたい演算子や状態に対応するテンソルを定義していくことで計算を進める。 | 求めたい演算子や状態に対応するテンソルを定義していくことで計算を進める。 | ||
テンソルの定義やテンソル同士の演算に便利なクラスが、ITensorではライブラリとして提供されている。 | テンソルの定義やテンソル同士の演算に便利なクラスが、ITensorではライブラリとして提供されている。 | ||
+ | |||
+ | ===== ライブラリのインクルード ===== | ||
<sxh C++; first-line: 1> | <sxh C++; first-line: 1> | ||
Line 212: | Line 157: | ||
all.hはITensorのすべてのクラスがインクルードされるが、プログラムが重くなったりコンパイルに時間がかかったりするので、慣れてくれば必要なヘッダファイルだけインクルードすればよい。 | all.hはITensorのすべてのクラスがインクルードされるが、プログラムが重くなったりコンパイルに時間がかかったりするので、慣れてくれば必要なヘッダファイルだけインクルードすればよい。 | ||
+ | ===== テンソルの添字の定義 ===== | ||
+ | |||
+ | テンソルの添字$s$を定義する。 | ||
<sxh C++; first-line: 12> | <sxh C++; first-line: 12> | ||
auto s = Index(" | auto s = Index(" | ||
</ | </ | ||
- | + | クラスIndexにより、添字オブジェクトsを定義する。 | |
- | テンソルの添え字$s$を定義する。 | + | |
- | クラスautoにより、添字オブジェクトsを定義する。 | + | |
書き方は Index(" | 書き方は Index(" | ||
今はアップとダウンからなるので、添え字の次元は2である。 | 今はアップとダウンからなるので、添え字の次元は2である。 | ||
- | さて、添え字の定義ができたので、状態と演算子を構成する。 | + | ===== テンソルの定義 ====== |
+ | |||
+ | 添え字の定義ができたので、状態と演算子を構成する。 | ||
状態$\psi_s$を次のように作成する。 | 状態$\psi_s$を次のように作成する。 | ||
<sxh C++; first-line: 15> | <sxh C++; first-line: 15> | ||
auto psi = ITensor(s); //default initialized to zero | auto psi = ITensor(s); //default initialized to zero | ||
</ | </ | ||
- | ITensor(s)によりオブジェクトsで定義された添字をもつテンソルを作成する。 | + | ITensor(s)によりオブジェクトsで定義された添字をもつテンソルのオブジェクトを作成する。 |
テンソルの成分はすべてゼロに初期化されている。 | テンソルの成分はすべてゼロに初期化されている。 | ||
値を設定するには、例えば$\psi_1 = 1$としたい場合 | 値を設定するには、例えば$\psi_1 = 1$としたい場合 | ||
Line 234: | Line 182: | ||
とすればよい。 | とすればよい。 | ||
このようにメソッド .set によってテンソルの成分を変更できる。 | このようにメソッド .set によってテンソルの成分を変更できる。 | ||
+ | できあがったテンソルの中身を表示したい場合は PrintDataを使えばよい。 | ||
+ | <sxh C++; first-line: 24> | ||
+ | PrintData(psi); | ||
+ | </ | ||
- | 次にスピン演算子$S^x_{s, s'}$, $S^z_{s, | + | 次にスピン演算子$S^z_{s, |
2階のテンソルを作りたい場合は次のようにする。 | 2階のテンソルを作りたい場合は次のようにする。 | ||
- | + | <sxh C++; first-line: | |
- | <sxh C++; first-line: | + | |
auto Sz = ITensor(s, | auto Sz = ITensor(s, | ||
auto Sx = ITensor(s, | auto Sx = ITensor(s, | ||
+ | </ | ||
+ | prime(s) によって次元が添字$s$と同じである添字$s' | ||
+ | このままだと演算子のすべての成分がゼロのままなので、値を設定する。 | ||
+ | <sxh C++; first-line: 33> | ||
+ | Sz.set(s(1), | ||
+ | Sz.set(s(2), | ||
+ | |||
+ | Sx.set(s(1), | ||
+ | Sx.set(s(2), | ||
</ | </ | ||
- | メソッド .prime(s) は、次元が添字$s$と同じ添字$s' | + | ===== テンソル同士の積 ===== |
+ | テンソル同士の積は * によって計算できる。 | ||
+ | <sxh C++; first-line: 46> | ||
+ | ITensor phi = Sx * psi; | ||
+ | </ | ||
+ | ここで注意したいのが、ここで計算するのは | ||
+ | \begin{equation} | ||
+ | | ||
+ | \end{equation} | ||
+ | だということである。 | ||
+ | 積を定義したとき、同じ添字に関して和をとることになる。$\phi_{s' | ||
+ | <sxh C++; first-line: 48> | ||
+ | phi.noprime(); | ||
+ | </ | ||
+ | とすればよい。 | ||
+ | |||
+ | ===== 期待値 ===== | ||
+ | |||
+ | 最後に、演算子の期待値の求め方を紹介する。 | ||
+ | 状態$\psi_s$とエルミート共役$\psi^*_{s' | ||
+ | <sxh C++; first-line: 68> | ||
+ | auto cpsi = dag(prime(psi)); | ||
+ | </ | ||
+ | スピン演算子の期待値は積 cpsi * Sz * psi あるいは cpsi * Sx * psi により得られるが、このままだとオブジェクトのままなので、実数として扱うためにメソッド.realを使う。 | ||
+ | <sxh C++; first-line: 68> | ||
+ | Real zz = (cpsi * Sz * psi).real(); | ||
+ | Real xx = (cpsi * Sx * psi).real(); | ||
+ | </ | ||
+ | ここで計算したのは | ||
+ | \begin{equation} | ||
+ | | ||
+ | \end{equation} | ||
+ | である(添字の順番に注意)。 |
数値計算ライブラリ/itensor/1サイト.1497344507.txt.gz · Last modified: 2021/06/27 21:57 (external edit)