Hello, I am on the tail end of my PhD and am coming out with a paper soon. I made my own model of DDA in python using ADDA as a reference for quite a bit and made a large amount of improvements to solve time.
Basing the core of my work on
[1903.09802] Preconditioning the discrete dipole approximation I implemented their 2 level preconditioner, succeeded in implementing the 3 level and was able to make enhancements to the process to grant both significant stability.
I use GPBi-CGSTAB for my solver, and slightly modified it in a manner that greatly increases the stability of the preconditioners.
For some examples (my paper will have a lot more) A sphere of radius 1600 and refractive index 1.8, I solve in ~2000 iterations. I run this on the gpu using a combination of cupy and pytorch with some optimized kernels and it took ~100 seconds to run, as opposed to 4.5 hours on qmr2 using adda on my home computer.
To match the above paper, I copied their hexagonal plate. for a size parameter of 100 and refractive index of 1.8, I solved in 445 iterations in ~19 seconds. For reference on their machine, they could not solve that and the size parameter of 80 took them 13,000 seconds. Though hardware and cpu vs gpu does make the time comparison a bit iffy.
In general for single objects my enhanced preconditioners could see updwards of 25-30x reduction in iteration count.
In addition to handling a variety of geometries, I also developed a partition system for multiple object scattering with varying refractive indices that enables multiple preconditioners to work, especially effective when the refractive indices differ by large amounts. Although not as much reduction for single objects.
I would be happy to talk with someone on the ADDA team about this, especially for how much I referenced your code when building my own little project.
Steven Lanier