Path: blob/main/chemistry-simulations/aux_files/qmmm/qchem/PEoperator.py
1165 views
import numpy as np1from aux_files.qmmm.qchem.hamiltonian import jordan_wigner_pe2from functools import reduce3from aux_files.qmmm.qchem.cppe_lib import PolEmbed456def generate_pe_spin_ham_restricted(v_pe):78# Total number of qubits equals the number of spin molecular orbitals9nqubits = 2 * v_pe.shape[0]1011# Initialization12spin_pe_op = np.zeros((nqubits, nqubits))1314for p in range(nqubits // 2):15for q in range(nqubits // 2):1617# p & q have the same spin <a|a>= <b|b>=118# <a|b>=<b|a>=0 (orthogonal)19spin_pe_op[2 * p, 2 * q] = v_pe[p, q]20spin_pe_op[2 * p + 1, 2 * q + 1] = v_pe[p, q]2122return spin_pe_op232425def pe_operator(dm, mol, mo_coeff, potential, elec_only=False, tolerance=1e-12):2627# `dm` are in atomic orbitals28mype = PolEmbed(mol, potential)29E_pe, V_pe, V_es, V_ind = mype.get_pe_contribution(dm, elec_only)3031#convert from `ao` to `mo`32V_pe_mo = reduce(np.dot, (mo_coeff.T, V_pe, mo_coeff))3334obi_pe = generate_pe_spin_ham_restricted(V_pe_mo)35spin_pe_ham = jordan_wigner_pe(obi_pe, tolerance)3637return spin_pe_ham, E_pe, V_pe_mo383940def pe_operator_as(dm,41mol,42mo_coeff,43potential,44mc,45elec_only=False,46tolerance=1e-12):4748# `dm` is in atomic orbitals49mype = PolEmbed(mol, potential)50E_pe, V_pe, V_es, V_ind = mype.get_pe_contribution(dm, elec_only)51#convert from `ao` to `mo`52V_pe_mo = reduce(np.dot, (mo_coeff.T, V_pe, mo_coeff))53V_pe_cas = V_pe_mo[mc.ncore:mc.ncore + mc.ncas, mc.ncore:mc.ncore + mc.ncas]5455obi_pe = generate_pe_spin_ham_restricted(V_pe_cas)56spin_pe_ham = jordan_wigner_pe(obi_pe, tolerance)5758return spin_pe_ham, E_pe, V_pe, V_pe_cas596061