コード例 #1
0
def calculate(name, system, **kwargs):
    print('Calculate', name, system)
    label = 'ink-%s' % name

    kwargs0 = dict(stdout="'stdout.txt'",
                   FromScratch=True,
                   RestartWrite=False,
                   command='mpirun -np 4 octopus')
    kwargs.update(**kwargs0)

    calc = Octopus(label=label, **kwargs)
    system.calc = calc
    E = system.get_potential_energy()
    eig = calc.get_eigenvalues()
    check_interface(calc)

    restartcalc = Octopus(label)
    check_interface(restartcalc)

    # Check reconstruction of Atoms object
    new_atoms = restartcalc.get_atoms()
    print('new')
    print(new_atoms.positions)
    calc2 = Octopus(label='ink-restart-%s' % name, **kwargs)
    new_atoms.calc = calc2
    E2 = new_atoms.get_potential_energy()
    #print('energy', E, E2)
    eig2 = calc2.get_eigenvalues()
    eig_err = np.abs(eig - eig2).max()
    e_err = abs(E - E2)
    print('Restart E err', e_err)
    print('Restart eig err', eig_err)
    assert e_err < 5e-5
    assert eig_err < 5e-5
    return calc
コード例 #2
0
ファイル: test-octopus.py プロジェクト: engelund/SIESTA_ASE
def test_integrals(pbc=True):
    system = molecule('H2O')
    a = 2.6006  # So the spacing does not divide exactly
    system.cell = (a, a, a)
    system.center()
    system.pbc = pbc
    spacing = 0.2
    calc = Octopus(**getkwargs(label='ink-integrals-pbc-%s' % pbc,
                               # Restart destroys normalization of output
                               # ...........sometimes.
                               RestartWrite=False,
                               Output='density + potential + wfs',
                               OutputHow='cube + xcrysden',
                               ExtraStates=0,
                               Spacing=spacing,
                               SCFCalculateDipole=True))
    system.set_calculator(calc)
    E = system.get_potential_energy()

    if pbc:
        Eref = -496.98663392
    else:
        Eref = -451.05348602
    err = E - Eref
    print('Energy=%f :: err=%e' % (E, err))
    assert err < 1e-7

    rho = calc.get_pseudo_density(pad=False)
    v = calc.get_effective_potential(pad=False)

    if pbc:  # spacing adjusted but cell constant
        dv = system.get_volume() / rho.size
    else:  # cell adjusted but spacing constant
        dv = spacing**3

    ne = rho.sum() * dv
    err = abs(ne - 8.0)
    print('nelectrons: %f, err: %e' % (ne, err))
    assert err < 1e-12

    for n in range(calc.get_number_of_bands()):
        psi = calc.get_pseudo_wave_function(band=n, pad=True)
        norm = (np.abs(psi)**2).sum() * dv
        err = abs(norm - 1)
        print('norm=%f :: err=%e' % (norm, err))
        assert err < 1e-12

    eps = calc.get_eigenvalues()
    f = calc.get_occupation_numbers()
    E_band = (eps * f).sum()
    E_nv = (rho * v).sum() * dv
    if pbc:
        E_nl = -155.16024733 # Reference value from output.
        E_kin_ref = 377.899824
    else:
        E_nl = -151.28372313 # Ref from output.
        E_kin_ref = 396.66270596
    E_kin_ours = E_band - E_nv - E_nl
    err = abs(E_kin_ours - E_kin_ref)
    print('E_band=%f :: E_nv=%f :: E_kin_ours=%f :: err=%e'
          % (E_band, E_nv, E_kin_ours, err))
    assert err < 5e-4  # Orig err: 6.8e-05 (pbc=False) and 3.47e-07 (pbc=True)

    errs = check_interface(calc)
    for err in errs:
        if err.code == 'not implemented':
            continue
        else:
            raise AssertionError(err.error)
コード例 #3
0
def test_integrals(pbc=True):
    system = molecule('H2O')
    a = 2.6006  # So the spacing does not divide exactly
    system.cell = (a, a, a)
    system.center()
    system.pbc = pbc
    spacing = 0.2
    calc = Octopus(**getkwargs(
        label='ink-integrals-pbc-%s' % pbc,
        # Restart destroys normalization of output
        # ...........sometimes.
        RestartWrite=False,
        Output='density + potential + wfs',
        OutputFormat='cube + xcrysden',
        ExtraStates=0,
        Spacing=spacing,
        SCFCalculateDipole=True))
    system.set_calculator(calc)
    E = system.get_potential_energy()

    if pbc:
        Eref = -496.98663392
    else:
        Eref = -451.05348602
    err = abs(E - Eref)
    #print('Energy=%f :: err=%e' % (E, err))
    # The reference has changed between version 5 and trunk,
    # so we will not check the total energy.
    # Checks of individual contributions that are physical and therefore
    # trustworthy will have to be sufficient.
    #assert err < 5e-3

    rho = calc.get_pseudo_density(pad=False)
    v = calc.get_effective_potential(pad=False)

    if pbc:  # spacing adjusted but cell constant
        dv = system.get_volume() / rho.size
    else:  # cell adjusted but spacing constant
        dv = spacing**3

    ne = rho.sum() * dv
    err = abs(ne - 8.0)
    print('nelectrons: %f, err: %e' % (ne, err))
    assert err < 1e-12

    for n in range(calc.get_number_of_bands()):
        psi = calc.get_pseudo_wave_function(band=n, pad=True)
        norm = (np.abs(psi)**2).sum() * dv
        err = abs(norm - 1)
        print('norm=%f :: err=%e' % (norm, err))
        assert err < 1e-12

    eps = calc.get_eigenvalues()
    f = calc.get_occupation_numbers()
    E_band = (eps * f).sum()
    E_nv = (rho * v).sum() * dv
    if pbc:
        E_nl = -155.16024733  # Reference value from output.
        E_kin_ref = 377.899824
    else:
        E_nl = -151.28372313  # Ref from output.
        E_kin_ref = 396.66270596
    E_kin_ours = E_band - E_nv - E_nl
    err = abs(E_kin_ours - E_kin_ref)
    print('E_band=%f :: E_nv=%f :: E_kin_ours=%f :: err=%e' %
          (E_band, E_nv, E_kin_ours, err))
    assert err < 5e-3  # Orig err: 6.8e-05 (pbc=False) and 3.47e-07 (pbc=True)

    errs = check_interface(calc)
    for err in errs:
        if err.code == 'not implemented':
            continue
        else:
            raise AssertionError(err.error)