(image) (image) [ Home ]

Emulation and Simulation of
Microelectronic Fabrication Processes

4.4 ViennaRay - Transport Modelling

The ViennaRay ray tracing library is based on the physical modelling approaches presented in Section Rays are launched from a source plane above the geometry and their paths are traced until they intersect the surface which is defined using the disc mesh described in Section The discs are not passed explicitly to the ray tracer, but are rather only represented as a point cloud and the corresponding surface normals. The discs are then implicitly generated by the ray tracer using a predefined value for the disc radius. The minimum disc radius which leads to a closed surface mesh is \(\frac {1}{2} \sqrt {D} \Delta g\) which is used in this work since it provides the smallest robust surface area and thus avoids unnecessary smoothing during ray tracing.

In order to adequately describe interactions with the surface, which may influence the particles behaviour, such as reflection angle, energy loss during reflection, and sticking probability, the ray tracing library allows the user to implement their own particle type. As shown in Fig. 4.13, the user-defined particle type object must provide three callbacks:

  • 1. initNew: Sets up all initial values for the ray, such as the initial energy for modelling ions.

  • 2. surfaceCollision: Called when the particle intersects the surface. Used to model the interaction with the surface based on particle specific properties, such as incoming angle, energy, and sticking probability. The results are stored in the thread local data of the ray tracer. Since several discs may overlap and therefore create more than one intersection, this function may be called multiple times for one surface hit.

  • 3. surfaceReflection: Called only once for the first intersection with a disc. It is used to set the reflection probability and the direction of the reflected particle, based on surface properties. Since a particle cannot change the surface upon reflection, this function is not allowed to change the thread local data of the ray tracer. However, in order to properly model surface dependent reflections, surface properties assumed to be constant during the ray tracing, such as different particle coverages, are accessible.

For convenience, a simple particle type is provided as a base implementation. This particle does not implement any reflections, but simply sticks or adsorbs on the surface. The disc, which is hit by the particle is recorded by the ray tracer and used to generate a hit counter for each surface element. For user defined particles, this counting of hits is unnecessary, as the particle type should implement the functionality for capturing the incoming particle flux in the thread local data of the ray tracer. Therefore, properties of the ray, such as incoming angle, energy, or initial flux can be used for the calculation of the surface flux directly.

(-tikz- diagram)

Figure 4.13: Interface of the ViennaRay library for defining the properties of the simulation domain. The particle type is passed using the abstract base class rayParticle, so the particle type can be assigned dynamically during runtime. Custom particle types should always be inherited from rayParticleBase, which contains the functionality for accessing the copy constructor of the user-defined particle type.

The particle type is then defined by deriving from the rayParticleBase class and passing it to the ray tracer, as shown in Fig. 4.13. As this particle type is used to trace each ray, it must have a defined copy constructor, so it can be duplicated via the clone member function of the base class. The two most common reflection types, diffuse and specular reflection, are provided as free functions. Hence, a user may apply them efficiently in the implementation of the custom particle type. These functions simply return the direction of the outgoing ray, given the direction of the incoming ray, as well as any information about the surface and the intersection point. Since all parameters of the ray tracer can be set during runtime, including the user defined particle type, the library does not need to be recompiled when changing particle models and can thus be used in the most flexible manner possible.