55 const bool& read_from_aims,
56 const std::vector<int>& aims_nbasis)
60 const bool use_aims_nbasis = (read_from_aims && !aims_nbasis.empty());
63 for (
auto& c1 : Cs_ao)
65 const int& iat1 = c1.first;
66 const int& it1 = ucell.
iat2it[iat1];
67 const int& nw1 = (use_aims_nbasis ? aims_nbasis[it1] : ucell.
atoms[it1].
nw);
68 if (!use_aims_nbasis) { assert(iw1 == ucell.
get_iat2iwt()[iat1]); }
70 for (
auto& c2 : c1.second)
72 const int& iat2 = c2.first.first;
73 const int& it2 = ucell.
iat2it[iat2];
74 const int& nw2 = (use_aims_nbasis ? aims_nbasis[it2] : ucell.
atoms[it2].
nw);
75 if (!use_aims_nbasis) { assert(iw2 == ucell.
get_iat2iwt()[iat2]); }
77 const auto& tensor_ao = c2.second;
78 const size_t& nabf = tensor_ao.shape[0];
79 assert(tensor_ao.shape.size() == 3);
81 std::vector<TK> psi_a1 = occ_first ?
slice_psi(wfc_ks, 0, nocc, iw1, nw1)
82 :
slice_psi(wfc_ks, nocc, nvirt, iw1, nw1);
83 std::vector<TK> psi_a2 = occ_first ?
slice_psi(wfc_ks, nocc, nvirt, iw2, nw2)
86 Cs_mo[c1.first][c2.first] = RI::Tensor<TK>({ nabf, (std::size_t)nocc, (std::size_t)nvirt });
87 for (
int iabf = 0; iabf < nabf; ++iabf)
89 const auto ptr = &tensor_ao(iabf, 0, 0);
90 std::vector<TK> tmp(nw1 * (occ_first ? nvirt : nocc));
94 container::BlasConnector::gemm(
'T',
'N', nvirt, nw1, nw2, 1.0, psi_a2.data(), nw2, ptr, nw2, 0.0, tmp.data(), nvirt);
95 container::BlasConnector::gemm(
'N',
'N', nvirt, nocc, nw1, 1.0, tmp.data(), nvirt, psi_a1.data(), nw1, 0.0, &Cs_mo[c1.first][c2.first](iabf, 0, 0), nvirt);
99 container::BlasConnector::gemm(
'T',
'N', nw1, nocc, nw2, 1.0, ptr, nw2, psi_a2.data(), nw2, 0.0, tmp.data(), nw1);
100 container::BlasConnector::gemm(
'T',
'N', nvirt, nocc, nw1, 1.0, psi_a1.data(), nw1, tmp.data(), nw1, 0.0, &Cs_mo[c1.first][c2.first](iabf, 0, 0), nvirt);
115 assert(Cs_a.size() > 0);
116 assert(Cs_b.size() > 0);
117 assert(Vs.size() > 0);
118 auto& Cs_shape = Cs_a.at(0).begin()->second.shape;
119 auto& Vs_shape = Vs.at(0).begin()->second.shape;
120 assert(Cs_shape.size() == 3);
121 assert(Cs_shape.size() == 3);
122 assert(Vs_shape.size() == 2);
124 const int& npairs = Cs_shape[1] * Cs_shape[2];
125 std::vector<TK> Amat_full(npairs * npairs, 0.0);
127 for (
auto& itv1 : Vs)
129 const int& iat1 = itv1.first;
130 for (
auto& itv2 : itv1.second)
132 const int& iat2 = itv2.first.first;
133 const auto& tensor_v = itv2.second;
134 for (
auto& itca2 : Cs_a.at(iat1))
136 const int& iat3 = itca2.first.first;
137 const auto& tensor_ca = itca2.second;
138 for (
auto& itcb2 : Cs_b.at(iat2))
140 const int& iat4 = itcb2.first.first;
141 const auto& tensor_cb = itcb2.second;
142 const int& nabf1 = tensor_v.shape[0];
143 const int& nabf2 = tensor_v.shape[1];
144 assert(tensor_ca.shape[0] == nabf1);
145 assert(tensor_cb.shape[0] == nabf2);
146 std::vector<TK> tmp(npairs * nabf1);
147 container::BlasConnector::gemm(
'T',
'T', nabf1, npairs, nabf2, 1.0, tensor_v.ptr(), nabf2, tensor_cb.ptr(), npairs, 0.0, tmp.data(), nabf1);
148 container::BlasConnector::gemm(
'N',
'N', npairs, npairs, nabf1, 2.0, tensor_ca.ptr(), npairs, tmp.data(), nabf1, 1.0, Amat_full.data(), npairs);
159 for (
auto& it1 : Cs_mo)
161 const int& iat1 = it1.first;
162 for (
auto& it2 : it1.second)
164 const int& iat2 = it2.first.first;
165 auto& tensor_c = it2.second;
166 const int& nabf = tensor_c.shape[0];
167 const int& npairs = tensor_c.shape[1] * tensor_c.shape[2];
168 std::vector<TK> CX(nabf);
169 for (
int iabf = 0;iabf < nabf;++iabf)
170 CX[iabf] = container::BlasConnector::dot(npairs, &tensor_c(iabf, 0, 0), 1, X, 1);
171 CsX[iat1][it2.first] = CX;
182 for (
auto& it1 : Cs_a_mo)
184 const int& iat1 = it1.first;
185 for (
auto& it2 : it1.second)
187 const int& iat2 = it2.first.first;
189 auto& tensor_c = it2.second;
190 const int& nabf1 = tensor_c.shape[0];
191 const int& npairs = tensor_c.shape[1] * tensor_c.shape[2];
192 for (
auto& it3 : Vs.at(iat1))
194 const int& iat3 = it3.first.first;
196 const auto& tensor_v = it3.second;
197 assert(nabf1 == tensor_v.shape[0]);
198 const size_t& nabf2 = tensor_v.shape[1];
199 std::vector<TK> tmp(nabf2 * npairs);
201 if (CV.count(iat2) && CV.at(iat2).count({ iat3, {0, 0, 0} }))
203 auto& tensor_cv = CV.at(iat2).at({ iat3, {0, 0, 0} });
204 container::BlasConnector::gemm(
'N',
'T', npairs, nabf2, nabf1, 1.0, tensor_c.ptr(), npairs, tensor_v.ptr(), nabf2, 1.0, tensor_cv.ptr(), npairs);
208 RI::Tensor<TK> tmp({ nabf2, tensor_c.shape[1], tensor_c.shape[2] });
209 container::BlasConnector::gemm(
'N',
'T', npairs, nabf2, nabf1, 1.0, tensor_c.ptr(), npairs, tensor_v.ptr(), nabf2, 0.0, tmp.ptr(), npairs);
210 CV[iat2][{iat3, { 0, 0, 0 }}] = tmp;
219 const TLRIX<TK>& Cs_bX,
224 const int& npairs = Cs_a.at(0).begin()->second.shape[1] * Cs_a.at(0).begin()->second.shape[2];
225 for (
auto& itv1 : Vs)
227 const int& iat1 = itv1.first;
228 for (
auto& itv2 : itv1.second)
230 const int& iat2 = itv2.first.first;
231 const auto& tensor_v = itv2.second;
232 for (
auto& itca2 : Cs_a.at(iat1))
234 const int& iat3 = itca2.first.first;
235 const auto& tensor_ca = itca2.second;
236 for (
auto& itcb2 : Cs_bX.at(iat2))
238 const int& iat4 = itcb2.first.first;
239 const auto& vector_cb = itcb2.second;
240 const int& nabf1 = tensor_v.shape[0];
241 const int& nabf2 = tensor_v.shape[1];
242 assert(tensor_ca.shape[0] == nabf1);
243 assert(vector_cb.size() == nabf2);
244 std::vector<TK> tmp(nabf1);
245 container::BlasConnector::gemv(
'T', nabf1, nabf2, 1.0, tensor_v.ptr(), nabf2, vector_cb.data(), 1, 0.0, tmp.data(), 1);
246 container::BlasConnector::gemv(
'N', npairs, nabf1, scale, tensor_ca.ptr(), npairs, tmp.data(), 1, 1.0, AX, 1);
255 const TLRIX<TK>& Cs_bX,
261 const int& iat1 = it1.first;
262 for (
auto& it2 : it1.second)
264 const int& iat2 = it2.first.first;
265 const auto& tensor_cv = it2.second;
266 const int& npairs = tensor_cv.shape[1] * tensor_cv.shape[2];
267 for (
auto& it3 : Cs_bX.at(iat2))
269 const int& iat3 = it3.first.first;
270 const auto& vector_cx = it3.second;
271 const int& nabf = tensor_cv.shape[0];
272 assert(vector_cx.size() == nabf);
273 container::BlasConnector::gemv(
'N', npairs, nabf, scale, tensor_cv.ptr(), npairs, vector_cx.data(), 1, 1.0, AX, 1);
282 std::vector<FPTYPE> bands;
283 std::vector<FPTYPE> bands_final;
288 for (
int i = 0;i < 6;++i) { std::getline(ifs, tmp); }
290 while (ifs.peek() != EOF) {
291 ifs >> tmp >> occ >> ene >> tmp;
292 std::cout <<
"occ=" << occ <<
", ene=" << ene << std::endl;
293 bands.push_back(ene * 2);
294 if (occ < 0.1) { ++ivirt; }
295 if (ivirt == nvirt) {
break; }
297 ncore = bands.size() - nocc - nvirt;
298 std::cout <<
"bands_final:" << std::endl;
299 for (
int i = ncore;i < bands.size();++i)
301 bands_final.push_back(bands[i]);
302 std::cout << bands[i] <<
" ";
304 std::cout << std::endl;
314 while (ifs.peek() != EOF)
316 std::getline(ifs, tmp);
317 std::stringstream ss(tmp);
318 while (std::getline(ss, tmp,
' ')) {};
319 int nbands_file = std::stoi(tmp);
320 for (
int iw = 0;iw < nbasis;++iw)
322 ifs >> tmp >> tmp >> tmp >> tmp >> tmp >> tmp;
323 for (
int ib = nbands_last; ib < nbands_file;++ib)
326 if (ib >= ncore && ib < ncore + nbands)
328 for (
int is = 0;is < wfc_ks.
get_nk();++is)
330 wfc_ks(is, ib - ncore, iw) = std::stod(tmp);
335 std::getline(ifs, tmp);
336 std::getline(ifs, tmp);
337 nbands_last = nbands_file;
340 std::cout <<
"wfc_gs_read_from_aims:" << std::endl;
341 for (
int ib = 0;ib < nbands;++ib)
343 for (
int iw = 0;iw < nbasis;++iw)
345 std::cout << wfc_ks(0, ib, iw) <<
" ";
347 std::cout << std::endl;
355 size_t nks = 0, nabf = 0, istart = 0, jstart = 0, iend = 0, jend = 0;
358 if (nks > 1) { std::cout <<
"Warning: nks>1 is not supported yet!" << std::endl; }
360 const int nat = Cs.size();
361 for (
int iat1 = 0;iat1 < nat;++iat1)
363 const size_t nabf1 = Cs.at(iat1).at({ 0, {0,0,0} }).shape[0];
364 for (
int iat2 = 0;iat2 < nat;++iat2)
368 Vs[iat1][{iat2, { 0,0,0 }}] = Vs[iat2][{iat1, { 0,0,0 }}].transpose();
371 const size_t nabf2 = Cs.at(iat2).at({ 0, {0,0,0} }).shape[0];
372 ifs >> nabf >> istart >> iend >> jstart >> jend >> tmp >> tmp;
373 assert(nabf1 == iend - istart + 1);
374 assert(nabf2 == jend - jstart + 1);
375 RI::Tensor<TR> t({ nabf1, nabf2 });
376 for (
int i = 0;i < nabf1;++i)
378 for (
int j = 0;j < nabf2;++j)
381 ifs >> t(i, j) >> tmp;
384 Vs[iat1][{iat2, { 0,0,0 }}] = t;
395 size_t nks = 0, nabf = 0, istart = 0, jstart = 0, iend = 0, jend = 0;
398 if (nks > 1) { std::cout <<
"Warning: nks>1 is not supported yet!" << std::endl; }
401 while (ifs.peek() != EOF)
403 ifs >> nabf >> istart >> iend >> jstart >> jend >> tmp >> tmp;
404 if (ifs.peek() == EOF) {
break; }
405 if (Vq.empty()) { Vq.resize(nabf * nabf, 0.0); }
406 for (
int i = istart - 1;i < iend;++i)
408 for (
int j = jstart - 1;j < jend;++j)
410 ifs >> Vq[i * nabf + j] >> tmp;
414 const int nat = Cs.size();
416 for (
int iat1 = 0;iat1 < nat;++iat1)
418 const size_t nabf1 = Cs.at(iat1).at({ 0, {0,0,0} }).shape[0];
420 for (
int iat2 = 0;iat2 < nat;++iat2)
422 const size_t nabf2 = Cs.at(iat2).at({ 0, {0,0,0} }).shape[0];
425 Vs[iat1][{iat2, { 0,0,0 }}] = Vs[iat2][{iat1, { 0,0,0 }}].transpose();
429 RI::Tensor<TR> t({ nabf1, nabf2 });
430 for (
int i = 0;i < nabf1;++i)
432 for (
int j = 0;j < nabf2;++j)
434 t(i, j) = Vq[(istart + i) * nabf + jstart + j];
437 Vs[iat1][{iat2, { 0,0,0 }}] = t;
441 assert(jstart == nabf);
444 assert(istart == nabf);
451 for (
auto& tmp1 : Vs1)
453 const int& iat1 = tmp1.first;
454 for (
auto& tmp2 : tmp1.second)
456 const int& iat2 = tmp2.first.first;
457 const RI::Tensor<TR>& t1 = tmp2.second;
458 const RI::Tensor<TR>& t2 = Vs2.at(iat1).at({ iat2, {0,0,0} });
459 if (t1.shape[0] != t2.shape[0]) {
return false; }
460 if (t1.shape[1] != t2.shape[1]) {
return false; }
461 for (
int i = 0;i < t1.shape[0];++i)
463 for (
int j = 0;j < t1.shape[1];++j)
465 if (std::abs(t1(i, j) - t2(i, j)) > thr) { std::cout <<
"element (" << i <<
", " << j <<
") are differernt: " << t1(i, j) <<
", " << t2(i, j) << std::endl;
return false; }
473 std::vector<TLRI<TR>>
split_Ds(
const std::vector<std::vector<TR>>& Ds,
const std::vector<int>& aims_nbasis,
const UnitCell& ucell)
477 std::vector<TLRI<TR>> Ds_split;
478 for (
const auto& D : Ds)
481 const int nbasis = std::sqrt(D.size());
483 for (
int iat1 = 0;iat1 < ucell.
nat;++iat1)
485 const int& it1 = ucell.
iat2it[iat1];
486 const size_t& nw1 = aims_nbasis[it1];
488 for (
int iat2 = 0;iat2 < ucell.
nat;++iat2)
490 const int& it2 = ucell.
iat2it[iat2];
491 const size_t& nw2 = aims_nbasis[it2];
492 D_split[iat1][{iat2, { 0,0,0 }}] = RI::Tensor<TR>({ nw1, nw2 });
493 for (
int i = 0;i < nw1;++i)
495 for (
int j = 0;j < nw2;++j)
497 D_split[iat1][{iat2, { 0,0,0 }}](i, j) = D[(iw1_start + i)*nbasis+(iw2_start + j)] * 0.5;
502 assert(iw2_start == nbasis);
505 assert(iw1_start == nbasis);
506 Ds_split.push_back(D_split);
std::vector< TK > slice_psi(const psi::Psi< TK > &wfc_ks, const int &ibstart, const int &nb, const int &iwstart, const int &nw)
slice the psi from wfc_ks of all the k-points, some bands, some basis functions
Definition ri_benchmark.hpp:32
TLRI< TK > cal_Cs_mo(const UnitCell &ucell, const TLRI< TR > &Cs_ao, const psi::Psi< TK > &wfc_ks, const int &nocc, const int &nvirt, const int &occ_first, const bool &read_from_aims, const std::vector< int > &aims_nbasis)
Definition ri_benchmark.hpp:49