|
| 1 | +--- |
| 2 | +layout: default |
| 3 | +title: Thermal Oxidation |
| 4 | +parent: Pre-Built Models |
| 5 | +grand_parent: Process Models |
| 6 | +nav_order: 14 |
| 7 | +--- |
| 8 | + |
| 9 | +# Thermal Oxidation |
| 10 | +{: .fs-9 .fw-500} |
| 11 | + |
| 12 | +```c++ |
| 13 | +#include <psOxidation.hpp> |
| 14 | +``` |
| 15 | +--- |
| 16 | + |
| 17 | +`Oxidation` models thermal silicon oxidation using the coupled oxidation solver |
| 18 | +provided by ViennaLS. The model exposes process-level controls such as furnace |
| 19 | +temperature, oxidation time, oxidant species, pressure, and crystal orientation, |
| 20 | +while the underlying solver handles oxidant diffusion, interface motion, and |
| 21 | +oxide deformation. |
| 22 | + |
| 23 | +Unlike most particle- or velocity-field-based process models, `Oxidation` |
| 24 | +manages its own physics. It is applied through the normal `Process` interface, |
| 25 | +but the model internally performs the required coupled diffusion and deformation |
| 26 | +steps. |
| 27 | + |
| 28 | +## Physical Model |
| 29 | + |
| 30 | +The built-in rate constants follow a Deal-Grove style thermal oxidation model. |
| 31 | +The model supports dry oxidation (`O2`) and wet oxidation (`H2O`) and includes |
| 32 | +crystal-orientation-dependent reaction-rate corrections for silicon. |
| 33 | + |
| 34 | +During each internal time step, the solver computes: |
| 35 | + |
| 36 | +* oxidant diffusion through the oxide, |
| 37 | +* reaction at the Si/SiO2 interface, |
| 38 | +* oxide volume expansion, |
| 39 | +* deformation and pressure inside the oxide, and |
| 40 | +* stress feedback on diffusion and reaction rates. |
| 41 | + |
| 42 | +If a Si3N4 mask is present in the material stack, the model activates LOCOS |
| 43 | +physics. In that mode, oxidant transport below the nitride mask, mask bending, |
| 44 | +and constrained oxide expansion produce the characteristic bird's-beak shape. |
| 45 | + |
| 46 | +## Domain Requirements |
| 47 | + |
| 48 | +The domain must contain a silicon material level set, typically `Material::Si` |
| 49 | +or `Material::BulkSi`. If no SiO2 level set is present, the model can create a |
| 50 | +thin native oxide seed internally. |
| 51 | + |
| 52 | +Common material roles are: |
| 53 | + |
| 54 | +| Role | Default material | |
| 55 | +|------|------------------| |
| 56 | +| Silicon | `Material::Si` | |
| 57 | +| Oxide | `Material::SiO2` | |
| 58 | +| LOCOS mask | `Material::Si3N4` | |
| 59 | + |
| 60 | +The material roles can be overridden with `setSiliconMaterial`, |
| 61 | +`setOxideMaterial`, and `setMaskMaterial`. |
| 62 | + |
| 63 | +## Main Parameters |
| 64 | + |
| 65 | +| Method | Description | |
| 66 | +|--------|-------------| |
| 67 | +| `setTemperature(temperatureC)` | Furnace temperature in degrees Celsius. | |
| 68 | +| `setTime(timeHr)` | Total oxidation time in hours. | |
| 69 | +| `setOxidant(oxidant)` | Oxidant species: `OxidantType::Dry` or `OxidantType::Wet`. | |
| 70 | +| `setPressure(pressureAtm)` | Ambient pressure in atm; scales both linear and parabolic rates. | |
| 71 | +| `setOrientation(orientation)` | Silicon orientation: `Si100`, `Si110`, `Si111`, or `PolySi`. | |
| 72 | +| `setTimeStep(dtHr)` | Optional maximum internal time step in hours. The actual step remains CFL-limited. | |
| 73 | +| `setCFLFactor(factor)` | CFL factor for internal interface motion, clamped below 0.5. | |
| 74 | +| `setInitialOxideThickness(thicknessUm)` | Native oxide seed thickness in micrometers if no oxide layer exists. | |
| 75 | +| `setTransferCoefficient(coefficient)` | Gas-transfer coefficient at the oxide/ambient interface. | |
| 76 | +| `setMaxGridPoints(maxGridPoints)` | Caps the Cartesian grid size used by the ViennaLS solves. | |
| 77 | + |
| 78 | +## Stress and Solver Controls |
| 79 | + |
| 80 | +| Method | Description | |
| 81 | +|--------|-------------| |
| 82 | +| `setReactionActivationVolume(volume)` | Stress coupling for the interface reaction rate. | |
| 83 | +| `setDiffusionActivationVolume(volume)` | Stress coupling for oxide diffusivity. | |
| 84 | +| `setCouplingIterations(iterations)` | Maximum outer diffusion-deformation coupling iterations. | |
| 85 | +| `setCouplingTolerance(tolerance)` | Convergence tolerance for the outer coupling loop. | |
| 86 | +| `setMechanicsIterations(iterations)` | Maximum oxide mechanics iterations. | |
| 87 | +| `setPressureIterations(iterations)` | Maximum pressure-solve iterations. | |
| 88 | +| `setStokesIterations(iterations)` | Maximum Stokes velocity iterations. | |
| 89 | +| `setPressureTolerance(tolerance)` | Pressure-solve tolerance. | |
| 90 | +| `setStokesTolerance(tolerance)` | Stokes-solve tolerance. | |
| 91 | +| `setMechanicsTolerance(tolerance)` | Mechanics coupling tolerance. | |
| 92 | +| `setSimpleVelocityRelaxation(alpha)` | SIMPLE velocity relaxation factor. | |
| 93 | +| `setSimplePressureRelaxation(beta)` | SIMPLE pressure relaxation factor. | |
| 94 | +| `setSolveBounds(minIndex, maxIndex)` | Restricts the solve to explicit Cartesian index bounds. | |
| 95 | +| `clearSolveBounds()` | Clears explicit solve bounds. | |
| 96 | + |
| 97 | +## LOCOS Mask Controls |
| 98 | + |
| 99 | +These controls are used when the domain contains the configured mask material, |
| 100 | +by default `Material::Si3N4`. |
| 101 | + |
| 102 | +| Method | Description | |
| 103 | +|--------|-------------| |
| 104 | +| `setMaskMaterial(material)` | Selects the material treated as the oxidation mask. | |
| 105 | +| `setMaskParameters(params)` | Replaces the full ViennaLS mask parameter object. | |
| 106 | +| `setMaskTractionIterations(iterations)` | Maximum mask-traction iterations. | |
| 107 | +| `setMaskTractionTolerance(tolerance)` | Mask-traction convergence tolerance. | |
| 108 | +| `setMaskTractionRelaxation(relaxation)` | Outer mask-traction relaxation factor. | |
| 109 | +| `setMaskContactLoadRelaxation(relaxation)` | Contact-load relaxation factor. | |
| 110 | +| `setMaskContactReleaseFraction(fraction)` | Fraction used for contact release. | |
| 111 | +| `setMaskUnilateralContact(enabled)` | Enables or disables unilateral contact. | |
| 112 | +| `setMaskSmootherOmega(omega)` | Multigrid smoother over-relaxation for mask mechanics. | |
| 113 | +| `setMaskBendingBounds(minIndex, maxIndex)` | Restricts mask bending to explicit bounds. | |
| 114 | +| `clearMaskBendingBounds()` | Clears explicit mask bending bounds. | |
| 115 | +| `setMaskCouplingIterations(iterations)` | Maximum mask/deformation coupling iterations. | |
| 116 | +| `setMaskCouplingTolerance(tolerance)` | Mask/deformation coupling tolerance. | |
| 117 | + |
| 118 | +## GPU Controls |
| 119 | + |
| 120 | +The default solver mode is CPU. GPU acceleration is available when ViennaLS was |
| 121 | +built with GPU support. |
| 122 | + |
| 123 | +| Method | Description | |
| 124 | +|--------|-------------| |
| 125 | +| `setGpuMode(mode)` | Selects `GpuMode::Cpu` or `GpuMode::Gpu`. | |
| 126 | +| `setGpuPreconditioner(preconditioner)` | Selects the GPU BiCGSTAB preconditioner, such as Jacobi or ILU0. | |
| 127 | + |
| 128 | +## Output Helpers |
| 129 | + |
| 130 | +| Method | Description | |
| 131 | +|--------|-------------| |
| 132 | +| `estimatePlanarOxideThickness(initialOxideThickness)` | Returns the planar Deal-Grove oxide thickness estimate for the current settings. | |
| 133 | +| `saveSurfaceMesh(domain, fileName)` | Writes a wrapped surface mesh without mutating the active simulation state. | |
| 134 | +| `saveVolumeMesh(domain, baseName)` | Writes a wrapped volume mesh and associated oxide-field output. | |
| 135 | + |
| 136 | +## Example Usage |
| 137 | + |
| 138 | +<details markdown="1"> |
| 139 | +<summary markdown="1"> |
| 140 | +C++ |
| 141 | +{: .label .label-blue} |
| 142 | +</summary> |
| 143 | +```c++ |
| 144 | +using namespace viennaps; |
| 145 | + |
| 146 | +auto model = SmartPointer<Oxidation<double, 2>>::New(); |
| 147 | +model->setTemperature(1000.0); |
| 148 | +model->setTime(0.2); |
| 149 | +model->setOxidant(OxidantType::Wet); |
| 150 | +model->setPressure(1.0); |
| 151 | +model->setOrientation(SiliconOrientation::Si100); |
| 152 | +model->setMaxGridPoints(5000000); |
| 153 | + |
| 154 | +Process<double, 2>(domain, model).apply(); |
| 155 | +``` |
| 156 | +</details> |
| 157 | +
|
| 158 | +<details markdown="1"> |
| 159 | +<summary markdown="1"> |
| 160 | +Python |
| 161 | +{: .label .label-green} |
| 162 | +</summary> |
| 163 | +```python |
| 164 | +import viennaps as vps |
| 165 | +
|
| 166 | +model = vps.Oxidation() |
| 167 | +model.setTemperature(1000.0) |
| 168 | +model.setTime(0.2) |
| 169 | +model.setOxidant(vps.OxidantType.Wet) |
| 170 | +model.setPressure(1.0) |
| 171 | +model.setOrientation(vps.SiliconOrientation.Si100) |
| 172 | +model.setMaxGridPoints(5_000_000) |
| 173 | +
|
| 174 | +vps.Process(domain, model).apply() |
| 175 | +``` |
| 176 | +</details> |
| 177 | + |
| 178 | +## Practical Notes |
| 179 | + |
| 180 | +* Use smaller `gridDelta` values for production results, but keep in mind that |
| 181 | + the diffusion/deformation grid scales strongly with dimension. |
| 182 | +* `setTimeStep` is an upper bound. The accepted internal step is still limited |
| 183 | + by the CFL condition. |
| 184 | +* LOCOS simulations need enough vertical space above the mask and oxide so that |
| 185 | + the growing oxide and bent mask are not clipped by the domain bounds. |
| 186 | +* In narrow or confined geometries, stress feedback can strongly reduce the |
| 187 | + local reaction rate. Inspect pressure and stress fields in the oxide-field |
| 188 | + output to understand growth suppression. |
| 189 | + |
| 190 | +## Related Examples |
| 191 | + |
| 192 | +* [Step Oxidation](https://github.com/ViennaTools/ViennaPS/tree/master/examples/stepOxidation) |
| 193 | +* [Fin Oxidation](https://github.com/ViennaTools/ViennaPS/tree/master/examples/finOxidation) |
| 194 | +* [Trench Oxidation](https://github.com/ViennaTools/ViennaPS/tree/master/examples/trenchOxidation) |
| 195 | +* [LOCOS Oxidation](https://github.com/ViennaTools/ViennaPS/tree/master/examples/locosOxidation) |
0 commit comments