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

Installation

git clone https://github.com/jtrujil43/Physics-Lithography.git
cd Physics-Lithography
perl Makefile.PL
make
make test

Dependencies

Required (core Perl):

Optional (for interface modules):

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

License

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

Author

Jovan Trujillo