Skip to content

Add oxidation solver with coupled diffusion, deformation, and GPU acceleration - #154

Merged
FilipovicLado merged 67 commits into
masterfrom
oxidation
Jun 16, 2026
Merged

FilipovicLado merged 67 commits into
masterfrom
oxidation

Conversation

@FilipovicLado

Copy link
Copy Markdown
Member

Adds a physics-based silicon oxidation model targeting LOCOS (Local Oxidation of Silicon) and fin-/step-/trench-oxidation geometries. The solver tightly couples oxidant diffusion, oxide viscous flow (Stokes), and nitride mask bending/creep into a single iterative loop.

New headers (include/viennals/):

  • lsOxidation.hpp: top-level entry point; wires up the coupled solver

  • lsOxidationDiffusion.hpp: FEM diffusion solver (Deal.II back-end)

  • lsOxidationDeformation.hpp: Stokes flow for oxide viscous deformation

  • lsOxidationMask.hpp: nitride mask bending and Arrhenius creep

  • lsOxidationModel.hpp: SIMPLE-iteration coupling loop

  • lsOxidationSolverBase.hpp: shared base for all sub-solvers

  • lsOxidationPresets.hpp: material presets for common oxidation conditions

  • lsOxidationBiCGSTAB.cuh / lsOxidationBiCGSTABInterface.hpp: GPU BiCGSTAB linear solver (CUDA Runtime; no OptiX dependency)

  • GPU back-end (gpu/):

  • lsOxidationBiCGSTABKernels.cu: CUDA kernels; enabled via VIENNALS_USE_GPU; falls back to CPU when unavailable

Physics highlights:

  • Deal.II FEM for O2/H2O diffusion with concentration-dependent boundary conditions
  • Stokes-equation viscous flow for oxide growth and volumetric expansion
  • Two-way traction coupling at the mask-oxide contact (Neumann BC on mask, reaction force fed back to oxide)
  • SIMPLE iteration for outer coupling (unconditionally stable)
  • CFL-limited advection with cross-step warm starts for efficiency
  • Dry and wet oxidation; Si⟨100⟩, ⟨110⟩, ⟨111⟩, and poly-Si orientation ratios
  • Python bindings updated for all new classes; typed stubs included.

Tests added for OxidationModel (regression) and OxidationConvergence (grid-refinement order check).
Documentation: docs/OxidationSolver.md covers the governing equations and solver parameters.

@tobre1

tobre1 commented Jun 15, 2026

Copy link
Copy Markdown
Member

The LOCOS example doesn't seem to work out of the box for me. I get the following error thrown:

    LOCOS: starting time step, requested_dt=0.350000 hr
    DEBUG: LOCOS: solving coupled diffusion/deformation field for dt=0.350000 hr
    DEBUG: OxidationModel: coupling iteration 1/8 starting diffusion solve
    OxidationDiffusion: using CPU BiCGSTAB for diffusion solve (nodes=563, GPU mode not selected).
    diffusion n=563 iters=29 res=0.000336 [CPU] CPU BiCGSTAB took: 0.005837 s 
    diffusion n=563 [CPU] diag/b precompute took: 0.000102 s 
    DEBUG: OxidationModel: diffusion solve complete, nodes=563, iterations=29, residual=0.000336
    DEBUG: OxidationModel: coupling iteration 1/8 starting deformation solve
            mechanics[0] stokes   iters=41/100 res=0.000000 took: 0.068182 s 
        mechanics[0] pressure iters=34/500 res=0.000000 coupling=1.000000 took: 0.010382 s 
            mechanics[1] stokes   iters=50/100 res=0.000000 took: 0.079645 s 
        mechanics[1] pressure iters=35/500 res=0.000001 coupling=0.908977 took: 0.011208 s 
    WARNING: solveMechanics: did not converge after 2 iterations (residual=0.908977, tolerance=0.000000)
          deformation n=563 harmonic took: 0.061264 s 
      deformation n=563 mechanics-total took: 0.181244 s 
    DEBUG: OxidationModel: deformation solve complete, nodes=563, iterations=40, residual=0.908977
    WARNING: OxidationModel: deformation solve failed (mechanics=0.908977, pressure=0.000001, stokes=0.000000).
      coupled(iter=1) took: 0.261665 s 
    DEBUG: LOCOS: coupled diffusion/deformation solve complete
terminate called after throwing an instance of 'std::runtime_error'
  what():  LOCOS: coupled solve failed (deformation solve failed (mechanics=0.908977, pressure=0.000001, stokes=0.000000)).

@FilipovicLado

Copy link
Copy Markdown
Member Author

The LOCOS example doesn't seem to work out of the box for me.

Sorry, missed updating the LOCOS example in ViennaLS because I was using the example in ViennaPS for testing and development. The example has been updated, along with python bindings and a python version of the example.

@tobre1 tobre1 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I modified the parameter interface a bit, so you'll have to probably also adjust it in ViennaPS

@FilipovicLado
FilipovicLado merged commit 4ed72f9 into master Jun 16, 2026
14 checks passed
@FilipovicLado
FilipovicLado deleted the oxidation branch July 26, 2026 21:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants