21template <
typename Tdata>
22extern RI::Tensor<Tdata>
cal_I(
const RI::Tensor<Tdata>& m);
23template <
typename Tdata>
24extern std::vector<std::vector<RI::Tensor<Tdata>>>
cal_I(
const std::vector<std::vector<RI::Tensor<Tdata>>>& ms);
26template <
typename Tdata>
27inline RI::Tensor<Tdata>
transform_Rm(
const RI::Tensor<Tdata>& V);
28template <
typename Tdata>
29inline std::array<RI::Tensor<Tdata>, 3>
transform_Rm(
const std::array<RI::Tensor<Tdata>, 3>& dV);
38template <
typename Tdata>
39inline bool exist(
const RI::Tensor<Tdata>& V);
40template <
typename T, std::
size_t N>
41inline bool exist(
const std::array<T, N>& dV);
43template <
typename Tdata>
44extern RI::Tensor<Tdata>
mul1(
const RI::Tensor<Tdata>& t1,
const RI::Tensor<Tdata>& t2);
46extern std::array<T, 3>
mul1(
const std::array<T, 3>& t1,
const T& t2);
48template <
typename Tdata>
49extern std::vector<RI::Tensor<Tdata>>
mul2(
const std::vector<std::vector<RI::Tensor<Tdata>>>& mat,
50 const std::vector<RI::Tensor<Tdata>>& vec);
51template <
typename T1,
typename T2>
52extern std::array<T2, 3>
mul2(
const T1& t1,
const std::array<T2, 3>& t2);
54extern RI::Tensor<T>
mul2(
const T& t1,
const RI::Tensor<T>& t2);
55template <
typename T,
typename TkeyA,
typename TkeyB,
typename Tvalue>
56extern std::map<TkeyA, std::map<TkeyB, Tvalue>>
mul2(
const T& t1,
const std::map<TkeyA, std::map<TkeyB, Tvalue>>& t2);
62template <
typename T, std::
size_t N>
63extern std::vector<std::array<T, N>>
minus(
const std::vector<std::array<T, N>>& v1,
64 const std::vector<std::array<T, N>>& v2);
65template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
66extern std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>
minus(
67 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>& v1,
68 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>& v2);
69template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
70inline std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>
minus(
71 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v1,
72 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v2);
73template <
typename TkeyA,
typename TkeyB,
typename Tvalue>
74extern std::map<TkeyA, std::map<TkeyB, Tvalue>>
minus(std::map<TkeyA, std::map<TkeyB, Tvalue>>& v1,
75 std::map<TkeyA, std::map<TkeyB, Tvalue>>& v2);
77template <
typename T, std::
size_t N>
78extern std::vector<std::array<T, N>>
add(
const std::vector<std::array<T, N>>& v1,
79 const std::vector<std::array<T, N>>& v2);
80template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
81extern std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>
add(
82 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>& v1,
83 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>& v2);
84template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
85inline std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>
add(
86 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v1,
87 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v2);
88template <
typename TkeyA,
typename TkeyB,
typename Tvalue>
89extern std::map<TkeyA, std::map<TkeyB, Tvalue>>
add(std::map<TkeyA, std::map<TkeyB, Tvalue>>& v1,
90 std::map<TkeyA, std::map<TkeyB, Tvalue>>& v2);
92template <
typename T, std::
size_t N>
93extern std::array<T, N>
negative(
const std::array<T, N>& v_in);
96template <
typename Tdata>
97RI::Tensor<Tdata>
transpose12(
const RI::Tensor<Tdata>& c_in);
98template <
typename T, std::
size_t N>
99std::array<T, N>
transpose12(
const std::array<T, N>& c_in);
101template <
typename T, std::
size_t N>
102extern std::array<std::vector<T>,
N>
change_order(std::vector<std::array<T, N>>&& ds_in);
103template <
typename T, std::
size_t N>
104std::vector<std::array<T, N>>
change_order(std::array<std::vector<T>,
N>&& ds_in);
105template <
typename T, std::
size_t N>
106extern std::array<std::vector<std::vector<T>>,
N>
change_order(std::vector<std::vector<std::array<T, N>>>&& ds_in);
107template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
108extern std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>
change_order(
109 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>&& ds_in);
110template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
111extern std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>
change_order(
112 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>&& ds_in);
114template <
typename Tcell>
117 const std::vector<double>& orb_cutoff);
119template <
typename TA,
typename Tcell,
typename Tdata>
120extern std::map<int, std::map<int, std::map<Abfs::Vector3_Order<double>, RI::Tensor<Tdata>>>>
get_CVws(
122 const std::map<TA, std::map<std::pair<TA, std::array<Tcell, 3>>, RI::Tensor<Tdata>>>& CVs);
123template <
typename TA,
typename Tcell,
typename Tdata>
124extern std::map<int, std::map<int, std::map<Abfs::Vector3_Order<double>, std::array<RI::Tensor<Tdata>, 3>>>>
get_dCVws(
126 const std::map<TA, std::map<std::pair<TA, std::array<Tcell, 3>>, std::array<RI::Tensor<Tdata>, 3>>>& dCVs);
127template <
typename TA,
typename TC,
typename Tdata>
128extern std::array<std::array<std::map<TA, std::map<std::pair<TA, TC>, RI::Tensor<Tdata>>>, 3>, 3>
cal_dMRs(
130 const std::array<std::map<TA, std::map<std::pair<TA, TC>, RI::Tensor<Tdata>>>, 3>& dMs);
132using TC = std::array<int, 3>;
133using TAC = std::pair<int, TC>;
135using TLRI = std::map<int, std::map<TAC, RI::Tensor<T>>>;
149template <
typename T, std::
size_t N>
162template <
typename Tout>
171template <
typename T, std::
size_t N>
177template <typename Tdata, typename = std::enable_if_t<!is_std_array<Tdata>::value>>
178inline void init_elem(Tdata& data,
const size_t ndim0,
const size_t ndim1)
180 data = Tdata({ndim0, ndim1});
182template <
typename T, std::
size_t N>
183extern void init_elem(std::array<RI::Tensor<T>,
N>& data,
const size_t ndim0,
const size_t ndim1);
185template <typename Tdata, typename = std::enable_if_t<!is_std_array<Tdata>::value && !is_tensor<Tdata>::value>>
186inline void add_elem(Tdata& data,
const Tdata& val,
const Tdata& frac)
190template <
typename T, std::
size_t N>
191extern void add_elem(std::array<T, N>& data,
const T& val,
const T& frac);
192template <typename Tdata, typename = std::enable_if_t<is_tensor<Tdata>::value>>
199 data(lmp, lmq) += frac * val;
201template <
typename T, std::
size_t N>
202extern void add_elem(std::array<RI::Tensor<T>,
N>& data,
205 const std::array<T, N>& val,
207template <typename Tdata, typename = std::enable_if_t<is_tensor<Tdata>::value>>
216 data(lmp0, lmq0) += frac * val(lmp1, lmq1);
218template <
typename T, std::
size_t N>
219extern void add_elem(std::array<RI::Tensor<T>,
N>& data,
222 const std::array<RI::Tensor<T>,
N>& val,
227template <
typename Tout,
typename Tin>
228inline RI::Tensor<Tout>
convert(RI::Tensor<Tin>&& data);
229template <
typename Tout,
typename Tin, std::
size_t N>
230extern std::array<RI::Tensor<Tout>,
N>
convert(std::array<RI::Tensor<Tin>,
N>&& data);
261 using namespace RI::Array_Operator;