Release Notes
1.0.4: September 24, 2026
New
Second-order nonlinear EME, available with EMode3D. A
straight_sectionortaper_sectiontakesnonlinear=with anSHGProcess,SFGProcess, orDFGProcessnaming the process wavelengths. Quasi-phase matching is declared withpoling_period(plusduty_cycleandqpm_order) on the process, or built by hand from alternatinginverted=Truesections, the two routes agree.A CW pump is declared with
settings(excitation=Source(port, wavelength, mode, power, phase)).EMEstill returns the small-signal S-matrix, and now also solves the power-dependent response, available as aCircuitResponsefromget('response'), outgoing and incoming amplitudes at every port, radiated power per wavelength, and convergence.get('sources')returns the declared excitation.chi2_spectrumreturns a nonlinear conversion spectrum (signal out over pump in, at every wavelength asked for) from a handful of mode solves. A \(\chi^{(2)}\) spectrum oscillates too fast with the phase mismatch to interpolate, but what the coupled-mode equations consume (the coupling and the propagation constants) varies smoothly, so the modes are solved only where the mode list is still moving and the response is then evaluated point by point from interpolated coupling. Against a directly solved 13-point spectrum across a phase-matching peak, five solves reproduce every point to four decimals, sidelobes included. Quasi-phase-matched sections are included: the grating enters as a wavevector shift and a Fourier coefficient, neither of which depends on wavelength, so a poled section keeps its exact grating while its phase mismatch moves with the interpolated propagation constants.sweep(key='wavelength', values=..., adaptive=True)does the same for an ordinary sweep.valueskeeps its meaning (the wavelengths you want results at) andadaptivechanges only where the solver runs: modes are matched between neighbouring solves through a phase-corrected overlap, and a bisection in wavelength adds solves until the mode list stops moving by more thantolerance. Any stretch it could not resolve is reported inunconvergedinstead of raising.Free-space excitation:
free_space_fielddeclares a Gaussian beam launched into a port. The beam is projected onto that port’s modes and drives the field plot throughplot(excitation=name)or the plot window’s Mode menu.free_space_field_diagnosticsreturns the fraction of the beam’s power the port’s modes capture, and the solver warns when it is below 90%.tiltis the angle inside the medium the beam travels through.Angled facet ports:
make_angled_facet_port()tilts a port’s cross-section about a hinge line, so a facet’s reflection back into the guided mode falls off with tilt as it does physically (see Ports). A facet cannot sit on apwd_sectionor on a profile with a PML.sweep(key='section, NAME, facet_angle')sweeps that tilt.The solver warns at a facet junction when the waveguide’s
num_modesis too small to hold the deflected reflection and R + T under-runs.Junctions whose two sides carry different numbers of modes (every junction between a waveguide section and a
pwd_section) now solve the mode-matching equations for the reflected and transmitted amplitudes jointly instead of eliminating the reflected ones first. The two closures coincide when the counts match, so taper and GDS staircases are unchanged. At a waveguide-to-free-space junction the reflection into the fundamental moves by 10-15% (down), the answer no longer depends on the order the two sections were declared, and declaring an angled facet at zero tilt no longer changes it.Per-junction settings: a
connect_portsentry accepts a third element,JunctionOverride(junction_normalization=...), applying to that junction alone.Field plots: the color scale is normalized to the excitation plane’s field family, with a ‘Norm’ selector (vector or component), the log scale spans -60 dB to 0, an ‘abs sum’ cross-axis reduction.
plot(profile=...)renders a stored profile on a simulation that has EME sections declared. Previously the plotter always followed the sections.get_fieldswith nokeyreturns all six E and H components.material_explorerwithfile_name=saves the figure without opening a window, likeplot.Setting
EMODE_NONINTERACTIVE=1makes everyplotbuild its figure and return instead of blocking on the window.EMODE_EMAILandEMODE_PASSWORDlog in without the login window, for unattended runs.EMode prints a notice when it checks out a license and a newer release is available. It turns itself on once a release’s installers are downloadable.
The default MKL thread count is capped at 16 (an explicit
MKL_NUM_THREADSoverrides this setting).Second-order nonlinear coefficients (
d) added for GaP, AlN, and InGaP, and for the new materials GaN, LiTaO3, and ZnSe, each with a citation, the BBO, GaAs, AlGaAs, LN, and LN_MgO entries are corrected and cited.d_matrixwithreference=Truereturns the citation.get('<material>')now includesproperty_refs, the source of every non-optical and nonlinear value.Electro-optic (Pockels) coefficients
rfor LN, LN_MgO, GaAs, InP, AlN, and GaN.electrostaticderives the DC field from the solved potential, andFDMthen solves the biased waveguide through the r tensor (include_static), so a phase shifter’s VpiL comes straight out ofreport.Thermal and electrical properties (
thermal_conductivity,dn_dT,eps_r_dc, andresistivityfor metals) filled in for every database material, plus the heater and electrode metals Au, Al, Cu, Ti, W, Cr, TiN, and NiCr with their optical constants at 1550 nm. The Material Database page tabulates every material’s non-optical properties, \(\chi^{(2)}\) and electro-optic coefficients, and their sources.reportandplotmark modes that live in the PML: the report gains aPMLcolumn and the plot’s mode menu reads3, TE, PML. The designation is available asPML_indicesandwindow_confinement.New setting
pml_seed_bool: a PML simulation is first solved without its PML, and the eigensolver is then seeded with that fundamental mode, so the guided mode lands at index 0 without a hand-tunedmax_effective_index.New website examples: Nonlinear-EME: SHG (GaAs-on-insulator second-harmonic generation, straight and tapered, with both devices’ conversion-efficiency spectra), Nonlinear-EME: PPLN (a periodically poled thin-film lithium niobate waveguide doubling a telecom TE pump, with propagation loss from sidewall and surface roughness), EME: Angled Facet (a lensed-fiber Gaussian into an angled-facet taper, swept over facet tilt), Heater (a Pt heater above an SOI waveguide, with the power for a \(\pi\) phase shift), and Phase Shifter (Au electrodes beside an x-cut LNOI waveguide, with VpiL).
The Variable Descriptions page now explains how the simulation file is organized (top-level keys vs. the
profilesdictionary, default and named profiles, multi-wavelength profile sets) and groups variables by where they live.inspectis documented.New website examples: Adaptive Scan (
sweep(adaptive=True), a fine wavelength spectrum from a sparse set of solves) and Nonlinear-EME: DFG, difference-frequency generation in periodically poled lithium niobate, with two simultaneousSourceexcitations and a three-wavelength profile set.A sweep or a
chi2_spectrumno longer prints the mesh and eigensolve of every wavelength it solves. One line for the scan replaces one pair per solve.A \(\chi^{(2)}\) section warns when its mode basis still contains PML modes: their large imaginary propagation constants make the coupled-mode solve stiff, and the warning names
remove_pml_modes_bool, which drops them.get('response').power_vs_z(wavelength)returns the forward power against position along a \(\chi^{(2)}\) section, from one solve. The coupled-amplitude ODE already integrates along z and used to discard the result, so a pump or second-harmonic power curve cost one fullEMEper length. The forward amplitudes are now recorded after the driven solve converges and returned with the response, stitched across the slices of a refined taper so the curve reads as one.amplitude_vs_zgives the per-mode complex amplitudes behind it. Sampling is controlled byz_sampleson the process (default 100 points per slice, 0 to switch it off).plotwithplane='z-x'on a \(\chi^{(2)}\) section draws the driven field. It uses the declaredexcitationrather than a unit mode, since conversion depends on pump power, and renders each slice from the amplitudes recorded along it, so the generated wavelength builds along the guide instead of stepping at slice boundaries.wavelength=picks which wavelength to show. Without a declared excitation the field shown is the small-signal response and the solver says so.The coupled-amplitude ODE’s default tolerances are
solver_rtol=1e-6andsolver_atol=1e-9, withRK45as the default method. Passsolver_rtol,solver_atolorsolver_methodon the process to override any of them. The explicit Runge-Kutta methods (RK45,RK23,DOP853) are the usable choices. The coupled amplitudes are complex, and SciPy’s implicit solvers (LSODA,Radau,BDF) reject a complex initial condition.
Fixed
scatteringcorrupted the profile it had just reported on, so every latergeton that simulation failed. The same path also wrote into a material object returned byget('<material>').get('scattering_loss')(andsweep(result='scattering_loss')) returned the per-shape metadata dictionary instead of the loss, and raised an error when more than one shape carried roughness.In an EMode2D session every internal error was reported as “only available with EMode3D”. An unexpected internal error now names only the function that was called.
A saved simulation could not always be reopened: port references came back as plain tuples, section declarations reloaded as dictionaries, and some stored types were unknown to the reader unless that session happened to have imported them first.
sweep(result=['mode_order'])raised an error, and an unsupported section key failed an assertion instead of naming the key.A saved simulation reopened only if the reading session happened to have already imported the module defining each stored type. Otherwise it failed with a bare
KeyErrornaming an internal class. Every tagged type is now imported before the file is read, and an unknown tag raises a proper error.A
pwd_sectionwith an offset window is drawn where its field is.The z panel of a field plot is normalized to the excitation plane, not the global maximum.
A forbidden section name raised an opaque “unexpected exception” instead of the intended error, and a bad value in
EME_settingsor a section’ssettings=did the same.create_profile_setraised an error on first use.resetaccepted anykindand silently did nothing for a misspelled one. It now raises an error.reset('shapes')also clears the stale mesh and mode data, so the nextFDMsolves the new geometry instead of the old one.import_databasefailed on a citation containing=, rejected integerwavelength_rangeentries, and defaulted the wavelength range to 200-2000 um instead of 0.2-2.0 um.get(key, profile=...)returned the default profile’s value for every per-profile variable regardless ofprofile. A multi-wavelength profile now returns a dict keyed by wavelength.refractive_indexon an unknown material raised a raw error.permeabilityreturned a nested list for database materials and crashed on numeric input.create_profile_setsplit a bare string into characters and rejected its own documented default set name.get_shapecrashed before anyscattering/confinementcall.reportreturned a dictionary that paired column headers with mode rows and ignored itsprofileargument. It now returns one list per column for the requested profile.The
emodecommand line no longer prints a redundant “Opening the EMode Login window…” message.An exception inside
sweepleft its output-suppression flag set, silencing every later operation in that session.scattering(and anyFDM(scattering=True)) failed with “‘FDM’ failed with an unexpected internal error” on a profile solved withremove_pml_modes_bool. Dropping the absorber’s modes leaves the basis shorter thannum_modesasked for, but the per-mode loop still ran over the requested count and indexed past the end of the field arrays. A mode explicitly requested beyond the solved basis now raises an error namingmode_list.
1.0.3: August 18, 2026
New
Added the setting
pml_thickness, which specifies the PML by physical thickness in nm instead of by a layer count. It is [north, south, east, west] like every other four-sided setting, and 0 on a side falls back tonum_pml_layersthere, so the two can be mixed per side. A layer count measures grid cells, so the absorber shrinks as the mesh is refined.pml_thicknessholds it fixed, which is what a resolution convergence sweep needs. Seesettings.
Fixed
A simulation with a PML could not be reopened:
openfailed before any plot or solve ran, and the.ephfile was already wrong when it was written.A boundary condition that pins the field at the wall left phantom modes in the mode list: one grid column wide, with exactly zero loss, sorted in among the physical modes. They are removed from the eigenvalue problem now, and genuine modes appear in the slots they were occupying.
The PML now delivers the thickness its profile specifies. The grid gave the absorber smoothed cell widths, so a default 10-layer PML measured 492.8 nm against a design value of 500.0 nm, and the outermost (most absorbing) layer absorbed 14% less than intended. Reported radiation loss shifts by a few percent in simulations with a PML.
The cached-solution key discarded the PML coordinate stretch, so two profiles differing only in their PML could share a junction S-matrix.
Lowering
num_modeswithsettingsafter a solve produced a mode list that EME could not assemble.expansion_sizevalidation checked every direction against the north expansion instead of its own, so a valid single-direction expansion could be rejected and a bad resolution could escape the check.FDMcalled without aprofileargument no longer also writes a junk profile named ‘None’ alongside the default one.A junction between a section with a symmetric or antisymmetric boundary condition and either a
pwd_sectionor a differently reduced neighbor now integrates every overlap over the same domain.A windowed port lost its normalization when its basis passed through a transform, giving a 13% error in the self-overlap on a symmetry-folded port.
A port with a composed
basis_mapraised an error instead of producing a cache key.Overlap products are recomputed after the field data changes instead of being served from a stale cache.
1.0.2: August 5, 2026
New
Free space sections using plane-wave decomposition, declared with
pwd_section. Junctions with neighboring waveguide sections are computed analytically instead of by a mode solve.Generalized port definitions and connections, including branching: a
portsargument on every section function,connect_portsfor wiring named ports explicitly, and thePortandBoundsclasses in emodeconnection (see Ports). A connection also positions its two sections relative to each other, replacing the now legacy per-sectionoffset.A port can expose a sub-window of a wider cross-section, and when it is not connected to anything its mode is solved on that window alone, isolating a single waveguide of a multi-waveguide cross-section instead of the coupled supermode.
The PML profile parameters are now user-tunable in
settings:pml_order,pml_reflection,pml_kappa_max, andpml_alpha_max, with defaults unchanged.The port selector in the field plot lists the simulation’s port names.
Fixed
remove_pml_modes_boolhad no effect at all. It now removes the artificial modes of the PML regions from the mode list.The innermost PML layer was transparent, so a PML of N layers had only N-1 absorbing layers, and the PML parameters were missing from the cached-solution key, so two profiles differing only in their PML could share a solution.
Shape geometry is now resolved in absolute coordinates, independent of the simulation window.
scattering()raised an error whenshapesormode_listwas given as a list.In emodeconnection, a single-element list argument was collapsed to the bare element before being sent to EMode, affecting every list-valued argument.
In EME plots, section outlines disagreed with the field for every section after the first in a chain with transverse offsets.
plot()crashed when previewing a profile or taper section afterFDM(), when given aslice_position, and for a slice containing only background material.The
emodecommand line no longer requires Tk/Tcl for--help,--version, andlogin.
1.0.1: July 18, 2026
New
Added a section outline view in EME plots, available before running the EME solve.
EME slice view uses ‘sum’ rather than ‘mean’ by default, and ‘mean’ is still an option.
Added functionality to clear sessions from the EModeLogin GUI.
Added a CLI replica of the EModeLogin GUI, accessed by running
emode loginfrom the command line.Added an alternative basic interface for entering credentials with
emode login --write.The
clearparameter ofEMode()accepts two new options: ‘mine’ and ‘others’, for clearing sessions by user.
Fixed
Offset section display x-y view.
Settings issues for plots, including window and mesh display for EME.
In emodeconnection, the
saveparameter no longer shadows thesave()function in EMode.effective_area(),group_index(),orthogonality(),scattering(), andconfinement()now return the value directly for single-wavelength profiles. A dict keyed by wavelength is returned only for multi-wavelength profiles.get_fields()andget_grid()returnFieldSet/GridSetobjects for multi-wavelength profiles, preserving numeric wavelength keys.
1.0.0: July 8, 2026
Major internal architectural changes to enable the pending release of nonlinear EME functions and complex circuit solutions.
EME API changed such that each section type is defined with a unique function.
Improved PMLs for stability, especially with radiation modes.
Fixed a bug with the command line installer for Windows. Now
emodeis added to path automatically.Plot now shows bidirectional field data by default, controlled by the setting “Forward only”.
Plot now blends fields with interpolation by default, controlled by the setting “Blend slices”.
0.2.6: April 27, 2026
Fixed
sweep()function to delivermode_orderandscattering_lossinresults.Added
mode_order()as a user accesible function.Updated
FDM(),orthogonality(), andoverlap()to useprofileinstead oflabelnomenclature.
0.2.5: March 25, 2026
Updated license manager connection to use a standard REST API (https).
Users now have the ability to clear existing EMode sessions in case a simulation crash locks up a license. By default, stale licenses will be cleared every 9 minutes (24 hours with roaming enabled). Users can clear non-roaming stale sessions. See the Python Interface page for details.
0.2.4: February 10, 2026
Boundary condition implementations have been updated. This may impact (anti-)symmetric boundary mode lists.
Improved EME junction algorithm for robustness.
Implemented speed improvements, leading to a 60% speedup in our taper example.
Added an input to the
settings()function calledfrequencyas an alternative way to set the simulation wavelength. Internally, thewavelengthis calculated from thefrequencyparameter aswavelength= c/frequency.Improved error handling when keywords are used incorrectly.
Fixed a bug with scattering loss for films smaller than the mesh size.
Added functionality to automatically clear all mode data at each call to
mesh()andFDM().Added support for layers with zero thickness.
Fixed a bug with conformal layers that extend outside the simulation window.
Improved PML parameters for better accuracy and stability.
0.2.3: October 24, 2025
The
effective_area()function now returns the effective area values. The effective area is in units of um^2.The shape vertices are now available to the user in the form of Well-Known Binary (WKB). The Shapely package in Python is required to decode this representation of the vertices into a Shapely geometry.
Shape names are now automatically generated if not specified.
In the
sweep()function, scattering losses are now available in the ‘result’ parameter. Use ‘scattering_loss’ to get a sum of all the shapes, or specify any of the scattering loss metadata keys to get them for each shape.Mode tracking has been added to the
sweep()function. Specify ‘mode_order’ in the ‘results’ parameter to get a list of the mode orders relative to the first solution.The
Fielddimensions are reduced when only one field is requested, consistent with EMode prior to v0.2.2.
0.2.2: October 14, 2025
Hotfix on the previous version to remedy a few bugs.
Using the
get()function to extract ‘x’ and ‘y’ now returns the full-window variables.Using the
get()function to extract a single field variable returns all modes for that field.Added
get_fields()andget_grid()functions to extract Field and Grid class information (see documentation updates) from a simulation (usingget()for this is now deprecated).Fixed a bug when
shape()is called after meshing.
0.2.1: October 8, 2025
Updated the general anisotropic solver to support bend waveguides and all types of settings like symmetric boundaries, expansion, and PMLs, available with EMode3D.
Added an input parameter to
FDM()calledmode_filter. By default, this is set to ‘forward’, but it can also be set to ‘backward’ or ‘none’. This will filter the mode list to select only forward or backward propagating modes (or don’t filter) for the anisotropic mode solver.Improved EME stability and accuracy.
Added a new parameter to
settingscalledeme_scattering, which specifies whether or not to automatically calculate all scattering losses within the EME calculation, defaults to False.Fixed a bug in the MATLAB connection.
To use MATLAB on macOS, users must install .NET (https://dotnet.microsoft.com/en-us/download/dotnet/9.0). Installation instructions have been updated to include this detail.
Added support for directly saving EME plots with
plot()andplot_S_matrix().Fixed bug with conformal layers defined over multi-masked layers.
Fixed bug with the
reset()function for resetting shapes.Removed input parameter
labelfromsweep()because it has not been implement yet.Updated the
confinement()function, which now includes the background shape and returns a dictionary of the confinement factors for each mode.Updated
orthogonality()so that it returns the orthogonality value.For taper and gds section types, the default
minimum_z_stepis now ‘auto’, which uses 1/8th of the wavelength.Default
overlap_variationis now 0.02.Added option
losslessto taper and gds section types. Defaults to False.Added the following parameters to the
add_material()function: thermal_conductivity, resistivity, dn_dT, eps_r_dc, phi, and theta. See the documentation for details.Added the following parametrs to the
shape()function: fem_resolution, current, voltage, and heat_only. See the documentation for details.Added a parameter
taper_algorithmfor the taper and gds section types. This is intended to be used for slowly varying structures that are known to be adiabatic.
0.2.0: June 27, 2025
Added an explicit restriction on the
toleranceparameter so that it cannot be set to be smaller than the machine precision. The default fortoleranceis 1e-12.Removed a bug in EME for symmetric section simulations.
Optimized and improved the underlying EME algorithm, improving simulation accuracy.
Added beta support for macOS and Linux.
Improved the subpixel averaging algorithm.
Added general anisotropic solver for straight waveguides, available with EMode3D.
The shape() function input
refractive_indexhas been changed tomaterial. Similarly, thefill_refractive_indexhas been changed tofill_material.All scattering loss results are now stored under the
meta_datadictionary of the shape.Added a progress bar for meshing and solving.
Added the ability to return material properties from database materials using
get("material_name").Added two special types available to the user for defining materials and material properties:
MaterialSpecandMaterialProperties.The crystal orientation of a material can now be rotated relative to the simulation window axis by defining a
MaterialSpecand specifying rotation parametersthetaandphi.Changes to biaxial materials: extraordinary index is always aligned with the z-axis (ordinary is aligned with the x and y axes). Rotations can be performed to orient a crystal to the simulation axes as desired. Affected materials: BBO, LN_z –> LN, LN_MgO_z –> LN_MgO, TiO2_rutile.
When EMode encounters errors, emodeconnection.py (1.0.11) will now raise an exception instead of just printing an error message.
0.1.2: March 16, 2025
Fixed a bug where
num_modeswas reset after modes are automatically removed from the pml regions.Fixed a bug with the
label()function when using thefill_refractive_indexparameter.Fixed a bug in the
plot()function whenfill_refractive_indexwas set on conformal layers.Fixed a bug with EModeLogin when displaying error messages.
Updated the EModeLogin GUI layout.
For both the Python and the MATLAB interfaces, a static function called
EModeLogin()was added, which replaces the previous EModeLogin executable for running the EMode Login GUI. New instructions are added to the website for running the EMode Login GUI.
0.1.1: May 7, 2024
Fixed a bug with the MATLAB connection.
Fixed a bug with the
shape()argumentposition.Fixed a bug with the
scattering()calculate that was overestimating the scattering loss.
0.1.0: April 24, 2024
The EME module has been added, including
section(),EME(), andplot_S_matrix(). These are only available with an active EMode3D license.EME solver is limited to only use field_to_solve of ‘Et’.
EME length sweeps are solved in the reverse order.
Changed the parameter
length_nmtolengthfor all EME sections and functions.EME sections automatically re-solved after a shape change and label reset.
Materials added to the material database: InGaAs, InGaP, InP, InSb, PMMA, SU8, TiO2_rutile, HfO2, H2O, GGG, GaSb, GaP, BBO, and InSb.
Material explorer: fixed bug saving certain filetypes, fixed bug with logo placement in saved files, and added gridlines.
Updated
material_explorer()plot display and saving resolution.The
add_material()function now accepts citation and wavelength_range as an inputs.Updated
add_material()so that is accepts a list of three equations for defining anisotropic materials with dispersion.New function
import_database()added, which supports the import of a custom database text file.The west boundary condition has been re-defined to reflect the Ex (a)symmetry, so it matches the south boundary condition.
The default y-position has been changed from -1 to ‘auto’.
In the
plot()function, scaling is added to the cursor data-value for field plotting.Fixed a plot error following a call to
group_index().Fixed a bug when iteratively updating a shape setting.
MATLAB connection now outputs text to the MATLAB command window.
Updated the scattering loss tool to make the calculation more consistent.
Fixed bugs with saving and opening EMode simulation files with MATLAB.
Added the new parameter
propagation_resolutionto thesettings()function.
0.0.7-b5: December 12, 2023
Fixed bugs with conformal layers.
Added arbitrary number of masks for each shape.
Added input parameters to shape:
mask_offsetandtone. Eithermask,mask_offset, or both can be a list. The length of each parameter will be matched by padding with the last value. Settings fromtoneandetchare applied to allmask/mask_offsetvalues.Added etch functionality to conformal layers.
Fixed the bug the made incorrect mode list ordering.
Added the function
orthogonalityto test the othogonality of the mode list. This is helpful to determine if the mode list is sufficiently accurate.Added the input parameter
labeltoget(), so users can extract data from labeled datasets.The
label()function now saves all settings and field data under in a Python dictionary or a MATLAB structure array calleddataset_LABEL.Changed the default operation in
confinement()to only include areas of a shape that define the refractive index, not including areas that are overlapped by other shapes with higher priority.Added a boolean option
ignore_prioritytoconfinement()that toggles ignoring overlapping shapes with higher priority.Added user-accessible variables
shape_materials,priority_indices, andshape_vertices.Added support for iPython.
Added functionality to use an existing material name to define a custom material. This will override the EMode database material during the session.
FDM()now takes the input parameterlabelto automatically save the simulation result as a labaled dataset.Updated
group_index()so it will run without runningFDM()first.Added ‘min’ as an option for
slice_opparameter inscattering().Shapes and associated properties are now saved as dictionaries. This also includes the scattering loss results.
Interfacial roughness and correlation length values are now specified in the shape parameters:
correlation_length(aliasLc_nm) androughness_rms(aliasst_dev_nm).Added the new function
reset()to clear all shapes, reset settings, or both.Shape argument
positionnow accepts a single float to specify only the x-position and automatically place the y-position of a planar layer on top of the previous layer.Added boundary conditions options ‘TE-h’, ‘TE-v’, ‘TM-h’, and ‘TM-v’ to specify only horizontal or vertical symmetry for TE or TM modes.
Fixed bugs with MATLAB connection: default
file_typeis now ‘.mat’ forclose(), and ‘.eph’ file is preserved aftersave().
0.0.6-b4: March 13, 2023
Added an option to remove the legend from
plot.Now planar layers do not add fill material by default, only if
fill_refractive_indexis defined.Updated meshing algorithm to fix bugs at shape interfaces.
plotnow shows positive and negative field values on the colorbar.Fixed error when setting
wavelengthunits to ‘um’ inadd_material.Added options to improve sidewall scattering accuracy. See details in the documentation for the
scatteringfunction.
0.0.5-b3: February 3, 2023
Scattering loss now works with angled sidewalls.
For
scattering, the default formodeis ‘all’.Added imaginary index capability to
add_material.Bend mode solver updated so field patterns and loss are now more accurate.
Switched from uniaxial pml to stretched-coordinate pml.
User-defined materials now override EMode database materials.
plotnow shows shapes with the same refractive index in a different color.Added capability to solve for the magnetic field instead of the electric field. See the
field_to_solveparameter insettings.Removed the field_calc option from
FDM. Now the fields will always be available, but they will not be stored in memory. This reduces the memory usage by about 7x.Saved .eph files do not contain the raw field data by default. This can be controlled with the
save_all_fieldsparameter insaveandclose.material_explorernow shows user added materials.