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/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/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/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/__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..6aefbdef1f 100644 --- a/tidy3d/components/tcad/generation_recombination.py +++ b/tidy3d/components/tcad/generation_recombination.py @@ -223,3 +223,62 @@ 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 :math:`R^{\\text{BTBT}}` is primarily defined by the + material's bandgap energy :math:`E_g` and the electric field :math:`F`. + + .. math:: + + 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. + + 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. + """ + + A: pd.PositiveFloat = 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: pd.PositiveFloat = 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( + 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 " + "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]