Physics::Lithography
A Perl library for simulating Laser Direct Imprint Lithography (LDIL), including thermal modeling, ablation, phase change, pattern transfer fidelity, and Laser-Induced Forward Transfer (LIFT).
Features
- Laser characterization — Gaussian/flat-top/ring beam profiles, temporal pulse shapes, Beer-Lambert absorption, thermal confinement regime detection
- 2D thermal solver — Explicit finite-difference in cylindrical (r,z) coordinates with material database (PMMA, SU-8, polyimide, silicon, gold, copper)
- Ablation modeling — Logarithmic blow-off model, multi-pulse incubation, crater geometry, volume removal rate, ablation efficiency
- Phase change — Melt pool analysis, resolidification time (Stefan number), HAZ depth, enthalpy method
- Pattern transfer — Minimum feature size prediction, edge acuity, aspect ratio limits, process window mapping, scan parameters
- LIFT — Vapor recoil pressure, jetting threshold, droplet diameter, transfer regime classification, Weber/Reynolds numbers
- Interface modules — OpenFOAM (interFoam for melt dynamics), LAMMPS (TTM + MD for ultrafast ablation)
Installation
git clone https://github.com/jtrujil43/Physics-Lithography.git
cd Physics-Lithography
perl Makefile.PL
make
make test
Dependencies
Required (core Perl):
Carp,List::Util,File::Path(all included with Perl)
Optional (for interface modules):
- OpenFOAM —
apt install openfoam(Ubuntu) for melt pool CFD - LAMMPS —
apt install lammpsfor molecular dynamics of laser-matter interaction
Quick Start
use Physics::Lithography;
my $litho = Physics::Lithography->new(verbose => 1);
# Create a laser source
my $laser = $litho->laser(
wavelength => 355e-9, # 355 nm (UV)
pulse_width => 10e-9, # 10 ns
fluence => 0.5, # J/cm²
spot_size => 5e-6, # 5 µm (1/e² radius)
);
# Solve heat equation
my $thermal = $litho->thermal(material => 'pmma');
$thermal->solve(laser => $laser, time => 100e-9);
printf "Peak T: %.0f K\n", $thermal->T_max;
# Calculate ablation depth
my $abl = $litho->ablation(alpha => 1e5, F_threshold => 0.1);
printf "Depth: %.0f nm\n", $abl->ablation_depth(fluence => 0.5) * 1e9;
API Reference
Physics::Lithography (main module)
Factory class providing access to all sub-modules:
| Method | Returns | Description |
|--------|---------|-------------|
| laser(%opts) | Laser object | Beam/pulse characterization |
| thermal(%opts) | Thermal solver | 2D heat equation |
| ablation(%opts) | Ablation model | Depth/crater prediction |
| phase_change(%opts) | PhaseChange | Melt pool analysis |
| pattern(%opts) | Pattern | Feature transfer fidelity |
| lift(%opts) | LIFT | Forward transfer model |
| interface($name, %opts) | Interface | OpenFOAM/LAMMPS bridge |
Physics::Lithography::Laser
my $laser = Physics::Lithography::Laser->new(
wavelength => 355e-9,
pulse_width => 10e-9,
fluence => 0.5, # J/cm²
spot_size => 5e-6, # m
profile => 'gaussian', # gaussian|flat_top|ring
temporal => 'gaussian', # gaussian|square
rep_rate => 1000, # Hz
);
$laser->peak_intensity; # W/cm²
$laser->pulse_energy; # J
$laser->spatial_profile($r); # normalized I(r)
$laser->temporal_profile($t); # normalized I(t)
$laser->absorption_profile($z); # Beer-Lambert I(z)
$laser->thermal_diffusion_length($kappa); # m
$laser->is_thermal_confinement($kappa, $alpha); # 1 or 0
$laser->summary; # hashref of all parameters
Physics::Lithography::Thermal
my $thermal = Physics::Lithography::Thermal->new(
material => 'pmma', # pmma|su8|polyimide|silicon|gold|copper
n_r => 50, # radial grid points
n_z => 50, # axial grid points
domain_r => 20e-6, # radial domain (m)
domain_z => 10e-6, # axial domain (m)
);
$thermal->solve(laser => $laser, time => 100e-9);
$thermal->T_max; # peak temperature (K)
$thermal->surface_temperature; # array ref of T(r, z=0)
$thermal->melt_radius; # m (or undef if no melt)
$thermal->melt_depth; # m (or undef)
$thermal->decomposition_depth; # m (polymer only)
$thermal->field; # 2D array ref T[r][z]
Physics::Lithography::Ablation
my $abl = Physics::Lithography::Ablation->new(
alpha => 1e5, # effective absorption (1/m)
F_threshold => 0.1, # J/cm²
incubation_S => 0.85, # incubation coefficient
);
$abl->ablation_depth(fluence => 0.5); # m
$abl->multi_pulse_depth(fluence => 0.3, pulses => 10); # m
$abl->threshold_with_incubation(N => 50, S => 0.85); # J/cm²
$abl->crater_profile(fluence => 0.5, spot_size => 5e-6); # hashref
$abl->volume_per_pulse(fluence => 0.5, spot_size => 5e-6); # m³
$abl->ablation_rate_curve(F_min => 0.01, F_max => 5.0); # array
$abl->calculate_threshold(density => 1200, cp => 1200); # J/cm²
$abl->efficiency(fluence => 0.5, spot_size => 5e-6); # kg/J
Physics::Lithography::PhaseChange
my $pc = Physics::Lithography::PhaseChange->new(
T_melt => 600, # K (or material default)
L_fusion => 2.5e5, # J/kg
density => 1200,
cp => 1200,
);
$pc->analyze_melt_pool(thermal => $thermal); # sets melt_pool
$pc->resolidification_time; # s (Stefan problem)
$pc->cooling_rate; # K/s
$pc->haz_depth; # m
$pc->enthalpy($T); # J/kg
$pc->phase_at($T); # 'solid'|'mushy'|'liquid'
Physics::Lithography::Pattern
my $pat = Physics::Lithography::Pattern->new();
$pat->minimum_feature_size(
spot_size => 5e-6, diffusivity => 1e-7, pulse_width => 10e-9
); # hashref with thermal_limit_nm, optical_limit_nm, minimum_nm
$pat->edge_acuity(diffusivity => 1e-7, pulse_width => 10e-9, alpha => 1e6);
$pat->max_aspect_ratio(fluence => 1.0, F_threshold => 0.1, ...);
$pat->process_window(F_min => 0.05, F_max => 2.0, ...); # array of points
$pat->scan_parameters(spot_size => 5e-6, overlap => 0.5, rep_rate => 1e5);
$pat->line_pattern(fluence => 0.5, spot_size => 5e-6, overlap => 0.5);
$pat->resolution_comparison(diffusivity => 1e-7); # compare pulse widths
Physics::Lithography::LIFT
my $lift = Physics::Lithography::LIFT->new(
film_thickness => 100e-9, # donor film
density => 19300, # kg/m³
T_melt => 1337,
T_boil => 3129,
L_vaporize => 1.74e6,
surface_tension => 1.14,
alpha => 7e7,
reflectivity => 0.37,
gap => 50e-6,
);
$lift->transfer_threshold; # J/cm²
$lift->transfer_regime(fluence => 0.5); # no_transfer|sub_threshold|jetting|spray|explosive
$lift->recoil_pressure(fluence => 0.5, pulse_width => 10e-9); # Pa
$lift->jet_velocity(...); # m/s
$lift->droplet_diameter(fluence => 0.5, spot_size => 5e-6); # m
$lift->weber_number(...);
$lift->reynolds_number(...);
$lift->flight_time(...); # s
$lift->fluence_sweep(F_min => 0.01, F_max => 5.0, points => 30);
Interface Modules
# OpenFOAM: generate interFoam case for melt pool dynamics
my $of = $litho->interface('openfoam', case_dir => './melt_case');
$of->generate_case(dt => 1e-10, end_time => 1e-6);
# LAMMPS: generate TTM-MD script for ultrafast ablation
my $lmp = $litho->interface('lammps', output_dir => './laser_md');
$lmp->generate_script(material => 'gold', fluence => 0.5, pulse_fs => 100);
Examples
Thermal Imprint (examples/thermal_imprint.pl)
Demonstrates resolution analysis, thermal simulation, ablation depth vs fluence, multi-pulse incubation, and scanning parameters.
perl -Ilib examples/thermal_imprint.pl
LIFT Printing (examples/lift_gold.pl)
Characterizes LIFT transfer regimes for gold donor film, including threshold determination, fluence sweep, droplet sizing, and film thickness effects.
perl -Ilib examples/lift_gold.pl
Physics Background
Logarithmic Blow-Off Model
Ablation depth follows Beer-Lambert absorption:
d = (1/α) × ln(F/F_th)
Multi-Pulse Incubation
Threshold decreases with accumulated pulses:
F_th(N) = F_th(1) × N^(S-1), S < 1
Thermal Confinement
When pulse width τ < 1/(α² × κ), heat doesn't diffuse during the pulse, enabling sharp features.
LIFT Transfer Regimes
- Sub-threshold: Incomplete film release
- Jetting: Clean single-droplet transfer (optimal)
- Spray: Multiple satellite droplets
- Explosive: Plasma-assisted, poor resolution
License
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Author
Jovan Trujillo