Skip to content

Commit ad70bee

Browse files
committed
Merge branch 'gpurun_in_unit_tests' into 'master'
Use gpu::run to initialize data and check results of the unit tests See merge request npneq/inq!1291
2 parents 659b262 + a37bee5 commit ad70bee

5 files changed

Lines changed: 306 additions & 492 deletions

File tree

src/ground_state/initial_guess.hpp

Lines changed: 46 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ namespace inq {
2121
namespace ground_state {
2222

2323
void initial_guess(const systems::ions & ions, systems::electrons & electrons, std::optional<vector3<double>> const & magnet_dir = {}){
24-
24+
CALI_CXX_MARK_FUNCTION;
25+
2526
int iphi = 0;
2627
for(auto & phi : electrons.kpin()) {
2728
operations::randomize(phi, iphi + electrons.kpin_part().start());
@@ -49,12 +50,13 @@ void initial_guess(const systems::ions & ions, systems::electrons & electrons, s
4950

5051
assert(fabs(operations::integral_sum(electrons.spin_density())) > 1e-16);
5152

52-
observables::density::normalize(electrons.spin_density(), electrons.states().num_electrons());
53-
if (magnet_dir) {
54-
assert(electrons.spin_density().set_size() > 1);
55-
auto magnet_dir_ = {magnet_dir.value()[0], magnet_dir.value()[1], magnet_dir.value()[2]};
56-
observables::density::rotate_total_magnetization(electrons.spin_density(), magnet_dir_);
57-
}
53+
observables::density::normalize(electrons.spin_density(), electrons.states().num_electrons());
54+
55+
if (magnet_dir) {
56+
assert(electrons.spin_density().set_size() > 1);
57+
auto magnet_dir_ = {magnet_dir.value()[0], magnet_dir.value()[1], magnet_dir.value()[2]};
58+
observables::density::rotate_total_magnetization(electrons.spin_density(), magnet_dir_);
59+
}
5860

5961
}
6062
}
@@ -80,7 +82,7 @@ TEST_CASE(INQ_TEST_FILE, INQ_TEST_TAG) {
8082
ions.insert("H", {0.0_b, 0.0_b, 0.0_b});
8183
auto electrons = systems::electrons(par, ions, options::electrons{}.cutoff(30.0_Ha).extra_states(2).spin_unpolarized());
8284
ground_state::initial_guess(ions, electrons);
83-
CHECK(Approx(operations::integral_sum(electrons.spin_density())).epsilon(1.e-10) == 1.0);
85+
CHECK(Approx(operations::integral_sum(electrons.spin_density())).epsilon(1.e-10) == 1.0);
8486
}
8587

8688
SECTION("Spin polarized initialization") {
@@ -89,23 +91,23 @@ TEST_CASE(INQ_TEST_FILE, INQ_TEST_TAG) {
8991
ions.insert("H", {0.0_b, 0.0_b, 0.0_b});
9092
auto electrons = systems::electrons(par, ions, options::electrons{}.cutoff(30.0_Ha).extra_states(2).spin_polarized());
9193
ground_state::initial_guess(ions, electrons);
92-
CHECK(Approx(operations::integral_sum(electrons.spin_density())).epsilon(1.e-10) == 1.0);
94+
CHECK(Approx(operations::integral_sum(electrons.spin_density())).epsilon(1.e-10) == 1.0);
9395

9496
vector3 mag_dir = {0.0, 0.0, 1.0};
9597
electrons = systems::electrons(par, ions, options::electrons{}.cutoff(30.0_Ha).extra_states(2).spin_polarized());
9698
ground_state::initial_guess(ions, electrons, mag_dir);
9799
auto mag = observables::total_magnetization(electrons.spin_density());
98-
CHECK(Approx(operations::integral_sum(electrons.spin_density())).epsilon(1.e-10) == 1.0);
99-
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0);
100-
CHECK(Approx(sqrt(mag[0]*mag[0]+mag[1]*mag[1])/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
100+
CHECK(Approx(operations::integral_sum(electrons.spin_density())).epsilon(1.e-10) == 1.0);
101+
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0);
102+
CHECK(Approx(sqrt(mag[0]*mag[0]+mag[1]*mag[1])/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
101103

102104
mag_dir = {0.0, 0.0, -1.0};
103105
electrons = systems::electrons(par, ions, options::electrons{}.cutoff(30.0_Ha).extra_states(2).spin_polarized());
104106
ground_state::initial_guess(ions, electrons, mag_dir);
105107
mag = observables::total_magnetization(electrons.spin_density());
106-
CHECK(Approx(operations::integral_sum(electrons.spin_density())).epsilon(1.e-10) == 1.0);
107-
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == -1.0);
108-
CHECK(Approx(sqrt(mag[0]*mag[0]+mag[1]*mag[1])/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
108+
CHECK(Approx(operations::integral_sum(electrons.spin_density())).epsilon(1.e-10) == 1.0);
109+
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == -1.0);
110+
CHECK(Approx(sqrt(mag[0]*mag[0]+mag[1]*mag[1])/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
109111
}
110112

111113
SECTION("Spin non collinear initialization") {
@@ -114,77 +116,77 @@ TEST_CASE(INQ_TEST_FILE, INQ_TEST_TAG) {
114116
ions.insert("H", {0.0_b, 0.0_b, 0.0_b});
115117
auto electrons = systems::electrons(par, ions, options::electrons{}.cutoff(30.0_Ha).extra_states(2).spin_non_collinear());
116118
ground_state::initial_guess(ions, electrons);
117-
CHECK(Approx(operations::integral_sum(electrons.spin_density())).epsilon(1.e-10) == 1.0);
119+
CHECK(Approx(operations::integral_sum(electrons.spin_density())).epsilon(1.e-10) == 1.0);
118120

119121
vector3 mag_dir = {0.0, 0.0, 1.0};
120122
electrons = systems::electrons(par, ions, options::electrons{}.cutoff(30.0_Ha).extra_states(2).spin_non_collinear());
121123
ground_state::initial_guess(ions, electrons, mag_dir);
122124
auto ch_density = observables::density::total(electrons.spin_density());
123125
auto mag = observables::total_magnetization(electrons.spin_density());
124-
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
125-
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
126-
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
127-
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0);
126+
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
127+
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
128+
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
129+
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0);
128130

129131
mag_dir = {0.0, 0.0, -1.0};
130132
electrons = systems::electrons(par, ions, options::electrons{}.cutoff(30.0_Ha).extra_states(2).spin_non_collinear());
131133
ground_state::initial_guess(ions, electrons, mag_dir);
132134
ch_density = observables::density::total(electrons.spin_density());
133135
mag = observables::total_magnetization(electrons.spin_density());
134-
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
135-
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
136-
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
137-
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == -1.0);
136+
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
137+
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
138+
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
139+
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == -1.0);
138140

139141
mag_dir = {1.0, 1.0, 0.0};
140142
electrons = systems::electrons(par, ions, options::electrons{}.cutoff(30.0_Ha).extra_states(2).spin_non_collinear());
141143
ground_state::initial_guess(ions, electrons, mag_dir);
142144
ch_density = observables::density::total(electrons.spin_density());
143145
mag = observables::total_magnetization(electrons.spin_density());
144-
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
145-
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(2.0));
146-
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(2.0));
147-
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
146+
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
147+
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(2.0));
148+
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(2.0));
149+
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
148150

149151
mag_dir = {-1.0, 1.0, 0.0};
150152
electrons = systems::electrons(par, ions, options::electrons{}.cutoff(30.0_Ha).extra_states(2).spin_non_collinear());
151153
ground_state::initial_guess(ions, electrons, mag_dir);
152154
ch_density = observables::density::total(electrons.spin_density());
153155
mag = observables::total_magnetization(electrons.spin_density());
154-
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
155-
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == -1.0/sqrt(2.0));
156-
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(2.0));
157-
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
156+
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
157+
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == -1.0/sqrt(2.0));
158+
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(2.0));
159+
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
158160

159161
mag_dir = {1.0, -1.0, 0.0};
160162
electrons = systems::electrons(par, ions, options::electrons{}.cutoff(30.0_Ha).extra_states(2).spin_non_collinear());
161163
ground_state::initial_guess(ions, electrons, mag_dir);
162164
ch_density = observables::density::total(electrons.spin_density());
163165
mag = observables::total_magnetization(electrons.spin_density());
164-
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
165-
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(2.0));
166-
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == -1.0/sqrt(2.0));
167-
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
166+
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
167+
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(2.0));
168+
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == -1.0/sqrt(2.0));
169+
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
168170

169171
mag_dir = {-1.0, -1.0, 0.0};
170172
electrons = systems::electrons(par, ions, options::electrons{}.cutoff(30.0_Ha).extra_states(2).spin_non_collinear());
171173
ground_state::initial_guess(ions, electrons, mag_dir);
172174
ch_density = observables::density::total(electrons.spin_density());
173175
mag = observables::total_magnetization(electrons.spin_density());
174-
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
175-
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == -1.0/sqrt(2.0));
176-
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == -1.0/sqrt(2.0));
177-
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
176+
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
177+
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == -1.0/sqrt(2.0));
178+
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == -1.0/sqrt(2.0));
179+
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 0.0);
178180

179181
mag_dir = {1.0, 1.0, 1.0};
180182
electrons = systems::electrons(par, ions, options::electrons{}.cutoff(30.0_Ha).extra_states(2).spin_non_collinear());
181183
ground_state::initial_guess(ions, electrons, mag_dir);
182184
ch_density = observables::density::total(electrons.spin_density());
183185
mag = observables::total_magnetization(electrons.spin_density());
184-
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
185-
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(3.0));
186-
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(3.0));
187-
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(3.0));
186+
CHECK(Approx(operations::integral(ch_density)).epsilon(1.e-10) == 1.0);
187+
CHECK(Approx(mag[0]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(3.0));
188+
CHECK(Approx(mag[1]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(3.0));
189+
CHECK(Approx(mag[2]/sqrt(norm(mag))).epsilon(1.e-10) == 1.0/sqrt(3.0));
188190
}
189191
}
190192
#endif

0 commit comments

Comments
 (0)