Helper classes and functions

../_images/utils.svg

Sphere

struct pcm::utilsSphere

POD describing a sphere.

Author
Roberto Di Remigio
Date
2011, 2016

Public Functions

void pcm::utils::Spherescale(double scaling)

Scale sphere to other units.

Atom

struct pcm::utilsAtom

A POD describing an atom.

Author
Roberto Di Remigio
Date
2011, 2016

Public Members

double pcm::utils::Atomcharge

Atomic charge

double pcm::utils::Atommass

Atomic mass

double pcm::utils::Atomradius

Atomic radius

double pcm::utils::AtomradiusScaling

Scaling of the atomic radius

Eigen::Vector3d pcm::utils::Atomposition

Position of the atom

std::string pcm::utils::Atomelement

Name of the element

std::string pcm::utils::Atomsymbol

Atomic symbol

ChargeDistribution

struct pcm::utilsChargeDistribution

POD representing a classical charge distribution.

Author
Roberto Di Remigio
Date
2016

Public Members

Eigen::VectorXd pcm::utils::ChargeDistributionmonopoles

Monopoles

Eigen::Matrix3Xd pcm::utils::ChargeDistributionmonopolesSites

Monopoles sites

Eigen::Matrix3Xd pcm::utils::ChargeDistributiondipoles

Dipoles

Eigen::Matrix3Xd pcm::utils::ChargeDistributiondipolesSites

Dipoles sites

Molecule

class pcmMolecule

Class representing a molecule or general aggregate of atoms.

This class is based on the similar class available in the Mints library of Psi4

Author
Roberto Di Remigio
Date
2014

Unnamed Group

Molecule &pcm::Moleculeoperator=(const Molecule &other)

Operators Assignment operator.

Public Functions

pcm::MoleculeMolecule()

Default constructor Initialize a dummy molecule, e.g. as placeholder, see ICavity.cpp loadCavity method.

pcm::MoleculeMolecule(int nat, const Eigen::VectorXd &chg, const Eigen::VectorXd &masses, const Eigen::Matrix3Xd &geo, const std::vector<Atom> &at, const std::vector<Sphere> &sph)

Constructor from full molecular data.

This initializes the molecule in C1 symmetry

Parameters
  • nat: number of atoms
  • chg: vector of atomic charges
  • masses: vector of atomic masses
  • geo: molecular geometry (format nat*3)
  • at: vector of Atom objects
  • sph: vector of Sphere objects

pcm::MoleculeMolecule(int nat, const Eigen::VectorXd &chg, const Eigen::VectorXd &masses, const Eigen::Matrix3Xd &geo, const std::vector<Atom> &at, const std::vector<Sphere> &sph, int nr_gen, int gen[3])

Constructor from full molecular data, plus number of generators and generators.

This initializes the molecule in the symmetry prescribed by nr_gen and gen. See documentation of the Symmetry object for the conventions.

Parameters
  • nat: number of atoms
  • chg: vector of atomic charges
  • masses: vector of atomic masses
  • geo: molecular geometry (format nat*3)
  • at: vector of Atom objects
  • sph: vector of Sphere objects
  • nr_gen: number of molecular point group generators
  • gen: molecular point group generators

pcm::MoleculeMolecule(int nat, const Eigen::VectorXd &chg, const Eigen::VectorXd &masses, const Eigen::Matrix3Xd &geo, const std::vector<Atom> &at, const std::vector<Sphere> &sph, const Symmetry &pg)

Constructor from full molecular data and point group.

This initializes the molecule in the symmetry prescribed by pg.

Parameters
  • nat: number of atoms
  • chg: vector of atomic charges
  • masses: vector of atomic masses
  • geo: molecular geometry (format nat*3)
  • at: vector of Atom objects
  • sph: vector of Sphere objects
  • pg: the molecular point group (a Symmetry object)

pcm::MoleculeMolecule(const std::vector<Sphere> &sph)

Constructor from list of spheres.

Molecule is treated as an aggregate of spheres. We do not have information on the atomic species involved in the aggregate. Charges are set to 1.0; masses are set based on the radii; geometry is set from the list of spheres. All the atoms are dummy atoms. The point group is C1.

Warning
This constructor is to be used exclusively when initializing the Molecule in EXPLICIT mode, i.e. when the user specifies explicitly spheres centers and radii.
Parameters
  • sph: list of spheres

pcm::MoleculeMolecule(const Molecule &other)

Copy constructor.

void pcm::Moleculetranslate(const Eigen::Vector3d &translationVector)

Given a vector, carries out translation of the molecule.

Parameters
  • translationVector: The translation vector.

void pcm::MoleculemoveToCOM()

Performs translation to the Center of Mass Frame.

void pcm::Moleculerotate(const Eigen::Matrix3d &rotationMatrix)

Given a matrix, carries out rotation of the molecule.

Parameters
  • rotationMatrix: The matrix representing the rotation.

void pcm::MoleculemoveToPAF()

Performs rotation to the Principal Axes Frame.

Private Members

size_t pcm::MoleculenAtoms_

The number of atoms in the molecule.

Eigen::VectorXd pcm::Moleculecharges_

A vector of dimension (# atoms) containing the charges.

Eigen::VectorXd pcm::Moleculemasses_

A vector of dimension (# atoms) containing the masses.

Eigen::Matrix3Xd pcm::Moleculegeometry_

Molecular geometry, in cartesian coordinates. The dimensions are (# atoms * 3) Units are Bohr.

std::vector<Atom> pcm::Moleculeatoms_

A container for all the atoms composing the molecule.

std::vector<Sphere> pcm::Moleculespheres_

A container for the spheres composing the molecule.

rotorType pcm::Moleculerotor_

The molecular rotor type.

Symmetry pcm::MoleculepointGroup_

The molecular point group.

Solvent

struct pcm::utilsSolvent

POD describing a solvent.

A Solvent object contains all the solvent-related experimental data needed to set up the Green’s functions and the non-electrostatic terms calculations.

Author
Roberto Di Remigio
Date
2011, 2016

Public Members

std::string pcm::utils::Solventname

Solvent name

double pcm::utils::SolventepsStatic

Static permittivity, in AU

double pcm::utils::SolventepsDynamic

Optical permittivity, in AU

double pcm::utils::SolventprobeRadius

Radius of the spherical probe mimicking the solvent, in Angstrom

Symmetry

class Symmetry

Contains very basic info about symmetry (only Abelian groups)

Just a wrapper around a vector containing the generators of the group

Author
Roberto Di Remigio
Date
2014

Public Functions

SymmetrySymmetry()

Default constructor sets up C1 point group.

Private Members

int SymmetrynrGenerators_

Number of generators

int Symmetrygenerators_[3]

Generators

int SymmetrynrIrrep_

Number of irreps

Mathematical utilities

namespace pcm
namespace pcmutils

Functions

template <size_t nBits>
int pcm::utilsparity(std::bitset<nBits> bitrep)

Calculate the parity of the bitset as defined by: bitrep[0] XOR bitrep[1] XOR … XOR bitrep[nBits-1]

Parameters
  • bitrep: a bitset
Template Parameters
  • nBits: lenght of the input bitset

double pcm::utilsparity(unsigned int i)

Returns parity of input integer. The parity is defined as the result of using XOR on the bitrep of the given integer. For example: 2 -> 010 -> 0^1^0 = 1 -> -1.0 6 -> 110 -> 1^1^0 = 0 -> 1.0

Parameters
  • i: an integer, usually an index for an irrep or a symmetry operation

It can also be interpreted as the action of a given operation on the Cartesian axes: zyx Parity 0 000 E 1.0 1 001 Oyz -1.0 2 010 Oxz -1.0 3 011 C2z 1.0 4 100 Oxy -1.0 5 101 C2y 1.0 6 110 C2x 1.0 7 111 i -1.0

bool pcm::utilsisZero(double value, double threshold)

Returns true if value is less or equal to threshold

Parameters
  • value: the value to be checked
  • threshold: the threshold

bool pcm::utilsnumericalZero(double value)

Returns true if value is less than 1.0e-14

Parameters
  • value: the value to be checked

template <typename T>
int pcm::utilssign(T val)

This function implements the signum function and returns the sign of the passed value: -1, 0 or 1

Parameters
  • val: value whose sign should be determined
Template Parameters
  • T: of the parameter val

void pcm::utilssymmetryBlocking(Eigen::MatrixXd &matrix, PCMSolverIndex cavitySize, PCMSolverIndex ntsirr, int nr_irrep)
void pcm::utilssymmetryPacking(std::vector<Eigen::MatrixXd> &blockedMatrix, const Eigen::MatrixXd &fullMatrix, int dimBlock, int nrBlocks)

Parameters
  • blockedMatrix: the result of packing fullMatrix
  • fullMatrix: the matrix to be packed
  • dimBlock: the dimension of the square blocks
  • nrBlocks: the number of square blocks

template <typename Derived>
void pcm::utilshermitivitize(Eigen::MatrixBase<Derived> &obj_)

Given obj_ returns 0.5 * (obj_ + obj_^dagger)

Note
We check if a matrix or vector was given, since in the latter case we only want the complex conjugation operation to happen.
Parameters
  • obj_: the Eigen object to be hermitivitized
Template Parameters
  • Derived: the numeric type of obj_ elements

void pcm::utilseulerRotation(Eigen::Matrix3d &R_, const Eigen::Vector3d &eulerAngles_)

Build rotation matrix between two reference frames given the Euler angles.

We assume the convention \( R = Z_3 X_2 Z_1 \) for the ordering of the extrinsic elemental rotations (see http://en.wikipedia.org/wiki/Euler_angles) The Euler angles are given in the order \( \phi, \theta, \psi \). If we write \( c_i, s_i \,\, i = 1, 3 \) for their cosines and sines the rotation matrix will be:

\[\begin{split} R = \begin{pmatrix} c_1c_3 - s_1c_2s_3 & -s_1c_3 - c_1c_2s_3 & s_2s_3 \\ c_1s_3 + s_1c_2c_3 & -s_1s_3 + c_1c_2c_3 & -s_2c_3 \\ s_1s_2 & c_1s_2 & c_2 \end{pmatrix} \end{split}\]
Eigen’s geometry module is used to calculate the rotation matrix
Parameters
  • R_: the rotation matrix
  • eulerAngles_: the Euler angles, in degrees, describing the rotation

double pcm::utilslinearInterpolation(const double point, const std::vector<double> &grid, const std::vector<double> &function)

Return value of function defined on grid at an arbitrary point.

This function finds the nearest values for the given point and performs a linear interpolation.

Warning
This function assumes that grid has already been sorted!
Parameters
  • point: where the function has to be evaluated
  • grid: holds points on grid where function is known
  • function: holds known function values

double pcm::utilssplineInterpolation(const double point, const std::vector<double> &grid, const std::vector<double> &function)

Return value of function defined on grid at an arbitrary point.

This function finds the nearest values for the given point and performs a cubic spline interpolation.

Warning
This function assumes that grid has already been sorted!
Parameters
  • point: where the function has to be evaluated
  • grid: holds points on grid where function is known
  • function: holds known function values

template <typename Derived>
void pcm::utilsprint_eigen_matrix(const Eigen::MatrixBase<Derived> &matrix, const std::string &fname)

Prints Eigen object (matrix or vector) to file.

Note
This is for debugging only, the format is in fact rather ugly. Row index Column index Matrix entry 0 0 0.0000
Parameters
  • matrix: Eigen object
  • fname: name of the file
Template Parameters
  • Derived: template parameters of the MatrixBase object

namespace cnpy
namespace cnpycustom

Custom overloads for cnpy load and save functions

Functions

template <typename Scalar, int Rows, int Cols>
void cnpy::customnpy_save(const std::string &fname, const Eigen::Matrix<Scalar, Rows, Cols> &obj)

Save Eigen object to NumPy array file.

Parameters
  • fname: name of the NumPy array file
  • obj: Eigen object to be saved, either a matrix or a vector
Template Parameters
  • Scalar: the data type of the matrix to be returned. Default is double
  • Rows: number of rows in the Eigen object. Default is dynamic e
  • Cols: number of columns in the Eigen object. Default is dynamic

template <typename Scalar, int Rows, int Cols>
void cnpy::customnpz_save(const std::string &fname, const std::string &name, const Eigen::Matrix<Scalar, Rows, Cols> &obj, bool overwrite = false)

Save Eigen object to a compressed NumPy file.

Parameters
  • fname: name of the compressed NumPy file
  • name: tag for the given object in the compressed NumPy file
  • obj: Eigen object to be saved, either a matrix or a vector
  • overwrite: if file exists, overwrite. Appends by default.
Template Parameters
  • Scalar: the data type of the matrix to be returned. Default is double
  • Rows: number of rows in the Eigen object. Default is dynamic
  • Cols: number of columns in the Eigen object. Default is dynamic

template <typename Scalar>
Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> cnpy::customnpy_to_eigen(const NpyArray &npy_array)

Load NpyArray object into Eigen object.

Return
An Eigen object (matrix or vector) with the data
Warning
We check that the rank of the object read is not more than 2 Eigen cannot handle general tensors.
Parameters
  • npy_array: the NpyArray object
Template Parameters
  • Scalar: the data type of the matrix to be returned. Default is double

template <typename Scalar>
Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> cnpy::customnpy_load(const std::string &fname)

Load NumPy array file into Eigen object.

Return
An Eigen object (matrix or vector) with the data
Parameters
  • fname: name of the NumPy array file
Template Parameters
  • Scalar: the data type of the matrix to be returned. Default is double