17 #ifndef QMCPLUSPLUS_LRBREAKUP_H 18 #define QMCPLUSPLUS_LRBREAKUP_H 28 template<
class BreakupBasis>
44 std::vector<TinyVector<mRealType, 2>>
KList;
73 const mRealType tolerance = std::numeric_limits<mRealType>::epsilon();
78 std::vector<mRealType> b;
80 int numElem =
Basis.NumBasisElem();
81 A.resize(numElem, numElem);
82 b.resize(numElem, 0.0);
86 #pragma omp parallel for shared(cnk) 87 for (
int n = 0;
n < numElem;
n++)
89 for (
int ki = 0; ki <
KList.size(); ki++)
97 for (
int l = 0; l < numElem; l++)
99 for (
int ki = 0; ki <
KList.size(); ki++)
101 b[l] +=
KList[ki][1] * Fk[ki] * cnk(l, ki);
102 for (
int n = 0;
n < numElem;
n++)
103 A(l,
n) +=
KList[ki][1] * cnk(l, ki) * cnk(
n, ki);
119 std::vector<mRealType> S, Sinv;
122 for (
int i = 0; i < M; i++)
124 for (
int j = 0; j <
N; j++)
125 Atrans(j, i) =
A(i, j);
133 std::vector<mRealType> WORK(LWORK);
135 LAPACK::gesvd(JOBU, JOBVT, M,
N, Atrans.
data(), LDA, &S[0], U.
data(), LDU, V.
data(), LDVT, &WORK[0], LWORK, INFO);
140 for (
int i = 0; i < ur; i++)
142 for (
int j = 0; j < uc; j++)
143 Utrans(j, i) = U(i, j);
150 for (
int i = 1; i < S.size(); i++)
151 Smax = std::max(S[i], Smax);
153 for (
int i = 0; i < S.size(); i++)
154 Sinv[i] = (S[i] < (tolerance * Smax)) ? 0.0 : (1.0 / S[i]);
156 for (
int i = 0; i < Sinv.size(); i++)
160 std::cout <<
"There were " << numSingular <<
" singular values in breakup.\n";
161 for (
int i = 0; i < numElem; i++)
164 for (
int i = 0; i < numElem; i++)
167 for (
int j = 0; j < numElem; j++)
168 coef += U(j, i) * b[j];
170 for (
int k = 0; k < numElem; k++)
171 t[k] += coef * V(k, i);
176 for (
int ki = 0; ki <
KList.size(); ki++)
179 for (
int n = 0;
n < numElem;
n++)
181 Yk -= cnk(
n, ki) * t[
n];
183 chi2 +=
KList[ki][1] * Yk * Yk;
198 const mRealType tolerance = std::numeric_limits<mRealType>::epsilon();
203 std::vector<mRealType> b;
205 int numElem =
Basis.NumBasisElem();
206 A.resize(numElem, numElem);
207 b.resize(numElem, 0.0);
210 for (
int n = 0;
n < numElem;
n++)
212 for (
int ki = 0; ki <
KList.size(); ki++)
221 for (
int l = 0; l < numElem; l++)
223 for (
int ki = 0; ki <
KList.size(); ki++)
226 b[l] += k2 *
KList[ki][1] * Fk[ki] * cnk(l, ki);
227 for (
int n = 0;
n < numElem;
n++)
228 A(l,
n) += k2 *
KList[ki][1] * cnk(l, ki) * cnk(
n, ki);
244 std::vector<mRealType> S, Sinv;
247 for (
int i = 0; i < M; i++)
249 for (
int j = 0; j <
N; j++)
250 Atrans(j, i) =
A(i, j);
258 std::vector<mRealType> WORK(LWORK);
260 LAPACK::gesvd(JOBU, JOBVT, M,
N, Atrans.
data(), LDA, &S[0], U.
data(), LDU, V.
data(), LDVT, &WORK[0], LWORK, INFO);
265 for (
int i = 0; i < ur; i++)
267 for (
int j = 0; j < uc; j++)
268 Utrans(j, i) = U(i, j);
275 for (
int i = 1; i < S.size(); i++)
276 Smax = std::max(S[i], Smax);
278 for (
int i = 0; i < S.size(); i++)
279 Sinv[i] = (S[i] < (tolerance * Smax)) ? 0.0 : (1.0 / S[i]);
281 for (
int i = 0; i < Sinv.size(); i++)
285 std::cout <<
"There were " << numSingular <<
" singular values in breakup.\n";
286 for (
int i = 0; i < numElem; i++)
289 for (
int i = 0; i < numElem; i++)
292 for (
int j = 0; j < numElem; j++)
293 coef += U(j, i) * b[j];
295 for (
int k = 0; k < numElem; k++)
296 t[k] += coef * V(k, i);
301 for (
int ki = 0; ki <
KList.size(); ki++)
305 for (
int n = 0;
n < numElem;
n++)
307 Yk -= cnk(
n, ki) * t[
n];
309 chi2 += k2 *
KList[ki][1] * Yk * Yk;
315 template<
class BreakupBasis>
320 while ((ki < KList.size()) && (
std::abs(k - KList[ki][0]) > 1.0e-12))
322 if (ki == KList.size())
325 KList.push_back(temp);
328 KList[ki][1] += degeneracy;
332 template<
class BreakupBasis>
337 kexact.
updateKLists(Basis.get_Lattice(), kcont, Basis.get_Lattice().ndim);
342 kc2 = std::max(kc2, static_cast<mRealType>(kexact.
ksq[kexact.
kshell[ks]]));
350 size_t maxkshell = ks;
351 size_t numk = kexact.
numk - kexact.
kshell[ks];
352 for (; ks < kexact.
kshell.size() - 1; ks++)
366 mRealType kelemvol = 8 * M_PI * M_PI * M_PI / Basis.get_CellVolume();
370 for (
int i = 0; i <
N; i++)
375 mRealType shellvol = 4.0 * M_PI * (k2 * k2 * k2 - k1 * k1 * k1) / 3.0;
376 mRealType degeneracy = shellvol / kelemvol;
377 AddKToList(kmid, degeneracy);
378 numk +=
static_cast<int>(degeneracy);
380 app_log() <<
" NUMBER OF OPT_BREAK KVECS = " << numk << std::endl;
388 template<
class BreakupBasis>
393 const mRealType tolerance = std::numeric_limits<mRealType>::epsilon();
399 std::vector<mRealType> b;
401 int N = Basis.NumBasisElem();
406 for (
int n = 0;
n <
N;
n++)
408 for (
int ki = 0; ki < KList.size(); ki++)
411 cnk(
n, ki) = Basis.c(
n, k);
416 for (
int l = 0; l <
N; l++)
418 for (
int ki = 0; ki < KList.size(); ki++)
420 b[l] += KList[ki][1] * Fk[ki] * cnk(l, ki);
421 for (
int n = 0;
n <
N;
n++)
422 A(l,
n) += KList[ki][1] * cnk(l, ki) * cnk(
n, ki);
427 for (
int i = 0; i <
N; i++)
433 std::vector<mRealType> bc(M, 0.0), tc(M, 0.0);
436 for (
int col = 0; col <
N; col++)
442 for (
int row = 0; row <
N; row++)
445 Ac(i, j) =
A(row, col);
453 for (
int row = 0; row <
N; row++)
454 b[row] -=
A(row, col) * t[col];
458 for (
int row = 0; row <
N; row++)
476 std::vector<mRealType> S, Sinv;
479 for (
int i = 0; i <
m; i++)
481 for (
int j = 0; j <
n; j++)
482 Atrans(j, i) = Ac(i, j);
490 std::vector<mRealType> WORK(LWORK);
492 LAPACK::gesvd(JOBU, JOBVT,
m,
n, Atrans.
data(), LDA, &S[0], U.
data(), LDU, V.
data(), LDVT, &WORK[0], LWORK, INFO);
497 for (
int i = 0; i < ur; i++)
499 for (
int j = 0; j < uc; j++)
500 Utrans(j, i) = U(i, j);
507 for (
int i = 1; i < M; i++)
508 Smax = std::max(S[i], Smax);
509 for (
int i = 0; i < M; i++)
511 std::cout <<
"negative singlar value.\n";
514 for (
int i = 0; i < M; i++)
515 Sinv[i] = (S[i] < (tolerance * Smax)) ? 0.0 : (1.0 / S[i]);
517 for (
int i = 0; i < Sinv.size(); i++)
521 std::cout <<
"There were " << numSingular <<
" singular values in breakup.\n";
523 for (
int i = 0; i < M; i++)
526 for (
int j = 0; j < M; j++)
527 coef += U(j, i) * bc[j];
529 for (
int k = 0; k < M; k++)
530 tc[k] += coef * V(k, i);
534 for (
int i = 0; i <
N; i++)
543 for (
int ki = 0; ki < KList.size(); ki++)
546 for (
int n = 0;
n <
N;
n++)
548 Yk -= cnk(
n, ki) * t[
n];
550 chi2 += KList[ki][1] * Yk * Yk;
556 template<
class BreakupBasis>
561 const mRealType tolerance = std::numeric_limits<mRealType>::epsilon();
567 std::vector<mRealType> b;
569 int N = Basis.NumBasisElem();
574 for (
int n = 0;
n <
N;
n++)
576 for (
int ki = 0; ki < KList.size(); ki++)
579 cnk(
n, ki) = Basis.c(
n, k);
584 for (
int l = 0; l <
N; l++)
586 for (
int ki = 0; ki < KList.size(); ki++)
588 mRealType k2 = KList[ki][0] * KList[ki][0];
589 b[l] += k2 * KList[ki][1] * Fk[ki] * cnk(l, ki);
590 for (
int n = 0;
n <
N;
n++)
591 A(l,
n) += k2 * KList[ki][1] * cnk(l, ki) * cnk(
n, ki);
596 for (
int i = 0; i <
N; i++)
602 std::vector<mRealType> bc(M, 0.0), tc(M, 0.0);
605 for (
int col = 0; col <
N; col++)
611 for (
int row = 0; row <
N; row++)
614 Ac(i, j) =
A(row, col);
622 for (
int row = 0; row <
N; row++)
623 b[row] -=
A(row, col) * t[col];
627 for (
int row = 0; row <
N; row++)
645 std::vector<mRealType> S, Sinv;
648 for (
int i = 0; i <
m; i++)
650 for (
int j = 0; j <
n; j++)
651 Atrans(j, i) = Ac(i, j);
659 std::vector<mRealType> WORK(LWORK);
661 LAPACK::gesvd(JOBU, JOBVT,
m,
n, Atrans.
data(), LDA, &S[0], U.
data(), LDU, V.
data(), LDVT, &WORK[0], LWORK, INFO);
666 for (
int i = 0; i < ur; i++)
668 for (
int j = 0; j < uc; j++)
669 Utrans(j, i) = U(i, j);
676 for (
int i = 1; i < M; i++)
677 Smax = std::max(S[i], Smax);
678 for (
int i = 0; i < M; i++)
680 std::cout <<
"negative singlar value.\n";
683 for (
int i = 0; i < M; i++)
684 Sinv[i] = (S[i] < (tolerance * Smax)) ? 0.0 : (1.0 / S[i]);
686 for (
int i = 0; i < Sinv.size(); i++)
690 std::cout <<
"There were " << numSingular <<
" singular values in breakup.\n";
692 for (
int i = 0; i < M; i++)
695 for (
int j = 0; j < M; j++)
696 coef += U(j, i) * bc[j];
698 for (
int k = 0; k < M; k++)
699 tc[k] += coef * V(k, i);
703 for (
int i = 0; i <
N; i++)
712 for (
int ki = 0; ki < KList.size(); ki++)
715 for (
int n = 0;
n <
N;
n++)
717 Yk -= cnk(
n, ki) * t[
n];
719 chi2 += KList[ki][0] * KList[ki][0] * KList[ki][1] * Yk * Yk;
723 template<
class BreakupBasis>
729 const mRealType tolerance = std::numeric_limits<mRealType>::epsilon();
735 std::vector<mRealType> b;
737 int N = Basis.NumBasisElem();
742 for (
int n = 0;
n <
N;
n++)
744 for (
int ki = 0; ki < KList.size(); ki++)
747 dcnk(
n, ki) = Basis.dc_dk(
n, k);
752 for (
int l = 0; l <
N; l++)
754 for (
int ki = 0; ki < KList.size(); ki++)
756 mRealType k2 = KList[ki][0] * KList[ki][0];
758 b[l] += k2 * KList[ki][1] * (dFk[ki]) * dcnk(l, ki);
759 for (
int n = 0;
n <
N;
n++)
760 A(l,
n) += k2 * KList[ki][1] * dcnk(l, ki) * dcnk(
n, ki);
765 for (
int i = 0; i <
N; i++)
771 std::vector<mRealType> bc(M, 0.0), tc(M, 0.0);
774 for (
int col = 0; col <
N; col++)
780 for (
int row = 0; row <
N; row++)
783 Ac(i, j) =
A(row, col);
791 for (
int row = 0; row <
N; row++)
792 b[row] -=
A(row, col) * t[col];
796 for (
int row = 0; row <
N; row++)
814 std::vector<mRealType> S, Sinv;
817 for (
int i = 0; i <
m; i++)
819 for (
int j = 0; j <
n; j++)
820 Atrans(j, i) = Ac(i, j);
828 std::vector<mRealType> WORK(LWORK);
830 LAPACK::gesvd(JOBU, JOBVT,
m,
n, Atrans.
data(), LDA, &S[0], U.
data(), LDU, V.
data(), LDVT, &WORK[0], LWORK, INFO);
835 for (
int i = 0; i < ur; i++)
837 for (
int j = 0; j < uc; j++)
838 Utrans(j, i) = U(i, j);
845 for (
int i = 1; i < M; i++)
846 Smax = std::max(S[i], Smax);
847 for (
int i = 0; i < M; i++)
849 std::cout <<
"negative singlar value.\n";
852 for (
int i = 0; i < M; i++)
853 Sinv[i] = (S[i] < (tolerance * Smax)) ? 0.0 : (1.0 / S[i]);
855 for (
int i = 0; i < Sinv.size(); i++)
859 std::cout <<
"There were " << numSingular <<
" singular values in breakup.\n";
861 for (
int i = 0; i < M; i++)
864 for (
int j = 0; j < M; j++)
865 coef += U(j, i) * bc[j];
867 for (
int k = 0; k < M; k++)
868 tc[k] += coef * V(k, i);
872 for (
int i = 0; i <
N; i++)
881 for (
int ki = 0; ki < KList.size(); ki++)
884 for (
int n = 0;
n <
N;
n++)
886 Yk -= dcnk(
n, ki) * t[
n];
888 chi2 += KList[ki][0] * KList[ki][0] * KList[ki][1] * Yk * Yk;
893 template<
class BreakupBasis>
902 const mRealType tolerance = std::numeric_limits<mRealType>::epsilon();
911 std::vector<mRealType> b;
912 std::vector<mRealType> bf;
913 std::vector<mRealType> bs;
918 int N = Basis.NumBasisElem();
931 for (
int n = 0;
n <
N;
n++)
933 for (
int ki = 0; ki < KList.size(); ki++)
936 cnk(
n, ki) = Basis.c(
n, k);
937 dcnk(
n, ki) = Basis.dc_dk(
n, k);
945 for (
int l = 0; l <
N; l++)
947 for (
int ki = 0; ki < KList.size(); ki++)
949 mRealType k2 = KList[ki][0] * KList[ki][0];
951 mRealType temp = KList[ki][1] * Fk[ki] * cnk(l, ki);
955 bs[l] += k2 * KList[ki][1] * dFk[ki] * dcnk(l, ki);
957 for (
int n = 0;
n <
N;
n++)
959 temp = KList[ki][1] * cnk(l, ki) * cnk(
n, ki);
961 Af(l,
n) += k2 * temp;
962 As(l,
n) += k2 * KList[ki][1] * dcnk(l, ki) * dcnk(
n, ki);
972 for (
int i = 0; i <
N; i++)
982 std::vector<mRealType> bc(M, 0.0), bfc(M, 0.0), bsc(M, 0.0), tc(M, 0.0), tfc(M, 0.0), tsc(M, 0.0);
985 for (
int col = 0; col <
N; col++)
991 for (
int row = 0; row <
N; row++)
994 Ac(i, j) =
A(row, col);
995 Afc(i, j) = Af(row, col);
996 Asc(i, j) = As(row, col);
1004 for (
int row = 0; row <
N; row++)
1006 b[row] -=
A(row, col) * t[col];
1007 bf[row] -= Af(row, col) * gt[col];
1008 bs[row] -= As(row, col) * dt[col];
1013 for (
int row = 0; row <
N; row++)
1045 std::vector<mRealType> S, Sinv;
1048 std::vector<mRealType> Sf, Sfinv;
1051 std::vector<mRealType> Ss, Ssinv;
1054 for (
int i = 0; i <
m; i++)
1056 for (
int j = 0; j <
n; j++)
1058 A_trans(j, i) = Ac(i, j);
1059 Af_trans(j, i) = Afc(i, j);
1060 As_trans(j, i) = Asc(i, j);
1069 std::vector<mRealType> WORK(LWORK);
1071 LAPACK::gesvd(JOBU, JOBVT,
m,
n, A_trans.
data(), LDA, &S[0], U.
data(), LDU, V.
data(), LDVT, &WORK[0], LWORK, INFO);
1074 LAPACK::gesvd(JOBU, JOBVT,
m,
n, Af_trans.
data(), LDA, &Sf[0], Uf.
data(), LDU, Vf.
data(), LDVT, &WORK[0], LWORK,
1078 LAPACK::gesvd(JOBU, JOBVT,
m,
n, As_trans.
data(), LDA, &Ss[0], Us.
data(), LDU, Vs.
data(), LDVT, &WORK[0], LWORK,
1087 for (
int i = 0; i < ur; i++)
1089 for (
int j = 0; j < uc; j++)
1091 U_trans(j, i) = U(i, j);
1092 Uf_trans(j, i) = Uf(i, j);
1093 Us_trans(j, i) = Us(i, j);
1109 for (
int i = 1; i < M; i++)
1110 Smax = std::max(S[i], Smax);
1111 for (
int i = 0; i < M; i++)
1113 std::cout <<
"negative singlar value.\n";
1116 for (
int i = 0; i < M; i++)
1117 Sinv[i] = (S[i] < (tolerance * Smax)) ? 0.0 : (1.0 / S[i]);
1118 int numSingular = 0;
1119 for (
int i = 0; i < Sinv.size(); i++)
1122 if (numSingular > 0)
1123 std::cout <<
"There were " << numSingular <<
" singular values in energy breakup.\n";
1128 for (
int i = 1; i < M; i++)
1129 Smax = std::max(Sf[i], Smax);
1130 for (
int i = 0; i < M; i++)
1132 std::cout <<
"negative singlar value.\n";
1134 Sfinv.resize(Sf.size());
1135 for (
int i = 0; i < M; i++)
1136 Sfinv[i] = (Sf[i] < (tolerance * Smax)) ? 0.0 : (1.0 / Sf[i]);
1138 for (
int i = 0; i < Sfinv.size(); i++)
1139 if (Sfinv[i] == 0.0)
1141 if (numSingular > 0)
1142 std::cout <<
"There were " << numSingular <<
" singular values in force breakup.\n";
1147 for (
int i = 1; i < M; i++)
1148 Smax = std::max(Ss[i], Smax);
1149 for (
int i = 0; i < M; i++)
1151 std::cout <<
"negative singlar value.\n";
1153 Ssinv.resize(Ss.size());
1154 for (
int i = 0; i < M; i++)
1155 Ssinv[i] = (Ss[i] < (tolerance * Smax)) ? 0.0 : (1.0 / Ss[i]);
1157 for (
int i = 0; i < Ssinv.size(); i++)
1158 if (Ssinv[i] == 0.0)
1160 if (numSingular > 0)
1161 std::cout <<
"There were " << numSingular <<
" singular values in strain breakup.\n";
1164 for (
int i = 0; i < M; i++)
1170 for (
int j = 0; j < M; j++)
1172 coef += U(j, i) * bc[j];
1173 coef_f += Uf(j, i) * bfc[j];
1174 coef_s += Us(j, i) * bsc[j];
1181 for (
int k = 0; k < M; k++)
1183 tc[k] += coef * V(k, i);
1184 tfc[k] += coef_f * Vf(k, i);
1185 tsc[k] += coef_s * Vs(k, i);
1190 for (
int i = 0; i <
N; i++)
1203 for (
int ki = 0; ki < KList.size(); ki++)
1209 for (
int n = 0;
n <
N;
n++)
1211 Yk -= cnk(
n, ki) * t[
n];
1212 Yk_f -= cnk(
n, ki) * gt[
n];
1213 Yk_s -= dcnk(
n, ki) * dt[
n];
1215 chi2 += KList[ki][1] * Yk * Yk;
1216 chi2_f += KList[ki][0] * KList[ki][0] * KList[ki][1] * Yk_f * Yk_f;
1217 chi2_s += KList[ki][0] * KList[ki][0] * KList[ki][1] * Yk_s * Yk_s;
1221 chisqrlist[0] = chi2;
1222 chisqrlist[1] = chi2_f;
1223 chisqrlist[2] = chi2_s;
a class that defines a supercell in D-dimensional Euclean space.
BreakupBasis & Basis
The basis to be used for breakup.
helper functions for EinsplineSetBuilder
MakeReturn< UnaryNode< FnFabs, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t abs(const Vector< T1, C1 > &l)
CrystalLattice< OHMMS_PRECISION, OHMMS_DIM > ParticleLayout
int SetupKVecs(mRealType kc, mRealType kcont, mRealType kmax)
setup KList
mRealType DoGradBreakup(mRealType *Fk, mRealType *t, mRealType *adjust)
EwaldHandler3D::mRealType mRealType
void resize(size_type n, size_type m)
Resize the container.
mRealType DoStrainBreakup(mRealType *Fk, mRealType *dFk, mRealType *t, mRealType *adjust)
void AddKToList(mRealType k, mRealType degeneracy=1.0)
static void gesvd(const char &jobu, const char &jobvt, const int &m, const int &n, float *a, const int &lda, float *s, float *u, const int &ldu, float *vt, const int &ldvt, float *work, const int &lwork, int &info)
mRealType DoGradBreakup(mRealType *Fk, mRealType *t)
void DoAllBreakup(mRealType *chisqr, mRealType *Fk, mRealType *dFk, mRealType *t, mRealType *gt, mRealType *dt, mRealType *adjust)
std::vector< int > kshell
kpts which belong to the ith-shell [kshell[i], kshell[i+1])
#define DECLARE_COULOMB_TYPES
mRealType DoBreakup(mRealType *Fk, mRealType *t, mRealType *adjust)
MakeReturn< UnaryNode< FnSqrt, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t sqrt(const Vector< T1, C1 > &l)
std::vector< RealType > ksq
squre of kpts in Cartesian coordniates
void updateKLists(const ParticleLayout &lattice, RealType kc, unsigned ndim, const PosType &twist=PosType(), bool useSphere=true)
k points sorted by the |k| excluding |k|=0
std::vector< TinyVector< mRealType, 2 > > KList
For each k, KList[k][0] = |k| and KList[k][1] = degeneracy.
mRealType DoBreakup(mRealType *Fk, mRealType *t)
LRBreakup(BreakupBasis &bref)
int numk
number of k-points