Skip to content

Commit bb8311b

Browse files
committed
DeltaP: update user manual with BFGS inner loop and E-field output
- Document deltap_inner_nmax (0=two-phase, 3-5=BFGS inner loop) - Section 2.5: BFGS vs two-phase comparison table - Document [E-field] output with conversion formula - Simplified structure, removed redundant sections - STRU-based targets as recommended approach
1 parent c95ee79 commit bb8311b

1 file changed

Lines changed: 108 additions & 153 deletions

File tree

docs/deltap_user_manual.md

Lines changed: 108 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,14 @@ DeltaP 是 ABACUS 中的约束 DFT 模块,用于**约束原子级 Berry 相位
66

77
## 一、快速入门
88

9-
### 1.1 仅诊断(不计入 γ,不修改哈密顿量)
9+
### 1.1 仅诊断(计算 γ,不修改哈密顿量)
1010

1111
```
1212
INPUT:
1313
deltap_switch 1
1414
deltap_corr 0
1515
```
1616

17-
γ 值每 SCF 步打印一次,但不施加约束力、不影响 SCF 收敛。
18-
1917
### 1.2 约束模式 — STRU 中指定靶标(推荐)
2018

2119
**INPUT**
@@ -30,7 +28,6 @@ O
3028
0.0
3129
1
3230
6.744 7.500 8.086 dp_target -6.40 dp_constrain 1
33-
3431
H
3532
0.0
3633
2
@@ -46,196 +43,146 @@ H
4643

4744
| 参数 | 类型 | 默认 | 说明 |
4845
|------|------|------|------|
49-
| `deltap_switch` | bool | false | 启用 DeltaP。为 true 时计算每原子 Berry 相位 |
50-
| `deltap_corr` | bool | false | 启用约束哈密顿修正。为 false 时仅诊断 γ 不改变 SCF |
51-
52-
> `deltap_corr` 独立存在的原因是:用户可能只想要 γ 的诊断输出(类似于 `berry_phase=1` 的旧功能),而不希望约束力影响 SCF 收敛。对于约束 DFT 应用(PES、BEC 测量),必须设为 true。
46+
| `deltap_switch` | bool | false | 启用 DeltaP |
47+
| `deltap_corr` | bool | false | 启用约束哈密顿修正。false=仅诊断 |
5348

5449
### 2.2 计算控制
5550

5651
| 参数 | 类型 | 默认 | 说明 |
5752
|------|------|------|------|
58-
| `deltap_method` | string | berry_connection | `"berry_connection"`:Berry 联络算子路径(推荐);`"wannier"`:Wilson loop + Resta-Z 路径 |
59-
| `deltap_gdir` | int | 3 | 约束施加方向:1=x, 2=y, 3=z。三方向的 γ 均计算输出 |
60-
| `deltap_gauge_mode` | string | none | 规范固定模式。详见第三节 |
61-
| `deltap_anchor_thr` | double | 1e-8 | SMO 锚定重选的投影阈值(仅 `smo_anchored` 模式有效) |
53+
| `deltap_method` | string | berry_connection | `"berry_connection"`(推荐)、`"wannier"` |
54+
| `deltap_gdir` | int | 3 | 约束方向:1=x, 2=y, 3=z。γ 对三方向均输出 |
55+
| `deltap_rm` | double | 3.0 | SMO 重叠截断半径(Bohr) |
56+
| `deltap_gauge_mode` | string | none | 规范固定:`"none"``"smo_anchored"` |
57+
| `deltap_anchor_thr` | double | 1e-8 | 锚定重选阈值 |
6258

6359
### 2.3 λ 控制
6460

6561
| 参数 | 类型 | 默认 | 说明 |
6662
|------|------|------|------|
67-
| `deltap_lambda_init` | double | 0.0 | 初始 λ(Ry),所有原子统一 |
68-
| `deltap_lambda_step` | double | 0.01 | 梯度下降步长 |
69-
| `deltap_lambda_mixing` | double | 0.1 | 混合因子:λ = β·λ_new + (1-β)·λ_old |
70-
| `deltap_inner_nmax` | int | 0 | 内层优化最大迭代数。0=两阶段阈值模式 |
63+
| `deltap_lambda_init` | double | 0.0 | 初始 λ(Ry) |
64+
| `deltap_lambda_step` | double | 0.01 | 梯度下降步长(仅 `inner_nmax=0`|
65+
| `deltap_lambda_mixing` | double | 0.1 | 混合因子(仅 `inner_nmax=0`|
66+
| `deltap_inner_nmax` | int | 0 | **内层 BFGS 最大迭代数**。0=两阶段阈值模式;3-5=内层优化 |
67+
| `deltap_inner_thr` | double | 1e-3 | drho 阈值:触发 λ 更新 |
68+
| `deltap_conv_thr` | double | 1e-3 | 内层收敛阈值 |
7169

72-
### 2.4 两阶段阈值模式(`deltap_inner_nmax=0`
70+
### 2.4 两阶段阈值模式(`deltap_inner_nmax=0`,默认
7371

7472
```
7573
Phase 1: λ = 0, SCF 自然收敛
7674
↓ drho < deltap_inner_thr
77-
Phase 2: 一次性梯度下降更新 λ, mix_reset()
75+
Phase 2: 梯度下降更新 λ, mix_reset()
7876
7977
Phase 3: λ 冻结, SCF 带约束继续收敛
8078
```
8179

82-
| 参数 | 类型 | 默认 | 说明 |
83-
|------|------|------|------|
84-
| `deltap_inner_thr` | double | 1e-3 | Phase 1→2 切换的 drho 阈值 |
85-
| `deltap_conv_thr` | double | 1e-3 | 内层收敛阈值(仅 `deltap_inner_nmax>0` 时有效) |
80+
每次 SCF 步均需电荷密度混合——梯度步偏后需多次 SCF 修正。
8681

87-
### 2.5 约束模式
88-
89-
| 参数 | 类型 | 默认 | 说明 |
90-
|------|------|------|------|
91-
| `deltap_constraint_mode` | string | per_atom | `"per_atom"` 每原子;`"total"` 总和 Σγ |
92-
| `deltap_constraint_matrix` | string | "" | 约束矩阵文件。设置后覆盖 `constraint_mode` |
93-
94-
### 2.6 靶标指定
95-
96-
| 方式 | 说明 |
97-
|------|------|
98-
| **STRU 关键字**(推荐) | 原子行尾加 `dp_target γ_val dp_constrain 0/1` |
99-
| **target.dat 文件** | INPUT 设 `deltap_target_file target.dat` |
100-
101-
---
102-
103-
## 三、规范固定模式 (`deltap_gauge_mode`)
104-
105-
Wannier 函数的相位在 k 空间存在规范自由度:每个 k 点、每个带的波函数可以独立乘一个相位因子 `e^{iθ}`,不改变物理结果。但 Berry 联络的计算涉及相邻 k 点间波函数的内积,**相位不连续会导致离散导数发散**
106-
107-
### 3.1 模式对比
108-
109-
| 模式 | 行为 |
110-
|------|------|
111-
| `"none"` | 不固定规范。直接用原始 Kohn-Sham 波函数计算 Berry 联络。适合大部分场景(KS 波函数随 k 连续变化) |
112-
| `"smo_anchored"` |**第一条 k-string** 的每个带在每个 k 点选取投影最强的 SMO 轨道作为锚点,追踪其相位,强制波函数该分量的相位连续。详见 3.2 |
113-
114-
### 3.2 smo_anchored 算法
82+
### 2.5 内层 BFGS 优化模式(`deltap_inner_nmax=3~5`,推荐)
11583

11684
```
117-
对每个带 n:
118-
Phase 1 — k_0 确定锚点:
119-
在所有原子/轨道中,找 |D_I[iat][lm][n]| 最大的那个(即该带投影最强的 SMO)
120-
将波函数该分量的相位归一化到实数正方向
121-
122-
Phase 2 — k_1..k_{N-1} 追踪:
123-
在后续 k 点,用同样的锚点 (iat, lm) 追踪相位
124-
若锚点投影衰减到 anchor_thr 以下 → 重新搜索最强锚点
125-
126-
该规范固定仅作用于第一条 k-string,用于确定 Berry 联络所有计算的相位参考。
85+
Phase 1: λ = 0, SCF 自然收敛
86+
↓ drho < deltap_inner_thr
87+
内层: BFGS 优化 λ(冻结密度,3-5 次对角化)
88+
↓ 收敛,锁定
89+
冻结层: λ 固定,SCF 继续收敛
12790
```
12891

129-
### 3.3 适用范围
130-
131-
- `berry_connection` 方法下有效(`wannier` 方法有自己的相位处理逻辑)
132-
- 大多数体系用 `"none"` 即可。仅当遇到相位跳变导致极化异常振荡时才需开启
133-
134-
---
92+
**与两阶段对比**
13593

136-
## 四、Berry Connection vs Wannier (`deltap_method`)
94+
| | 两阶段 (nmax=0) | 内层 BFGS (nmax=3) |
95+
|---|---------------|-------------------|
96+
| λ 优化算法 | 固定步长梯度下降 | BFGS 共轭梯度(对齐 DeltaSpin) |
97+
| 每试步成本 | 全 SCF(混密),~1 次 | 仅对角化(不混密),~0.1 次 SCF |
98+
| 约束矩阵支持 |||
99+
| drho 门控 |||
100+
| 收敛后锁定 |||
137101

138-
| | berry_connection | wannier |
139-
|---|-----------------|---------|
140-
| 路径 | 有限差分 Berry 联络矩阵元 | Wilson loop(S 乘积 + 对角化)|
141-
| 额外 || + Resta-Z 电子中心位移 |
142-
| 测试状态 | ✅ 全部验证通过 | 未充分测试 |
143-
| 推荐 | **默认** | 用于交叉验证 |
102+
**推荐**:设 `deltap_inner_nmax 3`。BFGS 在 3 步内找到最优 λ,远快于两阶段模式的重收敛过程。
144103

145-
两种方法在原理上等价。`berry_connection` 直接计算 `⟨u_nk|∂_k|u_mk⟩``wannier` 通过对角化 `∏_j S(k_j,k_{j+1})` 取本征值。推荐用 `berry_connection` 作为主方法,`wannier` 作为交叉验证。
104+
### 2.6 约束模式
146105

147-
---
106+
| 参数 | 类型 | 默认 | 说明 |
107+
|------|------|------|------|
108+
| `deltap_constraint_mode` | string | per_atom | `"per_atom"` 每原子独立;`"total"` 总和 Σγ |
109+
| `deltap_constraint_matrix` | string | "" | 约束矩阵文件。设置后覆盖 `constraint_mode` |
148110

149-
## 五、STRU 靶标关键字
111+
### 2.7 靶标指定
150112

151-
### 5.1 格式
113+
| 方式 | 用法 |
114+
|------|------|
115+
| **STRU 关键字**(推荐) | 原子行尾加 `dp_target γ_val dp_constrain 0/1` |
116+
| **target.dat 文件** | INPUT 设 `deltap_target_file target.dat` |
117+
| **约束矩阵文件** | `deltap_constraint_matrix constraint.mat` |
152118

153-
`ATOMIC_POSITIONS` 的原子坐标后添加:
119+
---
154120

155-
| 关键字 | 值类型 | 默认 | 说明 |
156-
|--------|--------|------|------|
157-
| `dp_target` | double | 0.0 | 该原子的目标 Berry 相位(rad) |
158-
| `dp_constrain` | int | 1 | 0=不约束(λ 始终为 0),1=约束 |
121+
## 三、STRU 靶标关键字
159122

160-
### 5.2 示例
123+
### 3.1 格式
161124

162-
**全部约束**
163125
```
164126
B 0.0 1 0.00 0.00 0.00 dp_target 4.0 dp_constrain 1
165127
N 0.0 1 0.25 0.25 0.25 dp_target 3.5 dp_constrain 1
166128
```
167129

168-
**部分约束**(H2O 中只约束 O 和 H1,H2 自由):
169-
```
170-
O 0.0 1 6.744 7.500 8.086 dp_target -6.40 dp_constrain 1
171-
H1 0.0 1 6.744 7.500 7.043 dp_target -3.17 dp_constrain 1
172-
H2 0.0 1 8.256 7.500 8.086 dp_constrain 0
173-
```
174-
175-
> `dp_constrain=0` 的原子 λ 始终为 0,不参与 λ 更新,但其 γ 依然被计算和输出。
130+
| 关键字 || 默认 | 说明 |
131+
|--------|-----|------|------|
132+
| `dp_target` | double | 0.0 | 目标 Berry 相位(rad) |
133+
| `dp_constrain` | int | 1 | 0=自由(λ 始终 0),1=约束 |
176134

177-
### 5.3 优先规则
135+
### 3.2 优先规则
178136

179-
1. `deltap_target_file` 设了 → 从文件读(向后兼容)
180-
2. 没设 `deltap_target_file` → 从 STRU 读
181-
3. `deltap_constraint_matrix` 设了 → 覆盖上述两种方式的靶标
137+
`deltap_target_file` > STRU 关键字 > 默认 0.0
182138

183139
---
184140

185-
## 六、约束矩阵 (`deltap_constraint_matrix`)
186-
187-
约束矩阵将 DeltaP 从"每原子固定 γ_i"推广到"固定任意线性组合 Σ_j C_ij·γ_j = t_i"。
141+
## 四、约束矩阵 (`deltap_constraint_matrix`)
188142

189-
### 6.1 文件格式 (`constraint.mat`)
143+
### 4.1 文件格式
190144

191145
```
192-
m n ← m=约束数, n=原子数
193-
C_11 C_12 ... C_1n t_1
194-
C_21 C_22 ... C_2n t_2
146+
m n ← 约束数, 原子数
147+
C_11 ... C_1n t_1 ← 约束1
195148
...
149+
C_m1 ... C_mn t_m
196150
```
197151

198-
### 6.2 示例:差分约束 γ_O − γ_H1 = −3.23(H2O)
152+
### 4.2 示例:差分约束
199153

200-
**约束文件 `constraint.mat`**
201154
```
202-
1 3
203-
1 -1 0 -3.23
155+
1 3
156+
1 -1 0 -3.23 ← γ_O - γ_H1 = -3.23
204157
```
205158

206-
**约束效果**:系统被强制满足 `γ_O − γ_H1 = −3.23`。第三个原子(H2)系数为 0,不受约束。λ 只有 1 个分量(与约束数对齐),其物理意义是 O↔H1 电荷转移的"广义力"。
159+
### 4.3 速查表
207160

208-
**实测结果**(H2O,5 个靶标值):
161+
| 约束 | 矩阵 | 物理含义 |
162+
|------|------|---------|
163+
| γ_1 = t | `1 0 0 ... t` | 单原子 |
164+
| Σγ = t | `1 1 1 ... t` | 总极化 |
165+
| γ_1−γ_2 = t | `1 −1 0 ... t` | 电荷转移 |
166+
| w·γ = t | `w_1 w_2 ... t` | 加权极化 |
209167

210-
| target_diff | γ_O | γ_H1 | γ_O−γ_H1 | λ (μRy) | 偏差 |
211-
|------------|------|------|----------|---------|------|
212-
| −3.430 | −6.600 | −3.171 | **−3.429** | +0.38 | 1.4e-4 |
213-
| −3.330 | −6.495 | −3.165 | **−3.330** | +0.57 | 5.7e-4 |
214-
| −3.230 | −6.396 | −3.165 | **−3.231** | −0.89 | 9.5e-4 |
215-
| −3.130 | −6.299 | −3.171 | **−3.128** | +2.14 | 1.8e-3 |
216-
| −3.030 | −6.197 | −3.165 | **−3.032** | −1.83 | 1.8e-3 |
168+
---
217169

218-
约束被精确满足(偏差 < 2 mrad),λ 与靶标差线性相关。测量 dλ/d(Δγ) 得到原子间**电荷转移刚度**
170+
## 五、规范固定 (`deltap_gauge_mode`)
219171

220-
### 6.3 约束矩阵的行为
172+
| 模式 | 行为 |
173+
|------|------|
174+
| `"none"` | 不固定。适合大部分场景 |
175+
| `"smo_anchored"` | 对第一条 k-string 的每带选最强投影的 SMO 锚定相位。仅 `berry_connection` 方法下有效 |
221176

222-
1. **分支选择**:顺序贪心算法在每个原子上选 k-vector 使 C·γ 逼近 t
223-
2. **λ 更新**:在约束空间(m 维)做梯度下降,再转换回 per-atom 有效 λ
224-
3. **哈密顿修正**:使用 per-atom 有效 λ(与旧代码兼容):
225-
```
226-
λ_eff[iat] = Σ_α λ[α]·C[α][iat]
227-
```
228-
4. **输出**:显示每原子 γ、约束空间 C·γ、约束空间 λ
177+
---
229178

230-
### 6.4 常用约束一览
179+
## 六、Berry Connection vs Wannier
231180

232-
| 约束 || 物理含义 |
233-
|------|-----|---------|
234-
| γ_1 = t | `1 0 0 ... t` | 单原子约束 |
235-
| Σγ = t | `1 1 1 ... t` | 总极化约束 |
236-
| γ_1 − γ_2 = t | `1 −1 0 ... t` | 原子间电荷转移 |
237-
| w_1γ_1 + w_2γ_2 = t | `w_1 w_2 0 ... t` | 加权总极化 |
238-
| γ_1=t, γ_2=t' | 两行 | 多原子独立约束 |
181+
| | berry_connection | wannier |
182+
|---|-----------------|---------|
183+
| 路径 | 有限差分 Berry 联络 | Wilson loop + Resta-Z |
184+
| 测试状态 | ✅ 全部验证 | 未充分测试 |
185+
| 推荐 | 默认 | 交叉验证 |
239186

240187
---
241188

@@ -246,60 +193,68 @@ C_21 C_22 ... C_2n t_2
246193
```
247194
deltap_switch 1
248195
deltap_corr 1
196+
deltap_inner_nmax 3 ← 内层 BFGS 优化
249197
```
250198

251-
STRU 中设 `dp_target`,不同靶标各自运行 SCF,收集 (γ, E, λ)
199+
STRU 中设 `dp_target`,不同靶标各自运行 SCF。
252200

253-
### 7.2 dF/dλ BEC
201+
### 7.2 固定 λ 测力 (dF/dλ BEC)
254202

255203
```
256204
deltap_switch 1
257205
deltap_corr 1
258-
deltap_lambda_init 1e-5 ← 固定 λ
259-
deltap_lambda_step 0.0 ← 不更新 λ
206+
deltap_lambda_init 1e-5
207+
deltap_lambda_step 0.0 ← λ 不更新
208+
deltap_inner_nmax 0 ← 不用内层
260209
cal_force 1
261210
```
262211

263-
λ=0 和 λ=δλ 各运行一次,`dF/dλ → Z*`
212+
λ=0 和 λ=δλ 各运行一次,Z* = (a/π) × dF/dλ
264213

265214
### 7.3 差分约束(电荷转移刚度)
266215

267216
```
268217
deltap_constraint_matrix constraint.mat
269218
```
270219

271-
`constraint.mat``C = [1, −1, 0]`,扫描不同 t 值 → dλ/d(Δγ)。
220+
`constraint.mat` 中 C = [1, −1, 0],扫描不同 t → dλ/d(Δγ)。
221+
222+
### 7.4 诊断模式(不约束)
223+
224+
```
225+
deltap_switch 1
226+
deltap_corr 0
227+
```
272228

273229
---
274230

275231
## 八、输出说明
276232

277233
```
278234
[DeltaP P3] iter=50 γ=(3.999, 3.495) λ=(8.09e-07, -2.02e-06) |γ-t|=5.31e-03
235+
[E-field] E_eff=1.01e-5 V/Angstrom (λ_avg=-6.04e-07 Ry)
279236
```
280-
- **P1/P2/P3**:Phase 阶段
281-
- **γ=(...)**:每原子 Berry 相位(rad)
282-
- **λ=(...)**:每原子 λ(Ry)
283-
- **|γ-t|**:最大靶标偏差(rad)
284237

285-
约束矩阵模式额外显示:
286-
```
287-
C·γ=(7.494) λ=4.66e-07
288-
```
238+
- **P1/P2/P3**:Phase 阶段(仅两阶段模式)
239+
- **λ=(...)**:每原子约束力(Ry/rad)
240+
- **E_eff**:等效电场。`E_eff = -λ_avg × π / a_alpha × 51.42 V/Å`
241+
- **\|γ-t\|**:最大靶标偏差(rad)
242+
243+
约束矩阵模式额外显示 `C·γ=(...)` 和约束空间 λ。
289244

290245
---
291246

292247
## 九、与 DeltaSpin 对照
293248

294249
| 功能 | DeltaP | DeltaSpin |
295250
|------|--------|-----------|
296-
| 总开关 | `deltap_switch` | `sc_mag_switch` |
251+
| 主开关 | `deltap_switch` | `sc_mag_switch` |
297252
| 约束开关 | `deltap_corr` | switch 即约束 |
298-
| 靶标指定 | STRU `dp_target` 或文件 | STRU `mag`/`magmom` |
299-
| λ 步长 | 固定梯度 `lambda_step` | BFGS 自适应 `alpha_trial` |
300-
| λ 混合 | `lambda_mixing` ||
301-
| 内层 | `inner_nmax` | `nsc`+`nsc_min` |
253+
| 靶标 | STRU `dp_target` 或文件 | STRU `mag`/`magmom` |
254+
| λ 优化 | BFGS (nmax>0) / 梯度 (nmax=0) | BFGS (nsc>0) |
302255
| 约束组合 | `constraint_matrix` ||
303256
| 约束跳过 | `dp_constrain 0` | `sc 0 0 0` |
304-
| 加速 || `sc_acceleration_mode` |
257+
| 能量修正 | `dp_escon` | `escon` |
258+
| 内层加速 | 冻结密度对角化 | 子空间/一阶 加速 |
305259
| 扫描 || `linear_scan` |
260+
| E-field输出 |||

0 commit comments

Comments
 (0)