def get_transop(loc, pos):
    # get dipole transition operator in local axis
    dop = edrixs.get_trans_oper('t2gp32')
    dop_g = np.zeros((2, 3, 6, 4), dtype=np.complex)
    # transform to golobal axis
    for i in range(2):
        for j in range(3):
            for k in range(3):
                dop_g[i, j] += loc[i, j, k] * dop[k]

    # RIXS settings
    thin, thout, phi = 30 / 180.0 * np.pi, 60 / 180.0 * np.pi, 0.0
    ein, eout = 11215.0, 11215.0  # eV
    # Wavevector
    kin, kout = edrixs.get_wavevector_rixs(thin, thout, phi, ein, eout)
    # polarization pi-pi and pi-sigma
    for key, alpha, beta in [('pp', 0, 0), ('ps', 0, np.pi / 2.0)]:
        ei, ef = edrixs.dipole_polvec_rixs(thin, thout, phi, alpha, beta)
        T_i = np.zeros((2, 6, 4), dtype=np.complex)
        T_f = np.zeros((2, 4, 6), dtype=np.complex)
        for i in range(2):
            for j in range(3):
                T_i[i] += dop_g[i, j] * ei[j]
                T_f[i] += np.conj(np.transpose(dop_g[i, j] * ef[j]))
            # multiply phase factor
            T_i[i] = T_i[i] * np.exp(+1j * np.dot(pos[i], kin))
            T_f[i] = T_f[i] * np.exp(-1j * np.dot(pos[i], kout))

        transop_rixs_i = np.zeros((20, 20), dtype=np.complex)
        transop_rixs_f = np.zeros((20, 20), dtype=np.complex)
        for i in range(2):
            off1, off2 = i * 6, 12 + i * 4
            transop_rixs_i[off1:off1 + 6, off2:off2 + 4] = T_i[i]
            transop_rixs_f[off2:off2 + 4, off1:off1 + 6] = T_f[i]
        # write to file
        edrixs.write_emat(transop_rixs_i, "rixs_" + key + "/transop_rixs_i.in")
        edrixs.write_emat(transop_rixs_f, "rixs_" + key + "/transop_rixs_f.in")

    # For XAS, use isotropic polarization
    ei = np.array([1, 1, 1]) / np.sqrt(3.0)
    T_i = np.zeros((2, 6, 4), dtype=np.complex)
    for i in range(2):
        for j in range(3):
            T_i[i] += dop_g[i, j] * ei[j]

    transop_xas = np.zeros((20, 20), dtype=np.complex128)
    for i in range(2):
        off1, off2 = i * 6, 12 + i * 4
        transop_xas[off1:off1 + 6, off2:off2 + 4] = T_i[i]
    edrixs.write_emat(transop_xas, "xas/transop_xas.in")
Esempio n. 2
0
def get_transop(loc, pos):
    dop = edrixs.get_trans_oper('t2gp')
    dop_g = np.zeros((2, 3, 6, 6), dtype=np.complex)
    for i in range(2):
        dop_g[i, 0] = loc[i, 0, 0] * dop[0] + loc[i, 0, 1] * dop[1] + loc[
            i, 0, 2] * dop[2]
        dop_g[i, 1] = loc[i, 1, 0] * dop[0] + loc[i, 1, 1] * dop[1] + loc[
            i, 1, 2] * dop[2]
        dop_g[i, 2] = loc[i, 2, 0] * dop[0] + loc[i, 2, 1] * dop[1] + loc[
            i, 2, 2] * dop[2]

    # for RIXS
    thin, thout, phi = 30 / 180.0 * np.pi, 60 / 180.0 * np.pi, 0.0
    ein, eout = 11215.0, 11215.0  # eV
    kin, kout = edrixs.get_wavevector_rixs(thin, thout, phi, ein, eout)
    # polarization pi-pi and pi-sigma
    for key, alpha, beta in [('pp', 0, 0), ('ps', 0, np.pi)]:
        ei, ef = edrixs.dipole_polvec_rixs(thin, thout, phi, alpha, beta)
        T_i = np.zeros((2, 6, 6), dtype=np.complex)
        T_o = np.zeros((2, 6, 6), dtype=np.complex)
        for i in range(2):
            T_i[i] = (dop_g[i, 0] * ei[0] + dop_g[i, 1] * ei[1] +
                      dop_g[i, 2] * ei[2]) * np.exp(1j * np.dot(pos[i], kin))
            T_o[i] = np.exp(-1j * np.dot(pos[i], kout)) * np.conj(
                np.transpose(dop_g[i, 0] * ef[0] + dop_g[i, 1] * ef[1] +
                             dop_g[i, 2] * ef[2]))
        transop_rixs_i = np.zeros((24, 24), dtype=np.complex)
        transop_rixs_f = np.zeros((24, 24), dtype=np.complex)
        for i in range(2):
            off1, off2 = i * 6, 12 + i * 6
            transop_rixs_i[off1:off1 + 6, off2:off2 + 6] = T_i[i]
            transop_rixs_f[off2:off2 + 6, off1:off1 + 6] = T_o[i]
        edrixs.write_emat(transop_rixs_i, "rixs_" + key + "/transop_rixs_i.in")
        edrixs.write_emat(transop_rixs_f, "rixs_" + key + "/transop_rixs_f.in")

    # For XAS
    ei = np.array([1, 1, 1]) / np.sqrt(3.0)
    T_i = np.zeros((2, 6, 6), dtype=np.complex)
    for i in range(2):
        T_i[i] = dop_g[i, 0] * ei[0] + dop_g[i, 1] * ei[1] + dop_g[i,
                                                                   2] * ei[2]
    transop_xas = np.zeros((24, 24), dtype=np.complex128)
    for i in range(2):
        off1, off2 = i * 6, 12 + i * 6
        transop_xas[off1:off1 + 6, off2:off2 + 6] = T_i[i]
    edrixs.write_emat(transop_xas, "xas/transop_xas.in")
Esempio n. 3
0
     emi_trans = copy.deepcopy(trans_mat_emi[i])
     Ffg_Ir[i] = edrixs.scattering_mat(eval_gs, eval_ex[i],
                                       abs_trans[:, :, gs_list],
                                       emi_trans, omi, gamma_c)
 print('------------------------')
 for ipol, (alpha, beta) in enumerate(pol_vec):
     ein, eout = omi + omi_shift, omi + omi_shift
     ei, ef = edrixs.dipole_polvec_rixs(thin,
                                        thout,
                                        phi,
                                        alpha,
                                        beta,
                                        local_axis=np.eye(3))
     kin, kout = edrixs.get_wavevector_rixs(thin,
                                            thout,
                                            phi,
                                            ein,
                                            eout,
                                            local_axis=np.eye(3))
     Q = kout - kin
     phase_Ir = np.zeros(2, dtype=np.complex128)
     for i in range(0, 2):
         phase_Ir[i] = np.exp(-1j * np.dot(Q, Ir_pos[i]))
     Ffg = np.zeros((ncfgs_gs, len(gs_list)), dtype=np.complex128)
     for i in range(0, 2):
         for j in range(3):
             for k in range(3):
                 Ffg[:, :] += ef[j] * Ffg_Ir[i, j,
                                             k] * phase_Ir[i] * ei[k]
     for i in gs_list:
         for j in range(ncfgs_gs):
             rixs[ipol, :, omi_ind] += np.abs(