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 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 P_A1_o_naive(shell): Nk = len(defns.shell_nnk_list(shell)) P_shell = np.zeros((6 * Nk, 6 * Nk)) for R in GT.Oh_list(): P_shell += np.kron(GT.Smat(R, shell).T, GT.Dmat(R)) P_shell = P_shell / 48 return P_shell
def P_A1_o(shell): shell = list(shell) No = len(defns.shell_nnk_list(shell)) one_mat = np.ones((No, No)) / No Pk = A1_little_group_sum(shell) U_block_list = [] for p in defns.shell_nnk_list(shell): p = list(p) U_block_list.append(GT.Dmat(GT.Rvec(p, shell))) U = block_diag(*U_block_list) return U @ np.kron(one_mat, Pk) @ U.T