I am simulating sound radiation from a vibrating structure with around 120,000 elements using the Numba-only Docker image. To accelerate the computation and avoid memory issues, I switched to the “FMM” assembler. However, I’ve noticed that the GMRES solver converges very slowly. After a full day of computation, it reached around 1,600 iterations before I decided to stop the process.
My machine has 32 GB of RAM and an Intel i9-13900H CPU (2.6 GHz base clock). Is there something additional I should be implementing when using the FMM assembler to improve GMRES convergence? Could the issue be related to preconditioning?
The FMM assembler uses a fast multipole method for the matrix-vector products inside each GMRES iteration. This assembler uses less memory than the dense assembler. However, the assembler should not influence the convergence of GMRES significantly.
To improve the convergence of linear solvers, you need to use a preconditioner. However, the preconditioning strategy depends on the BEM formulation you are using. Several of the tutorials on the Bempp website use preconditioning and may give you ideas.
Another way of improving GMRES convergence is to set the restart parameter manually. A higher value will improve convergence but at the expense of higher memory consumption.
I’m also working on a similar setup as op, to calculate sound pressure from a vibrating structure with approximately 105,000 nodes, utilizing the FMM assembler in the bempp-cl Docker container. For a frequency of 90 Hz, it takes 90 minutes. To provide some perspective, the same model, when executed in an FEM formulation that includes both domain and boundary elements, completes in just 7 minutes using Abaqus.
I found the tutorial on the “OSRC preconditioner for high-frequency scattering”. I’m curious to know if there’s a similar preconditioner available for radiation problems that could potentially accelerate the GMRES computations. Any suggestions or guidance would be highly appreciated.
Thank you in advance.
To improve the efficiency of simulations, you will need to perform some diagnostics to detect the computational bottleneck of your implementation. Measure the time to assemble the matrix, solve the linear system, and calculate the field values separately. Also, print out the convergence behaviour of GMRES. Perform these diagnostics for different configurations, like frequency and number of elements per wavelength.
In the case the convergence of the GMRES solver is the limiting factor, you will have to explore preconditioning strategies. The easiest approach is mass matrix preconditioning, i.e., using strong_form() instead of weak_form(). Bempp also offers the OSRC NtD and DtN operators, which are especially effective at high ka values, with k being the wavenumber and a the characteristic size of the domain. More specifically, the osrc_ntd operator preconditions the hypersingular operator and the osrc_dtn the single_layer operator of the Helmholtz equation. Hence, it depends on the specific boundary integral formulation if OSRC preconditioning will work.