Пример #1
0
def run_mio_test(test=None):
    database_folder = os.getenv('MIO')
    if database_folder is None:
        raise RuntimeError('Please use environment variable MIO to specify path to mio Slater-Koster tables.')

    calc = Atomistica(
        [ native.TightBinding(
        database_folder = database_folder,
        SolverLAPACK = dict(electronic_T=0.001),
        SCC = dict(dq_crit = 1e-4,
                   mixing = 0.2, # 0.2
                   andersen_memory = 3, # 3
                   maximum_iterations = 100,
                   log = True)
        ),
          native.DirectCoulomb(),
          native.SlaterCharges(cutoff=10.0) ],
        avgn = 1000
        )
    check_db(calc, db2, test=test)
Пример #2
0
a = molecule('H2O')
a.center(vacuum=10.0)

###

database_folder = os.getenv('MIO')
if database_folder is None:
    raise RuntimeError(
        'Please use environment variable MIO to specify path to mio Slater-Koster tables.'
    )

tb = native.TightBinding(
    database_folder=database_folder,
    SolverLAPACK=dict(electronic_T=0.001),
    SCC=dict(
        dq_crit=1e-4,
        mixing=0.2,  # 0.2
        andersen_memory=3,  # 3
        maximum_iterations=100,
        log=True))
calc = Atomistica(
    [tb, native.DirectCoulomb(),
     native.SlaterCharges(cutoff=10.0)], avgn=1000)

a.set_calculator(calc)
print('potential energy =', a.get_potential_energy())

print('eigenvalues:')
for ev, occ in zip(tb.eigenvalues, tb.occupation):
    print(ev, occ)
Пример #3
0
def run_dftb3_test(test=None, tol=0.05):
    mio_database_folder = os.getenv('MIO')
    if mio_database_folder is None:
        raise RuntimeError(
            'Please use environment variable MIO to specify path to mio Slater-Koster tables.'
        )
    dftb3_database_folder = os.getenv('DFTB3')
    if dftb3_database_folder is None:
        raise RuntimeError(
            'Please use environment variable DFTB3 to specify path to 3ob Slater-Koster tables.'
        )

    dftb2_calc = Atomistica(
        [
            native.TightBinding(
                database_folder=mio_database_folder,
                SolverLAPACK=dict(electronic_T=0.001),
                SCC=dict(
                    dq_crit=1e-6,
                    mixing=0.05,  # 0.2
                    andersen_memory=15,  # 3
                    maximum_iterations=100,
                    log=True)),
            native.DirectCoulomb(),
            native.SlaterCharges(cutoff=10.0)
        ],
        avgn=1000)

    dftb2_XH_calc = Atomistica(
        [
            native.TightBinding(
                database_folder=mio_database_folder,
                SolverLAPACK=dict(electronic_T=0.001),
                SCC=dict(
                    dq_crit=1e-6,
                    mixing=0.05,  # 0.2
                    andersen_memory=15,  # 3
                    maximum_iterations=100,
                    log=True)),
            native.DirectCoulomb(),
            native.SlaterCharges(cutoff=10.0, damp_gamma=True, zeta=3.70)
        ],
        avgn=1000)

    dftb3_calc = Atomistica(
        [
            native.TightBinding(
                database_folder=mio_database_folder,
                SolverLAPACK=dict(electronic_T=0.001),
                SCC=dict(
                    dq_crit=1e-6,
                    mixing=0.05,  # 0.2
                    andersen_memory=15,  # 3
                    maximum_iterations=100,
                    log=True)),
            native.DirectCoulomb(),
            native.SlaterCharges(cutoff=10.0,
                                 dftb3=True,
                                 HubbardDerivatives=dict(H=-0.1857, O=-0.1575))
        ],
        avgn=1000)

    dftb3_XH_calc = Atomistica(
        [
            native.TightBinding(
                database_folder=mio_database_folder,
                SolverLAPACK=dict(electronic_T=0.001),
                SCC=dict(
                    dq_crit=1e-6,
                    mixing=0.05,  # 0.2
                    andersen_memory=15,  # 3
                    maximum_iterations=100,
                    log=True)),
            native.DirectCoulomb(),
            native.SlaterCharges(cutoff=10.0,
                                 dftb3=True,
                                 damp_gamma=True,
                                 zeta=4.05,
                                 HubbardDerivatives=dict(H=-0.1857, O=-0.1575))
        ],
        avgn=1000)

    dftb3_XH_3ob_calc = Atomistica(
        [
            native.TightBinding(
                database_folder=dftb3_database_folder,
                SolverLAPACK=dict(electronic_T=0.001),
                SCC=dict(
                    dq_crit=1e-6,
                    mixing=0.05,  # 0.2
                    andersen_memory=15,  # 3
                    maximum_iterations=100,
                    log=True)),
            native.DirectCoulomb(),
            native.SlaterCharges(cutoff=10.0,
                                 dftb3=True,
                                 damp_gamma=True,
                                 zeta=4.00,
                                 HubbardDerivatives=dict(H=-0.1857, O=-0.1575))
        ],
        avgn=1000)

    if test is None:
        print(
            '    nH2O|    G3B3|    DFTB2 (MIO)  | DFTB2+XH (MIO)  |    DFTB3 (MIO)  | DFTB3+XH (MIO)  | DFTB3+XH (3OB)  |'
        )
        print(
            '        |        |     me    ref.  |     me    ref.  |     me    ref.  |     me    ref.  |     me    ref.  |'
        )
        print(
            '        |        |-----------------|-----------------|-----------------|-----------------|-----------------|'
        )

    for name, data in table5_data.items():
        e0_DFTB2 = 0.0
        e0_DFTB3 = 0.0
        e0_DFTB2_XH = 0.0
        e0_DFTB3_XH = 0.0
        e0_DFTB3_3ob_XH = 0.0
        for structure in data['reference_structures']:
            if os.path.exists(structure):
                a = read(structure)
            else:
                a = molecule(structure)

            a.center(vacuum=10.0)
            a.set_calculator(dftb2_calc)
            FIRE(a, logfile=None).run(fmax=0.001)
            e0_DFTB2 += a.get_potential_energy()

            a.set_calculator(dftb2_XH_calc)
            FIRE(a, logfile=None).run(fmax=0.001)
            e0_DFTB2_XH += a.get_potential_energy()

            a.set_calculator(dftb3_calc)
            FIRE(a, logfile=None).run(fmax=0.001)
            e0_DFTB3 += a.get_potential_energy()

            a.set_calculator(dftb3_XH_calc)
            FIRE(a, logfile=None).run(fmax=0.001)
            e0_DFTB3_XH += a.get_potential_energy()

            a.set_calculator(dftb3_XH_3ob_calc)
            FIRE(a, logfile=None).run(fmax=0.001)
            e0_DFTB3_3ob_XH += a.get_potential_energy()

        eref_G3B3 = data['G3B3']
        eref_DFTB2 = data['DFTB2']
        eref_DFTB2_XH = data['DFTB2+XH']
        eref_DFTB3 = data['DFTB3']
        eref_DFTB3_XH = data['DFTB3+XH']
        eref_DFTB3_3ob_XH = data['DFTB3+XH_3ob']

        a = read(data['structure'])
        a.center(vacuum=10.0)
        a.set_calculator(dftb2_calc)
        FIRE(a, logfile=None).run(fmax=0.001)
        e_DFTB2 = a.get_potential_energy()

        e_DFTB2 = (e_DFTB2 - e0_DFTB2) / (ase.units.kcal / ase.units.mol)

        a.set_calculator(dftb2_XH_calc)
        FIRE(a, logfile=None).run(fmax=0.001)
        e_DFTB2_XH = a.get_potential_energy()

        e_DFTB2_XH = (e_DFTB2_XH - e0_DFTB2_XH) / (ase.units.kcal /
                                                   ase.units.mol)

        a.set_calculator(dftb3_calc)
        FIRE(a, logfile=None).run(fmax=0.001)
        e_DFTB3 = a.get_potential_energy()

        e_DFTB3 = (e_DFTB3 - e0_DFTB3) / (ase.units.kcal / ase.units.mol)

        a.set_calculator(dftb3_XH_calc)
        FIRE(a, logfile=None).run(fmax=0.001)
        e_DFTB3_XH = a.get_potential_energy()

        e_DFTB3_XH = (e_DFTB3_XH - e0_DFTB3_XH) / (ase.units.kcal /
                                                   ase.units.mol)

        a.set_calculator(dftb3_XH_3ob_calc)
        FIRE(a, logfile=None).run(fmax=0.001)
        e_DFTB3_3ob_XH = a.get_potential_energy()

        e_DFTB3_3ob_XH = (e_DFTB3_3ob_XH - e0_DFTB3_3ob_XH) / (ase.units.kcal /
                                                               ase.units.mol)

        success_DFTB2 = abs(e_DFTB2 - eref_G3B3 - eref_DFTB2) < tol
        success_DFTB2_XH = abs(e_DFTB2_XH - eref_G3B3 - eref_DFTB2_XH) < tol
        success_DFTB3 = abs(e_DFTB3 - eref_G3B3 - eref_DFTB3) < tol
        success_DFTB3_XH = abs(e_DFTB3_XH - eref_G3B3 - eref_DFTB3_XH) < tol
        success_DFTB3_3ob_XH = abs(e_DFTB3_3ob_XH - eref_G3B3 -
                                   eref_DFTB3_3ob_XH) < tol

        success_str = {True: ' ', False: 'X'}

        if test is None:
            print(
                '{0:>8}| {1:>7.3f}|{2:>7.3f} {3:>7.3f} {4}|{5:>7.3f} {6:>7.3f} {7}|{8:>7.3f} {9:>7.3f} {10}|{11:>7.3f} {12:>7.3f} {13}|{14:>7.3f} {15:>7.3f} {16}|'
                .format(name, eref_G3B3, e_DFTB2 - eref_G3B3, eref_DFTB2,
                        success_str[success_DFTB2], e_DFTB2_XH - eref_G3B3,
                        eref_DFTB2_XH, success_str[success_DFTB2_XH],
                        e_DFTB3 - eref_G3B3, eref_DFTB3,
                        success_str[success_DFTB3], e_DFTB3_XH - eref_G3B3,
                        eref_DFTB3_XH, success_str[success_DFTB3_XH],
                        e_DFTB3_3ob_XH - eref_G3B3, eref_DFTB3_3ob_XH,
                        success_str[success_DFTB3_3ob_XH]))
        else:
            test.assertTrue(success_DFTB2)
            test.assertTrue(success_DFTB2_XH)
            test.assertTrue(success_DFTB3)
            test.assertTrue(success_DFTB3_XH)
            test.assertTrue(success_DFTB3_3ob_XH)