def chi1d(h,energies = [0.],t=0.0001,delta=0.01,q=0.001,nk=1000,U=None,adaptive=True,ks=None): 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 e1,ev1 = lg.eigh(hk) # get eigenvalues hk = hkgen(k+q) # second point e2,ev2 = lg.eigh(hk) # get eigenvalues ct = calculate_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 e1,ev1 = lg.eigh(hk) # get eigenvalues hk = hkgen(k+q) # second point e2,ev2 = lg.eigh(hk) # get eigenvalues ct = calculate_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=.1,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)
def chi0d(m,energies = [0.],t=0.0001): """ Calculate spin response""" e,ev = lg.eigh(m) # get eigenvalues ev = np.matrix(ev.transpose()) n = np.shape(ev) # import check # check.check(ev,e) ct = calculate_xychi(ev,e,ev,e,energies,t)
def get_chik(k): # function which returns a matrix """ Get response at a cetain energy""" hk = hkgen(k) # first point e1,ev1 = lg.eigh(hk) # get eigenvalues hk = hkgen(k+q) # second point e2,ev2 = lg.eigh(hk) # get eigenvalues ct = calculate_xychi(ev1.T,e1,ev2.T,e2,energies,t,delta) # contribution return ct # return response
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