Multi Particle Process

#include <psMultiParticleProcess.hpp>

The multi particle process is a simple process model that simulates either etching or deposition, where an arbitrary number of particles can be specified. The particles can be neutral or ions, and the model can be used to simulate a wide range of processes. The rate equation for combining the fluxes of the particles has to be provided by the user.

Neutral Particles

Neutral particles are defined by their sticking probability, which is the probability that a neutral particle will stick to the surface upon impact. The sticking probability is a value between 0 and 1. The sticking probability defines the reflection behavior of the neutral particles. A sticking probability of 1 means that the neutral particle will always stick to the surface, while a sticking probability of 0 means that the neutral particle will always be reflected.

Ion Particles

Ion particles are defined by their source exponent, which is the exponent of the power cosine distribution for the initial directions of the ions. The source exponent defines the distribution of the initial directions of the ions. A source exponent of 1 means that the ions are emitted isotropically, while a source exponent of 1000 means that the ions are emitted mostly perpendicular to the surface.

The ion sticking function is defined by the parameters $\theta_{min}$ and $\theta_{max}$. The ion sticking function is a function of the incoming angle $\theta$ that defines the probability that an ion will stick to the surface upon impact. The ion sticking function is a linear function defined as:

\[S(\theta) = \begin{cases} 0 & \text{if } \theta < \theta_{min} \\ 1 & \text{if } \theta > \theta_{max} \\ \frac{\theta - \theta_{min}}{\theta_{max} - \theta_{min}} & \text{otherwise} \end{cases}\]

Ions striking the surface at an angle denoted by $\theta$ relative to the surface normal undergo reflection, where the angular dispersion is characterized by a cosine function centered around the direction of specular reflection defined by $\theta_\textrm{spec}$. This reflection process distinguishes between ions approaching the surface at glancing angles, which undergo nearly perfect specular reflection, and those striking the surface perpendicularly, which undergo nearly diffuse reflection. The ray’s reflected direction is randomly chosen from a cone around the specular direction. The opening angle of this cone is given by the incidence angle $\theta$ or the minimum specified angle $\theta_{min}$.

drawing

Optional Parameters:

Ion can be assigned an energy which can be used to calculate a surface yield. This feature can be activated by setting the mean energy > 0 and is deactivated by setting the mean energy = 0. The energy distribution of the ions is assumed to be Gaussian with a standard deviation of sigmaEnergy. The threshold energy is the energy below which the ion will not sputter the surface, and the energy dependent yield is defined as:

\[Y(E) = \begin{cases} 0 & \text{if } E < E_{\textrm{threshold}} \\ \sqrt{E} - \sqrt{E_{\textrm{threshold}}} & \text{if } E \geq E_{\textrm{threshold}} \end{cases}\]

The inflection angle and n are parameters of the ion energy reduction function, which is used to calculate the energy after reflection. The ion energy reduction function is defined as:

\[E_{\textrm{ref}}= \begin{cases} 1-(1-A)\frac{\frac{\pi}{2}-\theta}{\frac{\pi}{2}-\theta_\textrm{inflect}} & \text{ if } \theta \geqslant \theta_\textrm{inflect} \\ \mathrm{A}\left(\frac{\theta}{\theta_\textrm{inflect}}\right)^{n_l} & \text{ if } \theta<\theta_\textrm{inflect}, \end{cases}\]

where $A = (1 + n(\frac{\pi}{2 \theta_\textrm{inflect}} - 1))^{-1}$.

The angle-dependent sputtering yield is defined as:

\begin{equation} Y(\theta) = (1 + B_{sp}(1-\cos^2(\theta)))\cos(\theta). \end{equation}

Implementation


// default empty constructor
MultiParticleProcess()

void addNeutralParticle(NumericType stickingProbability)

void addIonParticle(NumericType sourceExponent, 
                    NumericType thetaRMin = 0.,
                    NumericType thetaRMax = 90., 
                    NumericType minAngle = 0.,
                    NumericType B_sp = -1.,
                    NumericType meanEnergy = 0.,
                    NumericType sigmaEnergy = 0.,
                    NumericType thresholdEnergy = 0., 
                    NumericType inflectAngle = 0., 
                    NumericType n = 1)

void setRateFunction(std::function<NumericType(std::vector<NumericType> &, 
                                               const Material &)> rateFunction)

Parameter Description Default Value
stickingProbability Sticking probability of the neutral particle -
sourceExponent Exponent of the power cosine distribution for the initial directions of ions -
thetaRMin $\theta_{min}$ in the ion sticking function 0.0
thetaRMax $\theta_{max}$ in the ion sticking function 90.0
minAngle Minimum angle for the ion reflection 0.0
B_sp Sputtering yield parameter -1.0
meanEnergy Mean initial energy of the ions 0.0
sigmaEnergy Standard deviation of the initial energy of the ions 0.0
thresholdEnergy Threshold energy for ion sputtering 0.0
inflectAngle Inflection angle of the ion energy reduction function 0.0
n Exponent of the ion energy reduction function 1.0

Example usage:

C++

...
auto model = SmartPointer<MultiParticleProcess<NumericType, D>>::New();
model->addNeutralParticle(0.1);
model->addIonParticle(1000.);

// for material specific rates
auto rateFunction = [](std::vector<NumericType> &fluxes, const Material &material) {
        // fluxes contains the neutral flux at first index and ion flux at second index
        return material == Material::Si ? -(fluxes[0] + fluxes[1]) : 0.;
};
model->setRateFunction(rateFunction);

...

Python

...
model = vps.MultiParticleProcess()
model.addNeutralParticle(0.1)
model.addIonParticle(1000.)

# for material specific rates
def rateFunction(fluxes, material):
    if material == vps.Material.Si:
        # fluxes contains the neutral flux at first index and ion flux at second index
        return -sum(fluxes)
    else:
        return 0.

model.setRateFunction(rateFunction)
...