ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
LRI_CV_Tools.h
Go to the documentation of this file.
1//=======================
2// AUTHOR : Peize Lin
3// DATE : 2022-10-24
4//=======================
5
6#ifndef LRI_CV_TOOLS_H
7#define LRI_CV_TOOLS_H
8
9#include "Inverse_Matrix.h"
12
13#include <RI/global/Array_Operator.h>
14#include <RI/global/Tensor.h>
15#include <array>
16#include <cstddef>
17#include <map>
18#include <vector>
19
20namespace LRI_CV_Tools
21{
22template <typename Tdata>
23extern RI::Tensor<Tdata> cal_I(const RI::Tensor<Tdata>& m,
24 const typename Inverse_Matrix<Tdata>::Method method
26 const double& threshold_condition_number = 0.);
27template <typename Tdata>
28extern std::vector<std::vector<RI::Tensor<Tdata>>> cal_I(const std::vector<std::vector<RI::Tensor<Tdata>>>& ms,
29 const typename Inverse_Matrix<Tdata>::Method method
31 const double& threshold_condition_number = 0.);
32
33template <typename Tdata>
34inline RI::Tensor<Tdata> transform_Rm(const RI::Tensor<Tdata>& V);
35template <typename Tdata>
36inline std::array<RI::Tensor<Tdata>, 3> transform_Rm(const std::array<RI::Tensor<Tdata>, 3>& dV);
37
38// template<typename T> inline bool exist(const T &V);
39
40// template<typename T1, typename T2, typename Treturn>
41// extern Treturn mul1(const T1 &t1, const T2 &t2);
42// template<typename T1, typename T2, typename Treturn>
43// extern Treturn mul2(const T1 &mat, const T2 &vec);
44
45template <typename Tdata>
46inline bool exist(const RI::Tensor<Tdata>& V);
47template <typename T, std::size_t N>
48inline bool exist(const std::array<T, N>& dV);
49
50template <typename Tdata>
51extern RI::Tensor<Tdata> mul1(const RI::Tensor<Tdata>& t1, const RI::Tensor<Tdata>& t2);
52template <typename T>
53extern std::array<T, 3> mul1(const std::array<T, 3>& t1, const T& t2);
54
55template <typename Tdata>
56extern std::vector<RI::Tensor<Tdata>> mul2(const std::vector<std::vector<RI::Tensor<Tdata>>>& mat,
57 const std::vector<RI::Tensor<Tdata>>& vec);
58template <typename T1, typename T2>
59extern std::array<T2, 3> mul2(const T1& t1, const std::array<T2, 3>& t2);
60template <typename T>
61extern RI::Tensor<T> mul2(const T& t1, const RI::Tensor<T>& t2);
62template <typename T, typename TkeyA, typename TkeyB, typename Tvalue>
63extern std::map<TkeyA, std::map<TkeyB, Tvalue>> mul2(const T& t1, const std::map<TkeyA, std::map<TkeyB, Tvalue>>& t2);
64
65// template<typename T, std::size_t N>
66// std::array<T,N> operator-(const std::array<T,N> &v1, const std::array<T,N>
67// &v2); template<typename T> std::vector<T> operator-(const std::vector<T> &v1,
68// const std::vector<T> &v2);
69template <typename T, std::size_t N>
70extern std::vector<std::array<T, N>> minus(const std::vector<std::array<T, N>>& v1,
71 const std::vector<std::array<T, N>>& v2);
72template <typename TkeyA, typename TkeyB, typename Tvalue, std::size_t N>
73extern std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>, N> minus(
74 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>, N>& v1,
75 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>, N>& v2);
76template <typename TkeyA, typename TkeyB, typename Tvalue, std::size_t N>
77inline std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>> minus(
78 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v1,
79 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v2);
80template <typename TkeyA, typename TkeyB, typename Tvalue>
81extern std::map<TkeyA, std::map<TkeyB, Tvalue>> minus(std::map<TkeyA, std::map<TkeyB, Tvalue>>& v1,
82 std::map<TkeyA, std::map<TkeyB, Tvalue>>& v2);
83
84template <typename T, std::size_t N>
85extern std::vector<std::array<T, N>> add(const std::vector<std::array<T, N>>& v1,
86 const std::vector<std::array<T, N>>& v2);
87template <typename TkeyA, typename TkeyB, typename Tvalue, std::size_t N>
88extern std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>, N> add(
89 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>, N>& v1,
90 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>, N>& v2);
91template <typename TkeyA, typename TkeyB, typename Tvalue, std::size_t N>
92inline std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>> add(
93 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v1,
94 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v2);
95template <typename TkeyA, typename TkeyB, typename Tvalue>
96extern std::map<TkeyA, std::map<TkeyB, Tvalue>> add(std::map<TkeyA, std::map<TkeyB, Tvalue>>& v1,
97 std::map<TkeyA, std::map<TkeyB, Tvalue>>& v2);
98
99template <typename T, std::size_t N>
100extern std::array<T, N> negative(const std::array<T, N>& v_in);
101
102// template<typename T> T transpose12(const T &c_in);
103template <typename Tdata>
104RI::Tensor<Tdata> transpose12(const RI::Tensor<Tdata>& c_in);
105template <typename T, std::size_t N>
106std::array<T, N> transpose12(const std::array<T, N>& c_in);
107
108template <typename T, std::size_t N>
109extern std::array<std::vector<T>, N> change_order(std::vector<std::array<T, N>>&& ds_in);
110template <typename T, std::size_t N>
111std::vector<std::array<T, N>> change_order(std::array<std::vector<T>, N>&& ds_in);
112template <typename T, std::size_t N>
113extern std::array<std::vector<std::vector<T>>, N> change_order(std::vector<std::vector<std::array<T, N>>>&& ds_in);
114template <typename TkeyA, typename TkeyB, typename Tvalue, std::size_t N>
115extern std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>, N> change_order(
116 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>&& ds_in);
117template <typename TkeyA, typename TkeyB, typename Tvalue, std::size_t N>
118extern std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>> change_order(
119 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>, N>&& ds_in);
120
121template <typename Tcell>
122extern std::array<Tcell, 3> cal_latvec_range(const double& rcut_times,
123 const UnitCell& ucell,
124 const std::vector<double>& orb_cutoff);
125
126template <typename TA, typename Tcell, typename Tdata>
127extern std::map<int, std::map<int, std::map<Abfs::Vector3_Order<double>, RI::Tensor<Tdata>>>> get_CVws(
128 const UnitCell& ucell,
129 const std::map<TA, std::map<std::pair<TA, std::array<Tcell, 3>>, RI::Tensor<Tdata>>>& CVs);
130template <typename TA, typename Tcell, typename Tdata>
131extern std::map<int, std::map<int, std::map<Abfs::Vector3_Order<double>, std::array<RI::Tensor<Tdata>, 3>>>> get_dCVws(
132 const UnitCell& ucell,
133 const std::map<TA, std::map<std::pair<TA, std::array<Tcell, 3>>, std::array<RI::Tensor<Tdata>, 3>>>& dCVs);
134template <typename TA, typename TC, typename Tdata>
135extern std::array<std::array<std::map<TA, std::map<std::pair<TA, TC>, RI::Tensor<Tdata>>>, 3>, 3> cal_dMRs(
136 const UnitCell& ucell,
137 const std::array<std::map<TA, std::map<std::pair<TA, TC>, RI::Tensor<Tdata>>>, 3>& dMs);
138
139using TC = std::array<int, 3>;
140using TAC = std::pair<int, TC>;
141template <typename T>
142using TLRI = std::map<int, std::map<TAC, RI::Tensor<T>>>;
143template <typename T>
144TLRI<T> read_Cs_ao(const std::string& file_path, const double& threshold = 1e-10);
145template <typename T>
146void write_Cs_ao(const TLRI<T>& Vs, const std::string& file_path);
147template <typename T>
148TLRI<T> read_Vs_abf(const std::string& file_path, const double& threshold = 1e-10);
149template <typename T>
150void write_Vs_abf(const TLRI<T>& Vs, const std::string& file_path);
151
152template <typename T>
153struct is_std_array : std::false_type
154{
155};
156template <typename T, std::size_t N>
157struct is_std_array<std::array<T, N>> : std::true_type
158{
159};
160template <typename T>
161struct is_tensor : std::false_type
162{
163};
164template <typename T>
165struct is_tensor<RI::Tensor<T>> : std::true_type
166{
167};
168
169template <typename Tout>
170struct TinType;
171
172template <typename T>
173struct TinType<RI::Tensor<T>>
174{
175 using type = T;
176};
177
178template <typename T, std::size_t N>
179struct TinType<std::array<RI::Tensor<T>, N>>
180{
181 using type = T;
182};
183
184template <typename Tdata, typename = std::enable_if_t<!is_std_array<Tdata>::value>>
185inline void init_elem(Tdata& data, const size_t ndim0, const size_t ndim1)
186{
187 data = Tdata({ndim0, ndim1});
188};
189template <typename T, std::size_t N>
190extern void init_elem(std::array<RI::Tensor<T>, N>& data, const size_t ndim0, const size_t ndim1);
191
192template <typename Tdata, typename = std::enable_if_t<!is_std_array<Tdata>::value && !is_tensor<Tdata>::value>>
193inline void add_elem(Tdata& data, const Tdata& val, const Tdata& frac)
194{
195 data += frac * val;
196};
197template <typename T, std::size_t N>
198extern void add_elem(std::array<T, N>& data, const T& val, const T& frac);
199template <typename Tdata, typename = std::enable_if_t<is_tensor<Tdata>::value>>
200inline void add_elem(const Tdata& data,
201 const int lmp,
202 const int lmq,
203 const typename TinType<Tdata>::type& val,
204 const typename TinType<Tdata>::type& frac)
205{
206 data(lmp, lmq) += frac * val;
207};
208template <typename T, std::size_t N>
209extern void add_elem(std::array<RI::Tensor<T>, N>& data,
210 const int lmp,
211 const int lmq,
212 const std::array<T, N>& val,
213 const T& frac);
214template <typename Tdata, typename = std::enable_if_t<is_tensor<Tdata>::value>>
215inline void add_elem(Tdata& data,
216 const int lmp0,
217 const int lmq0,
218 const Tdata& val,
219 const int lmp1,
220 const int lmq1,
221 const typename TinType<Tdata>::type& frac)
222{
223 data(lmp0, lmq0) += frac * val(lmp1, lmq1);
224};
225template <typename T, std::size_t N>
226extern void add_elem(std::array<RI::Tensor<T>, N>& data,
227 const int lmp0,
228 const int lmq0,
229 const std::array<RI::Tensor<T>, N>& val,
230 const int lmp1,
231 const int lmq1,
232 const T& frac);
233
234template <typename Tout, typename Tin>
235inline RI::Tensor<Tout> convert(RI::Tensor<Tin>&& data);
236template <typename Tout, typename Tin, std::size_t N>
237extern std::array<RI::Tensor<Tout>, N> convert(std::array<RI::Tensor<Tin>, N>&& data);
238
239// template <typename T>
240// typename std::enable_if<!RI::Global_Func::is_complex<T>::value, T>::type
241// inline check_zero(T value) {
242// return (std::abs(value) < 1e-8) ? static_cast<T>(0) : value;
243// }
244
245// template <typename T>
246// typename std::enable_if<RI::Global_Func::is_complex<T>::value, T>::type
247// inline check_zero(const T& value) {
248// using RealType = typename T::value_type;
249// RealType real_part = std::real(value);
250// RealType imag_part = std::imag(value);
251
252// real_part = (std::abs(real_part) < 1e-8) ? 0 : real_part;
253// imag_part = (std::abs(imag_part) < 1e-8) ? 0 : imag_part;
254
255// return std::complex<RealType>(real_part, imag_part);
256// }
257
258// template <typename T>
259// extern RI::Tensor<T> check_zero(RI::Tensor<T>&& data);
260// template <typename T, std::size_t N>
261// extern std::array<RI::Tensor<T>, N> check_zero(std::array<RI::Tensor<T>, N>&& data);
262
263template <typename T>
264struct plus
265{
266 T operator()(const T& lhs, const T& rhs) const
267 {
268 using namespace RI::Array_Operator;
269 return lhs + rhs;
270 }
271};
272} // namespace LRI_CV_Tools
273
274#include "LRI_CV_Tools.hpp"
275#include "write_ri_cv.hpp"
276#endif
Definition Inverse_Matrix.h:15
Method
Definition Inverse_Matrix.h:18
Definition unitcell.h:17
#define N
Definition exp.cpp:24
#define T
Definition exp.cpp:237
Definition LRI_CV_Tools.h:21
std::vector< std::array< T, N > > add(const std::vector< std::array< T, N > > &v1, const std::vector< std::array< T, N > > &v2)
Definition LRI_CV_Tools.hpp:223
std::map< int, std::map< int, std::map< Abfs::Vector3_Order< double >, RI::Tensor< Tdata > > > > get_CVws(const UnitCell &ucell, const std::map< TA, std::map< std::pair< TA, std::array< Tcell, 3 > >, RI::Tensor< Tdata > > > &CVs)
Definition LRI_CV_Tools.hpp:386
std::array< std::vector< T >, N > change_order(std::vector< std::array< T, N > > &&ds_in)
Definition LRI_CV_Tools.hpp:306
TLRI< T > read_Cs_ao(const std::string &file_path, const double &threshold=1e-10)
Definition write_ri_cv.hpp:27
RI::Tensor< Tdata > transpose12(const RI::Tensor< Tdata > &c_in)
Definition LRI_CV_Tools.hpp:287
std::map< int, std::map< int, std::map< Abfs::Vector3_Order< double >, std::array< RI::Tensor< Tdata >, 3 > > > > get_dCVws(const UnitCell &ucell, const std::map< TA, std::map< std::pair< TA, std::array< Tcell, 3 > >, std::array< RI::Tensor< Tdata >, 3 > > > &dCVs)
Definition LRI_CV_Tools.hpp:413
std::vector< RI::Tensor< Tdata > > mul2(const std::vector< std::vector< RI::Tensor< Tdata > > > &mat, const std::vector< RI::Tensor< Tdata > > &vec)
Definition LRI_CV_Tools.hpp:90
std::array< Tcell, 3 > cal_latvec_range(const double &rcut_times, const UnitCell &ucell, const std::vector< double > &orb_cutoff)
Definition LRI_CV_Tools.hpp:368
RI::Tensor< Tout > convert(RI::Tensor< Tin > &&data)
Definition LRI_CV_Tools.hpp:480
std::vector< std::array< T, N > > minus(const std::vector< std::array< T, N > > &v1, const std::vector< std::array< T, N > > &v2)
Definition LRI_CV_Tools.hpp:166
void init_elem(Tdata &data, const size_t ndim0, const size_t ndim1)
Definition LRI_CV_Tools.h:185
std::map< int, std::map< TAC, RI::Tensor< T > > > TLRI
Definition LRI_CV_Tools.h:142
void add_elem(Tdata &data, const Tdata &val, const Tdata &frac)
Definition LRI_CV_Tools.h:193
RI::Tensor< Tdata > mul1(const RI::Tensor< Tdata > &t1, const RI::Tensor< Tdata > &t2)
Definition LRI_CV_Tools.hpp:67
std::pair< int, TC > TAC
Definition LRI_CV_Tools.h:140
std::array< int, 3 > TC
Definition LRI_CV_Tools.h:139
void write_Cs_ao(const TLRI< T > &Vs, const std::string &file_path)
Definition write_ri_cv.hpp:50
std::array< std::array< std::map< TA, std::map< std::pair< TA, TC >, RI::Tensor< Tdata > > >, 3 >, 3 > cal_dMRs(const UnitCell &ucell, const std::array< std::map< TA, std::map< std::pair< TA, TC >, RI::Tensor< Tdata > > >, 3 > &dMs)
Definition LRI_CV_Tools.hpp:524
RI::Tensor< Tdata > cal_I(const RI::Tensor< Tdata > &m, const typename Inverse_Matrix< Tdata >::Method method=Inverse_Matrix< Tdata >::Method::potrf, const double &threshold_condition_number=0.)
Definition LRI_CV_Tools.hpp:19
TLRI< T > read_Vs_abf(const std::string &file_path, const double &threshold=1e-10)
Definition write_ri_cv.hpp:80
RI::Tensor< Tdata > transform_Rm(const RI::Tensor< Tdata > &V)
Definition LRI_CV_Tools.hpp:41
bool exist(const RI::Tensor< Tdata > &V)
Definition LRI_CV_Tools.hpp:54
std::array< T, N > negative(const std::array< T, N > &v_in)
Definition LRI_CV_Tools.hpp:279
void write_Vs_abf(const TLRI< T > &Vs, const std::string &file_path)
Definition write_ri_cv.hpp:105
#define threshold
Definition sph_bessel_recursive_test.cpp:4
T type
Definition LRI_CV_Tools.h:175
Definition LRI_CV_Tools.h:170
Definition LRI_CV_Tools.h:154
Definition LRI_CV_Tools.h:162
Definition LRI_CV_Tools.h:265
T operator()(const T &lhs, const T &rhs) const
Definition LRI_CV_Tools.h:266