matscipy.calculators.manybody package
Modules
|
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)