void test2() { std::cout << "newSlaterTest test 2" << std::endl; double errorThreshold = 1e-5; int dim = 2; int nParticles = 6; double alpha = 0.987; double w = 1.0; long idum = -1; int cycles = 1000; mat rInit = randu(nParticles, dim); mat rNew = rInit; //-------------------------------------------------------------------------- // Analytic Orbital *orbital = new QDOrbital(dim, alpha, w); Slater *slater = new Slater(dim, nParticles, orbital); slater->setPosition(rInit, 0); slater->init(); slater->acceptPosition(); //-------------------------------------------------------------------------- // Moving one particle for (int n = 0; n < cycles; n++) { for (int i = 0; i < nParticles; i++) { for (int d = 0; d < dim; d++) rNew(i, d) = 2 * (ran3(&idum) - 0.5); slater->setPosition(rNew, i); slater->updateMatrix(); slater->updateInverse(); slater->acceptPosition(); // Sum over Laplace elements double laplace = 0; double laplaceNumeric = 0; for (int j = 0; j < nParticles; j++) { laplace += slater->getLaplacian(j); laplaceNumeric += slater->getLaplacianNumerical(j); } if (abs(laplace - laplaceNumeric) > errorThreshold) std::cout << "%TEST_FAILED% time=0 testname=test2 (newSlaterTest) message=Analytic solution not matching numeric." << endl << "Differeance = " << abs(laplace - laplaceNumeric) << " " << "\t laplace = " << laplace << " " << "\t laplaceNumeric = " << laplaceNumeric << " " << std::endl; } } }
void testingInverse() { std::cout << "newSlaterTest test 1" << std::endl; double errorThreshold = 1e-4; int dim = 2; int nParticles = 12; double alpha = 0.987; double w = 1.0; long idum = -1; int cycles = 20; mat rInit = randu(nParticles, dim); mat rNew = rInit; mat rOld = rInit; //-------------------------------------------------------------------------- // Analytic Orbital *orbital = new QDOrbital(dim, alpha, w); Slater *slater = new Slater(dim, nParticles, orbital); slater->setPosition(rInit, 0); slater->init(); slater->acceptPosition(); //-------------------------------------------------------------------------- // Numeric Orbital *orbitalNumeric = new QDOrbital(dim, alpha, w); Slater *slaterNumeric = new Slater(dim, nParticles, orbitalNumeric); slaterNumeric->setPosition(rInit, 0); slaterNumeric->init(); slaterNumeric->acceptPosition(); //-------------------------------------------------------------------------- // Moving one particle for (int n = 0; n < cycles; n++) { for (int i = 0; i < nParticles; i++) { for (int d = 0; d < dim; d++) rNew(i, d) = 2 * (ran3(&idum) - 0.5); // Updating analytic slater->setPosition(rNew, i); slater->updateMatrix(); // Updating numeric slaterNumeric->setPosition(rNew, i); slaterNumeric->updateMatrix(); // 50 percent chance of acceptance if (ran3(&idum) >= 0.5) { slater->updateInverse(); slater->acceptPosition(); slaterNumeric->updateInverseNumeric(); slaterNumeric->acceptPosition(); for (int d = 0; d < dim; d++) rOld(i, d) = rNew(i, d); } else { slater->rejectPosition(); slaterNumeric->rejectPosition(); for (int d = 0; d < dim; d++) rNew(i, d) = rOld(i, d); } mat DpInv = slater->DpInv; mat DmInv = slater->DmInv; mat Dp = slater->Dp; mat Dm = slater->Dm; mat DpInvNumeric = slaterNumeric->DpInv; mat DmInvNumeric = slaterNumeric->DmInv; // Printing difference if (abs(det(DpInv * Dp) - 1) > errorThreshold) std::cout << "%TEST_FAILED% time=0 testname=test2 (newSlaterTest) message=Analytic solution not matching numeric. " << endl << DpInv * Dp << std::endl; } } }