Change Log
This page contains an overview of updates in each EMerge version. Up to version 1.0.6, updates are not necessarily summarized completely. From 1.0.6 onwards, all changes will be completely summarized.
v1.1.0
Additions
-
Added .hide(), .unhide() methods and hidden property for GeoObject to hide objects in the 3D window.
-
Instead of the Simulation() class there is the SimulationBeta() class that contains the .adaptive_mesh_refinement() function to be called before an adaptive mesh refinement study.
-
At the end of a simulation, a list of simulation warnings is printed that contain diagnostics of potential programming errors. More detections and logs will be added in order to provide the user with more feedback.
-
The Settings class now has more setting options including:
-
mw_cap_sp_single: Limits a single S-parameter to have an amplitude of 1.0 max (default True).
-
mw_cap_sp_col: Limits the power conservation of the S-matrix columns to 1.0 max (default True).
-
mw_recip_sp: Enforces reciprocal S-parameters by averaging with the transpose matrix. (Defualt False)
-
size_check: Assumes that simulations will not exceed 100.000 Tetrahedra in the bounding box. If there are more (based on the maximum size) the program will hard crash to prevent GMSH from getting stuck. If the simulation domain is truly large this setting can be turned off.
-
-
The PCB class now has the .radial() method to create a radial stub.
-
.generate_air() and .modal_port() can how also accept height tuples in order to add air blow the PCB. The first entry will be considered the air height below the PCB and the second above. If a float is added it will only create air above.
-
You can now also specify a manual integration line for modal ports using the function: set_integration_line()
New behavior
-
The .align_modes() method of the ModalPort class will now also be used to invert the mode field of modal port solutions to align along the vector direction. This way, in between subsequent mesh refinement steps, there will be no 180 degree phase shifts
-
The Settings class properties are now accessed through dynamic @property and setter functions in order to show tooltips/documentation for each property
-
The ModalPort class no longer has the TEM=True argument but a modetype='TEM','TE' or 'TM' argument to specify the expected type. If not provided the 'TE' or 'TM' will be inferred.
-
ModalPorts no longer crash if there are more or less than 2 PEC islands detected. Instead, no Z0 will be calculated.
-
The ModalPort excitation field phase will also be aligned based on the computed voltage in case of TEM fields with integration lines. To ensure that the same voltage integration direction is used, the terminal island detector (trying to find the positive terminal and ground) always sorts its groups based on total edge length (mesh independent).
-
The PVDisplay class uses a background image to improve rendering of metals. This requires an internet connection on first launch and will use the cached image on subsequent runs.
-
The edge refinement around surface boundaries is improved with a mathematically more accurate function.
-
The Sphere object uses a different selection method for its external boundary that works after boolean operations as well.
Others:
-
Refactoring has be done to include the SimState class which is used internally to centralize shared data-structures such as the mesh to clean up the code and improve code stability in the future.
Bug Fixes:
-
Numba Dependencies on Linux and cuDSS dependencies are updated to prevent errors.
-
A bug has been fixed with solver logger prompts now correctly showing the process ID for multi-threaded solves.
-
Fixed a bug where in some cases the wrong mode field was being used.
-
Set the matrix type in cuDSS solver to GENERAL instead of SYMMETRIC. Older versions give wrong results with un-symmetric matrices. This fix does decrease performance a bit.​
_____________________________________________________________________________________
v1.0.7
Fixed
-
Fixed an error on x86 which doesn't initialize solvers properly showing up as:
`SolverPardiso.__init__() missing 1 required positional argument: 'pre'`
​
_____________________________________________________________________________________
v1.0.6
Added
-
Geometry face shorthands for base primitives (Box, HalfSphere, Sphere, Cylinder): access faces directly, e.g. my_box.front instead of my_box.face("front"). (The original .face() API still works.)
-
Drude model constructor: Material.drude_model() to construct conductor materials using the Drude model of conductors.
​
Changed
-
run_sweep(): parameter name changed from njobs → n_workers in .run_sweep().
​
_____________________________________________________________________________________
v1.0.5
Fixed
Added a distance = 0 check for curve sampling.
​
_____________________________________________________________________________________
v1.0.4
Added / Improved
-
Parametric sweep file loading: when opening simulation files produced by sweeps, EMerge now loads the first iteration as the geometry + mesh by default. Select an iteration as the active geometry with:
-
Simulation.activate(var1=..., var2=...) or
-
Simulation.activate(index=3)
-
-
Logging: more detailed console logs and log file output.
-
Mesher API: .mesher.set_size() now accepts any object directly (generic method).
-
Surface plots: .add_surf(symmetrize=True) now auto-selects the coolwarm colormap (instead of viridis).
-
Plotting: better color plots and custom EMerge color scales.
​
Removed / Dependency Changes
-
Removed cloudpickle dependency due to data-loading instabilities on Windows. Material property functions are no longer bundled on import to improve robustness.
​
Fixed
-
Parametric sweep file instability during load (see behavior change in Added/Improved above).
​
_____________________________________________________________________________________
​
v1.0.3
Fixes
Fixed animation bug in surface and contour plots.
Fixed solver module availability check.
_____________________________________________________________________________________
​
v1.0.2
Addition and fix
Fixed first order Absorbing boundary condition and added second order boundary condition.
​
_____________________________________________________________________________________
v1.0.1
Added
-
Thread safety: UMFPACK can no longer be used accidentally in multi‑threaded contexts.
-
Consistent API: in_plane and in_layer now share the same argument format. Examples updated.
-
DXF reader (beta): initial DXF file reader added.
-
Geometry names (optional): can be assigned by users and are propagated into the Simulation dataset. Display with labels=True in .view() and label=True in .add_object().
-
PCB enhancements:
-
Item names and PCBPoly segment argument to reference specific polygon edges for port creation.
-
Stack buildup: specify PCB structure as a list of PCBLayer() objects with thickness and material (replaces raw Z‑heights).
-
-
Material libraries: added Isola420, Isola250, and Rogers300P prepregs in em.lib.isola and em.lib.rogers.
​
Changed
-
Periodic Cell boundaries: replaced "excluded boundaries" with a working inclusion set model.
​
Fixed
-
Version checking logic updated with a clearer explanation.
-
Surface impedance: finite‑thickness effect now considered; specifying a thickness can reduce effective conductivity if below one skin depth.
​
Removed
-
PCBLayouter alias (legacy compatibility) removed.