Skip to content

Commit 8385562

Browse files
committed
fix: nspin=4 DFTU copy_locale heap corruption
Root cause: copy_locale() for nspin=4 wrote 4x the matrix size to uom_save, reading beyond the locale matrix bounds (c[mm+size], c[mm+2*size], c[mm+3*size]). The nspin=4 locale matrix already contains all spin components interleaved in a single (2l+1)*2 x (2l+1)*2 matrix, so only one copy is needed. This caused _Rb_tree heap corruption and segfault at iter=2 cal_occ_pw. Fix: match zdy-tmp behavior - copy only once for nspin=4, matching the existing copy_locale logic in zdy-tmp (dftu_occup.cpp:48-53). Also disabled diagnostic prints that accessed locale[0][1] which doesn't exist for nspin=4. Test results: - 223_PW_DFTU_S4_XY: 14 iter, -6364.27 eV (was: iter=2 crash) - 224_PW_DFTU_S4_XY: 14 iter, -6364.27 eV (was: iter=2 crash) - 264_PW_DFTU_DS_S4_XY: 15 iter, -6364.27 eV (was: iter=2 crash) - 265_PW_DFTU_DS_S4_XYZ: 15 iter, -6364.27 eV (was: iter=2 crash) - 261/262/263: no crash, iterating normally (were: immediate signal 6/11)
1 parent 5ad3977 commit 8385562

7 files changed

Lines changed: 720 additions & 5 deletions

File tree

CLAUDE.md

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,135 @@ cd /root/abacus-dftu-pw-port/build
169169
cmake -DENABLE_LCAO=ON -DUSE_OPENMP=ON -DBUILD_TESTING=ON ..
170170
cmake --build . -j$(nproc)
171171
```
172+
173+
---
174+
175+
## 模块详细信息
176+
177+
### module_dftu(DFT+U)
178+
179+
**位置**: `source/source_lcao/module_dftu/`
180+
181+
**核心类**: `Plus_U`(定义于 `dftu.h`
182+
183+
**关键静态成员**:
184+
- `U`, `U0`: Hubbard U 参数向量
185+
- `orbital_corr`: 关联轨道角动量标记(-1 表示无关联)
186+
- `energy_u`: DFT+U 能量修正
187+
- `Yukawa`: 是否使用 Yukawa 势计算 U/J
188+
- `mixing_dftu`, `omc`, `uramping`: 混合/控制参数
189+
190+
**关键数据结构**:
191+
- `locale[iat][l][n][spin]`: 局域占据矩阵(ModuleBase::matrix)
192+
- `locale_save`: 上一步保存的占据矩阵
193+
- `eff_pot_pw[index]`: PW 基组有效势(std::complex<double> 向量)
194+
- `eff_pot_pw_index[iat]`: 每个原子在 eff_pot_pw 中的起始索引
195+
- `uom_array`, `uom_save`: 用于 mixing 的占据矩阵一维展开
196+
- `iatlnmipol2iwt[iat][l][n][m][ipol]`: 索引变换
197+
198+
**PW 基组关键方法**(本次移植新增):
199+
- `cal_occ_pw(iter, psi_in, wg_in, cell, p_chgmix)`: 从 PW 波函数计算占据矩阵
200+
- 通过 OnsiteProjector 计算 becp = <alpha|psi>
201+
- nspin=1/2: index = ib*nkb + begin_ih + m_begin + m
202+
- nspin=4: index = ib*2*nkb + begin_ih + m_begin + m(含 spinor 分量)
203+
- 计算有效势和能量修正
204+
- `cal_VU_pot_pw(spin)`: 计算 PW 有效势矩阵(当前为空实现)
205+
- `set_locale(ucell)`: 从 uom_array 恢复 locale 矩阵
206+
- `get_eff_pot_pw(iat)`: 获取指定原子的有效势指针
207+
208+
**LCAO 基组方法**:
209+
- `cal_occup_m_k()`: k 点占据矩阵计算
210+
- `cal_occup_m_gamma()`: Gamma 点占据矩阵计算
211+
- `cal_energy_correction()`: 能量修正计算
212+
- `force_stress()`: 力和应力计算
213+
- `cal_eff_pot_mat_complex/real()`: LCAO 有效势矩阵
214+
- `cal_slater_UJ()`: Yukawa 势计算 U/J
215+
216+
**源文件**:
217+
| 文件 | 功能 |
218+
|------|------|
219+
| `dftu.cpp` | 类定义、init、能量修正 |
220+
| `dftu_pw.cpp` | PW 基组占据矩阵和有效势 |
221+
| `dftu_occup.cpp` | LCAO 占据矩阵计算 |
222+
| `dftu_hamilt.cpp` | Hamiltonian 贡献 |
223+
| `dftu_tools.cpp` | get_onebody_eff_pot 等工具函数 |
224+
| `dftu_force.cpp` | 力和应力 |
225+
| `dftu_io.cpp` | 读写占据矩阵 |
226+
| `dftu_folding.cpp` | S/dS 矩阵折叠 |
227+
| `dftu_yukawa.cpp` | Yukawa 势 |
228+
229+
**现有测试**: `test/dftu_pw_test.cpp`(能量权重、becp 索引、set_locale 逻辑)
230+
231+
---
232+
233+
### module_deltaspin(自旋约束 DFT / DeltaSpin)
234+
235+
**位置**: `source/source_lcao/module_deltaspin/`
236+
237+
**核心类**: `SpinConstrain<TK>`(模板单例,TK = double 或 std::complex<double>)
238+
239+
**命名空间**: `spinconstrain`
240+
241+
**关键数据成员**:
242+
- `lambda_`: 拉格朗日乘子向量(Ry/uB)
243+
- `target_mag_`: 目标磁矩(uB)
244+
- `Mi_`: 当前原子磁矩(uB)
245+
- `constrain_`: 约束标志 Vector3<int>
246+
- `nspin_`, `npol_`: 自旋/极化参数
247+
- `strategy_`: Lambda 更新策略实例
248+
249+
**Lambda 更新策略**`lambda_update_strategies.h`):
250+
- `LambdaUpdateStrategy`(抽象基类)
251+
- `LinearResponseUpdate`(Scheme B): 线性响应一步更新
252+
- `AugmentedLagrangianUpdate`(Scheme C): 增广拉格朗日
253+
- `HybridDelayedUpdate`(Scheme D): 混合延迟更新
254+
- 辅助函数: `compute_rms_error()`, `count_converged()`, `cap_lambda()`
255+
256+
**PW 基组关键方法**(本次移植新增):
257+
- `cal_Mi_pw()`: 从 PW 波函数计算原子磁矩
258+
- npol=1 (nspin=2): Mi.z += sign * weight * |becp|^2
259+
- npol=2 (nspin=4): 计算 occ[0..3] 得到 Mi.x/y/z
260+
- `calculate_delta_hcc(h_tmp, becp_k, delta_lambda, nbands, nkb, nh_iat, sign)`:
261+
- 计算 lambda 变化对 Hamiltonian 的修正
262+
- npol=2: 使用 Pauli 矩阵系数
263+
- npol=1: 仅 z 分量
264+
- `cal_mw_from_lambda(i_step, delta_lambda)`: 从 lambda 更新磁化
265+
- `update_psi_charge(delta_lambda, pw_solve)`: 更新电荷密度和波函数
266+
267+
**LCAO 基组方法**:
268+
- `cal_MW(step, print)`: 通过实空间投影计算磁矩
269+
- `cal_mi_lcao(step, print)`: cal_MW 的包装
270+
- `cal_MW_k(dm)`: 从密度矩阵计算 MW
271+
- `cal_h_lambda(h_lambda, Sloc2, column_major, isk)`: 计算 H_lambda
272+
- `run_lambda_loop(outer_step, rerun)`: Lambda 迭代主循环
273+
- `cal_escon()`: 自旋约束能量
274+
275+
**辅助函数**`basic_funcs.h`):
276+
- `maxval_abs_2d()`, `maxloc_abs_2d()`, `sum_2d()`
277+
- `scalar_multiply_2d()`, `add_scalar_multiply_2d()`, `subtract_2d()`
278+
- `fill_scalar_2d()`, `where_fill_scalar_2d()`, `where_fill_scalar_else_2d()`
279+
- `print_2d()`
280+
281+
**源文件**:
282+
| 文件 | 功能 |
283+
|------|------|
284+
| `spin_constrain.h/cpp` | 主类定义、getter/setter |
285+
| `cal_mw.cpp` | cal_MW, cal_mi_lcao, cal_Mi_pw |
286+
| `cal_mw_from_lambda.cpp` | calculate_delta_hcc, update_psi_charge |
287+
| `cal_mw_helper.cpp` | MW 计算辅助 |
288+
| `cal_h_lambda.cpp` | H_lambda 计算 |
289+
| `lambda_loop.cpp` | Lambda 迭代主循环 |
290+
| `lambda_loop_helper.cpp` | check_rms_stop 等辅助 |
291+
| `lambda_update_strategies.h/cpp` | 策略模式实现 |
292+
| `lambda_strategy_integration.cpp` | 策略集成 |
293+
| `init_sc.cpp` | 初始化 |
294+
| `basic_funcs.h/cpp` | 向量运算工具 |
295+
| `template_helpers.cpp` | double 模板特化(空实现) |
296+
| `sc_parse_json.cpp` | JSON 解析 |
297+
298+
**现有测试**:
299+
- `test/basic_test.cpp`: basic_funcs 工具函数
300+
- `test/spin_constrain_test.cpp`: SpinConstrain 基本接口
301+
- `test/lambda_update_strategies_test.cpp`: 三种策略的收敛性测试
302+
- `test/lambda_loop_helper_test.cpp`: check_rms_stop 等
303+
- `test/template_helpers_test.cpp`: double 模板特化

PP_ORB

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/root/abacus-dftu-pw-port/tests/PP_ORB

source/source_lcao/module_deltaspin/test/CMakeLists.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,10 @@ AddTest(
2929
SOURCES lambda_update_strategies_test.cpp
3030
../lambda_update_strategies.cpp
3131
)
32-
endif()
32+
33+
AddTest(
34+
TARGET deltaspin_pw_test
35+
LIBS ${math_libs} base device parameter
36+
SOURCES deltaspin_pw_test.cpp
37+
)
38+
endif()

0 commit comments

Comments
 (0)