Skip to content

Commit 8bbbb2f

Browse files
committed
move xc-dependent functions to a new file
1 parent cd76ed0 commit 8bbbb2f

File tree

6 files changed

+81
-65
lines changed

6 files changed

+81
-65
lines changed

source/Makefile.Objects

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,7 @@ OBJS_TENSOR=tensor.o\
718718

719719
OBJS_LR=lr_util.o\
720720
lr_util_hcontainer.o\
721+
lr_util_xc.o\
721722
AX_parallel.o\
722723
AX_serial.o\
723724
dm_trans_parallel.o\

source/module_lr/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ if(ENABLE_LCAO)
77
list(APPEND objects
88
utils/lr_util.cpp
99
utils/lr_util_hcontainer.cpp
10+
utils/lr_util_xc.cpp
1011
AX/AX_parallel.cpp
1112
AX/AX_serial.cpp
1213
dm_trans/dm_trans_parallel.cpp

source/module_lr/utils/lr_util.cpp

Lines changed: 49 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ namespace LR_Util
6262
template<>
6363
void matsym<double>(const double* in, const int n, const Parallel_2D& pmat, double* out)
6464
{
65-
for (int i = 0;i < pmat.get_local_size();++i) {out[i] = in[i];
66-
}
65+
for (int i = 0;i < pmat.get_local_size();++i) {
66+
out[i] = in[i];
67+
}
6768
const double alpha = 0.5, beta = 0.5;
6869
const int i1 = 1;
6970
pdtran_(&n, &n, &alpha, in, &i1, &i1, pmat.desc, &beta, out, &i1, &i1, pmat.desc);
@@ -72,17 +73,19 @@ namespace LR_Util
7273
void matsym<double>(double* inout, const int n, const Parallel_2D& pmat)
7374
{
7475
std::vector<double> tmp(n * n);
75-
for (int i = 0;i < pmat.get_local_size();++i) {tmp[i] = inout[i];
76-
}
76+
for (int i = 0;i < pmat.get_local_size();++i) {
77+
tmp[i] = inout[i];
78+
}
7779
const double alpha = 0.5, beta = 0.5;
7880
const int i1 = 1;
7981
pdtran_(&n, &n, &alpha, tmp.data(), &i1, &i1, pmat.desc, &beta, inout, &i1, &i1, pmat.desc);
8082
}
8183
template<>
8284
void matsym<std::complex<double>>(const std::complex<double>* in, const int n, const Parallel_2D& pmat, std::complex<double>* out)
8385
{
84-
for (int i = 0;i < pmat.get_local_size();++i) {out[i] = in[i];
85-
}
86+
for (int i = 0;i < pmat.get_local_size();++i) {
87+
out[i] = in[i];
88+
}
8689
const std::complex<double> alpha(0.5, 0.0), beta(0.5, 0.0);
8790
const int i1 = 1;
8891
pztranc_(&n, &n, &alpha, in, &i1, &i1, pmat.desc, &beta, out, &i1, &i1, pmat.desc);
@@ -91,8 +94,9 @@ namespace LR_Util
9194
void matsym<std::complex<double>>(std::complex<double>* inout, const int n, const Parallel_2D& pmat)
9295
{
9396
std::vector<std::complex<double>> tmp(n * n);
94-
for (int i = 0;i < pmat.get_local_size();++i) {tmp[i] = inout[i];
95-
}
97+
for (int i = 0;i < pmat.get_local_size();++i) {
98+
tmp[i] = inout[i];
99+
}
96100
const std::complex<double> alpha(0.5, 0.0), beta(0.5, 0.0);
97101
const int i1 = 1;
98102
pztranc_(&n, &n, &alpha, tmp.data(), &i1, &i1, pmat.desc, &beta, inout, &i1, &i1, pmat.desc);
@@ -101,88 +105,100 @@ namespace LR_Util
101105
container::Tensor mat2ten_double(ModuleBase::matrix& m)
102106
{
103107
container::Tensor t(DAT::DT_DOUBLE, DEV::CpuDevice, { m.nr, m.nc });
104-
for (int i = 0;i < t.NumElements();++i) {t.data<double>()[i] = m.c[i];
105-
}
108+
for (int i = 0;i < t.NumElements();++i) {
109+
t.data<double>()[i] = m.c[i];
110+
}
106111
return t;
107112
}
108113
std::vector<container::Tensor> mat2ten_double(std::vector<ModuleBase::matrix>& m)
109114
{
110115
std::vector<container::Tensor> t;
111-
for (int i = 0;i < m.size();++i) { t.push_back(mat2ten_double(m[i]));
112-
}
116+
for (int i = 0;i < m.size();++i) {
117+
t.push_back(mat2ten_double(m[i]));
118+
}
113119
return t;
114120
}
115121
ModuleBase::matrix ten2mat_double(container::Tensor& t)
116122
{
117123
ModuleBase::matrix m(t.shape().dims()[0], t.shape().dims()[1]);
118-
for (int i = 0;i < t.NumElements();++i) {m.c[i] = t.data<double>()[i];
119-
}
124+
for (int i = 0;i < t.NumElements();++i) {
125+
m.c[i] = t.data<double>()[i];
126+
}
120127
return m;
121128
}
122129
std::vector<ModuleBase::matrix> ten2mat_double(std::vector<container::Tensor>& t)
123130
{
124131
std::vector<ModuleBase::matrix> m;
125-
for (int i = 0;i < t.size();++i) { m.push_back(ten2mat_double(t[i]));
126-
}
132+
for (int i = 0;i < t.size();++i) {
133+
m.push_back(ten2mat_double(t[i]));
134+
}
127135
return m;
128136
}
129137
container::Tensor mat2ten_complex(ModuleBase::ComplexMatrix& m)
130138
{
131139
container::Tensor t(DAT::DT_COMPLEX_DOUBLE, DEV::CpuDevice, { m.nr, m.nc });
132-
for (int i = 0;i < t.NumElements();++i) {t.data<std::complex<double>>()[i] = m.c[i];
133-
}
140+
for (int i = 0;i < t.NumElements();++i) {
141+
t.data<std::complex<double>>()[i] = m.c[i];
142+
}
134143
return t;
135144
}
136145
std::vector<container::Tensor> mat2ten_complex(std::vector<ModuleBase::ComplexMatrix>& m)
137146
{
138147
std::vector<container::Tensor> t;
139-
for (int i = 0;i < m.size();++i) { t.push_back(mat2ten_complex(m[i]));
140-
}
148+
for (int i = 0;i < m.size();++i) {
149+
t.push_back(mat2ten_complex(m[i]));
150+
}
141151
return t;
142152
}
143153
ModuleBase::ComplexMatrix ten2mat_complex(container::Tensor& t)
144154
{
145155
ModuleBase::ComplexMatrix m(t.shape().dims()[0], t.shape().dims()[1]);
146-
for (int i = 0;i < t.NumElements();++i) {m.c[i] = t.data<std::complex<double>>()[i];
147-
}
156+
for (int i = 0;i < t.NumElements();++i) {
157+
m.c[i] = t.data<std::complex<double>>()[i];
158+
}
148159
return m;
149160
}
150161
std::vector<ModuleBase::ComplexMatrix> ten2mat_complex(std::vector<container::Tensor>& t)
151162
{
152163
std::vector<ModuleBase::ComplexMatrix> m;
153-
for (int i = 0;i < t.size();++i) { m.push_back(ten2mat_complex(t[i]));
154-
}
164+
for (int i = 0;i < t.size();++i) {
165+
m.push_back(ten2mat_complex(t[i]));
166+
}
155167
return m;
156168
}
157169

158170
ModuleBase::matrix vec2mat(const std::vector<double>& v, const int nr, const int nc)
159171
{
160172
assert(v.size() == nr * nc);
161173
ModuleBase::matrix m(nr, nc, false);
162-
for (int i = 0;i < v.size();++i) { m.c[i] = v[i];
163-
}
174+
for (int i = 0;i < v.size();++i) {
175+
m.c[i] = v[i];
176+
}
164177
return m;
165178
}
166179
ModuleBase::ComplexMatrix vec2mat(const std::vector<std::complex<double>>& v, const int nr, const int nc)
167180
{
168181
assert(v.size() == nr * nc);
169182
ModuleBase::ComplexMatrix m(nr, nc, false);
170-
for (int i = 0;i < v.size();++i) { m.c[i] = v[i];
171-
}
183+
for (int i = 0;i < v.size();++i) {
184+
m.c[i] = v[i];
185+
}
172186
return m;
173187
}
174188
std::vector<ModuleBase::matrix> vec2mat(const std::vector<std::vector<double>>& v, const int nr, const int nc)
175189
{
176190
std::vector<ModuleBase::matrix> m(v.size());
177-
for (int i = 0;i < v.size();++i) { m[i] = vec2mat(v[i], nr, nc);
178-
}
191+
for (int i = 0;i < v.size();++i) {
192+
m[i] = vec2mat(v[i], nr, nc);
193+
}
179194
return m;
180195
}
181196
std::vector<ModuleBase::ComplexMatrix> vec2mat(const std::vector<std::vector<std::complex<double>>>& v, const int nr, const int nc)
182197
{
183198
std::vector<ModuleBase::ComplexMatrix> m(v.size());
184-
for (int i = 0;i < v.size();++i) { m[i] = vec2mat(v[i], nr, nc);
185-
}
199+
for (int i = 0;i < v.size();++i) {
200+
m[i] = vec2mat(v[i], nr, nc);
201+
}
186202
return m;
187203
}
188204

@@ -270,32 +286,4 @@ namespace LR_Util
270286
vl.data(), &ldvl, vr.data(), &ldvr, work2.data(), &lwork, rwork.data(), &info);
271287
if (info) { std::cout << "ERROR: Lapack solver zgeev, info=" << info << std::endl; }
272288
}
273-
void grad(const double* rhor,
274-
ModuleBase::Vector3<double>* gdr,
275-
const ModulePW::PW_Basis& rho_basis,
276-
const double& tpiba)
277-
{
278-
std::vector<std::complex<double>> rhog(rho_basis.npw);
279-
rho_basis.real2recip(rhor, rhog.data());
280-
XC_Functional::grad_rho(rhog.data(), gdr, &rho_basis, tpiba);
281-
}
282-
void laplace(const double* rhor, double* lapn,
283-
const ModulePW::PW_Basis& rho_basis,
284-
const double& tpiba2)
285-
{
286-
ModuleBase::GlobalFunc::ZEROS(lapn, rho_basis.nrxx);
287-
std::vector<std::complex<double>> rhog(rho_basis.npw);
288-
std::vector<double> tmp_rhor(rho_basis.nrxx);
289-
rho_basis.real2recip(rhor, rhog.data());
290-
for (int i = 0;i < 3;++i)
291-
{
292-
for (int ig = 0; ig < rho_basis.npw; ig++) {
293-
rhog[ig] *= pow(rho_basis.gcar[ig][i], 2);
294-
}
295-
rho_basis.recip2real(rhog.data(), tmp_rhor.data());
296-
for (int ir = 0; ir < rho_basis.nrxx; ir++) {
297-
lapn[ir] -= tmp_rhor[ir] * tpiba2;
298-
}
299-
}
300-
}
301-
}
289+
}

source/module_lr/utils/lr_util.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ namespace LR_Util
3636
std::pair<ModuleBase::matrix, std::vector<std::pair<int, int>>>
3737
set_ix_map_diagonal(bool mode, int nc, int nv);
3838

39-
#ifdef USE_LIBXC
4039
/// operators to calculate XC kernels
4140
void grad(const double* rhor,
4241
ModuleBase::Vector3<double>* gdr,
@@ -46,7 +45,6 @@ namespace LR_Util
4645
double* lapn,
4746
const ModulePW::PW_Basis& rho_basis,
4847
const double& tpiba2);
49-
#endif
5048
/// =================ALGORITHM====================
5149

5250
//====== newers and deleters========
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include "lr_util.h"
2+
namespace LR_Util
3+
{
4+
void grad(const double* rhor,
5+
ModuleBase::Vector3<double>* gdr,
6+
const ModulePW::PW_Basis& rho_basis,
7+
const double& tpiba)
8+
{
9+
std::vector<std::complex<double>> rhog(rho_basis.npw);
10+
rho_basis.real2recip(rhor, rhog.data());
11+
XC_Functional::grad_rho(rhog.data(), gdr, &rho_basis, tpiba);
12+
}
13+
void laplace(const double* rhor, double* lapn,
14+
const ModulePW::PW_Basis& rho_basis,
15+
const double& tpiba2)
16+
{
17+
ModuleBase::GlobalFunc::ZEROS(lapn, rho_basis.nrxx);
18+
std::vector<std::complex<double>> rhog(rho_basis.npw);
19+
std::vector<double> tmp_rhor(rho_basis.nrxx);
20+
rho_basis.real2recip(rhor, rhog.data());
21+
for (int i = 0;i < 3;++i)
22+
{
23+
for (int ig = 0; ig < rho_basis.npw; ig++) { rhog[ig] *= pow(rho_basis.gcar[ig][i], 2); }
24+
rho_basis.recip2real(rhog.data(), tmp_rhor.data());
25+
for (int ir = 0; ir < rho_basis.nrxx; ir++) { lapn[ir] -= tmp_rhor[ir] * tpiba2; }
26+
}
27+
}
28+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
remove_definitions(-DUSE_LIBXC)
22
AddTest(
33
TARGET lr_util_phys_test
4-
LIBS parameter base ${math_libs} device container
4+
LIBS parameter base ${math_libs} device container planewave #for FFT
55
SOURCES lr_util_physics_test.cpp ../lr_util.cpp
66
../../../module_basis/module_ao/parallel_2d.cpp
77
../../../module_io/orb_io.cpp
88
)
99

1010
AddTest(
1111
TARGET lr_util_algo_test
12-
LIBS parameter base ${math_libs} device psi container
12+
LIBS parameter base ${math_libs} device psi container planewave #for FFT
1313
SOURCES lr_util_algorithms_test.cpp ../lr_util.cpp
1414
../../../module_basis/module_ao/parallel_2d.cpp
1515
)

0 commit comments

Comments
 (0)