Skip to content

Fix: use consistent AO radial spline values and derivatives - #8119

Open
aboys-cb wants to merge 6 commits into
deepmodeling:developfrom
aboys-cb:codex/fix-ao-radial-interpolation
Open

aboys-cb wants to merge 6 commits into
deepmodeling:developfrom
aboys-cb:codex/fix-ao-radial-interpolation

Conversation

@aboys-cb

@aboys-cb aboys-cb commented Oct 10, 2026 •

Copy link
Copy Markdown

Reminder

  • I have read AGENTS.md and docs/developers_guide/agent_governance.md.
  • I have linked an issue or explained why this PR does not need one.
  • I have added adequate unit tests and/or case tests, or explained why not.
  • I have listed the exact verification commands run and their results.
  • I have described user-visible behavior changes, including INPUT parameter changes.
  • I have explained core-module impact for ESolver, HSolver, ElecState, Hamilt, Operator, Psi, or other source/ changes.
  • I have requested any needed governance exception below.

Linked Issue

No separate issue: this PR contains the bug report, mathematical explanation and numerical evidence. The issue was found during the investigation associated with #8117, but this is an independent AO interpolation fix and does not include that PR's DeltaSpin force-factor change.

What's changed?

Numerical_Orbital_Lm::extra_uniform previously used Uni_RadialF for orbital values and a different cubic spline for radial derivatives. The matching spline values were computed but discarded. Downstream value/derivative interpolation therefore described two different radial functions; tightening SCF convergence does not repair that inconsistency.

Store both outputs from the existing spline evaluator. Preserve its boundary conditions, derivative table and zero value padding at/after the cutoff. No new interpolator, INPUT option, public interface or global dependency is introduced.

Following review, the standalone Fe2 integration fixture, manual diagnostic script and additional Fe orbital have been removed. No new LCAO case is introduced: the focused unit regression tests the shared mathematical contract, while the existing Gamma/multik CPU/GPU integration cases cover its consumers. Their existing pseudopotentials, orbitals, inputs, public collectors and tolerances are reused.

Unit Tests and/or Case Tests for my changes

The new source test_orb_atomic_lm.cpp is linked into the existing MODULE_AO_ORB_atomic_lm_test target. It checks all six angular-momentum boundary-condition branches and value padding outside the support. For a synthetic smooth radial function, a five-point energy-independent finite difference checks the interpolated value/derivative contract within one original spline interval.

  • Fresh candidate build: 10/10 AO unit cases pass, including the new regression.
  • Negative control: the same regression linked with the old AO implementation fails as expected; maximum discrepancy 7.67483354e-3, with the unchanged 5e-10 gate.
  • The full-application A/B uses a fresh build of PR head a3b253084bcd0def11898379379a592985fe34f5. The baseline differs only by compiling/linking the old orb_atomic_lm.cpp into the same object list. All 2,870 tracked source/build-input hashes match the validation snapshot. The baseline AO SHA256 is e20e19ddf7bb3e9ffa2fc65f3bcb8266a2dce65b58b0d5b908fb297ae3c754de; the corrected file is 302be9aaa3c0a867c1e52b2095aa50ca084ded19916ce6ec1df509b0127fa3cf.

Reference audit and rerun results

The ASE check stopped at its first energy assertion in CI. I explicitly evaluated all 41 assertions in test_calculator_results with both implementations before changing references, including eigenvalues, occupations, forces and stress. Only its energy reference fails with the corrected implementation:

Observable Existing reference Old AO run Corrected AO run Action
Energy / free energy (eV) -194.953053309 -194.9530533314 -194.953050937 Update reference; retain 7-place assertion
First eigenvalue (eV) -4.82194 -4.821943780263219 -4.821944068239930 Keep all 14 eigenvalue references and np.allclose tolerances
Forces (eV/Angstrom) all zero all zero all zero Keep reference/tolerance
Diagonal stress (eV/Angstrom³) -0.19327923 -0.1932792446598532 -0.19327925713307226 Keep reference/tolerance

All other ASE assertions pass unchanged. The corrected energy exactly reproduces CI's -194.953050937, rather than borrowing a value from #8117.

The same old-AO/corrected-AO comparison was run through the existing integration harness. The old AO implementation passes the old references. The corrected implementation reproduces the 20 scalar-case failures and 7 early-aborting file-comparison failures in the Gamma CPU CI job, and all 13 affected Gamma GPU cases. Running the collectors through every assertion also exposes later comparisons that CI could not reach after the first failure. Multik cases were checked too, including the two D4 cases.

Updates cover 99 existing scalar reference files and 29 existing matrix/cube/band/wavefunction reference files, plus the one ASE energy reference. Only failing scalar keys are replaced; passing scalar references and timing entries remain unchanged. File comparisons retain their original tolerances and their success assertions (*_pass = 0). No threshold file, comparison routine, test input, orbital or pseudopotential is changed.

These are expected consequences of changing the AO values: grid-integrated Hamiltonians and densities change, which changes SCF energies/eigenvalues, density-dependent force/stress terms, cube fields, and wavefunction fingerprints. The derivative table alone is unchanged; this does not imply that full self-consistent forces/stress must remain bitwise unchanged. Both binaries share every object except the AO translation unit, so the baseline passing and candidate failing the old references isolates the cause.

Fresh rerun with updated references Result
02_NAO_Gamma 33/33 cases pass
03_NAO_multik 66/66 ordinary cases plus 2/2 D4 cases pass
12_NAO_Gamma_GPU 16/16 cases pass
13_NAO_multik_GPU 3/3 cases pass
ASE abacuslite/xtest.sh 58 tests: 56 pass, 2 pre-existing skips
ASE tests/xtest.sh 7/7 integration tests pass
Focused AO CTest target 10/10 pass; old-AO negative control fails as expected

The integration count above is 120 actual case directories. Autotest.sh labels its property-assertion totals as “test cases”; those larger printed totals are not used as case counts here.

The additional changed scalar quantities include esolelref for Gamma scf_solvation: -18.2295218889 → -18.2295196494, and 226 wavefunction fingerprint components across existing get_wf_spin2, get_wf, and get_wf0 cases. For example, get_wf_spin2/wfi2s1k1_wfc_fp_cross_7_im changes 0.4064717095966 → 0.4064682788777; multik get_wf/wfi1s1k3_wfc_fp_power_6 changes 1.08585375065 → 1.085854273835, and get_wf0 changes 1.086016820504 → 1.086017343709. The old AO reproduces those old values; all changed components pass the unchanged 1e-7 gate after updating their references. Exact component-by-component old/new values are in the reference-file diff.

Scalar reference changes: old → new (unchanged tolerances)

Energy is in eV. Force/stress columns are the existing collector’s sums of absolute components, in eV/Angstrom and kbar. A dash means that reference was left unchanged. Per-atom energy references change consistently with total energy. All listed baseline values passed the old reference before the AO substitution.

Group / existing case Total energy: old → new Force sum: old → new Stress sum: old → new
02/md_msst -207.164438203 → -207.164437964 — —
02/md_out_hk_spin2 -196.630439773 → -196.630448631 — 1315.35268 → 1315.348116
02/md_out_hk_syns -196.630444282 → -196.63045314 — 1315.352481 → 1315.347917
02/relax_cell -202.420861734 → -202.420859698 — —
02/relax_lbfgs -196.621866292 → -196.621870232 — —
02/relax_old_cg -195.564175285 → -195.564176605 — —
02/relax_out_hk -183.77313689 → -183.773143374 — —
02/relax_out_hk_spin2 -186.679742107 → -186.679737513 — —
02/scf_FeBiTe -22413.2663586 → -22413.2738641 25.164814 → 25.161546 88.320445 → 88.339388
02/scf_afm -6242.92398655 → -6242.92410121 — —
02/scf_bsse -265.89599127 → -265.89601373 — —
02/scf_elenum -1892.17277924 → -1892.17275514 — 1296.332205 → 1296.33984
02/scf_elenum_spin2 -1892.10175169 → -1892.10172686 — 1281.324408 → 1281.331863
02/scf_fm -6264.35407626 → -6264.35422985 — —
02/scf_force_stress -204.126623236 → -204.126624942 — —
02/scf_metagga -195.878787244 → -195.878791018 — 1769.241426 → 1769.24365
02/scf_out_dh -31.6002503338 → -31.6002501675 — —
02/scf_out_hk -204.106280612 → -204.106281064 — —
02/scf_out_hk_spin2 -170.361986574 → -170.361981333 — —
02/scf_out_hxc -204.106280612 → -204.106281064 — —
02/scf_out_mul_spin2 -6241.13645871 → -6241.13636515 — —
02/scf_solvation -443.785251839 → -443.785300208 — —
02/scf_u_spin2 -6354.42619204 → -6354.42631581 — 51697.375986 → 51697.359894
02/scf_u_spin2_old -6304.22874633 → -6304.22887159 — —
02/scf_upf100 -1026.84966904 → -1026.84969691 — —
03/md_chg_extra -203.950755755 → -203.950756377 — —
03/md_nvt -204.129228831 → -204.129230443 — 1441.592005 → 1441.59426
03/md_out_wf -196.623294487 → -196.623297252 — 1500.92804 → 1500.93099
03/nscf_out_band_pband -205.45328971 → -205.453290539 — —
03/nscf_out_dos -205.45328971 → -205.45329054 — —
03/nscf_out_hsr_tr_rr -455.500707823 → -455.500737782 — —
03/nscf_out_mul -50.2262776293 → -50.2262779019 — —
03/nscf_out_pot1 -196.625407115 → -196.625430611 — —
03/relax_bfgs2 -211.239744437 → -211.239744571 — —
03/relax_cell -211.466431136 → -211.466432347 — —
03/relax_cell_vdw2 -4135.18467175 → -4135.18456509 — —
03/relax_cell_vdw3 -4135.35786436 → -4135.35775902 — —
03/relax_cell_vdw3bj -4136.30940651 → -4136.3093001 — 16.948997 → 16.947831
03/relax_old_cg -211.081263602 → -211.08126322 — —
03/scf_0atoms -211.4490868 → -211.449087685 — —
03/scf_angle_spin4 -6267.46518962 → -6267.46516744 — 3912.920437 → 3912.961117
03/scf_bspline -4883.88462319 → -4883.88470473 — 60277.339041 → 60277.376778
03/scf_deltaspin2 -6789.40131791 → -6789.40105627 67.888296 → 67.88751 6225.500296 → 6225.544739
03/scf_eadd -193.644745044 → -193.644746016 — —
03/scf_eadd_spin2 -193.95564014 → -193.955641514 — —
03/scf_eminus -1889.17527527 → -1889.17525676 — 821.070405 → 821.076651
03/scf_eminus_spin2 -1889.07468026 → -1889.07465992 — 798.184884 → 798.190731
03/scf_gga_grad2_spin4 -6267.50069667 → -6267.50067503 — 3941.107233 → 3941.148224
03/scf_in_dmr_GaAs -5069.16607203 → -5069.16634229 89.291634 → 89.29515 2011.565088 → 2011.57209
03/scf_in_dmr_Si -168.589531661 → -168.589531809 — —
03/scf_out_chg_pot1 -5064.47141322 → -5064.47178573 812.960394 → 812.950116 54550.561002 → 54550.681446
03/scf_out_chg_tau -196.452110542 → -196.452113592 — 1426.53351 → 1426.535286
03/scf_out_dmr_dmk -3461.88590514 → -3461.87813585 — —
03/scf_out_dos_spin2 -6270.25051288 → -6270.25021715 — —
03/scf_out_dos_spin4 -1964.0663948 → -1964.06636398 — —
03/scf_out_elf -146.124999466 → -146.124993229 — —
03/scf_out_hsk -194.16021029 → -194.160205819 — —
03/scf_out_hsk_binary -194.16021029 → -194.160205819 — —
03/scf_out_hsr -174.107810359 → -174.107825222 — —
03/scf_out_hsr_binary_spin2 -173.971001015 → -173.971015718 — —
03/scf_out_hsr_spin4 -145.796077506 → -145.796081123 — —
03/scf_out_mul_nupdw -193.95564014 → -193.955641514 — —
03/scf_out_mul_spin2 -6335.88303158 → -6335.88348516 — 14362.951992 → 14363.010537
03/scf_out_mul_spin4 -6263.29354988 → -6263.29346651 — —
03/scf_out_pot3 -196.625405346 → -196.625428849 — —
03/scf_out_qo -4230.5483142 → -4230.54822756 — —
03/scf_pp_gth -211.608891436 → -211.608892342 — —
03/scf_pp_sg15 -196.621910499 → -196.621911505 — —
03/scf_pp_upf1 -212.45438002 → -212.454380467 — —
03/scf_pp_upf201 -260.691859686 → -260.691860516 — —
03/scf_smallg_spin1 -414.636486868 → -414.636526999 808.357381 → 808.35412 —
03/scf_smallg_spin2 -414.56998973 → -414.570029826 808.472011 → 808.468747 —
03/scf_symm_prec -23542.3282006 → -23542.3289835 685.072329 → 685.072445 829.696556 → 829.690766
03/scf_u_ramp -3376.27234543 → -3376.27241958 36.032716 → 36.033672 12211.003182 → 12210.97882
03/scf_u_spin1 -5909.54197909 → -5909.54204585 955.11163 → 955.11906 46844.260877 → 46844.241582
03/scf_u_spin2 -7661.70305246 → -7661.70319397 24.663512 → 24.664192 7359.638478 → 7359.670334
03/scf_u_spin4 -6789.28164063 → -6789.28173245 11.331534 → 11.331848 4697.832232 → 4697.840104
03/scf_vdw3abc -447.192964542 → -447.192997221 11.861382 → 11.85933 —
12/001_NO_BiSeCuO_GPU -15010.5138522 → -15010.5139982 — —
12/002_NO_H2O_GPU -466.470727446 → -466.470730467 — —
12/003_NO_H2_DZP_GPU -29.8971789775 → -29.8971790898 — —
12/005_NO_H2_SZ_GPU -29.773331863 → -29.7733316981 — —
12/006_NO_H2_SZ_S2_GPU -29.7733486676 → -29.7733485028 — —
12/009_NO_Si2_DZP_GPU -196.62217237 → -196.622174998 — —
12/010_NO_Si2_DZP_NEQ_GPU -200.959690041 → -200.959688795 — —
12/011_NO_Si2_DZP_NEQ_S2_GPU -200.959687255 → -200.959686009 — —
12/012_NO_Si2_DZP_S2_GPU -196.622167797 → -196.622170425 — —
12/013_NO_Si2_TZDP_GPU -197.147057914 → -197.147060164 — —
12/014_NO_Si2_TZDP_NEQ_GPU -202.011329334 → -202.011329889 — —
12/015_NO_Si2_TZDP_NEQ_S2_GPU -202.011326742 → -202.011327297 — —
12/016_NO_Si2_TZDP_S2_GPU -197.147053585 → -197.147055835 — —
13/001_NO_KP_BiSeCuO_GPU -15010.5138522 → -15010.5139982 — —
13/002_NO_KP_Si2_DZP_NEQ_S2_GPU -200.959687255 → -200.959686009 — —
13/003_NO_KP_Si2_TZDP_S2_GPU -197.147053585 → -197.147055835 — —
03/relax_cell_vdw4_d4 -4136.37795591 → -4136.37784949 — 16.89457 → 16.893404
03/relax_cell_vdw4_d4s -4136.36922169 → -4136.36911527 — 16.950691 → 16.949526
All 29 failed file comparisons: representative maximum changes

The old implementation passes every old file comparison. Below, each selected component is the maximum change among the compared numeric tokens, using the existing absolute-value mode for wavefunctions. Original matrix/cube/band tolerances and _pass = 0 assertions are preserved; the new files come from the corrected run.

Group / case / reference Old token New token Max comparison difference
02/md_out_hk_spin2/hks1_nao.txt.ref 1.45534e+00 1.45533e+00 1e-05
02/md_out_hk_spin2/hks2_nao.txt.ref 1.45534e+00 1.45533e+00 1e-05
02/md_out_hk_syns/hk_nao.txt.ref 1.45534e+00 1.45533e+00 1e-05
02/relax_out_hk_spin2/hks1_nao.txt.ref -1.28577e-01 -1.28578e-01 1e-06
02/relax_out_hk_spin2/hks2_nao.txt.ref -1.28577e-01 -1.28578e-01 1e-06
02/scf_out_dh/dhk_ref/dhkz_iat2_nao.txt (-1.43230862e-01,0.00000000e+00) (-1.43230060e-01,0.00000000e+00) 8.02e-07
02/scf_out_dh/dhk_ref/dvhkz_iat2_nao.txt (-7.39941593e-01,0.00000000e+00) (-7.39941355e-01,0.00000000e+00) 2.38e-07
02/scf_out_dh/dhk_ref/dvlkz_iat2_nao.txt (8.19267897e-01,0.00000000e+00) (8.19267469e-01,0.00000000e+00) 4.28e-07
02/scf_out_dh/dhk_ref/dvxckz_iat2_nao.txt (3.73922747e-01,0.00000000e+00) (3.73923548e-01,0.00000000e+00) 8.01e-07
02/scf_out_hk_spin2/hrs1_nao.csr.ref 9.28266293e-01 9.28266416e-01 1.23e-07
02/scf_out_hk_spin2/hrs2_nao.csr.ref 1.12337072e+00 1.12337090e+00 1.8e-07
02/scf_out_hxc/Vxc_R_spin0.ref -9.98178110e-02 -9.9817821797355127e-02 1.07974e-08
02/scf_out_wf/wf_nao.txt.ref 1.96389784e+00 1.96389781e+00 3e-08
03/md_out_wf/wfk1g3_nao_mod.txt.ref 1.3736197637e-01 1.3739969200e-01 3.77156e-05
03/nscf_out_band_pband/band.txt.ref -4.42333349 -4.42333375 2.6e-07
03/nscf_out_hsr_tr_rr/hrs1_nao.csr.ref -3.80770726e-01 -3.80770950e-01 2.24e-07
03/scf_out_chg_pot1/chg.cube.ref 1.27736e+00 1.27737e+00 1e-05
03/scf_out_chg_tau/chg.cube.ref 7.322e-02 7.321e-02 1e-05
03/scf_out_chg_tau/tau.cube.ref 1.80405346865e-01 1.80373455262e-01 3.18916e-05
03/scf_out_dh_t/dhk_ref/dhkx_iat1_ik0_nao.txt (2.75880257e-03,0.00000000e+00) (2.81949250e-03,0.00000000e+00) 6.06899e-05
03/scf_out_dh_t/dhk_ref/dhkx_iat1_ik1_nao.txt (2.75880257e-03,0.00000000e+00) (2.81949250e-03,0.00000000e+00) 6.06899e-05
03/scf_out_dh_t/dhk_ref/dhky_iat1_ik0_nao.txt (2.75880257e-03,0.00000000e+00) (2.81949250e-03,0.00000000e+00) 6.06899e-05
03/scf_out_dh_t/dhk_ref/dhky_iat1_ik1_nao.txt (2.75880257e-03,0.00000000e+00) (2.81949250e-03,0.00000000e+00) 6.06899e-05
03/scf_out_dh_t/dhk_ref/dhkz_iat1_ik0_nao.txt (-2.75880257e-03,0.00000000e+00) (-2.81949250e-03,0.00000000e+00) 6.06899e-05
03/scf_out_dh_t/dhk_ref/dhkz_iat1_ik1_nao.txt (-2.75880257e-03,0.00000000e+00) (-2.81949250e-03,0.00000000e+00) 6.06899e-05
03/scf_out_elf/elftot.cube.ref 7.480e-01 7.463e-01 0.0017
03/scf_out_hsr/hrs1_nao.csr.ref -3.38124e-02 -3.38125e-02 1e-07
03/scf_out_hsr_spin4/hrs1_nao.csr.ref (9.58054233e-01,0.00000000e+00) (9.58053941e-01,0.00000000e+00) 2.92e-07
03/scf_out_wf/wfk2_nao_mod.txt.ref 2.0320125400847319774300104e+00 2.03201252e+00 2.00847e-08
Derivation: the inconsistent derivative term and why the common spline removes it

Numerical_Orbital_Lm::extra_uniform previously populated psi_uniform
with Uni_RadialF, but populated dpsi_uniform with the derivative of a
different cubic spline. The spline routine already computed the matching
values, which were discarded in a temporary buffer. This fix stores those
values directly and retains zero value padding at and beyond the cutoff.
It preserves the existing spline boundary conditions and derivative table.

To derive the consistency condition, let the original radial knots be
$x_j,x_{j+1}$, interval width $H=x_{j+1}-x_j$, samples $f_j,f_{j+1}$ and
spline second derivatives $M_j,M_{j+1}$. Define
$a=(x_{j+1}-r)/H$ and $b=(r-x_j)/H$. The existing spline evaluator returns

$$
S(r)=a f_j+b f_{j+1}+\frac{H^2}{6}
\left[(a^3-a)M_j+(b^3-b)M_{j+1}\right].
$$

Since $a'=-1/H$ and $b'=1/H$, differentiating term by term gives

$$
S'(r)=\frac{f_{j+1}-f_j}{H}
-\frac H6(3a^2-1)M_j+\frac H6(3b^2-1)M_{j+1},
$$

exactly the derivative returned by the same evaluator. Thus storing both
outputs establishes psi_uniform[i] = S(r_i) and
dpsi_uniform[i] = S'(r_i) inside the support.

The orbital-value path in GintAtom::set_phi uses cubic Hermite
interpolation on a fine interval of width $h$, with $t=(r-r_i)/h$:

$$
\mathcal H(t)=h_{00}(t)y_i+h h_{10}(t)d_i
+h_{01}(t)y_{i+1}+h h_{11}(t)d_{i+1},
$$

$$
h_{00}=2t^3-3t^2+1,\quad h_{10}=t^3-2t^2+t,\quad
h_{01}=-2t^3+3t^2,\quad h_{11}=t^3-t^2.
$$

If this fine interval lies in one original spline interval, both $S$ and
$\mathcal H_{\mathrm{new}}$ are cubic polynomials with the same value and
first derivative at each endpoint. Their difference therefore has two
double roots. A polynomial of degree at most three cannot have those four
roots unless it is identically zero. Hence
$\mathcal H_{\mathrm{new}}=S$ and $\mathcal H'_{\mathrm{new}}=S'$ there.

For the old values $P(r_i)$, put $\epsilon_i=P(r_i)-S(r_i)$ while retaining
$d_i=S'(r_i)$. Linearity of Hermite interpolation gives

$$
\mathcal H_{\mathrm{old}}-S=h_{00}\epsilon_i+h_{01}\epsilon_{i+1}.
$$

Using $dt/dr=1/h$, $h'{00}=-6t(1-t)$ and
$h'
{01}=6t(1-t)$ then gives the extra derivative term

$$
\frac{d\mathcal H_{\mathrm{old}}}{dr}-S'
=\frac{6t(1-t)}h(\epsilon_{i+1}-\epsilon_i).
$$

Its maximum magnitude is $3|\epsilon_{i+1}-\epsilon_i|/(2h)$, attained
at $t=1/2$. This term vanishes for the corrected tables. There is no claim
that it diverges as $h$ decreases: the endpoint error difference also
changes with $h$.

The GPU counterparts in kernel/phi_operator_kernel.cuh use the same
Hermite value and four-point value/slope formulas.

The force path GintAtom::set_phi_dphi separately uses four-point polynomial
interpolation of the values and slopes. When all four samples lie in one
original spline interval, cubic interpolation reproduces both the cubic
$S$ and its quadratic derivative $S'$ exactly. The old pair of tables
cannot generally satisfy that same value/derivative contract.
For an orbital $\phi(\mathbf r-\mathbf R)=S(\rho)Y_{lm}(\hat\rho)$,
$\partial\phi/\partial\mathbf R=-\nabla\phi$ contains $S'$.
For example, a fixed-potential grid term $e=wV\phi^2$ differentiates to
$\partial e/\partial R=2wV\phi,\partial\phi/\partial R$;
using the derivative of another radial representation violates this chain
rule. This example explains the mechanism, not a derivation of every DFT
force term. The unit regression checks the interpolation contract directly; existing SCF integration tests separately check its numerical consequences.

The proof is local to a single original spline interval, away from the
support boundary. It does not prove exact equality across spline knots,
zero numerical force error, cutoff convergence, or correctness of every
force/stress term. The existing derivative padding is unchanged; only
orbital values are explicitly zeroed outside the support.

Verification commands and environment

SRC, BUILD and RUN below denote the isolated source, build and external validation directories. ABACUS reports v3.11.0-beta10; GCC 13.3, CUDA 12.9, OpenMPI 5.0.10, libxc 7.0.0, one V100 allocation per run, OMP_NUM_THREADS=1, OPENBLAS_NUM_THREADS=1. CPU cases use 4 MPI ranks (2 for the ASE case), GPU cases 2 MPI ranks. Baseline/candidate A/B ran consecutively on the same 16v100n08 allocation; the final reference rerun ran on 16v100n13. These are correctness checks, not performance measurements.

cmake -S "$SRC" -B "$BUILD" \
  -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++ -DMPI_CXX_COMPILER=mpicxx \
  -DUSE_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=70 -DENABLE_LCAO=ON \
  -DENABLE_MPI=ON -DENABLE_OPENMP=ON -DENABLE_ELPA=ON -DENABLE_LIBXC=ON \
  -DENABLE_LIBRI=OFF -DENABLE_JSON=OFF -DENABLE_CUSOLVERMP=OFF \
  -DBUILD_TESTING=ON -DGIT_SUBMODULE=OFF \
  -DFETCHCONTENT_SOURCE_DIR_GOOGLETEST="$GTEST_SRC" \
  -DCMAKE_INSTALL_PREFIX="$BUILD/install" \
  -DLAPACK_DIR="$OPENBLAS_ROOT/lib" -DSCALAPACK_DIR="$ScaLAPACK_ROOT/lib" \
  -DELPA_DIR="$ELPA_ROOT" -DFFTW3_DIR="$FFTW3_ROOT" -DLibxc_DIR="$LIBXC_ROOT"
cmake --build "$BUILD" -j8 --target abacus_basic_gpu MODULE_AO_ORB_atomic_lm_test
cp -r "$SRC/source/source_basis/module_ao/test/lcao_H2O" \
  "$BUILD/source/source_basis/module_ao/test/"
ctest --test-dir "$BUILD" -V -R '^MODULE_AO_ORB_atomic_lm_test$'
"$BUILD/unit_baseline" \
  --gtest_filter=NumericalOrbitalLmUniformGrid.DerivativeMatchesInterpolatedValues
"$BUILD/abacus_basic_gpu" --version

# Run from fresh copies of the corresponding test groups.
# ABACUS is the baseline binary for A/B and abacus_basic_gpu for final validation.
bash ../integrate/Autotest.sh -a "$ABACUS" -n 4 -o 1 -j 2 -f CASES_CPU.txt
# 03_NAO_multik: CASES_NO_D4.txt contains the existing CPU list minus the
# two D4 cases; those are checked separately with D4 support below.
bash ../integrate/Autotest.sh -a "$ABACUS" -n 4 -o 1 -j 2 -f CASES_NO_D4.txt
# Both existing GPU groups:
bash ../integrate/Autotest.sh -a "$ABACUS" -n 2 -o 1 -j 1 -f CASES_GPU.txt
# D4 cases.txt contains relax_cell_vdw4_d4 and relax_cell_vdw4_d4s:
bash ../integrate/Autotest.sh -a "$BUILD/abacus_candidate_d4" -n 4 -o 1 -j 1 -f cases.txt

# With PYTHONPATH pointing at interfaces/ASE_interface and the isolated
# test dependencies, and PATH selecting the candidate executable:
(cd "$SRC/interfaces/ASE_interface/abacuslite" && bash xtest.sh)
(cd "$SRC/interfaces/ASE_interface/tests" && bash xtest.sh)
git diff --cached --check
python3 tools/03_code_analysis/agent_governance_check.py --staged --format text
python3 tools/03_code_analysis/code_quality_score.py \
  source/source_basis/module_ao/test/test_orb_atomic_lm.cpp

Environment repairs made before accepting results: the site's ELPA 2026.02 binary raises SIGILL inside elpa_index.c:find_int_entry on Zen3, with either AO implementation. Both runs therefore use the existing ABI-compatible libelpa_openmp.so.19 from the site's 2025.06 AVX2 installation and explicit generic kernels. The baseline passes the original references with that environment. Node-local temporary directories also disappeared during initial attempts; accepted runs use an isolated persistent TMPDIR. Those initial launches are not counted as numerical failures or passes.

D4 was absent from the initial build. The repository's toolchain/scripts/stage4/install_dftd4.sh installed its pinned DFT-D4 4.3.0 archive (SHA256 e94c5d021c0a4b4aa9b5587e36fda2f398271dc2dc1abfbe097fdb04022bef35) in an isolated prefix. Supplemental baseline/candidate binaries reuse the same object list, replace vdw.cpp and add vdwd4.cpp compiled with the saved CMake flags plus __DFTD4, and link that library. Both supplemental binaries differ only in the AO object. The two old-AO D4 cases pass the old references; the corrected D4 cases pass their updated energy/stress references on rerun. Their force references remain within the original tolerance and are not changed.

The initial full ASE script stopped at missing seekpath; after installing isolated seekpath 2.2.2 and spglib 2.6.0 dependencies, both complete scripts pass with ASE 3.28.0. No shared Python installation is modified.

Checks not run locally: the full repository unit matrix and integration groups outside the four LCAO groups above (including RI/DeepKS/TDDFT) require their CI feature configurations. They are not claimed to pass by these results. No fresh finite-displacement force/stress or performance benchmark is claimed in this CI-reference follow-up. The local spline proof does not establish zero grid error, translational invariance, cutoff convergence, or exact force consistency across spline knots.

Governance Notes

  • INPUT/docs changes: no INPUT syntax, defaults, public API or parameter semantics change. No documentation update required for docs/parameters.yaml or docs/advanced/input_files/input-main.md; the internal numerical correction, derivation and reference changes are documented here.
  • Core module impact: module_ao supplies matching spline values/slopes to LCAO CPU/GPU consumers. Boundary conditions, derivative generation, ownership and interfaces remain unchanged. The focused regression is registered in the existing CMake target.
  • Exceptions requested: none. No new global dependency, workflow switch, MPI call or access-control hack. No test tolerance is relaxed. The new unit source scores 95/100; historical whole-file quality debt in the production AO file is unchanged in scope.

Follow-up: newly enabled spin-2 H(R) case

The CPU run 38048620018 and CUDA run 38048620723 at 185a5401a both failed in 03_NAO_multik/scf_out_hsr_spin2. Upstream commit 53a038661 enabled this existing case in both case lists after the branch's earlier baseline (17a7140a). The previous 120-directory run did not include it. This follow-up updates its two H(R) references and two energy fields, adding no case, fixture or test script.

A matched old-AO/fixed-AO run reproduced the exact CI mismatch (job 1727982, Sai 16v100n08, 4 MPI ranks, OMP_NUM_THREADS=1). The old AO implementation passes both old H(R) references and the old overlap reference. The corrected implementation fails both old H(R) references and still passes the unchanged overlap reference. Thus the mismatch follows the AO correction rather than the new Fermi-energy header annotation.

Quantity Old reference Corrected result / new reference
H(R), both spin channels, line 30 column 5 -3.37629e-02 -3.37630e-02
Total energy (eV) -173.9710010148657 -173.971015717709
Energy per atom (eV) -86.9855005074 -86.9855078589

Each H(R) reference has 272 changed printed values; the maximum absolute change is 1.0e-7, above the unchanged 1e-8 matrix tolerance. The energy change is -1.47028433e-5 eV, above the unchanged 1e-7 eV energy tolerance. The initial fatal matrix comparison prevented CI from reporting these energy differences. Both channels and all scalar assertions have now been checked. This one-step matrix-output case does not test forces, stress or eigenvalues; no new coverage of those quantities is claimed.

Fresh executions against the updated references passed the existing Autotest.sh flow:

# CASES_FOLLOWUP.txt contains only the existing scf_out_hsr_spin2 directory.
bash ../integrate/Autotest.sh -a "$ABACUS" -n 4 -o 1 -j 1 -f CASES_FOLLOWUP.txt
bash ../integrate/Autotest.sh -a "$ABACUS" -n 2 -o 1 -j 1 -f CASES_FOLLOWUP.txt
# Separate copy with device gpu, matching the CUDA workflow:
bash ../integrate/Autotest.sh -a "$ABACUS" -n 2 -o 1 -j 1 -f CASES_FOLLOWUP.txt

All three runs returned 0 (CPU job 1728013, GPU job 1728014, Sai V100 / 16v100n08, OMP_NUM_THREADS=1). These reuse the previously audited matched binaries; they are focused reference validation, not a local rebuild of GitHub's newer merge commit. The updated merge-head CI remains the gate for that combination. Matrix/energy tolerances, S(R), case inputs, public test helpers and the upstream case lists are unchanged.

Complete AO-dependent feature-suite reference audit

The next CPU/CUDA jobs at 8faa5d22a passed the earlier LCAO groups, then stopped in 05_rtTDDFT / 15_rtTDDFT_GPU. The initial audit had omitted these feature suites and the RI/DeePKS suites, which also use the shared AO interpolation. This follow-up covers them together. No production code, test inputs, tolerances, pass/fail expectations, public test helpers or case lists are changed by this reference-only follow-up.

The added changes comprise 207 scalar assertions in 62 existing result.ref files and 7 existing array/matrix reference files. Every updated scalar passed the old reference with the old-AO binary and failed it with the corrected-AO binary; all seven changed array comparisons also have that positive/negative control. All _pass expectations remain zero. Runtime fields and still-passing references are preserved.

In particular, the first TDDFT wavefunction comparison used to abort collection before reporting the energy, force and stress differences in the same case. Diagnostic collection without early exit checked the later assertions too; the final acceptance runs use the unmodified public Autotest.sh flow. For 02_NO_CH_OW_TDDFT, on both CPU and GPU:

Quantity Old reference Corrected reference
Energy (eV) -323.539832766028 -323.539840980710
totalforceref 19.450256 19.449586
totalstressref 329.292627 329.291622
First failing wavefunction-file eigenvalue -1.61755584 -1.61755597

totalforceref and totalstressref are the public helper's sums of absolute values of the final printed components, not the net-force vector. The force and stress gates stay at 1e-4 and 1e-3 for this case. Changes in self-consistent Hamiltonians/densities also affect DeePKS labels and RI excitation energies. Larger last-step energy changes in relax_hse_gamma, md_hse_multik and relax_cell_hse_multik include the change in trajectory caused by corrected forces; they are not interpreted as fixed-geometry energy shifts. Inputs, iteration counts and convergence settings remain unchanged.

Matched controls and fresh verification

  • Fresh CPU build of the actual GitHub merge snapshot 46557508420d0e5658dc8c2a1250e742181a4524 (15feb6af + PR 8faa5d22a): GCC 13.3, OpenMPI 5.0.10, Libxc 7, LibRI b0eff7a, LibComm 965bf90, cereal 1.3.2 and CPU LibTorch 2.0.0. ENABLE_LIBRI, ENABLE_MLALGO and ENABLE_FLOAT_FFTW are enabled. The baseline shares all linked objects except orb_atomic_lm.cpp. On Sai 16v100n35, job 1728347, the baseline passed all 118 existing CPU cases: TDDFT 28, OFDFT 34, RI 24, DeePKS 28 and others 4. The corrected binary passed unchanged OFDFT references and exposed the intended reference differences in the other four groups.
  • The previously audited CUDA pair was reused on 16v100n04 (job 1728225) for the GPU feature/control groups. All 26 GPU TDDFT baseline cases passed old references. The 24 CPU + 6 GPU SDFT cases passed for both binaries, with identical collected numerical properties after excluding wall time. An initial basic-build CPU run could not cover the two Torch KEDF cases and two single-precision FFT TDDFT cases; the fresh full-feature CPU build above covers all four and passes their old references with the baseline. No references were changed for these dependency limitations.
  • After reference updates, fresh executions of the 28 CPU + 26 GPU TDDFT cases passed in job 1728630 (16v100n06). The 24 RI + 28 DeePKS + 4 others fresh rerun also passed in job 1728821 (16v100n04), with each public test-group command returning zero. The CPU/GPU TDDFT checks include the entire eigenvalue/wavefunction reference files and all energy/force/stress assertions, including the assertions hidden by the earlier fatal comparison.

Exact public test commands (each run from its existing test-group directory; ABACUS denotes the recorded binary):

# Baseline/fixed CPU audit, each of 05_rtTDDFT, 07_OFDFT, 08_RI, 09_DeePKS, 10_others:
bash ../integrate/Autotest.sh -a "$ABACUS" -n 4 -o 1 -j 1 -f CASES_CPU.txt
# GPU TDDFT/SDFT:
bash ../integrate/Autotest.sh -a "$ABACUS" -n 2 -o 1 -j 1 -f CASES_GPU.txt
# Fresh RI/DeePKS/others validation with updated references:
bash ../integrate/Autotest.sh -a "$ABACUS" -n 4 -o 1 -j 2 -f CASES_CPU.txt

CPU matched-binary SHA256: old AO dd10a8a512434c75f6afd0548834315d5c6b8771b13d14c8cfdd21a7a1e39448; corrected AO fcad69d2b8a50a44203cc3dee2d93366db1330613a29aaf87f9d6abefa4c266b. OMP_NUM_THREADS=1 and OPENBLAS_NUM_THREADS=1 throughout. No additional physical force finite-difference or performance claim is made by this CI reference audit.

Array/matrix evidence

The following are maximum changed entries; every updated file passed with the baseline and failed with the candidate against its old reference. All other array checks retain their existing references.

Reference file Old value New value Maximum absolute change Unchanged tolerance
05_rtTDDFT/02_NO_CH_OW_TDDFT/wfk1g3_nao_mod.txt.ref 2.2812710521e+00 2.2812749546e+00 3.9025e-06 1e-08
15_rtTDDFT_GPU/02_NO_CH_OW_TDDFT_GPU/wfk1g3_nao_mod.txt.ref 2.2812710521e+00 2.2812749546e+00 3.9025e-06 1e-08
08_RI/scf_out_xc_multik/vxc_out.ref -1.0375066546257820e+01 -1.0375105122182102e+01 3.85759e-05 1e-05
09_DeePKS/21_NO_GO_deepks_vdelta_r_1/deepks_hrtot.csr.ref 1.74107470e-01 1.74107366e-01 1.04e-07 1e-08
09_DeePKS/22_NO_GO_deepks_vdelta_r_2/deepks_hrtot.csr.ref 1.74107470e-01 1.74107366e-01 1.04e-07 1e-08
09_DeePKS/23_NO_KP_deepks_vdelta_r_1/deepks_hrtot.csr.ref 1.74107470e-01 1.74107366e-01 1.04e-07 1e-08
09_DeePKS/24_NO_KP_deepks_vdelta_r_2/deepks_hrtot.csr.ref 1.74107470e-01 1.74107366e-01 1.04e-07 1e-08
All 207 updated scalar assertions: old → new

05_rtTDDFT/02_NO_CH_OW_TDDFT

Assertion Old New Unchanged tolerance
etotperatomref -107.846610922 -107.8466136602 1e-07
etotref -323.539832766028 -323.53984098071 1e-07
totalforceref 19.450256 19.449586 0.0001
totalstressref 329.292627 329.291622 0.001

05_rtTDDFT/11_NO_O3_TDDFT

Assertion Old New Unchanged tolerance
etotperatomref -445.6664994033 -445.6664918544 1e-07
etotref -1336.99949820998 -1336.99947556326 1e-07

05_rtTDDFT/13_NO_Taylor_TDDFT

Assertion Old New Unchanged tolerance
etotperatomref 9.3345804485 9.3345734284 1e-07
etotref 18.669160897 18.6691468567861 1e-07

05_rtTDDFT/17_NO_vel_TDDFT

Assertion Old New Unchanged tolerance
etotperatomref -97.3857848019 -97.3857884725 1e-07
etotref -194.771569603789 -194.771576945044 1e-07

05_rtTDDFT/18_NO_hyb_TDDFT

Assertion Old New Unchanged tolerance
etotperatomref -101.1515162093 -101.1515187762 1e-07
etotref -202.303032418681 -202.303037552478 1e-07

05_rtTDDFT/19_NO_SUPERSINE_TDDFT

Assertion Old New Unchanged tolerance
etotperatomref -97.1397918007 -97.1397954158 1e-07
etotref -194.279583601315 -194.279590831639 1e-07

05_rtTDDFT/20_NO_MIXED_EFIELD_TDDFT

Assertion Old New Unchanged tolerance
etotperatomref -97.3829647333 -97.3829684046 1e-07
etotref -194.765929466595 -194.765936809176 1e-07

08_RI/lr_tddft_hf_ulr_gamma

Assertion Old New Unchanged tolerance
excitationenergyref1 -0.981255 -0.981239 1e-07
excitationenergyref2 -0.977372 -0.977363 1e-07
excitationenergyref3 -0.765054 -0.765038 1e-07

08_RI/md_hse_multik

Assertion Old New Unchanged tolerance
etotperatomref -155.6806575259 -155.6973205222 1e-07
etotref -467.041972577674 -467.091961566623 1e-07

08_RI/nscf_hse_multik

Assertion Old New Unchanged tolerance
etotperatomref -143.2244766095 -143.2244786325 1e-07
etotref -429.673429828445 -429.673435897426 1e-07

08_RI/relax_cell_hse_multik

Assertion Old New Unchanged tolerance
etotperatomref -154.4720255994 -154.4701608471 0.001
etotref -463.416076798194 -463.410482541159 0.001

08_RI/relax_hse_gamma

Assertion Old New Unchanged tolerance
etotperatomref -153.729328263 -153.7328435597 1e-07
etotref -461.187984789029 -461.19853067899 1e-07

08_RI/rpa_scf_gamma

Assertion Old New Unchanged tolerance
Etot_without_rpa -15.2381641467328 -15.2381639595806 1e-07
etotperatomref -140.6733424811 -140.6733393519 1e-07
etotref -422.020027443261 -422.020018055603 1e-07

08_RI/rpa_scf_shrink_multik

Assertion Old New Unchanged tolerance
etotperatomref -17.1085951155 -17.1085953578 1e-07
etotref -34.2171902309573 -34.2171907155562 1e-07

08_RI/rt_tddft_pbe0_gamma

Assertion Old New Unchanged tolerance
etotperatomref -93.5919864496 -93.5919852562 1e-07
etotref -187.183972899208 -187.183970512376 1e-07

08_RI/scf_campbeh_gamma

Assertion Old New Unchanged tolerance
etotperatomref -92.1345523508 -92.134549501 1e-07
etotref -184.269104701654 -184.269099002026 1e-07

08_RI/scf_hf_multik

Assertion Old New Unchanged tolerance
etotperatomref -87.9509242689 -87.9509209369 1e-07
etotref -175.901848537778 -175.901841873703 1e-07

08_RI/scf_hse_complex_multik

Assertion Old New Unchanged tolerance
etotperatomref -96.6977291188 -96.6977263002 1e-07
etotref -193.395458237598 -193.395452600318 1e-07

08_RI/scf_hse_gamma

Assertion Old New Unchanged tolerance
etotperatomref -142.998102603 -142.9981046472 1e-07
etotref -428.994307809002 -428.994313941683 1e-07
totalforceref 30.937794 30.972158 0.0001

08_RI/scf_hse_loop0_gamma

Assertion Old New Unchanged tolerance
etotperatomref -142.9982350144 -142.9982370584 1e-07
etotref -428.994705043145 -428.994711175284 1e-07

08_RI/scf_hse_soc_symm_multik

Assertion Old New Unchanged tolerance
etotperatomref -2926.913439625 -2926.9137297334 1e-05
etotref -2926.91343962504 -2926.91372973339 1e-05
totalstressref 3851.624753 3851.639149 0.001

08_RI/scf_hse_spin2_gamma

Assertion Old New Unchanged tolerance
etotperatomref -149.5715605728 -149.5715500437 1e-07
etotref -448.714681718408 -448.714650131113 1e-07
totalforceref 33.612717 33.642191 0.0001

08_RI/scf_hse_spin4_multik

Assertion Old New Unchanged tolerance
etotperatomref -149.4538247704 -149.4538142401 1e-07
etotref -448.361474311051 -448.361442720356 1e-07
totalforceref 33.668875 33.698382 0.0001

08_RI/scf_hse_symm_multik

Assertion Old New Unchanged tolerance
totalstressref 2143.792554 2143.794318 0.001

08_RI/scf_out_xc_multik

Assertion Old New Unchanged tolerance
etotperatomref -96.229390528 -96.2293874226 1e-07
etotref -192.458781055961 -192.458774845176 1e-07

08_RI/scf_pbe0_multik

Assertion Old New Unchanged tolerance
etotperatomref -95.0390309578 -95.0390280829 1e-07
etotref -190.078061915607 -190.078056165838 1e-07

09_DeePKS/01_NO_GO_deepks_scf

Assertion Old New Unchanged tolerance
deepks_desc 8.013102 8.013101 1e-07
deepks_dm_eig 29.4865102060067 29.4865099833954 1e-07
etotperatomref -14.2644081869 -14.2644062642 1e-07
etotref -71.3220409344064 -71.3220313209194 1e-07

09_DeePKS/02_NO_KP_deepks_scf

Assertion Old New Unchanged tolerance
etotperatomref -155.6378566944 -155.637854865 1e-07
etotref -466.913570083252 -466.91356459514 1e-07

09_DeePKS/03_NO_GO_deepks_md

Assertion Old New Unchanged tolerance
etotperatomref -155.3450900038 -155.3450885588 1e-07
etotref -466.035270011334 -466.035265676549 1e-07

09_DeePKS/04_NO_KP_deepks_md

Assertion Old New Unchanged tolerance
deepks_dm_eig 32.8175000241426 32.8175006476403 1e-07
etotperatomref -87.9996518953 -87.9996514883 1e-07
etotref -791.996867057901 -791.996863394415 1e-07

09_DeePKS/05_NO_GO_deepks_nscf

Assertion Old New Unchanged tolerance
deepks_desc 8.065871 8.06587 1e-07
deepks_dm_eig 29.6425665289244 29.6425660332028 1e-07
etotperatomref -14.8785920716 -14.8785900582 1e-07
etotref -74.392960357814 -74.3929502908831 1e-07

09_DeePKS/06_NO_KP_deepks_nscf

Assertion Old New Unchanged tolerance
deepks_desc 2.139924 2.139925 1e-07
deepks_dm_eig 10.5791868829172 10.5791867697508 1e-07
etotperatomref -156.5245292709 -156.5245273548 1e-07
etotref -469.573587812742 -469.573582064446 1e-07

09_DeePKS/07_NO_GO_deepks_relax

Assertion Old New Unchanged tolerance
etotperatomref -97.2282820774 -97.2282809935 1e-07
etotref -194.456564154849 -194.456561986957 1e-07

09_DeePKS/08_NO_KP_deepks_relax

Assertion Old New Unchanged tolerance
deepks_dm_eig 19.4532010976933 19.4532002409704 1e-07
etotperatomref -106.2042807854 -106.204281667 1e-07
etotref -212.408561570837 -212.408563333958 1e-07

09_DeePKS/09_NO_GO_deepks_basic

Assertion Old New Unchanged tolerance
deepks_e_label 17.126818714098 17.1268188350245 1e-07
deepks_f_label 0.0623947483816755 0.0623946213116845 1e-07
deepks_fpre 19.6310362487185 19.6310359418196 1e-07
deepks_s_label 0.0687907281948169 0.0687912447660818 1e-07
deepks_spre 19.3168478443648 19.316847360237 1e-07
etotperatomref -155.3482154165 -155.3482165134 1e-07
etotref -466.044646249531 -466.04464954011 1e-07

09_DeePKS/10_NO_KP_deepks_basic

Assertion Old New Unchanged tolerance
deepks_dm_eig 60.0434145909833 60.0434144010666 1e-07
deepks_e_label 45.5934989305213 45.5934983460489 1e-07
deepks_f_label 49.1623133373626 49.162310872875 1e-07
deepks_fpre 144.201589636855 144.201582622626 1e-07
deepks_s_label 31.409951480863 31.4099528198349 1e-07
deepks_spre 81.5144264660354 81.514424478118 1e-07
etotperatomref -137.8514171582 -137.8514153911 1e-07
etotref -1240.66275442399 -1240.66273851968 1e-07
totalforceref 2528.029706 2528.029579 0.0001

09_DeePKS/11_NO_GO_deepks_bandgap

Assertion Old New Unchanged tolerance
etotperatomref -155.5848553695 -155.5848546378 1e-07
etotref -466.754566108601 -466.754563913518 1e-07

09_DeePKS/12_NO_GO_deepks_bandgap_2

Assertion Old New Unchanged tolerance
etotperatomref -155.5848553695 -155.5848546378 1e-07
etotref -466.754566108601 -466.754563913518 1e-07

09_DeePKS/13_NO_GO_deepks_bandgap_3

Assertion Old New Unchanged tolerance
etotperatomref -155.5848553695 -155.5848546378 1e-07
etotref -466.754566108601 -466.754563913518 1e-07

09_DeePKS/14_NO_KP_deepks_bandgap

Assertion Old New Unchanged tolerance
deepks_e_label 35.2528814679094 35.2528818407486 1e-07
etotperatomref -319.7600392548 -319.7600426366 1e-07
etotref -959.280117764345 -959.280127909819 1e-07

09_DeePKS/15_NO_KP_deepks_bandgap_2

Assertion Old New Unchanged tolerance
deepks_e_label 35.2528814679094 35.2528818407486 1e-07
etotperatomref -319.7600392548 -319.7600426366 1e-07
etotref -959.280117764344 -959.280127909819 1e-07

09_DeePKS/16_NO_KP_deepks_bandgap_3

Assertion Old New Unchanged tolerance
deepks_o_label 0.14113101668749 0.141131153481897 1e-07
etotperatomref -154.3504003586 -154.3503998709 1e-07
etotref -463.051201075849 -463.051199612821 1e-07

09_DeePKS/17_NO_GO_deepks_vdelta_1

Assertion Old New Unchanged tolerance
deepks_e_label 17.126818714098 17.1268188350245 1e-07
deepks_h_label 49.2008179993695 49.2008178273255 1e-07
deepks_vdp 177.068633348045 177.068625424855 1e-07
etotperatomref -155.3482154165 -155.3482165134 1e-07
etotref -466.044646249531 -466.04464954011 1e-07

09_DeePKS/18_NO_GO_deepks_vdelta_2

Assertion Old New Unchanged tolerance
deepks_e_label 17.126818714098 17.1268188350245 1e-07
deepks_h_label 49.2008179993696 49.2008178273255 1e-07
etotperatomref -155.3482154165 -155.3482165134 1e-07
etotref -466.044646249531 -466.04464954011 1e-07

09_DeePKS/19_NO_KP_deepks_vdelta_1

Assertion Old New Unchanged tolerance
deepks_e_label 17.126818714098 17.1268188350245 1e-07
deepks_h_label 98.4016359987392 98.4016356546509 1e-07
deepks_vdp 354.137266696091 354.13725084971 1e-07
etotperatomref -155.3482154165 -155.3482165134 1e-07
etotref -466.044646249531 -466.04464954011 1e-07

09_DeePKS/20_NO_KP_deepks_vdelta_2

Assertion Old New Unchanged tolerance
deepks_e_label 17.126818714098 17.1268188350245 1e-07
deepks_h_label 98.4016359987392 98.4016356546509 1e-07
etotperatomref -155.3482154165 -155.3482165134 1e-07
etotref -466.044646249531 -466.04464954011 1e-07

09_DeePKS/21_NO_GO_deepks_vdelta_r_1

Assertion Old New Unchanged tolerance
deepks_e_label 17.126818714098 17.1268188350245 1e-07
deepks_vdrp 177.068633348045 177.068625424855 1e-07
etotperatomref -155.3482154165 -155.3482165134 1e-07
etotref -466.044646249531 -466.04464954011 1e-07

09_DeePKS/22_NO_GO_deepks_vdelta_r_2

Assertion Old New Unchanged tolerance
deepks_e_label 17.126818714098 17.1268188350245 1e-07
etotperatomref -155.3482154165 -155.3482165134 1e-07
etotref -466.044646249531 -466.04464954011 1e-07

09_DeePKS/23_NO_KP_deepks_vdelta_r_1

Assertion Old New Unchanged tolerance
deepks_e_label 17.126818714098 17.1268188350245 1e-07
deepks_vdrp 177.068633348045 177.068625424855 1e-07
etotperatomref -155.3482154165 -155.3482165134 1e-07
etotref -466.044646249532 -466.04464954011 1e-07

09_DeePKS/24_NO_KP_deepks_vdelta_r_2

Assertion Old New Unchanged tolerance
deepks_e_label 17.126818714098 17.1268188350245 1e-07
etotperatomref -155.3482154165 -155.3482165134 1e-07
etotref -466.044646249531 -466.04464954011 1e-07

09_DeePKS/25_NO_GO_deepks_out_freq_elec

Assertion Old New Unchanged tolerance
deepks_e_label 17.1269585621843 17.1269586808012 1e-07
deepks_e_label_elec 85.3898366656882 85.3898370940143 1e-07
deepks_f_label 0.0667600367817435 0.0667597526838422 1e-07
deepks_f_label_elec 0.0667600367817435 0.0667597526838422 1e-07
deepks_fdelta_elec 0.0179791027697845 0.0179793235464424 1e-07
deepks_fpre 19.7643517809128 19.7643514928162 1e-07
deepks_h_label 49.1270769673856 49.1270767697034 1e-07
deepks_h_label_elec 246.793639290695 246.793639815508 1e-07
deepks_s_label 0.0685171038282496 0.068517615688644 1e-07
deepks_s_label_elec 0.0685171038282496 0.068517615688644 1e-07
deepks_spre 19.4432482125812 19.4432477385545 1e-07
deepks_vdelta_elec 3.42346991933087 3.42346917898548 1e-07
deepks_vdp 177.006580612224 177.00657290925 1e-07
deepks_vdp_elec 885.47604183814 885.476008022075 1e-07
etotperatomref -155.3494839037 -155.3494849796 1e-07
etotref -466.048451711189 -466.048454938918 1e-07

09_DeePKS/26_NO_KP_deepks_out_freq_elec

Assertion Old New Unchanged tolerance
deepks_e_label 17.1269585621843 17.1269586808011 1e-07
deepks_e_label_elec 85.3898366656882 85.3898370940143 1e-07
deepks_f_label 0.0667600367817527 0.0667597526838521 1e-07
deepks_f_label_elec 0.0667600367817527 0.0667597526838521 1e-07
deepks_fdelta_elec 0.0179791027697869 0.0179793235464356 1e-07
deepks_fpre 19.7643517809128 19.7643514928162 1e-07
deepks_h_label 49.1270769673856 49.1270767697034 1e-07
deepks_h_label_elec 246.793639290695 246.793639815508 1e-07
deepks_s_label 0.0685171038282289 0.068517615688633 1e-07
deepks_s_label_elec 0.0685171038282289 0.068517615688633 1e-07
deepks_spre 19.4432482125812 19.4432477385545 1e-07
deepks_vdelta_elec 3.42346991933087 3.42346917898548 1e-07
deepks_vdp 177.006580612224 177.00657290925 1e-07
deepks_vdp_elec 885.47604183814 885.476008022075 1e-07
etotperatomref -155.3494839037 -155.3494849796 1e-07
etotref -466.048451711188 -466.048454938917 1e-07

09_DeePKS/27_NO_GO_deepks_out_2

Assertion Old New Unchanged tolerance
deepks_energy -15.1491131357504 -15.1491125933137 1e-07
deepks_hamiltonian -1.05443659154561 -1.05443906352999 1e-07
deepks_stress 4.84309528386395 4.84309501420335 1e-07
etotperatomref -137.4095055286 -137.4095006084 1e-07
etotref -412.228516585705 -412.228501825246 1e-07

09_DeePKS/28_NO_KP_deepks_out_2

Assertion Old New Unchanged tolerance
deepks_energy -15.1491131357504 -15.1491125933137 1e-07
deepks_stress 4.84309528386397 4.84309501420339 1e-07
etotperatomref -137.4095055286 -137.4095006084 1e-07
etotref -412.228516585705 -412.228501825246 1e-07

10_others/04_RDMFT_Si2

Assertion Old New Unchanged tolerance
E_TV_RDMFT_ref 5.1207282847 5.1207280759 1e-07
Etotal_RDMFT_ref -15.5170255428 -15.5170257177 1e-07
etotperatomref -105.5600729741 -105.5600737745 1e-07
etotref -211.120145948276 -211.120147549081 1e-07

10_others/05_Alllog_filename

Assertion Old New Unchanged tolerance
etotperatomref -105.5593250303 -105.5593258573 1e-07
etotref -211.118650060646 -211.118651714621 1e-07

15_rtTDDFT_GPU/02_NO_CH_OW_TDDFT_GPU

Assertion Old New Unchanged tolerance
etotperatomref -107.846610922 -107.8466136602 1e-07
etotref -323.539832766028 -323.539840980711 1e-07
totalforceref 19.450256 19.449586 0.0001
totalstressref 329.292627 329.291622 0.001

15_rtTDDFT_GPU/11_NO_O3_TDDFT_GPU

Assertion Old New Unchanged tolerance
etotperatomref -445.6664994033 -445.6664918544 1e-07
etotref -1336.99949820998 -1336.99947556327 1e-07

15_rtTDDFT_GPU/17_NO_vel_TDDFT_GPU

Assertion Old New Unchanged tolerance
etotperatomref -97.3857848019 -97.3857884725 1e-07
etotref -194.771569603789 -194.771576945044 1e-07

15_rtTDDFT_GPU/18_NO_hyb_TDDFT_GPU

Assertion Old New Unchanged tolerance
etotperatomref -101.1515162093 -101.1515187762 1e-07
etotref -202.303032418681 -202.303037552478 1e-07

15_rtTDDFT_GPU/19_NO_SUPERSINE_TDDFT_GPU

Assertion Old New Unchanged tolerance
etotperatomref -97.1397918007 -97.1397954158 1e-07
etotref -194.279583601315 -194.279590831639 1e-07

15_rtTDDFT_GPU/20_NO_MIXED_EFIELD_TDDFT_GPU

Assertion Old New Unchanged tolerance
etotperatomref -97.3829647333 -97.3829684046 1e-07
etotref -194.765929466595 -194.765936809175 1e-07

Changed-reference whitespace checks (git diff --check, git diff --cached --check) and the staged ABACUS governance checker passed. The updated GitHub CI run remains separate from these local/HPC results.

@mohanchen mohanchen added Bugs Bugs that only solvable with sufficient knowledge of DFT Refactor Refactor ABACUS codes collinear/non-collinear/SOC/delta-spin Issues related to SOC labels Oct 10, 2026

@AsTonyshment AsTonyshment left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice fix! LGTM. Please check the failing unit/integration tests and update all reference values affected by the intended numerical change.

Comment thread tests/integrate/fixtures/lcao_radial_force/INPUT Outdated
Comment thread tests/integrate/test_lcao_radial_force.py Outdated
Comment thread tests/PP_ORB/Fe_gga_8au_200.0Ry_4s2p2d1f.orb Outdated

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Bugs Bugs that only solvable with sufficient knowledge of DFT collinear/non-collinear/SOC/delta-spin Issues related to SOC Refactor Refactor ABACUS codes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants