From 39c8e20c275c69a598da28268a5846cfec7e4bf4 Mon Sep 17 00:00:00 2001 From: Hagen Neugebauer Date: Tue, 21 Jan 2025 09:09:48 +0100 Subject: [PATCH 1/3] Overload get_dispersion for atom-wise energies -added a typedef for TRVector --- include/dftd_dispersion.h | 28 ++++++++++++++++++++++++++++ include/dftd_matrix.h | 1 + src/dftd_dispersion.cpp | 37 ++++++++++++++++++++++++++++++------- 3 files changed, 59 insertions(+), 7 deletions(-) diff --git a/include/dftd_dispersion.h b/include/dftd_dispersion.h index f655d4e..af71f06 100644 --- a/include/dftd_dispersion.h +++ b/include/dftd_dispersion.h @@ -71,6 +71,34 @@ extern int get_dispersion( double *GRAD ); +/** + * @brief Wrapper to handle the evaluation of dispersion energy and derivatives. + * + * This function calculates the atom-wise dispersion energy and gradients + * for the given molecular geometry, considering only the atoms specified + * in `realIdx`. + * + * @param mol Molecular geometry. + * @param realIdx List for real atoms excluding ghost/non atoms. + * @param charge Molecular charge. + * @param par DFT-D4 parameters. + * @param d4 Base D4 dispersion model. + * @param cutoff Real-space cutoffs for CN and dispersion. + * @param energies atom-wise dispersion energies (inout). + * @param GRAD Dispersion gradient (inout). + * @return Exit status. + */ +extern int get_dispersion( + const TMolecule &mol, + const TIVector &realIdx, + int charge, + const TD4Model &d4, + const dparam &par, + TCutoff cutoff, + TRVector &energies, + double *GRAD +); + /** * @brief Wrapper to handle the evaluation of dispersion energy and derivatives. * diff --git a/include/dftd_matrix.h b/include/dftd_matrix.h index 57a368d..401a6e5 100644 --- a/include/dftd_matrix.h +++ b/include/dftd_matrix.h @@ -231,5 +231,6 @@ template class TMatrix { }; typedef TVector TIVector; +typedef TVector TRVector; } // namespace dftd4 diff --git a/src/dftd_dispersion.cpp b/src/dftd_dispersion.cpp index 5dff7f4..723e119 100644 --- a/src/dftd_dispersion.cpp +++ b/src/dftd_dispersion.cpp @@ -59,6 +59,36 @@ int get_dispersion( double &energy, double *GRAD ) { + + int info{0}; + + int nat = realIdx.Max() + 1; + + TRVector energies; // atom-wise energies + info = get_dispersion(mol, realIdx, charge, d4, par, cutoff, energies, GRAD); + + if (info != EXIT_SUCCESS) return info; + + // sum up atom-wise energies + for (int i = 0; i != nat; i++) { + energy += energies(i); + } + + energies.DelVec(); + + return EXIT_SUCCESS; +} + +int get_dispersion( + const TMolecule &mol, + const TIVector &realIdx, + const int charge, + const TD4Model &d4, + const dparam &par, + const TCutoff cutoff, + TRVector &energies, + double *GRAD +) { // setup variables int info{0}; bool lmbd = (par.s9 != 0.0); @@ -137,7 +167,6 @@ int get_dispersion( TVector dEdcn; TVector dEdq; - TVector energies; energies.NewVector(nat); if (lgrad) { dEdcn.NewVector(nat); @@ -242,12 +271,6 @@ int get_dispersion( dEdcn.DelVec(); dEdq.DelVec(); - // sum up atom-wise energies - for (int i = 0; i != nat; i++) { - energy += energies(i); - } - energies.DelVec(); - // write to input gradient if (lgrad) { for (int i = 0, ii = 0; i != mol.NAtoms; i++) { From 516b08e5ffa26dd99f4b0b4537e3dc4cb07e5ab1 Mon Sep 17 00:00:00 2001 From: Hagen Neugebauer Date: Tue, 21 Jan 2025 09:52:07 +0100 Subject: [PATCH 2/3] moved energies initialization + format changes --- include/dftd_dispersion.h | 4 ++-- src/dftd_dispersion.cpp | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/include/dftd_dispersion.h b/include/dftd_dispersion.h index af71f06..a236295 100644 --- a/include/dftd_dispersion.h +++ b/include/dftd_dispersion.h @@ -74,8 +74,8 @@ extern int get_dispersion( /** * @brief Wrapper to handle the evaluation of dispersion energy and derivatives. * - * This function calculates the atom-wise dispersion energy and gradients - * for the given molecular geometry, considering only the atoms specified + * This function calculates the atom-wise dispersion energy and gradients + * for the given molecular geometry, considering only the atoms specified * in `realIdx`. * * @param mol Molecular geometry. diff --git a/src/dftd_dispersion.cpp b/src/dftd_dispersion.cpp index 723e119..d4d09f7 100644 --- a/src/dftd_dispersion.cpp +++ b/src/dftd_dispersion.cpp @@ -64,16 +64,18 @@ int get_dispersion( int nat = realIdx.Max() + 1; - TRVector energies; // atom-wise energies + TRVector energies; // atom-wise energies + energies.NewVector(nat); + info = get_dispersion(mol, realIdx, charge, d4, par, cutoff, energies, GRAD); - + if (info != EXIT_SUCCESS) return info; // sum up atom-wise energies for (int i = 0; i != nat; i++) { energy += energies(i); } - + energies.DelVec(); return EXIT_SUCCESS; @@ -167,7 +169,6 @@ int get_dispersion( TVector dEdcn; TVector dEdq; - energies.NewVector(nat); if (lgrad) { dEdcn.NewVector(nat); dEdq.NewVector(nat); From c5bc04d12f57b1a8cae6837f84085a3b5ecb1705 Mon Sep 17 00:00:00 2001 From: Hagen Neugebauer Date: Tue, 21 Jan 2025 09:55:57 +0100 Subject: [PATCH 3/3] remove empty line --- src/dftd_dispersion.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dftd_dispersion.cpp b/src/dftd_dispersion.cpp index d4d09f7..4454891 100644 --- a/src/dftd_dispersion.cpp +++ b/src/dftd_dispersion.cpp @@ -68,7 +68,6 @@ int get_dispersion( energies.NewVector(nat); info = get_dispersion(mol, realIdx, charge, d4, par, cutoff, energies, GRAD); - if (info != EXIT_SUCCESS) return info; // sum up atom-wise energies