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.

../_images/solver.png

ISolver

class ISolver

Abstract Base Class for solvers inheritance hierarchy.

We use the Non-Virtual Interface idiom.

Author
Luca Frediani, Roberto Di Remigio
Date
2011, 2015, 2016

IEFSolver

class IEFSolver

IEFPCM, collocation-based solver.

Author
Luca Frediani, Roberto Di Remigio
Date
2011, 2015, 2016
Note
We store the non-Hermitian, symmetry-blocked 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 [1]. 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 matrix-vector 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 conductor-like approximation: C-PCM (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!