예제 #1
0
파일: gf_init.py 프로젝트: tayral/triqs_0.x
    def __call__(self,G) :
        D= self.half_bandwidth
        Id = numpy.identity(G.N1,numpy.complex_)
        if G.mesh.TypeGF == GF_Type.Imaginary_Frequency:
            f = lambda om : (om  - 1j*sign(om.imag)*sqrt(abs(om)**2 +  D*D))/D/D*2*Id
        elif G.mesh.TypeGF == GF_Type.Real_Frequency: 
            dos = _SemiCircularDOS (D)
            f = lambda om : -1j*pi*dos(om)*Id
        else :
            raise TypeError, "This initializer is only correct in frequency"

        t =G._tail
        t.zero()
        for i in range(G.N1):
            t[1].array[i,i] = 1.0
            t[3].array[i,i] = D**2/4.0
            t[5].array[i,i] = D**4/8.0

        #t[1].array[:,:] = 1.0
        #t[3].array[:,:] = D**2/4.0
        #t[5].array[:,:] = D**4/8.0

        t.changeOrderMax(5) # expansion is not valid above this
        
        #Mom[2,0,0] = 1.0
        #Mom[4,0,0] = D**2/4.0
        #Mom[6,0,0] = D**4/8.0

        Function(f,None)(G)
        return G
예제 #2
0
    def __call__(self,G):
        D= self.half_bandwidth
        Id = numpy.identity(G.N1,numpy.complex_)
        if type(G.mesh) == MeshImFreq:
            f = lambda om: (om  - 1j*sign(om.imag)*sqrt(abs(om)**2 +  D*D))/D/D*2*Id
        elif type(G.mesh) == MeshRealFrequency:
            def f(om):
              if (om > -D) and (om < D):
                return (2.0/D**2) * (om - 1j* sqrt(D**2 - om**2))
              else:
                return (2.0/D**2) * (om - sign(om) * sqrt(om**2 - D**2))
        else:
            raise TypeError, "This initializer is only correct in frequency"

        # Let's create a new tail
        G.tail = TailGf(shape = G.tail.shape, size=5, order_min=1)
        for i in range(G.N1):
            G.tail[1][i,i] = 1.0
            G.tail[3][i,i] = D**2/4.0
            G.tail[5][i,i] = D**4/8.0
 
        Function(f,None)(G)
        return G
예제 #3
0
    def __call__(self,G) :
        D= self.half_bandwidth
        Id = numpy.identity(G.N1,numpy.complex_)
        if G.mesh.TypeGF == GF_Type.Imaginary_Frequency:
            f = lambda om : (om  - 1j*sign(om.imag)*sqrt(abs(om)**2 +  D*D))/D/D*2*Id
        elif G.mesh.TypeGF == GF_Type.Real_Frequency: 
            def f(om):
              if (om > -D) and (om < D):
                return (2.0/D**2) * (om - 1j* sqrt(D**2 - om**2))
              else:
                return (2.0/D**2) * (om - sign(om) * sqrt(om**2 - D**2))
        else :
            raise TypeError, "This initializer is only correct in frequency"

        t =G._tail
        t.zero()
        for i in range(G.N1):
          t[1].array[i,i] = 1.0
          t[3].array[i,i] = D**2/4.0
          t[5].array[i,i] = D**4/8.0
 
        t.changeOrderMax(5) # expansion is not valid above this
        Function(f,None)(G)
        return G
예제 #4
0
 def f(om):
   if (om > -D) and (om < D):
     return (2.0/D**2) * (om - 1j* sqrt(D**2 - om**2))
   else:
     return (2.0/D**2) * (om - sign(om) * sqrt(om**2 - D**2))