Neutral Transport

#include <models/psNeutralTransport.hpp>

NeutralTransport models feature-scale neutral-species transport with ray tracing, coverage-dependent sticking, optional desorption re-emission, optional surface diffusion, and coverage-dependent etching on a selected etch-front material.

The model is useful for high-aspect-ratio transport problems where the local reaction rate depends on how much neutral species reaches each surface point. The ray tracer stores the transported neutral flux on the surface, while the surface model updates the neutral coverage and converts that coverage into an etch velocity.

Model Behavior

The model uses a neutral particle source with a cosine-like angular distribution controlled by sourceDistributionPower. The local ray-tracing result is stored under fluxLabel, which defaults to neutralFlux.

At each surface point, the model updates a coverage value stored under coverageLabel, which defaults to neutralCoverage. The coverage update can include:

  • adsorption from the incoming neutral flux,
  • material-dependent desorption,
  • etch-front consumption,
  • optional desorption re-emission, and
  • optional surface diffusion on a selected material.

Etching is applied only on etchFrontMaterial. The local etch velocity is proportional to the neutral coverage, kEtch, surfaceSiteDensity, and siliconDensity.

Parameters

Field Default Description
incomingFlux 1.0 Incoming neutral flux scale in 10^20 molecules / (m^2 s).
sourcePressure 1.0 Fixed-pressure reservoir pressure in Pa. Used by examples to compute incomingFlux.
sourceTemperature 300.0 Reservoir temperature in K.
sourceMolecularMass 18.998 Neutral species molecular mass in amu.
zeroCoverageSticking 0.1 Sticking coefficient on non-etch-front surfaces at zero coverage.
etchFrontSticking 1.0 Sticking coefficient on the etch-front material.
desorptionRate 0.0 Desorption rate in 1 / s.
desorptionMaterial Material::Mask Material on which desorption is active.
kEtch 0.0 Etch reaction rate in 1 / s.
surfaceSiteDensity 1.66e-5 Surface site density in mol / m^2.
siliconDensity 8.3e4 Silicon density in mol / m^3.
coverageTimeStep 1.0 Explicit coverage update time step in seconds.
useSteadyStateCoverage true Use the steady-state local coverage solution before optional diffusion.
surfaceDiffusionCoefficient 0.0 Surface diffusion coefficient in active length unit squared per second.
surfaceDiffusionMaterial Material::Mask Material on which surface diffusion is active.
surfaceDiffusionNeighborDistance 0.0 Neighbor cutoff for diffusion. 0.0 estimates a cutoff from the surface point spacing.
surfaceDiffusionSolverTolerance 1e-8 Convergence tolerance for the implicit surface diffusion solve.
surfaceDiffusionMaxIterations 500 Maximum iterations for the surface diffusion solve.
sourceDistributionPower 1.0 Exponent of the source angular distribution.
etchFrontMaterial Material::Si Material on which etching is applied.
fluxLabel "neutralFlux" Name of the scalar flux data generated by ray tracing.
coverageLabel "neutralCoverage" Name of the scalar coverage data.

The Python bindings currently expose the model and the main neutral transport parameters, but not every C++ field listed above.

Example Usage

C++

using namespace viennaps;

NeutralTransportParameters<double> params;
params.incomingFlux = 1.0;
params.zeroCoverageSticking = 0.0;
params.etchFrontSticking = 1.0;
params.kEtch = 1.0;
params.etchFrontMaterial = Material::Si;
params.sourceDistributionPower = 1.0;

auto model = SmartPointer<NeutralTransport<double, 3>>::New(params);

RayTracingParameters<double, 3> rayTracing;
rayTracing.raysPerPoint = 1000;

CoverageParameters coverage;
coverage.maxIterations = 8;
coverage.tolerance = 1e-5;

Process<double, 3> process(domain, model, 0.01);
process.setParameters(rayTracing);
process.setParameters(coverage);
process.setFluxEngineType(FluxEngineType::CPU_TRIANGLE);
process.apply();

Python

import viennaps as vps

params = vps.NeutralTransportParameters()
params.incomingFlux = 1.0
params.zeroCoverageSticking = 0.0
params.etchFrontSticking = 1.0
params.surfaceDiffusionCoefficient = 0.0
params.sourceDistributionPower = 1.0
params.etchFrontMaterial = vps.Material.Si

model = vps.NeutralTransport(params)

ray_tracing = vps.RayTracingParameters()
ray_tracing.raysPerPoint = 1000

coverage = vps.CoverageParameters()
coverage.maxIterations = 8
coverage.tolerance = 1e-5

process = vps.Process(domain, model, 0.01)
process.setParameters(ray_tracing)
process.setParameters(coverage)
process.setFluxEngineType(vps.FluxEngineType.CPU_TRIANGLE)
process.apply()

The example creates a high-aspect-ratio cylindrical opening and runs a diagnostic neutral flux calculation. It reports the bottom transmission probability for the cylinder and contains the corresponding level-set advection setup in the source file.