Example #1
0
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));
      }