Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 31 additions & 23 deletions examples/packages/pyscf/test_casscf.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,43 +29,51 @@
# else:
# raise RuntimeError("Could not locate src/ directory on path for libra_py import")

from pyscf import gto
from libra_py.packages.pyscf.implementations.casscf import CASSCF
from libra_py.packages.pyscf.interfaces import ElectronicStructureStrategy, MolecularGeometry
import numpy as np

geom1 = MolecularGeometry(atom_labels=['He', 'H'], coords_angstrom=np.array([[0.0,0.0,0.0],[0.0,0.0,0.7746]]))
geom2 = MolecularGeometry(atom_labels=['He', 'H'], coords_angstrom=np.array([[0.0,0.0,0.0],[0.0,0.0,1.0]]))
NTRAJ = 2
NSTATES = 3
GRAD_ROOT = 2

geom_step0 = [
MolecularGeometry(atom_labels=['He', 'H'], coords_angstrom=np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 0.7746]])),
MolecularGeometry(atom_labels=['He', 'H'], coords_angstrom=np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 0.9000]])),
]

geom_step1 = [
MolecularGeometry(atom_labels=['He', 'H'], coords_angstrom=np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 1.0000]])),
MolecularGeometry(atom_labels=['He', 'H'], coords_angstrom=np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 1.1000]])),
]

# instantiate the CASSCF strategy class with parameters for the test
casscf = CASSCF(norbcas=2, nelecas=2, nroots=3, basis='sto-3g', charge=1)
casscf = CASSCF(norbcas=2, nelecas=2, nroots=NSTATES, basis='sto-3g', charge=1, ntraj=NTRAJ)

# wrap geometry set and HF in set_geom_and_run_hf method
casscf.set_geom_and_run_hf(geom1)
for traj_id, geom in enumerate(geom_step0):
# First geometry for each trajectory initializes that trajectory's state slot.
casscf.set_geom_and_run_hf(geom, traj_id=traj_id)

# 2) energy for root 0,1,2
energies1 = [casscf.compute_energy(root) for root in range(3)]
print('Energies at geom1', energies1)
energies = [casscf.compute_energy(root, traj_id=traj_id) for root in range(NSTATES)]
print(f'Trajectory {traj_id} energies at step 0', energies)

# 3) gradient for root 2
grad1 = casscf.compute_gradient(2)
print('Gradient root 2 geom1', grad1)
grad = casscf.compute_gradient(GRAD_ROOT, traj_id=traj_id)
print(f'Trajectory {traj_id} gradient root {GRAD_ROOT} at step 0', grad)

# 4) set mol2 geometry and run HF
casscf.set_geom_and_run_hf(geom2)
for traj_id, geom in enumerate(geom_step1):
# Second geometry reuses only this trajectory's previous CASSCF/HF state.
casscf.set_geom_and_run_hf(geom, traj_id=traj_id)

# 5) energy for root 0,1,2
energies2 = [casscf.compute_energy(root) for root in range(3)]
print('Energies at geom2', energies2)
energies = [casscf.compute_energy(root, traj_id=traj_id) for root in range(NSTATES)]
print(f'Trajectory {traj_id} energies at step 1', energies)

# 6) gradient for root 2
grad2 = casscf.compute_gradient(2)
print('Gradient root 2 geom2', grad2)
grad = casscf.compute_gradient(GRAD_ROOT, traj_id=traj_id)
print(f'Trajectory {traj_id} gradient root {GRAD_ROOT} at step 1', grad)

# 7) time-overlap matrix for 3 roots
overlap = casscf.time_overlap_matrix(3)
print('Time-overlap matrix', overlap)
overlap = casscf.time_overlap_matrix(NSTATES, traj_id=traj_id)
print(f'Trajectory {traj_id} time-overlap matrix', overlap)

assert overlap.shape == (NSTATES, NSTATES)

assert isinstance(casscf, ElectronicStructureStrategy)
assert casscf.ntraj == NTRAJ
7 changes: 4 additions & 3 deletions examples/packages/pyscf/test_casscf_nacv.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@
# from libra_py.packages.pyscf.interfaces import ElectronicStructureStrategy, MolecularGeometry

NSTATES = 2
DISTANCE_START_BOHR = 7.0
DISTANCE_START_BOHR = 7.5
DISTANCE_STOP_BOHR = 15.0
DISTANCE_STEP_BOHR = 1.0
DISTANCE_STEP_BOHR = 0.25

basis_dict = {'Li': 'sto-3g', 'F': '6-311+g*'}
cas_list = [4, 7, 11, 14, 17]# 0-indexed: 3 (F2pz), 6 (Li2s), 10 (F5pz), 13 (F5s), 16 (F4pz)
Expand All @@ -60,7 +60,8 @@
basis=basis_dict,
unit='Bohr',
charge=0,
cas_list=cas_list
cas_list=cas_list,
use_prev_ci=True,
)

for step, d in enumerate(distances):
Expand Down
49 changes: 33 additions & 16 deletions examples/packages/pyscf/test_cisd.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,30 +33,47 @@
from libra_py.packages.pyscf.interfaces import ElectronicStructureStrategy, MolecularGeometry
import numpy as np

geom1 = MolecularGeometry(atom_labels=['He', 'H'], coords_angstrom=np.array([[0.0,0.0,0.0],[0.0,0.0,0.7746]]))
geom2 = MolecularGeometry(atom_labels=['He', 'H'], coords_angstrom=np.array([[0.0,0.0,0.0],[0.0,0.0,1.0]]))
NTRAJ = 2
NSTATES = 3
GRAD_ROOT = 2

cisd = CISD(nroots=3, basis='sto-3g', charge=1)
geom_step0 = [
MolecularGeometry(atom_labels=['He', 'H'], coords_angstrom=np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 0.7746]])),
MolecularGeometry(atom_labels=['He', 'H'], coords_angstrom=np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 0.9000]])),
]

cisd.set_geom_and_run_hf(geom1)
energies1 = [cisd.compute_energy(root) for root in range(3)]
print('Energies at geom1', energies1)
geom_step1 = [
MolecularGeometry(atom_labels=['He', 'H'], coords_angstrom=np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 1.0000]])),
MolecularGeometry(atom_labels=['He', 'H'], coords_angstrom=np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 1.1000]])),
]

grad1 = cisd.compute_gradient(2)
print('Gradient root 2 geom1', grad1)
cisd = CISD(nroots=NSTATES, basis='sto-3g', charge=1, ntraj=NTRAJ)

cisd.set_geom_and_run_hf(geom2)
energies2 = [cisd.compute_energy(root) for root in range(3)]
print('Energies at geom2', energies2)
for traj_id, geom in enumerate(geom_step0):
cisd.set_geom_and_run_hf(geom, traj_id=traj_id)

grad2 = cisd.compute_gradient(2)
print('Gradient root 2 geom2', grad2)
energies = [cisd.compute_energy(root, traj_id=traj_id) for root in range(NSTATES)]
print(f'Trajectory {traj_id} energies at step 0', energies)

overlap = cisd.time_overlap_matrix(3)
print('Time-overlap matrix', overlap)
grad = cisd.compute_gradient(GRAD_ROOT, traj_id=traj_id)
print(f'Trajectory {traj_id} gradient root {GRAD_ROOT} at step 0', grad)

for traj_id, geom in enumerate(geom_step1):
cisd.set_geom_and_run_hf(geom, traj_id=traj_id)

energies = [cisd.compute_energy(root, traj_id=traj_id) for root in range(NSTATES)]
print(f'Trajectory {traj_id} energies at step 1', energies)

grad = cisd.compute_gradient(GRAD_ROOT, traj_id=traj_id)
print(f'Trajectory {traj_id} gradient root {GRAD_ROOT} at step 1', grad)

overlap = cisd.time_overlap_matrix(NSTATES, traj_id=traj_id)
print(f'Trajectory {traj_id} time-overlap matrix', overlap)

assert overlap.shape == (NSTATES, NSTATES)

assert isinstance(cisd, ElectronicStructureStrategy)
assert overlap.shape == (3,3)
assert cisd.ntraj == NTRAJ

#if __name__ == "__main__":
# pass
Loading