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()
Related Example
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.
