Skip to content

[FXC-1512]: Add natural convection BC #2696

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

Open
wants to merge 9 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
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
3 changes: 3 additions & 0 deletions tidy3d/__init__.py
Original file line number Diff line number Diff line change
@@ -1,395 +1,396 @@
"""Tidy3d package imports"""

from __future__ import annotations

from tidy3d.components.material.multi_physics import MultiPhysicsMedium
from tidy3d.components.material.tcad.charge import (
ChargeConductorMedium,
ChargeInsulatorMedium,
SemiconductorMedium,
)
from tidy3d.components.material.tcad.heat import (
FluidMedium,
FluidSpec,
SolidMedium,
SolidSpec,
)
from tidy3d.components.microwave.data.monitor_data import (
AntennaMetricsData,
)
from tidy3d.components.spice.analysis.dc import (
ChargeToleranceSpec,
IsothermalSteadyChargeDCAnalysis,
)
from tidy3d.components.spice.sources.dc import DCCurrentSource, DCVoltageSource
from tidy3d.components.spice.sources.types import VoltageSourceType
from tidy3d.components.tcad.analysis.heat_simulation_type import UnsteadyHeatAnalysis, UnsteadySpec
from tidy3d.components.tcad.boundary.specification import (
HeatBoundarySpec,
HeatChargeBoundarySpec,
)
from tidy3d.components.tcad.data.monitor_data.mesh import VolumeMeshData
from tidy3d.components.tcad.data.sim_data import (
DeviceCharacteristics,
HeatChargeSimulationData,
HeatSimulationData,
VolumeMesherData,
)
from tidy3d.components.tcad.data.types import (
SteadyCapacitanceData,
SteadyElectricFieldData,
SteadyEnergyBandData,
SteadyFreeCarrierData,
SteadyPotentialData,
TemperatureData,
)
from tidy3d.components.tcad.doping import ConstantDoping, GaussianDoping
from tidy3d.components.tcad.generation_recombination import FossumCarrierLifetime
from tidy3d.components.tcad.grid import (
DistanceUnstructuredGrid,
GridRefinementLine,
GridRefinementRegion,
UniformUnstructuredGrid,
)
from tidy3d.components.tcad.mesher import VolumeMesher
from tidy3d.components.tcad.monitors.charge import (
SteadyCapacitanceMonitor,
SteadyElectricFieldMonitor,
SteadyEnergyBandMonitor,
SteadyFreeCarrierMonitor,
SteadyPotentialMonitor,
)
from tidy3d.components.tcad.monitors.heat import TemperatureMonitor
from tidy3d.components.tcad.monitors.mesh import VolumeMeshMonitor
from tidy3d.components.tcad.simulation.heat import HeatSimulation
from tidy3d.components.tcad.simulation.heat_charge import HeatChargeSimulation
from tidy3d.components.tcad.types import (
AugerRecombination,
CaugheyThomasMobility,
ConstantMobilityModel,
ConvectionBC,
NaturalConvectionVerticalSpec,
CurrentBC,
HeatFluxBC,
HeatFromElectricSource,
HeatSource,
InsulatingBC,
RadiativeRecombination,
ShockleyReedHallRecombination,
SlotboomBandGapNarrowing,
TemperatureBC,
UniformHeatSource,
VoltageBC,
)

from .components.apodization import ApodizationSpec

# boundary placement for other solvers
# boundary placement for other solvers
from .components.bc_placement import (
MediumMediumInterface,
SimulationBoundary,
StructureBoundary,
StructureSimulationBoundary,
StructureStructureInterface,
)

# analytic beams
from .components.beam import (
AstigmaticGaussianBeamProfile,
GaussianBeamProfile,
PlaneWaveBeamProfile,
)

# boundary
from .components.boundary import (
PML,
Absorber,
AbsorberParams,
BlochBoundary,
Boundary,
BoundaryEdge,
BoundaryEdgeType,
BoundarySpec,
DefaultAbsorberParameters,
DefaultPMLParameters,
DefaultStablePMLParameters,
PECBoundary,
Periodic,
PMCBoundary,
PMLParams,
PMLTypes,
StablePML,
)

# data
from .components.data.data_array import (
CellDataArray,
ChargeDataArray,
DiffractionDataArray,
EMECoefficientDataArray,
EMEModeIndexDataArray,
EMEScalarFieldDataArray,
EMEScalarModeFieldDataArray,
EMESMatrixDataArray,
FieldProjectionAngleDataArray,
FieldProjectionCartesianDataArray,
FieldProjectionKSpaceDataArray,
FluxDataArray,
FluxTimeDataArray,
HeatDataArray,
IndexedDataArray,
IndexedFieldVoltageDataArray,
IndexedTimeDataArray,
IndexedVoltageDataArray,
ModeAmpsDataArray,
ModeIndexDataArray,
PointDataArray,
ScalarFieldDataArray,
ScalarFieldTimeDataArray,
ScalarModeFieldCylindricalDataArray,
ScalarModeFieldDataArray,
SpatialDataArray,
SpatialVoltageDataArray,
SteadyVoltageDataArray,
)
from .components.data.dataset import (
FieldDataset,
FieldTimeDataset,
ModeSolverDataset,
PermittivityDataset,
)
from .components.data.monitor_data import (
AbstractFieldProjectionData,
DiffractionData,
DirectivityData,
FieldData,
FieldProjectionAngleData,
FieldProjectionCartesianData,
FieldProjectionKSpaceData,
FieldTimeData,
FluxData,
FluxTimeData,
ModeData,
ModeSolverData,
PermittivityData,
)
from .components.data.sim_data import DATA_TYPE_MAP, SimulationData
from .components.data.utils import (
TetrahedralGridDataset,
TriangularGridDataset,
)
from .components.eme.data.dataset import (
EMECoefficientDataset,
EMEFieldDataset,
EMEModeSolverDataset,
EMESMatrixDataset,
)
from .components.eme.data.monitor_data import EMECoefficientData, EMEFieldData, EMEModeSolverData
from .components.eme.data.sim_data import EMESimulationData
from .components.eme.grid import (
EMECompositeGrid,
EMEExplicitGrid,
EMEGrid,
EMEModeSpec,
EMEUniformGrid,
)
from .components.eme.monitor import (
EMECoefficientMonitor,
EMEFieldMonitor,
EMEModeSolverMonitor,
EMEMonitor,
)

# EME
from .components.eme.simulation import EMESimulation
from .components.eme.sweep import EMEFreqSweep, EMELengthSweep, EMEModeSweep, EMEPeriodicitySweep

# field projection
from .components.field_projection import FieldProjector

# frequency conversion utilities
from .components.frequencies import FreqRange, frequencies, wavelengths

# geometry
from .components.geometry.base import Box, ClipOperation, Geometry, GeometryGroup, Transformed
from .components.geometry.mesh import TriangleMesh
from .components.geometry.polyslab import PolySlab
from .components.geometry.primitives import Cylinder, Sphere
from .components.grid.corner_finder import CornerFinderSpec
from .components.grid.grid import Coords, Coords1D, FieldGrid, Grid, YeeGrid
from .components.grid.grid_spec import (
AutoGrid,
CustomGrid,
CustomGridBoundaries,
GridRefinement,
GridSpec,
LayerRefinementSpec,
QuasiUniformGrid,
UniformGrid,
)

# lumped elements
from .components.lumped_element import (
AdmittanceNetwork,
CoaxialLumpedResistor,
LinearLumpedElement,
LumpedElement,
LumpedResistor,
RectangularLumpedElement,
RLCNetwork,
)

# medium
# for docs
from .components.medium import (
PEC,
PEC2D,
PMC,
AbstractMedium,
AnisotropicMedium,
CustomAnisotropicMedium,
CustomDebye,
CustomDrude,
CustomLorentz,
CustomMedium,
CustomPoleResidue,
CustomSellmeier,
Debye,
Drude,
FullyAnisotropicMedium,
HammerstadSurfaceRoughness,
HuraySurfaceRoughness,
KerrNonlinearity,
Lorentz,
LossyMetalMedium,
Medium,
Medium2D,
NonlinearModel,
NonlinearSpec,
NonlinearSusceptibility,
PECMedium,
PerturbationMedium,
PerturbationPoleResidue,
PMCMedium,
PoleResidue,
Sellmeier,
SurfaceImpedanceFitterParam,
TwoPhotonAbsorption,
medium_from_nk,
)
from .components.mode.data.sim_data import ModeSimulationData

# Mode
from .components.mode.simulation import ModeSimulation

# modes
from .components.mode_spec import ModeSpec

# monitors
from .components.monitor import (
AuxFieldTimeMonitor,
DiffractionMonitor,
DirectivityMonitor,
FieldMonitor,
FieldProjectionAngleMonitor,
FieldProjectionCartesianMonitor,
FieldProjectionKSpaceMonitor,
FieldProjectionSurface,
FieldTimeMonitor,
FluxMonitor,
FluxTimeMonitor,
ModeMonitor,
ModeSolverMonitor,
Monitor,
PermittivityMonitor,
)
from .components.parameter_perturbation import (
CustomChargePerturbation,
CustomHeatPerturbation,
IndexPerturbation,
LinearChargePerturbation,
LinearHeatPerturbation,
NedeljkovicSorefMashanovich,
ParameterPerturbation,
PermittivityPerturbation,
)

# run time spec
from .components.run_time_spec import RunTimeSpec

# scene
# scene
from .components.scene import Scene

# simulation
from .components.simulation import Simulation
from .components.source.base import Source
from .components.source.current import (
CustomCurrentSource,
PointDipole,
UniformCurrentSource,
)
from .components.source.field import (
TFSF,
AstigmaticGaussianBeam,
CustomFieldSource,
FixedAngleSpec,
FixedInPlaneKSpec,
GaussianBeam,
ModeSource,
PlaneWave,
)

# sources
from .components.source.time import (
ContinuousWave,
CustomSourceTime,
GaussianPulse,
SourceTime,
)

# structures
from .components.structure import MeshOverrideStructure, Structure

# subpixel
from .components.subpixel_spec import (
ContourPathAveraging,
HeuristicPECStaircasing,
PECConformal,
PolarizedAveraging,
Staircasing,
SubpixelSpec,
SurfaceImpedance,
VolumetricAveraging,
)

# time modulation
from .components.time_modulation import (
ContinuousWaveTimeModulation,
ModulationSpec,
SpaceModulation,
SpaceTimeModulation,
)
from .components.transformation import RotationAroundAxis
from .components.viz import VisualizationSpec, restore_matplotlib_rcparams

# config
from .config import config

# constants imported as `C_0 = td.C_0` or `td.constants.C_0`
from .constants import C_0, EPSILON_0, ETA_0, HBAR, K_B, MU_0, Q_e, inf
from .log import log, set_logging_console, set_logging_file

# material library dict imported as `from tidy3d import material_library`
# get material `mat` and variant `var` as `material_library[mat][var]`
from .material_library.material_library import material_library
from .material_library.parametric_materials import Graphene

# updater
from .updater import Updater

# version
from .version import __version__

Check failure on line 393 in tidy3d/__init__.py

View workflow job for this annotation

GitHub Actions / verify-linting

Ruff (I001)

tidy3d/__init__.py:3:1: I001 Import block is un-sorted or un-formatted


def set_logging_level(level: str) -> None:
Expand All @@ -405,312 +406,314 @@
Transformed.update_forward_refs()
ClipOperation.update_forward_refs()
GeometryGroup.update_forward_refs()
ConvectionBC.update_forward_refs()

__all__ = [
"C_0",
"DATA_TYPE_MAP",
"EPSILON_0",
"ETA_0",
"HBAR",
"K_B",
"MU_0",
"PEC",
"PEC2D",
"PMC",
"PML",
"TFSF",
"Absorber",
"AbsorberParams",
"AbstractFieldProjectionData",
"AbstractMedium",
"AdmittanceNetwork",
"AnisotropicMedium",
"AntennaMetricsData",
"ApodizationSpec",
"AstigmaticGaussianBeam",
"AstigmaticGaussianBeamProfile",
"AugerRecombination",
"AutoGrid",
"AuxFieldTimeData",
"AuxFieldTimeMonitor",
"BlochBoundary",
"Boundary",
"BoundaryEdge",
"BoundaryEdgeType",
"BoundarySpec",
"Box",
"CaugheyThomasMobility",
"CellDataArray",
"ChargeConductorMedium",
"ChargeDataArray",
"ChargeInsulatorMedium",
"ChargeToleranceSpec",
"ClipOperation",
"CoaxialLumpedResistor",
"ConstantDoping",
"ConstantMobilityModel",
"ContinuousWave",
"ContinuousWaveTimeModulation",
"ContourPathAveraging",
"ConvectionBC",
"Coords",
"Coords1D",
"CornerFinderSpec",
"CurrentBC",
"CustomAnisotropicMedium",
"CustomChargePerturbation",
"CustomCurrentSource",
"CustomDebye",
"CustomDrude",
"CustomFieldSource",
"CustomGrid",
"CustomGridBoundaries",
"CustomHeatPerturbation",
"CustomLorentz",
"CustomMedium",
"CustomPoleResidue",
"CustomSellmeier",
"CustomSourceTime",
"Cylinder",
"DCCurrentSource",
"DCVoltageSource",
"Debye",
"DefaultAbsorberParameters",
"DefaultPMLParameters",
"DefaultStablePMLParameters",
"DeviceCharacteristics",
"DiffractionData",
"DiffractionDataArray",
"DiffractionMonitor",
"DirectivityData",
"DirectivityMonitor",
"DistanceUnstructuredGrid",
"Drude",
"EMECoefficientData",
"EMECoefficientDataArray",
"EMECoefficientDataset",
"EMECoefficientMonitor",
"EMECompositeGrid",
"EMEExplicitGrid",
"EMEFieldData",
"EMEFieldDataset",
"EMEFieldMonitor",
"EMEFreqSweep",
"EMEGrid",
"EMELengthSweep",
"EMEModeIndexDataArray",
"EMEModeSolverData",
"EMEModeSolverDataset",
"EMEModeSolverMonitor",
"EMEModeSpec",
"EMEModeSweep",
"EMEMonitor",
"EMEPeriodicitySweep",
"EMESMatrixDataArray",
"EMESMatrixDataset",
"EMEScalarFieldDataArray",
"EMEScalarModeFieldDataArray",
"EMESimulation",
"EMESimulationData",
"EMESweepSpec",
"EMEUniformGrid",
"FieldData",
"FieldDataset",
"FieldGrid",
"FieldMonitor",
"FieldProjectionAngleData",
"FieldProjectionAngleDataArray",
"FieldProjectionAngleMonitor",
"FieldProjectionCartesianData",
"FieldProjectionCartesianDataArray",
"FieldProjectionCartesianMonitor",
"FieldProjectionKSpaceData",
"FieldProjectionKSpaceDataArray",
"FieldProjectionKSpaceMonitor",
"FieldProjectionSurface",
"FieldProjector",
"FieldTimeData",
"FieldTimeDataset",
"FieldTimeMonitor",
"FixedAngleSpec",
"FixedInPlaneKSpec",
"FluidMedium",
"FluidSpec",
"FluxData",
"FluxDataArray",
"FluxMonitor",
"FluxTimeData",
"FluxTimeDataArray",
"FluxTimeMonitor",
"FossumCarrierLifetime",
"FreqRange",
"FullyAnisotropicMedium",
"GaussianBeam",
"GaussianBeamProfile",
"GaussianDoping",
"GaussianPulse",
"Geometry",
"GeometryGroup",
"Graphene",
"Grid",
"GridRefinement",
"GridRefinementLine",
"GridRefinementRegion",
"GridSpec",
"HammerstadSurfaceRoughness",
"HeatBoundarySpec",
"HeatChargeBoundarySpec",
"HeatChargeSimulation",
"HeatChargeSimulationData",
"HeatDataArray",
"HeatFluxBC",
"HeatFromElectricSource",
"HeatSimulation",
"HeatSimulationData",
"HeatSource",
"HeuristicPECStaircasing",
"HuraySurfaceRoughness",
"IndexPerturbation",
"IndexedDataArray",
"IndexedFieldVoltageDataArray",
"IndexedTimeDataArray",
"IndexedVoltageDataArray",
"InsulatingBC",
"IsothermalSteadyChargeDCAnalysis",
"KerrNonlinearity",
"LayerRefinementSpec",
"LinearChargePerturbation",
"LinearHeatPerturbation",
"LinearLumpedElement",
"Lorentz",
"LossyMetalMedium",
"LumpedElement",
"LumpedResistor",
"Medium",
"Medium2D",
"MediumMediumInterface",
"MeshOverrideStructure",
"ModeAmpsDataArray",
"ModeData",
"ModeIndexDataArray",
"ModeMonitor",
"ModeSimulation",
"ModeSimulationData",
"ModeSolverData",
"ModeSolverDataset",
"ModeSolverMonitor",
"ModeSource",
"ModeSpec",
"ModulationSpec",
"Monitor",
"MultiPhysicsMedium",
"NedeljkovicSorefMashanovich",
"NonlinearModel",
"NonlinearSpec",
"NonlinearSusceptibility",
"PECBoundary",
"PECConformal",
"PECMedium",
"PMCBoundary",
"PMCMedium",
"PMLParams",
"PMLTypes",
"ParameterPerturbation",
"Periodic",
"PermittivityData",
"PermittivityDataset",
"PermittivityMonitor",
"PermittivityPerturbation",
"PerturbationMedium",
"PerturbationPoleResidue",
"PlaneWave",
"PlaneWaveBeamProfile",
"PointDataArray",
"PointDipole",
"PolarizedAveraging",
"PoleResidue",
"PolySlab",
"Q_e",
"QuasiUniformGrid",
"RLCNetwork",
"RadiativeRecombination",
"RectangularLumpedElement",
"RotationAroundAxis",
"RunTimeSpec",
"ScalarFieldDataArray",
"ScalarFieldTimeDataArray",
"ScalarModeFieldCylindricalDataArray",
"ScalarModeFieldDataArray",
"Scene",
"Sellmeier",
"SemiconductorMedium",
"ShockleyReedHallRecombination",
"Simulation",
"SimulationBoundary",
"SimulationData",
"SlotboomBandGapNarrowing",
"SolidMedium",
"SolidSpec",
"Source",
"SourceTime",
"SpaceModulation",
"SpaceTimeModulation",
"SpatialDataArray",
"SpatialVoltageDataArray",
"Sphere",
"StablePML",
"Staircasing",
"SteadyCapacitanceData",
"SteadyCapacitanceMonitor",
"SteadyElectricFieldData",
"SteadyElectricFieldMonitor",
"SteadyEnergyBandData",
"SteadyEnergyBandMonitor",
"SteadyFreeCarrierData",
"SteadyFreeCarrierMonitor",
"SteadyPotentialData",
"SteadyPotentialMonitor",
"SteadyVoltageDataArray",
"Structure",
"StructureBoundary",
"StructureSimulationBoundary",
"StructureStructureInterface",
"SubpixelSpec",
"SurfaceImpedance",
"SurfaceImpedanceFitterParam",
"TemperatureBC",
"TemperatureData",
"TemperatureMonitor",
"TetrahedralGridDataset",
"Transformed",
"TriangleMesh",
"TriangularGridDataset",
"TwoPhotonAbsorption",
"UniformCurrentSource",
"UniformGrid",
"UniformHeatSource",
"UniformUnstructuredGrid",
"UnsteadyHeatAnalysis",
"UnsteadySpec",
"Updater",
"VisualizationSpec",
"VoltageBC",
"VoltageSourceType",
"VolumeMeshData",
"VolumeMeshMonitor",
"VolumeMesher",
"VolumeMesherData",
"VolumetricAveraging",
"YeeGrid",
"__version__",
"config",
"frequencies",
"inf",
"log",
"material_library",
"medium_from_nk",
"restore_matplotlib_rcparams",
"set_logging_console",
"set_logging_file",
"wavelengths",
"NaturalConvectionVerticalSpec",
]

Check failure on line 719 in tidy3d/__init__.py

View workflow job for this annotation

GitHub Actions / verify-linting

Ruff (RUF022)

tidy3d/__init__.py:411:11: RUF022 `__all__` is not sorted
101 changes: 100 additions & 1 deletion tidy3d/components/tcad/boundary/heat.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
"""Defines heat material specifications"""

from __future__ import annotations

import pydantic.v1 as pd

from typing import Union
from tidy3d.components.tcad.boundary.abstract import HeatChargeBC
from tidy3d.constants import HEAT_FLUX, HEAT_TRANSFER_COEFF, KELVIN

Check failure on line 9 in tidy3d/components/tcad/boundary/heat.py

View workflow job for this annotation

GitHub Actions / verify-linting

Ruff (I001)

tidy3d/components/tcad/boundary/heat.py:3:1: I001 Import block is un-sorted or un-formatted


class TemperatureBC(HeatChargeBC):
Expand Down Expand Up @@ -39,6 +40,100 @@
units=HEAT_FLUX,
)

#TODO Should I adapt to Tidy3D units (e.g. micrometers), or keep the original ones?
THERMAL_CONDUCTIVITY_UNITS = "W/(m*K)"
DYNAMIC_VISCOSITY_UNITS = "Pa*s"
SPECIFIC_HEAT_UNITS = "J/(kg*K)"
DENSITY_UNITS = "kg/m**3"
THERMAL_EXPANSIVITY_UNITS = "1/K"
LENGTH_UNITS = "m"
ACCELERATION_UNITS = "m/s**2"

class NaturalConvectionVerticalSpec(HeatChargeBC):
"""
Specification for natural convection from a vertical plate.

This class calculates the heat transfer coefficient (h) based on fluid
properties and an expected temperature difference, then provides these
values as 'base' and 'exponent' for a generalized heat flux equation
q = base * (T_surf - T_fluid)^exponent.
"""
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe add in the docstring that one can define the constants in SI with from_si_units and maybe add a couple of examples like with the rest of the BC classes: one using the standard constructor and another one with the from_si_units function?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it can help readability.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe add an example of how to create this BC. It'll be good for our docs

# --- Input Parameters ---
fluid_k: pd.NonNegativeFloat = pd.Field(
title="Fluid Thermal Conductivity",
description="Thermal conductivity (k) of the fluid.",
units=THERMAL_CONDUCTIVITY_UNITS,
)
fluid_mu: pd.NonNegativeFloat = pd.Field(
title="Fluid Dynamic Viscosity",
description="Dynamic viscosity (μ) of the fluid.",
units=DYNAMIC_VISCOSITY_UNITS,
)
fluid_Cp: pd.NonNegativeFloat = pd.Field(
title="Fluid Specific Heat",
description="Specific heat capacity (Cp) of the fluid at constant pressure.",
units=SPECIFIC_HEAT_UNITS,
)
fluid_rho: pd.NonNegativeFloat = pd.Field(
title="Fluid Density",
description="Density (ρ) of the fluid.",
units=DENSITY_UNITS,
)
fluid_beta: pd.NonNegativeFloat = pd.Field(
title="Fluid Thermal Expansivity",
description="Thermal expansion coefficient (β) of the fluid.",
units=THERMAL_EXPANSIVITY_UNITS,
)
plate_L: pd.NonNegativeFloat = pd.Field(
title="Plate Characteristic Length",
description="Characteristic length (L), defined as the height of the vertical plate.",
units=LENGTH_UNITS,
)

gravity: pd.NonNegativeFloat = pd.Field(
default=9.80665,
title="Gravitational Acceleration",
description="Gravitational acceleration (g).",
units=ACCELERATION_UNITS,
)

def _compute_parameters(self):

# Calculate the Rayleigh Number (Ra_L)
rayleigh_numerator_notemp = (
self.gravity
* self.fluid_beta
* self.fluid_rho ** 2
* self.fluid_Cp
* self.plate_L ** 3
)
rayleigh_denominator = self.fluid_mu * self.fluid_k
Ra_L = rayleigh_numerator_notemp / rayleigh_denominator

# Calculate the denominator term from the Nusselt number correlation
# This term is related to the Prandtl Number (Pr = mu * Cp / k)
pr_term_inner_num = 0.492 * self.fluid_k
pr_term_inner_den = self.fluid_mu * self.fluid_Cp

pr_term_inner = pr_term_inner_num / pr_term_inner_den
pr_denominator = (1 + pr_term_inner ** (9 / 16)) ** (4 / 9)

# Select formula based on flow regime (determined by Ra_L)
if Ra_L <= 1e9:
# Laminar Flow
h_factor_linear = 0.68
h_factor_non_linear = (0.670 * Ra_L ** (1 / 6)) / pr_denominator
elif 1e9 < Ra_L <= 1e13:
# Turbulent Flow
h_factor_linear = 0.825
h_factor_non_linear = (0.387 * Ra_L ** (1 / 6)) / pr_denominator
else:
raise ValueError(f"Ra_l={Ra_L} should be smaller than 1e13 for NaturalConvectionVerticalSpec")

h = (self.fluid_k / self.plate_L) * h_factor_linear
h_nonlinear = (self.fluid_k / self.plate_L) * h_factor_non_linear
exponent = 1 + 1/6
return h, h_nonlinear, exponent
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

logic: Method returns computed values but they're not used anywhere. Consider if this method should modify instance state or be called differently.


class ConvectionBC(HeatChargeBC):
"""Convective thermal boundary conditions.
Expand All @@ -55,8 +150,12 @@
units=KELVIN,
)

transfer_coeff: pd.NonNegativeFloat = pd.Field(
transfer_coeff: Union[pd.NonNegativeFloat, NaturalConvectionVerticalSpec] = pd.Field(
title="Heat Transfer Coefficient",
description=f"Heat flux value in units of {HEAT_TRANSFER_COEFF}.",
units=HEAT_TRANSFER_COEFF,
)

#TODO Maybe I should find a better place for these lines.
NaturalConvectionVerticalSpec.update_forward_refs()
ConvectionBC.update_forward_refs()
2 changes: 1 addition & 1 deletion tidy3d/components/tcad/types.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
"""File containing classes required for the setup of a DEVSIM case."""

from __future__ import annotations

from tidy3d.components.tcad.bandgap import SlotboomBandGapNarrowing
from tidy3d.components.tcad.boundary.charge import CurrentBC, InsulatingBC, VoltageBC
from tidy3d.components.tcad.boundary.heat import ConvectionBC, HeatFluxBC, TemperatureBC
from tidy3d.components.tcad.boundary.heat import ConvectionBC, HeatFluxBC, TemperatureBC, NaturalConvectionVerticalSpec

Check failure on line 7 in tidy3d/components/tcad/types.py

View workflow job for this annotation

GitHub Actions / verify-linting

Ruff (F401)

tidy3d/components/tcad/types.py:7:91: F401 `tidy3d.components.tcad.boundary.heat.NaturalConvectionVerticalSpec` imported but unused
from tidy3d.components.tcad.generation_recombination import (
AugerRecombination,
RadiativeRecombination,
Expand Down
Loading