diff --git a/src/tcutility/analysis/__init__.py b/src/tcutility/analysis/__init__.py
index 5f282702..e69de29b 100644
--- a/src/tcutility/analysis/__init__.py
+++ b/src/tcutility/analysis/__init__.py
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/tcutility/analysis/vdd/__init__.py b/src/tcutility/analysis/vdd/__init__.py
index 5f282702..e69de29b 100644
--- a/src/tcutility/analysis/vdd/__init__.py
+++ b/src/tcutility/analysis/vdd/__init__.py
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/tcutility/analysis/vdd/charge.py b/src/tcutility/analysis/vdd/charge.py
index 9b3d6261..e3a9252b 100644
--- a/src/tcutility/analysis/vdd/charge.py
+++ b/src/tcutility/analysis/vdd/charge.py
@@ -1,4 +1,4 @@
-import attrs
+import attrs
@attrs.define
diff --git a/src/tcutility/analysis/vdd/manager.py b/src/tcutility/analysis/vdd/manager.py
index 54adf797..bd6cdf8d 100644
--- a/src/tcutility/analysis/vdd/manager.py
+++ b/src/tcutility/analysis/vdd/manager.py
@@ -1,228 +1,228 @@
-from __future__ import annotations
-
-import copy
-import functools
-import pathlib as pl
-from itertools import zip_longest
-from typing import Dict, List, Optional, Sequence, Union
-
-import attrs
-import matplotlib.pyplot as plt
-import numpy as np
-import pandas as pd
-
-import tcutility.log as log
-from tcutility.analysis.vdd import charge
-from tcutility.constants import VDD_UNITS
-from tcutility.results import result
-
-PRINT_FORMAT = {"me": "%+.0f", "e": "%+.3f"}
-
-
-def change_unit_decorator(func):
- @functools.wraps(func)
- def wrapper(self, unit: str = "me", *args, **kwargs):
- current_unit = self.unit
- self.change_unit(unit)
- result = func(self, *args, **kwargs)
- self.change_unit(current_unit)
- return result
-
- return wrapper
-
-
-def create_vdd_charge_manager(results: result.Result) -> VDDChargeManager:
- """Create a VDDChargeManager from a Result object."""
- vdd_charges: Dict[str, List[charge.VDDCharge]] = {}
- atom_symbols = results.molecule.atom_symbols # type: ignore
- frag_indices = results.molecule.frag_indices # type: ignore
- calc_dir = pl.Path(results.files["root"]) # type: ignore
- is_fragment_calculation = results.adf.used_regions # type: ignore
- mol_charge = results.molecule.mol_charge # type: ignore
-
- # Convert the VDD charges to VDDCharge objects
- for irrep, charge_array in results.properties.vdd.items(): # type: ignore
- irrep = "vdd" if irrep == "charges" else irrep
- vdd_charges[irrep] = []
- for atom_index, (frag_index, vdd_charge) in enumerate(zip(frag_indices, charge_array)):
- atom_symbol = atom_symbols[atom_index]
- vdd_charges[irrep].append(charge.VDDCharge(atom_index + 1, atom_symbol, vdd_charge, frag_index))
-
- return VDDChargeManager(vdd_charges, is_fragment_calculation, calc_dir, mol_charge)
-
-
-@attrs.define
-class VDDChargeManager:
- """Class to manage the VDD charges. It can be used to print the VDD charges in a nice table and write them to a text file or excel file."""
-
- vdd_charges: Dict[str, List[charge.VDDCharge]] # {"vdd": [VDDCharge, ...], "irrep1": [VDDCharge, ...], ...}
- is_fragment_calculation: bool
- calc_dir: pl.Path
- mol_charge: int
- name: str = attrs.field(init=False)
- unit: str = attrs.field(init=False, default="e") # unit of the VDD charges. Available units are "me" (mili-electrons) and "e" (electrons)
- irreps: List[str] = attrs.field(init=False, default=set())
-
- def __attrs_post_init__(self):
- self.irreps = list(self.vdd_charges.keys())
- self.name = self.calc_dir.name if self.calc_dir is not None else self.name
- self.change_unit("me")
- log.info(f"VDDChargeManager created for {self.name}")
-
- def __str__(self) -> str:
- """Prints the VDD charges in a nice table. Checks if the calculation is a fragment calculation and prints the summed VDD charges if it is."""
- individual_charges_table = self.get_vdd_charges_table()
- summed_charges_table = self.get_summed_vdd_charges_table()
-
- ret_str = f"{self.name}\nVDD charges (in unit {self.unit}):\n{individual_charges_table}\n\n"
- if self.is_fragment_calculation:
- ret_str += f"Summed VDD charges (in unit {self.unit}):\n{summed_charges_table}\n"
-
- return ret_str
-
- def charge_is_conserved(self) -> bool:
- """Check if the total charge of the molecule is conserved. The total charge is the sum of the VDD charges."""
- tolerance = 1e-4 if self.unit == "e" else 1e-1
- is_conserved = np.isclose(self.mol_charge, sum([charge.charge for charge in self.vdd_charges["vdd"]]), atol=tolerance)
- return is_conserved # type: ignore since numpy _bool is not recognized as bool
-
- def change_unit(self, new_unit: str) -> None:
- """Change the unit of the VDD charges. Available units are "me" (mili-electrons) and "e" (electrons)."""
- if new_unit not in VDD_UNITS:
- raise ValueError(f"Unit {new_unit} is not available. Choose from {VDD_UNITS.keys()}")
-
- if new_unit == self.unit:
- return
-
- ratio = VDD_UNITS[new_unit] / VDD_UNITS[self.unit]
- [charge.change_unit(ratio) for charges in self.vdd_charges.values() for charge in charges]
- self.unit = new_unit
-
- @change_unit_decorator
- def get_vdd_charges(self) -> Dict[str, List[charge.VDDCharge]]:
- """Get the VDD charges in the specified unit ([me] or [e])."""
- return copy.deepcopy(self.vdd_charges)
-
- @change_unit_decorator
- def get_summed_vdd_charges(self, irreps: Optional[Sequence[str]] = None) -> Dict[str, Dict[str, float]]:
- """Get the summed VDD charges per fragment for the specified unit ([me] or [e])."""
- irreps = irreps if irreps is not None else self.irreps
- summed_vdd_charges: Dict[str, Dict[str, float]] = {}
-
- for irrep in irreps:
- summed_vdd_charges[irrep] = {}
- for vdd_charge in self.vdd_charges[irrep]:
- frag_index = str(vdd_charge.frag_index)
- summed_vdd_charges[irrep].setdefault(frag_index, 0.0)
- summed_vdd_charges[irrep][frag_index] += vdd_charge.charge
-
- return copy.deepcopy(summed_vdd_charges)
-
- def get_vdd_charges_dataframe(self) -> pd.DataFrame:
- """Get the VDD charges as a pandas DataFrame in a specified unit ([me] or [e])."""
- frag_indices = [charge.frag_index for charge in self.vdd_charges["vdd"]]
- atom_symbols = [f"{charge.atom_index}{charge.atom_symbol}" for charge in self.vdd_charges["vdd"]]
- charges = [[charge.charge for charge in charges] for _, charges in self.vdd_charges.items()]
- headers = ["Frag", "Atom"] + [irrep for irrep, _ in self.vdd_charges.items()]
- combined_table = list(zip_longest(frag_indices, atom_symbols, *charges, fillvalue=""))
- df = pd.DataFrame(combined_table, columns=headers).rename(columns={"vdd": "Total"})
- return df
-
- def get_summed_vdd_charges_dataframe(self) -> pd.DataFrame:
- """Get the summed VDD charges as a pandas DataFrame in a specified unit ([me] or [e])."""
- summed_data = self.get_summed_vdd_charges()
- summed_data["Frag"] = {str(key): int(key) for key in summed_data["vdd"].keys()}
- df = pd.DataFrame(summed_data).pipe(lambda df: df[df.columns.tolist()[-1:] + df.columns.tolist()[:-1]]) # move the "Frag" column to the front
- return df.rename(columns={"vdd": "Total"})
-
- def get_vdd_charges_table(self) -> str:
- df = self.get_vdd_charges_dataframe()
- return df.to_string(float_format=lambda x: PRINT_FORMAT[self.unit] % x, justify="center", index=False, col_space=6)
-
- def get_summed_vdd_charges_table(self) -> str:
- df = self.get_summed_vdd_charges_dataframe()
- return df.to_string(float_format=lambda x: PRINT_FORMAT[self.unit] % x, justify="center", col_space=6, index=False)
-
- @staticmethod
- def write_to_txt(output_dir: Union[str, pl.Path], managers: Union[VDDChargeManager, Sequence[VDDChargeManager]], unit: str = "me") -> None:
- """Write the VDD charges to a text file. It is a static method because multiple managers can be written to the same file."""
- out_dir = pl.Path(output_dir) if not isinstance(output_dir, pl.Path) else output_dir
- files = [out_dir / "VDD_charges_per_atom.txt", out_dir / "VDD_charges_per_fragment.txt"]
- managers = managers if isinstance(managers, Sequence) else [managers]
-
- # Print charges per atom and per fragment in seperate files
- for i, file in enumerate(files):
- with open(file, "w") as f:
- f.write("VDD charges:\n")
- for manager in managers:
- f.write(f"{manager.name} (unit = {manager.unit})\n")
- if i == 0:
- f.write(manager.get_vdd_charges_table())
- else:
- f.write(manager.get_summed_vdd_charges_table()) if manager.is_fragment_calculation else f.write("No fragment calculation\n")
- f.write("\n\n")
-
- def write_to_excel(self, output_file: Optional[Union[str, pl.Path]] = None) -> None:
- """Write the VDD charges to an excel file. Results are written to two sheets: "VDD charges" and "Summed VDD charges"."""
- file = pl.Path(output_file) if output_file is not None else self.calc_dir / f"vdd_charges_{self.name}.xlsx"
- file = file.with_suffix(".xlsx") if not file.suffix == ".xlsx" else file
-
- df = self.get_vdd_charges_dataframe()
-
- with pd.ExcelWriter(file) as writer:
- df.to_excel(writer, sheet_name=f"VDD charges (in {self.unit})", index=False, float_format=PRINT_FORMAT[self.unit])
- if self.is_fragment_calculation:
- df_summed = self.get_summed_vdd_charges_dataframe()
- df_summed.to_excel(writer, sheet_name=f"Summed VDD charges (in {self.unit})", index=False, float_format=PRINT_FORMAT[self.unit])
-
- def plot_vdd_charges_per_atom(self, output_file: Optional[Union[str, pl.Path]] = None, unit: str = "me") -> None:
- """Plot the VDD charges as a bar graph for each irrep."""
- file = pl.Path(output_file) if output_file is not None else self.calc_dir / f"vdd_charges_{self.name}.png"
- file = file.with_suffix(".png") if not file.suffix == ".png" else file
- self.change_unit(unit)
-
- # Increase the global font size
- plt.rcParams.update({"font.size": 14})
-
- num_irreps = len(self.vdd_charges)
- n_max_charges = max([len(charges) for charges in self.vdd_charges.values()])
- _, axs = plt.subplots(num_irreps, 1, figsize=(n_max_charges * 1.15, 5 * num_irreps), sharey=True)
- axs = [axs] if num_irreps == 1 else axs
-
- # Initialize a variable to keep track of the most positive/negative values
- adjusted_abs_max_values = []
-
- counter = 1
- for ax, (irrep, charges) in zip(axs, self.vdd_charges.items()):
- atom_symbols = [f"{charge.atom_index}{charge.atom_symbol} ({charge.frag_index})" for charge in charges]
- charge_values = [charge.charge for charge in charges]
-
- bars = ax.bar(atom_symbols, charge_values, color="sandybrown", edgecolor="black")
- if counter == len(axs):
- ax.set_xlabel("Atom (#Fragment Number)")
- ax.set_ylabel(f"Charge ({unit})")
- ax.set_title(f"VDD Charges {self.name} - {irrep}")
- ax.yaxis.grid(True) # Only display vertical grid lines
-
- # Add the charge value on top of each bar. If the value is negative, place the text below the bar
- for bar in bars:
- yval = bar.get_height()
- x_pos = bar.get_x() + bar.get_width() / 2
-
- if yval <= 0:
- ax.text(x_pos, yval + yval * 0.1, int(yval), va="top", ha="center")
- else:
- ax.text(x_pos, yval + yval * 0.1, int(yval), va="bottom", ha="center")
- adjusted_abs_max_values.append(yval + yval * 0.1)
- counter += 1
-
- # Making sure the values do not extend outside the plot. Also determines the y-axis limits for all subplotss
- min_value, max_value = min(adjusted_abs_max_values), max(adjusted_abs_max_values)
-
- # Axes adjustments
- # Set the y-axis limits for all subplots based on the most positive/negative values
- for ax in axs:
- ax.set_ylim([min_value - abs(min_value) * 0.2, max_value + abs(max_value) * 0.2])
-
- # plt.tight_layout()
- plt.savefig(file, dpi=300)
+from __future__ import annotations
+
+import copy
+import functools
+import pathlib as pl
+from itertools import zip_longest
+from typing import Dict, List, Optional, Sequence, Union
+
+import attrs
+import matplotlib.pyplot as plt
+import numpy as np
+import pandas as pd
+
+import tcutility.log as log
+from tcutility.analysis.vdd import charge
+from tcutility.constants import VDD_UNITS
+from tcutility.results import result
+
+PRINT_FORMAT = {"me": "%+.0f", "e": "%+.3f"}
+
+
+def change_unit_decorator(func):
+ @functools.wraps(func)
+ def wrapper(self, unit: str = "me", *args, **kwargs):
+ current_unit = self.unit
+ self.change_unit(unit)
+ result = func(self, *args, **kwargs)
+ self.change_unit(current_unit)
+ return result
+
+ return wrapper
+
+
+def create_vdd_charge_manager(results: result.Result) -> VDDChargeManager:
+ """Create a VDDChargeManager from a Result object."""
+ vdd_charges: Dict[str, List[charge.VDDCharge]] = {}
+ atom_symbols = results.molecule.atom_symbols # type: ignore
+ frag_indices = results.molecule.frag_indices # type: ignore
+ calc_dir = pl.Path(results.files["root"]) # type: ignore
+ is_fragment_calculation = results.adf.used_regions # type: ignore
+ mol_charge = results.molecule.mol_charge # type: ignore
+
+ # Convert the VDD charges to VDDCharge objects
+ for irrep, charge_array in results.properties.vdd.items(): # type: ignore
+ irrep = "vdd" if irrep == "charges" else irrep
+ vdd_charges[irrep] = []
+ for atom_index, (frag_index, vdd_charge) in enumerate(zip(frag_indices, charge_array)):
+ atom_symbol = atom_symbols[atom_index]
+ vdd_charges[irrep].append(charge.VDDCharge(atom_index + 1, atom_symbol, vdd_charge, frag_index))
+
+ return VDDChargeManager(vdd_charges, is_fragment_calculation, calc_dir, mol_charge)
+
+
+@attrs.define
+class VDDChargeManager:
+ """Class to manage the VDD charges. It can be used to print the VDD charges in a nice table and write them to a text file or excel file."""
+
+ vdd_charges: Dict[str, List[charge.VDDCharge]] # {"vdd": [VDDCharge, ...], "irrep1": [VDDCharge, ...], ...}
+ is_fragment_calculation: bool
+ calc_dir: pl.Path
+ mol_charge: int
+ name: str = attrs.field(init=False)
+ unit: str = attrs.field(init=False, default="e") # unit of the VDD charges. Available units are "me" (mili-electrons) and "e" (electrons)
+ irreps: List[str] = attrs.field(init=False, default=set())
+
+ def __attrs_post_init__(self):
+ self.irreps = list(self.vdd_charges.keys())
+ self.name = self.calc_dir.name if self.calc_dir is not None else self.name
+ self.change_unit("me")
+ log.info(f"VDDChargeManager created for {self.name}")
+
+ def __str__(self) -> str:
+ """Prints the VDD charges in a nice table. Checks if the calculation is a fragment calculation and prints the summed VDD charges if it is."""
+ individual_charges_table = self.get_vdd_charges_table()
+ summed_charges_table = self.get_summed_vdd_charges_table()
+
+ ret_str = f"{self.name}\nVDD charges (in unit {self.unit}):\n{individual_charges_table}\n\n"
+ if self.is_fragment_calculation:
+ ret_str += f"Summed VDD charges (in unit {self.unit}):\n{summed_charges_table}\n"
+
+ return ret_str
+
+ def charge_is_conserved(self) -> bool:
+ """Check if the total charge of the molecule is conserved. The total charge is the sum of the VDD charges."""
+ tolerance = 1e-4 if self.unit == "e" else 1e-1
+ is_conserved = np.isclose(self.mol_charge, sum([charge.charge for charge in self.vdd_charges["vdd"]]), atol=tolerance)
+ return is_conserved # type: ignore since numpy _bool is not recognized as bool
+
+ def change_unit(self, new_unit: str) -> None:
+ """Change the unit of the VDD charges. Available units are "me" (mili-electrons) and "e" (electrons)."""
+ if new_unit not in VDD_UNITS:
+ raise ValueError(f"Unit {new_unit} is not available. Choose from {VDD_UNITS.keys()}")
+
+ if new_unit == self.unit:
+ return
+
+ ratio = VDD_UNITS[new_unit] / VDD_UNITS[self.unit]
+ [charge.change_unit(ratio) for charges in self.vdd_charges.values() for charge in charges]
+ self.unit = new_unit
+
+ @change_unit_decorator
+ def get_vdd_charges(self) -> Dict[str, List[charge.VDDCharge]]:
+ """Get the VDD charges in the specified unit ([me] or [e])."""
+ return copy.deepcopy(self.vdd_charges)
+
+ @change_unit_decorator
+ def get_summed_vdd_charges(self, irreps: Optional[Sequence[str]] = None) -> Dict[str, Dict[str, float]]:
+ """Get the summed VDD charges per fragment for the specified unit ([me] or [e])."""
+ irreps = irreps if irreps is not None else self.irreps
+ summed_vdd_charges: Dict[str, Dict[str, float]] = {}
+
+ for irrep in irreps:
+ summed_vdd_charges[irrep] = {}
+ for vdd_charge in self.vdd_charges[irrep]:
+ frag_index = str(vdd_charge.frag_index)
+ summed_vdd_charges[irrep].setdefault(frag_index, 0.0)
+ summed_vdd_charges[irrep][frag_index] += vdd_charge.charge
+
+ return copy.deepcopy(summed_vdd_charges)
+
+ def get_vdd_charges_dataframe(self) -> pd.DataFrame:
+ """Get the VDD charges as a pandas DataFrame in a specified unit ([me] or [e])."""
+ frag_indices = [charge.frag_index for charge in self.vdd_charges["vdd"]]
+ atom_symbols = [f"{charge.atom_index}{charge.atom_symbol}" for charge in self.vdd_charges["vdd"]]
+ charges = [[charge.charge for charge in charges] for _, charges in self.vdd_charges.items()]
+ headers = ["Frag", "Atom"] + [irrep for irrep, _ in self.vdd_charges.items()]
+ combined_table = list(zip_longest(frag_indices, atom_symbols, *charges, fillvalue=""))
+ df = pd.DataFrame(combined_table, columns=headers).rename(columns={"vdd": "Total"})
+ return df
+
+ def get_summed_vdd_charges_dataframe(self) -> pd.DataFrame:
+ """Get the summed VDD charges as a pandas DataFrame in a specified unit ([me] or [e])."""
+ summed_data = self.get_summed_vdd_charges()
+ summed_data["Frag"] = {str(key): int(key) for key in summed_data["vdd"].keys()}
+ df = pd.DataFrame(summed_data).pipe(lambda df: df[df.columns.tolist()[-1:] + df.columns.tolist()[:-1]]) # move the "Frag" column to the front
+ return df.rename(columns={"vdd": "Total"})
+
+ def get_vdd_charges_table(self) -> str:
+ df = self.get_vdd_charges_dataframe()
+ return df.to_string(float_format=lambda x: PRINT_FORMAT[self.unit] % x, justify="center", index=False, col_space=6)
+
+ def get_summed_vdd_charges_table(self) -> str:
+ df = self.get_summed_vdd_charges_dataframe()
+ return df.to_string(float_format=lambda x: PRINT_FORMAT[self.unit] % x, justify="center", col_space=6, index=False)
+
+ @staticmethod
+ def write_to_txt(output_dir: Union[str, pl.Path], managers: Union[VDDChargeManager, Sequence[VDDChargeManager]], unit: str = "me") -> None:
+ """Write the VDD charges to a text file. It is a static method because multiple managers can be written to the same file."""
+ out_dir = pl.Path(output_dir) if not isinstance(output_dir, pl.Path) else output_dir
+ files = [out_dir / "VDD_charges_per_atom.txt", out_dir / "VDD_charges_per_fragment.txt"]
+ managers = managers if isinstance(managers, Sequence) else [managers]
+
+ # Print charges per atom and per fragment in seperate files
+ for i, file in enumerate(files):
+ with open(file, "w") as f:
+ f.write("VDD charges:\n")
+ for manager in managers:
+ f.write(f"{manager.name} (unit = {manager.unit})\n")
+ if i == 0:
+ f.write(manager.get_vdd_charges_table())
+ else:
+ f.write(manager.get_summed_vdd_charges_table()) if manager.is_fragment_calculation else f.write("No fragment calculation\n")
+ f.write("\n\n")
+
+ def write_to_excel(self, output_file: Optional[Union[str, pl.Path]] = None) -> None:
+ """Write the VDD charges to an excel file. Results are written to two sheets: "VDD charges" and "Summed VDD charges"."""
+ file = pl.Path(output_file) if output_file is not None else self.calc_dir / f"vdd_charges_{self.name}.xlsx"
+ file = file.with_suffix(".xlsx") if not file.suffix == ".xlsx" else file
+
+ df = self.get_vdd_charges_dataframe()
+
+ with pd.ExcelWriter(file) as writer:
+ df.to_excel(writer, sheet_name=f"VDD charges (in {self.unit})", index=False, float_format=PRINT_FORMAT[self.unit])
+ if self.is_fragment_calculation:
+ df_summed = self.get_summed_vdd_charges_dataframe()
+ df_summed.to_excel(writer, sheet_name=f"Summed VDD charges (in {self.unit})", index=False, float_format=PRINT_FORMAT[self.unit])
+
+ def plot_vdd_charges_per_atom(self, output_file: Optional[Union[str, pl.Path]] = None, unit: str = "me") -> None:
+ """Plot the VDD charges as a bar graph for each irrep."""
+ file = pl.Path(output_file) if output_file is not None else self.calc_dir / f"vdd_charges_{self.name}.png"
+ file = file.with_suffix(".png") if not file.suffix == ".png" else file
+ self.change_unit(unit)
+
+ # Increase the global font size
+ plt.rcParams.update({"font.size": 14})
+
+ num_irreps = len(self.vdd_charges)
+ n_max_charges = max([len(charges) for charges in self.vdd_charges.values()])
+ _, axs = plt.subplots(num_irreps, 1, figsize=(n_max_charges * 1.15, 5 * num_irreps), sharey=True)
+ axs = [axs] if num_irreps == 1 else axs
+
+ # Initialize a variable to keep track of the most positive/negative values
+ adjusted_abs_max_values = []
+
+ counter = 1
+ for ax, (irrep, charges) in zip(axs, self.vdd_charges.items()):
+ atom_symbols = [f"{charge.atom_index}{charge.atom_symbol} ({charge.frag_index})" for charge in charges]
+ charge_values = [charge.charge for charge in charges]
+
+ bars = ax.bar(atom_symbols, charge_values, color="sandybrown", edgecolor="black")
+ if counter == len(axs):
+ ax.set_xlabel("Atom (#Fragment Number)")
+ ax.set_ylabel(f"Charge ({unit})")
+ ax.set_title(f"VDD Charges {self.name} - {irrep}")
+ ax.yaxis.grid(True) # Only display vertical grid lines
+
+ # Add the charge value on top of each bar. If the value is negative, place the text below the bar
+ for bar in bars:
+ yval = bar.get_height()
+ x_pos = bar.get_x() + bar.get_width() / 2
+
+ if yval <= 0:
+ ax.text(x_pos, yval + yval * 0.1, int(yval), va="top", ha="center")
+ else:
+ ax.text(x_pos, yval + yval * 0.1, int(yval), va="bottom", ha="center")
+ adjusted_abs_max_values.append(yval + yval * 0.1)
+ counter += 1
+
+ # Making sure the values do not extend outside the plot. Also determines the y-axis limits for all subplotss
+ min_value, max_value = min(adjusted_abs_max_values), max(adjusted_abs_max_values)
+
+ # Axes adjustments
+ # Set the y-axis limits for all subplots based on the most positive/negative values
+ for ax in axs:
+ ax.set_ylim([min_value - abs(min_value) * 0.2, max_value + abs(max_value) * 0.2])
+
+ # plt.tight_layout()
+ plt.savefig(file, dpi=300)
diff --git a/src/tcutility/analysis/vibration/__init__.py b/src/tcutility/analysis/vibration/__init__.py
index 5f282702..e69de29b 100644
--- a/src/tcutility/analysis/vibration/__init__.py
+++ b/src/tcutility/analysis/vibration/__init__.py
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/tcutility/cli_scripts/cite.py b/src/tcutility/cli_scripts/cite.py
index ca5cca5b..86d95ba1 100644
--- a/src/tcutility/cli_scripts/cite.py
+++ b/src/tcutility/cli_scripts/cite.py
@@ -1,306 +1,306 @@
-""" Module containing functions for generating citations"""
-import argparse
-from tcutility import cite, data, spell_check
-import os
-import docx
-from docx.shared import Pt
-from docx.enum.text import WD_ALIGN_PARAGRAPH
-import htmldocx
-from math import ceil
-
-
-class Docx:
- '''
- Small class that handles writing to a docx file. This should and will be moved to its own module in TCutility soon.
- '''
- def __init__(self, file='test.docx', overwrite=False):
- self.file = file
- if not os.path.exists(file) or overwrite:
- self.doc = docx.Document()
- else:
- self.doc = docx.Document(file)
-
- self.doc.styles['Normal'].font.name = 'Times New Roman'
- self.doc.styles['Normal'].font.size = Pt(12)
- self.doc.styles['Normal'].paragraph_format.space_after = 0
- self.html_parser = htmldocx.HtmlToDocx()
-
- def __enter__(self):
- return self
-
- def __exit__(self, *args):
- self.doc.save(self.file)
-
- def write_paragraph(self, text, alignment=WD_ALIGN_PARAGRAPH.LEFT):
- '''
- Write a piece of text as a pragraph to this Docx file.
- This function will parse any HTML that is given in the text.
- E.g. you can use the tags to make a piece of text bold.
- '''
- self.html_parser.add_html_to_document(text, self.doc)
- self.doc.paragraphs[-1].alignment = alignment
-
- def open(self):
- '''
- Open this file in Word.
- '''
- os.system(f'open {self.file}')
-
-
-def create_subparser(parent_parser: argparse.ArgumentParser):
- desc = """Generate citations for objects. Currently supports generating citations for functionals, basis-sets, programs, methodologies and DOIs.
-This program also generates, and if possible, opens a Word document that contains the formatted citations.
-Multiple objects can be given separated by spaces.
-If the supplied object is also a file path it will read each line as a separate object.
-
-Example usage:
-
- > tc cite ADF
- Program ORCA
- [10.1002/wcms.81] F. Neese, WIREs Comput. Mol. Sci. 2011, 2, 73-78.
- [10.1063/5.0004608] F. Neese, F. Wennmohs, U. Becker, C. Riplinger, J. Chem. Phys. 2020, 152.
- [10.1002/wcms.1606] F. Neese, WIREs Comput. Mol. Sci. 2022, 12.
-
- > tc cite BP86 BLYP OLYP OPBE D3BJ
- Functional BP86
- [10.1103/PhysRevA.38.3098] A. D. Becke, Phys. Rev. A 1988, 38, 3098-3100.
- [10.1103/PhysRevB.33.8800] J. P. Perdew, W. Yue, Phys. Rev. B 1986, 33, 8800-8802.
- Functional BLYP
- [10.1103/PhysRevA.38.3098] A. D. Becke, Phys. Rev. A 1988, 38, 3098-3100.
- [10.1103/PhysRevB.37.785] C. Lee, W. Yang, R. G. Parr, Phys. Rev. B 1988, 37, 785-789.
- Functional OLYP
- [10.1080/00268970010018431] N. C. Handy, A. J. Cohen, Mol. Phys. 2001, 99, 403-412.
- [10.1103/PhysRevB.37.785] C. Lee, W. Yang, R. G. Parr, Phys. Rev. B 1988, 37, 785-789.
- Functional OPBE
- [10.1080/00268970010018431] N. C. Handy, A. J. Cohen, Mol. Phys. 2001, 99, 403-412.
- [10.1103/PhysRevLett.77.3865] J. P. Perdew, K. Burke, M. Ernzerhof, Phys. Rev. Lett. 1996, 77, 3865-3868.
- Methodology D3BJ
- [10.1002/jcc.21759] S. Grimme, S. Ehrlich, L. Goerigk, J. Comput. Chem. 2011, 32, 1456-1465.
- """
- subparser = parent_parser.add_parser('cite', help=desc, description=desc)
- subparser.add_argument("objects",
- type=str,
- help="the objects to generate citations for. This can be functionals, basis-sets, programs, methodologies or DOIs.",
- nargs='*')
- subparser.add_argument("-w", "--wiley",
- help="set the citation style to Wiley. This is the default style.",
- dest='style',
- action='store_const',
- const='wiley')
- subparser.add_argument("-a", "--acs",
- help="set the citation style to ACS.",
- dest='style',
- action='store_const',
- const='acs')
- subparser.add_argument("-r", "--rsc",
- help="set the citation style to RSC.",
- dest='style',
- action='store_const',
- const='rsc')
- subparser.add_argument("-o", "--output",
- help="the output Word file to write the citations to.",
- type=str,
- default="citations.docx")
- subparser.add_argument("-l", "--list",
- help="list currently available citations.",
- action='store_true',
- default=False)
-
-
-program_references = {
- 'ams': [
- '10.1002/jcc.1056',
- '10.1007/s002140050353',
- ],
- 'adf': [
- '10.1002/jcc.1056',
- '10.1007/s002140050353',
- ],
- 'orca': [
- '10.1002/wcms.81',
- '10.1063/5.0004608',
- '10.1002/wcms.1606',
- ],
- 'dftb': [],
- 'xtb': [],
- 'cosmo': [],
- 'crest': [],
- 'pyfrag': [
- '10.1002/jcc.20786',
- '10.1002/jcc.25871',
- '10.5281/zenodo.1045523',
- ],
- 'pyorb': [],
- 'cylview': [],
-}
-
-methodology_references = {
- 'fmatsfo': [],
- 'eda': [
- '10.1002/9780470125922.ch1',
- '10.1515/9783110660074-008'
- ],
- 'asm': [
- '10.1038/s41596-019-0265-0',
- '10.1002/(SICI)1096-987X(19990115)20:1<114::AID-JCC12>3.0.CO;2-L',
- '10.1039/B926828F',
- '10.1039/C4CS00055B',
- '10.1002/wcms.1221',
- '10.1002/anie.201701486',
- '10.1039/D1CC02042K',
- ],
- 'zora': [
- '10.1063/1.466059',
- '10.1063/1.467943',
- ],
- 'ksmo': [],
- 'vdd': [
- '10.1002/jcc.10351',
- '10.1002/jcc.27184',
- '10.1039/c5cp07483e',
- ],
- 'hydrogen-bonding': [],
- 'halogen-bonding': [],
- 'chalcogen-bonding': [],
- 'pnictogen-bondding': [],
- 'zlm-fit': [
- '10.1021/ct500172n',
- ],
- 'becke-grid': [
- '1.1002/jcc.23323',
- ],
- 'sto': [
- '10.1002/jcc.10255',
- ],
- 'vibrational-analysis': [
- '10.1016/s0010-4655(96)00120-8',
- '10.1016/S0010-4655(96)00119-1',
- '10.1002/qua.20653',
- ],
- 'irc': [],
- 'd3': ['10.1063/1.3382344'],
- 'd3bj': ['10.1002/jcc.21759'],
- 'd4': ['10.1063/1.5090222'],
-}
-
-
-doi_order = []
-def format_paragraph(dois, style):
- paragraphs = []
- for doi in dois:
- if doi not in doi_order:
- doi_order.append(doi)
- try:
- citation = cite.cite(doi, style=style, mode="plain")
- except Exception as exp:
- print('\t' + str(exp))
- raise
- return
-
- print(f' [{doi}] {citation}')
- paragraph = f'[{doi_order.index(doi) + 1}] {cite.cite(doi, style=style, mode="html")}'
- paragraphs.append(paragraph)
-
- return paragraphs
-
-
-def _print_rect_list(printables, spaces_before=0):
- '''
- This function prints a list of strings in a rectangle to the output.
- This is similar to what the ls program does in unix.
- '''
- n_shell_col = os.get_terminal_size().columns
- # we first have to determine the correct dimensions of our rectangle
- for ncol in range(1, n_shell_col):
- # the number of rows for the number of columns
- nrows = ceil(len(printables) / ncol)
- # we then get what the rectangle would be
- mat = [printables[i * ncol: (i+1) * ncol] for i in range(nrows)]
- # and determine for each column the width
- col_lens = [max([len(row[i]) for row in mat if i < len(row)] + [0]) for i in range(ncol)]
- # then calculate the length of each row based on the column lengths
- # we use a spacing of 2 spaces between each column
- row_len = spaces_before + sum(col_lens) + 2 * len(col_lens) - 2
-
- # if the rows are too big we exit the loop
- if row_len > n_shell_col:
- break
-
- # store the previous loops results
- prev_col_lens = col_lens
- prev_mat = mat
-
- # then print the strings with the right column widths
- for row in prev_mat:
- print(" " * spaces_before + " ".join([x.ljust(col_len) for x, col_len in zip(row, prev_col_lens)]))
-
-
-def main(args: argparse.Namespace):
- available_citations = list(program_references.keys()) + list(methodology_references.keys()) + list(data.functionals.functionals.keys())
- if args.list:
- print('OBJECTS WITH AVAILABLE REFERENCES:')
- print(' Programs')
- print(' ========')
- printables = [prog for prog, dois in program_references.items() if len(dois) > 0]
- _print_rect_list(printables, 4)
- print()
-
- print(' Methodology')
- print(' ===========')
- printables = [meth for meth, dois in methodology_references.items() if len(dois) > 0]
- _print_rect_list(printables, 4)
- print()
-
- print(' Functionals')
- print(' ===========')
- printables = [xc_info.path_safe_name for xc, xc_info in data.functionals.functionals.items() if len(xc_info.dois) > 0]
- _print_rect_list(printables, 4)
- print()
-
- return
-
- objs = args.objects
- if len(objs) == 1 and os.path.isfile(objs[0]):
- with open(objs[0]) as inp:
- objs = [line.strip() for line in inp.readlines()]
-
- with Docx(file=args.output, overwrite=True) as out:
- for obj in objs:
- paragraphs = None # try to format a functional
- try:
- xc_info = data.functionals.get(obj)
- print('Functional', obj)
- paragraph_title = f'XC-Functional: {xc_info.name_html}'
- paragraphs = format_paragraph(xc_info.dois, style=args.style or 'wiley')
-
- except KeyError:
- pass
-
- # if its not a functional we look in the programs
- if obj.lower() in program_references:
- print('Program', obj)
- paragraph_title = f'Program: {obj}'
- paragraphs = format_paragraph(program_references[obj.lower()], style=args.style or 'wiley')
-
- # and the methodologies
- if obj.lower() in methodology_references:
- print('Methodology', obj)
- paragraph_title = f'Method: {obj}'
- paragraphs = format_paragraph(methodology_references[obj.lower()], style=args.style or 'wiley')
-
- # if we still dont have a paragraphs we check if it is a DOI
- if paragraphs is None and obj.startswith('10.'):
- print('DOI')
- paragraph_title = f'DOI: {obj}'
- paragraphs = format_paragraph([obj], style=args.style or 'wiley')
-
- if paragraphs is None:
- spell_check.make_suggestion(obj, available_citations, ignore_case=True)
- continue
-
- out.write_paragraph(paragraph_title)
- for paragraph in paragraphs:
- out.write_paragraph(paragraph, alignment=WD_ALIGN_PARAGRAPH.JUSTIFY)
- out.write_paragraph(' ')
-
- out.open()
+""" Module containing functions for generating citations"""
+import argparse
+from tcutility import cite, data, spell_check
+import os
+import docx
+from docx.shared import Pt
+from docx.enum.text import WD_ALIGN_PARAGRAPH
+import htmldocx
+from math import ceil
+
+
+class Docx:
+ '''
+ Small class that handles writing to a docx file. This should and will be moved to its own module in TCutility soon.
+ '''
+ def __init__(self, file='test.docx', overwrite=False):
+ self.file = file
+ if not os.path.exists(file) or overwrite:
+ self.doc = docx.Document()
+ else:
+ self.doc = docx.Document(file)
+
+ self.doc.styles['Normal'].font.name = 'Times New Roman'
+ self.doc.styles['Normal'].font.size = Pt(12)
+ self.doc.styles['Normal'].paragraph_format.space_after = 0
+ self.html_parser = htmldocx.HtmlToDocx()
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, *args):
+ self.doc.save(self.file)
+
+ def write_paragraph(self, text, alignment=WD_ALIGN_PARAGRAPH.LEFT):
+ '''
+ Write a piece of text as a pragraph to this Docx file.
+ This function will parse any HTML that is given in the text.
+ E.g. you can use the tags to make a piece of text bold.
+ '''
+ self.html_parser.add_html_to_document(text, self.doc)
+ self.doc.paragraphs[-1].alignment = alignment
+
+ def open(self):
+ '''
+ Open this file in Word.
+ '''
+ os.system(f'open {self.file}')
+
+
+def create_subparser(parent_parser: argparse.ArgumentParser):
+ desc = """Generate citations for objects. Currently supports generating citations for functionals, basis-sets, programs, methodologies and DOIs.
+This program also generates, and if possible, opens a Word document that contains the formatted citations.
+Multiple objects can be given separated by spaces.
+If the supplied object is also a file path it will read each line as a separate object.
+
+Example usage:
+
+ > tc cite ADF
+ Program ORCA
+ [10.1002/wcms.81] F. Neese, WIREs Comput. Mol. Sci. 2011, 2, 73-78.
+ [10.1063/5.0004608] F. Neese, F. Wennmohs, U. Becker, C. Riplinger, J. Chem. Phys. 2020, 152.
+ [10.1002/wcms.1606] F. Neese, WIREs Comput. Mol. Sci. 2022, 12.
+
+ > tc cite BP86 BLYP OLYP OPBE D3BJ
+ Functional BP86
+ [10.1103/PhysRevA.38.3098] A. D. Becke, Phys. Rev. A 1988, 38, 3098-3100.
+ [10.1103/PhysRevB.33.8800] J. P. Perdew, W. Yue, Phys. Rev. B 1986, 33, 8800-8802.
+ Functional BLYP
+ [10.1103/PhysRevA.38.3098] A. D. Becke, Phys. Rev. A 1988, 38, 3098-3100.
+ [10.1103/PhysRevB.37.785] C. Lee, W. Yang, R. G. Parr, Phys. Rev. B 1988, 37, 785-789.
+ Functional OLYP
+ [10.1080/00268970010018431] N. C. Handy, A. J. Cohen, Mol. Phys. 2001, 99, 403-412.
+ [10.1103/PhysRevB.37.785] C. Lee, W. Yang, R. G. Parr, Phys. Rev. B 1988, 37, 785-789.
+ Functional OPBE
+ [10.1080/00268970010018431] N. C. Handy, A. J. Cohen, Mol. Phys. 2001, 99, 403-412.
+ [10.1103/PhysRevLett.77.3865] J. P. Perdew, K. Burke, M. Ernzerhof, Phys. Rev. Lett. 1996, 77, 3865-3868.
+ Methodology D3BJ
+ [10.1002/jcc.21759] S. Grimme, S. Ehrlich, L. Goerigk, J. Comput. Chem. 2011, 32, 1456-1465.
+ """
+ subparser = parent_parser.add_parser('cite', help=desc, description=desc)
+ subparser.add_argument("objects",
+ type=str,
+ help="the objects to generate citations for. This can be functionals, basis-sets, programs, methodologies or DOIs.",
+ nargs='*')
+ subparser.add_argument("-w", "--wiley",
+ help="set the citation style to Wiley. This is the default style.",
+ dest='style',
+ action='store_const',
+ const='wiley')
+ subparser.add_argument("-a", "--acs",
+ help="set the citation style to ACS.",
+ dest='style',
+ action='store_const',
+ const='acs')
+ subparser.add_argument("-r", "--rsc",
+ help="set the citation style to RSC.",
+ dest='style',
+ action='store_const',
+ const='rsc')
+ subparser.add_argument("-o", "--output",
+ help="the output Word file to write the citations to.",
+ type=str,
+ default="citations.docx")
+ subparser.add_argument("-l", "--list",
+ help="list currently available citations.",
+ action='store_true',
+ default=False)
+
+
+program_references = {
+ 'ams': [
+ '10.1002/jcc.1056',
+ '10.1007/s002140050353',
+ ],
+ 'adf': [
+ '10.1002/jcc.1056',
+ '10.1007/s002140050353',
+ ],
+ 'orca': [
+ '10.1002/wcms.81',
+ '10.1063/5.0004608',
+ '10.1002/wcms.1606',
+ ],
+ 'dftb': [],
+ 'xtb': [],
+ 'cosmo': [],
+ 'crest': [],
+ 'pyfrag': [
+ '10.1002/jcc.20786',
+ '10.1002/jcc.25871',
+ '10.5281/zenodo.1045523',
+ ],
+ 'pyorb': [],
+ 'cylview': [],
+}
+
+methodology_references = {
+ 'fmatsfo': [],
+ 'eda': [
+ '10.1002/9780470125922.ch1',
+ '10.1515/9783110660074-008'
+ ],
+ 'asm': [
+ '10.1038/s41596-019-0265-0',
+ '10.1002/(SICI)1096-987X(19990115)20:1<114::AID-JCC12>3.0.CO;2-L',
+ '10.1039/B926828F',
+ '10.1039/C4CS00055B',
+ '10.1002/wcms.1221',
+ '10.1002/anie.201701486',
+ '10.1039/D1CC02042K',
+ ],
+ 'zora': [
+ '10.1063/1.466059',
+ '10.1063/1.467943',
+ ],
+ 'ksmo': [],
+ 'vdd': [
+ '10.1002/jcc.10351',
+ '10.1002/jcc.27184',
+ '10.1039/c5cp07483e',
+ ],
+ 'hydrogen-bonding': [],
+ 'halogen-bonding': [],
+ 'chalcogen-bonding': [],
+ 'pnictogen-bondding': [],
+ 'zlm-fit': [
+ '10.1021/ct500172n',
+ ],
+ 'becke-grid': [
+ '1.1002/jcc.23323',
+ ],
+ 'sto': [
+ '10.1002/jcc.10255',
+ ],
+ 'vibrational-analysis': [
+ '10.1016/s0010-4655(96)00120-8',
+ '10.1016/S0010-4655(96)00119-1',
+ '10.1002/qua.20653',
+ ],
+ 'irc': [],
+ 'd3': ['10.1063/1.3382344'],
+ 'd3bj': ['10.1002/jcc.21759'],
+ 'd4': ['10.1063/1.5090222'],
+}
+
+
+doi_order = []
+def format_paragraph(dois, style):
+ paragraphs = []
+ for doi in dois:
+ if doi not in doi_order:
+ doi_order.append(doi)
+ try:
+ citation = cite.cite(doi, style=style, mode="plain")
+ except Exception as exp:
+ print('\t' + str(exp))
+ raise
+ return
+
+ print(f' [{doi}] {citation}')
+ paragraph = f'[{doi_order.index(doi) + 1}] {cite.cite(doi, style=style, mode="html")}'
+ paragraphs.append(paragraph)
+
+ return paragraphs
+
+
+def _print_rect_list(printables, spaces_before=0):
+ '''
+ This function prints a list of strings in a rectangle to the output.
+ This is similar to what the ls program does in unix.
+ '''
+ n_shell_col = os.get_terminal_size().columns
+ # we first have to determine the correct dimensions of our rectangle
+ for ncol in range(1, n_shell_col):
+ # the number of rows for the number of columns
+ nrows = ceil(len(printables) / ncol)
+ # we then get what the rectangle would be
+ mat = [printables[i * ncol: (i+1) * ncol] for i in range(nrows)]
+ # and determine for each column the width
+ col_lens = [max([len(row[i]) for row in mat if i < len(row)] + [0]) for i in range(ncol)]
+ # then calculate the length of each row based on the column lengths
+ # we use a spacing of 2 spaces between each column
+ row_len = spaces_before + sum(col_lens) + 2 * len(col_lens) - 2
+
+ # if the rows are too big we exit the loop
+ if row_len > n_shell_col:
+ break
+
+ # store the previous loops results
+ prev_col_lens = col_lens
+ prev_mat = mat
+
+ # then print the strings with the right column widths
+ for row in prev_mat:
+ print(" " * spaces_before + " ".join([x.ljust(col_len) for x, col_len in zip(row, prev_col_lens)]))
+
+
+def main(args: argparse.Namespace):
+ available_citations = list(program_references.keys()) + list(methodology_references.keys()) + list(data.functionals.functionals.keys())
+ if args.list:
+ print('OBJECTS WITH AVAILABLE REFERENCES:')
+ print(' Programs')
+ print(' ========')
+ printables = [prog for prog, dois in program_references.items() if len(dois) > 0]
+ _print_rect_list(printables, 4)
+ print()
+
+ print(' Methodology')
+ print(' ===========')
+ printables = [meth for meth, dois in methodology_references.items() if len(dois) > 0]
+ _print_rect_list(printables, 4)
+ print()
+
+ print(' Functionals')
+ print(' ===========')
+ printables = [xc_info.path_safe_name for xc, xc_info in data.functionals.functionals.items() if len(xc_info.dois) > 0]
+ _print_rect_list(printables, 4)
+ print()
+
+ return
+
+ objs = args.objects
+ if len(objs) == 1 and os.path.isfile(objs[0]):
+ with open(objs[0]) as inp:
+ objs = [line.strip() for line in inp.readlines()]
+
+ with Docx(file=args.output, overwrite=True) as out:
+ for obj in objs:
+ paragraphs = None # try to format a functional
+ try:
+ xc_info = data.functionals.get(obj)
+ print('Functional', obj)
+ paragraph_title = f'XC-Functional: {xc_info.name_html}'
+ paragraphs = format_paragraph(xc_info.dois, style=args.style or 'wiley')
+
+ except KeyError:
+ pass
+
+ # if its not a functional we look in the programs
+ if obj.lower() in program_references:
+ print('Program', obj)
+ paragraph_title = f'Program: {obj}'
+ paragraphs = format_paragraph(program_references[obj.lower()], style=args.style or 'wiley')
+
+ # and the methodologies
+ if obj.lower() in methodology_references:
+ print('Methodology', obj)
+ paragraph_title = f'Method: {obj}'
+ paragraphs = format_paragraph(methodology_references[obj.lower()], style=args.style or 'wiley')
+
+ # if we still dont have a paragraphs we check if it is a DOI
+ if paragraphs is None and obj.startswith('10.'):
+ print('DOI')
+ paragraph_title = f'DOI: {obj}'
+ paragraphs = format_paragraph([obj], style=args.style or 'wiley')
+
+ if paragraphs is None:
+ spell_check.make_suggestion(obj, available_citations, ignore_case=True)
+ continue
+
+ out.write_paragraph(paragraph_title)
+ for paragraph in paragraphs:
+ out.write_paragraph(paragraph, alignment=WD_ALIGN_PARAGRAPH.JUSTIFY)
+ out.write_paragraph(' ')
+
+ out.open()
diff --git a/src/tcutility/cli_scripts/concatenate_irc.py b/src/tcutility/cli_scripts/concatenate_irc.py
index 12077a02..91b774e9 100644
--- a/src/tcutility/cli_scripts/concatenate_irc.py
+++ b/src/tcutility/cli_scripts/concatenate_irc.py
@@ -1,185 +1,185 @@
-import argparse
-import pathlib as pl
-from typing import List, Tuple, Union
-
-import numpy as np
-from scm.plams import Molecule
-from tcutility.log import log
-from tcutility.results import read
-from tcutility.results.result import Result
-
-
-def _create_result_objects(job_dirs: Union[List[str], List[pl.Path]]) -> List[Result]:
- """Creates a list of Result objects from a list of directories."""
- return [read(pl.Path(file)) for file in job_dirs]
-
-
-def _get_converged_energies(res: Result) -> List[float]:
- """Returns a list of energies of the converged geometries."""
- return [energy for converged, energy in zip(res.history.converged, res.history.energy) if converged] # type: ignore
-
-
-def _get_converged_molecules(res: Result) -> List[Molecule]:
- """Returns a list of molecules of the converged geometries."""
- return [mol for converged, mol in zip(res.history.converged, res.history.molecule) if converged] # type: ignore
-
-
-def _concatenate_irc_trajectories_by_rmsd(irc_trajectories: List[List[Molecule]], energies: List[List[float]]) -> Tuple[List[Molecule], List[float]]:
- """
- Concatenates lists of molecules by comparing the RMSD values of the end and beginnings of the trajectory.
- The entries that are closest to each other are used to concatenate the trajectories.
-
- Parameters:
- irc_trajectories: A list of lists of Molecule objects representing the trajectories.
- energies: A list of lists of float values representing the energies.
-
- Returns:
- A tuple containing a list of Molecule objects and a list of energies.
-
- Raises:
- ValueError: If the RMSD values are not as expected.
- """
- concatenated_mols: List[Molecule] = irc_trajectories[0][::-1]
- concatenated_energies: List[float] = energies[0][::-1]
-
- for traj_index in range(len(irc_trajectories) - 1):
- # Calculate RMSD values of two connected trajectories to compare the connection points / molecules
- rmsd_matrix = np.array([[Molecule.rmsd(irc_trajectories[traj_index][i], irc_trajectories[traj_index + 1][j]) for j in [0, -1]] for i in [0, -1]])
-
- # Flatten the matrix and find the index of the minimum value
- lowest_index = np.argmin(rmsd_matrix.flatten())
-
- log(f"Lowest RMSD values: {rmsd_matrix.flatten()}", 10)
-
- # Starting points are connected
- if lowest_index == 0:
- concatenated_mols += irc_trajectories[traj_index + 1][1:]
- concatenated_energies += energies[traj_index + 1][1:]
- # Ending points are connected
- elif lowest_index == 1:
- concatenated_mols += irc_trajectories[traj_index + 1][::-1]
- concatenated_energies += energies[traj_index + 1][::-1]
- # Something went wrong
- else:
- raise ValueError(f"The RMSD values are not as expected: {rmsd_matrix.flatten()} with {lowest_index=}.")
-
- return concatenated_mols, concatenated_energies
-
-
-def concatenate_irc_trajectories(result_objects: List[Result], user_log_level: int, reverse: bool = False) -> Tuple[List[Molecule], List[float]]:
- """
- Concatenates trajectories from irc calculations, often being forward and backward, through the RMSD values.
-
- Parameters:
- job_dirs: A list of directories containing the ams.rkf files.
- user_log_level: The log level set by the user.
- reverse: A boolean indicating whether to reverse the trajectory. Default is False.
-
- Returns:
- A tuple containing a list of Molecule objects and a list of energies.
-
- Raises:
- Exception: If an exception is raised in the try block, it is caught and printed.
- """
- traj_geometries: List[List[Molecule]] = [[] for _ in result_objects]
- traj_energies: List[List[float]] = [[] for _ in result_objects]
-
- for i, res_obj in enumerate(result_objects):
- log(f"Processing {res_obj.files.root}", user_log_level) # type: ignore # root is a valid attribute
- traj_geometries[i] = _get_converged_molecules(res_obj)
- traj_energies[i] = _get_converged_energies(res_obj)
- log(f"IRC trajectory {i+1} has {len(traj_geometries[i])} geometries.", user_log_level)
-
- log("Concatenating trajectories...", user_log_level)
- concatenated_mols, concatenated_energies = _concatenate_irc_trajectories_by_rmsd(traj_geometries, traj_energies)
-
- if reverse:
- log("Reversing the trajectory...", user_log_level)
- concatenated_mols = concatenated_mols[::-1]
- concatenated_energies = concatenated_energies[::-1]
- return concatenated_mols, concatenated_energies
-
-
-def _xyz_format(mol: Molecule) -> str:
- """Returns a string representation of a molecule in the xyz format, e.g.:
-
- Geometry 1, Energy: -0.5 Ha
- C 0.00000000 0.00000000 0.00000000
- ...
- """
- return "\n".join([f"{atom.symbol:6s}{atom.x:16.8f}{atom.y:16.8f}{atom.z:16.8f}" for atom in mol.atoms])
-
-
-def _amv_format(mol: Molecule, step: int, energy: Union[float, None] = None) -> str:
- """Returns a string representation of a molecule in the amv format, e.g.:
-
- Geometry 1, Energy: -0.5 Ha
- C 0.00000000 0.00000000 0.00000000
- ...
-
- If no energy is provided, the energy is not included in the string representation"""
- if energy is None:
- return f"Geometry {step}\n" + "\n".join([f"{atom.symbol:6s}{atom.x:16.8f}{atom.y:16.8f}{atom.z:16.8f}" for atom in mol.atoms])
- return f"Geometry {step}, Energy: {energy} Ha\n" + "\n".join([f"{atom.symbol:6s}{atom.x:16.8f}{atom.y:16.8f}{atom.z:16.8f}" for atom in mol.atoms])
-
-
-def write_mol_to_xyz_file(mols: Union[List[Molecule], Molecule], filename: Union[str, pl.Path]) -> None:
- """Writes a list of molecules to a file in xyz format."""
- mols = mols if isinstance(mols, list) else [mols]
- out_file = pl.Path(f"{filename}.xyz")
-
- [mol.delete_all_bonds() for mol in mols]
- write_string = "\n\n".join([_xyz_format(mol) for mol in mols])
- out_file.write_text(write_string)
-
- return None
-
-
-def write_mol_to_amv_file(mols: Union[List[Molecule], Molecule], energies: Union[List[float], None], filename: Union[str, pl.Path]) -> None:
- """Writes a list of molecules to a file in amv format."""
- mols = mols if isinstance(mols, list) else [mols]
- out_file = pl.Path(f"{filename}.amv")
- energies = energies if energies is not None else [0.0 for _ in mols]
-
- [mol.delete_all_bonds() for mol in mols]
- write_string = "\n\n".join([_amv_format(mol, step, energy) for step, (mol, energy) in enumerate(zip(mols, energies), 1)])
- out_file.write_text(write_string)
-
- return None
-
-
-def create_subparser(parent_parser: argparse.ArgumentParser):
- subparser = parent_parser.add_parser( # type: ignore # add_parser is a valid method
- "concat-irc",
- help="Combine separated IRC paths.",
- description="""
- Scripts that takes in two or more directories containing an IRC file ("ams.rkf") and concatenates them through the RMSD values. Produces a .xyz and .amv file in the specified output directory.
- The output directory is specified with the -o flag. If not specified, the output will be written to the current working directory.
- In addition, the -r flag can be used to reverse the trajectory.
-
- Note: ALWAYS visualize the .amv file in AMSView to verify the trajectory.
- """,
- )
-
- # Add the arguments
- subparser.add_argument("jobs", nargs="*", type=str, help="Job directories containing the ams.rkf of the irc calculation(s)")
- subparser.add_argument("-r", "--reverse", action="store_true", help="Reverses the trajectory")
- subparser.add_argument("-o", "--output", type=str, default="./", help="Directory in which the outputfile will be saved")
- subparser.add_argument("-l", "--log_level", type=int, default=20, help="Set the log level. The lower the value, the more is printed. Default is 20 (info).")
-
-
-def main(args):
- outputdir = pl.Path(args.output).resolve()
- job_dirs = [pl.Path(directory).resolve() for directory in args.jobs]
-
- if len(job_dirs) > 2:
- raise ValueError("Only two IRC paths can be concatenated at a time as is currently implemented.")
-
- res_objects = _create_result_objects(job_dirs)
- molecules, energies = concatenate_irc_trajectories(res_objects, args.log_level, args.reverse)
-
- outputdir.mkdir(parents=True, exist_ok=True)
- write_mol_to_amv_file(molecules, energies, outputdir / "read_concatenated_mols")
- write_mol_to_xyz_file(molecules, outputdir / "read_concatenated_mols")
-
- log(f"Output written to {outputdir / 'concatenated_mols'}")
+import argparse
+import pathlib as pl
+from typing import List, Tuple, Union
+
+import numpy as np
+from scm.plams import Molecule
+from tcutility.log import log
+from tcutility.results import read
+from tcutility.results.result import Result
+
+
+def _create_result_objects(job_dirs: Union[List[str], List[pl.Path]]) -> List[Result]:
+ """Creates a list of Result objects from a list of directories."""
+ return [read(pl.Path(file)) for file in job_dirs]
+
+
+def _get_converged_energies(res: Result) -> List[float]:
+ """Returns a list of energies of the converged geometries."""
+ return [energy for converged, energy in zip(res.history.converged, res.history.energy) if converged] # type: ignore
+
+
+def _get_converged_molecules(res: Result) -> List[Molecule]:
+ """Returns a list of molecules of the converged geometries."""
+ return [mol for converged, mol in zip(res.history.converged, res.history.molecule) if converged] # type: ignore
+
+
+def _concatenate_irc_trajectories_by_rmsd(irc_trajectories: List[List[Molecule]], energies: List[List[float]]) -> Tuple[List[Molecule], List[float]]:
+ """
+ Concatenates lists of molecules by comparing the RMSD values of the end and beginnings of the trajectory.
+ The entries that are closest to each other are used to concatenate the trajectories.
+
+ Parameters:
+ irc_trajectories: A list of lists of Molecule objects representing the trajectories.
+ energies: A list of lists of float values representing the energies.
+
+ Returns:
+ A tuple containing a list of Molecule objects and a list of energies.
+
+ Raises:
+ ValueError: If the RMSD values are not as expected.
+ """
+ concatenated_mols: List[Molecule] = irc_trajectories[0][::-1]
+ concatenated_energies: List[float] = energies[0][::-1]
+
+ for traj_index in range(len(irc_trajectories) - 1):
+ # Calculate RMSD values of two connected trajectories to compare the connection points / molecules
+ rmsd_matrix = np.array([[Molecule.rmsd(irc_trajectories[traj_index][i], irc_trajectories[traj_index + 1][j]) for j in [0, -1]] for i in [0, -1]])
+
+ # Flatten the matrix and find the index of the minimum value
+ lowest_index = np.argmin(rmsd_matrix.flatten())
+
+ log(f"Lowest RMSD values: {rmsd_matrix.flatten()}", 10)
+
+ # Starting points are connected
+ if lowest_index == 0:
+ concatenated_mols += irc_trajectories[traj_index + 1][1:]
+ concatenated_energies += energies[traj_index + 1][1:]
+ # Ending points are connected
+ elif lowest_index == 1:
+ concatenated_mols += irc_trajectories[traj_index + 1][::-1]
+ concatenated_energies += energies[traj_index + 1][::-1]
+ # Something went wrong
+ else:
+ raise ValueError(f"The RMSD values are not as expected: {rmsd_matrix.flatten()} with {lowest_index=}.")
+
+ return concatenated_mols, concatenated_energies
+
+
+def concatenate_irc_trajectories(result_objects: List[Result], user_log_level: int, reverse: bool = False) -> Tuple[List[Molecule], List[float]]:
+ """
+ Concatenates trajectories from irc calculations, often being forward and backward, through the RMSD values.
+
+ Parameters:
+ job_dirs: A list of directories containing the ams.rkf files.
+ user_log_level: The log level set by the user.
+ reverse: A boolean indicating whether to reverse the trajectory. Default is False.
+
+ Returns:
+ A tuple containing a list of Molecule objects and a list of energies.
+
+ Raises:
+ Exception: If an exception is raised in the try block, it is caught and printed.
+ """
+ traj_geometries: List[List[Molecule]] = [[] for _ in result_objects]
+ traj_energies: List[List[float]] = [[] for _ in result_objects]
+
+ for i, res_obj in enumerate(result_objects):
+ log(f"Processing {res_obj.files.root}", user_log_level) # type: ignore # root is a valid attribute
+ traj_geometries[i] = _get_converged_molecules(res_obj)
+ traj_energies[i] = _get_converged_energies(res_obj)
+ log(f"IRC trajectory {i+1} has {len(traj_geometries[i])} geometries.", user_log_level)
+
+ log("Concatenating trajectories...", user_log_level)
+ concatenated_mols, concatenated_energies = _concatenate_irc_trajectories_by_rmsd(traj_geometries, traj_energies)
+
+ if reverse:
+ log("Reversing the trajectory...", user_log_level)
+ concatenated_mols = concatenated_mols[::-1]
+ concatenated_energies = concatenated_energies[::-1]
+ return concatenated_mols, concatenated_energies
+
+
+def _xyz_format(mol: Molecule) -> str:
+ """Returns a string representation of a molecule in the xyz format, e.g.:
+
+ Geometry 1, Energy: -0.5 Ha
+ C 0.00000000 0.00000000 0.00000000
+ ...
+ """
+ return "\n".join([f"{atom.symbol:6s}{atom.x:16.8f}{atom.y:16.8f}{atom.z:16.8f}" for atom in mol.atoms])
+
+
+def _amv_format(mol: Molecule, step: int, energy: Union[float, None] = None) -> str:
+ """Returns a string representation of a molecule in the amv format, e.g.:
+
+ Geometry 1, Energy: -0.5 Ha
+ C 0.00000000 0.00000000 0.00000000
+ ...
+
+ If no energy is provided, the energy is not included in the string representation"""
+ if energy is None:
+ return f"Geometry {step}\n" + "\n".join([f"{atom.symbol:6s}{atom.x:16.8f}{atom.y:16.8f}{atom.z:16.8f}" for atom in mol.atoms])
+ return f"Geometry {step}, Energy: {energy} Ha\n" + "\n".join([f"{atom.symbol:6s}{atom.x:16.8f}{atom.y:16.8f}{atom.z:16.8f}" for atom in mol.atoms])
+
+
+def write_mol_to_xyz_file(mols: Union[List[Molecule], Molecule], filename: Union[str, pl.Path]) -> None:
+ """Writes a list of molecules to a file in xyz format."""
+ mols = mols if isinstance(mols, list) else [mols]
+ out_file = pl.Path(f"{filename}.xyz")
+
+ [mol.delete_all_bonds() for mol in mols]
+ write_string = "\n\n".join([_xyz_format(mol) for mol in mols])
+ out_file.write_text(write_string)
+
+ return None
+
+
+def write_mol_to_amv_file(mols: Union[List[Molecule], Molecule], energies: Union[List[float], None], filename: Union[str, pl.Path]) -> None:
+ """Writes a list of molecules to a file in amv format."""
+ mols = mols if isinstance(mols, list) else [mols]
+ out_file = pl.Path(f"{filename}.amv")
+ energies = energies if energies is not None else [0.0 for _ in mols]
+
+ [mol.delete_all_bonds() for mol in mols]
+ write_string = "\n\n".join([_amv_format(mol, step, energy) for step, (mol, energy) in enumerate(zip(mols, energies), 1)])
+ out_file.write_text(write_string)
+
+ return None
+
+
+def create_subparser(parent_parser: argparse.ArgumentParser):
+ subparser = parent_parser.add_parser( # type: ignore # add_parser is a valid method
+ "concat-irc",
+ help="Combine separated IRC paths.",
+ description="""
+ Scripts that takes in two or more directories containing an IRC file ("ams.rkf") and concatenates them through the RMSD values. Produces a .xyz and .amv file in the specified output directory.
+ The output directory is specified with the -o flag. If not specified, the output will be written to the current working directory.
+ In addition, the -r flag can be used to reverse the trajectory.
+
+ Note: ALWAYS visualize the .amv file in AMSView to verify the trajectory.
+ """,
+ )
+
+ # Add the arguments
+ subparser.add_argument("jobs", nargs="*", type=str, help="Job directories containing the ams.rkf of the irc calculation(s)")
+ subparser.add_argument("-r", "--reverse", action="store_true", help="Reverses the trajectory")
+ subparser.add_argument("-o", "--output", type=str, default="./", help="Directory in which the outputfile will be saved")
+ subparser.add_argument("-l", "--log_level", type=int, default=20, help="Set the log level. The lower the value, the more is printed. Default is 20 (info).")
+
+
+def main(args):
+ outputdir = pl.Path(args.output).resolve()
+ job_dirs = [pl.Path(directory).resolve() for directory in args.jobs]
+
+ if len(job_dirs) > 2:
+ raise ValueError("Only two IRC paths can be concatenated at a time as is currently implemented.")
+
+ res_objects = _create_result_objects(job_dirs)
+ molecules, energies = concatenate_irc_trajectories(res_objects, args.log_level, args.reverse)
+
+ outputdir.mkdir(parents=True, exist_ok=True)
+ write_mol_to_amv_file(molecules, energies, outputdir / "read_concatenated_mols")
+ write_mol_to_xyz_file(molecules, outputdir / "read_concatenated_mols")
+
+ log(f"Output written to {outputdir / 'concatenated_mols'}")
diff --git a/src/tcutility/cli_scripts/job_script.py b/src/tcutility/cli_scripts/job_script.py
index 262a5b44..2d1b16b7 100644
--- a/src/tcutility/cli_scripts/job_script.py
+++ b/src/tcutility/cli_scripts/job_script.py
@@ -1,4 +1,4 @@
-""" Module containing functions for quickly submitting geometry optimization jobs via the command line """
+""" Module containing functions for quickly submitting geometry optimization jobs via the command line """
import argparse
from tcutility import job as tcjob
import tcutility
diff --git a/src/tcutility/data/_atom_data_info/__init__.py b/src/tcutility/data/_atom_data_info/__init__.py
index 5f282702..e69de29b 100755
--- a/src/tcutility/data/_atom_data_info/__init__.py
+++ b/src/tcutility/data/_atom_data_info/__init__.py
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/tcutility/data/_atom_data_info/color.txt b/src/tcutility/data/_atom_data_info/color.txt
index 50ed9a4e..f263a7b5 100755
--- a/src/tcutility/data/_atom_data_info/color.txt
+++ b/src/tcutility/data/_atom_data_info/color.txt
@@ -1,109 +1,109 @@
-1, 255, 255, 255
-2, 217, 255, 255
-3, 204, 128, 255
-4, 194, 255, 0
-5, 255, 181, 181
-6, 144, 144, 144
-7, 48, 80, 248
-8, 255, 13, 13
-9, 144, 224, 80
-10, 179, 227, 245
-11, 171, 92, 242
-12, 138, 255, 0
-13, 191, 166, 166
-14, 240, 200, 160
-15, 255, 128, 0
-16, 255, 255, 48
-17, 31, 240, 31
-18, 128, 209, 227
-19, 143, 64, 212
-20, 61, 255, 0
-21, 230, 230, 230
-22, 191, 194, 199
-23, 166, 166, 171
-24, 138, 153, 199
-25, 156, 122, 199
-26, 224, 102, 51
-27, 240, 144, 160
-28, 80, 208, 80
-29, 200, 128, 51
-30, 125, 128, 176
-31, 194, 143, 143
-32, 102, 143, 143
-33, 189, 128, 227
-34, 255, 161, 0
-35, 166, 41, 41
-36, 92, 184, 209
-37, 112, 46, 176
-38, 0, 255, 0
-39, 148, 255, 255
-40, 148, 224, 224
-41, 115, 194, 201
-42, 84, 181, 181
-43, 59, 158, 158
-44, 36, 143, 143
-45, 10, 125, 140
-46, 0, 105, 133
-47, 192, 192, 192
-48, 255, 217, 143
-49, 166, 117, 115
-50, 102, 128, 128
-51, 158, 99, 181
-52, 212, 122, 0
-53, 148, 0, 148
-54, 66, 158, 176
-55, 87, 23, 143
-56, 0, 201, 0
-57, 112, 212, 255
-58, 255, 255, 199
-59, 217, 255, 199
-60, 199, 255, 199
-61, 163, 255, 199
-62, 143, 255, 199
-63, 97, 255, 199
-64, 69, 255, 199
-65, 48, 255, 199
-66, 31, 255, 199
-67, 0, 255, 156
-68, 0, 230, 117
-69, 0, 212, 82
-70, 0, 191, 56
-71, 0, 171, 36
-72, 77, 194, 255
-73, 77, 166, 255
-74, 33, 148, 214
-75, 38, 125, 171
-76, 38, 102, 150
-77, 23, 84, 135
-78, 208, 208, 224
-79, 255, 209, 35
-80, 184, 184, 208
-81, 166, 84, 77
-82, 87, 89, 97
-83, 158, 79, 181
-84, 171, 92, 0
-85, 117, 79, 69
-86, 66, 130, 150
-87, 66, 0, 102
-88, 0, 125, 0
-89, 112, 171, 250
-90, 0, 186, 255
-91, 0, 161, 255
-92, 0, 143, 255
-93, 0, 128, 255
-94, 0, 107, 255
-95, 84, 92, 242
-96, 120, 92, 227
-97, 138, 79, 227
-98, 161, 54, 212
-99, 179, 31, 212
-100, 179, 31, 186
-101, 179, 13, 166
-102, 189, 13, 135
-103, 199, 0, 102
-104, 204, 0, 89
-105, 209, 0, 79
-106, 217, 0, 69
-107, 224, 0, 56
-108, 230, 0, 46
+1, 255, 255, 255
+2, 217, 255, 255
+3, 204, 128, 255
+4, 194, 255, 0
+5, 255, 181, 181
+6, 144, 144, 144
+7, 48, 80, 248
+8, 255, 13, 13
+9, 144, 224, 80
+10, 179, 227, 245
+11, 171, 92, 242
+12, 138, 255, 0
+13, 191, 166, 166
+14, 240, 200, 160
+15, 255, 128, 0
+16, 255, 255, 48
+17, 31, 240, 31
+18, 128, 209, 227
+19, 143, 64, 212
+20, 61, 255, 0
+21, 230, 230, 230
+22, 191, 194, 199
+23, 166, 166, 171
+24, 138, 153, 199
+25, 156, 122, 199
+26, 224, 102, 51
+27, 240, 144, 160
+28, 80, 208, 80
+29, 200, 128, 51
+30, 125, 128, 176
+31, 194, 143, 143
+32, 102, 143, 143
+33, 189, 128, 227
+34, 255, 161, 0
+35, 166, 41, 41
+36, 92, 184, 209
+37, 112, 46, 176
+38, 0, 255, 0
+39, 148, 255, 255
+40, 148, 224, 224
+41, 115, 194, 201
+42, 84, 181, 181
+43, 59, 158, 158
+44, 36, 143, 143
+45, 10, 125, 140
+46, 0, 105, 133
+47, 192, 192, 192
+48, 255, 217, 143
+49, 166, 117, 115
+50, 102, 128, 128
+51, 158, 99, 181
+52, 212, 122, 0
+53, 148, 0, 148
+54, 66, 158, 176
+55, 87, 23, 143
+56, 0, 201, 0
+57, 112, 212, 255
+58, 255, 255, 199
+59, 217, 255, 199
+60, 199, 255, 199
+61, 163, 255, 199
+62, 143, 255, 199
+63, 97, 255, 199
+64, 69, 255, 199
+65, 48, 255, 199
+66, 31, 255, 199
+67, 0, 255, 156
+68, 0, 230, 117
+69, 0, 212, 82
+70, 0, 191, 56
+71, 0, 171, 36
+72, 77, 194, 255
+73, 77, 166, 255
+74, 33, 148, 214
+75, 38, 125, 171
+76, 38, 102, 150
+77, 23, 84, 135
+78, 208, 208, 224
+79, 255, 209, 35
+80, 184, 184, 208
+81, 166, 84, 77
+82, 87, 89, 97
+83, 158, 79, 181
+84, 171, 92, 0
+85, 117, 79, 69
+86, 66, 130, 150
+87, 66, 0, 102
+88, 0, 125, 0
+89, 112, 171, 250
+90, 0, 186, 255
+91, 0, 161, 255
+92, 0, 143, 255
+93, 0, 128, 255
+94, 0, 107, 255
+95, 84, 92, 242
+96, 120, 92, 227
+97, 138, 79, 227
+98, 161, 54, 212
+99, 179, 31, 212
+100, 179, 31, 186
+101, 179, 13, 166
+102, 189, 13, 135
+103, 199, 0, 102
+104, 204, 0, 89
+105, 209, 0, 79
+106, 217, 0, 69
+107, 224, 0, 56
+108, 230, 0, 46
109, 235, 0, 38
\ No newline at end of file
diff --git a/src/tcutility/data/_atom_data_info/name.txt b/src/tcutility/data/_atom_data_info/name.txt
index 894d84a8..5c4c586d 100755
--- a/src/tcutility/data/_atom_data_info/name.txt
+++ b/src/tcutility/data/_atom_data_info/name.txt
@@ -1,120 +1,120 @@
-1, hydrogen
-2, helium
-3, lithium
-4, beryllium
-5, boron
-6, carbon
-7, nitrogen
-8, oxygen
-9, fluorine
-10, neon
-11, sodium
-12, magnesium
-13, aluminium
-14, silicon
-15, phosphorus
-16, sulfur
-17, chlorine
-18, argon
-19, potassium
-20, calcium
-21, scandium
-22, titanium
-23, vanadium
-24, chromium
-25, manganese
-26, iron
-27, cobalt
-28, nickel
-29, copper
-30, zinc
-31, gallium
-32, germanium
-33, arsenic
-34, selenium
-35, bromine
-36, krypton
-37, rubidium
-38, strontium
-39, yttrium
-40, zirconium
-41, niobium
-42, molybdenum
-43, technetium
-44, ruthenium
-45, rhodium
-46, palladium
-47, silver
-48, cadmium
-49, indium
-50, tin
-51, antimony
-52, tellurium
-53, iodine
-54, xenon
-55, caesium
-56, barium
-57, lanthanum
-58, cerium
-59, praseodymium
-60, neodymium
-61, promethium
-62, samarium
-63, europium
-64, gadolinium
-65, terbium
-66, dysprosium
-67, holmium
-68, erbium
-69, thulium
-70, ytterbium
-71, lutetium
-72, hafnium
-73, tantalum
-74, tungsten
-75, rhenium
-76, osmium
-77, iridium
-78, platinum
-79, gold
-80, mercury
-81, thallium
-82, lead
-83, bismuth
-84, polonium
-85, astatine
-86, radon
-87, francium
-88, radium
-89, actinium
-90, thorium
-91, protactinium
-92, uranium
-93, neptunium
-94, plutonium
-95, americium
-96, curium
-97, berkelium
-98, californium
-99, einsteinium
-100, fermium
-101, mendelevium
-102, nobelium
-103, lawrencium
-104, rutherfordium
-105, dubnium
-106, seaborgium
-107, bohrium
-108, hassium
-109, meitnerium
-110, darmstadtium
-111, roentgenium
-112, copernicium
-113, nihonium
-114, flerovium
-115, moscovium
-116, livermorium
-117, tennessine
-118, oganesson
-119, ununennium
+1, hydrogen
+2, helium
+3, lithium
+4, beryllium
+5, boron
+6, carbon
+7, nitrogen
+8, oxygen
+9, fluorine
+10, neon
+11, sodium
+12, magnesium
+13, aluminium
+14, silicon
+15, phosphorus
+16, sulfur
+17, chlorine
+18, argon
+19, potassium
+20, calcium
+21, scandium
+22, titanium
+23, vanadium
+24, chromium
+25, manganese
+26, iron
+27, cobalt
+28, nickel
+29, copper
+30, zinc
+31, gallium
+32, germanium
+33, arsenic
+34, selenium
+35, bromine
+36, krypton
+37, rubidium
+38, strontium
+39, yttrium
+40, zirconium
+41, niobium
+42, molybdenum
+43, technetium
+44, ruthenium
+45, rhodium
+46, palladium
+47, silver
+48, cadmium
+49, indium
+50, tin
+51, antimony
+52, tellurium
+53, iodine
+54, xenon
+55, caesium
+56, barium
+57, lanthanum
+58, cerium
+59, praseodymium
+60, neodymium
+61, promethium
+62, samarium
+63, europium
+64, gadolinium
+65, terbium
+66, dysprosium
+67, holmium
+68, erbium
+69, thulium
+70, ytterbium
+71, lutetium
+72, hafnium
+73, tantalum
+74, tungsten
+75, rhenium
+76, osmium
+77, iridium
+78, platinum
+79, gold
+80, mercury
+81, thallium
+82, lead
+83, bismuth
+84, polonium
+85, astatine
+86, radon
+87, francium
+88, radium
+89, actinium
+90, thorium
+91, protactinium
+92, uranium
+93, neptunium
+94, plutonium
+95, americium
+96, curium
+97, berkelium
+98, californium
+99, einsteinium
+100, fermium
+101, mendelevium
+102, nobelium
+103, lawrencium
+104, rutherfordium
+105, dubnium
+106, seaborgium
+107, bohrium
+108, hassium
+109, meitnerium
+110, darmstadtium
+111, roentgenium
+112, copernicium
+113, nihonium
+114, flerovium
+115, moscovium
+116, livermorium
+117, tennessine
+118, oganesson
+119, ununennium
120, unbinilium
\ No newline at end of file
diff --git a/src/tcutility/data/_atom_data_info/norbs.json b/src/tcutility/data/_atom_data_info/norbs.json
index dca0f1f7..125f5df5 100755
--- a/src/tcutility/data/_atom_data_info/norbs.json
+++ b/src/tcutility/data/_atom_data_info/norbs.json
@@ -1,944 +1,944 @@
-{
- "DZP": {
- "Se": 41,
- "Ga": 41,
- "He": 5,
- "Be": 12,
- "Al": 23,
- "Mg": 20,
- "Na": 20,
- "Ca": 33,
- "N": 15,
- "S": 23,
- "F": 15,
- "O": 15,
- "H": 5,
- "Si": 23,
- "Kr": 40,
- "Ge": 41,
- "Ar": 23,
- "Ne": 15,
- "As": 40,
- "Br": 40,
- "Li": 12,
- "Cl": 23,
- "C": 15,
- "B": 15,
- "K": 33,
- "P": 23
- },
- "TZ2P-J": {
- "Pd": 85,
- "Sb": 93,
- "Pm": 114,
- "Se": 64,
- "Yb": 121,
- "Sc": 56,
- "Pb": 132,
- "Sm": 114,
- "Uue": 173,
- "Ga": 64,
- "He": 15,
- "Mt": 153,
- "Ac": 149,
- "Mo": 82,
- "Bk": 149,
- "Ni": 56,
- "Am": 149,
- "Be": 33,
- "No": 149,
- "Al": 41,
- "Ubn": 173,
- "Nh": 159,
- "Mg": 41,
- "Ds": 153,
- "Mn": 56,
- "Na": 38,
- "Ir": 121,
- "Cn": 153,
- "Fm": 149,
- "In": 93,
- "Cu": 56,
- "Lv": 159,
- "Cr": 56,
- "Co": 56,
- "Cf": 149,
- "Ca": 56,
- "Cs": 110,
- "Fe": 56,
- "Fl": 159,
- "Tb": 121,
- "Te": 93,
- "U": 149,
- "Ru": 82,
- "Tl": 127,
- "I": 93,
- "N": 33,
- "Rg": 153,
- "Rn": 132,
- "Tm": 121,
- "Tc": 82,
- "S": 41,
- "Rh": 82,
- "F": 33,
- "O": 33,
- "Rf": 153,
- "H": 15,
- "Ra": 141,
- "Zn": 56,
- "Pr": 114,
- "Pu": 149,
- "Zr": 82,
- "Pt": 121,
- "Sr": 77,
- "Po": 132,
- "Sg": 153,
- "Pa": 149,
- "Sn": 93,
- "Si": 41,
- "Bh": 153,
- "Ag": 85,
- "Kr": 63,
- "Nd": 114,
- "Hs": 153,
- "Ba": 110,
- "Ge": 64,
- "Hf": 121,
- "Ar": 41,
- "Ho": 121,
- "Au": 121,
- "Dy": 121,
- "Md": 149,
- "Mc": 159,
- "Ne": 33,
- "Bi": 132,
- "Nb": 82,
- "Db": 153,
- "At": 132,
- "Np": 149,
- "As": 63,
- "Hg": 121,
- "Gd": 114,
- "Br": 63,
- "Os": 121,
- "Lu": 121,
- "Lr": 149,
- "Cd": 85,
- "Fr": 141,
- "Es": 149,
- "Cm": 149,
- "Li": 27,
- "Og": 159,
- "Eu": 114,
- "Cl": 41,
- "Er": 121,
- "La": 114,
- "Ce": 114,
- "Ts": 159,
- "C": 33,
- "V": 56,
- "Ta": 121,
- "Th": 149,
- "B": 33,
- "K": 51,
- "Rb": 77,
- "Re": 121,
- "Xe": 93,
- "Y": 82,
- "Ti": 56,
- "P": 41,
- "W": 121
- },
- "TZP": {
- "Pd": 66,
- "Sb": 72,
- "Pm": 100,
- "Se": 50,
- "Yb": 100,
- "Sc": 42,
- "Pb": 106,
- "Sm": 100,
- "Uue": 152,
- "Ga": 50,
- "He": 6,
- "Mt": 132,
- "Ac": 132,
- "Mo": 66,
- "Bk": 132,
- "Ni": 42,
- "Am": 132,
- "Be": 16,
- "No": 132,
- "Al": 27,
- "Ubn": 152,
- "Nh": 138,
- "Mg": 24,
- "Ds": 132,
- "Mn": 42,
- "Na": 24,
- "Ir": 100,
- "Cn": 132,
- "Fm": 132,
- "In": 72,
- "Cu": 42,
- "Lv": 138,
- "Cr": 42,
- "Co": 42,
- "Cf": 132,
- "Ca": 37,
- "Cs": 89,
- "Fe": 42,
- "Fl": 138,
- "Tb": 100,
- "Te": 72,
- "U": 132,
- "Ru": 66,
- "Tl": 106,
- "I": 72,
- "N": 19,
- "Rg": 132,
- "Rn": 106,
- "Tm": 100,
- "Tc": 66,
- "S": 27,
- "Rh": 66,
- "F": 19,
- "O": 19,
- "Rf": 132,
- "H": 6,
- "Ra": 120,
- "Zn": 42,
- "Pr": 100,
- "Pu": 132,
- "Zr": 66,
- "Pt": 100,
- "Sr": 61,
- "Po": 106,
- "Sg": 132,
- "Pa": 132,
- "Sn": 72,
- "Si": 27,
- "Bh": 132,
- "Ag": 66,
- "Kr": 49,
- "Nd": 100,
- "Hs": 132,
- "Ba": 89,
- "Ge": 50,
- "Hf": 100,
- "Ar": 27,
- "Ho": 100,
- "Au": 100,
- "Dy": 100,
- "Md": 132,
- "Mc": 138,
- "Ne": 19,
- "Bi": 106,
- "Nb": 66,
- "Db": 132,
- "At": 106,
- "Np": 132,
- "As": 49,
- "Hg": 100,
- "Gd": 100,
- "Br": 49,
- "Os": 100,
- "Lu": 100,
- "Lr": 132,
- "Cd": 66,
- "Fr": 120,
- "Es": 132,
- "Cm": 132,
- "Li": 16,
- "Og": 138,
- "Eu": 100,
- "Cl": 27,
- "Er": 100,
- "La": 100,
- "Ce": 100,
- "Ts": 138,
- "C": 19,
- "V": 42,
- "Ta": 100,
- "Th": 132,
- "B": 19,
- "K": 37,
- "Rb": 61,
- "Re": 100,
- "Xe": 72,
- "Y": 66,
- "Ti": 42,
- "P": 27,
- "W": 100
- },
- "jcpl": {
- "Pb": 149,
- "Na": 35,
- "Cu": 53,
- "Cs": 100,
- "Tl": 149,
- "I": 88,
- "N": 30,
- "F": 30,
- "O": 30,
- "H": 15,
- "Pt": 135,
- "Hg": 134,
- "Br": 60,
- "Li": 27,
- "Cl": 38,
- "C": 30,
- "K": 48,
- "Rb": 72,
- "Xe": 88,
- "P": 38
- },
- "DZ": {
- "Pd": 57,
- "Sb": 63,
- "Pm": 94,
- "Se": 36,
- "Yb": 94,
- "Sc": 38,
- "Pb": 97,
- "Sm": 94,
- "Uue": 143,
- "Ga": 36,
- "He": 2,
- "Mt": 126,
- "Ac": 126,
- "Mo": 57,
- "Bk": 126,
- "Ni": 38,
- "Am": 126,
- "Be": 7,
- "No": 126,
- "Al": 18,
- "Ubn": 143,
- "Nh": 129,
- "Mg": 15,
- "Ds": 126,
- "Mn": 38,
- "Na": 15,
- "Ir": 94,
- "Cn": 126,
- "Fm": 126,
- "In": 63,
- "Cu": 38,
- "Lv": 129,
- "Cr": 38,
- "Co": 38,
- "Cf": 126,
- "Ca": 28,
- "Cs": 68,
- "Fe": 38,
- "Fl": 129,
- "Tb": 94,
- "Te": 63,
- "U": 126,
- "Ru": 57,
- "Tl": 97,
- "I": 63,
- "N": 10,
- "Rg": 126,
- "Rn": 97,
- "Tm": 94,
- "Tc": 57,
- "S": 18,
- "Rh": 57,
- "F": 10,
- "O": 10,
- "Rf": 126,
- "H": 2,
- "Ra": 114,
- "Zn": 38,
- "Pr": 94,
- "Pu": 126,
- "Zr": 57,
- "Pt": 94,
- "Sr": 47,
- "Po": 97,
- "Sg": 126,
- "Pa": 126,
- "Sn": 63,
- "Si": 18,
- "Bh": 126,
- "Ag": 57,
- "Kr": 35,
- "Nd": 94,
- "Hs": 126,
- "Ba": 75,
- "Ge": 36,
- "Hf": 94,
- "Ar": 18,
- "Ho": 94,
- "Au": 94,
- "Dy": 94,
- "Md": 126,
- "Mc": 129,
- "Ne": 10,
- "Bi": 97,
- "Nb": 57,
- "Db": 126,
- "At": 97,
- "Np": 126,
- "As": 35,
- "Hg": 94,
- "Gd": 94,
- "Br": 35,
- "Os": 94,
- "Lu": 94,
- "Lr": 126,
- "Cd": 57,
- "Fr": 114,
- "Es": 126,
- "Cm": 126,
- "Li": 7,
- "Og": 129,
- "Eu": 94,
- "Cl": 18,
- "Er": 94,
- "La": 94,
- "Ce": 94,
- "Ts": 129,
- "C": 10,
- "V": 38,
- "Ta": 94,
- "Th": 126,
- "B": 10,
- "K": 28,
- "Rb": 47,
- "Re": 94,
- "Xe": 63,
- "Y": 57,
- "Ti": 38,
- "P": 18,
- "W": 94
- },
- "TZ2P": {
- "Pd": 73,
- "Sb": 84,
- "Pm": 100,
- "Se": 57,
- "Yb": 107,
- "Sc": 49,
- "Pb": 118,
- "Sm": 100,
- "Uue": 159,
- "Ga": 57,
- "He": 11,
- "Mt": 139,
- "Ac": 135,
- "Mo": 73,
- "Bk": 135,
- "Ni": 49,
- "Am": 135,
- "Be": 26,
- "No": 135,
- "Al": 34,
- "Ubn": 159,
- "Nh": 145,
- "Mg": 34,
- "Ds": 139,
- "Mn": 49,
- "Na": 31,
- "Ir": 107,
- "Cn": 139,
- "Fm": 135,
- "In": 84,
- "Cu": 49,
- "Lv": 145,
- "Cr": 49,
- "Co": 49,
- "Cf": 135,
- "Ca": 49,
- "Cs": 96,
- "Fe": 49,
- "Fl": 145,
- "Tb": 107,
- "Te": 84,
- "U": 135,
- "Ru": 73,
- "Tl": 113,
- "I": 84,
- "N": 26,
- "Rg": 139,
- "Rn": 118,
- "Tm": 107,
- "Tc": 73,
- "S": 34,
- "Rh": 73,
- "F": 26,
- "O": 26,
- "Rf": 139,
- "H": 11,
- "Ra": 127,
- "Zn": 49,
- "Pr": 100,
- "Pu": 135,
- "Zr": 73,
- "Pt": 107,
- "Sr": 68,
- "Po": 118,
- "Sg": 139,
- "Pa": 135,
- "Sn": 84,
- "Si": 34,
- "Bh": 139,
- "Ag": 73,
- "Kr": 56,
- "Nd": 100,
- "Hs": 139,
- "Ba": 96,
- "Ge": 57,
- "Hf": 107,
- "Ar": 34,
- "Ho": 107,
- "Au": 107,
- "Dy": 107,
- "Md": 135,
- "Mc": 145,
- "Ne": 26,
- "Bi": 118,
- "Nb": 73,
- "Db": 139,
- "At": 118,
- "Np": 135,
- "As": 56,
- "Hg": 107,
- "Gd": 100,
- "Br": 56,
- "Os": 107,
- "Lu": 107,
- "Lr": 135,
- "Cd": 73,
- "Fr": 127,
- "Es": 135,
- "Cm": 135,
- "Li": 23,
- "Og": 145,
- "Eu": 100,
- "Cl": 34,
- "Er": 107,
- "La": 100,
- "Ce": 100,
- "Ts": 145,
- "C": 26,
- "V": 49,
- "Ta": 107,
- "Th": 135,
- "B": 26,
- "K": 44,
- "Rb": 68,
- "Re": 107,
- "Xe": 84,
- "Y": 73,
- "Ti": 49,
- "P": 34,
- "W": 107
- },
- "QZ4P": {
- "Pd": 116,
- "Sb": 124,
- "Pm": 161,
- "Se": 98,
- "Yb": 161,
- "Sc": 83,
- "Pb": 181,
- "Sm": 161,
- "Uue": 245,
- "Ga": 98,
- "He": 21,
- "Mt": 221,
- "Ac": 204,
- "Mo": 109,
- "Bk": 218,
- "Ni": 84,
- "Am": 211,
- "Be": 40,
- "No": 218,
- "Al": 60,
- "Ubn": 245,
- "Nh": 243,
- "Mg": 49,
- "Ds": 228,
- "Mn": 83,
- "Na": 49,
- "Ir": 170,
- "Cn": 228,
- "Fm": 218,
- "In": 124,
- "Cu": 84,
- "Lv": 243,
- "Cr": 83,
- "Co": 83,
- "Cf": 218,
- "Ca": 78,
- "Cs": 142,
- "Fe": 83,
- "Fl": 243,
- "Tb": 161,
- "Te": 124,
- "U": 211,
- "Ru": 109,
- "Tl": 181,
- "I": 124,
- "N": 44,
- "Rg": 228,
- "Rn": 189,
- "Tm": 161,
- "Tc": 109,
- "S": 61,
- "Rh": 109,
- "F": 44,
- "O": 44,
- "Rf": 221,
- "H": 21,
- "Ra": 196,
- "Zn": 89,
- "Pr": 161,
- "Pu": 211,
- "Zr": 109,
- "Pt": 170,
- "Sr": 104,
- "Po": 182,
- "Sg": 221,
- "Pa": 211,
- "Sn": 124,
- "Si": 60,
- "Bh": 221,
- "Ag": 116,
- "Kr": 99,
- "Nd": 161,
- "Hs": 221,
- "Ba": 142,
- "Ge": 98,
- "Hf": 170,
- "Ar": 61,
- "Ho": 161,
- "Au": 173,
- "Dy": 161,
- "Md": 218,
- "Mc": 243,
- "Ne": 47,
- "Bi": 181,
- "Nb": 109,
- "Db": 221,
- "At": 189,
- "Np": 211,
- "As": 98,
- "Hg": 178,
- "Gd": 161,
- "Br": 98,
- "Os": 170,
- "Lu": 170,
- "Lr": 221,
- "Cd": 121,
- "Fr": 191,
- "Es": 218,
- "Cm": 211,
- "Li": 40,
- "Og": 243,
- "Eu": 157,
- "Cl": 61,
- "Er": 161,
- "La": 161,
- "Ce": 161,
- "Ts": 243,
- "C": 43,
- "V": 83,
- "Ta": 170,
- "Th": 211,
- "B": 43,
- "K": 78,
- "Rb": 104,
- "Re": 170,
- "Xe": 124,
- "Y": 109,
- "Ti": 83,
- "P": 60,
- "W": 170
- },
- "SZ": {
- "Se": 18,
- "Sc": 18,
- "Ga": 18,
- "He": 1,
- "Ni": 18,
- "Be": 5,
- "Al": 9,
- "Mg": 9,
- "Mn": 18,
- "Na": 9,
- "Cu": 18,
- "Cr": 18,
- "Co": 18,
- "Ca": 13,
- "Fe": 18,
- "N": 5,
- "S": 9,
- "F": 5,
- "O": 5,
- "H": 1,
- "Zn": 18,
- "Si": 9,
- "Kr": 18,
- "Ge": 18,
- "Ar": 9,
- "Ne": 5,
- "As": 18,
- "Br": 18,
- "Li": 5,
- "Cl": 9,
- "C": 5,
- "V": 18,
- "B": 5,
- "K": 13,
- "Ti": 18,
- "P": 9
- },
- "mTZ2P": {
- "Pd": 66,
- "Sb": 72,
- "Pm": 100,
- "Se": 50,
- "Yb": 100,
- "Sc": 42,
- "Pb": 106,
- "Sm": 100,
- "Uue": 152,
- "Ga": 50,
- "He": 5,
- "Mt": 132,
- "Ac": 132,
- "Mo": 66,
- "Bk": 132,
- "Ni": 42,
- "Am": 132,
- "Be": 16,
- "No": 132,
- "Al": 27,
- "Ubn": 152,
- "Nh": 138,
- "Mg": 24,
- "Ds": 132,
- "Mn": 42,
- "Na": 24,
- "Ir": 100,
- "Cn": 132,
- "Fm": 132,
- "In": 72,
- "Cu": 42,
- "Lv": 138,
- "Cr": 42,
- "Co": 42,
- "Cf": 132,
- "Ca": 37,
- "Cs": 89,
- "Fe": 42,
- "Fl": 138,
- "Tb": 100,
- "Te": 72,
- "U": 132,
- "Ru": 66,
- "Tl": 106,
- "I": 72,
- "N": 24,
- "Rg": 132,
- "Rn": 106,
- "Tm": 100,
- "Tc": 66,
- "S": 34,
- "Rh": 66,
- "F": 26,
- "O": 26,
- "Rf": 132,
- "H": 5,
- "Ra": 120,
- "Zn": 42,
- "Pr": 100,
- "Pu": 132,
- "Zr": 66,
- "Pt": 100,
- "Sr": 61,
- "Po": 106,
- "Sg": 132,
- "Pa": 132,
- "Sn": 72,
- "Si": 34,
- "Bh": 132,
- "Ag": 66,
- "Kr": 56,
- "Nd": 100,
- "Hs": 132,
- "Ba": 89,
- "Ge": 50,
- "Hf": 100,
- "Ar": 34,
- "Ho": 100,
- "Au": 100,
- "Dy": 100,
- "Md": 132,
- "Mc": 138,
- "Ne": 26,
- "Bi": 106,
- "Nb": 66,
- "Db": 132,
- "At": 106,
- "Np": 132,
- "As": 49,
- "Hg": 100,
- "Gd": 100,
- "Br": 49,
- "Os": 100,
- "Lu": 100,
- "Lr": 132,
- "Cd": 66,
- "Fr": 120,
- "Es": 132,
- "Cm": 132,
- "Li": 16,
- "Og": 138,
- "Eu": 100,
- "Cl": 34,
- "Er": 100,
- "La": 100,
- "Ce": 100,
- "Ts": 138,
- "C": 19,
- "V": 42,
- "Ta": 100,
- "Th": 132,
- "B": 19,
- "K": 37,
- "Rb": 61,
- "Re": 100,
- "Xe": 72,
- "Y": 66,
- "Ti": 42,
- "P": 34,
- "W": 100
- },
- "QZ4P-J": {
- "Pd": 150,
- "Sb": 158,
- "Pm": 195,
- "Se": 131,
- "Yb": 195,
- "Sc": 120,
- "Pb": 216,
- "Sm": 195,
- "Uue": 280,
- "Ga": 131,
- "He": 36,
- "Mt": 256,
- "Ac": 239,
- "Mo": 147,
- "Bk": 253,
- "Ni": 120,
- "Am": 246,
- "Be": 64,
- "No": 253,
- "Al": 97,
- "Ubn": 280,
- "Nh": 278,
- "Mg": 90,
- "Ds": 263,
- "Mn": 120,
- "Na": 90,
- "Ir": 205,
- "Cn": 263,
- "Fm": 253,
- "In": 158,
- "Cu": 120,
- "Lv": 278,
- "Cr": 120,
- "Co": 120,
- "Cf": 253,
- "Ca": 115,
- "Cs": 176,
- "Fe": 120,
- "Fl": 278,
- "Tb": 195,
- "Te": 158,
- "U": 246,
- "Ru": 147,
- "Tl": 216,
- "I": 158,
- "N": 75,
- "Rg": 263,
- "Rn": 224,
- "Tm": 195,
- "Tc": 147,
- "S": 98,
- "Rh": 147,
- "F": 75,
- "O": 75,
- "Rf": 256,
- "H": 36,
- "Ra": 231,
- "Zn": 120,
- "Pr": 195,
- "Pu": 246,
- "Zr": 147,
- "Pt": 205,
- "Sr": 137,
- "Po": 217,
- "Sg": 256,
- "Pa": 246,
- "Sn": 158,
- "Si": 97,
- "Bh": 256,
- "Ag": 150,
- "Kr": 132,
- "Nd": 195,
- "Hs": 256,
- "Ba": 176,
- "Ge": 131,
- "Hf": 205,
- "Ar": 98,
- "Ho": 195,
- "Au": 208,
- "Dy": 195,
- "Md": 253,
- "Mc": 278,
- "Ne": 78,
- "Bi": 216,
- "Nb": 147,
- "Db": 256,
- "At": 224,
- "Np": 246,
- "As": 131,
- "Hg": 213,
- "Gd": 195,
- "Br": 131,
- "Os": 205,
- "Lu": 205,
- "Lr": 256,
- "Cd": 155,
- "Fr": 226,
- "Es": 253,
- "Cm": 246,
- "Li": 64,
- "Og": 278,
- "Eu": 191,
- "Cl": 98,
- "Er": 195,
- "La": 195,
- "Ce": 195,
- "Ts": 278,
- "C": 74,
- "V": 120,
- "Ta": 205,
- "Th": 246,
- "B": 74,
- "K": 110,
- "Rb": 137,
- "Re": 205,
- "Xe": 158,
- "Y": 147,
- "Ti": 120,
- "P": 97,
- "W": 205
- }
+{
+ "DZP": {
+ "Se": 41,
+ "Ga": 41,
+ "He": 5,
+ "Be": 12,
+ "Al": 23,
+ "Mg": 20,
+ "Na": 20,
+ "Ca": 33,
+ "N": 15,
+ "S": 23,
+ "F": 15,
+ "O": 15,
+ "H": 5,
+ "Si": 23,
+ "Kr": 40,
+ "Ge": 41,
+ "Ar": 23,
+ "Ne": 15,
+ "As": 40,
+ "Br": 40,
+ "Li": 12,
+ "Cl": 23,
+ "C": 15,
+ "B": 15,
+ "K": 33,
+ "P": 23
+ },
+ "TZ2P-J": {
+ "Pd": 85,
+ "Sb": 93,
+ "Pm": 114,
+ "Se": 64,
+ "Yb": 121,
+ "Sc": 56,
+ "Pb": 132,
+ "Sm": 114,
+ "Uue": 173,
+ "Ga": 64,
+ "He": 15,
+ "Mt": 153,
+ "Ac": 149,
+ "Mo": 82,
+ "Bk": 149,
+ "Ni": 56,
+ "Am": 149,
+ "Be": 33,
+ "No": 149,
+ "Al": 41,
+ "Ubn": 173,
+ "Nh": 159,
+ "Mg": 41,
+ "Ds": 153,
+ "Mn": 56,
+ "Na": 38,
+ "Ir": 121,
+ "Cn": 153,
+ "Fm": 149,
+ "In": 93,
+ "Cu": 56,
+ "Lv": 159,
+ "Cr": 56,
+ "Co": 56,
+ "Cf": 149,
+ "Ca": 56,
+ "Cs": 110,
+ "Fe": 56,
+ "Fl": 159,
+ "Tb": 121,
+ "Te": 93,
+ "U": 149,
+ "Ru": 82,
+ "Tl": 127,
+ "I": 93,
+ "N": 33,
+ "Rg": 153,
+ "Rn": 132,
+ "Tm": 121,
+ "Tc": 82,
+ "S": 41,
+ "Rh": 82,
+ "F": 33,
+ "O": 33,
+ "Rf": 153,
+ "H": 15,
+ "Ra": 141,
+ "Zn": 56,
+ "Pr": 114,
+ "Pu": 149,
+ "Zr": 82,
+ "Pt": 121,
+ "Sr": 77,
+ "Po": 132,
+ "Sg": 153,
+ "Pa": 149,
+ "Sn": 93,
+ "Si": 41,
+ "Bh": 153,
+ "Ag": 85,
+ "Kr": 63,
+ "Nd": 114,
+ "Hs": 153,
+ "Ba": 110,
+ "Ge": 64,
+ "Hf": 121,
+ "Ar": 41,
+ "Ho": 121,
+ "Au": 121,
+ "Dy": 121,
+ "Md": 149,
+ "Mc": 159,
+ "Ne": 33,
+ "Bi": 132,
+ "Nb": 82,
+ "Db": 153,
+ "At": 132,
+ "Np": 149,
+ "As": 63,
+ "Hg": 121,
+ "Gd": 114,
+ "Br": 63,
+ "Os": 121,
+ "Lu": 121,
+ "Lr": 149,
+ "Cd": 85,
+ "Fr": 141,
+ "Es": 149,
+ "Cm": 149,
+ "Li": 27,
+ "Og": 159,
+ "Eu": 114,
+ "Cl": 41,
+ "Er": 121,
+ "La": 114,
+ "Ce": 114,
+ "Ts": 159,
+ "C": 33,
+ "V": 56,
+ "Ta": 121,
+ "Th": 149,
+ "B": 33,
+ "K": 51,
+ "Rb": 77,
+ "Re": 121,
+ "Xe": 93,
+ "Y": 82,
+ "Ti": 56,
+ "P": 41,
+ "W": 121
+ },
+ "TZP": {
+ "Pd": 66,
+ "Sb": 72,
+ "Pm": 100,
+ "Se": 50,
+ "Yb": 100,
+ "Sc": 42,
+ "Pb": 106,
+ "Sm": 100,
+ "Uue": 152,
+ "Ga": 50,
+ "He": 6,
+ "Mt": 132,
+ "Ac": 132,
+ "Mo": 66,
+ "Bk": 132,
+ "Ni": 42,
+ "Am": 132,
+ "Be": 16,
+ "No": 132,
+ "Al": 27,
+ "Ubn": 152,
+ "Nh": 138,
+ "Mg": 24,
+ "Ds": 132,
+ "Mn": 42,
+ "Na": 24,
+ "Ir": 100,
+ "Cn": 132,
+ "Fm": 132,
+ "In": 72,
+ "Cu": 42,
+ "Lv": 138,
+ "Cr": 42,
+ "Co": 42,
+ "Cf": 132,
+ "Ca": 37,
+ "Cs": 89,
+ "Fe": 42,
+ "Fl": 138,
+ "Tb": 100,
+ "Te": 72,
+ "U": 132,
+ "Ru": 66,
+ "Tl": 106,
+ "I": 72,
+ "N": 19,
+ "Rg": 132,
+ "Rn": 106,
+ "Tm": 100,
+ "Tc": 66,
+ "S": 27,
+ "Rh": 66,
+ "F": 19,
+ "O": 19,
+ "Rf": 132,
+ "H": 6,
+ "Ra": 120,
+ "Zn": 42,
+ "Pr": 100,
+ "Pu": 132,
+ "Zr": 66,
+ "Pt": 100,
+ "Sr": 61,
+ "Po": 106,
+ "Sg": 132,
+ "Pa": 132,
+ "Sn": 72,
+ "Si": 27,
+ "Bh": 132,
+ "Ag": 66,
+ "Kr": 49,
+ "Nd": 100,
+ "Hs": 132,
+ "Ba": 89,
+ "Ge": 50,
+ "Hf": 100,
+ "Ar": 27,
+ "Ho": 100,
+ "Au": 100,
+ "Dy": 100,
+ "Md": 132,
+ "Mc": 138,
+ "Ne": 19,
+ "Bi": 106,
+ "Nb": 66,
+ "Db": 132,
+ "At": 106,
+ "Np": 132,
+ "As": 49,
+ "Hg": 100,
+ "Gd": 100,
+ "Br": 49,
+ "Os": 100,
+ "Lu": 100,
+ "Lr": 132,
+ "Cd": 66,
+ "Fr": 120,
+ "Es": 132,
+ "Cm": 132,
+ "Li": 16,
+ "Og": 138,
+ "Eu": 100,
+ "Cl": 27,
+ "Er": 100,
+ "La": 100,
+ "Ce": 100,
+ "Ts": 138,
+ "C": 19,
+ "V": 42,
+ "Ta": 100,
+ "Th": 132,
+ "B": 19,
+ "K": 37,
+ "Rb": 61,
+ "Re": 100,
+ "Xe": 72,
+ "Y": 66,
+ "Ti": 42,
+ "P": 27,
+ "W": 100
+ },
+ "jcpl": {
+ "Pb": 149,
+ "Na": 35,
+ "Cu": 53,
+ "Cs": 100,
+ "Tl": 149,
+ "I": 88,
+ "N": 30,
+ "F": 30,
+ "O": 30,
+ "H": 15,
+ "Pt": 135,
+ "Hg": 134,
+ "Br": 60,
+ "Li": 27,
+ "Cl": 38,
+ "C": 30,
+ "K": 48,
+ "Rb": 72,
+ "Xe": 88,
+ "P": 38
+ },
+ "DZ": {
+ "Pd": 57,
+ "Sb": 63,
+ "Pm": 94,
+ "Se": 36,
+ "Yb": 94,
+ "Sc": 38,
+ "Pb": 97,
+ "Sm": 94,
+ "Uue": 143,
+ "Ga": 36,
+ "He": 2,
+ "Mt": 126,
+ "Ac": 126,
+ "Mo": 57,
+ "Bk": 126,
+ "Ni": 38,
+ "Am": 126,
+ "Be": 7,
+ "No": 126,
+ "Al": 18,
+ "Ubn": 143,
+ "Nh": 129,
+ "Mg": 15,
+ "Ds": 126,
+ "Mn": 38,
+ "Na": 15,
+ "Ir": 94,
+ "Cn": 126,
+ "Fm": 126,
+ "In": 63,
+ "Cu": 38,
+ "Lv": 129,
+ "Cr": 38,
+ "Co": 38,
+ "Cf": 126,
+ "Ca": 28,
+ "Cs": 68,
+ "Fe": 38,
+ "Fl": 129,
+ "Tb": 94,
+ "Te": 63,
+ "U": 126,
+ "Ru": 57,
+ "Tl": 97,
+ "I": 63,
+ "N": 10,
+ "Rg": 126,
+ "Rn": 97,
+ "Tm": 94,
+ "Tc": 57,
+ "S": 18,
+ "Rh": 57,
+ "F": 10,
+ "O": 10,
+ "Rf": 126,
+ "H": 2,
+ "Ra": 114,
+ "Zn": 38,
+ "Pr": 94,
+ "Pu": 126,
+ "Zr": 57,
+ "Pt": 94,
+ "Sr": 47,
+ "Po": 97,
+ "Sg": 126,
+ "Pa": 126,
+ "Sn": 63,
+ "Si": 18,
+ "Bh": 126,
+ "Ag": 57,
+ "Kr": 35,
+ "Nd": 94,
+ "Hs": 126,
+ "Ba": 75,
+ "Ge": 36,
+ "Hf": 94,
+ "Ar": 18,
+ "Ho": 94,
+ "Au": 94,
+ "Dy": 94,
+ "Md": 126,
+ "Mc": 129,
+ "Ne": 10,
+ "Bi": 97,
+ "Nb": 57,
+ "Db": 126,
+ "At": 97,
+ "Np": 126,
+ "As": 35,
+ "Hg": 94,
+ "Gd": 94,
+ "Br": 35,
+ "Os": 94,
+ "Lu": 94,
+ "Lr": 126,
+ "Cd": 57,
+ "Fr": 114,
+ "Es": 126,
+ "Cm": 126,
+ "Li": 7,
+ "Og": 129,
+ "Eu": 94,
+ "Cl": 18,
+ "Er": 94,
+ "La": 94,
+ "Ce": 94,
+ "Ts": 129,
+ "C": 10,
+ "V": 38,
+ "Ta": 94,
+ "Th": 126,
+ "B": 10,
+ "K": 28,
+ "Rb": 47,
+ "Re": 94,
+ "Xe": 63,
+ "Y": 57,
+ "Ti": 38,
+ "P": 18,
+ "W": 94
+ },
+ "TZ2P": {
+ "Pd": 73,
+ "Sb": 84,
+ "Pm": 100,
+ "Se": 57,
+ "Yb": 107,
+ "Sc": 49,
+ "Pb": 118,
+ "Sm": 100,
+ "Uue": 159,
+ "Ga": 57,
+ "He": 11,
+ "Mt": 139,
+ "Ac": 135,
+ "Mo": 73,
+ "Bk": 135,
+ "Ni": 49,
+ "Am": 135,
+ "Be": 26,
+ "No": 135,
+ "Al": 34,
+ "Ubn": 159,
+ "Nh": 145,
+ "Mg": 34,
+ "Ds": 139,
+ "Mn": 49,
+ "Na": 31,
+ "Ir": 107,
+ "Cn": 139,
+ "Fm": 135,
+ "In": 84,
+ "Cu": 49,
+ "Lv": 145,
+ "Cr": 49,
+ "Co": 49,
+ "Cf": 135,
+ "Ca": 49,
+ "Cs": 96,
+ "Fe": 49,
+ "Fl": 145,
+ "Tb": 107,
+ "Te": 84,
+ "U": 135,
+ "Ru": 73,
+ "Tl": 113,
+ "I": 84,
+ "N": 26,
+ "Rg": 139,
+ "Rn": 118,
+ "Tm": 107,
+ "Tc": 73,
+ "S": 34,
+ "Rh": 73,
+ "F": 26,
+ "O": 26,
+ "Rf": 139,
+ "H": 11,
+ "Ra": 127,
+ "Zn": 49,
+ "Pr": 100,
+ "Pu": 135,
+ "Zr": 73,
+ "Pt": 107,
+ "Sr": 68,
+ "Po": 118,
+ "Sg": 139,
+ "Pa": 135,
+ "Sn": 84,
+ "Si": 34,
+ "Bh": 139,
+ "Ag": 73,
+ "Kr": 56,
+ "Nd": 100,
+ "Hs": 139,
+ "Ba": 96,
+ "Ge": 57,
+ "Hf": 107,
+ "Ar": 34,
+ "Ho": 107,
+ "Au": 107,
+ "Dy": 107,
+ "Md": 135,
+ "Mc": 145,
+ "Ne": 26,
+ "Bi": 118,
+ "Nb": 73,
+ "Db": 139,
+ "At": 118,
+ "Np": 135,
+ "As": 56,
+ "Hg": 107,
+ "Gd": 100,
+ "Br": 56,
+ "Os": 107,
+ "Lu": 107,
+ "Lr": 135,
+ "Cd": 73,
+ "Fr": 127,
+ "Es": 135,
+ "Cm": 135,
+ "Li": 23,
+ "Og": 145,
+ "Eu": 100,
+ "Cl": 34,
+ "Er": 107,
+ "La": 100,
+ "Ce": 100,
+ "Ts": 145,
+ "C": 26,
+ "V": 49,
+ "Ta": 107,
+ "Th": 135,
+ "B": 26,
+ "K": 44,
+ "Rb": 68,
+ "Re": 107,
+ "Xe": 84,
+ "Y": 73,
+ "Ti": 49,
+ "P": 34,
+ "W": 107
+ },
+ "QZ4P": {
+ "Pd": 116,
+ "Sb": 124,
+ "Pm": 161,
+ "Se": 98,
+ "Yb": 161,
+ "Sc": 83,
+ "Pb": 181,
+ "Sm": 161,
+ "Uue": 245,
+ "Ga": 98,
+ "He": 21,
+ "Mt": 221,
+ "Ac": 204,
+ "Mo": 109,
+ "Bk": 218,
+ "Ni": 84,
+ "Am": 211,
+ "Be": 40,
+ "No": 218,
+ "Al": 60,
+ "Ubn": 245,
+ "Nh": 243,
+ "Mg": 49,
+ "Ds": 228,
+ "Mn": 83,
+ "Na": 49,
+ "Ir": 170,
+ "Cn": 228,
+ "Fm": 218,
+ "In": 124,
+ "Cu": 84,
+ "Lv": 243,
+ "Cr": 83,
+ "Co": 83,
+ "Cf": 218,
+ "Ca": 78,
+ "Cs": 142,
+ "Fe": 83,
+ "Fl": 243,
+ "Tb": 161,
+ "Te": 124,
+ "U": 211,
+ "Ru": 109,
+ "Tl": 181,
+ "I": 124,
+ "N": 44,
+ "Rg": 228,
+ "Rn": 189,
+ "Tm": 161,
+ "Tc": 109,
+ "S": 61,
+ "Rh": 109,
+ "F": 44,
+ "O": 44,
+ "Rf": 221,
+ "H": 21,
+ "Ra": 196,
+ "Zn": 89,
+ "Pr": 161,
+ "Pu": 211,
+ "Zr": 109,
+ "Pt": 170,
+ "Sr": 104,
+ "Po": 182,
+ "Sg": 221,
+ "Pa": 211,
+ "Sn": 124,
+ "Si": 60,
+ "Bh": 221,
+ "Ag": 116,
+ "Kr": 99,
+ "Nd": 161,
+ "Hs": 221,
+ "Ba": 142,
+ "Ge": 98,
+ "Hf": 170,
+ "Ar": 61,
+ "Ho": 161,
+ "Au": 173,
+ "Dy": 161,
+ "Md": 218,
+ "Mc": 243,
+ "Ne": 47,
+ "Bi": 181,
+ "Nb": 109,
+ "Db": 221,
+ "At": 189,
+ "Np": 211,
+ "As": 98,
+ "Hg": 178,
+ "Gd": 161,
+ "Br": 98,
+ "Os": 170,
+ "Lu": 170,
+ "Lr": 221,
+ "Cd": 121,
+ "Fr": 191,
+ "Es": 218,
+ "Cm": 211,
+ "Li": 40,
+ "Og": 243,
+ "Eu": 157,
+ "Cl": 61,
+ "Er": 161,
+ "La": 161,
+ "Ce": 161,
+ "Ts": 243,
+ "C": 43,
+ "V": 83,
+ "Ta": 170,
+ "Th": 211,
+ "B": 43,
+ "K": 78,
+ "Rb": 104,
+ "Re": 170,
+ "Xe": 124,
+ "Y": 109,
+ "Ti": 83,
+ "P": 60,
+ "W": 170
+ },
+ "SZ": {
+ "Se": 18,
+ "Sc": 18,
+ "Ga": 18,
+ "He": 1,
+ "Ni": 18,
+ "Be": 5,
+ "Al": 9,
+ "Mg": 9,
+ "Mn": 18,
+ "Na": 9,
+ "Cu": 18,
+ "Cr": 18,
+ "Co": 18,
+ "Ca": 13,
+ "Fe": 18,
+ "N": 5,
+ "S": 9,
+ "F": 5,
+ "O": 5,
+ "H": 1,
+ "Zn": 18,
+ "Si": 9,
+ "Kr": 18,
+ "Ge": 18,
+ "Ar": 9,
+ "Ne": 5,
+ "As": 18,
+ "Br": 18,
+ "Li": 5,
+ "Cl": 9,
+ "C": 5,
+ "V": 18,
+ "B": 5,
+ "K": 13,
+ "Ti": 18,
+ "P": 9
+ },
+ "mTZ2P": {
+ "Pd": 66,
+ "Sb": 72,
+ "Pm": 100,
+ "Se": 50,
+ "Yb": 100,
+ "Sc": 42,
+ "Pb": 106,
+ "Sm": 100,
+ "Uue": 152,
+ "Ga": 50,
+ "He": 5,
+ "Mt": 132,
+ "Ac": 132,
+ "Mo": 66,
+ "Bk": 132,
+ "Ni": 42,
+ "Am": 132,
+ "Be": 16,
+ "No": 132,
+ "Al": 27,
+ "Ubn": 152,
+ "Nh": 138,
+ "Mg": 24,
+ "Ds": 132,
+ "Mn": 42,
+ "Na": 24,
+ "Ir": 100,
+ "Cn": 132,
+ "Fm": 132,
+ "In": 72,
+ "Cu": 42,
+ "Lv": 138,
+ "Cr": 42,
+ "Co": 42,
+ "Cf": 132,
+ "Ca": 37,
+ "Cs": 89,
+ "Fe": 42,
+ "Fl": 138,
+ "Tb": 100,
+ "Te": 72,
+ "U": 132,
+ "Ru": 66,
+ "Tl": 106,
+ "I": 72,
+ "N": 24,
+ "Rg": 132,
+ "Rn": 106,
+ "Tm": 100,
+ "Tc": 66,
+ "S": 34,
+ "Rh": 66,
+ "F": 26,
+ "O": 26,
+ "Rf": 132,
+ "H": 5,
+ "Ra": 120,
+ "Zn": 42,
+ "Pr": 100,
+ "Pu": 132,
+ "Zr": 66,
+ "Pt": 100,
+ "Sr": 61,
+ "Po": 106,
+ "Sg": 132,
+ "Pa": 132,
+ "Sn": 72,
+ "Si": 34,
+ "Bh": 132,
+ "Ag": 66,
+ "Kr": 56,
+ "Nd": 100,
+ "Hs": 132,
+ "Ba": 89,
+ "Ge": 50,
+ "Hf": 100,
+ "Ar": 34,
+ "Ho": 100,
+ "Au": 100,
+ "Dy": 100,
+ "Md": 132,
+ "Mc": 138,
+ "Ne": 26,
+ "Bi": 106,
+ "Nb": 66,
+ "Db": 132,
+ "At": 106,
+ "Np": 132,
+ "As": 49,
+ "Hg": 100,
+ "Gd": 100,
+ "Br": 49,
+ "Os": 100,
+ "Lu": 100,
+ "Lr": 132,
+ "Cd": 66,
+ "Fr": 120,
+ "Es": 132,
+ "Cm": 132,
+ "Li": 16,
+ "Og": 138,
+ "Eu": 100,
+ "Cl": 34,
+ "Er": 100,
+ "La": 100,
+ "Ce": 100,
+ "Ts": 138,
+ "C": 19,
+ "V": 42,
+ "Ta": 100,
+ "Th": 132,
+ "B": 19,
+ "K": 37,
+ "Rb": 61,
+ "Re": 100,
+ "Xe": 72,
+ "Y": 66,
+ "Ti": 42,
+ "P": 34,
+ "W": 100
+ },
+ "QZ4P-J": {
+ "Pd": 150,
+ "Sb": 158,
+ "Pm": 195,
+ "Se": 131,
+ "Yb": 195,
+ "Sc": 120,
+ "Pb": 216,
+ "Sm": 195,
+ "Uue": 280,
+ "Ga": 131,
+ "He": 36,
+ "Mt": 256,
+ "Ac": 239,
+ "Mo": 147,
+ "Bk": 253,
+ "Ni": 120,
+ "Am": 246,
+ "Be": 64,
+ "No": 253,
+ "Al": 97,
+ "Ubn": 280,
+ "Nh": 278,
+ "Mg": 90,
+ "Ds": 263,
+ "Mn": 120,
+ "Na": 90,
+ "Ir": 205,
+ "Cn": 263,
+ "Fm": 253,
+ "In": 158,
+ "Cu": 120,
+ "Lv": 278,
+ "Cr": 120,
+ "Co": 120,
+ "Cf": 253,
+ "Ca": 115,
+ "Cs": 176,
+ "Fe": 120,
+ "Fl": 278,
+ "Tb": 195,
+ "Te": 158,
+ "U": 246,
+ "Ru": 147,
+ "Tl": 216,
+ "I": 158,
+ "N": 75,
+ "Rg": 263,
+ "Rn": 224,
+ "Tm": 195,
+ "Tc": 147,
+ "S": 98,
+ "Rh": 147,
+ "F": 75,
+ "O": 75,
+ "Rf": 256,
+ "H": 36,
+ "Ra": 231,
+ "Zn": 120,
+ "Pr": 195,
+ "Pu": 246,
+ "Zr": 147,
+ "Pt": 205,
+ "Sr": 137,
+ "Po": 217,
+ "Sg": 256,
+ "Pa": 246,
+ "Sn": 158,
+ "Si": 97,
+ "Bh": 256,
+ "Ag": 150,
+ "Kr": 132,
+ "Nd": 195,
+ "Hs": 256,
+ "Ba": 176,
+ "Ge": 131,
+ "Hf": 205,
+ "Ar": 98,
+ "Ho": 195,
+ "Au": 208,
+ "Dy": 195,
+ "Md": 253,
+ "Mc": 278,
+ "Ne": 78,
+ "Bi": 216,
+ "Nb": 147,
+ "Db": 256,
+ "At": 224,
+ "Np": 246,
+ "As": 131,
+ "Hg": 213,
+ "Gd": 195,
+ "Br": 131,
+ "Os": 205,
+ "Lu": 205,
+ "Lr": 256,
+ "Cd": 155,
+ "Fr": 226,
+ "Es": 253,
+ "Cm": 246,
+ "Li": 64,
+ "Og": 278,
+ "Eu": 191,
+ "Cl": 98,
+ "Er": 195,
+ "La": 195,
+ "Ce": 195,
+ "Ts": 278,
+ "C": 74,
+ "V": 120,
+ "Ta": 205,
+ "Th": 246,
+ "B": 74,
+ "K": 110,
+ "Rb": 137,
+ "Re": 205,
+ "Xe": 158,
+ "Y": 147,
+ "Ti": 120,
+ "P": 97,
+ "W": 205
+ }
}
\ No newline at end of file
diff --git a/src/tcutility/data/_atom_data_info/radius.txt b/src/tcutility/data/_atom_data_info/radius.txt
index 836d3597..bdbe6f4a 100755
--- a/src/tcutility/data/_atom_data_info/radius.txt
+++ b/src/tcutility/data/_atom_data_info/radius.txt
@@ -1,96 +1,96 @@
-1, 0.31
-2, 0.28
-3, 1.28
-4, 0.96
-5, 0.84
-6, 0.76
-7, 0.71
-8, 0.66
-9, 0.57
-10, 0.58
-11, 1.66
-12, 1.41
-13, 1.21
-14, 1.11
-15, 1.07
-16, 1.05
-17, 1.02
-18, 1.06
-19, 2.03
-20, 1.76
-21, 1.7
-22, 1.6
-23, 1.53
-24, 1.39
-25, 1.39
-26, 1.32
-27, 1.26
-28, 1.24
-29, 1.32
-30, 1.22
-31, 1.22
-32, 1.2
-33, 1.19
-34, 1.2
-35, 1.2
-36, 1.16
-37, 2.2
-38, 1.95
-39, 1.9
-40, 1.75
-41, 1.64
-42, 1.54
-43, 1.47
-44, 1.46
-45, 1.42
-46, 1.39
-47, 1.45
-48, 1.44
-49, 1.42
-50, 1.39
-51, 1.39
-52, 1.38
-53, 1.39
-54, 1.4
-55, 2.44
-56, 2.15
-57, 2.07
-58, 2.04
-59, 2.03
-60, 2.01
-61, 1.99
-62, 1.98
-63, 1.98
-64, 1.96
-65, 1.94
-66, 1.92
-67, 1.92
-68, 1.89
-69, 1.9
-70, 1.87
-71, 1.87
-72, 1.75
-73, 1.7
-74, 1.62
-75, 1.51
-76, 1.44
-77, 1.41
-78, 1.36
-79, 1.36
-80, 1.32
-81, 1.45
-82, 1.46
-83, 1.48
-84, 1.4
-85, 1.5
-86, 1.5
-87, 2.6
-88, 2.21
-89, 2.15
-90, 2.06
-91, 2.0
-92, 1.96
-93, 1.9
-94, 1.87
-95, 1.8
+1, 0.31
+2, 0.28
+3, 1.28
+4, 0.96
+5, 0.84
+6, 0.76
+7, 0.71
+8, 0.66
+9, 0.57
+10, 0.58
+11, 1.66
+12, 1.41
+13, 1.21
+14, 1.11
+15, 1.07
+16, 1.05
+17, 1.02
+18, 1.06
+19, 2.03
+20, 1.76
+21, 1.7
+22, 1.6
+23, 1.53
+24, 1.39
+25, 1.39
+26, 1.32
+27, 1.26
+28, 1.24
+29, 1.32
+30, 1.22
+31, 1.22
+32, 1.2
+33, 1.19
+34, 1.2
+35, 1.2
+36, 1.16
+37, 2.2
+38, 1.95
+39, 1.9
+40, 1.75
+41, 1.64
+42, 1.54
+43, 1.47
+44, 1.46
+45, 1.42
+46, 1.39
+47, 1.45
+48, 1.44
+49, 1.42
+50, 1.39
+51, 1.39
+52, 1.38
+53, 1.39
+54, 1.4
+55, 2.44
+56, 2.15
+57, 2.07
+58, 2.04
+59, 2.03
+60, 2.01
+61, 1.99
+62, 1.98
+63, 1.98
+64, 1.96
+65, 1.94
+66, 1.92
+67, 1.92
+68, 1.89
+69, 1.9
+70, 1.87
+71, 1.87
+72, 1.75
+73, 1.7
+74, 1.62
+75, 1.51
+76, 1.44
+77, 1.41
+78, 1.36
+79, 1.36
+80, 1.32
+81, 1.45
+82, 1.46
+83, 1.48
+84, 1.4
+85, 1.5
+86, 1.5
+87, 2.6
+88, 2.21
+89, 2.15
+90, 2.06
+91, 2.0
+92, 1.96
+93, 1.9
+94, 1.87
+95, 1.8
96, 1.69
\ No newline at end of file
diff --git a/src/tcutility/data/_atom_data_info/symbol.txt b/src/tcutility/data/_atom_data_info/symbol.txt
index 4437eb0e..e2791249 100755
--- a/src/tcutility/data/_atom_data_info/symbol.txt
+++ b/src/tcutility/data/_atom_data_info/symbol.txt
@@ -1,120 +1,120 @@
-1, H
-2, He
-3, Li
-4, Be
-5, B
-6, C
-7, N
-8, O
-9, F
-10, Ne
-11, Na
-12, Mg
-13, Al
-14, Si
-15, P
-16, S
-17, Cl
-18, Ar
-19, K
-20, Ca
-21, Sc
-22, Ti
-23, V
-24, Cr
-25, Mn
-26, Fe
-27, Co
-28, Ni
-29, Cu
-30, Zn
-31, Ga
-32, Ge
-33, As
-34, Se
-35, Br
-36, Kr
-37, Rb
-38, Sr
-39, Y
-40, Zr
-41, Nb
-42, Mo
-43, Tc
-44, Ru
-45, Rh
-46, Pd
-47, Ag
-48, Cd
-49, In
-50, Sn
-51, Sb
-52, Te
-53, I
-54, Xe
-55, Cs
-56, Ba
-57, La
-58, Ce
-59, Pr
-60, Nd
-61, Pm
-62, Sm
-63, Eu
-64, Gd
-65, Tb
-66, Dy
-67, Ho
-68, Er
-69, Tm
-70, Yb
-71, Lu
-72, Hf
-73, Ta
-74, W
-75, Re
-76, Os
-77, Ir
-78, Pt
-79, Au
-80, Hg
-81, Tl
-82, Pb
-83, Bi
-84, Po
-85, At
-86, Rn
-87, Fr
-88, Ra
-89, Ac
-90, Th
-91, Pa
-92, U
-93, Np
-94, Pu
-95, Am
-96, Cm
-97, Bk
-98, Cf
-99, Es
-100, Fm
-101, Md
-102, No
-103, Lr
-104, Rf
-105, Db
-106, Sg
-107, Bh
-108, Hs
-109, Mt
-110, Ds
-111, Rg
-112, Cn
-113, Nh
-114, Fl
-115, Mc
-116, Lv
-117, Ts
-118, Og
-119, Uue
+1, H
+2, He
+3, Li
+4, Be
+5, B
+6, C
+7, N
+8, O
+9, F
+10, Ne
+11, Na
+12, Mg
+13, Al
+14, Si
+15, P
+16, S
+17, Cl
+18, Ar
+19, K
+20, Ca
+21, Sc
+22, Ti
+23, V
+24, Cr
+25, Mn
+26, Fe
+27, Co
+28, Ni
+29, Cu
+30, Zn
+31, Ga
+32, Ge
+33, As
+34, Se
+35, Br
+36, Kr
+37, Rb
+38, Sr
+39, Y
+40, Zr
+41, Nb
+42, Mo
+43, Tc
+44, Ru
+45, Rh
+46, Pd
+47, Ag
+48, Cd
+49, In
+50, Sn
+51, Sb
+52, Te
+53, I
+54, Xe
+55, Cs
+56, Ba
+57, La
+58, Ce
+59, Pr
+60, Nd
+61, Pm
+62, Sm
+63, Eu
+64, Gd
+65, Tb
+66, Dy
+67, Ho
+68, Er
+69, Tm
+70, Yb
+71, Lu
+72, Hf
+73, Ta
+74, W
+75, Re
+76, Os
+77, Ir
+78, Pt
+79, Au
+80, Hg
+81, Tl
+82, Pb
+83, Bi
+84, Po
+85, At
+86, Rn
+87, Fr
+88, Ra
+89, Ac
+90, Th
+91, Pa
+92, U
+93, Np
+94, Pu
+95, Am
+96, Cm
+97, Bk
+98, Cf
+99, Es
+100, Fm
+101, Md
+102, No
+103, Lr
+104, Rf
+105, Db
+106, Sg
+107, Bh
+108, Hs
+109, Mt
+110, Ds
+111, Rg
+112, Cn
+113, Nh
+114, Fl
+115, Mc
+116, Lv
+117, Ts
+118, Og
+119, Uue
120, Ubn
\ No newline at end of file
diff --git a/src/tcutility/data/_convert_to_json.py b/src/tcutility/data/_convert_to_json.py
index 878f7011..a8683e33 100755
--- a/src/tcutility/data/_convert_to_json.py
+++ b/src/tcutility/data/_convert_to_json.py
@@ -1,8 +1,8 @@
-from tcutility.data import functionals
-import json
-
-
-with open('available_functionals.json', 'w+') as outp:
- for functional, functional_info in functionals.get_available_functionals().items():
- outp.write(json.dumps(functional_info, indent=4))
- outp.write('\n\n')
+from tcutility.data import functionals
+import json
+
+
+with open('available_functionals.json', 'w+') as outp:
+ for functional, functional_info in functionals.get_available_functionals().items():
+ outp.write(json.dumps(functional_info, indent=4))
+ outp.write('\n\n')
diff --git a/src/tcutility/data/_read_BS_size.py b/src/tcutility/data/_read_BS_size.py
index 764c7133..5220a067 100755
--- a/src/tcutility/data/_read_BS_size.py
+++ b/src/tcutility/data/_read_BS_size.py
@@ -1,45 +1,45 @@
-from tcutility import pathfunc, results
-import json
-
-
-degeneracies = {
- 'S': 1,
- 'P': 3,
- 'D': 5,
- 'F': 7,
- 'G': 9,
-}
-
-ret_data = results.Result()
-for d, info in pathfunc.match('/Applications/AMS2023.104.app/Contents/Resources/amshome/atomicdata/ADF/ZORA', '{BS}/{element}').items():
- if '.' in info.element:
- continue
-
- if info.element == 'Ni_d9':
- continue
-
- if info.element == '00README':
- continue
-
- with open(d) as bsfile:
- lines = bsfile.readlines()
-
- lines = [line.strip() for line in lines if line.strip()]
-
- orbs = []
- start_reading = False
- for line in lines:
- if line.lower() == 'basis':
- start_reading = True
- continue
-
- if start_reading:
- if line.lower() == 'end':
- break
- orbs.append(line.split()[0])
-
- norbs = sum([degeneracies[orb[-1].upper()] for orb in orbs])
- ret_data[info.bs][info.element] = norbs
-
-with open('_atom_data_info/norbs.json', 'w+') as out:
- out.write(json.dumps(ret_data, indent=4))
+from tcutility import pathfunc, results
+import json
+
+
+degeneracies = {
+ 'S': 1,
+ 'P': 3,
+ 'D': 5,
+ 'F': 7,
+ 'G': 9,
+}
+
+ret_data = results.Result()
+for d, info in pathfunc.match('/Applications/AMS2023.104.app/Contents/Resources/amshome/atomicdata/ADF/ZORA', '{BS}/{element}').items():
+ if '.' in info.element:
+ continue
+
+ if info.element == 'Ni_d9':
+ continue
+
+ if info.element == '00README':
+ continue
+
+ with open(d) as bsfile:
+ lines = bsfile.readlines()
+
+ lines = [line.strip() for line in lines if line.strip()]
+
+ orbs = []
+ start_reading = False
+ for line in lines:
+ if line.lower() == 'basis':
+ start_reading = True
+ continue
+
+ if start_reading:
+ if line.lower() == 'end':
+ break
+ orbs.append(line.split()[0])
+
+ norbs = sum([degeneracies[orb[-1].upper()] for orb in orbs])
+ ret_data[info.bs][info.element] = norbs
+
+with open('_atom_data_info/norbs.json', 'w+') as out:
+ out.write(json.dumps(ret_data, indent=4))
diff --git a/src/tcutility/data/atom.py b/src/tcutility/data/atom.py
index 03a2d34f..898c4823 100755
--- a/src/tcutility/data/atom.py
+++ b/src/tcutility/data/atom.py
@@ -1,93 +1,93 @@
-import pathlib as pl
-
-
-# read data
-data_dir = pl.Path(__file__).parents[0] / "_atom_data_info"
-
-with open(data_dir / "name.txt") as data:
- lines = data.readlines()
-_element_order = [line.split(",")[1].strip() for line in lines]
-
-with open(data_dir / "symbol.txt") as data:
- lines = data.readlines()
-_symbol_order = [line.split(",")[1].strip() for line in lines]
-
-with open(data_dir / "radius.txt") as data:
- lines = data.readlines()
-_radii = {int(line.split(",")[0]): float(line.split(",")[1].strip()) for line in lines}
-
-with open(data_dir / "color.txt") as data:
- lines = data.readlines()
-_colors = {int(line.split(",")[0]): [int(x.strip()) for x in line.split(",")[1:]] for line in lines}
-
-
-def parse_element(val):
- """
- Parse a str or int to an atom number.
-
- Args:
- val: Element name, symbol or atom number.
-
- Returns:
- Atom number corresponding to val.
-
- Examples:
-
- .. code-block:: python
-
- parse_element('Hydrogen') == 1
- parse_element('C') == 6
- parse_element(23) == 23
- """
- # we will assume an integer value is an atom number already
- if isinstance(val, int):
- return val
- # if it is not an int it should be a string
- if val.lower() in _element_order:
- # first try to get it in the element name list
- return _element_order.index(val.lower()) + 1
- if val in _symbol_order:
- # alternatively try to get it in the symbol list
- return _symbol_order.index(val) + 1
- raise KeyError(f'Element "{val}" not parsable.')
-
-
-def radius(element):
- '''
- Args:
- element: the symbol, name or atom number of the element. See :func:`parse_element`.
- Return:
- The empirical covalent radius of an element in angstroms, up to element 96.
- '''
- num = parse_element(element)
- return _radii.get(num)
-
-
-def color(element):
- '''
- Args:
- element: the symbol, name or atom number of the element. See :func:`parse_element`.
-
- Return:
- The standard CPK colors of the elements, up to element 109.
- '''
- num = parse_element(element)
- return _colors[num]
-
-
-def atom_number(element):
- return parse_element(element)
-
-
-def symbol(element):
- num = parse_element(element)
- return _symbol_order[num - 1]
-
-
-def element(element):
- num = parse_element(element)
- return _element_order[num - 1]
-
-
-if __name__ == "__main__":
- print(symbol(2))
+import pathlib as pl
+
+
+# read data
+data_dir = pl.Path(__file__).parents[0] / "_atom_data_info"
+
+with open(data_dir / "name.txt") as data:
+ lines = data.readlines()
+_element_order = [line.split(",")[1].strip() for line in lines]
+
+with open(data_dir / "symbol.txt") as data:
+ lines = data.readlines()
+_symbol_order = [line.split(",")[1].strip() for line in lines]
+
+with open(data_dir / "radius.txt") as data:
+ lines = data.readlines()
+_radii = {int(line.split(",")[0]): float(line.split(",")[1].strip()) for line in lines}
+
+with open(data_dir / "color.txt") as data:
+ lines = data.readlines()
+_colors = {int(line.split(",")[0]): [int(x.strip()) for x in line.split(",")[1:]] for line in lines}
+
+
+def parse_element(val):
+ """
+ Parse a str or int to an atom number.
+
+ Args:
+ val: Element name, symbol or atom number.
+
+ Returns:
+ Atom number corresponding to val.
+
+ Examples:
+
+ .. code-block:: python
+
+ parse_element('Hydrogen') == 1
+ parse_element('C') == 6
+ parse_element(23) == 23
+ """
+ # we will assume an integer value is an atom number already
+ if isinstance(val, int):
+ return val
+ # if it is not an int it should be a string
+ if val.lower() in _element_order:
+ # first try to get it in the element name list
+ return _element_order.index(val.lower()) + 1
+ if val in _symbol_order:
+ # alternatively try to get it in the symbol list
+ return _symbol_order.index(val) + 1
+ raise KeyError(f'Element "{val}" not parsable.')
+
+
+def radius(element):
+ '''
+ Args:
+ element: the symbol, name or atom number of the element. See :func:`parse_element`.
+ Return:
+ The empirical covalent radius of an element in angstroms, up to element 96.
+ '''
+ num = parse_element(element)
+ return _radii.get(num)
+
+
+def color(element):
+ '''
+ Args:
+ element: the symbol, name or atom number of the element. See :func:`parse_element`.
+
+ Return:
+ The standard CPK colors of the elements, up to element 109.
+ '''
+ num = parse_element(element)
+ return _colors[num]
+
+
+def atom_number(element):
+ return parse_element(element)
+
+
+def symbol(element):
+ num = parse_element(element)
+ return _symbol_order[num - 1]
+
+
+def element(element):
+ num = parse_element(element)
+ return _element_order[num - 1]
+
+
+if __name__ == "__main__":
+ print(symbol(2))
diff --git a/src/tcutility/data/available_functionals.json b/src/tcutility/data/available_functionals.json
index e10f21e7..0acb8379 100755
--- a/src/tcutility/data/available_functionals.json
+++ b/src/tcutility/data/available_functionals.json
@@ -1,4835 +1,4835 @@
-{
- "category": "LDA",
- "name": "VWN",
- "name_latex": "VWN",
- "name_html": "VWN",
- "path_safe_name": "VWN",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "VWN",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LDA": "VWN"
- }
- }
-}
-
-{
- "category": "LDA",
- "name": "PW92",
- "name_latex": "PW92",
- "name_html": "PW92",
- "path_safe_name": "PW92",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PW92",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LDA": "PW92"
- }
- }
-}
-
-{
- "category": "LDA",
- "name": "Xonly",
- "name_latex": "Xonly",
- "name_html": "Xonly",
- "path_safe_name": "Xonly",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "Xonly",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LDA": "Xonly"
- }
- }
-}
-
-{
- "category": "LDA",
- "name": "Xalpha",
- "name_latex": "Xalpha",
- "name_html": "Xalpha",
- "path_safe_name": "Xalpha",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "Xalpha",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LDA": "Xalpha"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BP86",
- "name_latex": "BP86",
- "name_html": "BP86",
- "path_safe_name": "BP86",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BP86",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "BP86"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BP86-D",
- "name_latex": "BP86-D",
- "name_html": "BP86-D",
- "path_safe_name": "BP86-D",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BP86",
- "dispersion": "D",
- "dispersion_name": "DEFAULT",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "DEFAULT",
- "GGA": "BP86"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BP86-D3",
- "name_latex": "BP86-D3",
- "name_html": "BP86-D3",
- "path_safe_name": "BP86-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BP86",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "GGA": "BP86"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BP86-D3(BJ)",
- "name_latex": "BP86-D3(BJ)",
- "name_html": "BP86-D3(BJ)",
- "path_safe_name": "BP86-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BP86",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "GGA": "BP86"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BP86-D4",
- "name_latex": "BP86-D4",
- "name_html": "BP86-D4",
- "path_safe_name": "BP86-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BP86",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "GGA": "BP86"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BP86-dDsC",
- "name_latex": "BP86-dDsC",
- "name_html": "BP86-dDsC",
- "path_safe_name": "BP86-dDsC",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BP86",
- "dispersion": "dDsC",
- "dispersion_name": "dDsC",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "dDsC",
- "GGA": "BP86"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PW91",
- "name_latex": "PW91",
- "name_html": "PW91",
- "path_safe_name": "PW91",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PW91",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "PW91"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PW91-dUFF",
- "name_latex": "PW91-dUFF",
- "name_html": "PW91-dUFF",
- "path_safe_name": "PW91-dUFF",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PW91",
- "dispersion": "dUFF",
- "dispersion_name": "UFF",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "UFF",
- "GGA": "PW91"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "mPW",
- "name_latex": "mPW",
- "name_html": "mPW",
- "path_safe_name": "mPW",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "mPW",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "mPW"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PBE",
- "name_latex": "PBE",
- "name_html": "PBE",
- "path_safe_name": "PBE",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "PBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PBE-D",
- "name_latex": "PBE-D",
- "name_html": "PBE-D",
- "path_safe_name": "PBE-D",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE",
- "dispersion": "D",
- "dispersion_name": "DEFAULT",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "DEFAULT",
- "GGA": "PBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PBE-D3",
- "name_latex": "PBE-D3",
- "name_html": "PBE-D3",
- "path_safe_name": "PBE-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "GGA": "PBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PBE-D3(BJ)",
- "name_latex": "PBE-D3(BJ)",
- "name_html": "PBE-D3(BJ)",
- "path_safe_name": "PBE-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "GGA": "PBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PBE-D4",
- "name_latex": "PBE-D4",
- "name_html": "PBE-D4",
- "path_safe_name": "PBE-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "GGA": "PBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PBE-dDsC",
- "name_latex": "PBE-dDsC",
- "name_html": "PBE-dDsC",
- "path_safe_name": "PBE-dDsC",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE",
- "dispersion": "dDsC",
- "dispersion_name": "dDsC",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "dDsC",
- "GGA": "PBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PBE-MBD@rsSC",
- "name_latex": "PBE-MBD@rsSC",
- "name_html": "PBE-MBD@rsSC",
- "path_safe_name": "PBE-MBD@rsSC",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE",
- "dispersion": "MBD@rsSC",
- "dispersion_name": "MBD",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "MBD",
- "GGA": "PBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PBE-dUFF",
- "name_latex": "PBE-dUFF",
- "name_html": "PBE-dUFF",
- "path_safe_name": "PBE-dUFF",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE",
- "dispersion": "dUFF",
- "dispersion_name": "UFF",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "UFF",
- "GGA": "PBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "RPBE",
- "name_latex": "RPBE",
- "name_html": "RPBE",
- "path_safe_name": "RPBE",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "RPBE",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "RPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "RPBE-D3",
- "name_latex": "RPBE-D3",
- "name_html": "RPBE-D3",
- "path_safe_name": "RPBE-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "RPBE",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "GGA": "RPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "RPBE-D3(BJ)",
- "name_latex": "RPBE-D3(BJ)",
- "name_html": "RPBE-D3(BJ)",
- "path_safe_name": "RPBE-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "RPBE",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "GGA": "RPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "RPBE-D4",
- "name_latex": "RPBE-D4",
- "name_html": "RPBE-D4",
- "path_safe_name": "RPBE-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "RPBE",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "GGA": "RPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "revPBE",
- "name_latex": "revPBE",
- "name_html": "revPBE",
- "path_safe_name": "revPBE",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "revPBE",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "revPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "revPBE-D3",
- "name_latex": "revPBE-D3",
- "name_html": "revPBE-D3",
- "path_safe_name": "revPBE-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "revPBE",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "GGA": "revPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "revPBE-D3(BJ)",
- "name_latex": "revPBE-D3(BJ)",
- "name_html": "revPBE-D3(BJ)",
- "path_safe_name": "revPBE-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "revPBE",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "GGA": "revPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "revPBE-D4",
- "name_latex": "revPBE-D4",
- "name_html": "revPBE-D4",
- "path_safe_name": "revPBE-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "revPBE",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "GGA": "revPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "revPBE-dDsC",
- "name_latex": "revPBE-dDsC",
- "name_html": "revPBE-dDsC",
- "path_safe_name": "revPBE-dDsC",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "revPBE",
- "dispersion": "dDsC",
- "dispersion_name": "dDsC",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "dDsC",
- "GGA": "revPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "mPBE",
- "name_latex": "mPBE",
- "name_html": "mPBE",
- "path_safe_name": "mPBE",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "mPBE",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "mPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PBEsol",
- "name_latex": "PBEsol",
- "name_html": "PBEsol",
- "path_safe_name": "PBEsol",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBEsol",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "PBEsol"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PBEsol-D",
- "name_latex": "PBEsol-D",
- "name_html": "PBEsol-D",
- "path_safe_name": "PBEsol-D",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBEsol",
- "dispersion": "D",
- "dispersion_name": "DEFAULT",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "DEFAULT",
- "GGA": "PBEsol"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PBEsol-D3",
- "name_latex": "PBEsol-D3",
- "name_html": "PBEsol-D3",
- "path_safe_name": "PBEsol-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBEsol",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "GGA": "PBEsol"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "PBEsol-D3(BJ)",
- "name_latex": "PBEsol-D3(BJ)",
- "name_html": "PBEsol-D3(BJ)",
- "path_safe_name": "PBEsol-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBEsol",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "GGA": "PBEsol"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "HTBS",
- "name_latex": "HTBS",
- "name_html": "HTBS",
- "path_safe_name": "HTBS",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "HTBS",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "HTBS"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BLYP",
- "name_latex": "BLYP",
- "name_html": "BLYP",
- "path_safe_name": "BLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "BLYP"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BLYP-D",
- "name_latex": "BLYP-D",
- "name_html": "BLYP-D",
- "path_safe_name": "BLYP-D",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BLYP",
- "dispersion": "D",
- "dispersion_name": "DEFAULT",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "DEFAULT",
- "GGA": "BLYP"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BLYP-D3",
- "name_latex": "BLYP-D3",
- "name_html": "BLYP-D3",
- "path_safe_name": "BLYP-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BLYP",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "GGA": "BLYP"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BLYP-D3(BJ)",
- "name_latex": "BLYP-D3(BJ)",
- "name_html": "BLYP-D3(BJ)",
- "path_safe_name": "BLYP-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "GGA": "BLYP"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BLYP-D4",
- "name_latex": "BLYP-D4",
- "name_html": "BLYP-D4",
- "path_safe_name": "BLYP-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BLYP",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "GGA": "BLYP"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BLYP-dDsC",
- "name_latex": "BLYP-dDsC",
- "name_html": "BLYP-dDsC",
- "path_safe_name": "BLYP-dDsC",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BLYP",
- "dispersion": "dDsC",
- "dispersion_name": "dDsC",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "dDsC",
- "GGA": "BLYP"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "OLYP",
- "name_latex": "OLYP",
- "name_html": "OLYP",
- "path_safe_name": "OLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "OLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "OLYP"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "OLYP-D3",
- "name_latex": "OLYP-D3",
- "name_html": "OLYP-D3",
- "path_safe_name": "OLYP-D3",
- "disp_params": "GRIMME3 PAR1=1.0000 PAR2=0.806 PAR3=1.764",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "OLYP",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=0.806 PAR3=1.764",
- "GGA": "OLYP"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "OLYP-D3(BJ)",
- "name_latex": "OLYP-D3(BJ)",
- "name_html": "OLYP-D3(BJ)",
- "path_safe_name": "OLYP-D3BJ",
- "disp_params": "GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.5299 PAR3=2.6205 PAR4=2.8065",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "OLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.5299 PAR3=2.6205 PAR4=2.8065",
- "GGA": "OLYP"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "OLYP-D4",
- "name_latex": "OLYP-D4",
- "name_html": "OLYP-D4",
- "path_safe_name": "OLYP-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "OLYP",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "GGA": "OLYP"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "OPBE",
- "name_latex": "OPBE",
- "name_html": "OPBE",
- "path_safe_name": "OPBE",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "OPBE",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "OPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "OPBE-D3(BJ)",
- "name_latex": "OPBE-D3(BJ)",
- "name_html": "OPBE-D3(BJ)",
- "path_safe_name": "OPBE-D3BJ",
- "disp_params": "GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.5512 PAR3=3.3816 PAR4=2.9444",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "OPBE",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.5512 PAR3=3.3816 PAR4=2.9444",
- "GGA": "OPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "OPBE-D4",
- "name_latex": "OPBE-D4",
- "name_html": "OPBE-D4",
- "path_safe_name": "OPBE-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "OPBE",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "GGA": "OPBE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "BEE",
- "name_latex": "BEE",
- "name_html": "BEE",
- "path_safe_name": "BEE",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BEE",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "BEE"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "XLYP",
- "name_latex": "XLYP",
- "name_html": "XLYP",
- "path_safe_name": "XLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "XLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "XLYP"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "GGA:SSB-D",
- "name_latex": "GGA:SSB-D",
- "name_html": "GGA:SSB-D",
- "path_safe_name": "GGA:SSB-D",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "GGA:SSB-D",
- "dispersion": "D",
- "dispersion_name": "DEFAULT",
- "adf_settings": {
- "XC": {
- "GGA": "SSB-D"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "S12g",
- "name_latex": "S12g",
- "name_html": "S12g",
- "path_safe_name": "S12g",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "S12g",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "S12g"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "S12g-D3",
- "name_latex": "S12g-D3",
- "name_html": "S12g-D3",
- "path_safe_name": "S12g-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "S12g",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "GGA": "S12g"
- }
- }
-}
-
-{
- "category": "Model",
- "name": "LB94",
- "name_latex": "LB94",
- "name_html": "LB94",
- "path_safe_name": "LB94",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "LB94",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Model": "LB94"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "KT1",
- "name_latex": "KT1",
- "name_html": "KT1",
- "path_safe_name": "KT1",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "KT1",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "KT1"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "KT2",
- "name_latex": "KT2",
- "name_html": "KT2",
- "path_safe_name": "KT2",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "KT2",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "KT2"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "B97-D",
- "name_latex": "B97-D",
- "name_html": "B97-D",
- "path_safe_name": "B97-D",
- "use_libxc": true,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B97-D",
- "dispersion": "D",
- "dispersion_name": "DEFAULT",
- "adf_settings": {
- "XC": {
- "LibXC": "B97-D"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "B97-D-D3",
- "name_latex": "B97-D-D3",
- "name_html": "B97-D-D3",
- "path_safe_name": "B97-D-D3",
- "disp_params": "GRIMME3 PAR1=1.0000 PAR2=0.892 PAR3=0.909",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B97-D",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=0.892 PAR3=0.909",
- "LibXC": "B97-D"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "B97-GGA1",
- "name_latex": "B97-GGA1",
- "name_html": "B97-GGA1",
- "path_safe_name": "B97-GGA1",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B97-GGA1",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "B97-GGA1"
- }
- }
-}
-
-{
- "category": "GGA",
- "name": "B97-K",
- "name_latex": "B97-K",
- "name_html": "B97-K",
- "path_safe_name": "B97-K",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B97-K",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "B97-K"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "M06L",
- "name_latex": "M06L",
- "name_html": "M06L",
- "path_safe_name": "M06L",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "M06L",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaGGA": "M06L"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "M06L-D3",
- "name_latex": "M06L-D3",
- "name_html": "M06L-D3",
- "path_safe_name": "M06L-D3",
- "disp_params": "GRIMME3 PAR1=1.0000 PAR2=1.581 PAR3=0.000",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "M06L",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=1.581 PAR3=0.000",
- "MetaGGA": "M06L"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "M06L-D4",
- "name_latex": "M06L-D4",
- "name_html": "M06L-D4",
- "path_safe_name": "M06L-D4",
- "disp_params": "GRIMME4 s6=1.0000 s8=0.59493760 a1=0.71422359 a2=6.35314182",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "M06L",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4 s6=1.0000 s8=0.59493760 a1=0.71422359 a2=6.35314182",
- "MetaGGA": "M06L"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "MN15-L",
- "name_latex": "MN15-L",
- "name_html": "MN15-L",
- "path_safe_name": "MN15-L",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "MN15-L",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "MN15-L"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "TPSS",
- "name_latex": "TPSS",
- "name_html": "TPSS",
- "path_safe_name": "TPSS",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "TPSS",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaGGA": "TPSS"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "TPSS-D3(BJ)",
- "name_latex": "TPSS-D3(BJ)",
- "name_html": "TPSS-D3(BJ)",
- "path_safe_name": "TPSS-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "TPSS",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "MetaGGA": "TPSS"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "TPSS-D4",
- "name_latex": "TPSS-D4",
- "name_html": "TPSS-D4",
- "path_safe_name": "TPSS-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "TPSS",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "MetaGGA": "TPSS"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "revTPSS",
- "name_latex": "revTPSS",
- "name_html": "revTPSS",
- "path_safe_name": "revTPSS",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "revTPSS",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaGGA": "revTPSS"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "MetaGGA:SSB-D",
- "name_latex": "MetaGGA:SSB-D",
- "name_html": "MetaGGA:SSB-D",
- "path_safe_name": "MetaGGA:SSB-D",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "MetaGGA:SSB-D",
- "dispersion": "D",
- "dispersion_name": "DEFAULT",
- "adf_settings": {
- "XC": {
- "MetaGGA": "SSB-D"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "MVS",
- "name_latex": "MVS",
- "name_html": "MVS",
- "path_safe_name": "MVS",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "MVS",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaGGA": "MVS"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "MS0",
- "name_latex": "MS0",
- "name_html": "MS0",
- "path_safe_name": "MS0",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "MS0",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaGGA": "MS0"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "MS1",
- "name_latex": "MS1",
- "name_html": "MS1",
- "path_safe_name": "MS1",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "MS1",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaGGA": "MS1"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "MS2",
- "name_latex": "MS2",
- "name_html": "MS2",
- "path_safe_name": "MS2",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "MS2",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaGGA": "MS2"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "SCAN",
- "name_latex": "SCAN",
- "name_html": "SCAN",
- "path_safe_name": "SCAN",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "SCAN",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaGGA": "SCAN"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "SCAN-D3(BJ)",
- "name_latex": "SCAN-D3(BJ)",
- "name_html": "SCAN-D3(BJ)",
- "path_safe_name": "SCAN-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "SCAN",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "MetaGGA": "SCAN"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "TASKxc",
- "name_latex": "TASKxc",
- "name_html": "TASKxc",
- "path_safe_name": "TASKxc",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "TASKxc",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaGGA": "TASKxc"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "TASKCC",
- "name_latex": "TASKCC",
- "name_html": "TASKCC",
- "path_safe_name": "TASKCC",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "TASKCC",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaGGA": "TASKCC"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "revSCAN",
- "name_latex": "revSCAN",
- "name_html": "revSCAN",
- "path_safe_name": "revSCAN",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "revSCAN",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "revSCAN"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "rSCAN",
- "name_latex": "rSCAN",
- "name_html": "rSCAN",
- "path_safe_name": "rSCAN",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rSCAN",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "rSCAN"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "r2SCAN",
- "name_latex": "r$^2$SCAN",
- "name_html": "r2SCAN",
- "path_safe_name": "r2SCAN",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "r2SCAN",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "r2SCAN"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "r2SCAN-D4",
- "name_latex": "r$^2$SCAN-D4",
- "name_html": "r2SCAN-D4",
- "path_safe_name": "r2SCAN-D4",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "r2SCAN",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "LibXC": "r2SCAN"
- }
- }
-}
-
-{
- "category": "MetaGGA",
- "name": "r2SCAN-3c",
- "name_latex": "r$^2$SCAN-3c",
- "name_html": "r2SCAN-3c",
- "path_safe_name": "r2SCAN-3c",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "r2SCAN-3c",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaGGA": "r2SCAN-3c"
- }
- }
-}
-
-{
- "category": "HartreeFock",
- "name": "HartreeFock",
- "name_latex": "HartreeFock",
- "name_html": "HartreeFock",
- "path_safe_name": "HartreeFock",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "HartreeFock",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "HartreeFock": ""
- }
- }
-}
-
-{
- "category": "HartreeFock",
- "name": "HartreeFock-D4",
- "name_latex": "HartreeFock-D4",
- "name_html": "HartreeFock-D4",
- "path_safe_name": "HartreeFock-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "HartreeFock",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "HartreeFock": ""
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B3LYP",
- "name_latex": "B3LYP",
- "name_html": "B3LYP",
- "path_safe_name": "B3LYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B3LYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "B3LYP"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B3LYP-D",
- "name_latex": "B3LYP-D",
- "name_html": "B3LYP-D",
- "path_safe_name": "B3LYP-D",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B3LYP",
- "dispersion": "D",
- "dispersion_name": "DEFAULT",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "DEFAULT",
- "Hybrid": "B3LYP"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B3LYP-D3",
- "name_latex": "B3LYP-D3",
- "name_html": "B3LYP-D3",
- "path_safe_name": "B3LYP-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B3LYP",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "Hybrid": "B3LYP"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B3LYP-D3(BJ)",
- "name_latex": "B3LYP-D3(BJ)",
- "name_html": "B3LYP-D3(BJ)",
- "path_safe_name": "B3LYP-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B3LYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "Hybrid": "B3LYP"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B3LYP-D4",
- "name_latex": "B3LYP-D4",
- "name_html": "B3LYP-D4",
- "path_safe_name": "B3LYP-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B3LYP",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "Hybrid": "B3LYP"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B3LYP*",
- "name_latex": "B3LYP$^*$",
- "name_html": "B3LYP*",
- "path_safe_name": "B3LYPs",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B3LYP*",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "B3LYP*"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B1LYP",
- "name_latex": "B1LYP",
- "name_html": "B1LYP",
- "path_safe_name": "B1LYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B1LYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "B1LYP"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "KMLYP",
- "name_latex": "KMLYP",
- "name_html": "KMLYP",
- "path_safe_name": "KMLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "KMLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "KMLYP"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "O3LYP",
- "name_latex": "O3LYP",
- "name_html": "O3LYP",
- "path_safe_name": "O3LYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "O3LYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "O3LYP"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "X3LYP",
- "name_latex": "X3LYP",
- "name_html": "X3LYP",
- "path_safe_name": "X3LYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "X3LYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "X3LYP"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "BHandH",
- "name_latex": "BH&H",
- "name_html": "BH&H",
- "path_safe_name": "BHandH",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BHandH",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "BHandH"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "BHandHLYP",
- "name_latex": "BH&HLYP",
- "name_html": "BH&HLYP",
- "path_safe_name": "BHandHLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BHandHLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "BHandHLYP"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B1PW91",
- "name_latex": "B1PW91",
- "name_html": "B1PW91",
- "path_safe_name": "B1PW91",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B1PW91",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "B1PW91"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "mPW1PW",
- "name_latex": "mPW1PW",
- "name_html": "mPW1PW",
- "path_safe_name": "mPW1PW",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "mPW1PW",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "mPW1PW"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "mPW1K",
- "name_latex": "mPW1K",
- "name_html": "mPW1K",
- "path_safe_name": "mPW1K",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "mPW1K",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "mPW1K"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "PBE0",
- "name_latex": "PBE0",
- "name_html": "PBE0",
- "path_safe_name": "PBE0",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE0",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "PBE0"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "PBE0-D3",
- "name_latex": "PBE0-D3",
- "name_html": "PBE0-D3",
- "path_safe_name": "PBE0-D3",
- "disp_params": "GRIMME3 PAR1=1.0000 PAR2=1.287 PAR3=0.928",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE0",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=1.287 PAR3=0.928",
- "Hybrid": "PBE0"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "PBE0-D3(BJ)",
- "name_latex": "PBE0-D3(BJ)",
- "name_html": "PBE0-D3(BJ)",
- "path_safe_name": "PBE0-D3BJ",
- "disp_params": "GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.4145 PAR3=1.2177 PAR4=4.8593",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE0",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.4145 PAR3=1.2177 PAR4=4.8593",
- "Hybrid": "PBE0"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "PBE0-D4",
- "name_latex": "PBE0-D4",
- "name_html": "PBE0-D4",
- "path_safe_name": "PBE0-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE0",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "Hybrid": "PBE0"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "OPBE0",
- "name_latex": "OPBE0",
- "name_html": "OPBE0",
- "path_safe_name": "OPBE0",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "OPBE0",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "OPBE0"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "S12H",
- "name_latex": "S12H",
- "name_html": "S12H",
- "path_safe_name": "S12H",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "S12H",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "S12H"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "BMK",
- "name_latex": "BMK",
- "name_html": "BMK",
- "path_safe_name": "BMK",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "BMK",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "HYB_MGGA_X_BMK GGA_C_BMK"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B1B95",
- "name_latex": "B1B95",
- "name_html": "B1B95",
- "path_safe_name": "B1B95",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B1B95",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "B1B95"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B1B95-D3",
- "name_latex": "B1B95-D3",
- "name_html": "B1B95-D3",
- "path_safe_name": "B1B95-D3",
- "disp_params": "GRIMME3 PAR1=1.0000 PAR2=1.613 PAR3=1.868",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B1B95",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=1.613 PAR3=1.868",
- "LibXC": "B1B95"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B97",
- "name_latex": "B97",
- "name_html": "B97",
- "path_safe_name": "B97",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B97",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "B97"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B97-1",
- "name_latex": "B97-1",
- "name_html": "B97-1",
- "path_safe_name": "B97-1",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B97-1",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "B97-1"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B97-2",
- "name_latex": "B97-2",
- "name_html": "B97-2",
- "path_safe_name": "B97-2",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B97-2",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "B97-2"
- }
- }
-}
-
-{
- "category": "Hybrid",
- "name": "B97-3",
- "name_latex": "B97-3",
- "name_html": "B97-3",
- "path_safe_name": "B97-3",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B97-3",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "B97-3"
- }
- }
-}
-
-{
- "category": "MetaHybrid",
- "name": "MN15",
- "name_latex": "MN15",
- "name_html": "MN15",
- "path_safe_name": "MN15",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "MN15",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "MN15"
- }
- }
-}
-
-{
- "category": "MetaHybrid",
- "name": "M06",
- "name_latex": "M06",
- "name_html": "M06",
- "path_safe_name": "M06",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "M06",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaHybrid": "M06"
- }
- }
-}
-
-{
- "category": "MetaHybrid",
- "name": "M06-D3",
- "name_latex": "M06-D3",
- "name_html": "M06-D3",
- "path_safe_name": "M06-D3",
- "disp_params": "GRIMME3 PAR1=1.0000 PAR2=1.325 PAR3=0.000",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "M06",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=1.325 PAR3=0.000",
- "MetaHybrid": "M06"
- }
- }
-}
-
-{
- "category": "MetaHybrid",
- "name": "M06-D4",
- "name_latex": "M06-D4",
- "name_html": "M06-D4",
- "path_safe_name": "M06-D4",
- "disp_params": "GRIMME4 s6=1.0000 s8=0.16366729 a1=0.53456413 a2=6.06192174",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "M06",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4 s6=1.0000 s8=0.16366729 a1=0.53456413 a2=6.06192174",
- "MetaHybrid": "M06"
- }
- }
-}
-
-{
- "category": "MetaHybrid",
- "name": "M06-2X",
- "name_latex": "M06-2X",
- "name_html": "M06-2X",
- "path_safe_name": "M06-2X",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "M06-2X",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaHybrid": "M06-2X"
- }
- }
-}
-
-{
- "category": "MetaHybrid",
- "name": "M06-2X-D3",
- "name_latex": "M06-2X-D3",
- "name_html": "M06-2X-D3",
- "path_safe_name": "M06-2X-D3",
- "disp_params": "GRIMME3 PAR1=1.0000 PAR2=1.619 PAR3=0.000",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "M06-2X",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=1.619 PAR3=0.000",
- "MetaHybrid": "M06-2X"
- }
- }
-}
-
-{
- "category": "MetaHybrid",
- "name": "M06-HF",
- "name_latex": "M06-HF",
- "name_html": "M06-HF",
- "path_safe_name": "M06-HF",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "M06-HF",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaHybrid": "M06-HF"
- }
- }
-}
-
-{
- "category": "MetaHybrid",
- "name": "M06-HF-D3",
- "name_latex": "M06-HF-D3",
- "name_html": "M06-HF-D3",
- "path_safe_name": "M06-HF-D3",
- "disp_params": "GRIMME3 PAR1=1.0000 PAR2=1.446 PAR3=0.000",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "M06-HF",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=1.446 PAR3=0.000",
- "MetaHybrid": "M06-HF"
- }
- }
-}
-
-{
- "category": "MetaHybrid",
- "name": "TPSSH",
- "name_latex": "TPSSH",
- "name_html": "TPSSH",
- "path_safe_name": "TPSSH",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "TPSSH",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MetaHybrid": "TPSSH"
- }
- }
-}
-
-{
- "category": "MetaHybrid",
- "name": "TPSSH-D4",
- "name_latex": "TPSSH-D4",
- "name_html": "TPSSH-D4",
- "path_safe_name": "TPSSH-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "TPSSH",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "MetaHybrid": "TPSSH"
- }
- }
-}
-
-{
- "category": "MetaHybrid",
- "name": "revSCAN0",
- "name_latex": "revSCAN0",
- "name_html": "revSCAN0",
- "path_safe_name": "revSCAN0",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "revSCAN0",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "revSCAN0"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DOD-BLYP",
- "name_latex": "rev-DOD-BLYP",
- "name_html": "rev-DOD-BLYP",
- "path_safe_name": "rev-DOD-BLYP",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DOD-BLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DOD-BLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DOD-BLYP-D3(BJ)",
- "name_latex": "rev-DOD-BLYP-D3(BJ)",
- "name_html": "rev-DOD-BLYP-D3(BJ)",
- "path_safe_name": "rev-DOD-BLYP-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DOD-BLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "rev-DOD-BLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DOD-BLYP-D4",
- "name_latex": "rev-DOD-BLYP-D4",
- "name_html": "rev-DOD-BLYP-D4",
- "path_safe_name": "rev-DOD-BLYP-D4",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DOD-BLYP-D4",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DOD-BLYP-D4"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DOD-PBE",
- "name_latex": "rev-DOD-PBE",
- "name_html": "rev-DOD-PBE",
- "path_safe_name": "rev-DOD-PBE",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DOD-PBE",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DOD-PBE"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DOD-PBE-D3(BJ)",
- "name_latex": "rev-DOD-PBE-D3(BJ)",
- "name_html": "rev-DOD-PBE-D3(BJ)",
- "path_safe_name": "rev-DOD-PBE-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DOD-PBE",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "rev-DOD-PBE"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DOD-PBE-D4",
- "name_latex": "rev-DOD-PBE-D4",
- "name_html": "rev-DOD-PBE-D4",
- "path_safe_name": "rev-DOD-PBE-D4",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DOD-PBE-D4",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DOD-PBE-D4"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DOD-PBEP86",
- "name_latex": "rev-DOD-PBEP86",
- "name_html": "rev-DOD-PBEP86",
- "path_safe_name": "rev-DOD-PBEP86",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DOD-PBEP86",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DOD-PBEP86"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DOD-PBEP86-D3(BJ)",
- "name_latex": "rev-DOD-PBEP86-D3(BJ)",
- "name_html": "rev-DOD-PBEP86-D3(BJ)",
- "path_safe_name": "rev-DOD-PBEP86-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DOD-PBEP86",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "rev-DOD-PBEP86"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DOD-PBEP86-D4",
- "name_latex": "rev-DOD-PBEP86-D4",
- "name_html": "rev-DOD-PBEP86-D4",
- "path_safe_name": "rev-DOD-PBEP86-D4",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DOD-PBEP86-D4",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DOD-PBEP86-D4"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "SOS1-PBE-QIDH",
- "name_latex": "SOS1-PBE-QIDH",
- "name_html": "SOS1-PBE-QIDH",
- "path_safe_name": "SOS1-PBE-QIDH",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "SOS1-PBE-QIDH",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "SOS1-PBE-QIDH"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "DOD-SCAN",
- "name_latex": "DOD-SCAN",
- "name_html": "DOD-SCAN",
- "path_safe_name": "DOD-SCAN",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "DOD-SCAN",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "DOD-SCAN"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "DOD-SCAN-D3(BJ)",
- "name_latex": "DOD-SCAN-D3(BJ)",
- "name_html": "DOD-SCAN-D3(BJ)",
- "path_safe_name": "DOD-SCAN-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "DOD-SCAN",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "DOD-SCAN"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DOD-SCAN-D4",
- "name_latex": "rev-DOD-SCAN-D4",
- "name_html": "rev-DOD-SCAN-D4",
- "path_safe_name": "rev-DOD-SCAN-D4",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DOD-SCAN-D4",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DOD-SCAN-D4"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2PLYP",
- "name_latex": "B2PLYP",
- "name_html": "B2PLYP",
- "path_safe_name": "B2PLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2PLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "B2PLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2PIPLYP",
- "name_latex": "B2$\\pi$PLYP",
- "name_html": "B2πPLYP",
- "path_safe_name": "B2PIPLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2PIPLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "B2PIPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "ROB2PLYP",
- "name_latex": "ROB2PLYP",
- "name_html": "ROB2PLYP",
- "path_safe_name": "ROB2PLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "ROB2PLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "ROB2PLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2TPLYP",
- "name_latex": "B2TPLYP",
- "name_html": "B2TPLYP",
- "path_safe_name": "B2TPLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2TPLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "B2TPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2GPPLYP",
- "name_latex": "B2GPPLYP",
- "name_html": "B2GPPLYP",
- "path_safe_name": "B2GPPLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2GPPLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "B2GPPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2KPLYP",
- "name_latex": "B2KPLYP",
- "name_html": "B2KPLYP",
- "path_safe_name": "B2KPLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2KPLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "B2KPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2NCPLYP",
- "name_latex": "B2NCPLYP",
- "name_html": "B2NCPLYP",
- "path_safe_name": "B2NCPLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2NCPLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "B2NCPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "mPW2PLYP",
- "name_latex": "mPW2PLYP",
- "name_html": "mPW2PLYP",
- "path_safe_name": "mPW2PLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "mPW2PLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "mPW2PLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "mPW2KPLYP",
- "name_latex": "mPW2KPLYP",
- "name_html": "mPW2KPLYP",
- "path_safe_name": "mPW2KPLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "mPW2KPLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "mPW2KPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "mPW2NCPLYP",
- "name_latex": "mPW2NCPLYP",
- "name_html": "mPW2NCPLYP",
- "path_safe_name": "mPW2NCPLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "mPW2NCPLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "mPW2NCPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "DH-BLYP",
- "name_latex": "DH-BLYP",
- "name_html": "DH-BLYP",
- "path_safe_name": "DH-BLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "DH-BLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "DH-BLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "PBE0-DH",
- "name_latex": "PBE0-DH",
- "name_html": "PBE0-DH",
- "path_safe_name": "PBE0-DH",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE0-DH",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "PBE0-DH"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "PBE-QIDH",
- "name_latex": "PBE-QIDH",
- "name_html": "PBE-QIDH",
- "path_safe_name": "PBE-QIDH",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE-QIDH",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "PBE-QIDH"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "LS1-DH",
- "name_latex": "LS1-DH",
- "name_html": "LS1-DH",
- "path_safe_name": "LS1-DH",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "LS1-DH",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "LS1-DH"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "PBE0-2",
- "name_latex": "PBE0-2",
- "name_html": "PBE0-2",
- "path_safe_name": "PBE0-2",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE0-2",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "PBE0-2"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "LS1-TPSS",
- "name_latex": "LS1-TPSS",
- "name_html": "LS1-TPSS",
- "path_safe_name": "LS1-TPSS",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "LS1-TPSS",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "LS1-TPSS"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "DS1-TPSS",
- "name_latex": "DS1-TPSS",
- "name_html": "DS1-TPSS",
- "path_safe_name": "DS1-TPSS",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "DS1-TPSS",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "DS1-TPSS"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2PLYP-D3",
- "name_latex": "B2PLYP-D3",
- "name_html": "B2PLYP-D3",
- "path_safe_name": "B2PLYP-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2PLYP",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "DoubleHybrid": "B2PLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2GPPLYP-D3",
- "name_latex": "B2GPPLYP-D3",
- "name_html": "B2GPPLYP-D3",
- "path_safe_name": "B2GPPLYP-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2GPPLYP",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "DoubleHybrid": "B2GPPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2NCPLYP-D3",
- "name_latex": "B2NCPLYP-D3",
- "name_html": "B2NCPLYP-D3",
- "path_safe_name": "B2NCPLYP-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2NCPLYP",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "DoubleHybrid": "B2NCPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "mPW2NCPLYP-D3",
- "name_latex": "mPW2NCPLYP-D3",
- "name_html": "mPW2NCPLYP-D3",
- "path_safe_name": "mPW2NCPLYP-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "mPW2NCPLYP",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "DoubleHybrid": "mPW2NCPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "PBE0-DH-D3",
- "name_latex": "PBE0-DH-D3",
- "name_html": "PBE0-DH-D3",
- "path_safe_name": "PBE0-DH-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE0-DH",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "DoubleHybrid": "PBE0-DH"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "PBE-QIDH-D3",
- "name_latex": "PBE-QIDH-D3",
- "name_html": "PBE-QIDH-D3",
- "path_safe_name": "PBE-QIDH-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE-QIDH",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "DoubleHybrid": "PBE-QIDH"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "LS1-DH-D3",
- "name_latex": "LS1-DH-D3",
- "name_html": "LS1-DH-D3",
- "path_safe_name": "LS1-DH-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "LS1-DH",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "DoubleHybrid": "LS1-DH"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "PBE0-2-D3",
- "name_latex": "PBE0-2-D3",
- "name_html": "PBE0-2-D3",
- "path_safe_name": "PBE0-2-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE0-2",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "DoubleHybrid": "PBE0-2"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "LS1-TPSS-D3",
- "name_latex": "LS1-TPSS-D3",
- "name_html": "LS1-TPSS-D3",
- "path_safe_name": "LS1-TPSS-D3",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "LS1-TPSS",
- "dispersion": "D3",
- "dispersion_name": "GRIMME3",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3",
- "DoubleHybrid": "LS1-TPSS"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2PLYP-D3(BJ)",
- "name_latex": "B2PLYP-D3(BJ)",
- "name_html": "B2PLYP-D3(BJ)",
- "path_safe_name": "B2PLYP-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2PLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "B2PLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2PIPLYP-D3(BJ)",
- "name_latex": "B2$\\pi$PLYP-D3(BJ)",
- "name_html": "B2πPLYP-D3(BJ)",
- "path_safe_name": "B2PIPLYP-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2PIPLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "B2PIPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "ROB2PLYP-D3(BJ)",
- "name_latex": "ROB2PLYP-D3(BJ)",
- "name_html": "ROB2PLYP-D3(BJ)",
- "path_safe_name": "ROB2PLYP-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "ROB2PLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "ROB2PLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2TPLYP-D3(BJ)",
- "name_latex": "B2TPLYP-D3(BJ)",
- "name_html": "B2TPLYP-D3(BJ)",
- "path_safe_name": "B2TPLYP-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2TPLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "B2TPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2GPPLYP-D3(BJ)",
- "name_latex": "B2GPPLYP-D3(BJ)",
- "name_html": "B2GPPLYP-D3(BJ)",
- "path_safe_name": "B2GPPLYP-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2GPPLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "B2GPPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2KPLYP-D3(BJ)",
- "name_latex": "B2KPLYP-D3(BJ)",
- "name_html": "B2KPLYP-D3(BJ)",
- "path_safe_name": "B2KPLYP-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2KPLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "B2KPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2NCPLYP-D3(BJ)",
- "name_latex": "B2NCPLYP-D3(BJ)",
- "name_html": "B2NCPLYP-D3(BJ)",
- "path_safe_name": "B2NCPLYP-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2NCPLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "B2NCPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "mPW2NCPLYP-D3(BJ)",
- "name_latex": "mPW2NCPLYP-D3(BJ)",
- "name_html": "mPW2NCPLYP-D3(BJ)",
- "path_safe_name": "mPW2NCPLYP-D3BJ",
- "disp_params": "GRIMME3 BJDAMP PAR1=0.385 PAR2=-0.493 PAR3=0.0 PAR4=9.529",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "mPW2NCPLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP PAR1=0.385 PAR2=-0.493 PAR3=0.0 PAR4=9.529",
- "DoubleHybrid": "mPW2NCPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "mPW2KPLYP-D3(BJ)",
- "name_latex": "mPW2KPLYP-D3(BJ)",
- "name_html": "mPW2KPLYP-D3(BJ)",
- "path_safe_name": "mPW2KPLYP-D3BJ",
- "disp_params": "GRIMME3 BJDAMP PAR1=0.490 PAR2=0.306 PAR3=0.915 PAR4=5.057",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "mPW2KPLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP PAR1=0.490 PAR2=0.306 PAR3=0.915 PAR4=5.057",
- "DoubleHybrid": "mPW2KPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "DH-BLYP-D3(BJ)",
- "name_latex": "DH-BLYP-D3(BJ)",
- "name_html": "DH-BLYP-D3(BJ)",
- "path_safe_name": "DH-BLYP-D3BJ",
- "disp_params": "GRIMME3 BJDAMP PAR1=0.488 PAR2=0.306 PAR3=0.915 PAR4=5.057",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "DH-BLYP",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP PAR1=0.488 PAR2=0.306 PAR3=0.915 PAR4=5.057",
- "DoubleHybrid": "DH-BLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "PBE0-DH-D3(BJ)",
- "name_latex": "PBE0-DH-D3(BJ)",
- "name_html": "PBE0-DH-D3(BJ)",
- "path_safe_name": "PBE0-DH-D3BJ",
- "disp_params": "GRIMME3 BJDAMP PAR1=0.880 PAR2=0.000 PAR3=0.165 PAR4=6.385",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE0-DH",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP PAR1=0.880 PAR2=0.000 PAR3=0.165 PAR4=6.385",
- "DoubleHybrid": "PBE0-DH"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "PBE-QIDH-D3(BJ)",
- "name_latex": "PBE-QIDH-D3(BJ)",
- "name_html": "PBE-QIDH-D3(BJ)",
- "path_safe_name": "PBE-QIDH-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE-QIDH",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "PBE-QIDH"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "LS1-DH-D3(BJ)",
- "name_latex": "LS1-DH-D3(BJ)",
- "name_html": "LS1-DH-D3(BJ)",
- "path_safe_name": "LS1-DH-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "LS1-DH",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "LS1-DH"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "PBE0-2-D3(BJ)",
- "name_latex": "PBE0-2-D3(BJ)",
- "name_html": "PBE0-2-D3(BJ)",
- "path_safe_name": "PBE0-2-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE0-2",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "PBE0-2"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "LS1-TPSS-D3(BJ)",
- "name_latex": "LS1-TPSS-D3(BJ)",
- "name_html": "LS1-TPSS-D3(BJ)",
- "path_safe_name": "LS1-TPSS-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "LS1-TPSS",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "LS1-TPSS"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "DS1-TPSS-D3(BJ)",
- "name_latex": "DS1-TPSS-D3(BJ)",
- "name_html": "DS1-TPSS-D3(BJ)",
- "path_safe_name": "DS1-TPSS-D3BJ",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "DS1-TPSS",
- "dispersion": "D3(BJ)",
- "dispersion_name": "GRIMME3 BJDAMP",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME3 BJDAMP",
- "DoubleHybrid": "DS1-TPSS"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2PLYP-D4",
- "name_latex": "B2PLYP-D4",
- "name_html": "B2PLYP-D4",
- "path_safe_name": "B2PLYP-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2PLYP",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "DoubleHybrid": "B2PLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "B2GPPLYP-D4",
- "name_latex": "B2GPPLYP-D4",
- "name_html": "B2GPPLYP-D4",
- "path_safe_name": "B2GPPLYP-D4",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "B2GPPLYP",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "DoubleHybrid": "B2GPPLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "mPW2PLYP-D4",
- "name_latex": "mPW2PLYP-D4",
- "name_html": "mPW2PLYP-D4",
- "path_safe_name": "mPW2PLYP-D4",
- "disp_params": "GRIMME4 s6=0.750 s8=0.4579 a1=0.43 a2=5.0765",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "mPW2PLYP",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4 s6=0.750 s8=0.4579 a1=0.43 a2=5.0765",
- "DoubleHybrid": "mPW2PLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "PBE0-DH-D4",
- "name_latex": "PBE0-DH-D4",
- "name_html": "PBE0-DH-D4",
- "path_safe_name": "PBE0-DH-D4",
- "disp_params": "GRIMME4 s6=0.875 s8=0.9681 a1=0.4759 a2=5.0862",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE0-DH",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4 s6=0.875 s8=0.9681 a1=0.4759 a2=5.0862",
- "DoubleHybrid": "PBE0-DH"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "PBE0-2-D4",
- "name_latex": "PBE0-2-D4",
- "name_html": "PBE0-2-D4",
- "path_safe_name": "PBE0-2-D4",
- "disp_params": "GRIMME4 s6=0.500 s8=0.6430 a1=0.7654 a2=5.7858",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "PBE0-2",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4 s6=0.500 s8=0.6430 a1=0.7654 a2=5.7858",
- "DoubleHybrid": "PBE0-2"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "DSD-BLYP",
- "name_latex": "DSD-BLYP",
- "name_html": "DSD-BLYP",
- "path_safe_name": "DSD-BLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "DSD-BLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "DSD-BLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DSD-BLYP",
- "name_latex": "rev-DSD-BLYP",
- "name_html": "rev-DSD-BLYP",
- "path_safe_name": "rev-DSD-BLYP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DSD-BLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DSD-BLYP"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DSD-BLYP-D4",
- "name_latex": "rev-DSD-BLYP-D4",
- "name_html": "rev-DSD-BLYP-D4",
- "path_safe_name": "rev-DSD-BLYP-D4",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DSD-BLYP-D4",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DSD-BLYP-D4"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "DSD-PBEP86",
- "name_latex": "DSD-PBEP86",
- "name_html": "DSD-PBEP86",
- "path_safe_name": "DSD-PBEP86",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "DSD-PBEP86",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "DSD-PBEP86"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DSD-PBEP86",
- "name_latex": "rev-DSD-PBEP86",
- "name_html": "rev-DSD-PBEP86",
- "path_safe_name": "rev-DSD-PBEP86",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DSD-PBEP86",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DSD-PBEP86"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DSD-PBEP86-D4",
- "name_latex": "rev-DSD-PBEP86-D4",
- "name_html": "rev-DSD-PBEP86-D4",
- "path_safe_name": "rev-DSD-PBEP86-D4",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DSD-PBEP86-D4",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DSD-PBEP86-D4"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "DSD-PBE",
- "name_latex": "DSD-PBE",
- "name_html": "DSD-PBE",
- "path_safe_name": "DSD-PBE",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "DSD-PBE",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "DSD-PBE"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DSD-PBE",
- "name_latex": "rev-DSD-PBE",
- "name_html": "rev-DSD-PBE",
- "path_safe_name": "rev-DSD-PBE",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DSD-PBE",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DSD-PBE"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DSD-PBE-D4",
- "name_latex": "rev-DSD-PBE-D4",
- "name_html": "rev-DSD-PBE-D4",
- "path_safe_name": "rev-DSD-PBE-D4",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DSD-PBE-D4",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DSD-PBE-D4"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "rev-DSD-SCAN-D4",
- "name_latex": "rev-DSD-SCAN-D4",
- "name_html": "rev-DSD-SCAN-D4",
- "path_safe_name": "rev-DSD-SCAN-D4",
- "use_libxc": false,
- "includes_disp": true,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "rev-DSD-SCAN-D4",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "rev-DSD-SCAN-D4"
- }
- }
-}
-
-{
- "category": "DoubleHybrid",
- "name": "SD-SCAN69",
- "name_latex": "SD-SCAN69",
- "name_html": "SD-SCAN69",
- "path_safe_name": "SD-SCAN69",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "SD-SCAN69",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "DoubleHybrid": "SD-SCAN69"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "LCY-BLYP",
- "name_latex": "LCY-BLYP",
- "name_html": "LCY-BLYP",
- "path_safe_name": "LCY-BLYP",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "LCY-BLYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "BLYP",
- "RANGESEP": "",
- "xcfun": ""
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "LCY-BP86",
- "name_latex": "LCY-BP86",
- "name_html": "LCY-BP86",
- "path_safe_name": "LCY-BP86",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "LCY-BP86",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "BP86",
- "RANGESEP": "",
- "xcfun": ""
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "LCY-PBE",
- "name_latex": "LCY-PBE",
- "name_html": "LCY-PBE",
- "path_safe_name": "LCY-PBE",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "LCY-PBE",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "GGA": "PBE",
- "RANGESEP": "",
- "xcfun": ""
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "CAM-B3LYP",
- "name_latex": "CAM-B3LYP",
- "name_html": "CAM-B3LYP",
- "path_safe_name": "CAM-B3LYP",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "CAM-B3LYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "CAM-B3LYP"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "CAM-B3LYP-D4",
- "name_latex": "CAM-B3LYP-D4",
- "name_html": "CAM-B3LYP-D4",
- "path_safe_name": "CAM-B3LYP-D4",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "CAM-B3LYP",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "disp_params": {},
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4",
- "LibXC": "CAM-B3LYP"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "CAMY-B3LYP",
- "name_latex": "CAMY-B3LYP",
- "name_html": "CAMY-B3LYP",
- "path_safe_name": "CAMY-B3LYP",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "CAMY-B3LYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Hybrid": "CAMY-B3LYP",
- "RANGESEP": "",
- "xcfun": ""
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "HJS-PBE",
- "name_latex": "HJS-PBE",
- "name_html": "HJS-PBE",
- "path_safe_name": "HJS-PBE",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "HJS-PBE",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "HJS-PBE"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "HJS-PBESOL",
- "name_latex": "HJS-PBESOL",
- "name_html": "HJS-PBESOL",
- "path_safe_name": "HJS-PBESOL",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "HJS-PBESOL",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "HJS-PBESOL"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "HJS-B97X",
- "name_latex": "HJS-B97X",
- "name_html": "HJS-B97X",
- "path_safe_name": "HJS-B97X",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "HJS-B97X",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "HJS-B97X"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "HSE03",
- "name_latex": "HSE03",
- "name_html": "HSE03",
- "path_safe_name": "HSE03",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "HSE03",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "HSE03"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "HSE06",
- "name_latex": "HSE06",
- "name_html": "HSE06",
- "path_safe_name": "HSE06",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "HSE06",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "HSE06"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "LRC_WPBE",
- "name_latex": "LRC_WPBE",
- "name_html": "LRC_WPBE",
- "path_safe_name": "LRC_WPBE",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "LRC_WPBE",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "LRC_WPBE"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "LRC_WPBEH",
- "name_latex": "LRC_WPBEH",
- "name_html": "LRC_WPBEH",
- "path_safe_name": "LRC_WPBEH",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "LRC_WPBEH",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "LRC_WPBEH"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "M06-SX",
- "name_latex": "M06-SX",
- "name_html": "M06-SX",
- "path_safe_name": "M06-SX",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "M06-SX",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "M06-SX"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "M11",
- "name_latex": "M11",
- "name_html": "M11",
- "path_safe_name": "M11",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "M11",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "M11"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "MN12-SX",
- "name_latex": "MN12-SX",
- "name_html": "MN12-SX",
- "path_safe_name": "MN12-SX",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "MN12-SX",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "MN12-SX"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "N12-SX",
- "name_latex": "N12-SX",
- "name_html": "N12-SX",
- "path_safe_name": "N12-SX",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "N12-SX",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "N12-SX"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "TUNED-CAM-B3LYP",
- "name_latex": "TUNED-CAM-B3LYP",
- "name_html": "TUNED-CAM-B3LYP",
- "path_safe_name": "TUNED-CAM-B3LYP",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "TUNED-CAM-B3LYP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "TUNED-CAM-B3LYP"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "WB97",
- "name_latex": "$\\omega$B97",
- "name_html": "ωB97",
- "path_safe_name": "WB97",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "WB97",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "WB97"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "WB97X",
- "name_latex": "$\\omega$B97X",
- "name_html": "ωB97X",
- "path_safe_name": "WB97X",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "WB97X",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "LibXC": "WB97X"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "WB97-D4",
- "name_latex": "$\\omega$B97-D4",
- "name_html": "ωB97-D4",
- "path_safe_name": "WB97-D4",
- "disp_params": "GRIMME4 s6=1.0000 s8=6.55792598 a1=0.76666802 a2=8.36027334",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "WB97",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4 s6=1.0000 s8=6.55792598 a1=0.76666802 a2=8.36027334",
- "LibXC": "WB97"
- }
- }
-}
-
-{
- "category": "RangeSeparated",
- "name": "WB97X-D4",
- "name_latex": "$\\omega$B97X-D4",
- "name_html": "ωB97X-D4",
- "path_safe_name": "WB97X-D4",
- "disp_params": "GRIMME4 s6=1.0000 s8=-0.07519516 a1=0.45094893 a2=6.78425255",
- "use_libxc": true,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "WB97X",
- "dispersion": "D4",
- "dispersion_name": "GRIMME4",
- "adf_settings": {
- "XC": {
- "Dispersion": "GRIMME4 s6=1.0000 s8=-0.07519516 a1=0.45094893 a2=6.78425255",
- "LibXC": "WB97X"
- }
- }
-}
-
-{
- "category": "MP2",
- "name": "MP2",
- "name_latex": "MP2",
- "name_html": "MP2",
- "path_safe_name": "MP2",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "MP2",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MP2": ""
- }
- }
-}
-
-{
- "category": "MP2",
- "name": "SOS-MP2",
- "name_latex": "SOS-MP2",
- "name_html": "SOS-MP2",
- "path_safe_name": "SOS-MP2",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "SOS-MP2",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MP2": "",
- "EmpiricalScaling": "SOS"
- }
- }
-}
-
-{
- "category": "MP2",
- "name": "SCS-MP2",
- "name_latex": "SCS-MP2",
- "name_html": "SCS-MP2",
- "path_safe_name": "SCS-MP2",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "SCS-MP2",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "MP2": "",
- "EmpiricalScaling": "SCS"
- }
- }
-}
-
-{
- "category": "Model",
- "name": "SAOP",
- "name_latex": "SAOP",
- "name_html": "SAOP",
- "path_safe_name": "SAOP",
- "use_libxc": false,
- "includes_disp": false,
- "available_in_adf": true,
- "available_in_band": false,
- "available_in_orca": false,
- "name_no_disp": "SAOP",
- "dispersion": null,
- "dispersion_name": null,
- "adf_settings": {
- "XC": {
- "Model": "SAOP"
- }
- }
-}
-
+{
+ "category": "LDA",
+ "name": "VWN",
+ "name_latex": "VWN",
+ "name_html": "VWN",
+ "path_safe_name": "VWN",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "VWN",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LDA": "VWN"
+ }
+ }
+}
+
+{
+ "category": "LDA",
+ "name": "PW92",
+ "name_latex": "PW92",
+ "name_html": "PW92",
+ "path_safe_name": "PW92",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PW92",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LDA": "PW92"
+ }
+ }
+}
+
+{
+ "category": "LDA",
+ "name": "Xonly",
+ "name_latex": "Xonly",
+ "name_html": "Xonly",
+ "path_safe_name": "Xonly",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "Xonly",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LDA": "Xonly"
+ }
+ }
+}
+
+{
+ "category": "LDA",
+ "name": "Xalpha",
+ "name_latex": "Xalpha",
+ "name_html": "Xalpha",
+ "path_safe_name": "Xalpha",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "Xalpha",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LDA": "Xalpha"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BP86",
+ "name_latex": "BP86",
+ "name_html": "BP86",
+ "path_safe_name": "BP86",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BP86",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "BP86"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BP86-D",
+ "name_latex": "BP86-D",
+ "name_html": "BP86-D",
+ "path_safe_name": "BP86-D",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BP86",
+ "dispersion": "D",
+ "dispersion_name": "DEFAULT",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "DEFAULT",
+ "GGA": "BP86"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BP86-D3",
+ "name_latex": "BP86-D3",
+ "name_html": "BP86-D3",
+ "path_safe_name": "BP86-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BP86",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "GGA": "BP86"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BP86-D3(BJ)",
+ "name_latex": "BP86-D3(BJ)",
+ "name_html": "BP86-D3(BJ)",
+ "path_safe_name": "BP86-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BP86",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "GGA": "BP86"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BP86-D4",
+ "name_latex": "BP86-D4",
+ "name_html": "BP86-D4",
+ "path_safe_name": "BP86-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BP86",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "GGA": "BP86"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BP86-dDsC",
+ "name_latex": "BP86-dDsC",
+ "name_html": "BP86-dDsC",
+ "path_safe_name": "BP86-dDsC",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BP86",
+ "dispersion": "dDsC",
+ "dispersion_name": "dDsC",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "dDsC",
+ "GGA": "BP86"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PW91",
+ "name_latex": "PW91",
+ "name_html": "PW91",
+ "path_safe_name": "PW91",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PW91",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "PW91"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PW91-dUFF",
+ "name_latex": "PW91-dUFF",
+ "name_html": "PW91-dUFF",
+ "path_safe_name": "PW91-dUFF",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PW91",
+ "dispersion": "dUFF",
+ "dispersion_name": "UFF",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "UFF",
+ "GGA": "PW91"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "mPW",
+ "name_latex": "mPW",
+ "name_html": "mPW",
+ "path_safe_name": "mPW",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "mPW",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "mPW"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PBE",
+ "name_latex": "PBE",
+ "name_html": "PBE",
+ "path_safe_name": "PBE",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "PBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PBE-D",
+ "name_latex": "PBE-D",
+ "name_html": "PBE-D",
+ "path_safe_name": "PBE-D",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE",
+ "dispersion": "D",
+ "dispersion_name": "DEFAULT",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "DEFAULT",
+ "GGA": "PBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PBE-D3",
+ "name_latex": "PBE-D3",
+ "name_html": "PBE-D3",
+ "path_safe_name": "PBE-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "GGA": "PBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PBE-D3(BJ)",
+ "name_latex": "PBE-D3(BJ)",
+ "name_html": "PBE-D3(BJ)",
+ "path_safe_name": "PBE-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "GGA": "PBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PBE-D4",
+ "name_latex": "PBE-D4",
+ "name_html": "PBE-D4",
+ "path_safe_name": "PBE-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "GGA": "PBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PBE-dDsC",
+ "name_latex": "PBE-dDsC",
+ "name_html": "PBE-dDsC",
+ "path_safe_name": "PBE-dDsC",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE",
+ "dispersion": "dDsC",
+ "dispersion_name": "dDsC",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "dDsC",
+ "GGA": "PBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PBE-MBD@rsSC",
+ "name_latex": "PBE-MBD@rsSC",
+ "name_html": "PBE-MBD@rsSC",
+ "path_safe_name": "PBE-MBD@rsSC",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE",
+ "dispersion": "MBD@rsSC",
+ "dispersion_name": "MBD",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "MBD",
+ "GGA": "PBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PBE-dUFF",
+ "name_latex": "PBE-dUFF",
+ "name_html": "PBE-dUFF",
+ "path_safe_name": "PBE-dUFF",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE",
+ "dispersion": "dUFF",
+ "dispersion_name": "UFF",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "UFF",
+ "GGA": "PBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "RPBE",
+ "name_latex": "RPBE",
+ "name_html": "RPBE",
+ "path_safe_name": "RPBE",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "RPBE",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "RPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "RPBE-D3",
+ "name_latex": "RPBE-D3",
+ "name_html": "RPBE-D3",
+ "path_safe_name": "RPBE-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "RPBE",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "GGA": "RPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "RPBE-D3(BJ)",
+ "name_latex": "RPBE-D3(BJ)",
+ "name_html": "RPBE-D3(BJ)",
+ "path_safe_name": "RPBE-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "RPBE",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "GGA": "RPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "RPBE-D4",
+ "name_latex": "RPBE-D4",
+ "name_html": "RPBE-D4",
+ "path_safe_name": "RPBE-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "RPBE",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "GGA": "RPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "revPBE",
+ "name_latex": "revPBE",
+ "name_html": "revPBE",
+ "path_safe_name": "revPBE",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "revPBE",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "revPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "revPBE-D3",
+ "name_latex": "revPBE-D3",
+ "name_html": "revPBE-D3",
+ "path_safe_name": "revPBE-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "revPBE",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "GGA": "revPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "revPBE-D3(BJ)",
+ "name_latex": "revPBE-D3(BJ)",
+ "name_html": "revPBE-D3(BJ)",
+ "path_safe_name": "revPBE-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "revPBE",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "GGA": "revPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "revPBE-D4",
+ "name_latex": "revPBE-D4",
+ "name_html": "revPBE-D4",
+ "path_safe_name": "revPBE-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "revPBE",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "GGA": "revPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "revPBE-dDsC",
+ "name_latex": "revPBE-dDsC",
+ "name_html": "revPBE-dDsC",
+ "path_safe_name": "revPBE-dDsC",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "revPBE",
+ "dispersion": "dDsC",
+ "dispersion_name": "dDsC",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "dDsC",
+ "GGA": "revPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "mPBE",
+ "name_latex": "mPBE",
+ "name_html": "mPBE",
+ "path_safe_name": "mPBE",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "mPBE",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "mPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PBEsol",
+ "name_latex": "PBEsol",
+ "name_html": "PBEsol",
+ "path_safe_name": "PBEsol",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBEsol",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "PBEsol"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PBEsol-D",
+ "name_latex": "PBEsol-D",
+ "name_html": "PBEsol-D",
+ "path_safe_name": "PBEsol-D",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBEsol",
+ "dispersion": "D",
+ "dispersion_name": "DEFAULT",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "DEFAULT",
+ "GGA": "PBEsol"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PBEsol-D3",
+ "name_latex": "PBEsol-D3",
+ "name_html": "PBEsol-D3",
+ "path_safe_name": "PBEsol-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBEsol",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "GGA": "PBEsol"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "PBEsol-D3(BJ)",
+ "name_latex": "PBEsol-D3(BJ)",
+ "name_html": "PBEsol-D3(BJ)",
+ "path_safe_name": "PBEsol-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBEsol",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "GGA": "PBEsol"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "HTBS",
+ "name_latex": "HTBS",
+ "name_html": "HTBS",
+ "path_safe_name": "HTBS",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "HTBS",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "HTBS"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BLYP",
+ "name_latex": "BLYP",
+ "name_html": "BLYP",
+ "path_safe_name": "BLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "BLYP"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BLYP-D",
+ "name_latex": "BLYP-D",
+ "name_html": "BLYP-D",
+ "path_safe_name": "BLYP-D",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BLYP",
+ "dispersion": "D",
+ "dispersion_name": "DEFAULT",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "DEFAULT",
+ "GGA": "BLYP"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BLYP-D3",
+ "name_latex": "BLYP-D3",
+ "name_html": "BLYP-D3",
+ "path_safe_name": "BLYP-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BLYP",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "GGA": "BLYP"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BLYP-D3(BJ)",
+ "name_latex": "BLYP-D3(BJ)",
+ "name_html": "BLYP-D3(BJ)",
+ "path_safe_name": "BLYP-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "GGA": "BLYP"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BLYP-D4",
+ "name_latex": "BLYP-D4",
+ "name_html": "BLYP-D4",
+ "path_safe_name": "BLYP-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BLYP",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "GGA": "BLYP"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BLYP-dDsC",
+ "name_latex": "BLYP-dDsC",
+ "name_html": "BLYP-dDsC",
+ "path_safe_name": "BLYP-dDsC",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BLYP",
+ "dispersion": "dDsC",
+ "dispersion_name": "dDsC",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "dDsC",
+ "GGA": "BLYP"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "OLYP",
+ "name_latex": "OLYP",
+ "name_html": "OLYP",
+ "path_safe_name": "OLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "OLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "OLYP"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "OLYP-D3",
+ "name_latex": "OLYP-D3",
+ "name_html": "OLYP-D3",
+ "path_safe_name": "OLYP-D3",
+ "disp_params": "GRIMME3 PAR1=1.0000 PAR2=0.806 PAR3=1.764",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "OLYP",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=0.806 PAR3=1.764",
+ "GGA": "OLYP"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "OLYP-D3(BJ)",
+ "name_latex": "OLYP-D3(BJ)",
+ "name_html": "OLYP-D3(BJ)",
+ "path_safe_name": "OLYP-D3BJ",
+ "disp_params": "GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.5299 PAR3=2.6205 PAR4=2.8065",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "OLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.5299 PAR3=2.6205 PAR4=2.8065",
+ "GGA": "OLYP"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "OLYP-D4",
+ "name_latex": "OLYP-D4",
+ "name_html": "OLYP-D4",
+ "path_safe_name": "OLYP-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "OLYP",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "GGA": "OLYP"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "OPBE",
+ "name_latex": "OPBE",
+ "name_html": "OPBE",
+ "path_safe_name": "OPBE",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "OPBE",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "OPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "OPBE-D3(BJ)",
+ "name_latex": "OPBE-D3(BJ)",
+ "name_html": "OPBE-D3(BJ)",
+ "path_safe_name": "OPBE-D3BJ",
+ "disp_params": "GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.5512 PAR3=3.3816 PAR4=2.9444",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "OPBE",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.5512 PAR3=3.3816 PAR4=2.9444",
+ "GGA": "OPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "OPBE-D4",
+ "name_latex": "OPBE-D4",
+ "name_html": "OPBE-D4",
+ "path_safe_name": "OPBE-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "OPBE",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "GGA": "OPBE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "BEE",
+ "name_latex": "BEE",
+ "name_html": "BEE",
+ "path_safe_name": "BEE",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BEE",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "BEE"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "XLYP",
+ "name_latex": "XLYP",
+ "name_html": "XLYP",
+ "path_safe_name": "XLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "XLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "XLYP"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "GGA:SSB-D",
+ "name_latex": "GGA:SSB-D",
+ "name_html": "GGA:SSB-D",
+ "path_safe_name": "GGA:SSB-D",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "GGA:SSB-D",
+ "dispersion": "D",
+ "dispersion_name": "DEFAULT",
+ "adf_settings": {
+ "XC": {
+ "GGA": "SSB-D"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "S12g",
+ "name_latex": "S12g",
+ "name_html": "S12g",
+ "path_safe_name": "S12g",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "S12g",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "S12g"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "S12g-D3",
+ "name_latex": "S12g-D3",
+ "name_html": "S12g-D3",
+ "path_safe_name": "S12g-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "S12g",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "GGA": "S12g"
+ }
+ }
+}
+
+{
+ "category": "Model",
+ "name": "LB94",
+ "name_latex": "LB94",
+ "name_html": "LB94",
+ "path_safe_name": "LB94",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "LB94",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Model": "LB94"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "KT1",
+ "name_latex": "KT1",
+ "name_html": "KT1",
+ "path_safe_name": "KT1",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "KT1",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "KT1"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "KT2",
+ "name_latex": "KT2",
+ "name_html": "KT2",
+ "path_safe_name": "KT2",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "KT2",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "KT2"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "B97-D",
+ "name_latex": "B97-D",
+ "name_html": "B97-D",
+ "path_safe_name": "B97-D",
+ "use_libxc": true,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B97-D",
+ "dispersion": "D",
+ "dispersion_name": "DEFAULT",
+ "adf_settings": {
+ "XC": {
+ "LibXC": "B97-D"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "B97-D-D3",
+ "name_latex": "B97-D-D3",
+ "name_html": "B97-D-D3",
+ "path_safe_name": "B97-D-D3",
+ "disp_params": "GRIMME3 PAR1=1.0000 PAR2=0.892 PAR3=0.909",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B97-D",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=0.892 PAR3=0.909",
+ "LibXC": "B97-D"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "B97-GGA1",
+ "name_latex": "B97-GGA1",
+ "name_html": "B97-GGA1",
+ "path_safe_name": "B97-GGA1",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B97-GGA1",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "B97-GGA1"
+ }
+ }
+}
+
+{
+ "category": "GGA",
+ "name": "B97-K",
+ "name_latex": "B97-K",
+ "name_html": "B97-K",
+ "path_safe_name": "B97-K",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B97-K",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "B97-K"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "M06L",
+ "name_latex": "M06L",
+ "name_html": "M06L",
+ "path_safe_name": "M06L",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "M06L",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaGGA": "M06L"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "M06L-D3",
+ "name_latex": "M06L-D3",
+ "name_html": "M06L-D3",
+ "path_safe_name": "M06L-D3",
+ "disp_params": "GRIMME3 PAR1=1.0000 PAR2=1.581 PAR3=0.000",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "M06L",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=1.581 PAR3=0.000",
+ "MetaGGA": "M06L"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "M06L-D4",
+ "name_latex": "M06L-D4",
+ "name_html": "M06L-D4",
+ "path_safe_name": "M06L-D4",
+ "disp_params": "GRIMME4 s6=1.0000 s8=0.59493760 a1=0.71422359 a2=6.35314182",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "M06L",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4 s6=1.0000 s8=0.59493760 a1=0.71422359 a2=6.35314182",
+ "MetaGGA": "M06L"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "MN15-L",
+ "name_latex": "MN15-L",
+ "name_html": "MN15-L",
+ "path_safe_name": "MN15-L",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "MN15-L",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "MN15-L"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "TPSS",
+ "name_latex": "TPSS",
+ "name_html": "TPSS",
+ "path_safe_name": "TPSS",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "TPSS",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaGGA": "TPSS"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "TPSS-D3(BJ)",
+ "name_latex": "TPSS-D3(BJ)",
+ "name_html": "TPSS-D3(BJ)",
+ "path_safe_name": "TPSS-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "TPSS",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "MetaGGA": "TPSS"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "TPSS-D4",
+ "name_latex": "TPSS-D4",
+ "name_html": "TPSS-D4",
+ "path_safe_name": "TPSS-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "TPSS",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "MetaGGA": "TPSS"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "revTPSS",
+ "name_latex": "revTPSS",
+ "name_html": "revTPSS",
+ "path_safe_name": "revTPSS",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "revTPSS",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaGGA": "revTPSS"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "MetaGGA:SSB-D",
+ "name_latex": "MetaGGA:SSB-D",
+ "name_html": "MetaGGA:SSB-D",
+ "path_safe_name": "MetaGGA:SSB-D",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "MetaGGA:SSB-D",
+ "dispersion": "D",
+ "dispersion_name": "DEFAULT",
+ "adf_settings": {
+ "XC": {
+ "MetaGGA": "SSB-D"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "MVS",
+ "name_latex": "MVS",
+ "name_html": "MVS",
+ "path_safe_name": "MVS",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "MVS",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaGGA": "MVS"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "MS0",
+ "name_latex": "MS0",
+ "name_html": "MS0",
+ "path_safe_name": "MS0",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "MS0",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaGGA": "MS0"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "MS1",
+ "name_latex": "MS1",
+ "name_html": "MS1",
+ "path_safe_name": "MS1",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "MS1",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaGGA": "MS1"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "MS2",
+ "name_latex": "MS2",
+ "name_html": "MS2",
+ "path_safe_name": "MS2",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "MS2",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaGGA": "MS2"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "SCAN",
+ "name_latex": "SCAN",
+ "name_html": "SCAN",
+ "path_safe_name": "SCAN",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "SCAN",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaGGA": "SCAN"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "SCAN-D3(BJ)",
+ "name_latex": "SCAN-D3(BJ)",
+ "name_html": "SCAN-D3(BJ)",
+ "path_safe_name": "SCAN-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "SCAN",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "MetaGGA": "SCAN"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "TASKxc",
+ "name_latex": "TASKxc",
+ "name_html": "TASKxc",
+ "path_safe_name": "TASKxc",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "TASKxc",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaGGA": "TASKxc"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "TASKCC",
+ "name_latex": "TASKCC",
+ "name_html": "TASKCC",
+ "path_safe_name": "TASKCC",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "TASKCC",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaGGA": "TASKCC"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "revSCAN",
+ "name_latex": "revSCAN",
+ "name_html": "revSCAN",
+ "path_safe_name": "revSCAN",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "revSCAN",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "revSCAN"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "rSCAN",
+ "name_latex": "rSCAN",
+ "name_html": "rSCAN",
+ "path_safe_name": "rSCAN",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rSCAN",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "rSCAN"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "r2SCAN",
+ "name_latex": "r$^2$SCAN",
+ "name_html": "r2SCAN",
+ "path_safe_name": "r2SCAN",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "r2SCAN",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "r2SCAN"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "r2SCAN-D4",
+ "name_latex": "r$^2$SCAN-D4",
+ "name_html": "r2SCAN-D4",
+ "path_safe_name": "r2SCAN-D4",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "r2SCAN",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "LibXC": "r2SCAN"
+ }
+ }
+}
+
+{
+ "category": "MetaGGA",
+ "name": "r2SCAN-3c",
+ "name_latex": "r$^2$SCAN-3c",
+ "name_html": "r2SCAN-3c",
+ "path_safe_name": "r2SCAN-3c",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "r2SCAN-3c",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaGGA": "r2SCAN-3c"
+ }
+ }
+}
+
+{
+ "category": "HartreeFock",
+ "name": "HartreeFock",
+ "name_latex": "HartreeFock",
+ "name_html": "HartreeFock",
+ "path_safe_name": "HartreeFock",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "HartreeFock",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "HartreeFock": ""
+ }
+ }
+}
+
+{
+ "category": "HartreeFock",
+ "name": "HartreeFock-D4",
+ "name_latex": "HartreeFock-D4",
+ "name_html": "HartreeFock-D4",
+ "path_safe_name": "HartreeFock-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "HartreeFock",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "HartreeFock": ""
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B3LYP",
+ "name_latex": "B3LYP",
+ "name_html": "B3LYP",
+ "path_safe_name": "B3LYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B3LYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "B3LYP"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B3LYP-D",
+ "name_latex": "B3LYP-D",
+ "name_html": "B3LYP-D",
+ "path_safe_name": "B3LYP-D",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B3LYP",
+ "dispersion": "D",
+ "dispersion_name": "DEFAULT",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "DEFAULT",
+ "Hybrid": "B3LYP"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B3LYP-D3",
+ "name_latex": "B3LYP-D3",
+ "name_html": "B3LYP-D3",
+ "path_safe_name": "B3LYP-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B3LYP",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "Hybrid": "B3LYP"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B3LYP-D3(BJ)",
+ "name_latex": "B3LYP-D3(BJ)",
+ "name_html": "B3LYP-D3(BJ)",
+ "path_safe_name": "B3LYP-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B3LYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "Hybrid": "B3LYP"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B3LYP-D4",
+ "name_latex": "B3LYP-D4",
+ "name_html": "B3LYP-D4",
+ "path_safe_name": "B3LYP-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B3LYP",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "Hybrid": "B3LYP"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B3LYP*",
+ "name_latex": "B3LYP$^*$",
+ "name_html": "B3LYP*",
+ "path_safe_name": "B3LYPs",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B3LYP*",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "B3LYP*"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B1LYP",
+ "name_latex": "B1LYP",
+ "name_html": "B1LYP",
+ "path_safe_name": "B1LYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B1LYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "B1LYP"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "KMLYP",
+ "name_latex": "KMLYP",
+ "name_html": "KMLYP",
+ "path_safe_name": "KMLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "KMLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "KMLYP"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "O3LYP",
+ "name_latex": "O3LYP",
+ "name_html": "O3LYP",
+ "path_safe_name": "O3LYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "O3LYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "O3LYP"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "X3LYP",
+ "name_latex": "X3LYP",
+ "name_html": "X3LYP",
+ "path_safe_name": "X3LYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "X3LYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "X3LYP"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "BHandH",
+ "name_latex": "BH&H",
+ "name_html": "BH&H",
+ "path_safe_name": "BHandH",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BHandH",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "BHandH"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "BHandHLYP",
+ "name_latex": "BH&HLYP",
+ "name_html": "BH&HLYP",
+ "path_safe_name": "BHandHLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BHandHLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "BHandHLYP"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B1PW91",
+ "name_latex": "B1PW91",
+ "name_html": "B1PW91",
+ "path_safe_name": "B1PW91",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B1PW91",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "B1PW91"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "mPW1PW",
+ "name_latex": "mPW1PW",
+ "name_html": "mPW1PW",
+ "path_safe_name": "mPW1PW",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "mPW1PW",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "mPW1PW"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "mPW1K",
+ "name_latex": "mPW1K",
+ "name_html": "mPW1K",
+ "path_safe_name": "mPW1K",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "mPW1K",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "mPW1K"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "PBE0",
+ "name_latex": "PBE0",
+ "name_html": "PBE0",
+ "path_safe_name": "PBE0",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE0",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "PBE0"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "PBE0-D3",
+ "name_latex": "PBE0-D3",
+ "name_html": "PBE0-D3",
+ "path_safe_name": "PBE0-D3",
+ "disp_params": "GRIMME3 PAR1=1.0000 PAR2=1.287 PAR3=0.928",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE0",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=1.287 PAR3=0.928",
+ "Hybrid": "PBE0"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "PBE0-D3(BJ)",
+ "name_latex": "PBE0-D3(BJ)",
+ "name_html": "PBE0-D3(BJ)",
+ "path_safe_name": "PBE0-D3BJ",
+ "disp_params": "GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.4145 PAR3=1.2177 PAR4=4.8593",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE0",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.4145 PAR3=1.2177 PAR4=4.8593",
+ "Hybrid": "PBE0"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "PBE0-D4",
+ "name_latex": "PBE0-D4",
+ "name_html": "PBE0-D4",
+ "path_safe_name": "PBE0-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE0",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "Hybrid": "PBE0"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "OPBE0",
+ "name_latex": "OPBE0",
+ "name_html": "OPBE0",
+ "path_safe_name": "OPBE0",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "OPBE0",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "OPBE0"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "S12H",
+ "name_latex": "S12H",
+ "name_html": "S12H",
+ "path_safe_name": "S12H",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "S12H",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "S12H"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "BMK",
+ "name_latex": "BMK",
+ "name_html": "BMK",
+ "path_safe_name": "BMK",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "BMK",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "HYB_MGGA_X_BMK GGA_C_BMK"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B1B95",
+ "name_latex": "B1B95",
+ "name_html": "B1B95",
+ "path_safe_name": "B1B95",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B1B95",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "B1B95"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B1B95-D3",
+ "name_latex": "B1B95-D3",
+ "name_html": "B1B95-D3",
+ "path_safe_name": "B1B95-D3",
+ "disp_params": "GRIMME3 PAR1=1.0000 PAR2=1.613 PAR3=1.868",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B1B95",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=1.613 PAR3=1.868",
+ "LibXC": "B1B95"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B97",
+ "name_latex": "B97",
+ "name_html": "B97",
+ "path_safe_name": "B97",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B97",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "B97"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B97-1",
+ "name_latex": "B97-1",
+ "name_html": "B97-1",
+ "path_safe_name": "B97-1",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B97-1",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "B97-1"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B97-2",
+ "name_latex": "B97-2",
+ "name_html": "B97-2",
+ "path_safe_name": "B97-2",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B97-2",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "B97-2"
+ }
+ }
+}
+
+{
+ "category": "Hybrid",
+ "name": "B97-3",
+ "name_latex": "B97-3",
+ "name_html": "B97-3",
+ "path_safe_name": "B97-3",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B97-3",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "B97-3"
+ }
+ }
+}
+
+{
+ "category": "MetaHybrid",
+ "name": "MN15",
+ "name_latex": "MN15",
+ "name_html": "MN15",
+ "path_safe_name": "MN15",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "MN15",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "MN15"
+ }
+ }
+}
+
+{
+ "category": "MetaHybrid",
+ "name": "M06",
+ "name_latex": "M06",
+ "name_html": "M06",
+ "path_safe_name": "M06",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "M06",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaHybrid": "M06"
+ }
+ }
+}
+
+{
+ "category": "MetaHybrid",
+ "name": "M06-D3",
+ "name_latex": "M06-D3",
+ "name_html": "M06-D3",
+ "path_safe_name": "M06-D3",
+ "disp_params": "GRIMME3 PAR1=1.0000 PAR2=1.325 PAR3=0.000",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "M06",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=1.325 PAR3=0.000",
+ "MetaHybrid": "M06"
+ }
+ }
+}
+
+{
+ "category": "MetaHybrid",
+ "name": "M06-D4",
+ "name_latex": "M06-D4",
+ "name_html": "M06-D4",
+ "path_safe_name": "M06-D4",
+ "disp_params": "GRIMME4 s6=1.0000 s8=0.16366729 a1=0.53456413 a2=6.06192174",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "M06",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4 s6=1.0000 s8=0.16366729 a1=0.53456413 a2=6.06192174",
+ "MetaHybrid": "M06"
+ }
+ }
+}
+
+{
+ "category": "MetaHybrid",
+ "name": "M06-2X",
+ "name_latex": "M06-2X",
+ "name_html": "M06-2X",
+ "path_safe_name": "M06-2X",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "M06-2X",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaHybrid": "M06-2X"
+ }
+ }
+}
+
+{
+ "category": "MetaHybrid",
+ "name": "M06-2X-D3",
+ "name_latex": "M06-2X-D3",
+ "name_html": "M06-2X-D3",
+ "path_safe_name": "M06-2X-D3",
+ "disp_params": "GRIMME3 PAR1=1.0000 PAR2=1.619 PAR3=0.000",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "M06-2X",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=1.619 PAR3=0.000",
+ "MetaHybrid": "M06-2X"
+ }
+ }
+}
+
+{
+ "category": "MetaHybrid",
+ "name": "M06-HF",
+ "name_latex": "M06-HF",
+ "name_html": "M06-HF",
+ "path_safe_name": "M06-HF",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "M06-HF",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaHybrid": "M06-HF"
+ }
+ }
+}
+
+{
+ "category": "MetaHybrid",
+ "name": "M06-HF-D3",
+ "name_latex": "M06-HF-D3",
+ "name_html": "M06-HF-D3",
+ "path_safe_name": "M06-HF-D3",
+ "disp_params": "GRIMME3 PAR1=1.0000 PAR2=1.446 PAR3=0.000",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "M06-HF",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 PAR1=1.0000 PAR2=1.446 PAR3=0.000",
+ "MetaHybrid": "M06-HF"
+ }
+ }
+}
+
+{
+ "category": "MetaHybrid",
+ "name": "TPSSH",
+ "name_latex": "TPSSH",
+ "name_html": "TPSSH",
+ "path_safe_name": "TPSSH",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "TPSSH",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MetaHybrid": "TPSSH"
+ }
+ }
+}
+
+{
+ "category": "MetaHybrid",
+ "name": "TPSSH-D4",
+ "name_latex": "TPSSH-D4",
+ "name_html": "TPSSH-D4",
+ "path_safe_name": "TPSSH-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "TPSSH",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "MetaHybrid": "TPSSH"
+ }
+ }
+}
+
+{
+ "category": "MetaHybrid",
+ "name": "revSCAN0",
+ "name_latex": "revSCAN0",
+ "name_html": "revSCAN0",
+ "path_safe_name": "revSCAN0",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "revSCAN0",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "revSCAN0"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DOD-BLYP",
+ "name_latex": "rev-DOD-BLYP",
+ "name_html": "rev-DOD-BLYP",
+ "path_safe_name": "rev-DOD-BLYP",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DOD-BLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DOD-BLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DOD-BLYP-D3(BJ)",
+ "name_latex": "rev-DOD-BLYP-D3(BJ)",
+ "name_html": "rev-DOD-BLYP-D3(BJ)",
+ "path_safe_name": "rev-DOD-BLYP-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DOD-BLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "rev-DOD-BLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DOD-BLYP-D4",
+ "name_latex": "rev-DOD-BLYP-D4",
+ "name_html": "rev-DOD-BLYP-D4",
+ "path_safe_name": "rev-DOD-BLYP-D4",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DOD-BLYP-D4",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DOD-BLYP-D4"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DOD-PBE",
+ "name_latex": "rev-DOD-PBE",
+ "name_html": "rev-DOD-PBE",
+ "path_safe_name": "rev-DOD-PBE",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DOD-PBE",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DOD-PBE"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DOD-PBE-D3(BJ)",
+ "name_latex": "rev-DOD-PBE-D3(BJ)",
+ "name_html": "rev-DOD-PBE-D3(BJ)",
+ "path_safe_name": "rev-DOD-PBE-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DOD-PBE",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "rev-DOD-PBE"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DOD-PBE-D4",
+ "name_latex": "rev-DOD-PBE-D4",
+ "name_html": "rev-DOD-PBE-D4",
+ "path_safe_name": "rev-DOD-PBE-D4",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DOD-PBE-D4",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DOD-PBE-D4"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DOD-PBEP86",
+ "name_latex": "rev-DOD-PBEP86",
+ "name_html": "rev-DOD-PBEP86",
+ "path_safe_name": "rev-DOD-PBEP86",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DOD-PBEP86",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DOD-PBEP86"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DOD-PBEP86-D3(BJ)",
+ "name_latex": "rev-DOD-PBEP86-D3(BJ)",
+ "name_html": "rev-DOD-PBEP86-D3(BJ)",
+ "path_safe_name": "rev-DOD-PBEP86-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DOD-PBEP86",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "rev-DOD-PBEP86"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DOD-PBEP86-D4",
+ "name_latex": "rev-DOD-PBEP86-D4",
+ "name_html": "rev-DOD-PBEP86-D4",
+ "path_safe_name": "rev-DOD-PBEP86-D4",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DOD-PBEP86-D4",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DOD-PBEP86-D4"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "SOS1-PBE-QIDH",
+ "name_latex": "SOS1-PBE-QIDH",
+ "name_html": "SOS1-PBE-QIDH",
+ "path_safe_name": "SOS1-PBE-QIDH",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "SOS1-PBE-QIDH",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "SOS1-PBE-QIDH"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "DOD-SCAN",
+ "name_latex": "DOD-SCAN",
+ "name_html": "DOD-SCAN",
+ "path_safe_name": "DOD-SCAN",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "DOD-SCAN",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "DOD-SCAN"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "DOD-SCAN-D3(BJ)",
+ "name_latex": "DOD-SCAN-D3(BJ)",
+ "name_html": "DOD-SCAN-D3(BJ)",
+ "path_safe_name": "DOD-SCAN-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "DOD-SCAN",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "DOD-SCAN"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DOD-SCAN-D4",
+ "name_latex": "rev-DOD-SCAN-D4",
+ "name_html": "rev-DOD-SCAN-D4",
+ "path_safe_name": "rev-DOD-SCAN-D4",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DOD-SCAN-D4",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DOD-SCAN-D4"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2PLYP",
+ "name_latex": "B2PLYP",
+ "name_html": "B2PLYP",
+ "path_safe_name": "B2PLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2PLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "B2PLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2PIPLYP",
+ "name_latex": "B2$\\pi$PLYP",
+ "name_html": "B2πPLYP",
+ "path_safe_name": "B2PIPLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2PIPLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "B2PIPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "ROB2PLYP",
+ "name_latex": "ROB2PLYP",
+ "name_html": "ROB2PLYP",
+ "path_safe_name": "ROB2PLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "ROB2PLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "ROB2PLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2TPLYP",
+ "name_latex": "B2TPLYP",
+ "name_html": "B2TPLYP",
+ "path_safe_name": "B2TPLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2TPLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "B2TPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2GPPLYP",
+ "name_latex": "B2GPPLYP",
+ "name_html": "B2GPPLYP",
+ "path_safe_name": "B2GPPLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2GPPLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "B2GPPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2KPLYP",
+ "name_latex": "B2KPLYP",
+ "name_html": "B2KPLYP",
+ "path_safe_name": "B2KPLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2KPLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "B2KPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2NCPLYP",
+ "name_latex": "B2NCPLYP",
+ "name_html": "B2NCPLYP",
+ "path_safe_name": "B2NCPLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2NCPLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "B2NCPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "mPW2PLYP",
+ "name_latex": "mPW2PLYP",
+ "name_html": "mPW2PLYP",
+ "path_safe_name": "mPW2PLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "mPW2PLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "mPW2PLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "mPW2KPLYP",
+ "name_latex": "mPW2KPLYP",
+ "name_html": "mPW2KPLYP",
+ "path_safe_name": "mPW2KPLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "mPW2KPLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "mPW2KPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "mPW2NCPLYP",
+ "name_latex": "mPW2NCPLYP",
+ "name_html": "mPW2NCPLYP",
+ "path_safe_name": "mPW2NCPLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "mPW2NCPLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "mPW2NCPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "DH-BLYP",
+ "name_latex": "DH-BLYP",
+ "name_html": "DH-BLYP",
+ "path_safe_name": "DH-BLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "DH-BLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "DH-BLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "PBE0-DH",
+ "name_latex": "PBE0-DH",
+ "name_html": "PBE0-DH",
+ "path_safe_name": "PBE0-DH",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE0-DH",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "PBE0-DH"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "PBE-QIDH",
+ "name_latex": "PBE-QIDH",
+ "name_html": "PBE-QIDH",
+ "path_safe_name": "PBE-QIDH",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE-QIDH",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "PBE-QIDH"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "LS1-DH",
+ "name_latex": "LS1-DH",
+ "name_html": "LS1-DH",
+ "path_safe_name": "LS1-DH",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "LS1-DH",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "LS1-DH"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "PBE0-2",
+ "name_latex": "PBE0-2",
+ "name_html": "PBE0-2",
+ "path_safe_name": "PBE0-2",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE0-2",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "PBE0-2"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "LS1-TPSS",
+ "name_latex": "LS1-TPSS",
+ "name_html": "LS1-TPSS",
+ "path_safe_name": "LS1-TPSS",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "LS1-TPSS",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "LS1-TPSS"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "DS1-TPSS",
+ "name_latex": "DS1-TPSS",
+ "name_html": "DS1-TPSS",
+ "path_safe_name": "DS1-TPSS",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "DS1-TPSS",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "DS1-TPSS"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2PLYP-D3",
+ "name_latex": "B2PLYP-D3",
+ "name_html": "B2PLYP-D3",
+ "path_safe_name": "B2PLYP-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2PLYP",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "DoubleHybrid": "B2PLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2GPPLYP-D3",
+ "name_latex": "B2GPPLYP-D3",
+ "name_html": "B2GPPLYP-D3",
+ "path_safe_name": "B2GPPLYP-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2GPPLYP",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "DoubleHybrid": "B2GPPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2NCPLYP-D3",
+ "name_latex": "B2NCPLYP-D3",
+ "name_html": "B2NCPLYP-D3",
+ "path_safe_name": "B2NCPLYP-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2NCPLYP",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "DoubleHybrid": "B2NCPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "mPW2NCPLYP-D3",
+ "name_latex": "mPW2NCPLYP-D3",
+ "name_html": "mPW2NCPLYP-D3",
+ "path_safe_name": "mPW2NCPLYP-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "mPW2NCPLYP",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "DoubleHybrid": "mPW2NCPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "PBE0-DH-D3",
+ "name_latex": "PBE0-DH-D3",
+ "name_html": "PBE0-DH-D3",
+ "path_safe_name": "PBE0-DH-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE0-DH",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "DoubleHybrid": "PBE0-DH"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "PBE-QIDH-D3",
+ "name_latex": "PBE-QIDH-D3",
+ "name_html": "PBE-QIDH-D3",
+ "path_safe_name": "PBE-QIDH-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE-QIDH",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "DoubleHybrid": "PBE-QIDH"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "LS1-DH-D3",
+ "name_latex": "LS1-DH-D3",
+ "name_html": "LS1-DH-D3",
+ "path_safe_name": "LS1-DH-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "LS1-DH",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "DoubleHybrid": "LS1-DH"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "PBE0-2-D3",
+ "name_latex": "PBE0-2-D3",
+ "name_html": "PBE0-2-D3",
+ "path_safe_name": "PBE0-2-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE0-2",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "DoubleHybrid": "PBE0-2"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "LS1-TPSS-D3",
+ "name_latex": "LS1-TPSS-D3",
+ "name_html": "LS1-TPSS-D3",
+ "path_safe_name": "LS1-TPSS-D3",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "LS1-TPSS",
+ "dispersion": "D3",
+ "dispersion_name": "GRIMME3",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3",
+ "DoubleHybrid": "LS1-TPSS"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2PLYP-D3(BJ)",
+ "name_latex": "B2PLYP-D3(BJ)",
+ "name_html": "B2PLYP-D3(BJ)",
+ "path_safe_name": "B2PLYP-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2PLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "B2PLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2PIPLYP-D3(BJ)",
+ "name_latex": "B2$\\pi$PLYP-D3(BJ)",
+ "name_html": "B2πPLYP-D3(BJ)",
+ "path_safe_name": "B2PIPLYP-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2PIPLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "B2PIPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "ROB2PLYP-D3(BJ)",
+ "name_latex": "ROB2PLYP-D3(BJ)",
+ "name_html": "ROB2PLYP-D3(BJ)",
+ "path_safe_name": "ROB2PLYP-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "ROB2PLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "ROB2PLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2TPLYP-D3(BJ)",
+ "name_latex": "B2TPLYP-D3(BJ)",
+ "name_html": "B2TPLYP-D3(BJ)",
+ "path_safe_name": "B2TPLYP-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2TPLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "B2TPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2GPPLYP-D3(BJ)",
+ "name_latex": "B2GPPLYP-D3(BJ)",
+ "name_html": "B2GPPLYP-D3(BJ)",
+ "path_safe_name": "B2GPPLYP-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2GPPLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "B2GPPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2KPLYP-D3(BJ)",
+ "name_latex": "B2KPLYP-D3(BJ)",
+ "name_html": "B2KPLYP-D3(BJ)",
+ "path_safe_name": "B2KPLYP-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2KPLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "B2KPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2NCPLYP-D3(BJ)",
+ "name_latex": "B2NCPLYP-D3(BJ)",
+ "name_html": "B2NCPLYP-D3(BJ)",
+ "path_safe_name": "B2NCPLYP-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2NCPLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "B2NCPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "mPW2NCPLYP-D3(BJ)",
+ "name_latex": "mPW2NCPLYP-D3(BJ)",
+ "name_html": "mPW2NCPLYP-D3(BJ)",
+ "path_safe_name": "mPW2NCPLYP-D3BJ",
+ "disp_params": "GRIMME3 BJDAMP PAR1=0.385 PAR2=-0.493 PAR3=0.0 PAR4=9.529",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "mPW2NCPLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP PAR1=0.385 PAR2=-0.493 PAR3=0.0 PAR4=9.529",
+ "DoubleHybrid": "mPW2NCPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "mPW2KPLYP-D3(BJ)",
+ "name_latex": "mPW2KPLYP-D3(BJ)",
+ "name_html": "mPW2KPLYP-D3(BJ)",
+ "path_safe_name": "mPW2KPLYP-D3BJ",
+ "disp_params": "GRIMME3 BJDAMP PAR1=0.490 PAR2=0.306 PAR3=0.915 PAR4=5.057",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "mPW2KPLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP PAR1=0.490 PAR2=0.306 PAR3=0.915 PAR4=5.057",
+ "DoubleHybrid": "mPW2KPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "DH-BLYP-D3(BJ)",
+ "name_latex": "DH-BLYP-D3(BJ)",
+ "name_html": "DH-BLYP-D3(BJ)",
+ "path_safe_name": "DH-BLYP-D3BJ",
+ "disp_params": "GRIMME3 BJDAMP PAR1=0.488 PAR2=0.306 PAR3=0.915 PAR4=5.057",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "DH-BLYP",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP PAR1=0.488 PAR2=0.306 PAR3=0.915 PAR4=5.057",
+ "DoubleHybrid": "DH-BLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "PBE0-DH-D3(BJ)",
+ "name_latex": "PBE0-DH-D3(BJ)",
+ "name_html": "PBE0-DH-D3(BJ)",
+ "path_safe_name": "PBE0-DH-D3BJ",
+ "disp_params": "GRIMME3 BJDAMP PAR1=0.880 PAR2=0.000 PAR3=0.165 PAR4=6.385",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE0-DH",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP PAR1=0.880 PAR2=0.000 PAR3=0.165 PAR4=6.385",
+ "DoubleHybrid": "PBE0-DH"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "PBE-QIDH-D3(BJ)",
+ "name_latex": "PBE-QIDH-D3(BJ)",
+ "name_html": "PBE-QIDH-D3(BJ)",
+ "path_safe_name": "PBE-QIDH-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE-QIDH",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "PBE-QIDH"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "LS1-DH-D3(BJ)",
+ "name_latex": "LS1-DH-D3(BJ)",
+ "name_html": "LS1-DH-D3(BJ)",
+ "path_safe_name": "LS1-DH-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "LS1-DH",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "LS1-DH"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "PBE0-2-D3(BJ)",
+ "name_latex": "PBE0-2-D3(BJ)",
+ "name_html": "PBE0-2-D3(BJ)",
+ "path_safe_name": "PBE0-2-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE0-2",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "PBE0-2"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "LS1-TPSS-D3(BJ)",
+ "name_latex": "LS1-TPSS-D3(BJ)",
+ "name_html": "LS1-TPSS-D3(BJ)",
+ "path_safe_name": "LS1-TPSS-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "LS1-TPSS",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "LS1-TPSS"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "DS1-TPSS-D3(BJ)",
+ "name_latex": "DS1-TPSS-D3(BJ)",
+ "name_html": "DS1-TPSS-D3(BJ)",
+ "path_safe_name": "DS1-TPSS-D3BJ",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "DS1-TPSS",
+ "dispersion": "D3(BJ)",
+ "dispersion_name": "GRIMME3 BJDAMP",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME3 BJDAMP",
+ "DoubleHybrid": "DS1-TPSS"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2PLYP-D4",
+ "name_latex": "B2PLYP-D4",
+ "name_html": "B2PLYP-D4",
+ "path_safe_name": "B2PLYP-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2PLYP",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "DoubleHybrid": "B2PLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "B2GPPLYP-D4",
+ "name_latex": "B2GPPLYP-D4",
+ "name_html": "B2GPPLYP-D4",
+ "path_safe_name": "B2GPPLYP-D4",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "B2GPPLYP",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "DoubleHybrid": "B2GPPLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "mPW2PLYP-D4",
+ "name_latex": "mPW2PLYP-D4",
+ "name_html": "mPW2PLYP-D4",
+ "path_safe_name": "mPW2PLYP-D4",
+ "disp_params": "GRIMME4 s6=0.750 s8=0.4579 a1=0.43 a2=5.0765",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "mPW2PLYP",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4 s6=0.750 s8=0.4579 a1=0.43 a2=5.0765",
+ "DoubleHybrid": "mPW2PLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "PBE0-DH-D4",
+ "name_latex": "PBE0-DH-D4",
+ "name_html": "PBE0-DH-D4",
+ "path_safe_name": "PBE0-DH-D4",
+ "disp_params": "GRIMME4 s6=0.875 s8=0.9681 a1=0.4759 a2=5.0862",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE0-DH",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4 s6=0.875 s8=0.9681 a1=0.4759 a2=5.0862",
+ "DoubleHybrid": "PBE0-DH"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "PBE0-2-D4",
+ "name_latex": "PBE0-2-D4",
+ "name_html": "PBE0-2-D4",
+ "path_safe_name": "PBE0-2-D4",
+ "disp_params": "GRIMME4 s6=0.500 s8=0.6430 a1=0.7654 a2=5.7858",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "PBE0-2",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4 s6=0.500 s8=0.6430 a1=0.7654 a2=5.7858",
+ "DoubleHybrid": "PBE0-2"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "DSD-BLYP",
+ "name_latex": "DSD-BLYP",
+ "name_html": "DSD-BLYP",
+ "path_safe_name": "DSD-BLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "DSD-BLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "DSD-BLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DSD-BLYP",
+ "name_latex": "rev-DSD-BLYP",
+ "name_html": "rev-DSD-BLYP",
+ "path_safe_name": "rev-DSD-BLYP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DSD-BLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DSD-BLYP"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DSD-BLYP-D4",
+ "name_latex": "rev-DSD-BLYP-D4",
+ "name_html": "rev-DSD-BLYP-D4",
+ "path_safe_name": "rev-DSD-BLYP-D4",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DSD-BLYP-D4",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DSD-BLYP-D4"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "DSD-PBEP86",
+ "name_latex": "DSD-PBEP86",
+ "name_html": "DSD-PBEP86",
+ "path_safe_name": "DSD-PBEP86",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "DSD-PBEP86",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "DSD-PBEP86"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DSD-PBEP86",
+ "name_latex": "rev-DSD-PBEP86",
+ "name_html": "rev-DSD-PBEP86",
+ "path_safe_name": "rev-DSD-PBEP86",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DSD-PBEP86",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DSD-PBEP86"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DSD-PBEP86-D4",
+ "name_latex": "rev-DSD-PBEP86-D4",
+ "name_html": "rev-DSD-PBEP86-D4",
+ "path_safe_name": "rev-DSD-PBEP86-D4",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DSD-PBEP86-D4",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DSD-PBEP86-D4"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "DSD-PBE",
+ "name_latex": "DSD-PBE",
+ "name_html": "DSD-PBE",
+ "path_safe_name": "DSD-PBE",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "DSD-PBE",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "DSD-PBE"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DSD-PBE",
+ "name_latex": "rev-DSD-PBE",
+ "name_html": "rev-DSD-PBE",
+ "path_safe_name": "rev-DSD-PBE",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DSD-PBE",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DSD-PBE"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DSD-PBE-D4",
+ "name_latex": "rev-DSD-PBE-D4",
+ "name_html": "rev-DSD-PBE-D4",
+ "path_safe_name": "rev-DSD-PBE-D4",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DSD-PBE-D4",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DSD-PBE-D4"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "rev-DSD-SCAN-D4",
+ "name_latex": "rev-DSD-SCAN-D4",
+ "name_html": "rev-DSD-SCAN-D4",
+ "path_safe_name": "rev-DSD-SCAN-D4",
+ "use_libxc": false,
+ "includes_disp": true,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "rev-DSD-SCAN-D4",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "rev-DSD-SCAN-D4"
+ }
+ }
+}
+
+{
+ "category": "DoubleHybrid",
+ "name": "SD-SCAN69",
+ "name_latex": "SD-SCAN69",
+ "name_html": "SD-SCAN69",
+ "path_safe_name": "SD-SCAN69",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "SD-SCAN69",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "DoubleHybrid": "SD-SCAN69"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "LCY-BLYP",
+ "name_latex": "LCY-BLYP",
+ "name_html": "LCY-BLYP",
+ "path_safe_name": "LCY-BLYP",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "LCY-BLYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "BLYP",
+ "RANGESEP": "",
+ "xcfun": ""
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "LCY-BP86",
+ "name_latex": "LCY-BP86",
+ "name_html": "LCY-BP86",
+ "path_safe_name": "LCY-BP86",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "LCY-BP86",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "BP86",
+ "RANGESEP": "",
+ "xcfun": ""
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "LCY-PBE",
+ "name_latex": "LCY-PBE",
+ "name_html": "LCY-PBE",
+ "path_safe_name": "LCY-PBE",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "LCY-PBE",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "GGA": "PBE",
+ "RANGESEP": "",
+ "xcfun": ""
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "CAM-B3LYP",
+ "name_latex": "CAM-B3LYP",
+ "name_html": "CAM-B3LYP",
+ "path_safe_name": "CAM-B3LYP",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "CAM-B3LYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "CAM-B3LYP"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "CAM-B3LYP-D4",
+ "name_latex": "CAM-B3LYP-D4",
+ "name_html": "CAM-B3LYP-D4",
+ "path_safe_name": "CAM-B3LYP-D4",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "CAM-B3LYP",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "disp_params": {},
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4",
+ "LibXC": "CAM-B3LYP"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "CAMY-B3LYP",
+ "name_latex": "CAMY-B3LYP",
+ "name_html": "CAMY-B3LYP",
+ "path_safe_name": "CAMY-B3LYP",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "CAMY-B3LYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Hybrid": "CAMY-B3LYP",
+ "RANGESEP": "",
+ "xcfun": ""
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "HJS-PBE",
+ "name_latex": "HJS-PBE",
+ "name_html": "HJS-PBE",
+ "path_safe_name": "HJS-PBE",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "HJS-PBE",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "HJS-PBE"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "HJS-PBESOL",
+ "name_latex": "HJS-PBESOL",
+ "name_html": "HJS-PBESOL",
+ "path_safe_name": "HJS-PBESOL",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "HJS-PBESOL",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "HJS-PBESOL"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "HJS-B97X",
+ "name_latex": "HJS-B97X",
+ "name_html": "HJS-B97X",
+ "path_safe_name": "HJS-B97X",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "HJS-B97X",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "HJS-B97X"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "HSE03",
+ "name_latex": "HSE03",
+ "name_html": "HSE03",
+ "path_safe_name": "HSE03",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "HSE03",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "HSE03"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "HSE06",
+ "name_latex": "HSE06",
+ "name_html": "HSE06",
+ "path_safe_name": "HSE06",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "HSE06",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "HSE06"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "LRC_WPBE",
+ "name_latex": "LRC_WPBE",
+ "name_html": "LRC_WPBE",
+ "path_safe_name": "LRC_WPBE",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "LRC_WPBE",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "LRC_WPBE"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "LRC_WPBEH",
+ "name_latex": "LRC_WPBEH",
+ "name_html": "LRC_WPBEH",
+ "path_safe_name": "LRC_WPBEH",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "LRC_WPBEH",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "LRC_WPBEH"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "M06-SX",
+ "name_latex": "M06-SX",
+ "name_html": "M06-SX",
+ "path_safe_name": "M06-SX",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "M06-SX",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "M06-SX"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "M11",
+ "name_latex": "M11",
+ "name_html": "M11",
+ "path_safe_name": "M11",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "M11",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "M11"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "MN12-SX",
+ "name_latex": "MN12-SX",
+ "name_html": "MN12-SX",
+ "path_safe_name": "MN12-SX",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "MN12-SX",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "MN12-SX"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "N12-SX",
+ "name_latex": "N12-SX",
+ "name_html": "N12-SX",
+ "path_safe_name": "N12-SX",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "N12-SX",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "N12-SX"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "TUNED-CAM-B3LYP",
+ "name_latex": "TUNED-CAM-B3LYP",
+ "name_html": "TUNED-CAM-B3LYP",
+ "path_safe_name": "TUNED-CAM-B3LYP",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "TUNED-CAM-B3LYP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "TUNED-CAM-B3LYP"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "WB97",
+ "name_latex": "$\\omega$B97",
+ "name_html": "ωB97",
+ "path_safe_name": "WB97",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "WB97",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "WB97"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "WB97X",
+ "name_latex": "$\\omega$B97X",
+ "name_html": "ωB97X",
+ "path_safe_name": "WB97X",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "WB97X",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "LibXC": "WB97X"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "WB97-D4",
+ "name_latex": "$\\omega$B97-D4",
+ "name_html": "ωB97-D4",
+ "path_safe_name": "WB97-D4",
+ "disp_params": "GRIMME4 s6=1.0000 s8=6.55792598 a1=0.76666802 a2=8.36027334",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "WB97",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4 s6=1.0000 s8=6.55792598 a1=0.76666802 a2=8.36027334",
+ "LibXC": "WB97"
+ }
+ }
+}
+
+{
+ "category": "RangeSeparated",
+ "name": "WB97X-D4",
+ "name_latex": "$\\omega$B97X-D4",
+ "name_html": "ωB97X-D4",
+ "path_safe_name": "WB97X-D4",
+ "disp_params": "GRIMME4 s6=1.0000 s8=-0.07519516 a1=0.45094893 a2=6.78425255",
+ "use_libxc": true,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "WB97X",
+ "dispersion": "D4",
+ "dispersion_name": "GRIMME4",
+ "adf_settings": {
+ "XC": {
+ "Dispersion": "GRIMME4 s6=1.0000 s8=-0.07519516 a1=0.45094893 a2=6.78425255",
+ "LibXC": "WB97X"
+ }
+ }
+}
+
+{
+ "category": "MP2",
+ "name": "MP2",
+ "name_latex": "MP2",
+ "name_html": "MP2",
+ "path_safe_name": "MP2",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "MP2",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MP2": ""
+ }
+ }
+}
+
+{
+ "category": "MP2",
+ "name": "SOS-MP2",
+ "name_latex": "SOS-MP2",
+ "name_html": "SOS-MP2",
+ "path_safe_name": "SOS-MP2",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "SOS-MP2",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MP2": "",
+ "EmpiricalScaling": "SOS"
+ }
+ }
+}
+
+{
+ "category": "MP2",
+ "name": "SCS-MP2",
+ "name_latex": "SCS-MP2",
+ "name_html": "SCS-MP2",
+ "path_safe_name": "SCS-MP2",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "SCS-MP2",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "MP2": "",
+ "EmpiricalScaling": "SCS"
+ }
+ }
+}
+
+{
+ "category": "Model",
+ "name": "SAOP",
+ "name_latex": "SAOP",
+ "name_html": "SAOP",
+ "path_safe_name": "SAOP",
+ "use_libxc": false,
+ "includes_disp": false,
+ "available_in_adf": true,
+ "available_in_band": false,
+ "available_in_orca": false,
+ "name_no_disp": "SAOP",
+ "dispersion": null,
+ "dispersion_name": null,
+ "adf_settings": {
+ "XC": {
+ "Model": "SAOP"
+ }
+ }
+}
+
diff --git a/src/tcutility/data/available_functionals.txt b/src/tcutility/data/available_functionals.txt
index 7de0bbb8..d8b276d1 100755
--- a/src/tcutility/data/available_functionals.txt
+++ b/src/tcutility/data/available_functionals.txt
@@ -1,328 +1,328 @@
-LDA
-- VWN [Vosko1980]
-- VWN Stoll [Vosko1980][Stoll1978]
-- PW92 [Perdew1992]
-- Xonly
-- Xalpha
-
-GGA
-- BP86 [Becke1988][Perdew1986]
-- BP86-D [Becke1988][Perdew1986][Grimme2004]
-- BP86-D3 [Becke1988][Perdew1986][Grimme2010]
-- BP86-D3(BJ) [Becke1988][Perdew1986][Grimme2011]
-- BP86-D4 [Becke1988][Perdew1986][Grimme2019]
-- BP86-dDsC [Becke1988][Perdew1986][Steinman2011]
-- PW91 [Perdew1992b]
-- PW91-dUFF [Perdew1992b][Kim2012]
-- mPW [Perdew1992b][Adamo1998]
-- PBE [Perdew1996]
-- PBE-D [Perdew1996][Grimme2004]
-- PBE-D3 [Perdew1996][Grimme2010]
-- PBE-D3(BJ) [Perdew1996][Grimme2011]
-- PBE-D4 [Perdew1996][Grimme2019]
-- PBE-dDsC [Perdew1996][Steinman2011]
-- PBE-MBD@rsSC [Perdew1996][Ambrosetti2014]
-- PBE-dUFF [Perdew1996][Kim2012]
-- RPBE [Hammer1999][Perdew1996]
-- RPBE-D3 [Hammer1999][Perdew1996][Grimme2010]
-- RPBE-D3(BJ) [Hammer1999][Perdew1996][Grimme2011]
-- RPBE-D4 [Hammer1999][Perdew1996][Grimme2019]
-- revPBE [Zhang1998][Perdew1996]
-- revPBE-D3 [Zhang1998][Perdew1996][Grimme2010]
-- revPBE-D3(BJ) [Zhang1998][Perdew1996][Grimme2011]
-- revPBE-D4 [Zhang1998][Perdew1996][Grimme2019]
-- revPBE-dDsC [Zhang1998][Perdew1996][Steinman2011]
-- mPBE [Perdew1996][Adamo2002]
-- PBEsol [Perdew2008]
-- PBEsol-D [Perdew2008][Grimme2004]
-- PBEsol-D3 [Perdew2008][Grimme2010]
-- PBEsol-D3(BJ) [Perdew2008][Grimme2011]
-- PBEsol-D4, 'GRIMME4 s6=1.0000 s8=0.59493760 a1=0.71422359 a2=6.35314182' [Perdew2008][Grimme2019]
-- HTBS [Perdew1996][Haas2011]
-- BLYP [Becke1988][Lee1988]
-- BLYP-D [Becke1988][Lee1988][Grimme2004]
-- BLYP-D3 [Becke1988][Lee1988][Grimme2010]
-- BLYP-D3(BJ) [Becke1988][Lee1988][Grimme2011]
-- BLYP-D4 [Becke1988][Lee1988][Grimme2019]
-- BLYP-dDsC [Becke1988][Lee1988][Steinman2011]
-- OLYP [Handy2000][Lee1988]
-- OLYP-D3, 'GRIMME3 PAR1=1.0000 PAR2=0.806 PAR3=1.764' [Handy2000][Lee1988][Grimme2010]
-- OLYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.5299 PAR3=2.6205 PAR4=2.8065' [Handy2000][Lee1988][Grimme2011]
-- OLYP-D4 [Handy2000][Lee1988][Grimme2019]
-- OPBE [Handy2000][Perdew1996]
-# - OPBE-D3, 'GRIMME3 PAR1=1.0000 PAR2=0.837 PAR3=2.055' [Handy2000][Perdew1996][Grimme2010]
-- OPBE-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.5512 PAR3=3.3816 PAR4=2.9444' [Handy2000][Perdew1996][Grimme2011]
-- OPBE-D4 [Handy2000][Perdew1996][Grimme2019]
-- BEE [Mortensen2005][Perdew1996]
-- XLYP [Xu2004][Lee1988]
-- GGA:SSB-D !includesdisp [Swart2009][Swart2009b][Grimme2004]
-- S12g
-- S12g-D3
-- LB94
-- KT1
-- KT2
-- B97-D !includesdisp !libxc [Grimme2006][Grimme2004][Lehtola2017][Marques2012]
-- B97-D-D3, 'GRIMME3 PAR1=1.0000 PAR2=0.892 PAR3=0.909' !libxc [Grimme2006][Grimme2004][Grimme2010][Lehtola2017][Marques2012]
-- B97-GGA1 !libxc
-- B97-K !libxc
-
-MetaGGA
-- M06L [Zhao2006][Zhao2008]
-- M06L-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.581 PAR3=0.000' [Zhao2006][Zhao2008][Grimme2010]
-- M06L-D4, 'GRIMME4 s6=1.0000 s8=0.59493760 a1=0.71422359 a2=6.35314182' [Zhao2006][Zhao2008][Grimme2019]
-- MN15-L !libxc
-- TPSS [Tao2003][Staroverov2003]
-- TPSS-D3(BJ) [Tao2003][Staroverov2003][Grimme2010]
-- TPSS-D4 [Tao2003][Staroverov2003][Grimme2019]
-- revTPSS [Perdew2009]
-- MetaGGA:SSB-D !includesdisp [Grimme2004]
-- MVS [Sun2015]
-- MS0
-- MS1
-- MS2
-- SCAN [Sun2015b]
-- SCAN-D3(BJ) [Sun2015b][Grimme2011]
-- SCAN-D4, 'GRIMME4 s6=1.0000 s8=1.46126056 a1=0.62930855 a2=6.31284039' [Sun2015b][Grimme2019]
-- TASKxc
-- TASKCC
-- revSCAN !libxc [Lehtola2017][Marques2012][Mezei2018]
-- rSCAN !libxc [Lehtola2017][Marques2012][Bartok2019]
-- rSCAN-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.47023427 PAR3=1.08859014 PAR4=5.73408312' !libxc [Lehtola2017][Marques2012][Bartok2019][Grimme2011]
-- rSCAN-D4, 'GRIMME4 s6=1.0000 s8=0.87728975 a1=0.49116966 a2=5.75859346' !libxc [Lehtola2017][Marques2012][Bartok2019][Grimme2019][Ehlert2021]
-- r2SCAN !libxc [Lehtola2017][Marques2012][Furness2020][Furness2020b]
-- r2SCAN-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.49484001 PAR3=0.78981345 PAR4=5.73083694' !libxc [Lehtola2017][Marques2012][Furness2020][Furness2020b][Grimme2011]
-- r2SCAN-D4 !libxc [Lehtola2017][Marques2012][Furness2020][Furness2020b][Grimme2019]
-- r2SCAN-3c [Gasevic2022][Grimme2019]
-
-HartreeFock
-- HartreeFock
-- HartreeFock-D4
-
-Hybrid
-- B3LYP [Stephens1994]
-- B3LYP-D [Stephens1994][Grimme2004]
-- B3LYP-D3 [Stephens1994][Grimme2010]
-- B3LYP-D3(BJ) [Stephens1994][Grimme2011]
-- B3LYP-D4 [Stephens1994][Grimme2019]
-- B3LYP* [Reiher2001]
-- B1LYP [Adamo1997]
-- B1LYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.1986 PAR3=2.1167 PAR4=5.3875' [Adamo1997][Goerigk2017][Grimme2011]
-- B1LYP-D4, 'GRIMME4 s6=1.0000 s8=1.98553711 a1=0.39309040 a2=4.55465145' [Adamo1997][Grimme2019]
-- KMLYP [Kang2001]
-- O3LYP [Cohen2000]
-- O3LYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.0963 PAR3=1.8171 PAR4=5.9940' [Cohen2000][Goerigk2017][Grimme2011]
-- O3LYP-D4, 'GRIMME4 s6=1.0000 s8=1.75762508 a1=0.10348980 a2=6.16233282' [Cohen2000][Grimme2019]
-- X3LYP [Xu2004]
-- X3LYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.2022 PAR3=1.5744 PAR4=5.4184' [Xu2004][Goerigk2017][Grimme2011]
-- X3LYP-D4, 'GRIMME4 s6=1.0000 s8=1.54701429 a1=0.20318443 a2=5.61852648' [Xu2004][Grimme2019]
-- BHandH [Becke1993]
-- BHandHLYP [Becke1993][Lee1988]
-- B1PW91 [Adamo1997]
-- mPW1PW [Adamo1998]
-- mPW1K [Lynch2000]
-- PBE0 [Adamo1999][Perdew1996b]
-- PBE0-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.287 PAR3=0.928' [Adamo1999][Perdew1996b][Grimme2010]
-- PBE0-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.4145 PAR3=1.2177 PAR4=4.8593' [Adamo1999][Perdew1996b][Grimme2011]
-- PBE0-D4 [Adamo1999][Perdew1996b][Grimme2019]
-- OPBE0
-- S12H !includesdisp [Swart2013][Grimme2010]
-- BMK !libxc [Boese2004][Lehtola2017][Marques2012]
-# - BMK-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.931 PAR3=2.168' !libxc [Boese2004][Grimme2010][Lehtola2017][Marques2012]
-# - BMK-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.1940 PAR3=2.0860 PAR4=5.9197' !libxc [Boese2004][Grimme2011][Lehtola2017][Marques2012]
-- B1B95 !libxc
-- B1B95-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.613 PAR3=1.868' !libxc
-- B97 !libxc
-- B97-1 !libxc
-- B97-2 !libxc
-- B97-3 !libxc
-
-MetaHybrid
-- MN15 !libxc
-- M06 [Zhao2006][Zhao2008]
-- M06-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.325 PAR3=0.000' [Zhao2006][Zhao2008][Grimme2010]
-- M06-D4, 'GRIMME4 s6=1.0000 s8=0.16366729 a1=0.53456413 a2=6.06192174' [Zhao2006][Zhao2008][Grimme2019]
-- M06-2X [Zhao2006][Zhao2008]
-- M06-2X-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.619 PAR3=0.000' [Zhao2006][Zhao2008][Grimme2010]
-- M06-HF [Zhao2006][Zhao2008]
-- M06-HF-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.446 PAR3=0.000' [Zhao2006][Zhao2008][Grimme2010]
-- TPSSH
-- TPSSH-D4
-- revSCAN0 !libxc [Lehtola2017][Marques2012][Mezei2018]
-
-DoubleHybrid
-- rev-DOD-BLYP !includesdisp [Santra2019]
-- rev-DOD-BLYP-D3(BJ) [Santra2019][Grimme2011]
-- rev-DOD-BLYP-D4 !includesdisp [Santra2019][Grimme2019]
-- rev-DOD-PBE !includesdisp [Santra2019]
-- rev-DOD-PBE-D3(BJ) [Santra2019][Grimme2011]
-- rev-DOD-PBE-D4 !includesdisp [Santra2019][Grimme2019]
-- rev-DOD-PBEP86 !includesdisp [Santra2019]
-- rev-DOD-PBEP86-D3(BJ) [Santra2019][Grimme2011]
-- rev-DOD-PBEP86-D4 !includesdisp [Santra2019][Grimme2019]
-- SOS1-PBE-QIDH
-- DOD-SCAN [Santra2019]
-- DOD-SCAN-D3(BJ) [Santra2019][Grimme2011]
-- rev-DOD-SCAN-D4 !includesdisp [Santra2019][Grimme2019]
-- B2PLYP [Grimme2006b]
-- B2PIPLYP [SanchoGarcia2009]
-- ROB2PLYP
-- B2TPLYP [Tarnopolsky2008]
-- B2GPPLYP
-- B2KPLYP
-- B2NCPLYP
-- mPW2PLYP
-- mPW2KPLYP
-- mPW2NCPLYP
-- DH-BLYP
-- PBE0-DH [Bremond2011]
-- PBE-QIDH
-- LS1-DH
-- PBE0-2
-- LS1-TPSS
-- DS1-TPSS
-- B2PLYP-D3
-- B2GPPLYP-D3
-- B2NCPLYP-D3
-- mPW2NCPLYP-D3
-- PBE0-DH-D3 [Bremond2011][Grimme2010][Goerigk2014]
-- PBE-QIDH-D3
-- LS1-DH-D3
-- PBE0-2-D3
-- LS1-TPSS-D3
-- B2PLYP-D3(BJ) [Grimme2006b][Grimme2011]
-- B2PIPLYP-D3(BJ) [SanchoGarcia2009][Grimme2011][Forster2020]
-- ROB2PLYP-D3(BJ)
-- B2TPLYP-D3(BJ) [Tarnopolsky2008][Grimme2011][Forster2020]
-- B2GPPLYP-D3(BJ)
-- B2KPLYP-D3(BJ) [Forster2020]
-- B2NCPLYP-D3(BJ)
-# - mPW2PLYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=0.400 PAR2=0.3065 PAR3=0.9147 PAR4=5.057'
-- mPW2NCPLYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=0.385 PAR2=-0.493 PAR3=0.0 PAR4=9.529' [Forster2020]
-- mPW2KPLYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=0.490 PAR2=0.306 PAR3=0.915 PAR4=5.057' [Forster2020]
-- DH-BLYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=0.488 PAR2=0.306 PAR3=0.915 PAR4=5.057' [Forster2020]
-- PBE0-DH-D3(BJ), 'GRIMME3 BJDAMP PAR1=0.880 PAR2=0.000 PAR3=0.165 PAR4=6.385' [Bremond2011][Grimme2011]
-- PBE-QIDH-D3(BJ)
-- LS1-DH-D3(BJ)
-- PBE0-2-D3(BJ)
-- LS1-TPSS-D3(BJ)
-- DS1-TPSS-D3(BJ)
-- B2PLYP-D4
-- B2GPPLYP-D4
-- mPW2PLYP-D4, 'GRIMME4 s6=0.750 s8=0.4579 a1=0.43 a2=5.0765'
-- PBE0-DH-D4, 'GRIMME4 s6=0.875 s8=0.9681 a1=0.4759 a2=5.0862' [Bremond2011][Grimme2019]
-- PBE0-2-D4, 'GRIMME4 s6=0.500 s8=0.6430 a1=0.7654 a2=5.7858'
-- DSD-BLYP
-- rev-DSD-BLYP
-- rev-DSD-BLYP-D4 !includesdisp
-- DSD-PBEP86
-- rev-DSD-PBEP86
-- rev-DSD-PBEP86-D4 !includesdisp
-- DSD-PBE
-- rev-DSD-PBE
-- rev-DSD-PBE-D4 !includesdisp
-- rev-DSD-SCAN-D4 !includesdisp
-- SD-SCAN69
-
-RangeSeparated
-- CAM-B3LYP !libxc [Lehtola2017][Marques2012][Yanai2004]
-- CAM-B3LYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.000 PAR2=0.3708 PAR3=2.0674 PAR4=5.4743' !libxc [Lehtola2017][Marques2012][Yanai2004][Grimme2011]
-- CAM-B3LYP-D4 !libxc [Lehtola2017][Marques2012][Yanai2004][Grimme2019]
-- CAMY-B3LYP
-- HJS-PBE !libxc
-- HJS-PBESOL !libxc
-- HJS-B97X !libxc
-- HSE03 !libxc
-- HSE06 !libxc
-- LRC_WPBE !libxc
-- LRC_WPBEH !libxc
-- LCY-BLYP [Seth2012][Ekstrom2010][Becke1988][Lee1988]
-- LCY-BP86 [Seth2012][Ekstrom2010][Becke1988][Perdew1986]
-- LCY-PBE [Seth2012][Ekstrom2010][Perdew1996]
-- M06-SX !libxc
-- M11 !libxc
-- MN12-SX !libxc [Peverati2012][Lehtola2017][Marques2012]
-- N12-SX !libxc [Peverati2012][Lehtola2017][Marques2012]
-- TUNED-CAM-B3LYP !libxc
-- WB97 !libxc [Chai2008][Lehtola2017][Marques2012]
-- WB97X !libxc [Chai2008][Lehtola2017][Marques2012]
-- WB97-D4, 'GRIMME4 s6=1.0000 s8=6.55792598 a1=0.76666802 a2=8.36027334' !libxc [Chai2008][Grimme2019][Lehtola2017][Marques2012]
-- WB97X-D4, 'GRIMME4 s6=1.0000 s8=-0.07519516 a1=0.45094893 a2=6.78425255' !libxc [Chai2008][Grimme2019][Lehtola2017][Marques2012]
-
-MP2
-- MP2
-- SOS-MP2
-- SCS-MP2
-
-Model
-- SAOP
-- LB94
-
-
-# REFERENCE LIST
-[Vosko1980] 10.1139/p80-159
-[Stoll1978] 10.1007/BF00551408
-[Perdew1986] 10.1103/PhysRevB.33.8800
-[Perdew1992] 10.1103/PhysRevB.45.13244
-[Perdew1992b] 10.1103/PhysRevB.46.6671
-[Perdew1996] 10.1103/PhysRevLett.77.3865
-[Perdew1996b] 10.1063/1.472933
-[Perdew2008] 10.1103/PhysRevLett.100.136406
-[Perdew2009] 10.1103/PhysRevLett.103.026403
-[Becke1993] 10.1063/1.464304
-[Becke1988] 10.1103/PhysRevA.38.3098
-[Becke1997] 10.1063/1.475007
-[Kim2012] 10.1021/jz2016395
-[Lee1988] 10.1103/PhysRevB.37.785
-[Handy2000] 10.1080/00268970010018431
-[Hammer1999] 10.1103/PhysRevB.59.7413
-[Zhang1998] 10.1103/PhysRevLett.80.890
-[Adamo1997] 10.1016/S0009-2614(97)00651-9
-[Adamo1998] 10.1063/1.475428
-[Adamo1999] 10.1063/1.478522
-[Adamo2002] 10.1063/1.1458927
-[Haas2011] 10.1103/PhysRevB.83.205117
-[Xu2004] 10.1073/pnas.0308730100
-[Mortensen2005] 10.1103/PhysRevLett.95.216401
-[Swart2009] 10.1063/1.3213193
-[Swart2009b] 10.3233/JCM-2009-0230
-[Swart2013] 10.1016/j.cplett.2013.06.045
-[Grimme2004] 10.1002/jcc.20078 # -D
-[Grimme2006] 10.1002/jcc.20495 # B97-D
-[Grimme2006b] 10.1063/1.2148954 # B2PLYP
-[Grimme2010] 10.1063/1.3382344 # -D3
-[Grimme2011] 10.1002/jcc.21759 # -D3(BJ)
-[Grimme2019] 10.1063/1.5090222 # -D4
-[Chai2008] 10.1063/1.2834918
-[Steinman2011] 10.1021/ct200602x
-[Ambrosetti2014] 10.1063/1.4865104
-[Marques2012] 10.1016/j.cpc.2012.05.007 # libxc
-[Lehtola2017] 10.1016/j.softx.2017.11.002 # libxc
-[Zhao2006] 10.1063/1.2370993
-[Zhao2008] 10.1007/s00214-007-0310-x
-[Stephens1994] 10.1021/j100096a001
-[Reiher2001] 10.1007/s00214-001-0300-3
-[Kang2001] 10.1063/1.1415079
-[Cohen2000] 10.1080/00268970010023435
-[Lynch2000] 10.1021/jp000497z
-[Bremond2011] 10.1063/1.3604569
-[Tao2003] 10.1103/PhysRevLett.91.146401
-[Staroverov2003] 10.1063/1.1626543
-[Sun2015] 10.1073/pnas.1423145112
-[Sun2015b] 10.1103/PhysRevLett.115.036402
-[Boese2004] 10.1063/1.1774975
-[Peverati2012] 10.1039/C2CP42576A
-[Ekstrom2010] 10.1021/ct100117s # xcfun
-[Seth2012] 10.1021/ct300006h # RANGESEP
-[Yanai2004] 10.1016/j.cplett.2004.06.011
-[SanchoGarcia2009] 10.1063/1.3212881
-[Tarnopolsky2008] 10.1021/jp710179r
-[Santra2019] 10.1021/acs.jpca.9b03157
-[Gasevic2022] 10.1021/acs.jpca.2c02951
-[Mezei2018] 10.1021/acs.jctc.8b00072
-[Furness2020] 10.1021/acs.jpclett.0c02405
-[Furness2020b] 10.1021/acs.jpclett.0c03077
-[Bartok2019] 10.1063/1.5094646
-[Goerigk2014] 10.1002/wcms.1193
-[Goerigk2017] 10.1039/C7CP04913G
-[Ehlert2021] 10.1063/5.0041008
+LDA
+- VWN [Vosko1980]
+- VWN Stoll [Vosko1980][Stoll1978]
+- PW92 [Perdew1992]
+- Xonly
+- Xalpha
+
+GGA
+- BP86 [Becke1988][Perdew1986]
+- BP86-D [Becke1988][Perdew1986][Grimme2004]
+- BP86-D3 [Becke1988][Perdew1986][Grimme2010]
+- BP86-D3(BJ) [Becke1988][Perdew1986][Grimme2011]
+- BP86-D4 [Becke1988][Perdew1986][Grimme2019]
+- BP86-dDsC [Becke1988][Perdew1986][Steinman2011]
+- PW91 [Perdew1992b]
+- PW91-dUFF [Perdew1992b][Kim2012]
+- mPW [Perdew1992b][Adamo1998]
+- PBE [Perdew1996]
+- PBE-D [Perdew1996][Grimme2004]
+- PBE-D3 [Perdew1996][Grimme2010]
+- PBE-D3(BJ) [Perdew1996][Grimme2011]
+- PBE-D4 [Perdew1996][Grimme2019]
+- PBE-dDsC [Perdew1996][Steinman2011]
+- PBE-MBD@rsSC [Perdew1996][Ambrosetti2014]
+- PBE-dUFF [Perdew1996][Kim2012]
+- RPBE [Hammer1999][Perdew1996]
+- RPBE-D3 [Hammer1999][Perdew1996][Grimme2010]
+- RPBE-D3(BJ) [Hammer1999][Perdew1996][Grimme2011]
+- RPBE-D4 [Hammer1999][Perdew1996][Grimme2019]
+- revPBE [Zhang1998][Perdew1996]
+- revPBE-D3 [Zhang1998][Perdew1996][Grimme2010]
+- revPBE-D3(BJ) [Zhang1998][Perdew1996][Grimme2011]
+- revPBE-D4 [Zhang1998][Perdew1996][Grimme2019]
+- revPBE-dDsC [Zhang1998][Perdew1996][Steinman2011]
+- mPBE [Perdew1996][Adamo2002]
+- PBEsol [Perdew2008]
+- PBEsol-D [Perdew2008][Grimme2004]
+- PBEsol-D3 [Perdew2008][Grimme2010]
+- PBEsol-D3(BJ) [Perdew2008][Grimme2011]
+- PBEsol-D4, 'GRIMME4 s6=1.0000 s8=0.59493760 a1=0.71422359 a2=6.35314182' [Perdew2008][Grimme2019]
+- HTBS [Perdew1996][Haas2011]
+- BLYP [Becke1988][Lee1988]
+- BLYP-D [Becke1988][Lee1988][Grimme2004]
+- BLYP-D3 [Becke1988][Lee1988][Grimme2010]
+- BLYP-D3(BJ) [Becke1988][Lee1988][Grimme2011]
+- BLYP-D4 [Becke1988][Lee1988][Grimme2019]
+- BLYP-dDsC [Becke1988][Lee1988][Steinman2011]
+- OLYP [Handy2000][Lee1988]
+- OLYP-D3, 'GRIMME3 PAR1=1.0000 PAR2=0.806 PAR3=1.764' [Handy2000][Lee1988][Grimme2010]
+- OLYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.5299 PAR3=2.6205 PAR4=2.8065' [Handy2000][Lee1988][Grimme2011]
+- OLYP-D4 [Handy2000][Lee1988][Grimme2019]
+- OPBE [Handy2000][Perdew1996]
+# - OPBE-D3, 'GRIMME3 PAR1=1.0000 PAR2=0.837 PAR3=2.055' [Handy2000][Perdew1996][Grimme2010]
+- OPBE-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.5512 PAR3=3.3816 PAR4=2.9444' [Handy2000][Perdew1996][Grimme2011]
+- OPBE-D4 [Handy2000][Perdew1996][Grimme2019]
+- BEE [Mortensen2005][Perdew1996]
+- XLYP [Xu2004][Lee1988]
+- GGA:SSB-D !includesdisp [Swart2009][Swart2009b][Grimme2004]
+- S12g
+- S12g-D3
+- LB94
+- KT1
+- KT2
+- B97-D !includesdisp !libxc [Grimme2006][Grimme2004][Lehtola2017][Marques2012]
+- B97-D-D3, 'GRIMME3 PAR1=1.0000 PAR2=0.892 PAR3=0.909' !libxc [Grimme2006][Grimme2004][Grimme2010][Lehtola2017][Marques2012]
+- B97-GGA1 !libxc
+- B97-K !libxc
+
+MetaGGA
+- M06L [Zhao2006][Zhao2008]
+- M06L-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.581 PAR3=0.000' [Zhao2006][Zhao2008][Grimme2010]
+- M06L-D4, 'GRIMME4 s6=1.0000 s8=0.59493760 a1=0.71422359 a2=6.35314182' [Zhao2006][Zhao2008][Grimme2019]
+- MN15-L !libxc
+- TPSS [Tao2003][Staroverov2003]
+- TPSS-D3(BJ) [Tao2003][Staroverov2003][Grimme2010]
+- TPSS-D4 [Tao2003][Staroverov2003][Grimme2019]
+- revTPSS [Perdew2009]
+- MetaGGA:SSB-D !includesdisp [Grimme2004]
+- MVS [Sun2015]
+- MS0
+- MS1
+- MS2
+- SCAN [Sun2015b]
+- SCAN-D3(BJ) [Sun2015b][Grimme2011]
+- SCAN-D4, 'GRIMME4 s6=1.0000 s8=1.46126056 a1=0.62930855 a2=6.31284039' [Sun2015b][Grimme2019]
+- TASKxc
+- TASKCC
+- revSCAN !libxc [Lehtola2017][Marques2012][Mezei2018]
+- rSCAN !libxc [Lehtola2017][Marques2012][Bartok2019]
+- rSCAN-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.47023427 PAR3=1.08859014 PAR4=5.73408312' !libxc [Lehtola2017][Marques2012][Bartok2019][Grimme2011]
+- rSCAN-D4, 'GRIMME4 s6=1.0000 s8=0.87728975 a1=0.49116966 a2=5.75859346' !libxc [Lehtola2017][Marques2012][Bartok2019][Grimme2019][Ehlert2021]
+- r2SCAN !libxc [Lehtola2017][Marques2012][Furness2020][Furness2020b]
+- r2SCAN-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.49484001 PAR3=0.78981345 PAR4=5.73083694' !libxc [Lehtola2017][Marques2012][Furness2020][Furness2020b][Grimme2011]
+- r2SCAN-D4 !libxc [Lehtola2017][Marques2012][Furness2020][Furness2020b][Grimme2019]
+- r2SCAN-3c [Gasevic2022][Grimme2019]
+
+HartreeFock
+- HartreeFock
+- HartreeFock-D4
+
+Hybrid
+- B3LYP [Stephens1994]
+- B3LYP-D [Stephens1994][Grimme2004]
+- B3LYP-D3 [Stephens1994][Grimme2010]
+- B3LYP-D3(BJ) [Stephens1994][Grimme2011]
+- B3LYP-D4 [Stephens1994][Grimme2019]
+- B3LYP* [Reiher2001]
+- B1LYP [Adamo1997]
+- B1LYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.1986 PAR3=2.1167 PAR4=5.3875' [Adamo1997][Goerigk2017][Grimme2011]
+- B1LYP-D4, 'GRIMME4 s6=1.0000 s8=1.98553711 a1=0.39309040 a2=4.55465145' [Adamo1997][Grimme2019]
+- KMLYP [Kang2001]
+- O3LYP [Cohen2000]
+- O3LYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.0963 PAR3=1.8171 PAR4=5.9940' [Cohen2000][Goerigk2017][Grimme2011]
+- O3LYP-D4, 'GRIMME4 s6=1.0000 s8=1.75762508 a1=0.10348980 a2=6.16233282' [Cohen2000][Grimme2019]
+- X3LYP [Xu2004]
+- X3LYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.2022 PAR3=1.5744 PAR4=5.4184' [Xu2004][Goerigk2017][Grimme2011]
+- X3LYP-D4, 'GRIMME4 s6=1.0000 s8=1.54701429 a1=0.20318443 a2=5.61852648' [Xu2004][Grimme2019]
+- BHandH [Becke1993]
+- BHandHLYP [Becke1993][Lee1988]
+- B1PW91 [Adamo1997]
+- mPW1PW [Adamo1998]
+- mPW1K [Lynch2000]
+- PBE0 [Adamo1999][Perdew1996b]
+- PBE0-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.287 PAR3=0.928' [Adamo1999][Perdew1996b][Grimme2010]
+- PBE0-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.4145 PAR3=1.2177 PAR4=4.8593' [Adamo1999][Perdew1996b][Grimme2011]
+- PBE0-D4 [Adamo1999][Perdew1996b][Grimme2019]
+- OPBE0
+- S12H !includesdisp [Swart2013][Grimme2010]
+- BMK !libxc [Boese2004][Lehtola2017][Marques2012]
+# - BMK-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.931 PAR3=2.168' !libxc [Boese2004][Grimme2010][Lehtola2017][Marques2012]
+# - BMK-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.0000 PAR2=0.1940 PAR3=2.0860 PAR4=5.9197' !libxc [Boese2004][Grimme2011][Lehtola2017][Marques2012]
+- B1B95 !libxc
+- B1B95-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.613 PAR3=1.868' !libxc
+- B97 !libxc
+- B97-1 !libxc
+- B97-2 !libxc
+- B97-3 !libxc
+
+MetaHybrid
+- MN15 !libxc
+- M06 [Zhao2006][Zhao2008]
+- M06-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.325 PAR3=0.000' [Zhao2006][Zhao2008][Grimme2010]
+- M06-D4, 'GRIMME4 s6=1.0000 s8=0.16366729 a1=0.53456413 a2=6.06192174' [Zhao2006][Zhao2008][Grimme2019]
+- M06-2X [Zhao2006][Zhao2008]
+- M06-2X-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.619 PAR3=0.000' [Zhao2006][Zhao2008][Grimme2010]
+- M06-HF [Zhao2006][Zhao2008]
+- M06-HF-D3, 'GRIMME3 PAR1=1.0000 PAR2=1.446 PAR3=0.000' [Zhao2006][Zhao2008][Grimme2010]
+- TPSSH
+- TPSSH-D4
+- revSCAN0 !libxc [Lehtola2017][Marques2012][Mezei2018]
+
+DoubleHybrid
+- rev-DOD-BLYP !includesdisp [Santra2019]
+- rev-DOD-BLYP-D3(BJ) [Santra2019][Grimme2011]
+- rev-DOD-BLYP-D4 !includesdisp [Santra2019][Grimme2019]
+- rev-DOD-PBE !includesdisp [Santra2019]
+- rev-DOD-PBE-D3(BJ) [Santra2019][Grimme2011]
+- rev-DOD-PBE-D4 !includesdisp [Santra2019][Grimme2019]
+- rev-DOD-PBEP86 !includesdisp [Santra2019]
+- rev-DOD-PBEP86-D3(BJ) [Santra2019][Grimme2011]
+- rev-DOD-PBEP86-D4 !includesdisp [Santra2019][Grimme2019]
+- SOS1-PBE-QIDH
+- DOD-SCAN [Santra2019]
+- DOD-SCAN-D3(BJ) [Santra2019][Grimme2011]
+- rev-DOD-SCAN-D4 !includesdisp [Santra2019][Grimme2019]
+- B2PLYP [Grimme2006b]
+- B2PIPLYP [SanchoGarcia2009]
+- ROB2PLYP
+- B2TPLYP [Tarnopolsky2008]
+- B2GPPLYP
+- B2KPLYP
+- B2NCPLYP
+- mPW2PLYP
+- mPW2KPLYP
+- mPW2NCPLYP
+- DH-BLYP
+- PBE0-DH [Bremond2011]
+- PBE-QIDH
+- LS1-DH
+- PBE0-2
+- LS1-TPSS
+- DS1-TPSS
+- B2PLYP-D3
+- B2GPPLYP-D3
+- B2NCPLYP-D3
+- mPW2NCPLYP-D3
+- PBE0-DH-D3 [Bremond2011][Grimme2010][Goerigk2014]
+- PBE-QIDH-D3
+- LS1-DH-D3
+- PBE0-2-D3
+- LS1-TPSS-D3
+- B2PLYP-D3(BJ) [Grimme2006b][Grimme2011]
+- B2PIPLYP-D3(BJ) [SanchoGarcia2009][Grimme2011][Forster2020]
+- ROB2PLYP-D3(BJ)
+- B2TPLYP-D3(BJ) [Tarnopolsky2008][Grimme2011][Forster2020]
+- B2GPPLYP-D3(BJ)
+- B2KPLYP-D3(BJ) [Forster2020]
+- B2NCPLYP-D3(BJ)
+# - mPW2PLYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=0.400 PAR2=0.3065 PAR3=0.9147 PAR4=5.057'
+- mPW2NCPLYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=0.385 PAR2=-0.493 PAR3=0.0 PAR4=9.529' [Forster2020]
+- mPW2KPLYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=0.490 PAR2=0.306 PAR3=0.915 PAR4=5.057' [Forster2020]
+- DH-BLYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=0.488 PAR2=0.306 PAR3=0.915 PAR4=5.057' [Forster2020]
+- PBE0-DH-D3(BJ), 'GRIMME3 BJDAMP PAR1=0.880 PAR2=0.000 PAR3=0.165 PAR4=6.385' [Bremond2011][Grimme2011]
+- PBE-QIDH-D3(BJ)
+- LS1-DH-D3(BJ)
+- PBE0-2-D3(BJ)
+- LS1-TPSS-D3(BJ)
+- DS1-TPSS-D3(BJ)
+- B2PLYP-D4
+- B2GPPLYP-D4
+- mPW2PLYP-D4, 'GRIMME4 s6=0.750 s8=0.4579 a1=0.43 a2=5.0765'
+- PBE0-DH-D4, 'GRIMME4 s6=0.875 s8=0.9681 a1=0.4759 a2=5.0862' [Bremond2011][Grimme2019]
+- PBE0-2-D4, 'GRIMME4 s6=0.500 s8=0.6430 a1=0.7654 a2=5.7858'
+- DSD-BLYP
+- rev-DSD-BLYP
+- rev-DSD-BLYP-D4 !includesdisp
+- DSD-PBEP86
+- rev-DSD-PBEP86
+- rev-DSD-PBEP86-D4 !includesdisp
+- DSD-PBE
+- rev-DSD-PBE
+- rev-DSD-PBE-D4 !includesdisp
+- rev-DSD-SCAN-D4 !includesdisp
+- SD-SCAN69
+
+RangeSeparated
+- CAM-B3LYP !libxc [Lehtola2017][Marques2012][Yanai2004]
+- CAM-B3LYP-D3(BJ), 'GRIMME3 BJDAMP PAR1=1.000 PAR2=0.3708 PAR3=2.0674 PAR4=5.4743' !libxc [Lehtola2017][Marques2012][Yanai2004][Grimme2011]
+- CAM-B3LYP-D4 !libxc [Lehtola2017][Marques2012][Yanai2004][Grimme2019]
+- CAMY-B3LYP
+- HJS-PBE !libxc
+- HJS-PBESOL !libxc
+- HJS-B97X !libxc
+- HSE03 !libxc
+- HSE06 !libxc
+- LRC_WPBE !libxc
+- LRC_WPBEH !libxc
+- LCY-BLYP [Seth2012][Ekstrom2010][Becke1988][Lee1988]
+- LCY-BP86 [Seth2012][Ekstrom2010][Becke1988][Perdew1986]
+- LCY-PBE [Seth2012][Ekstrom2010][Perdew1996]
+- M06-SX !libxc
+- M11 !libxc
+- MN12-SX !libxc [Peverati2012][Lehtola2017][Marques2012]
+- N12-SX !libxc [Peverati2012][Lehtola2017][Marques2012]
+- TUNED-CAM-B3LYP !libxc
+- WB97 !libxc [Chai2008][Lehtola2017][Marques2012]
+- WB97X !libxc [Chai2008][Lehtola2017][Marques2012]
+- WB97-D4, 'GRIMME4 s6=1.0000 s8=6.55792598 a1=0.76666802 a2=8.36027334' !libxc [Chai2008][Grimme2019][Lehtola2017][Marques2012]
+- WB97X-D4, 'GRIMME4 s6=1.0000 s8=-0.07519516 a1=0.45094893 a2=6.78425255' !libxc [Chai2008][Grimme2019][Lehtola2017][Marques2012]
+
+MP2
+- MP2
+- SOS-MP2
+- SCS-MP2
+
+Model
+- SAOP
+- LB94
+
+
+# REFERENCE LIST
+[Vosko1980] 10.1139/p80-159
+[Stoll1978] 10.1007/BF00551408
+[Perdew1986] 10.1103/PhysRevB.33.8800
+[Perdew1992] 10.1103/PhysRevB.45.13244
+[Perdew1992b] 10.1103/PhysRevB.46.6671
+[Perdew1996] 10.1103/PhysRevLett.77.3865
+[Perdew1996b] 10.1063/1.472933
+[Perdew2008] 10.1103/PhysRevLett.100.136406
+[Perdew2009] 10.1103/PhysRevLett.103.026403
+[Becke1993] 10.1063/1.464304
+[Becke1988] 10.1103/PhysRevA.38.3098
+[Becke1997] 10.1063/1.475007
+[Kim2012] 10.1021/jz2016395
+[Lee1988] 10.1103/PhysRevB.37.785
+[Handy2000] 10.1080/00268970010018431
+[Hammer1999] 10.1103/PhysRevB.59.7413
+[Zhang1998] 10.1103/PhysRevLett.80.890
+[Adamo1997] 10.1016/S0009-2614(97)00651-9
+[Adamo1998] 10.1063/1.475428
+[Adamo1999] 10.1063/1.478522
+[Adamo2002] 10.1063/1.1458927
+[Haas2011] 10.1103/PhysRevB.83.205117
+[Xu2004] 10.1073/pnas.0308730100
+[Mortensen2005] 10.1103/PhysRevLett.95.216401
+[Swart2009] 10.1063/1.3213193
+[Swart2009b] 10.3233/JCM-2009-0230
+[Swart2013] 10.1016/j.cplett.2013.06.045
+[Grimme2004] 10.1002/jcc.20078 # -D
+[Grimme2006] 10.1002/jcc.20495 # B97-D
+[Grimme2006b] 10.1063/1.2148954 # B2PLYP
+[Grimme2010] 10.1063/1.3382344 # -D3
+[Grimme2011] 10.1002/jcc.21759 # -D3(BJ)
+[Grimme2019] 10.1063/1.5090222 # -D4
+[Chai2008] 10.1063/1.2834918
+[Steinman2011] 10.1021/ct200602x
+[Ambrosetti2014] 10.1063/1.4865104
+[Marques2012] 10.1016/j.cpc.2012.05.007 # libxc
+[Lehtola2017] 10.1016/j.softx.2017.11.002 # libxc
+[Zhao2006] 10.1063/1.2370993
+[Zhao2008] 10.1007/s00214-007-0310-x
+[Stephens1994] 10.1021/j100096a001
+[Reiher2001] 10.1007/s00214-001-0300-3
+[Kang2001] 10.1063/1.1415079
+[Cohen2000] 10.1080/00268970010023435
+[Lynch2000] 10.1021/jp000497z
+[Bremond2011] 10.1063/1.3604569
+[Tao2003] 10.1103/PhysRevLett.91.146401
+[Staroverov2003] 10.1063/1.1626543
+[Sun2015] 10.1073/pnas.1423145112
+[Sun2015b] 10.1103/PhysRevLett.115.036402
+[Boese2004] 10.1063/1.1774975
+[Peverati2012] 10.1039/C2CP42576A
+[Ekstrom2010] 10.1021/ct100117s # xcfun
+[Seth2012] 10.1021/ct300006h # RANGESEP
+[Yanai2004] 10.1016/j.cplett.2004.06.011
+[SanchoGarcia2009] 10.1063/1.3212881
+[Tarnopolsky2008] 10.1021/jp710179r
+[Santra2019] 10.1021/acs.jpca.9b03157
+[Gasevic2022] 10.1021/acs.jpca.2c02951
+[Mezei2018] 10.1021/acs.jctc.8b00072
+[Furness2020] 10.1021/acs.jpclett.0c02405
+[Furness2020b] 10.1021/acs.jpclett.0c03077
+[Bartok2019] 10.1063/1.5094646
+[Goerigk2014] 10.1002/wcms.1193
+[Goerigk2017] 10.1039/C7CP04913G
+[Ehlert2021] 10.1063/5.0041008
[Forster2020] 10.1002/jcc.26209
\ No newline at end of file
diff --git a/src/tcutility/data/basis_sets.py b/src/tcutility/data/basis_sets.py
index 759a6262..fdfc4644 100755
--- a/src/tcutility/data/basis_sets.py
+++ b/src/tcutility/data/basis_sets.py
@@ -1,85 +1,85 @@
-import json
-import pathlib as pl
-from tcutility import data
-
-
-available_basis_sets = {
-'ADF': [
- 'SZ',
- 'DZ',
- 'DZP',
- 'TZP',
- 'TZ2P',
- 'QZ4P',
- 'mTZ2P',
- 'AUG/ASZ',
- 'AUG/ADZ',
- 'AUG/ADZP',
- 'AUG/ATZP',
- 'AUG/ATZ2P',
- 'Corr/TZ3P',
- 'Corr/QZ6P',
- 'Corr/ATZ3P',
- 'Corr/AQZ6P',
- 'ET/ET-pVQZ',
- 'ET/ET-QZ3P',
- 'ET/ET-QZ3P-1DIFFUSE',
- 'ET/ET-QZ3P-2DIFFUSE',
- 'ET/ET-QZ3P-3DIFFUSE',
- 'TZ2P-J',
- 'QZ4P-J',
- 'POLTDDFT/DZ',
- 'POLTDDFT/DZP',
- 'POLTDDFT/TZP',
-],
-'BAND': {},
-'ORCA': {},
-}
-
-
-# read data
-data_dir = pl.Path(__file__).parents[0] / "_atom_data_info"
-
-with open(data_dir / "norbs.json") as inp:
- _number_of_orbitals = json.loads(inp.read())
-
-
-def number_of_orbitals(element, basis_set):
- '''
- Get the number of atomic orbitals for a certain element and basis-set.
-
- Args:
- element: the element for which to get the number of AOs.
- basis_set: the basis-set for which to get the number of AOs.
-
- .. warning::
- This function currently only works for the following basis-sets:
- [``SZ``, ``DZ``, ``DZP``, ``TZP``, ``TZ2P``, ``TZ2P-J``, ``mTZ2P``, ``QZ4P``, ``QZ4P-J``, ``jcpl``].
- It also only works for no-frozen-core calculations with ``NOSYM`` symmetry.
- '''
- symbol = data.atom.symbol(element)
- return _number_of_orbitals[basis_set][symbol]
-
-
-def number_of_virtuals(element, basis_set):
- '''
- Get the number of virtual atomic orbitals for a certain element and basis-set.
- The number of virtuals is equal to the total number of AOs minus half the number of electrons in the atom.
-
- Args:
- element: the element for which to get the number of AOs.
- basis_set: the basis-set for which to get the number of AOs.
-
- .. warning::
- This function currently only works for the following basis-sets:
- [``SZ``, ``DZ``, ``DZP``, ``TZP``, ``TZ2P``, ``TZ2P-J``, ``mTZ2P``, ``QZ4P``, ``QZ4P-J``, ``jcpl``].
- It also only works for no-frozen-core calculations with ``NOSYM`` symmetry.
- '''
- num = data.atom.atom_number(element)
- symbol = data.atom.symbol(element)
- return _number_of_orbitals[basis_set][symbol] - num/2
-
-
-if __name__ == '__main__':
- print(number_of_orbitals('Pd', 'DZ'))
- print(number_of_virtuals('Pd', 'DZ'))
+import json
+import pathlib as pl
+from tcutility import data
+
+
+available_basis_sets = {
+'ADF': [
+ 'SZ',
+ 'DZ',
+ 'DZP',
+ 'TZP',
+ 'TZ2P',
+ 'QZ4P',
+ 'mTZ2P',
+ 'AUG/ASZ',
+ 'AUG/ADZ',
+ 'AUG/ADZP',
+ 'AUG/ATZP',
+ 'AUG/ATZ2P',
+ 'Corr/TZ3P',
+ 'Corr/QZ6P',
+ 'Corr/ATZ3P',
+ 'Corr/AQZ6P',
+ 'ET/ET-pVQZ',
+ 'ET/ET-QZ3P',
+ 'ET/ET-QZ3P-1DIFFUSE',
+ 'ET/ET-QZ3P-2DIFFUSE',
+ 'ET/ET-QZ3P-3DIFFUSE',
+ 'TZ2P-J',
+ 'QZ4P-J',
+ 'POLTDDFT/DZ',
+ 'POLTDDFT/DZP',
+ 'POLTDDFT/TZP',
+],
+'BAND': {},
+'ORCA': {},
+}
+
+
+# read data
+data_dir = pl.Path(__file__).parents[0] / "_atom_data_info"
+
+with open(data_dir / "norbs.json") as inp:
+ _number_of_orbitals = json.loads(inp.read())
+
+
+def number_of_orbitals(element, basis_set):
+ '''
+ Get the number of atomic orbitals for a certain element and basis-set.
+
+ Args:
+ element: the element for which to get the number of AOs.
+ basis_set: the basis-set for which to get the number of AOs.
+
+ .. warning::
+ This function currently only works for the following basis-sets:
+ [``SZ``, ``DZ``, ``DZP``, ``TZP``, ``TZ2P``, ``TZ2P-J``, ``mTZ2P``, ``QZ4P``, ``QZ4P-J``, ``jcpl``].
+ It also only works for no-frozen-core calculations with ``NOSYM`` symmetry.
+ '''
+ symbol = data.atom.symbol(element)
+ return _number_of_orbitals[basis_set][symbol]
+
+
+def number_of_virtuals(element, basis_set):
+ '''
+ Get the number of virtual atomic orbitals for a certain element and basis-set.
+ The number of virtuals is equal to the total number of AOs minus half the number of electrons in the atom.
+
+ Args:
+ element: the element for which to get the number of AOs.
+ basis_set: the basis-set for which to get the number of AOs.
+
+ .. warning::
+ This function currently only works for the following basis-sets:
+ [``SZ``, ``DZ``, ``DZP``, ``TZP``, ``TZ2P``, ``TZ2P-J``, ``mTZ2P``, ``QZ4P``, ``QZ4P-J``, ``jcpl``].
+ It also only works for no-frozen-core calculations with ``NOSYM`` symmetry.
+ '''
+ num = data.atom.atom_number(element)
+ symbol = data.atom.symbol(element)
+ return _number_of_orbitals[basis_set][symbol] - num/2
+
+
+if __name__ == '__main__':
+ print(number_of_orbitals('Pd', 'DZ'))
+ print(number_of_virtuals('Pd', 'DZ'))
diff --git a/src/tcutility/data/cosmo.py b/src/tcutility/data/cosmo.py
index 05d5b01c..0cf5981e 100755
--- a/src/tcutility/data/cosmo.py
+++ b/src/tcutility/data/cosmo.py
@@ -1,99 +1,99 @@
-available_solvents = [
- 'Vacuum',
- 'AceticAcid',
- 'Acetone',
- 'Acetonitrile',
- 'Ammonia',
- 'Aniline',
- 'Benzene',
- 'BenzylAlcohol',
- 'Bromoform',
- 'Butanol',
- 'isoButanol',
- 'tertButanol',
- 'CarbonDisulfide',
- 'CarbonTetrachloride',
- 'Chloroform',
- 'Cyclohexane',
- 'Cyclohexanone',
- 'Dichlorobenzene',
- 'DiethylEther',
- 'Dioxane',
- 'DMFA',
- 'DMSO',
- 'Ethanol',
- 'EthylAcetate',
- 'Dichloroethane',
- 'EthyleneGlycol',
- 'Formamide',
- 'FormicAcid',
- 'Glycerol',
- 'HexamethylPhosphoramide',
- 'Hexane',
- 'Hydrazine',
- 'Methanol',
- 'MethylEthylKetone',
- 'Dichloromethane',
- 'Methylformamide',
- 'Methypyrrolidinone',
- 'Nitrobenzene',
- 'Nitrogen',
- 'Nitromethane',
- 'PhosphorylChloride',
- 'IsoPropanol',
- 'Pyridine',
- 'Sulfolane',
- 'Tetrahydrofuran',
- 'Toluene',
- 'Triethylamine',
- 'TrifluoroaceticAcid',
- 'Water',
- 'CH3COOH',
- 'CH3COCH3',
- 'CH3CN',
- 'NH3',
- 'C6H5NH2',
- 'C6H6',
- 'C6H5CH2OH',
- 'CHBr3',
- 'C4H9OH',
- '(CH3)2CHCH2OH',
- '(CH3)3COH',
- 'CS2',
- 'CCl4',
- 'CHCl3',
- 'C6H12',
- 'C6H10O',
- 'C6H4Cl2',
- '(CH3CH2)2O',
- 'C4H8O2',
- '(CH3)2NCHO',
- '(CH3)2SO',
- 'CH3CH2OH',
- 'CH3COOCH2CH3',
- 'ClCH2CH2Cl',
- 'HOCH2CH2OH',
- 'HCONH2',
- 'HCOOH',
- 'C3H8O3',
- 'C6H18N3OP',
- 'C6H14',
- 'N2H4',
- 'CH3OH',
- 'CH3CH2COCH3',
- 'CH2Cl2',
- 'HCONHCH3',
- 'C5H9NO',
- 'C6H5NO2',
- 'N2',
- 'CH3NO2',
- 'POCl3',
- '(CH3)2CHOH',
- 'C5H5N',
- 'C4H8SO2',
- 'C4H8O',
- 'C6H5CH3',
- '(CH3CH2)3N',
- 'CF3COOH',
- 'H2O'
-]
+available_solvents = [
+ 'Vacuum',
+ 'AceticAcid',
+ 'Acetone',
+ 'Acetonitrile',
+ 'Ammonia',
+ 'Aniline',
+ 'Benzene',
+ 'BenzylAlcohol',
+ 'Bromoform',
+ 'Butanol',
+ 'isoButanol',
+ 'tertButanol',
+ 'CarbonDisulfide',
+ 'CarbonTetrachloride',
+ 'Chloroform',
+ 'Cyclohexane',
+ 'Cyclohexanone',
+ 'Dichlorobenzene',
+ 'DiethylEther',
+ 'Dioxane',
+ 'DMFA',
+ 'DMSO',
+ 'Ethanol',
+ 'EthylAcetate',
+ 'Dichloroethane',
+ 'EthyleneGlycol',
+ 'Formamide',
+ 'FormicAcid',
+ 'Glycerol',
+ 'HexamethylPhosphoramide',
+ 'Hexane',
+ 'Hydrazine',
+ 'Methanol',
+ 'MethylEthylKetone',
+ 'Dichloromethane',
+ 'Methylformamide',
+ 'Methypyrrolidinone',
+ 'Nitrobenzene',
+ 'Nitrogen',
+ 'Nitromethane',
+ 'PhosphorylChloride',
+ 'IsoPropanol',
+ 'Pyridine',
+ 'Sulfolane',
+ 'Tetrahydrofuran',
+ 'Toluene',
+ 'Triethylamine',
+ 'TrifluoroaceticAcid',
+ 'Water',
+ 'CH3COOH',
+ 'CH3COCH3',
+ 'CH3CN',
+ 'NH3',
+ 'C6H5NH2',
+ 'C6H6',
+ 'C6H5CH2OH',
+ 'CHBr3',
+ 'C4H9OH',
+ '(CH3)2CHCH2OH',
+ '(CH3)3COH',
+ 'CS2',
+ 'CCl4',
+ 'CHCl3',
+ 'C6H12',
+ 'C6H10O',
+ 'C6H4Cl2',
+ '(CH3CH2)2O',
+ 'C4H8O2',
+ '(CH3)2NCHO',
+ '(CH3)2SO',
+ 'CH3CH2OH',
+ 'CH3COOCH2CH3',
+ 'ClCH2CH2Cl',
+ 'HOCH2CH2OH',
+ 'HCONH2',
+ 'HCOOH',
+ 'C3H8O3',
+ 'C6H18N3OP',
+ 'C6H14',
+ 'N2H4',
+ 'CH3OH',
+ 'CH3CH2COCH3',
+ 'CH2Cl2',
+ 'HCONHCH3',
+ 'C5H9NO',
+ 'C6H5NO2',
+ 'N2',
+ 'CH3NO2',
+ 'POCl3',
+ '(CH3)2CHOH',
+ 'C5H5N',
+ 'C4H8SO2',
+ 'C4H8O',
+ 'C6H5CH3',
+ '(CH3CH2)3N',
+ 'CF3COOH',
+ 'H2O'
+]
diff --git a/src/tcutility/data/functionals.py b/src/tcutility/data/functionals.py
index 2f57bcd4..5bd7042d 100755
--- a/src/tcutility/data/functionals.py
+++ b/src/tcutility/data/functionals.py
@@ -1,263 +1,263 @@
-'''
-Module used for obtaining information about exchange-correlation functionals.
-For example, it can be useful to obtain
-'''
-import os
-from tcutility import results, cache
-import re
-
-
-j = os.path.join
-
-
-@cache.cache
-def get(functional_name: str) -> results.Result:
- '''
- Return information about a given functional.
-
- Args:
- functional_name: the name of the functional. It should exist in the :func:`get_available_functionals` keys.
-
- Return:
- A :class:`Result ` object containing information about the functional if it exists. Else it will return ``None``.
-
- .. seealso::
- :func:`get_available_functionals` for an overview of the information returned.
- '''
- info = functionals.get(functional_name, None)
- if info is None:
- info = functionals.get(functional_name_from_path_safe_name(functional_name), None)
-
- if info is None:
- raise KeyError(f'Could not find info for functional {functional_name}.')
-
- return info
-
-
-def functional_name_from_path_safe_name(path_safe_name: str) -> results.Result:
- '''
- Return information about a given functional given its path-safe name.
- This can be useful when you want to know the functional from a path name.
-
- Return:
- A :class:`Result ` object containing information about the functional if it exists. Else it will return ``None``.
-
- .. seealso::
- :func:`get_available_functionals` for an overview of the information returned.
- '''
- for functional, functional_info in functionals.items():
- if path_safe_name.lower() == functional_info.path_safe_name.lower():
- return functional
- elif path_safe_name.replace('-', '').lower() == functional_info.path_safe_name.replace('-', '').lower():
- return functional
-
-
-
-def get_available_functionals():
- '''
- Function that returns a dictionary of all available XC-functionals.
-
- Returns:
- : A :class:`Result ` object containing information about all available XC-functionals.
- The functional names are stored as the keys and the functional information is stored as the values.
- The values contain the following information:
-
- - ``name`` **(str)** - the name of the functional.
- - ``path_safe_name`` **(str)** - the name of the functional made suitable for file paths.
- This name is the same as the normal name, but without parentheses. Asterisks are replaced with lower-case ``s``.
- - ``name_no_disp`` **(str)** - the name of functional without the dispersion correction.
- - ``category`` **(str)** - the category the functional belongs to.
- - ``dispersion`` **(str)** - the dispersion correction part of the functional name.
- - ``dispersion_name`` **(str)** - the name of the dispersion correction as it would be written in ADF.
- - ``includes_disp`` **(bool)** - whether the functional already includes a dispersion correction.
- - ``use_libxc`` **(bool)** - whether the functional is from the LibXC library.
- - ``available_in_adf`` **(bool)** - whether the functional is available in ADF.
- - ``available_in_band`` **(bool)** - whether the functional is available in BAND.
- - ``available_in_orca`` **(bool)** - whether the functional is available in ORCA.
- - ``adf_settings`` **(:class:`Result `)** - the settings that are used to select the functional in the ADF input.
- - ``name_latex`` **(str)** - the name of the functional formatted to be used with LaTeX renderers.
- - ``name_html`` **(str)** - the name of the functional formatted to be used with HTML renderers.
- - ``dois`` **(List[str])** - a list of relevant dois for this functional.
- '''
- def set_dispersion(func):
- disp_map = {
- '-D4': 'GRIMME4',
- '-D3(BJ)': 'GRIMME3 BJDAMP',
- '-D3BJ': 'GRIMME3 BJDAMP',
- '-D3': 'GRIMME3',
- '-dDsC': 'dDsC',
- '-dUFF': 'UFF',
- '-MBD': 'MBD',
- '-MBD@rsSC': 'MBD',
- '-D': 'DEFAULT'
- }
-
- # set some default values for useful parameters
- func.name_no_disp = func.name
- func.dispersion = None
- func.dispersion_name = None
-
- # go through every dispersion correction and check if we are using it
- for disp_suffix, disp_name in disp_map.items():
- if func.name.endswith(disp_suffix):
- # dispersion will be the suffix without the -
- func.dispersion = disp_suffix[1:]
- func.dispersion_name = disp_name
-
- # check if the functional already includes the dispersion correction
- if func.includes_disp:
- break
-
- # else we set the name of the functional without dispersion for later
- func.name_no_disp = func.name[:-len(disp_suffix)]
- # get the dispersion settings for ADF. Try to get custom values if they were provided.
- func.adf_settings.XC.Dispersion = func.disp_params or disp_name
- break
-
- def set_functional(func):
- # set the functional settings for ADF
- # first go through some special functionals that require special settings
- if func.name_no_disp == 'BMK':
- func.adf_settings.XC.LibXC = 'HYB_MGGA_X_BMK GGA_C_BMK'
- return
-
- if func.name in ['LCY-BLYP', 'LCY-BP86', 'LCY-PBE']:
- func.adf_settings.XC.GGA = func.name.split('-')[1]
- func.adf_settings.XC.RANGESEP = ''
- func.adf_settings.XC.xcfun = ''
- return
-
- if func.name in ['CAMY-B3LYP']:
- func.adf_settings.XC.Hybrid = 'CAMY-B3LYP'
- func.adf_settings.XC.RANGESEP = ''
- func.adf_settings.XC.xcfun = ''
- return
-
- if func.name == 'GGA:SSB-D':
- func.adf_settings.XC.GGA = 'SSB-D'
- return
-
- if func.name == 'MetaGGA:SSB-D':
- func.adf_settings.XC.MetaGGA = 'SSB-D'
- return
-
- if func.name_no_disp == 'HartreeFock':
- func.adf_settings.XC.HartreeFock = ''
- return
-
- if func.name == 'MP2':
- func.adf_settings.XC.MP2 = ''
- return
-
- if func.name in ['SOS-MP2', 'SCS-MP2']:
- func.adf_settings.XC.MP2 = ''
- func.adf_settings.XC.EmpiricalScaling = func.name[:-4]
- return
-
- # the normal functionals are defined based on their category, or selected from libxc
- if func.use_libxc:
- func.adf_settings.XC.LibXC = func.name_no_disp
- else:
- func.adf_settings.XC[func.category] = func.name_no_disp
-
- # gather all data about available functionals
- functionals = results.Result() # store all info in this dict
-
- with open(j(os.path.split(__file__)[0], 'available_functionals.txt')) as file:
- lines = file.readlines()
-
- # read the references first
- # references are given as
- # [refname] doi
- # and in-line
- # - xcname {options} [refname1][refname2]...
- dois = {}
- for line in lines:
- if not line.startswith('['):
- continue
-
- line = line.split('#')[0].strip()
-
- ref, doi = line.strip().split()
- ref = ref[1:-1]
- dois[ref] = doi
-
- for line in lines:
- # there can be empty lines
- if not line.strip():
- continue
-
- # and comment lines
- if line.startswith('#'):
- continue
-
- # we don't read the references here
- if line.startswith('['):
- continue
-
- # functional names are given starting with -
- # category names without -
- if not line.startswith('- '):
- curr_category = line.strip()
- continue
-
- line = line.split('#')[0].strip()
-
- # store data about the func in a dict
- func = results.Result()
- func.category = curr_category
- # separate the functional name from the line
- functional_name = line[2:].split('!')[0].split(',')[0].split('[')[0].strip()
- func.name = functional_name
- func.name_latex = functional_name
- func.name_html = functional_name
- func.path_safe_name = functional_name.replace(')', '').replace('(', '').replace('*', 's').replace(' ', '-')
-
- if functional_name.startswith('WB'):
- func.name_latex = func.name_latex.replace('WB', r'$\omega$B')
- func.name_html = func.name_html.replace('WB', 'ωB')
-
- if 'r2SCAN' in functional_name:
- func.name_latex = func.name_latex.replace('r2SCAN', r'r$^2$SCAN')
- func.name_html = func.name_html.replace('r2SCAN', 'r2SCAN')
-
- if 'and' in functional_name:
- func.name_latex = func.name_latex.replace('and', '&')
- func.name_html = func.name_html.replace('and', '&')
-
- if '*' in functional_name:
- func.name_latex = func.name_latex.replace('*', r'$^*$')
- func.name_html = func.name_html.replace('*', '*')
-
- if 'B2PIPLYP' in functional_name:
- func.name_latex = func.name_latex.replace('B2PIPLYP', r'B2$\pi$PLYP')
- func.name_html = func.name_html.replace('B2PIPLYP', 'B2πPLYP')
-
- # check if custom params were given for dispersion
- if 'GRIMME' in line:
- # func.disp_params = line.split('!')[0].split(',')[1].strip().strip("'")
- func.disp_params = re.findall(r"'(.*)'", line)
-
- func.use_libxc = '!libxc' in line
- func.includes_disp = '!includesdisp' in line
- func.available_in_adf = '!noadf' not in line
- func.available_in_band = '!band' in line
- func.available_in_orca = '!orca' in line
-
- # get references
- refs = re.findall(r'\[([a-zA-Z0-9]+)\]', line)
- func.dois = [dois[ref] for ref in refs]
-
- set_dispersion(func)
- set_functional(func)
-
- functionals[functional_name] = func
-
- return functionals
-
-functionals = get_available_functionals()
-
-categories = []
-for functional in functionals:
- if get(functional).category not in categories:
- categories.append(get(functional).category)
+'''
+Module used for obtaining information about exchange-correlation functionals.
+For example, it can be useful to obtain
+'''
+import os
+from tcutility import results, cache
+import re
+
+
+j = os.path.join
+
+
+@cache.cache
+def get(functional_name: str) -> results.Result:
+ '''
+ Return information about a given functional.
+
+ Args:
+ functional_name: the name of the functional. It should exist in the :func:`get_available_functionals` keys.
+
+ Return:
+ A :class:`Result ` object containing information about the functional if it exists. Else it will return ``None``.
+
+ .. seealso::
+ :func:`get_available_functionals` for an overview of the information returned.
+ '''
+ info = functionals.get(functional_name, None)
+ if info is None:
+ info = functionals.get(functional_name_from_path_safe_name(functional_name), None)
+
+ if info is None:
+ raise KeyError(f'Could not find info for functional {functional_name}.')
+
+ return info
+
+
+def functional_name_from_path_safe_name(path_safe_name: str) -> results.Result:
+ '''
+ Return information about a given functional given its path-safe name.
+ This can be useful when you want to know the functional from a path name.
+
+ Return:
+ A :class:`Result ` object containing information about the functional if it exists. Else it will return ``None``.
+
+ .. seealso::
+ :func:`get_available_functionals` for an overview of the information returned.
+ '''
+ for functional, functional_info in functionals.items():
+ if path_safe_name.lower() == functional_info.path_safe_name.lower():
+ return functional
+ elif path_safe_name.replace('-', '').lower() == functional_info.path_safe_name.replace('-', '').lower():
+ return functional
+
+
+
+def get_available_functionals():
+ '''
+ Function that returns a dictionary of all available XC-functionals.
+
+ Returns:
+ : A :class:`Result ` object containing information about all available XC-functionals.
+ The functional names are stored as the keys and the functional information is stored as the values.
+ The values contain the following information:
+
+ - ``name`` **(str)** - the name of the functional.
+ - ``path_safe_name`` **(str)** - the name of the functional made suitable for file paths.
+ This name is the same as the normal name, but without parentheses. Asterisks are replaced with lower-case ``s``.
+ - ``name_no_disp`` **(str)** - the name of functional without the dispersion correction.
+ - ``category`` **(str)** - the category the functional belongs to.
+ - ``dispersion`` **(str)** - the dispersion correction part of the functional name.
+ - ``dispersion_name`` **(str)** - the name of the dispersion correction as it would be written in ADF.
+ - ``includes_disp`` **(bool)** - whether the functional already includes a dispersion correction.
+ - ``use_libxc`` **(bool)** - whether the functional is from the LibXC library.
+ - ``available_in_adf`` **(bool)** - whether the functional is available in ADF.
+ - ``available_in_band`` **(bool)** - whether the functional is available in BAND.
+ - ``available_in_orca`` **(bool)** - whether the functional is available in ORCA.
+ - ``adf_settings`` **(:class:`Result `)** - the settings that are used to select the functional in the ADF input.
+ - ``name_latex`` **(str)** - the name of the functional formatted to be used with LaTeX renderers.
+ - ``name_html`` **(str)** - the name of the functional formatted to be used with HTML renderers.
+ - ``dois`` **(List[str])** - a list of relevant dois for this functional.
+ '''
+ def set_dispersion(func):
+ disp_map = {
+ '-D4': 'GRIMME4',
+ '-D3(BJ)': 'GRIMME3 BJDAMP',
+ '-D3BJ': 'GRIMME3 BJDAMP',
+ '-D3': 'GRIMME3',
+ '-dDsC': 'dDsC',
+ '-dUFF': 'UFF',
+ '-MBD': 'MBD',
+ '-MBD@rsSC': 'MBD',
+ '-D': 'DEFAULT'
+ }
+
+ # set some default values for useful parameters
+ func.name_no_disp = func.name
+ func.dispersion = None
+ func.dispersion_name = None
+
+ # go through every dispersion correction and check if we are using it
+ for disp_suffix, disp_name in disp_map.items():
+ if func.name.endswith(disp_suffix):
+ # dispersion will be the suffix without the -
+ func.dispersion = disp_suffix[1:]
+ func.dispersion_name = disp_name
+
+ # check if the functional already includes the dispersion correction
+ if func.includes_disp:
+ break
+
+ # else we set the name of the functional without dispersion for later
+ func.name_no_disp = func.name[:-len(disp_suffix)]
+ # get the dispersion settings for ADF. Try to get custom values if they were provided.
+ func.adf_settings.XC.Dispersion = func.disp_params or disp_name
+ break
+
+ def set_functional(func):
+ # set the functional settings for ADF
+ # first go through some special functionals that require special settings
+ if func.name_no_disp == 'BMK':
+ func.adf_settings.XC.LibXC = 'HYB_MGGA_X_BMK GGA_C_BMK'
+ return
+
+ if func.name in ['LCY-BLYP', 'LCY-BP86', 'LCY-PBE']:
+ func.adf_settings.XC.GGA = func.name.split('-')[1]
+ func.adf_settings.XC.RANGESEP = ''
+ func.adf_settings.XC.xcfun = ''
+ return
+
+ if func.name in ['CAMY-B3LYP']:
+ func.adf_settings.XC.Hybrid = 'CAMY-B3LYP'
+ func.adf_settings.XC.RANGESEP = ''
+ func.adf_settings.XC.xcfun = ''
+ return
+
+ if func.name == 'GGA:SSB-D':
+ func.adf_settings.XC.GGA = 'SSB-D'
+ return
+
+ if func.name == 'MetaGGA:SSB-D':
+ func.adf_settings.XC.MetaGGA = 'SSB-D'
+ return
+
+ if func.name_no_disp == 'HartreeFock':
+ func.adf_settings.XC.HartreeFock = ''
+ return
+
+ if func.name == 'MP2':
+ func.adf_settings.XC.MP2 = ''
+ return
+
+ if func.name in ['SOS-MP2', 'SCS-MP2']:
+ func.adf_settings.XC.MP2 = ''
+ func.adf_settings.XC.EmpiricalScaling = func.name[:-4]
+ return
+
+ # the normal functionals are defined based on their category, or selected from libxc
+ if func.use_libxc:
+ func.adf_settings.XC.LibXC = func.name_no_disp
+ else:
+ func.adf_settings.XC[func.category] = func.name_no_disp
+
+ # gather all data about available functionals
+ functionals = results.Result() # store all info in this dict
+
+ with open(j(os.path.split(__file__)[0], 'available_functionals.txt')) as file:
+ lines = file.readlines()
+
+ # read the references first
+ # references are given as
+ # [refname] doi
+ # and in-line
+ # - xcname {options} [refname1][refname2]...
+ dois = {}
+ for line in lines:
+ if not line.startswith('['):
+ continue
+
+ line = line.split('#')[0].strip()
+
+ ref, doi = line.strip().split()
+ ref = ref[1:-1]
+ dois[ref] = doi
+
+ for line in lines:
+ # there can be empty lines
+ if not line.strip():
+ continue
+
+ # and comment lines
+ if line.startswith('#'):
+ continue
+
+ # we don't read the references here
+ if line.startswith('['):
+ continue
+
+ # functional names are given starting with -
+ # category names without -
+ if not line.startswith('- '):
+ curr_category = line.strip()
+ continue
+
+ line = line.split('#')[0].strip()
+
+ # store data about the func in a dict
+ func = results.Result()
+ func.category = curr_category
+ # separate the functional name from the line
+ functional_name = line[2:].split('!')[0].split(',')[0].split('[')[0].strip()
+ func.name = functional_name
+ func.name_latex = functional_name
+ func.name_html = functional_name
+ func.path_safe_name = functional_name.replace(')', '').replace('(', '').replace('*', 's').replace(' ', '-')
+
+ if functional_name.startswith('WB'):
+ func.name_latex = func.name_latex.replace('WB', r'$\omega$B')
+ func.name_html = func.name_html.replace('WB', 'ωB')
+
+ if 'r2SCAN' in functional_name:
+ func.name_latex = func.name_latex.replace('r2SCAN', r'r$^2$SCAN')
+ func.name_html = func.name_html.replace('r2SCAN', 'r2SCAN')
+
+ if 'and' in functional_name:
+ func.name_latex = func.name_latex.replace('and', '&')
+ func.name_html = func.name_html.replace('and', '&')
+
+ if '*' in functional_name:
+ func.name_latex = func.name_latex.replace('*', r'$^*$')
+ func.name_html = func.name_html.replace('*', '*')
+
+ if 'B2PIPLYP' in functional_name:
+ func.name_latex = func.name_latex.replace('B2PIPLYP', r'B2$\pi$PLYP')
+ func.name_html = func.name_html.replace('B2PIPLYP', 'B2πPLYP')
+
+ # check if custom params were given for dispersion
+ if 'GRIMME' in line:
+ # func.disp_params = line.split('!')[0].split(',')[1].strip().strip("'")
+ func.disp_params = re.findall(r"'(.*)'", line)
+
+ func.use_libxc = '!libxc' in line
+ func.includes_disp = '!includesdisp' in line
+ func.available_in_adf = '!noadf' not in line
+ func.available_in_band = '!band' in line
+ func.available_in_orca = '!orca' in line
+
+ # get references
+ refs = re.findall(r'\[([a-zA-Z0-9]+)\]', line)
+ func.dois = [dois[ref] for ref in refs]
+
+ set_dispersion(func)
+ set_functional(func)
+
+ functionals[functional_name] = func
+
+ return functionals
+
+functionals = get_available_functionals()
+
+categories = []
+for functional in functionals:
+ if get(functional).category not in categories:
+ categories.append(get(functional).category)
diff --git a/src/tcutility/data/molecules.py b/src/tcutility/data/molecules.py
index c78c9010..6b9a9fc6 100755
--- a/src/tcutility/data/molecules.py
+++ b/src/tcutility/data/molecules.py
@@ -1,27 +1,27 @@
-from tcutility import molecule
-import os
-
-
-j = os.path.join
-
-root_dir = j(os.path.split(__file__)[0], 'molecules')
-
-
-def get(name):
- p = j(root_dir, f'{name.removesuffix(".xyz")}.xyz')
- return molecule.load(p)
-
-
-def get_molecules(tags=None):
- for f in os.listdir(root_dir):
- if not f.endswith('.xyz'):
- continue
-
- mol = get(f)
- if tags is None or any(tag in mol.flags.tags for tag in tags):
- yield mol
-
-
-if __name__ == '__main__':
- for mol in get_molecules():
- print(mol, mol.flags)
+from tcutility import molecule
+import os
+
+
+j = os.path.join
+
+root_dir = j(os.path.split(__file__)[0], 'molecules')
+
+
+def get(name):
+ p = j(root_dir, f'{name.removesuffix(".xyz")}.xyz')
+ return molecule.load(p)
+
+
+def get_molecules(tags=None):
+ for f in os.listdir(root_dir):
+ if not f.endswith('.xyz'):
+ continue
+
+ mol = get(f)
+ if tags is None or any(tag in mol.flags.tags for tag in tags):
+ yield mol
+
+
+if __name__ == '__main__':
+ for mol in get_molecules():
+ print(mol, mol.flags)
diff --git a/src/tcutility/job/ams.py b/src/tcutility/job/ams.py
index 9dfb352e..9fa55037 100644
--- a/src/tcutility/job/ams.py
+++ b/src/tcutility/job/ams.py
@@ -1,234 +1,234 @@
-from scm import plams
-import tcutility
-from tcutility import log
-from tcutility.job.generic import Job
-import os
-import numpy as np
-from typing import List
-
-j = os.path.join
-
-
-class AMSJob(Job):
- '''
- This is the AMS base job which will serve as the parent class for ADFJob, DFTBJob and the future BANDJob.
- It holds all methods related to changing the settings at the AMS level. It also handles preparing the jobs, e.g. writing runfiles and inputs.
- '''
- def __str__(self):
- return f'{self._task}({self._functional}/{self._basis_set}), running in {os.path.join(os.path.abspath(self.rundir), self.name)}'
-
- def single_point(self):
- '''
- Set the task of the job to single point.
- '''
- self._task = 'SP'
- self.settings.input.ams.task = 'SinglePoint'
-
- def transition_state(self, distances: list = None, angles: list = None, dihedrals: list = None, ModeToFollow: int = 1):
- '''
- Set the task of the job to transition state search. Optionally you can give some TS coordinates to accelerate convergence.
- By default also calculates the normal modes after convergence.
-
- Args:
- distances: sequence of tuples or lists containing [atom_index1, atom_index2, factor]. Atom indices start at 1.
- angles: sequence of tuples or lists containing [atom_index1, atom_index2, atom_index3, factor]. Atom indices start at 1.
- dihedrals: sequence of tuples or lists containing [atom_index1, atom_index2, atom_index3, atom_index4, factor]. Atom indices start at 1.
- ModeToFollow: the vibrational mode to follow during optimization.
- '''
- self._task = 'TS'
- self.settings.input.ams.task = 'TransitionStateSearch'
-
- self.settings.input.ams.TransitionStateSearch.ModeToFollow = ModeToFollow
-
- if distances is not None:
- self.settings.input.ams.TransitionStateSearch.ReactionCoordinate.Distance = [" ".join([str(x) for x in dist]) for dist in distances]
- if angles is not None:
- self.settings.input.ams.TransitionStateSearch.ReactionCoordinate.Angle = [" ".join([str(x) for x in ang]) for ang in angles]
- if dihedrals is not None:
- self.settings.input.ams.TransitionStateSearch.ReactionCoordinate.Dihedral = [" ".join([str(x) for x in dihedral]) for dihedral in dihedrals]
-
- # for TS searches we quickly calculate the hessian with DFTB
- self.settings.input.ams.GeometryOptimization.InitialHessian.Type = 'CalculateWithFastEngine'
- self.vibrations(True) # also calculate vibrations by default
-
- def optimization(self):
- '''
- Set the task of the job to geometry optimization. By default also calculates the normal modes after convergence.
- '''
- self._task = 'GO'
- self.settings.input.ams.task = 'GeometryOptimization'
- self.settings.input.ams.GeometryOptimization.InitialHessian.Type = 'CalculateWithFastEngine'
- self.vibrations(True)
-
- def IRC(self, direction: str = 'both', hess_file: str = None, step_size: float = 0.2, min_path_length: float = 0.1, max_points: int = 300):
- '''
- Set the task of the job to intrinsic reaction coordinate (IRC).
-
- Args:
- direction: the direction to take the first step into. By default it will be set to ``both``.
- hess_file: the path to a ``.rkf`` file to read the Hessian from. This is the ``adf.rkf`` file for ADF calculations.
- If set to ``None`` the Hessian will be calculated prior to starting the IRC calculation.
- step_size: the size of the step taken between each constrained optimization. By default it will be set to ``0.2`` :math:`a_0\\sqrt{Da}`.
- min_path_length: the length of the IRC path before switching to minimization. By default it will be set to ``0.1`` |angstrom|.
- max_points: the maximum number of IRC points in a direction. Be default it is set to ``300``.
- '''
- self._task = 'IRC'
- self.settings.input.ams.task = 'IRC'
- self.settings.input.ams.IRC.Direction = direction
- if hess_file:
- self.settings.input.ams.IRC.InitialHessian.File = hess_file
- self.settings.input.ams.IRC.InitialHessian.Type = 'FromFile'
- self.settings.input.ams.IRC.Step = step_size
- self.settings.input.ams.IRC.MinPathLength = min_path_length
- self.settings.input.ams.IRC.MaxPoints = max_points
-
- self.add_postscript(tcutility.job.postscripts.clean_workdir)
- self.add_postscript(tcutility.job.postscripts.write_converged_geoms)
-
- def PESScan(self, distances: list = None, angles: list = None, dihedrals: list = None, sumdists: list = None, difdists: list = None, npoints: int = 10):
- '''
- Set the task of the job to potential energy surface scan (PESScan).
-
- Args:
- distances: sequence of tuples or lists containing ``[atom_index1, atom_index2, start, end]``.
- Atom indices start at 1. Distances are given in |angstrom|.
- angles: sequence of tuples or lists containing ``[atom_index1, atom_index2, atom_index3, start, end]``.
- Atom indices start at 1. Angles are given in degrees
- dihedrals: sequence of tuples or lists containing ``[atom_index1, atom_index2, atom_index3, atom_index4, start, end]``.
- Atom indices start at 1. Angles are given in degrees
- sumdists: sequence of tuples or lists containing ``[atom_index1, atom_index2, atom_index3, atom_index4, start, end]``.
- Atom indices start at 1. Sum of distances is given in |angstrom|.
- difdists: sequence of tuples or lists containing ``[atom_index1, atom_index2, atom_index3, atom_index4, start, end]``.
- Atom indices start at 1. Difference of distances is given in |angstrom|.
- npoints: the number of PES points to optimize.
-
- .. note::
- Currently we only support generating settings for 1-dimensional PESScans.
- We will add support for N-dimensional PESScans later.
- '''
- self._task = 'PESScan'
- self.settings.input.ams.task = 'PESScan'
- self.settings.input.ams.PESScan.ScanCoordinate.nPoints = npoints
- if distances is not None:
- self.settings.input.ams.PESScan.ScanCoordinate.Distance = [" ".join([str(x) for x in dist]) for dist in distances]
- if angles is not None:
- self.settings.input.ams.PESScan.ScanCoordinate.Angle = [" ".join([str(x) for x in ang]) for ang in angles]
- if dihedrals is not None:
- self.settings.input.ams.PESScan.ScanCoordinate.Dihedral = [" ".join([str(x) for x in dihedral]) for dihedral in dihedrals]
- if sumdists is not None:
- self.settings.input.ams.PESScan.ScanCoordinate.SumDist = [" ".join([str(x) for x in dist]) for dist in sumdists]
- if difdists is not None:
- self.settings.input.ams.PESScan.ScanCoordinate.DifDist = [" ".join([str(x) for x in dist]) for dist in difdists]
-
- self.add_postscript(tcutility.job.postscripts.clean_workdir)
- self.add_postscript(tcutility.job.postscripts.write_converged_geoms)
-
- def vibrations(self, enable: bool = True, NegativeFrequenciesTolerance: float = -5):
- '''
- Set the calculation of vibrational modes.
-
- Args:
- enable: whether to calculate the vibrational modes.
- NegativeFrequenciesTolerance: the tolerance for negative modes.
- Modes with frequencies above this value will not be counted as imaginary.
- Use this option when you experience a lot of numerical noise.
- '''
- self.settings.input.ams.Properties.NormalModes = 'Yes' if enable else 'No'
- self.settings.input.ams.Properties.PESPointCharacter = 'Yes'
- self.settings.input.ams.PESPointCharacter.NegativeFrequenciesTolerance = NegativeFrequenciesTolerance
- self.settings.input.ams.NormalModes.ReScanFreqRange = '-10000000.0 10.0'
-
- def geometry_convergence(self, gradients: float = 1e-5, energy: float = 1e-5, step: float = 1e-2, stress: float = 5e-4):
- '''
- Set the convergence criteria for the geometry optimization.
-
- Args:
- gradients: the convergence criteria for the gradients during geometry optimizations. Defaults to ``1e-5``.
- energy: the convergence criteria for the energy during geometry optimizations. Defaults to ``1e-5``.
- step: the convergence criteria for the step-size during geometry optimizations. Defaults to ``1e-2``.
- stress: the convergence criteria for the stress-energy per atom during geometry optimizations. Defaults to ``5e-4``
- '''
- self.settings.input.ams.GeometryOptimization.Convergence.Gradients = gradients
- self.settings.input.ams.GeometryOptimization.Convergence.Energy = energy
- self.settings.input.ams.GeometryOptimization.Convergence.Step = step
- self.settings.input.ams.GeometryOptimization.Convergence.StressEnergyPerAtom = stress
-
- def charge(self, val: int):
- '''
- Set the charge of the system.
- '''
- self.settings.input.ams.System.Charge = val
-
- def electric_field(self, direction: List[float], magnitude: float = None):
- '''
- Set an electric field for this system.
-
- Args:
- direction: the vector with the direction and strength of the electric field.
- magnitude: if given, the direction will be normalized and magnitude will be used as the field strength.
- '''
- # if magnitude is given we normalize the direction vector and give it the correct length
- if magnitude is not None:
- direction = np.array(direction)/np.linalg.norm(direction) * magnitude
-
- ex, ey, ez = tuple(direction)
- self.settings.input.ams.System.ElectrostaticEmbedding.ElectricField = f'{ex} {ey} {ez}'
-
- def _setup_job(self):
- '''
- Set up the calculation. This will create the working directory and write the runscript and input file for ADF to use.
- '''
- os.makedirs(self.rundir, exist_ok=True)
-
- if os.path.exists(self.workdir):
- for file in os.listdir(self.workdir):
- p = os.path.join(self.workdir, file)
- if p.endswith('.rkf'):
- os.remove(p)
- if 'ams.kid' in p:
- os.remove(p)
- if p.startswith('t21.'):
- os.remove(p)
- if p.startswith('t12.'):
- os.remove(p)
-
- if not self._molecule and not self._molecule_path and 'atoms' not in self.settings.input.ams.system:
- log.error(f'You did not supply a molecule for this job. Call the {self.__class__.__name__}.molecule method to add one.')
- return
-
- if not self._molecule:
- self.settings.input.ams.system.GeometryFile = self._molecule_path
-
- # sometimes we have to check if a job is able to run or requires some special consideration
- # those types of checks should be defined in _check_job
- self._check_job()
-
- # we will use plams to write the input and runscript
- sett = self.settings.as_plams_settings()
- job = plams.AMSJob(name=self.name, molecule=self._molecule, settings=sett)
-
- os.makedirs(self.workdir, exist_ok=True)
- with open(self.inputfile_path, 'w+') as inpf:
- inpf.write(job.get_input())
-
- with open(self.runfile_path, 'w+') as runf:
- runf.write('#!/bin/sh\n\n') # the shebang is not written by default by ADF
- runf.write('\n'.join(self._preambles) + '\n\n')
- runf.write(job.get_runscript())
- runf.write('\n'.join(self._postambles))
-
- # in case we are rerunning a calculation we need to remove ams.log
- if os.path.exists(j(self.workdir, 'ams.log')):
- os.remove(j(self.workdir, 'ams.log'))
-
- return True
-
- def _check_job(self):
- ...
-
- @property
- def output_mol_path(self):
- '''
- The default file path for output molecules when running ADF calculations. It will not be created for singlepoint calculations.
- '''
- return j(self.workdir, 'output.xyz')
+from scm import plams
+import tcutility
+from tcutility import log
+from tcutility.job.generic import Job
+import os
+import numpy as np
+from typing import List
+
+j = os.path.join
+
+
+class AMSJob(Job):
+ '''
+ This is the AMS base job which will serve as the parent class for ADFJob, DFTBJob and the future BANDJob.
+ It holds all methods related to changing the settings at the AMS level. It also handles preparing the jobs, e.g. writing runfiles and inputs.
+ '''
+ def __str__(self):
+ return f'{self._task}({self._functional}/{self._basis_set}), running in {os.path.join(os.path.abspath(self.rundir), self.name)}'
+
+ def single_point(self):
+ '''
+ Set the task of the job to single point.
+ '''
+ self._task = 'SP'
+ self.settings.input.ams.task = 'SinglePoint'
+
+ def transition_state(self, distances: list = None, angles: list = None, dihedrals: list = None, ModeToFollow: int = 1):
+ '''
+ Set the task of the job to transition state search. Optionally you can give some TS coordinates to accelerate convergence.
+ By default also calculates the normal modes after convergence.
+
+ Args:
+ distances: sequence of tuples or lists containing [atom_index1, atom_index2, factor]. Atom indices start at 1.
+ angles: sequence of tuples or lists containing [atom_index1, atom_index2, atom_index3, factor]. Atom indices start at 1.
+ dihedrals: sequence of tuples or lists containing [atom_index1, atom_index2, atom_index3, atom_index4, factor]. Atom indices start at 1.
+ ModeToFollow: the vibrational mode to follow during optimization.
+ '''
+ self._task = 'TS'
+ self.settings.input.ams.task = 'TransitionStateSearch'
+
+ self.settings.input.ams.TransitionStateSearch.ModeToFollow = ModeToFollow
+
+ if distances is not None:
+ self.settings.input.ams.TransitionStateSearch.ReactionCoordinate.Distance = [" ".join([str(x) for x in dist]) for dist in distances]
+ if angles is not None:
+ self.settings.input.ams.TransitionStateSearch.ReactionCoordinate.Angle = [" ".join([str(x) for x in ang]) for ang in angles]
+ if dihedrals is not None:
+ self.settings.input.ams.TransitionStateSearch.ReactionCoordinate.Dihedral = [" ".join([str(x) for x in dihedral]) for dihedral in dihedrals]
+
+ # for TS searches we quickly calculate the hessian with DFTB
+ self.settings.input.ams.GeometryOptimization.InitialHessian.Type = 'CalculateWithFastEngine'
+ self.vibrations(True) # also calculate vibrations by default
+
+ def optimization(self):
+ '''
+ Set the task of the job to geometry optimization. By default also calculates the normal modes after convergence.
+ '''
+ self._task = 'GO'
+ self.settings.input.ams.task = 'GeometryOptimization'
+ self.settings.input.ams.GeometryOptimization.InitialHessian.Type = 'CalculateWithFastEngine'
+ self.vibrations(True)
+
+ def IRC(self, direction: str = 'both', hess_file: str = None, step_size: float = 0.2, min_path_length: float = 0.1, max_points: int = 300):
+ '''
+ Set the task of the job to intrinsic reaction coordinate (IRC).
+
+ Args:
+ direction: the direction to take the first step into. By default it will be set to ``both``.
+ hess_file: the path to a ``.rkf`` file to read the Hessian from. This is the ``adf.rkf`` file for ADF calculations.
+ If set to ``None`` the Hessian will be calculated prior to starting the IRC calculation.
+ step_size: the size of the step taken between each constrained optimization. By default it will be set to ``0.2`` :math:`a_0\\sqrt{Da}`.
+ min_path_length: the length of the IRC path before switching to minimization. By default it will be set to ``0.1`` |angstrom|.
+ max_points: the maximum number of IRC points in a direction. Be default it is set to ``300``.
+ '''
+ self._task = 'IRC'
+ self.settings.input.ams.task = 'IRC'
+ self.settings.input.ams.IRC.Direction = direction
+ if hess_file:
+ self.settings.input.ams.IRC.InitialHessian.File = hess_file
+ self.settings.input.ams.IRC.InitialHessian.Type = 'FromFile'
+ self.settings.input.ams.IRC.Step = step_size
+ self.settings.input.ams.IRC.MinPathLength = min_path_length
+ self.settings.input.ams.IRC.MaxPoints = max_points
+
+ self.add_postscript(tcutility.job.postscripts.clean_workdir)
+ self.add_postscript(tcutility.job.postscripts.write_converged_geoms)
+
+ def PESScan(self, distances: list = None, angles: list = None, dihedrals: list = None, sumdists: list = None, difdists: list = None, npoints: int = 10):
+ '''
+ Set the task of the job to potential energy surface scan (PESScan).
+
+ Args:
+ distances: sequence of tuples or lists containing ``[atom_index1, atom_index2, start, end]``.
+ Atom indices start at 1. Distances are given in |angstrom|.
+ angles: sequence of tuples or lists containing ``[atom_index1, atom_index2, atom_index3, start, end]``.
+ Atom indices start at 1. Angles are given in degrees
+ dihedrals: sequence of tuples or lists containing ``[atom_index1, atom_index2, atom_index3, atom_index4, start, end]``.
+ Atom indices start at 1. Angles are given in degrees
+ sumdists: sequence of tuples or lists containing ``[atom_index1, atom_index2, atom_index3, atom_index4, start, end]``.
+ Atom indices start at 1. Sum of distances is given in |angstrom|.
+ difdists: sequence of tuples or lists containing ``[atom_index1, atom_index2, atom_index3, atom_index4, start, end]``.
+ Atom indices start at 1. Difference of distances is given in |angstrom|.
+ npoints: the number of PES points to optimize.
+
+ .. note::
+ Currently we only support generating settings for 1-dimensional PESScans.
+ We will add support for N-dimensional PESScans later.
+ '''
+ self._task = 'PESScan'
+ self.settings.input.ams.task = 'PESScan'
+ self.settings.input.ams.PESScan.ScanCoordinate.nPoints = npoints
+ if distances is not None:
+ self.settings.input.ams.PESScan.ScanCoordinate.Distance = [" ".join([str(x) for x in dist]) for dist in distances]
+ if angles is not None:
+ self.settings.input.ams.PESScan.ScanCoordinate.Angle = [" ".join([str(x) for x in ang]) for ang in angles]
+ if dihedrals is not None:
+ self.settings.input.ams.PESScan.ScanCoordinate.Dihedral = [" ".join([str(x) for x in dihedral]) for dihedral in dihedrals]
+ if sumdists is not None:
+ self.settings.input.ams.PESScan.ScanCoordinate.SumDist = [" ".join([str(x) for x in dist]) for dist in sumdists]
+ if difdists is not None:
+ self.settings.input.ams.PESScan.ScanCoordinate.DifDist = [" ".join([str(x) for x in dist]) for dist in difdists]
+
+ self.add_postscript(tcutility.job.postscripts.clean_workdir)
+ self.add_postscript(tcutility.job.postscripts.write_converged_geoms)
+
+ def vibrations(self, enable: bool = True, NegativeFrequenciesTolerance: float = -5):
+ '''
+ Set the calculation of vibrational modes.
+
+ Args:
+ enable: whether to calculate the vibrational modes.
+ NegativeFrequenciesTolerance: the tolerance for negative modes.
+ Modes with frequencies above this value will not be counted as imaginary.
+ Use this option when you experience a lot of numerical noise.
+ '''
+ self.settings.input.ams.Properties.NormalModes = 'Yes' if enable else 'No'
+ self.settings.input.ams.Properties.PESPointCharacter = 'Yes'
+ self.settings.input.ams.PESPointCharacter.NegativeFrequenciesTolerance = NegativeFrequenciesTolerance
+ self.settings.input.ams.NormalModes.ReScanFreqRange = '-10000000.0 10.0'
+
+ def geometry_convergence(self, gradients: float = 1e-5, energy: float = 1e-5, step: float = 1e-2, stress: float = 5e-4):
+ '''
+ Set the convergence criteria for the geometry optimization.
+
+ Args:
+ gradients: the convergence criteria for the gradients during geometry optimizations. Defaults to ``1e-5``.
+ energy: the convergence criteria for the energy during geometry optimizations. Defaults to ``1e-5``.
+ step: the convergence criteria for the step-size during geometry optimizations. Defaults to ``1e-2``.
+ stress: the convergence criteria for the stress-energy per atom during geometry optimizations. Defaults to ``5e-4``
+ '''
+ self.settings.input.ams.GeometryOptimization.Convergence.Gradients = gradients
+ self.settings.input.ams.GeometryOptimization.Convergence.Energy = energy
+ self.settings.input.ams.GeometryOptimization.Convergence.Step = step
+ self.settings.input.ams.GeometryOptimization.Convergence.StressEnergyPerAtom = stress
+
+ def charge(self, val: int):
+ '''
+ Set the charge of the system.
+ '''
+ self.settings.input.ams.System.Charge = val
+
+ def electric_field(self, direction: List[float], magnitude: float = None):
+ '''
+ Set an electric field for this system.
+
+ Args:
+ direction: the vector with the direction and strength of the electric field.
+ magnitude: if given, the direction will be normalized and magnitude will be used as the field strength.
+ '''
+ # if magnitude is given we normalize the direction vector and give it the correct length
+ if magnitude is not None:
+ direction = np.array(direction)/np.linalg.norm(direction) * magnitude
+
+ ex, ey, ez = tuple(direction)
+ self.settings.input.ams.System.ElectrostaticEmbedding.ElectricField = f'{ex} {ey} {ez}'
+
+ def _setup_job(self):
+ '''
+ Set up the calculation. This will create the working directory and write the runscript and input file for ADF to use.
+ '''
+ os.makedirs(self.rundir, exist_ok=True)
+
+ if os.path.exists(self.workdir):
+ for file in os.listdir(self.workdir):
+ p = os.path.join(self.workdir, file)
+ if p.endswith('.rkf'):
+ os.remove(p)
+ if 'ams.kid' in p:
+ os.remove(p)
+ if p.startswith('t21.'):
+ os.remove(p)
+ if p.startswith('t12.'):
+ os.remove(p)
+
+ if not self._molecule and not self._molecule_path and 'atoms' not in self.settings.input.ams.system:
+ log.error(f'You did not supply a molecule for this job. Call the {self.__class__.__name__}.molecule method to add one.')
+ return
+
+ if not self._molecule:
+ self.settings.input.ams.system.GeometryFile = self._molecule_path
+
+ # sometimes we have to check if a job is able to run or requires some special consideration
+ # those types of checks should be defined in _check_job
+ self._check_job()
+
+ # we will use plams to write the input and runscript
+ sett = self.settings.as_plams_settings()
+ job = plams.AMSJob(name=self.name, molecule=self._molecule, settings=sett)
+
+ os.makedirs(self.workdir, exist_ok=True)
+ with open(self.inputfile_path, 'w+') as inpf:
+ inpf.write(job.get_input())
+
+ with open(self.runfile_path, 'w+') as runf:
+ runf.write('#!/bin/sh\n\n') # the shebang is not written by default by ADF
+ runf.write('\n'.join(self._preambles) + '\n\n')
+ runf.write(job.get_runscript())
+ runf.write('\n'.join(self._postambles))
+
+ # in case we are rerunning a calculation we need to remove ams.log
+ if os.path.exists(j(self.workdir, 'ams.log')):
+ os.remove(j(self.workdir, 'ams.log'))
+
+ return True
+
+ def _check_job(self):
+ ...
+
+ @property
+ def output_mol_path(self):
+ '''
+ The default file path for output molecules when running ADF calculations. It will not be created for singlepoint calculations.
+ '''
+ return j(self.workdir, 'output.xyz')
diff --git a/src/tcutility/job/crest.py b/src/tcutility/job/crest.py
index c126d4f5..098a4f30 100644
--- a/src/tcutility/job/crest.py
+++ b/src/tcutility/job/crest.py
@@ -1,275 +1,275 @@
-from scm import plams
-from tcutility.data import molecules
-from tcutility.job.generic import Job
-from tcutility import log
-import os
-
-
-j = os.path.join
-
-
-class CRESTJob(Job):
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.crest_path = 'crest'
- self.xtb_path = 'xtb'
- self._charge = 0
- self._spinpol = 0
- self._temp = 400
- self._mdlen = 'x1'
-
- def _setup_job(self):
- self.add_postamble('mkdir rotamers')
- self.add_postamble('mkdir conformers')
- self.add_postamble(f'split -d -l {len(self._molecule.atoms) + 2} -a 5 crest_conformers.xyz conformers/')
- self.add_postamble(f'split -d -l {len(self._molecule.atoms) + 2} -a 5 crest_rotamers.xyz rotamers/')
-
- self.add_postamble('for file in conformers/* rotamers/*')
- self.add_postamble('do')
- self.add_postamble(' mv "$file" "$file.xyz"')
- self.add_postamble('done')
-
- os.makedirs(self.workdir, exist_ok=True)
-
- self._molecule.write(j(self.workdir, 'coords.xyz'))
-
- options = [
- 'coords.xyz',
- f'-xnam "{self.xtb_path}"',
- '--noreftopo',
- f'-c {self._charge}',
- f'-u {self._spinpol}',
- f'-tnmd {self._temp}',
- f'-mdlen {self._mdlen}',
- ]
-
- options = ' '.join(options)
-
- with open(self.runfile_path, 'w+') as runf:
- runf.write('#!/bin/sh\n\n') # the shebang is not written by default by ADF
- runf.write('\n'.join(self._preambles) + '\n\n')
- runf.write(f'{self.crest_path} {options}\n')
- runf.write('\n'.join(self._postambles))
-
- return True
-
- def spin_polarization(self, val: int):
- '''
- Set the spin-polarization of the system.
- '''
- self._spinpol = val
-
- def multiplicity(self, val: int):
- '''
- Set the multiplicity of the system. If the value is not one the calculation will also be unrestricted.
- We use the following values:
-
- 1) singlet
- 2) doublet
- 3) triplet
- 4) ...
-
- The multiplicity is equal to 2*S+1 for spin-polarization of S.
- '''
- self._spinpol = (val - 1)//2
-
- def charge(self, val: int):
- '''
- Set the charge of the system.
- '''
- self._charge = val
-
- def md_temperature(self, val: float):
- '''
- Set the temperature of the molecular dynamics steps. Defaults to 400K.
- '''
- self._temp = val
-
- def md_length(self, val: float):
- '''
- Set the length of the molecular dynamics steps. The default length will be multiplied by this value, e.g. the default value is 1.
- '''
- self._mdlen = f'x{val}'
-
- @property
- def best_conformer_path(self):
- return j(self.workdir, 'crest_best.xyz')
-
- @property
- def conformer_directory(self):
- return j(self.workdir, 'conformers')
-
- @property
- def rotamer_directory(self):
- return j(self.workdir, 'rotamers')
-
- def get_conformer_xyz(self, number: int = None):
- '''
- Return paths to conformer xyz files for this job.
-
- Args:
- number: the number of files to return, defaults to 10. If the directory already exists, for example if the job was already run, we will return up to `number` files.
- '''
- if os.path.exists(self.conformer_directory):
- return [j(self.conformer_directory, file) for i, file in enumerate(sorted(os.listdir(self.conformer_directory)))]
-
- for i in range(number or 10):
- yield j(self.conformer_directory, f'{str(i).zfill(5)}.xyz')
-
- def get_rotamer_xyz(self, number: int = None):
- '''
- Return paths to rotamer xyz files for this job.
-
- Args:
- number: the number of files to return, defaults to 10. If the directory already exists, for example if the job was already run, we will return up to `number` files.
- '''
- if os.path.exists(self.rotamer_directory):
- return [j(self.rotamer_directory, file) for i, file in enumerate(os.listdir(self.rotamer_directory))]
-
- for i in range(number or 10):
- yield j(self.rotamer_directory, f'{str(i).zfill(5)}.xyz')
-
-
-class QCGJob(CRESTJob):
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.crest_path = 'crest'
- self._nsolv = 10
- self._fix_solute = False
- self._ensemble_generation_mode = 'NCI-MTD'
- self._solvent = None
- self._nofix = True
-
- def solvent(self, mol, nsolv=None):
- if self._nsolv:
- self._nsolv = nsolv
-
- if isinstance(mol, plams.Molecule):
- self._solvent = mol
-
- elif isinstance(mol, str) and os.path.exists(mol):
- self._solvent = plams.Molecule(mol)
-
- elif isinstance(mol, str):
- # here we can get the molecule name using tcutility.data.molecules
- self._solvent = molecules.get(mol)
- # we can check if the alpb solvent name is defined in the xyz file
- alpb = self._solvent.flags.get('alpb', None)
- if alpb:
- self.alpb(alpb)
-
- elif isinstance(mol, list) and isinstance(mol[0], plams.Atom):
- self._solvent = plams.Molecule()
- [self._solvent.add_atom(atom) for atom in mol]
-
- elif isinstance(mol, plams.Atom):
- self._solvent = plams.Molecule()
- self._solvent.add_atom(mol)
-
- def nsolv(self, nsolv):
- self._nsolv = nsolv
-
- def alpb(self, solvent):
- self._alpb = solvent
-
- def ensemble_mode(self, mode):
- self._ensemble_generation_mode = mode
-
- def nofix(self, enable=True):
- self._nofix = enable
-
- def _setup_job(self):
- self.add_postamble('mkdir ensemble/ensemble')
- self.add_postamble(f'split -d -l {len(self._molecule.atoms) + len(self._solvent.atoms) * self._nsolv + 2} -a 5 ensemble/final_ensemble.xyz ensemble/ensemble')
-
- self.add_postamble('for file in ensemble/ensemble/*')
- self.add_postamble('do')
- self.add_postamble(' mv "$file" "$file.xyz"')
- self.add_postamble('done')
-
- if not self._solvent:
- log.error(f'Did not provide a solvent molecule for this job. Call the {self.__class__.__name__}.solvent method to add one.')
-
- os.makedirs(self.workdir, exist_ok=True)
-
- self._molecule.write(j(self.workdir, 'coords.xyz'))
- self._solvent.write(j(self.workdir, 'solvent.xyz'))
-
- ensemble_mode_option = {
- 'NCI-MTD': '--ncimtd',
- 'MD': '--md',
- 'MTD': '--mtd',
- }.get(self._ensemble_generation_mode, self._ensemble_generation_mode)
-
- options = [
- 'coords.xyz',
- f'-xnam "{self.xtb_path}"',
- '--qcg solvent.xyz',
- '--ensemble',
- f'--nsolv {self._nsolv}',
- f'--chrg {self._charge}',
- f'--uhf {self._spinpol}',
- f'--tnmd {self._temp}',
- f'--mdlen {50 * float(self._mdlen[1:])}',
- ensemble_mode_option,
- ]
-
- if self._alpb:
- options.append(f'--alpb {self._alpb}')
-
- if self._nofix:
- options.append('--nofix')
-
- options = ' '.join(options)
-
- with open(self.runfile_path, 'w+') as runf:
- runf.write('#!/bin/sh\n\n')
- runf.write('\n'.join(self._preambles) + '\n\n')
- runf.write(f'{self.crest_path} {options}\n')
- runf.write('\n'.join(self._postambles))
-
- return True
-
- @property
- def ensemble_directory(self):
- return j(self.workdir, 'ensemble', 'ensemble')
-
- def get_ensemble_xyz(self, number: int = None):
- '''
- Return paths to conformer xyz files for this job.
-
- Args:
- number: the number of files to return, defaults to 10. If the directory already exists, for example if the job was already run, we will return up to `number` files.
- '''
- if os.path.exists(self.ensemble_directory):
- return [j(self.ensemble_directory, file) for i, file in enumerate(sorted(os.listdir(self.ensemble_directory)))]
-
- for i in range(number or 10):
- yield j(self.ensemble_directory, f'{str(i).zfill(5)}.xyz')
-
- @property
- def best_ensemble_path(self):
- return j(self.workdir, 'ensemble', 'ensemble', 'crest_best.xyz')
-
-
-if __name__ == '__main__':
- # with CRESTJob() as job:
- # job.rundir = 'tmp/SN2'
- # job.name = 'CREST'
- # job.molecule('../../../test/fixtures/xyz/transitionstate_radical_addition.xyz')
- # job.sbatch(p='tc', ntasks_per_node=32)
-
- with QCGJob(test_mode=True) as job:
- job.rundir = 'calculations/Ammonia'
- job.name = 'QCG'
- job.molecule('ammonia.xyz')
- job.solvent('water', 10)
- print(job._solvent)
- job.sbatch(p='tc', n=32)
-
- # for i in range(40):
- # with CRESTJob(test_mode=False, overwrite=True) as job:
- # job.rundir = 'tmp/SN2'
- # job.name = 'CREST'
- # job.molecule('../../../test/fixtures/xyz/transitionstate_radical_addition.xyz')
- # job.sbatch(p='tc', ntasks_per_node=32)
+from scm import plams
+from tcutility.data import molecules
+from tcutility.job.generic import Job
+from tcutility import log
+import os
+
+
+j = os.path.join
+
+
+class CRESTJob(Job):
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.crest_path = 'crest'
+ self.xtb_path = 'xtb'
+ self._charge = 0
+ self._spinpol = 0
+ self._temp = 400
+ self._mdlen = 'x1'
+
+ def _setup_job(self):
+ self.add_postamble('mkdir rotamers')
+ self.add_postamble('mkdir conformers')
+ self.add_postamble(f'split -d -l {len(self._molecule.atoms) + 2} -a 5 crest_conformers.xyz conformers/')
+ self.add_postamble(f'split -d -l {len(self._molecule.atoms) + 2} -a 5 crest_rotamers.xyz rotamers/')
+
+ self.add_postamble('for file in conformers/* rotamers/*')
+ self.add_postamble('do')
+ self.add_postamble(' mv "$file" "$file.xyz"')
+ self.add_postamble('done')
+
+ os.makedirs(self.workdir, exist_ok=True)
+
+ self._molecule.write(j(self.workdir, 'coords.xyz'))
+
+ options = [
+ 'coords.xyz',
+ f'-xnam "{self.xtb_path}"',
+ '--noreftopo',
+ f'-c {self._charge}',
+ f'-u {self._spinpol}',
+ f'-tnmd {self._temp}',
+ f'-mdlen {self._mdlen}',
+ ]
+
+ options = ' '.join(options)
+
+ with open(self.runfile_path, 'w+') as runf:
+ runf.write('#!/bin/sh\n\n') # the shebang is not written by default by ADF
+ runf.write('\n'.join(self._preambles) + '\n\n')
+ runf.write(f'{self.crest_path} {options}\n')
+ runf.write('\n'.join(self._postambles))
+
+ return True
+
+ def spin_polarization(self, val: int):
+ '''
+ Set the spin-polarization of the system.
+ '''
+ self._spinpol = val
+
+ def multiplicity(self, val: int):
+ '''
+ Set the multiplicity of the system. If the value is not one the calculation will also be unrestricted.
+ We use the following values:
+
+ 1) singlet
+ 2) doublet
+ 3) triplet
+ 4) ...
+
+ The multiplicity is equal to 2*S+1 for spin-polarization of S.
+ '''
+ self._spinpol = (val - 1)//2
+
+ def charge(self, val: int):
+ '''
+ Set the charge of the system.
+ '''
+ self._charge = val
+
+ def md_temperature(self, val: float):
+ '''
+ Set the temperature of the molecular dynamics steps. Defaults to 400K.
+ '''
+ self._temp = val
+
+ def md_length(self, val: float):
+ '''
+ Set the length of the molecular dynamics steps. The default length will be multiplied by this value, e.g. the default value is 1.
+ '''
+ self._mdlen = f'x{val}'
+
+ @property
+ def best_conformer_path(self):
+ return j(self.workdir, 'crest_best.xyz')
+
+ @property
+ def conformer_directory(self):
+ return j(self.workdir, 'conformers')
+
+ @property
+ def rotamer_directory(self):
+ return j(self.workdir, 'rotamers')
+
+ def get_conformer_xyz(self, number: int = None):
+ '''
+ Return paths to conformer xyz files for this job.
+
+ Args:
+ number: the number of files to return, defaults to 10. If the directory already exists, for example if the job was already run, we will return up to `number` files.
+ '''
+ if os.path.exists(self.conformer_directory):
+ return [j(self.conformer_directory, file) for i, file in enumerate(sorted(os.listdir(self.conformer_directory)))]
+
+ for i in range(number or 10):
+ yield j(self.conformer_directory, f'{str(i).zfill(5)}.xyz')
+
+ def get_rotamer_xyz(self, number: int = None):
+ '''
+ Return paths to rotamer xyz files for this job.
+
+ Args:
+ number: the number of files to return, defaults to 10. If the directory already exists, for example if the job was already run, we will return up to `number` files.
+ '''
+ if os.path.exists(self.rotamer_directory):
+ return [j(self.rotamer_directory, file) for i, file in enumerate(os.listdir(self.rotamer_directory))]
+
+ for i in range(number or 10):
+ yield j(self.rotamer_directory, f'{str(i).zfill(5)}.xyz')
+
+
+class QCGJob(CRESTJob):
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.crest_path = 'crest'
+ self._nsolv = 10
+ self._fix_solute = False
+ self._ensemble_generation_mode = 'NCI-MTD'
+ self._solvent = None
+ self._nofix = True
+
+ def solvent(self, mol, nsolv=None):
+ if self._nsolv:
+ self._nsolv = nsolv
+
+ if isinstance(mol, plams.Molecule):
+ self._solvent = mol
+
+ elif isinstance(mol, str) and os.path.exists(mol):
+ self._solvent = plams.Molecule(mol)
+
+ elif isinstance(mol, str):
+ # here we can get the molecule name using tcutility.data.molecules
+ self._solvent = molecules.get(mol)
+ # we can check if the alpb solvent name is defined in the xyz file
+ alpb = self._solvent.flags.get('alpb', None)
+ if alpb:
+ self.alpb(alpb)
+
+ elif isinstance(mol, list) and isinstance(mol[0], plams.Atom):
+ self._solvent = plams.Molecule()
+ [self._solvent.add_atom(atom) for atom in mol]
+
+ elif isinstance(mol, plams.Atom):
+ self._solvent = plams.Molecule()
+ self._solvent.add_atom(mol)
+
+ def nsolv(self, nsolv):
+ self._nsolv = nsolv
+
+ def alpb(self, solvent):
+ self._alpb = solvent
+
+ def ensemble_mode(self, mode):
+ self._ensemble_generation_mode = mode
+
+ def nofix(self, enable=True):
+ self._nofix = enable
+
+ def _setup_job(self):
+ self.add_postamble('mkdir ensemble/ensemble')
+ self.add_postamble(f'split -d -l {len(self._molecule.atoms) + len(self._solvent.atoms) * self._nsolv + 2} -a 5 ensemble/final_ensemble.xyz ensemble/ensemble')
+
+ self.add_postamble('for file in ensemble/ensemble/*')
+ self.add_postamble('do')
+ self.add_postamble(' mv "$file" "$file.xyz"')
+ self.add_postamble('done')
+
+ if not self._solvent:
+ log.error(f'Did not provide a solvent molecule for this job. Call the {self.__class__.__name__}.solvent method to add one.')
+
+ os.makedirs(self.workdir, exist_ok=True)
+
+ self._molecule.write(j(self.workdir, 'coords.xyz'))
+ self._solvent.write(j(self.workdir, 'solvent.xyz'))
+
+ ensemble_mode_option = {
+ 'NCI-MTD': '--ncimtd',
+ 'MD': '--md',
+ 'MTD': '--mtd',
+ }.get(self._ensemble_generation_mode, self._ensemble_generation_mode)
+
+ options = [
+ 'coords.xyz',
+ f'-xnam "{self.xtb_path}"',
+ '--qcg solvent.xyz',
+ '--ensemble',
+ f'--nsolv {self._nsolv}',
+ f'--chrg {self._charge}',
+ f'--uhf {self._spinpol}',
+ f'--tnmd {self._temp}',
+ f'--mdlen {50 * float(self._mdlen[1:])}',
+ ensemble_mode_option,
+ ]
+
+ if self._alpb:
+ options.append(f'--alpb {self._alpb}')
+
+ if self._nofix:
+ options.append('--nofix')
+
+ options = ' '.join(options)
+
+ with open(self.runfile_path, 'w+') as runf:
+ runf.write('#!/bin/sh\n\n')
+ runf.write('\n'.join(self._preambles) + '\n\n')
+ runf.write(f'{self.crest_path} {options}\n')
+ runf.write('\n'.join(self._postambles))
+
+ return True
+
+ @property
+ def ensemble_directory(self):
+ return j(self.workdir, 'ensemble', 'ensemble')
+
+ def get_ensemble_xyz(self, number: int = None):
+ '''
+ Return paths to conformer xyz files for this job.
+
+ Args:
+ number: the number of files to return, defaults to 10. If the directory already exists, for example if the job was already run, we will return up to `number` files.
+ '''
+ if os.path.exists(self.ensemble_directory):
+ return [j(self.ensemble_directory, file) for i, file in enumerate(sorted(os.listdir(self.ensemble_directory)))]
+
+ for i in range(number or 10):
+ yield j(self.ensemble_directory, f'{str(i).zfill(5)}.xyz')
+
+ @property
+ def best_ensemble_path(self):
+ return j(self.workdir, 'ensemble', 'ensemble', 'crest_best.xyz')
+
+
+if __name__ == '__main__':
+ # with CRESTJob() as job:
+ # job.rundir = 'tmp/SN2'
+ # job.name = 'CREST'
+ # job.molecule('../../../test/fixtures/xyz/transitionstate_radical_addition.xyz')
+ # job.sbatch(p='tc', ntasks_per_node=32)
+
+ with QCGJob(test_mode=True) as job:
+ job.rundir = 'calculations/Ammonia'
+ job.name = 'QCG'
+ job.molecule('ammonia.xyz')
+ job.solvent('water', 10)
+ print(job._solvent)
+ job.sbatch(p='tc', n=32)
+
+ # for i in range(40):
+ # with CRESTJob(test_mode=False, overwrite=True) as job:
+ # job.rundir = 'tmp/SN2'
+ # job.name = 'CREST'
+ # job.molecule('../../../test/fixtures/xyz/transitionstate_radical_addition.xyz')
+ # job.sbatch(p='tc', ntasks_per_node=32)
diff --git a/src/tcutility/job/dftb.py b/src/tcutility/job/dftb.py
index 3bb38ba9..71ceb5ab 100644
--- a/src/tcutility/job/dftb.py
+++ b/src/tcutility/job/dftb.py
@@ -1,78 +1,78 @@
-from tcutility.job.ams import AMSJob
-from tcutility import results
-import os
-
-
-j = os.path.join
-
-
-class DFTBJob(AMSJob):
- '''
- Setup and run a density functional with tight-binding (DFTB) calculation as implemented in the Amsterdam modelling suite (AMS).
- This class supports all methods of the parent :class:`AMSJob `.
- '''
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.settings = results.Result()
- self._model = None
- self.kspace('Good')
- self.single_point()
- self.model('GFN1-xTB')
- self.solvent('vacuum')
-
- def kspace(self, quality: str = 'Good'):
- '''
- Set the k-space integration quality for this job.
-
- Args:
- quality: the type of basis-set to use. Default is ``Good``.
- '''
- self.settings.input.DFTB.kspace.quality = quality
-
- def model(self, name: str = 'GFN1-xTB', dispersion: str = None, parameter_dir: str = None):
- '''
- Set the model Hamiltonian for the job to use.
-
- Args:
- name: name of the model Hamiltonian. This is the same name as the one in the DFTB gui. Default is ``GFN1-xTB``.
- '''
- self.settings.input.DFTB.Model = name
-
- if dispersion is None:
- for disp_suffix in ['-UFF', '-ULG', '-D2', '-D3-BJ', '-D4', '-Auto']:
- if not name.endswith(disp_suffix):
- continue
- self.settings.input.DFTB.DispersionCorrection = disp_suffix[1:]
- self.settings.input.DFTB.Model[:-len(disp_suffix)]
- else:
- self.settings.input.DFTB.DispersionCorrection = dispersion
-
- if parameter_dir:
- self.settings.input.DFTB.ResourcesDir = parameter_dir
-
- def solvent(self, name: str = None, grid_size=974):
- '''
- Model solvation using the GBSA model.
-
- Args:
- name: the name of the solvent you want to use. Must be ``None``, ``Acetone``, ``Acetonitrile``, ``CHCl3``, ``CS2``, ``DMSO``, ``Ether``, ``H2O``, ``Methanol``, ``THF`` or ``Toluene``.
- grid_size: the size of the grid used to construct the solvent accessible surface. Must be ``230``, ``974``, ``2030`` or ``5810``.
- '''
- if name == 'vacuum':
- self.settings.input.DFTB.pop('solvation', None)
- return
-
- self.settings.input.DFTB.Solvation.Solvent = name
- self.settings.input.DFTB.Solvation.SurfaceGrid = grid_size
-
-
-if __name__ == '__main__':
- with DFTBJob(test_mode=False, overwrite=True) as job:
- job.rundir = 'tmp/SN2'
- job.name = 'DFTB'
- job.molecule('../../../test/fixtures/xyz/transitionstate_radical_addition.xyz')
- job.sbatch(p='tc', ntasks_per_node=15)
- job.model('GFN1-xTB')
- job.optimization()
- job.kspace('Good')
- job.solvent('H2O')
+from tcutility.job.ams import AMSJob
+from tcutility import results
+import os
+
+
+j = os.path.join
+
+
+class DFTBJob(AMSJob):
+ '''
+ Setup and run a density functional with tight-binding (DFTB) calculation as implemented in the Amsterdam modelling suite (AMS).
+ This class supports all methods of the parent :class:`AMSJob `.
+ '''
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.settings = results.Result()
+ self._model = None
+ self.kspace('Good')
+ self.single_point()
+ self.model('GFN1-xTB')
+ self.solvent('vacuum')
+
+ def kspace(self, quality: str = 'Good'):
+ '''
+ Set the k-space integration quality for this job.
+
+ Args:
+ quality: the type of basis-set to use. Default is ``Good``.
+ '''
+ self.settings.input.DFTB.kspace.quality = quality
+
+ def model(self, name: str = 'GFN1-xTB', dispersion: str = None, parameter_dir: str = None):
+ '''
+ Set the model Hamiltonian for the job to use.
+
+ Args:
+ name: name of the model Hamiltonian. This is the same name as the one in the DFTB gui. Default is ``GFN1-xTB``.
+ '''
+ self.settings.input.DFTB.Model = name
+
+ if dispersion is None:
+ for disp_suffix in ['-UFF', '-ULG', '-D2', '-D3-BJ', '-D4', '-Auto']:
+ if not name.endswith(disp_suffix):
+ continue
+ self.settings.input.DFTB.DispersionCorrection = disp_suffix[1:]
+ self.settings.input.DFTB.Model[:-len(disp_suffix)]
+ else:
+ self.settings.input.DFTB.DispersionCorrection = dispersion
+
+ if parameter_dir:
+ self.settings.input.DFTB.ResourcesDir = parameter_dir
+
+ def solvent(self, name: str = None, grid_size=974):
+ '''
+ Model solvation using the GBSA model.
+
+ Args:
+ name: the name of the solvent you want to use. Must be ``None``, ``Acetone``, ``Acetonitrile``, ``CHCl3``, ``CS2``, ``DMSO``, ``Ether``, ``H2O``, ``Methanol``, ``THF`` or ``Toluene``.
+ grid_size: the size of the grid used to construct the solvent accessible surface. Must be ``230``, ``974``, ``2030`` or ``5810``.
+ '''
+ if name == 'vacuum':
+ self.settings.input.DFTB.pop('solvation', None)
+ return
+
+ self.settings.input.DFTB.Solvation.Solvent = name
+ self.settings.input.DFTB.Solvation.SurfaceGrid = grid_size
+
+
+if __name__ == '__main__':
+ with DFTBJob(test_mode=False, overwrite=True) as job:
+ job.rundir = 'tmp/SN2'
+ job.name = 'DFTB'
+ job.molecule('../../../test/fixtures/xyz/transitionstate_radical_addition.xyz')
+ job.sbatch(p='tc', ntasks_per_node=15)
+ job.model('GFN1-xTB')
+ job.optimization()
+ job.kspace('Good')
+ job.solvent('H2O')
diff --git a/src/tcutility/job/generic.py b/src/tcutility/job/generic.py
index f82bbef4..ac80b0ca 100644
--- a/src/tcutility/job/generic.py
+++ b/src/tcutility/job/generic.py
@@ -1,328 +1,328 @@
-import os
-import shutil
-import stat
-import subprocess as sp
-from typing import List, Union
-
-import dictfunc
-from scm import plams
-
-from tcutility import log, molecule, results, slurm
-from tcutility.environment import OSName, get_os_name
-from tcutility.errors import TCJobError
-
-j = os.path.join
-
-
-def _python_path():
- """
- Sometimes it is necessary to have the Python path as some environments don't have its path.
- This function attempts to find the Python path and returns it.
- """
- python = sp.run("which python", shell=True, capture_output=True).stdout.decode().strip()
-
- if python == "" or not os.path.exists(python):
- python = sp.run("which python3", shell=True, capture_output=True).stdout.decode().strip()
-
- # we default to the python executable
- if python == "" or not os.path.exists(python):
- python = "python"
-
- return python
-
-
-class Job:
- """This is the base Job class used to build more advanced classes such as :class:`AMSJob ` and :class:`ORCAJob `.
- The base class contains an empty :class:`Result ` object that holds the settings.
- It also provides :meth:`__enter__` and :meth:`__exit__` methods to make use of context manager syntax.
-
- All class methods are in principle safe to overwrite, but the :meth:`_setup_job` method **must** be overwritten.
-
- Args:
- test_mode: whether to enable the testing mode. If enabled, the job will be setup like normally, but the running step is skipped. This is useful if you want to know what the job settings look like before running the real calculations.
- overwrite: whether to overwrite a previously run job in the same working directory.
- wait_for_finish: whether to wait for this job to finish running before continuing your runscript.
- delete_on_finish: whether to remove the workdir for this job after it is finished running.
- """
-
- def __init__(
- self, *base_jobs: List["Job"], test_mode: bool = None, overwrite: bool = None, wait_for_finish: bool = None, delete_on_finish: bool = None, delete_on_fail: bool = None, use_slurm: bool = True
- ):
- self._sbatch = results.Result()
- self._molecule = None
- self._molecule_path = None
- self.slurm_job_id = None
- self.name = "calc"
- self.rundir = "tmp"
- self._preambles = []
- self._postambles = []
- self._postscripts = []
-
- self.test_mode = test_mode
- self.overwrite = overwrite
- self.wait_for_finish = wait_for_finish
- self.delete_on_finish = delete_on_finish
- self.use_slurm = use_slurm
-
- # update this job with base_jobs
- for base_job in base_jobs:
- self.__dict__.update(base_job.copy().__dict__)
-
- self.test_mode = self.test_mode if test_mode is None else test_mode
- self.overwrite = self.overwrite if overwrite is None else overwrite
- self.wait_for_finish = self.wait_for_finish if wait_for_finish is None else wait_for_finish
- self.delete_on_finish = self.delete_on_finish if delete_on_finish is None else delete_on_finish
- self.delete_on_fail = delete_on_fail if delete_on_fail is None else delete_on_fail
- self.use_slurm = self.use_slurm if use_slurm is None else use_slurm
-
- def __enter__(self):
- return self
-
- def __exit__(self, exc_type, exc_value, exc_tb):
- if exc_type:
- fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
- log.error(f'Job set-up failed with exception: {exc_type.__name__}({exc_value}) in File "{fname}", line {exc_tb.tb_lineno}.')
- return True
- self.run()
-
- def can_skip(self):
- """
- Check whether the job can be skipped. We check this by loading the calculation and checking if the job status was fatal.
- Fatal in this case means that the job failed, canceled or could not be found. In those cases we want to run the job.
-
- .. note::
- This method works for the :class:`ADFJob `, :class:`ADFFragmentJob `,
- :class:`DFTBJob ` and :class:`ORCAJob ` objects, but not
- yet for :class:`CRESTJob ` and :class:`QCGJob `. For the latter objects the job will always be rerun.
- This will be fixed in a later version of TCutility.
- """
- res = results.read(self.workdir)
- return not res.status.fatal
-
- def in_queue(self):
- """
- Check whether the job is currently managed by slurm.
- We check this by loading the calculation and checking if the job status is 'RUNNING', 'COMPLETING', 'CONFIGURING' or 'PENDING'.
- """
- res = results.read(self.workdir)
- return res.status.name in ["RUNNING", "COMPLETING", "CONFIGURING", "PENDING"]
-
- def __repr__(self):
- return f"{type(self)}(name={self.name}, rundir={self.rundir})"
-
- def sbatch(self, **kwargs):
- """
- Change slurm settings, for example, to change the partition or change the number of cores to use.
- The arguments are the same as you would use for sbatch (`see sbatch manual `_). E.g. to change the partition to 'tc' call:
-
- ``job.sbatch(p='tc')`` or ``job.sbatch(partition='tc')``.
-
- Flags can be set as arguments with a boolean to enable or disable them:
-
- ``job.sbatch(exclusive=True)`` will set the ``--exclusive`` flag.
-
- .. warning::
-
- Note that some sbatch options, such as ``--job-name`` contain a dash, which cannot be used in Python arguments.
- To use these options you should use an underscore, like ``job.sbatch(job_name='water_dimer_GO')``.
-
- .. note::
-
- When running the job using sbatch we add a few extra default options:
-
- * ``-D/--chdir {self.workdir}`` to make sure the job starts in the correct directory
- * ``-J/--job-name {self.rundir}/{self.name}`` to give a nicer job-name when calling squeue
- * ``-o/--output {self.name}.out`` to redirect the output from the default slurm-{id}.out
-
- You can still overwrite them if you wish.
- """
- for key, value in kwargs.items():
- if key == "dependency" and "dependency" in self._sbatch:
- value = self._sbatch["dependency"] + "," + value
- self._sbatch[key] = value
-
- def _setup_job(self):
- """
- Set up the current job. This method should create the working directory, runscript and input file.
- Method must return True if it was successful.
- """
- raise NotImplementedError("You must implement the _setup_job method in your subclass.")
-
- def run(self):
- """
- Run this job. We detect if we are using slurm. If we are we submit this job using sbatch. Otherwise, we will run the job locally.
- """
- if self.overwrite:
- shutil.rmtree(self.workdir)
- os.makedirs(self.workdir, exist_ok=True)
-
- if self.can_skip():
- log.info(f"Skipping calculation {j(self.rundir, self.name)}, it is already finished or currently pending or running.")
- return
-
- # write the post-script calls to the post-ambles:
- if self.delete_on_finish:
- self.add_postamble(f"rm -r {self.workdir}")
-
- if self.delete_on_fail:
- self.add_postamble("# this will delete the calculation if it failed")
- self.add_postamble(f"if [[ `tc read -s {self.workdir}` = FAILED || `tc read -s {self.workdir}` = UNKNOWN ]]; then rm -r {self.workdir}; fi;")
-
- for postscript in self._postscripts:
- self._postambles.append(f'{_python_path()} {postscript[0]} {" ".join(postscript[1])}')
-
- # setup the job and check if it was successfull
- setup_success = self._setup_job()
-
- if self.test_mode or not setup_success:
- return
-
- if slurm.has_slurm() and self.use_slurm:
- # set some default sbatch settings
- if any(option not in self._sbatch for option in ["D", "chdir"]):
- self._sbatch.setdefault("D", self.workdir)
- if any(option not in self._sbatch for option in ["J", "job_name"]):
- self._sbatch.setdefault("J", f"{self.rundir}/{self.name}")
- if any(option not in self._sbatch for option in ["o", "output"]):
- self._sbatch.setdefault("o", f"{self.name}.out")
- self._sbatch.prune()
-
- # submit the job with sbatch
- sbatch_result = slurm.sbatch(os.path.split(self.runfile_path)[1], **self._sbatch)
-
- # store the slurm job ID
- self.slurm_job_id = sbatch_result.id
- # and write the command to a file so we can rerun it later
- with open(j(self.workdir, "submit.sh"), "w+") as cmd_file:
- cmd_file.write(sbatch_result.command)
- # make the submit command executable
- os.chmod(j(self.workdir, "submit.sh"), stat.S_IRWXU)
-
- # if we requested the job to hold we will wait for the slurm job to finish
- if self.wait_for_finish:
- slurm.wait_for_job(self.slurm_job_id)
- else:
- os_name = get_os_name()
-
- if os_name == OSName.Windows:
- raise TCJobError("Generic Job", "Running jobs on Windows is not supported.")
-
- # if we are not using slurm, we can execute the file. For this we need special permissions, so we have to set that first.
- os.chmod(self.runfile_path, os.stat(self.runfile_path).st_mode | stat.S_IEXEC)
-
- runfile_dir, runscript = os.path.split(self.runfile_path)
- command = ["./" + runscript] if os.name == "posix" else ["sh", runscript]
- print(f"Running command: {command} in directory: {runfile_dir}")
-
- with open(f"{os.path.split(self.runfile_path)[0]}/{self.name}.out", "w+") as out:
- sp.run(command, cwd=runfile_dir, stdout=out, shell=True)
-
- def add_preamble(self, line: str):
- """
- Add a preamble for the runscript. This should come after the shebang, but before the calculation is ran by the program (ADF or ORCA).
- This can used, for example, to load some modules. E.g. to load a specific version of AMS we can call:
- job.add_preamble('module load ams/2023.101')
- """
- self._preambles.append(line)
-
- def add_postamble(self, line: str):
- """
- Add a postamble for the runscript. This should come after the calculation is ran by the program (ADF or ORCA).
- This can be used, for example, to remove or copy some files. E.g. to remove all t12.* files we can call:
- job.add_postamble('rm t12.*')
- """
- self._postambles.append(line)
-
- def add_postscript(self, script, *args):
- """
- Add a post-script to this calculation.
- This should be either a Python module with a __file__ attribute or the path to a Python script.
- The post-script will be called with Python and any given args will be added as arguments when calling the script.
-
- Args:
- script: a Python object with a __file__ attribute or the file-path to a script.
- *args: positional arguments to pass to the post-script.
- """
- if not isinstance(script, str):
- script = script.__file__
- self._postscripts.append((script, args))
-
- def dependency(self, otherjob: "Job"):
- """
- Set a dependency between this job and otherjob.
- This means that this job will run after the other job is finished running succesfully.
- """
- if otherjob.can_skip() and not otherjob.in_queue():
- return
-
- if hasattr(otherjob, "slurm_job_id"):
- self.sbatch(dependency=f"afterok:{otherjob.slurm_job_id}")
- self.sbatch(kill_on_invalid_dep="Yes")
-
- @property
- def workdir(self):
- """
- The working directory of this job. All important files are written here, for example the input file and runscript.
- """
- return j(os.path.abspath(self.rundir), self.name)
-
- @property
- def runfile_path(self):
- """
- The file path to the runscript of this job.
- """
- return j(self.workdir, f"{self.name}.run")
-
- @property
- def inputfile_path(self):
- """
- The file path to the input file of this job.
- """
- return j(self.workdir, f"{self.name}.in")
-
- @property
- def output_mol_path(self):
- """
- This method should return the name of the output molecule if it makes sense to give it back.
- E.g. for ADF it will be output.xyz in the workdir for optimization jobs.
- """
- raise NotImplementedError("You must implement the _setup_job method in your subclass.")
-
- def molecule(self, mol: Union[str, plams.Molecule, plams.Atom, List[plams.Atom]]):
- """
- Add a molecule to this calculation in various formats.
-
- Args:
- mol: the molecule to read, can be a path (str). If the path exists already we read it. If it does not exist yet, it will be read in later. mol can also be a plams.Molecule object or a single or a list of plams.Atom objects.
- """
- if isinstance(mol, plams.Molecule):
- self._molecule = mol
-
- elif isinstance(mol, str) and os.path.exists(mol):
- self._molecule = molecule.load(mol)
-
- elif isinstance(mol, str):
- self._molecule_path = os.path.abspath(mol)
-
- elif isinstance(mol, list) and isinstance(mol[0], plams.Atom):
- self._molecule = plams.Molecule()
- [self._molecule.add_atom(atom) for atom in mol]
-
- elif isinstance(mol, plams.Atom):
- self._molecule = plams.Molecule()
- self._molecule.add_atom(mol)
-
- def copy(self):
- """
- Make and return a copy of this object.
- """
- import copy
-
- cp = Job()
- # cast this object to a list of keys and values
- lsts = dictfunc.dict_to_list(self.__dict__)
- # copy everthing in the lists
- lsts = [[copy.copy(x) for x in lst] for lst in lsts]
- # and return a new result object
- cp.__dict__.update(results.Result(dictfunc.list_to_dict(lsts)))
- return cp
+import os
+import shutil
+import stat
+import subprocess as sp
+from typing import List, Union
+
+import dictfunc
+from scm import plams
+
+from tcutility import log, molecule, results, slurm
+from tcutility.environment import OSName, get_os_name
+from tcutility.errors import TCJobError
+
+j = os.path.join
+
+
+def _python_path():
+ """
+ Sometimes it is necessary to have the Python path as some environments don't have its path.
+ This function attempts to find the Python path and returns it.
+ """
+ python = sp.run("which python", shell=True, capture_output=True).stdout.decode().strip()
+
+ if python == "" or not os.path.exists(python):
+ python = sp.run("which python3", shell=True, capture_output=True).stdout.decode().strip()
+
+ # we default to the python executable
+ if python == "" or not os.path.exists(python):
+ python = "python"
+
+ return python
+
+
+class Job:
+ """This is the base Job class used to build more advanced classes such as :class:`AMSJob ` and :class:`ORCAJob `.
+ The base class contains an empty :class:`Result ` object that holds the settings.
+ It also provides :meth:`__enter__` and :meth:`__exit__` methods to make use of context manager syntax.
+
+ All class methods are in principle safe to overwrite, but the :meth:`_setup_job` method **must** be overwritten.
+
+ Args:
+ test_mode: whether to enable the testing mode. If enabled, the job will be setup like normally, but the running step is skipped. This is useful if you want to know what the job settings look like before running the real calculations.
+ overwrite: whether to overwrite a previously run job in the same working directory.
+ wait_for_finish: whether to wait for this job to finish running before continuing your runscript.
+ delete_on_finish: whether to remove the workdir for this job after it is finished running.
+ """
+
+ def __init__(
+ self, *base_jobs: List["Job"], test_mode: bool = None, overwrite: bool = None, wait_for_finish: bool = None, delete_on_finish: bool = None, delete_on_fail: bool = None, use_slurm: bool = True
+ ):
+ self._sbatch = results.Result()
+ self._molecule = None
+ self._molecule_path = None
+ self.slurm_job_id = None
+ self.name = "calc"
+ self.rundir = "tmp"
+ self._preambles = []
+ self._postambles = []
+ self._postscripts = []
+
+ self.test_mode = test_mode
+ self.overwrite = overwrite
+ self.wait_for_finish = wait_for_finish
+ self.delete_on_finish = delete_on_finish
+ self.use_slurm = use_slurm
+
+ # update this job with base_jobs
+ for base_job in base_jobs:
+ self.__dict__.update(base_job.copy().__dict__)
+
+ self.test_mode = self.test_mode if test_mode is None else test_mode
+ self.overwrite = self.overwrite if overwrite is None else overwrite
+ self.wait_for_finish = self.wait_for_finish if wait_for_finish is None else wait_for_finish
+ self.delete_on_finish = self.delete_on_finish if delete_on_finish is None else delete_on_finish
+ self.delete_on_fail = delete_on_fail if delete_on_fail is None else delete_on_fail
+ self.use_slurm = self.use_slurm if use_slurm is None else use_slurm
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, exc_tb):
+ if exc_type:
+ fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
+ log.error(f'Job set-up failed with exception: {exc_type.__name__}({exc_value}) in File "{fname}", line {exc_tb.tb_lineno}.')
+ return True
+ self.run()
+
+ def can_skip(self):
+ """
+ Check whether the job can be skipped. We check this by loading the calculation and checking if the job status was fatal.
+ Fatal in this case means that the job failed, canceled or could not be found. In those cases we want to run the job.
+
+ .. note::
+ This method works for the :class:`ADFJob `, :class:`ADFFragmentJob `,
+ :class:`DFTBJob ` and :class:`ORCAJob ` objects, but not
+ yet for :class:`CRESTJob ` and :class:`QCGJob `. For the latter objects the job will always be rerun.
+ This will be fixed in a later version of TCutility.
+ """
+ res = results.read(self.workdir)
+ return not res.status.fatal
+
+ def in_queue(self):
+ """
+ Check whether the job is currently managed by slurm.
+ We check this by loading the calculation and checking if the job status is 'RUNNING', 'COMPLETING', 'CONFIGURING' or 'PENDING'.
+ """
+ res = results.read(self.workdir)
+ return res.status.name in ["RUNNING", "COMPLETING", "CONFIGURING", "PENDING"]
+
+ def __repr__(self):
+ return f"{type(self)}(name={self.name}, rundir={self.rundir})"
+
+ def sbatch(self, **kwargs):
+ """
+ Change slurm settings, for example, to change the partition or change the number of cores to use.
+ The arguments are the same as you would use for sbatch (`see sbatch manual `_). E.g. to change the partition to 'tc' call:
+
+ ``job.sbatch(p='tc')`` or ``job.sbatch(partition='tc')``.
+
+ Flags can be set as arguments with a boolean to enable or disable them:
+
+ ``job.sbatch(exclusive=True)`` will set the ``--exclusive`` flag.
+
+ .. warning::
+
+ Note that some sbatch options, such as ``--job-name`` contain a dash, which cannot be used in Python arguments.
+ To use these options you should use an underscore, like ``job.sbatch(job_name='water_dimer_GO')``.
+
+ .. note::
+
+ When running the job using sbatch we add a few extra default options:
+
+ * ``-D/--chdir {self.workdir}`` to make sure the job starts in the correct directory
+ * ``-J/--job-name {self.rundir}/{self.name}`` to give a nicer job-name when calling squeue
+ * ``-o/--output {self.name}.out`` to redirect the output from the default slurm-{id}.out
+
+ You can still overwrite them if you wish.
+ """
+ for key, value in kwargs.items():
+ if key == "dependency" and "dependency" in self._sbatch:
+ value = self._sbatch["dependency"] + "," + value
+ self._sbatch[key] = value
+
+ def _setup_job(self):
+ """
+ Set up the current job. This method should create the working directory, runscript and input file.
+ Method must return True if it was successful.
+ """
+ raise NotImplementedError("You must implement the _setup_job method in your subclass.")
+
+ def run(self):
+ """
+ Run this job. We detect if we are using slurm. If we are we submit this job using sbatch. Otherwise, we will run the job locally.
+ """
+ if self.overwrite:
+ shutil.rmtree(self.workdir)
+ os.makedirs(self.workdir, exist_ok=True)
+
+ if self.can_skip():
+ log.info(f"Skipping calculation {j(self.rundir, self.name)}, it is already finished or currently pending or running.")
+ return
+
+ # write the post-script calls to the post-ambles:
+ if self.delete_on_finish:
+ self.add_postamble(f"rm -r {self.workdir}")
+
+ if self.delete_on_fail:
+ self.add_postamble("# this will delete the calculation if it failed")
+ self.add_postamble(f"if [[ `tc read -s {self.workdir}` = FAILED || `tc read -s {self.workdir}` = UNKNOWN ]]; then rm -r {self.workdir}; fi;")
+
+ for postscript in self._postscripts:
+ self._postambles.append(f'{_python_path()} {postscript[0]} {" ".join(postscript[1])}')
+
+ # setup the job and check if it was successfull
+ setup_success = self._setup_job()
+
+ if self.test_mode or not setup_success:
+ return
+
+ if slurm.has_slurm() and self.use_slurm:
+ # set some default sbatch settings
+ if any(option not in self._sbatch for option in ["D", "chdir"]):
+ self._sbatch.setdefault("D", self.workdir)
+ if any(option not in self._sbatch for option in ["J", "job_name"]):
+ self._sbatch.setdefault("J", f"{self.rundir}/{self.name}")
+ if any(option not in self._sbatch for option in ["o", "output"]):
+ self._sbatch.setdefault("o", f"{self.name}.out")
+ self._sbatch.prune()
+
+ # submit the job with sbatch
+ sbatch_result = slurm.sbatch(os.path.split(self.runfile_path)[1], **self._sbatch)
+
+ # store the slurm job ID
+ self.slurm_job_id = sbatch_result.id
+ # and write the command to a file so we can rerun it later
+ with open(j(self.workdir, "submit.sh"), "w+") as cmd_file:
+ cmd_file.write(sbatch_result.command)
+ # make the submit command executable
+ os.chmod(j(self.workdir, "submit.sh"), stat.S_IRWXU)
+
+ # if we requested the job to hold we will wait for the slurm job to finish
+ if self.wait_for_finish:
+ slurm.wait_for_job(self.slurm_job_id)
+ else:
+ os_name = get_os_name()
+
+ if os_name == OSName.Windows:
+ raise TCJobError("Generic Job", "Running jobs on Windows is not supported.")
+
+ # if we are not using slurm, we can execute the file. For this we need special permissions, so we have to set that first.
+ os.chmod(self.runfile_path, os.stat(self.runfile_path).st_mode | stat.S_IEXEC)
+
+ runfile_dir, runscript = os.path.split(self.runfile_path)
+ command = ["./" + runscript] if os.name == "posix" else ["sh", runscript]
+ print(f"Running command: {command} in directory: {runfile_dir}")
+
+ with open(f"{os.path.split(self.runfile_path)[0]}/{self.name}.out", "w+") as out:
+ sp.run(command, cwd=runfile_dir, stdout=out, shell=True)
+
+ def add_preamble(self, line: str):
+ """
+ Add a preamble for the runscript. This should come after the shebang, but before the calculation is ran by the program (ADF or ORCA).
+ This can used, for example, to load some modules. E.g. to load a specific version of AMS we can call:
+ job.add_preamble('module load ams/2023.101')
+ """
+ self._preambles.append(line)
+
+ def add_postamble(self, line: str):
+ """
+ Add a postamble for the runscript. This should come after the calculation is ran by the program (ADF or ORCA).
+ This can be used, for example, to remove or copy some files. E.g. to remove all t12.* files we can call:
+ job.add_postamble('rm t12.*')
+ """
+ self._postambles.append(line)
+
+ def add_postscript(self, script, *args):
+ """
+ Add a post-script to this calculation.
+ This should be either a Python module with a __file__ attribute or the path to a Python script.
+ The post-script will be called with Python and any given args will be added as arguments when calling the script.
+
+ Args:
+ script: a Python object with a __file__ attribute or the file-path to a script.
+ *args: positional arguments to pass to the post-script.
+ """
+ if not isinstance(script, str):
+ script = script.__file__
+ self._postscripts.append((script, args))
+
+ def dependency(self, otherjob: "Job"):
+ """
+ Set a dependency between this job and otherjob.
+ This means that this job will run after the other job is finished running succesfully.
+ """
+ if otherjob.can_skip() and not otherjob.in_queue():
+ return
+
+ if hasattr(otherjob, "slurm_job_id"):
+ self.sbatch(dependency=f"afterok:{otherjob.slurm_job_id}")
+ self.sbatch(kill_on_invalid_dep="Yes")
+
+ @property
+ def workdir(self):
+ """
+ The working directory of this job. All important files are written here, for example the input file and runscript.
+ """
+ return j(os.path.abspath(self.rundir), self.name)
+
+ @property
+ def runfile_path(self):
+ """
+ The file path to the runscript of this job.
+ """
+ return j(self.workdir, f"{self.name}.run")
+
+ @property
+ def inputfile_path(self):
+ """
+ The file path to the input file of this job.
+ """
+ return j(self.workdir, f"{self.name}.in")
+
+ @property
+ def output_mol_path(self):
+ """
+ This method should return the name of the output molecule if it makes sense to give it back.
+ E.g. for ADF it will be output.xyz in the workdir for optimization jobs.
+ """
+ raise NotImplementedError("You must implement the _setup_job method in your subclass.")
+
+ def molecule(self, mol: Union[str, plams.Molecule, plams.Atom, List[plams.Atom]]):
+ """
+ Add a molecule to this calculation in various formats.
+
+ Args:
+ mol: the molecule to read, can be a path (str). If the path exists already we read it. If it does not exist yet, it will be read in later. mol can also be a plams.Molecule object or a single or a list of plams.Atom objects.
+ """
+ if isinstance(mol, plams.Molecule):
+ self._molecule = mol
+
+ elif isinstance(mol, str) and os.path.exists(mol):
+ self._molecule = molecule.load(mol)
+
+ elif isinstance(mol, str):
+ self._molecule_path = os.path.abspath(mol)
+
+ elif isinstance(mol, list) and isinstance(mol[0], plams.Atom):
+ self._molecule = plams.Molecule()
+ [self._molecule.add_atom(atom) for atom in mol]
+
+ elif isinstance(mol, plams.Atom):
+ self._molecule = plams.Molecule()
+ self._molecule.add_atom(mol)
+
+ def copy(self):
+ """
+ Make and return a copy of this object.
+ """
+ import copy
+
+ cp = Job()
+ # cast this object to a list of keys and values
+ lsts = dictfunc.dict_to_list(self.__dict__)
+ # copy everthing in the lists
+ lsts = [[copy.copy(x) for x in lst] for lst in lsts]
+ # and return a new result object
+ cp.__dict__.update(results.Result(dictfunc.list_to_dict(lsts)))
+ return cp
diff --git a/src/tcutility/job/nmr.py b/src/tcutility/job/nmr.py
index 671a055d..fd9bafbd 100644
--- a/src/tcutility/job/nmr.py
+++ b/src/tcutility/job/nmr.py
@@ -1,93 +1,93 @@
-import os
-from typing import Tuple
-
-from tcutility.job.adf import ADFJob
-from tcutility.job.generic import Job
-
-j = os.path.join
-
-
-class NMRJob(Job):
- """
- A job that handles calculation of Nuclear Magnetic Resonance (NMR) chemical shifts.
- The job will first run an :class:`tcutility.job.adf.ADFJob` calculation at the SAOP/TZ2P level of theory to prepare for the NMR program of AMS.
- The NMR shifts will be calculated for all atoms and any additional coordinate (NICS).
- New NICS points can be given using the :meth:`NMRJob.add_nics_point` method.
- """
-
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.pre_nmr_job = ADFJob(*args, **kwargs)
- self.pre_nmr_job.functional("SAOP")
- self.pre_nmr_job.basis_set("TZ2P")
- self.pre_nmr_job.settings.input.adf.save = "TAPE10"
- self.nics_points = []
-
- def _setup_job(self):
- os.makedirs(self.workdir, exist_ok=True)
-
- # set up the pre_nmr_job
- self.pre_nmr_job.rundir = self.rundir
- self.pre_nmr_job.name = self.name + "_pre"
- self.pre_nmr_job.molecule(self._molecule or self._molecule_path)
- self.pre_nmr_job.sbatch(**self._sbatch)
-
- # we have to add the NICS points in the pre_nmr_job
- multipole_coords = []
- for point in self.nics_points:
- multipole_coords.append(f" {point[0]} {point[1]} {point[2]} 0.0")
- self.pre_nmr_job.settings.input.ams.System.ElectrostaticEmbedding.MultipolePotential.Coordinates = "\n" + "\n".join(multipole_coords) + "\n End"
-
- # we copy the pre_nmr_job output files to the main job directory
- self.pre_nmr_job.add_postamble(f'cp {j(self.pre_nmr_job.workdir, "adf.rkf")} {j(self.workdir, "TAPE21")}')
- self.pre_nmr_job.add_postamble(f'cp {j(self.pre_nmr_job.workdir, "TAPE10")} {j(self.workdir, "TAPE10")}')
- self.pre_nmr_job.run()
-
- # some extra settings for the main job
- self.dependency(self.pre_nmr_job)
- # NMR will name the calculation as TAPE21 instead of adf.rkf, so we rename it here
- self.add_postamble(f'mv {j(self.workdir, "TAPE21")} {j(self.workdir, "adf.rkf")}')
-
- # write the input for the NMR job
- # the ghost block holds the NICS points
- ghost_block = "\t"
- if len(self.nics_points) > 0:
- ghost_block += "Ghosts\n"
- for point in self.nics_points:
- ghost_block += f" {point[0]} {point[1]} {point[2]}\n"
- ghost_block += "SubEnd\n"
-
- # write input and runfile
- with open(self.inputfile_path, "w+") as inpf:
- inpf.write("NMR\n")
- inpf.write("\tout all\n")
- inpf.write(ghost_block + "\n")
- inpf.write("End\n")
-
- with open(self.runfile_path, "w+") as runf:
- runf.write("#!/bin/sh\n\n") # the shebang is not written by default by ADF
- runf.write("\n".join(self._preambles) + "\n\n")
- runf.write(f"$AMSBIN/nmr {self.inputfile_path} < /dev/null\n")
- runf.write("\n".join(self._postambles))
-
- return True
-
- def add_nics_point(self, coordinate: Tuple[float, float, float]):
- """
- Add a NICS point to be calculated.
-
- Args:
- coordinate: the (x, y, z) coordinates of a NICS point to calculate the chemical shift for. Has to be given as cartesian coordinates and using unit angstrom.
- """
- self.nics_points.append(coordinate)
-
-
-if __name__ == "__main__":
- with NMRJob(test_mode=True) as job:
- job.molecule(r"D:\Users\Yuman\Desktop\PhD\TCutility\examples\job\water_dimer.xyz")
- job.add_nics_point([0, 1, 2])
- job.add_nics_point([0, 1, 2])
- job.add_nics_point([0, 1, 2])
- job.add_nics_point([0, 1, 2])
- job.add_nics_point([0, 1, 2])
- job.add_nics_point([0, 1, 2])
+import os
+from typing import Tuple
+
+from tcutility.job.adf import ADFJob
+from tcutility.job.generic import Job
+
+j = os.path.join
+
+
+class NMRJob(Job):
+ """
+ A job that handles calculation of Nuclear Magnetic Resonance (NMR) chemical shifts.
+ The job will first run an :class:`tcutility.job.adf.ADFJob` calculation at the SAOP/TZ2P level of theory to prepare for the NMR program of AMS.
+ The NMR shifts will be calculated for all atoms and any additional coordinate (NICS).
+ New NICS points can be given using the :meth:`NMRJob.add_nics_point` method.
+ """
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.pre_nmr_job = ADFJob(*args, **kwargs)
+ self.pre_nmr_job.functional("SAOP")
+ self.pre_nmr_job.basis_set("TZ2P")
+ self.pre_nmr_job.settings.input.adf.save = "TAPE10"
+ self.nics_points = []
+
+ def _setup_job(self):
+ os.makedirs(self.workdir, exist_ok=True)
+
+ # set up the pre_nmr_job
+ self.pre_nmr_job.rundir = self.rundir
+ self.pre_nmr_job.name = self.name + "_pre"
+ self.pre_nmr_job.molecule(self._molecule or self._molecule_path)
+ self.pre_nmr_job.sbatch(**self._sbatch)
+
+ # we have to add the NICS points in the pre_nmr_job
+ multipole_coords = []
+ for point in self.nics_points:
+ multipole_coords.append(f" {point[0]} {point[1]} {point[2]} 0.0")
+ self.pre_nmr_job.settings.input.ams.System.ElectrostaticEmbedding.MultipolePotential.Coordinates = "\n" + "\n".join(multipole_coords) + "\n End"
+
+ # we copy the pre_nmr_job output files to the main job directory
+ self.pre_nmr_job.add_postamble(f'cp {j(self.pre_nmr_job.workdir, "adf.rkf")} {j(self.workdir, "TAPE21")}')
+ self.pre_nmr_job.add_postamble(f'cp {j(self.pre_nmr_job.workdir, "TAPE10")} {j(self.workdir, "TAPE10")}')
+ self.pre_nmr_job.run()
+
+ # some extra settings for the main job
+ self.dependency(self.pre_nmr_job)
+ # NMR will name the calculation as TAPE21 instead of adf.rkf, so we rename it here
+ self.add_postamble(f'mv {j(self.workdir, "TAPE21")} {j(self.workdir, "adf.rkf")}')
+
+ # write the input for the NMR job
+ # the ghost block holds the NICS points
+ ghost_block = "\t"
+ if len(self.nics_points) > 0:
+ ghost_block += "Ghosts\n"
+ for point in self.nics_points:
+ ghost_block += f" {point[0]} {point[1]} {point[2]}\n"
+ ghost_block += "SubEnd\n"
+
+ # write input and runfile
+ with open(self.inputfile_path, "w+") as inpf:
+ inpf.write("NMR\n")
+ inpf.write("\tout all\n")
+ inpf.write(ghost_block + "\n")
+ inpf.write("End\n")
+
+ with open(self.runfile_path, "w+") as runf:
+ runf.write("#!/bin/sh\n\n") # the shebang is not written by default by ADF
+ runf.write("\n".join(self._preambles) + "\n\n")
+ runf.write(f"$AMSBIN/nmr {self.inputfile_path} < /dev/null\n")
+ runf.write("\n".join(self._postambles))
+
+ return True
+
+ def add_nics_point(self, coordinate: Tuple[float, float, float]):
+ """
+ Add a NICS point to be calculated.
+
+ Args:
+ coordinate: the (x, y, z) coordinates of a NICS point to calculate the chemical shift for. Has to be given as cartesian coordinates and using unit angstrom.
+ """
+ self.nics_points.append(coordinate)
+
+
+if __name__ == "__main__":
+ with NMRJob(test_mode=True) as job:
+ job.molecule(r"D:\Users\Yuman\Desktop\PhD\TCutility\examples\job\water_dimer.xyz")
+ job.add_nics_point([0, 1, 2])
+ job.add_nics_point([0, 1, 2])
+ job.add_nics_point([0, 1, 2])
+ job.add_nics_point([0, 1, 2])
+ job.add_nics_point([0, 1, 2])
+ job.add_nics_point([0, 1, 2])
diff --git a/src/tcutility/job/orca.py b/src/tcutility/job/orca.py
index 95f3f8ba..8fbb79f0 100644
--- a/src/tcutility/job/orca.py
+++ b/src/tcutility/job/orca.py
@@ -1,237 +1,237 @@
-import os
-import subprocess as sp
-from typing import List, Union
-
-from scm import plams
-
-from tcutility import ensure_list, log, results, slurm, spell_check
-from tcutility.errors import TCMoleculeError
-from tcutility.job.generic import Job
-
-j = os.path.join
-
-
-class ORCAJob(Job):
- def __init__(self, use_tmpdir=False, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.settings = results.Result()
- self.settings.main = set()
- self._charge = 0
- self._multiplicity = 1
- self._ghosts = []
- self._method = None
- self.memory = None
- self.processes = None
- self.orca_path = None
- self.use_tmpdir = use_tmpdir
-
- self.single_point()
-
- def main(self, val: Union[str, List[str]]):
- """
- Add main options for this ORCA calculation, they will be added to the input prepended with exclamation marks.
-
- Args:
- val: the main options to add. This can be a string or a list of strings with the main options.
- """
- # we want to split a string such as 'CC-pVTZ Opt CCSD(T)' into loose parts and add them separately
- # this should always return a list
- if isinstance(val, str):
- val = val.split()
- # add each
- [self.settings.main.add(key) for key in val]
-
- def remove_main(self, val: Union[str, List[str]]):
- if isinstance(val, str):
- val = val.split()
-
- lower_main = {key.casefold(): key for key in self.settings.main}
- for v in val:
- if v.casefold() in lower_main:
- self.settings.main.discard(lower_main[v.casefold()])
-
- def __remove_task(self):
- [self.remove_main(task) for task in ["sp", "opt", "optts", "neb-ts"]]
-
- def method(self, method):
- spell_check.check(method, ["HF", "MP2", "CCSD", "CCSD(T)", "CCSDT"])
- self.settings.main.add(method)
- self._method = method
-
- def reference(self, ref):
- spell_check.check(ref, ["UNO", "UHF", "UKS", "RHF", "RKS", "ROHF", "ROKS"])
- self.settings.main.add(ref)
- self._method = ref
-
- def QRO(self, enable=True):
- self.settings.MDCI.UseQROs = enable
-
- def basis_set(self, value):
- self.settings.main.add(value)
-
- def single_point(self):
- self.__remove_task()
- self.settings.main.add("SP")
-
- def transition_state(self):
- self.__remove_task()
- self.vibrations()
- self.settings.main.add("OptTS")
-
- def optimization(self):
- self.__remove_task()
- self.vibrations()
- self.settings.main.add("Opt")
-
- def vibrations(self, enable=True, numerical=False):
- self.remove_main("NumFreq")
- self.remove_main("Freq")
- if not enable:
- return
- if numerical:
- self.settings.main.add("NumFreq")
- else:
- self.settings.main.add("Freq")
-
- def charge(self, val):
- self._charge = val
-
- def spin_polarization(self, val):
- self._multiplicity = val + 1
-
- def multiplicity(self, val):
- self._multiplicity = val
-
- def ghost_atoms(self, indices: Union[int, List[int]]):
- self._ghosts.extend(ensure_list(indices))
-
- def get_memory_usage(self):
- mem = self.memory or self._sbatch.mem or None
-
- ntasks = self.processes
- if ntasks is None:
- if self._sbatch.n:
- ntasks = self._sbatch.n
- if self._sbatch.ntasks:
- ntasks = self._sbatch.ntasks
- if self._sbatch.ntasks_per_node:
- ntasks = self._sbatch.ntasks_per_node * self._sbatch.get("N", 1) * self._sbatch.get("nodes", 1)
-
- return mem, ntasks
-
- def molecule(self, mol: Union[str, plams.Molecule, plams.Atom, List[plams.Atom]], natoms: int = None):
- """
- Add a molecule to this calculation in various formats.
-
- Args:
- mol: the molecule to read, can be a path (str). If the path exists already we read it. If it does not exist yet, it will be read in later. mol can also be a plams.Molecule object or a single or a list of plams.Atom objects.
- natoms: If the molecule is supplied as a path you should also give the number of atoms.
- """
- super().molecule(mol)
- self.natoms = natoms
-
- def get_input(self):
- # set the correct memory usage and processes
- mem, ntasks = self.get_memory_usage()
- if ntasks and mem:
- if self._molecule is not None:
- natoms = len(self._molecule) - len(self._ghosts)
- else:
- if not hasattr(self, "natoms") or self.natoms is None:
- raise TCMoleculeError("You set the molecule as a path and did not supply the number of atoms.")
- natoms = self.natoms
-
- ntasks = min(ntasks, (natoms - 1) * 3)
- self.settings.PAL.nprocs = ntasks
- self.settings.maxcore = int(mem / ntasks * 0.75)
- else:
- log.warn("MaxCore and nprocs not specified. Please use SBATCH settings or set job.processes and job.memory.")
-
- ret = ""
- for key in self.settings.main:
- ret += f"!{key}\n"
- ret += "\n"
-
- for option, block in self.settings.items():
- if option == "main":
- continue
-
- if isinstance(block, results.Result):
- ret += f"%{option}\n"
-
- for key, val in block.items():
- ret += f" {key} {val}\n"
-
- ret += "END\n\n"
- else:
- ret += f"%{option} {block}\n"
-
- ret += "\n"
-
- if self._molecule_path:
- ret += f"* xyzfile {self._charge} {self._multiplicity} {os.path.abspath(self._molecule_path)}\n"
-
- else:
- ret += f"* xyz {self._charge} {self._multiplicity}\n"
- for i, atom in enumerate(self._molecule, start=1):
- if i in self._ghosts:
- ret += f" {atom.symbol:2}: {atom.x: >13f} {atom.y: >13f} {atom.z: >13f}\n"
- else:
- ret += f" {atom.symbol:3} {atom.x: >13f} {atom.y: >13f} {atom.z: >13f}\n"
- ret += "*\n"
-
- return ret
-
- def _setup_job(self):
- try:
- if self.orca_path is None and not self.test_mode:
- self.orca_path = sp.check_output(["which", "orca"]).decode().strip()
- except sp.CalledProcessError:
- log.warn(f'Could not find the orca path. Set the {self.__class__.__name__}.orca_path attribute to add it. Now setting it to "$(which orca)", make sure the orca executable is findable.')
- self.orca_path = "$(which orca)"
-
- if not self._molecule and not self._molecule_path:
- log.error(f"You did not supply a molecule for this job. Call the {self.__class__.__name__}.molecule method to add one.")
- return
-
- os.makedirs(self.workdir, exist_ok=True)
- with open(self.inputfile_path, "w+") as inp:
- inp.write(self.get_input())
-
- with open(self.runfile_path, "w+") as runf:
- runf.write("#!/bin/sh\n\n")
- runf.write("\n".join(self._preambles) + "\n\n")
-
- # when using temporary directories for SLURM we need to do some extra setup
- # this is mainly moving the calculation directory to the TMPDIR location
- # and after the jobs is finished we copy back the results and remove the TMPDIR
- if self.use_tmpdir and slurm.has_slurm():
- runf.write('export TMPDIR="$TMPDIR/$SLURM_JOB_ID"\n')
- runf.write("mkdir -p $TMPDIR\n")
- runf.write("cd $TMPDIR\n")
- runf.write(f"cp {self.inputfile_path} $TMPDIR\n")
-
- runf.write(f"{self.orca_path} $TMPDIR/{self.name}.in\n")
-
- runf.write(f"cp $TMPDIR/* {self.workdir}\n")
- runf.write("rm -rf $TMPDIR\n")
-
- else:
- runf.write(f"{self.orca_path} {self.inputfile_path}\n")
-
- runf.write("\n".join(self._postambles))
-
- return True
-
- @property
- def output_mol_path(self):
- """
- The default file path for output molecules when running ADF calculations. It will not be created for singlepoint calculations.
- """
- return j(self.workdir, "OPT.xyz")
-
-
-if __name__ == "__main__":
- job = ORCAJob()
- job.main("OPT cc-pVTZ")
- job.remove_main("OPT OPTTS NEB")
+import os
+import subprocess as sp
+from typing import List, Union
+
+from scm import plams
+
+from tcutility import ensure_list, log, results, slurm, spell_check
+from tcutility.errors import TCMoleculeError
+from tcutility.job.generic import Job
+
+j = os.path.join
+
+
+class ORCAJob(Job):
+ def __init__(self, use_tmpdir=False, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.settings = results.Result()
+ self.settings.main = set()
+ self._charge = 0
+ self._multiplicity = 1
+ self._ghosts = []
+ self._method = None
+ self.memory = None
+ self.processes = None
+ self.orca_path = None
+ self.use_tmpdir = use_tmpdir
+
+ self.single_point()
+
+ def main(self, val: Union[str, List[str]]):
+ """
+ Add main options for this ORCA calculation, they will be added to the input prepended with exclamation marks.
+
+ Args:
+ val: the main options to add. This can be a string or a list of strings with the main options.
+ """
+ # we want to split a string such as 'CC-pVTZ Opt CCSD(T)' into loose parts and add them separately
+ # this should always return a list
+ if isinstance(val, str):
+ val = val.split()
+ # add each
+ [self.settings.main.add(key) for key in val]
+
+ def remove_main(self, val: Union[str, List[str]]):
+ if isinstance(val, str):
+ val = val.split()
+
+ lower_main = {key.casefold(): key for key in self.settings.main}
+ for v in val:
+ if v.casefold() in lower_main:
+ self.settings.main.discard(lower_main[v.casefold()])
+
+ def __remove_task(self):
+ [self.remove_main(task) for task in ["sp", "opt", "optts", "neb-ts"]]
+
+ def method(self, method):
+ spell_check.check(method, ["HF", "MP2", "CCSD", "CCSD(T)", "CCSDT"])
+ self.settings.main.add(method)
+ self._method = method
+
+ def reference(self, ref):
+ spell_check.check(ref, ["UNO", "UHF", "UKS", "RHF", "RKS", "ROHF", "ROKS"])
+ self.settings.main.add(ref)
+ self._method = ref
+
+ def QRO(self, enable=True):
+ self.settings.MDCI.UseQROs = enable
+
+ def basis_set(self, value):
+ self.settings.main.add(value)
+
+ def single_point(self):
+ self.__remove_task()
+ self.settings.main.add("SP")
+
+ def transition_state(self):
+ self.__remove_task()
+ self.vibrations()
+ self.settings.main.add("OptTS")
+
+ def optimization(self):
+ self.__remove_task()
+ self.vibrations()
+ self.settings.main.add("Opt")
+
+ def vibrations(self, enable=True, numerical=False):
+ self.remove_main("NumFreq")
+ self.remove_main("Freq")
+ if not enable:
+ return
+ if numerical:
+ self.settings.main.add("NumFreq")
+ else:
+ self.settings.main.add("Freq")
+
+ def charge(self, val):
+ self._charge = val
+
+ def spin_polarization(self, val):
+ self._multiplicity = val + 1
+
+ def multiplicity(self, val):
+ self._multiplicity = val
+
+ def ghost_atoms(self, indices: Union[int, List[int]]):
+ self._ghosts.extend(ensure_list(indices))
+
+ def get_memory_usage(self):
+ mem = self.memory or self._sbatch.mem or None
+
+ ntasks = self.processes
+ if ntasks is None:
+ if self._sbatch.n:
+ ntasks = self._sbatch.n
+ if self._sbatch.ntasks:
+ ntasks = self._sbatch.ntasks
+ if self._sbatch.ntasks_per_node:
+ ntasks = self._sbatch.ntasks_per_node * self._sbatch.get("N", 1) * self._sbatch.get("nodes", 1)
+
+ return mem, ntasks
+
+ def molecule(self, mol: Union[str, plams.Molecule, plams.Atom, List[plams.Atom]], natoms: int = None):
+ """
+ Add a molecule to this calculation in various formats.
+
+ Args:
+ mol: the molecule to read, can be a path (str). If the path exists already we read it. If it does not exist yet, it will be read in later. mol can also be a plams.Molecule object or a single or a list of plams.Atom objects.
+ natoms: If the molecule is supplied as a path you should also give the number of atoms.
+ """
+ super().molecule(mol)
+ self.natoms = natoms
+
+ def get_input(self):
+ # set the correct memory usage and processes
+ mem, ntasks = self.get_memory_usage()
+ if ntasks and mem:
+ if self._molecule is not None:
+ natoms = len(self._molecule) - len(self._ghosts)
+ else:
+ if not hasattr(self, "natoms") or self.natoms is None:
+ raise TCMoleculeError("You set the molecule as a path and did not supply the number of atoms.")
+ natoms = self.natoms
+
+ ntasks = min(ntasks, (natoms - 1) * 3)
+ self.settings.PAL.nprocs = ntasks
+ self.settings.maxcore = int(mem / ntasks * 0.75)
+ else:
+ log.warn("MaxCore and nprocs not specified. Please use SBATCH settings or set job.processes and job.memory.")
+
+ ret = ""
+ for key in self.settings.main:
+ ret += f"!{key}\n"
+ ret += "\n"
+
+ for option, block in self.settings.items():
+ if option == "main":
+ continue
+
+ if isinstance(block, results.Result):
+ ret += f"%{option}\n"
+
+ for key, val in block.items():
+ ret += f" {key} {val}\n"
+
+ ret += "END\n\n"
+ else:
+ ret += f"%{option} {block}\n"
+
+ ret += "\n"
+
+ if self._molecule_path:
+ ret += f"* xyzfile {self._charge} {self._multiplicity} {os.path.abspath(self._molecule_path)}\n"
+
+ else:
+ ret += f"* xyz {self._charge} {self._multiplicity}\n"
+ for i, atom in enumerate(self._molecule, start=1):
+ if i in self._ghosts:
+ ret += f" {atom.symbol:2}: {atom.x: >13f} {atom.y: >13f} {atom.z: >13f}\n"
+ else:
+ ret += f" {atom.symbol:3} {atom.x: >13f} {atom.y: >13f} {atom.z: >13f}\n"
+ ret += "*\n"
+
+ return ret
+
+ def _setup_job(self):
+ try:
+ if self.orca_path is None and not self.test_mode:
+ self.orca_path = sp.check_output(["which", "orca"]).decode().strip()
+ except sp.CalledProcessError:
+ log.warn(f'Could not find the orca path. Set the {self.__class__.__name__}.orca_path attribute to add it. Now setting it to "$(which orca)", make sure the orca executable is findable.')
+ self.orca_path = "$(which orca)"
+
+ if not self._molecule and not self._molecule_path:
+ log.error(f"You did not supply a molecule for this job. Call the {self.__class__.__name__}.molecule method to add one.")
+ return
+
+ os.makedirs(self.workdir, exist_ok=True)
+ with open(self.inputfile_path, "w+") as inp:
+ inp.write(self.get_input())
+
+ with open(self.runfile_path, "w+") as runf:
+ runf.write("#!/bin/sh\n\n")
+ runf.write("\n".join(self._preambles) + "\n\n")
+
+ # when using temporary directories for SLURM we need to do some extra setup
+ # this is mainly moving the calculation directory to the TMPDIR location
+ # and after the jobs is finished we copy back the results and remove the TMPDIR
+ if self.use_tmpdir and slurm.has_slurm():
+ runf.write('export TMPDIR="$TMPDIR/$SLURM_JOB_ID"\n')
+ runf.write("mkdir -p $TMPDIR\n")
+ runf.write("cd $TMPDIR\n")
+ runf.write(f"cp {self.inputfile_path} $TMPDIR\n")
+
+ runf.write(f"{self.orca_path} $TMPDIR/{self.name}.in\n")
+
+ runf.write(f"cp $TMPDIR/* {self.workdir}\n")
+ runf.write("rm -rf $TMPDIR\n")
+
+ else:
+ runf.write(f"{self.orca_path} {self.inputfile_path}\n")
+
+ runf.write("\n".join(self._postambles))
+
+ return True
+
+ @property
+ def output_mol_path(self):
+ """
+ The default file path for output molecules when running ADF calculations. It will not be created for singlepoint calculations.
+ """
+ return j(self.workdir, "OPT.xyz")
+
+
+if __name__ == "__main__":
+ job = ORCAJob()
+ job.main("OPT cc-pVTZ")
+ job.remove_main("OPT OPTTS NEB")
diff --git a/src/tcutility/report/_char_widths.txt b/src/tcutility/report/_char_widths.txt
index 1213536f..9106834d 100755
--- a/src/tcutility/report/_char_widths.txt
+++ b/src/tcutility/report/_char_widths.txt
@@ -1,845 +1,845 @@
-calibri a 0.7412109375
-calibri b 0.7412109375
-calibri c 0.6669921875
-calibri d 0.7412109375
-calibri e 0.7412109375
-calibri f 0.3701171875
-calibri g 0.7412109375
-calibri h 0.7412109375
-calibri i 0.2958984375
-calibri j 0.2958984375
-calibri k 0.6669921875
-calibri l 0.2958984375
-calibri m 1.1103515625
-calibri n 0.7412109375
-calibri o 0.7412109375
-calibri p 0.7412109375
-calibri q 0.7412109375
-calibri r 0.4443359375
-calibri s 0.6669921875
-calibri t 0.3701171875
-calibri u 0.7412109375
-calibri v 0.6669921875
-calibri w 0.962890625
-calibri x 0.6669921875
-calibri y 0.6669921875
-calibri z 0.6669921875
-calibri A 0.888671875
-calibri B 0.888671875
-calibri C 0.962890625
-calibri D 0.962890625
-calibri E 0.888671875
-calibri F 0.814453125
-calibri G 1.037109375
-calibri H 0.962890625
-calibri I 0.3701171875
-calibri J 0.6669921875
-calibri K 0.888671875
-calibri L 0.7412109375
-calibri M 1.1103515625
-calibri N 0.962890625
-calibri O 1.037109375
-calibri P 0.888671875
-calibri Q 1.037109375
-calibri R 0.962890625
-calibri S 0.888671875
-calibri T 0.814453125
-calibri U 0.962890625
-calibri V 0.888671875
-calibri W 1.2578125
-calibri X 0.888671875
-calibri Y 0.888671875
-calibri Z 0.814453125
-calibri 0 0.7412109375
-calibri 1 0.7412109375
-calibri 2 0.7412109375
-calibri 3 0.7412109375
-calibri 4 0.7412109375
-calibri 5 0.7412109375
-calibri 6 0.7412109375
-calibri 7 0.7412109375
-calibri 8 0.7412109375
-calibri 9 0.7412109375
-calibri ⁰ 0.37109375
-calibri ¹ 0.4443359375
-calibri ² 0.4443359375
-calibri ³ 0.4443359375
-calibri ⁴ 0.3701171875
-calibri ⁵ 0.3701171875
-calibri ⁶ 0.37109375
-calibri ⁷ 0.3701171875
-calibri ⁸ 0.37109375
-calibri ⁹ 0.3701171875
-calibri ⁺ 0.3896484375
-calibri ⁻ 0.2216796875
-calibri ⁼ 0.3896484375
-calibri ⁽ 0.2216796875
-calibri ⁾ 0.2216796875
-calibri ⁿ 0.37109375
-calibri ⁱ 0.1484375
-calibri ₀ 0.37109375
-calibri ₁ 0.37109375
-calibri ₂ 0.3701171875
-calibri ₃ 0.3701171875
-calibri ₄ 0.3701171875
-calibri ₅ 0.3701171875
-calibri ₆ 0.37109375
-calibri ₇ 0.3701171875
-calibri ₈ 0.37109375
-calibri ₉ 0.3701171875
-calibri ₊ 0.3896484375
-calibri ₋ 0.2216796875
-calibri ₌ 0.3896484375
-calibri ₍ 0.2216796875
-calibri ₎ 0.2216796875
-calibri ₐ 0.37109375
-calibri ₑ 0.37109375
-calibri ₒ 0.37109375
-calibri ₓ 0.3330078125
-calibri ₔ 0.37109375
-calibri α 0.814453125
-calibri β 0.814453125
-calibri γ 0.7412109375
-calibri δ 0.814453125
-calibri ε 0.7412109375
-calibri ζ 0.591796875
-calibri η 0.814453125
-calibri θ 0.8154296875
-calibri ι 0.3701171875
-calibri κ 0.7412109375
-calibri λ 0.7412109375
-calibri μ 0.814453125
-calibri ν 0.7412109375
-calibri ξ 0.6669921875
-calibri ο 0.814453125
-calibri π 0.7314453125
-calibri ρ 0.814453125
-calibri σ 0.814453125
-calibri τ 0.6669921875
-calibri υ 0.814453125
-calibri φ 0.962890625
-calibri χ 0.7412109375
-calibri ψ 0.962890625
-calibri ω 1.009765625
-calibri Α 0.888671875
-calibri Β 0.962890625
-calibri Γ 0.814453125
-calibri Δ 0.962890625
-calibri Ε 0.888671875
-calibri Ζ 0.814453125
-calibri Η 0.962890625
-calibri Θ 1.037109375
-calibri Ι 0.3701171875
-calibri Κ 0.888671875
-calibri Λ 0.888671875
-calibri Μ 1.185546875
-calibri Ν 0.962890625
-calibri Ξ 0.814453125
-calibri Ο 1.037109375
-calibri Π 0.962890625
-calibri Ρ 0.888671875
-calibri Σ 0.814453125
-calibri Τ 0.8125
-calibri Υ 0.888671875
-calibri Φ 0.962890625
-calibri Χ 0.890625
-calibri Ψ 1.109375
-calibri Ω 1.037109375
-calibri . 0.3701171875
-calibri , 0.3701171875
-calibri / 0.3701171875
-calibri ? 0.7412109375
-calibri < 0.7783203125
-calibri > 0.7783203125
-calibri { 0.4453125
-calibri } 0.4453125
-calibri [ 0.3701171875
-calibri ] 0.3701171875
-calibri ( 0.4443359375
-calibri ) 0.4443359375
-calibri + 0.7783203125
-calibri - 0.4443359375
-calibri _ 0.7412109375
-calibri = 0.7783203125
-calibri ^ 0.6259765625
-calibri : 0.3701171875
-calibri ; 0.3701171875
-calibri % 1.185546875
-calibri * 0.5185546875
-calibri 0.3701171875
-arial a 0.7412109375
-arial b 0.7412109375
-arial c 0.6669921875
-arial d 0.7412109375
-arial e 0.7412109375
-arial f 0.3701171875
-arial g 0.7412109375
-arial h 0.7412109375
-arial i 0.2958984375
-arial j 0.2958984375
-arial k 0.6669921875
-arial l 0.2958984375
-arial m 1.1103515625
-arial n 0.7412109375
-arial o 0.7412109375
-arial p 0.7412109375
-arial q 0.7412109375
-arial r 0.4443359375
-arial s 0.6669921875
-arial t 0.3701171875
-arial u 0.7412109375
-arial v 0.6669921875
-arial w 0.962890625
-arial x 0.6669921875
-arial y 0.6669921875
-arial z 0.6669921875
-arial A 0.888671875
-arial B 0.888671875
-arial C 0.962890625
-arial D 0.962890625
-arial E 0.888671875
-arial F 0.814453125
-arial G 1.037109375
-arial H 0.962890625
-arial I 0.3701171875
-arial J 0.6669921875
-arial K 0.888671875
-arial L 0.7412109375
-arial M 1.1103515625
-arial N 0.962890625
-arial O 1.037109375
-arial P 0.888671875
-arial Q 1.037109375
-arial R 0.962890625
-arial S 0.888671875
-arial T 0.814453125
-arial U 0.962890625
-arial V 0.888671875
-arial W 1.2578125
-arial X 0.888671875
-arial Y 0.888671875
-arial Z 0.814453125
-arial 0 0.7412109375
-arial 1 0.7412109375
-arial 2 0.7412109375
-arial 3 0.7412109375
-arial 4 0.7412109375
-arial 5 0.7412109375
-arial 6 0.7412109375
-arial 7 0.7412109375
-arial 8 0.7412109375
-arial 9 0.7412109375
-arial ⁰ 0.5625
-arial ¹ 0.4443359375
-arial ² 0.4443359375
-arial ³ 0.4443359375
-arial ⁴ 0.5625
-arial ⁵ 0.5625
-arial ⁶ 0.5625
-arial ⁷ 0.5625
-arial ⁸ 0.5625
-arial ⁹ 0.5625
-arial ⁺ 0.5625
-arial ⁻ 0.5625
-arial ⁼ 0.5625
-arial ⁽ 0.30078125
-arial ⁾ 0.30078125
-arial ⁿ 0.486328125
-arial ⁱ 0.2890625
-arial ₀ 0.5625
-arial ₁ 0.5625
-arial ₂ 0.5625
-arial ₃ 0.5625
-arial ₄ 0.5625
-arial ₅ 0.5625
-arial ₆ 0.5625
-arial ₇ 0.5625
-arial ₈ 0.5625
-arial ₉ 0.5625
-arial ₊ 0.5625
-arial ₋ 0.5625
-arial ₌ 0.5625
-arial ₍ 0.30078125
-arial ₎ 0.30078125
-arial ₐ 0.49609375
-arial ₑ 0.4951171875
-arial ₒ 0.5029296875
-arial ₓ 0.4375
-arial ₔ 0.4951171875
-arial α 0.7705078125
-arial β 0.7666015625
-arial γ 0.6669921875
-arial δ 0.7421875
-arial ε 0.5947265625
-arial ζ 0.587890625
-arial η 0.7412109375
-arial θ 0.7412109375
-arial ι 0.2958984375
-arial κ 0.6669921875
-arial λ 0.6669921875
-arial μ 0.767578125
-arial ν 0.6669921875
-arial ξ 0.5966796875
-arial ο 0.7412109375
-arial π 0.919921875
-arial ρ 0.7578125
-arial σ 0.822265625
-arial τ 0.5263671875
-arial υ 0.728515625
-arial φ 0.8642578125
-arial χ 0.69921875
-arial ψ 0.9501953125
-arial ω 1.041015625
-arial Α 0.888671875
-arial Β 0.888671875
-arial Γ 0.734375
-arial Δ 0.890625
-arial Ε 0.888671875
-arial Ζ 0.814453125
-arial Η 0.962890625
-arial Θ 1.037109375
-arial Ι 0.3701171875
-arial Κ 0.888671875
-arial Λ 0.890625
-arial Μ 1.1103515625
-arial Ν 0.962890625
-arial Ξ 0.8662109375
-arial Ο 1.037109375
-arial Π 0.962890625
-arial Ρ 0.888671875
-arial Σ 0.82421875
-arial Τ 0.814453125
-arial Υ 0.888671875
-arial Φ 1.0634765625
-arial Χ 0.888671875
-arial Ψ 1.11328125
-arial Ω 0.99609375
-arial . 0.3701171875
-arial , 0.3701171875
-arial / 0.3701171875
-arial ? 0.7412109375
-arial < 0.7783203125
-arial > 0.7783203125
-arial { 0.4453125
-arial } 0.4453125
-arial [ 0.3701171875
-arial ] 0.3701171875
-arial ( 0.4443359375
-arial ) 0.4443359375
-arial + 0.7783203125
-arial - 0.4443359375
-arial _ 0.7412109375
-arial = 0.7783203125
-arial ^ 0.6259765625
-arial : 0.3701171875
-arial ; 0.3701171875
-arial % 1.185546875
-arial * 0.5185546875
-arial 0.3701171875
-times_new_roman a 0.591796875
-times_new_roman b 0.6669921875
-times_new_roman c 0.591796875
-times_new_roman d 0.6669921875
-times_new_roman e 0.591796875
-times_new_roman f 0.4443359375
-times_new_roman g 0.6669921875
-times_new_roman h 0.6669921875
-times_new_roman i 0.3701171875
-times_new_roman j 0.3701171875
-times_new_roman k 0.6669921875
-times_new_roman l 0.3701171875
-times_new_roman m 1.037109375
-times_new_roman n 0.6669921875
-times_new_roman o 0.6669921875
-times_new_roman p 0.6669921875
-times_new_roman q 0.6669921875
-times_new_roman r 0.4443359375
-times_new_roman s 0.5185546875
-times_new_roman t 0.3701171875
-times_new_roman u 0.6669921875
-times_new_roman v 0.6669921875
-times_new_roman w 0.962890625
-times_new_roman x 0.6669921875
-times_new_roman y 0.6669921875
-times_new_roman z 0.591796875
-times_new_roman A 0.962890625
-times_new_roman B 0.888671875
-times_new_roman C 0.888671875
-times_new_roman D 0.962890625
-times_new_roman E 0.814453125
-times_new_roman F 0.7412109375
-times_new_roman G 0.962890625
-times_new_roman H 0.962890625
-times_new_roman I 0.4443359375
-times_new_roman J 0.5185546875
-times_new_roman K 0.962890625
-times_new_roman L 0.814453125
-times_new_roman M 1.185546875
-times_new_roman N 0.962890625
-times_new_roman O 0.962890625
-times_new_roman P 0.7412109375
-times_new_roman Q 0.962890625
-times_new_roman R 0.888671875
-times_new_roman S 0.7412109375
-times_new_roman T 0.814453125
-times_new_roman U 0.962890625
-times_new_roman V 0.962890625
-times_new_roman W 1.2578125
-times_new_roman X 0.962890625
-times_new_roman Y 0.962890625
-times_new_roman Z 0.814453125
-times_new_roman 0 0.6669921875
-times_new_roman 1 0.6669921875
-times_new_roman 2 0.6669921875
-times_new_roman 3 0.6669921875
-times_new_roman 4 0.6669921875
-times_new_roman 5 0.6669921875
-times_new_roman 6 0.6669921875
-times_new_roman 7 0.6669921875
-times_new_roman 8 0.6669921875
-times_new_roman 9 0.6669921875
-times_new_roman ⁰ 0.5625
-times_new_roman ¹ 0.3994140625
-times_new_roman ² 0.3994140625
-times_new_roman ³ 0.3994140625
-times_new_roman ⁴ 0.5625
-times_new_roman ⁵ 0.5625
-times_new_roman ⁶ 0.5625
-times_new_roman ⁷ 0.5625
-times_new_roman ⁸ 0.5625
-times_new_roman ⁹ 0.5625
-times_new_roman ⁺ 0.5625
-times_new_roman ⁻ 0.5625
-times_new_roman ⁼ 0.5625
-times_new_roman ⁽ 0.30078125
-times_new_roman ⁾ 0.30078125
-times_new_roman ⁿ 0.419921875
-times_new_roman ⁱ 0.2890625
-times_new_roman ₀ 0.5625
-times_new_roman ₁ 0.5625
-times_new_roman ₂ 0.5625
-times_new_roman ₃ 0.5625
-times_new_roman ₄ 0.5625
-times_new_roman ₅ 0.5625
-times_new_roman ₆ 0.5625
-times_new_roman ₇ 0.5625
-times_new_roman ₈ 0.5625
-times_new_roman ₉ 0.5625
-times_new_roman ₊ 0.5625
-times_new_roman ₋ 0.5625
-times_new_roman ₌ 0.5625
-times_new_roman ₍ 0.30078125
-times_new_roman ₎ 0.30078125
-times_new_roman ₐ 0.3642578125
-times_new_roman ₑ 0.341796875
-times_new_roman ₒ 0.3837890625
-times_new_roman ₓ 0.38671875
-times_new_roman ₔ 0.341796875
-times_new_roman α 0.6982421875
-times_new_roman β 0.677734375
-times_new_roman γ 0.5888671875
-times_new_roman δ 0.6279296875
-times_new_roman ε 0.5595703125
-times_new_roman ζ 0.5517578125
-times_new_roman η 0.697265625
-times_new_roman θ 0.638671875
-times_new_roman ι 0.3583984375
-times_new_roman κ 0.671875
-times_new_roman λ 0.646484375
-times_new_roman μ 0.71484375
-times_new_roman ν 0.6025390625
-times_new_roman ξ 0.5947265625
-times_new_roman ο 0.6669921875
-times_new_roman π 0.6728515625
-times_new_roman ρ 0.6650390625
-times_new_roman σ 0.71875
-times_new_roman τ 0.5361328125
-times_new_roman υ 0.66015625
-times_new_roman φ 0.76953125
-times_new_roman χ 0.591796875
-times_new_roman ψ 0.833984375
-times_new_roman ω 0.876953125
-times_new_roman Α 0.962890625
-times_new_roman Β 0.888671875
-times_new_roman Γ 0.7705078125
-times_new_roman Δ 0.857421875
-times_new_roman Ε 0.814453125
-times_new_roman Ζ 0.814453125
-times_new_roman Η 0.962890625
-times_new_roman Θ 0.962890625
-times_new_roman Ι 0.4443359375
-times_new_roman Κ 0.962890625
-times_new_roman Λ 0.966796875
-times_new_roman Μ 1.185546875
-times_new_roman Ν 0.962890625
-times_new_roman Ξ 0.857421875
-times_new_roman Ο 0.962890625
-times_new_roman Π 0.962890625
-times_new_roman Ρ 0.7412109375
-times_new_roman Σ 0.775390625
-times_new_roman Τ 0.814453125
-times_new_roman Υ 0.962890625
-times_new_roman Φ 0.974609375
-times_new_roman Χ 0.962890625
-times_new_roman Ψ 0.9833984375
-times_new_roman Ω 0.990234375
-times_new_roman . 0.3330078125
-times_new_roman , 0.3330078125
-times_new_roman / 0.3701171875
-times_new_roman ? 0.591796875
-times_new_roman < 0.751953125
-times_new_roman > 0.751953125
-times_new_roman { 0.6396484375
-times_new_roman } 0.6396484375
-times_new_roman [ 0.4443359375
-times_new_roman ] 0.4443359375
-times_new_roman ( 0.4443359375
-times_new_roman ) 0.4443359375
-times_new_roman + 0.751953125
-times_new_roman - 0.4443359375
-times_new_roman _ 0.6669921875
-times_new_roman = 0.751953125
-times_new_roman ^ 0.6259765625
-times_new_roman : 0.3701171875
-times_new_roman ; 0.3701171875
-times_new_roman % 1.1103515625
-times_new_roman * 0.6669921875
-times_new_roman 0.3330078125
-helvetica a 0.7412109375
-helvetica b 0.7412109375
-helvetica c 0.6669921875
-helvetica d 0.7412109375
-helvetica e 0.7412109375
-helvetica f 0.3701171875
-helvetica g 0.7412109375
-helvetica h 0.7412109375
-helvetica i 0.2958984375
-helvetica j 0.2958984375
-helvetica k 0.6669921875
-helvetica l 0.2958984375
-helvetica m 1.1103515625
-helvetica n 0.7412109375
-helvetica o 0.7412109375
-helvetica p 0.7412109375
-helvetica q 0.7412109375
-helvetica r 0.4443359375
-helvetica s 0.6669921875
-helvetica t 0.3701171875
-helvetica u 0.7412109375
-helvetica v 0.6669921875
-helvetica w 0.962890625
-helvetica x 0.6669921875
-helvetica y 0.6669921875
-helvetica z 0.6669921875
-helvetica A 0.888671875
-helvetica B 0.888671875
-helvetica C 0.962890625
-helvetica D 0.962890625
-helvetica E 0.888671875
-helvetica F 0.814453125
-helvetica G 1.037109375
-helvetica H 0.962890625
-helvetica I 0.3701171875
-helvetica J 0.6669921875
-helvetica K 0.888671875
-helvetica L 0.7412109375
-helvetica M 1.1103515625
-helvetica N 0.962890625
-helvetica O 1.037109375
-helvetica P 0.888671875
-helvetica Q 1.037109375
-helvetica R 0.962890625
-helvetica S 0.888671875
-helvetica T 0.814453125
-helvetica U 0.962890625
-helvetica V 0.888671875
-helvetica W 1.2578125
-helvetica X 0.888671875
-helvetica Y 0.888671875
-helvetica Z 0.814453125
-helvetica 0 0.7412109375
-helvetica 1 0.7412109375
-helvetica 2 0.7412109375
-helvetica 3 0.7412109375
-helvetica 4 0.7412109375
-helvetica 5 0.7412109375
-helvetica 6 0.7412109375
-helvetica 7 0.7412109375
-helvetica 8 0.7412109375
-helvetica 9 0.7412109375
-helvetica ⁰ 0.37109375
-helvetica ¹ 0.4443359375
-helvetica ² 0.4443359375
-helvetica ³ 0.4443359375
-helvetica ⁴ 0.3701171875
-helvetica ⁵ 0.3701171875
-helvetica ⁶ 0.37109375
-helvetica ⁷ 0.3701171875
-helvetica ⁸ 0.37109375
-helvetica ⁹ 0.3701171875
-helvetica ⁺ 0.3896484375
-helvetica ⁻ 0.2216796875
-helvetica ⁼ 0.3896484375
-helvetica ⁽ 0.2216796875
-helvetica ⁾ 0.2216796875
-helvetica ⁿ 0.37109375
-helvetica ⁱ 0.1484375
-helvetica ₀ 0.37109375
-helvetica ₁ 0.37109375
-helvetica ₂ 0.3701171875
-helvetica ₃ 0.3701171875
-helvetica ₄ 0.3701171875
-helvetica ₅ 0.3701171875
-helvetica ₆ 0.37109375
-helvetica ₇ 0.3701171875
-helvetica ₈ 0.37109375
-helvetica ₉ 0.3701171875
-helvetica ₊ 0.3896484375
-helvetica ₋ 0.2216796875
-helvetica ₌ 0.3896484375
-helvetica ₍ 0.2216796875
-helvetica ₎ 0.2216796875
-helvetica ₐ 0.37109375
-helvetica ₑ 0.37109375
-helvetica ₒ 0.37109375
-helvetica ₓ 0.3330078125
-helvetica ₔ 0.37109375
-helvetica α 0.814453125
-helvetica β 0.814453125
-helvetica γ 0.7412109375
-helvetica δ 0.814453125
-helvetica ε 0.7412109375
-helvetica ζ 0.591796875
-helvetica η 0.814453125
-helvetica θ 0.8154296875
-helvetica ι 0.3701171875
-helvetica κ 0.7412109375
-helvetica λ 0.7412109375
-helvetica μ 0.814453125
-helvetica ν 0.7412109375
-helvetica ξ 0.6669921875
-helvetica ο 0.814453125
-helvetica π 0.7314453125
-helvetica ρ 0.814453125
-helvetica σ 0.814453125
-helvetica τ 0.6669921875
-helvetica υ 0.814453125
-helvetica φ 0.962890625
-helvetica χ 0.7412109375
-helvetica ψ 0.962890625
-helvetica ω 1.009765625
-helvetica Α 0.888671875
-helvetica Β 0.962890625
-helvetica Γ 0.814453125
-helvetica Δ 0.962890625
-helvetica Ε 0.888671875
-helvetica Ζ 0.814453125
-helvetica Η 0.962890625
-helvetica Θ 1.037109375
-helvetica Ι 0.3701171875
-helvetica Κ 0.888671875
-helvetica Λ 0.888671875
-helvetica Μ 1.185546875
-helvetica Ν 0.962890625
-helvetica Ξ 0.814453125
-helvetica Ο 1.037109375
-helvetica Π 0.962890625
-helvetica Ρ 0.888671875
-helvetica Σ 0.814453125
-helvetica Τ 0.8125
-helvetica Υ 0.888671875
-helvetica Φ 0.962890625
-helvetica Χ 0.890625
-helvetica Ψ 1.109375
-helvetica Ω 1.037109375
-helvetica . 0.3701171875
-helvetica , 0.3701171875
-helvetica / 0.3701171875
-helvetica ? 0.7412109375
-helvetica < 0.7783203125
-helvetica > 0.7783203125
-helvetica { 0.4453125
-helvetica } 0.4453125
-helvetica [ 0.3701171875
-helvetica ] 0.3701171875
-helvetica ( 0.4443359375
-helvetica ) 0.4443359375
-helvetica + 0.7783203125
-helvetica - 0.4443359375
-helvetica _ 0.7412109375
-helvetica = 0.7783203125
-helvetica ^ 0.6259765625
-helvetica : 0.3701171875
-helvetica ; 0.3701171875
-helvetica % 1.185546875
-helvetica * 0.5185546875
-helvetica 0.3701171875
-garamond a 0.7412109375
-garamond b 0.7412109375
-garamond c 0.6669921875
-garamond d 0.7412109375
-garamond e 0.7412109375
-garamond f 0.3701171875
-garamond g 0.7412109375
-garamond h 0.7412109375
-garamond i 0.2958984375
-garamond j 0.2958984375
-garamond k 0.6669921875
-garamond l 0.2958984375
-garamond m 1.1103515625
-garamond n 0.7412109375
-garamond o 0.7412109375
-garamond p 0.7412109375
-garamond q 0.7412109375
-garamond r 0.4443359375
-garamond s 0.6669921875
-garamond t 0.3701171875
-garamond u 0.7412109375
-garamond v 0.6669921875
-garamond w 0.962890625
-garamond x 0.6669921875
-garamond y 0.6669921875
-garamond z 0.6669921875
-garamond A 0.888671875
-garamond B 0.888671875
-garamond C 0.962890625
-garamond D 0.962890625
-garamond E 0.888671875
-garamond F 0.814453125
-garamond G 1.037109375
-garamond H 0.962890625
-garamond I 0.3701171875
-garamond J 0.6669921875
-garamond K 0.888671875
-garamond L 0.7412109375
-garamond M 1.1103515625
-garamond N 0.962890625
-garamond O 1.037109375
-garamond P 0.888671875
-garamond Q 1.037109375
-garamond R 0.962890625
-garamond S 0.888671875
-garamond T 0.814453125
-garamond U 0.962890625
-garamond V 0.888671875
-garamond W 1.2578125
-garamond X 0.888671875
-garamond Y 0.888671875
-garamond Z 0.814453125
-garamond 0 0.7412109375
-garamond 1 0.7412109375
-garamond 2 0.7412109375
-garamond 3 0.7412109375
-garamond 4 0.7412109375
-garamond 5 0.7412109375
-garamond 6 0.7412109375
-garamond 7 0.7412109375
-garamond 8 0.7412109375
-garamond 9 0.7412109375
-garamond ⁰ 0.37109375
-garamond ¹ 0.4443359375
-garamond ² 0.4443359375
-garamond ³ 0.4443359375
-garamond ⁴ 0.3701171875
-garamond ⁵ 0.3701171875
-garamond ⁶ 0.37109375
-garamond ⁷ 0.3701171875
-garamond ⁸ 0.37109375
-garamond ⁹ 0.3701171875
-garamond ⁺ 0.3896484375
-garamond ⁻ 0.2216796875
-garamond ⁼ 0.3896484375
-garamond ⁽ 0.2216796875
-garamond ⁾ 0.2216796875
-garamond ⁿ 0.37109375
-garamond ⁱ 0.1484375
-garamond ₀ 0.37109375
-garamond ₁ 0.37109375
-garamond ₂ 0.3701171875
-garamond ₃ 0.3701171875
-garamond ₄ 0.3701171875
-garamond ₅ 0.3701171875
-garamond ₆ 0.37109375
-garamond ₇ 0.3701171875
-garamond ₈ 0.37109375
-garamond ₉ 0.3701171875
-garamond ₊ 0.3896484375
-garamond ₋ 0.2216796875
-garamond ₌ 0.3896484375
-garamond ₍ 0.2216796875
-garamond ₎ 0.2216796875
-garamond ₐ 0.37109375
-garamond ₑ 0.37109375
-garamond ₒ 0.37109375
-garamond ₓ 0.3330078125
-garamond ₔ 0.37109375
-garamond α 0.814453125
-garamond β 0.814453125
-garamond γ 0.7412109375
-garamond δ 0.814453125
-garamond ε 0.7412109375
-garamond ζ 0.591796875
-garamond η 0.814453125
-garamond θ 0.8154296875
-garamond ι 0.3701171875
-garamond κ 0.7412109375
-garamond λ 0.7412109375
-garamond μ 0.814453125
-garamond ν 0.7412109375
-garamond ξ 0.6669921875
-garamond ο 0.814453125
-garamond π 0.7314453125
-garamond ρ 0.814453125
-garamond σ 0.814453125
-garamond τ 0.6669921875
-garamond υ 0.814453125
-garamond φ 0.962890625
-garamond χ 0.7412109375
-garamond ψ 0.962890625
-garamond ω 1.009765625
-garamond Α 0.888671875
-garamond Β 0.962890625
-garamond Γ 0.814453125
-garamond Δ 0.962890625
-garamond Ε 0.888671875
-garamond Ζ 0.814453125
-garamond Η 0.962890625
-garamond Θ 1.037109375
-garamond Ι 0.3701171875
-garamond Κ 0.888671875
-garamond Λ 0.888671875
-garamond Μ 1.185546875
-garamond Ν 0.962890625
-garamond Ξ 0.814453125
-garamond Ο 1.037109375
-garamond Π 0.962890625
-garamond Ρ 0.888671875
-garamond Σ 0.814453125
-garamond Τ 0.8125
-garamond Υ 0.888671875
-garamond Φ 0.962890625
-garamond Χ 0.890625
-garamond Ψ 1.109375
-garamond Ω 1.037109375
-garamond . 0.3701171875
-garamond , 0.3701171875
-garamond / 0.3701171875
-garamond ? 0.7412109375
-garamond < 0.7783203125
-garamond > 0.7783203125
-garamond { 0.4453125
-garamond } 0.4453125
-garamond [ 0.3701171875
-garamond ] 0.3701171875
-garamond ( 0.4443359375
-garamond ) 0.4443359375
-garamond + 0.7783203125
-garamond - 0.4443359375
-garamond _ 0.7412109375
-garamond = 0.7783203125
-garamond ^ 0.6259765625
-garamond : 0.3701171875
-garamond ; 0.3701171875
-garamond % 1.185546875
-garamond * 0.5185546875
-garamond 0.3701171875
+calibri a 0.7412109375
+calibri b 0.7412109375
+calibri c 0.6669921875
+calibri d 0.7412109375
+calibri e 0.7412109375
+calibri f 0.3701171875
+calibri g 0.7412109375
+calibri h 0.7412109375
+calibri i 0.2958984375
+calibri j 0.2958984375
+calibri k 0.6669921875
+calibri l 0.2958984375
+calibri m 1.1103515625
+calibri n 0.7412109375
+calibri o 0.7412109375
+calibri p 0.7412109375
+calibri q 0.7412109375
+calibri r 0.4443359375
+calibri s 0.6669921875
+calibri t 0.3701171875
+calibri u 0.7412109375
+calibri v 0.6669921875
+calibri w 0.962890625
+calibri x 0.6669921875
+calibri y 0.6669921875
+calibri z 0.6669921875
+calibri A 0.888671875
+calibri B 0.888671875
+calibri C 0.962890625
+calibri D 0.962890625
+calibri E 0.888671875
+calibri F 0.814453125
+calibri G 1.037109375
+calibri H 0.962890625
+calibri I 0.3701171875
+calibri J 0.6669921875
+calibri K 0.888671875
+calibri L 0.7412109375
+calibri M 1.1103515625
+calibri N 0.962890625
+calibri O 1.037109375
+calibri P 0.888671875
+calibri Q 1.037109375
+calibri R 0.962890625
+calibri S 0.888671875
+calibri T 0.814453125
+calibri U 0.962890625
+calibri V 0.888671875
+calibri W 1.2578125
+calibri X 0.888671875
+calibri Y 0.888671875
+calibri Z 0.814453125
+calibri 0 0.7412109375
+calibri 1 0.7412109375
+calibri 2 0.7412109375
+calibri 3 0.7412109375
+calibri 4 0.7412109375
+calibri 5 0.7412109375
+calibri 6 0.7412109375
+calibri 7 0.7412109375
+calibri 8 0.7412109375
+calibri 9 0.7412109375
+calibri ⁰ 0.37109375
+calibri ¹ 0.4443359375
+calibri ² 0.4443359375
+calibri ³ 0.4443359375
+calibri ⁴ 0.3701171875
+calibri ⁵ 0.3701171875
+calibri ⁶ 0.37109375
+calibri ⁷ 0.3701171875
+calibri ⁸ 0.37109375
+calibri ⁹ 0.3701171875
+calibri ⁺ 0.3896484375
+calibri ⁻ 0.2216796875
+calibri ⁼ 0.3896484375
+calibri ⁽ 0.2216796875
+calibri ⁾ 0.2216796875
+calibri ⁿ 0.37109375
+calibri ⁱ 0.1484375
+calibri ₀ 0.37109375
+calibri ₁ 0.37109375
+calibri ₂ 0.3701171875
+calibri ₃ 0.3701171875
+calibri ₄ 0.3701171875
+calibri ₅ 0.3701171875
+calibri ₆ 0.37109375
+calibri ₇ 0.3701171875
+calibri ₈ 0.37109375
+calibri ₉ 0.3701171875
+calibri ₊ 0.3896484375
+calibri ₋ 0.2216796875
+calibri ₌ 0.3896484375
+calibri ₍ 0.2216796875
+calibri ₎ 0.2216796875
+calibri ₐ 0.37109375
+calibri ₑ 0.37109375
+calibri ₒ 0.37109375
+calibri ₓ 0.3330078125
+calibri ₔ 0.37109375
+calibri α 0.814453125
+calibri β 0.814453125
+calibri γ 0.7412109375
+calibri δ 0.814453125
+calibri ε 0.7412109375
+calibri ζ 0.591796875
+calibri η 0.814453125
+calibri θ 0.8154296875
+calibri ι 0.3701171875
+calibri κ 0.7412109375
+calibri λ 0.7412109375
+calibri μ 0.814453125
+calibri ν 0.7412109375
+calibri ξ 0.6669921875
+calibri ο 0.814453125
+calibri π 0.7314453125
+calibri ρ 0.814453125
+calibri σ 0.814453125
+calibri τ 0.6669921875
+calibri υ 0.814453125
+calibri φ 0.962890625
+calibri χ 0.7412109375
+calibri ψ 0.962890625
+calibri ω 1.009765625
+calibri Α 0.888671875
+calibri Β 0.962890625
+calibri Γ 0.814453125
+calibri Δ 0.962890625
+calibri Ε 0.888671875
+calibri Ζ 0.814453125
+calibri Η 0.962890625
+calibri Θ 1.037109375
+calibri Ι 0.3701171875
+calibri Κ 0.888671875
+calibri Λ 0.888671875
+calibri Μ 1.185546875
+calibri Ν 0.962890625
+calibri Ξ 0.814453125
+calibri Ο 1.037109375
+calibri Π 0.962890625
+calibri Ρ 0.888671875
+calibri Σ 0.814453125
+calibri Τ 0.8125
+calibri Υ 0.888671875
+calibri Φ 0.962890625
+calibri Χ 0.890625
+calibri Ψ 1.109375
+calibri Ω 1.037109375
+calibri . 0.3701171875
+calibri , 0.3701171875
+calibri / 0.3701171875
+calibri ? 0.7412109375
+calibri < 0.7783203125
+calibri > 0.7783203125
+calibri { 0.4453125
+calibri } 0.4453125
+calibri [ 0.3701171875
+calibri ] 0.3701171875
+calibri ( 0.4443359375
+calibri ) 0.4443359375
+calibri + 0.7783203125
+calibri - 0.4443359375
+calibri _ 0.7412109375
+calibri = 0.7783203125
+calibri ^ 0.6259765625
+calibri : 0.3701171875
+calibri ; 0.3701171875
+calibri % 1.185546875
+calibri * 0.5185546875
+calibri 0.3701171875
+arial a 0.7412109375
+arial b 0.7412109375
+arial c 0.6669921875
+arial d 0.7412109375
+arial e 0.7412109375
+arial f 0.3701171875
+arial g 0.7412109375
+arial h 0.7412109375
+arial i 0.2958984375
+arial j 0.2958984375
+arial k 0.6669921875
+arial l 0.2958984375
+arial m 1.1103515625
+arial n 0.7412109375
+arial o 0.7412109375
+arial p 0.7412109375
+arial q 0.7412109375
+arial r 0.4443359375
+arial s 0.6669921875
+arial t 0.3701171875
+arial u 0.7412109375
+arial v 0.6669921875
+arial w 0.962890625
+arial x 0.6669921875
+arial y 0.6669921875
+arial z 0.6669921875
+arial A 0.888671875
+arial B 0.888671875
+arial C 0.962890625
+arial D 0.962890625
+arial E 0.888671875
+arial F 0.814453125
+arial G 1.037109375
+arial H 0.962890625
+arial I 0.3701171875
+arial J 0.6669921875
+arial K 0.888671875
+arial L 0.7412109375
+arial M 1.1103515625
+arial N 0.962890625
+arial O 1.037109375
+arial P 0.888671875
+arial Q 1.037109375
+arial R 0.962890625
+arial S 0.888671875
+arial T 0.814453125
+arial U 0.962890625
+arial V 0.888671875
+arial W 1.2578125
+arial X 0.888671875
+arial Y 0.888671875
+arial Z 0.814453125
+arial 0 0.7412109375
+arial 1 0.7412109375
+arial 2 0.7412109375
+arial 3 0.7412109375
+arial 4 0.7412109375
+arial 5 0.7412109375
+arial 6 0.7412109375
+arial 7 0.7412109375
+arial 8 0.7412109375
+arial 9 0.7412109375
+arial ⁰ 0.5625
+arial ¹ 0.4443359375
+arial ² 0.4443359375
+arial ³ 0.4443359375
+arial ⁴ 0.5625
+arial ⁵ 0.5625
+arial ⁶ 0.5625
+arial ⁷ 0.5625
+arial ⁸ 0.5625
+arial ⁹ 0.5625
+arial ⁺ 0.5625
+arial ⁻ 0.5625
+arial ⁼ 0.5625
+arial ⁽ 0.30078125
+arial ⁾ 0.30078125
+arial ⁿ 0.486328125
+arial ⁱ 0.2890625
+arial ₀ 0.5625
+arial ₁ 0.5625
+arial ₂ 0.5625
+arial ₃ 0.5625
+arial ₄ 0.5625
+arial ₅ 0.5625
+arial ₆ 0.5625
+arial ₇ 0.5625
+arial ₈ 0.5625
+arial ₉ 0.5625
+arial ₊ 0.5625
+arial ₋ 0.5625
+arial ₌ 0.5625
+arial ₍ 0.30078125
+arial ₎ 0.30078125
+arial ₐ 0.49609375
+arial ₑ 0.4951171875
+arial ₒ 0.5029296875
+arial ₓ 0.4375
+arial ₔ 0.4951171875
+arial α 0.7705078125
+arial β 0.7666015625
+arial γ 0.6669921875
+arial δ 0.7421875
+arial ε 0.5947265625
+arial ζ 0.587890625
+arial η 0.7412109375
+arial θ 0.7412109375
+arial ι 0.2958984375
+arial κ 0.6669921875
+arial λ 0.6669921875
+arial μ 0.767578125
+arial ν 0.6669921875
+arial ξ 0.5966796875
+arial ο 0.7412109375
+arial π 0.919921875
+arial ρ 0.7578125
+arial σ 0.822265625
+arial τ 0.5263671875
+arial υ 0.728515625
+arial φ 0.8642578125
+arial χ 0.69921875
+arial ψ 0.9501953125
+arial ω 1.041015625
+arial Α 0.888671875
+arial Β 0.888671875
+arial Γ 0.734375
+arial Δ 0.890625
+arial Ε 0.888671875
+arial Ζ 0.814453125
+arial Η 0.962890625
+arial Θ 1.037109375
+arial Ι 0.3701171875
+arial Κ 0.888671875
+arial Λ 0.890625
+arial Μ 1.1103515625
+arial Ν 0.962890625
+arial Ξ 0.8662109375
+arial Ο 1.037109375
+arial Π 0.962890625
+arial Ρ 0.888671875
+arial Σ 0.82421875
+arial Τ 0.814453125
+arial Υ 0.888671875
+arial Φ 1.0634765625
+arial Χ 0.888671875
+arial Ψ 1.11328125
+arial Ω 0.99609375
+arial . 0.3701171875
+arial , 0.3701171875
+arial / 0.3701171875
+arial ? 0.7412109375
+arial < 0.7783203125
+arial > 0.7783203125
+arial { 0.4453125
+arial } 0.4453125
+arial [ 0.3701171875
+arial ] 0.3701171875
+arial ( 0.4443359375
+arial ) 0.4443359375
+arial + 0.7783203125
+arial - 0.4443359375
+arial _ 0.7412109375
+arial = 0.7783203125
+arial ^ 0.6259765625
+arial : 0.3701171875
+arial ; 0.3701171875
+arial % 1.185546875
+arial * 0.5185546875
+arial 0.3701171875
+times_new_roman a 0.591796875
+times_new_roman b 0.6669921875
+times_new_roman c 0.591796875
+times_new_roman d 0.6669921875
+times_new_roman e 0.591796875
+times_new_roman f 0.4443359375
+times_new_roman g 0.6669921875
+times_new_roman h 0.6669921875
+times_new_roman i 0.3701171875
+times_new_roman j 0.3701171875
+times_new_roman k 0.6669921875
+times_new_roman l 0.3701171875
+times_new_roman m 1.037109375
+times_new_roman n 0.6669921875
+times_new_roman o 0.6669921875
+times_new_roman p 0.6669921875
+times_new_roman q 0.6669921875
+times_new_roman r 0.4443359375
+times_new_roman s 0.5185546875
+times_new_roman t 0.3701171875
+times_new_roman u 0.6669921875
+times_new_roman v 0.6669921875
+times_new_roman w 0.962890625
+times_new_roman x 0.6669921875
+times_new_roman y 0.6669921875
+times_new_roman z 0.591796875
+times_new_roman A 0.962890625
+times_new_roman B 0.888671875
+times_new_roman C 0.888671875
+times_new_roman D 0.962890625
+times_new_roman E 0.814453125
+times_new_roman F 0.7412109375
+times_new_roman G 0.962890625
+times_new_roman H 0.962890625
+times_new_roman I 0.4443359375
+times_new_roman J 0.5185546875
+times_new_roman K 0.962890625
+times_new_roman L 0.814453125
+times_new_roman M 1.185546875
+times_new_roman N 0.962890625
+times_new_roman O 0.962890625
+times_new_roman P 0.7412109375
+times_new_roman Q 0.962890625
+times_new_roman R 0.888671875
+times_new_roman S 0.7412109375
+times_new_roman T 0.814453125
+times_new_roman U 0.962890625
+times_new_roman V 0.962890625
+times_new_roman W 1.2578125
+times_new_roman X 0.962890625
+times_new_roman Y 0.962890625
+times_new_roman Z 0.814453125
+times_new_roman 0 0.6669921875
+times_new_roman 1 0.6669921875
+times_new_roman 2 0.6669921875
+times_new_roman 3 0.6669921875
+times_new_roman 4 0.6669921875
+times_new_roman 5 0.6669921875
+times_new_roman 6 0.6669921875
+times_new_roman 7 0.6669921875
+times_new_roman 8 0.6669921875
+times_new_roman 9 0.6669921875
+times_new_roman ⁰ 0.5625
+times_new_roman ¹ 0.3994140625
+times_new_roman ² 0.3994140625
+times_new_roman ³ 0.3994140625
+times_new_roman ⁴ 0.5625
+times_new_roman ⁵ 0.5625
+times_new_roman ⁶ 0.5625
+times_new_roman ⁷ 0.5625
+times_new_roman ⁸ 0.5625
+times_new_roman ⁹ 0.5625
+times_new_roman ⁺ 0.5625
+times_new_roman ⁻ 0.5625
+times_new_roman ⁼ 0.5625
+times_new_roman ⁽ 0.30078125
+times_new_roman ⁾ 0.30078125
+times_new_roman ⁿ 0.419921875
+times_new_roman ⁱ 0.2890625
+times_new_roman ₀ 0.5625
+times_new_roman ₁ 0.5625
+times_new_roman ₂ 0.5625
+times_new_roman ₃ 0.5625
+times_new_roman ₄ 0.5625
+times_new_roman ₅ 0.5625
+times_new_roman ₆ 0.5625
+times_new_roman ₇ 0.5625
+times_new_roman ₈ 0.5625
+times_new_roman ₉ 0.5625
+times_new_roman ₊ 0.5625
+times_new_roman ₋ 0.5625
+times_new_roman ₌ 0.5625
+times_new_roman ₍ 0.30078125
+times_new_roman ₎ 0.30078125
+times_new_roman ₐ 0.3642578125
+times_new_roman ₑ 0.341796875
+times_new_roman ₒ 0.3837890625
+times_new_roman ₓ 0.38671875
+times_new_roman ₔ 0.341796875
+times_new_roman α 0.6982421875
+times_new_roman β 0.677734375
+times_new_roman γ 0.5888671875
+times_new_roman δ 0.6279296875
+times_new_roman ε 0.5595703125
+times_new_roman ζ 0.5517578125
+times_new_roman η 0.697265625
+times_new_roman θ 0.638671875
+times_new_roman ι 0.3583984375
+times_new_roman κ 0.671875
+times_new_roman λ 0.646484375
+times_new_roman μ 0.71484375
+times_new_roman ν 0.6025390625
+times_new_roman ξ 0.5947265625
+times_new_roman ο 0.6669921875
+times_new_roman π 0.6728515625
+times_new_roman ρ 0.6650390625
+times_new_roman σ 0.71875
+times_new_roman τ 0.5361328125
+times_new_roman υ 0.66015625
+times_new_roman φ 0.76953125
+times_new_roman χ 0.591796875
+times_new_roman ψ 0.833984375
+times_new_roman ω 0.876953125
+times_new_roman Α 0.962890625
+times_new_roman Β 0.888671875
+times_new_roman Γ 0.7705078125
+times_new_roman Δ 0.857421875
+times_new_roman Ε 0.814453125
+times_new_roman Ζ 0.814453125
+times_new_roman Η 0.962890625
+times_new_roman Θ 0.962890625
+times_new_roman Ι 0.4443359375
+times_new_roman Κ 0.962890625
+times_new_roman Λ 0.966796875
+times_new_roman Μ 1.185546875
+times_new_roman Ν 0.962890625
+times_new_roman Ξ 0.857421875
+times_new_roman Ο 0.962890625
+times_new_roman Π 0.962890625
+times_new_roman Ρ 0.7412109375
+times_new_roman Σ 0.775390625
+times_new_roman Τ 0.814453125
+times_new_roman Υ 0.962890625
+times_new_roman Φ 0.974609375
+times_new_roman Χ 0.962890625
+times_new_roman Ψ 0.9833984375
+times_new_roman Ω 0.990234375
+times_new_roman . 0.3330078125
+times_new_roman , 0.3330078125
+times_new_roman / 0.3701171875
+times_new_roman ? 0.591796875
+times_new_roman < 0.751953125
+times_new_roman > 0.751953125
+times_new_roman { 0.6396484375
+times_new_roman } 0.6396484375
+times_new_roman [ 0.4443359375
+times_new_roman ] 0.4443359375
+times_new_roman ( 0.4443359375
+times_new_roman ) 0.4443359375
+times_new_roman + 0.751953125
+times_new_roman - 0.4443359375
+times_new_roman _ 0.6669921875
+times_new_roman = 0.751953125
+times_new_roman ^ 0.6259765625
+times_new_roman : 0.3701171875
+times_new_roman ; 0.3701171875
+times_new_roman % 1.1103515625
+times_new_roman * 0.6669921875
+times_new_roman 0.3330078125
+helvetica a 0.7412109375
+helvetica b 0.7412109375
+helvetica c 0.6669921875
+helvetica d 0.7412109375
+helvetica e 0.7412109375
+helvetica f 0.3701171875
+helvetica g 0.7412109375
+helvetica h 0.7412109375
+helvetica i 0.2958984375
+helvetica j 0.2958984375
+helvetica k 0.6669921875
+helvetica l 0.2958984375
+helvetica m 1.1103515625
+helvetica n 0.7412109375
+helvetica o 0.7412109375
+helvetica p 0.7412109375
+helvetica q 0.7412109375
+helvetica r 0.4443359375
+helvetica s 0.6669921875
+helvetica t 0.3701171875
+helvetica u 0.7412109375
+helvetica v 0.6669921875
+helvetica w 0.962890625
+helvetica x 0.6669921875
+helvetica y 0.6669921875
+helvetica z 0.6669921875
+helvetica A 0.888671875
+helvetica B 0.888671875
+helvetica C 0.962890625
+helvetica D 0.962890625
+helvetica E 0.888671875
+helvetica F 0.814453125
+helvetica G 1.037109375
+helvetica H 0.962890625
+helvetica I 0.3701171875
+helvetica J 0.6669921875
+helvetica K 0.888671875
+helvetica L 0.7412109375
+helvetica M 1.1103515625
+helvetica N 0.962890625
+helvetica O 1.037109375
+helvetica P 0.888671875
+helvetica Q 1.037109375
+helvetica R 0.962890625
+helvetica S 0.888671875
+helvetica T 0.814453125
+helvetica U 0.962890625
+helvetica V 0.888671875
+helvetica W 1.2578125
+helvetica X 0.888671875
+helvetica Y 0.888671875
+helvetica Z 0.814453125
+helvetica 0 0.7412109375
+helvetica 1 0.7412109375
+helvetica 2 0.7412109375
+helvetica 3 0.7412109375
+helvetica 4 0.7412109375
+helvetica 5 0.7412109375
+helvetica 6 0.7412109375
+helvetica 7 0.7412109375
+helvetica 8 0.7412109375
+helvetica 9 0.7412109375
+helvetica ⁰ 0.37109375
+helvetica ¹ 0.4443359375
+helvetica ² 0.4443359375
+helvetica ³ 0.4443359375
+helvetica ⁴ 0.3701171875
+helvetica ⁵ 0.3701171875
+helvetica ⁶ 0.37109375
+helvetica ⁷ 0.3701171875
+helvetica ⁸ 0.37109375
+helvetica ⁹ 0.3701171875
+helvetica ⁺ 0.3896484375
+helvetica ⁻ 0.2216796875
+helvetica ⁼ 0.3896484375
+helvetica ⁽ 0.2216796875
+helvetica ⁾ 0.2216796875
+helvetica ⁿ 0.37109375
+helvetica ⁱ 0.1484375
+helvetica ₀ 0.37109375
+helvetica ₁ 0.37109375
+helvetica ₂ 0.3701171875
+helvetica ₃ 0.3701171875
+helvetica ₄ 0.3701171875
+helvetica ₅ 0.3701171875
+helvetica ₆ 0.37109375
+helvetica ₇ 0.3701171875
+helvetica ₈ 0.37109375
+helvetica ₉ 0.3701171875
+helvetica ₊ 0.3896484375
+helvetica ₋ 0.2216796875
+helvetica ₌ 0.3896484375
+helvetica ₍ 0.2216796875
+helvetica ₎ 0.2216796875
+helvetica ₐ 0.37109375
+helvetica ₑ 0.37109375
+helvetica ₒ 0.37109375
+helvetica ₓ 0.3330078125
+helvetica ₔ 0.37109375
+helvetica α 0.814453125
+helvetica β 0.814453125
+helvetica γ 0.7412109375
+helvetica δ 0.814453125
+helvetica ε 0.7412109375
+helvetica ζ 0.591796875
+helvetica η 0.814453125
+helvetica θ 0.8154296875
+helvetica ι 0.3701171875
+helvetica κ 0.7412109375
+helvetica λ 0.7412109375
+helvetica μ 0.814453125
+helvetica ν 0.7412109375
+helvetica ξ 0.6669921875
+helvetica ο 0.814453125
+helvetica π 0.7314453125
+helvetica ρ 0.814453125
+helvetica σ 0.814453125
+helvetica τ 0.6669921875
+helvetica υ 0.814453125
+helvetica φ 0.962890625
+helvetica χ 0.7412109375
+helvetica ψ 0.962890625
+helvetica ω 1.009765625
+helvetica Α 0.888671875
+helvetica Β 0.962890625
+helvetica Γ 0.814453125
+helvetica Δ 0.962890625
+helvetica Ε 0.888671875
+helvetica Ζ 0.814453125
+helvetica Η 0.962890625
+helvetica Θ 1.037109375
+helvetica Ι 0.3701171875
+helvetica Κ 0.888671875
+helvetica Λ 0.888671875
+helvetica Μ 1.185546875
+helvetica Ν 0.962890625
+helvetica Ξ 0.814453125
+helvetica Ο 1.037109375
+helvetica Π 0.962890625
+helvetica Ρ 0.888671875
+helvetica Σ 0.814453125
+helvetica Τ 0.8125
+helvetica Υ 0.888671875
+helvetica Φ 0.962890625
+helvetica Χ 0.890625
+helvetica Ψ 1.109375
+helvetica Ω 1.037109375
+helvetica . 0.3701171875
+helvetica , 0.3701171875
+helvetica / 0.3701171875
+helvetica ? 0.7412109375
+helvetica < 0.7783203125
+helvetica > 0.7783203125
+helvetica { 0.4453125
+helvetica } 0.4453125
+helvetica [ 0.3701171875
+helvetica ] 0.3701171875
+helvetica ( 0.4443359375
+helvetica ) 0.4443359375
+helvetica + 0.7783203125
+helvetica - 0.4443359375
+helvetica _ 0.7412109375
+helvetica = 0.7783203125
+helvetica ^ 0.6259765625
+helvetica : 0.3701171875
+helvetica ; 0.3701171875
+helvetica % 1.185546875
+helvetica * 0.5185546875
+helvetica 0.3701171875
+garamond a 0.7412109375
+garamond b 0.7412109375
+garamond c 0.6669921875
+garamond d 0.7412109375
+garamond e 0.7412109375
+garamond f 0.3701171875
+garamond g 0.7412109375
+garamond h 0.7412109375
+garamond i 0.2958984375
+garamond j 0.2958984375
+garamond k 0.6669921875
+garamond l 0.2958984375
+garamond m 1.1103515625
+garamond n 0.7412109375
+garamond o 0.7412109375
+garamond p 0.7412109375
+garamond q 0.7412109375
+garamond r 0.4443359375
+garamond s 0.6669921875
+garamond t 0.3701171875
+garamond u 0.7412109375
+garamond v 0.6669921875
+garamond w 0.962890625
+garamond x 0.6669921875
+garamond y 0.6669921875
+garamond z 0.6669921875
+garamond A 0.888671875
+garamond B 0.888671875
+garamond C 0.962890625
+garamond D 0.962890625
+garamond E 0.888671875
+garamond F 0.814453125
+garamond G 1.037109375
+garamond H 0.962890625
+garamond I 0.3701171875
+garamond J 0.6669921875
+garamond K 0.888671875
+garamond L 0.7412109375
+garamond M 1.1103515625
+garamond N 0.962890625
+garamond O 1.037109375
+garamond P 0.888671875
+garamond Q 1.037109375
+garamond R 0.962890625
+garamond S 0.888671875
+garamond T 0.814453125
+garamond U 0.962890625
+garamond V 0.888671875
+garamond W 1.2578125
+garamond X 0.888671875
+garamond Y 0.888671875
+garamond Z 0.814453125
+garamond 0 0.7412109375
+garamond 1 0.7412109375
+garamond 2 0.7412109375
+garamond 3 0.7412109375
+garamond 4 0.7412109375
+garamond 5 0.7412109375
+garamond 6 0.7412109375
+garamond 7 0.7412109375
+garamond 8 0.7412109375
+garamond 9 0.7412109375
+garamond ⁰ 0.37109375
+garamond ¹ 0.4443359375
+garamond ² 0.4443359375
+garamond ³ 0.4443359375
+garamond ⁴ 0.3701171875
+garamond ⁵ 0.3701171875
+garamond ⁶ 0.37109375
+garamond ⁷ 0.3701171875
+garamond ⁸ 0.37109375
+garamond ⁹ 0.3701171875
+garamond ⁺ 0.3896484375
+garamond ⁻ 0.2216796875
+garamond ⁼ 0.3896484375
+garamond ⁽ 0.2216796875
+garamond ⁾ 0.2216796875
+garamond ⁿ 0.37109375
+garamond ⁱ 0.1484375
+garamond ₀ 0.37109375
+garamond ₁ 0.37109375
+garamond ₂ 0.3701171875
+garamond ₃ 0.3701171875
+garamond ₄ 0.3701171875
+garamond ₅ 0.3701171875
+garamond ₆ 0.37109375
+garamond ₇ 0.3701171875
+garamond ₈ 0.37109375
+garamond ₉ 0.3701171875
+garamond ₊ 0.3896484375
+garamond ₋ 0.2216796875
+garamond ₌ 0.3896484375
+garamond ₍ 0.2216796875
+garamond ₎ 0.2216796875
+garamond ₐ 0.37109375
+garamond ₑ 0.37109375
+garamond ₒ 0.37109375
+garamond ₓ 0.3330078125
+garamond ₔ 0.37109375
+garamond α 0.814453125
+garamond β 0.814453125
+garamond γ 0.7412109375
+garamond δ 0.814453125
+garamond ε 0.7412109375
+garamond ζ 0.591796875
+garamond η 0.814453125
+garamond θ 0.8154296875
+garamond ι 0.3701171875
+garamond κ 0.7412109375
+garamond λ 0.7412109375
+garamond μ 0.814453125
+garamond ν 0.7412109375
+garamond ξ 0.6669921875
+garamond ο 0.814453125
+garamond π 0.7314453125
+garamond ρ 0.814453125
+garamond σ 0.814453125
+garamond τ 0.6669921875
+garamond υ 0.814453125
+garamond φ 0.962890625
+garamond χ 0.7412109375
+garamond ψ 0.962890625
+garamond ω 1.009765625
+garamond Α 0.888671875
+garamond Β 0.962890625
+garamond Γ 0.814453125
+garamond Δ 0.962890625
+garamond Ε 0.888671875
+garamond Ζ 0.814453125
+garamond Η 0.962890625
+garamond Θ 1.037109375
+garamond Ι 0.3701171875
+garamond Κ 0.888671875
+garamond Λ 0.888671875
+garamond Μ 1.185546875
+garamond Ν 0.962890625
+garamond Ξ 0.814453125
+garamond Ο 1.037109375
+garamond Π 0.962890625
+garamond Ρ 0.888671875
+garamond Σ 0.814453125
+garamond Τ 0.8125
+garamond Υ 0.888671875
+garamond Φ 0.962890625
+garamond Χ 0.890625
+garamond Ψ 1.109375
+garamond Ω 1.037109375
+garamond . 0.3701171875
+garamond , 0.3701171875
+garamond / 0.3701171875
+garamond ? 0.7412109375
+garamond < 0.7783203125
+garamond > 0.7783203125
+garamond { 0.4453125
+garamond } 0.4453125
+garamond [ 0.3701171875
+garamond ] 0.3701171875
+garamond ( 0.4443359375
+garamond ) 0.4443359375
+garamond + 0.7783203125
+garamond - 0.4443359375
+garamond _ 0.7412109375
+garamond = 0.7783203125
+garamond ^ 0.6259765625
+garamond : 0.3701171875
+garamond ; 0.3701171875
+garamond % 1.185546875
+garamond * 0.5185546875
+garamond 0.3701171875
diff --git a/src/tcutility/report/_generate_font_widths.py b/src/tcutility/report/_generate_font_widths.py
index 3cd6ebc9..fa392c00 100755
--- a/src/tcutility/report/_generate_font_widths.py
+++ b/src/tcutility/report/_generate_font_widths.py
@@ -1,45 +1,45 @@
-import subprocess as sp
-import os
-
-fonts = [
- 'calibri',
- 'arial',
- 'times new roman',
- 'helvetica',
- 'garamond',
-]
-
-characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿⁱ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₔαβγδεζηθικλμνξοπρστυφχψωΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ.,/?<>{}[]()+-_=^:;%* '
-
-script = """
-const jsdom = require("jsdom");
-const { JSDOM } = jsdom;
-
-global.document = new JSDOM("").window.document;
-
-function getTextWidth(text, font) {
- var canvas = getTextWidth.canvas || (getTextWidth.canvas = global.document.createElement("canvas"));
- var context = canvas.getContext("2d");
- context.font = font;
- var metrics = context.measureText(text);
- return metrics.width;
-};
-
-let chars = '[CHARACTERS]';
-let fonts = [[FONTS]];
-for (let j = 0; j < fonts.length; j++) {
- let font = fonts[j];
- for (let i = 0; i < chars.length; i++) {
- console.log(font.replaceAll(" ", "_") + " " + chars[i] + " " + getTextWidth(chars[i], "1pt " + font));
- }
-}
-""".replace('[CHARACTERS]', characters).replace('[FONTS]', ", ".join(['"' + font + '"' for font in fonts]))
-
-with open('char_width.js', 'w+') as js_script:
- js_script.write(script)
-
-with open('_char_widths.txt', 'w+') as out:
- for line in sp.check_output(['node', 'char_width.js']).decode().splitlines():
- out.write(line + '\n')
-
-os.remove('char_width.js')
+import subprocess as sp
+import os
+
+fonts = [
+ 'calibri',
+ 'arial',
+ 'times new roman',
+ 'helvetica',
+ 'garamond',
+]
+
+characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿⁱ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₔαβγδεζηθικλμνξοπρστυφχψωΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ.,/?<>{}[]()+-_=^:;%* '
+
+script = """
+const jsdom = require("jsdom");
+const { JSDOM } = jsdom;
+
+global.document = new JSDOM("").window.document;
+
+function getTextWidth(text, font) {
+ var canvas = getTextWidth.canvas || (getTextWidth.canvas = global.document.createElement("canvas"));
+ var context = canvas.getContext("2d");
+ context.font = font;
+ var metrics = context.measureText(text);
+ return metrics.width;
+};
+
+let chars = '[CHARACTERS]';
+let fonts = [[FONTS]];
+for (let j = 0; j < fonts.length; j++) {
+ let font = fonts[j];
+ for (let i = 0; i < chars.length; i++) {
+ console.log(font.replaceAll(" ", "_") + " " + chars[i] + " " + getTextWidth(chars[i], "1pt " + font));
+ }
+}
+""".replace('[CHARACTERS]', characters).replace('[FONTS]', ", ".join(['"' + font + '"' for font in fonts]))
+
+with open('char_width.js', 'w+') as js_script:
+ js_script.write(script)
+
+with open('_char_widths.txt', 'w+') as out:
+ for line in sp.check_output(['node', 'char_width.js']).decode().splitlines():
+ out.write(line + '\n')
+
+os.remove('char_width.js')
diff --git a/src/tcutility/report/character.py b/src/tcutility/report/character.py
index 895aceb6..99f4fc01 100755
--- a/src/tcutility/report/character.py
+++ b/src/tcutility/report/character.py
@@ -1,96 +1,96 @@
-import os
-
-from tcutility import cache, log
-
-
-def _load_data() -> dict:
- """
- Load character width data. It is stored in a file where each line is formatted as:
-
- {font} {character} {width}
-
- Font names that originally contained spaces, for example "Times New Roman", will have the spaces replaced
- by underscores.
-
- Returns:
- We return a nested dictionary with the first key being the font and the nested key the characters.
- The widths are given in pixel sizes and are for font-size 1.
- """
- with open(os.path.join(os.path.split(__file__)[0], "_char_widths.txt"), encoding="utf-8") as widths:
- lines = widths.readlines()
-
- ret = {}
- for line in lines:
- # we split each line into parts by white space
- parts = line.split()
- # if there are only 2 parts, that means that the character was a space
- if len(parts) == 2:
- font, width = parts
- character = " "
- else:
- font, character, width = line.split()
-
- # fonts that contain spaces in the name had the spaces replaced by underscores
- # here we restore the original spaces
- font = font.replace("_", " ")
- width = float(width)
-
- ret.setdefault(font, {})
- ret[font][character] = width
-
- return ret
-
-
-widths = _load_data()
-
-
-@cache.cache
-def get_pixel_width(character: str, font: str = "calibri", font_size: float = 11) -> float:
- """
- Get the pixel width of a character for a given font and font-size.
- For this we need to interpolate the pixel width between two reference values.
- In the _char_widths.txt file you will find for each font a set of character pixel widths for font-size 1.
- We then simply multiply the 1-width value by the desired value to get the correct pixel width.
- See
-
- Args:
- character: the character to get the pixel width for.
- font: the font family that is used.
- font_size: the font-size to get the pixel width at.
- """
- if font not in widths.keys():
- raise ValueError(f"Could not find font {font}.")
-
- return widths[font][character] * font_size
-
-
-def text_width(text: str, font: str = "calibri", font_size: float = 11, mode: str = "pixels") -> float:
- """
- Get the width of a string for a given font and font size.
-
- Args:
- text: the object to determine the length for.
- Will be cast to a string before calculating width.
- font: the font family that is used.
- font_size: the font-size to get the pixel width at.
- mode: the width-mode. Can be 'excel' or 'pixels'.
-
- Returns:
- The width of the text for a certain font and font size.
- If mode is 'excel' we pad it with 8 pixels and then divide by 7.6 (i.e. standard excel char width).
- """
- if font not in widths.keys():
- log.error(f"Could not find font {font}. Defaulting to Calibri.")
- font = "calibri"
-
- pixels = sum(get_pixel_width(char, font, font_size) for char in str(text))
- if mode == "excel":
- return (pixels + 8) / 7.6
- if mode == "word":
- return (pixels + 8) / 7.6
-
- return pixels
-
-
-if __name__ == "__main__":
- print(text_width("this is a test text", font="test"))
+import os
+
+from tcutility import cache, log
+
+
+def _load_data() -> dict:
+ """
+ Load character width data. It is stored in a file where each line is formatted as:
+
+ {font} {character} {width}
+
+ Font names that originally contained spaces, for example "Times New Roman", will have the spaces replaced
+ by underscores.
+
+ Returns:
+ We return a nested dictionary with the first key being the font and the nested key the characters.
+ The widths are given in pixel sizes and are for font-size 1.
+ """
+ with open(os.path.join(os.path.split(__file__)[0], "_char_widths.txt"), encoding="utf-8") as widths:
+ lines = widths.readlines()
+
+ ret = {}
+ for line in lines:
+ # we split each line into parts by white space
+ parts = line.split()
+ # if there are only 2 parts, that means that the character was a space
+ if len(parts) == 2:
+ font, width = parts
+ character = " "
+ else:
+ font, character, width = line.split()
+
+ # fonts that contain spaces in the name had the spaces replaced by underscores
+ # here we restore the original spaces
+ font = font.replace("_", " ")
+ width = float(width)
+
+ ret.setdefault(font, {})
+ ret[font][character] = width
+
+ return ret
+
+
+widths = _load_data()
+
+
+@cache.cache
+def get_pixel_width(character: str, font: str = "calibri", font_size: float = 11) -> float:
+ """
+ Get the pixel width of a character for a given font and font-size.
+ For this we need to interpolate the pixel width between two reference values.
+ In the _char_widths.txt file you will find for each font a set of character pixel widths for font-size 1.
+ We then simply multiply the 1-width value by the desired value to get the correct pixel width.
+ See
+
+ Args:
+ character: the character to get the pixel width for.
+ font: the font family that is used.
+ font_size: the font-size to get the pixel width at.
+ """
+ if font not in widths.keys():
+ raise ValueError(f"Could not find font {font}.")
+
+ return widths[font][character] * font_size
+
+
+def text_width(text: str, font: str = "calibri", font_size: float = 11, mode: str = "pixels") -> float:
+ """
+ Get the width of a string for a given font and font size.
+
+ Args:
+ text: the object to determine the length for.
+ Will be cast to a string before calculating width.
+ font: the font family that is used.
+ font_size: the font-size to get the pixel width at.
+ mode: the width-mode. Can be 'excel' or 'pixels'.
+
+ Returns:
+ The width of the text for a certain font and font size.
+ If mode is 'excel' we pad it with 8 pixels and then divide by 7.6 (i.e. standard excel char width).
+ """
+ if font not in widths.keys():
+ log.error(f"Could not find font {font}. Defaulting to Calibri.")
+ font = "calibri"
+
+ pixels = sum(get_pixel_width(char, font, font_size) for char in str(text))
+ if mode == "excel":
+ return (pixels + 8) / 7.6
+ if mode == "word":
+ return (pixels + 8) / 7.6
+
+ return pixels
+
+
+if __name__ == "__main__":
+ print(text_width("this is a test text", font="test"))
diff --git a/src/tcutility/results/__init__.py b/src/tcutility/results/__init__.py
index 9e4b990c..d369308a 100644
--- a/src/tcutility/results/__init__.py
+++ b/src/tcutility/results/__init__.py
@@ -1,124 +1,124 @@
-"""
-This module provides basic and general information about calculations done using AMS given a calculation directory.
-This includes information about the engine used (ADF, DFTB, BAND, ...), general information such as timings, files, status of the calculation, etc.
-This information is used in further analysis programs.
-
-"""
-
-from typing import Union
-
-from . import result
-
-Result = result.Result
-
-import os # noqa: E402
-import pathlib as pl # noqa: E402
-
-from .. import slurm # noqa: E402
-from . import adf, ams, cache, dftb, orca, xtb # noqa: E402
-
-
-def get_info(calc_dir: str):
- try:
- return ams.get_ams_info(calc_dir)
- except: # noqa
- pass
-
- try:
- return orca.get_info(calc_dir)
- except: # noqa
- pass
-
- try:
- return xtb.get_info(calc_dir)
- except: # noqa
- pass
-
- res = Result()
-
- # if we cannot correctly read the info, we return some generic result object
- # before that, we check the job status by checking slurm
- if slurm.workdir_info(os.path.abspath(calc_dir)):
- res.engine = "unknown"
-
- state = slurm.workdir_info(os.path.abspath(calc_dir)).statuscode
- state_name = {"CG": "COMPLETING", "CF": "CONFIGURING", "PD": "PENDING", "R": "RUNNING"}.get(state, "UNKNOWN")
-
- res.status.fatal = False
- res.status.name = state_name
- res.status.code = state
- res.status.reasons = []
- else:
- res.engine = "unknown"
- res.status.fatal = True
- res.status.name = "UNKNOWN"
- res.status.code = "U"
- res.status.reasons = []
-
- # give a little more specific information about the error
- if not os.path.exists(calc_dir):
- res.status.reasons.append(f"Could not find folder {calc_dir}")
- elif not os.path.isdir(calc_dir):
- res.status.reasons.append(f"Path {calc_dir} is not a directory")
- else:
- res.status.reasons.append(f"Could not read calculation in {calc_dir}")
-
- return res
-
-
-def read(calc_dir: Union[str, pl.Path]) -> Result:
- """Master function for reading data from calculations. It reads general information as well as engine-specific information.
-
- Args:
- calc_dir: path pointing to the working directory for the desired calculation
-
- Returns:
- dictionary containing information about the calculation
- """
- calc_dir = str(calc_dir) if isinstance(calc_dir, pl.Path) else calc_dir
-
- ret = Result()
- ret.update(get_info(calc_dir))
- if ret.engine == "adf":
- try:
- ret.adf = adf.get_calc_settings(ret)
- except: # noqa
- ret.adf = None
-
- try:
- ret.properties = adf.get_properties(ret)
- except: # noqa
- ret.properties = None
-
- try:
- ret.level = adf.get_level_of_theory(ret)
- except: # noqa
- ret.level = None
-
- elif ret.engine == "dftb":
- ret.dftb = dftb.get_calc_settings(ret)
- ret.properties = dftb.get_properties(ret)
- elif ret.engine == "xtb":
- # ret.xtb = xtb.get_calc_settings(ret)
- ret.properties = xtb.get_properties(ret)
-
- elif ret.engine == "orca":
- try:
- ret.orca = orca.get_calc_settings(ret)
- except: # noqa
- ret.orca = None
-
- try:
- ret.properties = orca.get_properties(ret)
- except: # noqa
- ret.properties = None
-
- # unload cached KFReaders associated with this calc_dir
- to_delete = [key for key in cache._cache if key.startswith(os.path.abspath(calc_dir))]
- [cache.unload(key) for key in to_delete]
- return ret
-
-
-if __name__ == "__main__":
- res = read("/Users/yumanhordijk/Library/CloudStorage/OneDrive-VrijeUniversiteitAmsterdam/RadicalAdditionBenchmark/data/abinitio/P_C2H2_NH2/OPT_pVTZ")
- print(res.molecule)
+"""
+This module provides basic and general information about calculations done using AMS given a calculation directory.
+This includes information about the engine used (ADF, DFTB, BAND, ...), general information such as timings, files, status of the calculation, etc.
+This information is used in further analysis programs.
+
+"""
+
+from typing import Union
+
+from . import result
+
+Result = result.Result
+
+import os # noqa: E402
+import pathlib as pl # noqa: E402
+
+from .. import slurm # noqa: E402
+from . import adf, ams, cache, dftb, orca, xtb # noqa: E402
+
+
+def get_info(calc_dir: str):
+ try:
+ return ams.get_ams_info(calc_dir)
+ except: # noqa
+ pass
+
+ try:
+ return orca.get_info(calc_dir)
+ except: # noqa
+ pass
+
+ try:
+ return xtb.get_info(calc_dir)
+ except: # noqa
+ pass
+
+ res = Result()
+
+ # if we cannot correctly read the info, we return some generic result object
+ # before that, we check the job status by checking slurm
+ if slurm.workdir_info(os.path.abspath(calc_dir)):
+ res.engine = "unknown"
+
+ state = slurm.workdir_info(os.path.abspath(calc_dir)).statuscode
+ state_name = {"CG": "COMPLETING", "CF": "CONFIGURING", "PD": "PENDING", "R": "RUNNING"}.get(state, "UNKNOWN")
+
+ res.status.fatal = False
+ res.status.name = state_name
+ res.status.code = state
+ res.status.reasons = []
+ else:
+ res.engine = "unknown"
+ res.status.fatal = True
+ res.status.name = "UNKNOWN"
+ res.status.code = "U"
+ res.status.reasons = []
+
+ # give a little more specific information about the error
+ if not os.path.exists(calc_dir):
+ res.status.reasons.append(f"Could not find folder {calc_dir}")
+ elif not os.path.isdir(calc_dir):
+ res.status.reasons.append(f"Path {calc_dir} is not a directory")
+ else:
+ res.status.reasons.append(f"Could not read calculation in {calc_dir}")
+
+ return res
+
+
+def read(calc_dir: Union[str, pl.Path]) -> Result:
+ """Master function for reading data from calculations. It reads general information as well as engine-specific information.
+
+ Args:
+ calc_dir: path pointing to the working directory for the desired calculation
+
+ Returns:
+ dictionary containing information about the calculation
+ """
+ calc_dir = str(calc_dir) if isinstance(calc_dir, pl.Path) else calc_dir
+
+ ret = Result()
+ ret.update(get_info(calc_dir))
+ if ret.engine == "adf":
+ try:
+ ret.adf = adf.get_calc_settings(ret)
+ except: # noqa
+ ret.adf = None
+
+ try:
+ ret.properties = adf.get_properties(ret)
+ except: # noqa
+ ret.properties = None
+
+ try:
+ ret.level = adf.get_level_of_theory(ret)
+ except: # noqa
+ ret.level = None
+
+ elif ret.engine == "dftb":
+ ret.dftb = dftb.get_calc_settings(ret)
+ ret.properties = dftb.get_properties(ret)
+ elif ret.engine == "xtb":
+ # ret.xtb = xtb.get_calc_settings(ret)
+ ret.properties = xtb.get_properties(ret)
+
+ elif ret.engine == "orca":
+ try:
+ ret.orca = orca.get_calc_settings(ret)
+ except: # noqa
+ ret.orca = None
+
+ try:
+ ret.properties = orca.get_properties(ret)
+ except: # noqa
+ ret.properties = None
+
+ # unload cached KFReaders associated with this calc_dir
+ to_delete = [key for key in cache._cache if key.startswith(os.path.abspath(calc_dir))]
+ [cache.unload(key) for key in to_delete]
+ return ret
+
+
+if __name__ == "__main__":
+ res = read("/Users/yumanhordijk/Library/CloudStorage/OneDrive-VrijeUniversiteitAmsterdam/RadicalAdditionBenchmark/data/abinitio/P_C2H2_NH2/OPT_pVTZ")
+ print(res.molecule)
diff --git a/src/tcutility/results/adf.py b/src/tcutility/results/adf.py
index ddb5eb94..03eb7266 100644
--- a/src/tcutility/results/adf.py
+++ b/src/tcutility/results/adf.py
@@ -1,332 +1,332 @@
-from typing import Dict, List
-
-import numpy as np
-from scm.plams import KFReader
-
-from tcutility import constants, ensure_list
-from tcutility.results import Result, cache
-from tcutility.tc_typing import arrays
-
-# ------------------------------------------------------------- #
-# ------------------- Calculation Settings -------------------- #
-# ------------------------------------------------------------- #
-
-
-def get_calc_settings(info: Result) -> Result:
- """Function to read calculation settings for an ADF calculation.
-
- Args:
- info: Result object containing ADF calculation settings.
-
- Returns:
- :Result object containing properties from the ADF calculation:
-
- - **task (str)** – the task that was set for the calculation.
- - **relativistic (bool)** – whether or not relativistic effects were enabled.
- - **relativistic_type (str)** – the name of the relativistic approximation used.
- - **unrestricted_sfos (bool)** – whether or not SFOs are treated in an unrestricted manner.
- - **unrestricted_mos (bool)** – whether or not MOs are treated in an unrestricted manner.
- - **symmetry.group (str)** – the symmetry group selected for the molecule.
- - **symmetry.labels (list[str])** – the symmetry labels associated with the symmetry group.
- - **used_regions (bool)** – whether regions were used in the calculation.
- - **charge (int)** - the charge of the system.
- - **spin_polarization (int)** - the spin-polarization of the system.
- - **multiplicity (int)** - the multiplicity of the system. This is equal to 2|S|+1 for spin-polarization S.
- """
- assert info.engine == "adf", f"This function reads ADF data, not {info.engine} data"
-
- ret = Result()
-
- # set the calculation task at a higher level
- ret.task = info.input.task
-
- # the VibrationalAnalysis task does not produce adf.rkf files
- # in that case we end the reading here, since the following
- # variables do not apply
- if ret.task.lower() == "vibrationalanalysis":
- return ret
-
- reader_adf = cache.get(info.files["adf.rkf"])
-
- relativistic_type_map = {
- 0: "None",
- 1: "scalar Pauli",
- 3: "scalar ZORA", # scalar ZORA + MAPA
- 4: "scalar ZORA + full pot.",
- 5: "scalar ZORA + APA",
- 6: "scalar X2C + MAPA",
- 7: "scalar X2C ZORA + MAPA",
- 11: "spin-orbit Pauli",
- 13: "spin-orbit ZORA", # spin-orbit ZORA + MAPA
- 14: "spin-orbit ZORA + full pot.",
- 15: "spin-orbit ZORA + APA",
- 16: "spin-orbit X2C + MAPA",
- 17: "spin-orbit X2C ZORA + MAPA",
- }
- # determine if calculation used relativistic corrections
- # if it did, variable 'escale' will be present in 'SFOs'
- # if it didnt, only variable 'energy' will be present
- ret.relativistic = ("SFOs", "escale") in reader_adf
- ret.relativistic_type = relativistic_type_map[reader_adf.read("General", "ioprel")]
-
- # determine if MOs are unrestricted or not
- # general, nspin is 1 for restricted and 2 for unrestricted calculations
- ret.unrestricted_mos = reader_adf.read("General", "nspin") == 2
-
- # determine if SFOs are unrestricted or not
- ret.unrestricted_sfos = reader_adf.read("General", "nspinf") == 2
-
- # get the symmetry group
- ret.symmetry.group = reader_adf.read("Geometry", "grouplabel").strip()
-
- # get the symmetry labels
- ret.symmetry.labels = reader_adf.read("Symmetry", "symlab").strip().split()
-
- # determine if the calculation used regions or not
- frag_order = reader_adf.read("Geometry", "fragment and atomtype index")
- frag_order = frag_order[: len(frag_order) // 2]
- ret.used_regions = max(frag_order) != len(frag_order)
-
- ret.charge = reader_adf.read("Molecule", "Charge")
-
- ret.spin_polarization = 0
- if ret.unrestricted_mos:
- nalpha = 0
- nbeta = 0
- for label in ret.symmetry.labels:
- nalpha += sum(ensure_list(reader_adf.read(label, "froc_A")))
- nbeta += sum(ensure_list(reader_adf.read(label, "froc_B")))
- ret.spin_polarization = nalpha - nbeta
- ret.multiplicity = 2 * ret.spin_polarization + 1
-
- return ret
-
-
-# ------------------------------------------------------------- #
-# ------------------------ Properties ------------------------- #
-# ------------------------------------------------------------- #
-
-
-# ----------------------- VDD charges ------------------------- #
-
-
-def _read_vdd_charges(kf_reader: KFReader) -> arrays.Array1D[np.float64]:
- """Returns the VDD charges from the KFReader object."""
- vdd_scf: List[float] = ensure_list(kf_reader.read("Properties", "AtomCharge_SCF Voronoi")) # type: ignore since plams does not include typing for KFReader. List[float] is returned
- vdd_ini: List[float] = ensure_list(kf_reader.read("Properties", "AtomCharge_initial Voronoi")) # type: ignore since plams does not include typing for KFReader. List[float] is returned
-
- # VDD charges are scf - initial charges. Note, these are in units of electrons while most often these are denoted in mili-electrons
- return np.array([float((scf - ini)) for scf, ini in zip(vdd_scf, vdd_ini)])
-
-
-def _get_vdd_charges_per_irrep(results_type: KFReader) -> Dict[str, arrays.Array1D[np.float64]]:
- """Extracts the Voronoi Deformation Density charges from the fragment calculation sorted per irrep."""
- symlabels = str(results_type.read("Symmetry", "symlab")).split() # split on whitespace
-
- # If there is only one irrep, there is no irrep decomposition
- if len(symlabels) == 1:
- return {}
-
- vdd_irrep = np.array(results_type.read("Properties", "Voronoi chrg per irrep"))
- n_atoms = int(results_type.read("Molecule", "nAtoms")) # type: ignore since no static typing. Returns an int
-
- # NOTE: apparently, the irrep charges are minus the total VDD charges. That's why the minus sign in the second line below
- vdd_irrep = vdd_irrep[-len(symlabels) * n_atoms :] # vdd_irrep = vdd_irrep.reshape((n_headers, len(symlabels), n_atoms)) # NOQA E203
- vdd_per_irrep = {irrep: -vdd_irrep[i * n_atoms : (i + 1) * n_atoms] for i, irrep in enumerate(symlabels)} # NOQA E203
- return vdd_per_irrep
-
-
-# ----------------------- Vibrations ------------------------- #
-
-
-def _read_vibrations(reader: cache.TrackKFReader) -> Result:
- ret = Result()
- ret.number_of_modes = reader.read("Vibrations", "nNormalModes")
- ret.frequencies = ensure_list(reader.read("Vibrations", "Frequencies[cm-1]"))
- if ("Vibrations", "Intensities[km/mol]") in reader:
- ret.intensities = ensure_list(reader.read("Vibrations", "Intensities[km/mol]"))
- ret.number_of_imag_modes = len([freq for freq in ret.frequencies if freq < 0])
- ret.character = "minimum" if ret.number_of_imag_modes == 0 else "transitionstate"
- ret.modes = []
- for i in range(ret.number_of_modes):
- ret.modes.append(reader.read("Vibrations", f"NoWeightNormalMode({i+1})"))
- return ret
-
-
-def get_properties(info: Result) -> Result:
- """Function to get properties from an ADF calculation.
-
- Args:
- info: Result object containing ADF properties.
-
- Returns:
- :Result object containing properties from the ADF calculation:
-
- - **energy.bond (float)** – bonding energy (|kcal/mol|).
- - **energy.elstat (float)** – total electrostatic potential (|kcal/mol|).
- - **energy.orbint.total (float)** – total orbital interaction energy containing contributions from each symmetry label and correction energy(|kcal/mol|).
- - **energy.orbint.{symmetry label} (float)** – orbital interaction energy from a specific symmetry label (|kcal/mol|).
- - **energy.orbint.correction (float)** - orbital interaction correction energy, the difference between the total and the sum of the symmetrized interaction energies (|kcal/mol|)
- - **energy.pauli.total (float)** – total Pauli repulsion energy (|kcal/mol|).
- - **energy.dispersion (float)** – total dispersion energy (|kcal/mol|).
- - **energy.gibbs (float)** – Gibb's free energy (|kcal/mol|). Only populated if vibrational modes were calculated.
- - **energy.enthalpy (float)** – enthalpy (|kcal/mol|). Only populated if vibrational modes were calculated.
- - **energy.nuclear_internal (float)** – nuclear internal energy (|kcal/mol|). Only populated if vibrational modes were calculated.
- - **vibrations.number_of_modes (int)** – number of vibrational modes for this molecule, 3N-5 for non-linear molecules and 3N-6 for linear molecules, where N is the number of atoms.
- - **vibrations.number_of_imag_modes (int)** – number of imaginary vibrational modes for this molecule.
- - **vibrations.frequencies (float)** – vibrational frequencies associated with the vibrational modes, sorted from low to high (|cm-1|).
- - **vibrations.intensities (float)** – vibrational intensities associated with the vibrational modes (|km/mol|).
- - **vibrations.modes (list[float])** – list of vibrational modes sorted from low frequency to high frequency.
- - **vibrations.character (str)** – Character of the molecule based on the number of imaginary vibrational modes. Can be "minimum" or "transition state".
- - **vdd.charges (nparray[float] (1D))** - 1D array of Voronoi Deformation Denisty (VDD) charges in [electrons], being the difference between the final (SCF) and initial VDD charges.
- - **vdd.charges.{symmetry label} (nparray[float] (1D))** - 1D array of Voronoi Deformation Denisty (VDD) charges in [electrons] per irrep.
- - **s2** - expectation value of the :math:`S^2` operator.
- - **s2_expected** - ideal expectation value of the :math:`S^2` operator. For restricted calculations this should always equal ``s2``.
- - **spin_contamination** - the amount of spin-contamination observed in this calculation. It is equal to (s2 - s2_expected) / (s2_expected). Ideally this value should be below 0.1.
- """
-
- assert info.engine == "adf", f"This function reads ADF data, not {info.engine} data"
-
- ret = Result()
-
- if info.adf.task.lower() == "vibrationalanalysis":
- reader_ams = cache.get(info.files["ams.rkf"])
- ret.vibrations = _read_vibrations(reader_ams)
- return ret
-
- reader_adf = cache.get(info.files["adf.rkf"])
-
- # read energies (given in Ha in rkf files)
- ret.energy.bond = reader_adf.read("Energy", "Bond Energy") * constants.HA2KCALMOL
- ret.energy.elstat = reader_adf.read("Energy", "elstat") * constants.HA2KCALMOL
-
- # read the total orbital interaction energy
- ret.energy.orbint.total = reader_adf.read("Energy", "Orb.Int. Total") * constants.HA2KCALMOL
-
- # to calculate the orbital interaction term:
- # the difference between the total and the sum of the symmetrized interaction energies should be calculated
- # therefore the correction is first set equal to the total orbital interaction.
- ret.energy.orbint.correction = ret.energy.orbint.total
-
- # looping over every symlabel, to get the energy per symmetry label
- for symlabel in info.adf.symmetry.labels:
- symlabel = symlabel.split(":")[0]
- ret.energy.orbint[symlabel] = reader_adf.read("Energy", f"Orb.Int. {symlabel}") * constants.HA2KCALMOL
-
- # the energy per symmetry label is abstracted from the "total orbital interaction"
- # obtaining the correction to the orbital interaction term
- ret.energy.orbint.correction -= ret.energy.orbint[symlabel]
-
- ret.energy.pauli.total = reader_adf.read("Energy", "Pauli Total") * constants.HA2KCALMOL
- ret.energy.dispersion = reader_adf.read("Energy", "Dispersion Energy") * constants.HA2KCALMOL
-
- if ("Thermodynamics", "Gibbs free Energy") in reader_adf:
- ret.energy.gibbs = reader_adf.read("Thermodynamics", "Gibbs free Energy") * constants.HA2KCALMOL
- ret.energy.enthalpy = reader_adf.read("Thermodynamics", "Enthalpy") * constants.HA2KCALMOL
- ret.energy.nuclear_internal = reader_adf.read("Thermodynamics", "Internal Energy total") * constants.HA2KCALMOL
-
- # vibrational information
- if ("Vibrations", "nNormalModes") in reader_adf:
- ret.vibrations = _read_vibrations(reader_adf)
-
- # read the Voronoi Deformation Charges Deformation (VDD) before and after SCF convergence (being "inital" and "SCF")
- try:
- ret.vdd.charges = _read_vdd_charges(reader_adf)
- ret.vdd.update(_get_vdd_charges_per_irrep(reader_adf))
- except KeyError:
- pass
-
- # read spin-squared operator info
- # the total spin
- S = info.adf.spin_polarization * 1 / 2
- ret.s2_expected = S * (S + 1)
- # this is the real expectation value
- if ("Properties", "S2calc") in reader_adf:
- ret.s2 = reader_adf.read("Properties", "S2calc")
- else:
- ret.s2 = 0
-
- # calculate the contamination
- # if S is 0 then we will get a divide by zero error, but spin-contamination should be 0
- if S != 0:
- ret.spin_contamination = (ret.s2 - ret.s2_expected) / (ret.s2_expected)
- else:
- ret.spin_contamination = 0
-
- return ret
-
-
-def get_level_of_theory(info: Result) -> Result:
- """Function to get the level-of-theory from an input-file.
-
- Args:
- inp_path: Path to the input file. Can be a .run or .in file create for AMS
-
- Returns:
- :Dictionary containing information about the level-of-theory:
-
- - **summary (str)** - a summary string that gives the level-of-theory in a human-readable format.
- - **xc.functional (str)** - XC-functional used in the calculation.
- - **xc.category (str)** - category the XC-functional belongs to. E.g. GGA, MetaHybrid, etc ...
- - **xc.dispersion (str)** - the dispersion correction method used during the calculation.
- - **xc.summary (str)** - a summary string that gives the XC-functional information in a human-readable format.
- - **xc.empiricalScaling (str)** - which empirical scaling parameter was used. Useful for MP2 calculations.
- - **basis.type (str)** - the size/type of the basis-set.
- - **basis.core (str)** - the size of the frozen-core approximation.
- - **quality (str)** - the numerical quality setting.
- """
- sett = info.input
- ret = Result()
- # print(json.dumps(sett, indent=4))
- xc_categories = ["GGA", "LDA", "MetaGGA", "MetaHybrid", "Model", "LibXC", "DoubleHybrid", "Hybrid", "MP2", "HartreeFock"]
- ret.xc.functional = "VWN"
- ret.xc.category = "LDA"
- for cat in xc_categories:
- if cat.lower() in [key.lower() for key in sett.adf.xc]:
- ret.xc.functional = sett.adf.xc[cat]
- ret.xc.category = cat
-
- ret.basis.type = sett.adf.basis.type
- ret.basis.core = sett.adf.basis.core
- ret.quality = sett.adf.NumericalQuality or "Normal"
-
- ret.xc.dispersion = None
- if "dispersion" in [key.lower() for key in sett.adf.xc]:
- ret.xc.dispersion = " ".join(sett.adf.xc.dispersion.split())
-
- # the empirical scaling value is used for MP2 calculations
- ret.xc.empirical_scaling = None
- if "empiricalscaling" in [key.lower() for key in sett.adf.xc]:
- ret.xc.empiricalscaling = sett.adf.xc.empiricalscaling
-
- # MP2 and HF are a little bit different from the usual xc categories. They are not key-value pairs but only the key
- # we start building the ret.xc.summary string here already. This will contain the human-readable functional name
- if ret.xc.category == "MP2":
- ret.xc.summary = "MP2"
- if ret.xc.empiricalscaling:
- ret.xc.summary += f"-{ret.xc.empiricalscaling}"
- elif ret.xc.category == "HartreeFock":
- ret.xc.summary = "HF"
- else:
- ret.xc.summary = ret.xc.functional
-
- # If dispersion was used, we want to add it to the ret.xc.summary
- if ret.xc.dispersion:
- if ret.xc.dispersion.lower() == "grimme3":
- ret.xc.summary += "-D3"
- if ret.xc.dispersion.lower() == "grimme3 bjdamp":
- ret.xc.summary += "-D3(BJ)"
- if ret.xc.dispersion.lower() == "grimme4":
- ret.xc.summary += "-D4"
- if ret.xc.dispersion.lower() == "ddsc":
- ret.xc.summary += "-dDsC"
- if ret.xc.dispersion.lower() == "uff":
- ret.xc.summary += "-dUFF"
- if ret.xc.dispersion.lower() == "mbd":
- ret.xc.summary += "-MBD@rsSC"
- if ret.xc.dispersion.lower() == "default":
- ret.xc.summary += "-D"
-
- # ret.summary is simply the ret.xc.summary plus the basis set type
- ret.summary = f"{ret.xc.summary}/{ret.basis.type}"
- return ret
+from typing import Dict, List
+
+import numpy as np
+from scm.plams import KFReader
+
+from tcutility import constants, ensure_list
+from tcutility.results import Result, cache
+from tcutility.tc_typing import arrays
+
+# ------------------------------------------------------------- #
+# ------------------- Calculation Settings -------------------- #
+# ------------------------------------------------------------- #
+
+
+def get_calc_settings(info: Result) -> Result:
+ """Function to read calculation settings for an ADF calculation.
+
+ Args:
+ info: Result object containing ADF calculation settings.
+
+ Returns:
+ :Result object containing properties from the ADF calculation:
+
+ - **task (str)** – the task that was set for the calculation.
+ - **relativistic (bool)** – whether or not relativistic effects were enabled.
+ - **relativistic_type (str)** – the name of the relativistic approximation used.
+ - **unrestricted_sfos (bool)** – whether or not SFOs are treated in an unrestricted manner.
+ - **unrestricted_mos (bool)** – whether or not MOs are treated in an unrestricted manner.
+ - **symmetry.group (str)** – the symmetry group selected for the molecule.
+ - **symmetry.labels (list[str])** – the symmetry labels associated with the symmetry group.
+ - **used_regions (bool)** – whether regions were used in the calculation.
+ - **charge (int)** - the charge of the system.
+ - **spin_polarization (int)** - the spin-polarization of the system.
+ - **multiplicity (int)** - the multiplicity of the system. This is equal to 2|S|+1 for spin-polarization S.
+ """
+ assert info.engine == "adf", f"This function reads ADF data, not {info.engine} data"
+
+ ret = Result()
+
+ # set the calculation task at a higher level
+ ret.task = info.input.task
+
+ # the VibrationalAnalysis task does not produce adf.rkf files
+ # in that case we end the reading here, since the following
+ # variables do not apply
+ if ret.task.lower() == "vibrationalanalysis":
+ return ret
+
+ reader_adf = cache.get(info.files["adf.rkf"])
+
+ relativistic_type_map = {
+ 0: "None",
+ 1: "scalar Pauli",
+ 3: "scalar ZORA", # scalar ZORA + MAPA
+ 4: "scalar ZORA + full pot.",
+ 5: "scalar ZORA + APA",
+ 6: "scalar X2C + MAPA",
+ 7: "scalar X2C ZORA + MAPA",
+ 11: "spin-orbit Pauli",
+ 13: "spin-orbit ZORA", # spin-orbit ZORA + MAPA
+ 14: "spin-orbit ZORA + full pot.",
+ 15: "spin-orbit ZORA + APA",
+ 16: "spin-orbit X2C + MAPA",
+ 17: "spin-orbit X2C ZORA + MAPA",
+ }
+ # determine if calculation used relativistic corrections
+ # if it did, variable 'escale' will be present in 'SFOs'
+ # if it didnt, only variable 'energy' will be present
+ ret.relativistic = ("SFOs", "escale") in reader_adf
+ ret.relativistic_type = relativistic_type_map[reader_adf.read("General", "ioprel")]
+
+ # determine if MOs are unrestricted or not
+ # general, nspin is 1 for restricted and 2 for unrestricted calculations
+ ret.unrestricted_mos = reader_adf.read("General", "nspin") == 2
+
+ # determine if SFOs are unrestricted or not
+ ret.unrestricted_sfos = reader_adf.read("General", "nspinf") == 2
+
+ # get the symmetry group
+ ret.symmetry.group = reader_adf.read("Geometry", "grouplabel").strip()
+
+ # get the symmetry labels
+ ret.symmetry.labels = reader_adf.read("Symmetry", "symlab").strip().split()
+
+ # determine if the calculation used regions or not
+ frag_order = reader_adf.read("Geometry", "fragment and atomtype index")
+ frag_order = frag_order[: len(frag_order) // 2]
+ ret.used_regions = max(frag_order) != len(frag_order)
+
+ ret.charge = reader_adf.read("Molecule", "Charge")
+
+ ret.spin_polarization = 0
+ if ret.unrestricted_mos:
+ nalpha = 0
+ nbeta = 0
+ for label in ret.symmetry.labels:
+ nalpha += sum(ensure_list(reader_adf.read(label, "froc_A")))
+ nbeta += sum(ensure_list(reader_adf.read(label, "froc_B")))
+ ret.spin_polarization = nalpha - nbeta
+ ret.multiplicity = 2 * ret.spin_polarization + 1
+
+ return ret
+
+
+# ------------------------------------------------------------- #
+# ------------------------ Properties ------------------------- #
+# ------------------------------------------------------------- #
+
+
+# ----------------------- VDD charges ------------------------- #
+
+
+def _read_vdd_charges(kf_reader: KFReader) -> arrays.Array1D[np.float64]:
+ """Returns the VDD charges from the KFReader object."""
+ vdd_scf: List[float] = ensure_list(kf_reader.read("Properties", "AtomCharge_SCF Voronoi")) # type: ignore since plams does not include typing for KFReader. List[float] is returned
+ vdd_ini: List[float] = ensure_list(kf_reader.read("Properties", "AtomCharge_initial Voronoi")) # type: ignore since plams does not include typing for KFReader. List[float] is returned
+
+ # VDD charges are scf - initial charges. Note, these are in units of electrons while most often these are denoted in mili-electrons
+ return np.array([float((scf - ini)) for scf, ini in zip(vdd_scf, vdd_ini)])
+
+
+def _get_vdd_charges_per_irrep(results_type: KFReader) -> Dict[str, arrays.Array1D[np.float64]]:
+ """Extracts the Voronoi Deformation Density charges from the fragment calculation sorted per irrep."""
+ symlabels = str(results_type.read("Symmetry", "symlab")).split() # split on whitespace
+
+ # If there is only one irrep, there is no irrep decomposition
+ if len(symlabels) == 1:
+ return {}
+
+ vdd_irrep = np.array(results_type.read("Properties", "Voronoi chrg per irrep"))
+ n_atoms = int(results_type.read("Molecule", "nAtoms")) # type: ignore since no static typing. Returns an int
+
+ # NOTE: apparently, the irrep charges are minus the total VDD charges. That's why the minus sign in the second line below
+ vdd_irrep = vdd_irrep[-len(symlabels) * n_atoms :] # vdd_irrep = vdd_irrep.reshape((n_headers, len(symlabels), n_atoms)) # NOQA E203
+ vdd_per_irrep = {irrep: -vdd_irrep[i * n_atoms : (i + 1) * n_atoms] for i, irrep in enumerate(symlabels)} # NOQA E203
+ return vdd_per_irrep
+
+
+# ----------------------- Vibrations ------------------------- #
+
+
+def _read_vibrations(reader: cache.TrackKFReader) -> Result:
+ ret = Result()
+ ret.number_of_modes = reader.read("Vibrations", "nNormalModes")
+ ret.frequencies = ensure_list(reader.read("Vibrations", "Frequencies[cm-1]"))
+ if ("Vibrations", "Intensities[km/mol]") in reader:
+ ret.intensities = ensure_list(reader.read("Vibrations", "Intensities[km/mol]"))
+ ret.number_of_imag_modes = len([freq for freq in ret.frequencies if freq < 0])
+ ret.character = "minimum" if ret.number_of_imag_modes == 0 else "transitionstate"
+ ret.modes = []
+ for i in range(ret.number_of_modes):
+ ret.modes.append(reader.read("Vibrations", f"NoWeightNormalMode({i+1})"))
+ return ret
+
+
+def get_properties(info: Result) -> Result:
+ """Function to get properties from an ADF calculation.
+
+ Args:
+ info: Result object containing ADF properties.
+
+ Returns:
+ :Result object containing properties from the ADF calculation:
+
+ - **energy.bond (float)** – bonding energy (|kcal/mol|).
+ - **energy.elstat (float)** – total electrostatic potential (|kcal/mol|).
+ - **energy.orbint.total (float)** – total orbital interaction energy containing contributions from each symmetry label and correction energy(|kcal/mol|).
+ - **energy.orbint.{symmetry label} (float)** – orbital interaction energy from a specific symmetry label (|kcal/mol|).
+ - **energy.orbint.correction (float)** - orbital interaction correction energy, the difference between the total and the sum of the symmetrized interaction energies (|kcal/mol|)
+ - **energy.pauli.total (float)** – total Pauli repulsion energy (|kcal/mol|).
+ - **energy.dispersion (float)** – total dispersion energy (|kcal/mol|).
+ - **energy.gibbs (float)** – Gibb's free energy (|kcal/mol|). Only populated if vibrational modes were calculated.
+ - **energy.enthalpy (float)** – enthalpy (|kcal/mol|). Only populated if vibrational modes were calculated.
+ - **energy.nuclear_internal (float)** – nuclear internal energy (|kcal/mol|). Only populated if vibrational modes were calculated.
+ - **vibrations.number_of_modes (int)** – number of vibrational modes for this molecule, 3N-5 for non-linear molecules and 3N-6 for linear molecules, where N is the number of atoms.
+ - **vibrations.number_of_imag_modes (int)** – number of imaginary vibrational modes for this molecule.
+ - **vibrations.frequencies (float)** – vibrational frequencies associated with the vibrational modes, sorted from low to high (|cm-1|).
+ - **vibrations.intensities (float)** – vibrational intensities associated with the vibrational modes (|km/mol|).
+ - **vibrations.modes (list[float])** – list of vibrational modes sorted from low frequency to high frequency.
+ - **vibrations.character (str)** – Character of the molecule based on the number of imaginary vibrational modes. Can be "minimum" or "transition state".
+ - **vdd.charges (nparray[float] (1D))** - 1D array of Voronoi Deformation Denisty (VDD) charges in [electrons], being the difference between the final (SCF) and initial VDD charges.
+ - **vdd.charges.{symmetry label} (nparray[float] (1D))** - 1D array of Voronoi Deformation Denisty (VDD) charges in [electrons] per irrep.
+ - **s2** - expectation value of the :math:`S^2` operator.
+ - **s2_expected** - ideal expectation value of the :math:`S^2` operator. For restricted calculations this should always equal ``s2``.
+ - **spin_contamination** - the amount of spin-contamination observed in this calculation. It is equal to (s2 - s2_expected) / (s2_expected). Ideally this value should be below 0.1.
+ """
+
+ assert info.engine == "adf", f"This function reads ADF data, not {info.engine} data"
+
+ ret = Result()
+
+ if info.adf.task.lower() == "vibrationalanalysis":
+ reader_ams = cache.get(info.files["ams.rkf"])
+ ret.vibrations = _read_vibrations(reader_ams)
+ return ret
+
+ reader_adf = cache.get(info.files["adf.rkf"])
+
+ # read energies (given in Ha in rkf files)
+ ret.energy.bond = reader_adf.read("Energy", "Bond Energy") * constants.HA2KCALMOL
+ ret.energy.elstat = reader_adf.read("Energy", "elstat") * constants.HA2KCALMOL
+
+ # read the total orbital interaction energy
+ ret.energy.orbint.total = reader_adf.read("Energy", "Orb.Int. Total") * constants.HA2KCALMOL
+
+ # to calculate the orbital interaction term:
+ # the difference between the total and the sum of the symmetrized interaction energies should be calculated
+ # therefore the correction is first set equal to the total orbital interaction.
+ ret.energy.orbint.correction = ret.energy.orbint.total
+
+ # looping over every symlabel, to get the energy per symmetry label
+ for symlabel in info.adf.symmetry.labels:
+ symlabel = symlabel.split(":")[0]
+ ret.energy.orbint[symlabel] = reader_adf.read("Energy", f"Orb.Int. {symlabel}") * constants.HA2KCALMOL
+
+ # the energy per symmetry label is abstracted from the "total orbital interaction"
+ # obtaining the correction to the orbital interaction term
+ ret.energy.orbint.correction -= ret.energy.orbint[symlabel]
+
+ ret.energy.pauli.total = reader_adf.read("Energy", "Pauli Total") * constants.HA2KCALMOL
+ ret.energy.dispersion = reader_adf.read("Energy", "Dispersion Energy") * constants.HA2KCALMOL
+
+ if ("Thermodynamics", "Gibbs free Energy") in reader_adf:
+ ret.energy.gibbs = reader_adf.read("Thermodynamics", "Gibbs free Energy") * constants.HA2KCALMOL
+ ret.energy.enthalpy = reader_adf.read("Thermodynamics", "Enthalpy") * constants.HA2KCALMOL
+ ret.energy.nuclear_internal = reader_adf.read("Thermodynamics", "Internal Energy total") * constants.HA2KCALMOL
+
+ # vibrational information
+ if ("Vibrations", "nNormalModes") in reader_adf:
+ ret.vibrations = _read_vibrations(reader_adf)
+
+ # read the Voronoi Deformation Charges Deformation (VDD) before and after SCF convergence (being "inital" and "SCF")
+ try:
+ ret.vdd.charges = _read_vdd_charges(reader_adf)
+ ret.vdd.update(_get_vdd_charges_per_irrep(reader_adf))
+ except KeyError:
+ pass
+
+ # read spin-squared operator info
+ # the total spin
+ S = info.adf.spin_polarization * 1 / 2
+ ret.s2_expected = S * (S + 1)
+ # this is the real expectation value
+ if ("Properties", "S2calc") in reader_adf:
+ ret.s2 = reader_adf.read("Properties", "S2calc")
+ else:
+ ret.s2 = 0
+
+ # calculate the contamination
+ # if S is 0 then we will get a divide by zero error, but spin-contamination should be 0
+ if S != 0:
+ ret.spin_contamination = (ret.s2 - ret.s2_expected) / (ret.s2_expected)
+ else:
+ ret.spin_contamination = 0
+
+ return ret
+
+
+def get_level_of_theory(info: Result) -> Result:
+ """Function to get the level-of-theory from an input-file.
+
+ Args:
+ inp_path: Path to the input file. Can be a .run or .in file create for AMS
+
+ Returns:
+ :Dictionary containing information about the level-of-theory:
+
+ - **summary (str)** - a summary string that gives the level-of-theory in a human-readable format.
+ - **xc.functional (str)** - XC-functional used in the calculation.
+ - **xc.category (str)** - category the XC-functional belongs to. E.g. GGA, MetaHybrid, etc ...
+ - **xc.dispersion (str)** - the dispersion correction method used during the calculation.
+ - **xc.summary (str)** - a summary string that gives the XC-functional information in a human-readable format.
+ - **xc.empiricalScaling (str)** - which empirical scaling parameter was used. Useful for MP2 calculations.
+ - **basis.type (str)** - the size/type of the basis-set.
+ - **basis.core (str)** - the size of the frozen-core approximation.
+ - **quality (str)** - the numerical quality setting.
+ """
+ sett = info.input
+ ret = Result()
+ # print(json.dumps(sett, indent=4))
+ xc_categories = ["GGA", "LDA", "MetaGGA", "MetaHybrid", "Model", "LibXC", "DoubleHybrid", "Hybrid", "MP2", "HartreeFock"]
+ ret.xc.functional = "VWN"
+ ret.xc.category = "LDA"
+ for cat in xc_categories:
+ if cat.lower() in [key.lower() for key in sett.adf.xc]:
+ ret.xc.functional = sett.adf.xc[cat]
+ ret.xc.category = cat
+
+ ret.basis.type = sett.adf.basis.type
+ ret.basis.core = sett.adf.basis.core
+ ret.quality = sett.adf.NumericalQuality or "Normal"
+
+ ret.xc.dispersion = None
+ if "dispersion" in [key.lower() for key in sett.adf.xc]:
+ ret.xc.dispersion = " ".join(sett.adf.xc.dispersion.split())
+
+ # the empirical scaling value is used for MP2 calculations
+ ret.xc.empirical_scaling = None
+ if "empiricalscaling" in [key.lower() for key in sett.adf.xc]:
+ ret.xc.empiricalscaling = sett.adf.xc.empiricalscaling
+
+ # MP2 and HF are a little bit different from the usual xc categories. They are not key-value pairs but only the key
+ # we start building the ret.xc.summary string here already. This will contain the human-readable functional name
+ if ret.xc.category == "MP2":
+ ret.xc.summary = "MP2"
+ if ret.xc.empiricalscaling:
+ ret.xc.summary += f"-{ret.xc.empiricalscaling}"
+ elif ret.xc.category == "HartreeFock":
+ ret.xc.summary = "HF"
+ else:
+ ret.xc.summary = ret.xc.functional
+
+ # If dispersion was used, we want to add it to the ret.xc.summary
+ if ret.xc.dispersion:
+ if ret.xc.dispersion.lower() == "grimme3":
+ ret.xc.summary += "-D3"
+ if ret.xc.dispersion.lower() == "grimme3 bjdamp":
+ ret.xc.summary += "-D3(BJ)"
+ if ret.xc.dispersion.lower() == "grimme4":
+ ret.xc.summary += "-D4"
+ if ret.xc.dispersion.lower() == "ddsc":
+ ret.xc.summary += "-dDsC"
+ if ret.xc.dispersion.lower() == "uff":
+ ret.xc.summary += "-dUFF"
+ if ret.xc.dispersion.lower() == "mbd":
+ ret.xc.summary += "-MBD@rsSC"
+ if ret.xc.dispersion.lower() == "default":
+ ret.xc.summary += "-D"
+
+ # ret.summary is simply the ret.xc.summary plus the basis set type
+ ret.summary = f"{ret.xc.summary}/{ret.basis.type}"
+ return ret
diff --git a/src/tcutility/results/ams.py b/src/tcutility/results/ams.py
index a1dfbab2..8ba68a1b 100644
--- a/src/tcutility/results/ams.py
+++ b/src/tcutility/results/ams.py
@@ -1,625 +1,625 @@
-import os
-import re
-from datetime import datetime
-from typing import List
-
-import numpy as np
-from scm import plams
-
-from tcutility import constants, ensure_list
-from tcutility.results import Result, cache
-from tcutility.tc_typing import arrays
-
-j = os.path.join
-
-
-def get_calc_files(calc_dir: str) -> dict:
- """Function that returns files relevant to AMS calculations stored in ``calc_dir``.
-
- Args:
- calc_dir: path pointing to the desired calculation
-
- Returns:
- Dictionary containing filenames and paths
- """
- # collect all files in the current directory and subdirectories
- files = []
- for root, _, files_ in os.walk(os.path.abspath(calc_dir)):
- if os.path.split(root)[1].startswith("."):
- continue
-
- # some results are stored in dirs called {name}.results, if the calculations uses fragments there will be additional dirs called
- # {name}.{fragname}.results, which do not contain new information as the required info is copied over to {name}.results. Therefore
- # we should skip the fragment directories
- if os.path.split(root)[1].endswith(".results") and len(os.path.split(root)[1].split(".")) > 2:
- continue
-
- # we only need the rkf files in the .results directories
- if root.endswith(".rkf") and ".results" not in root:
- continue
-
- # opened files end in ~ and should be ignored
- if root.endswith("~"):
- continue
-
- # t21 files for specific atoms are not usefull and should be ignored
- if "t21." in root:
- continue
-
- # if a calculation is running or did not finish correctly there might be tmp. dirs, which should be ignored
- if os.path.split(root)[1].startswith("tmp."):
- continue
-
- # the rest can all be stored
- files.extend([j(root, file) for file in files_])
-
- # parse the filenames
- ret = {}
- ret["root"] = os.path.abspath(calc_dir)
- for file in files:
- # rkf files are either called /{program}.rkf, or /{name}.{program}.rkf, so we must parse them in a special way
- if file.endswith(".rkf"):
- f = os.path.split(file)[1]
- parts = f.split(".")
- f = f"{parts[-2]}.rkf"
- ret[f] = os.path.abspath(file)
-
- # logfiles are generally called either {name}.log or {name}.logfile
- if file.endswith(".logfile") or file.endswith(".log") or file.endswith(".err"):
- f = os.path.split(file)[1]
- parts = f.split(".")
- f = ".".join(parts[1:]).replace("logfile", "log")
- ret[f] = os.path.abspath(file)
-
- return ret
-
-
-def get_ams_version(calc_dir: str) -> Result:
- """Function to get the AMS version used in the calculation.
-
- Args:
- calc_dir: path pointing to the desired calculation.
-
- Returns:
- :Dictionary containing results about the AMS version:
-
- - **full (str)** – the full version string as written by SCM.
- - **major (str)** – major AMS version, should correspond to the year of release.
- - **minor (str)** – minor AMS version.
- - **micro (str)** – micro AMS version, should correspond to the internal revision number.
- - **date (datetime.datetime)** – date the AMS version was released.
- """
- ret = Result()
- files = get_calc_files(calc_dir)
- reader_ams = cache.get(files["ams.rkf"])
-
- # store information about the version of AMS
- ret.full = str(reader_ams.read("General", "release"))
- # decompose the full version string
- ret.major = ret.full.split(".")[0]
- ret.minor = ret.full.split()[0].split(".")[1]
- ret.micro = ret.full.split()[1]
- ret.date = datetime.strptime(ret.full.split()[-1][1:-1], "%Y-%m-%d")
-
- return ret
-
-
-def get_ams_info(calc_dir: str) -> Result:
- """Function to read useful info about the calculation in ``calc_dir``. Returned information will depend on the type of file that is provided.
-
- Args:
- calc_dir: path pointing to the desired calculation.
-
- Returns:
- :Dictionary containing results about the calculation and AMS:
-
- - **ams_version (Result)** – information about the AMS version used, see :func:`get_ams_version`.
- - **engine (str)** – the engine that was used to perform the calculation, for example 'adf', 'dftb', ...
- - **job_id (str)** – the ID of the job, can be used to check if two calculations are the same. Might also be used as a unique identifier for the calculation.
- - **status (Result)** – information about calculation status, see :func:`get_calculation_status`.
- - **is_multijob (bool)** – whether the job was a multijob, for example a fragment analysis.
- - **molecule (Result)** – information about the input and output molecules and the molecular system in general, see :func:`get_molecules`.
- - **history (Result)** – information about history variables, see :func:`get_history`.
- """
- ret = Result()
- ret.files = get_calc_files(calc_dir)
- reader_ams = cache.get(ret.files["ams.rkf"])
-
- # check what the program is first. The program can be either AMS or one of the engines (ADF, DFTB, ...)
- if ("General", "engine") in reader_ams:
- ret.engine = str(reader_ams.read("General", "engine")).strip().lower()
- # if program cannot be read from reader it is probably an old version of ADF, so we should default to ADF
- else:
- ret.engine = "adf"
-
- # store the input of the calculation
- ret.input = get_ams_input(reader_ams.read("General", "user input"))
-
- # store the job id, which should be unique for the job
- ret.job_id = reader_ams.read("General", "jobid") if ("General", "jobid") in reader_ams else None
-
- # store information about the version of AMS
- ret.ams_version = get_ams_version(calc_dir)
-
- # store the computation timings, only available in ams.rkf
- ret.timing = get_timing(calc_dir)
-
- # store the calculation status
- ret.status = get_calculation_status(calc_dir)
-
- # check if this was a multijob
- ret.is_multijob = False
- if len([file for file in ret.files if file.endswith(".rkf")]) > 2:
- ret.is_multijob = True
-
- # read molecules
- ret.molecule = get_molecules(calc_dir)
-
- # and history variables
- ret.history = get_history(calc_dir)
-
- ret.pes = get_pes(calc_dir)
-
- cache.unload(ret.files["ams.rkf"])
- return ret
-
-
-def get_timing(calc_dir: str) -> Result:
- """Function to get the timings from the calculation.
-
- Args:
- calc_dir: path pointing to the desired calculation.
-
- Returns:
- :Dictionary containing results about the timings:
-
- - **cpu (float)** – time spent performing calculations on the cpu.
- - **sys (float)** – time spent by the system (file IO, process creation/destruction, etc ...).
- - **total (float)** – total time spent by AMS on the calculation, can be larger than the sum of cpu and sys.
- """
- ret = Result()
- files = get_calc_files(calc_dir)
- reader_ams = cache.get(files["ams.rkf"])
-
- ret.cpu = reader_ams.read("General", "CPUTime") if ("General", "CPUTime") in reader_ams else None
- ret.sys = reader_ams.read("General", "SysTime") if ("General", "SysTime") in reader_ams else None
- ret.total = reader_ams.read("General", "ElapsedTime") if ("General", "ElapsedTime") in reader_ams else None
-
- return ret
-
-
-def get_calculation_status(calc_dir: str) -> Result:
- """Function that returns the status of the calculation described in reader.
- In case of non-succes it will also give possible reasons for the errors/warnings.
-
- Args:
- reader: ``plams.KFReader`` or ``plams.KFFile`` object pointing to the desired calculation
-
- Returns:
- :Dictionary containing information about the calculation status:
-
- - **fatal (bool)** – True if calculation cannot be analysed correctly, False otherwise
- - **reasons (list[str])** – list of reasons to explain the status, they can be errors, warnings, etc.
- - **name (str)** – calculation status written as a string, one of ("SUCCESS", "RUNNING", "UNKNOWN", "SUCCESS(W)", "FAILED")
- - **code (str)** – calculation status written as a single character, one of ("S", "R", "U", "W" "F")
- """
- files = get_calc_files(calc_dir)
- reader_ams = cache.get(files["ams.rkf"])
-
- ret = Result()
- ret.fatal = True
- ret.name = None
- ret.code = None
- ret.reasons = []
-
- termination_status = str(reader_ams.read("General", "termination status")).strip()
-
- # parse the logfile to find errors and warnings
- if "log" in files:
- with open(files["log"]) as logfile:
- for line in logfile.readlines():
- # the first 25 characters include the timestamp and two spaces
- line_ = line.strip()[25:]
- # errors and warnings have a predictable format
- if line_.lower().startswith("error:") or line_.lower().startswith("warning: "):
- ret.reasons.append(line_)
-
- if termination_status == "NORMAL TERMINATION":
- ret.fatal = False
- ret.name = "SUCCESS"
- ret.code = "S"
- return ret
-
- if termination_status == "IN PROGRESS":
- ret.fatal = False
- ret.reasons.append("Calculation in progress")
- ret.name = "RUNNING"
- ret.code = "R"
- return ret
-
- if termination_status == "UNKNOWN":
- ret.reasons.append("Calculation status unknown")
- ret.name = "UNKNOWN"
- ret.code = "U"
- return ret
-
- if termination_status == "NORMAL TERMINATION with warnings":
- ret.fatal = False
- ret.name = "SUCCESS(W)"
- ret.code = "W"
- return ret
-
- if termination_status == "NORMAL TERMINATION with errors":
- ret.name = "FAILED"
- ret.code = "F"
- return ret
-
- # if we have not excited the function yet we do not know what the status is
- # probably means that there was a parsing error in ams, which will be placed in termination status
- ret.reasons.append(termination_status)
- ret.name = "UNKNOWN"
- ret.code = "U"
- return ret
-
-
-# ------------------------------------------------------------- #
-# ------------------------- Geometry -------------------------- #
-# ------------------------------------------------------------- #
-
-
-# -------------------- Fragment indices ----------------------- #
-
-
-def _get_fragment_indices_from_input_order(results_type) -> arrays.Array1D:
- """Function to get the fragment indices from the input order. This is needed because the fragment indices are stored in internal order in the rkf file."""
- frag_indices = np.array(results_type.read("Geometry", "fragment and atomtype index")).reshape(2, -1) # 1st row: Fragment index; 2nd row atomtype index
- atom_order = np.array(results_type.read("Geometry", "atom order index")).reshape(2, -1) # 1st row: input order; 2nd row: internal order
- combined = np.concatenate((frag_indices, atom_order), axis=0)
- sorted_by_input_order = np.array(sorted(combined.T, key=lambda x: x[2])) # sort the fragment indices by input order
- frag_order = sorted_by_input_order[:, 0]
- return frag_order
-
-
-# ------------------------ Molecule -------------------------- #
-
-
-def _make_molecule(kf_variable: str, reader_ams: plams.KFReader, natoms: int, atnums: List[int]) -> plams.Molecule:
- """Makes a plams.Molecule object from the given kf_variable ("InputMolecule" or "Molecule") and reader."""
- # read output molecule
- ret_mol = plams.Molecule()
- coords = np.array(reader_ams.read(kf_variable, "Coords")).reshape(natoms, 3) * constants.BOHR2ANG
- for atnum, coord in zip(atnums, coords):
- ret_mol.add_atom(plams.Atom(atnum=atnum, coords=coord))
- if ("Molecule", "fromAtoms") in reader_ams and ("Molecule", "toAtoms") in reader_ams and ("Molecule", "bondOrders"):
- at_from = ensure_list(reader_ams.read("InputMolecule", "fromAtoms"))
- at_to = ensure_list(reader_ams.read("InputMolecule", "toAtoms"))
- bos = ensure_list(reader_ams.read("InputMolecule", "bondOrders"))
- for at1, at2, order in zip(at_from, at_to, bos):
- ret_mol.add_bond(plams.Bond(ret_mol[at1], ret_mol[at2], order=order))
- else:
- ret_mol.guess_bonds()
- return ret_mol
-
-
-def get_molecules(calc_dir: str) -> Result:
- """
- Function to get molecules from the calculation, including input, output and history molecules.
- It will also add bonds to the molecule if they are given in the rkf file, else it will guess them.
-
- Args:
- calc_dir: path pointing to the desired calculation.
-
- Returns:
- :Dictionary containing information about the molecular systems:
-
- - **number_of_atoms (int)** – number of atoms in the molecule.
- - **atom_numbers (list[int])** – list of atomic numbers for each atom in the molecule.
- - **atom_symbols (list[str])** – list of elements for each atom in the molecule.
- - **atom_masses (list[float])** – list of atomic masses for each atom in the molecule.
- - **input (plams.Molecule)** – molecule that was given in the input for the calculation.
- - **output (plams.Molecule)** – final molecule that was given as the output for the calculation. If the calculation was a singlepoint calculation output and input molecules will be the same.
- - **frag_indices (numpy array[int] (1D))** – list of fragment indices for each atom in the molecule. The indices are given in the order of the atoms in the molecule.
- """
- files = get_calc_files(calc_dir)
- # all info is stored in reader_ams
- reader_ams = cache.get(files["ams.rkf"])
-
- ret = Result()
-
- # read general
- atnums = ensure_list(reader_ams.read("InputMolecule", "AtomicNumbers")) # type: ignore plams does not include type hints. Returns list[int]
- natoms = len(atnums)
- ret.number_of_atoms = natoms
- ret.atom_numbers = atnums
- ret.atom_symbols = str(reader_ams.read("InputMolecule", "AtomSymbols")).split()
- ret.atom_masses = reader_ams.read("InputMolecule", "AtomMasses")
-
- # read input molecule
- ret.input = _make_molecule("InputMolecule", reader_ams, natoms, atnums)
-
- # read output molecule
- ret.output = _make_molecule("Molecule", reader_ams, natoms, atnums)
-
- # add fragment indices to the molecule using adf file
- try:
- reader_adf = cache.get(files["adf.rkf"])
- ret.frag_indices = _get_fragment_indices_from_input_order(reader_adf)
- except KeyError:
- ret.frag_indices = np.ones(natoms)
-
- # add the charges to the molecule
- try:
- ret.mol_charge = reader_ams.read("Molecule", "Charge")
- except KeyError:
- ret.mol_charge = 0.0
-
- return ret
-
-
-def get_pes(calc_dir: str) -> Result:
- """
- Function to get PES scan variables.
-
- Args:
- calc_dir: path pointing to the desired calculation.
-
- Returns:
- :Dictionary containing information about the PES scan:
-
- - ``nscan_coords`` **int** – the number of scan-coordinates for this PES scan.
- - ``scan_coord_name`` **list[str] | str** – the names of the scan-coordinates.
- If there is more than one scan-coordinates it will be a list of strings, otherwise it will be a single string.
- - ``scan_coord`` **list[np.ndarray] | np.ndarray** – arrays of values for the scan-coordinates.
- If there is more than one scan-coordinates it will be a list of arrays, otherwise it will be a single array.
- - ``npoints`` **list[int] | int** – number of scan points for the scan-coordinates.
- If there is more than one scan-coordinates it will be a list of integers, otherwise it will be a single integer.
- """
- # read history mols
- files = get_calc_files(calc_dir)
- # all info is stored in reader_ams
- reader_ams = cache.get(files["ams.rkf"])
-
- # check if we have done a PESScan
- if ("PESScan", "nPoints") not in reader_ams:
- return
-
- ret = Result()
-
- ret.nscan_coords = reader_ams.read("PESScan", "nScanCoord")
- ret.scan_coord_name = [reader_ams.read("PESScan", f"ScanCoord({i+1})").strip() for i in range(ret.nscan_coords)]
- ret.npoints = [reader_ams.read("PESScan", f"nPoints({i+1})") for i in range(ret.nscan_coords)]
- ret.scan_coord = [np.linspace(reader_ams.read("PESScan", f"RangeStart({i+1})"), reader_ams.read("PESScan", f"RangeEnd({i+1})"), ret.npoints[i]) for i in range(ret.nscan_coords)]
- if ("PESScan", "PES") in reader_ams:
- ret.energies = np.array(reader_ams.read("PESScan", "PES")).reshape(*ret.npoints) * constants.HA2KCALMOL
-
- if ret.nscan_coords == 1:
- ret.scan_coord_name = ret.scan_coord_name[0]
- ret.scan_coord = ret.scan_coord[0]
- ret.npoints = ret.npoints[0]
-
- return ret
-
-
-def get_history(calc_dir: str) -> Result:
- """
- Function to get history variables. The type of variables read depends on the type of calculation.
-
- Args:
- calc_dir: path pointing to the desired calculation.
-
- Returns:
- :Dictionary containing information about the calculation status:
-
- - ``number_of_entries`` **(int)** – number of steps in the history.
- - ``{variable}`` **(list[Any])** – variable read from the history section. The number of variables and type of variables depend on the nature of the calculation.
-
- Common variables:
- | ``Molecule`` **(list[plams.Molecule])** – list of molecules from the history, for example from a geometry optimization or PES scan.
- | ``energy`` **(list[float])** – list of energies associated with each geometry step.
- | ``gradient`` **(list[list[float]])** – array of gradients for each geometry step and each atom.
- """
- # read history mols
- files = get_calc_files(calc_dir)
- # all info is stored in reader_ams
- reader_ams = cache.get(files["ams.rkf"])
-
- ret = Result()
-
- # read general info
- atnums = ensure_list(reader_ams.read("InputMolecule", "AtomicNumbers")) # type: ignore plams does not include type hints. Returns list[int]
- natoms = len(atnums)
-
- if ("History", "nEntries") in reader_ams:
- # the number of elements per history variable (e.g. number of steps in a geometry optimization)
- ret.number_of_entries = reader_ams.read("History", "nEntries")
- # for history we read the other variables in the rkf file
- # the variables are given in ('History', f'ItemName({index})') so we have to find all of those
- index = 1 # tracks the current index of the variable. Will be set to False to stop the search
- items = []
- while index:
- # try to access ItemName, if it cannot find it stop iteration
- try:
- item_name = reader_ams.read("History", f"ItemName({index})")
- items.append(item_name)
- index += 1
- except KeyError:
- index = False
-
- if "Coords" in items:
- items.append("Molecule")
-
- # create variable in result for each variable found
- for item in items:
- ret[item.lower()] = []
-
- # collect the elements for each history variable
- for i in range(ret.number_of_entries):
- for item in items:
- # Molecule are special, because we will convert them to plams.Molecule objects first
- if item == "Molecule":
- mol = plams.Molecule()
- coords = np.array(reader_ams.read("History", f"Coords({i+1})")).reshape(natoms, 3) * 0.529177
- for atnum, coord in zip(atnums, coords):
- mol.add_atom(plams.Atom(atnum=atnum, coords=coord))
- mol.guess_bonds()
- ret.molecule.append(mol)
- # other variables are just added as-is
- else:
- val = reader_ams.read("History", f"{item}({i+1})")
- ret[item.lower()].append(val)
-
- if "converged" not in ret.keys() and ("PESScan", "HistoryIndices") in reader_ams:
- ret["converged"] = [False] * ret.number_of_entries
- for idx in ensure_list(reader_ams.read("PESScan", "HistoryIndices")):
- ret["converged"][idx - 1] = True
-
- return ret
-
-
-def get_input_blocks():
- """
- This function reads input_blocks and decomposes its content into a list of blocks and a list of non-standard blocks
- The general format is as follows:
-
- parentblock
- - subblock
- - - subsubblock
- - subblock !nonstandard
- parentblock
- - subblock
- - - subsubblock
- - - - subsubsubblock
- - - - subsubsubblock !nonstandard
-
- Each subblock has to be defined within its parent block. !nonstandard indicates that the block is a non-standard block
- These blocks are special in that they can contain multiple of the same entry
- """
- blocks = []
- nonstandard_blocks = []
- parent_blocks = [] # this list tracks the parent blocks of the current block
- with open(j(os.path.split(__file__)[0], "input_blocks")) as inpblx:
- lines = inpblx.readlines()
-
- for line in lines:
- line = line.strip().lower()
- # we can ignore some lines
- if line == "" or line.startswith("#"):
- continue
-
- # block_depth indicates how many parents the block has
- block_depth = line.count("- ")
- # we reduce the amount of parent_blocks using block_depth
- # if we move from a subsubblock to a subblock we remove the last-added block
- parent_blocks = parent_blocks[:block_depth]
-
- # remove the "- " substrings
- block = line.split("- ")[-1].strip().lower()
- # check if the block is non-standard. If it is, remove the !nonstandard substring
- # and add it to the nonstandard_blocks list
- if block.endswith("!nonstandard"):
- block = block.split()[0]
- nonstandard_blocks.append(parent_blocks.copy() + [block])
- # in both standard and nonstandard cases add the block to blocks list
- blocks.append(parent_blocks.copy() + [block])
- # add the current block to parent_blocks for the next line
- parent_blocks.append(block.lower())
-
- return blocks, nonstandard_blocks
-
-
-def get_ams_input(inp: str) -> Result:
- def get_possible_blocks():
- # check which blocks are openable given the current open blocks
- # we start by considering all blocks
- possible_blocks = blocks
- # we iterate through the open blocks and check if the first element in the possible_blocks is the same.
- # this way we move down through the blocks
- for open_block in open_blocks:
- possible_blocks = [block[1:] for block in possible_blocks if len(block) > 0 and block[0].lower() == open_block.lower()]
- # we want only the first element in the possible blocks, not the tails
- possible_blocks = set([block[0] for block in possible_blocks if len(block) > 0])
- return possible_blocks
-
- sett = Result()
-
- blocks, nonstandard_blocks = get_input_blocks()
-
- open_blocks = ["ams"]
- for line in inp.splitlines():
- line = line.strip()
-
- # we remove comments from the line
- # comments can be either at the start of a line or after a real statement
- # so we have to search the line for comment starters and remove the part after it
- for comment_start in ["#", "!", "::"]:
- if comment_start in line:
- idx = line.index(comment_start)
- line = line[:idx]
-
- # skip empty lines
- if not line:
- continue
-
- # if we encounter an end statement we can close the last openblock
- if line.lower().startswith("end"):
- open_blocks.pop(-1)
- continue
-
- # check if we are opening a block
- # We have to store the parts of a compact block (if it is compact)
- # it will be a list of tuples of key-value pairs
- compact_parts = None
- skip = False
- # check if the current line corresponds to a possible block
- for possible_block in get_possible_blocks():
- if line.lower().startswith(possible_block.lower()):
- # a block opening can either span multiple lines or can be use with compact notation
- # compact notation will always have = signs
- if "=" in line:
- # split the key-values using some regex magic
- compact = line[len(possible_block) :].strip() # remove the block name
- compact_parts = re.findall(r"""(\S+)=['"]{0,1}([^'"\n]*)['"]{0,1}""", compact)
- else:
- skip = True
- # add the new block to the open_blocks
- open_blocks.append(possible_block)
-
- # if we are not in a compact block we can just skip
- if skip:
- continue
-
- # get the sett to the correct level
- # first check if the block is nonstandard
- is_nonstandard = [block.lower() for block in open_blocks] in nonstandard_blocks
- sett_ = sett
- # go to the layer one above the lowest
- for open_block in open_blocks[:-1]:
- sett_ = sett_[open_block]
- # at the lowest level we have to check if the block is nonstandard. If it is, we add the whole line to the settings object
- if is_nonstandard and not sett_[open_blocks[-1]]:
- sett_[open_blocks[-1]] = []
- # then finally go to the lowest sett layer
- sett_ = sett_[open_blocks[-1]]
-
- # if we are in a compact block we just add all the key-value pairs
- if compact_parts:
- for key, val in compact_parts:
- sett_[key] = val
- # compact blocks do not have end statements, so we can remove it again from the open_blocks
- open_blocks.pop(-1)
- # in a normal block we split the line and add them to the settings
- else:
- # for nonstandard blocks we add the line to the list
- if is_nonstandard:
- sett_.append(line.strip())
- # for normal blocks we split the line and set it as a key, the rest of the line is the value
- else:
- sett_[line.split()[0]] = line[len(line.split()[0]) :].strip()
-
- for engine_block in ["engine adf", "engine dftb", "engine band"]:
- if engine_block not in sett["ams"]:
- continue
- sett["ams"][engine_block.split()[1]] = sett["ams"][engine_block]
- del sett["ams"][engine_block]
-
- return sett["ams"]
+import os
+import re
+from datetime import datetime
+from typing import List
+
+import numpy as np
+from scm import plams
+
+from tcutility import constants, ensure_list
+from tcutility.results import Result, cache
+from tcutility.tc_typing import arrays
+
+j = os.path.join
+
+
+def get_calc_files(calc_dir: str) -> dict:
+ """Function that returns files relevant to AMS calculations stored in ``calc_dir``.
+
+ Args:
+ calc_dir: path pointing to the desired calculation
+
+ Returns:
+ Dictionary containing filenames and paths
+ """
+ # collect all files in the current directory and subdirectories
+ files = []
+ for root, _, files_ in os.walk(os.path.abspath(calc_dir)):
+ if os.path.split(root)[1].startswith("."):
+ continue
+
+ # some results are stored in dirs called {name}.results, if the calculations uses fragments there will be additional dirs called
+ # {name}.{fragname}.results, which do not contain new information as the required info is copied over to {name}.results. Therefore
+ # we should skip the fragment directories
+ if os.path.split(root)[1].endswith(".results") and len(os.path.split(root)[1].split(".")) > 2:
+ continue
+
+ # we only need the rkf files in the .results directories
+ if root.endswith(".rkf") and ".results" not in root:
+ continue
+
+ # opened files end in ~ and should be ignored
+ if root.endswith("~"):
+ continue
+
+ # t21 files for specific atoms are not usefull and should be ignored
+ if "t21." in root:
+ continue
+
+ # if a calculation is running or did not finish correctly there might be tmp. dirs, which should be ignored
+ if os.path.split(root)[1].startswith("tmp."):
+ continue
+
+ # the rest can all be stored
+ files.extend([j(root, file) for file in files_])
+
+ # parse the filenames
+ ret = {}
+ ret["root"] = os.path.abspath(calc_dir)
+ for file in files:
+ # rkf files are either called /{program}.rkf, or /{name}.{program}.rkf, so we must parse them in a special way
+ if file.endswith(".rkf"):
+ f = os.path.split(file)[1]
+ parts = f.split(".")
+ f = f"{parts[-2]}.rkf"
+ ret[f] = os.path.abspath(file)
+
+ # logfiles are generally called either {name}.log or {name}.logfile
+ if file.endswith(".logfile") or file.endswith(".log") or file.endswith(".err"):
+ f = os.path.split(file)[1]
+ parts = f.split(".")
+ f = ".".join(parts[1:]).replace("logfile", "log")
+ ret[f] = os.path.abspath(file)
+
+ return ret
+
+
+def get_ams_version(calc_dir: str) -> Result:
+ """Function to get the AMS version used in the calculation.
+
+ Args:
+ calc_dir: path pointing to the desired calculation.
+
+ Returns:
+ :Dictionary containing results about the AMS version:
+
+ - **full (str)** – the full version string as written by SCM.
+ - **major (str)** – major AMS version, should correspond to the year of release.
+ - **minor (str)** – minor AMS version.
+ - **micro (str)** – micro AMS version, should correspond to the internal revision number.
+ - **date (datetime.datetime)** – date the AMS version was released.
+ """
+ ret = Result()
+ files = get_calc_files(calc_dir)
+ reader_ams = cache.get(files["ams.rkf"])
+
+ # store information about the version of AMS
+ ret.full = str(reader_ams.read("General", "release"))
+ # decompose the full version string
+ ret.major = ret.full.split(".")[0]
+ ret.minor = ret.full.split()[0].split(".")[1]
+ ret.micro = ret.full.split()[1]
+ ret.date = datetime.strptime(ret.full.split()[-1][1:-1], "%Y-%m-%d")
+
+ return ret
+
+
+def get_ams_info(calc_dir: str) -> Result:
+ """Function to read useful info about the calculation in ``calc_dir``. Returned information will depend on the type of file that is provided.
+
+ Args:
+ calc_dir: path pointing to the desired calculation.
+
+ Returns:
+ :Dictionary containing results about the calculation and AMS:
+
+ - **ams_version (Result)** – information about the AMS version used, see :func:`get_ams_version`.
+ - **engine (str)** – the engine that was used to perform the calculation, for example 'adf', 'dftb', ...
+ - **job_id (str)** – the ID of the job, can be used to check if two calculations are the same. Might also be used as a unique identifier for the calculation.
+ - **status (Result)** – information about calculation status, see :func:`get_calculation_status`.
+ - **is_multijob (bool)** – whether the job was a multijob, for example a fragment analysis.
+ - **molecule (Result)** – information about the input and output molecules and the molecular system in general, see :func:`get_molecules`.
+ - **history (Result)** – information about history variables, see :func:`get_history`.
+ """
+ ret = Result()
+ ret.files = get_calc_files(calc_dir)
+ reader_ams = cache.get(ret.files["ams.rkf"])
+
+ # check what the program is first. The program can be either AMS or one of the engines (ADF, DFTB, ...)
+ if ("General", "engine") in reader_ams:
+ ret.engine = str(reader_ams.read("General", "engine")).strip().lower()
+ # if program cannot be read from reader it is probably an old version of ADF, so we should default to ADF
+ else:
+ ret.engine = "adf"
+
+ # store the input of the calculation
+ ret.input = get_ams_input(reader_ams.read("General", "user input"))
+
+ # store the job id, which should be unique for the job
+ ret.job_id = reader_ams.read("General", "jobid") if ("General", "jobid") in reader_ams else None
+
+ # store information about the version of AMS
+ ret.ams_version = get_ams_version(calc_dir)
+
+ # store the computation timings, only available in ams.rkf
+ ret.timing = get_timing(calc_dir)
+
+ # store the calculation status
+ ret.status = get_calculation_status(calc_dir)
+
+ # check if this was a multijob
+ ret.is_multijob = False
+ if len([file for file in ret.files if file.endswith(".rkf")]) > 2:
+ ret.is_multijob = True
+
+ # read molecules
+ ret.molecule = get_molecules(calc_dir)
+
+ # and history variables
+ ret.history = get_history(calc_dir)
+
+ ret.pes = get_pes(calc_dir)
+
+ cache.unload(ret.files["ams.rkf"])
+ return ret
+
+
+def get_timing(calc_dir: str) -> Result:
+ """Function to get the timings from the calculation.
+
+ Args:
+ calc_dir: path pointing to the desired calculation.
+
+ Returns:
+ :Dictionary containing results about the timings:
+
+ - **cpu (float)** – time spent performing calculations on the cpu.
+ - **sys (float)** – time spent by the system (file IO, process creation/destruction, etc ...).
+ - **total (float)** – total time spent by AMS on the calculation, can be larger than the sum of cpu and sys.
+ """
+ ret = Result()
+ files = get_calc_files(calc_dir)
+ reader_ams = cache.get(files["ams.rkf"])
+
+ ret.cpu = reader_ams.read("General", "CPUTime") if ("General", "CPUTime") in reader_ams else None
+ ret.sys = reader_ams.read("General", "SysTime") if ("General", "SysTime") in reader_ams else None
+ ret.total = reader_ams.read("General", "ElapsedTime") if ("General", "ElapsedTime") in reader_ams else None
+
+ return ret
+
+
+def get_calculation_status(calc_dir: str) -> Result:
+ """Function that returns the status of the calculation described in reader.
+ In case of non-succes it will also give possible reasons for the errors/warnings.
+
+ Args:
+ reader: ``plams.KFReader`` or ``plams.KFFile`` object pointing to the desired calculation
+
+ Returns:
+ :Dictionary containing information about the calculation status:
+
+ - **fatal (bool)** – True if calculation cannot be analysed correctly, False otherwise
+ - **reasons (list[str])** – list of reasons to explain the status, they can be errors, warnings, etc.
+ - **name (str)** – calculation status written as a string, one of ("SUCCESS", "RUNNING", "UNKNOWN", "SUCCESS(W)", "FAILED")
+ - **code (str)** – calculation status written as a single character, one of ("S", "R", "U", "W" "F")
+ """
+ files = get_calc_files(calc_dir)
+ reader_ams = cache.get(files["ams.rkf"])
+
+ ret = Result()
+ ret.fatal = True
+ ret.name = None
+ ret.code = None
+ ret.reasons = []
+
+ termination_status = str(reader_ams.read("General", "termination status")).strip()
+
+ # parse the logfile to find errors and warnings
+ if "log" in files:
+ with open(files["log"]) as logfile:
+ for line in logfile.readlines():
+ # the first 25 characters include the timestamp and two spaces
+ line_ = line.strip()[25:]
+ # errors and warnings have a predictable format
+ if line_.lower().startswith("error:") or line_.lower().startswith("warning: "):
+ ret.reasons.append(line_)
+
+ if termination_status == "NORMAL TERMINATION":
+ ret.fatal = False
+ ret.name = "SUCCESS"
+ ret.code = "S"
+ return ret
+
+ if termination_status == "IN PROGRESS":
+ ret.fatal = False
+ ret.reasons.append("Calculation in progress")
+ ret.name = "RUNNING"
+ ret.code = "R"
+ return ret
+
+ if termination_status == "UNKNOWN":
+ ret.reasons.append("Calculation status unknown")
+ ret.name = "UNKNOWN"
+ ret.code = "U"
+ return ret
+
+ if termination_status == "NORMAL TERMINATION with warnings":
+ ret.fatal = False
+ ret.name = "SUCCESS(W)"
+ ret.code = "W"
+ return ret
+
+ if termination_status == "NORMAL TERMINATION with errors":
+ ret.name = "FAILED"
+ ret.code = "F"
+ return ret
+
+ # if we have not excited the function yet we do not know what the status is
+ # probably means that there was a parsing error in ams, which will be placed in termination status
+ ret.reasons.append(termination_status)
+ ret.name = "UNKNOWN"
+ ret.code = "U"
+ return ret
+
+
+# ------------------------------------------------------------- #
+# ------------------------- Geometry -------------------------- #
+# ------------------------------------------------------------- #
+
+
+# -------------------- Fragment indices ----------------------- #
+
+
+def _get_fragment_indices_from_input_order(results_type) -> arrays.Array1D:
+ """Function to get the fragment indices from the input order. This is needed because the fragment indices are stored in internal order in the rkf file."""
+ frag_indices = np.array(results_type.read("Geometry", "fragment and atomtype index")).reshape(2, -1) # 1st row: Fragment index; 2nd row atomtype index
+ atom_order = np.array(results_type.read("Geometry", "atom order index")).reshape(2, -1) # 1st row: input order; 2nd row: internal order
+ combined = np.concatenate((frag_indices, atom_order), axis=0)
+ sorted_by_input_order = np.array(sorted(combined.T, key=lambda x: x[2])) # sort the fragment indices by input order
+ frag_order = sorted_by_input_order[:, 0]
+ return frag_order
+
+
+# ------------------------ Molecule -------------------------- #
+
+
+def _make_molecule(kf_variable: str, reader_ams: plams.KFReader, natoms: int, atnums: List[int]) -> plams.Molecule:
+ """Makes a plams.Molecule object from the given kf_variable ("InputMolecule" or "Molecule") and reader."""
+ # read output molecule
+ ret_mol = plams.Molecule()
+ coords = np.array(reader_ams.read(kf_variable, "Coords")).reshape(natoms, 3) * constants.BOHR2ANG
+ for atnum, coord in zip(atnums, coords):
+ ret_mol.add_atom(plams.Atom(atnum=atnum, coords=coord))
+ if ("Molecule", "fromAtoms") in reader_ams and ("Molecule", "toAtoms") in reader_ams and ("Molecule", "bondOrders"):
+ at_from = ensure_list(reader_ams.read("InputMolecule", "fromAtoms"))
+ at_to = ensure_list(reader_ams.read("InputMolecule", "toAtoms"))
+ bos = ensure_list(reader_ams.read("InputMolecule", "bondOrders"))
+ for at1, at2, order in zip(at_from, at_to, bos):
+ ret_mol.add_bond(plams.Bond(ret_mol[at1], ret_mol[at2], order=order))
+ else:
+ ret_mol.guess_bonds()
+ return ret_mol
+
+
+def get_molecules(calc_dir: str) -> Result:
+ """
+ Function to get molecules from the calculation, including input, output and history molecules.
+ It will also add bonds to the molecule if they are given in the rkf file, else it will guess them.
+
+ Args:
+ calc_dir: path pointing to the desired calculation.
+
+ Returns:
+ :Dictionary containing information about the molecular systems:
+
+ - **number_of_atoms (int)** – number of atoms in the molecule.
+ - **atom_numbers (list[int])** – list of atomic numbers for each atom in the molecule.
+ - **atom_symbols (list[str])** – list of elements for each atom in the molecule.
+ - **atom_masses (list[float])** – list of atomic masses for each atom in the molecule.
+ - **input (plams.Molecule)** – molecule that was given in the input for the calculation.
+ - **output (plams.Molecule)** – final molecule that was given as the output for the calculation. If the calculation was a singlepoint calculation output and input molecules will be the same.
+ - **frag_indices (numpy array[int] (1D))** – list of fragment indices for each atom in the molecule. The indices are given in the order of the atoms in the molecule.
+ """
+ files = get_calc_files(calc_dir)
+ # all info is stored in reader_ams
+ reader_ams = cache.get(files["ams.rkf"])
+
+ ret = Result()
+
+ # read general
+ atnums = ensure_list(reader_ams.read("InputMolecule", "AtomicNumbers")) # type: ignore plams does not include type hints. Returns list[int]
+ natoms = len(atnums)
+ ret.number_of_atoms = natoms
+ ret.atom_numbers = atnums
+ ret.atom_symbols = str(reader_ams.read("InputMolecule", "AtomSymbols")).split()
+ ret.atom_masses = reader_ams.read("InputMolecule", "AtomMasses")
+
+ # read input molecule
+ ret.input = _make_molecule("InputMolecule", reader_ams, natoms, atnums)
+
+ # read output molecule
+ ret.output = _make_molecule("Molecule", reader_ams, natoms, atnums)
+
+ # add fragment indices to the molecule using adf file
+ try:
+ reader_adf = cache.get(files["adf.rkf"])
+ ret.frag_indices = _get_fragment_indices_from_input_order(reader_adf)
+ except KeyError:
+ ret.frag_indices = np.ones(natoms)
+
+ # add the charges to the molecule
+ try:
+ ret.mol_charge = reader_ams.read("Molecule", "Charge")
+ except KeyError:
+ ret.mol_charge = 0.0
+
+ return ret
+
+
+def get_pes(calc_dir: str) -> Result:
+ """
+ Function to get PES scan variables.
+
+ Args:
+ calc_dir: path pointing to the desired calculation.
+
+ Returns:
+ :Dictionary containing information about the PES scan:
+
+ - ``nscan_coords`` **int** – the number of scan-coordinates for this PES scan.
+ - ``scan_coord_name`` **list[str] | str** – the names of the scan-coordinates.
+ If there is more than one scan-coordinates it will be a list of strings, otherwise it will be a single string.
+ - ``scan_coord`` **list[np.ndarray] | np.ndarray** – arrays of values for the scan-coordinates.
+ If there is more than one scan-coordinates it will be a list of arrays, otherwise it will be a single array.
+ - ``npoints`` **list[int] | int** – number of scan points for the scan-coordinates.
+ If there is more than one scan-coordinates it will be a list of integers, otherwise it will be a single integer.
+ """
+ # read history mols
+ files = get_calc_files(calc_dir)
+ # all info is stored in reader_ams
+ reader_ams = cache.get(files["ams.rkf"])
+
+ # check if we have done a PESScan
+ if ("PESScan", "nPoints") not in reader_ams:
+ return
+
+ ret = Result()
+
+ ret.nscan_coords = reader_ams.read("PESScan", "nScanCoord")
+ ret.scan_coord_name = [reader_ams.read("PESScan", f"ScanCoord({i+1})").strip() for i in range(ret.nscan_coords)]
+ ret.npoints = [reader_ams.read("PESScan", f"nPoints({i+1})") for i in range(ret.nscan_coords)]
+ ret.scan_coord = [np.linspace(reader_ams.read("PESScan", f"RangeStart({i+1})"), reader_ams.read("PESScan", f"RangeEnd({i+1})"), ret.npoints[i]) for i in range(ret.nscan_coords)]
+ if ("PESScan", "PES") in reader_ams:
+ ret.energies = np.array(reader_ams.read("PESScan", "PES")).reshape(*ret.npoints) * constants.HA2KCALMOL
+
+ if ret.nscan_coords == 1:
+ ret.scan_coord_name = ret.scan_coord_name[0]
+ ret.scan_coord = ret.scan_coord[0]
+ ret.npoints = ret.npoints[0]
+
+ return ret
+
+
+def get_history(calc_dir: str) -> Result:
+ """
+ Function to get history variables. The type of variables read depends on the type of calculation.
+
+ Args:
+ calc_dir: path pointing to the desired calculation.
+
+ Returns:
+ :Dictionary containing information about the calculation status:
+
+ - ``number_of_entries`` **(int)** – number of steps in the history.
+ - ``{variable}`` **(list[Any])** – variable read from the history section. The number of variables and type of variables depend on the nature of the calculation.
+
+ Common variables:
+ | ``Molecule`` **(list[plams.Molecule])** – list of molecules from the history, for example from a geometry optimization or PES scan.
+ | ``energy`` **(list[float])** – list of energies associated with each geometry step.
+ | ``gradient`` **(list[list[float]])** – array of gradients for each geometry step and each atom.
+ """
+ # read history mols
+ files = get_calc_files(calc_dir)
+ # all info is stored in reader_ams
+ reader_ams = cache.get(files["ams.rkf"])
+
+ ret = Result()
+
+ # read general info
+ atnums = ensure_list(reader_ams.read("InputMolecule", "AtomicNumbers")) # type: ignore plams does not include type hints. Returns list[int]
+ natoms = len(atnums)
+
+ if ("History", "nEntries") in reader_ams:
+ # the number of elements per history variable (e.g. number of steps in a geometry optimization)
+ ret.number_of_entries = reader_ams.read("History", "nEntries")
+ # for history we read the other variables in the rkf file
+ # the variables are given in ('History', f'ItemName({index})') so we have to find all of those
+ index = 1 # tracks the current index of the variable. Will be set to False to stop the search
+ items = []
+ while index:
+ # try to access ItemName, if it cannot find it stop iteration
+ try:
+ item_name = reader_ams.read("History", f"ItemName({index})")
+ items.append(item_name)
+ index += 1
+ except KeyError:
+ index = False
+
+ if "Coords" in items:
+ items.append("Molecule")
+
+ # create variable in result for each variable found
+ for item in items:
+ ret[item.lower()] = []
+
+ # collect the elements for each history variable
+ for i in range(ret.number_of_entries):
+ for item in items:
+ # Molecule are special, because we will convert them to plams.Molecule objects first
+ if item == "Molecule":
+ mol = plams.Molecule()
+ coords = np.array(reader_ams.read("History", f"Coords({i+1})")).reshape(natoms, 3) * 0.529177
+ for atnum, coord in zip(atnums, coords):
+ mol.add_atom(plams.Atom(atnum=atnum, coords=coord))
+ mol.guess_bonds()
+ ret.molecule.append(mol)
+ # other variables are just added as-is
+ else:
+ val = reader_ams.read("History", f"{item}({i+1})")
+ ret[item.lower()].append(val)
+
+ if "converged" not in ret.keys() and ("PESScan", "HistoryIndices") in reader_ams:
+ ret["converged"] = [False] * ret.number_of_entries
+ for idx in ensure_list(reader_ams.read("PESScan", "HistoryIndices")):
+ ret["converged"][idx - 1] = True
+
+ return ret
+
+
+def get_input_blocks():
+ """
+ This function reads input_blocks and decomposes its content into a list of blocks and a list of non-standard blocks
+ The general format is as follows:
+
+ parentblock
+ - subblock
+ - - subsubblock
+ - subblock !nonstandard
+ parentblock
+ - subblock
+ - - subsubblock
+ - - - subsubsubblock
+ - - - subsubsubblock !nonstandard
+
+ Each subblock has to be defined within its parent block. !nonstandard indicates that the block is a non-standard block
+ These blocks are special in that they can contain multiple of the same entry
+ """
+ blocks = []
+ nonstandard_blocks = []
+ parent_blocks = [] # this list tracks the parent blocks of the current block
+ with open(j(os.path.split(__file__)[0], "input_blocks")) as inpblx:
+ lines = inpblx.readlines()
+
+ for line in lines:
+ line = line.strip().lower()
+ # we can ignore some lines
+ if line == "" or line.startswith("#"):
+ continue
+
+ # block_depth indicates how many parents the block has
+ block_depth = line.count("- ")
+ # we reduce the amount of parent_blocks using block_depth
+ # if we move from a subsubblock to a subblock we remove the last-added block
+ parent_blocks = parent_blocks[:block_depth]
+
+ # remove the "- " substrings
+ block = line.split("- ")[-1].strip().lower()
+ # check if the block is non-standard. If it is, remove the !nonstandard substring
+ # and add it to the nonstandard_blocks list
+ if block.endswith("!nonstandard"):
+ block = block.split()[0]
+ nonstandard_blocks.append(parent_blocks.copy() + [block])
+ # in both standard and nonstandard cases add the block to blocks list
+ blocks.append(parent_blocks.copy() + [block])
+ # add the current block to parent_blocks for the next line
+ parent_blocks.append(block.lower())
+
+ return blocks, nonstandard_blocks
+
+
+def get_ams_input(inp: str) -> Result:
+ def get_possible_blocks():
+ # check which blocks are openable given the current open blocks
+ # we start by considering all blocks
+ possible_blocks = blocks
+ # we iterate through the open blocks and check if the first element in the possible_blocks is the same.
+ # this way we move down through the blocks
+ for open_block in open_blocks:
+ possible_blocks = [block[1:] for block in possible_blocks if len(block) > 0 and block[0].lower() == open_block.lower()]
+ # we want only the first element in the possible blocks, not the tails
+ possible_blocks = set([block[0] for block in possible_blocks if len(block) > 0])
+ return possible_blocks
+
+ sett = Result()
+
+ blocks, nonstandard_blocks = get_input_blocks()
+
+ open_blocks = ["ams"]
+ for line in inp.splitlines():
+ line = line.strip()
+
+ # we remove comments from the line
+ # comments can be either at the start of a line or after a real statement
+ # so we have to search the line for comment starters and remove the part after it
+ for comment_start in ["#", "!", "::"]:
+ if comment_start in line:
+ idx = line.index(comment_start)
+ line = line[:idx]
+
+ # skip empty lines
+ if not line:
+ continue
+
+ # if we encounter an end statement we can close the last openblock
+ if line.lower().startswith("end"):
+ open_blocks.pop(-1)
+ continue
+
+ # check if we are opening a block
+ # We have to store the parts of a compact block (if it is compact)
+ # it will be a list of tuples of key-value pairs
+ compact_parts = None
+ skip = False
+ # check if the current line corresponds to a possible block
+ for possible_block in get_possible_blocks():
+ if line.lower().startswith(possible_block.lower()):
+ # a block opening can either span multiple lines or can be use with compact notation
+ # compact notation will always have = signs
+ if "=" in line:
+ # split the key-values using some regex magic
+ compact = line[len(possible_block) :].strip() # remove the block name
+ compact_parts = re.findall(r"""(\S+)=['"]{0,1}([^'"\n]*)['"]{0,1}""", compact)
+ else:
+ skip = True
+ # add the new block to the open_blocks
+ open_blocks.append(possible_block)
+
+ # if we are not in a compact block we can just skip
+ if skip:
+ continue
+
+ # get the sett to the correct level
+ # first check if the block is nonstandard
+ is_nonstandard = [block.lower() for block in open_blocks] in nonstandard_blocks
+ sett_ = sett
+ # go to the layer one above the lowest
+ for open_block in open_blocks[:-1]:
+ sett_ = sett_[open_block]
+ # at the lowest level we have to check if the block is nonstandard. If it is, we add the whole line to the settings object
+ if is_nonstandard and not sett_[open_blocks[-1]]:
+ sett_[open_blocks[-1]] = []
+ # then finally go to the lowest sett layer
+ sett_ = sett_[open_blocks[-1]]
+
+ # if we are in a compact block we just add all the key-value pairs
+ if compact_parts:
+ for key, val in compact_parts:
+ sett_[key] = val
+ # compact blocks do not have end statements, so we can remove it again from the open_blocks
+ open_blocks.pop(-1)
+ # in a normal block we split the line and add them to the settings
+ else:
+ # for nonstandard blocks we add the line to the list
+ if is_nonstandard:
+ sett_.append(line.strip())
+ # for normal blocks we split the line and set it as a key, the rest of the line is the value
+ else:
+ sett_[line.split()[0]] = line[len(line.split()[0]) :].strip()
+
+ for engine_block in ["engine adf", "engine dftb", "engine band"]:
+ if engine_block not in sett["ams"]:
+ continue
+ sett["ams"][engine_block.split()[1]] = sett["ams"][engine_block]
+ del sett["ams"][engine_block]
+
+ return sett["ams"]
diff --git a/src/tcutility/results/orca.py b/src/tcutility/results/orca.py
index a1710b5f..3d0db65d 100644
--- a/src/tcutility/results/orca.py
+++ b/src/tcutility/results/orca.py
@@ -1,562 +1,562 @@
-from tcutility.results import Result
-from tcutility import constants, slurm
-import os
-from scm import plams
-import numpy as np
-
-
-j = os.path.join
-
-
-def get_calc_files(calc_dir: str) -> Result:
- """Function that returns files relevant to ORCA calculations stored in ``calc_dir``.
-
- Args:
- calc_dir: path pointing to the desired calculation
-
- Returns:
- Result object containing filenames and paths
- """
- # collect all files in the current directory and subdirectories
- files = []
- for root, _, files_ in os.walk(calc_dir):
- files.extend([j(root, file) for file in files_])
-
- # we now go through all the files and check their nature
- ret = Result()
- ret.root = os.path.abspath(calc_dir)
- for file in files:
- with open(file, errors='ignore') as f:
- lines = f.readlines()
- # detect the output file
- if any(["* O R C A *" in line for line in lines]):
- ret.out = os.path.abspath(file)
- continue
-
- # detect the input file
- # there should be lines starting with ! and also the system line, starting with * xyz, * xyzfile, * gzmtfile or * int
- if any([line.startswith('!') for line in lines]) and any([(len(line.split()) > 2 and line.split()[0] == '*' and line.split()[1] in ['xyz', 'xyzfile', 'gzmtfile', 'int']) for line in lines]):
- ret.inp = os.path.abspath(file)
- continue
-
- return ret
-
-
-def get_version(info: Result) -> Result:
- """Function to get the ORCA version used in the calculation.
-
- Args:
- info: Result object containing ORCA calculation settings.
-
- Returns:
- :Result object containing results about the ORCA version:
-
- - **full (str)** – the full version string as written by ORCA.
- - **major (str)** – major ORCA version.
- - **minor (str)** – minor ORCA version.
- - **micro (str)** – micro ORCA version.
- """
- ret = Result()
- with open(info.files.out) as out:
- for line in out.readlines():
- line = line.strip()
- if "Program Version" not in line:
- continue
- version = line.split()[2]
- ret.full = version
- ret.major = version.split(".")[0]
- ret.minor = version.split(".")[1]
- ret.micro = version.split(".")[2]
- return ret
-
-
-def get_input(info: Result) -> Result:
- """Function that parses the input file for this ORCA calculation.
-
- Args:
- info: Result object containing ORCA calculation settings.
-
- Returns:
- :Result object containing information about the calculation input:
-
- - **main (list[str])** - the main inputs for the calculation. These are the lines that start with a "!".
- - **sections (Result)** - extra settings added to the calculation. These are the lines that start with a "%" and optionally end with "END" clause.
- - **system (Result)** - settings related to the molecular system. This includes charge, multiplicity and the coordinates.
- - **task (str)** - the task that was performed by the calculation, e.g. "SinglePoint", "TransitionStateSearch".
- """
- ret = Result()
-
- # we read the input file first
- if 'inp' in info.files:
- with open(info.files.inp) as inp:
- lines = inp.readlines()
- # if we don't have it we read the output file, which contains the input as a block
- else:
- with open(info.files.out) as out:
- start_reading = False
- lines = []
- for line in out.readlines():
- line = line.strip()
- if start_reading:
- lines.append(line)
-
- if "INPUT FILE" in line:
- start_reading = True
- continue
-
- if "****END OF INPUT****" in line:
- break
-
- lines = [line.split(">")[1] for line in lines[2:-1] if line.split(">")[1].strip()]
-
- ret.main = []
- curr_section = None
- read_system = False
- system_lines = []
- coordinates = None
- for line in lines:
- line = line.strip()
-
- if line.startswith("!"):
- ret.main.extend(line.strip("!").split())
-
- if curr_section:
- if line.lower() == "end":
- curr_section = None
- continue
-
- var, val = line.split()
- ret.sections[curr_section][var] = val
-
- if line.startswith("%"):
- curr_section = line.split()[0][1:]
- if len(line.split()) == 2:
- ret.sections[curr_section] = line.split()[1]
- curr_section = None
-
- if read_system:
- if line == "*":
- read_system = False
- continue
-
- system_lines.append(line)
-
- if line.startswith("*"):
- read_system = True
- _, coordinates, charge, multiplicity = line.split()[:4]
- if coordinates == "xyz":
- ret.system.coordinate_system = "cartesian"
- elif coordinates == "int":
- ret.system.coordinate_system = "internal"
- elif coordinates == "xyzfile":
- ret.system.coordinate_system = "cartesian"
- read_system = False
- ret.system.charge = charge
- ret.system.multiplicity = multiplicity
- continue
-
- if coordinates in ["xyz", "int"]:
- ret.system.molecule = plams.Molecule()
- for line in system_lines:
- line = line.replace(':', '')
- ret.system.molecule.add_atom(plams.Atom(symbol=line.split()[0], coords=[float(x) for x in line.split()[1:4]]))
-
- ret.task = "SinglePoint"
- if "optts" in [x.lower() for x in ret.main]:
- ret.task = "TransitionStateSearch"
- elif "opt" in [x.lower() for x in ret.main]:
- ret.task = "GeometryOptimization"
-
- return ret
-
-
-def get_level_of_theory(info: Result) -> Result:
- """Function to get the level-of-theory from an input-file.
-
- Args:
- info: Result object containing ORCA calculation settings.
-
- Returns:
- :Result object containing information about the level-of-theory:
-
- - **summary (str)** - a summary string that gives the level-of-theory in a human-readable format.
- - **basis.type (str)** - the size/type of the basis-set.
- - **UsedQROs (bool)** - whether QROs were used.
- """
- sett = info.input
- ret = Result()
- main = [x.lower() for x in sett.main]
- ret.method = 'HF'
- for method in ["MP2", "CCSD", "CCSD(T)", "CCSDT"]:
- if method.lower() in main:
- ret.method = method
- break
-
- ret.basis.type = 'def2-SVP'
- for bs in ["cc-pVDZ", "cc-pVTZ", "cc-pVQZ", "cc-pV5Z", "aug-cc-pVDZ", "aug-cc-pVTZ", "aug-cc-pVQZ", "aug-cc-pV5Z"]:
- if bs.lower() in main:
- ret.basis.type = bs
-
- used_qros = sett.sections.mdci.UseQROs and sett.sections.mdci.UseQROs.lower() == "true"
- ret.summary = f'{"QRO-" if used_qros else ""}{method}/{ret.basis.type}'
-
- return ret
-
-
-def get_calc_settings(info: Result) -> Result:
- """Function to read calculation settings for an ORCA calculation.
-
- Args:
- info: Result object containing ORCA calculation settings.
-
- Returns:
- :Result object containing properties from the ORCA calculation:
-
- - **task (str)** – the task that was set for the calculation.
- - **unrestricted (bool)** – whether or not the wavefunction is treated in an unrestricted manner.
- - **used_qros (bool)** - whether the reference wavefunction is transformed to a QRO wavefunction.
- - **frequencies (bool)** - whether vibrational frequencies were calculated.
- - **charge (int)** - the charge of the molecular system.
- - **spin_polarization (int)** - the spin-polarization of the molecular system.
- - **multiplicity (int)** - the multiplicity of the molecular system.
- """
-
- assert info.engine == "orca", f"This function reads ORCA data, not {info.engine} data"
-
- ret = Result()
-
- # set the calculation task at a higher level
- ret.task = info.input.task
-
- main = [x.lower() for x in info.input.main]
- # determine if the wavefunction are unrestricted or not
- ret.unrestricted = any(tag in main for tag in ["uhf", "uno"])
- ret.used_qros = info.input.sections.mdci.UseQROs and info.input.sections.mdci.UseQROs.lower() == "true"
- ret.frequencies = "freq" in main or 'numfreq' in main
- ret.charge = int(info.input.system.charge)
- ret.spin_polarization = int(info.input.system.multiplicity) - 1
- ret.multiplicity = int(info.input.system.multiplicity)
- return ret
-
-
-def get_calculation_status(info: Result) -> Result:
- """Function that returns the status of the ORCA calculation described in reader. In case of non-succes it will also give possible reasons for the errors/warnings.
-
- Args:
- info: Result object containing ORCA calculation information.
-
- Returns:
- :Result object containing information about the calculation status:
-
- - **fatal (bool)** – True if calculation cannot be analysed correctly, False otherwise
- - **reasons (list[str])** – list of reasons to explain the status, they can be errors, warnings, etc.
- - **name (str)** – calculation status written as a string, one of ("SUCCESS", "RUNNING", "UNKNOWN", "SUCCESS(W)", "FAILED")
- - **code (str)** – calculation status written as a single character, one of ("S", "R", "U", "W" "F")
- """
- ret = Result()
- ret.fatal = True
- ret.name = None
- ret.code = None
- ret.reasons = []
-
- # if we do not have an output file the calculation failed
- if "out" not in info.files.out:
- ret.reasons.append("Calculation status unknown")
- ret.name = "UNKNOWN"
- ret.code = "U"
- return ret
-
- # try to read if the calculation succeeded
- with open(info.files.out) as out:
- lines = out.readlines()
- if any(["ORCA TERMINATED NORMALLY" in line for line in lines]):
- ret.fatal = False
- ret.name = "SUCCESS"
- ret.code = "S"
- return ret
-
- # if it didnt we default to failed
- ret.name = "FAILED"
- ret.code = "F"
-
- # otherwise we check if the job is being managed by slurm
- if not slurm.workdir_info(os.path.abspath(info.files.root)):
- return ret
-
- # get the statuscode from the workdir
- state = slurm.workdir_info(os.path.abspath(info.files.root)).statuscode
- state_name = {
- 'CG': 'COMPLETING',
- 'CF': 'CONFIGURING',
- 'PD': 'PENDING',
- 'R': 'RUNNING'
- }.get(state, 'UNKNOWN')
-
- ret.fatal = False
- ret.name = state_name
- ret.code = state
- ret.reasons = []
-
- return ret
-
-
-def get_molecules(info: Result) -> Result:
- """Function that returns information about the molecules for this calculation.
-
- Args:
- info: Result object containing ORCA calculation information.
-
- Returns:
- :Result object containing properties from the ORCA calculation:
-
- - **input (plams.Molecule)** - the input molecule for this calculation.
- - **output (plams.Molecule)** - the output molecule for this calculation, for example the optimized structure after a geometry optimization.
- - **number_of_atoms (int)** - the number of atoms in the molecular system.
- """
- ret = Result()
- ret.input = info.input.system.molecule
- ret.number_of_atoms = len(ret.input.atoms)
-
- with open(info.files.out) as out:
- lines = out.readlines()
- lines = [line.strip() for line in lines]
-
- start_reading = False
- look_for_coords = False
- coords = []
- for line in lines:
- if start_reading:
- if len(line) == 0:
- start_reading = False
- break
-
- coords.append(line)
-
- if "THE OPTIMIZATION HAS CONVERGED" in line:
- look_for_coords = True
-
- if look_for_coords and "CARTESIAN COORDINATES (ANGSTROEM)" in line:
- look_for_coords = False
- start_reading = True
-
- ret.output = plams.Molecule()
- for coord in coords[1:]:
- sym, x, y, z = coord.split()
- ret.output.add_atom(plams.Atom(symbol=sym, coords=[float(x), float(y), float(z)]))
-
- if len(ret.output.atoms) == 0:
- ret.output = ret.input.copy()
- return ret
-
-
-def get_info(calc_dir: str) -> Result:
- """Function to read useful info about the calculation in ``calc_dir``. Returned information will depend on the type of file that is provided.
-
- Args:
- calc_dir: path pointing to the desired calculation.
-
- Returns:
- :Result object containing results about the calculation and AMS:
-
- - **version (Result)** – information about the AMS version used, see :func:`get_version`.
- - **files (Result)** - paths to files that are important for this calculation.
- - **input (Result)** - information about the input of this calculation, see :func:`get_input`.
- - **level (Result)** - information about the level of theory used for this calculation, see :func:`get_level_of_theory`.
- - **engine (str)** – the engine that was used to perform the calculation, for example 'adf', 'dftb', ...
- - **status (Result)** – information about calculation status, see :func:`get_calculation_status`.
- - **molecule (Result)** – information about the input and output molecules and the molecular system in general, see :func:`get_molecules`.
- """
- ret = Result()
-
- ret.engine = "orca"
- ret.files = get_calc_files(calc_dir)
-
- # store the input of the calculation
- ret.input = get_input(ret)
-
- ret.level = get_level_of_theory(ret)
-
- # store information about the version of AMS
- ret.version = get_version(ret)
-
- # store the calculation status
- ret.status = get_calculation_status(ret)
-
- # read molecules
- ret.molecule = get_molecules(ret)
-
- return ret
-
-
-def get_vibrations(lines):
- """Function to read vibrational data of an ORCA calculation.
-
- Args:
- lines: Lines in the output file of the ORCA calculation.
-
- Returns:
- :Result object containing vibrational properties from the ORCA calculation:
-
- - **number_of_modes (int)** – number of vibrational modes for this molecule, 3N-5 for non-linear molecules and 3N-6 for linear molecules, where N is the number of atoms.
- - **number_of_imaginary_modes (int)** – number of imaginary vibrational modes for this molecule.
- - **frequencies (list[float])** – vibrational frequencies associated with the vibrational modes, sorted from low to high (|cm-1|).
- - **intensities (list[float])** – vibrational intensities associated with the vibrational modes (|km/mol|). In ORCA, intensities of imaginary modes are set to 0.
- - **modes (list[float])** – list of vibrational modes sorted from low frequency to high frequency.
- - **character (str)** – the PES character of the molecular system. Either "minimum", "transitionstate" or "saddlepoint(n_imag)", for 0, 1, n_imag number of imaginary frequencies.
- """
- ret = Result()
- start_reading = False
- start_reading_idx = 0
- freq_lines = []
- for i, line in enumerate(lines):
- if start_reading:
- if len(line) == 0 and (i - start_reading_idx) > 4:
- break
- if ":" in line:
- freq_lines.append(line)
-
- if "VIBRATIONAL FREQUENCIES" in line:
- start_reading = True
- start_reading_idx = i
-
- ret.number_of_modes = len(freq_lines)
- frequencies = [float(line.split()[1]) for line in freq_lines]
- nrotranslational = sum([freq == 0 for freq in frequencies])
- ret.frequencies = frequencies[nrotranslational:]
- ret.number_of_imaginary_modes = len([freq for freq in ret.frequencies if freq < 0])
- ret.character = "minimum" if ret.number_of_imaginary_modes == 0 else "transitionstate" if ret.number_of_imaginary_modes == 1 else f"saddlepoint({ret.number_of_imaginary_modes})"
-
- start_reading = False
- mode_lines = []
- for i, line in enumerate(lines):
- if "NORMAL MODES" in line:
- start_reading = True
- continue
-
- if "IR SPECTRUM" in line:
- start_reading = False
- break
-
- if start_reading:
- mode_lines.append(line)
-
- mode_lines = mode_lines[6:-3]
- mode_lines = [[float(x) for x in line.split()[1:]] for i, line in enumerate(mode_lines) if i % (ret.number_of_modes + 1) != 0]
-
- nblocks = len(mode_lines) // ret.number_of_modes
- blocks = []
- for block in range(nblocks):
- blocks.append(np.array(mode_lines[block * ret.number_of_modes : (block + 1) * ret.number_of_modes]))
- ret.modes = np.hstack(blocks).T.tolist()[nrotranslational:]
-
- start_reading = False
- int_lines = []
- for i, line in enumerate(lines):
- if "IR SPECTRUM" in line:
- start_reading = True
- continue
-
- if "The epsilon (eps) is given for a Dirac delta lineshape." in line:
- start_reading = False
- break
-
- if start_reading:
- int_lines.append(line)
-
- ints = [float(line.split()[3]) for line in int_lines[5:-1]]
- ret.intensities = [0] * ret.number_of_imaginary_modes + ints
- return ret
-
-
-def get_properties(info: Result) -> Result:
- """Function to get properties from an ORCA calculation.
-
- Args:
- info: Result object containing ORCA properties.
-
- Returns:
- :Result object containing properties from the ORCA calculation:
-
- - **energy.bond (float)** – total bonding energy (|kcal/mol|).
- - **energy.enthalpy (float)** – enthalpy (|kcal/mol|). Only obtained if vibrational modes were calculated.
- - **energy.entropy (float)** – entropy (|kcal/mol|). Only obtained if vibrational modes were calculated.
- - **energy.gibbs (float)** – Gibb's free energy (|kcal/mol|). Only obtained if vibrational modes were calculated.
- - **energy.[method] (float)** - total energy (|kcal/mol|) at a certain level (HF, MP2, CCSD, ...). This is the sum of energy.HF and energy.[method]_corr.
- - **energy.[method]_corr (float)** - electron correlation energy (|kcal/mol|) at a certain level (HF, MP2, CCSD, ...).
- - **vibrations.number_of_modes (int)** – number of vibrational modes for this molecule, 3N-5 for non-linear molecules and 3N-6 for linear molecules, where N is the number of atoms.
- - **vibrations.number_of_imaginary_modes (int)** – number of imaginary vibrational modes for this molecule.
- - **vibrations.frequencies (list[float])** – vibrational frequencies associated with the vibrational modes, sorted from low to high (|cm-1|).
- - **vibrations.intensities (list[float])** – vibrational intensities associated with the vibrational modes (|km/mol|). In ORCA, intensities of imaginary modes are set to 0.
- - **vibrations.modes (list[float])** – list of vibrational modes sorted from low frequency to high frequency.
- - **vibrations.character (str)** – the PES character of the molecular system. Either "minimum", "transitionstate" or "saddlepoint(n_imag)", for 0, 1, n_imag number of imaginary frequencies.
- - **t1** - T1 diagnostic for the highest level of correlation chosen. Used to check the validity of the reference wavefunction.
- - **s2** - expectation value of the :math:`S^2` operator.
- - **s2_expected** - ideal expectation value of the :math:`S^2` operator.
- - **spin_contamination** - the amount of spin-contamination observed in this calculation. It is equal to (s2 - s2_expected) / (s2_expected). Ideally this value should be below 0.1.
- """
- ret = Result()
-
- with open(info.files.out) as out:
- lines = [line.strip() for line in out.readlines()]
-
- if info.orca.frequencies:
- ret.vibrations = get_vibrations(lines)
-
- # read some important info about the calculation
- for line in lines:
- if "FINAL SINGLE POINT ENERGY" in line:
- ret.energy.bond = float(line.split()[4]) * constants.HA2KCALMOL
- continue
-
- if "E(0)" in line:
- ret.energy.HF = float(line.split()[-1]) * constants.HA2KCALMOL
- continue
-
- if "Final correlation energy" in line:
- ret.energy.corr = float(line.split()[-1]) * constants.HA2KCALMOL
- continue
-
- if "E(MP2)" in line:
- ret.energy.MP2 = float(line.split()[-1]) * constants.HA2KCALMOL + ret.energy.HF
- ret.energy.MP2_corr = float(line.split()[-1]) * constants.HA2KCALMOL
- continue
-
- if "E(CCSD) " in line:
- ret.energy.CCSD = float(line.split()[-1]) * constants.HA2KCALMOL
- ret.energy.CCSD_corr = float(line.split()[-1]) * constants.HA2KCALMOL - ret.energy.HF
- continue
-
- if "E(CCSD(T))" in line:
- ret.energy.CCSD_T = float(line.split()[-1]) * constants.HA2KCALMOL
- ret.energy.CCSD_T_corr = float(line.split()[-1]) * constants.HA2KCALMOL - ret.energy.HF
- continue
-
- if "Final Gibbs free energy" in line:
- ret.energy.gibbs = float(line.split()[-2]) * constants.HA2KCALMOL
- continue
-
- if "Total enthalpy" in line:
- ret.energy.enthalpy = float(line.split()[-2]) * constants.HA2KCALMOL
- continue
-
- if "Final entropy term" in line:
- ret.energy.entropy = float(line.split()[-2])
- continue
-
- if "T1 diagnostic" in line:
- ret.t1 = float(line.split()[3])
- continue
-
- if "Expectation value of " in line:
- ret.s2 = float(line.split()[-1])
- continue
-
- if "Ideal value" in line:
- ret.s2_expected = float(line.split()[-1])
- continue
-
- if ret.s2 and ret.s2_expected:
- ret.spin_contamination = (ret.s2 - ret.s2_expected) / ret.s2_expected
-
- return ret
-
+from tcutility.results import Result
+from tcutility import constants, slurm
+import os
+from scm import plams
+import numpy as np
+
+
+j = os.path.join
+
+
+def get_calc_files(calc_dir: str) -> Result:
+ """Function that returns files relevant to ORCA calculations stored in ``calc_dir``.
+
+ Args:
+ calc_dir: path pointing to the desired calculation
+
+ Returns:
+ Result object containing filenames and paths
+ """
+ # collect all files in the current directory and subdirectories
+ files = []
+ for root, _, files_ in os.walk(calc_dir):
+ files.extend([j(root, file) for file in files_])
+
+ # we now go through all the files and check their nature
+ ret = Result()
+ ret.root = os.path.abspath(calc_dir)
+ for file in files:
+ with open(file, errors='ignore') as f:
+ lines = f.readlines()
+ # detect the output file
+ if any(["* O R C A *" in line for line in lines]):
+ ret.out = os.path.abspath(file)
+ continue
+
+ # detect the input file
+ # there should be lines starting with ! and also the system line, starting with * xyz, * xyzfile, * gzmtfile or * int
+ if any([line.startswith('!') for line in lines]) and any([(len(line.split()) > 2 and line.split()[0] == '*' and line.split()[1] in ['xyz', 'xyzfile', 'gzmtfile', 'int']) for line in lines]):
+ ret.inp = os.path.abspath(file)
+ continue
+
+ return ret
+
+
+def get_version(info: Result) -> Result:
+ """Function to get the ORCA version used in the calculation.
+
+ Args:
+ info: Result object containing ORCA calculation settings.
+
+ Returns:
+ :Result object containing results about the ORCA version:
+
+ - **full (str)** – the full version string as written by ORCA.
+ - **major (str)** – major ORCA version.
+ - **minor (str)** – minor ORCA version.
+ - **micro (str)** – micro ORCA version.
+ """
+ ret = Result()
+ with open(info.files.out) as out:
+ for line in out.readlines():
+ line = line.strip()
+ if "Program Version" not in line:
+ continue
+ version = line.split()[2]
+ ret.full = version
+ ret.major = version.split(".")[0]
+ ret.minor = version.split(".")[1]
+ ret.micro = version.split(".")[2]
+ return ret
+
+
+def get_input(info: Result) -> Result:
+ """Function that parses the input file for this ORCA calculation.
+
+ Args:
+ info: Result object containing ORCA calculation settings.
+
+ Returns:
+ :Result object containing information about the calculation input:
+
+ - **main (list[str])** - the main inputs for the calculation. These are the lines that start with a "!".
+ - **sections (Result)** - extra settings added to the calculation. These are the lines that start with a "%" and optionally end with "END" clause.
+ - **system (Result)** - settings related to the molecular system. This includes charge, multiplicity and the coordinates.
+ - **task (str)** - the task that was performed by the calculation, e.g. "SinglePoint", "TransitionStateSearch".
+ """
+ ret = Result()
+
+ # we read the input file first
+ if 'inp' in info.files:
+ with open(info.files.inp) as inp:
+ lines = inp.readlines()
+ # if we don't have it we read the output file, which contains the input as a block
+ else:
+ with open(info.files.out) as out:
+ start_reading = False
+ lines = []
+ for line in out.readlines():
+ line = line.strip()
+ if start_reading:
+ lines.append(line)
+
+ if "INPUT FILE" in line:
+ start_reading = True
+ continue
+
+ if "****END OF INPUT****" in line:
+ break
+
+ lines = [line.split(">")[1] for line in lines[2:-1] if line.split(">")[1].strip()]
+
+ ret.main = []
+ curr_section = None
+ read_system = False
+ system_lines = []
+ coordinates = None
+ for line in lines:
+ line = line.strip()
+
+ if line.startswith("!"):
+ ret.main.extend(line.strip("!").split())
+
+ if curr_section:
+ if line.lower() == "end":
+ curr_section = None
+ continue
+
+ var, val = line.split()
+ ret.sections[curr_section][var] = val
+
+ if line.startswith("%"):
+ curr_section = line.split()[0][1:]
+ if len(line.split()) == 2:
+ ret.sections[curr_section] = line.split()[1]
+ curr_section = None
+
+ if read_system:
+ if line == "*":
+ read_system = False
+ continue
+
+ system_lines.append(line)
+
+ if line.startswith("*"):
+ read_system = True
+ _, coordinates, charge, multiplicity = line.split()[:4]
+ if coordinates == "xyz":
+ ret.system.coordinate_system = "cartesian"
+ elif coordinates == "int":
+ ret.system.coordinate_system = "internal"
+ elif coordinates == "xyzfile":
+ ret.system.coordinate_system = "cartesian"
+ read_system = False
+ ret.system.charge = charge
+ ret.system.multiplicity = multiplicity
+ continue
+
+ if coordinates in ["xyz", "int"]:
+ ret.system.molecule = plams.Molecule()
+ for line in system_lines:
+ line = line.replace(':', '')
+ ret.system.molecule.add_atom(plams.Atom(symbol=line.split()[0], coords=[float(x) for x in line.split()[1:4]]))
+
+ ret.task = "SinglePoint"
+ if "optts" in [x.lower() for x in ret.main]:
+ ret.task = "TransitionStateSearch"
+ elif "opt" in [x.lower() for x in ret.main]:
+ ret.task = "GeometryOptimization"
+
+ return ret
+
+
+def get_level_of_theory(info: Result) -> Result:
+ """Function to get the level-of-theory from an input-file.
+
+ Args:
+ info: Result object containing ORCA calculation settings.
+
+ Returns:
+ :Result object containing information about the level-of-theory:
+
+ - **summary (str)** - a summary string that gives the level-of-theory in a human-readable format.
+ - **basis.type (str)** - the size/type of the basis-set.
+ - **UsedQROs (bool)** - whether QROs were used.
+ """
+ sett = info.input
+ ret = Result()
+ main = [x.lower() for x in sett.main]
+ ret.method = 'HF'
+ for method in ["MP2", "CCSD", "CCSD(T)", "CCSDT"]:
+ if method.lower() in main:
+ ret.method = method
+ break
+
+ ret.basis.type = 'def2-SVP'
+ for bs in ["cc-pVDZ", "cc-pVTZ", "cc-pVQZ", "cc-pV5Z", "aug-cc-pVDZ", "aug-cc-pVTZ", "aug-cc-pVQZ", "aug-cc-pV5Z"]:
+ if bs.lower() in main:
+ ret.basis.type = bs
+
+ used_qros = sett.sections.mdci.UseQROs and sett.sections.mdci.UseQROs.lower() == "true"
+ ret.summary = f'{"QRO-" if used_qros else ""}{method}/{ret.basis.type}'
+
+ return ret
+
+
+def get_calc_settings(info: Result) -> Result:
+ """Function to read calculation settings for an ORCA calculation.
+
+ Args:
+ info: Result object containing ORCA calculation settings.
+
+ Returns:
+ :Result object containing properties from the ORCA calculation:
+
+ - **task (str)** – the task that was set for the calculation.
+ - **unrestricted (bool)** – whether or not the wavefunction is treated in an unrestricted manner.
+ - **used_qros (bool)** - whether the reference wavefunction is transformed to a QRO wavefunction.
+ - **frequencies (bool)** - whether vibrational frequencies were calculated.
+ - **charge (int)** - the charge of the molecular system.
+ - **spin_polarization (int)** - the spin-polarization of the molecular system.
+ - **multiplicity (int)** - the multiplicity of the molecular system.
+ """
+
+ assert info.engine == "orca", f"This function reads ORCA data, not {info.engine} data"
+
+ ret = Result()
+
+ # set the calculation task at a higher level
+ ret.task = info.input.task
+
+ main = [x.lower() for x in info.input.main]
+ # determine if the wavefunction are unrestricted or not
+ ret.unrestricted = any(tag in main for tag in ["uhf", "uno"])
+ ret.used_qros = info.input.sections.mdci.UseQROs and info.input.sections.mdci.UseQROs.lower() == "true"
+ ret.frequencies = "freq" in main or 'numfreq' in main
+ ret.charge = int(info.input.system.charge)
+ ret.spin_polarization = int(info.input.system.multiplicity) - 1
+ ret.multiplicity = int(info.input.system.multiplicity)
+ return ret
+
+
+def get_calculation_status(info: Result) -> Result:
+ """Function that returns the status of the ORCA calculation described in reader. In case of non-succes it will also give possible reasons for the errors/warnings.
+
+ Args:
+ info: Result object containing ORCA calculation information.
+
+ Returns:
+ :Result object containing information about the calculation status:
+
+ - **fatal (bool)** – True if calculation cannot be analysed correctly, False otherwise
+ - **reasons (list[str])** – list of reasons to explain the status, they can be errors, warnings, etc.
+ - **name (str)** – calculation status written as a string, one of ("SUCCESS", "RUNNING", "UNKNOWN", "SUCCESS(W)", "FAILED")
+ - **code (str)** – calculation status written as a single character, one of ("S", "R", "U", "W" "F")
+ """
+ ret = Result()
+ ret.fatal = True
+ ret.name = None
+ ret.code = None
+ ret.reasons = []
+
+ # if we do not have an output file the calculation failed
+ if "out" not in info.files.out:
+ ret.reasons.append("Calculation status unknown")
+ ret.name = "UNKNOWN"
+ ret.code = "U"
+ return ret
+
+ # try to read if the calculation succeeded
+ with open(info.files.out) as out:
+ lines = out.readlines()
+ if any(["ORCA TERMINATED NORMALLY" in line for line in lines]):
+ ret.fatal = False
+ ret.name = "SUCCESS"
+ ret.code = "S"
+ return ret
+
+ # if it didnt we default to failed
+ ret.name = "FAILED"
+ ret.code = "F"
+
+ # otherwise we check if the job is being managed by slurm
+ if not slurm.workdir_info(os.path.abspath(info.files.root)):
+ return ret
+
+ # get the statuscode from the workdir
+ state = slurm.workdir_info(os.path.abspath(info.files.root)).statuscode
+ state_name = {
+ 'CG': 'COMPLETING',
+ 'CF': 'CONFIGURING',
+ 'PD': 'PENDING',
+ 'R': 'RUNNING'
+ }.get(state, 'UNKNOWN')
+
+ ret.fatal = False
+ ret.name = state_name
+ ret.code = state
+ ret.reasons = []
+
+ return ret
+
+
+def get_molecules(info: Result) -> Result:
+ """Function that returns information about the molecules for this calculation.
+
+ Args:
+ info: Result object containing ORCA calculation information.
+
+ Returns:
+ :Result object containing properties from the ORCA calculation:
+
+ - **input (plams.Molecule)** - the input molecule for this calculation.
+ - **output (plams.Molecule)** - the output molecule for this calculation, for example the optimized structure after a geometry optimization.
+ - **number_of_atoms (int)** - the number of atoms in the molecular system.
+ """
+ ret = Result()
+ ret.input = info.input.system.molecule
+ ret.number_of_atoms = len(ret.input.atoms)
+
+ with open(info.files.out) as out:
+ lines = out.readlines()
+ lines = [line.strip() for line in lines]
+
+ start_reading = False
+ look_for_coords = False
+ coords = []
+ for line in lines:
+ if start_reading:
+ if len(line) == 0:
+ start_reading = False
+ break
+
+ coords.append(line)
+
+ if "THE OPTIMIZATION HAS CONVERGED" in line:
+ look_for_coords = True
+
+ if look_for_coords and "CARTESIAN COORDINATES (ANGSTROEM)" in line:
+ look_for_coords = False
+ start_reading = True
+
+ ret.output = plams.Molecule()
+ for coord in coords[1:]:
+ sym, x, y, z = coord.split()
+ ret.output.add_atom(plams.Atom(symbol=sym, coords=[float(x), float(y), float(z)]))
+
+ if len(ret.output.atoms) == 0:
+ ret.output = ret.input.copy()
+ return ret
+
+
+def get_info(calc_dir: str) -> Result:
+ """Function to read useful info about the calculation in ``calc_dir``. Returned information will depend on the type of file that is provided.
+
+ Args:
+ calc_dir: path pointing to the desired calculation.
+
+ Returns:
+ :Result object containing results about the calculation and AMS:
+
+ - **version (Result)** – information about the AMS version used, see :func:`get_version`.
+ - **files (Result)** - paths to files that are important for this calculation.
+ - **input (Result)** - information about the input of this calculation, see :func:`get_input`.
+ - **level (Result)** - information about the level of theory used for this calculation, see :func:`get_level_of_theory`.
+ - **engine (str)** – the engine that was used to perform the calculation, for example 'adf', 'dftb', ...
+ - **status (Result)** – information about calculation status, see :func:`get_calculation_status`.
+ - **molecule (Result)** – information about the input and output molecules and the molecular system in general, see :func:`get_molecules`.
+ """
+ ret = Result()
+
+ ret.engine = "orca"
+ ret.files = get_calc_files(calc_dir)
+
+ # store the input of the calculation
+ ret.input = get_input(ret)
+
+ ret.level = get_level_of_theory(ret)
+
+ # store information about the version of AMS
+ ret.version = get_version(ret)
+
+ # store the calculation status
+ ret.status = get_calculation_status(ret)
+
+ # read molecules
+ ret.molecule = get_molecules(ret)
+
+ return ret
+
+
+def get_vibrations(lines):
+ """Function to read vibrational data of an ORCA calculation.
+
+ Args:
+ lines: Lines in the output file of the ORCA calculation.
+
+ Returns:
+ :Result object containing vibrational properties from the ORCA calculation:
+
+ - **number_of_modes (int)** – number of vibrational modes for this molecule, 3N-5 for non-linear molecules and 3N-6 for linear molecules, where N is the number of atoms.
+ - **number_of_imaginary_modes (int)** – number of imaginary vibrational modes for this molecule.
+ - **frequencies (list[float])** – vibrational frequencies associated with the vibrational modes, sorted from low to high (|cm-1|).
+ - **intensities (list[float])** – vibrational intensities associated with the vibrational modes (|km/mol|). In ORCA, intensities of imaginary modes are set to 0.
+ - **modes (list[float])** – list of vibrational modes sorted from low frequency to high frequency.
+ - **character (str)** – the PES character of the molecular system. Either "minimum", "transitionstate" or "saddlepoint(n_imag)", for 0, 1, n_imag number of imaginary frequencies.
+ """
+ ret = Result()
+ start_reading = False
+ start_reading_idx = 0
+ freq_lines = []
+ for i, line in enumerate(lines):
+ if start_reading:
+ if len(line) == 0 and (i - start_reading_idx) > 4:
+ break
+ if ":" in line:
+ freq_lines.append(line)
+
+ if "VIBRATIONAL FREQUENCIES" in line:
+ start_reading = True
+ start_reading_idx = i
+
+ ret.number_of_modes = len(freq_lines)
+ frequencies = [float(line.split()[1]) for line in freq_lines]
+ nrotranslational = sum([freq == 0 for freq in frequencies])
+ ret.frequencies = frequencies[nrotranslational:]
+ ret.number_of_imaginary_modes = len([freq for freq in ret.frequencies if freq < 0])
+ ret.character = "minimum" if ret.number_of_imaginary_modes == 0 else "transitionstate" if ret.number_of_imaginary_modes == 1 else f"saddlepoint({ret.number_of_imaginary_modes})"
+
+ start_reading = False
+ mode_lines = []
+ for i, line in enumerate(lines):
+ if "NORMAL MODES" in line:
+ start_reading = True
+ continue
+
+ if "IR SPECTRUM" in line:
+ start_reading = False
+ break
+
+ if start_reading:
+ mode_lines.append(line)
+
+ mode_lines = mode_lines[6:-3]
+ mode_lines = [[float(x) for x in line.split()[1:]] for i, line in enumerate(mode_lines) if i % (ret.number_of_modes + 1) != 0]
+
+ nblocks = len(mode_lines) // ret.number_of_modes
+ blocks = []
+ for block in range(nblocks):
+ blocks.append(np.array(mode_lines[block * ret.number_of_modes : (block + 1) * ret.number_of_modes]))
+ ret.modes = np.hstack(blocks).T.tolist()[nrotranslational:]
+
+ start_reading = False
+ int_lines = []
+ for i, line in enumerate(lines):
+ if "IR SPECTRUM" in line:
+ start_reading = True
+ continue
+
+ if "The epsilon (eps) is given for a Dirac delta lineshape." in line:
+ start_reading = False
+ break
+
+ if start_reading:
+ int_lines.append(line)
+
+ ints = [float(line.split()[3]) for line in int_lines[5:-1]]
+ ret.intensities = [0] * ret.number_of_imaginary_modes + ints
+ return ret
+
+
+def get_properties(info: Result) -> Result:
+ """Function to get properties from an ORCA calculation.
+
+ Args:
+ info: Result object containing ORCA properties.
+
+ Returns:
+ :Result object containing properties from the ORCA calculation:
+
+ - **energy.bond (float)** – total bonding energy (|kcal/mol|).
+ - **energy.enthalpy (float)** – enthalpy (|kcal/mol|). Only obtained if vibrational modes were calculated.
+ - **energy.entropy (float)** – entropy (|kcal/mol|). Only obtained if vibrational modes were calculated.
+ - **energy.gibbs (float)** – Gibb's free energy (|kcal/mol|). Only obtained if vibrational modes were calculated.
+ - **energy.[method] (float)** - total energy (|kcal/mol|) at a certain level (HF, MP2, CCSD, ...). This is the sum of energy.HF and energy.[method]_corr.
+ - **energy.[method]_corr (float)** - electron correlation energy (|kcal/mol|) at a certain level (HF, MP2, CCSD, ...).
+ - **vibrations.number_of_modes (int)** – number of vibrational modes for this molecule, 3N-5 for non-linear molecules and 3N-6 for linear molecules, where N is the number of atoms.
+ - **vibrations.number_of_imaginary_modes (int)** – number of imaginary vibrational modes for this molecule.
+ - **vibrations.frequencies (list[float])** – vibrational frequencies associated with the vibrational modes, sorted from low to high (|cm-1|).
+ - **vibrations.intensities (list[float])** – vibrational intensities associated with the vibrational modes (|km/mol|). In ORCA, intensities of imaginary modes are set to 0.
+ - **vibrations.modes (list[float])** – list of vibrational modes sorted from low frequency to high frequency.
+ - **vibrations.character (str)** – the PES character of the molecular system. Either "minimum", "transitionstate" or "saddlepoint(n_imag)", for 0, 1, n_imag number of imaginary frequencies.
+ - **t1** - T1 diagnostic for the highest level of correlation chosen. Used to check the validity of the reference wavefunction.
+ - **s2** - expectation value of the :math:`S^2` operator.
+ - **s2_expected** - ideal expectation value of the :math:`S^2` operator.
+ - **spin_contamination** - the amount of spin-contamination observed in this calculation. It is equal to (s2 - s2_expected) / (s2_expected). Ideally this value should be below 0.1.
+ """
+ ret = Result()
+
+ with open(info.files.out) as out:
+ lines = [line.strip() for line in out.readlines()]
+
+ if info.orca.frequencies:
+ ret.vibrations = get_vibrations(lines)
+
+ # read some important info about the calculation
+ for line in lines:
+ if "FINAL SINGLE POINT ENERGY" in line:
+ ret.energy.bond = float(line.split()[4]) * constants.HA2KCALMOL
+ continue
+
+ if "E(0)" in line:
+ ret.energy.HF = float(line.split()[-1]) * constants.HA2KCALMOL
+ continue
+
+ if "Final correlation energy" in line:
+ ret.energy.corr = float(line.split()[-1]) * constants.HA2KCALMOL
+ continue
+
+ if "E(MP2)" in line:
+ ret.energy.MP2 = float(line.split()[-1]) * constants.HA2KCALMOL + ret.energy.HF
+ ret.energy.MP2_corr = float(line.split()[-1]) * constants.HA2KCALMOL
+ continue
+
+ if "E(CCSD) " in line:
+ ret.energy.CCSD = float(line.split()[-1]) * constants.HA2KCALMOL
+ ret.energy.CCSD_corr = float(line.split()[-1]) * constants.HA2KCALMOL - ret.energy.HF
+ continue
+
+ if "E(CCSD(T))" in line:
+ ret.energy.CCSD_T = float(line.split()[-1]) * constants.HA2KCALMOL
+ ret.energy.CCSD_T_corr = float(line.split()[-1]) * constants.HA2KCALMOL - ret.energy.HF
+ continue
+
+ if "Final Gibbs free energy" in line:
+ ret.energy.gibbs = float(line.split()[-2]) * constants.HA2KCALMOL
+ continue
+
+ if "Total enthalpy" in line:
+ ret.energy.enthalpy = float(line.split()[-2]) * constants.HA2KCALMOL
+ continue
+
+ if "Final entropy term" in line:
+ ret.energy.entropy = float(line.split()[-2])
+ continue
+
+ if "T1 diagnostic" in line:
+ ret.t1 = float(line.split()[3])
+ continue
+
+ if "Expectation value of " in line:
+ ret.s2 = float(line.split()[-1])
+ continue
+
+ if "Ideal value" in line:
+ ret.s2_expected = float(line.split()[-1])
+ continue
+
+ if ret.s2 and ret.s2_expected:
+ ret.spin_contamination = (ret.s2 - ret.s2_expected) / ret.s2_expected
+
+ return ret
+
diff --git a/src/tcutility/tc_typing/__init__.py b/src/tcutility/tc_typing/__init__.py
index 5f282702..e69de29b 100755
--- a/src/tcutility/tc_typing/__init__.py
+++ b/src/tcutility/tc_typing/__init__.py
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/tcutility/tc_typing/arrays.py b/src/tcutility/tc_typing/arrays.py
index f7cf16cb..4559b9f0 100755
--- a/src/tcutility/tc_typing/arrays.py
+++ b/src/tcutility/tc_typing/arrays.py
@@ -1,8 +1,8 @@
-from typing import TypeVar
-import numpy.typing as npt
-import numpy as np
-
-DType = TypeVar("DType", bound=np.generic)
-Array1D = npt.NDArray[DType]
-Array2D = npt.NDArray[DType]
-Array3D = npt.NDArray[DType]
+from typing import TypeVar
+import numpy.typing as npt
+import numpy as np
+
+DType = TypeVar("DType", bound=np.generic)
+Array1D = npt.NDArray[DType]
+Array2D = npt.NDArray[DType]
+Array3D = npt.NDArray[DType]