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)