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.
PCMSolver¶

class
PCMSolver
¶ Abstract Base Class for solvers inheritance hierarchy.
We use the NonVirtual Interface idiom.
 Author
 Luca Frediani, Roberto Di Remigio
 Date
 2011, 2015
Subclassed by CPCMSolver, IEFSolver
Public Functions

void
buildSystemMatrix
(const Cavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o)¶ Calculation of the PCM matrix.
 Parameters
cavity
the cavity to be used
gf_i
Green’s function inside the cavity
gf_o
Green’s function outside the cavity

Eigen::VectorXd
computeCharge
(const Eigen::VectorXd &potential, int irrep = 0) const¶ Returns the ASC given the MEP and the desired irreducible representation.
 Parameters
potential
the vector containing the MEP at cavity points
irrep
the irreducible representation of the MEP and ASC
Protected Functions

virtual void
buildSystemMatrix_impl
(const Cavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o) = 0¶ Calculation of the PCM matrix.
 Parameters
cavity
the cavity to be used
gf_i
Green’s function inside the cavity
gf_o
Green’s function outside the cavity

virtual Eigen::VectorXd
computeCharge_impl
(const Eigen::VectorXd &potential, int irrep = 0) const = 0¶ Returns the ASC given the MEP and the desired irreducible representation.
 Parameters
potential
the vector containing the MEP at cavity points
irrep
the irreducible representation of the MEP and ASC
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.
Inherits from PCMSolver
Public Functions

IEFSolver
(bool symm)¶ Construct solver.
 Parameters
symm
whether the system matrix has to be symmetrized

void
buildAnisotropicMatrix
(const Cavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o)¶ Builds PCM matrix for an anisotropic environment.
 Parameters
cavity
the cavity to be used.
gf_i
Green’s function inside the cavity
gf_o
Green’s function outside the cavity

void
buildIsotropicMatrix
(const Cavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o)¶ Builds PCM matrix for an isotropic environment.
 Parameters
cavity
the cavity to be used.
gf_i
Green’s function inside the cavity
gf_o
Green’s function outside the cavity
Private Functions

virtual void
buildSystemMatrix_impl
(const Cavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o)¶ Calculation of the PCM matrix.
 Parameters
cavity
the cavity to be used
gf_i
Green’s function inside the cavity
gf_o
Green’s function outside the cavity

virtual Eigen::VectorXd
computeCharge_impl
(const Eigen::VectorXd &potential, int irrep = 0) const¶ Returns the ASC given the MEP and the desired irreducible representation.
 Parameters
potential
the vector containing the MEP at cavity points
irrep
the irreducible representation of the MEP and ASC
Private Members

bool
hermitivitize_
¶ Whether the system matrix has to be symmetrized

Eigen::MatrixXd
Tepsilon_
¶ T(epsilon) matrix, not symmetry blocked

std::vector<Eigen::MatrixXd>
blockTepsilon_
¶ T(epsilon) matrix, symmetry blocked form

Eigen::MatrixXd
Rinfinity_
¶ R_infinity matrix, not symmetry blocked

std::vector<Eigen::MatrixXd>
blockRinfinity_
¶ R_infinity matrix, symmetry blocked form
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!
Inherits from PCMSolver
Public Functions

CPCMSolver
(bool symm, double corr)¶ Construct solver.
 Parameters
symm
whether the system matrix has to be symmetrized
corr
factor to correct the conductor results
Private Functions

virtual void
buildSystemMatrix_impl
(const Cavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o)¶ Calculation of the PCM matrix.
 Parameters
cavity
the cavity to be used
gf_i
Green’s function inside the cavity
gf_o
Green’s function outside the cavity

virtual Eigen::VectorXd
computeCharge_impl
(const Eigen::VectorXd &potential, int irrep = 0) const¶ Returns the ASC given the MEP and the desired irreducible representation.
 Parameters
potential
the vector containing the MEP at cavity points
irrep
the irreducible representation of the MEP and ASC