TEST_CASE("Test solver for the IEFPCM with NH3 molecule and a GePol cavity", "[solver][iefpcm][iefpcm_gepol-NH3]") { Molecule molec = NH3(); double area = 0.4; double probeRadius = 0.0; double minRadius = 100.0; GePolCavity cavity = GePolCavity(molec, area, probeRadius, minRadius); cavity.saveCavity("nh3.npz"); double permittivity = 78.39; Vacuum<AD_directional, CollocationIntegrator> gfInside = Vacuum<AD_directional, CollocationIntegrator>(); UniformDielectric<AD_directional, CollocationIntegrator> gfOutside = UniformDielectric<AD_directional, CollocationIntegrator>(permittivity); bool symm = true; IEFSolver solver(symm); solver.buildSystemMatrix(cavity, gfInside, gfOutside); double Ncharge = 7.0; double Hcharge = 1.0; size_t size = cavity.size(); Eigen::VectorXd fake_mep = computeMEP(molec, cavity.elements()); // The total ASC for a dielectric is -Q*(epsilon-1)/epsilon Eigen::VectorXd fake_asc = Eigen::VectorXd::Zero(size); fake_asc = solver.computeCharge(fake_mep); double totalASC = - (Ncharge + 3.0 * Hcharge) * (permittivity - 1) / permittivity; double totalFakeASC = fake_asc.sum(); CAPTURE(totalASC - totalFakeASC); REQUIRE(totalASC == Approx(totalFakeASC).epsilon(1.0e-03)); }
*/ WHEN("the point group is C1") { Molecule point = dummy<0>(2.929075493); double area = 0.4; double probeRadius = 0.0; double minRadius = 100.0; GePolCavity cavity(point, area, probeRadius, minRadius, "C1"); IEFSolver aniso_solver(symm); aniso_solver.buildAnisotropicMatrix(cavity, gf_i, gf_o, op); IEFSolver iso_solver(symm); iso_solver.buildIsotropicMatrix(cavity, gf_i, gf_o, op); int size = cavity.size(); Eigen::VectorXd fake_mep = computeMEP(cavity.elements(), charge); THEN("the total apparent surface charge is") { Eigen::VectorXd aniso_fake_asc = aniso_solver.computeCharge(fake_mep); Eigen::VectorXd iso_fake_asc = iso_solver.computeCharge(fake_mep); int nr_irrep = cavity.pointGroup().nrIrrep(); double totalAnisoASC = aniso_fake_asc.sum() * nr_irrep; double totalIsoASC = iso_fake_asc.sum() * nr_irrep; CAPTURE(totalASC); CAPTURE(totalAnisoASC); CAPTURE(totalASC - totalAnisoASC); REQUIRE(totalIsoASC == Approx(totalAnisoASC)); REQUIRE(totalASC == Approx(totalAnisoASC).epsilon(1.0e-03)); }