From 6d3483f320fdb560cabecca31af90284f4bcee3b Mon Sep 17 00:00:00 2001 From: Marc Bolinches Date: Wed, 24 Sep 2025 16:37:31 +0200 Subject: [PATCH 1/5] Adding direct btbt by Hurkx --- docs/api/charge/mediums.rst | 1 + tidy3d/__init__.py | 2 + .../tcad/generation_recombination.py | 49 +++++++++++++++++++ tidy3d/components/tcad/types.py | 7 ++- 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/docs/api/charge/mediums.rst b/docs/api/charge/mediums.rst index 542bc38a63..dca8eb1702 100644 --- a/docs/api/charge/mediums.rst +++ b/docs/api/charge/mediums.rst @@ -34,6 +34,7 @@ Generation Recombination tidy3d.ShockleyReedHallRecombination tidy3d.FossumCarrierLifetime tidy3d.DistributedGeneration + tidy3d.HurkxDirectBandToBandTunneling Doping diff --git a/tidy3d/__init__.py b/tidy3d/__init__.py index 8741cec4fc..60851bedbd 100644 --- a/tidy3d/__init__.py +++ b/tidy3d/__init__.py @@ -83,6 +83,7 @@ HeatFluxBC, HeatFromElectricSource, HeatSource, + HurkxDirectBandToBandTunneling, InsulatingBC, IsotropicEffectiveDOS, MultiValleyEffectiveDOS, @@ -603,6 +604,7 @@ def set_logging_level(level: str) -> None: "HeatSource", "HeuristicPECStaircasing", "HuraySurfaceRoughness", + "HurkxDirectBandToBandTunneling", "IndexPerturbation", "IndexedDataArray", "IndexedFieldVoltageDataArray", diff --git a/tidy3d/components/tcad/generation_recombination.py b/tidy3d/components/tcad/generation_recombination.py index 51bb5013c9..9221a487d2 100644 --- a/tidy3d/components/tcad/generation_recombination.py +++ b/tidy3d/components/tcad/generation_recombination.py @@ -223,3 +223,52 @@ def check_spatialdataarray_dimensions(cls, values): raise ValueError("SpatialDataArray must be at least 2D.") return values + + +class HurkxDirectBandToBandTunneling(Tidy3dBaseModel): + """ + This class defines a direct band-to-band tunneling recombination model based on the Hurkx model + as described in [1]_. + + Notes + ----- + + The direct band-to-band tunneling recombination rate ``R_{BTBT}`` is primarily defined by the + material's bandgap energy :math:`E_g` and the electric field :math:`F`. + + .. math:: + + R^{BTBT} = A \\cdot \frac{n \\cdot p - n_i^2}{(n + n_i) \\cdot (p + n_i)} \\cdot \\left( \frac{|\\mathbf{E}|}{E_0} \right)^{\\sigma} \\cdot \\exp \\left( -\frac{B}{|\\mathbf{E}|} \\cdot \\left( \frac{E_g}{E_{g,300}} \right)^{3/2} \right ) + + where :math:`A`, :math:`B`, :math:`E_0`, and :math:`\\sigma` are material-dependent parameters. + + References + ---------- + .. [1] Palankovski, Vassil, and Rüdiger Quay. Analysis and simulation of heterostructure devices. Springer Science & Business Media, 2004. + """ + + A: float = pd.Field( + 4e14, + title="Parameter A", + description="Parameter A in the direct BTBT Hurkx model.", + units="1/(cm^3 s)", + ) + B: float = pd.Field( + 1.9e6, + title="Parameter B", + description="Parameter B in the direct BTBT Hurkx model.", + units="V/cm", + ) + E_0: float = pd.Field( + 1, + title="Reference electric field E_0", + description="Reference electric field E_0 in the direct BTBT Hurkx model.", + units="V/cm", + ) + sigma: float = pd.Field( + ..., + title="Exponent parameter", + description="Exponent sigma in the direct BTBT Hurkx model. For direct " + "semiconductors sigma is typically 2.0, while for indirect " + "semiconductors sigma is typically 2.5.", + ) diff --git a/tidy3d/components/tcad/types.py b/tidy3d/components/tcad/types.py index cf9b5c658f..3af63d122b 100644 --- a/tidy3d/components/tcad/types.py +++ b/tidy3d/components/tcad/types.py @@ -24,6 +24,7 @@ from tidy3d.components.tcad.generation_recombination import ( AugerRecombination, DistributedGeneration, + HurkxDirectBandToBandTunneling, RadiativeRecombination, ShockleyReedHallRecombination, ) @@ -46,7 +47,11 @@ EnergyBandGapModelType = Union[ConstantEnergyBandGap, VarshniEnergyBandGap] MobilityModelType = Union[CaugheyThomasMobility, ConstantMobilityModel] RecombinationModelType = Union[ - AugerRecombination, DistributedGeneration, RadiativeRecombination, ShockleyReedHallRecombination + AugerRecombination, + DistributedGeneration, + RadiativeRecombination, + ShockleyReedHallRecombination, + HurkxDirectBandToBandTunneling, ] BandGapNarrowingModelType = Union[SlotboomBandGapNarrowing] From 7676a6de24168e05a2182b6ce013633e5892f6e5 Mon Sep 17 00:00:00 2001 From: Marc Bolinches Date: Mon, 29 Sep 2025 16:31:21 +0200 Subject: [PATCH 2/5] Adding tests and changelog --- CHANGELOG.md | 1 + tests/test_components/test_heat_charge.py | 8 ++++++++ tidy3d/components/tcad/generation_recombination.py | 4 ++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f11d1778b0..4de1e4ea27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - A new type of doping box has been introduced, `CustomDoping` which accepts a `SpatialDataArray` to define doping concentration. Unlike in the case where a `SpatialDataArray`, custom doping defined with `CustomDoping` have additive behavior, i.e., one can add other doping on top. This deprecates the `SpatialDataArray` as direct input for `N_a` and `N_d`. - 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`. ### 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 e60d8dc620..253bea8276 100644 --- a/tests/test_components/test_heat_charge.py +++ b/tests/test_components/test_heat_charge.py @@ -2374,3 +2374,11 @@ def test_generation_recombination(): tau_n=tau_fossum, tau_p=tau_fossum, ) + + # make sure we can build a HurkxDirectBandToBandTunneling + _ = td.HurkxDirectBandToBandTunneling( + A=1e19, + B=1.9e6, + E_0=1, + sigma=2, + ) diff --git a/tidy3d/components/tcad/generation_recombination.py b/tidy3d/components/tcad/generation_recombination.py index 9221a487d2..c1909ad612 100644 --- a/tidy3d/components/tcad/generation_recombination.py +++ b/tidy3d/components/tcad/generation_recombination.py @@ -247,7 +247,7 @@ class HurkxDirectBandToBandTunneling(Tidy3dBaseModel): .. [1] Palankovski, Vassil, and Rüdiger Quay. Analysis and simulation of heterostructure devices. Springer Science & Business Media, 2004. """ - A: float = pd.Field( + A: pd.PositiveFloat = pd.Field( 4e14, title="Parameter A", description="Parameter A in the direct BTBT Hurkx model.", @@ -259,7 +259,7 @@ class HurkxDirectBandToBandTunneling(Tidy3dBaseModel): description="Parameter B in the direct BTBT Hurkx model.", units="V/cm", ) - E_0: float = pd.Field( + E_0: pd.PositiveFloat = pd.Field( 1, title="Reference electric field E_0", description="Reference electric field E_0 in the direct BTBT Hurkx model.", From c6cb963735b229dcef006c939a79714bc3e566c4 Mon Sep 17 00:00:00 2001 From: Marc Bolinches Date: Mon, 29 Sep 2025 16:41:39 +0200 Subject: [PATCH 3/5] Schema --- schemas/EMESimulation.json | 38 +++++++++++++++++++ schemas/HeatChargeSimulation.json | 38 +++++++++++++++++++ schemas/HeatSimulation.json | 38 +++++++++++++++++++ schemas/ModeSimulation.json | 38 +++++++++++++++++++ schemas/Simulation.json | 38 +++++++++++++++++++ schemas/TerminalComponentModeler.json | 38 +++++++++++++++++++ .../tcad/generation_recombination.py | 2 +- 7 files changed, 229 insertions(+), 1 deletion(-) diff --git a/schemas/EMESimulation.json b/schemas/EMESimulation.json index 20edb6401d..438b342d58 100644 --- a/schemas/EMESimulation.json +++ b/schemas/EMESimulation.json @@ -5735,6 +5735,41 @@ ], "type": "object" }, + "HurkxDirectBandToBandTunneling": { + "additionalProperties": false, + "properties": { + "A": { + "default": 400000000000000.0, + "exclusiveMinimum": 0, + "type": "number" + }, + "B": { + "default": 1900000.0, + "type": "number" + }, + "E_0": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + }, + "attrs": { + "default": {}, + "type": "object" + }, + "sigma": { + "default": 2.5, + "type": "number" + }, + "type": { + "default": "HurkxDirectBandToBandTunneling", + "enum": [ + "HurkxDirectBandToBandTunneling" + ], + "type": "string" + } + }, + "type": "object" + }, "IndexPerturbation": { "additionalProperties": false, "properties": { @@ -9815,6 +9850,9 @@ { "$ref": "#/definitions/DistributedGeneration" }, + { + "$ref": "#/definitions/HurkxDirectBandToBandTunneling" + }, { "$ref": "#/definitions/RadiativeRecombination" }, diff --git a/schemas/HeatChargeSimulation.json b/schemas/HeatChargeSimulation.json index 759ae05574..dbb702299e 100644 --- a/schemas/HeatChargeSimulation.json +++ b/schemas/HeatChargeSimulation.json @@ -4434,6 +4434,41 @@ ], "type": "object" }, + "HurkxDirectBandToBandTunneling": { + "additionalProperties": false, + "properties": { + "A": { + "default": 400000000000000.0, + "exclusiveMinimum": 0, + "type": "number" + }, + "B": { + "default": 1900000.0, + "type": "number" + }, + "E_0": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + }, + "attrs": { + "default": {}, + "type": "object" + }, + "sigma": { + "default": 2.5, + "type": "number" + }, + "type": { + "default": "HurkxDirectBandToBandTunneling", + "enum": [ + "HurkxDirectBandToBandTunneling" + ], + "type": "string" + } + }, + "type": "object" + }, "IndexPerturbation": { "additionalProperties": false, "properties": { @@ -6809,6 +6844,9 @@ { "$ref": "#/definitions/DistributedGeneration" }, + { + "$ref": "#/definitions/HurkxDirectBandToBandTunneling" + }, { "$ref": "#/definitions/RadiativeRecombination" }, diff --git a/schemas/HeatSimulation.json b/schemas/HeatSimulation.json index bdd6914967..d6a55f26e0 100644 --- a/schemas/HeatSimulation.json +++ b/schemas/HeatSimulation.json @@ -4434,6 +4434,41 @@ ], "type": "object" }, + "HurkxDirectBandToBandTunneling": { + "additionalProperties": false, + "properties": { + "A": { + "default": 400000000000000.0, + "exclusiveMinimum": 0, + "type": "number" + }, + "B": { + "default": 1900000.0, + "type": "number" + }, + "E_0": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + }, + "attrs": { + "default": {}, + "type": "object" + }, + "sigma": { + "default": 2.5, + "type": "number" + }, + "type": { + "default": "HurkxDirectBandToBandTunneling", + "enum": [ + "HurkxDirectBandToBandTunneling" + ], + "type": "string" + } + }, + "type": "object" + }, "IndexPerturbation": { "additionalProperties": false, "properties": { @@ -6809,6 +6844,9 @@ { "$ref": "#/definitions/DistributedGeneration" }, + { + "$ref": "#/definitions/HurkxDirectBandToBandTunneling" + }, { "$ref": "#/definitions/RadiativeRecombination" }, diff --git a/schemas/ModeSimulation.json b/schemas/ModeSimulation.json index 80722bb65a..1ff8b79f6f 100644 --- a/schemas/ModeSimulation.json +++ b/schemas/ModeSimulation.json @@ -4966,6 +4966,41 @@ ], "type": "object" }, + "HurkxDirectBandToBandTunneling": { + "additionalProperties": false, + "properties": { + "A": { + "default": 400000000000000.0, + "exclusiveMinimum": 0, + "type": "number" + }, + "B": { + "default": 1900000.0, + "type": "number" + }, + "E_0": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + }, + "attrs": { + "default": {}, + "type": "object" + }, + "sigma": { + "default": 2.5, + "type": "number" + }, + "type": { + "default": "HurkxDirectBandToBandTunneling", + "enum": [ + "HurkxDirectBandToBandTunneling" + ], + "type": "string" + } + }, + "type": "object" + }, "IndexPerturbation": { "additionalProperties": false, "properties": { @@ -9481,6 +9516,9 @@ { "$ref": "#/definitions/DistributedGeneration" }, + { + "$ref": "#/definitions/HurkxDirectBandToBandTunneling" + }, { "$ref": "#/definitions/RadiativeRecombination" }, diff --git a/schemas/Simulation.json b/schemas/Simulation.json index 5a06764c6e..938cc47093 100644 --- a/schemas/Simulation.json +++ b/schemas/Simulation.json @@ -8304,6 +8304,41 @@ ], "type": "object" }, + "HurkxDirectBandToBandTunneling": { + "additionalProperties": false, + "properties": { + "A": { + "default": 400000000000000.0, + "exclusiveMinimum": 0, + "type": "number" + }, + "B": { + "default": 1900000.0, + "type": "number" + }, + "E_0": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + }, + "attrs": { + "default": {}, + "type": "object" + }, + "sigma": { + "default": 2.5, + "type": "number" + }, + "type": { + "default": "HurkxDirectBandToBandTunneling", + "enum": [ + "HurkxDirectBandToBandTunneling" + ], + "type": "string" + } + }, + "type": "object" + }, "IndexPerturbation": { "additionalProperties": false, "properties": { @@ -13325,6 +13360,9 @@ { "$ref": "#/definitions/DistributedGeneration" }, + { + "$ref": "#/definitions/HurkxDirectBandToBandTunneling" + }, { "$ref": "#/definitions/RadiativeRecombination" }, diff --git a/schemas/TerminalComponentModeler.json b/schemas/TerminalComponentModeler.json index 1ad2096c11..5470122379 100644 --- a/schemas/TerminalComponentModeler.json +++ b/schemas/TerminalComponentModeler.json @@ -8612,6 +8612,41 @@ ], "type": "object" }, + "HurkxDirectBandToBandTunneling": { + "additionalProperties": false, + "properties": { + "A": { + "default": 400000000000000.0, + "exclusiveMinimum": 0, + "type": "number" + }, + "B": { + "default": 1900000.0, + "type": "number" + }, + "E_0": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + }, + "attrs": { + "default": {}, + "type": "object" + }, + "sigma": { + "default": 2.5, + "type": "number" + }, + "type": { + "default": "HurkxDirectBandToBandTunneling", + "enum": [ + "HurkxDirectBandToBandTunneling" + ], + "type": "string" + } + }, + "type": "object" + }, "IndexPerturbation": { "additionalProperties": false, "properties": { @@ -13808,6 +13843,9 @@ { "$ref": "#/definitions/DistributedGeneration" }, + { + "$ref": "#/definitions/HurkxDirectBandToBandTunneling" + }, { "$ref": "#/definitions/RadiativeRecombination" }, diff --git a/tidy3d/components/tcad/generation_recombination.py b/tidy3d/components/tcad/generation_recombination.py index c1909ad612..f0bf0d4ac4 100644 --- a/tidy3d/components/tcad/generation_recombination.py +++ b/tidy3d/components/tcad/generation_recombination.py @@ -266,7 +266,7 @@ class HurkxDirectBandToBandTunneling(Tidy3dBaseModel): units="V/cm", ) sigma: float = pd.Field( - ..., + 2.5, title="Exponent parameter", description="Exponent sigma in the direct BTBT Hurkx model. For direct " "semiconductors sigma is typically 2.0, while for indirect " From 64ee3f16cefb82af6a59161d85e21bac0d0a2418 Mon Sep 17 00:00:00 2001 From: Marc Bolinches Date: Tue, 30 Sep 2025 12:42:59 +0200 Subject: [PATCH 4/5] Add example to docs --- tidy3d/components/tcad/generation_recombination.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tidy3d/components/tcad/generation_recombination.py b/tidy3d/components/tcad/generation_recombination.py index f0bf0d4ac4..0a6226f1cc 100644 --- a/tidy3d/components/tcad/generation_recombination.py +++ b/tidy3d/components/tcad/generation_recombination.py @@ -242,6 +242,16 @@ class HurkxDirectBandToBandTunneling(Tidy3dBaseModel): where :math:`A`, :math:`B`, :math:`E_0`, and :math:`\\sigma` are material-dependent parameters. + Example + ------- + >>> import tidy3d as td + >>> default_Si = td.HurkxDirectBandToBandTunneling( + ... A=1e19, + ... B=1.9e6, + ... E_0=1, + ... sigma=2.5 + ... ) + References ---------- .. [1] Palankovski, Vassil, and Rüdiger Quay. Analysis and simulation of heterostructure devices. Springer Science & Business Media, 2004. From 4233536a11d7805bfe379876d2ff05aea1266963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damiano=20Franz=C3=B2?= Date: Thu, 2 Oct 2025 15:19:51 +0200 Subject: [PATCH 5/5] Fix formatting errors --- .../tcad/generation_recombination.py | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tidy3d/components/tcad/generation_recombination.py b/tidy3d/components/tcad/generation_recombination.py index 0a6226f1cc..6aefbdef1f 100644 --- a/tidy3d/components/tcad/generation_recombination.py +++ b/tidy3d/components/tcad/generation_recombination.py @@ -228,29 +228,29 @@ def check_spatialdataarray_dimensions(cls, values): class HurkxDirectBandToBandTunneling(Tidy3dBaseModel): """ This class defines a direct band-to-band tunneling recombination model based on the Hurkx model - as described in [1]_. + as described in [1]. Notes ----- - The direct band-to-band tunneling recombination rate ``R_{BTBT}`` is primarily defined by the - material's bandgap energy :math:`E_g` and the electric field :math:`F`. + The direct band-to-band tunneling recombination rate :math:`R^{\\text{BTBT}}` is primarily defined by the + material's bandgap energy :math:`E_g` and the electric field :math:`F`. - .. math:: + .. math:: - R^{BTBT} = A \\cdot \frac{n \\cdot p - n_i^2}{(n + n_i) \\cdot (p + n_i)} \\cdot \\left( \frac{|\\mathbf{E}|}{E_0} \right)^{\\sigma} \\cdot \\exp \\left( -\frac{B}{|\\mathbf{E}|} \\cdot \\left( \frac{E_g}{E_{g,300}} \right)^{3/2} \right ) + R^{\\text{BTBT}} = A \\cdot \\frac{n \\cdot p - n_i^2}{(n + n_i) \\cdot (p + n_i)} \\cdot \\left( \\frac{|\\mathbf{E}|}{E_0} \\right)^{\\sigma} \\cdot \\exp \\left(-\\frac{B}{|\\mathbf{E}|} \\cdot \\left( \\frac{E_g}{E_{g, 300}} \\right)^{3/2} \\right) - where :math:`A`, :math:`B`, :math:`E_0`, and :math:`\\sigma` are material-dependent parameters. + where :math:`A`, :math:`B`, :math:`E_0`, and :math:`\\sigma` are material-dependent parameters. Example ------- - >>> import tidy3d as td - >>> default_Si = td.HurkxDirectBandToBandTunneling( - ... A=1e19, - ... B=1.9e6, - ... E_0=1, - ... sigma=2.5 - ... ) + >>> import tidy3d as td + >>> default_Si = td.HurkxDirectBandToBandTunneling( + ... A=1e19, + ... B=1.9e6, + ... E_0=1, + ... sigma=2.5 + ... ) References ----------