Skip to content

Commit ea1ac76

Browse files
committed
Fix ghost atom handling
1 parent 20ea7b3 commit ea1ac76

11 files changed

+277
-199
lines changed

include/dftd_ncoord.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -200,4 +200,4 @@ extern inline double log_cn_cut(const double cn_max, const double cn);
200200

201201
extern inline double dlog_cn_cut(const double cn_max, const double cn);
202202

203-
}; // namespace dftd4
203+
} // namespace dftd4

include/dftd_parameters.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ static const double zeff[119]{
6363
* These values are actually never used in the code. Only r4r2 is used.
6464
*/
6565
static const double r2r4[119]{
66-
0.0, // dummy
67-
8.0589, 3.4698, // H,He
66+
0.0, // dummy
67+
8.0589, 3.4698, // H,He
6868
29.0974, 14.8517, 11.8799, 7.8715, 5.5588, 4.7566, 3.8025,
69-
3.1036, // Li-Ne
69+
3.1036, // Li-Ne
7070
26.1552, 17.2304, 17.7210, 12.7442, 9.5361, 8.1652, 6.7463,
7171
5.6004, // Na-Ar
7272
29.2012, 22.3934, // K,Ca

src/damping/dftd_atm.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -301,15 +301,15 @@ int get_atm_dispersion_derivs(
301301
dgyjk = c9ijk * (-dang * fdmp + ang * dfdmp) / r2jk * yjk;
302302
dgzjk = c9ijk * (-dang * fdmp + ang * dfdmp) / r2jk * zjk;
303303

304-
gradient(3 * iat + 0) += -dgxij - dgxik;
305-
gradient(3 * iat + 1) += -dgyij - dgyik;
306-
gradient(3 * iat + 2) += -dgzij - dgzik;
307-
gradient(3 * jat + 0) += dgxij - dgxjk;
308-
gradient(3 * jat + 1) += dgyij - dgyjk;
309-
gradient(3 * jat + 2) += dgzij - dgzjk;
310-
gradient(3 * kat + 0) += dgxik + dgxjk;
311-
gradient(3 * kat + 1) += dgyik + dgyjk;
312-
gradient(3 * kat + 2) += dgzik + dgzjk;
304+
gradient(3 * ii + 0) += -dgxij - dgxik;
305+
gradient(3 * ii + 1) += -dgyij - dgyik;
306+
gradient(3 * ii + 2) += -dgzij - dgzik;
307+
gradient(3 * jj + 0) += dgxij - dgxjk;
308+
gradient(3 * jj + 1) += dgyij - dgyjk;
309+
gradient(3 * jj + 2) += dgzij - dgzjk;
310+
gradient(3 * kk + 0) += dgxik + dgxjk;
311+
gradient(3 * kk + 1) += dgyik + dgyjk;
312+
gradient(3 * kk + 2) += dgzik + dgzjk;
313313

314314
dEdcn(ii) -= e * 0.5 * (dc6dcn(ii, jj) / c6ij + dc6dcn(ii, kk) / c6ik);
315315
dEdcn(jj) -= e * 0.5 * (dc6dcn(jj, ii) / c6ij + dc6dcn(jj, kk) / c6jk);

src/damping/dftd_rational.cpp

+11-12
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,15 @@
1818

1919
#include <cmath>
2020

21+
#include "damping/dftd_atm.h"
22+
#include "damping/dftd_rational.h"
2123
#include "dftd_cblas.h"
2224
#include "dftd_dispersion.h"
2325
#include "dftd_eeq.h"
2426
#include "dftd_geometry.h"
2527
#include "dftd_matrix.h"
2628
#include "dftd_ncoord.h"
2729
#include "dftd_parameters.h"
28-
#include "damping/dftd_atm.h"
29-
#include "damping/dftd_rational.h"
30-
3130

3231
namespace dftd4 {
3332

@@ -119,8 +118,8 @@ int get_dispersion2_energy(
119118
}
120119

121120
e = -c6ij * edisp * 0.5;
122-
energy(iat) += e;
123-
energy(jat) += e;
121+
energy(ii) += e;
122+
energy(jj) += e;
124123
}
125124
}
126125

@@ -164,7 +163,7 @@ int get_dispersion2_derivs(
164163

165164
r4r2ij = 3.0 * r4r2[izp] * r4r2[jzp];
166165
r0ij = par.a1 * sqrt(r4r2ij) + par.a2;
167-
c6ij = c6(iat, jat);
166+
c6ij = c6(ii, jj);
168167

169168
t6 = fdmpr_bj(6, r, r0ij);
170169
t8 = fdmpr_bj(8, r, r0ij);
@@ -199,12 +198,12 @@ int get_dispersion2_derivs(
199198
dEdq(ii) -= dc6dq(ii, jj) * edisp;
200199
dEdq(jj) -= dc6dq(jj, ii) * edisp;
201200

202-
gradient(3 * iat) += dgx;
203-
gradient(3 * iat + 1) += dgy;
204-
gradient(3 * iat + 2) += dgz;
205-
gradient(3 * jat) -= dgx;
206-
gradient(3 * jat + 1) -= dgy;
207-
gradient(3 * jat + 2) -= dgz;
201+
gradient(3 * ii) += dgx;
202+
gradient(3 * ii + 1) += dgy;
203+
gradient(3 * ii + 2) += dgz;
204+
gradient(3 * jj) -= dgx;
205+
gradient(3 * jj + 1) -= dgy;
206+
gradient(3 * jj + 2) -= dgz;
208207
}
209208
}
210209
return EXIT_SUCCESS;

src/dftd_dispersion.cpp

+12-7
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ int get_dispersion(
6565
cn.NewVector(nat);
6666
q.NewVector(nat);
6767
if (lgrad) {
68-
dcndr.NewMatrix(3 * mol.NAtoms, nat);
69-
dqdr.NewMatrix(3 * mol.NAtoms, nat);
70-
gradient.NewVector(3 * mol.NAtoms);
68+
dcndr.NewMatrix(3 * nat, nat);
69+
dqdr.NewMatrix(3 * nat, nat);
70+
gradient.NewVector(3 * nat);
7171
}
7272

7373
// calculate partial charges from EEQ model
@@ -138,8 +138,7 @@ int get_dispersion(
138138
);
139139
if (info != EXIT_SUCCESS) return info;
140140

141-
if (lgrad) { BLAS_Add_Mat_x_Vec(gradient, dqdr, dEdq, false, 1.0); }
142-
141+
if (lgrad) BLAS_Add_Mat_x_Vec(gradient, dqdr, dEdq, false, 1.0);
143142
dqdr.DelMat();
144143

145144
// ----------------------------
@@ -224,9 +223,15 @@ int get_dispersion(
224223

225224
// write to input gradient
226225
if (lgrad) {
227-
for (int i = 0; i != 3 * mol.NAtoms; i++) {
228-
GRAD[i] = gradient(i);
226+
for (int i = 0, ii = 0; i != mol.NAtoms; i++) {
227+
ii = realIdx(i);
228+
if (ii < 0) continue;
229+
230+
GRAD[3 * i] = gradient(3 * ii);
231+
GRAD[3 * i + 1] = gradient(3 * ii + 1);
232+
GRAD[3 * i + 2] = gradient(3 * ii + 2);
229233
}
234+
230235
gradient.DelVec();
231236
}
232237

0 commit comments

Comments
 (0)