Skip to content

Commit 2fcc64e

Browse files
authored
Fix: Numerical error in pyabacus. (#6414)
* Fix numerical error in pyabacus. * Add test for TwoCenterIntegrator for pyabacus. * Update numerica_radial.cpp.
1 parent 355eaf3 commit 2fcc64e

File tree

3 files changed

+35
-10
lines changed

3 files changed

+35
-10
lines changed

python/pyabacus/src/ModuleNAO/py_m_nao.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,9 @@ void bind_m_nao(py::module& m)
152152
double* cvR = static_cast<double*>(pvR_info.ptr);
153153
ModuleBase::Vector3<double> vR(cvR[0], cvR[1], cvR[2]);
154154
double out[1] = {0.0};
155-
double* grad_out = nullptr;
156-
if (cal_grad)
157-
{
158-
grad_out = new double[3];
159-
}
160-
self.calculate(itype1, l1, izeta1, m1, itype2, l2, izeta2, m2, vR, out, grad_out);
155+
double grad_out[3] = {0.0, 0.0, 0.0};
156+
double* grad_ptr = cal_grad ? grad_out : nullptr;
157+
self.calculate(itype1, l1, izeta1, m1, itype2, l2, izeta2, m2, vR, out, grad_ptr);
161158
py::array_t<double> out_array(1, out);
162159
if (cal_grad)
163160
{

python/pyabacus/tests/test_m_nao.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,36 @@ def test_rc():
7373
assert orb(0,1,1).l == 1
7474
assert orb(0,2,0).l == 2
7575

76+
def test_twocenterintegrator():
77+
orb_dir = '../../../tests/PP_ORB/'
78+
file_list = ["C_gga_8au_100Ry_2s2p1d.orb", "O_gga_10au_100Ry_2s2p1d.orb"]
79+
file_list = [orb_dir + orbfile for orbfile in file_list]
80+
81+
orb = nao.RadialCollection()
82+
orb.build(2, file_list, 'o')
83+
84+
alpha = nao.RadialCollection()
85+
alpha.build(1, [file_list[0]])
86+
87+
dr = 0.01 # R spacing
88+
rmax = max(orb.rcut_max, alpha.rcut_max)
89+
cutoff = 2.0 * rmax
90+
nr = int(rmax / dr) + 1
91+
92+
orb.set_uniform_grid(True, nr, cutoff, 'i', True)
93+
alpha.set_uniform_grid(True, nr, cutoff, 'i', True)
94+
95+
sbt = base.SphericalBesselTransformer()
96+
orb.set_transformer(sbt)
97+
alpha.set_transformer(sbt)
98+
99+
integrator = nao.TwoCenterIntegrator()
100+
integrator.tabulate(orb, alpha, 'S', nr, cutoff)
76101

102+
overlap = integrator.snap(0, 0, 0, 0, 0, np.array([0.0, 0.0, 0.0]), False)
103+
assert 1 - overlap[0][0] < 1e-10
104+
overlap = integrator.snap(1, 0, 0, 0, 0, np.array([3.0, 3.0, 3.0]), False)
105+
assert abs(overlap[0][0] - 0.031136758774787342) < 1e-10
77106

78107

79108

source/source_basis/module_nao/numerical_radial.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -274,15 +274,14 @@ void NumericalRadial::set_uniform_grid(const bool for_r_space,
274274
const char mode,
275275
const bool enable_fft)
276276
{
277-
double* grid = new double[ngrid];
277+
std::vector<double> grid(ngrid);
278278
double dx = cutoff / (ngrid - 1);
279279
for (int i = 0; i != ngrid; ++i)
280280
{
281281
grid[i] = i * dx;
282282
}
283283

284-
set_grid(for_r_space, ngrid, grid, mode);
285-
delete[] grid;
284+
set_grid(for_r_space, ngrid, grid.data(), mode);
286285

287286
if (enable_fft)
288287
{
@@ -362,7 +361,7 @@ void NumericalRadial::radtab(const char op,
362361

363362
double* rgrid_tab = new double[nr_tab];
364363
double dr = rmax_tab / (nr_tab - 1);
365-
std::for_each(rgrid_tab, rgrid_tab + nr_tab, [dr,&rgrid_tab](double& r) { r = dr * (&r - rgrid_tab); });
364+
std::for_each(rgrid_tab, rgrid_tab + nr_tab, [dr,&rgrid_tab](double& r) { r = dr * (int)(&r - rgrid_tab); });
366365

367366
bool use_radrfft = is_fft_compliant(nr_tab, rgrid_tab, nk_, kgrid_);
368367

0 commit comments

Comments
 (0)