User Tools

Site Tools


数値計算ライブラリ:itensor:1サイト

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
数値計算ライブラリ:itensor:1サイト [2017/06/13 17:50]
koudai
数値計算ライブラリ:itensor:1サイト [2021/06/27 22:04] (current)
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} \psi_2 | 1 \rangle
 \end{equation} \end{equation}
 となる。 となる。
  
 +状態$| \psi \rangle$におけるスピン演算子の期待値は
 +\begin{equation}
 + \langle \psi | S^x | \psi \rangle = \sum_{s, s'} \psi^*_s S^x_{s, s'} \psi_{s'}
 +\end{equation}
 +となる。
  
 ====== ソースコード ====== ====== ソースコード ======
Line 138: Line 141:
     }     }
 </sxh> </sxh>
- 
-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)/this_dir.mk 
-include $(LIBRARY_DIR)/options.mk 
- 
-TENSOR_HEADERS=$(LIBRARY_DIR)/itensor/all.h 
- 
-#Mappings -------------- 
-OBJECTS=$(patsubst %.cc,%.o, $(CCFILES)) 
-GOBJECTS=$(patsubst %,.debug_objs/%, $(OBJECTS)) 
- 
-#Rules ------------------ 
- 
-%.o: %.cc $(HEADERS) $(TENSOR_HEADERS) 
- $(CCCOM) -c $(CCFLAGS) -o $@ $< 
- 
-.debug_objs/%.o: %.cc $(HEADERS) $(TENSOR_HEADERS) 
- $(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 
-</sxh> 
- 
-プログラムのコンパイルと実行は、プログラムのあるディレクトリに入って次のようにする。 
- 
-> \$ make 
-> \$ ./01_tutorial_code 
- 
  
 ====== プログラムの解説 ====== ====== プログラムの解説 ======
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("s",2);     auto s = Index("s",2);
 </sxh> </sxh>
 +クラスIndexにより、添字オブジェクトsを定義する。
 +書き方は Index("[添字に使う記号]", [添字の次元]) である。
 +今はアップとダウンからなるので、添え字の次元は2である。
  
-テンソルの添え字$s$を定義する。 +===== テンソルの定義 ======
-クラスautoにより、添え字オブジェクトsを定義する。 +
-書き方は Index("[添え字に使う記号]", [添え字が取り得る成分の数]) である。 +
-今はアップとダウンからなるので、添え字の成分の数は2である。+
  
 +添え字の定義ができたので、状態と演算子を構成する。
 +状態$\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
 +</sxh>
 +ITensor(s)によりオブジェクトsで定義された添字をもつテンソルのオブジェクトを作成する。
 +テンソルの成分はすべてゼロに初期化されている。
 +値を設定するには、例えば$\psi_1 = 1$としたい場合
 +<sxh C++; first-line: 22>
 +    psi.set(s(1),1);
 +</sxh>
 +とすればよい。
 +このようにメソッド .set によってテンソルの成分を変更できる。
 +できあがったテンソルの中身を表示したい場合は PrintDataを使えばよい。
 +<sxh C++; first-line: 24>
 +  PrintData(psi);
 </sxh> </sxh>
  
-ITensor(s)によりオブジェクトsで定義された添え字をもつテンソルを作成する。+スピン演算子$S^z_{s,s'}$おび$S^x_{s, s'}$を作成する。
 2階のテンソルを作りたい場合は次のようにする。 2階のテンソルを作りたい場合は次のようにする。
- +<sxh C++; first-line: 30>
-<sxh C++; first-line: 15>+
     auto Sz = ITensor(s,prime(s));     auto Sz = ITensor(s,prime(s));
     auto Sx = ITensor(s,prime(s));     auto Sx = ITensor(s,prime(s));
 +</sxh>
 +prime(s) によって次元が添字$s$と同じである添字$s'$を生成する。
 +このままだと演算子のすべての成分がゼロのままなので、値を設定する。
 +<sxh C++; first-line: 33>
 +    Sz.set(s(1),prime(s)(1),+0.5);
 +    Sz.set(s(2),prime(s)(2),-0.5);
 + 
 +    Sx.set(s(1),prime(s)(2),+0.5);
 +    Sx.set(s(2),prime(s)(1),+0.5);
 </sxh> </sxh>
  
-ッド .prime(s) は、成分の数が添え字$s$とじ添え字$s'$を生成する。+===== テン士の積 =====
  
 +テンソル同士の積は * によって計算できる。
 +<sxh C++; first-line: 46>
 +    ITensor phi = Sx * psi;
 +</sxh>
 +ここで注意したいのが、ここで計算するのは
 +\begin{equation}
 + \phi_{s'} = \sum_{s} S^x_{s,s'} \psi_s
 +\end{equation}
 +だということである。
 +積を定義したとき、同じ添字に関して和をとることになる。$\phi_{s'}$を$\phi_s$とするためには
 +<sxh C++; first-line: 48>
 +    phi.noprime();
 +</sxh>
 +とすればよい。
 +
 +===== 期待値 =====
 +
 +最後に、演算子の期待値の求め方を紹介する。
 +状態$\psi_s$とエルミート共役$\psi^*_{s'}$は次のように作る。
 +<sxh C++; first-line: 68>
 +    auto cpsi = dag(prime(psi));
 +</sxh>
 +スピン演算子の期待値は積 cpsi * Sz * psi あるいは cpsi * Sx * psi により得られるが、このままだとオブジェクトのままなので、実数として扱うためにメソッド.realを使う。 
 +<sxh C++; first-line: 68>
 +    Real zz = (cpsi * Sz * psi).real();
 +    Real xx = (cpsi * Sx * psi).real();
 +</sxh>
 +ここで計算したのは
 +\begin{equation}
 + \sum_{s,s'} \psi^*_{s'} S^x_{s, s'} \psi_{s} 
 +\end{equation}
 +である(添字の順番に注意)。
数値計算ライブラリ/itensor/1サイト.1497343849.txt.gz · Last modified: 2021/06/27 21:57 (external edit)