Tutorial

Machball computes the evolution in surface coverage inside nanostructures for self-limited processes such as atomic layer deposition (ALD) or atomic layer etching (ALE).

This tutorial assumes that the user has a working Python environment and that Machball is already installed in the system.

Ballistic transport

In order to compute the ballistic transport inside a nanostructure, Machball needs information about the view factors connecting different points of a structure. Machball codifies this information in its Structure class.

Structure implements a structure discretized in a finite number of sections. A Structure object requires three key pieces of information: the view factors qij codified as a 2D numpy array, the area of the different elements, and a list of the sections representing the opening of the feature.

Specific structures

Machball implements a few examples of the most commonly used nanostructures, such as circular vias, infinite rectangular trenches, and tapered circular vias.

class machball.ballistic.Via(AR, Nz)

Implement a circular via

A Via is composed of Nz + 2 elements, with the first and last elements corresponding to the opening and the base, respectively.

The view factors are calculated assuming a cosine law distribution, which corresponds to the behavior expected both from diffuse reemision and a non-directional flux of incident species.

Parameters:
  • AR (float) – Aspect ratio, defined as the depth to diameter ratio

  • Nz (int) – Number of vertical sections in the discretized wall

class machball.ballistic.Trench(AR, Nz)

Implement a rectangular trench

A trench is composed of Nz + 2 elements, with the first and last elements corresponding to the opening and the base, respectively.

The view factors are calculated assuming a cosine law distribution, which corresponds to the behavior expected both from diffuse reemision and a non-directional flux of incident species.

Parameters:
  • AR (float) – Aspect ratio, defined as the depth to width ratio

  • Nz (int) – Number of vertical sections in the discretized wall

These classes automatically calculate the view factors for the user. For instance, if we want to work with a 100 aspect ratio circular via discretized in 200 equally spaced segments, we just use:

from machball.ballistic import Via
st = Via(100, 200)

Saving and loading structures

It is possible to save and load the structures from file. Machball currently supports two formats: a pickle format using Python’s pickle module and a txt numpy array format:

We can use these functions as follows:

save_structure("via.pickle", st, mode="pickle")
st2 = read_structure("via.pickle", mode="pickle")

save_structure("via.dat", st, mode="numpy")
st3 = read_structure("via.dat", mode="numpy")

save_structure("via.dat", st, mode="numpy", areafile="via_areas.dat")
st4 = read_structure("via.dat", mode="numpy", areafile="via_areas.dat")

The key difference between the pickle and numpy modes is that when saving and loading numpy arrays we lose all the additional metadata. This means that we have to manually set the entrypoints unless it uses the default value (first section in the array is the entrypoint).

Defining an ALD process

Machball implements an ideal self-limited process through its class ALDIdeal, which models the self-limited adsorption of a precursor molecule as a first order irreversible Langmuir kinetics.

The first step is to import the class:

from machball import ALDIdeal

A self limited process is then defined as:

ald = ALDIdeal(beta0=1e-2, MM=100, T=473,
    p0=100, s0=10e-20, betarec=0)

The parameters that we need to pass to define a self-limited process includes the reaction probability beta0, the molecular mass in atomic mass units MM, the process temperature T in Kelvin, the precursor pressure p0 in Pa, the area of an absorption site s0 in square meters, and finally an optional parameter codifying a recombination probability betarec (zero by default).

Ballistic transport

Once it has been installed, Machball is trivial to use. Here is a simple snippet to model the transport inside a circular via:

from machball import ALDIdeal
from machball.ballistic import Via
ald = ALDIdeal(1e-2, 100, 473, 10, 10e-20, betarec=0)
st = Via(50, 100) # Aspect ratio, and number of segments
dose_times, coverages = ald.saturation_ballistic(st)

The variables dose_times and coverages are 1D array with dose times and a 2D array with the fractional coverage profile inside the via for each of the times.