예제 #1
0
def F3i_I_eigs_list(E_list, L, F3_list, I, flip=False):
    out = []
    for i in range(len(E_list)):
        E = E_list[i]
        F3 = F3_list[i]

        if flip == False:  # project before inverting F3
            F3_I = proj.irrep_proj(F3, E, L, I)  # works for all shells
            if F3_I.shape == ():
                F3i_I = 1 / F3_I
                F3i_I_eigs = F3i_I
            else:
                F3_I_eigs = defns.chop(
                    np.array(sorted(LA.eigvals(F3_I), key=abs,
                                    reverse=True)).real)
                #F3i_I = defns.chop(LA.inv(F3_I))
                if F3_I_eigs[-1] == 0:
                    print(E, F3_I_eigs)
                    sys.exit()
                else:
                    F3i_I_eigs = np.array([1 / x for x in F3_I_eigs])

        elif flip == True:  # invert F3 before projecting
            F3i = defns.chop(LA.inv(F3))
            F3i_I = proj.irrep_proj(F3i, E, L, I)
            F3i_I_eigs = defns.chop(np.array(sorted(LA.eigvals(F3i_I))).real)

        out.append(F3i_I_eigs)
    return out
예제 #2
0
def F3mat00iso(E, L, Lista0, r0, P0, a2, alpha, IPV=0):
    F00 = Fmat00(E, L, alpha, IPV)
    F00o3 = 1. / 3 * F00
    Gt00 = Gmatrix.Gmat00(E, L)
    res = []
    ones = np.ones(len(F00))
    for a0 in Lista0:
        K2it00 = K2i_mat.K2inv_mat00(E, L, a0, r0, P0, IPV)
        Hi00 = chop(LAinv(K2it00 + F00 + Gt00))
        f3mat = 1 / L**3 * chop((F00o3 - F00 @ Hi00 @ F00))
        res.append(1. / (ones @ f3mat @ ones))
    return res
예제 #3
0
def K33Bmat(E, L, a0, a2):
    nnk_list = list_nnk(E, L)
    N = len(nnk_list)
    #print(nnk_list)
    #print(N)
    Gfull = []
    for p in range(N):
        nnp = list(nnk_list[p])
        Gp = []
        for k in range(N):
            nnk = list(nnk_list[k])

            Gpk = np.zeros((6, 6))
            for i1 in range(6):
                [l1, m1] = Gmatrix.lm_idx(i1)
                for i2 in range(6):
                    [l2, m2] = Gmatrix.lm_idx(i2)
                    Gpk[i1,
                        i2] = K33B.K3cubicB(E, 2 * math.pi / L * np.array(nnp),
                                            l1, m1,
                                            2 * math.pi / L * np.array(nnk),
                                            l2, m2)

            Gp.append(Gpk)

        Gfull.append(Gp)

    matrix = np.ones_like(chop(np.block(Gfull)))

    print(matrix.shape)

    return pr.irrep_proj(matrix, E, L, "A1")
예제 #4
0
def Gmat(E, L):
    nnk_list = list_nnk(E, L)
    N = len(nnk_list)
    #print(nnk_list)
    #print(N)
    Gfull = []
    for p in range(N):
        nnp = list(nnk_list[p])
        Gp = []
        for k in range(N):
            nnk = list(nnk_list[k])

            Gpk = np.zeros((6, 6))
            for i1 in range(6):
                [l1, m1] = lm_idx(i1)
                for i2 in range(6):
                    [l2, m2] = lm_idx(i2)

                    Gpk[i1, i2] = G(E, L, nnp, nnk, l1, m1, l2, m2)

            Gp.append(Gpk)

        Gfull.append(Gp)

    return chop(np.block(Gfull))
예제 #5
0
def F3i_iso_mat(E, L, a0, r0, P0, a2, alpha):
    F3_iso = F3_iso_mat(E, L, a0, r0, P0, a2, alpha)

    if F3_iso.shape == ():
        return 1 / F3_iso
    else:
        return chop(LA.inv(F3_iso))
예제 #6
0
def P_irrep_o_l(shell, l, I, lblock=False):
    nnk_list = defns.shell_nnk_list(shell)
    Lk = GT.little_group(shell)
    d_I = GT.irrep_dim(I)

    P_shell = []
    for k2 in nnk_list:
        R20 = GT.Rvec(k2, shell)
        P_k2 = []
        for k1 in nnk_list:
            R01 = GT.Rvec(shell, k1)

            P_block = np.zeros((6, 6))
            for R in Lk:
                RRR = GT.R_prod(R20, R, R01)
                if l == 0:
                    P_block[0, 0] += GT.chi(RRR, I)
                elif l == 2:
                    P_block[1:, 1:] += GT.chi(RRR, I) * GT.Dmat(RRR)[1:, 1:]
                    P_block = defns.chop(P_block)

            P_k2.append(P_block)
        P_shell.append(P_k2)

    out = d_I / 48 * np.block(P_shell)
    if lblock == True:
        if l == 0:
            return l0_proj(out)
        elif l == 2:
            return l2_proj(out)
    else:
        return out
예제 #7
0
def K3mat(E, L, K0, K1, K2, A, B, Ytype):
    nnk_list = list_nnk(E, L)
    N = len(nnk_list)

    K3full = []
    for p in range(N):
        pvec = [i * 2 * pi / L for i in nnk_list[p]]

        K3p = []
        for k in range(N):
            kvec = [i * 2 * pi / L for i in nnk_list[k]]

            K3pk = np.zeros((6, 6))
            for i1 in range(6):
                [lp, mp] = lm_idx(i1)
                for i2 in range(6):
                    [l, m] = lm_idx(i2)

                    K3pk[i1][i2] = K3quad(E, pvec, lp, mp, kvec, l, m, K0, K1,
                                          K2, A, B, Ytype)

            K3p.append(K3pk)

        K3full.append(K3p)

    return chop(np.block(K3full))
예제 #8
0
def F3i_A1_mat(E, L, a0, r0, P0, a2, alpha):
    F3_A1 = F3_A1_mat(E, L, a0, r0, P0, a2, alpha)

    if F3_A1.shape == ():
        return 1 / F3_A1
    else:
        return chop(LA.inv(F3_A1))
예제 #9
0
def F3i_I_mat(E, L, a0, r0, P0, a2, alpha, I):
    F3_I = F3_I_mat(E, L, a0, r0, P0, a2, alpha, I)

    if F3_I.shape == ():
        return 1 / F3_I
    else:
        return chop(LA.inv(F3_I))
예제 #10
0
def A1_little_group_sum(shell):
    Lk = GT.little_group(shell)
    Usum = np.zeros((6, 6))
    for R in Lk:
        Usum += GT.Dmat(R)
    Usum = defns.chop(Usum / len(Lk))
    return Usum
예제 #11
0
def Rmat(n, t):
    N = LA.norm(n)
    n = [i / N for i in n]
    n_sin = np.array([[0, -n[2], n[1]], [n[2], 0, -n[0]], [-n[1], n[0], 0]])

    return defns.chop(
        np.cos(t) * np.identity(3) + np.sin(t) * n_sin +
        (1 - np.cos(t)) * np.outer(n, n))
예제 #12
0
def F3i_A1_eigs_list(E_list, L, F3_list):
    out = []
    for i in range(len(E_list)):
        E = E_list[i]
        F3 = F3_list[i]

        #F3_A1 = proj.A1_proj_old(F3,E,L) # only works for 2 shells
        F3_A1 = proj.A1_proj(F3, E, L)  # works for all shells
        if F3_A1.shape == ():
            F3i_A1 = 1 / F3_A1
            F3i_A1_eigs = F3i_A1
        else:
            F3i_A1 = defns.chop(LA.inv(F3_A1))
            F3i_A1_eigs = defns.chop(np.array(sorted(LA.eigvals(F3i_A1))).real)

        out.append(F3i_A1_eigs)
    return out
예제 #13
0
def P_A1_subspace(E, L):
    P_A1 = P_A1_full(E, L)
    elist, vlist = LA.eig(P_A1)
    # eigenvalues should all be 0 or 1; only want 1's
    ivec = [i for i, e in enumerate(elist) if abs(e - 1) < 1e-13]
    if len(ivec) != int(round(np.trace(P_A1))):
        print('Error in P_A1_subspace: wrong subspace dimension')
    return defns.chop(vlist[:, ivec].real)
예제 #14
0
def F3i_I_eigs_o(E, L, a0, r0, P0, a2, alpha, I, shell):
    F3 = F3mat(E, L, a0, r0, P0, a2, alpha)

    F3_I_o = proj.irrep_proj_o(F3, E, L, I, shell)
    F3i_I_o = chop(LA.inv(F3_I_o))

    # F3i = chop(LA.inv(F3)) # temporary BLEH
    # F3i_I_o = proj.irrep_proj_o( F3i,E,L,I,shell ) # temporary BLEH
    return np.array(sorted(LA.eigvals(F3i_I_o))).real
예제 #15
0
def F3i_eigs_list(E_list, L, F3_list):
    out = []
    for i in range(len(E_list)):
        F3 = F3_list[i]

        F3i = defns.chop(LA.inv(F3))
        F3i_eigs = np.array(sorted(LA.eigvals(F3i))).real

        out.append(F3i_eigs)
    return out
예제 #16
0
def F3i_I_eigs_list_o(E_list, L, F3_list, I, shell):
    out = []
    for i in range(len(E_list)):
        E = E_list[i]
        F3 = F3_list[i]

        F3_I = proj.irrep_proj_o(F3, E, L, I, shell)  # works for all shells
        if F3_I.shape == ():
            F3i_I = 1 / F3_I
            F3i_I_eigs = F3i_I
        else:
            F3i_I = defns.chop(LA.inv(F3_I))
            F3i_I_eigs = defns.chop(np.array(sorted(LA.eigvals(F3i_I))).real)

        # F3i = defns.chop(LA.inv(F3)) # temporary BLEH
        # F3i_I = proj.irrep_proj_o(F3i,E,L,I,shell) # temporary BLEH
        # F3i_I_eigs = defns.chop(np.array(sorted(LA.eigvals(F3i_I))).real) # temporary BLEH

        out.append(F3i_I_eigs)
    return out
예제 #17
0
def P_irrep_subspace_o_l(E, L, I, shell, l, lblock=False):

    P_block_list = []
    for nk in defns.shell_list(E, L):
        if list(nk) == list(shell):
            P_block_list.append(P_irrep_o_l(shell, l, I, lblock))
        else:
            P_block_list.append(np.zeros(P_irrep_o_l(nk, l, I, lblock).shape))

    P_I = block_diag(*P_block_list)

    elist, vlist = LA.eig(P_I)
    # eigenvalues should all be 0 or 1; only want 1's
    ivec = [i for i, e in enumerate(elist) if abs(e - 1) < 1e-13]
    if len(ivec) != int(round(np.trace(P_I))):
        print('Error in P_irrep_subspace: wrong subspace dimension')
    Psub = defns.chop(vlist[:, ivec].real)
    if ivec == []:
        return Psub
    else:
        return defns.chop(LA.qr(Psub)[0])
예제 #18
0
def F3i_22_I_eigs_list(E_list, L, F3_22_list, I, flip=False):
    out = []
    for i in range(len(E_list)):
        E = E_list[i]
        F3 = F3_22_list[i]

        if flip == False:  # project before inverting F3
            F3_I = proj.irrep_proj_22(F3, E, L, I)  # works for all shells
            if F3_I.shape == ():
                F3i_I = 1 / F3_I
                F3i_I_eigs = F3i_I
            else:
                F3i_I = defns.chop(LA.inv(F3_I))

        elif flip == True:  # invert F3 before projecting
            F3i = defns.chop(LA.inv(F3))
            F3i_I = proj.irrep_proj_22(F3i, E, L, I)

        F3i_I_eigs = defns.chop(np.array(sorted(LA.eigvals(F3i_I))).real)

        out.append(F3i_I_eigs)
    return out
예제 #19
0
def Gmat00(E, L):
    nnk_list = list_nnk(E, L)
    N = len(nnk_list)

    Gfull = np.zeros((N, N))
    for p in range(N):
        nnp = list(nnk_list[p])
        for k in range(N):
            nnk = list(nnk_list[k])

            Gfull[p][k] = G(E, L, nnp, nnk, 0, 0, 0, 0)

    return chop(Gfull)
예제 #20
0
def F3_iso_fast(E, L, a0, r0, P0, a2, alpha):
    Ft00_A1 = Fmat00_A1(E, L, alpha)
    Gt00_A1 = Gmatrix.Gmat00_A1(E, L)
    K2it00_A1 = K2i_mat.K2inv_mat00_A1(E, L, a0, r0, P0)

    Hi_00_A1 = chop(LA.inv(K2it00_A1 + Ft00_A1 + Gt00_A1))
    F3_00_A1 = 1 / L**3 * (1 / 3 * Ft00_A1 - Ft00_A1 @ Hi_00_A1 @ Ft00_A1)

    shells = shell_list(E, L)
    F3_iso = 0
    for ip in range(len(shells)):
        for ik in range(len(shells)):
            F3_iso += F3_00_A1[ip, ik] * sqrt(
                len(shell_nnk_list(shells[ip])) *
                len(shell_nnk_list(shells[ik])))
    return F3_iso
예제 #21
0
def F3i_iso_eigs_list_bad(E_list, L, F3_list):
    out = []
    for i in range(len(E_list)):
        E = E_list[i]
        F3 = F3_list[i]

        F3_iso = proj.iso_proj_bad(F3, E, L)
        if F3_iso.shape == ():
            F3i_iso = 1 / F3_iso
            F3i_iso_eigs = F3i_iso
        else:
            F3i_iso = defns.chop(LA.inv(F3_iso))
            F3i_iso_eigs = np.array(sorted(LA.eigvals(F3i_iso))).real

        out.append(F3i_iso_eigs)
    return out
예제 #22
0
def Gmat00(E, L):
    nnk_list = list_nnk(E, L)
    N = len(nnk_list)
    #  print(nnk_list)
    #  print(list(nnk_list[0]))

    Gfull = np.zeros((N, N))
    for p in range(N):
        #    nnp = list(nnk_list[p])
        nnp = nnk_list[p]
        for k in range(N):
            #      nnk = list(nnk_list[k])
            nnk = nnk_list[k]
            Gfull[p, k] = G(E, L, np.array(nnp), np.array(nnk), 0, 0, 0, 0)

    return chop(Gfull)
예제 #23
0
def Gmat22(E, L):
    nnk_list = list_nnk(E, L)
    N = len(nnk_list)

    Gfull = []
    for p in range(N):
        nnp = list(nnk_list[p])
        Gp = []
        for k in range(N):
            nnk = list(nnk_list[k])

            Gpk = np.zeros((5, 5))
            for mp in range(-2, 3):
                for m in range(-2, 3):
                    Gpk[mp, m] = G(E, L, nnp, nnk, 2, mp, 2, m)
            Gp.append(Gpk)
        Gfull.append(Gp)
    return chop(np.block(Gfull))
예제 #24
0
def Gmat22(E, L):
    nnk_list = list_nnk(E, L)
    N = len(nnk_list)

    Gfull = []
    for p in range(N):
        nnp = list(nnk_list[p])
        Gp = []
        for k in range(N):
            nnk = list(nnk_list[k])

            Gpk = np.zeros((5, 5))
            for i in range(5):
                for j in range(5):
                    mp = i - 2
                    m = j - 2
                    Gpk[i, j] = G(E, L, nnp, nnk, 2, mp, 2, m)
            Gp.append(Gpk)
        Gfull.append(Gp)
    return chop(np.block(Gfull))
예제 #25
0
def Gmat00_A1(E, L):
    shells = shell_list(E, L)
    Nshells = len(shells)

    out = np.zeros((Nshells, Nshells))
    # Each row/column corresponds to a different shell
    for ip in range(Nshells):
        op = shell_nnk_list(
            shells[ip])  # list of nnp's in shell op (index = ip)
        for ik in range(ip, Nshells):
            ok = shell_nnk_list(
                shells[ik])  # list of nnk's in shell ok (index = ik)

            # Sum over G(p,k) for p in op & k in ok (part of A1+ projection)
            for nnp in op:
                for nnk in ok:
                    out[ip, ik] += G(E, L, nnp, nnk, 0, 0, 0, 0)
            out[ip,
                ik] *= 1 / npsqrt(len(op) * len(ok))  # normalization factor

            if ip != ik:
                out[ik, ip] = out[ip, ik]  # take advantage of symmetry

    return chop(out)
예제 #26
0
def F3imat22(E, L, a0, r0, P0, a2, alpha):
    return chop(LA.inv(F3mat22(E, L, a0, r0, P0, a2, alpha)))
예제 #27
0
def F3mat22(E, L, a0, r0, P0, a2, alpha):
    F22 = Fmat22(E, L, alpha)
    Hi22 = chop(LA.inv(Hmat22(E, L, a2, alpha)))
    return 1 / L**3 * chop((1 / 3 * F22 - F22 @ Hi22 @ F22))
예제 #28
0
def F3imat00(E, L, a0, r0, P0, a2, alpha, IPV=0):
    return chop(LA.inv(F3mat00(E, L, a0, r0, P0, a2, alpha, IPV)))
예제 #29
0
def F3mat00(E, L, a0, r0, P0, a2, alpha, IPV=0):
    F00 = Fmat00(E, L, alpha, IPV)
    Gt00 = Gmatrix.Gmat00(E, L)
    K2it00 = K2i_mat.K2inv_mat00(E, L, a0, r0, P0, IPV)
    Hi00 = chop(LA.inv(K2it00 + F00 + Gt00))
    return 1 / L**3 * chop((1 / 3 * F00 - F00 @ Hi00 @ F00))
예제 #30
0
def F3mat(E, L, a0, r0, P0, a2, alpha):
    F = Fmat(E, L, alpha)
    Hi = chop(LA.inv(Hmat(E, L, a0, r0, P0, a2, alpha)))
    return 1 / L**3 * chop((1 / 3 * F - F @ Hi @ F))