ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
ri_benchmark.hpp
Go to the documentation of this file.
1#pragma once
2#include "ri_benchmark.h"
4namespace RI_Benchmark
5{
6 // std::cout << "the size of Cs:" << std::endl;
7 // for (auto& it1: Cs)
8 // {
9 // for (auto& it2: it1.second)
10 // {
11 // std::cout << "iat1=" << it1.first << ", iat2= " << it2.first.first << std::endl;
12 // auto& ts = it2.second.shape;
13 // std::cout << "Tensor shape:" << ts[0] << " " << ts[1] << " " << ts[2] << std::endl; // abf, nw1, nw2
14 // }
15 // }
16
17 template <typename TR>
18 inline int count_nao_from_Cs(const TLRI<TR>& Cs_ao)
19 {
20 int naos = 0;
21 for (const auto& it2 : Cs_ao.at(0))
22 {
23 assert(it2.second.shape.size() == 3);
24 naos += it2.second.shape[2];
25 }
26 return naos;
27 }
28
31 template <typename TK>
32 inline std::vector<TK> slice_psi(const psi::Psi<TK>& wfc_ks,
33 const int& ibstart,
34 const int& nb,
35 const int& iwstart,
36 const int& nw)
37 {
38 std::vector<TK> psi_slice(wfc_ks.get_nk() * nb * nw);
39 int i = 0;
40 for (int ik = 0; ik < wfc_ks.get_nk(); ++ik)
41 for (int ib = ibstart; ib < ibstart + nb; ++ib)
42 for (int iw = iwstart; iw < iwstart + nw; ++iw)
43 psi_slice[i++] = wfc_ks(ik, ib, iw);
44 assert(i == psi_slice.size());
45 return psi_slice;
46 }
47
48 template <typename TK, typename TR>
50 const TLRI<TR>& Cs_ao,
51 const psi::Psi<TK>& wfc_ks,
52 const int& nocc,
53 const int& nvirt,
54 const int& occ_first,
55 const bool& read_from_aims,
56 const std::vector<int>& aims_nbasis)
57 {
58 // assert(wfc_ks.get_nk() == 1); // currently only gamma-only is supported
59 assert(nocc + nvirt <= wfc_ks.get_nbands());
60 const bool use_aims_nbasis = (read_from_aims && !aims_nbasis.empty());
61 TLRI<TK> Cs_mo;
62 int iw1 = 0;
63 for (auto& c1 : Cs_ao)
64 {
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]); }
69 int iw2 = 0;
70 for (auto& c2 : c1.second)
71 {
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]); }
76
77 const auto& tensor_ao = c2.second;
78 const size_t& nabf = tensor_ao.shape[0];
79 assert(tensor_ao.shape.size() == 3); // abf, nw1, nw2
80
81 std::vector<TK> psi_a1 = occ_first ? slice_psi(wfc_ks, 0, nocc, iw1, nw1) //occ
82 : slice_psi(wfc_ks, nocc, nvirt, iw1, nw1); // virt
83 std::vector<TK> psi_a2 = occ_first ? slice_psi(wfc_ks, nocc, nvirt, iw2, nw2) //virt
84 : slice_psi(wfc_ks, 0, nocc, iw2, nw2); // occ
85
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)
88 {
89 const auto ptr = &tensor_ao(iabf, 0, 0);
90 std::vector<TK> tmp(nw1 * (occ_first ? nvirt : nocc));
91 // caution: Cs are row-major (ia2 contiguous)
92 if (occ_first)
93 {
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);
96 }
97 else
98 {
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);
101 }
102 }
103 iw2 += nw2;
104 }
105 iw1 += nw1;
106 }
107 return Cs_mo;
108 }
109
110 template <typename TK, typename TR>
111 std::vector<TK> cal_Amat_full(const TLRI<TK>& Cs_a,
112 const TLRI<TK>& Cs_b,
113 const TLRI<TR>& Vs)
114 {
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); // abf, nocc, nvirt
121 assert(Cs_shape.size() == 3); // abf, nocc, nvirt
122 assert(Vs_shape.size() == 2); // abf, abf
123
124 const int& npairs = Cs_shape[1] * Cs_shape[2];
125 std::vector<TK> Amat_full(npairs * npairs, 0.0);
126
127 for (auto& itv1 : Vs)
128 {
129 const int& iat1 = itv1.first;
130 for (auto& itv2 : itv1.second)
131 {
132 const int& iat2 = itv2.first.first;
133 const auto& tensor_v = itv2.second; // (nabf2, nabf1), T
134 for (auto& itca2 : Cs_a.at(iat1))
135 {
136 const int& iat3 = itca2.first.first;
137 const auto& tensor_ca = itca2.second; // (nvirt*nocc, nabf1), N
138 for (auto& itcb2 : Cs_b.at(iat2))
139 {
140 const int& iat4 = itcb2.first.first;
141 const auto& tensor_cb = itcb2.second; // (nvirt*nocc, nabf2), T
142 const int& nabf1 = tensor_v.shape[0];
143 const int& nabf2 = tensor_v.shape[1];
144 assert(tensor_ca.shape[0] == nabf1); //abf1
145 assert(tensor_cb.shape[0] == nabf2); //abf2
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/*Hartree to Ry*/, tensor_ca.ptr(), npairs, tmp.data(), nabf1, 1.0, Amat_full.data(), npairs);
149 }
150 }
151 }
152 }
153 return Amat_full;
154 }
155 template <typename TK>
156 TLRIX<TK> cal_CsX(const TLRI<TK>& Cs_mo, const TK* X)
157 {
158 TLRIX<TK> CsX;
159 for (auto& it1 : Cs_mo)
160 {
161 const int& iat1 = it1.first;
162 for (auto& it2 : it1.second)
163 {
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;
172 }
173 }
174 return CsX;
175 }
176
177 template <typename TK, typename TR>
178 TLRI<TK> cal_CV(const TLRI<TK>& Cs_a_mo,
179 const TLRI<TR>& Vs)
180 {
181 TLRI<TK> CV;
182 for (auto& it1 : Cs_a_mo) //the atom on which ABFs locate
183 {
184 const int& iat1 = it1.first;
185 for (auto& it2 : it1.second)
186 {
187 const int& iat2 = it2.first.first;
188 // const auto& Rc=it2.first.second;
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))
193 {
194 const int& iat3 = it3.first.first;
195 // const auto& Rv=it3.first.second;
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);
200 // const auto& Rcv = (Rv - Rc) % period;
201 if (CV.count(iat2) && CV.at(iat2).count({ iat3, {0, 0, 0} })) // add-up, sum over iat1
202 {
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);
205 }
206 else
207 {
208 RI::Tensor<TK> tmp({ nabf2, tensor_c.shape[1], tensor_c.shape[2] }); // (nabf2, nocc, nvirt)
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;
211 }
212 }
213 }
214 }
215 return CV;
216 }
217 template <typename TK, typename TR>
218 void cal_AX(const TLRI<TK>& Cs_a,
219 const TLRIX<TK>& Cs_bX,
220 const TLRI<TR>& Vs,
221 TK* AX,
222 const double& scale)
223 {
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)
226 {
227 const int& iat1 = itv1.first;
228 for (auto& itv2 : itv1.second)
229 {
230 const int& iat2 = itv2.first.first;
231 const auto& tensor_v = itv2.second; // (nabf2, nabf1), T
232 for (auto& itca2 : Cs_a.at(iat1))
233 {
234 const int& iat3 = itca2.first.first;
235 const auto& tensor_ca = itca2.second; // (nvirt*nocc, nabf1), N
236 for (auto& itcb2 : Cs_bX.at(iat2))
237 {
238 const int& iat4 = itcb2.first.first;
239 const auto& vector_cb = itcb2.second; // (nvirt*nocc, nabf2), T
240 const int& nabf1 = tensor_v.shape[0];
241 const int& nabf2 = tensor_v.shape[1];
242 assert(tensor_ca.shape[0] == nabf1); //abf1
243 assert(vector_cb.size() == nabf2); //abf2
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/*Hartree to Ry; singlet*/, tensor_ca.ptr(), npairs, tmp.data(), 1, 1.0, AX, 1);
247 }
248 }
249 }
250 }
251 }
252
253 template <typename TK>
254 void cal_AX(const TLRI<TK>& CV,
255 const TLRIX<TK>& Cs_bX,
256 TK* AX,
257 const double& scale)
258 {
259 for (auto& it1 : CV)
260 {
261 const int& iat1 = it1.first;
262 for (auto& it2 : it1.second)
263 {
264 const int& iat2 = it2.first.first;
265 const auto& tensor_cv = it2.second; // (nabf, nocc, nvirt)
266 const int& npairs = tensor_cv.shape[1] * tensor_cv.shape[2];
267 for (auto& it3 : Cs_bX.at(iat2))
268 {
269 const int& iat3 = it3.first.first;
270 const auto& vector_cx = it3.second; // (nabf)
271 const int& nabf = tensor_cv.shape[0];
272 assert(vector_cx.size() == nabf); //abf on at2
273 container::BlasConnector::gemv('N', npairs, nabf, scale/*Hartree to Ry; singlet*/, tensor_cv.ptr(), npairs, vector_cx.data(), 1, 1.0, AX, 1);
274 }
275 }
276 }
277 }
278
279 template <typename FPTYPE>
280 std::vector<FPTYPE> read_aims_ebands(const std::string& file, const int nocc, const int nvirt, int& ncore)
281 {
282 std::vector<FPTYPE> bands;
283 std::vector<FPTYPE> bands_final;
284 std::ifstream ifs;
285 ifs.open(file);
286 std::string tmp;
287 FPTYPE ene, occ;
288 for (int i = 0;i < 6;++i) { std::getline(ifs, tmp); } // skip the first 6 lines
289 int ivirt = 0;
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);//Hartree to Ry
294 if (occ < 0.1) { ++ivirt; }
295 if (ivirt == nvirt) { break; }
296 }
297 ncore = bands.size() - nocc - nvirt;
298 std::cout << "bands_final:" << std::endl;
299 for (int i = ncore;i < bands.size();++i)
300 {
301 bands_final.push_back(bands[i]);
302 std::cout << bands[i] << " ";
303 }
304 std::cout << std::endl;
305 return bands_final;
306 }
307 template <typename TK>
308 void read_aims_eigenvectors(psi::Psi<TK>& wfc_ks, const std::string& file, const int ncore, const int nbands, const int nbasis)
309 {
310 std::ifstream ifs;
311 ifs.open(file);
312 std::string tmp;
313 int nbands_last = 0;
314 while (ifs.peek() != EOF)
315 {
316 std::getline(ifs, tmp); //the first line
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)
321 {
322 ifs >> tmp >> tmp >> tmp >> tmp >> tmp >> tmp; //useless cols
323 for (int ib = nbands_last; ib < nbands_file;++ib)
324 {
325 ifs >> tmp;
326 if (ib >= ncore && ib < ncore + nbands)
327 {
328 for (int is = 0;is < wfc_ks.get_nk();++is)
329 { //only for gamma_only and spin degenerate
330 wfc_ks(is, ib - ncore, iw) = std::stod(tmp);
331 }
332 }
333 }
334 }
335 std::getline(ifs, tmp); // the interval line between two blocks
336 std::getline(ifs, tmp); // the interval line between two blocks
337 nbands_last = nbands_file;
338 }
339 // output wfc
340 std::cout << "wfc_gs_read_from_aims:" << std::endl;
341 for (int ib = 0;ib < nbands;++ib)
342 {
343 for (int iw = 0;iw < nbasis;++iw)
344 {
345 std::cout << wfc_ks(0, ib, iw) << " ";
346 }
347 std::cout << std::endl;
348 }
349 }
350 template < typename TR> // only for blocking by atom pairs
351 TLRI<TR> read_coulomb_mat(const std::string& file, const TLRI<TR>& Cs)
352 { //for gamma_only, V(q)=V(R=0)
353 std::ifstream ifs;
354 ifs.open(file);
355 size_t nks = 0, nabf = 0, istart = 0, jstart = 0, iend = 0, jend = 0;
356 std::string tmp;
357 ifs >> nks;// nkstot=1
358 if (nks > 1) { std::cout << "Warning: nks>1 is not supported yet!" << std::endl; }
359 TLRI<TR> Vs;
360 const int nat = Cs.size();
361 for (int iat1 = 0;iat1 < nat;++iat1)
362 {
363 const size_t nabf1 = Cs.at(iat1).at({ 0, {0,0,0} }).shape[0];
364 for (int iat2 = 0;iat2 < nat;++iat2)
365 {
366 if (iat1 > iat2)
367 { // coulomb_mat has only the upper triangle part
368 Vs[iat1][{iat2, { 0,0,0 }}] = Vs[iat2][{iat1, { 0,0,0 }}].transpose();
369 continue;
370 }
371 const size_t nabf2 = Cs.at(iat2).at({ 0, {0,0,0} }).shape[0];
372 ifs >> nabf >> istart >> iend >> jstart >> jend >> tmp /*ik*/ >> tmp/*wk*/;
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)
377 {
378 for (int j = 0;j < nabf2;++j)
379 {
380 // t(i, j) = Vq[(istart + i) * nabf + jstart + j];
381 ifs >> t(i, j) >> tmp;
382 }
383 }
384 Vs[iat1][{iat2, { 0,0,0 }}] = t;
385 }
386 }
387 return Vs;
388 }
389
390 template < typename TR> // any blocking
391 TLRI<TR> read_coulomb_mat_general(const std::string& file, const TLRI<TR>& Cs)
392 { //for gamma_only, V(q)=V(R=0)
393 std::ifstream ifs;
394 ifs.open(file);
395 size_t nks = 0, nabf = 0, istart = 0, jstart = 0, iend = 0, jend = 0;
396 std::string tmp;
397 ifs >> nks;// nkstot=1
398 if (nks > 1) { std::cout << "Warning: nks>1 is not supported yet!" << std::endl; }
399 TLRI<TR> Vs;
400 std::vector<TR> Vq;
401 while (ifs.peek() != EOF)
402 {
403 ifs >> nabf >> istart >> iend >> jstart >> jend >> tmp /*ik*/ >> tmp/*wk*/;
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)
407 {
408 for (int j = jstart - 1;j < jend;++j)
409 {
410 ifs >> Vq[i * nabf + j] >> tmp;
411 }
412 }
413 }
414 const int nat = Cs.size();
415 istart = 0; //
416 for (int iat1 = 0;iat1 < nat;++iat1)
417 {
418 const size_t nabf1 = Cs.at(iat1).at({ 0, {0,0,0} }).shape[0];
419 jstart = 0;
420 for (int iat2 = 0;iat2 < nat;++iat2)
421 {
422 const size_t nabf2 = Cs.at(iat2).at({ 0, {0,0,0} }).shape[0];
423 if (iat1 > iat2)
424 { // coulomb_mat has only the upper triangle part
425 Vs[iat1][{iat2, { 0,0,0 }}] = Vs[iat2][{iat1, { 0,0,0 }}].transpose();
426 }
427 else
428 {
429 RI::Tensor<TR> t({ nabf1, nabf2 });
430 for (int i = 0;i < nabf1;++i)
431 {
432 for (int j = 0;j < nabf2;++j)
433 {
434 t(i, j) = Vq[(istart + i) * nabf + jstart + j];
435 }
436 }
437 Vs[iat1][{iat2, { 0,0,0 }}] = t;
438 }
439 jstart += nabf2;
440 }
441 assert(jstart == nabf);
442 istart += nabf1;
443 }
444 assert(istart == nabf);
445 return Vs;
446 }
447
448 template < typename TR>
449 bool compare_Vs(const TLRI<TR>& Vs1, const TLRI<TR>& Vs2, const double thr)
450 {
451 for (auto& tmp1 : Vs1)
452 {
453 const int& iat1 = tmp1.first;
454 for (auto& tmp2 : tmp1.second)
455 {
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)
462 {
463 for (int j = 0;j < t1.shape[1];++j)
464 {
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; }
466 }
467 }
468 }
469 }
470 return true;
471 }
472 template <typename TR>
473 std::vector<TLRI<TR>> split_Ds(const std::vector<std::vector<TR>>& Ds, const std::vector<int>& aims_nbasis, const UnitCell& ucell)
474 {
475 // Due to the hard-coded constructor of elecstate::DensityMatrix, singlet-triplet with nspin=2 cannot use DM_trans with size 1
476 // if(Ds.size()>1) { throw std::runtime_error("split_Ds only supports gamma-only spin-1 Ds now."); }
477 std::vector<TLRI<TR>> Ds_split;
478 for (const auto& D : Ds)
479 {
480 TLRI<TR> D_split;
481 const int nbasis = std::sqrt(D.size());
482 int iw1_start = 0;
483 for (int iat1 = 0;iat1 < ucell.nat;++iat1)
484 {
485 const int& it1 = ucell.iat2it[iat1];
486 const size_t& nw1 = aims_nbasis[it1];
487 int iw2_start = 0;
488 for (int iat2 = 0;iat2 < ucell.nat;++iat2)
489 {
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)
494 {
495 for (int j = 0;j < nw2;++j)
496 {
497 D_split[iat1][{iat2, { 0,0,0 }}](i, j) = D[(iw1_start + i)*nbasis+(iw2_start + j)] * 0.5; // consistent with split_m2D_ktoR
498 }
499 }
500 iw2_start += nw2;
501 }
502 assert(iw2_start == nbasis);
503 iw1_start += nw1;
504 }
505 assert(iw1_start == nbasis);
506 Ds_split.push_back(D_split);
507 }
508 return Ds_split;
509 }
510}
int nw
Definition atom_spec.h:23
Definition unitcell.h:16
int *& iat2it
Definition unitcell.h:47
Atom * atoms
Definition unitcell.h:18
int & nat
Definition unitcell.h:46
const int * get_iat2iwt() const
Definition unitcell.h:74
Definition psi.h:37
const int & get_nbands() const
Definition psi.cpp:342
const int & get_nk() const
Definition psi.cpp:336
Definition operator_ri_hartree.h:6
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< TR > read_coulomb_mat_general(const std::string &file, const TLRI< TR > &Cs)
Definition ri_benchmark.hpp:391
void cal_AX(const TLRI< TK > &Cs_a, const TLRIX< TK > &Cs_bX, const TLRI< TR > &Vs, TK *AX, const double &scale)
Definition ri_benchmark.hpp:218
TLRIX< TK > cal_CsX(const TLRI< TK > &Cs_mo, const TK *X)
Definition ri_benchmark.hpp:156
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
std::vector< TLRI< TR > > split_Ds(const std::vector< std::vector< TR > > &Ds, const std::vector< int > &aims_nbasis, const UnitCell &ucell)
Definition ri_benchmark.hpp:473
std::vector< TK > cal_Amat_full(const TLRI< TK > &Cs_a, const TLRI< TK > &Cs_b, const TLRI< TR > &Vs)
Definition ri_benchmark.hpp:111
TLRI< TK > cal_CV(const TLRI< TK > &Cs_a_mo, const TLRI< TR > &Vs)
Definition ri_benchmark.hpp:178
std::vector< FPTYPE > read_aims_ebands(const std::string &file, const int nocc, const int nvirt, int &ncore)
Definition ri_benchmark.hpp:280
TLRI< TR > read_coulomb_mat(const std::string &file, const TLRI< TR > &Cs)
Definition ri_benchmark.hpp:351
int count_nao_from_Cs(const TLRI< TR > &Cs_ao)
Definition ri_benchmark.hpp:18
bool compare_Vs(const TLRI< TR > &Vs1, const TLRI< TR > &Vs2, const double thr)
Definition ri_benchmark.hpp:449
void read_aims_eigenvectors(psi::Psi< TK > &wfc_ks, const std::string &file, const int ncore, const int nbands, const int nbasis)
Definition ri_benchmark.hpp:308
std::map< int, std::map< TAC, RI::Tensor< T > > > TLRI
Definition ri_cv_io_test.cpp:12
file(GLOB ATen_CORE_SRCS "*.cpp") set(ATen_CPU_SRCS $
Definition CMakeLists.txt:1