Beispiel #1
0
def test_istruc():
  from collections import namedtuple
  from pickle import loads, dumps
  from os import remove
  from os.path import join, exists
  from shutil import rmtree
  from tempfile import mkdtemp
  from pylada.vasp.files import POSCAR, CONTCAR
  from pylada.vasp import Vasp
  from pylada.crystal import Structure, read, specieset, write
  from pylada.error import ValueError

  structure = Structure([[0, 0.5, 0.5],[0.5, 0, 0.5], [0.5, 0.5, 0]], scale=5.43, name='has a name')\
                       .add_atom(0,0,0, "Si")\
                       .add_atom(0.25,0.25,0.25, "Si")

  Extract = namedtuple("Extract", ['directory', 'success', 'structure'])
  a = Vasp()
  o = a._input['istruc']
  d = {'IStruc': o.__class__}

  directory = mkdtemp()
  try: 
    assert a.istruc == 'auto'
    assert o.output_map(vasp=a, outdir=directory, structure=structure) is None
    assert eval(repr(o), d).value == 'auto'
    assert loads(dumps(o)).value == 'auto'
    assert exists(join(directory, POSCAR))
    remove(join(directory, POSCAR))

    # check reading from outcar but only on success.
    a.restart = Extract(directory, False, structure.copy())
    a.restart.structure[1].pos[0] += 0.02
    assert a.istruc == 'auto'
    assert o.output_map(vasp=a, outdir=directory, structure=structure) is None
    assert exists(join(directory, POSCAR))
    other = read.poscar(join(directory, POSCAR), types=specieset(structure))
    assert abs(other[1].pos[0] - 0.25) < 1e-8
    assert abs(other[1].pos[0] - 0.27) > 1e-8
    # check reading from outcar but only on success.
    a.restart = Extract(directory, True, structure.copy())
    a.restart.structure[1].pos[0] += 0.02
    assert a.istruc == 'auto'
    assert o.output_map(vasp=a, outdir=directory, structure=structure) is None
    assert exists(join(directory, POSCAR))
    other = read.poscar(join(directory, POSCAR), types=specieset(structure))
    assert abs(other[1].pos[0] - 0.25) > 1e-8
    assert abs(other[1].pos[0] - 0.27) < 1e-8

    # Now check CONTCAR
    write.poscar(structure, join(directory, CONTCAR))
    assert a.istruc == 'auto'
    assert o.output_map(vasp=a, outdir=directory, structure=structure) is None
    assert exists(join(directory, POSCAR))
    other = read.poscar(join(directory, POSCAR), types=specieset(structure))
    assert abs(other[1].pos[0] - 0.25) < 1e-8
    assert abs(other[1].pos[0] - 0.27) > 1e-8

    # Check some failure modes.
    write.poscar(structure, join(directory, CONTCAR))
    structure[0].type = 'Ge'
    a.restart = None
    try: o.output_map(vasp=a, outdir=directory, structure=structure)
    except ValueError: pass
    else: raise Exception()
    structure[0].type = 'Si'
    structure.add_atom(0.25,0,0, 'Si')
    try: o.output_map(vasp=a, outdir=directory, structure=structure)
    except ValueError: pass
    else: raise Exception()

  finally: rmtree(directory)
Beispiel #2
0
def test_istruc():
    from collections import namedtuple
    from pickle import loads, dumps
    from os import remove
    from os.path import join, exists
    from shutil import rmtree
    from tempfile import mkdtemp
    from pylada.vasp.files import POSCAR, CONTCAR
    from pylada.vasp import Vasp
    from pylada.crystal import Structure, read, specieset, write
    from pylada.error import ValueError

    structure = Structure([[0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]], scale=5.43, name='has a name')\
        .add_atom(0, 0, 0, "Si")\
        .add_atom(0.25, 0.25, 0.25, "Si")

    Extract = namedtuple("Extract", ['directory', 'success', 'structure'])
    a = Vasp()
    o = a._input['istruc']
    d = {'IStruc': o.__class__}

    directory = mkdtemp()
    try:
        assert a.istruc == 'auto'
        assert o.output_map(vasp=a, outdir=directory,
                            structure=structure) is None
        assert eval(repr(o), d).value == 'auto'
        assert loads(dumps(o)).value == 'auto'
        assert exists(join(directory, POSCAR))
        remove(join(directory, POSCAR))

        # check reading from outcar but only on success.
        a.restart = Extract(directory, False, structure.copy())
        a.restart.structure[1].pos[0] += 0.02
        assert a.istruc == 'auto'
        assert o.output_map(vasp=a, outdir=directory,
                            structure=structure) is None
        assert exists(join(directory, POSCAR))
        other = read.poscar(join(directory, POSCAR),
                            types=specieset(structure))
        assert abs(other[1].pos[0] - 0.25) < 1e-8
        assert abs(other[1].pos[0] - 0.27) > 1e-8
        # check reading from outcar but only on success.
        a.restart = Extract(directory, True, structure.copy())
        a.restart.structure[1].pos[0] += 0.02
        assert a.istruc == 'auto'
        assert o.output_map(vasp=a, outdir=directory,
                            structure=structure) is None
        assert exists(join(directory, POSCAR))
        other = read.poscar(join(directory, POSCAR),
                            types=specieset(structure))
        assert abs(other[1].pos[0] - 0.25) > 1e-8
        assert abs(other[1].pos[0] - 0.27) < 1e-8

        # Now check CONTCAR
        write.poscar(structure, join(directory, CONTCAR))
        assert a.istruc == 'auto'
        assert o.output_map(vasp=a, outdir=directory,
                            structure=structure) is None
        assert exists(join(directory, POSCAR))
        other = read.poscar(join(directory, POSCAR),
                            types=specieset(structure))
        assert abs(other[1].pos[0] - 0.25) < 1e-8
        assert abs(other[1].pos[0] - 0.27) > 1e-8

        # Check some failure modes.
        write.poscar(structure, join(directory, CONTCAR))
        structure[0].type = 'Ge'
        a.restart = None
        try:
            o.output_map(vasp=a, outdir=directory, structure=structure)
        except ValueError:
            pass
        else:
            raise Exception()
        structure[0].type = 'Si'
        structure.add_atom(0.25, 0, 0, 'Si')
        try:
            o.output_map(vasp=a, outdir=directory, structure=structure)
        except ValueError:
            pass
        else:
            raise Exception()

    finally:
        rmtree(directory)