示例#1
0
    for i in range(6, 12):
        emat_n[1, i, i] -= core_v

    basis_i = edrixs.get_fock_bin_by_N(12, 9, 12, 12)
    basis_n = []
    tmp = edrixs.get_fock_bin_by_N(12, 10, 6, 5, 6, 6)
    basis_n.append(tmp)
    tmp = edrixs.get_fock_bin_by_N(12, 10, 6, 6, 6, 5)
    basis_n.append(tmp)
    ncfgs_i, ncfgs_n = len(basis_i), len(basis_n[0])

    hmat_i = np.zeros((ncfgs_i, ncfgs_i), dtype=np.complex128)
    hmat_n = np.zeros((2, ncfgs_n, ncfgs_n), dtype=np.complex128)

    print("edrixs >>> building Hamiltonian without core-hole ...")
    hmat_i[:, :] += edrixs.two_fermion(emat_i, basis_i, basis_i)
    hmat_i[:, :] += edrixs.four_fermion(umat_i, basis_i)
    eval_i, evec_i = scipy.linalg.eigh(hmat_i)
    print("edrixs >>> Done!")

    print("edrixs >>> Building Hamiltonian with a core-hole ...")
    eval_n = np.zeros((2, ncfgs_n), dtype=np.float64)
    evec_n = np.zeros((2, ncfgs_n, ncfgs_n), dtype=np.complex128)
    for i in range(2):
        hmat_n[i] += edrixs.two_fermion(emat_n[i], basis_n[i], basis_n[i])
        hmat_n[i] += edrixs.four_fermion(umat_n[i], basis_n[i])
        eval_n[i], evec_n[i] = scipy.linalg.eigh(hmat_n[i])
    print("edrixs >>> Done!")

    edrixs.write_tensor(eval_i, 'eval_i.dat')
    edrixs.write_tensor(eval_n, 'eval_n.dat')
示例#2
0
def ed():
    # 1-10: Ni-3d valence orbitals, 11-16: Ni-2p core orbitals
    # Single particle basis: complex shperical Harmonics
    ndorb, nporb, ntot = 10, 6, 16
    emat_i = np.zeros((ntot, ntot), dtype=np.complex)
    emat_n = np.zeros((ntot, ntot), dtype=np.complex)

    # 4-index Coulomb interaction tensor, parameterized by
    # Slater integrals, which are obtained from Cowan's code
    F2_d, F4_d = 7.9521, 4.9387
    # Averaged dd Coulomb interaction is set to be zero
    F0_d = edrixs.get_F0('d', F2_d, F4_d)
    G1_dp, G3_dp = 4.0509, 2.3037
    # Averaged dp Coulomb interaction is set to be zero
    F0_dp, F2_dp = edrixs.get_F0('dp', G1_dp, G3_dp), 7.33495
    umat_i = edrixs.get_umat_slater(
        'dp',
        F0_d,
        F2_d,
        F4_d,  # dd
        0,
        0,
        0,
        0,  # dp
        0,
        0)  # pp
    umat_n = edrixs.get_umat_slater(
        'dp',
        F0_d,
        F2_d,
        F4_d,  # dd
        F0_dp,
        F2_dp,
        G1_dp,
        G3_dp,  # dp
        0,
        0)  # pp

    # Atomic spin-orbit coupling
    zeta_d, zeta_p = 0.083, 11.24
    emat_i[0:ndorb, 0:ndorb] += edrixs.atom_hsoc('d', zeta_d)
    emat_n[0:ndorb, 0:ndorb] += edrixs.atom_hsoc('d', zeta_d)
    emat_n[ndorb:ntot, ndorb:ntot] += edrixs.atom_hsoc('p', zeta_p)

    # Tetragonal crystal field splitting terms,
    # which are first defined in the real cubic Harmonics basis,
    # and then transformed to complex shperical Harmonics basis.
    dt, ds, dq = 0.011428, 0.035714, 0.13
    tmp = np.zeros((5, 5), dtype=np.complex)
    tmp[0, 0] = 6 * dq - 2 * ds - 6 * dt  # d3z2-r2
    tmp[1, 1] = -4 * dq - 1 * ds + 4 * dt  # dzx
    tmp[2, 2] = -4 * dq - 1 * ds + 4 * dt  # dzy
    tmp[3, 3] = 6 * dq + 2 * ds - 1 * dt  # dx2-y2
    tmp[4, 4] = -4 * dq + 2 * ds - 1 * dt  # dxy
    tmp[:, :] = edrixs.cb_op(tmp, edrixs.tmat_r2c('d'))
    emat_i[0:ndorb:2, 0:ndorb:2] += tmp
    emat_i[1:ndorb:2, 1:ndorb:2] += tmp
    emat_n[0:ndorb:2, 0:ndorb:2] += tmp
    emat_n[1:ndorb:2, 1:ndorb:2] += tmp

    # Build Fock basis in its binary form
    basis_i = edrixs.get_fock_bin_by_N(ndorb, 8, nporb, nporb)
    basis_n = edrixs.get_fock_bin_by_N(ndorb, 9, nporb, nporb - 1)
    ncfg_i, ncfg_n = len(basis_i), len(basis_n)

    # Build many-body Hamiltonian in Fock basis
    hmat_i = np.zeros((ncfg_i, ncfg_i), dtype=np.complex)
    hmat_n = np.zeros((ncfg_n, ncfg_n), dtype=np.complex)
    hmat_i[:, :] += edrixs.two_fermion(emat_i, basis_i, basis_i)
    hmat_i[:, :] += edrixs.four_fermion(umat_i, basis_i)
    hmat_n[:, :] += edrixs.two_fermion(emat_n, basis_n, basis_n)
    hmat_n[:, :] += edrixs.four_fermion(umat_n, basis_n)

    # Do exact-diagonalization to get eigenvalues and eigenvectors
    eval_i, evec_i = np.linalg.eigh(hmat_i)
    eval_n, evec_n = np.linalg.eigh(hmat_n)

    # Build dipolar transition operators
    dipole = np.zeros((3, ntot, ntot), dtype=np.complex)
    T_abs = np.zeros((3, ncfg_n, ncfg_i), dtype=np.complex)
    T_emi = np.zeros((3, ncfg_i, ncfg_n), dtype=np.complex)
    tmp = edrixs.get_trans_oper('dp')
    for i in range(3):
        dipole[i, 0:ndorb, ndorb:ntot] = tmp[i]
        # First, in the Fock basis
        T_abs[i] = edrixs.two_fermion(dipole[i], basis_n, basis_i)
        # Then, transfrom to the eigenvector basis
        T_abs[i] = edrixs.cb_op2(T_abs[i], evec_n, evec_i)
        T_emi[i] = np.conj(np.transpose(T_abs[i]))

    return eval_i, eval_n, T_abs, T_emi
示例#3
0
def get_s_l_ls_values_n(l,basis,evec,ref,ndorb,ntot):
    """
    For the 2p to 3d transitions
    Calaculate the  S_x-, S_y-, S_z-, and S^2-Values after diagonalization
    Calaculate the  L_x-, L_y-, L_z-, and L^2-Values after diagonalization
    Calaculate the LS-Values after diagonalization
    Parameters
    ----------

    ndorb: int
        Total number of 3d-electrons

    ntot:
        Total number of electrons

    l: int
        The overall-angular moment l

    evac: 2d complex array
        The impurity vector after demoralization.

    basis: list of array
        Left fock basis :math:`<F_{l}|`.
        AND:
        Right fock basis :math:`|F_{r}>`.
        rb = lb

    Returns
    -------

    spin_prop: list of numpy-arrays
        Expectation-Value of S_x, S_y, S_z, and S^2
    lang_prop: list of numpy-arrays
        Expectation-Value of L_x, L_y, L_z, and L^2
    ls: float-numpy-array
        Expectation-Value of LS
    """
    
    # Creating the intial Spin-Hamiltonian, which has to be a 16*16 for 2p3d
    hh_sx = np.zeros_like(ref)
    hh_sy = np.zeros_like(ref)
    hh_sz = np.zeros_like(ref)
    
    hh_sx[0:ndorb,0:ndorb] += edrixs.get_sx(l=l)
    hh_sy[0:ndorb,0:ndorb] += edrixs.get_sy(l=l)
    hh_sz[0:ndorb,0:ndorb] += edrixs.get_sz(l=l)
    hh_sx[ndorb:ntot,ndorb:ntot] += edrixs.get_sx(l=l-1)
    hh_sy[ndorb:ntot,ndorb:ntot] += edrixs.get_sy(l=l-1)
    hh_sz[ndorb:ntot,ndorb:ntot] += edrixs.get_sz(l=l-1)
    # Setting up the Spin-Hamiltonian
    h_sx = edrixs.two_fermion(hh_sx, basis, basis)
    h_sy = edrixs.two_fermion(hh_sy, basis, basis)
    h_sz = edrixs.two_fermion(hh_sz, basis, basis)

    # Calculating the S-Expectation-Value depending on the Wavefunction-Coefficient
    sx = edrixs.cb_op2(h_sx, evec, evec)
    sy = edrixs.cb_op2(h_sy, evec, evec)
    sz = edrixs.cb_op2(h_sz, evec, evec)
    # S2-Value has to be calculated as the mutated-product of the single xyz-Hamiltonian consistent with theory
    s2 = edrixs.cb_op2(np.matmul(h_sx,h_sx)+np.matmul(h_sy,h_sy)+np.matmul(h_sz,h_sz), evec, evec)
    # Probably are more elegant way is possible as s2 = sx**2 + sy**2 + sz**2, however generates more numerical noise
    # ls = np.matmul(sx,sx)+np.matmul(sy,sy)+np.matmul(sz,sz)
    # Summarize everything as a list
    spin_prop = [sx.diagonal().real,sy.diagonal().real,sz.diagonal().real,s2.diagonal().real]
    print("Done with Sx-,Sy-,Sz-, and S2-values!")
    
    
     # Creating the intial Angular-Hamiltonian, which has to be a 16*16 for 2p3d
    hh_lx = np.zeros_like(ref)
    hh_ly = np.zeros_like(ref)
    hh_lz = np.zeros_like(ref)
    
    hh_lx[0:ndorb,0:ndorb] += edrixs.get_lx(l=l,ispin=True)
    hh_ly[0:ndorb,0:ndorb] += edrixs.get_ly(l=l,ispin=True)
    hh_lz[0:ndorb,0:ndorb] += edrixs.get_lz(l=l,ispin=True)
    hh_lx[ndorb:ntot,ndorb:ntot] += edrixs.get_lx(l=l-1,ispin=True)
    hh_ly[ndorb:ntot,ndorb:ntot] += edrixs.get_ly(l=l-1,ispin=True)
    hh_lz[ndorb:ntot,ndorb:ntot] += edrixs.get_lz(l=l-1,ispin=True)
    # Setting up the Angular-Hamiltonian
    h_lx = edrixs.two_fermion(hh_lx, basis, basis)
    h_ly = edrixs.two_fermion(hh_ly, basis, basis)
    h_lz = edrixs.two_fermion(hh_lz, basis, basis)


    # Calculating the L-Expectation-Value depending on the Wavefunction-Coefficient
    lx = edrixs.cb_op2(h_lx, evec, evec)
    ly = edrixs.cb_op2(h_ly, evec, evec)
    lz = edrixs.cb_op2(h_lz, evec, evec)
    # L2-Value has to be calculated as the mutated-product of the single xyz-Hamiltonian consistent with theory
    l2 = edrixs.cb_op2(np.matmul(h_lx,h_lx)+np.matmul(h_ly,h_ly)+np.matmul(h_lz,h_lz), evec, evec)
    # Probably are more elegant way is possible as l2 = lx**2 + ly**2 + lz**2, however generates more numerical noise
    # l2 = np.matmul(lx,lx)+np.matmul(ly,ly)+np.matmul(lz,lz)
    lang_prop = [lx.diagonal().real,ly.diagonal().real,lz.diagonal().real,l2.diagonal().real]
    print("Done with Lx-,Ly-,Lz-, and L2-values!")

    # L2-Value has to be calculated as the mutated-product of the single xyz-Hamiltonian consistent with theory
    ls = edrixs.cb_op2(np.matmul(h_lx,h_sx)+np.matmul(h_ly,h_sy)+np.matmul(h_lz,h_sz), evec, evec)
    # Probably are more elegant way is possible as l2 = lx**2 + ly**2 + lz**2, however generates more numerical noise
    # ls = np.matmul(lx,sx)+np.matmul(ly,sy)+np.matmul(sz,sz)
    print("Done with LS-values!")
    
    return spin_prop, lang_prop, ls.diagonal().real