Skip to content

Instantly share code, notes, and snippets.

@ultimatile
Created December 27, 2016 19:32
Show Gist options
  • Save ultimatile/4cf3f0956f40ddaaae68c07f4d42211f to your computer and use it in GitHub Desktop.
Save ultimatile/4cf3f0956f40ddaaae68c07f4d42211f to your computer and use it in GitHub Desktop.
for文を殺したい
#密度(spin)相関函数を計算してFourier変換するプログラム
'''
sitesize,elecsize,basissizeはint型のparameterで
basisseqは演算子の行列表示を作るのに使う基底の列で
たとえば4siteで
1234←siteindex
↑ ↓ ←電子の状態
を配列として(配列の行indexがsite index)
np.array(
[[1,0,0,0],←upspinがあるところが1
[0,0,1,0]]←downspinがあるところが1
)として表現してこれを取りうる基底をまとめたもの(大きさはbasisize*2*sitesize).
gsvecは基底状態の実数値成分を持つ固有ベクトルでbaissizeの次元.
'''
import numpy as np
from scipy.fftpack import fft,ifft
def CalCorFFT(sitesize,elecsize,basisseq,basissize,gsvec):
numupseq=np.array([np.diag(basisseq.reshape(basissize,2*sitesize)[:,n]) for n in range(sitesize)])
numdownseq=np.array([np.diag(basisseq.reshape(basissize,2*sitesize)[:,n+sitesize]) for n in range(sitesize)])
sumspin=numupseq+numdownseq
densitycor=sumspin-(elecsize/sitesize)*np.tile(np.identity(basissize),(sitesize,1,1))
spincor=(numupseq-numdownseq)/2
nmq=np.array([fft(densitycor,sitesize,axis=0)[q]@gsvec for q in range(sitesize)])
smq=np.array([fft(spincor,sitesize,axis=0)[q]@gsvec for q in range(sitesize)])
nq=np.array([ifft(densitycor,sitesize,axis=0)[q]@gsvec for q in range(sitesize)])
sq=np.array([ifft(spincor,sitesize,axis=0)[q]@gsvec for q in range(sitesize)])
ftd=np.array([nmq[i]@nq[i] for i in range(sitesize)])
fts=np.array([smq[i]@sq[i] for i in range(sitesize)])
return ftd,fts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment