Ion Implantation

#include <models/psIonImplantation.hpp>

IonImplantation deposits an analytical dopant profile and optional damage profile into the domain’s cell set. It supports beam tilt, masking, screen materials, and dose normalization. Apply it through Process with duration 0.0; the dose is configured on the implant model. The level-set geometry is unchanged.

Profiles and materials

Profile Purpose
ImplantPearsonIV A Pearson IV depth profile with Gaussian lateral spread.
ImplantDualPearsonIV Weighted head and tail profiles with separate lateral spreads.
ImplantPearsonIVChanneling A Pearson IV profile with an exponential channeling tail.
ImplantDamageHobler Optional damage depth and lateral distribution.
ImplantRecipeModel, DamageRecipeModel Profiles constructed from explicit recipe entries or CSV table lookup.

setMaskMaterials(...) selects materials that block the beam. setScreenMaterials(...) selects materials the beam traverses before reaching the implant surface. Marking a layer as a screen does not itself configure an energy-loss model; choose profile parameters or a recipe appropriate to the screen thickness.

Example: implant a silicon substrate

This example uses illustrative profile parameters and a geometry measured in nanometers. Two silicon planes bound the substrate region used for the cell set. The air cover extends to 20 nm above the surface.

C++

#include <geometries/psMakePlane.hpp>
#include <models/psIonImplantation.hpp>
#include <process/psProcess.hpp>

namespace ps = viennaps;

int main() {
  using T = double;
  constexpr int D = 2;
  auto domain = ps::Domain<T, D>::New(
      2.0, 100.0, ps::BoundaryType::REFLECTIVE_BOUNDARY);
  ps::MakePlane<T, D>(domain, -200.0, ps::Material::Si).apply();
  ps::MakePlane<T, D>(domain, 0.0, ps::Material::Si, true).apply();
  domain->generateCellSet(20.0, ps::Material::Air, true, true);
  domain->getCellSet()->buildNeighborhood();

  ps::PearsonIVParameters<T> moments;
  moments.mu = 60.0;
  moments.sigma = 20.0;
  moments.gamma = 0.5;
  moments.beta = 4.0;
  auto profile = ps::SmartPointer<ps::ImplantPearsonIV<T, D>>::New(
      moments, 0.0, 25.0);

  auto implant = ps::SmartPointer<ps::IonImplantation<T, D>>::New();
  implant->setImplantModel(profile);
  implant->setDose(1e13);
  implant->setTiltAngle(7.0);
  implant->setLengthUnit(1e-7);
  implant->setDoseControl(ps::ImplantDoseControl::WaferDose);
  implant->setMaskMaterials({ps::Material::Mask});
  implant->setScreenMaterials({ps::Material::SiO2});
  implant->setConcentrationLabel("B_total");
  ps::Process<T, D>(domain, implant, 0.0).apply();
  domain->getCellSet()->writeVTU("post_implant");
}

Python

import viennaps as vps

vps.setDimension(2)
domain = vps.Domain(2.0, 100.0)
vps.MakePlane(domain, -200.0, vps.Material.Si).apply()
vps.MakePlane(domain, 0.0, vps.Material.Si, True).apply()
domain.generateCellSet(20.0, vps.Material.Air, True, True)
domain.getCellSet().buildNeighborhood()

moments = vps.PearsonIVParameters()
moments.mu = 60.0
moments.sigma = 20.0
moments.gamma = 0.5
moments.beta = 4.0
profile = vps.ImplantPearsonIV(moments, 0.0, 25.0)

implant = vps.IonImplantation()
implant.setImplantModel(profile)
implant.setDose(1e13)
implant.setTiltAngle(7.0)
implant.setLengthUnit(1e-7)
implant.setDoseControl(vps.ImplantDoseControl.WaferDose)
implant.setMaskMaterials([vps.Material.Mask])
implant.setScreenMaterials([vps.Material.SiO2])
implant.setConcentrationLabel("B_total")
vps.Process(domain, implant, 0.0).apply()
domain.getCellSet().writeVTU("post_implant")

Units and output

Dose is in ions/cm², tilt is in degrees, and setLengthUnit takes centimeters per geometry unit (1e-7 for nm). WaferDose normalizes dose on the wafer plane; BeamDose uses the beam-normal dose. Off disables dose control.

Concentrations are stored in geometry unit⁻³ by default (nm⁻³ in the example). setOutputConcentrationInCm3(true) converts implant output to cm⁻³. Keep the native units when passing fields to an anneal configured in geometry units. Use setDamageLabel, setLastDamageLabel, and setBeamHitsLabel to name additional fields; enableBeamHits() enables beam-hit diagnostics.

The withEmbeddedBoundaries option stores sub-grid boundary information for tilted implants. Set it when generating the cell set; enabling it later on the implant can rebuild the cell set.

For table-based setup and available data, see the Model Database. To diffuse or activate the resulting profile, continue with Thermal Annealing.