Dear ADDA users,
We have uncovered several bugs in calculation of Sommerfeld integrals, which is relevant for the surface mode (particles
near a substrate). They are related to standalone somnec.c from the independent package NEC2C that we used for these
calculations. While this routine was considered reliable, it happened to be not suitable for all possible input
parameters, especially with respect to substrate refractive index. All the details are given in
https://github.com/adda-team/adda/issues/326. Most of the several uncovered issues lead only to minor errors (around
1%), but we have observed 10% and larger errors for very oblate particles lying on plasmonic (metallic) substrates. So
all previous ADDA calculations for such configurations must be reconsidered.
To fix these issues, we had to modify the somnec.c itself. The main round of the fixes is complete and tested, it is
already present in the master branch of ADDA. It should work for any passive substrate and in wide range of particle
sizes with relative accuracies of Sommerfeld-integral calculation on the order of 0.0001 (much smaller than the expected
accuracy of computed scattering quantities). So it is highly recommended to use this version for simulations in surface
mode instead of the latest release. Moreover, we would appreciate any comparisons with other simulation methods,
especially for metallic substrates, similarly as was done for dielectric substrates in
https://github.com/adda-team/adda/wiki/ComparisonOtherCodes#particles-near-surface . If you perform such a comparison,
please share the results with me or at
adda-d...@googlegroups.com .
Since we already had to understand the inner algorithms in somnec.c, we further plan to polish these routines and make
it fully conforming with the ADDA style. Hopefully, we can tune it to make even better accuracies possible (say, 1e-10),
although that is not really needed in practice. And maybe also accelerate the computations somewhat when the default
accuracy is desired. But these should not affect the ADDA results in any visible way. And we will keep this routine
standalone, so it can be easily used in any other code. If you want to play with it, we also provide the separate
testing program (somnec_test.c), which compares different ways to calculate the Sommerfeld integrals, that are
implemented in somnec.c, both in terms of results and timing.
Best regards,
Maxim Yurkin.