Tersof potential

I am going to model a silicon tensile test using LAMMPS with the Tersoff potential. However, the resulting Young’s modulus is significantly smaller compared to the actual Young’s modulus of silicon, even though everything seems normal during the MD simulation in LAMMPS. Attached, you can find my input file, the Tersoff potential file, and the paper from which I selected the required coefficients for the Tersoff file. Please let me know if there is anything wrong here.

in.Si.tensile.Si(C) (2.6 KB)
Si.tersoff.Si (430 Bytes)
Tersoff coeficents for Si.pdf (163.2 KB)

Hi, did you find any solution? I have encountered the same problem.

Here are some general comments:

  1. LAMMPS has the tersoff potential for Si built in, so usually you don’t need to create the potential file by yourself;
  2. there are multiple versions of tersoff potential for Si; see the comments in Si.tersoff and SiCGe.tersoff. So if you are comparing results with other studies, make sure that the potential used are actually same;
  3. the unit setting of your input files should be consistent with the potential file; the built-in ones have their units given in the comments.

The input file in OP cannot be downloaded anymore, so it’s unclear what’s wrong with their simulation. So if you still have questions, please open a new post and attach your own input files.

I opened a new post, but no one answered. I sent my post to you, check it if you have time, please.

I am trying to model bulk Si and SiC in LAMMPS using the Tersoff potential under uniaxial tensile loading, then calculate the stress–strain response, and finally determine the elastic/Young’s modulus.

However, I am facing a problem: I cannot obtain the expected Young’s modulus value. For bulk silicon, the expected value is approximately 160 GPa, but my simulation gives around 70 GPa. I have already checked several possible factors, including strain rate, timestep, number of run steps, units, number of atoms, and system size. I also tried to minimize the initial stress, but I think some residual stress may still remain.

I would be very grateful if you could take a look at my LAMMPS code and help me identify and fix the problem.

Best regards,
Sina S.

#Bulk Si
units metal
dimension 3
boundary p p p

atom_style atomic

neighbor 2.5 bin
neigh_modify every 10 delay 0 check yes

geometry

lattice diamond 5.431 orient x 1 0 0 orient y 0 1 0 orient z 0 0 1
region SiReg block 0 20 0 20 0 10 units box

create_box 1 SiReg
create_atoms 1 region SiReg

mass 1 28.0855

tersoff potential

pair_style tersoff
pair_coeff * * Sinew.tersoff Si

#define groups
#group 1 region SiReg

initial velocity

min_style cg
minimize 1.0e-12 1.0e-12 10000 100000
velocity all create 1.0 12345 mom yes rot no dist gaussian

Temperature and pressure computes

compute myTemp all temp
compute myPress all pressure myTemp

Per-atom outputs for dump

compute disp all displace/atom
compute st all stress/atom NULL
compute peatom all pe/atom
compute keatom all ke/atom

fixes

fix 1 all nve

run nve

timestep 0.001
thermo 100
thermo_style custom step temp pe ke etotal lx ly lz press c_myPress[1] c_myPress[2] c_myPress[3]
thermo_modify format float %12.6f

dump d_nve all custom 100 dump_nve.lammpstrj &
id type x y z &
c_disp[1] c_disp[2] c_disp[3] &
c_st[1] c_st[2] c_st[3] c_st[4] c_st[5] c_st[6] &
c_peatom c_keatom
dump_modify d_nve sort id

run 20000
unfix 1
undump d_nve

#run npt
fix EqDy1 all npt temp 1.0 1.0 10 iso 0.0 0.0 10
dump d_npt all custom 100 dump_npt.lammpstrj &
id type x y z &
c_disp[1] c_disp[2] c_disp[3] &
c_st[1] c_st[2] c_st[3] c_st[4] c_st[5] c_st[6] &
c_peatom c_keatom
dump_modify d_npt sort id

run 20000

unfix EqDy1
undump d_npt

run nvt

fix EqDy2 all nvt temp 1.0 1.0 10
dump d_nvt all custom 100 dump_nvt.lammpstrj &
id type x y z &
c_disp[1] c_disp[2] c_disp[3] &
c_st[1] c_st[2] c_st[3] c_st[4] c_st[5] c_st[6] &
c_peatom c_keatom
dump_modify d_nvt sort id

run 20000
unfix EqDy2
undump d_nvt

Reference values

variable Ly0 equal ly
run 0
variable s0 equal c_myPress[2]
run 0
variable Ly0 equal ${Ly0}
variable s0 equal ${s0}

Strain and stress variables

variable strain equal (ly-v_Ly0)/v_Ly0
variable deflection equal (ly-v_Ly0)
variable area equal lx*lz
variable stressY_bar equal c_myPress[2]
variable stressY_GPa equal -((c_myPress[2]-v_s0)/10000.0)
variable forceY_N equal -c_myPress[2]v_area1.0e-15

Tensile loading in y

thermo 100
thermo_style custom step temp lx ly lz v_strain v_deflection v_stressY_bar v_stressY_GPa v_forceY_N pe ke etotal press

run loading

fix loadeq2 all npt temp 1.0 1.0 10 x 0 0 1 z 0 0 1 couple none

fix def all deform 1 y erate 1.0e-2 units box remap x

dump d_load all custom 100 dump_load.lammpstrj &
id type x y z &
c_disp[1] c_disp[2] c_disp[3] &
c_st[1] c_st[2] c_st[3] c_st[4] c_st[5] c_st[6] &
c_peatom c_keatom
dump_modify d_load sort id

fix out all print 100 “${strain} ${stressY_GPa}” &
file stress_strain_100.txt screen no &
title “strain stress(GPa)”

run 20000

unfix loadeq2
unfix def
undump d_load

Sina,

I looked through your script, and I think the low Young’s modulus may come from a combination of several points rather than only from residual stress.

First, please note that with your current crystal orientation,

lattice diamond 5.431 orient x 1 0 0 orient y 0 1 0 orient z 0 0 1

and tensile loading in the y direction, you are calculating the modulus along the [010] direction, which is equivalent to [100] for cubic silicon. For single-crystal silicon, the Young’s modulus is anisotropic. The value along [100] is closer to about 130 GPa, not 160 GPa. A value around 160–170 GPa is more consistent with loading close to the [110] direction. So the expected reference value should first be checked according to the crystal direction.

However, 70 GPa is still too low. One important issue I noticed is your region definition:

region SiReg block 0 20 0 20 0 10 units box

Because you used units box, LAMMPS interprets the dimensions as box-distance units, not lattice-cell units. Therefore, your simulation box is much smaller than a 20 × 20 × 10 lattice-cell crystal. If your intention is to create 20 × 20 × 10 lattice cells, you should use:

region SiReg block 0 20 0 20 0 10 units lattice

This may significantly affect the result, especially because the system becomes much smaller than expected.

Another point is the deformation procedure. During tensile loading, you use fix deform together with fix npt. In this case, it is better to use a deformation-aware temperature compute, for example:

compute Tdef all temp/deform
fix loadeq2 all npt temp 1.0 1.0 10 x 0 0 10 z 0 0 10 couple none
fix_modify loadeq2 temp Tdef
fix def all deform 1 y erate 1.0e-5 units box remap x

This avoids including the affine deformation velocity in the temperature calculation.

I would also reduce the strain rate. Your current strain rate,

fix def all deform 1 y erate 1.0e-2 units box remap x

is very high for extracting an elastic modulus. For modulus calculation, it is better to use a much lower strain rate and fit the stress–strain curve only in the small elastic region, for example 0–0.5% or 0–1% strain.

Your stress conversion is generally correct, since in metal units the pressure is in bar and 1 GPa = 10000 bar:

variable stressY_GPa equal -((c_myPress[2]-v_s0)/10000.0)

The negative sign is also reasonable because LAMMPS pressure is positive in compression and negative in tension.

I also noticed a small syntax issue in the force variable:

variable forceY_N equal -c_myPress[2]v_area1.0e-15

It should be written with multiplication signs:

variable forceY_N equal -c_myPress[2]*v_area*1.0e-15

although this does not directly affect the modulus if you are using the stress variable.

In summary, I suggest the following checks:

  1. Use units lattice in the region command if you want 20 × 20 × 10 lattice cells.

  2. Check the reference modulus according to the loading direction. Your current loading direction corresponds to [100], not [110].

  3. Use compute temp/deform during tensile loading.

  4. Reduce the strain rate.

  5. Fit only the initial linear elastic part of the stress–strain curve.

  6. Make sure the initial stress is taken after the final equilibration step, just before deformation.

If your goal is to obtain a modulus close to 160–170 GPa for silicon, you may want to change the orientation so that the loading direction is [110], for example:

lattice diamond 5.431 orient x 1 -1 0 orient y 1 1 0 orient z 0 0 1

Then tensile loading in the y direction would correspond to the [110] direction.

Best regards,
Bahman

2 Likes