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