NAME

Physics::CVD - Chemical Vapor Deposition simulation framework in Perl

SYNOPSIS

use Physics::CVD;

my $cvd = Physics::CVD->new(
    temperature => 700,    # K
    pressure    => 66.5,   # Pa (500 mTorr)
);

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,
);

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);

my $film = $kmc->get_film;
printf "Thickness: %.2f nm\n", $film->thickness;
printf "Roughness: %.3f nm\n", $film->roughness;

DESCRIPTION

Physics::CVD is a Perl library for simulating Chemical Vapor Deposition (CVD) processes. It ties together gas-phase chemistry, surface Kinetic Monte Carlo (KMC) growth, reactor-scale transport, mass-transport models, film analysis, and interfaces to external simulation tools.

The intended workflow is:

1. Create a Physics::CVD instance with reactor conditions.
2. Build a chemistry network with chemistry().
3. Model reactor flow and transport with reactor() and transport().
4. Run atomistic film growth with kmc() and analyze with get_film().
5. Export cases to OpenFOAM, LAMMPS, or Cantera via interface().

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.

  • Interfaces — OpenFOAM (reactingFoam cases), LAMMPS (ReaxFF/Tersoff), Cantera (YAML mechanisms and Python reactors).

CONSTRUCTOR

new(%opts)

Create a new CVD simulation object. The temperature and pressure are propagated to the factory methods unless overridden.

Options:

temperature

Process temperature in Kelvin (default: 700 K).

pressure

Process pressure in Pascals (default: 100 Pa, typical of LPCVD).

verbose

Verbosity level 0/1 (default: 0).

FACTORY METHODS

chemistry(%opts)

Return a Physics::CVD::Chemistry engine. Inherits temperature, pressure, and verbose from the main object.

kmc(%opts)

Return a Physics::CVD::KMC surface-growth engine. Inherits temperature, pressure, and verbose. Common options: lattice_size, lattice_const, attempt_freq.

reactor(%opts)

Return a Physics::CVD::Reactor model. Inherits temperature, pressure, and verbose. Common options: type, length, diameter, gap, wafer_diameter, total_flow, carrier_gas, gases.

transport(%opts)

Return a Physics::CVD::Transport model. Inherits temperature, pressure, and verbose. Common options: feature_type, aspect_ratio, feature_width.

film(%opts)

Return a standalone Physics::CVD::Film analysis object.

interface($name, %opts)

Load an external-tool interface. $name must be one of:

openfoamPhysics::CVD::Interface::OpenFOAM
lammpsPhysics::CVD::Interface::LAMMPS
canteraPhysics::CVD::Interface::Cantera

methods()

Return an arrayref of factory method names: reactor, chemistry, transport, kmc, film.

interfaces()

Return an arrayref of available interface names: openfoam, lammps, cantera.

API REFERENCE

Physics::CVD::Chemistry

Chemical kinetics engine for gas-phase and surface reactions.

add_species(%spec)

Register a species with keys such as name, mass, formula, type, and concentration.

add_gas_reaction(%rxn)

Add an Arrhenius gas reaction. Keys: name, reactants, products, A, Ea, order.

add_surface_reaction(%rxn)

Add a surface reaction (Langmuir-Hinshelwood or Eley-Rideal). Keys include mechanism, sticking_coeff, Ea, A.

rate_constant(%opts)

Compute k = A exp(-Ea / kT).

gas_rates()

Compute gas-phase rates from current concentrations.

surface_rates(%opts)

Compute surface reaction rates for supplied coverages.

impingement_flux(%opts)

Hertz-Knudsen flux in molecules/cm2/s.

sticking_coefficient(%opts)

Temperature-dependent sticking coefficient.

evolve(%opts)

Integrate gas chemistry forward in time with simple Euler integration.

growth_rate(%opts)

Estimate deposition rate in nm/min from impingement flux, sticking coefficient, and film density.

set_concentration($species, $conc) / get_concentration($species) / concentrations()

Concentration accessors.

stats()

Return counts of species and reactions plus current state.

Physics::CVD::KMC

Deposition-centric Kinetic Monte Carlo engine.

new(%opts)

Constructor options include lattice_size (default [30,30,20]), lattice_const (default 3.0 Å), attempt_freq (default 1e13 s-1), temperature, pressure, and verbose.

add_species(%spec)

Register a depositing species with sticking_coeff, diffusion/desorption/ decomposition barriers, partial_pressure, and flags such as is_precursor.

add_surface_reaction(%rxn)

Add a co-adsorbed surface reaction between species.

deposit(%opts)

Estimate deposition steps from impingement flux and run the KMC.

run(%opts)

Execute the deposition-centric BKL loop (adsorption, diffusion, decomposition, reaction).

get_film()

Return a Physics::CVD::Film object built from the lattice state.

coverage()

Fraction of surface sites currently occupied.

stats()

Return simulation time, steps, deposited atoms, coverage, and event counts.

Physics::CVD::Reactor

Reactor-scale flow and transport diagnostics.

new(%opts)

Constructor options: type (default lpcvd_tube), length, diameter, gap, wafer_diameter, total_flow, carrier_gas, gases, plus temperature, pressure, and verbose.

gas_velocity()

Mean gas velocity in m/s.

residence_time()

Gas residence time in seconds.

reynolds_number()

Reynolds number based on carrier-gas properties.

gas_density() / gas_viscosity()

Ideal-gas density and Sutherland viscosity.

mean_free_path()

Gas mean free path in meters.

knudsen_number()

lambda / characteristic_length.

damkohler_number(%opts)

Da = surface_rate * L / D, the reaction-to-transport ratio.

diffusivity(%opts)

Chapman-Enskog binary diffusivity in cm2/s.

thiele_modulus(%opts) / step_coverage(%opts)

Feature-scale Thiele modulus and trench step coverage.

summary()

Hash of reactor flow/transport diagnostics.

Physics::CVD::Transport

Feature-scale mass-transport model.

new(%opts)

Options: feature_type (default trench), aspect_ratio, feature_width, plus temperature, pressure, verbose.

knudsen_diffusivity(%opts)

Knudsen diffusivity inside a feature in cm2/s.

effective_diffusivity(%opts)

Bosanquet interpolation: 1/D_eff = 1/D_bulk + 1/D_Kn.

step_coverage(%opts)

Analytical step coverage estimate from sticking coefficient and aspect ratio.

conformality_profile(%opts)

Relative flux versus depth inside a feature.

boundary_layer_thickness(%opts)

Stagnation-flow boundary-layer thickness in cm.

mass_transfer_coeff(%opts)

h_m = D / delta in cm/s.

wafer_uniformity(%opts)

Normalized radial deposition-rate profile across a wafer.

regime(%opts)

Classify the regime as reaction-limited, transport-limited, or mixed.

stats()

Return feature parameters plus computed Knudsen diffusivity and step coverage.

Physics::CVD::Film

Analysis object for a deposited film.

thickness()

Average film thickness in nm.

roughness()

RMS surface roughness in nm.

density() / porosity()

Fraction of occupied sites and 1 - density.

composition()

Species counts and fractions over the whole film.

composition_profile(%opts)

Depth-resolved composition bins.

stoichiometry($A, $B)

Atomic ratio A:B.

export_xyz($file)

Export film to XYZ format; returns atom count.

export_lammps_data($file)

Export film to LAMMPS data format; returns atom count.

Interfaces

Physics::CVD::Interface::OpenFOAM

generate_case(%opts)

Create a complete reactingFoam case directory.

run(%opts)

Run blockMesh and the selected solver, serial or MPI.

Physics::CVD::Interface::LAMMPS

generate_surface_reaction(%opts)

Write a ReaxFF CVD deposition input script.

generate_stress_analysis(%opts)

Write a Tersoff NPT stress-relaxation script.

run(%opts)

Execute LAMMPS serial or MPI run.

parse_log($file)

Parse thermodynamic output rows into an array of hashes.

Physics::CVD::Interface::Cantera

generate_sio2_mechanism(%opts)

Write sio2_cvd.yaml for TEOS/O2 to SiO2.

generate_si3n4_mechanism(%opts)

Write si3n4_cvd.yaml for DCS+NH3 LPCVD Si3N4.

generate_reactor_script(%opts)

Write an executable Python/Cantera reactor script.

PHYSICAL MODELS

Gas-Phase Chemistry

Arrhenius kinetics: k = A exp(-Ea / kT)
Hertz-Knudsen impingement: Phi = P / sqrt(2 pi m kT)
Binary diffusion: Chapman-Enskog with collision integrals

Surface Kinetics

Langmuir-Hinshelwood: rate proportional to theta_A theta_B k(T)
Eley-Rideal: rate proportional to P_gas theta_surface S(T)
Sticking coefficient: S(T) = S0 exp(-Ea / kT)

Mass Transport

Knudsen diffusion: D_Kn = (w / 3) sqrt(8 kT / pi m)
Bosanquet interpolation: 1 / D_eff = 1 / D_bulk + 1 / D_Kn
Step coverage: SC = 1 / (1 + phi^2 / 6) where phi = AR sqrt(S / (2 - S))
Boundary layer: delta = sqrt(D L / v)

Reactor Physics

Reynolds number: Re = rho v D / mu
Knudsen number: Kn = lambda / L
Damköhler number: Da = k_s L / D (reaction vs transport)
Thiele modulus: phi = L sqrt(k_s / D)

CVD PROCESS REFERENCE

Typical process windows used by the built-in examples:

Process        Precursors      T (C)    P (Pa)    Rate (nm/min)
--------------------------------------------------------------
TEOS SiO2      TEOS + O2       680      40        10-30
PE-SiO2        SiH4 + N2O      350      300       50-200
LP-Si3N4       DCS + NH3       780      25        3-5
PE-SiNx        SiH4 + NH3      350      200       10-50
Poly-Si        SiH4            620      30        10-20
W-CVD          WF6 + SiH4      400      5000      100-300

EXAMPLES

Run the bundled examples from the examples/ directory:

cd examples
perl -I../lib sio2_teos.pl    # TEOS CVD SiO2
perl -I../lib si3n4_lpcvd.pl  # DCS + NH3 LPCVD Si3N4

INSTALLATION

cd Physics-CVD
perl Makefile.PL
make
make test
make install    # optional, installs system-wide

Optional dependencies:

OpenFOAM  -> sudo apt install openfoam
LAMMPS    -> sudo apt install lammps
Cantera   -> pip install cantera
PDL       -> cpanm PDL
PDL::Graphics::Gnuplot -> cpanm PDL::Graphics::Gnuplot

LICENSE

This module is free software; you can redistribute it under the same terms as Perl itself.

SEE ALSO

Physics::CVD::Chemistry
Physics::CVD::KMC
Physics::CVD::Reactor
Physics::CVD::Transport
Physics::CVD::Film
Physics::CVD::Interface::OpenFOAM
Physics::CVD::Interface::LAMMPS
Physics::CVD::Interface::Cantera

1 POD Error

The following errors were encountered while parsing the POD:

Around line 145:

Non-ASCII character seen before =encoding in '—'. Assuming UTF-8