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
Subclassed by pcm::solver::CPCMSolver, pcm::solver::IEFSolver
Public Functions

void
buildSystemMatrix
(const ICavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o, const IBoundaryIntegralOperator &op)¶ Calculation of the PCM matrix.
 Parameters
cavity
: the cavity to be usedgf_i
: Green’s function inside the cavitygf_o
: Green’s function outside the cavityop
: integrator strategy for the single and double layer operators

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 pointsirrep
: the irreducible representation of the MEP and ASC
Protected Functions

virtual void
buildSystemMatrix_impl
(const ICavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o, const IBoundaryIntegralOperator &op) = 0¶ Calculation of the PCM matrix.
 Parameters
cavity
: the cavity to be usedgf_i
: Green’s function inside the cavitygf_o
: Green’s function outside the cavityop
: integrator strategy for the single and double layer operators

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 pointsirrep
: the irreducible representation of the MEP and ASC
IEFSolver¶

class
IEFSolver
: public pcm::ISolver¶ 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.
Public Functions

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

void
buildAnisotropicMatrix
(const ICavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o, const IBoundaryIntegralOperator &op)¶ Builds PCM matrix for an anisotropic environment.
 Parameters
cavity
: the cavity to be used.gf_i
: Green’s function inside the cavitygf_o
: Green’s function outside the cavityop
: integrator strategy for the single and double layer operators

void
buildIsotropicMatrix
(const ICavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o, const IBoundaryIntegralOperator &op)¶ Builds PCM matrix for an isotropic environment.
 Parameters
cavity
: the cavity to be used.gf_i
: Green’s function inside the cavitygf_o
: Green’s function outside the cavityop
: integrator strategy for the single and double layer operators
Private Functions

void
buildSystemMatrix_impl
(const ICavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o, const IBoundaryIntegralOperator &op)¶ Calculation of the PCM matrix.
 Parameters
cavity
: the cavity to be usedgf_i
: Green’s function inside the cavitygf_o
: Green’s function outside the cavityop
: integrator strategy for the single and double layer operators

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 pointsirrep
: 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
: public pcm::ISolver¶ 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!
Public Functions

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

void
buildSystemMatrix_impl
(const ICavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o, const IBoundaryIntegralOperator &op)¶ Calculation of the PCM matrix.
 Parameters
cavity
: the cavity to be usedgf_i
: Green’s function inside the cavitygf_o
: Green’s function outside the cavityop
: integrator strategy for the single layer operator

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 pointsirrep
: the irreducible representation of the MEP and ASC