Exemplo n.º 1
0
# substrate_bulk = get_struct_from_mp('Ag')
sa_sub = SpacegroupAnalyzer(substrate_bulk)
substrate_bulk = sa_sub.get_conventional_standard_structure()
substrate_slab = Interface(substrate_bulk,
                           hkl=[1, 1, 1],
                           min_thick=10,
                           min_vac=25,
                           primitive=False, from_ase=True)
# substrate_slab = slab_from_file([0,0,1], 'POSCAR_substrate')
mat2d_slab = slab_from_file([0, 0, 1], 'POSCAR_2D')
# get the in-plane lattice aligned slabs
# substrate_slab.to(fmt='poscar', filename='POSCAR_substrate_slab.vasp')
mat2d_slab.to(fmt='poscar', filename='POSCAR_mat2d_slab.vasp')
# selective dynamics flag
sd_flags = CalibrateSlab.set_sd_flags(
    interface=substrate_slab,
    n_layers=nlayers_substrate,
    top=True, bottom=False)
poscar = Poscar(substrate_slab, selective_dynamics=sd_flags)
poscar.write_file(filename='POSCAR_substrate_slab.vasp')
# get aligned lattices
substrate_slab_aligned, mat2d_slab_aligned = get_aligned_lattices(
    substrate_slab,
    mat2d_slab,
    max_area=400,
    max_mismatch=0.05,
    max_angle_diff=1,
    r1r2_tol=0.01)
substrate_slab_aligned.to(fmt='poscar',
                          filename='POSCAR_substrate_aligned.vasp')
mat2d_slab_aligned.to(fmt='poscar',
                      filename='POSCAR_mat2d_aligned.vasp')
Exemplo n.º 2
0
            os.mkdir(dir_name)
        substrate_bulk.to(fmt='poscar',
                          filename=dir_name + os.sep +
                          item.replace('json', 'vasp'))
        for direction in directions:
            address = dir_name + os.sep + str(direction)
            if not os.path.exists(address):
                os.mkdir(address)
            substrate_slab = Interface(substrate_bulk,
                                       hkl=direction,
                                       min_thick=10,
                                       min_vac=15,
                                       primitive=False,
                                       from_ase=True)
            sd_flags = CalibrateSlab.set_sd_flags(interface=substrate_slab,
                                                  n_layers=nlayers_substrate,
                                                  top=True,
                                                  bottom=False)

            substrate_slab_aligned, mat2d_slab_aligned, mismatch = transformations.get_aligned_lattices(
                substrate_slab,
                mat2d_slab,
                max_area=40,
                max_mismatch=0.05,
                max_angle_diff=20,
                r1r2_tol=0.01)
            substrate_slab_aligned.to(fmt='poscar',
                                      filename=address + os.sep +
                                      'POSCAR_substrate_aligned.vasp')
            mat2d_slab_aligned.to(fmt='poscar',
                                  filename=address + os.sep +
                                  'POSCAR_mat2d_aligned.vasp')
Exemplo n.º 3
0
def step3():
    """
    put aligned & relaxed 2d materials in all possible ways on the
    aligned & relaxed slab,
    relax interface ionic positions(ISIF=2)

    - uses info from step2_sub.json and step2_2d.json
    - creates required input files and submits the jobs to the que
    - 8(pairs) * 2(atoms in graphene basis) = 16 jobs
    - returns: step3.json     
    """
    seperation = 3 # in angstroms
    nlayers_2d = 1
    nlayers_sub = 2
    hkl_sub = [1,1,1]
    hkl_2d = [0,0,1]
    #job directory for the runs
    name = 'step3'    
    job_dir = 'step3'
    # incar
    incar = Incar.from_dict(incar_dict)
    incar['ISMEAR'] = 1
    incar['ISIF'] = 2
    # kpoints
    kpoints = Kpoints.monkhorst_automatic(kpts=(18, 18, 1))
    # load in previous jobs
    relaxed_sub_jobs = Calibrate.jobs_from_file('step2_sub.json')
    relaxed_2d_jobs = Calibrate.jobs_from_file('step2_2d.json')
    # create list of all substrate poscars
    all_poscars = []
    # loop over aligned & relaxed substrates and 2d
    for jsub, j2d in zip(relaxed_sub_jobs,relaxed_2d_jobs):
        # substrate
        job_dir_sub = os.path.join(jsub.parent_job_dir, jsub.job_dir)
        contcar_file = os.path.join(job_dir_sub, 'CONTCAR')
        # read in as structure object
        substrate_slab_aligned = Structure.from_file(contcar_file)
        species_sub = ''.join([tos.symbol for tos in substrate_slab_aligned.types_of_specie])
        # 2d
        job_dir_2d = os.path.join(j2d.parent_job_dir, j2d.job_dir)
        contcar_file = os.path.join(job_dir_2d, 'CONTCAR')
        # read in as structure object        
        mat2d_slab_aligned = Structure.from_file(contcar_file)
        species_2d = ''.join([tos.symbol for tos in mat2d_slab_aligned.types_of_specie])
        # position the aligned materials in all possible ways
        hetero_interfaces = generate_all_configs(mat2d_slab_aligned,
                                                 substrate_slab_aligned,
                                                 nlayers_2d,
                                                 nlayers_sub,
                                                 seperation )
        # loop over all hetero-interfaces
        for i, iface in enumerate(hetero_interfaces):
            sd_flags = CalibrateSlab.set_sd_flags(interface=iface,
                                                  n_layers=nlayers_2d+nlayers_sub,
                                                  top=True, bottom=False)
            poscar = Poscar(iface, selective_dynamics=sd_flags)
            poscar.comment = '_'.join([species_sub,species_2d,str(i)])
            all_poscars.append(poscar)
    # setup calibrate and run'em
    turn_knobs = OrderedDict(
        [
            ('POSCAR', all_poscars)
        ])
    qadapter, job_cmd = get_run_cmmnd(nnodes=nnodes, nprocs=nprocs,
                                      walltime=walltime,
                                      job_bin=bin_sub, mem=mem)
    run_cal(turn_knobs, qadapter, job_cmd, job_dir,
            name, incar=incar, kpoints=kpoints)
    return [name+'.json']
Exemplo n.º 4
0
def upload_file():
    stamp = ""
    if request.method == 'POST':
        #request.environ['REMOTE_ADDR']
        if request.environ.get('HTTP_X_FORWARDED_FOR') is None:
            ip = request.environ['REMOTE_ADDR']
        else:
            ip = request.environ['HTTP_X_FORWARDED_FOR']  # if behind a proxy
        #substrate information#
        f1 = request.files['POSCAR_sub']
        stamp = time.strftime("%Y%m%d-%H%M%S") + '-' + ip
        poscar_sub = stamp + '-' + f1.filename
        f1.save(upload_dir + os.sep + secure_filename(poscar_sub))
        h_sub = int(request.form["h_sub"])
        k_sub = int(request.form["k_sub"])
        l_sub = int(request.form["l_sub"])
        nlayers_substrate = int(request.form["nlayers_substrate"])
        min_thick_sub = float(request.form["min_thick_sub"])
        min_vac_sub = float(request.form["min_vac_sub"])
        #is_primitive      = request.form.get["is_primitive"]
        hkl_sub = [h_sub, k_sub, l_sub]

        #2d information#
        f2 = request.files['POSCAR_2d']
        poscar_2d = stamp + '-' + f2.filename
        f2.save(upload_dir + os.sep + secure_filename(poscar_2d))
        h_2d = int(request.form["h_2d"])
        k_2d = int(request.form["k_2d"])
        l_2d = int(request.form["l_2d"])
        nlayers_2d = int(request.form["nlayers_2d"])
        hkl_2d = [h_2d, k_2d, l_2d]

        #General information#
        separation = float(request.form["separation"])
        max_area = float(request.form["max_area"])
        max_mismatch = float(request.form["max_mismatch"])
        max_angle_diff = float(request.form["max_angle_diff"])

        #Matching#
        try:
            substrate_bulk = pymatgen.Structure.from_file(upload_dir + os.sep +
                                                          poscar_sub)
            sa_sub = pymatgen.symmetry.analyzer.SpacegroupAnalyzer(
                substrate_bulk)
            substrate_bulk = sa_sub.get_conventional_standard_structure()
            substrate_slab = Interface(substrate_bulk,
                                       hkl=hkl_sub,
                                       min_thick=min_thick_sub,
                                       min_vac=min_vac_sub,
                                       primitive=False,
                                       from_ase=True)

            mat2d_slab = utils.slab_from_file(hkl_2d,
                                              upload_dir + os.sep + poscar_2d)
            operation_dir = "static" + os.sep + "operations" + os.sep + stamp
            if not os.path.exists(operation_dir):
                os.makedirs(operation_dir)
            mat2d_slab.to(fmt="poscar",
                          filename=operation_dir + "POSCAR_mat2d_slab.vasp")
            sd_flags = CalibrateSlab.set_sd_flags(interface=substrate_slab,
                                                  n_layers=nlayers_substrate,
                                                  top=True,
                                                  bottom=False)
            poscar = pymatgen.io.vasp.inputs.Poscar(
                substrate_slab, selective_dynamics=sd_flags)
            poscar.write_file(filename=operation_dir + os.sep +
                              "POSCAR_substrate_slab.vasp")
            substrate_slab_aligned, mat2d_slab_aligned, mismatch = transformations.get_aligned_lattices(
                substrate_slab,
                mat2d_slab,
                max_area=max_area,
                max_mismatch=max_mismatch,
                max_angle_diff=max_angle_diff,
                r1r2_tol=0.01)
            substrate_slab_aligned.to(fmt="poscar",
                                      filename=operation_dir + os.sep +
                                      "POSCAR_substrate_aligned.vasp")
            mat2d_slab_aligned.to(fmt="poscar",
                                  filename=operation_dir + os.sep +
                                  "POSCAR_mat2d_aligned.vasp")
            hetero_interfaces = transformations.generate_all_configs(
                mat2d_slab_aligned, substrate_slab_aligned, nlayers_2d,
                nlayers_substrate, separation)
            for i, iface in enumerate(hetero_interfaces):
                sd_flags = CalibrateSlab.set_sd_flags(interface=iface,
                                                      n_layers=nlayers_2d +
                                                      nlayers_substrate,
                                                      top=True,
                                                      bottom=False)
                poscar = pymatgen.io.vasp.inputs.Poscar(
                    iface, selective_dynamics=sd_flags)
                poscar.write_file(filename=operation_dir + os.sep +
                                  'POSCAR_final_{}.vasp'.format(i))

                p = Poscar.from_file(operation_dir + os.sep +
                                     'POSCAR_final_{}.vasp'.format(i))
                w = CifWriter(p.structure)
                w.write_file(operation_dir + os.sep +
                             'POSCAR_final_{}.cif'.format(i))


#                st = pychemia.code.vasp.read_poscar(operation_dir+os.sep+'POSCAR_final_{}.vasp'.format(i))
#rf = open("testing")
#rf.write("reading succesful")
#rf.close()
#                pychemia.io.cif.save(structure=st,filename=operation_dir+os.sep+'POSCAR_final_{}.xyz'.format(i))
        except:
            #redirect(url_for("error",_id="matching",stamp=stamp))
            return ("Error")

        return redirect(url_for('result', stamp=stamp))
    return render_template("matching.html",
                           _id="matching",
                           test_var="test",
                           stamp=stamp)
Exemplo n.º 5
0
def step2():
    """
    read in the realxed bulk substrates and relaxed 2d,
    create substrate slab,
    get aligned substrates and 2d,
    relax the aligned structures seperatly(only ionic positions, ISIF=2)

    - input from step1_sub.json and step1_2d.json
    - 8(pairs) * 2 = 16 jobs
    - returns step2.json
    """
    nlayers_2d = 1
    nlayers_sub = 2
    hkl_sub = [1,1,1]
    min_thick = 10.0
    min_vac = 18.0
    hkl_2d = [0,0,1]
    #job directory for the runs
    job_dir_sub = 'step2_sub'
    job_dir_2d = 'step2_2d'
    # isif = 2
    incar_sub['ISIF'] = 2
    incar_2d['ISIF'] = 2
    # kpoints
    kpoints_sub = Kpoints.monkhorst_automatic(kpts=(18, 18, 1))
    kpoints_2d = Kpoints.monkhorst_automatic(kpts=(18, 18, 1))    
    # CSL settings for each substrate
    alignment_settings = { 'Pt': [120, 0.10, 1, 0.5],
                        'Ag': [120, 0.10, 1, 0.5],
                        'Al': [120, 0.10, 1, 0.5],
                        'Au': [120, 0.10, 1, 0.5],
                        'Pd': [120, 0.10, 1, 0.5],
                        'Ir': [120, 0.10, 1, 0.5],
                        'Cu': [50, 0.06, 1, 0.5],
                        'Ni': [50, 0.06, 1, 0.5] }
    # load in previous jobs
    relaxed_sub_jobs = Calibrate.jobs_from_file('step1_sub.json')
    relaxed_2d_jobs = Calibrate.jobs_from_file('step1_2d.json')
    poscars_sub = []
    poscars_2d = []
    # create list of all aligned substrate and 2d slabs
    for jsub in relaxed_sub_jobs:
        jdir = os.path.join(jsub.parent_job_dir, jsub.job_dir)
        contcar_file = os.path.join(jdir, 'CONTCAR')
        relaxed_struct_sub = Structure.from_file(contcar_file)
        # create slab
        slab_sub = Interface(relaxed_struct_sub,  hkl = hkl_sub,
                             min_thick = min_thick, min_vac = min_vac,
                             primitive = False, from_ase = True)
        species_sub = ''.join([tos.symbol for tos in slab_sub.types_of_specie])
        # loop over 2d
        for j2d in relaxed_2d_jobs:    
            jdir = os.path.join(j2d.parent_job_dir, j2d.job_dir)
            contcar_file = os.path.join(jdir, 'CONTCAR')
            slab_2d = slab_from_file(hkl_2d, contcar_file)
            species_2d = ''.join([tos.symbol for tos in slab_2d.types_of_specie])
            # align
            slab_sub_aligned, slab_2d_aligned = get_aligned_lattices(
                slab_sub,
                slab_2d,
                *alignment_settings[species_sub])
            # aligned sub poscar
            sd_flags = CalibrateSlab.set_sd_flags(interface=slab_sub_aligned,
                                                  n_layers=nlayers_sub)
            poscar = Poscar(slab_sub_aligned, selective_dynamics=sd_flags)
            poscar.comment = '_'.join([species_sub,species_2d,'sub'])            
            poscars_sub.append(poscar)
            # aligned 2d slab
            sd_flags = CalibrateSlab.set_sd_flags(interface=slab_2d_aligned,
                                                  n_layers=nlayers_2d)
            poscar = Poscar(slab_2d_aligned, selective_dynamics=sd_flags)
            poscar.comment = '_'.join([species_sub,species_2d,'2d'])
            poscars_2d.append(poscar)
    # setup calibrate and run'em
    turn_knobs_sub = OrderedDict(
        [
            ('POSCAR', poscars_sub)
        ])
    turn_knobs_2d = OrderedDict(
        [
            ('POSCAR', poscars_2d)
        ])
    qadapter, job_cmd = get_run_cmmnd(nnodes=nnodes, nprocs=nprocs,
                                            walltime=walltime,
                                            job_bin=bin_sub, mem=mem)
    run_cal(turn_knobs_sub, qadapter, job_cmd, job_dir_sub,
            'step2_sub', incar=incar_sub, kpoints=kpoints_sub)
    run_cal(turn_knobs_2d, qadapter, job_cmd, job_dir_2d,
            'step2_2d', incar=incar_2d, kpoints=kpoints_2d)
    return ['step2_sub.json', 'step2_2d.json']