Codebase list votca-xtp / debian/1.5-1 src / tests / test_hdf5.cc
debian/1.5-1

Tree @debian/1.5-1 (Download .tar.gz)

test_hdf5.cc @debian/1.5-1raw · history · blame

/*
 * Copyright 2009-2018 The VOTCA Development Team (http://www.votca.org)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

#define BOOST_TEST_MAIN

#define BOOST_TEST_MODULE test_hdf5
#include <cassert>
#include <boost/test/unit_test.hpp>
#include <boost/test/floating_point_comparison.hpp>
#include <votca/xtp/orbitals.h>
#include <votca/xtp/qmatom.h>
#include <votca/xtp/checkpointwriter.h>
#include <votca/xtp/checkpointreader.h>
#include <votca/xtp/checkpoint.h>

BOOST_AUTO_TEST_SUITE(test_hdf5)
using namespace votca::xtp;
BOOST_AUTO_TEST_CASE(checkpoint_file_test) {

    int basisSetSize = 17;
    int occupiedLevels = 4;
    int unoccupiedLevels = 13;
    int numElectrons = 12;


    Eigen::VectorXd moeTest = Eigen::VectorXd::Random(17);
    Eigen::MatrixXd mocTest = Eigen::MatrixXd::Random(17,17);

    QMMolecule atoms=QMMolecule(" ",0);
    atoms.push_back(QMAtom(0,"O",Eigen::Vector3d::Zero()));

    double qmEnergy = -2.1025e-3;

    std::string qmPackage = "NOPE";
    double selfEnergy = 3.14159e23;

    std::string dftBasis = "AWESOME basis*,, 2/.8";
    std::string auxBasis = "cos(theta) = pretty okay basis";

    int rpaMin = '?';
    int rpaMax = 1e3;

    unsigned int bseVmin = -6019386;
    unsigned int bseCmax = 42;

    double scaHfx = 3.14159;

    bool useTDA = true;


    Eigen::MatrixXd vxcTest = Eigen::MatrixXd::Random(200,200);
    std::string someECP = "aye aye Cap'n";

    Eigen::MatrixXd QPpertEnergiesTest = Eigen::MatrixXd::Random(31, 42);
    Eigen::MatrixXd QPdiagEnergiesTest = Eigen::VectorXd::Random(21);
    Eigen::MatrixXd QPdiagCoefficientsTest = Eigen::MatrixXd::Identity(42, 42);


    MatrixXfd eh_dTest = MatrixXfd::Random(32, 290);
    MatrixXfd eh_xTest = MatrixXfd::Random(3, 22);
    VectorXfd BSESingletEnergiesTest = VectorXfd::Random(25);
    MatrixXfd BSESingletCoefficientsTest = MatrixXfd::Random(25, 38);
    MatrixXfd BSESingletCoefficientsARTest = MatrixXfd::Random(42, 42);

    VectorXfd BSETripletEnergiesTest = VectorXfd::Random(33);
    MatrixXfd BSETripletCoefficientsTest = MatrixXfd::Random(33,31);


    std::vector <Eigen::Vector3d> transitionDipolesTest;
    for (size_t i =0; i < 1000; ++i){
        transitionDipolesTest.push_back(Eigen::Vector3d::Ones());
    }

    {
        // Write orbitals
        Orbitals orbWrite;

        orbWrite.setBasisSetSize(basisSetSize);
        orbWrite.setNumberOfLevels(occupiedLevels, unoccupiedLevels);
        orbWrite.setNumberOfElectrons(numElectrons);
        orbWrite.MOEnergies() = moeTest;
        orbWrite.MOCoefficients() = mocTest;

        orbWrite.QMAtoms()=atoms;

        orbWrite.setQMEnergy(qmEnergy);
        orbWrite.setQMpackage(qmPackage);
        orbWrite.setSelfEnergy(selfEnergy);
        orbWrite.setDFTbasis(dftBasis);
        orbWrite.setAuxbasis(auxBasis);
        orbWrite.setRPAindices(rpaMin, rpaMax);
        // no need to write qpmin, qpmax
        orbWrite.setBSEindices(bseVmin, bseCmax, 3);
        orbWrite.setScaHFX(scaHfx);
        orbWrite.setTDAApprox(useTDA);
        orbWrite.setECP(someECP);
        orbWrite.QPpertEnergies() = QPpertEnergiesTest;
        orbWrite.QPdiagEnergies() = QPdiagEnergiesTest;
        orbWrite.QPdiagCoefficients() = QPdiagCoefficientsTest;
        orbWrite.eh_t() = eh_dTest;
        orbWrite.eh_s() = eh_xTest;
        orbWrite.BSESingletEnergies() = BSESingletEnergiesTest;
        orbWrite.BSESingletCoefficients() = BSESingletCoefficientsTest;
        orbWrite.BSESingletCoefficientsAR() = BSESingletCoefficientsARTest;
        orbWrite.TransitionDipoles() = transitionDipolesTest;
        orbWrite.BSETripletEnergies() = BSETripletEnergiesTest;
        orbWrite.BSETripletCoefficients() = BSETripletCoefficientsTest;

        orbWrite.WriteToCpt("xtp_testing.hdf5");

    }
    // Read Orbitals
    Orbitals orbRead;
    orbRead.ReadFromCpt("xtp_testing.hdf5");

    double tol = 1e-6;

    // Test the read values
    BOOST_CHECK_EQUAL(orbRead.getBasisSetSize() , basisSetSize);
    BOOST_CHECK_EQUAL(orbRead.getNumberOfLevels() , occupiedLevels + unoccupiedLevels);
    BOOST_CHECK_EQUAL(orbRead.getNumberOfElectrons() , numElectrons);
    BOOST_CHECK(orbRead.MOEnergies().isApprox(moeTest, tol));

    BOOST_CHECK(orbRead.MOCoefficients().isApprox(mocTest, tol));
    BOOST_CHECK_CLOSE(orbRead.getQMEnergy(), qmEnergy, tol);
    BOOST_CHECK_EQUAL(orbRead.getQMpackage(), qmPackage);
    BOOST_CHECK_CLOSE(orbRead.getSelfEnergy(), selfEnergy, tol);
    BOOST_CHECK_EQUAL(orbRead.getDFTbasis(), dftBasis);
    BOOST_CHECK_EQUAL(orbRead.getAuxbasis(), auxBasis);
    BOOST_CHECK_EQUAL(orbRead.getRPAmin(), rpaMin);
    BOOST_CHECK_EQUAL(orbRead.getRPAmax(), rpaMax);

    BOOST_CHECK_EQUAL(orbRead.getBSEvmin(), bseVmin);
    BOOST_CHECK_EQUAL(orbRead.getBSEcmax(), bseCmax);

    BOOST_CHECK_CLOSE(orbRead.getScaHFX(), scaHfx, tol);
    BOOST_CHECK_EQUAL(orbRead.getTDAApprox(), useTDA);
    BOOST_CHECK_EQUAL(orbRead.getECP(), someECP);
    BOOST_CHECK(orbRead.QPpertEnergies().isApprox(QPpertEnergiesTest, tol));
    BOOST_CHECK(orbRead.QPdiagEnergies().isApprox(QPdiagEnergiesTest, tol));
    BOOST_CHECK(orbRead.QPdiagCoefficients().isApprox(QPdiagCoefficientsTest));
    BOOST_CHECK(orbRead.eh_t().isApprox(eh_dTest, tol));
    BOOST_CHECK(orbRead.eh_s().isApprox(eh_xTest, tol));
    BOOST_CHECK(orbRead.BSESingletEnergies().isApprox(BSESingletEnergiesTest, tol));
    BOOST_CHECK(orbRead.BSESingletCoefficients().isApprox(BSESingletCoefficientsTest, tol));
    BOOST_CHECK(orbRead.BSESingletCoefficientsAR().isApprox(BSESingletCoefficientsARTest, tol));
    BOOST_CHECK(orbRead.BSETripletEnergies().isApprox(BSETripletEnergiesTest, tol));
    BOOST_CHECK(orbRead.BSETripletCoefficients().isApprox(BSETripletCoefficientsTest, tol));

    BOOST_REQUIRE_EQUAL(orbRead.TransitionDipoles().size(), transitionDipolesTest.size());

    for (size_t c = 0; c<transitionDipolesTest.size(); ++c){
        BOOST_CHECK(
            orbRead.TransitionDipoles()[c].isApprox(transitionDipolesTest[c], tol));

    }

    BOOST_REQUIRE_EQUAL(orbRead.QMAtoms().size(), atoms.size());

    for (int i = 0; i<atoms.size(); ++i){
        auto atomRead = orbRead.QMAtoms()[i];
        auto atomTest = atoms[i];
        BOOST_CHECK_EQUAL(atomRead.getAtomID(), atomTest.getAtomID());
        BOOST_CHECK(atomRead.getPos().isApprox(atomTest.getPos(), tol));
        BOOST_CHECK_EQUAL(atomRead.getNuccharge(), atomTest.getNuccharge());
        // no way to get qmatom index
    }
}

BOOST_AUTO_TEST_CASE(open_file_error){
    BOOST_REQUIRE_THROW(CheckpointFile cpf("/bin/mr/root/man.pls",
                                           CheckpointAccessLevel::READ),
                        std::runtime_error);
}

BOOST_AUTO_TEST_CASE(checkpoint_open_non_existing_loc) {
    CheckpointFile cpf ("testin_yo.ab", CheckpointAccessLevel::MODIFY);
    BOOST_REQUIRE_THROW(CheckpointReader r = cpf.getReader("/some/bulshit"),
                        std::runtime_error);

}

BOOST_AUTO_TEST_CASE(read_non_exisiting_matrix){

    CheckpointFile cpf("xtp_testing.hdf5", CheckpointAccessLevel::READ);
    CheckpointReader r = cpf.getReader("/QMdata");

    Eigen::MatrixXd someMatrix;

    BOOST_REQUIRE_THROW(r(someMatrix, "someMatrix012'5915.jb"),
                        std::runtime_error);
}

BOOST_AUTO_TEST_CASE(read_non_existing_scalar){
    CheckpointFile cpf("xtp_testing.hdf5", CheckpointAccessLevel::READ);
    CheckpointReader r = cpf.getReader("/QMdata");

    float someThing = 0;
    BOOST_REQUIRE_THROW(r(someThing, "someThing"), std::runtime_error);

}

BOOST_AUTO_TEST_SUITE_END()