occ
Loading...
Searching...
No Matches
occ::mults::ShortRangeInteraction Class Reference

Class for computing short-range pairwise interactions. More...

#include <short_range.h>

Classes

struct  AnisotropicResult
 Result from anisotropic repulsion computation. More...
 
struct  EnergyAndDerivatives
 Result structure containing energy and derivatives. More...
 
struct  ForceAndHessian
 Result structure containing forces and Hessian for both sites. More...
 

Static Public Member Functions

static AnisotropicResult anisotropic_repulsion (const Vec3 &pos_a, const Vec3 &pos_b, const Vec3 &axis_a, const Vec3 &axis_b, const AnisotropicRepulsionParams &params)
 Compute anisotropic Born-Mayer repulsion energy, forces, and axis torques.
 
static double lennard_jones_energy (double r, const LennardJonesParams &params)
 Compute Lennard-Jones energy: V(r) = 4ε[(σ/r)^12 - (σ/r)^6].
 
static double lennard_jones_derivative (double r, const LennardJonesParams &params)
 Compute first derivative: dV/dr = 24ε/r[(σ/r)^6 - 2(σ/r)^12].
 
static double lennard_jones_second_derivative (double r, const LennardJonesParams &params)
 Compute second derivative: d²V/dr² = 24ε/r²[26(σ/r)^12 - 7(σ/r)^6].
 
static EnergyAndDerivatives lennard_jones_all (double r, const LennardJonesParams &params)
 Compute Lennard-Jones energy and both derivatives (more efficient).
 
static double buckingham_energy (double r, const BuckinghamParams &params)
 Compute Buckingham energy: V(r) = A*exp(-B*r) - C/r^6.
 
static double buckingham_derivative (double r, const BuckinghamParams &params)
 Compute first derivative: dV/dr = -A*B*exp(-B*r) + 6C/r^7.
 
static double buckingham_second_derivative (double r, const BuckinghamParams &params)
 Compute second derivative: d²V/dr² = A*B²*exp(-B*r) - 42C/r^8.
 
static EnergyAndDerivatives buckingham_all (double r, const BuckinghamParams &params)
 Compute Buckingham energy and both derivatives (more efficient).
 
static Vec3 derivative_to_force (double dE_dr, const Vec3 &r_vec)
 Convert radial derivative to force vector.
 
static ForceAndHessian compute_force_hessian (const Vec3 &r_A, const Vec3 &r_B, double dE_dr, double d2E_dr2)
 Compute force vectors and Hessian matrices for both sites.
 

Detailed Description

Class for computing short-range pairwise interactions.

Provides implementations of Lennard-Jones and Buckingham potentials with analytical first and second derivatives. These are commonly used in molecular mechanics and molecular dynamics simulations.

All functions are static and thread-safe. The class provides:

  • Individual energy/derivative calculations
  • Combined calculations (more efficient when all are needed)
  • Transformation from scalar derivatives to vector forces and Hessians

Usage example:

Vec3 r_A(0, 0, 0);
Vec3 r_B(3.5, 0, 0); // 3.5 Angstrom separation
// Lennard-Jones for Ar-Ar
LennardJonesParams lj_params{.epsilon = 0.238, .sigma = 3.40};
// Compute energy and derivatives
(r_B - r_A).norm(), lj_params);
// Convert to forces and Hessian
r_A, r_B, result.first_derivative, result.second_derivative);
static ForceAndHessian compute_force_hessian(const Vec3 &r_A, const Vec3 &r_B, double dE_dr, double d2E_dr2)
Compute force vectors and Hessian matrices for both sites.
static EnergyAndDerivatives lennard_jones_all(double r, const LennardJonesParams &params)
Compute Lennard-Jones energy and both derivatives (more efficient).
Eigen::Vector3d Vec3
Definition linear_algebra.h:64
Parameters for the Lennard-Jones 12-6 potential.
Definition short_range.h:24
double epsilon
Well depth (energy units)
Definition short_range.h:25

Member Function Documentation

◆ anisotropic_repulsion()

static AnisotropicResult occ::mults::ShortRangeInteraction::anisotropic_repulsion ( const Vec3 pos_a,
const Vec3 pos_b,
const Vec3 axis_a,
const Vec3 axis_b,
const AnisotropicRepulsionParams params 
)
static

Compute anisotropic Born-Mayer repulsion energy, forces, and axis torques.

Parameters
pos_aPosition of site A
pos_bPosition of site B
axis_aUnit z-axis of site A in lab frame (zero = isotropic for this site)
axis_bUnit z-axis of site B in lab frame (zero = isotropic for this site)
paramsAnisotropic repulsion parameters
Returns
AnisotropicResult with energy, forces, and axis torques

◆ buckingham_all()

static EnergyAndDerivatives occ::mults::ShortRangeInteraction::buckingham_all ( double  r,
const BuckinghamParams params 
)
static

Compute Buckingham energy and both derivatives (more efficient).

This is more efficient than calling the individual functions when all quantities are needed, as it reuses intermediate calculations.

Parameters
rDistance between sites (must be > 0)
paramsBuckingham parameters (A, B, C)
Returns
Structure containing energy, first derivative, and second derivative

◆ buckingham_derivative()

static double occ::mults::ShortRangeInteraction::buckingham_derivative ( double  r,
const BuckinghamParams params 
)
static

Compute first derivative: dV/dr = -A*B*exp(-B*r) + 6C/r^7.

Parameters
rDistance between sites (must be > 0)
paramsBuckingham parameters (A, B, C)
Returns
First derivative dV/dr

◆ buckingham_energy()

static double occ::mults::ShortRangeInteraction::buckingham_energy ( double  r,
const BuckinghamParams params 
)
static

Compute Buckingham energy: V(r) = A*exp(-B*r) - C/r^6.

Parameters
rDistance between sites (must be > 0)
paramsBuckingham parameters (A, B, C)
Returns
Energy in same units as A

◆ buckingham_second_derivative()

static double occ::mults::ShortRangeInteraction::buckingham_second_derivative ( double  r,
const BuckinghamParams params 
)
static

Compute second derivative: d²V/dr² = A*B²*exp(-B*r) - 42C/r^8.

Parameters
rDistance between sites (must be > 0)
paramsBuckingham parameters (A, B, C)
Returns
Second derivative d²V/dr²

◆ compute_force_hessian()

static ForceAndHessian occ::mults::ShortRangeInteraction::compute_force_hessian ( const Vec3 r_A,
const Vec3 r_B,
double  dE_dr,
double  d2E_dr2 
)
static

Compute force vectors and Hessian matrices for both sites.

For a central potential V(r) between sites A and B, computes:

  • Forces: F_A = -(dV/dr) * (r_vec/r), F_B = -F_A
  • Hessians: H_ij = d²V/dx_i dx_j

The Hessian for a central potential has two terms:

  1. Curvature term: (d²V/dr²) * (r_i/r) * (r_j/r)
  2. Angular term: (dV/dr/r) * [δ_ij - (r_i/r)(r_j/r)]

The resulting Hessian satisfies:

  • H_AB = -H_AA (from symmetry)
  • H_BB = H_AA (from symmetry)
  • H_AA + H_AB + H_BA + H_BB = 0 (translational invariance)
Parameters
r_APosition of site A
r_BPosition of site B
dE_drFirst derivative dV/dr
d2E_dr2Second derivative d²V/dr²
Returns
Structure containing forces and Hessians

◆ derivative_to_force()

static Vec3 occ::mults::ShortRangeInteraction::derivative_to_force ( double  dE_dr,
const Vec3 r_vec 
)
static

Convert radial derivative to force vector.

For a central potential V(r), the force on site A is: F_A = -(dV/dr) * (r_vec/r) where r_vec = r_B - r_A

Parameters
dE_drFirst derivative dV/dr (scalar)
r_vecDisplacement vector r_B - r_A
Returns
Force vector on site A (force on B is -F_A)

◆ lennard_jones_all()

static EnergyAndDerivatives occ::mults::ShortRangeInteraction::lennard_jones_all ( double  r,
const LennardJonesParams params 
)
static

Compute Lennard-Jones energy and both derivatives (more efficient).

This is more efficient than calling the individual functions when all quantities are needed, as it reuses intermediate calculations.

Parameters
rDistance between sites (must be > 0)
paramsLennard-Jones parameters (ε, σ)
Returns
Structure containing energy, first derivative, and second derivative

◆ lennard_jones_derivative()

static double occ::mults::ShortRangeInteraction::lennard_jones_derivative ( double  r,
const LennardJonesParams params 
)
static

Compute first derivative: dV/dr = 24ε/r[(σ/r)^6 - 2(σ/r)^12].

Parameters
rDistance between sites (must be > 0)
paramsLennard-Jones parameters (ε, σ)
Returns
First derivative dV/dr

◆ lennard_jones_energy()

static double occ::mults::ShortRangeInteraction::lennard_jones_energy ( double  r,
const LennardJonesParams params 
)
static

Compute Lennard-Jones energy: V(r) = 4ε[(σ/r)^12 - (σ/r)^6].

Parameters
rDistance between sites (must be > 0)
paramsLennard-Jones parameters (ε, σ)
Returns
Energy in same units as epsilon

◆ lennard_jones_second_derivative()

static double occ::mults::ShortRangeInteraction::lennard_jones_second_derivative ( double  r,
const LennardJonesParams params 
)
static

Compute second derivative: d²V/dr² = 24ε/r²[26(σ/r)^12 - 7(σ/r)^6].

Parameters
rDistance between sites (must be > 0)
paramsLennard-Jones parameters (ε, σ)
Returns
Second derivative d²V/dr²

The documentation for this class was generated from the following file: