Exemple #1
0
def get_self_energy_cf_nosoc(l_list, ispin, rotations):
    '''
    Get the self energy structure in the case of crystal field splitting
    and without spin-orbit interaction.
    '''
    Jorig = get_J_generator(l_list, iso=1)
    Jhalf, Uhalf, self_energy_half = atsym.get_atom_Jnew(rotations, Jorig)

    if ispin == 2:
        shift = np.max(self_energy_half)
    else:
        shift = 0

    self_energy = block_diag(self_energy_half,
                             shift_self_energy(self_energy_half, shift))

    # spin-fast-index convfention
    self_energy = trans_orbital_fast_to_spin_fast(self_energy)

    dim_t = Uhalf.shape[0]
    J = []
    for Jh1 in Jhalf:
        J1 = np.zeros(self_energy.shape, dtype=np.complex)
        J1[0::2, 0::2] = Jh1
        J1[1::2, 1::2] = Jh1
        J.append(J1)

    U = np.zeros(self_energy.shape, dtype=np.complex)
    U[:dim_t, 0::2] = Uhalf
    U[dim_t:, 1::2] = Uhalf
    return J, U, self_energy
Exemple #2
0
def get_self_energy_average(l_list, ispin):
    '''
    Get the self energy structure in the case of negligible crystal field
    splitting and without spin-orbit interaction.
    '''
    diag_elem = []
    elem_base = 1
    for l in l_list:
        diag_elem += [elem_base for i in range(2 * l + 1)]
        elem_base += 1
    elem_base -= 1
    if ispin == 2:
        diag_elem += [i + elem_base for i in diag_elem]
    else:
        diag_elem += diag_elem
    self_energy = np.diag(diag_elem)
    self_energy = trans_orbital_fast_to_spin_fast(self_energy)
    U = np.identity(len(self_energy), dtype=complex)
    n_half = U.shape[0] / 2
    utrans = np.zeros_like(U)

    # Similarly transform to spin-fast convention.
    utrans[:, ::2] = U[:, :n_half]
    utrans[:, 1::2] = utrans[:, ::2]
    return None, utrans, self_energy
def get_S_vector(l_list):
    '''
    Get S-vector in CSH basis with fast orbital index.
    '''
    Sz = get_matrix_Sz_CSH_orbital_fast(l_list)
    Sp = get_matrix_Sp_CSH_spin_fast(l_list)
    Sp = trans_orbital_fast_to_spin_fast(Sp, lback=True)
    _, Sx, Sy = get_other_op(Sz, Sp)
    return [Sx, Sy, Sz]
Exemple #4
0
def get_self_energy_op_nosoc(l_list, ispin):
    '''
    Get the self energy structure in the case of fully orbital symmetry
    breaking but with negligible spin-orbit interaction.
    '''
    dim_t = int(np.sum(2 * np.array(l_list) + 1) + 0.5)
    m_half = np.arange(dim_t * dim_t, dtype=int) + 1
    m_half = m_half.reshape((dim_t, dim_t))
    if ispin == 2:
        shift = np.max(m_half)
    else:
        shift = 0
    from scipy.linalg import block_diag
    self_energy = block_diag(m_half, m_half + shift)

    # spin-fast-index convention
    self_energy = trans_orbital_fast_to_spin_fast(self_energy)
    Uhalf = np.identity(dim_t)

    # {{orbs}_up, {orbs}_dn} -> {{up,dn}_{orbs}}
    U = np.zeros((dim_t * 2, dim_t * 2), dtype=complex)
    U[:dim_t, 0::2] = Uhalf
    U[dim_t:, 1::2] = Uhalf
    return None, U, self_energy