Physics::CVD — Chemical Vapor Deposition Simulation Framework
A Perl library for simulating Chemical Vapor Deposition (CVD) processes, including gas-phase chemistry, surface kinetics, mass transport, and film growth modeling.
Features
- Gas-phase chemistry — Arrhenius kinetics, reaction networks, precursor decomposition
- Surface KMC — Multi-species deposition-centric Kinetic Monte Carlo for film growth
- Reactor modeling — LPCVD/PECVD/MOCVD geometry, flow, Reynolds/Knudsen numbers
- Mass transport — Boundary layer, Knudsen diffusion, feature-scale step coverage
- Film analysis — Thickness, roughness, density, composition profiles, stoichiometry
- Interface: OpenFOAM — reactingFoam case generation for reactor-scale CFD
- Interface: LAMMPS — ReaxFF scripts for surface reaction MD
- Interface: Cantera — YAML mechanism files and Python reactor scripts
Installation
cd Physics-CVD
perl Makefile.PL
make
make test
make install # optional, installs system-wide
Optional Dependencies
| Package | Purpose | Install |
|---------|---------|---------|
| OpenFOAM | Reactor-scale CFD | sudo apt install openfoam |
| LAMMPS | Surface reaction MD | sudo apt install lammps |
| Cantera | Detailed chemistry | pip install cantera |
| PDL | Numerical arrays | cpanm PDL |
| PDL::Graphics::Gnuplot | Plotting | cpanm PDL::Graphics::Gnuplot |
Quick Start
use Physics::CVD;
my $cvd = Physics::CVD->new(
temperature => 953, # K (680°C)
pressure => 40, # Pa
);
# Gas-phase chemistry
my $chem = $cvd->chemistry;
$chem->add_species(name => 'TEOS', mass => 208, concentration => 1e16);
$chem->add_gas_reaction(
reactants => ['TEOS'], products => ['SiO2_g'],
A => 1e15, Ea => 2.9,
);
# Surface growth simulation
my $kmc = $cvd->kmc(lattice_size => [30, 30, 15]);
$kmc->add_species(name => 'Si', sticking_coeff => 0.04,
partial_pressure => 4.0, diffusion_barrier => 0.8);
$kmc->deposit(steps => 1000);
# Analysis
my $film = $kmc->get_film;
printf "Thickness: %.2f nm\n", $film->thickness;
printf "Roughness: %.3f nm\n", $film->roughness;
API Reference
Physics::CVD (main module)
| Method | Description |
|--------|-------------|
| new(%opts) | Create CVD simulation (temperature, pressure, verbose) |
| chemistry(%opts) | Create Chemistry engine |
| kmc(%opts) | Create surface KMC engine |
| reactor(%opts) | Create Reactor model |
| transport(%opts) | Create Transport model |
| film(%opts) | Create Film analysis object |
| interface($name, %opts) | Load interface (openfoam, lammps, cantera) |
Physics::CVD::Chemistry
| Method | Description |
|--------|-------------|
| add_species(%spec) | Add gas/surface species (name, mass, concentration) |
| add_gas_reaction(%rxn) | Add gas-phase reaction (Arrhenius: A, Ea) |
| add_surface_reaction(%rxn) | Add surface reaction (LH or ER mechanism) |
| rate_constant(%opts) | Compute k = A×exp(-Ea/kT) |
| gas_rates() | Compute all gas-phase reaction rates |
| surface_rates(%opts) | Compute surface reaction rates given coverages |
| impingement_flux(%opts) | Hertz-Knudsen flux (molecules/cm²/s) |
| sticking_coefficient(%opts) | Temperature-dependent S(T) |
| evolve(%opts) | Integrate chemistry over time (Euler) |
| growth_rate(%opts) | Estimate deposition rate (nm/min) |
Physics::CVD::KMC
| Method | Description |
|--------|-------------|
| new(%opts) | Create KMC engine (lattice_size, lattice_const, temperature) |
| add_species(%spec) | Add depositing species (sticking, barriers, pressure) |
| add_surface_reaction(%rxn) | Add co-adsorbed species reaction |
| deposit(%opts) | Run deposition (steps or time) |
| run(%opts) | Run KMC steps directly |
| get_film() | Extract Film object from lattice |
| coverage() | Fraction of surface sites occupied |
| stats() | Simulation statistics |
Physics::CVD::Reactor
| Method | Description |
|--------|-------------|
| new(%opts) | Create reactor (type, geometry, flow) |
| gas_velocity() | Mean gas velocity (m/s) |
| residence_time() | Gas residence time (s) |
| reynolds_number() | Re for flow characterization |
| knudsen_number() | Kn for flow regime |
| mean_free_path() | λ in meters |
| diffusivity(%opts) | Binary Chapman-Enskog D₁₂ (cm²/s) |
| damkohler_number(%opts) | Da = reaction/transport rate ratio |
| step_coverage(%opts) | Conformality from Thiele modulus |
Physics::CVD::Transport
| Method | Description |
|--------|-------------|
| new(%opts) | Create transport model (feature geometry) |
| knudsen_diffusivity(%opts) | D_Kn in features (cm²/s) |
| effective_diffusivity(%opts) | Bosanquet D_eff (cm²/s) |
| step_coverage(%opts) | Bottom/top rate ratio |
| conformality_profile(%opts) | Flux vs depth in feature |
| boundary_layer_thickness(%opts) | δ (cm) |
| mass_transfer_coeff(%opts) | h_m (cm/s) |
| wafer_uniformity(%opts) | Radial rate profile |
| regime(%opts) | Reaction-limited vs transport-limited |
Physics::CVD::Film
| Method | Description |
|--------|-------------|
| thickness() | Average film thickness (nm) |
| roughness() | RMS roughness (nm) |
| density() | Fraction of occupied sites |
| porosity() | 1 - density |
| composition() | Species counts and fractions |
| composition_profile(%opts) | Depth-resolved composition |
| stoichiometry($A, $B) | Atomic ratio A:B |
| export_xyz($file) | Export to XYZ format |
| export_lammps_data($file) | Export to LAMMPS data |
Physics::CVD::Interface::OpenFOAM
| Method | Description |
|--------|-------------|
| generate_case(%opts) | Create full OpenFOAM case directory |
| run(%opts) | Execute OpenFOAM solver |
Physics::CVD::Interface::LAMMPS
| Method | Description |
|--------|-------------|
| generate_surface_reaction(%opts) | ReaxFF CVD reaction script |
| generate_stress_analysis(%opts) | Film stress calculation script |
| run(%opts) | Execute LAMMPS |
| parse_log($file) | Parse thermo output |
Physics::CVD::Interface::Cantera
| Method | Description |
|--------|-------------|
| generate_sio2_mechanism() | TEOS/O₂ → SiO₂ YAML |
| generate_si3n4_mechanism() | DCS/NH₃ → Si₃N₄ YAML |
| generate_reactor_script(%opts) | Python Cantera reactor script |
Examples
cd examples/
perl -I../lib sio2_teos.pl # TEOS CVD SiO₂
perl -I../lib si3n4_lpcvd.pl # DCS+NH₃ LPCVD Si₃N₄
Physical Models
Gas-Phase Chemistry
- Arrhenius kinetics: k = A × exp(-Ea/kT)
- Hertz-Knudsen impingement: Φ = P / √(2πmkT)
- Binary diffusion: Chapman-Enskog with collision integrals
Surface Kinetics
- Langmuir-Hinshelwood: rate ∝ θ_A × θ_B × k(T)
- Eley-Rideal: rate ∝ P_gas × θ_surface × S(T)
- Sticking coefficient: S(T) = S₀ × exp(-Ea/kT)
Mass Transport
- Knudsen diffusion: D_Kn = (w/3)√(8kT/πm)
- Bosanquet interpolation: 1/D_eff = 1/D_bulk + 1/D_Kn
- Step coverage: SC = 1/(1 + φ²/6) where φ = AR×√(S/(2-S))
- Boundary layer: δ = √(DL/v)
Reactor Physics
- Reynolds number: Re = ρvD/μ
- Knudsen number: Kn = λ/L
- Damköhler number: Da = k_s×L/D (reaction vs transport)
- Thiele modulus: φ = L×√(k_s/D)
CVD Process Reference
| Process | Precursors | T (°C) | P (Pa) | Rate (nm/min) | |---------|-----------|--------|--------|----------------| | TEOS SiO₂ | TEOS + O₂ | 680 | 40 | 10-30 | | PE-SiO₂ | SiH₄ + N₂O | 350 | 300 | 50-200 | | LP-Si₃N₄ | DCS + NH₃ | 780 | 25 | 3-5 | | PE-SiNₓ | SiH₄ + NH₃ | 350 | 200 | 10-50 | | Poly-Si | SiH₄ | 620 | 30 | 10-20 | | W-CVD | WF₆ + SiH₄ | 400 | 5000 | 100-300 |
License
This module is free software; you can redistribute it under the same terms as Perl itself.