matscipy.calculators.manybody package

Modules

matscipy.calculators.manybody.explicit_forms

matscipy.calculators.manybody.explicit_forms

Harmonic potentials for bonds and triplets.

class matscipy.calculators.manybody.explicit_forms.harmonic.ZeroPair

Bases: G

Defines a non-interacting pair potential.

__call__(r, xi, *args)

Return triplet energy only.

gradient(r, xi, *args)

Return triplet interaction only.

hessian(r, xi, *args)

Zero hessian.

__abstractmethods__ = frozenset({})
__annotations__ = {}
__dict__ = mappingproxy({'__module__': 'matscipy.calculators.manybody.explicit_forms.harmonic', '__doc__': 'Defines a non-interacting pair potential.', '__call__': <function ZeroPair.__call__>, 'gradient': <function ZeroPair.gradient>, 'hessian': <function ZeroPair.hessian>, '__abstractmethods__': frozenset(), '_abc_impl': <_abc._abc_data object>, '__annotations__': {}})
__module__ = 'matscipy.calculators.manybody.explicit_forms.harmonic'
__slots__ = ()
__weakref__

list of weak references to the object (if defined)

class matscipy.calculators.manybody.explicit_forms.harmonic.ZeroTriplet

Bases: G

Defines a non-interacting triplet potential.

__call__(*args)

Zero triplet energy.

gradient(*args)

Zero triplet force.

hessian(*args)

Zero triplet hessian.

__abstractmethods__ = frozenset({})
__annotations__ = {}
__dict__ = mappingproxy({'__module__': 'matscipy.calculators.manybody.explicit_forms.harmonic', '__doc__': 'Defines a non-interacting triplet potential.', '__call__': <function ZeroTriplet.__call__>, 'gradient': <function ZeroTriplet.gradient>, 'hessian': <function ZeroTriplet.hessian>, '__abstractmethods__': frozenset(), '_abc_impl': <_abc._abc_data object>, '__annotations__': {}})
__module__ = 'matscipy.calculators.manybody.explicit_forms.harmonic'
__slots__ = ()
__weakref__

list of weak references to the object (if defined)

class matscipy.calculators.manybody.explicit_forms.harmonic.HarmonicBond(r0, k)

Bases: F

Defines a harmonic bond.

__init__(r0, k)

Initialize with equilibrium distance and stiffness.

__call__(r, xi, atype, ptype)

Compute spring potential energy.

\[E(r) = \frac{1}{2} k(r - r_0)^2 + \xi\]
gradient(r, xi, atype, ptype)

Compute spring force.

hessian(r, xi, atype, ptype)

Compute spring stiffness.

__abstractmethods__ = frozenset({})
__annotations__ = {}
__dict__ = mappingproxy({'__module__': 'matscipy.calculators.manybody.explicit_forms.harmonic', '__doc__': 'Defines a harmonic bond.', '__init__': <function HarmonicBond.__init__>, '__call__': <function HarmonicBond.__call__>, 'gradient': <function HarmonicBond.gradient>, 'hessian': <function HarmonicBond.hessian>, '__abstractmethods__': frozenset(), '_abc_impl': <_abc._abc_data object>, '__annotations__': {}})
__module__ = 'matscipy.calculators.manybody.explicit_forms.harmonic'
__slots__ = ()
__weakref__

list of weak references to the object (if defined)

class matscipy.calculators.manybody.explicit_forms.harmonic.HarmonicAngle(a0, k, atoms: Atoms)

Bases: G

Defines a harmonic angle potential.

__init__(a0, k, atoms: Atoms)

Initialize with equilibrium angle and stiffness.

Note: atoms are needed because mics are calculated for triplet distances. This will be removed once G is redefined to take triplet distances instead of vectors.

__call__(r_ij_c, r_ik_c, *args)

Angle harmonic energy.

Define the following functional form for \(G\):

\[\begin{split}E(a) & = \frac{1}{2} k(a - a_0)^2 \\ \vec{u} & = \vec{r_{ij}} \\ \vec{v} & = \vec{r_{ik}} \\ \vec{w}(\vec{u}, \vec{v}) & = \vec{r_{jk}} = \vec{v} - \vec{u} \\ f(u, v, w) & = -\frac{u^2 + w^2 - v^2}{2uw} \\ F(\vec{u}, \vec{v}) & = \frac{\vec{u}\cdot\vec{w}(\vec{u}, \vec{v})}{uw} \\ & = f(u, v, |\vec{w}(\vec{u}, \vec{v})|) \\ h(x) & = E(\arccos(x)) \\ G(\vec{u}, \vec{v}) & = h(F(\vec{u}, \vec{v})))\end{split}\]
gradient(r_ij_c, r_ik_c, *args)

Compute derivatives of \(G\) w/r to \(r_{ij}\) and \(r_{ik}\).

We have the following partial derivatives:

\[\begin{split}\frac{\partial G}{\partial u_i}(\vec{u}, \vec{v}) & = h'(F(\vec{u}, \vec{v})) \frac{\partial F}{\partial u_i}(\vec{u}, \vec{v}) \\ \frac{\partial G}{\partial v_i}(\vec{u}, \vec{v}) & = h'(F(\vec{u}, \vec{v})) \frac{\partial F}{\partial v_i}(\vec{u}, \vec{v}) \\\end{split}\]

The partial derivatives of \(F\) are expressed as:

\[\begin{split}\frac{\partial F}{\partial u_i} = U_i & = \frac{\partial f}{\partial u}\frac{\partial u}{\partial u_i} + \frac{\partial f}{\partial w}\frac{\partial w}{\partial u_i}\\ \frac{\partial F}{\partial v_i} = V_i & = \frac{\partial f}{\partial v}\frac{\partial v}{\partial v_i} + \frac{\partial f}{\partial w}\frac{\partial w}{\partial v_i}\end{split}\]

We note the normal vectors as:

\[\begin{split}\bar{u}_i & = \frac{u_i}{u}\\ \bar{v}_i & = \frac{v_i}{v}\\ \bar{w}_i & = \frac{w_i}{w}\end{split}\]

So that we can write the following partial derivatives:

\[\begin{split}\frac{\partial u}{\partial u_i} & = \bar{u}_i\\ \frac{\partial v}{\partial v_i} & = \bar{v}_i\\ \frac{\partial w}{\partial u_i} & = -\bar{w}_i\\ \frac{\partial w}{\partial v_i} & = \bar{w}_i\end{split}\]

Which gives the final expressions for \(U_i\) and \(V_i\):

\[\begin{split}U_i &= \frac{\partial f}{\partial u} \bar{u}_i + \frac{\partial f}{\partial w} (-\bar{w}_i)\\ V_i &= \frac{\partial f}{\partial v} \bar{v}_i + \frac{\partial f}{\partial w} \bar{w}_i\end{split}\]

The remaining scalar partial derivatives are simple to derive and left to the reader :P .

hessian(r_ij_c, r_ik_c, *args)

Compute derivatives of \(G\) w/r to \(r_{ij}\) and \(r_{ik}\).

We have the following partial derivatives:

\[\begin{split}\frac{\partial^2 G}{\partial u_i\partial u_j}(\vec{u}, \vec{v}) & = h''(F) U_i U_j + h'(F)\frac{\partial U_i}{\partial u_j}\\ \frac{\partial^2 G}{\partial v_i\partial v_j}(\vec{u}, \vec{v}) & = h''(F) V_i V_j + h'(F)\frac{\partial V_i}{\partial v_j}\\ \frac{\partial^2 G}{\partial u_i\partial v_j}(\vec{u}, \vec{v}) & = h''(F) U_i V_j + h'(F)\frac{\partial U_i}{\partial v_j}\end{split}\]

The derivatives of \(U_i\) and \(V_i\) need careful treatment:

\[\begin{split}\frac{\partial U_i}{\partial u_j} = \frac{\partial}{\partial u_j}\left(\frac{\partial f}{\partial u}(u, v, w(\vec{u}, \vec{v}))\right) \frac{\partial u}{\partial u_i} + \frac{\partial f}{\partial u}\frac{\partial^2 u}{\partial u_i\partial u_j} + \frac{\partial}{\partial u_j}\left(\frac{\partial f}{\partial w}(u, v, w(\vec{u}, \vec{v}))\right) \frac{\partial w}{\partial u_i} + \frac{\partial f}{\partial w} \frac{\partial^2 w}{\partial u_i\partial u_j}\\ \frac{\partial V_i}{\partial v_j} = \frac{\partial}{\partial v_j}\left(\frac{\partial f}{\partial v}(u, v, w(\vec{u}, \vec{v}))\right) \frac{\partial v}{\partial v_i} + \frac{\partial f}{\partial v}\frac{\partial^2 v}{\partial v_i\partial v_j} + \frac{\partial}{\partial v_j}\left(\frac{\partial f}{\partial w}(u, v, w(\vec{u}, \vec{v}))\right) \frac{\partial w}{\partial v_i} + \frac{\partial f}{\partial w} \frac{\partial^2 w}{\partial v_i\partial v_j}\\ \frac{\partial U_i}{\partial v_j} = \frac{\partial}{\partial v_j}\left(\frac{\partial f}{\partial u}(u, v, w(\vec{u}, \vec{v}))\right) \frac{\partial u}{\partial u_i} + \frac{\partial f}{\partial u}\frac{\partial^2 u}{\partial u_i\partial v_j} + \frac{\partial}{\partial v_j}\left(\frac{\partial f}{\partial w}(u, v, w(\vec{u}, \vec{v}))\right) \frac{\partial w}{\partial u_i} + \frac{\partial f}{\partial w} \frac{\partial^2 w}{\partial u_i\partial v_j}\end{split}\]

For the simple partial derivatives in the above section, we have:

\[\begin{split}\frac{\partial^2 u}{\partial u_i\partial u_j} & = \bar{\bar{u}}_{ij} = \frac{\delta_{ij} - \bar{u}_i \bar{u}_j}{u}\\ \frac{\partial^2 v}{\partial v_i\partial v_j} & = \bar{\bar{u}}_{ij} = \frac{\delta_{ij} - \bar{v}_i \bar{v}_j}{v}\\ \frac{\partial^2 u}{\partial u_i\partial v_j} & = 0\\ \frac{\partial^2 w}{\partial u_i\partial u_j} & = \bar{\bar{w}}_{ij} = \frac{\delta_{ij} - \bar{w}_i \bar{w}_j}{w}\\ \frac{\partial^2 w}{\partial v_i\partial v_j} & = \bar{\bar{w}}_{ij}\\ \frac{\partial^2 w}{\partial u_i\partial v_j} & = -\bar{\bar{w}}_{ij}\end{split}\]

For the more complex partial derivatives:

\[\begin{split}\frac{\partial}{\partial u_j}\left(\frac{\partial f}{\partial u}(u, v, w(\vec{u}, \vec{v}))\right) & = \frac{\partial^2 f}{\partial u^2} \frac{\partial u}{\partial u_j} + \frac{\partial^2 f}{\partial u\partial w}\frac{\partial w}{\partial u_j}\\ \frac{\partial}{\partial u_j}\left(\frac{\partial f}{\partial w}(u, v, w(\vec{u}, \vec{v}))\right) & = \frac{\partial^2 f}{\partial w\partial u} \frac{\partial u}{\partial u_j} + \frac{\partial^2 f}{\partial w^2}\frac{\partial w}{\partial u_j}\\ \frac{\partial}{\partial v_j}\left(\frac{\partial f}{\partial v}(u, v, w(\vec{u}, \vec{v}))\right) & = \frac{\partial^2 f}{\partial v^2} \frac{\partial v}{\partial v_j} + \frac{\partial^2 f}{\partial v\partial w}\frac{\partial w}{\partial v_j}\\ \frac{\partial}{\partial v_j}\left(\frac{\partial f}{\partial w}(u, v, w(\vec{u}, \vec{v}))\right) & = \frac{\partial^2 f}{\partial w\partial v} \frac{\partial v}{\partial v_j} + \frac{\partial^2 f}{\partial w^2}\frac{\partial w}{\partial v_j}\\ \frac{\partial}{\partial v_j}\left(\frac{\partial f}{\partial u}(u, v, w(\vec{u}, \vec{v}))\right) & = \frac{\partial^2 f}{\partial u\partial v} \frac{\partial v}{\partial v_j} + \frac{\partial^2 f}{\partial u\partial w}\frac{\partial w}{\partial v_j}\\\end{split}\]

The remaining scalar derivatives are left to the reader.

__abstractmethods__ = frozenset({})
__annotations__ = {}
__dict__ = mappingproxy({'__module__': 'matscipy.calculators.manybody.explicit_forms.harmonic', '__doc__': 'Defines a harmonic angle potential.', '__init__': <function HarmonicAngle.__init__>, '__call__': <function HarmonicAngle.__call__>, 'gradient': <function HarmonicAngle.gradient>, 'hessian': <function HarmonicAngle.hessian>, '__abstractmethods__': frozenset(), '_abc_impl': <_abc._abc_data object>, '__annotations__': {}})
__module__ = 'matscipy.calculators.manybody.explicit_forms.harmonic'
__slots__ = ()
__weakref__

list of weak references to the object (if defined)