示例#1
0
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)
示例#3
0
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
示例#4
0
    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)
示例#5
0
#     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}
#