Esempio n. 1
0
    def __call__(self, G):
        D = self.HalfBandwidth
        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"

        # assert G.N1==1, "Not valid for large GF"

        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
Esempio n. 2
0
    def __call__(self, G):
        D = self.HalfBandwidth
        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"

        #assert G.N1==1, "Not valid for large GF"

        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
Esempio n. 3
0
    def __call__(self,G) :
        D= self.HalfBandwidth
        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
Esempio n. 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))