# A bit Math first

To get $y$-at%Mg2Si for the 1.2wt%Mg2Si system, calculate the following simultaneous equations,

\begin{aligned} \frac{(\text{Mg_2Si})_y}{\text{Al}_x +(\text{Mg_2Si})_y} &=& 0.012, \ x + y &=& 1, \end{aligned}

using masses, Al=26,981, Mg=24.305, and Si=28.085. We get $y\simeq 0.00425$.

# In case of 32000-atom system

If we put (20,20,20) cubic FCC cells including 4 atoms in the simulation box, the box contains 32,000 atoms. In the 32000-atom system,

$$32000*y \simeq 32000 *0.00425 \sim 136,$$

there are 136 Mg$_2$Si units. So there are about 90 Mg atoms and 45 Si atoms in the system, and rest of all are Al atoms.

from ase import Atoms
from ase.lattice.cubic import FaceCenteredCubic
atoms=FaceCenteredCubic(symbol='Al',latticeconstant=4.041,size=(20,20,20))
print atoms.get_number_of_atoms()


::: parsed-literal 32000 :::

from random import random
natm0= atoms.get_number_of_atoms()
n_si= 0
n_mg= 0
for i in range(natm0):
rnd= random()
if rnd < 0.00425:
if rnd < 0.00425/3:
atoms[i].symbol= 'Si'
n_si += 1
else:
atoms[i].symbol= 'Mg'
n_mg += 1
print 'number of Mg = ',n_mg
print 'number of Si = ',n_si


::: parsed-literal number of Mg = 102 number of Si = 46 :::

# Introduce vacancy

For solute atoms to move, there must be sufficient amount of vacancies in the system. Here we introduce vacancies of almost the same amount of solute atoms.

n_vac= 0
for i in range(natm0-1,0-1,-1):
if random() < 0.00425:
atoms.pop(i)
n_vac += 1

print 'number of vacancies = ',n_vac


::: parsed-literal number of vacancies = 139 :::

n_si= 0
n_mg= 0
for i in range(len(atoms)):
if atoms[i].symbol == 'Si':
n_si += 1
elif atoms[i].symbol == 'Mg':
n_mg += 1
print 'number of Mg = ',n_mg
print 'number of Si = ',n_si


::: parsed-literal number of Mg = 101 number of Si = 46 :::

# Write the atoms to lammps-readable format

In order to write an atomic configuration file for LAMMPS, ase's write function does not work. Instead, we have to use write_lammps_data function in lammpsrun module.

from ase.calculators import lammpsrun

fname= 'data.AlMgSi'
lammpsrun.write_lammps_data(fname,atoms)

!head -n15 data.AlMgSi


::: parsed-literal data.AlMgSi (written by ASE)

31861 atoms 3 atom types 0.0 80.820000000 xlo xhi 0.0 80.820000000 ylo yhi 0.0 80.819999999 zlo zhi

Atoms

1 1 0E-9 0E-9 0E-9 2 1 2.020500000 2.020500000 0E-9 3 1 2.020500000 0E-9 2.020500000 4 1 0E-9 2.020500000 2.020500000 :::

Note that in this case, the order of chemical species are Al, Mg, and Si, because in LAMMPS atoms types are assigned according to the alphabetic order.