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:45]
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のすべてのクラスがインクルードされるが、プログラムが重くなったりコンパイルに時間がかかったりするので、慣れてくれば必要なヘッダファイルだけインクルードすればよい。
  
-<sxh C++; first-line: 11> +===== テンソルの添字の定義 ===== 
-    //Make a dimension 2 Index+ 
 +テンソルの添字$s$を定義する。 
 +<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> 
 +    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> 
 + 
 +スピン演算子$S^z_{s,s'}$および$S^x_{s, s'}$を作成する。 
 +2階のテンソルを作りたい場合は次のよにする。 
 +<sxh C++; first-line: 30> 
 +    auto Sz = 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 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サイト.1497343508.txt.gz · Last modified: 2021/06/27 21:57 (external edit)