Skip to main content
`Ctrl`+`K`

# Frequency response linear solver

# 3.2. Frequency response linear solver

This section is about using the Helmholtz linear solver. The reader is assumed to be familiar with all the other documentation. Iterative linear solvers for some other types of problems are discussed in Section 3. At this time using `solver_tol` below the default value is not recommended due to observed inconsistencies suggesting that the wrong answer can be returned to the user. Clarifying this issue has a low priority at this time.

Insufficient virtual memory problems. If insufficient memory problems arise, users must determine their cause and explain them. This is difficult.

Zeroing out `orthogH` conserves memory. Note that the Helmholtz linear solver is less mature than some other parts of GDSW. I have noticed in the past that setting `krylov_methodH` to \(1\) changed `orthogH` to \(1000\) (of course \(1000\) is the default value of `orthog` and \(20\) is the documented default value of `orthogH`). The Sierra/SD parser has default value \(0\) for `orthogH`. It is necessary to monitor the value reported for `orthogH` in `dd_solver.dat`.

Experiments with alternative mesh partitioners have been surprisingly productive for structures.

`precision_option_O` single conserves memory in theory, but in practice it has been problematic. It would help to use it with Flexible GMRES. Note that Flexible GMRES may interact with `orthogH` like `krylov_methodH`.

Divergence problems. Address divergence either by adjusting the preconditioner configuration parameters or by increasing the magnitude of the damping matrix. The former has the disadvantage that there are many parameters. Given time the variety of parameters exposed to the user will decrease. The latter has the disadvantage that it can change the solution.

Determining how much damping to use is beyond the scope of this note. If the response is independent of the damping, then there is not too much damping. The case of slight increases in the response due to the damping are less clear.

Configuring the preconditioner may involve trial and error. One approach is `useParallelDirectSolver` `yes`. As long as there is enough memory available, the parallel direct solver will almost surely work.

The remainder of these notes concern the trial and error approach to configuring the preconditioner. Start by decreasing the preconditioner update frequency, despite the computational cost.

Increasing the number of levels of overlap may help, particularly with shell elements. There is a theoretical explanation for this.

`Structural_damping` and `viscous_damping` apply to the custom and the operator preconditioners. A formula for the dependence of the preconditioner on these parameters appears in the documentation. The code probably uses this formula. There are two important things to know here. First: these parameters have nothing to do with the damping matrix, and only change the preconditioner. The default values of the structural and viscous damping are respectively \(12/100\) and \(0\). Second: sometimes, changing (usually but not always increasing) the structural damping improves the preconditioner (decreases iterations and decreases overall time to solution).

The previous `max_previous_sols` solutions determine an initial guess for the current linear system. The default is zero. I do not know the default initial guess. If max previous sols is positive, then the initial guess is effective.

The Krylov subspaces generated to solve the initial linear systems are applied to the remaining linear systems. Only the first `orthogH` Krylov vectors are used. In several studies, the value \(100\) has proved optimal.

`cull` `method` `eigen` is in theory the best way to refresh the Krylov vectors, but in my experience it has never helped.

`SC_optionH` `yes` helps less often than the default, no, but is worth trying. It is particularly important to type this option correctly. A similar option for other types of linear systems, `SC_option`, is silently ignored for direct frequency response problems.

Preconditioner effectiveness may vary with both input frequency and the number of MPI ranks. Subdomain diameter is inversely proportional to the cube root of the number of MPI ranks. Subdomain mode shape wavelength is proportional to subdomain diameter, and frequency is inversely proportional to wavelength. For these reasons increasing the number of MPI ranks can improve simulation reliability at higher frequencies. My observations are consistent with this prediction. For the same reason at a fixed low number of MPI ranks, as the frequency increases, the effectiveness of the coarse grid correction within the preconditioner may deteriorate. Such deterioration theoretically may be mitigated by setting the `coarse_option` to the non default value `none`. Due to software defects, this strategy only became an option recently (9/2020). However, this strategy has not helped so far.