Source code for wavefunction_analysis.utils.chiral_geom

from wavefunction_analysis import sys, np
from wavefunction_analysis.utils import print_matrix
from wavefunction_analysis.utils.sec_mole import read_symbols_coords, write_symbols_coords

[docs] def swap_atoms_coords(coords, atoms_idx): """ change two atoms a, b positions from the center atom c """ a, c, b = atoms_idx va, vb = coords[a]-coords[c], coords[b]-coords[c] da, db = np.linalg.norm(va), np.linalg.norm(vb) # change a and b coords and scale by the distances coords[a], coords[b] = (da/db)* coords[b], (db/da)* coords[a] return coords
[docs] def spin_square_biortho(mf): mo_coeff = mf.mo_coeff mo_occ = mf.mo_occ ovlp = mf.get_ovlp() moa, mob = mo_coeff[0][:, mo_occ[0]>0], mo_coeff[1][:, mo_occ[1]>0] s = np.einsum('mi,mn,nj->ij', moa, ovlp, mob) u, s, vt = np.linalg.svd(s) print_matrix('s:', s) moa, mob = np.einsum('mi,ik->mk', moa, u), np.einsum('mi,ki->mk', mob, vt) return mf.spin_square([moa, mob], ovlp)
[docs] def run_gtensor(symbols, coords, charge=1, spin=1, functional='hf', basis='3-21g'): from pyscf import gto, scf from pyscf.prop import gtensor from wavefunction_analysis.utils.pyscf_parser import build_atom atom = build_atom(symbols, coords) mol = gto.M( atom = atom, basis = basis, charge = charge, spin = spin, ) mf = scf.UKS(mol) mf.xc = functional mf.kernel() gobj = gtensor.UKS(mf) gobj.para_soc2e = None gobj.dia_soc2e = None gobj.so_eff_charge = False gmat = gobj.kernel() print('gmat:\n', gmat) return mf, gobj
if __name__ == '__main__': charge = 1 spin = 1 functional = 'hf' xyzfile = sys.argv[1] symbols, coords = read_symbols_coords(xyzfile) write_symbols_coords('stdout', symbols, coords) mf, gobj = run_gtensor(symbols, coords, charge, spin, functional) s2, s2p1 = spin_square_biortho(mf) print('s2, s2p1:', s2, s2p1) print('') atoms_idx = [2, 0, 3] coords = swap_atoms_coords(coords, atoms_idx) write_symbols_coords('stdout', symbols, coords) mf, gobj = run_gtensor(symbols, coords, charge, spin, functional)