45 const Eigen::MatrixXd& density);
54 const Eigen::MatrixXd& occ_mo_coeffs);
67 Eigen::MatrixXd deriv = Eigen::MatrixXd::Zero(natoms, 3);
79 for (
Index a = 0; a < natoms; ++a) {
80 double Za =
static_cast<double>(mol[a].getNuccharge());
81 const Eigen::Vector3d& Ra = mol[a].
getPos();
82 Eigen::Vector3d sum = Eigen::Vector3d::Zero();
83 for (
Index b = 0; b < natoms; ++b) {
87 double Zb =
static_cast<double>(mol[b].getNuccharge());
88 const Eigen::Vector3d& Rb = mol[b].
getPos();
89 Eigen::Vector3d Rab_vec = Ra - Rb;
90 double Rab = Rab_vec.norm();
91 sum += Za * Zb * Rab_vec / (Rab * Rab * Rab);
93 deriv.row(a) = -sum.transpose();
105 std::vector<Eigen::MatrixXd> tensor =
107 Eigen::VectorXd d(n_aux_bf);
108 for (
Index p = 0; p < n_aux_bf; ++p) {
109 d(p) = (density.array() * tensor[p].array()).sum();
119 aocoulomb.
Fill(auxbasis);
120 const Eigen::MatrixXd&
V = aocoulomb.
Matrix();
123 Eigen::VectorXd c = V_chol.
ok() ? Eigen::VectorXd(V_chol.
Solve(d))
124 : Eigen::VectorXd(
V.ldlt().solve(d));
138 std::vector<Eigen::MatrixXd> ddP_dR =
140 std::vector<AOMatrixDerivative> dV =
150 Eigen::MatrixXd grad = Eigen::MatrixXd::Zero(natoms, 3);
151 for (
Index a = 0; a < natoms; ++a) {
152 for (
Index xyz = 0; xyz < 3; ++xyz) {
153 double term1 = ddP_dR[a].row(xyz).dot(c);
154 double term2 = 0.5 * c.dot(dV[a][xyz] * c);
155 grad(a, xyz) = term1 - term2;
166 Index nocc = occ_mo_coeffs.cols();
168 std::vector<Eigen::MatrixXd> tensor =
172 aocoulomb.
Fill(auxbasis);
173 const Eigen::MatrixXd&
V = aocoulomb.
Matrix();
176 Eigen::LDLT<Eigen::MatrixXd> V_ldlt;
181 std::vector<AOMatrixDerivative> dV =
192 std::vector<ThreeCenterDerivative> d3c_mo =
196 Eigen::MatrixXd grad = Eigen::MatrixXd::Zero(natoms, 3);
217 std::vector<Eigen::MatrixXd> tensor_half(n_aux_bf);
218 for (
Index p = 0; p < n_aux_bf; ++p) {
219 tensor_half[p] = tensor[p] * occ_mo_coeffs;
221 std::vector<std::vector<Eigen::VectorXd>> c_ij(
222 nocc, std::vector<Eigen::VectorXd>(nocc));
223 for (
Index i = 0; i < nocc; ++i) {
224 for (
Index j = 0; j < nocc; ++j) {
225 Eigen::VectorXd d(n_aux_bf);
226 for (
Index p = 0; p < n_aux_bf; ++p) {
227 d(p) = occ_mo_coeffs.col(i).dot(tensor_half[p].col(j));
229 c_ij[i][j] = V_chol.
ok() ? Eigen::VectorXd(V_chol.
Solve(d))
230 : Eigen::VectorXd(V_ldlt.solve(d));
258#pragma omp parallel for
259 for (
Index a = 0; a < natoms; ++a) {
260 for (
Index xyz = 0; xyz < 3; ++xyz) {
261 double energy_term = 0.0;
262 double metric_term = 0.0;
263 for (
Index i = 0; i < nocc; ++i) {
264 for (
Index j = 0; j < nocc; ++j) {
265 const Eigen::VectorXd& c = c_ij[i][j];
272 Eigen::VectorXd dd(n_aux_bf);
273 for (
Index p = 0; p < n_aux_bf; ++p) {
274 dd(p) = d3c_mo[a][xyz][p](i, j);
276 energy_term += c.dot(dd);
277 metric_term += c.dot(dV[a][xyz] * c);
283 grad(a, xyz) = -2.0 * (energy_term - 0.5 * metric_term);
Container to hold Basisfunctions for all atoms.
Index AOBasisSize() const
const std::vector< Index > & getFuncPerAtom() const
void Fill(const AOBasis &aobasis) final
const Eigen::MatrixXd & Matrix() const
const Eigen::Vector3d & getPos() const
Eigen::MatrixXd Solve(const Eigen::MatrixXd &B) const
A^-1 B.
static Eigen::MatrixXd RIKGradient(const Eigen::MatrixXd &occ_mo_coeffs, const AOBasis &auxbasis, const AOBasis &dftbasis)
static Eigen::MatrixXd NuclearRepulsionDerivative(const QMMolecule &mol)
static Eigen::MatrixXd RIJGradient(const Eigen::MatrixXd &density, const AOBasis &auxbasis, const AOBasis &dftbasis)
Charge transport classes.
std::vector< AOMatrixDerivative > ComputeCoulombMetricDerivatives(const AOBasis &aobasis)
std::vector< ThreeCenterDerivative > ComputeThreeCenterDerivatives(const AOBasis &auxbasis, const AOBasis &dftbasis)
std::vector< ThreeCenterDerivative > ComputeThreeCenterDerivativesMOTransformed(const AOBasis &auxbasis, const AOBasis &dftbasis, const Eigen::MatrixXd &occ_mo_coeffs)
std::vector< Eigen::MatrixXd > ComputeThreeCenterIntegrals(const AOBasis &auxbasis, const AOBasis &dftbasis)
std::vector< Eigen::MatrixXd > ComputeThreeCenterDerivativeContraction(const AOBasis &auxbasis, const AOBasis &dftbasis, const Eigen::MatrixXd &density)
std::array< std::vector< Eigen::MatrixXd >, 3 > ThreeCenterDerivative
std::array< Eigen::MatrixXd, 3 > AOMatrixDerivative
ThreeCenterDerivative ComputeThreeCenterDerivativesForAtom(const AOBasis &auxbasis, const AOBasis &dftbasis, Index target_atom)
Provides a means for comparing floating point numbers.