Formula: v_eff_up(r) = v_ext(r) + v_h(r) + v_xc_up(r) v_eff_dn(r) = v_ext(r) + v_h(r) + v_xc_dn(r) v_eff_avg(r) = 0.5 * (v_eff_up(r) + v_eff_dn(r)) Example input: v_ext=1.0 eV, v_h=0.2 eV, v_xc_up=-2.7211652 eV, v_xc_dn=-8.1634956 eV Example output: v_eff_up=-1.5211652 eV, v_eff_dn=-6.9634956 eV, v_eff_avg=-4.2423304 eV
| 1255 | // Example input: v_ext=1.0 eV, v_h=0.2 eV, v_xc_up=-2.7211652 eV, v_xc_dn=-8.1634956 eV |
| 1256 | // Example output: v_eff_up=-1.5211652 eV, v_eff_dn=-6.9634956 eV, v_eff_avg=-4.2423304 eV |
| 1257 | SpinPotentialFields build_spin_potentials( |
| 1258 | const std::vector<double>& v_ext_r_ev, |
| 1259 | const std::vector<double>& v_h_r_ev, |
| 1260 | const std::vector<double>& v_xc_up_r_ev, |
| 1261 | const std::vector<double>& v_xc_dn_r_ev |
| 1262 | ) { |
| 1263 | if (v_ext_r_ev.size() != v_h_r_ev.size() |
| 1264 | || v_ext_r_ev.size() != v_xc_up_r_ev.size() |
| 1265 | || v_ext_r_ev.size() != v_xc_dn_r_ev.size()) { |
| 1266 | throw std::invalid_argument("build_spin_potentials: size mismatch"); |
| 1267 | } |
| 1268 | SpinPotentialFields out; |
| 1269 | out.v_eff_up_r.resize(v_ext_r_ev.size(), 0.0); |
| 1270 | out.v_eff_dn_r.resize(v_ext_r_ev.size(), 0.0); |
| 1271 | out.v_eff_avg_r.resize(v_ext_r_ev.size(), 0.0); |
| 1272 | out.v_smooth_electro_r.resize(v_ext_r_ev.size(), 0.0); |
| 1273 | for (std::size_t i = 0; i < v_ext_r_ev.size(); ++i) { |
| 1274 | out.v_eff_up_r[i] = sum_three_terms(v_ext_r_ev[i], v_h_r_ev[i], v_xc_up_r_ev[i]); |
| 1275 | out.v_eff_dn_r[i] = sum_three_terms(v_ext_r_ev[i], v_h_r_ev[i], v_xc_dn_r_ev[i]); |
| 1276 | out.v_eff_avg_r[i] = average_pair(out.v_eff_up_r[i], out.v_eff_dn_r[i]); |
| 1277 | out.v_smooth_electro_r[i] = v_ext_r_ev[i] + v_h_r_ev[i]; |
| 1278 | } |
| 1279 | return out; |
| 1280 | } |
| 1281 | |
| 1282 | // Formula: |
| 1283 | // rho_total(r) = rho_up_tilde(r) + rho_dn_tilde(r) + rho_aug(r) |
no test coverage detected