Repository navigation
v2.13.0.dev0
Pre-releaseWhat's Changed
Added
- Added
tidy3d.plugins.autograd.SafeUpdateandtidy3d.plugins.autograd.BacktrackingSafeUpdate, integrated throughtidy3d.plugins.autograd.optimize(..., safe_update=...). The latter checks global backtracking candidates first, then optionally recovers the remaining update one parameter at a time.boundsandsafe_updateapply to the initial parameters before optimizer initialization and the first objective evaluation. downsampleonSpatialDataArray,TriangularGridDatasetandTetrahedralGridDataset, resampling a field onto a coarser uniform Cartesian grid.- Added
tidy3d.plugins.klayout.BatchedDRCCheckerfor hierarchical batched KLayout DRC andmax_results_per_cellsupport intidy3d.plugins.klayout.DRCRunner.run(),tidy3d.plugins.klayout.run_drc_on_gds(), andtidy3d.plugins.klayout.DRCResults.load(). - Optional
downsample_dlargument toScene.perturbed_mediums_copyandSimulation.perturbed_mediums_copy, to help reduce custom medium size in large perturbed simulations. - Added
AutoUnstructuredGridfor TCAD meshing, including ratio-based baseline and targeted interface refinement, reference-relative manual region and line refinements, and helpers for mappingDistanceUnstructuredGridsizing controls. The mapping preserves sizing parameters, butAutoUnstructuredGridmay refine explicit interface-boundary-condition surfaces that legacyDistanceUnstructuredGridskipped. - Field projection monitors, including
DirectivityMonitor, acceptuse_colocated_integration=Falseto compute the far-field surface currents from fields at their native in-plane Yee-grid positions, including withinterval_spacespatial downsampling. - Multi-mode
ModeABCBoundary: pass a tuple of mode indices tomode_indexto absorb several waveguide modes simultaneously at anInternalAbsorber.primary_mode_indexselects the expected dominant mode andtolerancegroups modes whose effective index is near-equal to the primary mode's at the central absorption frequency. The multi-mode form is only valid asInternalAbsorber.boundary_spec; the single-integer form is unchanged and remains valid as a domain boundary. A multi-mode absorber must also keep at least two grid cells between itself and the domain boundary it samples: below itself when absorbing in+, above when absorbing in-. FieldTimeMonitorandFluxTimeMonitorcan now specify their temporal recording cadence by physical time (sampling_dt, seconds) or by a fixed number of uniformly spaced samples (num_samples), as alternatives to the integer-stepinterval. The three fields are mutually exclusive; an unset cadence still defaults tointerval=1, so switching an existing monitor to a physical cadence requires clearing the interval in the same update, e.g.monitor.updated_copy(interval=None, sampling_dt=...). Cadences finer than the simulation time step are clamped to one sample per step, and the field-decay shutoff can end the recording before the requested schedule completes.- A
FieldStructureMonitorand itsFieldStructureDatarecord matched electric field, diagonal complex permittivity, and per-Yee-component structure-ownership maps on their native Yee grids, exposing the derived displacement fieldDx/Dy/Dz(in E-field units, withcolocate_displacement) andabsorbed_power_density.SimulationData.plot_field(...)also accepts these displacement components and'D'(their vector magnitude).SimulationData.optical_generation(...)turns that data into anOpticalGenerationDatawith absorbed power, band-gap-gatedgeneration_rate, andthermalization_heat_rate, ready to feed the Heat/Charge solvers viaDistributedGeneration/HeatSourcefor coupled optical→charge/heat workflows.SimulationData.per_component_optical_generation(...)returns the same quantities per electric-field component on each native Yee grid (no colocation), each tagged with itscomponent, for interface-accurate per-component downstream use. - Added experimental, opt-in PCA compression for compatible point, line, and planar
FieldData-derived adjoint current sources with exact matching frequency and component sets.
Enable it withconfig.adjoint.field_source_reduction_mode = "pca"; the default0.999
energy coverage permits approximate compression, while1.0retains the full numerical rank. - Added the material-local quasi-Fermi-gradient formulation to the Selberherr impact-ionization model for accelerated isothermal charge simulations in two and three dimensions.
SelfHeatingMonitorandSelfHeatingDatarecord the volumetric heat aConductionor isothermalChargesimulation generates.to_spatial_data_array(...), available on any heat-charge monitor data, converts a recorded field into aHeatSourcerate for a separateHeatsimulation, andSelfHeatingData.total_power()integrates the heat rate so the cost of that resampling can be checked.HeatFromElectricSourceis no longer accepted in an isothermal charge simulation, which solves at several bias points; use the monitor instead. On a non-isothermal charge simulation it is ignored with a warning, since that already couples heat self-consistently.SteadyChargeDCAnalysis.temperatureaccepts aSpatialDataArray, so aChargesimulation can run on a prescribed, spatially varying lattice temperature: the temperature-dependent physics is evaluated on the supplied field, with no thermal solve and no feedback from the device. Leaving itNonekeeps the existing self-consistent coupling. Together withSelfHeatingMonitorthis enables a manual charge → heat → charge iteration. Requires the accelerated charge solver, and warns if the field does not cover the semiconductor region.- Added
SteadyGenerationRecombinationMonitor, reporting the per-node net generation-recombination rateU = R - Gentering the carrier continuity equations (recombination positive, generation negative), including every active mechanism, together with a per-mechanism breakdown, of which only impact-ionization generation is currently reported. Available only on the accelerated charge solver. - Added
"temporal"and"auto"field-source adjoint reduction modes toconfig.adjoint.field_source_reduction_mode:"temporal"combines the retained spatial modes into one adjoint simulation using synthesized multi-tone source waveforms, and"auto"picks between that and the separate per-mode simulations. - Added the
TIDY3D_EXECUTION_FLEXCREDIT_LIMITenvironment variable for setting a process-wide cumulative maximum FlexCredit estimate for Tidy3D cloud task execution. Blocked submissions raiseFlexCreditLimitExceededErrorbefore any proposed task starts, andweb.execution_flexcredit_status()reports the current maximum-cost reservations. - Added
CanaliFieldDependence, an extended Canali high-field velocity-saturation model that can be attached toConstantMobilityModel,CaugheyThomasMobility, andMasettiMobilitythrough their newfield_dependenceparameter (accelerated charge solver only). Velocity saturation must be specified for both carriers of a medium or for neither. Every mobility model now serializesfield_dependence. - Added structural preprocessing cache reuse for compatible ordinary FDTD simulations. Set
store_preprocess_cache=Trueon a producer job, then pass its task ID throughparent_tasksto
compatible child runs. See How do I reuse structural preprocessing in a source
sweep?. - Added
MethodZipfor deterministic paired parameter sweeps, pairing values by index across named parameters and producing N cases from N values per parameter; unequal lengths are rejected. - Added
HurkxTrapAssistedTunneling, a field enhancement of Shockley-Read-Hall recombination by elastic band-to-trap tunneling, set through the newfield_enhancementparameter ofShockleyReedHallRecombinationandSurfaceShockleyReedHallRecombination: it shortens the bulk carrier lifetimes and raises the surface recombination velocities according to the local electric field and the tunneling effective massesm_t_n,m_t_p. Available only on the accelerated charge solver. - 1D (line) and point monitors now work in
Chargesimulations. Such a monitor has no unstructured representation, so its recorded field comes back as a bias-resolved CartesianSpatialVoltageDataArray; select a bias withto_spatial_data_array(voltage=...). A line monitor's field can be plotted withplot_field(...)orSteadyEnergyBandData.plot(...); a point monitor holds one value per bias, which is read from the data array directly. UnsteadyHeatAnalysis.initial_temperatureaccepts a spatially varyingSpatialDataArrayin addition to a scalar, e.g. the temperature profile of a previous heat simulation, for cooling or heater shut-off analyses. Mesh nodes outside the field's bounding box start at the newbackground_temperature(default 300 K).- Added
HeatChargeSimulation.linear_solver, selecting between the default iterative linear solver and a sparse direct one that is more robust where the iterative solver stalls. On large meshes the direct solver's larger memory requirement can increase queue time, and its runtime can be longer or shorter than the iterative solver's depending on the case. It applies to charge, heat and conduction simulations alike. SteadyConvergenceData.cfl_history(newCFLHistoryDataArray) records the CFL number the charge solver held at each Newton iteration of every sweep bias, dimensioned(v, pseudo_step)to share thepseudo_stepaxis withresidual_history. Reading the two together shows, for a bias that did not converge, whether the CFL had reached itscfl_minbound, itscfl_numberbound, or was still adapting between them. When the trace for a non-converged bias conclusively ends on one bound, the non-convergence warning issued when the simulation finishes now names it.- Added the
Pclow-doping cutoff andmu_min2transition-term floor toMasettiMobility, completing the Masetti model for boron-doped silicon; the defaults (Pc=0,mu_min2equal tomu_0) keep existing results unchanged. - Added direct autograd support for the parameters of uniform
Lorentz,Drude,Debye, andSellmeiermedia (eps_infandcoeffs); gradients for those media and for the poles and residues ofPoleResidueandCustomPoleResiduenow agree with finite differences. - Remote adjoint gradients now reject surface sample sets larger than 5 GB before upload, with an error that names the largest structures and the settings to change to reduce the size.
- Added optional structural preprocessing-cache reuse to dipole emission studies.
- Added
config.validation.mode = "fast"andfrom_file(..., validate="fast"), which skip tidy3d's check validators while keeping pydantic type checking, every validator that derives a value, and serialization, so already validated data loads several times faster; the per-call override is context-local and the option is never saved to disk. - Added
DipoleEmissionStudyData.angular_radiation_transfer()andangular_radiation_transfer_at_positions()for bulk-normalized dipole radiation into each far-field direction.
Changed
-
config.adjoint.monitor_interval_polyandconfig.adjoint.monitor_interval_customno longer affect standard shape (geometry) gradients, whose surface point-cloud sampling density is controlled byconfig.adjoint.default_wavelength_fraction; the interval settings still apply to the volumetric adjoint monitors used for medium, numerical-structure, and custom-vjp derivative paths. -
SurfaceRecombinationBCis now rejected at setup time when its placement names both sides of an interface that has no semiconductor side, or that is a heterojunction. -
A
VoltageBCwithmodel="ohmic"is now rejected at setup time when its placement names both sides of an interface with an insulator side and no semiconductor side, unless the other side is aChargeConductorMediumcarryingwork_function. -
Shape gradients at boundary points with PEC on both sides are now exactly zero (previously a half-weighted PEC/dielectric blend), so gradients of overlapping PEC structures may change.
-
SurfaceRecombinationBCno longer adds recombination where its surface meets an ohmic contact, which already fixes the carrier concentrations there, so results shift slightly for setups with that arrangement. -
electron_affinityis required on everySemiconductorMedium, including the backgroundmedium, when a charge simulation includes an insulator-only gate terminal. Different semiconductor electron affinities establish heterojunction band offsets and can change results. -
Charge terminals are now identified by the
ChargeConductorMediumstructure a contact is made on. One metal declared through severalboundary_specentries, or spanning several material zones, is swept, driven and current-summed as a single electrode; two different metals no longer merge into one contact even when they share a bias. A metal named by twoVoltageBCentries whose sources prescribe different drives is rejected at validation time, so a saved simulation with such a setup no longer loads: a metal is equipotential. Sources are compared by what they prescribe, so a differentnameorattrsis not a disagreement andGroundVoltage()counts asDCVoltageSource(voltage=0). -
A
VoltageBCwhose placement puts a contact face on an insulator requires the accelerated charge solver;use_accelerated_solver=Falseis now rejected for such a simulation. This covers both a gate over an oxide and an ohmic or Schottky contact whose metal is clad by an insulator, because only the accelerated solver references such a face to the metal work function. -
A charge
VoltageBCthat matches no meshed face is now reported even when anotherVoltageBCwith identical settings does match, and twoVoltageBCentries with different contact models that resolve to the same face are rejected. -
The accelerated charge solver rejects an insulator contact face whose terminal reaches the semiconductor but shares no mesh node with it, since such a face cannot take its potential reference from the semiconductor. It also rejects touching contacts of different terminals that prescribe incompatible potentials or small-signal drives at a shared point, and warns once when the built-in potential along a contact tied to an insulator face varies by more than kT/q.
-
Reduced peak memory when computing
TriangleMeshgeometry gradients by chunking surface-gradient interpolation and accumulation. -
colocateis locked toTruefor flux and field-projection monitors; the surface-integration scheme is controlled solely byuse_colocated_integration. -
An
InternalAbsorberplaced against a domain boundary is now rejected: its PEC backing plate sits on the absorber's non-absorbing side and would fall outside the simulation. Move the absorber one cell further in, or absorb at the edge with a domain boundary condition.When a
ModeABCBoundaryabsorbs more than one mode asInternalAbsorber.boundary_spec, itsplaneno longer has any effect: the absorber's own box and position determine where the modes are solved. -
Changed adaptive shape-gradient sampling to resolve per structure from the simulation definition
and all adjoint frequencies;config.adjoint.minimum_spacing_fractionremains the active lower
bound as a fraction of the shortest free-space adjoint wavelength.Geometry sampling metadata on
DerivativeInfo(adaptive_vjp_spacing(),
discretization_wavelength(), and the clip-context material length scale) is now resolved per
structure from the simulation definition rather than from chunked permittivity data, and only for
structures with a traced geometry path. Acustom_vjpcallback on a structure whose traced fields
are all undermediumnow raisesAdjointErrorfrom those accessors instead of returning a
value derived from the adjoint monitor data; all other derivative inputs are unchanged. -
Changed cylinder geometry adjoint calculations to use symmetric angular sampling of the cylinder surface.
-
The
"Selberherr"and"PQ"impact-ionization formulations now take their driving force from the conduction-band-edge gradient rather than the electric field, and their generation rate vanishes at zero bias. Ionization is unchanged in a uniform material under bias; a band offset across a heterojunction no longer acts as a driving force. -
TriangleMesh.inside()now warns once when it usestrimesh's slower pure-Pythonray_trianglebackend instead of Embree. -
Adjoint simulations now warn when they end before their fields decay below the shutoff threshold that the forward simulation reached, since gradients from a truncated adjoint are biased without any visible failure.
-
Charge simulations with a non-uniform lattice temperature (self-heating or a prescribed temperature field) now evaluate carrier flux, terminal currents and small-signal response with one temperature per mesh edge, so terminal currents balance under a temperature gradient. With Fermi-Dirac statistics the degeneracy-factor terms of the Jacobian and small-signal response use that same edge temperature, and the self-heating source is assembled with that edge temperature and with the carrier mobility the transport uses, so its power balance closes under a temperature gradient and with velocity saturation. Results for such simulations may shift slightly; isothermal simulations are unaffected.
-
EME now reports setup errors earlier for unsupported mode-solver settings, including group-index calculation and non-increasing custom interpolation frequencies. If an older EME data file reports inconsistent mode frequencies during extraction or basis conversion, re-run the simulation to regenerate it.
-
Reduced the size of gzip-packaged SimulationData results containing large monitor arrays.
-
Changed
tidy3d mcpto delegate to the independently releasedtidy3d-mcpruntime while preserving the integrated Tidy3D command. -
Documented the Tidy3D units of
SolidMedium.capacityandFluidMedium.specific_heat, and recommend theirfrom_si_units()constructors as the entry point. -
Shape (geometry) gradients in
autogradare now substantially cheaper to compute — adjoint fields are recorded only at structure surfaces (pre-sampled point clouds) instead of over entire structure volumes, which shrinks recorded monitor data, downloads, and gradient postprocessing time and memory. -
The default
ChargeToleranceSpec.cfl_minis now1. Charge simulations that do not setcfl_minmay behave slightly differently. -
Users can now request any positive whole-number vGPU allocation supported by their license instead of being limited to 1, 2, 4, or 8. Requests above the license limit are rejected with a clear message before submission.
-
Improved
PolySlabarc-discretization performance without changing the generated coordinates. -
TriangleMeshshape gradients use fewer surface sample points on long, thin triangles. -
Adjoint shape-gradient surface-sampling spacing is now bounded below by the smallest grid step near each traced structure as well as by
config.adjoint.minimum_spacing_fractionof the shortest adjoint wavelength, whichever is larger, so surfaces are no longer sampled more finely than the simulation grid; this reduces the number of sample points and memory for PEC and metal structures. -
Changed the dipole emission plugin to deprecate
DipoleEmissionStudyData.radiation_intensity_transfer()and its position-resolved counterpart in favor of the angular radiation transfer methods.
Fixed
- Fixed mode solver material classification to inspect the optical component of a
MultiPhysicsMedium, so a wrappedFullyAnisotropicMediumselects the tensorial solver and a wrappedLossyMetalMediumis seen by the surface-impedance conductor check behindprecision="auto". - Fixed PEC shape gradients so ordinary surface samples are no longer handled as one-dimensional
edges. - NumPy arrays and other array-likes now work as selectors along non-spatial dimensions of unstructured datasets, in
sel(),isel(), andinterp(). - Fixed
SurfaceRecombinationBCbeing rejected on an interface between two materials that both take part in the charge simulation, such as a semiconductor/insulator interface or a junction between two differently doped regions of the same material. - Fixed longitudinal mode-field grid corrections and near-zero clipping at simulation boundaries.
- Fixed
VoltageBCcontacts placed on an insulator (a gate over an oxide) in charge simulations: the gate potential is now referenced to the metal'swork_function, giving the correct flat-band voltage instead of one shifted by the work function minus the semiconductor electron affinity. Two existing setups shift with it: a gate whose metal already carried awork_functionfor an unrelated Schottky contact, and the oxide-clad face of a Schottky contact that reaches no semiconductor node of its own. AutoGridno longer over-refines the regions on either side of a narrow feature when the maximum step size in effect there is much coarser than the spacing between nearby structure boundaries. Steps now coarsen away from the feature by up to themax_scaleratio instead of one side being tiled uniformly at the feature's own step size, which also made two regions equally distant from the feature grid differently.QuasiUniformGridis affected in the same way: when an interval between structure boundaries or snapping points is shorter than the requesteddl, the rest of the axis is no longer refined belowdlon account of it, and the cells stay withindland themax_scaleratio while generally being fewer and coarser.- Reduced mode-solver setup time when
precision="auto"or a tensorial solver has to be selected, with classification results unchanged. Most noticeable for EME, where every cell plane paid this cost. - TriangleMesh shape gradients now require a closed, outward-oriented volume mesh.
perturbed_mediums_copy()accepts a plain spatialxarray.DataArrayon every path, and rejects one still carrying a non-spatial coordinate with a message naming the field and how to drop it.- Fixed fully anisotropic mode operators for magnetic coupling, invariant dimensions, PML, and backward propagation.
- On a periodic axis whose neighbouring regions have different step sizes,
AutoGridnow sizes the cells near the boundary from the region actually adjacent across it; they could previously come out coarser or finer than intended, while still respecting the local maximum step size and themax_scaleratio. - The error from
Job.task_idon a multi-step job, which everyHeatSimulationandHeatChargeSimulationjob is, now namesjob.estimate_cost()andjob.real_cost()alongsidejob.task_ids. - Fixed mode-field rotation across the angular branch cut and bend preprocessing of off-plane media.
- Fixed subpixel continuity for derived custom media whose parent is the first material entry.
- Fixed slanted
PolySlab.inside()andTransformed.inside()for same-shape coordinate inputs supplied as scalars, lists, or arrays, and fixedTransformed.inside_meshgrid()for transformed slantedPolySlabgeometries with 1D coordinate vectors. - Fixed the local field projection (
FieldProjector) handling of integration bounds, spatially downsampled near fields, and projection windowing, so that locally projected fields agree much more closely with server-side projections of the same near-field data. - Fixed slightly mistuned absorption in
ABCBoundaryandModeABCBoundary: the propagation index, including an explicitly setpermittivity, now accounts for the grid's numerical dispersion, which improves absorption most on coarse meshes. - Surface monitors now reject an empty
fieldstuple up front, rather than being accepted and then failing when their data is loaded. - Fixed inaccurate adjoint shape gradients for field-monitor objectives with staggered field samples near absorbing simulation boundaries.
- Fixed a small permittivity error at dielectric-vacuum interfaces when
edge_singularity_correctionis enabled, which slightly shifted results for geometries such as metal traces on a substrate. - Fixed excess reflection from
InternalAbsorber/ModeABCBoundaryabsorbers when a conductor passes through the absorber plane withedge_singularity_correctionenabled. - Fixed the small-signal AC conductance of charge simulations with Fermi-Dirac statistics, which omitted the carrier-density dependence of the degeneracy factor and was overestimated at high doping.
- A
HeatSourcewith a spatially varyingrate(aSpatialDataArray) is now applied instead of being silently ignored, so affected heat simulations no longer solve as if no heat were generated. - Fixed vacuum fallback when serialized
CustomMediumdata arrays are unavailable. - Fixed
CustomMediumadjoint validation to reject gradients for inactive data representations. CustomAnisotropicMedium.is_spatially_uniformnow returnsTrueonly when all tensor components are spatially uniform, andFalsewhen any component varies in space.- A
TemperatureMonitorin an isothermalChargesimulation now reports the uniform lattice temperature the run was solved at instead of 0 K. - Fixed instability of an
InternalAbsorberwhose plane crosses a conductor, which could make the simulation diverge while the equivalentModeABCBoundaryplaced at a domain edge stayed stable. - A
MeshOverrideStructurewithshadow=Falsewhose boundary falls very close to a grid snapping point now reuses that snapping point as its boundary, instead of adding a separate grid line beside it and refining the resulting sliver. Meshes in affected setups may have slightly fewer or shifted grid lines than before. - Fixed batches restored with
Batch.from_file()failing to serialize again or load in a fresh Python process. - The
fill_fraction_boxmetric now uses the tangential projection of the bounding box, so direct queries, filtering, and sorting ignore its position and extent along the mode-plane normal axis. Mode sources and monitors inSimulation, user-supplied mode monitors and cell modes inEMESimulation,ModeSimulation, andModeSolvernow validate that the box intersects the effective mode-solving domain along both tangential axes before solving. DirectModeSolverData.sort_modes()calls remain permissive: a tangentially disjoint box produces an all-zero metric. - Fixed
ModeSolveraccepting custom microwave impedance paths outside the mode plane. - Fixed
web.load_simulation()andweb.download_json()failing for mode solver and component modeler tasks, andweb.download_simulation()failing for component modeler tasks (modeler batch ids remain unsupported by these functions). - Lossy conductive media are no longer treated as perfect conductors by the mode solver at low frequency.
- Fixed validation so semiconductor simulations with electrical boundary conditions require an
explicit chargeanalysis_spec. - Fixed
ModeSimulation.reduced_simulation_copyto preserve permittivity and medium monitors and their complete sampled regions. - Fixed EME mode-solver monitor frequency handling for interpolated cell modes, including reduced-data storage, basis conversion, and cases where some requested modes are unavailable.
- Fixed mode solves failing with an
IndexErrorwhen the mode plane coincided with, or lay beyond, the outermost grid point along its normal direction. Where the correction could still be computed it was in some cases taken from the wrong side of the plane. Finite-grid corrections are now computed against the original simulation grid, and are skipped with a warning when the plane is not bracketed by that grid. A mode plane placed exactly on the simulation boundary is now rejected with an explanatory error instead of failing inside the grid machinery. - Fixed
Simulation.to_gds_file()retaining lower-priority geometry on the same GDS layer beneath thresholded custom-medium structures, including custom optical media wrapped inMultiPhysicsMedium. - Fixed EME validation and classification to inspect the electromagnetic material stored in
MultiPhysicsMedium.optical. A wrappedAnisotropicMedium,FullyAnisotropicMediumor custom medium is now seen by the bent-anisotropy checks, the global-frame custom-medium guard, and the reciprocity check that rejects non-reciprocal fully anisotropic media, all of which previously treated a wrapped medium as absent. - Fixed 2D unstructured charge monitor data to preserve separate material-side values at coincident interface nodes.
- Fixed frequency tracking rotating mode phases instead of aligning them, and mode profiles not being normalized in the dot-product convention their amplitudes are decomposed in. Recorded amplitudes and phases can change for lossy modes, so stored results may need re-baselining.
- Adjoint runs now immediately report failed simulation tasks, including server-provided failure details, instead of processing unavailable gradient data.
- Fixed a duplicated density unit conversion that made the transient heat characteristic-time estimate 1e18 too small, so the excessive-simulation-time warning fired for every physically meaningful
UnsteadyHeatAnalysis. - In a 2D
Chargesimulation, a monitor that is also flat along one of the two resolved axes now records a line instead of failing.SteadyCapacitanceMonitor,SteadyElectricFieldMonitorandSteadyCurrentDensityMonitorstill need two non-zero dimensions, and now say so before the simulation runs rather than failing during postprocessing. HeatChargeSimulationnow reports a heat boundary condition placed where no solid material is present: an error when nothing else anchors the temperature -- previously the condition was silently dropped, and a steady solve left unanchored that way returned non-physical values under a successful task status -- and a warning when another condition still anchors it.- A slice taken across a material interface no longer reports one material on both sides of it. Where the grid holds a node per side — how a heterojunction carries its band offset, or a contact resistance its temperature step — a line profile now keeps both values at distinct coordinates, separated by a small fraction of the local sample spacing, so the step is no longer merged away when the profile is selected from, interpolated, or reordered. Because both samples now sit just off the interface, its own coordinate no longer names one: select a side, or pass
method="nearest". A 2D plane slice of a 3D simulation is fixed the same way. A slice lying exactly along an interface can only report one side and now warns, instead of silently choosing one by its position in the grid. Slicing a tetrahedral dataset works again where the plane cuts a cell at more than two of its vertices. UnsteadyHeatAnalysis.initial_temperatureandbackground_temperaturenow reject infinite and NaN scalars, and aSpatialDataArrayinitial temperature must be real, non-empty and on finite coordinates. These previously passed validation and reached the solver as an unusable initial condition.- Custom doping is no longer dropped at a doping box face whose coordinate is not representable in single precision, such as the ±0.11 µm bounds of a 220 nm layer. A mesh node sitting exactly on such a face was treated as outside the box and doped to zero; it now takes the box's concentration. Charge results for devices with a junction on a layer face change accordingly.
- Fixed two-element real arrays being incorrectly parsed as complex numbers during deserialization.
- Fixed symmetric
Simulation.to_gdsandSimulation.to_gds_fileexports for nonzero simulation centers to reflect around the simulation center. - Changing
config.adjoint.default_wavelength_fractionorconfig.adjoint.minimum_spacing_fractionno longer warns that remote gradients ignore them; both now take effect for remote gradients. - Fixed 3D PEC shape gradients so that surface points within half a grid cell of an edge are integrated as PEC instead of dielectric.
- Reduced validation time when bent anisotropic EME simulations use length sweeps or are reused during mode-solver setup.
HeatChargeSimulationnow detects invalid volume-mesh connectivity early and retries automatically instead of failing later with an unclear conversion error.HeatChargeSimulationnow warns whenrelative_min_dloverrides a mesh size requested throughdl_bulkor through a grid refinement region or line.- Fixed the dipole emission plugin's radiation intensity for non-unit collection index and source amplitude, and matched
DipoleEmissionStudyDatatransfer normalization to the simulated source spectrum. - Setting
config.microwave.suppress_rf_license_warningtoTruenow suppresses the RF license warning emitted during simulation validation.
Removed
- Removed
tidy3d.plugins.microwaveand the terminal half oftidy3d.plugins.smatrix, includingTerminalComponentModeler, its lumped and wave ports and the RF material library, after their move toflexcompute-rf; the old import paths now report theflexcompute.rf.tidy3dreplacement before they fail, and the modal component modeler is unaffected.
Breaking Changes
- Removed
sweep_indexfrom sweep-invariant EME mode, flux, correction, and aggregate-overlap data; singleton axes in released legacy result datasets are normalized, while multi-entry legacy axes must be selected or migrated before loading. - Removed
EMESweepSpec.sweep_modesandEMESimulationData.port_modes_list_sweep;EMESimulationData.port_modes_tuplenow exposes the single shared port basis used by all supported sweeps. - EME overlap FlexCredit estimates now include both per-cell self-overlap and per-interface cross-overlap tasks, including the union of interfaces required by periodicity sweeps, so estimated costs increase for existing jobs.
- Removed the deprecated
EMEFreqSweep; list physical frequencies directly inEMESimulation.freqsand useEMEModeSpec.interp_spec, or migrate saved frequency-sweep results with an earlier Tidy3D version by multiplying their base frequencies byfreq_scale_factors. - Selecting a
voltagewhen plotting charge monitor data now requires a bias the simulation solved at; a value between two recorded bias points raisesDataErrorinstead of quietly snapping to the nearest one. This applies to unstructured (2D and 3D) monitor data as well as the Cartesian data recorded by a line or point monitor.
Planned Deprecation
- Deprecated the
FieldProjector.trapezoidhelper, which is no longer used by the local field projection and will be removed in Tidy3D 2.13; usenumpy.trapezoidinstead. tidy3d.rfnow carries only the RF classes defined undertidy3d.componentsand will be removed in 3.0; RF development continues inflexcompute.rf.tidy3d.- Explicitly setting
precision="single"orprecision="auto"on optical, EME, or microwave/RF mode specs is deprecated; use"double"instead, which is already the default for all of them."auto"resolves to single precision unless the mode solve contains a good conductor, so it carries the same accuracy risk. unstructured=Falseis deprecated onTemperatureMonitorandSteadyPotentialMonitor, the only heat-charge monitors that still accept it, and will be removed in Tidy3D 3.0; useto_spatial_data_array()on the monitor data where a CartesianSpatialDataArrayis needed.
Full Changelog: v2.12.0...v2.13.0.dev0