def test_prim_vec_from_angles_tetr():
    energy_driver = None
    template_file = None
    #s = []
    abc = []
    angles = [90, 90, 90]
    run = m.DftRun(energy_driver, template_file, abc, angles=angles)
    correct_vec = np.array([[1,0,0],[0,1,0], [0,0,1]])
    assert np.isclose(run._prim_vec_from_angles(), correct_vec).all()
def test_angles_prim_vec_both():
    """
    raises value error if both angles and prim_vec are specified
    """
    energy_driver = None
    template_file = None
    abc = []
    with pytest.raises(ValueError):
        m.DftRun(energy_driver, template_file, abc, angles=[90, 90, 90], prim_vec_unscaled=[] )
def test_preprocess_file_bad():
    """
    entering bad name for energy driver raises value error
    """
    energy_driver = 'bad_energy_driver_name'
    template_file = None
    pvu = []
    abc = []
    run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
    with pytest.raises(ValueError):
        run._preprocess_file()
def test_angles_prim_vec_neither():
    """
    raises value error if neither of angles and prim_vec are specified
    """
    energy_driver = None
    template_file = None
    #abc_guess = []
    #s = []
    abc = []
    with pytest.raises(ValueError):
        m.DftRun(energy_driver, template_file, abc)
def test_get_energy_elk():
    """read total energy from elk correctly"""
    with TemporaryDirectory() as tmp_dir:
        energy_driver = 'elk'
        template_file = None
        abc = []
        pvu = []
        run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
        shutil.copy(os.path.join(input_dir, 'TOTENERGY.OUT.example'), 'TOTENERGY.OUT')
        E = run.get_energy()
        assert np.isclose(E, -7.51826352965)
def test_get_energy_espresso_none():
    """ raises NoEnergyFromDFT if espresso output file doesn't show completion"""
    with TemporaryDirectory() as tmp_dir:
        with pytest.raises(m.NoEnergyFromDFT):
            energy_driver = 'quantumespresso'
            template_file = None
            abc = []
            pvu = []
            run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
            shutil.copy(os.path.join(input_dir, 'espresso.out.noenergy'), 'log')
            E = run.get_energy()
def test_get_energy_espresso():
    """read final energy from espresso output file correctly"""
    with TemporaryDirectory() as tmp_dir:
        energy_driver = 'quantumespresso'
        template_file = None
        abc = []
        pvu = []
        run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
        shutil.copy(os.path.join(input_dir, 'espresso.out.example'), 'log')
        E = run.get_energy()
        assert np.isclose(E, -4.18725738/2.)
def test_get_energy_socorro_relax():
    """ gets FINAL energy from socorro diaryf if relaxation was performed """
    with TemporaryDirectory() as tmp_dir:
        energy_driver = 'socorro'
        template_file = None
        abc = []
        pvu = []
        run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
        shutil.copy(os.path.join(input_dir, 'diaryf.relax'), 'diaryf')
        E = run.get_energy()
        assert np.isclose(E, -360.361967002/2.)
def test_get_energy_socorro_none():
    """ raises NoEnergyFromDFT if socorro doesn't complete """
    with TemporaryDirectory() as tmp_dir:
        with pytest.raises(m.NoEnergyFromDFT):
            energy_driver = 'socorro'
            template_file = None
            abc = []
            pvu = []
            run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
            shutil.copy(os.path.join(input_dir, 'diaryf.noenergy'), 'diaryf')
            E = run.get_energy()
def test_get_energy_socorro():
    """read cell enrgy from socorro correctly"""
    with TemporaryDirectory() as tmp_dir:
        energy_driver = 'socorro'
        template_file = None
        abc = []
        pvu = []
        run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
        shutil.copy(os.path.join(input_dir, 'diaryf.example'), 'diaryf')
        E = run.get_energy()
        assert np.isclose(E, -74.637868487/2.)
def test_abinit_get_energy_multiple():
    """When multiple etotal reported, returns correct etotal in Hartree"""
    with TemporaryDirectory() as tmp_dir:
        energy_driver='abinit'
        template_file = None
        abc = []
        pvu = []
        run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
        shutil.copy(os.path.join(input_dir, 'log.structurerelax.example'), 'log')
        E = run.get_energy()
        assert np.isclose(E, -7.3655263854)
def test_abinit_get_energy_single():
    """When only single etotal reported (typical case), returns etotal in Hartree"""
    with TemporaryDirectory() as tmp_dir:
        energy_driver='abinit'
        template_file = None
        abc = []
        pvu = []
        run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
        shutil.copy(os.path.join(input_dir, 'log.example'), 'log')
        E = run.get_energy()
        assert np.isclose(E, -6.1395717098)
def test_get_energy_bad():
    """
    entering bad name for energy driver raises value error
    """
    energy_driver = 'bad'
    template_file = None
    abc = []
    pvu = [[1,1,0], [0,1,1], [1,0,1]]
    run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
    with pytest.raises(ValueError):
        run.get_energy()
def test_get_energy_espresso_relax():
    """ gets FINAL energy from espresso if relaxation was performed """
    with TemporaryDirectory() as tmp_dir:
        energy_driver = 'quantumespresso'
        template_file = None
        abc = []
        pvu = []
        run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
        shutil.copy(os.path.join(input_dir, 'espresso.out.relax'), 'log')
        E = run.get_energy()
        assert np.isclose(E, -29.22370146/2.)
def test_preprocess_file_espresso_rprim():
    """
    calling _preprocess_file for espresso correctly writes scale and lattice constants to 
    espresso input file
    """
    with TemporaryDirectory() as tmp_dir:
        correct_file = os.path.join(input_dir, 'espresso.in.correct')
        energy_driver = 'quantumespresso'
        template_file = os.path.join(input_dir, 'espresso.in.template.example')
        abc = [1.5, 3, 6] 
        pvu = [[1,1,0], [0,1,1], [1,0,1]]
        run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
        run._preprocess_file()
        # compare written espresso input file with correct input file
        with open(correct_file) as f1, open('espresso.in') as f2:
            assert f1.readlines() == f2.readlines()
def test_preprocess_file_abinit_rprim():
    """
    calling _preprocess_file with for abinit correctly writes acell and lattice vectors to file
    
    not very robust since different number format would cause a fail
    """
    with TemporaryDirectory() as tmp_dir:
        correct_file = os.path.join(input_dir, 'abinit.in.correct.2')
        energy_driver = 'abinit'
        template_file = os.path.join(input_dir, 'abinit.in.template.example')
        abc = [1.5,3,6]
        pvu = [[1,1,0], [0,1,1], [1,0,1]]
        run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
        run._preprocess_file()
        # compare written abinit file with correct input file
        with open(correct_file) as f1, open('abinit.in') as f2:
            assert f1.readlines() == f2.readlines()
def test_preprocess_file_socorro_rprim():
    """
    calling _preprocess_file for socorro correctly writes scale and lattice constants to socorro crystal file
    
    not very robust since different number format would cause a fail
    """
    with TemporaryDirectory() as tmp_dir:
        correct_file = os.path.join(input_dir, 'crystal.correct')
        energy_driver = 'socorro'
        template_file = os.path.join(input_dir, 'crystal.template.example')
        abc = [1.5, 3, 6] 
        pvu = [[1,1,0], [0,1,1], [1,0,1]]
        run = m.DftRun(energy_driver, template_file, abc, prim_vec_unscaled=pvu)
        run._preprocess_file()
        # compare written socorro crystal file with correct input file
        with open(correct_file) as f1, open('crystal') as f2:
            assert f1.readlines() == f2.readlines()
def test_preprocess_file_abinit_angdeg():
    """
    calling _preprocess_file with for abinit correctly writes lattice constants and angles to abinit input file.
    
    not very robust since different number format would cause a fail
    """
    with TemporaryDirectory() as tmp_dir:
        energy_driver = 'abinit'
        template_file = os.path.join(input_dir, 'abinit.in.template.example')
        correct_file = os.path.join(input_dir, 'abinit.in.correct')
        ang = [90, 90, 120]
        abc = [1.5, 3.0, 4.5]
        run = m.DftRun(energy_driver, template_file, abc, angles=ang)
        run._preprocess_file()
        # compare written abinit file with correct input file
        with open(correct_file) as f1, open('abinit.in') as f2:
            assert f1.readlines() == f2.readlines()
def test_calc_unit_cell_volume_2():
    abc = [8,10,12]
    pvu = [[2,0,0], [0,3,0], [0,0,1]]
    run = m.DftRun(None, None, abc, prim_vec_unscaled=pvu)
    assert np.isclose(run._calc_unit_cell_volume(),  5760.)
def test_calc_unit_cell_volume_3():
    abc = [12,15,18]
    pvu = [[1,1,0], [0,1,1], [1,0,1]]
    run = m.DftRun(None, None, abc, prim_vec_unscaled=pvu)
    assert np.isclose(run._calc_unit_cell_volume(),  6480.)
def test_calc_unit_cell_volume_6():
    abc = [2,2,10]
    angles = [90,90,120]
    run = m.DftRun(None, None, abc, angles=angles)
    assert np.isclose(run._calc_unit_cell_volume(), 20*np.sqrt(3))
def test_calc_unit_cell_volume_5():
    abc = [3,6,9]
    angles = [90,90,90]
    run = m.DftRun(None, None, abc, angles=angles)
    assert np.isclose(run._calc_unit_cell_volume(),  162.)