The objective of this research is to generate grain boundary structures over a wide range of degrees of freedom for future use in assessing how grain boundary degrees of freedom impact the properties of polycrystalline Mg. For each grain boundary, this work uses a parallel molecular dynamics code, LAMMPS, with in-plane translations and atom deletion criteria to sample a large number of potential structures to find the global minimum energy grain boundary structure[1][2]. The significance of this research is that grain boundary properties play an important role in the properties of polycrystalline materials and this research enables future atomistic research investigating these properties.
Author(s): Chesley G. Rhodes, Mark A. Tschopp
Corresponding Author: Mark Tschopp
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 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). If script is saved as a text document, it should be named grain_boundary_simplified.in.
########################################################################### # __ ___ __ __ __ __ ______ ______ # #| | / _ \ | \ / | | \ / | | __ | | ____|# #| | / /_\ \ | \ / | | \ / | | |__| | | |____ # #| | / ___ \ | \ / | | \ / | | ___| |____ |# #| |_____ / / \ \ | |\ \/ /| | | |\ \/ /| | | | ____| |# #|________| /__/ \__\ |__| \__/ |__| |__| \__/ |__| |__| |______|# ########################################################################### ########################################################################### ################SYMMETRIC TILT GRAIN BOUNDARY ENERGY SCRIPT################ ###############This script requires an input tilt direction,############### ##############normal direction, and other varibales in order ############## #############to create a simulation with two grains stacked on############# ############top of each other with a boundary in in the x-z ############ ###########direction. The lower boundary is then moved relative ########### ##########to the upper boundary in the x and z directions, and ########## #########delete overlap distance is increased, all to find the ######### ########lowest energy and thus most stable structure. LAMMPS dumps ######## #######the GB Energy for every configuration it tries, with the ####### ######counter number and GBE as the two numbers in the file name to ###### #####simplify post processing. ##### ########################################################################### ########################################################################### ######################Required Input-Orientations########################## ########################################################################### #Tilt, normal, and periodic directions are required, #and must be (at least very close to) mutally orthogonal #in all three dimensions in order to produce good results #NOTE: This script will only work with the [0 0 0 1] tilt direction, and #assumes an initial periodic direction of [2 -1 -1 0] (that is, the periodic #direction if the misorientation angle is equal to 0). #Tilt direction, in the form of [t1 t2 t3 t4] variable t1 equal 0 variable t2 equal 0 variable t3 equal -(${t1}+${t2}) variable t4 equal 1 #Normal direction, in the form of [n1 n2 n3 n4] variable n1 equal 7 variable n2 equal 10 variable n3 equal -(${n1}+${n2}) variable n4 equal 0 #Periodic direction, in the form of [p1 p2 p3 p4] variable p1 equal 9 variable p2 equal -8 variable p3 equal -(${p1}+${p2}) variable p4 equal 0 ########################################################################### #########################Required Input-Variables########################## ########################################################################### variable latticeconst equal 3.181269601 variable caratio equal 1.632993162 variable minimumenergy equal -1.528662571 variable xtranslations equal 5 variable ztranslations equal 5 variable pairstyle index "eam/fs" variable paircoeff index "* * Mg_mm.eam.fs Mg Mg" #Desired filename for LAMMPS to create and dump atoms to variable filename index "minimum_energy" ########################################################################### #########################Direction transformations######################### ########################################################################### #Convert directions into xyz coordinates variable f1 equal ${p1}-0.5*${p2}-0.5*${p3} variable f2 equal sqrt(3)/2*${p2}-sqrt(3)/2*${p3} variable f3 equal ${p4}*${caratio} variable g1 equal ${n1}-0.5*${n2}-0.5*${n3} variable g2 equal sqrt(3)/2*${n2}-sqrt(3)/2*${n3} variable g3 equal ${n4}*${caratio} variable h1 equal ${t1}-0.5*${t2}-0.5*${t3} variable h2 equal sqrt(3)/2*${t2}-sqrt(3)/2*${t3} variable h3 equal ${t4}*${caratio} variable f4 equal ${f1} variable f5 equal -1*${f2} variable f6 equal ${f3} variable g4 equal -1*${g1} variable g5 equal ${g2} variable g6 equal ${g3} variable h4 equal ${h1} variable h5 equal ${h2} variable h6 equal ${h3} ########################################################################### ####################Calculate a1 a2 a3 components########################## ########################################################################### #This will be used for inducing the rotation whenever the custom lattice command #is implemented. It has to be done in this method instead of "orients" due to #magnesium's non-repeating, non-terminating c/a ratio causing LAMMPS to crash #on its othogonality checks. This method is more forgiving, and any round-off #errors are negated when the initial minimization is run later. # Calculate lattice parameters variable xlattice equal ${latticeconst} variable ylattice equal sqrt(3) variable zlattice equal ${caratio} variable fmag equal sqrt((${f1})^2+(${f2})^2+(${f3})^2) variable gmag equal sqrt((${g1})^2+(${g2})^2+(${g3})^2) variable hmag equal sqrt((${h1})^2+(${h2})^2+(${h3})^2) #For upper Grain Boundary variable fx equal ${f1}/${fmag} variable fy equal ${g1}/${gmag} variable fz equal ${h1}/${hmag} variable gx equal ${f2}*${ylattice}/${fmag} variable gy equal ${g2}*${ylattice}/${gmag} variable gz equal ${h2}*${ylattice}/${hmag} variable hx equal ${f3}*${zlattice}/${fmag} variable hy equal ${g3}*${zlattice}/${gmag} variable hz equal ${h3}*${zlattice}/${hmag} #For Lower Grain Boundary variable fx2 equal ${f4}/${fmag} variable fy2 equal ${g4}/${gmag} variable fz2 equal ${h1}/${hmag} variable gx2 equal ${f5}*${ylattice}/${fmag} variable gy2 equal ${g5}*${ylattice}/${gmag} variable gz2 equal ${h2}*${ylattice}/${hmag} variable hx2 equal ${f6}*${zlattice}/${fmag} variable hy2 equal ${g6}*${zlattice}/${gmag} variable hz2 equal ${h3}*${zlattice}/${hmag} ########################################################################### ############################Simulation Parameters########################## ########################################################################### variable etol equal 1.0e-25 variable ftol equal 1.0e-25 variable maxiter equal 10000 variable maxeval equal 100000 variable overlapboth equal 2 variable counter equal 0 #Calculate simulation box size variable xlen equal ${xlattice}*sqrt((${f1})^2+(${f2})^2+(${f3})^2) variable ylen equal ${xlattice}*sqrt((${g1})^2+(${g2})^2+(${g3})^2) variable zlen equal ${xlattice}*sqrt((${h1})^2+(${h2})^2+(${h3})^2) #Find y period length to mitigate the affect of the the #complimentary GB caused by y periodic conditions #Simulations run to determine required length converged #on 160 nm or greater variable mult equal "ceil(160/v_ylen)" variable ylengb equal "v_ylen * v_mult" variable negylengb equal "-1*v_ylengb" print "xlen = ${xlen}, ylen = ${ylengb}, zlen = ${zlen}" # Implement overlap criterion variable overlapinc equal 531 #Create directory to dump atoms shell mkdir ${filename} ########################################################################### ####################Begin Loop Structure################################### ########################################################################### #This will allow multiple configurations as defined by the #Xtranslations,Ztranslations, and Overlap distance label loopa variable a loop ${xtranslations} variable tx equal "(v_a-1)/v_xtranslations*v_xlen" label loopb variable b loop ${ztranslations} variable tz equal "(v_b-1)/v_ztranslations*v_zlen" label loopd variable d loop ${overlapboth} label loopc variable c loop ${overlapinc} variable overlapdist equal ".500 + 0.005 * (v_c-1)" #Calculate counter for each loop variable ctemp equal ${counter}+1 variable counter equal ${ctemp} variable ctemp delete print "Counter: ${counter}" ########################################################################### #####################Initiallize Simulation################################ ########################################################################### clear units metal dimension 3 boundary p p p atom_style atomic atom_modify map array ########################################################################### #######################Create Lattice Structure############################ ########################################################################### region box block 0 ${xlen} ${negylengb} ${ylengb} 0 ${zlen} units box create_box 2 box lattice custom ${xlattice} a1 ${fx} ${fy} ${fz} a2 ${gx} ${gy} ${gz} a3 ${hx} ${hy} ${hz} basis 0.0 0.0 0.0 basis 0.5 0.5 0 basis 0.5 0.83333333 0.5 basis 0 0.33333333 0.5 orient x 1 0 0 orient y 0 1 0 orient z 0 0 1 region top block INF INF 0 INF INF INF units box create_atoms 1 region top basis 1 1 basis 2 1 basis 3 1 basis 4 1 lattice custom ${xlattice} a1 ${fx2} ${fy2} ${fz2} a2 ${gx2} ${gy2} ${gz2} a3 ${hx2} ${hy2} ${hz2} basis 0.0 0.0 0.0 basis 0.5 0.5 0 basis 0.5 0.83333333 0.5 basis 0 0.33333333 0.5 orient x 1 0 0 orient y 0 1 0 orient z 0 0 1 region bottom block INF INF INF 0 INF INF units box create_atoms 2 region bottom basis 1 2 basis 2 2 basis 3 2 basis 4 2 group upper type 1 group lower type 2 ########################################################################### #########################Induce Pair Potentials############################ ########################################################################### pair_style ${pairstyle} pair_coeff ${paircoeff} neighbor 2.0 bin neigh_modify delay 10 check yes ########################################################################### ###############Translate atoms and delete overlapping atoms################ ########################################################################### displace_atoms upper move ${tx} 0 ${tz} units lattice if $c == 1 then "variable atomprev equal 1" if $d == 1 then "delete_atoms overlap ${overlapdist} lower upper" if $d == 2 then "delete_atoms overlap ${overlapdist} upper lower" #Ensure that equivalent configuration has not been tested #If the same number of atoms is present as before, keep looping #until overlap distance increases enough to delete more atoms variable natoms equal "count(all)" print "Previous: ${atomprev}, Present: ${natoms}" if ${atomprev} == ${natoms} then "jump grain_boundary_simplified.in loopend" ########################################################################### #############################Computes###################################### ########################################################################### compute csym all centro/atom compute eng all pe/atom compute eatoms all reduce sum c_eng ########################################################################### ########################Initial Minimization############################### ########################################################################### reset_timestep 0 thermo 100 thermo_style custom step pe lx ly lz press pxx pyy pzz c_eatoms min_style cg minimize 1e-15 1e-15 ${maxiter} ${maxeval} #Calculate GB Energy after first minimization 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 "After first minimization:" print "GB energy is ${gbemJm2} mJ/m^2" ########################################################################### ##############################Second Minimization########################## ########################################################################### #This time allow box bound to expand and relax while minimizing #and force convergence tolerance to decrease reset_timestep 0 thermo 100 thermo_style custom step pe lx ly lz press pxx pyy pzz c_eatoms min_style cg fix 1 all box/relax aniso NULL 0.0 NULL vmax 0.0001 minimize ${etol} ${ftol} ${maxiter} ${maxeval} #Calculate GB Energy after first minimization 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 "After second minimization:" print "GB energy is ${gbemJm2} mJ/m^2" # Store number of atoms for overlap criterion for use in comparing next configurations variable atomprev equal ${natoms} ########################################################################### #####################Dump data into Data file############################## ########################################################################### shell cd ${filename} reset_timestep 0 timestep 0.001 dump 1 all custom 5000 dump.${counter}_${gbernd} id type x y z c_csym c_eng run 0 shell cd .. ########################################################################### #####################Finish Loop Structure################################# ########################################################################### label loopend next c jump grain_boundary_simplified.in loopc variable c delete next d jump grain_boundary_simplified.in loopd variable d delete next b jump grain_boundary_simplified.in loopb variable b delete next a jump grain_boundary_simplified.in loopa print "All done"
The authors would like to acknowledge the support from Department of Energy, Southern Regional Center for Innovative Design (SRCLID) program, Contract No.: DE-FC26-06NT42755.
The initial methodology was used in the following papers: