File ThirdOrderFock.h

Copyright

This code is licensed under the 3-clause BSD license.

Copyright ETH Zurich, Laboratory for Physical Chemistry, Reiher Group.

See LICENSE.txt for details.

namespace Scine
namespace Sparrow
namespace dftb
class ThirdOrderFock : public Scine::Sparrow::dftb::ScfFock
#include <ThirdOrderFock.h>

Implementation of FockMatrixCalculator for DFTB3.

It calculates the electronic contributions to the energy and their derivatives with respect to the nuclear cartesian coordinates.

Public Functions

ThirdOrderFock(ZeroOrderMatricesCalculator &matricesCalculator, const Utils::ElementTypeCollection &elements, const Utils::PositionCollection &positions, const DFTBCommon::AtomicParameterContainer &atomicPar, const DFTBCommon::DiatomicParameterContainer &diatomicPar, const Utils::DensityMatrix &densityMatrix, const Eigen::MatrixXd &energyWeightedDensityMatrix, std::vector<double> &atomicCharges, const std::vector<double> &coreCharges, const Utils::AtomsOrbitalsIndexes &aoIndexes, const Eigen::MatrixXd &overlapMatrix, const bool &unrestrictedCalculationRunning)

Constructor, calls the ScfFock constructor and sets zeta to 4.0.

void initialize()

Calls ScfFock::initialize() and initializes the gamma, Gamma and the matrices containing the derivatives.

double calculateElectronicEnergy() const

Sums up the electronic energy contributions of the zeroth, first and second order Hamiltonian corrections.

void addDerivatives(Utils::AutomaticDifferentiation::DerivativeContainerType<Utils::derivativeType::first> &derivatives) const

calculates automatically the derivatives of the energy with respect to the nuclear cartesian coordinates.

void addDerivatives(Utils::AutomaticDifferentiation::DerivativeContainerType<Utils::derivativeType::second_atomic> &derivatives) const
void addDerivatives(Utils::AutomaticDifferentiation::DerivativeContainerType<Utils::derivativeType::second_full> &derivatives) const

Private Functions

void completeH()
void constructG(Utils::derivOrder order)
template<Utils::derivOrder O>
void constructG()
template<Utils::derivOrder O>
void gammah(int a, int b, Utils::AutomaticDifferentiation::Value1DType<O> &gamma, Utils::AutomaticDifferentiation::Value1DType<O> &Gab, Utils::AutomaticDifferentiation::Value1DType<O> &Gba) const
template<Utils::derivOrder O>
void hFactor(double Ua, double Ub, const Utils::AutomaticDifferentiation::Value1DType<O> &R, Utils::AutomaticDifferentiation::Value1DType<O> &h, Utils::AutomaticDifferentiation::Value1DType<O> &dhdU) const
template<Utils::derivativeType O>
void addThirdOrderDerivatives(Utils::AutomaticDifferentiation::DerivativeContainerType<O> &derivatives) const

Private Members

Eigen::MatrixXd g
Eigen::MatrixXd G
Utils::MatrixWithDerivatives dG
Utils::MatrixWithDerivatives dg
const double zeta