What's Changed
Added
- Added
CornerFinderSpec.corner_rounding_collapse_extentsoLayerRefinementSpeccan recover sharp corners that pass the legacy angle threshold from small rounded or chamfered imported geometry. - Added
ImpedanceSpecto support complex-valuedLumpedPortimpedance. Theimpedancefield now accepts either a plain real number (e.g.50) or anImpedanceSpec(impedance=..., frequency=...)for complex-valued loads. A complex impedanceZ = R + jXis mapped to a series RL or RC load at the given measurement frequency, enabling reactive terminations in S-parameter simulations. Purely reactive loads (Re(Z) = 0) are not supported;Re(Z)must be strictly positive to ensure a stable FDTD pole. - Added a dedicated PyTorch wrapper plugin documentation page under
api/plugins/pytorch. - Added autograd support for
ClipOperationgeometry derivatives, including union, difference, intersection, and symmetric_difference. - Added the
tidy3d mcpcommand for running the Tidy3D MCP server from the active Tidy3D environment. - Added
Palik_NoLossmaterial-fitter refits for the low-loss Palik ranges of GaAs, Ge, SiO2, and cSi, andPalik_LowLossvariants for the previous Palik fits of GaAs, Ge, InP, SiO2, and cSi. - Added per-interface physical residual diagnostics for EME: incident-normalized squared tangential E/H field residuals, corresponding non-PML-aperture residuals, and the flux-weighted power conservation defect, stored on
EMESimulationData.diagnosticswhenEMESimulation.eme_diagnostics=True. - Added a
progresskeyword (defaultTrue) toEMESimulation.compute_overlaps,EMESimulation.propagate_from_overlaps, andEMESimulation.propagatethat shows a per-phaserichprogress bar on the logging console; passprogress=Falseto silence it. - Accelerated charge solver support for the Masetti mobility model.
DeviceCharacteristics.dc_convergence(newSteadyConvergenceData) flags per-bias Newton convergence and exposes the per-iteration residual trace, so callers can mask the I-V/C-V curves by the converged biases and inspect at which iteration each bias crossed the tolerance.- Added support for explicit payment type, priority, and vGPU allocation settings when submitting component modeler batch tasks.
TFSFsource now exposes anangular_specfield (FixedInPlaneKSpecorFixedAngleSpec) mirroringPlaneWave, enabling fixed-angle (frequency-independent propagation direction) TFSF setups for isolated scatterers. Fixed-angle TFSF rejectsPeriodicandBlochBoundarytransverse boundaries and is intended to be used with absorbing (PML/Absorber/StablePML) transverse boundaries; 2D simulations may keep the conventionalPeriodicon the zero-width out-of-plane axis as long as the wave's k-vector has no component along it.- Added
PointCloudFieldMonitorandPointCloudFieldDatafor frequency-domain E/H field sampling at custom point-cloud coordinates.PointCloudFieldDatais indexed by point, so structured-grid field plotting helpers such asSimulationData.plot_field()do not support it. - Added
SteadyChargeResidualMonitor, a debug-grade Charge-simulation monitor that records the per-node signed residual of each governing equation (residual_potentialfor the Poisson equation,residual_electronsfor the electron continuity equation,residual_holesfor the hole continuity equation, plusresidual_temperaturefor the heat equation when the thermal solver is active). The values are dimensionless and on the same scale as the simulation's convergence tolerance, so the nodes with the largest magnitude are where the solution least satisfies the equations, helping locate the least-converged regions. Available only through the accelerated solver. - Added the dipole emission study plugin, including
DipoleEmissionMonitor, coreDipoleEmissionDatamonitor outputs, pluginDipoleEmissionStudyDataresults,SphericalAngleDataArray, compact storedradiation_intensityoutputs, study-level derivedradiation_intensity_transferproperties, optional position- and axis-dependent integration weights, and optional selected-position radiation-intensity samples. - Added
Dx,Dy, andDzoutput support toPointCloudFieldMonitor, reconstructingD / epsilon_0from raw E-field samples and diagonal Yee permittivity; sampled off-diagonal Yee permittivity emits a warning and uses diagonal components only. - Added
gds_precisiontoGeometry.to_gds_file(),Structure.to_gds_file(), andSimulation.to_gds_file()to control the coordinate precision written to GDS exports. - Added
merge_adjacenttoGeometry.from_gds(); setmerge_adjacent=Trueto merge fractured same-layer GDS polygons during import for roundtrip reconstruction. - HeatSimulation and HeatChargeSimulation cloud runs now create a volume mesh before running the solver; use web.run(), run_async(), Job.run(), Job.step(), Batch.run(), or Batch.step() instead of separate upload/start/monitor calls for these simulations. Uniform Heat/HeatCharge batches advance the mesh and solver workflow automatically, with Batch.run() starting each solver step as soon as that simulation's mesh step completes. Batch.estimate_cost() reports the summed cost of the shared next workflow step for supported uniform batches; after estimating the mesh step, run it first before estimating the solver step. Batch.estimate_cost() raises for mixed or non-uniform multi-step batches; use Job.estimate_cost() per job in those cases. Cache-only batch results may record
NoneinBatchData.task_idsbecause no server task ID exists. Mixed batches containing both regular simulations and Heat/HeatCharge simulations run those groups separately; split them into separate batches for maximum parallelism. - Added thermionic Schottky contacts to the accelerated charge solver (DC and small-signal AC). Schottky physics is an opt-in on
VoltageBCviamodel="schottky_mott"; the Mott rulephi_Bn = W - chi,phi_Bp = E_g - phi_Bnis built from per-medium material properties —work_functionon the adjacentChargeConductorMediumandelectron_affinity/richardson_electron/richardson_holeon the adjacentSemiconductorMedium. Defaultmodel="ohmic"is the standard ohmic contact. Schottky contacts compose withSSACAnalysis/IsothermalSSACAnalysis, enabling Mott-Schottky1/C^2extraction on Schottky diodes. - Native autograd support for
FluxMonitorusing hidden forward field storage in autograd runs. Setenable_adjoint=TrueonFluxMonitorobjects whose.fluxoutput is used in an autograd objective; this stores hidden surface field data for all requested flux-monitor frequencies. - Added
PalankovskiQuayApproxCarrierLifetime: doping- and temperature-dependent SRH lifetime in the Palankovski–Quay empirical Scharfetter form. Supported by the accelerated charge solver only. - Added faster adjoint source construction for
ModeMonitor,GaussianOverlapMonitor,AstigmaticGaussianOverlapMonitor, andDiffractionMonitordata with many active amplitudes. - Improved polygon triangulation performance using Shapely constrained Delaunay triangulation.
LayerRefinementSpecnow refines axis-unaligned in-plane metal edges (in_plane_edge_refinement, default"mirror_corner") and resolves small disjoint metal geometries such as vias (min_steps_per_geometry, default2), with a tunableCornerFinderSpec.axis_aligned_angle_threshold; both are on by default and give existing setups a finer mesh, set them toNoneto keep the previous mesh.ModeTimeMonitorrecords time-domain modal amplitudes at a waveguide
cross-section, projecting the running Yee-grid fields onto the mode profiles
solved at a single frequency (freq_spec, defaulting to the first source's
central frequency).SolidMediumnow accepts an optionalvelocityvector (inum/s;from_si_unitstakesm/sand converts), enabling a convective transport term in heat simulations for structures using that medium (bothcapacityanddensityare required whenvelocityis nonzero).FluxMonitorandFluxTimeMonitornow support staggered Yee-grid surface integration viause_colocated_integration=False, computed on the server with the same scheme asFieldMonitor(colocate=False, use_colocated_integration=False)flux, keeping tangential fields at their native Yee positions to avoid interpolation across material discontinuities, including under periodic and Bloch boundaries.ThermalContactResistanceboundary condition for heat simulations: an interfacial thermal resistance (thermal contact / Kapitza resistance, inK*um^2/W;from_si_unitstakesm^2*K/W) placed on aStructureStructureInterfaceorMediumMediumInterfaceallows a temperature jump proportional to the heat flux across the interface between two touching solids.- Added
tidy3d.web.refresh_licenses()andtidy3d configure --refresh-licensesto clear cached local license entitlements so the next local license check fetches current server state. Successful API key or API endpoint configuration updates now refresh local license state automatically. Rejected configuration updates do not refresh local license state; when combined with explicit refresh, the command or call reports that the cache was not refreshed. If automatic refresh fails after configuration is saved,tidy3d configureexits nonzero andweb.configure(...)raises while leaving the saved configuration in place. - Schottky contacts (
VoltageBCwithmodel="schottky_mott") now support Fermi-Dirac carrier statistics (fermi_dirac=Truein the charge analysis spec), enabling Schottky devices with degenerately doped semiconductor regions in DC and small-signal AC analyses. - Added
PointCloudPermittivityMonitorfor recording diagonal permittivity components for requested point clouds by sampling each component from its nearest nativeEx/Ey/EzYee-grid location. MeshOverrideStructureaccepts amin_steps_per_sizefield to set the grid size relative to the structure's bounding box (bounding box size divided by the requested number of steps, ignored on axes whose bounding box size is zero or infinite); when bothdlandmin_steps_per_sizeare set along a dimension, the finer grid size is used.dlis now optional (defaults to no override) so an override can be specified withmin_steps_per_sizealone.- Added
penetrabletoLossyMetalMedium: whenTrue, the metal is solved as a regular conductive medium with subpixel averagingSimulation.subpixel.dielectric, instead of the lossy-metal-specific handling selected bySimulation.subpixel.lossy_metal. - Added
tidy3d.RadiationBCgray-body surface radiation boundary condition and an optionalemissivityfield ontidy3d.ConvectionBCfor combined convective-radiative heat exchange, supported in heat and conduction+heat simulations. - Added
SurfaceRecombinationBCfor modeling Shockley-Read-Hall surface recombination and fixed interface sheet charge on semiconductor boundaries and zone interfaces, supported by the accelerated charge solver. - Added
ThinLensProfile,ThinLensBeam, andThinLensOverlapMonitorfor constructing,
injecting, and decomposing vectorial focused beams from a thin-lens angular spectrum. LumpedResistor,LinearLumpedElement, andLumpedPortnow accept one-dimensional (line) geometries with two zero-size dimensions, in addition to planar geometries; a line element/port is realized as a single-grid-cell-wideMedium2Dsheet whose normal axis is chosen at meshing time to straddle any adjacent material interface.AnisotropicConductivityforSolidMedium.conductivity, specifying an anisotropic (tensor) thermal conductivity via principal valuesxx,yy,zzplus an optionalrotation. A scalarconductivityremains fully supported for isotropic materials.SolidMedium.from_si_unitsalso accepts anAnisotropicConductivity(its principals are converted from SI units).- Added
ElectromagneticFieldData.field_intensity()for computing intensity from selected electric field components using the existing colocated intensity semantics. VarshniEnergyBandGapandConstantEnergyBandGapnow expose aband_gap_energy(temperature)method returning the energy band gap (in eV) at the requested temperature(s).- Added
geometry_toleranceto unstructured grid specs, raising the distance below which coincident geometric entities are fused during heat/charge meshing (refinement lines remain subject to a built-in1e-6um minimum length). - Semiconductor heterojunction support in charge simulations:
SemiconductorMedium.electron_affinitysets the band alignment at semiconductor/semiconductor interfaces, with thermionic-emission interface transport controlled byrichardson_electronandrichardson_hole. - Added
tidy3d troubleshootCLI group withconnection,environment, andreportsubcommands that produce paste-friendly support bundles matching the Tidy3D issue-report template, plustidy3d.web.diagnose_connection(),tidy3d.web.diagnose_environment(), andtidy3d.web.diagnose_report()helpers for Python users.
Changed
WavePortandTerminalWavePortmesh refinement now interpretsnum_grid_cellsas the cell count along the largest transverse dimension (the smaller dimension is aspect-ratio-scaled), with the default raised from 5 to 12. Two grid-snapping points are also emitted at opposite corners of the port plane.- Changed the default autograd
minimum_spacing_fractionfrom 0.01 to 0.001; set it back to 0.01 in your config to keep previous spacing behavior. UniformUnstructuredGrid.min_edges_per_circumferenceandmin_edges_per_sidenow accept0, which skips the corresponding local mesh-size contribution. A deprecation warning is emitted when either field is left at its default: the default will change to0in the next release. Set the fields explicitly to preserve the current behavior.- Changed grid validation to raise a units error when
UniformGrid.dlor generatedAutoGrid/QuasiUniformGridcell sizes are below 1e-6 um. - Improved memory usage and runtime for autograd local far-field projections in the 3D paired approximate path used by Cartesian and k-space monitors with
far_field_approx=True. - Reduced peak memory usage when differentiating exact local field projections (
far_field_approx=False). - Increased default
ChargeToleranceSpec.max_itersfrom30to120; set it explicitly to keep the previous behavior. HeatChargeSimulation.use_accelerated_solver=False(selecting the CPU charge solver) is now validated at construction and raises aValidationErroronuse_accelerated_solverfor configurations the CPU solver cannot run: heat and conduction simulations (which always run on the GPU accelerated solver) and charge simulations using GPU-accelerated-only features such asMasettiMobilityor SSACat_voltagesbias-point selection. The flag now defaults toTrue(wasOptionaldefaulting toNone) and continues to use the GPU accelerated charge solver.TFSFnow rejectsPeriodicandBlochBoundaryalong its injection axis at simulation construction time. The wave reaching such a boundary would be re-injected into the scattered-field region, breaking the TFSF formulation; previously this misconfiguration was accepted and produced silently incorrect results.- EME overlap and flux calculations now use the Yee-staggered integration convention used by mode normalization. This improves modal orthogonality and interface S-matrix reciprocity. EME scattering matrices may differ slightly from earlier versions, with the difference decreasing at higher grid resolution.
EMESimulationData.smatrix_in_basis, the local-solverEMESimulation.smatrix_in_basis, andEMESimulationData.field_in_basisre-express the scattering matrix (or field) in this same Yee convention by default (matching how it was computed), switching to colocated integration when a target basis stores its fields colocated (colocate=True) or sits on a different grid than the port modes, where native-Yee integration is impossible; if such a target cannot provide colocated integration (e.g. acolocate=FalseEMEModeSolverMonitor), the call raises rather than silently mixing conventions. Note thatEMEModeSolverMonitor— the usual way to provide a target basis — and field monitors default tocolocate=True, so monitor-based rebasing uses the colocated path unlesscolocate=Falseis set on the target monitor. A target basis's ownuse_colocated_integrationis not honored — the rebasing convention is otherwise fixed by the (Yee) port modes. - Improved runtime and memory usage for local single-precision mode solver runs with lossless materials and
num_pml=(0, 0). - Changed the default
cSimaterial-library variant fromGreen2008toPalik_LowLoss. Accessing thecSidefault medium implicitly now emits a migration warning. Callers that need pre-change results should requestGreen2008explicitly, including in the 1.2 to 1.45 um overlap where both variants are valid.Palik_LowLossis valid from 1.2 to 250 um.Green2008covers pre-change results from 0.25 to 1.2 um, andPalik_Lossyis available from 0.1 to 1.4 um when the lossy Palik model is desired. - Changed the
cSimaterial-librarySi_MultiPhysicsoptical model fromGreen2008toPalik_LowLoss, aligning it with the newcSidefault optical model. - Updated tidy3d MCP startup for FastMCP 3.2.4 compatibility and documented exact remote MCP endpoint URLs for custom deployments.
- Mesh override structures with
shadow=Falsenow reuse a nearby existing grid line instead of always inserting a new one at their bounding box, so refined regions add fewer grid lines; affected setups may see slightly fewer or shifted grid lines around such overrides. - Changed adjoint gradients to skip sources whose effective magnitude underflows solver precision and treat those contributions as zero.
HeatChargeSimulationnow raises a setup error when heat-solver features are requested in a non-isothermal charge analysis: solid-medium advection (SolidMedium.velocity) and resistive interfaces (ThermalContactResistance) are applied by the heat solver (including heat coupled with electrical conduction) but were previously ignored silently in non-isothermal charge (coupled charge+heat) runs. Heat, conduction+heat, and isothermal charge analyses are unaffected.ThermalContactResistanceis now also listed in the heat boundary-conditions API reference.- Path integrals with
extrapolate_to_endpoints=False(the default for current integrals) now use a centered box-rule treatment at the endpoints instead of linear extrapolation, slightly changing coarse-mesh results forAxisAlignedCurrentIntegral,path_integrals_from_lumped_element,CustomImpedanceSpec.from_bounding_box(used byTerminalWavePort), lumped ports, andTerminalComponentModeler. Voltage integrals (defaultextrapolate_to_endpoints=True) are unchanged. - Made
Geometry.to_gds_file(),Structure.to_gds_file(), andSimulation.to_gds_file()raiseSetupErrorwhen the requested precision is too fine for the exported coordinates or when exported coordinates are non-finite. - EMEModeSpec.precision now defaults to "double"; set precision="auto" to resolve precision per EME cell -- double where that cell's mode solve contains a good conductor, single otherwise.
EME monitor storage-size estimates now account for the double-precision (complex128) data EME writes (previously about 2x low); simulations near the storage limit may now report a larger size or exceed it. - Heat and HeatCharge solver tasks are now billed based on their associated computational cost, like other solvers. For Heat and HeatCharge workflow jobs,
Job.estimate_cost()andBatch.estimate_cost()now explicitly state when an estimate is for the mesh step only and thatJob.step()orBatch.step()should be run before estimating the solver step. For variable-cost charge solves, estimates now show a typical FlexCredit cost separately from the maximum cost when the server provides one. The billed charge-solver cost depends on the solver iterations run to convergence; this is usually much smaller than the maximum allowed iterations, but hard-to-converge cases can reach the maximum cost. - Gaussian-like overlap monitors now require their monitor plane to lie in a homogeneous, isotropic background medium.
- The
relax_courantoption is now orientation independent and benefits a wider range of simulations. - Consolidated the TCAD band-gap classes into a single module:
ConstantEnergyBandGapandVarshniEnergyBandGapnow live intidy3d.components.tcad.bandgap(previouslytidy3d.components.tcad.bandgap_energy, which has been removed) alongsideSlotboomBandGapNarrowing. The public import path (import tidy3d as td; td.ConstantEnergyBandGap) is unchanged; only code importing directly from the internalbandgap_energymodule path needs to update its import. - Finest grid region visualization in
Simulation.plot_grid()is now off by default; opt in by passing a nonzerofinest_grid_region_alpha.
Fixed
-
Suppressed the
Simulationstructure-at-boundary warning for structures touchingPeriodicorBlochBoundaryedges, while keeping the warning for other boundary types unless structure extrusion is enabled. -
Improved auto-generated API documentation for classes with computed default values (e.g.
NedeljkovicSorefMashanovich), eliminating malformed Parameters sections and a long tail of other documentation build issues. -
Raise a validation error when an automatically added PEC frame (around a mode source with
PECFrameor an internal absorber) overlaps the absorbing-boundary extrusion clipping region on any boundary withextrude_structures=True. To opt out on a side that legitimately needs the source / absorber to reach the boundary (e.g. a wave-port source that spans the lateral domain via symmetry), passextrude_structures=Falseto the boundary — either throughBoundary.pml/Boundary.stable_pml/Boundary.absorber(now exposed there) or by constructingBoundary(plus=td.PML(extrude_structures=False), minus=td.PML(extrude_structures=False))explicitly. -
TerminalComponentModeler.portsandModalComponentModeler.portsnow use a discriminated union on thetypefield, so validation errors for a port dict are attributed to the correct port class instead of being scattered across every union branch. -
Fixed
PolySlabSetto preserve its internal ring order acrosssafe_update()and other vertex-space updates while still exporting area-sorted structures. -
Fixed mode solver picking the wrong sqrt root for lossless evanescent modes; direction is now resolved from time-averaged power flow with a passivity fallback.
-
Fixed device characteristic DataArrays to expose value units and voltage coordinate units when simulation data is loaded.
-
Fixed
EMESimulation.plot_3d()to clip infinite structures to the simulation bounds. -
EME interface matching now uses the full solved modal basis as test rows, except modes with numerically unusable self-overlap, so high mode counts no longer slowly degrade S-matrix accuracy. Only the propagation trial basis is capped by
EMEModeSweep.num_modesorEMEModeSpec.sort_spec.keep_modes; modes flagged increasing (Im(n_eff) < -EMEModeSpec.increasing_mode_tolerance) remain available as test rows. The default increasing-mode tolerance now ignores roundoff-level negative imaginary effective indices in lossless cases. The per-cellEMEModeSpec.num_modescap is raised from 100 to 1000 for convergence studies; practical mode counts remain limited by interface memory and dense interface/stacking runtime. -
Fixed edge singularity correction for geometry groups and difference boolean operations in conformal meshing.
-
Fixed RF/modeler diverged runs to report a clear task status error instead of trying to download missing aggregate data.
-
TFSFinjection in a lossy source-side medium now normalises the user-specified unit amplitude at the injection plane (the TFSF box face) for both the legacy constant-in-plane-k path and the new fixed-angle path; previously the legacy aux PlaneWave's unit reference sat two cells outside the box, so the wave reaching the box face was decayed byexp(-Im(kz)·2·dz)in lossy media. -
EMESimulationData.smatrix_in_basis,EMESimulation.smatrix_in_basis, andEMESimulationData.field_in_basisnow correctly handle modal bases that are not orthonormal in their overlap inner product — non-orthogonal combinations of port modes, modes on a different grid, or a custom field such as a Gaussian beam — and are exact for the same-modes round-trip. As a result, existing calls generally return a (corrected) different result; passskip_gram_normalization=Trueto skip the normalization and recover the previous behavior, which is exact only when the bases are already orthonormal in this overlap convention. Incomplete mode or field data now raisesSetupErrorrather than returning an incorrect S-matrix or field.EMESimulationData.field_in_basisrebases through the same trial-basis port modes assmatrix_in_basis(those kept on the S-matrix diagonal), so increasing-/ModeSortSpec-filtered and sweep-truncated modes are dropped consistently instead of leaking into the rebased field or being mis-rejected as incomplete data. -
Endpoint extrapolation in
AxisAlignedPathIntegralandAxisAlignedVoltageIntegral(extrapolate_to_endpoints=True) no longer silently returns the un-extrapolated value with xarray >= 2025.11. -
Fixed a divergence issue in WavePort simulations where port edges are exactly aligned to the simulation grid.
-
Updated CHARGE documentation to reflect the accelerated solver, including convergence and tolerance guidance.
-
Fixed
ModeSimulation.epsilon()whenconfig.simulation.use_local_subpixelenables local subpixel averaging. -
Fixed
SimulationGDS exports so vacuum/background cutouts are preserved more reliably, including when exporting holes on the default layer and when mixing mapped and unmapped media in the same layout. -
Corrected the
convergence_dvdescription inSteadyChargeDCAnalysis: the accelerated charge solver applies it only to multi-voltage sweeps (inserting intermediate warm-start bias points), while the from-zero bias ramp it previously described applies to the legacy solver.Validation now rejects providing more than one multi-voltage sweep array across
VoltageBCsources of any type; previously a sweptSSACVoltageSourcealongside a sweptDCVoltageSourcewas silently accepted with ambiguous sweep selection. -
Fixed EME coefficient normalization to use absolute real mode flux and leave zero-flux
modes unscaled. All four interface S-matrix blocks are renormalized with the
same absolute-real-flux rule, using flux data for both EME cells adjacent to
each interface. DownsampledEMECoefficientMonitordata must use
eme_cell_interval_space=1when requesting normalized interface S matrices.
Repeated-grid coefficient data must provide flux on the same virtual-cell
eme_cell_indexcoordinates before normalizing A/B fields. -
Fixed nonzero diffraction-order adjoint plane waves to use single-frequency injection and avoid broadband grazing-angle artifacts.
-
PolySlabnow accepts polygons with arc segments (bulges) that enclose a finite area even when theirverticesare collinear; previously such polygons were rejected with "The polygon almost collapses to a 1D curve." -
Fixed repeated autograd gradient evaluations so matching cached adjoint results are reused.
-
Fixed component modeler FlexCredit cost estimates that could be lower than the real cost when the simulation
run_timeis aRunTimeSpec; the estimate now resolves the run time from the modeler's port excitation instead of the source-less base simulation. -
Fixed excessive memory retention during
DesignSpace.run(fn_pre, fn_post)workflows that run batched simulations. -
A non-penetrable
LossyMetalMediumis now rejected as a component of anAnisotropicMediumat construction time. -
Fixed
structure_priority_modebeing ignored when aWavePortis converted to a mode solver viato_mode_solver/to_mode_simulation. -
Fixed autograd runs so unsupported traced source, medium, and geometry parameters are rejected during setup, before simulation submission.
-
Fixed doping behavior at box boundaries in charge simulations, for all doping box types (
ConstantDoping,GaussianDoping,CustomDoping): doping near a box edge is no longer dropped, two boxes that abut along a plane no longer double the doping on that shared plane (the later box in the list takes the shared plane), and overlapping boxes (such as a background plus an implant) now add together correctly. Doping plots reflect the same combined doping the simulation uses. -
Simulations now validate that the grid resolves each lumped element and port before upload: at least two cells are required along every axis transverse to the
voltage_axis. A too-coarse grid (for example a single cell across a transverse axis) previously failed during meshing with a cryptic "zero volume",IndexError, or divide-by-zero; it now raises a clear error pointing at the offending axis. This applies to both planar and one-dimensional (line) elements. -
Fixed loading of solver-generated heat, charge, and mesh results so Tidy3D no longer emits misleading unused-point or missing-value warnings.
-
Union fields on Tidy3D models are now validated against their
typediscriminator, so passing an object of the wrong type to a model field raises a clear error at construction instead of being silently accepted and failing later during serialization or a remote run. -
Fixed local EME staged propagation rejecting
EMEModeSpec.interp_specmode data stored on the reduced interpolation frequency grid (reduce_data=True); such mode data is now accepted and its overlaps interpolated up to the requested frequencies. -
Fixed remote autograd gradients to reuse compatible cached forward results when possible and automatically rerun the forward simulation when partial cached data is missing or no longer usable for the backward pass.
-
Transient (
UnsteadyHeatAnalysis) heat simulations with only Neumann-type boundary conditions (e.g. allHeatFluxBC) are no longer incorrectly rejected; the all-Neumann check now applies only to steady-state simulations, where the solution is otherwise undefined up to a constant. -
Corrected the fixed-angle far-field projection phase so oblique fixed-angle sources with an off-origin center produce the right projected pattern.
-
Fixed
PolySlabadjoint derivatives to use winding-invariant sidewall sampling based on offset polygon slices. -
Fixed the Bloch phase application for
DirectivityMonitorfar fields, which was previously dropped at domain-edge cells in simulations with Bloch boundaries. -
Clarified the
Job.step()andBatch.step()error message when workflow results are already complete, including from the local cache, and restored upload-time cost estimate logs for multi-step workflow jobs. -
Fixed seven default material models whose coefficients deviated from their reference data:
Al'Rakic1995'(real index was non-physical across the visible/NIR),CrandBe'Rakic1998BB',Au'Olmon2012evaporated'(no interband response in the visible),Ag'Rakic1998BB', andPtandTi'Werner2009'. Validity ranges are unchanged; results change wherever these variants are used, explicitly or via the material default. For infrared-only simulations, the previous fewer-pole (lower-cost) coefficients remain available as'Rakic1998BB_IR'(Cr,Be,Ag) and'Olmon2012evaporated_IR'(Au) variants, restricted to the infrared bands where they match the reference data. -
Fixed a validation error caused by
LossyMetalMediummistakenly being added directly to the medium conversion of lumped elements. -
Fixed inline PyVista notebook plots sometimes failing to start interactive views.
-
Fixed heat/charge meshing of abutting structures with finely tessellated (e.g. curved) boundaries, which could leave degenerate zero-volume elements that failed the solver's mesh check.
-
Fixed
Scene.plot_structures_eps()for unstructured custom-medium data with complex permittivities. -
Fixed flat
BatchDataresult access for known skipped, failed, or incomplete batch tasks to raise a contextualDataErrorinstead of a rawKeyError. -
Fixed
tidy3d.plugins.autograd.invdes.projections.smoothed_projectionreturning density values outside[0, 1]due to floating-point precision. -
Fixed the sign and magnitude of autograd gradients with respect to
Cylinder.length. -
Fixed post-submission cost estimation for batches of
ModalComponentModelerandTerminalComponentModeler, which could causeBatch.run()andBatch.monitor()to fail.
Removed
- Removed deprecated
Scene.plot_heat_conductivity(),Scene.plot_structures_heat_conductivity(), andScene.heat_conductivity_bounds(); useplot_heat_charge_property(property="heat_conductivity"),plot_structures_heat_charge_property(property="heat_conductivity"), andheat_charge_property_bounds(property="heat_conductivity"). - Removed deprecated
AbstractSimulation.plot_structures_heat_conductivity()andHeatChargeSimulation.plot_heat_conductivity(); usescene.plot_structures_heat_charge_property(property="heat_conductivity")andplot_property(property="heat_conductivity"). - Removed the deprecated legacy config API and legacy config migration paths.
- Removed
TopologyDesignRegion.params_uniform(),params_random,params_zeros,params_half,params_ones,AbstractOptimizer.initialize_result(params0), andAbstractOptimizer.run(..., params0=...). For direct parameter arrays, replace theTopologyDesignRegion.params_*helpers with NumPy arrays usingregion.params_shape, such asnp.full(region.params_shape, value),np.random.random(region.params_shape),np.zeros(region.params_shape),0.5 * np.ones(region.params_shape), ornp.ones(region.params_shape). For optimizer starting parameters previously passed asparams0, configure the design region before constructing or updating the enclosing design and optimizer; useCustomInitializationSpec(params=params0)to preserve an existing array, orRandomInitializationSpec(seed=...)for reproducible random starts. - Removed deprecated
SimulationData.plot_field(field_name="int"),SimulationData.plot_field(..., freq=...), andSimulationData.plot_field(..., time=...); usefield_name="E", val="abs^2",plot_field(..., f=...), andplot_field(..., t=...). - Removed deprecated
to_field_monitors()method on terminal-based scattering-matrix ports (e.g.LumpedPort,WavePort); useto_monitors()instead. - Removed the deprecated
conformalflag from heat-charge monitors (TemperatureMonitor,VolumeMeshMonitor, and theSteady*charge monitors). Monitor geometry no longer affects meshing: the simulation mesh is never forced to conform to a monitor. For value-producing monitors (temperature, potential, and the otherSteady*fields), planar and line monitors now return values interpolated from the computational grid, while volumetric monitors return the grid cells contained in the monitor region. Files saved with older versions load unchanged, as the flag is dropped automatically on load.
Planned Deprecation
Palik_Losslessis deprecated as a material-library variant name; material-library lookup now warns and returnsPalik_LowLoss, whilePalik_NoLossprovides zero-loss Palik fits where supported by low-loss source ranges.
Full Changelog: v2.11.2...v2.12.0