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.2.x
For necessity of abiding by proper semantic versioning rules, 1.1.1 + some bug fixes explained here will now be considered 1.2.x.
​
ANYONE USING CUDSS SOLVERS NEEDS TO UPDATE TO 1.2.x FOR NUMERICAL ACCURACY REASONS.
​
Changed behavior
-
​Version checks in examples now only check for majo+minor versions, not patch versions.
​
Fixed bugs
-
Level indicators in the plot_sp function now work properly again. They threw an error due to name shadowing of parameter fs.
-
CuDSS solver now uses the GENERAL matrix type instead of SYMMETRIC which is slightly slower but gives the correct results.
​
Added features
-
Added a plot_vswr function.
v1.1.1
SurfaceImpedance boundary condition bug: It is known that the current implementation of SurfaceImpedance (as is used by the PCB class also) is not yielding the correct results in simulations. To get proper losses, use the temporary thick_traces parameter in the PCB router. A new ThinMetal boundary condition is being worked on.
​
Changed functionality/behavior
-
Geometry faces are automatically all named "Face1", "Face2" etc
-
All recognizable faces that are bounding geometries and normal to the Cartesian Axes are named "-x" for a left YZ face and "+z" for a top XY face.
-
Faces are named and shown with labels in the viewer.
-
​
Additions
-
GeoObject/GeoVolume have the .all_faces() method to create a list of all individual named faces.
-
GeoObject has the .extract(tag) method to create a new GeoObject with the given tags which are removed from the original object.
-
GeoVolume has the .exterior_faces(obj) method to select the exterior of an object based on a tool object it is based on. This can be used for example to select the exterior of an outside air domain without taking into account internal holes.
-
The model.view() method now has the labels=True and face_labels=True arguments. The first adds object name labels in the view. The latter shows the names of all faces of all geometries (computationally slow).
-
The em.geo library now has the extrude method to manually turn surfaces into 3D volume objects.
-
The em.geo.PCB class now has the thick_traces=True argument to cause it to automatically generate 3D volumetric traces with the provided thickness instead of 2D traces. Warnings are also generated if non-PEC materials are assigned to 2D surfaces as the current SurfaceImpedance boundary condition is not appropriate.
-
The .excite_port() method of the MWField class now also accepts the excitation for the mode.
-
The MWField class also has the .set_excitations(V1, V2, ...) method to easily set multiple ports at the same time.
-
Both the MWField and MWScalarNdim class have the .combine_ports(p1, p2) method to combine two single-ended ports into one port with a differential and common-mode signal. The port numbers are mapped accordingly.
-
The above new feature is demonstarted in a new example file demo16_differential_common_mode.py.​
​
Fixes
-
Adaptive mesh refinement is renewed and fixed based on the algorithm by Alexey Belokrys-Fedotov et. al.
-
Proper priority is given to conductors and volumes in the PCB class.
-
The animation state is reset in the PyVista viewer preventing each subsequent plot call to automatically be animated as well.
​​
STEP file importer
More work is done on the STEP file importer class. This can be found as em.geo.STEPItems.
-
The size unit is now correctly handled. It is not well imported from the STEP file itself yet.
-
The unit is not automatically taken from the STEP file so this should be provided.
-
The .as_volume(), .as_surface() etc methods are added to directly convert the STEPItems object into a volume (convenient if it contains just one).
-
The STEPItems class has an .enclose(margin) method to automatically wrap the object into an air-box.
-
A demo17_step_import.py file is added demonstrating STEP file imports.
​​
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.