Choosing a method

Start from what you want to compute. Each row names a method that ferric implements for that task, where to run it (CLI method.kind or Python only), how far it is validated, and a shipped example to copy. Grades, and the anchors behind them, are on Capabilities and validation. Cost is given as formal scaling with system size N, not as timings.

This page only recommends what the code and its tests support. Where ferric has no validated option for a task, the row says so.

By task

TaskRecommendedWhereGradeScalingExample
Geometry optimizationKS-DFT (e.g. PBE, B3LYP) or RHF, task = "optimize"CLI, Python (run_optimize is RHF)ProvenN⁴h2-lda-opt.toml, h2_opt.toml
Harmonic frequenciesKS-DFT or RHF/UHF/ROHF, task = "frequencies" (finite differences of the analytic gradient, 6N gradients)CLI, Python run_frequenciesenergies Proven; check the printed Hessian asymmetry6N × N⁴water-frequencies.toml
Transition staterun_saddle (P-RFO), then run_irc to confirm which minima it connectsPython only, closed shellsee Capabilities and validation~2(6N+1) gradients + steps—
Conformer or reaction energies, routineKS-DFT + D3(BJ)CLI ksdft + [dft] dispersion = "d3bj", Python run_dft(dispersion=...)DFT Proven; D3(BJ) matches simple-dftd3 to <1e-12 HaN⁴ (DFT)water-pbe-d3bj.toml
Correlated energies, small to mediumRI-MP2CLI rimp2, Python run_rimp2ProvenN⁵water-rimp2.toml
Correlated energies, benchmark quality, smallCCSD(T) (closed shell)Python run_ccsd_t only; CCSD also CLI ccsdCCSD Proven; (T) matches PySCF ~1e-6 Ha on H2O/cc-pVDZN⁶ / N⁷water-ccsd.toml (H2)
Non-covalent interaction energiesAttenuated MP2 in the basis its parameters were fitted for: SCS-MP2(2terfc) or MP2-V in aug-cc-pVTZ, erfc att-MP2 in aug-cc-pVDZ (the basis of the 2012 paper); or KS-DFT + D3(BJ)CLI scs-mp2-2terfc, mp2-v, att-rimp2, ksdftatt-MP2 and 2terfc Proven (as implementations); MP2-V SmokeN⁵water-scs-mp2-2terfc.toml, water-mp2v.toml, water-attmp2.toml
Long-range correlation from responseRS-MP2 + LR-RPA, or PDEP-RPACLI rs-mp2-rpa, pdep-rpaRS-MP2+RPA Smoke; PDEP-RPA ProvenN⁵ (MP2 part); N⁴ (RI-RPA)water-rs-mp2-rpa.toml, water-pdep-rpa.toml
Ionization potentials / electron affinitiesG0W0@PBE (or @HF); U-GW for open shellsCLI gw, Python run_gw, run_u_gwSmoke, about ±0.3 eV—water-g0w0-pbe.toml, oh-ugw.toml
Excitation energiesBSE-TDA on G0W0@HF; or TDA/TDDFT (CIS/TDHF on an HF reference)CLI bse-tda, tda, tddft; Python run_bse_tda, run_tddftBSE-TDA Smoke; TDA/TDDFT Proven (narrow, closed shell)—water-bse-tda.toml, water-tda.toml
Static polarizabilityPDEP-RPA properties, or RPAx@KS (static α only)CLI pdep-rpa with compute_polarizability, tdhf-static-polarizabilityPDEP-RPA Proven (energy); RPAx SmokeN⁴ (RI)h2o-pdep-rpa-props.toml, water-tdhf-static-alpha.toml
\( C_6 \) dispersion coefficientsPDEP-RPA dynamic α (c6_source = "pdep") or TS/MBD, in an augmented basis. Not RPAx: its \( C_6 \) is ~63% lowCLI pdep-rpa + [rpa] compute_c6which source is better is not establishedN⁴ (RI)water-c6-pdep.toml, argon-c6-rpa-pbe.toml
Implicit solvationIEF-PCM (CLI [pcm], Python solvent=) or COSMO (CLI [cosmo])see SCF and DFTboth cross-checked against PySCF on waterSCF cost—
Embedding in a protein or solventQM/MMPython run_qmmm; CLI [qmmm] (point charges)see QM/MMSCF costwater-qmmm.toml
Electron-transfer couplingconstrained DFT + Wu–Van Voorhis \( H_{ab} \)Python run_cdft, cdft_coupling (no CLI)no external referenceSCF cost × outer λ loop—
Atomic charges, ESPLöwdin, Hirshfeld, CHELPG, RESP; ESP at nuclei or on the surfacePythonsee Capabilities and validationSCF cost—

Notes on the table:

  • "Proven" for an attenuated MP2 method means the implementation reproduces its reference, not that the method is accurate on your system. Its parameters are fitted to interaction-energy benchmarks in one basis (the aug-cc-pVTZ sets without counterpoise, with frozen core); in another basis, with counterpoise correction, or with frozen_core = 0 (the default), you are extrapolating. See The MP2 family.
  • KS-DFT uses density fitting by default (def2-universal-jkfit), and the fitting error grows with system size. Turn it off or match it before comparing with an exact-Coulomb code; see SCF and DFT.
  • CC results are sensitive to the aux basis: at CC accuracy the RI error depends on the auxiliary set. See Coupled cluster.

Pairing an orbital basis with its auxiliary basis

Every correlated method needs an RI auxiliary basis ([mp2] auxbasis or [rpa] auxbasis; the auxbasis argument in Python). Use the set built for your orbital basis. The bundled pairs are:

Orbital basisRI (correlation) auxJK aux (for df_j_aux / df_k_aux)
cc-pVDZcc-pvdz-ri (alias cc-pvdz-rifit)def2-universal-jkfit
cc-pVTZcc-pvtz-rifitdef2-universal-jkfit
aug-cc-pVDZ / TZ / QZaug-cc-pvdz-rifit, aug-cc-pvtz-rifit, aug-cc-pvqz-rifitdef2-universal-jkfit
def2-SVP, def2-TZVP, def2-QZVPdef2-svp-rifit, def2-tzvp-rifit, def2-qzvp-rifitdef2-universal-jkfit

def2-tzvpp-rifit and def2-qzvpp-rifit are also bundled as auxiliary sets. The ECP orbital sets aug-cc-pvdz-pp and aug-cc-pvtz-pp have no bundled -pp-rifit partner. STO-3G and 6-31G have no matching RI set; the examples pair them with cc-pvdz-ri or a larger RI set. Only the names above (plus cc-pvdz-f12 and cc-pvdz-f12-optri) load by name; any other set goes in through [basis] path as a Gaussian-94 file (orbital basis only). def2-universal-jkfit is the default JK set for KS-DFT.

When nothing here fits

  • Analytic Hessians cover RHF and UHF (exact J/K, no ECP, basis up to f functions); ROHF, KS-DFT and correlated methods' frequencies are by finite differences of the analytic gradient.
  • Open-shell coupled cluster and open-shell TS search are not available (the one open-shell CC-type method, LinLCCD(hh), is library-only). Open-shell KS-DFT is available from the CLI: ksdft with multiplicity > 1 runs UKS, and uhf/rohf with [dft] functional run UKS/ROKS. See Capabilities and validation: open shells in the CLI.
  • TDDFT with the XC kernel exists only as a library-only spike; the CLI and Python TDDFT omit it. See RPA, GW and excited states.