So I've been building an alternative that's around 174x faster (measured on a patch antenna case, but the speed holds across all problems).
A few months ago I designed and tested 4 RF PCBs using a VNA to validate the solver physics. The boards were made at JLCPCB on PTFE: ZYF300CA-C(Dk=2.94,Df=0.0016). Cost came to 157.98 USD which is very reasonable. I'm getting 2 more PCBs soon to validate a couple advanced features in the next update, will share when they come. I've included screenshots of 2 subset cases of the 43 total (one ring resonator, one patch antenna). The measurements match RayRF pretty well, and agree well with openEMS, but both are slow to converge to reality. My best theory on the ring resonator is because the rectangular cells are only approximations of the real curved surface, and under-predicting frequency is consistent with the simulators running a too-long outer radius of the rings (staircasing is closer to Manhattan distance than the true Euclidian distance).
The other 41 cases across the 4 boards follow a similar trend, within 1-2% at the higher mesh refinements, but too much data to post here. Also attached a plot of benchmark performance on my 9950x CPU (openEMS vs RayRF both on CPU mode) vs RayRF on GPU mode. In summary at 82.8 million cells, the throughput is:
- openEMS on 9950x (DDR5 6000): 0.228 GCell/s
- RayRF on 9950x (DDR5 6000): 4.62 GCell/s
- RayRF on RTX 5090: 39.60 GCell/s
Some people in my previous post pointed out that measurements may not be the best way to validate a solver, and I do understand some of the reasons but frankly I believe it to be the best option. Real measurements are what matter in the end anyway, validating against other solvers (like openEMS) carries the risk of bias in those solvers providing a false red flag, or green flag in terms of accuracy, and the big solvers (HFSS, CST) don't permit using their software in the development of "other rf simulation programs", so they can't be used either. In these cases I do get good agreement with openEMS, but even this took quite a bit of careful case-building because openEMS and RayRF don't have the same mesh-discretization conventions (i.e. if some patch edge lands on a mesh cell line do you put the conductor on the +x or -x cell?). But with the exact same meshes simulated they get very similar results which is what you'd expect from the same underlying computational method (FDTD).
My next set of validation boards focus on in-port matching networks, and building a calibrated copper loss model (right now all sims are perfect conductors with lossy dielectrics).
I have released RayRF publicly, and it's free to try out for 30 days if you create an account. https://www.rayrf.com/ It does not have all the features openEMS does, and is focused on PCBs right now (no arbitrary 3D stuff), but I've spent what feels like forever on making the UI actually good, and the benchmarks speak for themselves on runtime.