ViennaLS
Loading...
Searching...
No Matches
viennals::OxidationMaskTracker< T, D > Class Template Reference

Unified oxidation time-step orchestrator. More...

#include <lsOxidation.hpp>

Public Member Functions

 OxidationMaskTracker (SmartPointer< Domain< T, D > > mask)
bool tracks (const SmartPointer< Domain< T, D > > &mask) const
 False for another mask, or after the mask was resampled to another grid.
template<class VelocityFunction>
void correct (SmartPointer< Domain< T, D > > mask, VelocityFunction &&velocity, T dt)
 Re-sample the just advected mask: dt is the advection time, velocity (Vec3D<T>(const Vec3D<T> &coordinate)) the one it was advected with.

Detailed Description

template<class T, int D>
class viennals::OxidationMaskTracker< T, D >

Unified oxidation time-step orchestrator.

Couples diffusion and viscoelastic deformation into a single CFL-limited step. When a mask interface is provided the solver operates in LOCOS mode; without one it performs standard planar or step oxidation.

Standard mode (no mask):

  1. Diffusion+deformation coupled solve (OxidationModel)
  2. Ambient interface advection (deformation velocity)
  3. Si/SiO2 reaction interface advection (diffusion velocity)
  4. Interior fill for warm-start persistence

LOCOS mode (mask provided):

  1. Diffusion+deformation coupled solve (OxidationModel); the nitride joins the deformation solve as an elastic body, creeping when OxidationMaskParameters sets a viscosity (monolithic oxide + nitride mechanics)
  2. Pre-advection boolean clip (ambientInterface \ maskInterface)
  3. Ambient interface advection (oxide velocity)
  4. Si/SiO2 reaction interface advection (diffusion velocity)
  5. Mask advection (nitride velocity), re-sampled from the mask's shape at the start of the call and the nitride displacement (OxidationMaskTracker: keeps its corners sharp)
  6. Interior fills + post-advection boolean clip With setMaskBarrierOnly(true) the mask is a diffusion barrier only: it is withheld from the mechanics and carried along by the oxide.

Usage (standard):

auto ox = ls::Oxidation<double, 2>::New(si, ambient);
ox->setOxidationParameters(oxParams);
ox->setDeformationParameters(defParams);
ox->apply(0.1); // advection time in hours
static auto New(Args &&...args)
Definition lsOxidation.hpp:439

Usage (LOCOS):

auto ox = ls::Oxidation<double, 2>::New(si, ambient, mask);
ox->setOxidationParameters(oxParams);
ox->setDeformationParameters(defParams);
ox->setMaskParameters(maskParams);
ox->setSolveBounds(minIdx, maxIdx);
ox->applyCFLLimited(0.35, 0.499);
ox->getDiffusionField()->getConcentration(pt); // diagnostics

Lagrangian nitride surface. The nitride is an elastic solid that moves almost rigidly, by up to hundreds of nm, and level-set advection rounds its convex corners by a numerical diffusion that grows with the distance travelled, for every scheme order: over a 0.1 um lift on a 5 nm grid the side wall 2.5 nm from a corner moved in by 13 nm (Engquist-Osher 1st order) or 6.5 nm (WENO5 + RK3), and a 50 nm strip lost its contact with the oxide. After each advection the mask is therefore re-sampled from the shape it had when the tracker was created and the accumulated displacement u of the nitride, phi(x) = phi_0(x - u(x)) (D-linear in phi_0). u follows the material: u(x) = u_old(x - v dt) + v dt with the velocity v the mask was advected with (accumulating v at a fixed point instead turns a rotation of angle a by an error ~ a^2 r / 2). The advection still moves the narrow band and carries the point data; the re-sampled band is normalised like an advected one. A tracker lives for one Oxidation object, i.e. one process call: phi_0 is sampled once per call (over a 0.1 um lift the corner moved by 0.9 nm in one call, 2.5 nm in six; re-sampled every step, 17 nm).

Constructor & Destructor Documentation

◆ OxidationMaskTracker()

template<class T, int D>
viennals::OxidationMaskTracker< T, D >::OxidationMaskTracker ( SmartPointer< Domain< T, D > > mask)
inlineexplicit

Member Function Documentation

◆ correct()

template<class T, int D>
template<class VelocityFunction>
void viennals::OxidationMaskTracker< T, D >::correct ( SmartPointer< Domain< T, D > > mask,
VelocityFunction && velocity,
T dt )
inline

Re-sample the just advected mask: dt is the advection time, velocity (Vec3D<T>(const Vec3D<T> &coordinate)) the one it was advected with.

◆ tracks()

template<class T, int D>
bool viennals::OxidationMaskTracker< T, D >::tracks ( const SmartPointer< Domain< T, D > > & mask) const
inline

False for another mask, or after the mask was resampled to another grid.


The documentation for this class was generated from the following file: