From 301c0c83fe5bd0a7f7c123c307052a74b0c242e7 Mon Sep 17 00:00:00 2001 From: Marc Bolinches Date: Tue, 30 Sep 2025 13:23:24 +0200 Subject: [PATCH] Impact ionization: * Added Selberherr's model --- CHANGELOG.md | 1 + tests/test_components/test_heat_charge.py | 10 +++ tidy3d/__init__.py | 2 + .../tcad/generation_recombination.py | 78 +++++++++++++++++++ tidy3d/components/tcad/types.py | 2 + 5 files changed, 93 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4de1e4ea27..59049a5c7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Non-isothermal Charge simulations are now available. One can now run this type of simulations by using the `SteadyChargeDCAnalysis` as the `analysis_spec` of a `HeatChargeSimulation`. This type of simulations couple the heat equation with the drift-diffusion equations which allow to account for self heating behavior. - Because non-isothermal Charge simulations are now supported, new models for the effective density of states and bandgap energy have been introduced. These models are the following: `ConstantEffectiveDOS`, `IsotropicEffectiveDOS`, `MultiValleyEffectiveDOS`, `DualValleyEffectiveDOS`. - Added the Hurkx model for direct band-to-band tunneling `HurkxDirectBandToBandTunneling`. +- Added Selberherr's model for impact ionization `SelberherrImpactIonization`. ### Changed - `LayerRefinementSpec` defaults to assuming structures made of different materials are interior-disjoint for more efficient mesh generation. diff --git a/tests/test_components/test_heat_charge.py b/tests/test_components/test_heat_charge.py index 253bea8276..8944ca60a4 100644 --- a/tests/test_components/test_heat_charge.py +++ b/tests/test_components/test_heat_charge.py @@ -2382,3 +2382,13 @@ def test_generation_recombination(): E_0=1, sigma=2, ) + + # make sure we can build a SelberherrImpactIonization + _ = td.SelberherrImpactIonization( + alpha_n_inf=7.03e5, + alpha_p_inf=1.582e6, + E_n_crit=1.23e6, + E_p_crit=2.03e6, + beta_n=1, + beta_p=1, + ) diff --git a/tidy3d/__init__.py b/tidy3d/__init__.py index 60851bedbd..e6f4e82ac5 100644 --- a/tidy3d/__init__.py +++ b/tidy3d/__init__.py @@ -88,6 +88,7 @@ IsotropicEffectiveDOS, MultiValleyEffectiveDOS, RadiativeRecombination, + SelberherrImpactIonization, ShockleyReedHallRecombination, SlotboomBandGapNarrowing, TemperatureBC, @@ -685,6 +686,7 @@ def set_logging_level(level: str) -> None: "ScalarModeFieldCylindricalDataArray", "ScalarModeFieldDataArray", "Scene", + "SelberherrImpactIonization", "Sellmeier", "SemiconductorMedium", "ShockleyReedHallRecombination", diff --git a/tidy3d/components/tcad/generation_recombination.py b/tidy3d/components/tcad/generation_recombination.py index 0a6226f1cc..0aa2a36aad 100644 --- a/tidy3d/components/tcad/generation_recombination.py +++ b/tidy3d/components/tcad/generation_recombination.py @@ -282,3 +282,81 @@ class HurkxDirectBandToBandTunneling(Tidy3dBaseModel): "semiconductors sigma is typically 2.0, while for indirect " "semiconductors sigma is typically 2.5.", ) + + +class SelberherrImpactIonization(Tidy3dBaseModel): + """ + This class defines the parameters for the Selberherr impact ionization model. Two formulations are available that + depend on the driving field, as described in [1]_ (:math:`\\| E \\|`) and [2]_ (:math:`E \\cdot J_{\\nu} / \\| E \\|` for :math:`\\nu = n,p`). + + Notes + ----- + + The impact ionization rate ``\\alpha_{\\nu}`` (for :math:`\\nu = p` (holes) and :math:`\\nu = n` (electrons)) is defined by: + + .. math:: + + \\alpha_{\\nu} = \\alpha_{\\nu}^\\infty \\cdot \\exp \\left( - \\left( \\frac{E_{\\nu}^{\\text{crit}} \\cdot |\\mathbf{J}_{\\nu}|}{E \\cdot \\mathbf{J}_{\\nu}} \\right)^{\\beta_{\\nu}} \\right) + + where :math:`\\alpha_{\\nu}^\\infty`, :math:`E_{\\nu}^{\\text{crit}}`, and :math:`\\beta_{\\nu}` are material-dependent parameters. + + Example + ------- + >>> import tidy3d as td + >>> default_Si = td.SelberherrImpactIonization( + ... alpha_n_inf=7.03e5, + ... alpha_p_inf=1.582e6, + ... E_n_crit=1.23e6, + ... E_p_crit=2.03e6, + ... beta_n=1, + ... beta_p=1, + ... formulation='PQ' + ... ) + + References + ---------- + .. [1] Selberherr, Siegfried. Analysis and simulation of semiconductor devices. Springer Science & Business Media, 1984. + .. [2] Vassil Palankovski and RĂ¼diger Quay. Analysis and simulation of heterostructure devices. Springer Science & Business Media, 2004. + """ + + alpha_n_inf: pd.PositiveFloat = pd.Field( + ..., + title="Electron ionization coefficient at infinite field", + description="Electron ionization coefficient at infinite field.", + units="1/cm", + ) + alpha_p_inf: pd.PositiveFloat = pd.Field( + ..., + title="Hole ionization coefficient at infinite field", + description="Hole ionization coefficient at infinite field.", + units="1/cm", + ) + E_n_crit: pd.PositiveFloat = pd.Field( + ..., + title="Critical electric field for electrons", + description="Critical electric field for electrons.", + units="V/cm", + ) + E_p_crit: pd.PositiveFloat = pd.Field( + ..., + title="Critical electric field for holes", + description="Critical electric field for holes.", + units="V/cm", + ) + beta_n: pd.PositiveFloat = pd.Field( + ..., + title="Exponent for electrons", + description="Exponent for electrons.", + ) + beta_p: pd.PositiveFloat = pd.Field( + ..., + title="Exponent for holes", + description="Exponent for holes.", + ) + + formulation: str = pd.Field( + "PQ", + title="Formulation", + description="Formulation used for impact ionization. Options are 'Selberherr' " + "or 'PQ' for Selberherr and Palankovski and Quay formulations, respectively.", + ) diff --git a/tidy3d/components/tcad/types.py b/tidy3d/components/tcad/types.py index 3af63d122b..6040f22671 100644 --- a/tidy3d/components/tcad/types.py +++ b/tidy3d/components/tcad/types.py @@ -26,6 +26,7 @@ DistributedGeneration, HurkxDirectBandToBandTunneling, RadiativeRecombination, + SelberherrImpactIonization, ShockleyReedHallRecombination, ) from tidy3d.components.tcad.mobility import CaugheyThomasMobility, ConstantMobilityModel @@ -52,6 +53,7 @@ RadiativeRecombination, ShockleyReedHallRecombination, HurkxDirectBandToBandTunneling, + SelberherrImpactIonization, ] BandGapNarrowingModelType = Union[SlotboomBandGapNarrowing]