vibesketch.inputs.vibeqc

The vibe-qc writer: a Python script that runs the job with vibeqc.run_job.

The script follows vibe-view’s vibe-qc templates (one Molecule, one run_job call, QVF and Molden output) with one correction: charge and multiplicity go to Molecule, the only place vibe-qc reads them; run_job takes neither.

The translation is fixed by what vibe-qc’s run_job accepts, read from its source and refused where it ends (AGENTS.md, ground rule 5):

  • Methods. HF becomes rhf or uhf, a functional rks or uks with functional=, never method="auto", which runs FCI or selected CI on molecules with up to eight electrons. The 3c composites, double hybrids, MP2 and coupled cluster are methods of their own. Functionals are the names vibe-qc’s XC table resolves: ωB97X-D3 is not one, and is refused rather than swapped for ωB97X-D, a different functional.

  • Tasks. optimize=True; frequencies through hessian=True, a finite-difference Hessian on HF and DFT surfaces only; full TDDFT through tddft=True, tddft_type="casida". vibe-qc has no NMR shieldings.

  • Keywords. D3(BJ) or D4 on a functional; RIJCOSX as density_fit=True, cosx=True and RI-J as density_fit=True, with vibe-qc choosing the fitting basis for the orbital basis unless a library fitting set is named; CPCM with vibe-qc’s solvent presets (it has no SMD); threads, not processes; position constraints as geom_freeze.

The same translation spells the job.spec of a QVF job container (VibeqcWriter.container_spec()), the file vibeqc run executes in place (vibe-qc’s qvf_job.py, QVF spec § 5.9): the typed fields carry method, functional, basis, charge, multiplicity and the runner’s tasks (single_point, optimize, hessian), and options carries the remaining run_job keywords by name, which the runner refuses rather than drops when it does not know one. TDDFT is a run_job keyword there, as vibe-qc’s own write_pending_qvf spells it.

Functions

method_names(name, multiplicity)

The method and functional run_job takes for a job's method, or None.

Classes

class vibesketch.inputs.vibeqc.VibeqcWriter[source]

Bases: InputWriter

name: ClassVar[str] = 'vibeqc'

The registry name, also the value of Job.program.

description: ClassVar[str] = 'vibe-qc run script (Python): HF, DFT, 3c, MP2, CC; SP to TDDFT'

One line for listings.

tasks: ClassVar[frozenset[Literal['geometry', 'sp', 'opt', 'freq', 'opt+freq', 'tddft', 'nmr']]] = frozenset({'freq', 'opt', 'opt+freq', 'sp', 'tddft'})

The tasks this writer can express.

fields: ClassVar[frozenset[str]] = frozenset({'approximation', 'aux_basis', 'basis', 'constraints', 'dispersion', 'method', 'resources', 'solvent', 'states'})

The specification fields, besides task, this writer can express.

file_stem(species, spec)[source]

<species>_<method>_<basis>[_<options>], as the ORCA writer names its files.

Parameters:
Return type:

str

run_arguments(species, spec)[source]

The run_job keywords for a job, in order, as Python values.

Only called once there is nothing to refuse: the run script writes them as literals, the QVF job container as job.spec fields.

Parameters:
Return type:

list[tuple[str, Any]]

container_spec(species, spec)[source]

The job.spec fields of a QVF job container for this job (spec § 5.9).

What vibe-qc’s container runner reads: method, functional (JSON null for a method that takes none, left out where the method brings its own), basis, charge, multiplicity, its tasks, and every other run_job keyword under options by name. The dispersion, solvation and resources are stated as typed fields too, for any reader. Raises WriterRefusal with the same reasons the run script would.

Parameters:
Return type:

dict[str, Any]

vibesketch.inputs.vibeqc.method_names(name, multiplicity)[source]

The method and functional run_job takes for a job’s method, or None.

A QVF job.spec names methods the same way (rks with b3lyp, uhf, ccsd(t)), so the QVF writer asks here.

Parameters:
  • name (str)

  • multiplicity (int)

Return type:

tuple[str, str | None] | None