
# !/ usr / bin / env pyt hon 3
"" "
Rev ise d Fe rmi on D is persi on C ode (FCC L att ice )
- Uses sqrt ( eig (D^ T D )) for phys ica l ener gie s ( si ngu lar val ues )
- P rope r FCC re cip ro cal la tti ce and BZ path
- De nse BZ scan for zero - c ros sin g proof
- A bel ian gauge field te st
- E xplic it C hira l Sy mmetr y Check {gamma_5 , D } = 0
Author : Ragh u Ku lka rni ( SSM Th eor y Group , IDrive Inc .)
"" "
import nu mpy as np
import m at pl otl ib
matpl ot lib . use ( ’ Agg ’)
import m at pl otl ib . pyp lot as plt
# = == = == === == = == = == === == = == === == = == = == === == = == === == = == = == === ==
# GAMMA MATRI CES ( D irac re pr es en ta tion )
# = == = == === == = == = == === == = == === == = == = == === == = == === == = == = == === ==
sig ma_ x = np . arr ay ([[0 , 1] , [1 , 0]] , dty pe = c omp lex )
sig ma_ y = np . arr ay ([[0 , -1 j] , [1 j , 0]] , dtype = c omp lex )
sig ma_ z = np . arr ay ([[1 , 0] , [0 , -1]] , dtype = co mpl ex )
I2 = np . eye (2 , dtype = complex )
Z2 = np . zer os ((2 , 2) , dtype = co mpl ex )
gam ma_ 1 = np . blo ck ([[ Z2 , si gma _x ], [- sigma_x , Z2 ]])
gam ma_ 2 = np . blo ck ([[ Z2 , si gma _y ], [- sigma_y , Z2 ]])
gam ma_ 3 = np . blo ck ([[ Z2 , si gma _z ], [- sigma_z , Z2 ]])
gam ma_ 5 = np . blo ck ([[ I2 , Z2 ] , [ Z2 , -I2 ]])
# = == = == === == = == = == === == = == === == = == = == === == = == === == = == = == === ==
# FCC L ATT ICE VEC TOR S
# = == = == === == = == = == === == = == === == = == = == === == = == === == = == = == === ==
a = 1.0 # lattic e cons tan t
n_vecs = []
for i in [ -1 , 1]:
for j in [ -1 , 1]:
n_vecs . a ppe nd ( np . array ([i , j , 0]) * a / np . sq rt (2) )
n_vecs . a ppe nd ( np . array ([i , 0, j ]) * a / np . sqrt (2) )
n_vecs . a ppe nd ( np . array ([0 , i , j ]) * a / np . sqrt (2) )
n_vecs = np . array ( n _vec s )
# Re ci pro ca l lattice vectors
b1 = (2 * np . pi / a) * np . arra y ([ -1 , 1, 1])
b2 = (2 * np . pi / a) * np . arra y ([1 , -1 , 1])
b3 = (2 * np . pi / a) * np . arra y ([1 , 1 , -1])
# High - symm etr y po ints
Gamma = np . array ([0 , 0 , 0])
X = (2 * np . pi / a) * np . arra y ([1 , 0 , 0])
W = (2 * np . pi / a) * np . arra y ([1 , 0.5 , 0])
L = ( np . pi / a) * np . array ([1 , 1 , 1])
K = (2 * np . pi / a) * np . arra y ([0.75 , 0.75 , 0])
# = == = == === == = == = == === == = == === == = == = == === == = == === == = == = == === ==
# DIRAC OPERA TOR
# = == = == === == = == = == === == = == === == = == = == === == = == === == = == = == === ==
def D_SSM (k , link_ ph as es = N one ) :
D = np . zer os ((4 , 4) , dtype = co mpl ex )
for j , n in enum erate ( n_v ecs ) :
n_hat = n / np . li nalg . norm (n )
Gam ma_ j = n_hat [0]* gamma _1 + n_hat [1]* gam ma_ 2 + n_ha t [2]* ga mma _3
phase = np . exp (1 j * np . dot (k , n ))
if l ink _p ha se s is not None :
phase *= np . exp (1 j * li nk _p hases [ j ])
D += Gam ma_ j * pha se
return D
def si ng ul ar _v al ue s (k , l in k_pha se s = None ) :
D = D_SS M (k , li nk _p hases )
DdD = D . conj () . T @ D
eig val s = np . li nalg . ei gva lsh ( DdD )
8