Skip to content

⚡ Fossum model for carrier lifetime #2231

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 26 additions & 13 deletions tests/test_components/test_heat_charge.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,25 @@ class CHARGE_SIMULATION:
N_c=2.86e19,
N_v=3.1e19,
E_g=1.11,
mobility=CaugheyThomasMobility(
mu_n_min=52.2,
mu_n=1471.0,
mu_p_min=44.9,
mu_p=470.5,
exp_t_mu=-2.33,
exp_d_n=0.68,
exp_d_p=0.719,
mobility_n=CaugheyThomasMobility(
mu_min=52.2,
mu=1471.0,
ref_N=9.68e16,
exp_N=0.68,
exp_1=-0.57,
exp_2=-2.33,
exp_3=2.4,
exp_4=-0.146,
),
mobility_p=CaugheyThomasMobility(
mu_min=44.9,
mu=470.5,
ref_N=2.23e17,
exp_t_mu_min=-0.57,
exp_t_d=2.4,
exp_t_d_exp=-0.146,
exp_N=0.719,
exp_1=-0.57,
exp_2=-2.33,
exp_3=2.4,
exp_4=-0.146,
),
R=[
AugerRecombination(c_n=2.8e-31, c_p=9.9e-32),
Expand Down Expand Up @@ -633,10 +640,10 @@ def test_heat_charge_medium_validation(mediums):


def test_constant_mobility():
constant_mobility = td.ConstantMobilityModel(mu_n=1500, mu_p=500)
constant_mobility = td.ConstantMobilityModel(mu=1500)

with pytest.raises(pd.ValidationError):
_ = constant_mobility.updated_copy(mu_p=-1)
_ = constant_mobility.updated_copy(mu=-1)


def test_heat_charge_structures_creation(structures):
Expand Down Expand Up @@ -1344,3 +1351,9 @@ def test_additional_edge_cases():
sources=[],
monitors=[],
)


def test_fossum():
"""Check that fossum model can be defined."""

_ = td.FossumCarrierLifetime(tau_300=3.3e-6, alpha_T=-0.5, N0=7.1e15, A=1, B=0, C=1, alpha=1)
2 changes: 2 additions & 0 deletions tidy3d/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
TemperatureData,
)
from tidy3d.components.tcad.doping import ConstantDoping, GaussianDoping
from tidy3d.components.tcad.generation_recombination import FossumCarrierLifetime
from tidy3d.components.tcad.grid import DistanceUnstructuredGrid, UniformUnstructuredGrid
from tidy3d.components.tcad.monitors.charge import (
SteadyCapacitanceMonitor,
Expand Down Expand Up @@ -580,6 +581,7 @@ def set_logging_level(level: str) -> None:
"ConstantMobilityModel",
"SlotboomBandGapNarrowing",
"ShockleyReedHallRecombination",
"FossumCarrierLifetime",
"AugerRecombination",
"RadiativeRecombination",
"ConstantDoping",
Expand Down
29 changes: 18 additions & 11 deletions tidy3d/components/material/multi_physics.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,25 @@ class MultiPhysicsMedium(Tidy3dBaseModel):
... N_c=2.86e19,
... N_v=3.1e19,
... E_g=1.11,
... mobility=td.CaugheyThomasMobility(
... mu_n_min=52.2,
... mu_n=1471.0,
... mu_p_min=44.9,
... mu_p=470.5,
... exp_t_mu=-2.33,
... exp_d_n=0.68,
... exp_d_p=0.719,
... mobility_n=td.CaugheyThomasMobility(
... mu_min=52.2,
... mu=1471.0,
... ref_N=9.68e16,
... exp_N=0.68,
... exp_1=-0.57,
... exp_2=-2.33,
... exp_3=2.4,
... exp_4=-0.146,
... ),
... mobility_p=td.CaugheyThomasMobility(
... mu_min=44.9,
... mu=470.5,
... ref_N=2.23e17,
... exp_t_mu_min=-0.57,
... exp_t_d=2.4,
... exp_t_d_exp=-0.146,
... exp_N=0.719,
... exp_1=-0.57,
... exp_2=-2.33,
... exp_3=2.4,
... exp_4=-0.146,
... ),
... R=[
... td.ShockleyReedHallRecombination(
Expand Down
41 changes: 27 additions & 14 deletions tidy3d/components/material/tcad/charge.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,18 +192,25 @@ class SemiconductorMedium(AbstractChargeMedium):
... N_c=2.86e19,
... N_v=3.1e19,
... E_g=1.11,
... mobility=td.CaugheyThomasMobility(
... mu_n_min=52.2,
... mu_n=1471.0,
... mu_p_min=44.9,
... mu_p=470.5,
... exp_t_mu=-2.33,
... exp_d_n=0.68,
... exp_d_p=0.719,
... mobility_n=td.CaugheyThomasMobility(
... mu_min=52.2,
... mu=1471.0,
... ref_N=9.68e16,
... exp_N=0.68,
... exp_1=-0.57,
... exp_2=-2.33,
... exp_3=2.4,
... exp_4=-0.146,
... ),
... mobility_p=td.CaugheyThomasMobility(
... mu_min=44.9,
... mu=470.5,
... ref_N=2.23e17,
... exp_t_mu_min=-0.57,
... exp_t_d=2.4,
... exp_t_d_exp=-0.146,
... exp_N=0.719,
... exp_1=-0.57,
... exp_2=-2.33,
... exp_3=2.4,
... exp_4=-0.146,
... ),
... R=([
... td.ShockleyReedHallRecombination(
Expand Down Expand Up @@ -270,10 +277,16 @@ class SemiconductorMedium(AbstractChargeMedium):
units=ELECTRON_VOLT,
)

mobility: MobilityModelType = pd.Field(
mobility_n: MobilityModelType = pd.Field(
...,
title="Mobility model for electrons",
description="Mobility model for electrons",
)

mobility_p: MobilityModelType = pd.Field(
...,
title="Mobility model",
description="Mobility model",
title="Mobility model for holes",
description="Mobility model for holes",
)

R: Tuple[RecombinationModelType, ...] = pd.Field(
Expand Down
67 changes: 63 additions & 4 deletions tidy3d/components/tcad/generation_recombination.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,65 @@
import pydantic.v1 as pd

from tidy3d.components.base import Tidy3dBaseModel
from tidy3d.components.types import Union
from tidy3d.constants import PERCMCUBE, SECOND


class FossumCarrierLifetime(Tidy3dBaseModel):
"""
Parameters for the Fossum carrier lifetime model

Notes
-----

This model expresses the carrier lifetime as a function of the temperature and doping concentration.

.. math::

\\tau = \\frac{\\tau_{300} \\left( T/300 \\right)^\\alpha_T}{A + B (N/N_0) + C (N/N_0)^\\alpha}

Example
-------
>>> import tidy3d as td
>>> default_Si = td.FossumCarrierLifetime(
... tau_300=3.3e-6,
... alpha_T=-0.5,
... N0=7.1e15,
... A=1,
... B=0,
... C=1,
... alpha=1
... )

References
----------

Fossum, J. G., and D. S. Lee. "A physical model for the dependence of carrier lifetime on doping density in nondegenerate silicon." Solid-State Electronics 25.8 (1982): 741-747.

"""

tau_300: pd.PositiveFloat = pd.Field(
..., title="Tau at 300K", description="Carrier lifetime at 300K", units=SECOND
)

alpha_T: float = pd.Field(
..., title="Exponent for thermal dependence", description="Exponent for thermal dependence"
)

N0: pd.PositiveFloat = pd.Field(
..., title="Reference concentration", description="Reference concentration", units=PERCMCUBE
)

A: float = pd.Field(..., title="Constant A", description="Constant A")

B: float = pd.Field(..., title="Constant B", description="Constant B")

C: float = pd.Field(..., title="Constant C", description="Constant C")

alpha: float = pd.Field(..., title="Exponent constant", description="Exponent constant")


CarrierLifetimeType = Union[FossumCarrierLifetime]


class AugerRecombination(Tidy3dBaseModel):
Expand Down Expand Up @@ -98,10 +157,10 @@ class ShockleyReedHallRecombination(Tidy3dBaseModel):
- This model represents mid-gap traps Shockley-Reed-Hall recombination.
"""

tau_n: pd.PositiveFloat = pd.Field(
..., title="Electron lifetime", description="Electron lifetime in seconds. TODOMARCCHECK"
tau_n: Union[pd.PositiveFloat, CarrierLifetimeType] = pd.Field(
..., title="Electron lifetime", description="Electron lifetime", union=SECOND
)

tau_p: pd.PositiveFloat = pd.Field(
..., title="Hole lifetime", description="Hole lifetime in seconds. TODOMARCCHECK."
tau_p: Union[pd.PositiveFloat, CarrierLifetimeType] = pd.Field(
..., title="Hole lifetime", description="Hole lifetime", units=SECOND
)
Loading