def diagonalize(ten_dq, umat): emat = edrixs.cb_op(edrixs.cf_cubic_d(ten_dq), edrixs.tmat_c2r('d', ispin=True)) H = (edrixs.build_opers(4, umat, basis) + edrixs.build_opers(2, emat, basis)) e, v = scipy.linalg.eigh(H) return e - e.min()
zeta_d_i = info['v_soc_i'][0] zeta_d_n = info['v_soc_n'][0] c_soc = info['c_soc'] ################################################################################ # Build matrices describing interactions # ------------------------------------------------------------------------------ # edrixs uses complex spherical harmonics as its default basis set. If we want to # use another basis set, we need to pass a matrix to the solver, which transforms # from complex spherical harmonics into the basis we use. # The solver will use this matrix when implementing the Coulomb interactions # using the :code:`slater` list of Coulomb parameters. # Here it is easiest to # use real harmonics. We make the complex harmonics to real harmonics transformation # matrix via trans_c2n = edrixs.tmat_c2r('d',True) ################################################################################ # The crystal field and SOC needs to be passed to the solver by constructing # the impurity matrix in the real harmonic basis. For cubic symmetry, we need # to set the energies of the orbitals along the # diagonal of the matrix. These need to be in pairs as there are two # spin-orbitals for each orbital energy. Python # `list comprehension <https://realpython.com/list-comprehension-python/>`_ # and # `numpy indexing <https://numpy.org/doc/stable/reference/arrays.indexing.html>`_ # are used here. See :ref:`sphx_glr_auto_examples_example_1_crystal_field.py` # for more details if needed. ten_dq = 0.56 CF = np.zeros((norb_d, norb_d), dtype=np.complex) diagonal_indices = np.arange(norb_d)
print(v[:, 6:].real) ################################################################################ # These are the set of so-called :math:`e_{g}` orbitals, composed of # :math:`Y^2_2, Y^{-2}_2, Y^{0}_2`. We can use edrixs to prove that # :code:`cfmat` would be diagonal in the real # harmonic basis. An operator :math:`\hat{O}` can be transformed into an # operator in another basis :math:`\hat{O}^{\prime}` using a unitary # transformation matrix :math:`T` as # # .. math:: # # \hat{O}^{\prime} = (T)^{\dagger} \hat{O} (T). # # This is computed as follows cfmat_rhb = edrixs.cb_op(cfmat, edrixs.tmat_c2r('d', ispin=True)) print(cfmat_rhb.real) ################################################################################ # where :code:`edrixs.tmat_c2r('d', ispin=True)` is the transformation matrix. # We needed to tell edrixs that we are working with a :math:`d`-shell and that it # should include spin. We could also have transformed :code:`v` to see how these # eignevectors are composed of the real harmonic basis. We will see an example # of this later. ################################################################################ # Crystal field on an atom # ------------------------------------------------------------------------------ # To simulate the solid state, we need to combine the crystal field with Coulomb # interactions. Let us choose an atomic model for Ni. l = 2
zeta_d_i, zeta_p_n = 0.35, 1072.6666666666667 Ir_loc2g = np.zeros((2, 3, 3), dtype=np.float64) Ir_loc2g[0] = [[+0.70710678, +0.40824829, +0.57735027], [-0.70710678, +0.40824829, +0.57735027], [+0.00000000, -0.81649658, +0.57735027]] Ir_loc2g[1] = [ [-0.70710678, +0.40824829, -0.57735027], [+0.70710678, +0.40824829, -0.57735027], [+0.00000000, -0.81649658, -0.57735027], ] umat_t2g_i = edrixs.get_umat_slater('t2g', F0_d, F2_d, F4_d) umat_t2g_i = edrixs.transform_utensor(umat_t2g_i, edrixs.tmat_c2r('t2g', True)) params = [ 0.0, 0.0, 0.0, # Fk for d F0_dp, F2_dp, # Fk for dp G1_dp, G3_dp, # Gk for dp 0.0, 0.0 # Fk for p ] umat_t2gp_n = edrixs.get_umat_slater('t2gp', *params) tmat = np.zeros((12, 12), dtype=np.complex128) tmat[0:6, 0:6] = edrixs.tmat_c2r('t2g', True) tmat[6:12, 6:12] = edrixs.tmat_c2r('p', True)
# F_0 &=& F^0 \\ # F_2 &=& \frac{1}{49}F^2 \\ # F_4 &=& \frac{1}{441}F^4, # \end{eqnarray} # # which involves different normalization parameters. ################################################################################ # Basis transform # ------------------------------------------------------------------------------ # If we want to use the real harmonic basis, we can use a tensor # transformation, which imposes the following orbital order # :math:`3z^2-r^2, xz, yz, x^2-y^2, xy`, each of which involves # :math:`\uparrow, \downarrow` spin pairs. Let's perform this transformation and # store a list of these orbitals. umat = edrixs.transform_utensor(umat_chb, edrixs.tmat_c2r('d', True)) orbitals = ['3z^2-r^2', 'xz', 'yz', 'x^2-y^2', 'xy'] ################################################################################ # Interactions # ------------------------------------------------------------------------------ # Tensor :math:`U` is a series of matrix # elements # # .. math:: # \begin{equation} # \langle\psi_{\gamma,\delta}^{\bar{\sigma},\bar{\sigma}^\prime} # |\hat{H}| # \psi_{\alpha,\beta}^{\sigma,\sigma^\prime}\rangle # \end{equation} #