Пример #1
0
 def get_chik(k): # function which returns a matrix
   """ Get response at a cetain energy"""
   hk = hkgen(k) # first point
   if collinear: hk = np.matrix([[hk[2*i,2*j] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # up component
   e1,ev1 = lg.eigh(hk) # get eigenvalues
   hk = hkgen(k+q) # second point
   if collinear: hk = np.matrix([[hk[2*i+1,2*j+1] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # down component
   e2,ev2 = lg.eigh(hk) # get eigenvalues
   ct = collinear_xychi(ev1.T,e1,ev2.T,e2,energies,t,delta) # contribution
   return ct # return response
Пример #2
0
 def get_chik(k): # function which returns a matrix
   """ Get response at a cetain energy"""
   hk = hkgen(k) # first point
   if collinear: hk = np.matrix([[hk[2*i,2*j] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # up component
   e1,ev1 = lg.eigh(hk) # get eigenvalues
   hk = hkgen(k+q) # second point
   if collinear: hk = np.matrix([[hk[2*i+1,2*j+1] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # down component
   e2,ev2 = lg.eigh(hk) # get eigenvalues
   ct = collinear_xychi(ev1.T,e1,ev2.T,e2,energies,t,delta) # contribution
   return ct # return response
Пример #3
0
 def get_chik(k):
   """Function to integrate"""
   hk = hkgen(k) # fist point
   if collinear: hk = np.matrix([[hk[2*i,2*j] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # up component
   e1,ev1 = lg.eigh(hk) # get eigenvalues
   hk = hkgen(k+q) # second point
   if collinear: hk = np.matrix([[hk[2*i+1,2*j+1] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # down component
   e2,ev2 = lg.eigh(hk) # get eigenvalues
   if collinear:
     ct = collinear_xychi(ev1.T,e1,ev2.T,e2,energies,t,delta) # contribution
   else:
     ct = calculate_xychi(ev1.T,e1,ev2.T,e2,energies,t,delta) # contribution
   return ct
Пример #4
0
 def get_chik(k):
   """Function to integrate"""
   hk = hkgen(k) # fist point
   if collinear: hk = np.matrix([[hk[2*i,2*j] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # up component
   e1,ev1 = lg.eigh(hk) # get eigenvalues
   hk = hkgen(k+q) # second point
   if collinear: hk = np.matrix([[hk[2*i+1,2*j+1] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # down component
   e2,ev2 = lg.eigh(hk) # get eigenvalues
   if collinear:
     ct = collinear_xychi(ev1.T,e1,ev2.T,e2,energies,t,delta) # contribution
   else:
     ct = calculate_xychi(ev1.T,e1,ev2.T,e2,energies,t,delta) # contribution
   return ct
Пример #5
0
def collinear_chi1d(h,energies = [0.],t=0.0001,delta=0.01,q=0.001,nk=1000,U=None,adaptive=True,ks=None):
  collinear = True
  hkgen = h.get_hk_gen() # get the generating hamiltonian
  n = len(h.geometry.x) # initialice response
  m = np.zeros((len(energies),n*n),dtype=np.complex) # initialice
  if not adaptive: # full algorithm  
    if ks==None: ks = np.linspace(0.,1.,nk)  # create klist
    for k in ks:
#      print "Doing k=",k
      hk = hkgen(k) # fist point

      if collinear: hk = np.matrix([[hk[2*i,2*j] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # up component

      e1,ev1 = lg.eigh(hk) # get eigenvalues
      hk = hkgen(k+q) # second point

      if collinear: hk = np.matrix([[hk[2*i+1,2*j+1] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # down component

      e2,ev2 = lg.eigh(hk) # get eigenvalues
      ct = collinear_xychi(ev1.T,e1,ev2.T,e2,energies,t,delta) # contribution
      m += ct
    m = m/nk # normalice by the number of kpoints  
    ms = [m[i,:].reshape(n,n) for i in range(len(m))] # convert to matrices
  if adaptive: # adaptive algorithm 
    from integration import integrate_matrix
    def get_chik(k): # function which returns a matrix
      """ Get response at a cetain energy"""
      hk = hkgen(k) # first point
      if collinear: hk = np.matrix([[hk[2*i,2*j] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # up component
      e1,ev1 = lg.eigh(hk) # get eigenvalues
      hk = hkgen(k+q) # second point
      if collinear: hk = np.matrix([[hk[2*i+1,2*j+1] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # down component
      e2,ev2 = lg.eigh(hk) # get eigenvalues
      ct = collinear_xychi(ev1.T,e1,ev2.T,e2,energies,t,delta) # contribution
      return ct # return response
    ms = []
    m = integrate_matrix(get_chik,xlim=[0.,1.],eps=.01,only_imag=False) # add energy
    ms = [m[i,:].reshape(n,n) for i in range(len(m))] # convert to matrices

  if U==None: # raw calculation
    return ms 
  else: # RPA calculation
    return rpachi(ms,U=U)
Пример #6
0
def collinear_chi1d(h,energies = [0.],t=0.0001,delta=0.01,q=0.001,nk=1000,U=None,adaptive=True,ks=None):
  collinear = True
  hkgen = h.get_hk_gen() # get the generating hamiltonian
  n = len(h.geometry.x) # initialice response
  m = np.zeros((len(energies),n*n),dtype=np.complex) # initialice
  if not adaptive: # full algorithm  
    if ks==None: ks = np.linspace(0.,1.,nk)  # create klist
    for k in ks:
#      print "Doing k=",k
      hk = hkgen(k) # fist point

      if collinear: hk = np.matrix([[hk[2*i,2*j] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # up component

      e1,ev1 = lg.eigh(hk) # get eigenvalues
      hk = hkgen(k+q) # second point

      if collinear: hk = np.matrix([[hk[2*i+1,2*j+1] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # down component

      e2,ev2 = lg.eigh(hk) # get eigenvalues
      ct = collinear_xychi(ev1.T,e1,ev2.T,e2,energies,t,delta) # contribution
      m += ct
    m = m/nk # normalice by the number of kpoints  
    ms = [m[i,:].reshape(n,n) for i in range(len(m))] # convert to matrices
  if adaptive: # adaptive algorithm 
    from integration import integrate_matrix
    def get_chik(k): # function which returns a matrix
      """ Get response at a cetain energy"""
      hk = hkgen(k) # first point
      if collinear: hk = np.matrix([[hk[2*i,2*j] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # up component
      e1,ev1 = lg.eigh(hk) # get eigenvalues
      hk = hkgen(k+q) # second point
      if collinear: hk = np.matrix([[hk[2*i+1,2*j+1] for i in range(len(hk)/2)] for j in range(len(hk)/2)])  # down component
      e2,ev2 = lg.eigh(hk) # get eigenvalues
      ct = collinear_xychi(ev1.T,e1,ev2.T,e2,energies,t,delta) # contribution
      return ct # return response
    ms = []
    m = integrate_matrix(get_chik,xlim=[0.,1.],eps=.01,only_imag=False) # add energy
    ms = [m[i,:].reshape(n,n) for i in range(len(m))] # convert to matrices

  if U==None: # raw calculation
    return ms 
  else: # RPA calculation
    return rpachi(ms,U=U)