Solvers¶
We will here describe the inheritance hierarchy for generating solvers, in order to use and extend it properly. The runtime creation of solver objects relies on the Factory Method pattern [GHJV94][Ale01], implemented through the generic Factory class.
ISolver¶

class
ISolver
¶ Abstract Base Class for solvers inheritance hierarchy.
We use the NonVirtual Interface idiom.
 Author
 Luca Frediani, Roberto Di Remigio
 Date
 2011, 2015, 2016
IEFSolver¶

class
IEFSolver
¶ IEFPCM, collocationbased solver.
 Author
 Luca Frediani, Roberto Di Remigio
 Date
 2011, 2015, 2016
 Note
 We store the nonHermitian, symmetryblocked T(epsilon) and Rinfinity matrices. The ASC is obtained by multiplying the MEP by Rinfinity and then using a partially pivoted LU decomposition of T(epsilon) on the resulting vector. In case the polarization weights are requested, we use the approach suggested in [2]. First, the adjoint problem is solved: \[ \mathbf{T}_\varepsilon^\dagger \tilde{v} = v \]Also in this case a partially pivoted LU decomposition is used. The “transposed” ASC is obtained by the matrixvector multiplication:\[ q^* = \mathbf{R}_\infty^\dagger \tilde{v} \]Eventually, the two sets of charges are summed and divided by 2 This avoids computing and storing the inverse explicitly, at the expense of storing both T(epsilon) and Rinfinity.
CPCMSolver¶

class
CPCMSolver
¶ Solver for conductorlike approximation: CPCM (COSMO)
 Author
 Roberto Di Remigio
 Date
 2013, 2016
 Note
 We store the scaled, Hermitian, symmetrized S matrix and use a robust Cholesky decomposition to solve for the ASC. This avoids computing and storing the inverse explicitly. The S matrix is already scaled by the dielectric factor entering the definition of the conductor model!