ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
complexarray.h
Go to the documentation of this file.
1#ifndef COMPLEX_ARRAY_H
2#define COMPLEX_ARRAY_H
3
4#include <complex>
5#include <iostream>
6#include <fstream>
7#include <iomanip>
8#include <cassert>
9
10namespace ModuleBase
11{
12
15{
16public:
17 std::complex<double> *ptr=nullptr; // data array
18
19 ComplexArray(const int bnd1=0, const int bnd2=1, const int bnd3=1, const int bnd4=1);
20
22
23 void freemem();
24
25 void create(const int bnd1=0, const int bnd2=1, const int bnd3=1, const int bnd4=1);
26
27 ComplexArray(const ComplexArray &cd);
29
30 /****************************************************
31 * OPERATOR FUNCTIONS
32 ***************************************************/
36 void operator=(std::complex <double> c);
40 void operator+=(const ComplexArray &cd);
44 void operator-=(const ComplexArray &cd);
46 ComplexArray operator*(const double r);
48 ComplexArray operator*(const std::complex <double> c);
50 void operator*=(const double r);
52 void operator*=(const std::complex <double> c);
54 void operator*=(const ComplexArray &cd);
56 bool operator== (const ComplexArray &cd2)const;
58 bool operator!= (const ComplexArray &cd2)const;
59
61 std::complex <double> &operator()
62 (const int ind1=0, const int ind2=0, const int ind3=0, const int ind4=0)
63 {
64 assert(ind1>=0); assert(ind1<bound1);
65 assert(ind2>=0); assert(ind2<bound2);
66 assert(ind3>=0); assert(ind3<bound3);
67 assert(ind4>=0); assert(ind4<bound4);
68 const int ind = ((ind1 * bound2 + ind2) * bound3 + ind3) * bound4 + ind4;
69 return ptr[ind];
70 };
71 // std::complex < double> &operator()(int, int, int, int, int);
73 const std::complex <double> &operator()
74 (const int ind1=0, const int ind2=0, const int ind3=0, const int ind4=0) const
75 {
76 assert(ind1>=0); assert(ind1<bound1);
77 assert(ind2>=0); assert(ind2<bound2);
78 assert(ind3>=0); assert(ind3<bound3);
79 assert(ind4>=0); assert(ind4<bound4);
80 const int ind = ((ind1 * bound2 + ind2) * bound3 + ind3) * bound4 + ind4;
81 return ptr[ind];
82 };
83 // const std::complex < double> &operator()(int, int, int, int, int)const;
84
85 /****************************************************
86 * MEMBER FUNCTIONS
87 ***************************************************/
89 void zero_out(void);
90
92 void negate(void);
93
95 void randomize(void);
96 int getBound1()const{ return bound1; }
97 int getBound2()const{ return bound2; }
98 int getBound3()const{ return bound3; }
99 int getBound4()const{ return bound4; }
100 int getSize()const{ return bound1*bound2*bound3*bound4; }
101
102private:
104 void init(const int size);
105};
107ComplexArray operator*(const double r, const ComplexArray &cd);
109ComplexArray operator*(const std::complex <double> c, const ComplexArray &cd);
110
112double abs2(const ComplexArray &cd);
113
114// void add_scale_abs2(const std::complex <double> &c, const ComplexArray & in,
115// ComplexArray &out);
116
118std::complex <double> dot(const ComplexArray &cd1, const ComplexArray &cd2);
119
121void scale_accumulate(double r, const ComplexArray &cd1, ComplexArray &cd2);
122
124void scale_accumulate(std::complex <double> c, const ComplexArray &cd1, ComplexArray &cd2);
125
127void scaled_sum(double r1, const ComplexArray &cd1,
128 double r2, const ComplexArray &cd2,
129 ComplexArray &cd3);
130
132void scaled_sum(std::complex <double> c1, const ComplexArray &cd1,
133 std::complex <double> c2, const ComplexArray &cd2,
134 ComplexArray &cd3);
135
138
140template <class T>
141void zeros(std::complex <T> *u, int n)
142{
143 if (n == 0 || u == 0)
144 {
145 std::cout << "\n error in zeros(),n or u = 0";
146 return;
147 }
148
149 for (int i = 0;i < n;i++)
150 {
151 u[i] = std::complex <T> (0.0, 0.0);
152 }
153}
154}
155
156#endif // COMPLEX_ARRAY_H
A basic type of data for complex array.
Definition complexarray.h:15
int getBound1() const
Definition complexarray.h:96
std::complex< double > * ptr
Definition complexarray.h:17
int getBound3() const
Definition complexarray.h:98
ComplexArray operator-(const ComplexArray &cd)
Subtract two ComplexArray.
Definition complexarray.cpp:101
void randomize(void)
set all elements to a random number whose real/image is between [-0.5,0.5).
Definition complexarray.cpp:200
int bound2
Definition complexarray.h:103
int getBound4() const
Definition complexarray.h:99
~ComplexArray()
Definition complexarray.cpp:22
void freemem()
Definition complexarray.cpp:33
int bound3
Definition complexarray.h:103
void negate(void)
Negates all the entries in the array.
Definition complexarray.cpp:195
void create(const int bnd1=0, const int bnd2=1, const int bnd3=1, const int bnd4=1)
Definition complexarray.cpp:41
ComplexArray operator*(const double r)
Scale a ComplexArray by real r.
Definition complexarray.cpp:126
int bound1
Definition complexarray.h:103
void zero_out(void)
set all elements to be {0.0,0.0}
Definition complexarray.cpp:190
void operator-=(const ComplexArray &cd)
Accumulate difference of arrays.
Definition complexarray.cpp:108
bool operator!=(const ComplexArray &cd2) const
Judge if two ComplexArray is not equal.
Definition complexarray.cpp:172
bool operator==(const ComplexArray &cd2) const
Judge if two ComplexArray is equal.
Definition complexarray.cpp:154
ComplexArray & operator=(ComplexArray &&cd)
Definition complexarray.cpp:70
void init(const int size)
Definition complexarray.cpp:25
int getBound2() const
Definition complexarray.h:97
void operator+=(const ComplexArray &cd)
Accumulate sum of ComplexArray.
Definition complexarray.cpp:95
ComplexArray operator+(const ComplexArray &cd)
Add two ComplexArray.
Definition complexarray.cpp:88
int getSize() const
Definition complexarray.h:100
void operator*=(const double r)
Scale a ComplexArray by real number in place.
Definition complexarray.cpp:149
int bound4
Definition complexarray.h:103
Definition array_pool.h:6
std::complex< double > dot(const ComplexArray &cd1, const ComplexArray &cd2)
Take "dot-product" of two ComplexArray: sum of cd1(conjugate)[i] * cd2[i].
Definition complexarray.cpp:218
ComplexArray operator*(const double r, const ComplexArray &cd)
Scale a ComplexArray cd by real r.
Definition complexarray.cpp:120
double abs2(const ComplexArray &cd)
Sum of absolute squares of all elements in cd.
Definition complexarray.cpp:206
void zeros(std::complex< T > *u, int n)
set elements of u as zero which u is 1_d std::complex array
Definition complexarray.h:141
void point_mult(ComplexArray &in1, ComplexArray &in2, ComplexArray &out)
out[i] = a1[i] * in2[i]
Definition complexarray.cpp:254
void scaled_sum(double r1, const ComplexArray &cd1, double r2, const ComplexArray &cd2, ComplexArray &cd3)
Does cd3 = r1*cd1 + r2*cd2.
Definition complexarray.cpp:241
void scale_accumulate(double r, const ComplexArray &cd1, ComplexArray &cd2)
Does cd2 += r * cd1.
Definition complexarray.cpp:229