Skip to main content

Structure Ordering

Example: NaSiCON NaXxZrX2SiXx1PX4xOX12\ce{Na_xZr_2Si_{x-1}P_{4-x}O_{12}}(x = 1-4)

Primitive Cell

For the primitive cell (2 f.u.), 2x is an integer between 2-8. Then x is

[2,3,4..8]/2 = 1, 1.5, 2, 2.5, 3, 3.5 and 4

2×1×12\times1\times1 Super Cell

In 211 supercell (4 f.u.) 4x is a integer between 4-16. Then the ‘x' in my script is:

[4,5,616]/4 = [1,1.25,2.53.75,4]

The site occupancy for each Na is x/4 =  [0.25,0.3125, …,1] which is reasonable. And I think Si and P are correct as well.

As a double check: 

'x = 1.25’: the code generated NaX5ZrX8SiX1PX10OX48\ce{Na_5Zr_8Si_1P_{10}O_{48}} which is reduced as: NaX1.25ZrX2SiX0.25PX2.5OX12\ce{Na_{1.25}Zr_2Si_{0.25}P_{2.5}O_{12}} ‘x = 2.25’: the code generated NaX9ZrX8SiX5PX7OX48\ce{Na_9Zr_8Si_5P_7O_{48}} which is reduced as: NaX2.25ZrX2SiX1.25PX1.75OX12\ce{Na_{2.25}Zr_2Si_{1.25}P_{1.75}O_{12}}

from pymatgen.transformations.standard_transformations import OrderDisorderedStructureTransformation, SubstitutionTransformation, AutoOxiStateDecorationTransformation,SupercellTransformation`

from pymatgen.alchemy.transmuters import PoscarTransmuter, CifTransmuter
from pymatgen.io.vasp.sets import MVLScanRelaxSet
from pymatgen.alchemy.filters import RemoveDuplicatesFilter
import re,os,multiprocessing

import numpy as np

from joblib import Parallel, delayed

source ="../EntryWithCollCode15546_Na4Zr2Si3O12_573K.cif"

home_dir = os.getcwd()

def ordering(x):
work_dir = home_dir+'/Na'+str(x)
os.mkdir(work_dir)
os.chdir(work_dir)

nasiconT = CifTransmuter.from_filenames([source], transformations=[AutoOxiStateDecorationTransformation()], primitive = True)

nasiconT.append_transformation(SupercellTransformation(scaling_matrix=((2, 0, 0), (0, 1, 0), (0, 0, 1))))

# Nax Zr2 Six-1 P4-x O12, x = 1-4`

chem_dict = {"Na+": {"Na+": x/4.0}, "Si4+" : {"Si4+": (x-1)/3.0, "P5+": (4-x)/3.0}}

nasiconT.append_transformation(SubstitutionTransformation(chem_dict))

nasiconT.append_transformation(OrderDisorderedStructureTransformation(),extend_collection=500)

print ("Total ordering:", len(nasiconT),chem_dict)

nasiconT.apply_filter(RemoveDuplicatesFilter())

print ("Reduce ordering:",len(nasiconT),chem_dict)

incar_mod = {"EDIFF" : 1e-5, "EDIFFG" : -0.01, "NSW" : 150, "NCORE" : 12, "LPLANE" : "True", "NSIM" : 4, "ISYM" : 0, "NELMIN" : 4, "ISPIN" : 1, "ISMEAR": 0}

nasiconT.write_vasp_input(vasp_input_set=MVLScanRelaxSet,potcar_functional='PBE_54', user_incar_settings=incar_mod, include_cif=True)

x_list = np.arange(4,16)/4
num_cores = multiprocessing.cpu_count()

print('Start structure generation over',num_cores,'Cores........')

Parallel(n_jobs=num_cores)(delayed(ordering)(x) for x in x_list)