Skip to content

Commit 7460f2a

Browse files
leiosberquist
authored andcommitted
modifying C++ energy calculation to match split-op code. (#533)
1 parent 95a2811 commit 7460f2a

File tree

4 files changed

+30
-29
lines changed

4 files changed

+30
-29
lines changed

contents/quantum_systems/code/c++/energy.cpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,50 @@
33

44
#include <fftw3.h>
55

6-
void fft(std::vector<std::complex<double>> x, bool inverse) {
7-
std::vector<std::complex<double>> y(x.size());
8-
for (size_t i = 0; i < x.size(); i++) {
9-
y.push_back(std::complex(0.0, 0.0));
10-
}
11-
6+
void fft(std::vector<std::complex<double>> &x, bool inverse) {
7+
std::vector<std::complex<double>> y(x.size(), std::complex<double>(0.0, 0.0));
8+
129
fftw_plan p;
1310

14-
p = fftw_plan_dft_1d(x.size(), reinterpret_cast<fftw_complex*>(x.data()),
15-
reinterpret_cast<fftw_complex*>(y.data()),
16-
(inverse ? FFTW_BACKWARD : FFTW_FORWARD), FFTW_ESTIMATE);
11+
fftw_complex *in = reinterpret_cast<fftw_complex*>(x.data());
12+
fftw_complex *out = reinterpret_cast<fftw_complex*>(y.data());
13+
14+
p = fftw_plan_dft_1d(x.size(), in, out,
15+
(inverse ? FFTW_BACKWARD : FFTW_FORWARD), FFTW_ESTIMATE);
16+
1717

1818
fftw_execute(p);
1919
fftw_destroy_plan(p);
2020

2121
for (size_t i = 0; i < x.size(); ++i) {
22-
x[i] = y[i] / sqrt((double)x.size());
22+
x[i] = y[i] / sqrt(static_cast<double>(x.size()));
2323
}
2424
}
2525

26-
double calculate_energy(std::vector<std::complex<double>> wfc, std::vector<std::complex<double>> h_r,
27-
std::vector<std::complex<double>> h_k, double dx, size_t size) {
26+
double calculate_energy(std::vector<std::complex<double>> wfc,
27+
std::vector<std::complex<double>> h_r,
28+
std::vector<std::complex<double>> h_k,
29+
double dx, size_t size) {
2830
std::vector<std::complex<double>> wfc_k(wfc);
2931
std::vector<std::complex<double>> wfc_c(size);
3032
fft(wfc_k, false);
3133

3234
for (size_t i = 0; i < size; ++i) {
33-
wfc_c.push_back(conj(wfc[i]));
35+
wfc_c[i] = conj(wfc[i]);
3436
}
3537

3638
std::vector<std::complex<double>> energy_k(size);
3739
std::vector<std::complex<double>> energy_r(size);
3840

3941
for (size_t i = 0; i < size; ++i) {
40-
energy_k.push_back(wfc_k[i] * h_k[i]);
42+
energy_k[i] = wfc_k[i] * pow(h_k[i], 2);
4143
}
4244

4345
fft(energy_k, true);
4446

4547
for (size_t i = 0; i < size; ++i) {
46-
energy_k[i] *= wfc_c[i];
47-
energy_r.push_back(wfc_c[i] * h_r[i] * wfc[i]);
48+
energy_k[i] *= 0.5 * wfc_c[i];
49+
energy_r[i] = wfc_c[i] * h_r[i] * wfc[i];
4850
}
4951

5052
double energy_final = 0;

contents/quantum_systems/quantum_systems.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ This ultimately looks like this:
232232
{% sample lang="c" %}
233233
[import:29-, lang:"c_cpp"](code/c/energy.c)
234234
{% sample lang="cpp" %}
235-
[import:26-57, lang:"c_cpp"](code/c++/energy.cpp)
235+
[import:26-, lang:"c_cpp"](code/c++/energy.cpp)
236236
{% sample lang="py" %}
237237
[import:4-17, lang:"python"](code/python/energy.py)
238238
{% endmethod %}

contents/split-operator_method/code/c++/split_op.cpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,21 +79,20 @@ struct Operators {
7979
vector_complex wfc;
8080
};
8181

82-
void fft(vector_complex &x, int n, bool inverse) {
83-
complex y[n];
84-
memset(y, 0, sizeof(y));
82+
void fft(vector_complex &x, bool inverse) {
83+
std::vector<std::complex<double>> y(x.size(), std::complex<double>(0.0, 0.0));
8584
fftw_plan p;
8685

8786
fftw_complex *in = reinterpret_cast<fftw_complex*>(x.data());
88-
fftw_complex *out = reinterpret_cast<fftw_complex*>(y);
89-
p = fftw_plan_dft_1d(n, in, out,
87+
fftw_complex *out = reinterpret_cast<fftw_complex*>(y.data());
88+
p = fftw_plan_dft_1d(x.size(), in, out,
9089
(inverse ? FFTW_BACKWARD : FFTW_FORWARD), FFTW_ESTIMATE);
9190

9291
fftw_execute(p);
9392
fftw_destroy_plan(p);
9493

95-
for (size_t i = 0; i < n; ++i) {
96-
x[i] = y[i] / sqrt(static_cast<double>(n));
94+
for (size_t i = 0; i < x.size(); ++i) {
95+
x[i] = y[i] / sqrt(static_cast<double>(x.size()));
9796
}
9897
}
9998

@@ -105,13 +104,13 @@ void split_op(Params &par, Operators &opr) {
105104
opr.wfc[j] *= opr.pe[j];
106105
}
107106

108-
fft(opr.wfc, opr.size, false);
107+
fft(opr.wfc, false);
109108

110109
for (size_t j = 0; j < opr.size; ++j) {
111110
opr.wfc[j] *= opr.ke[j];
112111
}
113112

114-
fft(opr.wfc, opr.size, true);
113+
fft(opr.wfc, true);
115114

116115
for (size_t j = 0; j < opr.size; ++j) {
117116
opr.wfc[j] *= opr.pe[j];
@@ -160,7 +159,7 @@ double calculate_energy(Params &par, Operators &opr) {
160159
vector_complex wfc_r(opr.wfc);
161160
vector_complex wfc_k(opr.wfc);
162161
vector_complex wfc_c(opr.size);
163-
fft(wfc_k, opr.size, false);
162+
fft(wfc_k, false);
164163

165164
for (size_t i = 0; i < opr.size; ++i) {
166165
wfc_c[i] = conj(wfc_r[i]);
@@ -173,7 +172,7 @@ double calculate_energy(Params &par, Operators &opr) {
173172
energy_k[i] = wfc_k[i] * pow(complex(par.k[i], 0.0), 2);
174173
}
175174

176-
fft(energy_k, opr.size, true);
175+
fft(energy_k, true);
177176

178177
for (size_t i = 0; i < opr.size; ++i) {
179178
energy_k[i] *= 0.5 * wfc_c[i];

contents/split-operator_method/split-operator_method.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ The final step is to do the iteration, itself.
145145
{% sample lang="c" %}
146146
[import:98-148, lang:"c_cpp"](code/c/split_op.c)
147147
{% sample lang="cpp" %}
148-
[import:100-157, lang:"c_cpp"](code/c++/split_op.cpp)
148+
[import:99-156, lang:"c_cpp"](code/c++/split_op.cpp)
149149
{% sample lang="py" %}
150150
[import:57-95, lang:"python"](code/python/split_op.py)
151151
{% sample lang="hs" %}

0 commit comments

Comments
 (0)