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
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
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")
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))
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))
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
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))
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))
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))
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
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))
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
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)
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
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
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
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])
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
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)
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
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
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)
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))
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))
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)
def F3imat22(E, L, a0, r0, P0, a2, alpha): return chop(LA.inv(F3mat22(E, L, a0, r0, P0, a2, alpha)))
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))
def F3imat00(E, L, a0, r0, P0, a2, alpha, IPV=0): return chop(LA.inv(F3mat00(E, L, a0, r0, P0, a2, alpha, IPV)))
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))
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))