mirror of
https://github.com/pfloos/quack
synced 2025-01-03 01:55:57 +01:00
saving
This commit is contained in:
parent
8d7fb2a292
commit
9aebbe74f0
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,2 +1,5 @@
|
|||||||
*.o
|
*.o
|
||||||
*.
|
*.
|
||||||
|
__pycache__
|
||||||
|
|
||||||
|
.ninja_deps
|
||||||
|
6
tests/.gitignore
vendored
Normal file
6
tests/.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
FeatherBench.db
|
||||||
|
FeatherBench.json
|
||||||
|
|
||||||
|
*.xyz
|
||||||
|
|
@ -4,21 +4,21 @@ import sqlite3
|
|||||||
from molecule import save_molecules_to_json, load_molecules_from_json
|
from molecule import save_molecules_to_json, load_molecules_from_json
|
||||||
from molecule import create_database, add_molecule_to_db
|
from molecule import create_database, add_molecule_to_db
|
||||||
|
|
||||||
from swift_set import swiftset
|
from feather_bench import FeatherBench
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Save molecules to JSON
|
# Save molecules to JSON
|
||||||
save_molecules_to_json(swiftset, 'swiftset.json')
|
save_molecules_to_json(FeatherBench, 'FeatherBench.json')
|
||||||
|
|
||||||
# Load molecules from JSON
|
# Load molecules from JSON
|
||||||
loaded_molecules = load_molecules_from_json('swiftset.json')
|
loaded_molecules = load_molecules_from_json('FeatherBench.json')
|
||||||
print(loaded_molecules)
|
print(loaded_molecules)
|
||||||
|
|
||||||
# Create a database and add molecules
|
# Create a database and add molecules
|
||||||
db_name = 'swiftset.db'
|
db_name = 'FeatherBench.db'
|
||||||
create_database(db_name)
|
create_database(db_name)
|
||||||
for molecule in swiftset:
|
for molecule in FeatherBench:
|
||||||
add_molecule_to_db(db_name, molecule)
|
add_molecule_to_db(db_name, molecule)
|
||||||
|
|
||||||
|
|
||||||
|
93
tests/feather_bench.py
Normal file
93
tests/feather_bench.py
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
|
||||||
|
from molecule import Molecule
|
||||||
|
|
||||||
|
|
||||||
|
He = Molecule(
|
||||||
|
name="He",
|
||||||
|
multiplicity=1,
|
||||||
|
geometry=[
|
||||||
|
{"element": "He", "x": 0.0, "y": 0.0, "z": 0.0}
|
||||||
|
],
|
||||||
|
properties={
|
||||||
|
"properties_rhf":{
|
||||||
|
"6-31g": {
|
||||||
|
"RHF energy": -2.855160426884076,
|
||||||
|
"RHF HOMO energy": -0.914126628614305,
|
||||||
|
"RHF LUMO energy": 1.399859335225087,
|
||||||
|
"RHF dipole moment": 0.000000000000000,
|
||||||
|
"RMP2 correlation energy": -0.011200122910187,
|
||||||
|
"CCD correlation energy": -0.014985063408247,
|
||||||
|
"DCD correlation energy": -0.014985062907429,
|
||||||
|
"CCSD correlation energy": -0.015001711549550,
|
||||||
|
"drCCD correlation energy": -0.018845374502248,
|
||||||
|
"rCCD correlation energy": -0.016836324636164,
|
||||||
|
"crCCD correlation energy": 0.008524677369855,
|
||||||
|
"lCCD correlation energy": -0.008082420815100,
|
||||||
|
"pCCD correlation energy": -0.014985062519068,
|
||||||
|
"RCIS singlet excitation energy": 1.911193619935257,
|
||||||
|
"RCIS triplet excitation energy": 1.455852629402236,
|
||||||
|
"phRRPA correlation energy": -0.018845374129105,
|
||||||
|
"phRRPAx correlation energy": -0.015760565121283,
|
||||||
|
"crRRPA correlation energy": -0.008868581132405,
|
||||||
|
"ppRRPA correlation energy": -0.008082420815100,
|
||||||
|
"RG0F2 correlation energy": -0.011438430540374,
|
||||||
|
"RG0F2 HOMO energy": -0.882696116247871,
|
||||||
|
"RG0F2 LUMO energy": 1.383080391811630,
|
||||||
|
"evRGF2 correlation energy": -0.011448483158486,
|
||||||
|
"evRGF2 HOMO energy": -0.881327878713477,
|
||||||
|
"evRGF2 LUMO energy": 1.382458968133448,
|
||||||
|
"RG0W0 correlation energy": -0.019314094399756,
|
||||||
|
"RG0W0 HOMO energy": -0.870533880190454,
|
||||||
|
"RG0W0 LUMO energy": 1.377171287010956,
|
||||||
|
"evRGW correlation energy": -0.019335511771724,
|
||||||
|
"evRGW HOMO energy": -0.868460640957913,
|
||||||
|
"evRGW LUMO energy": 1.376287581471769,
|
||||||
|
"RG0T0pp correlation energy": -0.008082420815100,
|
||||||
|
"RG0T0pp HOMO energy": -0.914126628614305,
|
||||||
|
"RG0T0pp LUMO energy": 1.399859335225087,
|
||||||
|
"evRGTpp correlation energy": -0.008082420815100,
|
||||||
|
"evRGTpp HOMO energy": -0.914126628614305,
|
||||||
|
"evRGTpp LUMO energy": 1.399859335225087
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties_uhf":{
|
||||||
|
"6-31g": {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties_ghf":{
|
||||||
|
"6-31g": {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties_rohf":{
|
||||||
|
"6-31g": {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# ---
|
||||||
|
|
||||||
|
#H2O = Molecule(
|
||||||
|
# name="H2O",
|
||||||
|
# multiplicity=1,
|
||||||
|
# geometry=[
|
||||||
|
# {"element": "O", "x": 0.0000, "y": 0.0000, "z": 0.0000},
|
||||||
|
# {"element": "H", "x": 0.7571, "y": 0.0000, "z": 0.5861},
|
||||||
|
# {"element": "H", "x": -0.7571, "y": 0.0000, "z": 0.5861}
|
||||||
|
# ],
|
||||||
|
# properties={
|
||||||
|
# "cc-pvdz": {
|
||||||
|
# }
|
||||||
|
#)
|
||||||
|
|
||||||
|
# ---
|
||||||
|
|
||||||
|
FeatherBench = [
|
||||||
|
He,
|
||||||
|
#H2O
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
18
tests/inp/options.RHF
Normal file
18
tests/inp/options.RHF
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# HF: maxSCF thresh DIIS guess mix shift stab search
|
||||||
|
10000 0.0000001 5 1 0.0 0.0 F F
|
||||||
|
# MP: reg
|
||||||
|
F
|
||||||
|
# CC: maxSCF thresh DIIS
|
||||||
|
64 0.0000001 5
|
||||||
|
# spin: TDA singlet triplet
|
||||||
|
F T T
|
||||||
|
# GF: maxSCF thresh DIIS lin eta renorm reg
|
||||||
|
256 0.00001 5 F 0.0 0 F
|
||||||
|
# GW: maxSCF thresh DIIS lin eta TDA_W reg
|
||||||
|
256 0.00001 5 F 0.0 F F
|
||||||
|
# GT: maxSCF thresh DIIS lin eta TDA_T reg
|
||||||
|
256 0.00001 5 F 0.0 F F
|
||||||
|
# ACFDT: AC Kx XBS
|
||||||
|
F F T
|
||||||
|
# BSE: phBSE phBSE2 ppBSE dBSE dTDA
|
||||||
|
F F F F T
|
205
tests/lunch_bench.py
Normal file
205
tests/lunch_bench.py
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
from pathlib import Path
|
||||||
|
import subprocess
|
||||||
|
import platform
|
||||||
|
from datetime import datetime
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
from molecule import get_molecules_from_db
|
||||||
|
from molecule import generate_xyz
|
||||||
|
from utils import print_col
|
||||||
|
|
||||||
|
|
||||||
|
current_date = datetime.now()
|
||||||
|
|
||||||
|
quack_root = os.getenv('QUACK_ROOT')
|
||||||
|
|
||||||
|
# User Name
|
||||||
|
user_name = os.getlogin()
|
||||||
|
|
||||||
|
# Operating System
|
||||||
|
os_name = platform.system()
|
||||||
|
os_release = platform.release()
|
||||||
|
os_version = platform.version()
|
||||||
|
|
||||||
|
# CPU Information
|
||||||
|
machine = platform.machine()
|
||||||
|
processor = platform.processor()
|
||||||
|
|
||||||
|
# System Architecture
|
||||||
|
architecture = platform.architecture()[0]
|
||||||
|
|
||||||
|
# Python Version
|
||||||
|
python_version_full = platform.python_version_tuple()
|
||||||
|
PYTHON_VERSION = "{}.{}".format(python_version_full[0], python_version_full[1])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print(f"The current date and time is {current_date.strftime('%Y-%m-%d %H:%M:%S')}")
|
||||||
|
print(f"User Name: {user_name}")
|
||||||
|
print(f"Operating System: {os_name} {os_release} ({os_version})")
|
||||||
|
print(f"CPU: {processor} ({machine})")
|
||||||
|
print(f"System Architecture: {architecture}")
|
||||||
|
print(f"QUACK_ROOT: {quack_root}")
|
||||||
|
print(f"Python version: {python_version_full}\n\n")
|
||||||
|
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description="Benchmark Data Sets")
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-s', '--set_type',
|
||||||
|
choices=['light', 'medium', 'heavy'],
|
||||||
|
default='light',
|
||||||
|
help="Specify the type of data set: light (default), medium, or heavy."
|
||||||
|
)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if args.set_type == 'light':
|
||||||
|
bench = 'FeatherBench'
|
||||||
|
bench_title = "\n\nSelected Light Benchmark: {}\n\n".format(bench)
|
||||||
|
elif args.set_type == 'medium':
|
||||||
|
bench = 'BalanceBench'
|
||||||
|
bench_title = "\n\nSelected Medium Benchmark: {}\n\n".format(bench)
|
||||||
|
elif args.set_type == 'heavy':
|
||||||
|
bench = 'TitanBench'
|
||||||
|
bench_title = "\n\nSelected Heavy Benchmark: {}\n\n".format(bench)
|
||||||
|
else:
|
||||||
|
bench_title = "\n\nSelected Light Benchmark: {}\n\n".format(bench)
|
||||||
|
|
||||||
|
print(bench_title.center(150, '-'))
|
||||||
|
print("\n\n")
|
||||||
|
|
||||||
|
# ---
|
||||||
|
|
||||||
|
class Quack_Job:
|
||||||
|
|
||||||
|
def __init__(self, mol, multip, basis, geom, methd):
|
||||||
|
self.mol = mol
|
||||||
|
self.multip = multip
|
||||||
|
self.basis = basis
|
||||||
|
self.geom = geom
|
||||||
|
self.methd = methd
|
||||||
|
|
||||||
|
def prep_inp(self):
|
||||||
|
|
||||||
|
# geometry
|
||||||
|
generate_xyz(self.geom, filename="{}.xyz".format(self.mol))
|
||||||
|
|
||||||
|
# input files
|
||||||
|
for inp in ["methods", "options"]:
|
||||||
|
inp_file = "{}.{}".format(inp, self.methd.upper())
|
||||||
|
if os.path.exists("inp/{}".format(inp_file)):
|
||||||
|
shutil.copy("inp/{}".format(inp_file), "../mol/{}".format(inp_file))
|
||||||
|
else:
|
||||||
|
print_col("File 'inp/{}' does not exist.".format(inp_file), "red")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def run(file_out, mol, bas, multip):
|
||||||
|
|
||||||
|
os.chdir('..')
|
||||||
|
print(f" :$ cd ..")
|
||||||
|
|
||||||
|
for file_in in ["methods", "options"]:
|
||||||
|
command = ['cp', 'tests/{}.RHF'.format(file_in), 'input/{}'.format(file_in)]
|
||||||
|
print(f" :$ {' '.join(command)}")
|
||||||
|
result = subprocess.run(command, capture_output=True, text=True)
|
||||||
|
if result.returncode != 0:
|
||||||
|
print("Error moving file: {}".format(result.stderr))
|
||||||
|
|
||||||
|
command = [
|
||||||
|
'python{}'.format(PYTHON_VERSION), 'PyDuck.py',
|
||||||
|
'-x', '{}'.format(mol),
|
||||||
|
'-b', '{}'.format(bas),
|
||||||
|
'-m', '{}'.format(multip)
|
||||||
|
]
|
||||||
|
print(f" :$ {' '.join(command)}")
|
||||||
|
with open(file_out, 'w') as fobj:
|
||||||
|
result = subprocess.run(command, stdout=fobj, stderr=subprocess.PIPE, text=True)
|
||||||
|
if result.stderr:
|
||||||
|
print("Error output:", result.stderr)
|
||||||
|
|
||||||
|
os.chdir('tests')
|
||||||
|
print(f" :$ cd tests")
|
||||||
|
|
||||||
|
|
||||||
|
# ---
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
work_path = Path('{}/tests/work'.format(quack_root))
|
||||||
|
if not work_path.exists():
|
||||||
|
work_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
print(f"Directory '{work_path}' created.\n")
|
||||||
|
|
||||||
|
for mol in molecules:
|
||||||
|
|
||||||
|
mol_name = mol.name
|
||||||
|
mol_mult = mol.multiplicity
|
||||||
|
mol_geom = mol.geometry
|
||||||
|
mol_data = mol.properties
|
||||||
|
|
||||||
|
print_col(" Molecule: {} (2S+1 = {})".format(mol_name, mol_mult), "blue")
|
||||||
|
|
||||||
|
for mol_prop_name, mol_prop_data in mol_data.items():
|
||||||
|
|
||||||
|
print_col(" Testing {}".format(mol_prop_name), "cyan")
|
||||||
|
|
||||||
|
methd = mol_prop_name[len('properties_'):]
|
||||||
|
|
||||||
|
if(len(mol_prop_data) == 0):
|
||||||
|
print_col(" {} is empty. Skipping...".format(mol_prop_name), "cyan")
|
||||||
|
print()
|
||||||
|
continue
|
||||||
|
|
||||||
|
for basis_name, basis_data in mol_prop_data.items():
|
||||||
|
print_col(" Basis set = {}".format(basis_name), "yellow")
|
||||||
|
|
||||||
|
if(len(basis_data) == 0):
|
||||||
|
print_col(" {} is empty. Skipping...".format(basis_name), "yellow")
|
||||||
|
print()
|
||||||
|
continue
|
||||||
|
|
||||||
|
work_methd = Path('{}/{}'.format(work_path, methd))
|
||||||
|
if not work_methd.exists():
|
||||||
|
work_methd.mkdir(parents=True, exist_ok=True)
|
||||||
|
#print(f"Directory '{work_methd}' created.\n")
|
||||||
|
|
||||||
|
New_Quack_Job = Quack_Job(mol_name, mol_mult, basis_name, mol_geom, methd)
|
||||||
|
New_Quack_Job.prep_inp()
|
||||||
|
|
||||||
|
# for name, val in basis_data.items():
|
||||||
|
# print(f" name = {name}")
|
||||||
|
# print(f" val = {val}")
|
||||||
|
|
||||||
|
print()
|
||||||
|
print()
|
||||||
|
print()
|
||||||
|
|
||||||
|
quit()
|
||||||
|
|
||||||
|
|
||||||
|
# # create input files
|
||||||
|
# class_methd.gen_input()
|
||||||
|
#
|
||||||
|
# file_out = "{}/{}/{}_{}_{}.out".format(work_path, prop, mol_name, mol_mult, bas)
|
||||||
|
#
|
||||||
|
# print(" testing {} for {}@{} (2S+1 = {})".format(prop, mol_name, bas, mol_mult))
|
||||||
|
# print(" file_out: {}".format(file_out))
|
||||||
|
#
|
||||||
|
# class_methd.run_job(file_out, mol_name, bas, mol_mult)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
db_name = '{}.db'.format(bench)
|
||||||
|
|
||||||
|
molecules = get_molecules_from_db(db_name)
|
||||||
|
|
||||||
|
main()
|
||||||
|
|
@ -3,22 +3,18 @@ import json
|
|||||||
import sqlite3
|
import sqlite3
|
||||||
|
|
||||||
class Molecule:
|
class Molecule:
|
||||||
def __init__(self, name, multiplicity, geometry, energies):
|
def __init__(self, name, multiplicity, geometry, properties):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.multiplicity = multiplicity
|
self.multiplicity = multiplicity
|
||||||
self.geometry = geometry # List of tuples (atom, x, y, z)
|
self.geometry = geometry
|
||||||
self.energies = energies # Dictionary of dictionaries: {method: {basis: energy}}
|
self.properties = properties
|
||||||
|
|
||||||
def get_energy(self, method, basis):
|
|
||||||
"""Retrieve energy for a specific method and basis set."""
|
|
||||||
return self.energies.get(method, {}).get(basis, None)
|
|
||||||
|
|
||||||
def to_dict(self):
|
def to_dict(self):
|
||||||
return {
|
return {
|
||||||
"name": self.name,
|
"name": self.name,
|
||||||
"multiplicity": self.multiplicity,
|
"multiplicity": self.multiplicity,
|
||||||
"geometry": self.geometry,
|
"geometry": self.geometry,
|
||||||
"energies": self.energies,
|
"properties": self.properties,
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -27,7 +23,7 @@ class Molecule:
|
|||||||
name=data["name"],
|
name=data["name"],
|
||||||
multiplicity=data["multiplicity"],
|
multiplicity=data["multiplicity"],
|
||||||
geometry=data["geometry"],
|
geometry=data["geometry"],
|
||||||
energies=data["energies"]
|
properties=data["properties"]
|
||||||
)
|
)
|
||||||
|
|
||||||
def save_molecules_to_json(molecules, filename):
|
def save_molecules_to_json(molecules, filename):
|
||||||
@ -45,7 +41,7 @@ def create_database(db_name):
|
|||||||
conn = sqlite3.connect(db_name)
|
conn = sqlite3.connect(db_name)
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
cursor.execute('''CREATE TABLE IF NOT EXISTS molecules
|
cursor.execute('''CREATE TABLE IF NOT EXISTS molecules
|
||||||
(name TEXT, multiplicity INTEGER, geometry TEXT, energies TEXT)''')
|
(name TEXT, multiplicity INTEGER, geometry TEXT, properties TEXT)''')
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
@ -53,7 +49,7 @@ def add_molecule_to_db(db_name, molecule):
|
|||||||
conn = sqlite3.connect(db_name)
|
conn = sqlite3.connect(db_name)
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
geometry_str = json.dumps(molecule.geometry)
|
geometry_str = json.dumps(molecule.geometry)
|
||||||
energies_str = json.dumps(molecule.energies)
|
energies_str = json.dumps(molecule.properties)
|
||||||
cursor.execute("INSERT INTO molecules VALUES (?, ?, ?, ?)",
|
cursor.execute("INSERT INTO molecules VALUES (?, ?, ?, ?)",
|
||||||
(molecule.name, molecule.multiplicity, geometry_str, energies_str))
|
(molecule.name, molecule.multiplicity, geometry_str, energies_str))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
@ -62,25 +58,48 @@ def add_molecule_to_db(db_name, molecule):
|
|||||||
def get_molecules_from_db(db_name):
|
def get_molecules_from_db(db_name):
|
||||||
conn = sqlite3.connect(db_name)
|
conn = sqlite3.connect(db_name)
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
cursor.execute("SELECT name, multiplicity, geometry, energies FROM molecules")
|
cursor.execute("SELECT name, multiplicity, geometry, properties FROM molecules")
|
||||||
rows = cursor.fetchall()
|
rows = cursor.fetchall()
|
||||||
molecules = []
|
molecules = []
|
||||||
for row in rows:
|
for row in rows:
|
||||||
name, multiplicity, geometry_str, energies_str = row
|
name, multiplicity, geometry_str, energies_str = row
|
||||||
geometry = json.loads(geometry_str)
|
geometry = json.loads(geometry_str)
|
||||||
energies = json.loads(energies_str) # energies is a dictionary of dictionaries
|
properties = json.loads(energies_str)
|
||||||
molecules.append(Molecule(name, multiplicity, geometry, energies))
|
molecules.append(Molecule(name, multiplicity, geometry, properties))
|
||||||
conn.close()
|
conn.close()
|
||||||
return molecules
|
return molecules
|
||||||
|
|
||||||
def write_geometry_to_xyz(molecule, filename):
|
|
||||||
|
def generate_xyz(elements, filename="output.xyz", verbose=False):
|
||||||
|
"""
|
||||||
|
Generate an XYZ file from a list of elements.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
elements (list): A list of dictionaries, where each dictionary represents
|
||||||
|
an atom with its element and x, y, z coordinates.
|
||||||
|
filename (str): The name of the output XYZ file. Default is 'output.xyz'.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Get the number of atoms
|
||||||
|
num_atoms = len(elements)
|
||||||
|
|
||||||
|
# Open the file in write mode
|
||||||
with open(filename, 'w') as f:
|
with open(filename, 'w') as f:
|
||||||
# First line: number of atoms
|
# Write the number of atoms
|
||||||
f.write(f"{len(molecule.geometry)}\n")
|
f.write(f"{num_atoms}\n")
|
||||||
# Second line: empty comment line
|
|
||||||
f.write("\n")
|
# Write a comment line (can be left blank or customized)
|
||||||
# Remaining lines: atom positions
|
f.write("XYZ file generated by generate_xyz function\n")
|
||||||
for atom, x, y, z in molecule.geometry:
|
|
||||||
f.write(f"{atom} {x:.6f} {y:.6f} {z:.6f}\n")
|
# Write the element and coordinates
|
||||||
|
for atom in elements:
|
||||||
|
element = atom['element']
|
||||||
|
x = atom['x']
|
||||||
|
y = atom['y']
|
||||||
|
z = atom['z']
|
||||||
|
f.write(f"{element} {x:.6f} {y:.6f} {z:.6f}\n")
|
||||||
|
|
||||||
|
if(verbose):
|
||||||
|
print(f"XYZ file '{filename}' generated successfully!")
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,76 +0,0 @@
|
|||||||
|
|
||||||
from molecule import Molecule
|
|
||||||
|
|
||||||
|
|
||||||
He = Molecule(
|
|
||||||
name="He",
|
|
||||||
multiplicity=1,
|
|
||||||
geometry=[
|
|
||||||
{"element": "He", "x": 0.0, "y": 0.0, "z": 0.0}
|
|
||||||
],
|
|
||||||
properties={
|
|
||||||
"6-31g": {
|
|
||||||
"RHF energy": -2.855160426884076,
|
|
||||||
"RHF HOMO energy": -0.914126628614305,
|
|
||||||
"RHF LUMO energy": 1.399859335225087,
|
|
||||||
"RHF dipole moment": 0.000000000000000,
|
|
||||||
"RMP2 correlation energy": -0.011200122910187,
|
|
||||||
"CCD correlation energy": -0.014985063408247,
|
|
||||||
"DCD correlation energy": -0.014985062907429,
|
|
||||||
"CCSD correlation energy": -0.015001711549550,
|
|
||||||
"drCCD correlation energy": -0.018845374502248,
|
|
||||||
"rCCD correlation energy": -0.016836324636164,
|
|
||||||
"crCCD correlation energy": 0.008524677369855,
|
|
||||||
"lCCD correlation energy": -0.008082420815100,
|
|
||||||
"pCCD correlation energy": -0.014985062519068,
|
|
||||||
"RCIS singlet excitation energy": 1.911193619935257,
|
|
||||||
"RCIS triplet excitation energy": 1.455852629402236,
|
|
||||||
"phRRPA correlation energy": -0.018845374129105,
|
|
||||||
"phRRPAx correlation energy": -0.015760565121283,
|
|
||||||
"crRRPA correlation energy": -0.008868581132405,
|
|
||||||
"ppRRPA correlation energy": -0.008082420815100,
|
|
||||||
"RG0F2 correlation energy": -0.011438430540374,
|
|
||||||
"RG0F2 HOMO energy": -0.882696116247871,
|
|
||||||
"RG0F2 LUMO energy": 1.383080391811630,
|
|
||||||
"evRGF2 correlation energy": -0.011448483158486,
|
|
||||||
"evRGF2 HOMO energy": -0.881327878713477,
|
|
||||||
"evRGF2 LUMO energy": 1.382458968133448,
|
|
||||||
"RG0W0 correlation energy": -0.019314094399756,
|
|
||||||
"RG0W0 HOMO energy": -0.870533880190454,
|
|
||||||
"RG0W0 LUMO energy": 1.377171287010956,
|
|
||||||
"evRGW correlation energy": -0.019335511771724,
|
|
||||||
"evRGW HOMO energy": -0.868460640957913,
|
|
||||||
"evRGW LUMO energy": 1.376287581471769,
|
|
||||||
"RG0T0pp correlation energy": -0.008082420815100,
|
|
||||||
"RG0T0pp HOMO energy": -0.914126628614305,
|
|
||||||
"RG0T0pp LUMO energy": 1.399859335225087,
|
|
||||||
"evRGTpp correlation energy": -0.008082420815100,
|
|
||||||
"evRGTpp HOMO energy": -0.914126628614305,
|
|
||||||
"evRGTpp LUMO energy": 1.399859335225087
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---
|
|
||||||
|
|
||||||
H2O = Molecule(
|
|
||||||
name="H2O",
|
|
||||||
multiplicity=1,
|
|
||||||
geometry=[
|
|
||||||
{"element": "O", "x": 0.0000, "y": 0.0000, "z": 0.0000},
|
|
||||||
{"element": "H", "x": 0.7571, "y": 0.0000, "z": 0.5861},
|
|
||||||
{"element": "H", "x": -0.7571, "y": 0.0000, "z": 0.5861}
|
|
||||||
],
|
|
||||||
properties={
|
|
||||||
"cc-pvdz": {
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---
|
|
||||||
|
|
||||||
SwiftSet = [He, H2O]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
204
tests/test_hf.py
204
tests/test_hf.py
@ -1,204 +0,0 @@
|
|||||||
|
|
||||||
import os
|
|
||||||
from pathlib import Path
|
|
||||||
import subprocess
|
|
||||||
import platform
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
from molecule import get_molecules_from_db
|
|
||||||
|
|
||||||
|
|
||||||
current_date = datetime.now()
|
|
||||||
|
|
||||||
quack_root = os.getenv('QUACK_ROOT')
|
|
||||||
|
|
||||||
# User Name
|
|
||||||
user_name = os.getlogin()
|
|
||||||
|
|
||||||
# Operating System
|
|
||||||
os_name = platform.system()
|
|
||||||
os_release = platform.release()
|
|
||||||
os_version = platform.version()
|
|
||||||
|
|
||||||
# CPU Information
|
|
||||||
machine = platform.machine()
|
|
||||||
processor = platform.processor()
|
|
||||||
|
|
||||||
# System Architecture
|
|
||||||
architecture = platform.architecture()[0]
|
|
||||||
|
|
||||||
# Python Version
|
|
||||||
python_version_full = platform.python_version_tuple()
|
|
||||||
PYTHON_VERSION = "{}.{}".format(python_version_full[0], python_version_full[1])
|
|
||||||
|
|
||||||
|
|
||||||
print(f"The current date and time is {current_date.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
||||||
print(f"User Name: {user_name}")
|
|
||||||
print(f"Operating System: {os_name} {os_release} ({os_version})")
|
|
||||||
print(f"CPU: {processor} ({machine})")
|
|
||||||
print(f"System Architecture: {architecture}")
|
|
||||||
print(f"QUACK_ROOT: {quack_root}")
|
|
||||||
print(f"Python version: {python_version_full}\n\n")
|
|
||||||
|
|
||||||
# ---
|
|
||||||
|
|
||||||
mp2 = "# MP2 MP3\n F F\n"
|
|
||||||
cc = "# CCD pCCD DCD CCSD CCSD(T)\n F F F F F\n"
|
|
||||||
rcc = "# drCCD rCCD crCCD lCCD\n F F F F\n"
|
|
||||||
ci = "# CIS CIS(D) CID CISD FCI\n F F F F F\n"
|
|
||||||
rpa = "# phRPA phRPAx crRPA ppRPA\n F F F F\n"
|
|
||||||
gf = "# G0F2 evGF2 qsGF2 ufGF2 G0F3 evGF3\n F F F F F F\n"
|
|
||||||
gw = "# G0W0 evGW qsGW SRG-qsGW ufG0W0 ufGW\n F F F F F F\n"
|
|
||||||
gtpp = "# G0T0pp evGTpp qsGTpp ufG0T0pp\n F F F F\n"
|
|
||||||
gteh = "# G0T0eh evGTeh qsGTeh\n F F F\n"
|
|
||||||
tests = "# Rtest Utest Gtest\n F F F\n"
|
|
||||||
|
|
||||||
# ---
|
|
||||||
|
|
||||||
hf_opt = "# HF: maxSCF thresh DIIS guess mix shift stab search\n 256 0.00001 5 1 0.0 0.0 F F\n"
|
|
||||||
mp_opt = "# MP: reg\n F\n"
|
|
||||||
cc_opt = "# CC: maxSCF thresh DIIS\n 64 0.00001 5\n"
|
|
||||||
tda_opt = "# spin: TDA singlet triplet\n F T T\n"
|
|
||||||
gf_opt = "# GF: maxSCF thresh DIIS lin eta renorm reg\n 256 0.00001 5 F 0.0 0 F\n"
|
|
||||||
gw_opt = "# GW: maxSCF thresh DIIS lin eta TDA_W reg\n 256 0.00001 5 F 0.0 F F\n"
|
|
||||||
gt_opt = "# GT: maxSCF thresh DIIS lin eta TDA_T reg\n 256 0.00001 5 F 0.0 F F\n"
|
|
||||||
acfdt_opt = "# ACFDT: AC Kx XBS\n F F T\n"
|
|
||||||
bse_opt = "# BSE: phBSE phBSE2 ppBSE dBSE dTDA\n F F F F T\n"
|
|
||||||
list_opt = [hf_opt, mp_opt, cc_opt, tda_opt, gf_opt, gw_opt, gt_opt, acfdt_opt, bse_opt]
|
|
||||||
|
|
||||||
# ---
|
|
||||||
|
|
||||||
class class_RHF:
|
|
||||||
|
|
||||||
def gen_input():
|
|
||||||
|
|
||||||
f = open("methods", "w")
|
|
||||||
f.write("# RHF UHF GHF ROHF\n")
|
|
||||||
f.write(" T F F F\n")
|
|
||||||
f.write("{}{}{}{}{}{}{}{}{}{}".format(mp2, cc, rcc, ci, rpa, gf, gw, gtpp, gteh, tests))
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
f = open("options", "w")
|
|
||||||
for opt in list_opt:
|
|
||||||
f.write("{}".format(opt))
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
def run_job(file_out, mol, bas, multip):
|
|
||||||
|
|
||||||
os.chdir('..')
|
|
||||||
print(f" :$ cd ..")
|
|
||||||
|
|
||||||
for file_in in ["methods", "options"]:
|
|
||||||
command = ['cp', 'tests/{}'.format(file_in), 'input/{}'.format(file_in)]
|
|
||||||
print(f" :$ {' '.join(command)}")
|
|
||||||
result = subprocess.run(command, capture_output=True, text=True)
|
|
||||||
if result.returncode != 0:
|
|
||||||
print("Error moving file: {}".format(result.stderr))
|
|
||||||
|
|
||||||
command = [
|
|
||||||
'python{}'.format(PYTHON_VERSION), 'PyDuck.py',
|
|
||||||
'-x', '{}'.format(mol),
|
|
||||||
'-b', '{}'.format(bas),
|
|
||||||
'-m', '{}'.format(multip)
|
|
||||||
]
|
|
||||||
print(f" :$ {' '.join(command)}")
|
|
||||||
with open(file_out, 'w') as fobj:
|
|
||||||
result = subprocess.run(command, stdout=fobj, stderr=subprocess.PIPE, text=True)
|
|
||||||
if result.stderr:
|
|
||||||
print("Error output:", result.stderr)
|
|
||||||
|
|
||||||
os.chdir('tests')
|
|
||||||
print(f" :$ cd tests")
|
|
||||||
|
|
||||||
|
|
||||||
# ---
|
|
||||||
|
|
||||||
class class_UHF:
|
|
||||||
def gen_input():
|
|
||||||
f = open("methods", "w")
|
|
||||||
f.write("# RHF UHF GHF ROHF\n")
|
|
||||||
f.write(" F T F F\n")
|
|
||||||
f.write("{}{}{}{}{}{}{}{}{}{}".format(mp2, cc, rcc, ci, rpa, gf, gw, gtpp, gteh, tests))
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
# ---
|
|
||||||
|
|
||||||
class class_GHF:
|
|
||||||
def gen_input():
|
|
||||||
f = open("methods", "w")
|
|
||||||
f.write("# RHF UHF GHF ROHF\n")
|
|
||||||
f.write(" F F T F\n")
|
|
||||||
f.write("{}{}{}{}{}{}{}{}{}{}".format(mp2, cc, rcc, ci, rpa, gf, gw, gtpp, gteh, tests))
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
# ---
|
|
||||||
|
|
||||||
class class_ROHF:
|
|
||||||
def gen_input():
|
|
||||||
f = open("methods", "w")
|
|
||||||
f.write("# RHF UHF GHF ROHF\n")
|
|
||||||
f.write(" F F F T\n")
|
|
||||||
f.write("{}{}{}{}{}{}{}{}{}{}".format(mp2, cc, rcc, ci, rpa, gf, gw, gtpp, gteh, tests))
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
# ---
|
|
||||||
|
|
||||||
class_map = {
|
|
||||||
"RHF": class_RHF,
|
|
||||||
"UHF": class_UHF,
|
|
||||||
"GHF": class_GHF,
|
|
||||||
"ROHF": class_ROHF,
|
|
||||||
}
|
|
||||||
|
|
||||||
def main():
|
|
||||||
|
|
||||||
work_path = Path('{}/tests/work'.format(quack_root))
|
|
||||||
if not work_path.exists():
|
|
||||||
work_path.mkdir(parents=True, exist_ok=True)
|
|
||||||
print(f"Directory '{work_path}' created.\n")
|
|
||||||
|
|
||||||
for mol in molecules:
|
|
||||||
|
|
||||||
mol_name = mol.name
|
|
||||||
mol_mult = mol.multiplicity
|
|
||||||
|
|
||||||
|
|
||||||
for methd in list_methd:
|
|
||||||
|
|
||||||
if methd not in mol.energies:
|
|
||||||
print(f"Method {methd} does not exist for {mol_name}.")
|
|
||||||
continue
|
|
||||||
|
|
||||||
for bas, _ in mol.energies[methd].items():
|
|
||||||
|
|
||||||
work_methd = Path('{}/{}'.format(work_path, methd))
|
|
||||||
if not work_methd.exists():
|
|
||||||
work_methd.mkdir(parents=True, exist_ok=True)
|
|
||||||
print(f"Directory '{work_methd}' created.\n")
|
|
||||||
|
|
||||||
class_methd = class_map.get(methd)
|
|
||||||
|
|
||||||
# create input files
|
|
||||||
class_methd.gen_input()
|
|
||||||
|
|
||||||
file_out = "{}/{}/{}_{}_{}.out".format(work_path, methd, mol_name, mol_mult, bas)
|
|
||||||
|
|
||||||
print(" testing {} for {}@{} (2S+1 = {})".format(methd, mol_name, bas, mol_mult))
|
|
||||||
print(" file_out: {}".format(file_out))
|
|
||||||
|
|
||||||
class_methd.run_job(file_out, mol_name, bas, mol_mult)
|
|
||||||
|
|
||||||
print("\n")
|
|
||||||
print("\n\n")
|
|
||||||
|
|
||||||
print(" --- --- --- ---")
|
|
||||||
print("\n\n\n")
|
|
||||||
|
|
||||||
|
|
||||||
db_name = 'molecules.db'
|
|
||||||
molecules = get_molecules_from_db(db_name)
|
|
||||||
|
|
||||||
list_methd = ["RHF", "UHF", "GHF", "ROHF"]
|
|
||||||
|
|
||||||
main()
|
|
||||||
|
|
39
tests/utils.py
Normal file
39
tests/utils.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
def print_col(text, color):
|
||||||
|
|
||||||
|
if(color == "black"):
|
||||||
|
|
||||||
|
print("\033[30m{}\033[0m".format(text))
|
||||||
|
|
||||||
|
elif(color == "red"):
|
||||||
|
|
||||||
|
print("\033[31m{}\033[0m".format(text))
|
||||||
|
|
||||||
|
elif(color == "green"):
|
||||||
|
|
||||||
|
print("\033[32m{}\033[0m".format(text))
|
||||||
|
|
||||||
|
elif(color == "yellow"):
|
||||||
|
|
||||||
|
print("\033[33m{}\033[0m".format(text))
|
||||||
|
|
||||||
|
elif(color == "blue"):
|
||||||
|
|
||||||
|
print("\033[34m{}\033[0m".format(text))
|
||||||
|
|
||||||
|
elif(color == "magenta"):
|
||||||
|
|
||||||
|
print("\033[35m{}\033[0m".format(text))
|
||||||
|
|
||||||
|
elif(color == "cyan"):
|
||||||
|
|
||||||
|
print("\033[36m{}\033[0m".format(text))
|
||||||
|
|
||||||
|
elif(color == "white"):
|
||||||
|
|
||||||
|
print("\033[37m{}\033[0m".format(text))
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
print("{}".format(text))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user