Skip to content

v2.12.0

Latest

Choose a tag to compare

@github-actions github-actions released this 27 Jul 08:57

What's Changed

Added

  • Added CornerFinderSpec.corner_rounding_collapse_extent so LayerRefinementSpec can recover sharp corners that pass the legacy angle threshold from small rounded or chamfered imported geometry.
  • Added ImpedanceSpec to support complex-valued LumpedPort impedance. The impedance field now accepts either a plain real number (e.g. 50) or an ImpedanceSpec(impedance=..., frequency=...) for complex-valued loads. A complex impedance Z = R + jX is 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 ClipOperation geometry derivatives, including union, difference, intersection, and symmetric_difference.
  • Added the tidy3d mcp command for running the Tidy3D MCP server from the active Tidy3D environment.
  • Added Palik_NoLoss material-fitter refits for the low-loss Palik ranges of GaAs, Ge, SiO2, and cSi, and Palik_LowLoss variants 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.diagnostics when EMESimulation.eme_diagnostics=True.
  • Added a progress keyword (default True) to EMESimulation.compute_overlaps, EMESimulation.propagate_from_overlaps, and EMESimulation.propagate that shows a per-phase rich progress bar on the logging console; pass progress=False to silence it.
  • Accelerated charge solver support for the Masetti mobility model.
  • DeviceCharacteristics.dc_convergence (new SteadyConvergenceData) 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.
  • TFSF source now exposes an angular_spec field (FixedInPlaneKSpec or FixedAngleSpec) mirroring PlaneWave, enabling fixed-angle (frequency-independent propagation direction) TFSF setups for isolated scatterers. Fixed-angle TFSF rejects Periodic and BlochBoundary transverse boundaries and is intended to be used with absorbing (PML/Absorber/StablePML) transverse boundaries; 2D simulations may keep the conventional Periodic on the zero-width out-of-plane axis as long as the wave's k-vector has no component along it.
  • Added PointCloudFieldMonitor and PointCloudFieldData for frequency-domain E/H field sampling at custom point-cloud coordinates. PointCloudFieldData is indexed by point, so structured-grid field plotting helpers such as SimulationData.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_potential for the Poisson equation, residual_electrons for the electron continuity equation, residual_holes for the hole continuity equation, plus residual_temperature for 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, core DipoleEmissionData monitor outputs, plugin DipoleEmissionStudyData results, SphericalAngleDataArray, compact stored radiation_intensity outputs, study-level derived radiation_intensity_transfer properties, optional position- and axis-dependent integration weights, and optional selected-position radiation-intensity samples.
  • Added Dx, Dy, and Dz output support to PointCloudFieldMonitor, reconstructing D / epsilon_0 from raw E-field samples and diagonal Yee permittivity; sampled off-diagonal Yee permittivity emits a warning and uses diagonal components only.
  • Added gds_precision to Geometry.to_gds_file(), Structure.to_gds_file(), and Simulation.to_gds_file() to control the coordinate precision written to GDS exports.
  • Added merge_adjacent to Geometry.from_gds(); set merge_adjacent=True to 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 None in BatchData.task_ids because 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 VoltageBC via model="schottky_mott"; the Mott rule phi_Bn = W - chi, phi_Bp = E_g - phi_Bn is built from per-medium material properties — work_function on the adjacent ChargeConductorMedium and electron_affinity / richardson_electron / richardson_hole on the adjacent SemiconductorMedium. Default model="ohmic" is the standard ohmic contact. Schottky contacts compose with SSACAnalysis / IsothermalSSACAnalysis, enabling Mott-Schottky 1/C^2 extraction on Schottky diodes.
  • Native autograd support for FluxMonitor using hidden forward field storage in autograd runs. Set enable_adjoint=True on FluxMonitor objects whose .flux output 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, and DiffractionMonitor data with many active amplitudes.
  • Improved polygon triangulation performance using Shapely constrained Delaunay triangulation.
  • LayerRefinementSpec now 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, default 2), with a tunable CornerFinderSpec.axis_aligned_angle_threshold; both are on by default and give existing setups a finer mesh, set them to None to keep the previous mesh.
  • ModeTimeMonitor records 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).
  • SolidMedium now accepts an optional velocity vector (in um/s; from_si_units takes m/s and converts), enabling a convective transport term in heat simulations for structures using that medium (both capacity and density are required when velocity is nonzero).
  • FluxMonitor and FluxTimeMonitor now support staggered Yee-grid surface integration via use_colocated_integration=False, computed on the server with the same scheme as FieldMonitor(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.
  • ThermalContactResistance boundary condition for heat simulations: an interfacial thermal resistance (thermal contact / Kapitza resistance, in K*um^2/W; from_si_units takes m^2*K/W) placed on a StructureStructureInterface or MediumMediumInterface allows a temperature jump proportional to the heat flux across the interface between two touching solids.
  • Added tidy3d.web.refresh_licenses() and tidy3d configure --refresh-licenses to 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 configure exits nonzero and web.configure(...) raises while leaving the saved configuration in place.
  • Schottky contacts (VoltageBC with model="schottky_mott") now support Fermi-Dirac carrier statistics (fermi_dirac=True in the charge analysis spec), enabling Schottky devices with degenerately doped semiconductor regions in DC and small-signal AC analyses.
  • Added PointCloudPermittivityMonitor for recording diagonal permittivity components for requested point clouds by sampling each component from its nearest native Ex / Ey / Ez Yee-grid location.
  • MeshOverrideStructure accepts a min_steps_per_size field 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 both dl and min_steps_per_size are set along a dimension, the finer grid size is used. dl is now optional (defaults to no override) so an override can be specified with min_steps_per_size alone.
  • Added penetrable to LossyMetalMedium: when True, the metal is solved as a regular conductive medium with subpixel averaging Simulation.subpixel.dielectric, instead of the lossy-metal-specific handling selected by Simulation.subpixel.lossy_metal.
  • Added tidy3d.RadiationBC gray-body surface radiation boundary condition and an optional emissivity field on tidy3d.ConvectionBC for combined convective-radiative heat exchange, supported in heat and conduction+heat simulations.
  • Added SurfaceRecombinationBC for 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, and ThinLensOverlapMonitor for constructing,
    injecting, and decomposing vectorial focused beams from a thin-lens angular spectrum.
  • LumpedResistor, LinearLumpedElement, and LumpedPort now 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-wide Medium2D sheet whose normal axis is chosen at meshing time to straddle any adjacent material interface.
  • AnisotropicConductivity for SolidMedium.conductivity, specifying an anisotropic (tensor) thermal conductivity via principal values xx, yy, zz plus an optional rotation. A scalar conductivity remains fully supported for isotropic materials. SolidMedium.from_si_units also accepts an AnisotropicConductivity (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.
  • VarshniEnergyBandGap and ConstantEnergyBandGap now expose a band_gap_energy(temperature) method returning the energy band gap (in eV) at the requested temperature(s).
  • Added geometry_tolerance to unstructured grid specs, raising the distance below which coincident geometric entities are fused during heat/charge meshing (refinement lines remain subject to a built-in 1e-6 um minimum length).
  • Semiconductor heterojunction support in charge simulations: SemiconductorMedium.electron_affinity sets the band alignment at semiconductor/semiconductor interfaces, with thermionic-emission interface transport controlled by richardson_electron and richardson_hole.
  • Added tidy3d troubleshoot CLI group with connection, environment, and report subcommands that produce paste-friendly support bundles matching the Tidy3D issue-report template, plus tidy3d.web.diagnose_connection(), tidy3d.web.diagnose_environment(), and tidy3d.web.diagnose_report() helpers for Python users.

Changed

  • WavePort and TerminalWavePort mesh refinement now interprets num_grid_cells as 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_fraction from 0.01 to 0.001; set it back to 0.01 in your config to keep previous spacing behavior.
  • UniformUnstructuredGrid.min_edges_per_circumference and min_edges_per_side now accept 0, 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 to 0 in the next release. Set the fields explicitly to preserve the current behavior.
  • Changed grid validation to raise a units error when UniformGrid.dl or generated AutoGrid / QuasiUniformGrid cell 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_iters from 30 to 120; 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 a ValidationError on use_accelerated_solver for 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 as MasettiMobility or SSAC at_voltages bias-point selection. The flag now defaults to True (was Optional defaulting to None) and continues to use the GPU accelerated charge solver.
  • TFSF now rejects Periodic and BlochBoundary along 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-solver EMESimulation.smatrix_in_basis, and EMESimulationData.field_in_basis re-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. a colocate=False EMEModeSolverMonitor), the call raises rather than silently mixing conventions. Note that EMEModeSolverMonitor — the usual way to provide a target basis — and field monitors default to colocate=True, so monitor-based rebasing uses the colocated path unless colocate=False is set on the target monitor. A target basis's own use_colocated_integration is 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 cSi material-library variant from Green2008 to Palik_LowLoss. Accessing the cSi default medium implicitly now emits a migration warning. Callers that need pre-change results should request Green2008 explicitly, including in the 1.2 to 1.45 um overlap where both variants are valid. Palik_LowLoss is valid from 1.2 to 250 um. Green2008 covers pre-change results from 0.25 to 1.2 um, and Palik_Lossy is available from 0.1 to 1.4 um when the lossy Palik model is desired.
  • Changed the cSi material-library Si_MultiPhysics optical model from Green2008 to Palik_LowLoss, aligning it with the new cSi default 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=False now 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.
  • HeatChargeSimulation now 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. ThermalContactResistance is 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 for AxisAlignedCurrentIntegral, path_integrals_from_lumped_element, CustomImpedanceSpec.from_bounding_box (used by TerminalWavePort), lumped ports, and TerminalComponentModeler. Voltage integrals (default extrapolate_to_endpoints=True) are unchanged.
  • Made Geometry.to_gds_file(), Structure.to_gds_file(), and Simulation.to_gds_file() raise SetupError when 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() and Batch.estimate_cost() now explicitly state when an estimate is for the mesh step only and that Job.step() or Batch.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_courant option is now orientation independent and benefits a wider range of simulations.
  • Consolidated the TCAD band-gap classes into a single module: ConstantEnergyBandGap and VarshniEnergyBandGap now live in tidy3d.components.tcad.bandgap (previously tidy3d.components.tcad.bandgap_energy, which has been removed) alongside SlotboomBandGapNarrowing. The public import path (import tidy3d as td; td.ConstantEnergyBandGap) is unchanged; only code importing directly from the internal bandgap_energy module path needs to update its import.
  • Finest grid region visualization in Simulation.plot_grid() is now off by default; opt in by passing a nonzero finest_grid_region_alpha.

Fixed

  • Suppressed the Simulation structure-at-boundary warning for structures touching Periodic or BlochBoundary edges, 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 PECFrame or an internal absorber) overlaps the absorbing-boundary extrusion clipping region on any boundary with extrude_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), pass extrude_structures=False to the boundary — either through Boundary.pml / Boundary.stable_pml / Boundary.absorber (now exposed there) or by constructing Boundary(plus=td.PML(extrude_structures=False), minus=td.PML(extrude_structures=False)) explicitly.

  • TerminalComponentModeler.ports and ModalComponentModeler.ports now use a discriminated union on the type field, so validation errors for a port dict are attributed to the correct port class instead of being scattered across every union branch.

  • Fixed PolySlabSet to preserve its internal ring order across safe_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_modes or EMEModeSpec.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-cell EMEModeSpec.num_modes cap 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.

  • TFSF injection 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 by exp(-Im(kz)·2·dz) in lossy media.

  • EMESimulationData.smatrix_in_basis, EMESimulation.smatrix_in_basis, and EMESimulationData.field_in_basis now 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; pass skip_gram_normalization=True to 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 raises SetupError rather than returning an incorrect S-matrix or field. EMESimulationData.field_in_basis rebases through the same trial-basis port modes as smatrix_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 AxisAlignedPathIntegral and AxisAlignedVoltageIntegral (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() when config.simulation.use_local_subpixel enables local subpixel averaging.

  • Fixed Simulation GDS 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_dv description in SteadyChargeDCAnalysis: 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 VoltageBC sources of any type; previously a swept SSACVoltageSource alongside a swept DCVoltageSource was 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. Downsampled EMECoefficientMonitor data must use
    eme_cell_interval_space=1 when requesting normalized interface S matrices.
    Repeated-grid coefficient data must provide flux on the same virtual-cell
    eme_cell_index coordinates before normalizing A/B fields.

  • Fixed nonzero diffraction-order adjoint plane waves to use single-frequency injection and avoid broadband grazing-angle artifacts.

  • PolySlab now accepts polygons with arc segments (bulges) that enclose a finite area even when their vertices are 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_time is a RunTimeSpec; 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 LossyMetalMedium is now rejected as a component of an AnisotropicMedium at construction time.

  • Fixed structure_priority_mode being ignored when a WavePort is converted to a mode solver via to_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 type discriminator, 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_spec mode 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. all HeatFluxBC) 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 PolySlab adjoint derivatives to use winding-invariant sidewall sampling based on offset polygon slices.

  • Fixed the Bloch phase application for DirectivityMonitor far fields, which was previously dropped at domain-edge cells in simulations with Bloch boundaries.

  • Clarified the Job.step() and Batch.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), Cr and Be 'Rakic1998BB', Au 'Olmon2012evaporated' (no interband response in the visible), Ag 'Rakic1998BB', and Pt and Ti '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 LossyMetalMedium mistakenly 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 BatchData result access for known skipped, failed, or incomplete batch tasks to raise a contextual DataError instead of a raw KeyError.

  • Fixed tidy3d.plugins.autograd.invdes.projections.smoothed_projection returning 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 ModalComponentModeler and TerminalComponentModeler, which could cause Batch.run() and Batch.monitor() to fail.

Removed

  • Removed deprecated Scene.plot_heat_conductivity(), Scene.plot_structures_heat_conductivity(), and Scene.heat_conductivity_bounds(); use plot_heat_charge_property(property="heat_conductivity"), plot_structures_heat_charge_property(property="heat_conductivity"), and heat_charge_property_bounds(property="heat_conductivity").
  • Removed deprecated AbstractSimulation.plot_structures_heat_conductivity() and HeatChargeSimulation.plot_heat_conductivity(); use scene.plot_structures_heat_charge_property(property="heat_conductivity") and plot_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), and AbstractOptimizer.run(..., params0=...). For direct parameter arrays, replace the TopologyDesignRegion.params_* helpers with NumPy arrays using region.params_shape, such as np.full(region.params_shape, value), np.random.random(region.params_shape), np.zeros(region.params_shape), 0.5 * np.ones(region.params_shape), or np.ones(region.params_shape). For optimizer starting parameters previously passed as params0, configure the design region before constructing or updating the enclosing design and optimizer; use CustomInitializationSpec(params=params0) to preserve an existing array, or RandomInitializationSpec(seed=...) for reproducible random starts.
  • Removed deprecated SimulationData.plot_field(field_name="int"), SimulationData.plot_field(..., freq=...), and SimulationData.plot_field(..., time=...); use field_name="E", val="abs^2", plot_field(..., f=...), and plot_field(..., t=...).
  • Removed deprecated to_field_monitors() method on terminal-based scattering-matrix ports (e.g. LumpedPort, WavePort); use to_monitors() instead.
  • Removed the deprecated conformal flag from heat-charge monitors (TemperatureMonitor, VolumeMeshMonitor, and the Steady* 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 other Steady* 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_Lossless is deprecated as a material-library variant name; material-library lookup now warns and returns Palik_LowLoss, while Palik_NoLoss provides zero-loss Palik fits where supported by low-loss source ranges.

Full Changelog: v2.11.2...v2.12.0