Ejemplo n.º 1
0
 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])
Ejemplo n.º 2
0
 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])
Ejemplo n.º 3
0
 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])
Ejemplo n.º 4
0
 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])
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
 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])
Ejemplo n.º 7
0
 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])
Ejemplo n.º 8
0
 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]
Ejemplo n.º 9
0
 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]
Ejemplo n.º 10
0
 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])
Ejemplo n.º 11
0
 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])
Ejemplo n.º 12
0
 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]
Ejemplo n.º 13
0
 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]
Ejemplo n.º 14
0
@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