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

PCMSolver

class PCMSolver

Abstract Base Class for solvers inheritance hierarchy.

We use the Non-Virtual Interface idiom.

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

Subclassed by CPCMSolver, IEFSolver

Public Functions

void buildSystemMatrix(const Cavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o, const BoundaryIntegralOperator &op)

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
  • op: 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 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, const BoundaryIntegralOperator &op) = 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
  • op: 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 points
  • irrep: the irreducible representation of the MEP and ASC

Protected Attributes

bool built_

Whether the system matrix has been built

bool isotropic_

Whether the solver is isotropic

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.

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, const BoundaryIntegralOperator &op)

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
  • op: integrator strategy for the single and double layer operators

void buildIsotropicMatrix(const Cavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o, const BoundaryIntegralOperator &op)

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
  • op: integrator strategy for the single and double layer operators

Private Functions

void buildSystemMatrix_impl(const Cavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o, const BoundaryIntegralOperator &op)

PCMSolver, an API for the Polarizable Continuum Model Copyright (C) 2016 Roberto Di Remigio, Luca Frediani and collaborators.

This file is part of PCMSolver.

PCMSolver is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

PCMSolver is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with PCMSolver. If not, see http://www.gnu.org/licenses/.

For information on the complete list of contributors to the PCMSolver API, see: http://pcmsolver.readthedocs.io/

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 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!

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

void buildSystemMatrix_impl(const Cavity &cavity, const IGreensFunction &gf_i, const IGreensFunction &gf_o, const BoundaryIntegralOperator &op)

Calculation of the PCM matrix.

PCMSolver, an API for the Polarizable Continuum Model Copyright (C) 2016 Roberto Di Remigio, Luca Frediani and collaborators.

Parameters
  • cavity: the cavity to be used
  • gf_i: Green’s function inside the cavity
  • gf_o: Green’s function outside the cavity
  • op: integrator strategy for the single layer operator

This file is part of PCMSolver.

PCMSolver is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

PCMSolver is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with PCMSolver. If not, see http://www.gnu.org/licenses/.

For information on the complete list of contributors to the PCMSolver API, see: http://pcmsolver.readthedocs.io/

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

double correction_

Correction for the conductor results

Eigen::MatrixXd S_

S matrix, not symmetry blocked

std::vector<Eigen::MatrixXd> blockS_

S matrix, symmetry blocked form