Exemplo n.º 1
0
 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);
 }