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
11
12#include <RI/global/Array_Operator.h>
13#include <RI/global/Tensor.h>
14#include <array>
15#include <cstddef>
16#include <map>
17#include <vector>
18
19namespace LRI_CV_Tools
20{
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);
25
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);
30
31// template<typename T> inline bool exist(const T &V);
32
33// template<typename T1, typename T2, typename Treturn>
34// extern Treturn mul1(const T1 &t1, const T2 &t2);
35// template<typename T1, typename T2, typename Treturn>
36// extern Treturn mul2(const T1 &mat, const T2 &vec);
37
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);
42
43template <typename Tdata>
44extern RI::Tensor<Tdata> mul1(const RI::Tensor<Tdata>& t1, const RI::Tensor<Tdata>& t2);
45template <typename T>
46extern std::array<T, 3> mul1(const std::array<T, 3>& t1, const T& t2);
47
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);
53template <typename T>
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);
57
58// template<typename T, std::size_t N>
59// std::array<T,N> operator-(const std::array<T,N> &v1, const std::array<T,N>
60// &v2); template<typename T> std::vector<T> operator-(const std::vector<T> &v1,
61// const std::vector<T> &v2);
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);
76
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);
91
92template <typename T, std::size_t N>
93extern std::array<T, N> negative(const std::array<T, N>& v_in);
94
95// template<typename T> T transpose12(const T &c_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);
100
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);
113
114template <typename Tcell>
115extern std::array<Tcell, 3> cal_latvec_range(const double& rcut_times,
116 const UnitCell& ucell,
117 const std::vector<double>& orb_cutoff);
118
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(
121 const UnitCell& ucell,
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(
125 const UnitCell& ucell,
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(
129 const UnitCell& ucell,
130 const std::array<std::map<TA, std::map<std::pair<TA, TC>, RI::Tensor<Tdata>>>, 3>& dMs);
131
132using TC = std::array<int, 3>;
133using TAC = std::pair<int, TC>;
134template <typename T>
135using TLRI = std::map<int, std::map<TAC, RI::Tensor<T>>>;
136template <typename T>
137TLRI<T> read_Cs_ao(const std::string& file_path, const double& threshold = 1e-10);
138template <typename T>
139void write_Cs_ao(const TLRI<T>& Vs, const std::string& file_path);
140template <typename T>
141TLRI<T> read_Vs_abf(const std::string& file_path, const double& threshold = 1e-10);
142template <typename T>
143void write_Vs_abf(const TLRI<T>& Vs, const std::string& file_path);
144
145template <typename T>
146struct is_std_array : std::false_type
147{
148};
149template <typename T, std::size_t N>
150struct is_std_array<std::array<T, N>> : std::true_type
151{
152};
153template <typename T>
154struct is_tensor : std::false_type
155{
156};
157template <typename T>
158struct is_tensor<RI::Tensor<T>> : std::true_type
159{
160};
161
162template <typename Tout>
163struct TinType;
164
165template <typename T>
166struct TinType<RI::Tensor<T>>
167{
168 using type = T;
169};
170
171template <typename T, std::size_t N>
172struct TinType<std::array<RI::Tensor<T>, N>>
173{
174 using type = T;
175};
176
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)
179{
180 data = Tdata({ndim0, ndim1});
181};
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);
184
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)
187{
188 data += frac * val;
189};
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>>
193inline void add_elem(const Tdata& data,
194 const int lmp,
195 const int lmq,
196 const typename TinType<Tdata>::type& val,
197 const typename TinType<Tdata>::type& frac)
198{
199 data(lmp, lmq) += frac * val;
200};
201template <typename T, std::size_t N>
202extern void add_elem(std::array<RI::Tensor<T>, N>& data,
203 const int lmp,
204 const int lmq,
205 const std::array<T, N>& val,
206 const T& frac);
207template <typename Tdata, typename = std::enable_if_t<is_tensor<Tdata>::value>>
208inline void add_elem(Tdata& data,
209 const int lmp0,
210 const int lmq0,
211 const Tdata& val,
212 const int lmp1,
213 const int lmq1,
214 const typename TinType<Tdata>::type& frac)
215{
216 data(lmp0, lmq0) += frac * val(lmp1, lmq1);
217};
218template <typename T, std::size_t N>
219extern void add_elem(std::array<RI::Tensor<T>, N>& data,
220 const int lmp0,
221 const int lmq0,
222 const std::array<RI::Tensor<T>, N>& val,
223 const int lmp1,
224 const int lmq1,
225 const T& frac);
226
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);
231
232// template <typename T>
233// typename std::enable_if<!RI::Global_Func::is_complex<T>::value, T>::type
234// inline check_zero(T value) {
235// return (std::abs(value) < 1e-8) ? static_cast<T>(0) : value;
236// }
237
238// template <typename T>
239// typename std::enable_if<RI::Global_Func::is_complex<T>::value, T>::type
240// inline check_zero(const T& value) {
241// using RealType = typename T::value_type;
242// RealType real_part = std::real(value);
243// RealType imag_part = std::imag(value);
244
245// real_part = (std::abs(real_part) < 1e-8) ? 0 : real_part;
246// imag_part = (std::abs(imag_part) < 1e-8) ? 0 : imag_part;
247
248// return std::complex<RealType>(real_part, imag_part);
249// }
250
251// template <typename T>
252// extern RI::Tensor<T> check_zero(RI::Tensor<T>&& data);
253// template <typename T, std::size_t N>
254// extern std::array<RI::Tensor<T>, N> check_zero(std::array<RI::Tensor<T>, N>&& data);
255
256template <typename T>
257struct plus
258{
259 T operator()(const T& lhs, const T& rhs) const
260 {
261 using namespace RI::Array_Operator;
262 return lhs + rhs;
263 }
264};
265} // namespace LRI_CV_Tools
266
267#include "LRI_CV_Tools.hpp"
268#include "write_ri_cv.hpp"
269#endif
Definition unitcell.h:16
#define N
Definition exp.cpp:24
#define T
Definition exp.cpp:237
Definition LRI_CV_Tools.h:20
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:219
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:382
std::array< std::vector< T >, N > change_order(std::vector< std::array< T, N > > &&ds_in)
Definition LRI_CV_Tools.hpp:302
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:283
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:409
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:86
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:364
RI::Tensor< Tout > convert(RI::Tensor< Tin > &&data)
Definition LRI_CV_Tools.hpp:476
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:162
void init_elem(Tdata &data, const size_t ndim0, const size_t ndim1)
Definition LRI_CV_Tools.h:178
std::map< int, std::map< TAC, RI::Tensor< T > > > TLRI
Definition LRI_CV_Tools.h:135
void add_elem(Tdata &data, const Tdata &val, const Tdata &frac)
Definition LRI_CV_Tools.h:186
RI::Tensor< Tdata > mul1(const RI::Tensor< Tdata > &t1, const RI::Tensor< Tdata > &t2)
Definition LRI_CV_Tools.hpp:63
std::pair< int, TC > TAC
Definition LRI_CV_Tools.h:133
std::array< int, 3 > TC
Definition LRI_CV_Tools.h:132
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:520
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:37
bool exist(const RI::Tensor< Tdata > &V)
Definition LRI_CV_Tools.hpp:50
RI::Tensor< Tdata > cal_I(const RI::Tensor< Tdata > &m)
Definition LRI_CV_Tools.hpp:19
std::array< T, N > negative(const std::array< T, N > &v_in)
Definition LRI_CV_Tools.hpp:275
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:168
Definition LRI_CV_Tools.h:163
Definition LRI_CV_Tools.h:147
Definition LRI_CV_Tools.h:155
Definition LRI_CV_Tools.h:258
T operator()(const T &lhs, const T &rhs) const
Definition LRI_CV_Tools.h:259