Descriptors

Two-Body

List of all two-body descriptors supported by Tadah!

D2_LJ

class D2_LJ : public D2_Base

Standard Lennard - Jones descriptor.

\[ V_i = \sum_{j \neq i} 4 \epsilon \Bigg(\Big(\frac{\sigma}{r_{ij}}\Big)^{12} - \Big(\frac{\sigma}{r_{ij}}\Big)^6\Bigg) f_c(r_{ij}) \]

or equivalently:

\[ V_i = \sum_{j \neq i} \frac{C_{12}}{r_{ij}^{12}} - \frac{C_6}{r_{ij}^6} f_c(r_{ij}) \]

Note that machined learned coefficients \(C_6\) and \(C_{12}\) corresponds to \(\sigma\) and \(\epsilon\) through the following relation:

\[ \sigma = \Big(\frac{C_{12}}{C_6}\Big)^{1/6} \]
\[ \epsilon = \frac{1}{4} \frac{C_6^2}{C_{12}} w(Z) \]
where \(w(Z)\) is a species depended weight factor (default is an atomic number).

The machine learned \(\sigma\) and \(\epsilon\) only make sense (say to compare with the literature ones) when BIAS false and NORM false and system in monatomic. It is ok thought to set them to true it’s just that numerical values will be different.

Required Config Key: INIT2B

Public Functions

virtual void calc_aed(const int Zi, const int Zj, const double rij, const double, aed_type &aed, const double scale = 1) override

Calculate AED.

Calculate Atomic Energy Descriptor for the atom local environment.

virtual void calc_dXijdri(const int Zi, const int Zj, const double rij, const double rij_sq, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor for the atom local environment.

For two body this is essentiall df/dr where f is a descriptor function. Do not include negative sign (as you mifht think E=-df/dr). The negative sign is included elsewhere in the code.

Computes x-direction only.

The resulting vector must be scaled by the unit directional vector delij/rij where delij = r_i - r_j, and rij is |r_i - r_j|

virtual void calc_all(const int Zi, const int Zj, const double rij, const double rij_sq, aed_type &aed, fd_type &fd_ij, const double scale = 1) override

Calculate AED + FD.

virtual std::string label() override

Return label of this descriptor.

virtual void init() override

Initialize the descriptor.

This method sets up the required keys names and number of parameters for the descriptor.

Note: The implementation of the descriptor should not rely on these initial values, allowing for greater flexibility in how the Config file is parsed.

The keys and parameters are utilized by other classes inheriting from this implementation, such as meta-descriptors.

D2_BP

class D2_BP : public D2_Base

Behler-Parrinello two-body descriptor.

\[ V_i^{\eta,r_s} = \sum_{j \neq i} \exp{\Big(-\eta(r_{ij}-r_s)^2\Big)}f_c(r_{ij}) \]

CGRID2B parameters control position \( r_s \) of the gaussian basis function.

SGRID2B parameters control width \( \eta \) of the gaussian basis function.

This is essentially a \( G^1_i \) descriptor from the below paper with an exception that it can use any cutoff function defined in Ta-dah!:

Behler, J., Parrinello, M. (2007). Generalized neural-network representation of high-dimensional potential-energy surfaces. Physical Review Letters, 98(14), 146401. https://doi.org/10.1103/PhysRevLett.98.146401

Required Config keys: INIT2B CGRID2B SGRID2B

Public Functions

virtual void calc_aed(const int Zi, const int Zj, const double rij, const double, aed_type &aed, const double scale = 1) override

Calculate AED.

Calculate Atomic Energy Descriptor for the atom local environment.

virtual void calc_dXijdri(const int Zi, const int Zj, const double rij, const double rij_sq, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor for the atom local environment.

For two body this is essentiall df/dr where f is a descriptor function. Do not include negative sign (as you mifht think E=-df/dr). The negative sign is included elsewhere in the code.

Computes x-direction only.

The resulting vector must be scaled by the unit directional vector delij/rij where delij = r_i - r_j, and rij is |r_i - r_j|

virtual void calc_all(const int Zi, const int Zj, const double rij, const double rij_sq, aed_type &aed, fd_type &fd_ij, const double scale = 1) override

Calculate AED + FD.

virtual std::string label() override

Return label of this descriptor.

virtual void init() override

Initialize the descriptor.

This method sets up the required keys names and number of parameters for the descriptor.

Note: The implementation of the descriptor should not rely on these initial values, allowing for greater flexibility in how the Config file is parsed.

The keys and parameters are utilized by other classes inheriting from this implementation, such as meta-descriptors.

D2_Blip

class D2_Blip : public D2_Base

Blip two-body descriptor.

\[ V_i^{\eta,r_s} =\sum_{j \neq i} \mathcal{B}(\eta(r_{ij}-r_s))f_c(r_{ij}) \]

where \( f_c \) is a cutoff function and \( \mathcal{B} \) is a blip basis function centered at \(r_s\) of width \(4/\eta\).

CGRID2B parameters control position \( r_s \) of blip centres.

SGRID2B parameters control width \( \eta \) of blips.

Blip basis function is built out of 3rd degree polynomials in the four intervals [-2,-1], [-1,0], [0,1], [1,2] and is defined as:

\[\begin{split} \begin{equation} \mathcal{B}(r) = \begin{cases} 1-\frac{3}{2}r^2+\frac{3}{4}|r|^3 & \text{if} \qquad 0<|r|<1\\ \frac{1}{4}(2-|r|)^3 & \text{if} \qquad 1<|r|<2\\ 0 & \text{if} \qquad |r|>2 \end{cases} \end{equation} \end{split}\]

More details about the blip basis functions can be found in the following paper:

Hernández, E., Gillan, M., Goringe, C. (1997). Basis functions for linear-scaling first-principles calculations. Physical Review B - Condensed Matter and Materials Physics, 55(20), 13485–13493. https://doi.org/10.1103/PhysRevB.55.13485

Required keys: INIT2B CGRID2B SGRID2B

Public Functions

virtual void calc_aed(const int Zi, const int Zj, const double rij, const double, aed_type &aed, const double scale = 1) override

Calculate AED.

Calculate Atomic Energy Descriptor for the atom local environment.

virtual void calc_dXijdri(const int Zi, const int Zj, const double rij, const double rij_sq, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor for the atom local environment.

For two body this is essentiall df/dr where f is a descriptor function. Do not include negative sign (as you mifht think E=-df/dr). The negative sign is included elsewhere in the code.

Computes x-direction only.

The resulting vector must be scaled by the unit directional vector delij/rij where delij = r_i - r_j, and rij is |r_i - r_j|

virtual void calc_all(const int Zi, const int Zj, const double rij, const double rij_sq, aed_type &aed, fd_type &fd_ij, const double scale = 1) override

Calculate AED + FD.

virtual std::string label() override

Return label of this descriptor.

virtual void init() override

Initialize the descriptor.

This method sets up the required keys names and number of parameters for the descriptor.

Note: The implementation of the descriptor should not rely on these initial values, allowing for greater flexibility in how the Config file is parsed.

The keys and parameters are utilized by other classes inheriting from this implementation, such as meta-descriptors.

D2_EAM

class D2_EAM : public D2_Base

Pair-wise part for the Embedded Atom Method descriptor.

\[ V_i = \frac{1}{2} \sum_{j \neq i} \psi(r_{ij}) \]

This descriptor will load tabulated values for the two-body potential \( \phi \) from the provided SETFL file.

This descriptor is usually used together with the many-body descriptor DM_EAM although this is not required and user can mix it with any other descriptors or use it on its own.

This descriptor will enforce cutoff distance as specified in a SETFL file. Set RCUT2B to the same value to suppress the warning message.

Required Config keys: INIT2B SETFL

Public Functions

virtual void calc_aed(const int Zi, const int Zj, const double rij, const double, aed_type &aed, const double scale = 1) override

Calculate AED.

Calculate Atomic Energy Descriptor for the atom local environment.

virtual void calc_dXijdri(const int Zi, const int Zj, const double rij, const double rij_sq, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor for the atom local environment.

For two body this is essentiall df/dr where f is a descriptor function. Do not include negative sign (as you mifht think E=-df/dr). The negative sign is included elsewhere in the code.

Computes x-direction only.

The resulting vector must be scaled by the unit directional vector delij/rij where delij = r_i - r_j, and rij is |r_i - r_j|

virtual void calc_all(const int Zi, const int Zj, const double rij, const double rij_sq, aed_type &aed, fd_type &fd_ij, const double scale = 1) override

Calculate AED + FD.

virtual std::string label() override

Return label of this descriptor.

virtual void init() override

Initialize the descriptor.

This method sets up the required keys names and number of parameters for the descriptor.

Note: The implementation of the descriptor should not rely on these initial values, allowing for greater flexibility in how the Config file is parsed.

The keys and parameters are utilized by other classes inheriting from this implementation, such as meta-descriptors.

D2_Dummy

class D2_Dummy : public D2_Base

Dummy two-body descriptor.

Use it to satisfy DescriptorsCalc requirements in case when two-body descriptor is not required.

Public Functions

virtual void calc_aed(const int Zi, const int Zj, const double rij, const double, aed_type &aed, const double scale = 1) override

Calculate AED.

Calculate Atomic Energy Descriptor for the atom local environment.

virtual void calc_dXijdri(const int Zi, const int Zj, const double rij, const double rij_sq, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor for the atom local environment.

For two body this is essentiall df/dr where f is a descriptor function. Do not include negative sign (as you mifht think E=-df/dr). The negative sign is included elsewhere in the code.

Computes x-direction only.

The resulting vector must be scaled by the unit directional vector delij/rij where delij = r_i - r_j, and rij is |r_i - r_j|

virtual void calc_all(const int Zi, const int Zj, const double rij, const double rij_sq, aed_type &aed, fd_type &fd_ij, const double scale = 1) override

Calculate AED + FD.

virtual std::string label() override

Return label of this descriptor.

virtual void init() override

Initialize the descriptor.

This method sets up the required keys names and number of parameters for the descriptor.

Note: The implementation of the descriptor should not rely on these initial values, allowing for greater flexibility in how the Config file is parsed.

The keys and parameters are utilized by other classes inheriting from this implementation, such as meta-descriptors.

D2_Base

class D2_Base : public D_Base

Base class for all two-body type descriptors.

All two-body descriptors must inherit this class.

Subclassed by D2_BP, D2_Blip, D2_Dummy, D2_EAM, D2_Join< D1, D2 >, D2_LJ, D2_MIE, D2_ZBL, D2_mJoin

Public Functions

virtual void calc_aed(const int Zi, const int Zj, const double rij, const double rij_sq, aed_type &aed, const double scale = 1) = 0

Calculate AED.

Calculate Atomic Energy Descriptor for the atom local environment.

virtual void calc_dXijdri(const int Zi, const int Zj, const double rij, const double rij_sq, fd_type &fd_ij, const double scale = 1) = 0

Calculate FD.

Calculate Force Descriptor for the atom local environment.

For two body this is essentiall df/dr where f is a descriptor function. Do not include negative sign (as you mifht think E=-df/dr). The negative sign is included elsewhere in the code.

Computes x-direction only.

The resulting vector must be scaled by the unit directional vector delij/rij where delij = r_i - r_j, and rij is |r_i - r_j|

virtual void calc_all(const int Zi, const int Zj, const double rij, const double rij_sq, aed_type &aed, fd_type &fd_ij, const double scale = 1) = 0

Calculate AED + FD.

inline void calc_fd_approx(const int Zi, const int Zj, double r, fd_type &fd, double h = 1e-8)

Central difference approximation to FD

Calculate Force Descriptor for the atom local environment using central difference approximation.

fc: a pointer to initialised cutoff object. r: a separation between two particles fd: appropriate size container to store computation h: central difference parameter

D2_mJoin

class D2_mJoin : public D2_Base, public D_mJoin

Meta two-body descriptor for combining multiple D2 descriptors.

This descriptor provides a convenient interface for concatenating multiple two-body descriptors. The resulting descriptor can then be used by Tadah! like any standard two-body descriptor.

Each descriptor must have a specified type in a configuration file, along with a cutoff function, cutoff distance, and optionally SGRID2B and CGRID2B values if applicable.

When listing descriptors under the TYPE2B key, you must include parameters relevant to this descriptor.

Here is an example of how to configure these descriptors:

TYPE2B    D2_mJoin     # <-- Meta descriptor for concatenating two-body descriptors
TYPE2B    D2_MIE 11 6 Ti Ti   # <-- MIE exponents
RCTYPE2B  Cut_Cos
RCUT2B    3.0

TYPE2B    D2_Blip 6 6 Ti Nb Nb Nb   # <-- grid sizes
RCTYPE2B  Cut_Tanh
RCUT2B    7.5
SGRID2B   -2 6 0.1 10   # Grid for D2_Blip, blips widths, auto generated
CGRID2B   0 0 0 0 0 0   # Grid for D2_Blip, blip centers

Note: Grids can be specified on a single line, and the order of the grids is important.

There is no limit to the number of descriptors that can be concatenated.

  • Ensure the types and grids are correctly specified in the configuration file.

  • The cutoff functions (RCTYPE2B) and distances (RCUT2B) must be defined for each descriptor.

  • Both SGRID2B and CGRID2B should be included if relevant, with their sizes matching the given descriptors.

Public Functions

virtual void calc_aed(const int Zi, const int Zj, const double rij, const double rij_sq, aed_type &aed, const double scale = 1) override

Calculate AED.

Calculate Atomic Energy Descriptor for the atom local environment.

virtual void calc_dXijdri(const int Zi, const int Zj, const double rij, const double rij_sq, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor for the atom local environment.

For two body this is essentiall df/dr where f is a descriptor function. Do not include negative sign (as you mifht think E=-df/dr). The negative sign is included elsewhere in the code.

Computes x-direction only.

The resulting vector must be scaled by the unit directional vector delij/rij where delij = r_i - r_j, and rij is |r_i - r_j|

virtual void calc_all(const int Zi, const int Zj, const double rij, const double rij_sq, aed_type &aed, fd_type &fd_ij, const double scale = 1) override

Calculate AED + FD.

virtual std::string label() override

Return label of this descriptor.

virtual void init() override

Initialize the descriptor.

This method sets up the required keys names and number of parameters for the descriptor.

Note: The implementation of the descriptor should not rely on these initial values, allowing for greater flexibility in how the Config file is parsed.

The keys and parameters are utilized by other classes inheriting from this implementation, such as meta-descriptors.

Three-Body

As is stands Tadah! does not support three-body type descriptors. They are simply slow to compute and there exist a number of angularly dependend many-body descriptors. However if there is enough interest in three-body descriptors they can be fairly easily added to the library. Just drop us an email…

Many-Body

List of all many-body type descriptors supported by Tadah! Note that some many-body type descriptors can calculate non-spherical charge distributionis hence they overcome Embedded Atom Method limitations.

DM_EAD

class DM_EAD : public DM_Base

Embedded Atom Descriptor

\[ V_i^{L,\eta,r_s} = \sum_{l_x,l_y,l_z}^{l_x+l_y+l_z=L} \frac{L!}{l_x!l_y!l_z!} \Big( \rho_i^{\eta,r_s,l_x,l_y,l_z} \Big)^2 \]

where density \( \rho \) is calculated using Gaussian Type Orbitals:

\[ \rho_i^{\eta,r_s,l_x,l_y,l_z} = \sum_{j \neq i} x_{ij}^{l_x}y_{ij}^{l_y}z_{ij}^{l_z} \exp{\Big(-\eta(r_{ij}-r_s)^2\Big)}f_c(r_{ij}) \]

CGRIDMB parameters control position \( r_s \) of the gaussian basis function.

SGRIDMB parameters control width \( \eta \) of the gaussian basis function.

e.g. \(L_{max}=2\) will calculate descriptors with \( L=0,1,2 \) (s,p,d orbitals).

More information about this descriptor:

Zhang, Y., Hu, C.,Jiang, B. (2019). Embedded atom neural network potentials: efficient and accurate machine learning with a physically inspired representation. Journal of Physical Chemistry Letters, 10(17), 4962–4967. https://doi.org/10.1021/acs.jpclett.9b02037

Required Config keys: INITMB CGRIDMB SGRIDMB

Public Functions

virtual void calc_aed(rho_type &rho, aed_type &aed) override

Calculate AED.

Calculate Atomic Energy Descriptor for the atom local environment.

virtual void calc_dXijdri_dXjidri(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rhoi, rho_type &rhoj, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor between to atoms.

This method works for half NN lists and linear models.

\[ \mathbf{fd}_{ij} \mathrel{+}= \frac{\partial \mathbf{X}_{ij}}{\partial \mathbf{r}_i} + \frac{\partial \mathbf{X}_{ji}}{\partial \mathbf{r}_i} \]

virtual void calc_dXijdri(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rhoi, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor between to atoms.

This method works for full NN lists and all models.

mode=0 inidcates only x-direction is computed and the resulting descriptor must be multiplied by delx/r.

\[ \mathbf{fd}_{ij} \mathrel{+}= \frac{\partial \mathbf{X}_{ij}}{\partial \mathbf{r}_i} \]

virtual std::string label() override

Return label of this descriptor.

virtual void init_rhoi(rho_type &rhoi) override

Resize arrays for a density and F’.

virtual void calc_rho(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rho, const double scale = 1) override

Calculate density.

virtual void init() override

Initialize the descriptor.

This method sets up the required keys names and number of parameters for the descriptor.

Note: The implementation of the descriptor should not rely on these initial values, allowing for greater flexibility in how the Config file is parsed.

The keys and parameters are utilized by other classes inheriting from this implementation, such as meta-descriptors.

DM_EAM

class DM_EAM : public DM_Base

many-body part for the Embedded Atom Method descriptor.

\[ V_i = F\Bigg(\sum_{j \neq i} \rho(r_{ij}) \Bigg) \]

This descriptor will load tabulated values for the density \( \rho \) and embedded energy \( F \) from the provided SETFL file.

This descriptor is usually used together with the two-body descriptor D2_EAM although this is not required and user can mix it with any other descriptors or use it on its own.

This descriptor will enforce cutoff distance as specified in a SETFL file. Set RCUTMB to the same value to suppress the warning message.

Required Config keys: INITMB SETFL

Public Functions

virtual void calc_aed(rho_type &rho, aed_type &aed) override

Calculate AED.

Calculate Atomic Energy Descriptor for the atom local environment.

virtual void calc_dXijdri_dXjidri(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rhoi, rho_type &rhoj, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor between to atoms.

This method works for half NN lists and linear models.

\[ \mathbf{fd}_{ij} \mathrel{+}= \frac{\partial \mathbf{X}_{ij}}{\partial \mathbf{r}_i} + \frac{\partial \mathbf{X}_{ji}}{\partial \mathbf{r}_i} \]

virtual void calc_dXijdri(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rhoi, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor between to atoms.

This method works for full NN lists and all models.

mode=0 inidcates only x-direction is computed and the resulting descriptor must be multiplied by delx/r.

\[ \mathbf{fd}_{ij} \mathrel{+}= \frac{\partial \mathbf{X}_{ij}}{\partial \mathbf{r}_i} \]

virtual std::string label() override

Return label of this descriptor.

virtual void init_rhoi(rho_type &rhoi) override

Resize arrays for a density and F’.

virtual void calc_rho(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rho, const double scale = 1) override

Calculate density.

virtual void init() override

Initialize the descriptor.

This method sets up the required keys names and number of parameters for the descriptor.

Note: The implementation of the descriptor should not rely on these initial values, allowing for greater flexibility in how the Config file is parsed.

The keys and parameters are utilized by other classes inheriting from this implementation, such as meta-descriptors.

DM_Dummy

class DM_Dummy : public DM_Base

Dummy many-body descriptor.

Use it to satisfy DescriptorsCalc requirements in case when many-body descriptor is not required.

Public Functions

virtual void calc_aed(rho_type &rho, aed_type &aed) override

Calculate AED.

Calculate Atomic Energy Descriptor for the atom local environment.

virtual void calc_dXijdri_dXjidri(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rhoi, rho_type &rhoj, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor between to atoms.

This method works for half NN lists and linear models.

\[ \mathbf{fd}_{ij} \mathrel{+}= \frac{\partial \mathbf{X}_{ij}}{\partial \mathbf{r}_i} + \frac{\partial \mathbf{X}_{ji}}{\partial \mathbf{r}_i} \]

virtual void calc_dXijdri(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rhoi, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor between to atoms.

This method works for full NN lists and all models.

mode=0 inidcates only x-direction is computed and the resulting descriptor must be multiplied by delx/r.

\[ \mathbf{fd}_{ij} \mathrel{+}= \frac{\partial \mathbf{X}_{ij}}{\partial \mathbf{r}_i} \]

virtual std::string label() override

Return label of this descriptor.

virtual void init_rhoi(rho_type &rhoi) override

Resize arrays for a density and F’.

virtual void calc_rho(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rho, const double scale = 1) override

Calculate density.

virtual void init() override

Initialize the descriptor.

This method sets up the required keys names and number of parameters for the descriptor.

Note: The implementation of the descriptor should not rely on these initial values, allowing for greater flexibility in how the Config file is parsed.

The keys and parameters are utilized by other classes inheriting from this implementation, such as meta-descriptors.

DM_Base

class DM_Base : public D_Base

Base class for all many-body type descriptors.

All many-body descriptors must inherit this class.

Subclassed by DM_Blip, DM_Dummy, DM_EAD, DM_EAM, DM_mEAD< F >, DM_mJoin

Public Functions

virtual void calc_aed(rho_type &rho, aed_type &aed) = 0

Calculate AED.

Calculate Atomic Energy Descriptor for the atom local environment.

virtual void calc_dXijdri_dXjidri(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rhoi, rho_type &rhoj, fd_type &fd_ij, const double scale = 1) = 0

Calculate FD.

Calculate Force Descriptor between to atoms.

This method works for half NN lists and linear models.

\[ \mathbf{fd}_{ij} \mathrel{+}= \frac{\partial \mathbf{X}_{ij}}{\partial \mathbf{r}_i} + \frac{\partial \mathbf{X}_{ji}}{\partial \mathbf{r}_i} \]

virtual void calc_dXijdri(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rhoi, fd_type &fd_ij, const double scale = 1) = 0

Calculate FD.

Calculate Force Descriptor between to atoms.

This method works for full NN lists and all models.

mode=0 inidcates only x-direction is computed and the resulting descriptor must be multiplied by delx/r.

\[ \mathbf{fd}_{ij} \mathrel{+}= \frac{\partial \mathbf{X}_{ij}}{\partial \mathbf{r}_i} \]

virtual void init_rhoi(rho_type &rhoi) = 0

Resize arrays for a density and F’.

virtual void calc_rho(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rho, const double scale = 1) = 0

Calculate density.

inline void calc_dXijdri(const int Zi, const int Zj, Vec3d &del, rho_type &rhoi, fd_type &fdij, double scale = 1)

This is just a convenient wrapper.

inline void calc_rho_mb(const int Zi, const int Zj, Vec3d &del, rho_type &rhoi, double scale = 1)

This is just a convenient wrapper.

inline virtual size_t rhoi_size()

Return size of the density array.

inline virtual size_t rhoip_size()

Return size of the derivative of the embedding energy array.

inline virtual size_t size()

Return dimension of the descriptor.

virtual std::string label() = 0

Return label of this descriptor.

DM_mJoin

class DM_mJoin : public DM_Base, public D_mJoin

Meta many-body descriptor for combining multiple DM descriptors.

This descriptor provides an interface for concatenating various many-body descriptors. The resulting descriptor can then be used by Tadah! like any standard many-body descriptor.

Each descriptor must have a specified type in a configuration file, along with a cutoff function, cutoff distance, and other optional keys that are typically expected for this descriptor, such as SGRIDMB and CGRIDMB.

When listing descriptors under the TYPEMB key, include parameters relevant to this descriptor.

Here is an example of configuring these descriptors:

TYPEMB    DM_mJoin         # Meta descriptor for concatenating many-body descriptors
TYPEMB    DM_EAD 1 5 5 * *    # L number, cgrid, sgrid, list of element pairs
RCTYPEMB  Cut_Cos
RCUTMB    3.0
CGRIDMB   -1 5 0 3.0       # Grid for DM_EAD, blips centers, auto-generated
SGRIDMB   -2 5 1.0 10.0    # Grid for DM_EAD, blips widths, auto-generated

TYPEMB    DM_Blip 0 7 7 Ta Ta   # L number, cgrid, sgrid, list of element pairs
RCTYPEMB  Cut_Tanh
RCUTMB    7.5
SGRIDMB   -2 7 0.1 10      # Grid for DM_Blip, blips widths, auto-generated
CGRIDMB   0 0 0 0 0 0 0    # Grid for DM_Blip, blips centers

Note: Grids can be specified on a single line, and the order of the grids should match the order of descriptors.

There is no limit to the number of descriptors that can be concatenated.

  • Ensure the types and grids are correctly specified in the configuration file.

  • The cutoff functions (RCTYPEMB) and distances (RCUTMB) must be defined for each descriptor.

  • Both SGRIDMB and CGRIDMB should be included if relevant, with their sizes matching the given descriptors.

Public Functions

virtual void calc_aed(rho_type &rho, aed_type &aed) override

Calculate AED.

Calculate Atomic Energy Descriptor for the atom local environment.

virtual void calc_dXijdri_dXjidri(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rhoi, rho_type &rhoj, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor between to atoms.

This method works for half NN lists and linear models.

\[ \mathbf{fd}_{ij} \mathrel{+}= \frac{\partial \mathbf{X}_{ij}}{\partial \mathbf{r}_i} + \frac{\partial \mathbf{X}_{ji}}{\partial \mathbf{r}_i} \]

virtual void calc_dXijdri(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rhoi, fd_type &fd_ij, const double scale = 1) override

Calculate FD.

Calculate Force Descriptor between to atoms.

This method works for full NN lists and all models.

mode=0 inidcates only x-direction is computed and the resulting descriptor must be multiplied by delx/r.

\[ \mathbf{fd}_{ij} \mathrel{+}= \frac{\partial \mathbf{X}_{ij}}{\partial \mathbf{r}_i} \]

virtual std::string label() override

Return label of this descriptor.

virtual void init_rhoi(rho_type &rhoi) override

Resize arrays for a density and F’.

virtual void calc_rho(const int Zi, const int Zj, const double rij, const double rij_sq, const Vec3d &vec_ij, rho_type &rho, const double scale = 1) override

Calculate density.

virtual void init() override

Initialize the descriptor.

This method sets up the required keys names and number of parameters for the descriptor.

Note: The implementation of the descriptor should not rely on these initial values, allowing for greater flexibility in how the Config file is parsed.

The keys and parameters are utilized by other classes inheriting from this implementation, such as meta-descriptors.