We are live!

After some deliberation I’ve just decided to put EMerge live on my Github. Running a limited group without paying for Github was too much of an effort to manage.

On my Github you can now download the latest version plus some demo scripts. There is also a link to a discord in which we can discuss features, questions results etc.

After a lot of work for the past week I have been able to check off some major achievements. Which I’d like to discuss here.

Modal analysis

Performing port mode analysis proved more difficult than I thought. In order to do a good analysis you have to use mixed basis functions, one for XY (edge element) plus a legrange 2 for the out-of-plane component. I spend days getting this to work after which I folded and tried Gaussian Quadrature integration instead of analytic and that did the trick!

Now you can finally run a robust modal analysis to compute port modes! On top of that, I made sure that the port power normalization and impedance calculation works smooth.

ARM Support + parallel processing

For month’s I have been considering buying a Macbook Pro with the new Apple Silicon M(whatever) chips. Then I found out from someone on our discord that ARM doesn’t support Pardiso. This was quite a shock because all other direct solvers where either terribly slow or impossible to easily implement.

After spending some time researching I decided to see just how much performance I could squeeze out of Scipy’s SuperLU. After checking what must be 15 different permutations of settings, the very final one combining several finally allowed me to drop the factorization time to something comparable to PARDISO’s first solve without parallel processing!

SuperLU doesn’t store the algebraic decomposition which makes subsequent solves faster but it was at least possible run it in parallel!

Then after, trying a little bit I managed to implement a basis version of parallel processing using Pythons multiprocessing toolbox. It requires some clunky setup (minimal for the user) but it runs in parallel quite well and actually outperforms PARDISO on a larger frequency sweep!

Full S-parameter sweep

When computing the entire S-parameter matrix you have to rerun the entire Ax=b solution process for each port. The port excitation only gets impressed on the vector b so one BIG advantage of direct solvers is that you can reuse the exact LU factorization of A (both SuperLU and Pardiso). This means that every other port can get solved in 1/40th the time.

With this in mind I was able to implement a very basic first setup of full port sweeps (which is now the default).

Dont mind the axes please!’ This is a 4-port sweep.

Improvements on the meshing

I also fixed some meshing issues with GMSH. Now, the entire mesh size is based on mesh-fields which allows for better more robust conductor edge refinement!

Geometry face mappings

One of the big down sides of not having a GUI is that assigning/selecting faces is cumbersome. You can’t click on anything and its impossible to tell which tag integer gets assigned to a face after the geometry is generated.

GMSH by default creates a mapping from input geometry tags to output geometry tags. In the latest version, I added an interface tot the GMSHObject class that allows it to define input-faces during object creation that automatically get mapped to output face indices (multiple) after computing the fragment.

This means that I can crease multiple geometry classes such as SidedBox (which exists) that have defined face selection interfaces so that you can just say:

MyWavePort = fem.bc.WavePort(MyBox.front, …)

What is next?

September 1st is still the official release date for the first beta version. I’ll then upload it to PiPy and start official version numbering. Until that time there is still more work to do.

  • Complete documentation

  • Example scripts

  • Complete Wiki

  • Improved code/solvers

  • More CAD/Geometry handling

  • Lots of error/exception handling

Want to help out and discuss? Please visit the Dowload page and the Github, download, play around and make sure to show your results in our Discord!

Previous
Previous

Demo 1: Rectangular waveguide filter

Next
Next

Lift-off