|
|
import numpy as np |
|
|
import psi_solve2.functions as f |
|
|
import sys |
|
|
|
|
|
|
|
|
try: |
|
|
from qmsolve import Hamiltonian, SingleParticle, init_visualization |
|
|
except ImportError: |
|
|
print("Error: qmsolve not found. Please install it via 'pip install qmsolve'") |
|
|
sys.exit(1) |
|
|
|
|
|
def run_comparison(): |
|
|
with open("comparison_log.txt", "w") as log_file: |
|
|
sys.stdout = log_file |
|
|
print("========================================") |
|
|
print("CROSS-VERIFICATION: PSI_SOLVE2 vs QMSOLVE") |
|
|
print("========================================") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print("\n[TEST CASE] Double Well Potential") |
|
|
|
|
|
|
|
|
L = 10.0 |
|
|
N = 512 |
|
|
depth = 2.0 |
|
|
separation = 1.0 |
|
|
center = 0.0 |
|
|
m_particle = 1.0 |
|
|
|
|
|
print(f"Parameters: L={L}, N={N}, depth={depth}, separation={separation}, m={m_particle}") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print("\n--- Running psi_solve2 ---") |
|
|
x_full, dx, x_internal = f.make_grid(L=L, N=N) |
|
|
|
|
|
|
|
|
|
|
|
V_internal = f.V_double_well(x_internal, depth=depth, separation=separation, center=center) |
|
|
|
|
|
|
|
|
V_full = np.zeros_like(x_full) |
|
|
V_full[1:-1] = V_internal |
|
|
V_full[0] = 1e10 |
|
|
V_full[-1] = 1e10 |
|
|
|
|
|
T = f.kinetic_operator(N, dx, m=m_particle) |
|
|
E_psi, psi_psi = f.solve(T, V_full, dx) |
|
|
|
|
|
print(f"psi_solve2 Energies (first 5): {E_psi[:5]}") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print("\n--- Running QMSolve ---") |
|
|
|
|
|
|
|
|
def double_well(particle): |
|
|
x = particle.x |
|
|
return depth * ( (x - center)**2 - separation )**2 |
|
|
|
|
|
|
|
|
H = Hamiltonian(particles = SingleParticle(m = m_particle), |
|
|
potential = double_well, |
|
|
spatial_ndim = 1, N = N, extent = L) |
|
|
|
|
|
|
|
|
eigenstates = H.solve(max_states = 10) |
|
|
E_qm_eV = eigenstates.energies |
|
|
|
|
|
|
|
|
|
|
|
Hartree_to_eV = 27.211386 |
|
|
E_qm = E_qm_eV / Hartree_to_eV |
|
|
|
|
|
print(f"QMSolve Energies (eV): {E_qm_eV[:5]}") |
|
|
print(f"QMSolve Energies (Hartree): {E_qm[:5]}") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print("\n--- Comparison Results ---") |
|
|
print("-" * 65) |
|
|
print(f"| n | psi_solve2 E | QMSolve E | Diff | % Diff |") |
|
|
print("-" * 65) |
|
|
|
|
|
for i in range(5): |
|
|
e1 = E_psi[i] |
|
|
e2 = E_qm[i] |
|
|
diff = abs(e1 - e2) |
|
|
p_diff = (diff / e2) * 100 if e2 != 0 else 0.0 |
|
|
|
|
|
print(f"| {i:<1} | {e1:<12.6f} | {e2:<12.6f} | {diff:<12.2e} | {p_diff:<7.4f}% |") |
|
|
print("-" * 65) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print("\n[DEBUG CASE] Harmonic Oscillator (k=1)") |
|
|
k_debug = 1.0 |
|
|
|
|
|
|
|
|
V_internal_HO = 0.5 * k_debug * x_internal**2 |
|
|
V_full_HO = np.zeros_like(x_full) |
|
|
V_full_HO[1:-1] = V_internal_HO |
|
|
V_full_HO[0] = 1e10 |
|
|
V_full_HO[-1] = 1e10 |
|
|
|
|
|
E_psi_HO, _ = f.solve(T, V_full_HO, dx) |
|
|
print(f"psi_solve2 HO Energies: {E_psi_HO[:5]}") |
|
|
|
|
|
|
|
|
def harmonic_potential(particle): |
|
|
return 0.5 * k_debug * particle.x**2 |
|
|
|
|
|
H_HO = Hamiltonian(particles = SingleParticle(m = m_particle), |
|
|
potential = harmonic_potential, |
|
|
spatial_ndim = 1, N = N, extent = L) |
|
|
eigenstates_HO = H_HO.solve(max_states = 10) |
|
|
E_qm_HO = eigenstates_HO.energies |
|
|
print(f"QMSolve HO Energies: {E_qm_HO[:5]}") |
|
|
|
|
|
sys.stdout = sys.__stdout__ |
|
|
|
|
|
if __name__ == "__main__": |
|
|
run_comparison() |
|
|
|