The objective of this tutorial is to generate a symmetric tilt grain boundary in LAMMPS. This tutorial can serve as a precursor to more advanced techniques, whereby in-plane translations and atom deletion criteria are used to sample a large number of potential structures to find the global minimum energy grain boundary structure[1][2].
Author(s): Mark A. Tschopp, Nayeon Lee
Corresponding Author: mark.tschopp@gatech.edu
Movie showing the minimization of the grain boundary structure for an aluminum Sigma5 (310) symmetric tilt grain boundary.
The following input script shows how multiple translations and an atom deletion criteria are used to calculate the minimum energy structure. This input script for LAMMPS[3] can be called with a command of the form, "lmp_exe < input.script." This script contains loops over x-translations, z-translations, and atom overlap distances (an atom is deleted when an atom pair with a nearest neighbor distance is less than this distance). The unique minimum energy structures are saved as a dump file with the energy appended to the filename in a new folder specified by the 'gbname' variable. The dump files can then be easily scanned through for the global minimum energy structure. Simulations performed on Aug 2014 LAMMPS version.
# LAMMPS Input File for Grain Boundaries # Mark Tschopp, Dec2009 # This file will generate a single Sigma5(310) STGB # ---------- Initialize Simulation --------------------- clear units metal dimension 3 boundary p p p atom_style atomic # ---------- Create Atomistic Structure --------------------- lattice fcc 4.05 region whole block 0.000000 12.807225 -64.0361225 64.0361225 0.000000 4.050000 units box create_box 2 whole region upper block INF INF 0.000000 64.0361225 INF INF units box lattice fcc 4.05 orient x 0 3 1 orient y 0 -1 3 orient z 1 0 0 create_atoms 1 region upper region lower block INF INF -64.0361225 0.000000 INF INF units box lattice fcc 4.05 orient x 0 3 -1 orient y 0 1 3 orient z 1 0 0 create_atoms 2 region lower group upper type 1 group lower type 2 # ---------- Define Interatomic Potential --------------------- pair_style eam/alloy pair_coeff * * Al99.eam.alloy Al Al neighbor 2.0 bin neigh_modify delay 10 check yes # ---------- Displace atoms and delete overlapping atoms --------------------- displace_atoms upper move 0 0 0 units lattice delete_atoms overlap 0.35 lower upper # ---------- Define Settings --------------------- compute csym all centro/atom fcc compute eng all pe/atom compute eatoms all reduce sum c_eng # ---------- Run Minimization --------------------- reset_timestep 0 thermo 10 thermo_style custom step pe lx ly lz press pxx pyy pzz c_eatoms dump 1 all cfg 25 dump.sig5_minimization_*.cfg mass type xs ys zs c_csym c_eng fx fy fz dump_modify 1 element Al Al min_style cg minimize 1e-15 1e-15 5000 5000 undump 1 # ---------- Run Minimization 2--------------------- # Now allow the box to expand/contract perpendicular to the grain boundary reset_timestep 0 thermo 10 thermo_style custom step pe lx ly lz press pxx pyy pzz c_eatoms fix 1 all box/relax y 0 vmax 0.001 min_style cg minimize 1e-15 1e-15 5000 5000 # ---------- Calculate GB Energy --------------------- variable minimumenergy equal -3.360000 variable esum equal "v_minimumenergy * count(all)" variable xseng equal "c_eatoms - (v_minimumenergy * count(all))" variable gbarea equal "lx * lz * 2" variable gbe equal "(c_eatoms - (v_minimumenergy * count(all)))/v_gbarea" variable gbemJm2 equal ${gbe}*16021.7733 variable gbernd equal round(${gbemJm2}) print "GB energy is ${gbemJm2} mJ/m^2" # ---------- Dump data into Data file ------------- reset_timestep 0 dump 1 all cfg 10000 dump.al_sig5_310_*.cfg mass type xs ys zs c_csym c_eng fx fy fz dump_modify 1 element Al Al minimize 1e-15 1e-15 5000 5000 undump 1 write_restart restart.al_sig5_310_stgb print "All done"
Here is an example logfile that is obtained after running this script.
LAMMPS (13 Jul 2010) # LAMMPS Input File for Grain Boundaries # Mark Tschopp, Dec2009 # This file will generate a single Sigma5(310) STGB # ---------- Initialize Simulation --------------------- clear units metal dimension 3 boundary p p p atom_style atomic # ---------- Create Atomistic Structure --------------------- lattice fcc 4.05 Lattice spacing in x,y,z = 4.05 4.05 4.05 region whole block 0.000000 12.807225 -64.0361225 64.0361225 0.000000 4.050000 units box create_box 2 whole Created orthogonal box = (0 -64.0361 0) to (12.8072 64.0361 4.05) 1 by 1 by 1 processor grid region upper block INF INF 0.000000 64.0361225 INF INF units box lattice fcc 4.05 orient x 0 3 1 orient y 0 -1 3 orient z 1 0 0 Lattice spacing in x,y,z = 5.12289 5.12289 4.05 create_atoms 1 region upper Created 200 atoms region lower block INF INF -64.0361225 0.000000 INF INF units box lattice fcc 4.05 orient x 0 3 -1 orient y 0 1 3 orient z 1 0 0 Lattice spacing in x,y,z = 5.12289 5.12289 4.05 create_atoms 2 region lower Created 200 atoms group upper type 1 200 atoms in group upper group lower type 2 200 atoms in group lower # ---------- Define Interatomic Potential --------------------- pair_style eam/alloy pair_coeff * * Al99.eam.alloy Al Al neighbor 2.0 bin neigh_modify delay 10 check yes # ---------- Displace atoms and delete overlapping atoms --------------------- displace_atoms upper move 0 0 0 units lattice delete_atoms overlap 0.35 lower upper Deleted 2 atoms, new total = 398 # ---------- Define Settings --------------------- compute csym all centro/atom fcc compute eng all pe/atom compute eatoms all reduce sum c_eng # ---------- Run Minimization --------------------- reset_timestep 0 thermo 10 thermo_style custom step pe lx ly lz press pxx pyy pzz c_eatoms dump 1 all cfg 25 dump.sig5_minimization_*.cfg id type xs ys zs c_csym c_eng fx fy fz dump_modify 1 element Al Al min_style cg minimize 1e-15 1e-15 5000 5000 Memory usage per processor = 3.58369 Mbytes Step PotEng Lx Ly Lz Press Pxx Pyy Pzz eatoms 0 -1318.9843 12.807225 128.07225 4.05 875.32429 -2675.7752 7333.2608 -2031.5128 -1318.9843 10 -1329.7948 12.807225 128.07225 4.05 4786.2646 2230.1043 9306.1111 2822.5783 -1329.7948 20 -1330.138 12.807225 128.07225 4.05 5741.5477 3251.6199 10395.111 3577.9118 -1330.138 30 -1330.2064 12.807225 128.07225 4.05 5762.2257 3246.6439 10519.567 3520.4656 -1330.2064 40 -1330.2128 12.807225 128.07225 4.05 5812.6504 3332.1043 10542.913 3562.9335 -1330.2128 50 -1330.2136 12.807225 128.07225 4.05 5811.3217 3335.8029 10533.825 3564.3374 -1330.2136 766 -1333.6024 12.807225 128.07225 4.05 -6.3617301 -262.3388 1197.774 -954.5204 -1333.6024 Loop time of 5.19081 on 1 procs for 766 steps with 398 atoms Minimization stats: Stopping criterion = linesearch alpha is zero Energy initial, next-to-last, final = -1318.98429985 -1333.60243356 -1333.60243356 Force two-norm initial, final = 17.5886 0.000221422 Force max component initial, final = 6.25036 3.74708e-05 Final line search alpha, max atom move = 0.25 9.36769e-06 Iterations, force evaluations = 766 2310 Pair time (%) = 4.35802 (83.9565) Neigh time (%) = 0.00490403 (0.0944753) Comm time (%) = 0.297343 (5.72827) Outpt time (%) = 0.391773 (7.54745) Other time (%) = 0.138767 (2.67332) Nlocal: 398 ave 398 max 398 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 5281 ave 5281 max 5281 min Histogram: 1 0 0 0 0 0 0 0 0 0 Neighs: 27704 ave 27704 max 27704 min Histogram: 1 0 0 0 0 0 0 0 0 0 FullNghs: 55442 ave 55442 max 55442 min Histogram: 1 0 0 0 0 0 0 0 0 0 Total # of neighbors = 55442 Ave neighs/atom = 139.302 Neighbor list builds = 3 Dangerous builds = 0 undump 1 # ---------- Run Minimization 2--------------------- # Now allow the box to expand/contract perpendicular to the grain boundary reset_timestep 0 thermo 10 thermo_style custom step pe lx ly lz press pxx pyy pzz c_eatoms fix 1 all box/relax y 0 vmax 0.001 min_style cg minimize 1e-15 1e-15 5000 5000 Memory usage per processor = 3.43888 Mbytes Step PotEng Lx Ly Lz Press Pxx Pyy Pzz eatoms 0 -1333.6024 12.807225 128.07225 4.05 -6.3617301 -262.3388 1197.774 -954.5204 -1333.6024 10 -1333.605 12.807225 128.20832 4.05 -841.94577 -891.13967 -20.783769 -1613.9139 -1333.605 20 -1333.605 12.807225 128.20608 4.05 -826.51441 -879.30405 3.3043329 -1603.5435 -1333.605 30 -1333.605 12.807225 128.20654 4.05 -828.43998 -880.95627 2.999739 -1607.3634 -1333.605 40 -1333.605 12.807225 128.20729 4.05 -832.39474 -884.11935 -0.96690522 -1612.098 -1333.605 42 -1333.605 12.807225 128.20679 4.05 -829.31937 -881.81499 3.5751362 -1609.7182 -1333.605 Loop time of 0.797956 on 1 procs for 42 steps with 398 atoms Minimization stats: Stopping criterion = linesearch alpha is zero Energy initial, next-to-last, final = -1333.60243356 -1333.60504971 -1333.60504971 Force two-norm initial, final = 4.96626 0.0149609 Force max component initial, final = 4.96626 0.0148234 Final line search alpha, max atom move = 6.91964e-05 1.02572e-06 Iterations, force evaluations = 42 331 Pair time (%) = 0.674209 (84.492) Neigh time (%) = 0 (0) Comm time (%) = 0.0393722 (4.93413) Outpt time (%) = 0.000830889 (0.104127) Other time (%) = 0.0835438 (10.4697) Nlocal: 398 ave 398 max 398 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 5233 ave 5233 max 5233 min Histogram: 1 0 0 0 0 0 0 0 0 0 Neighs: 27721 ave 27721 max 27721 min Histogram: 1 0 0 0 0 0 0 0 0 0 FullNghs: 55442 ave 55442 max 55442 min Histogram: 1 0 0 0 0 0 0 0 0 0 Total # of neighbors = 55442 Ave neighs/atom = 139.302 Neighbor list builds = 0 Dangerous builds = 0 # ---------- Calculate GB Energy --------------------- variable minimumenergy equal -3.360000 variable esum equal "v_minimumenergy * count(all)" variable xseng equal "c_eatoms - (v_minimumenergy * count(all))" variable gbarea equal "lx * lz * 2" variable gbe equal "(c_eatoms - (v_minimumenergy * count(all)))/v_gbarea" variable gbemJm2 equal ${gbe}*16021.7733 variable gbemJm2 equal 0.03542512656*16021.7733 variable gbernd equal round(${gbemJm2}) variable gbernd equal round(567.5733469) print "GB energy is ${gbemJm2} mJ/m^2" GB energy is 567.5733469 mJ/m^2 # ---------- Dump data into Data file ------------- reset_timestep 0 dump 1 all cfg 10000 dump.al_sig5_310_*.cfg id type xs ys zs c_csym c_eng fx fy fz dump_modify 1 element Al Al minimize 1e-15 1e-15 5000 5000 Memory usage per processor = 3.58369 Mbytes Step PotEng Lx Ly Lz Press Pxx Pyy Pzz eatoms 0 -1333.605 12.807225 128.20679 4.05 -829.31937 -881.81499 3.5751362 -1609.7182 -1333.605 2 -1333.605 12.807225 128.20704 4.05 -830.86046 -882.97143 1.3125102 -1610.9225 -1333.605 Loop time of 0.0632482 on 1 procs for 2 steps with 398 atoms Minimization stats: Stopping criterion = linesearch alpha is zero Energy initial, next-to-last, final = -1333.60504971 -1333.60504973 -1333.60504973 Force two-norm initial, final = 0.0149764 0.00581102 Force max component initial, final = 0.014839 0.0054477 Final line search alpha, max atom move = 0.000358523 1.95313e-06 Iterations, force evaluations = 2 20 Pair time (%) = 0.0428157 (67.6948) Neigh time (%) = 0 (0) Comm time (%) = 0.00247025 (3.90566) Outpt time (%) = 0 (0) Other time (%) = 0.0179622 (28.3996) Nlocal: 398 ave 398 max 398 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 5233 ave 5233 max 5233 min Histogram: 1 0 0 0 0 0 0 0 0 0 Neighs: 27721 ave 27721 max 27721 min Histogram: 1 0 0 0 0 0 0 0 0 0 FullNghs: 55442 ave 55442 max 55442 min Histogram: 1 0 0 0 0 0 0 0 0 0 Total # of neighbors = 55442 Ave neighs/atom = 139.302 Neighbor list builds = 0 Dangerous builds = 0 undump 1 write_restart restart.al_sig5_310_stgb print "All done" All done
The grain boundary energy is calculated as 567.57 mJ/m2. The final configuration is stored in a restart file for future use in predicting properties of grain boundaries. Additionally, files with atomic coordinates, energies, and centrosymmetry values are dumped for post-processing.
Figure 1 shows a movie of minimization of the grain boundary structure for the input script show above. Figure 2 shows a movie of minimization of the grain boundary structure for a modification of the input script above. Here, the "delete_atoms overlap 0.35 lower upper" command has been modified to "delete_atoms overlap 1.5 lower upper". This eliminates two atoms that are too close to each other near the grain boundary interface.
Figure 1. Movie showing the minimization of the grain boundary structure for an aluminum Sigma5 (310) symmetric tilt grain boundary.
Figure 2. Movie showing the minimization of the grain boundary structure for an aluminum Sigma5 (310) symmetric tilt grain boundary.
Figure 3 shows the image corresponding to the input script shown above. Notice how there are two atoms that are very close to each other at the boundary in Figure 3 (shown in red, colored by potential energy, i.e., high energy atoms). The final structures are shown in Figures 4 and 5 for the input script above and the modified input script, respectively. Interestingly, with this potential, the structure in Figure 4 is actually the lower energy grain boundary structure. The different structures for this one simple grain boundary may impart slightly different properties as well. Often, the convention is to use the minimum energy grain boundary structure for properties. However, some recent research has also explored metastable higher energy grain boundary structures and their impact on properties as well.
Figure 3. Image showing the grain boundary structure prior to minimization.
Figure 4. Image showing the grain boundary structure after minimization (overlap distance equals 0.35).
Figure 5. Image showing the grain boundary structure after minimization (overlap distance equals 1.50).
M.A. Tschopp would like to acknowledge funding provided under an NSF graduate fellowship for the initial work. Continued funding for investigating structure-property relationships in grain boundaries under the NEAMS (Nuclear Energy Advanced Modeling and Simulation) program is also acknowledged.