Skip to main content
Version: release 25

Matrix deposition algorithm

Trajectory object​

This object controls the trajectory of the substrate. At the same time, it determines the coordinate system of the setup. The trajectory is to be defined within an MPROJECTOR object.

Within the object, an internal coordinate system is used, whereof the axes have the following meaning:

  • X axis - This is the radial coordinate pointing from the center of the turntable towards outside (into the direction, where PHI=0°)
  • Y axis - This is the tangential coordinate which points into the move coordinate (into the direction, where PHI=90°)
  • Z axis - This is the vertical distance from the substrate holder

The external coordinate system of the simulation setup may be different. By definition of appropriate unit vectors in the Trajectory object, the correct orientation of the coordinate system within this module can be chosen.

Script syntax​

The definition syntax is as follows:

Trajectory_type="circular";
trajectory: {
PHI_0 = -19; PHI_1 = 19; NPHI = 381;
x0 = -232; y0 = 260; z0 = z_front;
R = 540;

nx = 0; ny = 0; nz = -1;
tx = 1; ty = 0; tz = 0;
};

There are the following input parameters for a “circular” trajectory.

  • PHI_0, PHI_1 = The interval of the turntable rotation.
  • NPHI = Number of turntable rotation steps
  • x0, y0, z0 = The point (x0, y0, z0) corresponds to the center of the turntable in lateral coordinates and to the central point of the substrate in vertical coordinates.
  • R = Radius between center of turntable and center of substrate
  • nx, ny, nz = Unit vector pointing from turntable towards the histogram plane. This is parallel to the Z axis mentioned above.
  • tx, ty, tz = Unit vector pointing in radial direction from center to outside; which is identical to the X axis mentioned above.

Relevant C++ routines​

  • Trajectory_UTX::set_plot_position(): Put the substrate into a central position for plotting
  • int Trajectory_UTX::get_nsteps(): Return the number of steps of the move trajectory
  • Trajectory_UTX::get_coordinates(double &_xt, double &_yt, double &zt, double &PHI_t): Retrieve the current coordinates of substrate center. The angle PHI_t is used for the relative rotation of the substrate with respect to the external coordinate system.
  • Trajectory_UTX::get_origin(double &_x0, double &_y0, double &_z0): Get coordinates of center of turntable. If the turntable is placed within XY plane, the Z coordinate _z0 is at the same vertical distance from the turntable as the center surface of the substrate.
  • Trajectory_UTX::set_index(int &_index): Go to the step _index of the move trajectory. The variable _index has to be between 0 and Trajectory_UTX::get_nsteps()-1.

Histogram object​

How to provide matrix histogram files​

A matrix histogram is an array of iX*iY histograms arranged in a rectangular array. It can be extracted from a DSMC simulation via the histogram array technique. The syntax to use within a reactions: { … } block is

add_histogram_array("species", nTheta, nPhi, E0, E1, nE, nx, ny, x0, y0, z0, x0+dx1, y0+dy1, z0+dz1, x0+dx2, y0+dy2, z0+dz2);

The histogram array is applied on a single rectangular membrane with the following coordinates:

x⃗=(x0,y0,z0)x⃗+δx1⃗=(x0+δx1,y0+δy1,z0+δz1)x⃗+δx2⃗=(x0+δx2,y0+δy2,z0+δz2)x⃗+δx1⃗+δx2⃗=(x0+δx1+δx2,y0+δy1+δy2,z0+δz1+δz2)\begin{aligned} \vec{x} &=\left(x_0, y_0, z_0\right)\\ \vec{x}+\vec{\delta x_1} &=\left(x_0+\delta x_1, y_0+\delta y_1, z_0+\delta z_1\right)\\ \vec{x}+\vec{\delta x_2} &=\left(x_0+\delta x_2, y_0+\delta y_2, z_0+\delta z_2\right)\\ \vec{x}+\vec{\delta x_1}+\vec{\delta x_2} &=\left(x_0+\delta x_1+\delta x_2, y_0+\delta y_1+\delta y_2, z_0+\delta z_1+\delta z_2\right) \end{aligned}

In case of a sputter coater with turntable, please use the following conventions:

  • δx1⃗\vec{\delta x_1} should be the radial coordinate and point from the turntable center towards outside (i.e. the “X” direction mentioned above)
  • δx2⃗\vec{\delta x_2} should be the tangential coordinate which is identical with the “Y” direction mentioned above.

In the GMSH mesh geometry, make sure that the normal vectors from the Matrix mesh point towards the arriving particles.

Example: in the model of the EOSS coater, there is a histogram sampling plane spanning between the coordinates (225, 120, 380) → (525, 400, 380). The turntable is located in XY plane, and its lower Z coordinate is Z0=382. The upper coordinate of the uniformity masks is Z=380; this is identical with the Z coordinate of the histogram membrane. The radial direction is identical to the positive X axis direction, and the tangential direction corresponds to Y. Thus, an appropriate way to define the histogram array would be

add_angular_histogram_array("Ta", 9, 36, 30, 28, 225, 120, 380, 525, 120, 380, 225, 400, 380);

The first two parameters correspond to the number of angular slots for θ,ϕ\theta, \phi - corresponding to a 10° resolution. The second two parameters (30, 28) are the number of histogram slabs in the first and second direction. With δx1⃗=(300,0,0)\vec{\delta x_1} = (300, 0, 0) and δx2⃗=(0,280,0)\vec{\delta x_2} = (0, 280, 0) this corresponds to a spatial resolution of 10 mm in both directions.

During a DSMC simulation, histogram files are produced in the histogram/* subdirectory of the simulation run folder. These histogram files are plain ASCII. Their first three columns consist of (i) energy in eV, (ii) polar angle and (iii) azimuthal angle. The following nx*ny columns consist of the sampled particle counts from all of the histogram slabs. The column number (starting with 0) depends on the indices ix, iy in the following way:

ic=ic+ncic  ∈[0,…,nxny−1]i_c = i_c + n_c i_c\,\,\in[0,\ldots,n_x n_y-1]

On the other hand, the indices ix, iy can be retrieved from the column number via

ix=ic mod nx  ∈[0,…,nx−1]iy=⌊ic/nx⌋∈[0,…ny−1]\begin{aligned} i_x &=i_c\,\mathrm{mod}\,n_x\,\,\in[0,\ldots,n_x-1]\\ i_y &=\lfloor i_c/n_x\rfloor \in [0,\ldots n_y-1] \end{aligned}

The histogram files are generated for each plot snapshot. For better statistics please use the script contained in this ZIP file for time averaging. This is done via following steps:

  • The script should be placed in the same directory as the *.PAR files

  • Create a subdirectory via

    mkdir histogram-matrix
  • Edit the headlines of the script. You should adjust the time averaging interval as well as specify the species for each of the matrix histograms attached to the sampling membrane:

    T0 = 1000; # Time averaging start
    T1 = 3000; # Time averaging end
    DT = 50; # Time between two snapshots
    TUNIT = "ms"; # Time unit (as written in the filenames)
    sensor = "Matrix"; # Physical name of matrix membrane
    EXPORT = "plot"; # use "plot" for use in projector algorithm

    var species[] -> ["Ta", "Ta", "Ta"];

In the example, time averaging is performed from 1000 to 3000 ms with a time step of 50 ms between snapshots. There are three different histograms attached to the sampling membrane, each of them samples arriving Tantalum (“Ta”) species.

  • After having adjusted the file histogram-matrix.r, type the command:

    rvm -b histogram-matrix.r simcase.par

Internal histogram representation​

Within module_mprojector, histograms are represented by the C++ class Histogram. It has the following relevant member functions:

  • Histogram::alloc(int _ntheta, int _nphi): Allocate memory for internal variable double *intensity to store count values for _ntheta*_nhi angle combinations
  • Histogram::restore(): Fill all intensity entries with 0.
  • Histogram::read_file(char *_fullpath, int *_debugflag=0): Read histogram from single histogram file. This function is deprecated and will be removed.
  • double Histogram::get_intensity(int _itheta, int _iphi): Get counts for _itheta, _iphi combination.
  • Histogram::set_intensity(int _itheta, int _iphi, double _intensity): Set counts for _itheta, _iphi combination.
  • Histogram::add_intensity(int _itheta, int _iphi, double _intensity): Add counts for _itheta, _iphi combination.

In the object MProjector_UTX, histograms are stored in the component Histogram *MProjector_UTX::histograms. In previous versions, single histograms could be read in via many separated histogram slabs, however this method is too cumbersome and has therefore been removed.

In the current version, all histograms are obtained from the single histogram matrix file described above. The corresponding input section in the script file looks like follows:

Hist_NTHETA = 9;
Hist_NPHI = 36;
Hist_DELTAPHI= 90;
Hist_Z = 380;

Hist_X0 = 225; Hist_NX = 30; Hist_DX = 10;
Hist_Y0 = 120; Hist_NY = 28; Hist_DY = 10;

Hist_Filename= "histogram-matrix/$(histlabel)_histogram_3_Matrix_Ta.txt";

The coordinates of the histogram slabs are now passed via the parameters Hist_X0, Hist_NX, Hist_DX, Hist_Y0, Hist_NY, Hist_DY. The coordinates Hist_X0, Hist_Y0 correspond to the lower edge coordinates of the sampling membrane in the GMSH file1. The third coordinate is Hist_Z which represents the vertical position of the histogram plane2.

Footnotes​

  1. internally, the coordinates will be shifted by +Hist_DX/2, +Hist_DY/2. Thus, that they correspond to the center points of the membrane slabs rather than to the edge coordinate; this is required by the bilinear interpolation algorithm. Note: In the previous version, the first center coordinates rather than the edge coordinates were required in the input file which caused some confusion. ↩

  2. Note: In case if the external coordinate system is differently rotated, please keep in mind that Hist_X0 always represents the lower coordinate of the first directional vector, Hist_Y0 the one of the second directional vector, and Hist_Z the vertical coordinate of the plane. ↩