void test_NaCl_gradient() { using namespace boost; molc->eval(mnacl); // default gradients are all zero std::vector<R3::Vector> g = molc->gradients(); TS_ASSERT_EQUALS(8u, g.size()); for (int i = 0; i < 8; ++i) { TS_ASSERT_DELTA(0.0, R3::norm(g[i]), meps); } StructureAdapterPtr nacl1 = mnacl->clone(); PeriodicStructureAdapter& nacl1ref = static_cast<PeriodicStructureAdapter&>(*nacl1); R3::Vector& xyzc0 = nacl1ref[0].xyz_cartn; xyzc0 = R3::Vector(0.02, 0.03, 0.07); molc->eval(nacl1); double c0 = molc->totalSquareOverlap(); R3::Vector g0 = molc->gradients()[0]; TS_ASSERT(R3::norm(g0) > meps); R3::Vector g0n; const double dx = 1e-8; for (int i = 0; i < R3::Ndim; ++i) { xyzc0[i] += dx; molc->eval(nacl1); g0n[i] = (molc->totalSquareOverlap() - c0) / dx; xyzc0[i] -= dx; } TS_ASSERT_DELTA(0.0, R3::norm(g0 - g0n), 1e-6); }
void test_empty_instance() { TS_ASSERT_EQUALS(0, mstru->countSites()); TS_ASSERT_EQUALS(mstru.get(), mstru->clone().get()); TS_ASSERT_EQUALS(mstru, emptyStructureAdapter()); TS_ASSERT_THROWS(mstru->siteAtomType(0), std::out_of_range); TS_ASSERT_THROWS(mstru->siteCartesianPosition(0), std::out_of_range); TS_ASSERT_THROWS(mstru->siteMultiplicity(0), std::out_of_range); TS_ASSERT_THROWS(mstru->siteOccupancy(0), std::out_of_range); TS_ASSERT_THROWS(mstru->siteAnisotropy(0), std::out_of_range); TS_ASSERT_THROWS(mstru->siteCartesianPosition(0), std::out_of_range); }