6#ifndef LRI_CV_TOOLS_HPP
7#define LRI_CV_TOOLS_HPP
9#include "../../source_base/mathzone.h"
14#include <RI/global/Global_Func-1.h>
15#include <RI/global/Map_Operator.h>
17template <
typename Tdata>
20 const double& threshold_condition_number)
28template <
typename Tdata>
29std::vector<std::vector<RI::Tensor<Tdata>>>
LRI_CV_Tools::cal_I(
const std::vector<std::vector<RI::Tensor<Tdata>>>& ms,
31 const double& threshold_condition_number)
36 return I.
output({ms[0][0].shape[0], ms[1][0].shape[0]}, {ms[0][0].shape[1], ms[0][1].shape[1]});
39template <
typename Tdata>
44template <
typename Tdata>
45std::array<RI::Tensor<Tdata>, 3>
47 return std::array<RI::Tensor<Tdata>, 3>{-dV[0].transpose(),
52template <
typename Tdata>
57template <
typename T, std::
size_t N>
59 for (
size_t i = 0;
i < 3; ++
i)
65template <
typename Tdata>
67 const RI::Tensor<Tdata>& t2) {
68 const size_t sa0 = t1.shape[0], sa1 = t2.shape[0], sl0 = t2.shape[1],
70 return (t1 * t2.reshape({sa1, sl0 * sl1})).reshape({sa0, sl0, sl1});
74 return std::array<T, 3>{
mul1(t1[0], t2),
mul1(t1[1], t2),
mul1(t1[2], t2)};
87template <
typename Tdata>
88std::vector<RI::Tensor<Tdata>>
90 const std::vector<RI::Tensor<Tdata>>& vec) {
91 const size_t sa0 = vec[0].shape[0], sa1 = vec[1].shape[0],
92 sl0 = vec[0].shape[1], sl1 = vec[0].shape[2];
93 const RI::Tensor<Tdata> vec0 = vec[0].reshape({sa0, sl0 * sl1}),
94 vec1 = vec[1].reshape({sa1, sl0 * sl1});
95 return std::vector<RI::Tensor<Tdata>>{
96 (mat[0][0] * vec0 + mat[0][1] * vec1).reshape({sa0, sl0, sl1}),
97 (mat[1][0] * vec0 + mat[1][1] * vec1).reshape({sa1, sl0, sl1})};
109template <
typename T1,
typename T2>
111 const std::array<T2, 3>& t2) {
112 return std::array<T2, 3>{
mul2(t1, t2[0]),
mul2(t1, t2[1]),
mul2(t1, t2[2])};
120template <
typename T,
typename TkeyA,
typename TkeyB,
typename Tvalue>
121std::map<TkeyA, std::map<TkeyB, Tvalue>>
123 const std::map<TkeyA, std::map<TkeyB, Tvalue>>& t2) {
124 std::map<TkeyA, std::map<TkeyB, Tvalue>> res;
125 for (
const auto& outerPair: t2) {
126 const TkeyA keyA = outerPair.first;
127 const std::map<TkeyB, Tvalue>& innerMap = outerPair.second;
128 std::map<TkeyB, Tvalue> newInnerMap;
130 for (
const auto& innerPair: innerMap) {
131 const TkeyB keyB = innerPair.first;
132 const Tvalue value = innerPair.second;
133 newInnerMap[keyB] =
mul2(t1, value);
136 res[keyA] = newInnerMap;
163template <
typename T, std::
size_t N>
164std::vector<std::array<T, N>>
166 const std::vector<std::array<T, N>>& v2) {
167 assert(v1.size() == v2.size());
168 std::vector<std::array<T, N>> v(v1.size());
169 for (std::size_t
i = 0;
i < v.size(); ++
i)
170 for (std::size_t j = 0; j <
N; ++j)
171 v[
i][j] = v1[
i][j] - v2[
i][j];
175template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
177 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v1,
178 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v2) {
179 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N> v1_order
181 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N> v2_order
183 auto dv =
minus(v1_order, v2_order);
187template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
189 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>& v1,
190 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>& v2) {
191 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N> dv;
192 for (
size_t i = 0;
i !=
N; ++
i)
197template <
typename TkeyA,
typename TkeyB,
typename Tvalue>
198std::map<TkeyA, std::map<TkeyB, Tvalue>>
200 std::map<TkeyA, std::map<TkeyB, Tvalue>>& v2) {
201 assert(v1.size() == v2.size());
202 using namespace RI::Map_Operator;
203 using namespace RI::Array_Operator;
205 std::map<TkeyA, std::map<TkeyB, Tvalue>> dv;
206 auto it1 = v1.begin();
207 auto it2 = v2.begin();
208 while (it1 != v1.end() && it2 != v2.end()) {
209 assert(it1->first == it2->first);
210 const TkeyA& keyA = it1->first;
211 const std::map<TkeyB, Tvalue>& map1 = it1->second;
212 const std::map<TkeyB, Tvalue>& map2 = it2->second;
213 dv[keyA] = map1 - map2;
220template <
typename T, std::
size_t N>
221std::vector<std::array<T, N>>
223 const std::vector<std::array<T, N>>& v2) {
224 assert(v1.size() == v2.size());
225 std::vector<std::array<T, N>> v(v1.size());
226 for (std::size_t
i = 0;
i < v.size(); ++
i)
227 for (std::size_t j = 0; j <
N; ++j)
228 v[
i][j] = v1[
i][j] + v2[
i][j];
232template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
234 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v1,
235 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v2) {
236 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N> v1_order
238 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N> v2_order
240 auto dv =
add(v1_order, v2_order);
244template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
246 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>& v1,
247 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>& v2) {
248 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N> dv;
249 for (
size_t i = 0;
i !=
N; ++
i)
250 dv[
i] =
add(v1[
i], v2[
i]);
254template <
typename TkeyA,
typename TkeyB,
typename Tvalue>
255std::map<TkeyA, std::map<TkeyB, Tvalue>>
257 std::map<TkeyA, std::map<TkeyB, Tvalue>>& v2) {
258 assert(v1.size() == v2.size());
259 using namespace RI::Map_Operator;
260 using namespace RI::Array_Operator;
262 std::map<TkeyA, std::map<TkeyB, Tvalue>> dv;
263 auto it1 = v1.begin();
264 auto it2 = v2.begin();
265 while (it1 != v1.end() && it2 != v2.end()) {
266 assert(it1->first == it2->first);
267 const TkeyA& keyA = it1->first;
268 const std::map<TkeyB, Tvalue>& map1 = it1->second;
269 const std::map<TkeyB, Tvalue>& map2 = it2->second;
270 dv[keyA] = map1 + map2;
277template <
typename T, std::
size_t N>
279 std::array<T, N> v_out;
280 for (std::size_t
i = 0;
i <
N; ++
i)
285template <
typename Tdata>
287 RI::Tensor<Tdata> c_out({c_in.shape[0], c_in.shape[2], c_in.shape[1]});
288 for (
size_t i0 = 0; i0 < c_in.shape[0]; ++i0)
289 for (
size_t i1 = 0; i1 < c_in.shape[1]; ++i1)
290 for (
size_t i2 = 0; i2 < c_in.shape[2]; ++i2)
291 c_out(i0, i2, i1) = c_in(i0, i1, i2);
295template <
typename T, std::
size_t N>
297 std::array<T, N> c_out;
298 for (
size_t i = 0;
i <
N; ++
i)
303template <
typename T, std::
size_t N>
304std::array<std::vector<T>,
N>
306 std::array<std::vector<T>,
N> ds;
307 for (
int ix = 0; ix <
N; ++ix) {
308 ds[ix].resize(ds_in.size());
309 for (
int iv = 0; iv < ds_in.size(); ++iv)
310 ds[ix][iv] = std::move(ds_in[iv][ix]);
315template <
typename T, std::
size_t N>
316std::vector<std::array<T, N>>
318 std::vector<std::array<T, N>> ds(ds_in[0].size());
319 for (
int ix = 0; ix <
N; ++ix) {
320 assert(ds.size() == ds_in[ix].size());
321 for (
int iv = 0; iv < ds.size(); ++iv)
322 ds[iv][ix] = std::move(ds_in[ix][iv]);
327template <
typename T, std::
size_t N>
329 std::vector<std::vector<std::array<T, N>>>&& ds_in) {
330 std::array<std::vector<std::vector<T>>,
N> ds;
331 for (
int ix = 0; ix <
N; ++ix) {
332 ds[ix].resize(ds_in.size());
333 for (
int i0 = 0; i0 < ds_in.size(); ++i0) {
334 ds[ix][i0].resize(ds_in[i0].size());
335 for (
int i1 = 0; i1 < ds_in[i0].size(); ++i1)
336 ds[ix][i0][i1] = std::move(ds_in[i0][i1][ix]);
342template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
343std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>
345 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>&& ds_in) {
346 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N> ds;
347 for (
auto& ds_A: ds_in)
348 for (
auto& ds_B: ds_A.second)
349 for (
int ix = 0; ix <
N; ++ix)
350 ds[ix][ds_A.first][ds_B.first] = std::move(ds_B.second[ix]);
354template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
355std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>
357 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>&& ds_in) {
358 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>> ds;
359 for (
int ix = 0; ix <
N; ++ix)
360 for (
auto& ds_A: ds_in[ix])
361 for (
auto& ds_B: ds_A.second)
362 ds[ds_A.first][ds_B.first][ix] = std::move(ds_B.second);
366template <
typename Tcell>
369 const std::vector<double>& orb_cutoff) {
372 Rcut_max = std::max(Rcut_max, orb_cutoff[
T]);
377 static_cast<Tcell
>(std::ceil(latvec_times.y)),
378 static_cast<Tcell
>(std::ceil(latvec_times.z))};
380 return std::array<Tcell,3>{period.
x, period.
y, period.
z};
383template<
typename TA,
typename Tcell,
typename Tdata>
384std::map<int,std::map<int,std::map<Abfs::Vector3_Order<double>,RI::Tensor<Tdata>>>>
387 const std::map<TA,std::map<std::pair<TA,std::array<Tcell,3>>,RI::Tensor<Tdata>>> &CVs)
389 std::map<int,std::map<int,std::map<Abfs::Vector3_Order<double>,RI::Tensor<Tdata>>>> CVws;
390 for(
const auto &CVs_A : CVs)
392 const TA iat0 = CVs_A.first;
393 const int it0 = ucell.
iat2it[iat0];
394 const int ia0 = ucell.
iat2ia[iat0];
396 for(
const auto &CVs_B : CVs_A.second)
398 const TA iat1 = CVs_B.first.first;
399 const int it1 = ucell.
iat2it[iat1];
400 const int ia1 = ucell.
iat2ia[iat1];
401 const std::array<int,3> &cell1 = CVs_B.first.second;
404 CVws[it0][it1][R_delta] = CVs_B.second;
410template <
typename TA,
typename Tcell,
typename Tdata>
411std::map<int, std::map<int, std::map<Abfs::Vector3_Order<double>, std::array<RI::Tensor<Tdata>, 3>>>>
LRI_CV_Tools::
413 const std::map<TA, std::map<std::pair<TA, std::array<Tcell, 3>>, std::array<RI::Tensor<Tdata>, 3>>>& dCVs)
415 std::map<int, std::map<int, std::map<Abfs::Vector3_Order<double>, std::array<RI::Tensor<Tdata>, 3>>>> dCVws;
416 for (
const auto& dCVs_A: dCVs)
418 const TA iat0 = dCVs_A.first;
419 const int it0 = ucell.
iat2it[iat0];
420 const int ia0 = ucell.
iat2ia[iat0];
422 for (
const auto& dCVs_B: dCVs_A.second)
424 const TA iat1 = dCVs_B.first.first;
425 const int it1 = ucell.
iat2it[iat1];
426 const int ia1 = ucell.
iat2ia[iat1];
427 const std::array<int, 3>& cell1 = dCVs_B.first.second;
431 dCVws[it0][it1][R_delta] = dCVs_B.second;
437template <
typename T, std::
size_t N>
440 const size_t ndim1) {
441 for (
size_t i = 0;
i <
N; ++
i) {
442 data[
i] = RI::Tensor<T>({ndim0, ndim1});
446template <
typename T, std::
size_t N>
450 for (
size_t i = 0;
i <
N; ++
i)
451 data[
i] += frac * val;
454template <
typename T, std::
size_t N>
458 const std::array<T, N>& val,
460 for (
size_t i = 0;
i <
N; ++
i) {
461 data[
i](lmp, lmq) += frac * val[
i];
465template <
typename T, std::
size_t N>
469 const std::array<RI::Tensor<T>,
N>& val,
473 for (
size_t i = 0;
i <
N; ++
i) {
474 data[
i](lmp0, lmq0) += frac * val[
i](lmp1, lmq1);
478template <
typename Tout,
typename Tin>
480 return RI::Global_Func::convert<Tout>(data);
483template <
typename Tout,
typename Tin, std::
size_t N>
484std::array<RI::Tensor<Tout>,
N>
486 std::array<RI::Tensor<Tout>,
N> out;
487 for (
size_t i = 0;
i !=
N; ++
i)
488 out[
i] = RI::Global_Func::convert<Tout>(data[
i]);
521template<
typename TA,
typename TC,
typename Tdata>
522std::array<std::array<std::map<TA,std::map<std::pair<TA,TC>,RI::Tensor<Tdata>>>,3>,3>
525 const std::array<std::map<TA,std::map<std::pair<TA,TC>,RI::Tensor<Tdata>>>,3> &dMs)
527 auto get_R_delta = [&](
const TA &iat0,
const std::pair<TA,TC> &A1) -> std::array<Tdata,3>
529 const TA iat1 = A1.first;
530 const TC &cell1 = A1.second;
531 const int it0 = ucell.
iat2it[iat0];
532 const int ia0 = ucell.
iat2ia[iat0];
533 const int it1 = ucell.
iat2it[iat1];
534 const int ia1 = ucell.
iat2ia[iat1];
538 return std::array<Tdata,3>{R_delta.
x, R_delta.
y, R_delta.
z};
540 constexpr int Npos = 3;
541 std::array<std::array<std::map<TA,std::map<std::pair<TA,TC>,RI::Tensor<Tdata>>>,Npos>,Npos> dMRs;
542 for(
int ipos0=0; ipos0<Npos; ++ipos0)
544 for(
int ipos1=0; ipos1<Npos; ++ipos1)
546 for(
const auto &dMs_A : dMs[ipos0])
548 const TA iat0 = dMs_A.first;
549 for(
const auto &dMs_B : dMs_A.second)
551 const std::pair<TA,TC> A1 = dMs_B.first;
552 const RI::Tensor<Tdata> &dM = dMs_B.second;
553 const std::array<Tdata,3> R_delta = get_R_delta(iat0, A1);
554 dMRs[ipos0][ipos1][iat0][A1] = dM * R_delta[ipos1];
const std::complex< double > i
Definition cal_pLpR.cpp:46
Definition abfs-vector3_order.h:16
std::vector< ModuleBase::Vector3< double > > tau
Definition atom_spec.h:35
Definition Inverse_Matrix.h:15
Method
Definition Inverse_Matrix.h:18
void input(const RI::Tensor< Tdata > &m)
Definition Inverse_Matrix.hpp:170
RI::Tensor< Tdata > output() const
Definition Inverse_Matrix.hpp:222
void cal_inverse(const Method &method, const double &threshold_condition_number=0.)
Definition Inverse_Matrix.hpp:20
static ModuleBase::Vector3< T > latvec_projection(const std::array< ModuleBase::Vector3< T >, 3 > &latvec)
Definition mathzone.h:167
3 elements vector
Definition vector3.h:24
T x
Definition vector3.h:26
T y
Definition vector3.h:27
T z
Definition vector3.h:28
int *& iat2it
Definition unitcell.h:75
Atom * atoms
Definition unitcell.h:45
double & lat0
Definition unitcell.h:56
ModuleBase::Matrix3 & latvec
Definition unitcell.h:63
int & ntype
Definition unitcell.h:73
ModuleBase::Vector3< double > & a2
Definition unitcell.h:64
ModuleBase::Vector3< double > & a3
Definition unitcell.h:64
int *& iat2ia
Definition unitcell.h:76
ModuleBase::Vector3< double > & a1
Definition unitcell.h:64
#define N
Definition exp.cpp:24
#define T
Definition exp.cpp:237
ModuleBase::Vector3< Tcell > array3_to_Vector3(const std::array< Tcell, 3 > &v)
Definition RI_Util.h:38