예제 #1
0
def repeteANI(ANIinfile, XVinfile, outfile, rep=[1, 1, 1]):
    """Generates a new ANI-file with cell repetitions"""
    GeomList, Energy = SIO.ReadANIFile(ANIinfile)
    initGeom = Geom(XVinfile)
    newGeomList = []
    for i in range(len(GeomList)):
        geom = copy.deepcopy(GeomList[i])
        geom.pbc = N.zeros((3, 3), N.float)
        for i in range(3):
            geom.repeteGeom(initGeom.pbc[i], rep=rep[i])
            geom.pbc[i] = [rep[i] * x for x in initGeom.pbc[i]]
        newGeomList.append(geom)
    SIO.WriteANIFile(outfile, newGeomList, Energy)
예제 #2
0
def runNEB():
    global general, steps, savedData

    # Restarting?
    fns=glob.glob('NEB_*/CGrun')
    if len(fns)==0:
        restart = False
    elif len(fns)!=general.NNEB:
        sys.exit('Number of NEB_??? directories %i does not match number of steps %i'%(len(fns), general.NNEB))
    else:
        restart=True

    fns = ["NEB_%i/CGrun"%ii for ii in range(general.NNEB)]
    fns = [general.initial+"/CGrun"]+fns+[general.final+"/CGrun"]

    i, f = step(fns[0], False, 0), step(fns[general.NNEB+1], False, general.NNEB+1)
    checkConst(i, f)

    if restart:
        try:
            savedData.E, savedData.F, savedData.Fmax, savedData.geom, savedData.v=pickle.load(open('NEB_%i/savedData.pickle'%0, 'r'))
        except:
            savedData.E    = []
            savedData.F    = []
            savedData.geom = []
            savedData.Fmax = []
            savedData.v    = N.zeros((general.NNEB+2, len(i.XVgeom.xyz), 3), N.float)
    else:
        savedData.E    = []
        savedData.F    = []
        savedData.geom = []
        savedData.Fmax = []
        savedData.v    = N.zeros((general.NNEB+2, len(i.XVgeom.xyz), 3), N.float)

    steps = [step(fn, restart, ii, initial=i, final=f) for ii, fn in enumerate(fns)]

    done=False

    while not done:
        # Start  calculations
        for ii in steps:
            ii.run()

        nextstep=False
        while not nextstep:
            for ii in steps:
                if not ii.checkDone():
                    break
            else:
                nextstep=True
            if not nextstep:
                time.sleep(30)

        savedData.E += [[SIO.GetTotalEnergy(ii.dir+'/RUN.out') for ii in steps]]
        savedData.geom += [[copy.copy(ii.XVgeom) for ii in steps]]

        oldgeom = [copy.deepcopy(ii.XVgeom) for ii in steps]
        for ii, jj in enumerate(steps[1:-1]):
            jj.update(oldgeom[ii], oldgeom[ii+2])

        # Write status
        savedData.F += [[ii.Ftot for ii in steps]]
        savedData.Fmax += [[ii.Fmax for ii in steps]]
        for ii in range(1, len(steps)-1):
            geoms = [savedData.geom[jj][ii] for jj in range(len(savedData.geom))]
            Ftots = [savedData.Fmax[jj][ii] for jj in range(len(savedData.geom))]
            Fs    = [savedData.F[jj][ii] for jj in range(len(savedData.geom))]
            SIO.WriteANIFile('NEB_%i/Steps.ANI'%(ii-1), geoms, Ftots)
            SIO.WriteAXSFFiles('NEB_%i/Steps.XASF'%(ii-1), geoms, forces=Fs)

        geoms = [ii.XVgeom for ii in steps]
        Fmax  = [ii.Fmax for ii in steps]
        Ftot  = [ii.Ftot for ii in steps]
        SIO.WriteANIFile('NEB_%i/NextStep.ANI'%0, geoms, Fmax)
        SIO.WriteAXSFFiles('NEB_%i/NextStep.XASF'%0, geoms, forces=Ftot)
        done = True
        for ii in steps:
            done = done and ii.converged
        pickle.dump((savedData.E, savedData.F, savedData.Fmax, savedData.geom, savedData.v),\
                    open('NEB_%i/savedData.pickle'%0, 'w'))
예제 #3
0
def runNEB():
    global opts, steps, savedData

    # Restarting?
    fns = glob.glob('NEB_*/CGrun')
    if len(fns) == 0:
        restart = False
    elif len(fns) != opts.NNEB:
        sys.exit(
            'Number of NEB_??? directories %i does not match number of steps %i'
            % (len(fns), opts.NNEB))
    else:
        if opts.onlyInit:
            sys.exit('NEB_* directories already exist, exititng.')
        else:
            restart = True

    fns = ["NEB_%i/CGrun" % ii for ii in range(opts.NNEB)]
    fns = [opts.initial + "/CGrun"] + fns + [opts.final + "/CGrun"]

    i, f = step(fns[0], False, 0), step(fns[opts.NNEB + 1], False,
                                        opts.NNEB + 1)
    if restart:
        try:
            savedData.E, savedData.F, savedData.Fmax, \
                savedData.FmaxWOspring, savedData.geom = pickle.load(open('NEB_0/savedData.pickle', 'r'))
        except:
            savedData.E = []
            savedData.F = []
            savedData.geom = []
            savedData.Fmax = []
    else:
        savedData.E = []
        savedData.F = []
        savedData.geom = []
        savedData.Fmax = []

    steps = [
        step(fn, restart, ii, initial=i, final=f) for ii, fn in enumerate(fns)
    ]

    checkConst(i, f)
    if restart:
        for ii in range(len(steps) - 1):
            checkConst(steps[ii], steps[ii + 1])

    done = opts.onlyInit

    while not done:
        # Start calculations
        for ii in steps:
            ii.run()

        nextstep = False
        while not nextstep:
            for ii in steps:
                if not ii.checkDone():  # Reads forces!
                    break
            else:
                nextstep = True
            if not nextstep:
                time.sleep(10)

        savedData.E += [[
            SIO.GetTotalEnergy(ii.dirr + '/RUN.out') for ii in steps
        ]]
        savedData.geom += [[copy.deepcopy(ii.XVgeom) for ii in steps]]

        overShoot = False
        for ii, jj in enumerate(steps[:-1]):
            if ii != 0:  # Skip first and last
                overShoot = overShoot or jj.shootOver(
                    savedData.geom[-1][ii - 1], savedData.geom[-1][ii + 1])
        if overShoot:  # Kill speed if one image overshoot ... otherwise kinks will appear
            for ii in steps:
                ii.v = ii.v * 0

        for ii, jj in enumerate(steps[:-1]):
            if ii != 0:  # Skip first and last
                jj.update(savedData.geom[-1][ii - 1],
                          savedData.geom[-1][ii + 1])

        # Write status
        savedData.F += [[ii.F for ii in steps]]
        savedData.Fmax += [[ii.Fmax for ii in steps]]
        for ii in range(1, len(steps) - 1):
            geoms = [
                savedData.geom[jj][ii] for jj in range(len(savedData.geom))
            ]
            Fmax = [
                savedData.Fmax[jj][ii] for jj in range(len(savedData.geom))
            ]
            Fs = [savedData.F[jj][ii] for jj in range(len(savedData.geom))]
            SIO.WriteANIFile('NEB_%i/Steps.ANI' % (ii - 1), geoms, Fmax)
            SIO.WriteAXSFFiles('NEB_%i/Steps.XASF' % (ii - 1),
                               geoms,
                               forces=Fs)

        geoms = [ii.XVgeom for ii in steps]
        Fmax = [ii.Fmax for ii in steps]
        F = [ii.F for ii in steps]
        SIO.WriteANIFile('NextStep.ANI', geoms, \
                         [ii-savedData.E[-1][0] for ii in savedData.E[-1]])
        SIO.WriteAXSFFiles('NextStep.XASF', geoms, forces=F)
        done = True
        for ii in steps:
            done = done and ii.converged
        pickle.dump((savedData.E, savedData.F, savedData.Fmax, savedData.geom),\
                    open('NEB_%i/savedData.pickle'%0, 'w'))
        f = open('Convergence', 'a')
        f.write(('####### Iteration %i #######\n#Fmax '+('%2.3f '*(opts.NNEB+2))+'\n')%\
                tuple([len(savedData.Fmax), ]+savedData.Fmax[-1]))
        f.write(('#step length '+(('%2.4f ')*(opts.NNEB+2))+'\n')%\
                tuple([LA.norm(ii.v) for ii in steps]))
        f.write('# Barrier [meV]:\n')
        f.write((('%4.1f '*(opts.NNEB+2))+'\n')%tuple([1000*(savedData.E[-1][ii]-savedData.E[-1][0])\
                                                       for ii in range(opts.NNEB+2)]))
        f.write('# delta E compared to start/restart [meV]:\n')
        f.write((('%4.1f '*(opts.NNEB+2))+'\n')%tuple([1000*(savedData.E[0][ii]-savedData.E[-1][ii])\
                                                       for ii in range(opts.NNEB+2)]))
        f.close()