Exemplo n.º 1
0
    sys = Trajectory(file_traj, 'r')[-1]
except (IOError, RuntimeError):
    print "Creating molecule from scratch"
    sys = molecule('H2')
    sys.set_cell(np.array([20, 21, 22]))
    sys.center()
    #sys *= (2, 3, 1)
else:
    print "Importing trajectory file from: %s" % file_traj

vasp_param = calc_dict['TiO2_step']
vasp_param['kpts'] = (1, 1, 1)
calc = Vasp(**vasp_param)
handle_restart(calc, sys)
print_vasp_param(calc)
sys.set_calculator(calc)

del sys.constraints
#print 'Constraints:'
#print '\tc1: Freezing bottom two layers (z < 15.)'
#c1 = FixAtoms(mask = [atom.z < 15 for atom in sys])
#sys.set_constraint(c1)
if testRun == True:
    run_testRun(sys)
else:
    geo_traj = Trajectory(file_traj, mode, sys)
    dyn = LBFGS(sys, trajectory=geo_traj)
    dyn.run(fmax=0.05)
    print 'Completed energy optimization'
    energy = sys.get_potential_energy()
    print "Energy: %f" % energy
Exemplo n.º 2
0
def relax(base_dir="./", model="A", smax=2e-4, fmax=0.05):
    assert model.upper() in ("A", "B", "C")
    curr_dir = os.path.dirname(os.path.abspath(__file__))
    param_file = os.path.join(curr_dir, "params.json")
    gpw_file = os.path.join(base_dir, "gs_{}.gpw".format(model.upper()))
    traj_filename = os.path.join(base_dir,
                                 "relax_{}.traj".format(model.upper()))
    traj_fin_filename = os.path.join(base_dir,
                                     "relax_fin_{}.traj".format(model.upper()))
    # Trajectory file from previous relaxation
    traj_base_filename = os.path.join(base_dir, "relaxed.traj")

    old_traj_filename = os.path.join(base_dir,
                                     "relax_{}.old.traj".format(model.upper()))
    log_filename = os.path.join(base_dir, "relax_{}.log".format(model.upper()))
    if os.path.exists(gpw_file):
        parprint("Relaxation already done, will use gpw directly!")
        return 0
    if os.path.exists(param_file):
        params = json.load(open(param_file, "r"))
    else:
        raise FileNotFoundError("no parameter file!")
    # Perform relaxation process
    # If has trajectory, use the last image
    assert os.path.exists(traj_base_filename)

    # Get stress for original structure
    parprint("Calculate stress on original structure")
    calc = GPAW(**params["relax"],
                txt=os.path.join(base_dir, "gs.txt".format(model)))
    atoms_origin = Trajectory(traj_base_filename)[-1]
    atoms_origin.set_calculator(calc)
    s = atoms_origin.get_stress()
    parprint("Origin lattice, stress = ", s)

    del atoms_origin, calc

    # Now new calculations
    if os.path.exists(old_traj_filename):
        atoms = Trajectory(old_traj_filename)[-1]
    else:
        atoms = Trajectory(traj_base_filename)[-1]
        for pos in model_dict[model]:
            parprint("Add Na+ in position {}!".format(pos))
            add_adatom(atoms, scaled_pos=pos)
    view(atoms)  # Should be safe for batch systems

    # if os.path.exists(traj__filename):
    # parprint("Relaxed, now calculated GS!")
    # atoms = ase.io.read(traj_fin_filename)
    # calc = GPAW(**params["gs"],
    # txt=os.path.join(base_dir, "gs.txt"))
    # atoms.set_calculator(calc)
    # atoms.get_potential_energy()
    # calc.write(gpw_file, mode="all")
    # return
    # else:
    # if os.path.exists(old_traj_filename):
    # try:
    # t = Trajectory(old_traj_filename)
    # atoms = t[-1]           # use the last image
    # parprint("Has trajectory file, use directly!")
    # parprint("New atom position", atoms)
    # except Exception as e:
    # parprint("Trajectory file may be corrupted!")

    world.barrier()
    if model in ("A", "B"):
        charge = 1
    else:
        charge = 2
    calc = GPAW(**params["relax"],
                charge=charge,
                txt=os.path.join(base_dir, "relax_{}.txt".format(model)))
    parprint(calc.parameters)
    parprint("Init magmom", atoms.get_initial_magnetic_moments())
    atoms.set_calculator(calc)
    # optimizations
    max_iter = 5
    sf = StrainFilter(atoms)
    # sf = ExpCellFilter(atoms)
    # opt_unitcell = BFGS(sf,
    # logfile=log_filename,
    # trajectory=traj_filename)
    # opt_unitcell.run(fmax=fmax)
    # shutil.copyfile(traj_filename, old_traj_filename)
    # for _ in range(max_iter):
    for i in range(max_iter):
        opt_cell = BFGS(sf, logfile=log_filename, trajectory=traj_filename)
        opt_norm = BFGS(atoms, logfile=log_filename, trajectory=traj_filename)
        opt_norm.run(fmax=fmax)
        s = atoms.get_stress()
        parprint("Cycle {}, Addition stress {}".format(i, s))
        opt_cell.run(fmax=fmax)
        # shutil.copyfile(traj_filename, old_traj_filename)

    # opt_cell.run(fmax=fmax)
    atoms.write(traj_fin_filename)
    # calc.set(**params["gs"],
    # txt=os.path.join(base_dir,
    # "gs.txt"))
    # atoms.get_potential_energy()
    # calc.write(gpw_file, mode="all")
    return True