QMCPACK
test_soa_cartesian_tensor.cpp
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2016 Jeongnim Kim and QMCPACK developers.
6 //
7 // File developed by: Mark Dewing, markdewing@gmail.com, University of Illinois at Urbana-Champaign
8 //
9 // File created by: Mark Dewing, markdewing@gmail.com, University of Illinois at Urbana-Champaign
10 //////////////////////////////////////////////////////////////////////////////////////
11 
12 
13 // This test is technically in the wrong location. To be testing code in QMCWaveFunctions, it should
14 // be in QMCWaveFunctions/test. However, it seems better to keep the two CartesianTensor tests together.
15 
16 #include "catch.hpp"
17 #include "Message/Communicate.h"
19 
20 #include <stdio.h>
21 #include <string>
22 
23 using std::string;
24 
25 namespace qmcplusplus
26 {
28 
29 
30 // Use gen_gto.py to generate the checks
31 
32 TEST_CASE("SoA Cartesian Tensor", "[numerics]")
33 {
35 
36  double x = 1.3;
37  double y = 1.2;
38  double z = -0.5;
39  ct.evaluateV(x, y, z);
40 
41  const double* XYZ = ct.getcXYZ().data(0);
42 
43  CHECK(XYZ[0] == Approx(0.282094791774));
44  CHECK(XYZ[1] == Approx(0.635183265474));
45  CHECK(XYZ[2] == Approx(0.586323014284));
46  CHECK(XYZ[3] == Approx(-0.244301255951));
47  CHECK(XYZ[4] == Approx(1.06602349055));
48  CHECK(XYZ[5] == Approx(0.908327707927));
49  CHECK(XYZ[6] == Approx(0.157695782626));
50  CHECK(XYZ[7] == Approx(1.70437555172));
51  CHECK(XYZ[8] == Approx(-0.710156479885));
52  CHECK(XYZ[9] == Approx(-0.655529058355));
53  CHECK(XYZ[10] == Approx(1.6397368054));
54  CHECK(XYZ[11] == Approx(1.28969740543));
55  CHECK(XYZ[12] == Approx(-0.0932940831475));
56  CHECK(XYZ[13] == Approx(3.38451965731));
57  CHECK(XYZ[14] == Approx(-1.41021652388));
58  CHECK(XYZ[15] == Approx(3.12417199136));
59  CHECK(XYZ[16] == Approx(-1.20160461206));
60  CHECK(XYZ[17] == Approx(0.542390970723));
61  CHECK(XYZ[18] == Approx(0.500668588359));
62  CHECK(XYZ[19] == Approx(-2.25467692526));
63  CHECK(XYZ[20] == Approx(2.41707280436));
64  CHECK(XYZ[21] == Approx(1.75485528067));
65  CHECK(XYZ[22] == Approx(0.0528927734576));
66  CHECK(XYZ[23] == Approx(5.90305249944));
67  CHECK(XYZ[24] == Approx(-2.4596052081));
68  CHECK(XYZ[25] == Approx(5.02981988118));
69  CHECK(XYZ[26] == Approx(-1.93454610815));
70  CHECK(XYZ[27] == Approx(-0.363846924275));
71  CHECK(XYZ[28] == Approx(-0.335858699331));
72  CHECK(XYZ[29] == Approx(7.03459200681));
73  CHECK(XYZ[30] == Approx(1.22128333452));
74  CHECK(XYZ[31] == Approx(1.04062011935));
75  CHECK(XYZ[32] == Approx(-5.07677948596));
76  CHECK(XYZ[33] == Approx(-4.68625798704));
77  CHECK(XYZ[34] == Approx(1.9526074946));
78  CHECK(XYZ[35] == Approx(3.47382688598));
79  CHECK(XYZ[36] == Approx(2.32807861094));
80  CHECK(XYZ[37] == Approx(-0.0292375806134));
81  CHECK(XYZ[38] == Approx(9.61982829963));
82  CHECK(XYZ[39] == Approx(-4.00826179151));
83  CHECK(XYZ[40] == Approx(7.56625548555));
84  CHECK(XYZ[41] == Approx(-2.91009826367));
85  CHECK(XYZ[42] == Approx(0.228053128784));
86  CHECK(XYZ[43] == Approx(0.210510580416));
87  CHECK(XYZ[44] == Approx(13.5641819555));
88  CHECK(XYZ[45] == Approx(2.35489270061));
89  CHECK(XYZ[46] == Approx(12.5207833436));
90  CHECK(XYZ[47] == Approx(1.85218688514));
91  CHECK(XYZ[48] == Approx(-0.905727961775));
92  CHECK(XYZ[49] == Approx(-0.771744535477));
93  CHECK(XYZ[50] == Approx(-9.78910512921));
94  CHECK(XYZ[51] == Approx(-8.34101265448));
95  CHECK(XYZ[52] == Approx(-1.44809247474));
96  CHECK(XYZ[53] == Approx(-11.6655511199));
97  CHECK(XYZ[54] == Approx(4.86064629996));
98  CHECK(XYZ[55] == Approx(4.48675043074));
99  CHECK(XYZ[56] == Approx(4.90938236205));
100  CHECK(XYZ[57] == Approx(3.03706593382));
101  CHECK(XYZ[58] == Approx(0.0158923005669));
102  CHECK(XYZ[59] == Approx(15.0300731514));
103  CHECK(XYZ[60] == Approx(-6.26253047974));
104  CHECK(XYZ[61] == Approx(10.9122088466));
105  CHECK(XYZ[62] == Approx(-4.19700340252));
106  CHECK(XYZ[63] == Approx(-0.137042874894));
107  CHECK(XYZ[64] == Approx(-0.126501115286));
108  CHECK(XYZ[65] == Approx(24.0303233904));
109  CHECK(XYZ[66] == Approx(4.17193114417));
110  CHECK(XYZ[67] == Approx(20.4755418238));
111  CHECK(XYZ[68] == Approx(3.0289263053));
112  CHECK(XYZ[69] == Approx(0.61714957754));
113  CHECK(XYZ[70] == Approx(0.525855261336));
114  CHECK(XYZ[71] == Approx(-17.3423920977));
115  CHECK(XYZ[72] == Approx(-13.6402610582));
116  CHECK(XYZ[73] == Approx(0.986708699234));
117  CHECK(XYZ[74] == Approx(26.2459034569));
118  CHECK(XYZ[75] == Approx(-1.89857519219));
119  CHECK(XYZ[76] == Approx(-1.49328080661));
120  CHECK(XYZ[77] == Approx(-24.4531767752));
121  CHECK(XYZ[78] == Approx(10.1888236563));
122  CHECK(XYZ[79] == Approx(-22.5721631771));
123  CHECK(XYZ[80] == Approx(8.68160122197));
124  CHECK(XYZ[81] == Approx(-3.91877832936));
125  CHECK(XYZ[82] == Approx(-3.61733384249));
126  CHECK(XYZ[83] == Approx(12.1418905657));
127 }
128 
129 TEST_CASE("SoA Cartesian Tensor evaluateVGL subset", "[numerics]")
130 {
132 
133  double x = 1.3;
134  double y = 1.2;
135  double z = -0.5;
136  ct.evaluateVGL(x, y, z);
137 
138  const double* XYZ = ct.getcXYZ().data(0);
139  const double* gr0 = ct.getcXYZ().data(1);
140  const double* gr1 = ct.getcXYZ().data(2);
141  const double* gr2 = ct.getcXYZ().data(3);
142  const double* lap = ct.getcXYZ().data(4);
143 
144  CHECK(XYZ[0] == Approx(0.282094791774));
145  CHECK(gr0[0] == Approx(0));
146  CHECK(gr1[0] == Approx(0));
147  CHECK(gr2[0] == Approx(0));
148  CHECK(lap[0] == Approx(0));
149 
150  CHECK(XYZ[1] == Approx(0.635183265474));
151  CHECK(gr0[1] == Approx(0.488602511903));
152  CHECK(gr1[1] == Approx(0));
153  CHECK(gr2[1] == Approx(0));
154  CHECK(lap[1] == Approx(0));
155 
156  CHECK(XYZ[8] == Approx(-0.710156479885));
157  CHECK(gr0[8] == Approx(-0.546274215296));
158  CHECK(gr1[8] == Approx(0));
159  CHECK(gr2[8] == Approx(1.42031295977));
160  CHECK(lap[8] == Approx(0));
161 
162  CHECK(XYZ[23] == Approx(5.90305249944));
163  CHECK(gr0[23] == Approx(13.6224288449));
164  CHECK(gr1[23] == Approx(4.9192104162));
165  CHECK(gr2[23] == Approx(0));
166  CHECK(lap[23] == Approx(20.9575828383));
167 
168  CHECK(XYZ[34] == Approx(1.9526074946));
169  CHECK(gr0[34] == Approx(1.50200576508));
170  CHECK(gr1[34] == Approx(1.62717291217));
171  CHECK(gr2[34] == Approx(-7.81042997841));
172  CHECK(lap[34] == Approx(15.6208599568));
173 
174  CHECK(XYZ[50] == Approx(-9.78910512921));
175  CHECK(gr0[50] == Approx(-22.5902426059));
176  CHECK(gr1[50] == Approx(-8.15758760768));
177  CHECK(gr2[50] == Approx(19.5782102584));
178  CHECK(lap[50] == Approx(-34.7542193937));
179 
180  CHECK(XYZ[83] == Approx(12.1418905657));
181  CHECK(gr0[83] == Approx(18.6798316395));
182  CHECK(gr1[83] == Approx(20.2364842761));
183  CHECK(gr2[83] == Approx(-48.5675622627));
184  CHECK(lap[83] == Approx(128.367962683));
185 }
186 
187 TEST_CASE("SoA Cartesian Tensor evaluateVGH subset", "[numerics]")
188 {
190 
191  double x = 1.3;
192  double y = 1.2;
193  double z = -0.5;
194  ct.evaluateVGH(x, y, z);
195 
196  const double* XYZ = ct.getcXYZ().data(0);
197  const double* gr0 = ct.getcXYZ().data(1);
198  const double* gr1 = ct.getcXYZ().data(2);
199  const double* gr2 = ct.getcXYZ().data(3);
200  const double* h00 = ct.getcXYZ().data(4);
201  const double* h01 = ct.getcXYZ().data(5);
202  const double* h02 = ct.getcXYZ().data(6);
203  const double* h11 = ct.getcXYZ().data(7);
204  const double* h12 = ct.getcXYZ().data(8);
205  const double* h22 = ct.getcXYZ().data(9);
206 
207  CHECK(XYZ[0] == Approx(0.282094791774));
208  CHECK(gr0[0] == Approx(0));
209  CHECK(gr1[0] == Approx(0));
210  CHECK(gr2[0] == Approx(0));
211 
212  CHECK(h00[0] == Approx(0));
213  CHECK(h01[0] == Approx(0));
214  CHECK(h02[0] == Approx(0));
215  CHECK(h11[0] == Approx(0));
216  CHECK(h12[0] == Approx(0));
217  CHECK(h22[0] == Approx(0));
218 
219 
220  CHECK(XYZ[1] == Approx(0.635183265474));
221  CHECK(gr0[1] == Approx(0.488602511903));
222  CHECK(gr1[1] == Approx(0));
223  CHECK(gr2[1] == Approx(0));
224 
225  CHECK(h00[1] == Approx(0));
226  CHECK(h01[1] == Approx(0));
227  CHECK(h02[1] == Approx(0));
228  CHECK(h11[1] == Approx(0));
229  CHECK(h12[1] == Approx(0));
230  CHECK(h22[1] == Approx(0));
231 
232 
233  CHECK(XYZ[15] == Approx(3.12417199136));
234  CHECK(gr0[15] == Approx(2.40320922412));
235  CHECK(gr1[15] == Approx(5.20695331894));
236  CHECK(gr2[15] == Approx(0));
237 
238  CHECK(h00[15] == Approx(0));
239  CHECK(h01[15] == Approx(4.00534870687));
240  CHECK(h02[15] == Approx(0));
241  CHECK(h11[15] == Approx(4.33912776578));
242  CHECK(h12[15] == Approx(0));
243  CHECK(h22[15] == Approx(0));
244 
245 
246  CHECK(XYZ[32] == Approx(-5.07677948596));
247  CHECK(gr0[32] == Approx(-7.81042997841));
248  CHECK(gr1[32] == Approx(-4.23064957164));
249  CHECK(gr2[32] == Approx(10.1535589719));
250 
251  CHECK(h00[32] == Approx(-6.00802306031));
252  CHECK(h01[32] == Approx(-6.50869164867));
253  CHECK(h02[32] == Approx(15.6208599568));
254  CHECK(h11[32] == Approx(0));
255  CHECK(h12[32] == Approx(8.46129914327));
256  CHECK(h22[32] == Approx(0));
257 
258 
259  CHECK(XYZ[52] == Approx(-1.44809247474));
260  CHECK(gr0[52] == Approx(-1.11391728826));
261  CHECK(gr1[52] == Approx(-1.20674372895));
262  CHECK(gr2[52] == Approx(8.68855484841));
263 
264  CHECK(h00[52] == Approx(0));
265  CHECK(h01[52] == Approx(-0.928264406882));
266  CHECK(h02[52] == Approx(6.68350372955));
267  CHECK(h11[52] == Approx(0));
268  CHECK(h12[52] == Approx(7.24046237368));
269  CHECK(h22[52] == Approx(-34.7542193937));
270 
271 
272  CHECK(XYZ[71] == Approx(-17.3423920977));
273  CHECK(gr0[71] == Approx(-53.3612064546));
274  CHECK(gr1[71] == Approx(-14.4519934148));
275  CHECK(gr2[71] == Approx(34.6847841955));
276 
277  CHECK(h00[71] == Approx(-123.141245664));
278  CHECK(h01[71] == Approx(-44.4676720455));
279  CHECK(h02[71] == Approx(106.722412909));
280  CHECK(h11[71] == Approx(0));
281  CHECK(h12[71] == Approx(28.9039868295));
282  CHECK(h22[71] == Approx(0));
283 }
284 
285 } // namespace qmcplusplus
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
#define OHMMS_PRECISION
Definition: config.h:70
TEST_CASE("complex_helper", "[type_traits]")
void evaluateV(T x, T y, T z, T *XYZ) const
compute Ylm
auto & getcXYZ() const
cXYZ accessor
OHMMS_PRECISION real_type
CHECK(log_values[0]==ComplexApprox(std::complex< double >{ 5.603777579195571, -6.1586603331188225 }))
CartesianTensor according to Gamess order.
void evaluateVGL(T x, T y, T z)
makes a table of and their gradients up to Lmax.