Version v2.1.0 of ShengBTE has been released and can be obtained from the Downloads section.
It changes how the linearized BTE is solved. By default, the solution is now found with restarted GMRES on the fixed point of the Omini-Sparavigna update, which converges in cases, such as graphene, where the Omini-Sparavigna iteration diverges, and usually needs fewer steps. The new flag improved_iteration selects the solver; setting it to .false. restores the previous behaviour exactly.
New features:
Improved iteration: the linearized BTE is now solved by default with restarted GMRES [Y. Saad and M. H. Schultz, SIAM J. Sci. Stat. Comput. 7, 856 (1986)] on the fixed point of the Omini-Sparavigna update, instead of the Omini-Sparavigna iteration itself [M. Omini and A. Sparavigna, Physica B 212, 101 (1995)]. The new flag improved_iteration (in &flags, default .true.) selects it; .false. restores the Omini-Sparavigna iteration, which gives the same results as version 2.0.0.
The Omini-Sparavigna iteration converges only if every eigenvalue of the linear part of its update has a modulus below 1. In graphene, dominated by normal processes, there is an eigenvalue below -1 (about -1.9), and the iteration diverges for every grid and value of scalebroad. The same happens, more slowly, in ordinary crystals: for InAs on an 8x8x8 grid it diverges with eps=1e-10, and with the default eps it only stops because the change of the conductivity falls below eps before the divergence shows.
GMRES needs no condition on the eigenvalues. Each of its steps costs one Omini-Sparavigna iteration, and it usually needs fewer of them: 6 instead of 8 or 9 for the test cases, and 31 steps for graphene on a 64x64x1 grid, where the Omini-Sparavigna iteration diverges.
It applies to the bulk and to nanowires. The convergence criterion is unchanged (the relative change of the conductivity between steps, below eps), and maxiter counts its steps.
Every MPI process holds the whole solution and performs the same arithmetic, so no communication is added, and the results do not depend on the number of MPI processes.
Testing:
Unit tests of the solver, on a non-normal affine map whose fixed-point iteration diverges: GMRES reaches the exact solution, with restarts, and its step limit behaves as documented.
Test-graphene: graphene on a 64x64x1 grid, a case where the Omini-Sparavigna iteration diverges and the improved iteration converges, with the force constants of the case.
References: those of Test-VASP, Test-QE and Test-flags were regenerated only for the outputs that depend on the iterative solution; the converged conductivities agree with the previous ones within 6e-5, as expected from the convergence criterion.
Documentation:
README: the flag improved_iteration, the meaning of eps and maxiter for both solvers, and the new test case.
Compatibility:
Inputs: the flag improved_iteration is new and optional; everything else in CONTROL is unchanged.
Outputs: the names and formats of all output files are unchanged. The iterative solution now prints which solver is used, and BTE.kappa_tensor and BTE.kappa_scalar record the conductivity after each GMRES step.
Results: converged conductivities differ from those of version 2.0.0 only within the convergence criterion, except where the Omini-Sparavigna iteration diverged; with improved_iteration=.false. they are identical.