occ
Loading...
Searching...
No Matches
occ::scrf::detail Namespace Reference

Self-consistent reaction-field (SCRF) primitives shared between the HF/DFT-side occ::solvent::COSMO driver and the xTB-side CPCM-X / SMD implicit-solvation models. More...

Classes

struct  CosmoResponse
 Pre-solved CPCM/COSMO response operator on a cavity, driven by atom- centred point-charge sources. More...
 

Functions

Mat build_cosmo_A (const Mat3N &cavity_points, const Vec &cavity_areas)
 Build the dense COSMO A matrix on a discretised cavity: A(i, j) = 1/|r_i − r_j|, off-diagonal A(i, i) = 1.07·√(4π/S_i) ≈ 3.793051240937804 / √S_i cavity_points is 3 × ncav (Bohr), cavity_areas is ncav (Bohr²).
 
Mat build_atom_cavity_coulomb (const Mat3N &cavity_points, const Mat3N &atom_positions)
 Build the atom↔cavity Coulomb operator B(i, a) = 1/|r_i − R_a|.
 
CosmoResponse build_cosmo_response (const Mat3N &atom_positions_bohr, const Mat3N &cavity_points, const Vec &cavity_areas, double epsilon, double x)
 Build the pre-solved response.
 
Mat3N cosmo_gradient_frozen (const Mat3N &atom_positions_bohr, const Mat3N &cavity_points, const Vec &cavity_areas, const IVec &cavity_atom_index, const Vec &atom_charges, const Vec &sigma, double f_epsilon, const Vec &atom_radii_bohr=Vec(), double smoothing_width_bohr=0.0)
 Frozen-cavity analytical gradient of the polarisation energy with respect to atomic positions:
 

Detailed Description

Self-consistent reaction-field (SCRF) primitives shared between the HF/DFT-side occ::solvent::COSMO driver and the xTB-side CPCM-X / SMD implicit-solvation models.

The intent is that this module owns the COSMO / CPCM math (cavity A matrix, atom↔cavity B operator, pre-solved response, frozen-cavity analytical gradient) while higher-level wrappers in occ::solvent and occ::xtb (and the forthcoming occ::scrf::ReactionFieldEngine) glue this kernel to the rest of their pipeline (cavity build, parameter lookup, energy accounting, gradient flow).

Everything here is parameterised on raw Eigen arrays so the library depends only on occ_core — no dependency on occ_solvent or any particular cavity representation.

Function Documentation

◆ build_atom_cavity_coulomb()

Mat occ::scrf::detail::build_atom_cavity_coulomb ( const Mat3N cavity_points,
const Mat3N atom_positions 
)

Build the atom↔cavity Coulomb operator B(i, a) = 1/|r_i − R_a|.

Useful when the source potential at each cavity point is being driven by point-like atomic charges (e.g. xTB Mulliken charges): φ_i = (B · q_atom)_i cavity_points is 3 × ncav, atom_positions is 3 × natom (both Bohr).

◆ build_cosmo_A()

Mat occ::scrf::detail::build_cosmo_A ( const Mat3N cavity_points,
const Vec cavity_areas 
)

Build the dense COSMO A matrix on a discretised cavity: A(i, j) = 1/|r_i − r_j|, off-diagonal A(i, i) = 1.07·√(4π/S_i) ≈ 3.793051240937804 / √S_i cavity_points is 3 × ncav (Bohr), cavity_areas is ncav (Bohr²).

◆ build_cosmo_response()

CosmoResponse occ::scrf::detail::build_cosmo_response ( const Mat3N atom_positions_bohr,
const Mat3N cavity_points,
const Vec cavity_areas,
double  epsilon,
double  x 
)

Build the pre-solved response.

epsilon is the solvent relative permittivity; x selects the f(ε) convention in f(ε) = (ε−1)/(ε+x): x = 0 is the CPCM ideal-conductor convention, x = 0.5 is Klamt COSMO. Empty cavity (cavity_points.cols() == 0) returns zero-sized matrices.

◆ cosmo_gradient_frozen()

Mat3N occ::scrf::detail::cosmo_gradient_frozen ( const Mat3N atom_positions_bohr,
const Mat3N cavity_points,
const Vec cavity_areas,
const IVec cavity_atom_index,
const Vec atom_charges,
const Vec sigma,
double  f_epsilon,
const Vec atom_radii_bohr = Vec(),
double  smoothing_width_bohr = 0.0 
)

Frozen-cavity analytical gradient of the polarisation energy with respect to atomic positions:

∂E_es/∂R_c = − Σ_{i: a_i=c} σ_i · g_i

  • q_c · h_c
  • (1/f(ε)) · Σ_{i: a_i=c} σ_i · t_i
  • diagonal-A term (smooth cavity only — see below)

g_i = Σ_a q_a · (r_i − R_a) / |r_i − R_a|³ (field at cavity i from q) t_i = −Σ_{j≠i} σ_j · (r_i − r_j) / |r_i − r_j|³ (field at cavity i from σ) h_c = Σ_i σ_i · (r_i − R_c) / |r_i − R_c|³ (field at atom c from σ)

With a boolean cavity (smoothing_width = 0), per-element areas are geometry-independent and ∂A_ii/∂R = 0. With a smooth cavity, each per- element area depends smoothly on every other atom's position through the erf-based smoothstep weight, giving

∂A_ii/∂R_c = −½ A_ii · ∂ln(weight_i)/∂R_c ∂ln(weight_i)/∂R_c = Σ_{k ≠ a_i} (s'/s)|d_ik · ∂d_ik/∂R_c

where s(d) = ½(1 + erf((d − t_k)/w)), t_k = r_k. Pass atom_radii_bohr and smoothing_width_bohr > 0 to enable this term; leave smoothing_width_bohr = 0 to skip it (boolean-cavity default).

Returns 3 × N_atoms in Hartree/Bohr.