@@ -21,7 +21,8 @@ namespace inq {
2121namespace ground_state {
2222
2323void 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