1 /*
2  * Copyright 2009-2020 The VOTCA Development Team (http://www.votca.org)
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  *
15  */
16 #include <libint2/initialize.h>
17 #define BOOST_TEST_MAIN
18 
19 #define BOOST_TEST_MODULE sphere_lebedev_rule_test
20 
21 // Standard includes
22 #include <fstream>
23 
24 // Third party includes
25 #include <boost/test/unit_test.hpp>
26 
27 // Local VOTCA includes
28 #include "votca/xtp/orbitals.h"
29 #include "votca/xtp/sphere_lebedev_rule.h"
30 #include <votca/tools/eigenio_matrixmarket.h>
31 
32 using namespace votca::xtp;
33 using namespace votca;
34 
35 BOOST_AUTO_TEST_SUITE(sphere_lebedev_rule_test)
BOOST_AUTO_TEST_CASE(rpa_h2p)36 
37 BOOST_AUTO_TEST_CASE(medium_test) {
38   libint2::initialize();
39   QMMolecule mol("noname", 0);
40   mol.LoadFromFile(std::string(XTP_TEST_DATA_FOLDER) +
41                    "/sphere_lebedev_rule/CH4.xyz");
42 
43   LebedevGrid spheregrid;
44 
45   auto grid = spheregrid.CalculateSphericalGrids(mol, "medium");
46 
47   auto Hgrid = grid.at("H");
48   auto Cgrid = grid.at("C");
49 
50   Eigen::VectorXd C_phi_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
51       std::string(XTP_TEST_DATA_FOLDER) +
52       "/sphere_lebedev_rule/C_phi_ref_medium.mm");
53   C_phi_ref *= votca::tools::conv::Pi / 180.0;
54 
55   Eigen::VectorXd C_theta_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
56       std::string(XTP_TEST_DATA_FOLDER) +
57       "/sphere_lebedev_rule/C_theta_ref_medium.mm");
58 
59   Eigen::VectorXd C_weight_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
60       std::string(XTP_TEST_DATA_FOLDER) +
61       "/sphere_lebedev_rule/C_weight_ref_medium.mm");
62   BOOST_CHECK_EQUAL(Cgrid.phi.size(), C_phi_ref.size());
63   BOOST_CHECK_EQUAL(Cgrid.theta.size(), C_theta_ref.size());
64   BOOST_CHECK_EQUAL(Cgrid.weight.size(), C_weight_ref.size());
65   BOOST_CHECK_EQUAL(Hgrid.phi.size(), C_phi_ref.size());
66   BOOST_CHECK_EQUAL(Hgrid.theta.size(), C_theta_ref.size());
67   BOOST_CHECK_EQUAL(Hgrid.weight.size(), C_weight_ref.size());
68 
69   bool Cphi = C_phi_ref.isApprox(Cgrid.phi, 0.001);
70   bool Ctheta = C_theta_ref.isApprox(Cgrid.theta, 0.001);
71   if (!Cphi || !Ctheta) {
72     std::cout << "phi_ref : Phi_comp | theta_ref : theta_comp" << std::endl;
73     for (Index i = 0; i < C_phi_ref.size(); i++) {
74       std::cout << Cgrid.phi[i] << ":" << C_phi_ref[i] << " | "
75                 << Cgrid.theta[i] << ":" << C_theta_ref[i] << std::endl;
76     }
77   }
78   bool Cweight = C_weight_ref.isApprox(Cgrid.weight, 0.0001);
79   BOOST_CHECK_EQUAL(Cphi, true);
80   BOOST_CHECK_EQUAL(Ctheta, true);
81   BOOST_CHECK_EQUAL(Cweight, true);
82 
83   bool Hphi = C_phi_ref.isApprox(Hgrid.phi, 0.001);
84   bool Htheta = C_theta_ref.isApprox(Hgrid.theta, 0.001);
85   bool Hweight = C_weight_ref.isApprox(Hgrid.weight, 0.0001);
86   BOOST_CHECK_EQUAL(Hphi, true);
87   BOOST_CHECK_EQUAL(Htheta, true);
88   BOOST_CHECK_EQUAL(Hweight, true);
89   libint2::finalize();
90 }
91 
92 BOOST_AUTO_TEST_CASE(fine_test) {
93   libint2::initialize();
94   QMMolecule mol("noname", 0);
95   mol.LoadFromFile(std::string(XTP_TEST_DATA_FOLDER) +
96                    "/sphere_lebedev_rule/molecule.xyz");
97   LebedevGrid spheregrid;
98 
99   auto grid = spheregrid.CalculateSphericalGrids(mol, "fine");
100 
101   auto Hgrid = grid.at("H");
102   auto Gegrid = grid.at("Ge");
103 
104   Eigen::VectorXd Ge_phi_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
105       std::string(XTP_TEST_DATA_FOLDER) +
106       "/sphere_lebedev_rule/Ge_phi_ref_fine.mm");
107 
108   Eigen::VectorXd Ge_theta_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
109       std::string(XTP_TEST_DATA_FOLDER) +
110       "/sphere_lebedev_rule/Ge_theta_ref_fine.mm");
111 
112   Eigen::VectorXd Ge_weight_ref =
113       votca::tools::EigenIO_MatrixMarket::ReadVector(
114           std::string(XTP_TEST_DATA_FOLDER) +
115           "/sphere_lebedev_rule/Ge_weight_ref_fine.mm");
116 
117   Eigen::VectorXd H_phi_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
118       std::string(XTP_TEST_DATA_FOLDER) +
119       "/sphere_lebedev_rule/H_phi_ref_fine.mm");
120 
121   Eigen::VectorXd H_theta_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
122       std::string(XTP_TEST_DATA_FOLDER) +
123       "/sphere_lebedev_rule/H_theta_ref_fine.mm");
124 
125   Eigen::VectorXd H_weight_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
126       std::string(XTP_TEST_DATA_FOLDER) +
127       "/sphere_lebedev_rule/H_weight_ref_fine.mm");
128 
129   BOOST_CHECK_EQUAL(Gegrid.phi.size(), Ge_phi_ref.size());
130   BOOST_CHECK_EQUAL(Gegrid.theta.size(), Ge_theta_ref.size());
131   BOOST_CHECK_EQUAL(Gegrid.weight.size(), Ge_weight_ref.size());
132   BOOST_CHECK_EQUAL(Hgrid.phi.size(), H_phi_ref.size());
133   BOOST_CHECK_EQUAL(Hgrid.theta.size(), H_theta_ref.size());
134   BOOST_CHECK_EQUAL(Hgrid.weight.size(), H_weight_ref.size());
135 
136   bool Gephi = Ge_phi_ref.isApprox(Gegrid.phi, 0.001);
137   bool Getheta = Ge_theta_ref.isApprox(Gegrid.theta, 0.001);
138   if (!Gephi || !Getheta) {
139     std::cout << "phi_ref : Phi_comp | theta_ref : theta_comp" << std::endl;
140     for (Index i = 0; i < Ge_phi_ref.size(); i++) {
141       std::cout << Gegrid.phi[i] << ":" << Ge_phi_ref[i] << " | "
142                 << Gegrid.theta[i] << ":" << Ge_theta_ref[i] << std::endl;
143     }
144   }
145 
146   bool Geweight = Ge_weight_ref.isApprox(Gegrid.weight, 0.0001);
147   BOOST_CHECK_EQUAL(Gephi, true);
148   BOOST_CHECK_EQUAL(Getheta, true);
149   BOOST_CHECK_EQUAL(Geweight, true);
150 
151   bool Hphi = H_phi_ref.isApprox(Hgrid.phi, 0.001);
152   bool Htheta = H_theta_ref.isApprox(Hgrid.theta, 0.001);
153   bool Hweight = H_weight_ref.isApprox(Hgrid.weight, 0.0001);
154   BOOST_CHECK_EQUAL(Hphi, true);
155   BOOST_CHECK_EQUAL(Htheta, true);
156   BOOST_CHECK_EQUAL(Hweight, true);
157   libint2::finalize();
158 }
159 BOOST_AUTO_TEST_CASE(element_not_implemented) {
160   libint2::initialize();
161   QMMolecule mol("noname", 0);
162   mol.LoadFromFile(std::string(XTP_TEST_DATA_FOLDER) +
163                    "/sphere_lebedev_rule/hg.xyz");
164 
165   LebedevGrid spheregrid;
166 
167   BOOST_REQUIRE_THROW(spheregrid.CalculateSphericalGrids(mol, "xfine"),
168                       std::runtime_error);
169   libint2::finalize();
170 }
171 
172 BOOST_AUTO_TEST_CASE(xfine_test) {
173   libint2::initialize();
174   QMMolecule mol("noname", 0);
175   mol.LoadFromFile(std::string(XTP_TEST_DATA_FOLDER) +
176                    "/sphere_lebedev_rule/molecule.xyz");
177 
178   LebedevGrid spheregrid;
179 
180   auto grid = spheregrid.CalculateSphericalGrids(mol, "xfine");
181 
182   auto Hgrid = grid.at("H");
183   auto Gegrid = grid.at("Ge");
184 
185   Eigen::VectorXd Ge_phi_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
186       std::string(XTP_TEST_DATA_FOLDER) +
187       "/sphere_lebedev_rule/Ge_phi_ref_xfine.mm");
188 
189   Eigen::VectorXd Ge_theta_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
190       std::string(XTP_TEST_DATA_FOLDER) +
191       "/sphere_lebedev_rule/Ge_theta_ref_xfine.mm");
192 
193   Eigen::VectorXd Ge_weight_ref =
194       votca::tools::EigenIO_MatrixMarket::ReadVector(
195           std::string(XTP_TEST_DATA_FOLDER) +
196           "/sphere_lebedev_rule/Ge_weight_ref_xfine.mm");
197 
198   Eigen::VectorXd H_phi_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
199       std::string(XTP_TEST_DATA_FOLDER) +
200       "/sphere_lebedev_rule/H_phi_ref_xfine.mm");
201 
202   Eigen::VectorXd H_theta_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
203       std::string(XTP_TEST_DATA_FOLDER) +
204       "/sphere_lebedev_rule/H_theta_ref_xfine.mm");
205   Eigen::VectorXd H_weight_ref = votca::tools::EigenIO_MatrixMarket::ReadVector(
206       std::string(XTP_TEST_DATA_FOLDER) +
207       "/sphere_lebedev_rule/H_weight_ref_xfine.mm");
208   BOOST_CHECK_EQUAL(Gegrid.phi.size(), Ge_phi_ref.size());
209   BOOST_CHECK_EQUAL(Gegrid.theta.size(), Ge_theta_ref.size());
210   BOOST_CHECK_EQUAL(Gegrid.weight.size(), Ge_weight_ref.size());
211   BOOST_CHECK_EQUAL(Hgrid.phi.size(), H_phi_ref.size());
212   BOOST_CHECK_EQUAL(Hgrid.theta.size(), H_theta_ref.size());
213   BOOST_CHECK_EQUAL(Hgrid.weight.size(), H_weight_ref.size());
214 
215   bool Gephi = Ge_phi_ref.isApprox(Gegrid.phi, 0.001);
216   bool Getheta = Ge_theta_ref.isApprox(Gegrid.theta, 0.001);
217   if (!Gephi || !Getheta) {
218     std::cout << "phi_ref : Phi_comp | theta_ref : theta_comp" << std::endl;
219     for (Index i = 0; i < Ge_phi_ref.size(); i++) {
220       std::cout << Gegrid.phi[i] << ":" << Ge_phi_ref[i] << " | "
221                 << Gegrid.theta[i] << ":" << Ge_theta_ref[i] << std::endl;
222     }
223   }
224 
225   bool Geweight = Ge_weight_ref.isApprox(Gegrid.weight, 0.0001);
226   BOOST_CHECK_EQUAL(Gephi, true);
227   BOOST_CHECK_EQUAL(Getheta, true);
228   BOOST_CHECK_EQUAL(Geweight, true);
229 
230   bool Hphi = H_phi_ref.isApprox(Hgrid.phi, 0.001);
231   bool Htheta = H_theta_ref.isApprox(Hgrid.theta, 0.001);
232   bool Hweight = H_weight_ref.isApprox(Hgrid.weight, 0.0001);
233   BOOST_CHECK_EQUAL(Hphi, true);
234   BOOST_CHECK_EQUAL(Htheta, true);
235   BOOST_CHECK_EQUAL(Hweight, true);
236 
237   libint2::finalize();
238 }
239 
240 BOOST_AUTO_TEST_SUITE_END()
241