Solid-Liquid interface of a Lennard-Jones crystal in contact with a Lennard-Jones liquid with walls¶
Note
This example requires few hours of computation time on 16 cores to generate a sensible output. However, you can run shorter simulations to acquaintance yourself with the code. To do this, change the input file variables eqnts
and nts
(equilibration and production number of time steps) to smaller values and/or reduce the number of points to move the walls (Step 1, Step 2 or Step 4) or switch off the interactions (Step 3).
Note
In this section /
is the package’s root folder.
In this example we will set up the cleaving calculation for the calculation of the SFE of a Lennard-Jones crystal in contact with its liquid at a temperature \(T = 0.617\).
The input files for the whole calculations can be found in the directory /examples/lj_SL
but in this tutorial we will go through the writing of such files from scratch.
First of all, create a new folder lj_SL
and step in it. Copy the folder /example/lj_SL/utils/
in the folder lj_SL
just created. The folder /utils/
contains some simple programs and script that will be needed to run the cleaving method and analyze the results.
Step 1¶
Create a
step1
folder and enter it. Create theout/
,data/
,restart/
, anddump/
subfolders. Note that you can safely comment out thedump
andrestart
lines of the input, since dump and restart files are not needed for the cleaving computation. In this case you don’t need to create therestart/
anddump/
folders.Prepare the LAMMPS input file. Here we use
/examples/lj_S/bulk.in
file as a starting point. Copy it to the current folder, delete all the lines after thef3
fix and change the temperature to 0.617variable Tsyst equal 0.617
.Prepare the starting configuration. Here we copy the
/examples/lj_systems/fcc111-T1.lmp
data file to the current folder. The file contains the starting configuration: a Lennard-Jones fcc crystal oriented along the direction (111) at the (reduced) temperature of 0.617.Prepare a walls file. Here we will use the
/examples/lj_systems/fcc111-T1-walls.lmp
file, which should be copied to the current folder. The exact format of this file is given in the description of the appropriate fix.Prepare a file containing the variation of the strength of the walls. The varying quantity in this case is the position of the walls with respect to the cleaving plane, \(z_w\). The starting position of the walls is denoted as \(z_{w,i}\), whereas the final position will be denoted as \(z_{w,f}\). This file contains a sequence of decreasing consecutive numbers in the interval \([z_{w,i},z_{w,f}]\) (extremes included). In this case, the \(z_{w}\) values can be arbitrary. The only contraint is that at the initial point the walls do not interact with any atoms in the system. Following 1, we choose for this particular system \(z_{w,i}=1.10\) and \(z_{w,f}=0.62\). Here is a (truncated) example of the file:
1.10
1.05
1.00
...
0.64
0.63
0.62
Warning
There is no internal control in the code that checks that the boundaries are correct and the sequence of number is an decreasing sequence
Here we will be using the /examples/lj_SL/cases/fcc111_T1_walls/zwall_111_T1.dat
file, so make sure to copy it to the current folder.
The walls in the system are introduced using the new fix
wallforce
:
fix f2 all wallforce ${eps} ${sigma} ${zwalls} ${delta} ${rw} ${clwall} file fcc111-T1-walls.lmp
where the explanation of the different parameters is given in the description of the fix. In the walls version of the cleaving model, the walls moves from the position \(z_{w,i}\) where they do not interact with the atoms in the system to the position \(z_{w,f}\) where they interacts with the atoms. LAMMPS allows the creation of an input file which can perform several runs in a row by changing the value of the parameter between the different runs. The relevant code that should be added to bulk.in
is
variable Nevery equal 100
variable Nrepeat equal 5
variable Nfreq equal 500
variable zw file zwall_111_T1.dat
variable clwall equal 16.81
variable sigma equal 1.0
variable eps equal 1.0
variable crw equal 2.0^(1.0/6.0)
variable rw equal ${sigma}*${crw}
variable delta equal 0.25
variable i equal 1
label here
variable zwalls equal ${zw}
fix f2 all wallforce ${eps} ${sigma} ${zwalls} ${delta} ${rw} ${clwall} file fcc111-T1-walls.lmp
print "Wall Position ${zwalls}"
run ${eqnts}
fix f5 all ave/time ${Nevery} ${Nrepeat} ${Nfreq} c_thermo_temp c_thermo_pe v_zwalls f_f2 file out/ave.F.${i}.out
run ${nts}
unfix f5
unfix f2
write_data data/Fstep1.${i}.data nocoeff
variable cntt equal ${i}+1
variable cnt equal ${i}
next zw
jump SELF here
To keep the main directory clean from all the output files generated during the run, we print those files in the out
and data
folders.
We refer to the LAMMPS documentation for the use of the jump
command to create a loop. Each iteration of the loop produces the following files:
Fstep1.${i}.data
: data file containing the last configuration of the i-th iterationave.F.${i}.out
: File which contains a summary of the properties of the system, including the work (f_f2
)
Launch the simulation.
Step 2¶
In the second step we repeat the same operations described in the previous step, but on the liquid system. Therefore, here we only describe what we do differently with respect to step 1
Same as Step 1
Same as Step 1
Prepare the starting configuration. Here we copy the
/examples/lj_systems/inputLIQ-111-T1.lmp
data file to the current folder. The file contains the starting configuration: a Lennard-Jones liquid at the (reduced) temperature of 0.617. Edit thebulk.in
input file so that the correct data file is read (i.e. change theread_data fcc111-T1.lmp
line toread_data inputLIQ-111-T1.lmp
).Same as Step 1
Same as Step 1. Note that the wall file does not need to be identical to the one used in Step 1. Only the initial and final positions of the walls (i.e., \(z_{w,i}\) and \(z_{w,f}\)) must be the same. However, for the sake of the tutorial we will use the same file used in before,
/examples/lj_SL/cases/fcc111_T1_walls/zwall_111_T1.dat
, so make sure to copy it to the current folder.Same as Step 1. Note: it is convenient to avoid using the same name for the data files produced. In the list of commands given in the point 6 of the Step 1, replace
write_data data/Fstep1.${i}.data nocoeff
with
write_data data/Fstep2.${i}.data nocoeff
Launch the simulation.
Step 3¶
In the third step we reorganize the liquid and solid systems in order to put them in contact. To to do this we replace the solid-solid and liquid-liquid interactions to the solid-liquid ones. To this aim we create a new data file that combines the two systems and will be used to control the cross-type interactions.
Create the
step3
folder and enter it. Create theout/
,data/
,dat/
,restart/
, anddump/
subfolders (where the latter two can be omitted if the related commands in the LAMMPS script file are commented). Thedat/
folder will contain the output of this step.The following substeps are required to create the initial data file (refer to the Figure below for the definition of the types):
Make a copy of the solid and liquid systems and redefine the types of the atoms in each of the 8 halves as 1-8, following the figure. The two halves of the solid and liquid systems (a-b and c-d) are defined according to their position relatively to the cleaving plane. The atom types 1-2-3-4 will represent the “true” atoms, whereas the atom with types 5-6-7-8 will represent duplicates
The atoms in the region a are assigned the type 1
The atoms in the region b are assigned the type 5
The atoms in the region c are assigned the type 7
The atoms in the region d are assigned the type 2
The atoms of type 3 have the same coordinates as the atoms in the region c with the z coordinate translated by one box size (i.e. \(z_{(3)} = z_{(7)} + L_z\), where \(L_z\) is the length of the box in the z-direction)
The atoms of type 4 have the same coordinates as the atoms in the region b with the z coordinate translated by one box size (i.e. \(z_{(4)} = z_{(5)} + L_z\))
The atoms of type 6 have the same coordinates as the atoms in the region a with the z coordinate translated by one box size (i.e. \(z_{(6)} = z_{(1)} + L_z\))
The atoms of type 8 have the same coordinate as the atoms in the region d with the z coordinate translated by one box size (i.e. \(z_{(8)} = z_{(2)} + L_z\))
The coordinates of the eight atom types must be written in a particular order in the data file. Each true type (i.e., types 1-4) should have an odd index, while the (even) index that follows should be used by the corresponding duplicate atom
Example
Given the following positions of atoms in the crystal:
Atoms # atomic
1 1 0.8578716707860459 0.4952924400584776 0.4669661907143749
2 1 0.2859572235953486 1.4858773201754327 0.4669661907143749
3 1 2.0017005651674404 0.4952924400584776 0.4669661907143749
...
the data file for step 3 would contain the following lines:
Atoms # atomic
1 1 0.8578716707860459 0.4952924400584776 0.4669661907143749
2 6 0.8578716707860459 0.4952924400584776 34.0885319221493717
3 1 0.2859572235953486 1.4858773201754327 0.4669661907143749
4 6 0.2859572235953486 1.4858773201754327 34.0885319221493717
5 1 2.0017005651674404 0.4952924400584776 0.4669661907143749
6 6 2.0017005651674404 0.4952924400584776 34.0885319221493717
...
In this tutorial we will use the fortran program step3IN.f90
, which will produce the data file automatically.
1. Copy `step3IN.f90` from `/utils/` to the current directory
2. Compile it: `gfortran -o step3IN step3IN.f90`
3. Copy the last `data/Fstep1.*.data` file from the [Step 1](#step-1) folder
4. Copy the last `data/Fstep2.*.data` file from the [Step 2](#step-2) folder
5. Run: `./step3IN Fstep1.*.data Fstep2.*.data 16.81` where 16.81 is the position of the cleaving plane used in both [Step 1](#step-1) and [Step 2](#step-2)
6. The output is the file `inputStep3.lmp`
Prepare a new LAMMPS input file. We again use the
/examples/lj_S/bulk.in
file as a starting point. Copy it to the current folder, delete all the lines after thef3
fix, change the temperature to 0.617 (variable Tsyst equal 0.617
) and change the name of the data file to match the file generated in the previous step (e.g.inputStep3.lmp
).We define two atom groups using the
group
command of LAMMPS to distinguish between thereal
and theduplicate
atoms
group real type 1 2 3 4
group dupl type 5 6 7 8
The switching off is implemented directly in the definition of the pair interactions. We therefore need to change the pair interaction in the LAMMPS script file (section Interactions) to the new defined type
pair_style lj/BGNlcleavs3 ${cutoff1} ${cutoff2} 1.0 1.0 1.0
All the parameters (cutoff1
, cutoff2
, epsilon
, sigma
) are identical to those used in Step 1. Note the three additional parameters. They allow to specify a global switch if needed. However, in this case we need to change the interactions specifically for each pair, so that we set these three numbers to 1.0 and modify the switching for each pair interaction.
We define explicitly whether each pair interaction needs to be switched. We start with the interactions that do not change during the course of the simulation. These interactions are the
self
interactions (i.e., interactions among atoms of the same type) and the interactions which do not cross the cleaving planes:
# Self interactions
pair_coeff 1 1 ${epslj} ${siglj} 1.0 1.0
pair_coeff 2 2 ${epslj} ${siglj} 1.0 1.0
pair_coeff 3 3 ${epslj} ${siglj} 1.0 1.0
pair_coeff 4 4 ${epslj} ${siglj} 1.0 1.0
pair_coeff 5 5 ${epslj} ${siglj} 0.0 1.0
pair_coeff 6 6 ${epslj} ${siglj} 0.0 1.0
pair_coeff 7 7 ${epslj} ${siglj} 0.0 1.0
pair_coeff 8 8 ${epslj} ${siglj} 0.0 1.0
# Interactions not crossing the cleaving plane
pair_coeff 1 4 ${epslj} ${siglj} 1.0 1.0
pair_coeff 2 3 ${epslj} ${siglj} 1.0 1.0
The remaining interactions will be either redefined within the loop that switches the interactions between the different phases or completely excluded from the simulations.
We need to exclude the unphysical interactions, i.e. the interactions among overlapping atoms. We use the option
exclude
of the LAMMPS commandneigh_modify
Replace the command
neigh_modify every 1 delay 0 check yes
with the command
neigh_modify every 1 delay 0 check yes exclude type 1 7 exclude type 1 8 exclude type 2 5 exclude type 2 6 exclude type 3 5 exclude type 3 6 exclude type 4 7 exclude type 4 8 exclude type 5 6 exclude type 5 7 exclude type 5 8 exclude type 6 7 exclude type 6 8 exclude type 7 8
Remove the line
velocity all create ${Tsyst} 93874090
and replace the group used in the velocity
commands from all
to real
velocity real zero linear
velocity real zero angular
The work needed to switch off the interactions (described in the next point) is calculated by adding the line
compute 1 all cleavpairs lj/BGNlcleavs3 norm 4 z
to end of the LAMMPS script file. The meaning of the parameters is reported in the description of this compute style.Prepare a walls file. Here we will use the
/examples/lj_systems/fcc111-T1-walls.lmp
file, which should be copied to the current folder.Add the command for the walls, together with the definition of the variables that sets the parameters specifying the walls characteristics:
variable clwall1 equal 16.81
variable clwall2 equal 48.53
variable sigma equal 1.0
variable eps equal 1.0
variable crw equal 2.0^(1.0/6.0)
variable rw equal ${sigma}*${crw}
variable delta equal 0.25
variable i equal 1
variable zwf equal 0.62
fix f2 all wallforce ${eps} ${sigma} ${zwf} ${delta} ${rw} ${clwall1} file fcc111-T1-walls.lmp
fix f3 all wallforce ${eps} ${sigma} ${zwf} ${delta} ${rw} ${clwall2} file fcc111-T1-walls.lmp
In this step the position of the walls is fixed and equal to the final position \(z_{w,f}\) defined for Step 1 and Step 2. Note that now we need to duplicate the command for the cleaving walls because we have two set of walls for two different positions of the cleaving plane (refer to the previous Figure). The position of the first set of cleaving walls (variable clwall1
for fix ID f2
) is the same as specified in Step 1 and Step 2. The position of the second set of cleaving walls (variable clwall2
for fix ID f3
) is given by clwall1 + lzliq
where lzliq
is the size of the z direction of the box for the liquid phase.
In the simulations we will be running, interactions are calculated among all pairs of atoms (modified as explained in sub-steps 5-6-12). However, the equations of motion are integrated only for the real atoms (i.e., the ones defined in the group
real
, see sub-step 4). Once the new position is calculated, we need to move the duplicate atoms of the same quantity, in order to match the position of the corresponding real atoms. This is done through the new computecompute cc1 real displace/atom_cleav
and new fixfix Nf1 dupl move/dupl c_cc1[*]
, which need to be added to the input file. The meaning of the parameters is reported in the description of the compute style and the description of the fix style.The actual switching off is obtained through another loop which increases the size of the box. In this loop the solid-solid interactions across the cleaving plane are switched-off, whereas the solid-liquid interactions across the cleaving plane are switched on. Add the following loop to the end of the LAMMPS script file:
variable Nevery equal 100
variable Nrepeat equal 5
variable Nfreq equal 500
variable i equal 1
variable lam file lambda.dat
label here
variable lambda equal ${lam}
variable minlam equal 1-${lam}
### Across cleaving plane interactions same phase
pair_coeff 1 5 ${epslj} ${siglj} ${minlam} -1.0
pair_coeff 1 6 ${epslj} ${siglj} ${minlam} -1.0
pair_coeff 2 7 ${epslj} ${siglj} ${minlam} -1.0
pair_coeff 2 8 ${epslj} ${siglj} ${minlam} -1.0
pair_coeff 3 7 ${epslj} ${siglj} ${minlam} -1.0
pair_coeff 3 8 ${epslj} ${siglj} ${minlam} -1.0
pair_coeff 4 5 ${epslj} ${siglj} ${minlam} -1.0
pair_coeff 4 6 ${epslj} ${siglj} ${minlam} -1.0
### Across cleaving plane interactions different phases
pair_coeff 1 2 ${epslj} ${siglj} ${lambda} 1.0
pair_coeff 1 3 ${epslj} ${siglj} ${lambda} 1.0
pair_coeff 2 4 ${epslj} ${siglj} ${lambda} 1.0
pair_coeff 3 4 ${epslj} ${siglj} ${lambda} 1.0
#--------------------------------------------------------------------
run ${eqnts}
fix fl6 all ave/time ${Nevery} ${Nrepeat} ${Nfreq} v_lambda file dat/lambda.${i}.dat
fix f6 all ave/time ${Nevery} ${Nrepeat} ${Nfreq} c_1[*] file dat/inters3.${i}.dat mode vector
run ${nts}
# --------------------------- Unfix --------------------------------------------
unfix fl6
unfix f6
write_data data/Fstep3.${i}.data nocoeff
variable cntt equal ${i}+1
variable cnt equal ${i}
next lam
jump SELF here
Prepare a file containing the variation of the strength of the interactions. This file contains a sequence of increasing consecutive numbers in the interval \([0,1]\) (extremes included). Here is a (truncated) example:
0.0
0.01
0.02
...
0.98
0.99
1.0
Note
The file must start at 0 and end at 1.
There is no internal control in the code that checks that the boundaries are correct.
Here we will be using the /examples/lj_SL/walls/step3/lambda.dat
file, so make sure to copy it to the current folder.
Launch the simulation.
Step 4¶
In the last step we remove the walls and thus unconstrain the newly created interfaces between the solid and the liquid.
Create the
step4
folder and enter it. Create theout/
,data/
,restart/
, anddump/
subfolders (where the latter two can be omitted if the related commands in the LAMMPS script file are commented). Theout/
folder will contain the output of this step.Prepare a walls file. Here we will use the
/examples/lj_systems/fcc111-T1-walls.lmp
file, which should be copied to the current folderCopy the last
data/Fstep3.*.data
file from the Step 3 folder. We cannot use this file as it is, since in this step we need only thereal
atoms. Therefore, we should get rid of all the atoms of type 5-6-7-8 and adjust the data file accordingly (i.e., modifying the total number of atoms and updating the list of velocities). In this tutorial we use the fortran programstep4IN.f90
, which will generate an appropriate data file automatically.Copy
step4IN.f90
from/utils/
to the current directoryCompile it:
gfortran -o step4IN step4IN.f90
Run:
./step4IN Fstep3.*.data
The output is the file
inputStep4.lmp
Prepare a new LAMMPS input file. We again use the
/examples/lj_S/bulk.in
file as a starting point. Copy it to the current folder, delete all the lines after thef3
fix, change the temperature to 0.617variable Tsyst equal 0.617
and change the name of the data file to match the file produced in the previous step (e.g.inputStep4.lmp
).Prepare a walls file. Here we will use the
/examples/lj_systems/fcc111-T1-walls.lmp
file, which should be copied to the current folder. The exact format of this file is given in the description of the appropriate fix.Prepare a file containing the variation of the strength of the walls. This file specifies the position of the walls which are moving backward with respect to the motion performed in Step 1 or Step 2. The starting point is therefore \(z_{w,f}\), and the last position is \(z_{w,i}\). This file contains a sequence of decreasing consecutive numbers in the interval \([z_{w,f},z_{w,i}]\) (extremes included). Here is a (truncated) example of the file:
0.62
0.63
0.64
...
1.00
1.05
1.10
Note
There is no internal control that checks that the boundaries are correct and the sequence of number is an increasing sequence
The sequence of points does not need to be the exact reverse of the one used in Step 1 or Step 2
The initial (\(z_{w,f}\)) and final (\(z_{w,i}\)) points must match the ones used in Step 1 and Step 2
Here we will be using the /examples/lj_SL/cases/fcc111_T1_walls/zwall_back_111_T1.dat
file, so make sure to copy it to the current folder.
variable Nevery equal 100
variable Nrepeat equal 5
variable Nfreq equal 500
variable zw file zwall_back_111_T1.dat
variable clwall1 equal 16.81
variable clwall2 equal 48.52
variable sigma equal 1.0
variable eps equal 1.0
variable crw equal 2.0^(1.0/6.0)
variable rw equal ${sigma}*${crw}
variable delta equal 0.25
variable i equal 1
label here
variable zwalls equal ${zw}
fix f2 all wallforce ${eps} ${sigma} ${zwalls} ${delta} ${rw} ${clwall1} file fcc111-T1-walls.lmp
fix f3 all wallforce ${eps} ${sigma} ${zwalls} ${delta} ${rw} ${clwall2} file fcc111-T1-walls.lmp
variable totW equal "f_f2 + f_f3"
print "Wall Position ${zwalls}"
run ${eqnts}
fix f5 all ave/time ${Nevery} ${Nrepeat} ${Nfreq} c_thermo_temp c_thermo_pe v_zwalls f_f2 file out/ave.F.${i}.out
run ${nts}
unfix f2
unfix f3
unfix f5
write_data data/Fstep4.${i}.data nocoeff
variable cntt equal ${i}+1
variable cnt equal ${i}
next zw
jump SELF here
Launch the simulation.
Calculation of the SFE¶
The SFE is obtained by summing the work performed in the 4 steps detailed above. The work is calculated by using the results produced in each step. The folder /examples/LJ_SL/utils/
contains some small programs for the post-processing.
work.sh
: bash script to calculate the average of the relevant properties for each step of the thermodynamic integrationcalcworkstep3.f90
: fortran program to extract the value of the interactions calculated in Step 3. It must be compiled by running the commandgfortran calcworkstep3.f90
from within the/utils/
foldercalcSFE.m
: Matlab script to perform the integration of each curve
Before analyzing the calculations, let’s create a folder /results/
at the same level of the folders ./step1/
, ./step3
, ./step4
. Here, we will copy the results for each step.
The files
.out
generated in Step 1 contains the quantityf_f2
, which is the work performed. An average of that quantity for each \(z_w\) gives the variation of the energy in step 1, thus the integration of the results quantity over \(z_w\) gives the total work done in the step. In order to calculate the work performed in Step 1:Enter in the dir
./step1/out/
Call the script
../../utils/work.sh F
Copy the file
F-work.dat
in the folder./results/
by changing its name tostep1_work.dat
The profile of the work obtained as function of \(\lambda\) is represented in the next figure.
The profile of the work obtained as function of \(z_w\) is represented in the next figure.
The files
.dat
generated in Step 3 contains the interactions switched-off during the Step 3. By averaging these values for each value of lambda we obtain the variation of the energy, and the integration of the results over \(\lambda\) gives the total work done in Step 3.
In order to calculate the work performed in Step 3:
1. Enter in the dir `./step3/dat/`
2. Call the program `../../utils/a.out`
3. Call the script `../../utils/work.sh F`
4. Copy the file `F-work.dat` in the folder `./results/` by changing its name to `step3_work.dat`
The profile of the work obtained as function of \(\lambda\) is represented in the next figure.
The profile of the work obtained as function of \(z_w\) is represented in the next figure.
After the profile of the work in the four steps is obtained, we can calculate the SFE by integrating all the curves. Enter in the dir
/results
, copy the Matlab script/utils/calcSFE.m
and run it in Matlab from this folder. The final value of the SFE is \(0.348\pm 0.07\) in units of \(\epsilon\sigma^{-2}\).
- 1
R. L. Davidchack and B. B. Laird. Direct calculation of the crystal–melt interfacial free energies for continuous potentials: application to the lennard-jones system. The Journal of chemical physics, 118(16):7651–7657, 2003.