Example #1
0
def test_main():
    atoms = bulk('C')

    testname = 'stress_test'

    calc = NWChem(
        theory='pspw',
        label=testname,
        nwpw={
            'lmbfgs': None,
            'tolerances': '1e-9 1e-9'
        },
    )
    atoms.set_calculator(calc)

    assert_allclose(atoms.get_stress(),
                    calc.calculate_numerical_stress(atoms),
                    atol=1e-3,
                    rtol=1e-3)

    # remove scratch files created by NWChem
    os.remove(os.path.join(testname, 'junk.inp'))
    os.remove(os.path.join(testname, testname + '.movecs'))
    os.remove(os.path.join(testname, testname + '.db'))
    for suffix in ['psp', 'vpp', 'vpp2']:
        os.remove(os.path.join(testname, 'C.' + suffix))
Example #2
0
def test_bands():
    atoms = bulk('Si')
    path = atoms.cell.bandpath('GXWK', density=10)
    atoms.calc = NWChem(kpts=[2, 2, 2])
    bs = calculate_band_structure(atoms, path)
    print(bs)
    bs.write('bs.json')
 def minimise(self, cluster):
     '''Minimise a cluster
     parameters:
     cluster- a Cluster object from bcga.cluster
     
     Using this method will overwrite the coordinates and energy of the
     supplied Cluster object.'''
     # Fix overlapping atoms to avoid NWChem errors
     cluster.fix_overlaps(1.5)
     # Set up element labels for NWChem
     atom_string = ""
     for i in range(0, len(cluster.labels)):
         atom_string += cluster.labels[i] + str(
             get_composition(cluster.atom_types)[i])
     print(atom_string)
     # Set up an ASE Atoms object for the cluster
     mol = Atoms(atom_string, positions=cluster._coords)
     mol.center()
     # Set up and runNWChem minimise
     calc = NWChem(label=self.temp_files, **self.GPAWargs)
     mol.set_calculator(calc)
     opt = LBFGSLineSearch(mol)
     try:
         opt.run(fmax=0.25)
     except:
         sys.exit()
     # Get back results from ASE
     cluster.energy = mol.get_potential_energy()
     cluster.quenched = True
     return cluster
Example #4
0
def main():
    """Perform C_{\inf v} calculation on Cr_2."""
    # PBE from
    # J. Chem. Phys. 112 , 5576 (2000)
    # http://dx.doi.org/10.1063/1.481183
    e_literature = -1.34

    names = ['Cr2_sp_up.mos', 'Cr2_sp_down.mos']
    fragment_energies = array([.0] * 2)
    cr_atom = Atoms('Cr', positions=[(0, 0, 0)], pbc=False)
    for orientation in range(2):  # create two fragments
        imm = 6 * (-1)**orientation
        cr_atom.set_initial_magnetic_moments([imm])
        calculator = NWChem(task='energy',
                            xc='PBE',
                            geometry='nocenter noautosym noautoz',
                            convergence={
                                'energy': 1e-3,
                                'density': 1e-2,
                                'gradient': 5e-2
                            },
                            basis='"DZVP2 (DFT Orbital)"',
                            vectors='input atomic output {0}'.format(
                                names[orientation]),
                            charge=0)
        cr_atom.set_calculator(calculator)
        fragment_energies[orientation] = cr_atom.get_potential_energy()
    cr_dimer = Atoms('Cr2', positions=[(0, 0, 0), (0, 0, 1.93)], pbc=False)
    cr_dimer.set_initial_magnetic_moments([0, 0])
    calculator = NWChem(task='energy',
                        xc='PBE',
                        geometry='nocenter noautosym noautoz',
                        convergence={
                            'energy': 1e-3,
                            'density': 1e-2,
                            'gradient': 5e-2
                        },
                        odft=True,
                        basis='"DZVP2 (DFT Orbital)"',
                        vectors='input fragment {0} output Cr2_AF.mos'.format(
                            ' '.join(names)),
                        charge=0)
    cr_dimer.set_calculator(calculator)
    e_dimer = cr_dimer.get_potential_energy()
    e_tot = e_dimer - fragment_energies.sum()
    assert abs(e_tot - e_literature) < 0.01
Example #5
0
def test_main():
    """Perform C_{\\inf v} calculation on Cr_2."""
    # PBE from
    # J. Chem. Phys. 112 , 5576 (2000)
    # https://doi.org/10.1063/1.481183
    e_literature = -1.34

    names = ['Cr2_sp_up.mos', 'Cr2_sp_down.mos']
    fragment_energies = array([.0] * 2)
    cr_atom = Atoms('Cr', positions=[(0, 0, 0)], pbc=False)
    for orientation in range(2):  # create two fragments
        imm = 6 * (-1)**orientation
        cr_atom.set_initial_magnetic_moments([imm])
        calc = NWChem(task='energy',
                      xc='pbe',
                      theory='dft',
                      dft=dict(convergence=dict(energy=1e-3,
                                                density=1e-2,
                                                gradient=5e-2),
                               vectors='input atomic output {}'.format(
                                   names[orientation])),
                      charge=0,
                      basis='"DZVP2 (DFT Orbital)"')
        cr_atom.set_calculator(calc)
        fragment_energies[orientation] = cr_atom.get_potential_energy()
    cr_dimer = Atoms('Cr2', positions=[(0, 0, 0), (0, 0, 1.93)], pbc=False)
    cr_dimer.set_initial_magnetic_moments([0, 0])
    calc = NWChem(task='energy',
                  xc='pbe',
                  theory='dft',
                  dft=dict(
                      convergence=dict(energy=1e-3,
                                       density=1e-2,
                                       gradient=5e-2),
                      odft=None,
                      vectors='input fragment {} output Cr2_AF.mos'.format(
                          ' '.join(names))),
                  basis='"DZVP2 (DFT Orbital)"',
                  charge=0)
    cr_dimer.set_calculator(calc)
    e_dimer = cr_dimer.get_potential_energy()
    e_tot = e_dimer - fragment_energies.sum()
    assert abs(e_tot - e_literature) < 0.01
def test_nwchem_eigenvalues(atoms, charge, eref):
    atoms.calc = NWChem(charge=charge, dft=dict(mult=2))
    energy = atoms.get_potential_energy()
    assert abs(energy - eref) < 0.1

    # Test fix for issue 575, which caused positive eigenvalues to not parse
    # correctly. Make sure at least some of the eigenvalues are positive.
    # (Actually they all should be positive, but let's be less strict)
    evals = atoms.calc.calc.get_eigenvalues()
    assert np.any(evals > 0)
    assert len(evals) == 4
Example #7
0
def _run_calc(atoms_in, theory, eref, forces=False, **kwargs):
    atoms = atoms_in.copy()
    calc = NWChem(label=theory, theory=theory, **kwargs)
    atoms.calc = calc
    assert_allclose(atoms.get_potential_energy(), eref, atol=1e-4, rtol=1e-4)
    if forces:
        assert_allclose(atoms.get_forces(),
                        calc.calculate_numerical_forces(atoms),
                        atol=1e-4,
                        rtol=1e-4)

    # Delete all perm/scratch files to ensure tests are idempotent
    for suffix in ['db', 'movecs', 'cfock', 'mp2nos', 't2']:
        _try_delete(theory, theory, suffix)

    for element in ['H', 'O']:
        for suffix in ['psp', 'vpp', 'cpp', 'jpp']:
            _try_delete(theory, element, suffix)
        _try_delete(theory, element, 'basis', sep='_')

    _try_delete(theory, 'junk', 'inp')
Example #8
0
def main():
    """Check is independence of alignment is conserved"""
    energies = []
    cr_atom = Atoms('Cr', positions=[(0, 0, 0)], pbc=False)
    for orientation in range(2):
        imm = 6 * (-1)**orientation
        cr_atom.set_initial_magnetic_moments([imm])
        calculator = NWChem(
            task='energy',
            dft=dict(
                convergence=dict(energy=1e-3, density=1e-2, gradient=5e-2)),
            basis='m6-31g*',
            basispar='"ao basis" spherical',
            charge=0)
        cr_atom.set_calculator(calculator)
        energies.append(cr_atom.get_potential_energy())
    assert abs(energies[0] - energies[1]) < 1e-9
def main():
    """The main routine for the prove of the warning."""
    cr_atom = Atoms('Cr', positions=[(0, 0, 0)], pbc=False, magmoms=[5.0])
    calculator = NWChem(task='energy',
                        geometry='nocenter noautosym noautoz',
                        convergence={
                            'energy': 1e-3,
                            'density': 1e-2,
                            'gradient': 5e-2
                        },
                        basis='Wachters+f',
                        charge=1)
    cr_atom.set_calculator(calculator)
    with catch_warnings(record=True) as thrown_warning:
        simplefilter('always', RuntimeWarning)
        cr_atom.get_potential_energy()
        assert len(thrown_warning) == 1
        assert 'levelshift' in str(thrown_warning[-1].message)
Example #10
0
def calculate_target_repulsion(atoms, rc):
    N = len(atoms)
    pos = atoms.get_positions()
    sym = atoms.get_chemical_symbols()

    # First perform a regular SCF run
    calc = NWChem(
        #memory='1024mb',
        #label='calc/nwchem',
        dft=dict(  #maxiter=2000,
            xc=xc,
            #mult=2,
            odft=None,
            convergence=dict(energy=1e-5, density=1e-4, gradient=5e-3),
        ),
        basis=basis)
    atoms.calc = calc

    e, f = 0., np.zeros((N, 3))
    e = atoms.get_potential_energy()
    f = atoms.get_forces()
    powers = np.arange(6)

    #e, f = 0., np.zeros((N, 3))
    #coeff = np.array([0., 0., 0., 14., -5., 2.])
    #powers = np.arange(len(coeff))

    #for i in range(N):
    #    for j in range(N):
    #        r = atoms.get_distance(i, j)
    #        if sym[i] == sym[j] or r > rc:
    #            continue
    #        e += 0.5 * (coeff * (rc - r) ** powers).sum()
    #        dedr = -coeff[1:] * powers[1:] * (rc - r) ** (powers[1:] - 1)
    #        drdx = (pos[i] - pos[j]) / r
    #        f[i] += -dedr.sum() * drdx
    return e, f
Example #11
0
from ase.test import cli, require
from ase.db import connect
from ase.db.jsondb import read_json
from ase.calculators.nwchem import NWChem

require('nwchem')
cli("""ase-build O | ase-run nwchem -d nwchem_cmdline.json &&
ase-build O2 | ase-run nwchem -d nwchem_cmdline.json""")
c = connect('nwchem_cmdline.json')
dct = read_json('nwchem_cmdline.json')
for name in ['O2', 'O']:
    d = c.get([('name', '=', name)])
    id = d.id
    e1 = d.energy
    e2 = c.get_atoms(id).get_potential_energy()
    e3 = NWChem.read_atoms(name).get_potential_energy()
    e4 = dct[id]['energy']
    assert e1 == e2 == e3 == e4
    print(e1)
ae = 2 * c.get('name=O').energy - c.get('name=O2').energy
assert abs(ae - 6.6053) < 1e-4
import os, sys, re

import numpy as np

import ase
from ase import Atoms
from ase.calculators.nwchem import NWChem
from ase.db import connect


label = '{label}'
kwargs = {kwargs}

NWChem.command = 'mpirun -np {ppn} -path /usr/local/bin nwchem PREFIX.nw > PREFIX.out'
calc = NWChem(**kwargs)

atom = {atom}
geom = {geom}


mol = Atoms(symbols = atom, positions = geom)
mol.set_calculator(calc)

try:
    e = mol.get_potential_energy() # use the NWChem optimizer (task optimize)
    outfile = '{label}.out'
    with open(outfile) as f:
        lines = f.readlines()
    for index, line in enumerate(reversed(lines)):
        if re.search('Output coordinates in angstroms', line) != None:
Example #13
0
 def calc(self, **kwargs):
     from ase.calculators.nwchem import NWChem
     command = f'{self.executable} PREFIX.nwi > PREFIX.nwo'
     return NWChem(command=command, **kwargs)
Example #14
0
import sys

from ase.build import molecule
from ase.optimize import BFGS
from ase.calculators.nwchem import NWChem
from ase.calculators.socketio import SocketIOCalculator

atoms = molecule('H2O')
atoms.rattle(stdev=0.1)

unixsocket = 'ase_nwchem'

nwchem = NWChem(theory='scf',
                task='optimize',
                driver={'socket': {
                    'unix': unixsocket
                }})

opt = BFGS(atoms, trajectory='opt.traj', logfile='opt.log')

with SocketIOCalculator(nwchem, log=sys.stdout, unixsocket=unixsocket) as calc:
    atoms.calc = calc
    opt.run(fmax=0.05)
Example #15
0
if __name__ == '__main__':
    import numpy as np

    from ase import Atoms
    from ase.calculators.nwchem import NWChem
    from ase.optimize import BFGS

    from numpy import cross, eye
    from scipy.linalg import expm3, norm

    def M(axis, theta):
        return expm3(cross(eye(3), axis / norm(axis) * theta))

    h2 = Atoms('H2', positions=[[0, 0, 0], [0, 0, 0.7]])
    h2.calc = NWChem(xc='PBE')
    opt = BFGS(h2)
    opt.run(fmax=0.02)

    h2.positions = np.dot(M(np.array([1., 1., 0.]), np.pi / 4.),
                          h2.positions.T).T
    h2prime = ase.Atoms('H2')
    h2prime.positions = np.copy(h2.positions)
    # print h2.positions
    angle = np.pi / 5.
    axis = np.array([1., 0., 0.])
    rotation = M(axis, angle)
    soap = SOAP(1.)
    for n in range(10):
        h2prime.positions = np.dot(rotation, h2prime.positions.T).T
        print(n + 1) * angle, soap.K(h2, h2prime)
Example #16
0
def gaussianFreq(mol, lab, level):

    level = level.split('_')

    Trip = False
    if len(level) == 4:
        Trip = True
        bas = level[1]
        lev = level[0]
        Igrid = level[2]
    if len(level) == 3:
        bas = level[1]
        lev = level[0]
        Igrid = level[2]
    elif len(level) == 2:
        bas = level[1]
        lev = level[0]
        Igrid = 'coarse'
    else:
        bas = basis
        lev = level
        Igrid = 'coarse'

    sym = mol.get_chemical_symbols()
    is_O = len(sym) == 1 and sym[0] == 'O'
    is_OO = len(sym) == 2 and sym[0] == 'O' and sym[1] == 'O'

    if is_O or is_OO or Trip == True:
        mol.set_calculator(
            NWChem(label=lab,
                   maxiter=60,
                   geometry='noautoz noautosym nocenter',
                   xc=lev,
                   basis=bas,
                   grid=Igrid,
                   raw='freq \nanimate \n end\n',
                   task='freq',
                   mult=3))
    else:
        atom_num = mol.get_atomic_numbers()
        s = sum(atom_num)
        if s % 2 == 0:
            mol.set_calculator(
                NWChem(label=lab,
                       maxiter=60,
                       geometry='noautoz noautosym nocenter',
                       xc=lev,
                       basis=bas,
                       grid=Igrid,
                       raw='freq \nanimate \n end\n',
                       CONVERGENCE='ncysh 5 ncydp 5 damp 50',
                       task=' freq',
                       mult=1))
        else:
            mol.set_calculator(
                NWChem(label=lab,
                       maxiter=60,
                       geometry='noautoz noautosym nocenter',
                       xc=lev,
                       basis=bas,
                       grid=Igrid,
                       CONVERGENCE='ncysh 5 ncydp 5 damp 50',
                       mult=2,
                       raw='freq \nanimate \n end\n',
                       task=' freq'))
    return mol
Example #17
0
from ase.test import cli, require
from ase.db import connect
from ase.io.jsonio import read_json
from ase.calculators.nwchem import NWChem

require('nwchem')
cli("""ase build O | ase run nwchem -d nwchem_cmdline.json &&
ase build O2 | ase run nwchem -d nwchem_cmdline.json""")
c = connect('nwchem_cmdline.json')
dct = read_json('nwchem_cmdline.json')
for name in ['O2', 'O']:
    d = c.get([('name', '=', name)])
    id = d.id
    e1 = d.energy
    e2 = c.get_atoms(id).get_potential_energy()
    e3 = NWChem.read_atoms(name).get_potential_energy()
    e4 = dct[id]['energy']
    assert e1 == e2 == e3 == e4
    print(e1)
ae = 2 * c.get('name=O').energy - c.get('name=O2').energy
assert abs(ae - 6.6053) < 1e-4
Example #18
0
import ase.db
from ase.structure import molecule
from ase.optimize.bfgs import BFGS
from ase.calculators.nwchem import NWChem
from ase.data.g2_1 import molecule_names, atom_names

c = ase.db.connect('g2-1.db')

for name in molecule_names + atom_names:
    id = c.reserve(name=name, calculator='nwchem')
    if id is None:
        continue
    atoms = molecule(name)
    atoms.calc = NWChem(command='mpiexec -np 4 nwchem PREFIX.nw > PREFIX.out',
                        geometry='noautosym nocenter noautoz',
                        task='gradient',
                        xc='PBE',
                        grid='nodisk',
                        tolerances='tight',
                        basis='def2-qzvppd',
                        basispar='spherical',
                        direct='noio',
                        label=name)
    atoms.get_forces()
    c.write(atoms, name=name, relaxed=False)
    if len(atoms) > 1:
        opt = BFGS(atoms, logfile=name + '.nwchem.log')
        opt.run(0.01)
        c.write(atoms, name=name, relaxed=True)
    del c[id]
Example #19
0
from ase.build import bulk
from ase.calculators.nwchem import NWChem
from ase.utils import workdir
from ase.dft.band_structure import calculate_band_structure

atoms = bulk('Si')
with workdir('files', mkdir=True):
    path = atoms.cell.bandpath('GXWK', density=10)
    atoms.calc = NWChem(kpts=[2, 2, 2])
    bs = calculate_band_structure(atoms, path)
    print(bs)
    bs.write('bs.json')
Example #20
0
"""Checks that writing and reading of NWChem input files is consistent."""

from ase.build import molecule
from ase.calculators.nwchem import NWChem
from ase import io

atoms = molecule('CH3COOH')

calc = NWChem()
calc.write_input(atoms)

atoms2 = io.read('nwchem.nw')

tol = 1e-8

check = sum(abs((atoms.positions - atoms2.positions).ravel()) > tol)
assert check == 0
Example #21
0
 def calculator():
     return NWChem(task='gradient', theory='scf', charge=-1)
Example #22
0
files_to_optimize = []
for mol in mols_of_interest:

    list_dir = os.listdir(path.format(mol))
    for f in list_dir:
        if f.endswith(".xyz"):
            files_to_optimize.append(os.path.join(path.format(mol), f))

file_of_interest = files_to_optimize[i]

atoms = read(file_of_interest)

scratch = "/projects/CPOX/northeastern_comocheng/conformers/optimizing_others/"

os.chdir(scratch)

calc = NWChem(label=file_of_interest[20:-4].replace("/", "_"),
              scratch=scratch,
              method="m06-2x",
              basis="6-311++G(2D,2P)",
              multiplicity=1)

atoms.set_calculator(calc)
opt = BFGS(atoms=atoms)
opt.run()
print
print "The potential energy of {} is:".format(file_of_interest[20:-4].replace(
    "/", "_"))
print atoms.get_potential_energy()
Example #23
0
def calculator():
    return NWChem(task='gradient',
                  geometry='nocenter noautosym noautoz',
                  charge=-1)
Example #24
0
def gaussian2(mol, lab, level):

    level = level.split('_')

    Trip = False
    if len(level) == 4:
        Trip = True
        bas = level[1]
        lev = level[0]
        Igrid = level[2]
    if len(level) == 3:
        bas = level[1]
        lev = level[0]
        Igrid = level[2]
    elif len(level) == 2:
        bas = level[1]
        lev = level[0]
        Igrid = 'coarse'
    else:
        bas = basis
        lev = level
        Igrid = 'coarse'

    sym = mol.get_chemical_symbols()
    is_O = len(sym) == 1 and sym[0] == 'O'
    is_OO = len(sym) == 2 and sym[0] == 'O' and sym[1] == 'O'

    if is_O or is_OO or Trip == True:
        mol.set_calculator(
            NWChem(
                label=lab,
                maxiter=60,
                geometry='noautoz noautosym nocenter',
                xc=lev,
                basis=bas,
                vectors='output mo.movecs',
                grid=Igrid,
                task=
                'energy ignore \nset dft:converged true \ntask dft gradient',
                mult=3))
    else:
        atom_num = mol.get_atomic_numbers()
        s = sum(atom_num)
        if s % 2 == 0:
            mol.set_calculator(
                NWChem(
                    label=lab,
                    maxiter=60,
                    geometry='noautoz noautosym nocenter',
                    xc=lev,
                    basis=bas,
                    vectors='output mo.movecs',
                    grid=Igrid,
                    task=
                    'energy ignore \nset dft:converged true \ntask dft gradient',
                    mult=1))
        else:
            mol.set_calculator(
                NWChem(
                    label=lab,
                    maxiter=60,
                    geometry='noautoz noautosym nocenter',
                    xc=lev,
                    basis=bas,
                    vectors='output mo.movecs',
                    grid=Igrid,
                    CONVERGENCE='ncysh 5 ncydp 5 damp 50',
                    mult=2,
                    task=
                    'energy ignore \nset dft:converged true \ntask dft gradient'
                ))
    return mol