| 2918 | } |
| 2919 | |
| 2920 | double density_weighted_average_spin( |
| 2921 | const std::vector<double>& rho_up_r, |
| 2922 | const std::vector<double>& rho_dn_r, |
| 2923 | const std::vector<double>& v_up_r, |
| 2924 | const std::vector<double>& v_dn_r, |
| 2925 | double dv |
| 2926 | ) { |
| 2927 | if (rho_up_r.size() != rho_dn_r.size() |
| 2928 | || rho_up_r.size() != v_up_r.size() |
| 2929 | || rho_up_r.size() != v_dn_r.size()) { |
| 2930 | throw std::invalid_argument("density_weighted_average_spin: size mismatch"); |
| 2931 | } |
| 2932 | double rho_int = 0.0; |
| 2933 | double rho_v_int = 0.0; |
| 2934 | for (std::size_t i = 0; i < rho_up_r.size(); ++i) { |
| 2935 | const double rho_up = std::max(0.0, rho_up_r[i]); |
| 2936 | const double rho_dn = std::max(0.0, rho_dn_r[i]); |
| 2937 | rho_int += (rho_up + rho_dn) * dv; |
| 2938 | rho_v_int += (rho_up * v_up_r[i] + rho_dn * v_dn_r[i]) * dv; |
| 2939 | } |
| 2940 | if (!(rho_int > 1e-14)) { |
| 2941 | return 0.0; |
| 2942 | } |
| 2943 | return rho_v_int / rho_int; |
| 2944 | } |
| 2945 | |
| 2946 | OverlapNormMetrics compute_overlap_norm_metrics( |
| 2947 | const std::vector<NonlocalMatvecOp>& overlap_ops_by_k, |
no test coverage detected