def compute_PIR(self, GR, Gsum, nF): tau3GA = np.einsum('ab,...bc->...ac', Migdal.tau3, np.conj(GR)) tau3A = np.einsum('ab,...bc->...ac', Migdal.tau3, -1.0/np.pi * GR.imag) return self.g0**2*self.dw/self.nk**2 * np.einsum('...aa->...', \ basic_conv(tau3A, Gsum, ['k+q,k','k+q,k','z,w-z'], [0,1,2], [True,True,False], op='...ab,...bc->...ac')[:,:,:self.nr] \ -basic_conv(tau3A, tau3GA*nF[None,None,:,None,None], ['k+q,k','k+q,k','w+z,z'], [0,1,2], [True,True,False], op='...ab,...bc->...ac')[:,:,:self.nr] \ +basic_conv(tau3A*nF[None,None,:,None,None], tau3GA, ['k+q,k','k+q,k','w+z,z'], [0,1,2], [True,True,False], op='...ab,...bc->...ac')[:,:,:self.nr])
def compute_SR(self, GR, Gsum, DR, nB, nF): B = -1.0/np.pi * DR.imag #tau3GRtau3 = np.einsum('ab,...bc,cd->...ad',Migdal.tau3,GR,Migdal.tau3) return -self.g0**2*self.dw/self.nk*( \ basic_conv(B, Gsum, ['q,k-q','z,w-z'], [0,1], [True,False])[:,:self.nr] \ -basic_conv(B*(1+nB[None,:,None,None]), GR, ['q,k-q','z,w-z'], [0,1], [True,False])[:,:self.nr] \ +basic_conv(B, GR*nF[None,:,None,None], ['q,k-q','z,w-z'], [0,1], [True,False])[:,:self.nr])
def compute_PIR(self, GR, tau3Gsumtau3, nF): tau3GAtau3 = np.einsum('ab,...bc,cd->...ad', Migdal.tau3, np.conj(GR), Migdal.tau3) A = -1.0 / np.pi * GR.imag return self.g0**2*self.dw/self.nk * np.einsum('...aa->...', \ basic_conv(A, tau3Gsumtau3, ['k+q,k','z,w-z'], [0,1], [True,False], op='...ab,...bc->...ac')[:,:self.nr] \ -basic_conv(A, tau3GAtau3*nF[None,:,None,None], ['k+q,k','w+z,z'], [0,1], [True,False], op='...ab,...bc->...ac')[:,:self.nr] \ +basic_conv(A*nF[None,:,None,None], tau3GAtau3, ['k+q,k','w+z,z'], [0,1], [True,False], op='...ab,...bc->...ac')[:,:self.nr])
def compute_PIR(self, GR, Gsum, nF): #tau3GA = np.einsum('ab,...bc->...ac', Migdal.tau3, conj(GR)) #tau3A = np.einsum('ab,...bc->...ac', Migdal.tau3, -1.0/np.pi * GR.imag) GA = np.conj(GR) A = -1.0/np.pi * GR.imag return 2*self.g0**2*self.dw/self.nk * ( basic_conv(A, Gsum, ['k+q,k','z,w-z'], [0,1], [True,False], op='...ab,...bc->...ac')[:,:self.nr] \ -basic_conv(A, GA*nF[None,:,None,None], ['k+q,k','w+z,z'], [0,1], [True,False], op='...ab,...bc->...ac')[:,:self.nr] \ +basic_conv(A*nF[None,:,None,None], GA, ['k+q,k','w+z,z'], [0,1], [True,False], op='...ab,...bc->...ac')[:,:self.nr])
def compute_jjcorr(self, savedir, G, GR): wn, vn, ek, w, nB, nF, DRbareinv = self.setup_realaxis() # convert to imaginary frequency G = fourier.t2w(G, self.beta, self.dim, 'fermion')[0] # compute Gsum Gsum = np.zeros([self.nk, self.nk, self.nr], dtype=complex) for i in range(self.nr): Gsum[:, :, i] = np.sum(G / ( (w[i] + 1j * wn)[None, None, :]), axis=2) / self.beta # handle sum over pos and negative freqs Gsum += np.conj(Gsum) print('finished Gsum') del G ks = np.arange(-np.pi, np.pi, 2 * np.pi / self.nk) sin = np.sin(ks) cos = np.cos(ks) fk = (-2 * self.t * sin[:, None] - 4 * self.tp * sin[:, None] * cos[None, :]) GA = np.conj(GR) A = -1.0 / np.pi * GR.imag A *= (fk**2)[:, :, None] jj0w = 2.0 * self.dw / self.nk**2 * np.sum( basic_conv(A, Gsum, ['z,w-z'], [2], [False], izero=self.izero)[:,:,:self.nr] \ -basic_conv(A, GA*nF[None,None,:], ['w+z,z'], [2], [False], izero=self.izero)[:,:,:self.nr] \ +basic_conv(A*nF[None,None,:], GA, ['w+z,z'], [2], [False], izero=self.izero)[:,:,:self.nr], axis=(0,1)) path = os.path.join(savedir, 'jj0w') np.save(path, jj0w) del GA del A del Gsum print('done jj0w') DR0 = 1 / DRbareinv jjw = jj0w / (1 + self.g0**2 * DR0 * jj0w) path = os.path.join(savedir, 'jjw') np.save(path, jjw)
def compute_PIR(self, GR, Gsum, nF): GA = np.conj(GR) A = -1.0 / np.pi * GR.imag return 2.0*self.g0**2*self.dw*(basic_conv(A, Gsum, ['z,w-z'], [0], [False])[:self.nr] \ -basic_conv(A, GA*nF, ['w+z,z'], [0], [False])[:self.nr] \ +basic_conv(A*nF, GA, ['w+z,z'], [0], [False])[:self.nr])
def compute_SR(self, GR, Gsum, DR, nB, nF): B = -1.0 / np.pi * DR.imag return -self.g0**2*self.dw*(basic_conv(B, Gsum, ['z,w-z'], [0], [False])[:self.nr] \ -basic_conv(B*(1+nB), GR, ['z,w-z'], [0], [False])[:self.nr] \ +basic_conv(B, GR*nF, ['z,w-z'], [0], [False])[:self.nr])
def conv(a, b, fc): return basic_conv(a, b, ['k+q,k', 'k+q,k', fc], [0, 1, 2], [True, True, False], izeros=izeros, op='...ab,...bc->...ac')[:, :, :self.nr]
def conv(a, b): return basic_conv(a, b, ['q,k-q', 'q,k-q', 'z,w-z'], [0, 1, 2], [True, True, False], izeros=izeros)[:, :, :self.nr]
def compute_PIR(self, GR, Gsum, nF): GA = np.conj(GR) A = -1.0/np.pi * GR.imag return 2.0*self.g0**2*self.gq2[:,None]*self.dw/self.nk*(basic_conv(A, Gsum, ['k+q,k','z,w-z'], [0,1], [True,False])[:,:self.nr] \ -basic_conv(A, GA*nF[None,:], ['k+q,k','w+z,z'], [0,1], [True,False])[:,:self.nr] \ +basic_conv(A*nF[None,:], GA, ['k+q,k','w+z,z'], [0,1], [True,False])[:,:self.nr])
def compute_SR(self, GR, Gsum, DR, nB, nF): B = -1.0/np.pi * DR.imag return -self.g0**2*self.dw/self.nk*(basic_conv(self.gq2[:,None]*B, Gsum, ['q,k-q','z,w-z'], [0,1], [True,False])[:,:self.nr] \ -basic_conv(self.gq2[:,None]*B*(1+nB)[None,:], GR, ['q,k-q','z,w-z'], [0,1], [True,False])[:,:self.nr] \ +basic_conv(self.gq2[:,None]*B, GR*nF[None,:], ['q,k-q','z,w-z'], [0,1], [True,False])[:,:self.nr])
def convfunc2(a, b): return basic_conv(a, b, ['k+q,k', 'k+q,k', 'w+z,z'], [0, 1, 2], [True, True, False], izeros=izeros)[:, :, :self.nr]
def convfunc(a, b, fc): return basic_conv(a, b, ['k+q,k', 'k+q,k', fc], [0, 1, 2], [True, True, False], izeros=izeros)[:, :, :self.nr]
@author: benno """ import numpy as np import src from convolution import basic_conv n = 21 A = np.random.randn(n) B = np.random.randn(n) print('testing circular convolutions') print('') # convolve C0 = basic_conv(A, B, ['x,y-x'], [0], [True], izeros=[n // 2])[:n] # explicit convolve (assuming index 0 is at n//2) C1 = np.zeros(n) for iy in range(n): for ix in range(n): # when iy = n//2 # and ix = n//2 # C[iy] = A[ix] B[iy - ix + n//2] C1[iy] += A[ix] * B[(iy - ix + n // 2) % n] print(np.mean((C0 - C1)).real) # convolve