예제 #1
0
def AkBkExplicit(ky,
                 kz,
                 N=None,
                 J=None,
                 S=None,
                 h=None,
                 eps=None,
                 a=None,
                 mu=None,
                 Nr=4,
                 Ng=4):
    xx = Dkxx(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    yy = Dkyy(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    zz = Dkzz(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    xy = Dkxy(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)

    xx_table = xx.table(ky, kz, N)
    yy_table = yy.table(ky, kz, N)
    zz_table0 = zz.table(10**-6, 10**-6, N)
    xy_table = xy.table(ky, kz, N)

    Atemp = np.zeros((N, N), dtype=np.complex)
    Btemp = np.zeros((N, N), dtype=np.complex)
    for i in range(N):
        for j in range(N):
            if i == j:
                Atemp[i, j] = h + S * np.sum(zz_table0[i:i + N])
            Atemp[i, j] += S * Jk(i, j, ky, kz, N=N, a=a, J=J)
            Atemp[i, j] -= S / 2 * (xx_table[i - j + N - 1] +
                                    yy_table[i - j + N - 1])

            Btemp[i, j] = -0.5 * S * (xx_table[i - j + N - 1] -
                                      2j * xy_table[i - j + N - 1] -
                                      yy_table[i - j + N - 1])
    return Atemp, Btemp
예제 #2
0
def AkBk(ky,
         kz,
         N=None,
         J=None,
         S=None,
         h=None,
         eps=None,
         a=None,
         mu=None,
         Nr=4,
         Ng=4):
    xx = Dkxx(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    yy = Dkyy(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    zz = Dkzz(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    xy = Dkxy(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)

    xx_table = xx.table(ky, kz, N)
    yy_table = yy.table(ky, kz, N)
    zz_table0 = zz.table(10**-6, 10**-6, N)
    xy_table = xy.table(ky, kz, N)

    Atemp = np.zeros((N, N), dtype=np.complex)
    Btemp = np.zeros((N, N), dtype=np.complex)
    Atemp += np.diag([h + S * np.sum(zz_table0[i:i + N]) for i in range(N)])
    Atemp += np.diag(
        np.ones(N) * S * J * (6 - 2 * np.cos(ky * a) - 2 * np.cos(kz * a)))
    Atemp[0, 0] -= S * J
    Atemp[N - 1, N - 1] -= S * J
    Atemp += np.diag(np.ones(N - 1), -1) * -J * S
    Atemp += np.diag(np.ones(N - 1), 1) * -J * S
    for i in range(N):
        Atemp[i, :] -= .5 * S * np.flip(xx_table[i:i + N] + yy_table[i:i + N])
        Btemp[i, :] -= .5 * S * np.flip(xx_table[i:i + N] - 2j *
                                        xy_table[i:i + N] - yy_table[i:i + N])
    return Atemp, Btemp
예제 #3
0
def AkBkAngle(ky,
              kz,
              phi,
              alpha,
              N=None,
              J=None,
              S=None,
              h=None,
              eps=None,
              a=None,
              mu=None,
              Nr=4,
              Ng=4):
    xx = Dkxx(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    yy = Dkyy(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    zz = Dkzz(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    xy = Dkxy(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    xz = Dkxz(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    yz = Dkyz(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)

    zz_table0 = zz.table(10**-6, 10**-6, N)
    xx_table0 = xx.table(10**-6, 10**-6, N)
    xz_table0 = xz.table(10**-6, 10**-6, N)

    xx_table = xx.table(ky, kz, N)
    yy_table = yy.table(ky, kz, N)
    xy_table = xy.table(ky, kz, N)
    zz_table = zz.table(ky, kz, N)
    xz_table = xz.table(ky, kz, N)
    yz_table = yz.table(ky, kz, N)

    Atemp = np.zeros((N, N), dtype=np.complex)
    Btemp = np.zeros((N, N), dtype=np.complex)

    Atemp += np.diag([
        h * np.cos(phi - alpha) + S *
        np.sum(zz_table0[i:i + N] * np.cos(phi)**2 + xx_table0[i:i + N] *
               np.sin(phi)**2 + xz_table0[i:i + N] * np.sin(phi) * np.cos(phi))
        for i in range(N)
    ])

    Atemp += np.diag(
        np.ones(N) * S * J * (6 - 2 * np.cos(ky * a) - 2 * np.cos(kz * a)))
    Atemp[0, 0] -= S * J
    Atemp[N - 1, N - 1] -= S * J
    Atemp += np.diag(np.ones(N - 1), -1) * -J * S
    Atemp += np.diag(np.ones(N - 1), 1) * -J * S

    for i in range(N):
        Atemp[i, :] -= np.flip(
            S / 2 * (xx_table[i:i + N] * np.cos(phi)**2 + yy_table[i:i + N] +
                     zz_table[i:i + N] * np.sin(phi)**2) -
            2 * xz_table[i:i + N] * np.sin(phi) * np.cos(phi))
        Btemp[i, :] -= 0.5 * S * np.flip(
            xx_table[i:i + N] * np.cos(phi)**2 - yy_table[i:i + N] +
            zz_table[i:i + N] * np.sin(phi)**2 - 2 * xz_table[i:i + N] *
            np.sin(phi) * np.cos(phi) + 2j * xy_table[i:i + N] * np.cos(phi) -
            2j * yz_table[i:i + N] * np.sin(phi))
    return Atemp, Btemp
예제 #4
0
def AkBkAngleExplicit(ky,
                      kz,
                      phi,
                      alpha,
                      N=None,
                      J=None,
                      S=None,
                      h=None,
                      eps=None,
                      a=None,
                      mu=None,
                      Nr=4,
                      Ng=4):
    xx = Dkxx(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    yy = Dkyy(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    zz = Dkzz(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    xy = Dkxy(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    xz = Dkxz(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)
    yz = Dkyz(eps=eps, a=a, mu=mu, Nr=Nr, Ng=Ng)

    zz_table0 = zz.table(10**-6, 10**-6, N)
    xx_table0 = xx.table(10**-6, 10**-6, N)
    xz_table0 = xz.table(10**-6, 10**-6, N)

    xx_table = xx.table(ky, kz, N)
    yy_table = yy.table(ky, kz, N)
    xy_table = xy.table(ky, kz, N)
    zz_table = zz.table(ky, kz, N)
    xz_table = xz.table(ky, kz, N)
    yz_table = yz.table(ky, kz, N)

    A = np.zeros((N, N), dtype=np.complex)
    B = np.zeros((N, N), dtype=np.complex)

    for i in range(N):
        for j in range(N):
            if i == j:
                A[i, j] = h * np.cos(phi - alpha) + S * np.sum(
                    zz_table0[i:i + N] * np.cos(phi)**2 +
                    xx_table0[i:i + N] * np.sin(phi)**2 +
                    xz_table0[i:i + N] * np.sin(phi) * np.cos(phi))
            A[i, j] += S * Jk(i, j, ky, kz, N=N, a=a, J=J)
            A[i,
              j] -= (S / 2 * (xx_table[i - j + N - 1] * np.cos(phi)**2 +
                              yy_table[i - j + N - 1] +
                              zz_table[i - j + N - 1] * np.sin(phi)**2) -
                     2 * xz_table[i - j + N - 1] * np.sin(phi) * np.cos(phi))

            B[i, j] = -0.5 * S * (
                xx_table[i - j + N - 1] * np.cos(phi)**2 -
                yy_table[i - j + N - 1] +
                zz_table[i - j + N - 1] * np.sin(phi)**2 -
                2 * xz_table[i - j + N - 1] * np.sin(phi) * np.cos(phi) +
                2j * xy_table[i - j + N - 1] * np.cos(phi) -
                2j * yz_table[i - j + N - 1] * np.sin(phi))
    return A, B
예제 #5
0
def spin_momentum_nonlinear(ev, ky, kz, N, a=None, mu=None, S=None):
    ev_HP = ev_in_HP_basis(ev)
    ev_S = ev_HP_to_S(ev_HP, S=S)

    eps = a**(-2)

    xx = Dkxx(eps=eps, a=a, mu=mu).table(ky, kz, N)
    yy = Dkyy(eps=eps, a=a, mu=mu).table(ky, kz, N)
    zz = Dkzz(eps=eps, a=a, mu=mu).table(ky, kz, N)
    xy = Dkxy(eps=eps, a=a, mu=mu).table(ky, kz, N)
    xz = Dkxz(eps=eps, a=a, mu=mu).table(ky, kz, N)
    yz = Dkyz(eps=eps, a=a, mu=mu).table(ky, kz, N)

    res = []  # first calculate per x_i point
    for i in range(N):
        Si = ev_S[:, i]
        temp_res = []
        for j in range(N):
            # delta = i - j + N - 1
            if i != j:
                continue
            Sj = ev_S[:, j]
            Sx = Sj[0]
            Sy = Sj[1]
            Sz = Sj[2]
            x = Sx * xx[i - j + N - 1] + Sy * xy[i - j + N -
                                                 1] + Sz * xz[i - j + N - 1]
            y = Sy * yy[i - j + N - 1] + Sz * yz[i - j + N -
                                                 1] + Sx * xy[i - j + N - 1]
            z = Sz * zz[i - j + N - 1] + Sy * yz[i - j + N -
                                                 1] + Sx * xz[i - j + N - 1]
            G = np.stack((x, y, z))
            temp_res.append(np.cross(G, Si))
        temp_res = np.array(temp_res)
        res.append(np.sum(temp_res, axis=0))
    res = np.array(res)
    return res
예제 #6
0
def Dkxy_uni(ky, kz, x, theta=None, mu=None, a=None):
    k = np.sqrt(ky**2 + kz**2)
    if x == 0:
        return Dkxy(eps=a**(-2), a=a, mu=mu).run(0, ky, kz)
    return 1j * 2 * np.pi * np.sin(theta) * mu**2 / (
        a**2) * np.abs(k) * x / np.abs(x) * np.exp(-np.abs(k) * np.abs(x))
예제 #7
0
def Dkxy_uni(k, x, theta=None, mu=None, a=None):
    return 1j * 2 * np.pi * np.sin(theta) * mu**2 / (
        a**2) * np.abs(k) * x / np.abs(x) * np.exp(-np.abs(k) * np.abs(x))


if __name__ == "__main__":
    H = 700.0
    h = mu * H
    eps = a**(-2)

    K = Dkxx(eps, a, mu, Nr=10, Ng=10)
    funs = [
        Dkxx(eps, a, mu, Nr=10, Ng=10),
        Dkyy(eps, a, mu, Nr=10, Ng=10),
        Dkxy(eps, a, mu, Nr=10, Ng=10)
    ]
    uni_funs = [
        partial(Dkxx_uni, mu=mu, a=a),
        partial(Dkyy_uni, mu=mu, a=a),
        partial(Dkxy_uni, mu=mu, a=a)
    ]
    parse_funs = [np.real, np.real, np.imag]
    titles = ['Dkxx', 'Dkyy', 'Dkxy']
    for K, f, parse, tit in zip(funs, uni_funs, parse_funs, titles):
        plt.figure()
        plt.suptitle(tit)
        for i, ky in enumerate(np.logspace(3, 6, 4)):
            kz = 10**4
            theta = np.arctan2(ky, kz)
            absk = np.sqrt(ky**2 + kz**2)
예제 #8
0
def spin_momentum_linear_old(ev,
                             ky,
                             kz,
                             N,
                             phi=None,
                             a=None,
                             mu=None,
                             S=None,
                             J=None,
                             h=None,
                             alpha=None):
    ev = ev_in_HP_basis(ev)
    sqrS = .5 * np.sqrt(2 * S)
    eps = a**(-2)

    xx = Dkxx(eps=eps, a=a, mu=mu).table(ky, kz, N)
    yy = Dkyy(eps=eps, a=a, mu=mu).table(ky, kz, N)
    zz = Dkzz(eps=eps, a=a, mu=mu).table(ky, kz, N)
    xy = Dkxy(eps=eps, a=a, mu=mu).table(ky, kz, N)
    xz = Dkxz(eps=eps, a=a, mu=mu).table(ky, kz, N)
    yz = Dkyz(eps=eps, a=a, mu=mu).table(ky, kz, N)
    zz0 = Dkzz(eps=eps, a=a, mu=mu).table(10**(-10), 10**(-10), N)
    Q = np.sin(phi)
    C = np.cos(phi)
    res = []  # first calculate per x_i point
    for i in range(N):
        bi = ev[i]
        temp_res = []
        for j in range(N):
            # delta = i - j + N - 1
            if i != j:
                continue
            bj = ev[j]
            x = 0
            z = 0
            d = i - j + N - 1

            SxSx = S**2 * Q**2 + 2 * sqrS * S * C * Q * (bj + bj.conj())
            SxSy = -1j * sqrS * S * (bj - bj.conj()) * Q
            SxSz = sqrS * S * (bj + bj.conj()) * (C**2 - Q**2) + S**2 * Q * C
            SySy = 0
            SySz = -1j * sqrS * S * (bj - bj.conj()) * C
            SzSz = S**2 * C**2 - 2 * sqrS * S * C * Q * (bj + bj.conj())
            sum_z0 = 0
            for n in range(N):
                sum_z0 += zz0[i - n + N - 1]

            # y = SxSx * xz[d] + SxSy * yz[d] + SxSz * zz[d]
            y = SxSx * xz[d] + SxSy * yz[d] + SxSz * sum_z0
            y -= SxSz * xx[d] + SySz * xy[d] + SzSz * xz[d]

            # y = sqrS * 2 * S * ((xx[d] - np.sum(zz0[i:i + N])) *
            #                     (bi + bi.conj()) + 1j * xy[d] *
            #                     (bi - bi.conj()))
            J0 = S * J * (6 - 2 * (np.cos(ky * a) + np.cos(kz * a)))
            if i == 0:
                J0 -= S * J
            if i == N - 1:
                J0 -= S * J
            # y += J0 * sqrS * (bi + bi.conj()) + h
            temp_res.append([x, y, z])
        temp_res = np.array(temp_res)
        res.append(np.sum(temp_res, axis=0))
    res = np.array(res)
    return res
예제 #9
0
def spin_momentum_linear(ev,
                         ky,
                         kz,
                         N,
                         phi=None,
                         a=None,
                         mu=None,
                         S=None,
                         J=None,
                         h=None,
                         alpha=None):
    ev = ev_in_HP_basis(ev)
    eps = a**(-2)
    xx = Dkxx(eps=eps, a=a, mu=mu)
    yy = Dkyy(eps=eps, a=a, mu=mu)
    zz = Dkzz(eps=eps, a=a, mu=mu)
    xy = Dkxy(eps=eps, a=a, mu=mu)
    xz = Dkxz(eps=eps, a=a, mu=mu)
    yz = Dkyz(eps=eps, a=a, mu=mu)

    zz_table0 = zz.table(np.finfo('float64').eps, np.finfo('float64').eps, N)
    xx_table0 = xx.table(np.finfo('float64').eps, np.finfo('float64').eps, N)
    xz_table0 = xz.table(np.finfo('float64').eps, np.finfo('float64').eps, N)

    xx_table = xx.table(ky, kz, N)
    yy_table = yy.table(ky, kz, N)
    xy_table = xy.table(ky, kz, N)
    zz_table = zz.table(ky, kz, N)
    xz_table = xz.table(ky, kz, N)
    yz_table = yz.table(ky, kz, N)
    temp = []
    for i in range(N):
        bi = ev[i]
        dt_bi = []
        for j in range(N):
            A = 0
            if i != j:
                continue
            if i == j:
                A += h * np.cos(phi - alpha) + S * np.sum(
                    zz_table0[i:i + N] * np.cos(phi)**2 +
                    xx_table0[i:i + N] * np.sin(phi)**2 +
                    xz_table0[i:i + N] * np.sin(phi) * np.cos(phi))
            A += S * Jk(i, j, ky, kz, N=N, a=a, J=J)
            A -= (S / 2 * (xx_table[i - j + N - 1] * np.cos(phi)**2 +
                           yy_table[i - j + N - 1] +
                           zz_table[i - j + N - 1] * np.sin(phi)**2) -
                  2 * xz_table[i - j + N - 1] * np.sin(phi) * np.cos(phi))

            B = -0.5 * S * (xx_table[i - j + N - 1] * np.cos(phi)**2 -
                            yy_table[i - j + N - 1] +
                            zz_table[i - j + N - 1] * np.sin(phi)**2 - 2 *
                            xz_table[i - j + N - 1] * np.sin(phi) * np.cos(phi)
                            + 2j * xy_table[i - j + N - 1] * np.cos(phi) -
                            2j * yz_table[i - j + N - 1] * np.sin(phi))

            dt_bi.append(-1j * (bi * A + bi.conj() * B.conj()))
        dt_bi = np.array(dt_bi)
        y = -1j / 2 * (dt_bi.sum() - dt_bi.sum().conj())
        x = 1 / 2 * (dt_bi.sum() + dt_bi.sum().conj())
        z = -dt_bi.sum() * dt_bi.sum().conj()
        temp.append([x, y, z])
    temp = np.array(temp)
    return temp