Software
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.4.x
This version contains a couple of minor updates.
-
The farfield results created by the .farfield_2d() and .farfield_3d() method now have .gain.x, and .dir.norm etc for the gain and directivity.
-
There is a specific FileBasedPCB class in emerge.beta.gerber that have a .layer_from_file() and .via_from_file() method to import copper layers and vias from gerber and drill files. This is still in beta and some gerber features may be missing. If you have such cases, please report them!
-
Optycal 0.2.0 is on PyPI with some examples. ​
v1.3.x
Version 1.3 does hot have a lot of major updates but some that might change how compatible they are with previous versions.
​
New features
-
The model.display class now has a .save_vtk("filepath") function that will store plot data to vtk files. Not all properties like surface color will likely be exported. This is a work in progress.
-
The .view() method has a bc=True optional argument to display what boundary conditions are applied where.
​
Changed behavior
-
PCB tool: You can use list indexing and function calling syntax instead of calling .store('p1') and .load('p1') when storing routing locations and loading them later. You can pass anything as a store and load index as well as they will always be converted to strings.
-
PCB tool: Instead of passing the StripLine object in the lumped and modal port generator, you can also pass the key or index that you used. Example: pcbobj.modal_port('p1', ...)
-
PCB tool: The .turn() command now has "square" be the default turn style.
-
PCB tool: n the .turn() tool, if you pick chamfer, the amount that is cut off is defined by a diagonal ratio ds which by default is 0.7. This conforms better to optimal 90 degree bends.
-
PCB tool: The .short() method has a way of also specifying more details on where you want to short to and with what radius.
-
Meshing: If you call .generate_mesh() after defining boundary conditions, the modal port and lumped port will automatically impose a sizing restriction on the mesh.
-
Adaptive Meshing: The Adaptive Mesh Refinement algorithm is changed a bit to hopefully mesh a bit faster and converge more optimally.
-
Display class: The PyVista display class previously downloaded an image to use as environment rendering of reflections in metallically rendered surfaces. This is now a file that is included in the EMerge library so that no internet connection is needed on first launch.
​
Backend changes
-
A change was made to how the selection class computes normals, surface areas and such which should now also work if you load your simulation file and selection object.
​
Warning tool
-
The warning tool will now warn users if they are using a python installed using the Microsoft Store as it likely won't allow Numba to store and call cached files from there.
​
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 major+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.
