大家好,我是小马老师。

本文和大家共同欣赏一个CNT拉伸的lammps案例,案例代码由

Simon Gravelle编写:



https://github.com/simongravelle/LAMMPS/tree/main/CNTdeformationAIREBO

关于拉伸的案例,公众号也推送了多个案例,但这个案例所用方法与平时所用方法有点区别


lammps案例:CNT拉伸案例代码解析_公众号

lammps拉伸模拟最常见的方式是deformvelocity拉伸,使用compute stress/atoms或者pxx等方式统计拉伸应力。

案例作者并没有使用以上两种方式,而是循环调用displace_atoms命令逐渐向两侧移动固定端实现拉伸。

在计算拉伸力时,调用fix setforce命令的结果,方法比较独特。

对于固定两端的拉伸,在计算应变时应该只计算中间mobile部分的伸长量,本文给出了比较具体的计算方法,值得大家参考。

lammps案例:CNT拉伸案例代码解析_微信_02

下面是案例in文件全文,尽量详细的进行了注解,可以加QQ群754749935下载data文件和in文件。

对于新手来说,最好的学习方式是把下面的代码打印出来,对照in文件代码,新建一个in文件,亲自把代码输入并运行,而不是直接把代码下载下来运行看看结果就束之高阁。

最好的学习方式是实践,在不断的改错中提高和成长。

lammps案例:CNT拉伸案例代码解析_微信_02

案例代码注解


#变量设置,poro为删除原子的比例
variable poro equal 0.03
#随机数种子,不同随机数获得不同的状态
variable seed equal 15462
#初始温度
variable T equal 300
#模拟步长
variable dt equal 0.0005
#模型基本设置
units metal # required by airebo
atom_style full
boundary p p p
#势函数类型airebo
pair_style airebo 2.5 1 1
#读取模型文件
read_data data.mysystem
#改变box大小,便于z方向拉伸
change_box all z final -30 70 y final -20 20 x final -20 20
#势函数设置,映射原子类型为CCC
pair_coeff * * ./CH.airebo C C C
#原子分组
group CNT type 1
#bound函数返回CNT在z两个方向的尺寸
#下面的尺寸用于确定两端固定部分的边界范围
variable zmax equal bound(CNT,zmax)-10
variable zmin equal bound(CNT,zmin)+10
variable zmax0 equal bound(CNT,zmax)-20
variable zmin0 equal bound(CNT,zmin)+20
#划分为3个区域
region top block INF INF INF INF ${zmax} INF
region bot block INF INF INF INF INF ${zmin}
region mob block INF INF INF INF ${zmin0} ${zmax0}
#对区域内原子进行分组
group topgroup region top
group botgroup region bot
group mobile region mob
#设置两端固定部分为不同的原子类型,便于显示不同的颜色
set group topgroup type 2 # control group 1
set group botgroup type 3 # control group 2
#随机删除mob区域内3%的原子,便于cnt从缺陷处断裂
delete_atoms porosity mob ${poro} ${seed}
#nve系综,berendsen方式控温
fix myber all temp/berendsen ${T} ${T} 0.1
fix mynve all nve
#输出轨迹文件
dump mydmp all atom 500 dump.eq.xyz
#模拟步长
timestep ${dt}
#热力学输出
thermo 500
#弛豫5000步
run 5000 #
#去掉全局控温
unfix myber
undump mydmp
#重新设置轨迹文件输出
dump mydmp all atom 1000 dump.run.xyz
#固定端z方向受力为0,xy方向受力保持原值
fix sf1 topgroup setforce NULL NULL 0.0
fix sf2 botgroup setforce NULL NULL 0.0
#上下部分沿z方向速度设为0,cnt在z方向被固定
velocity topgroup set NULL NULL 0
velocity botgroup set NULL NULL 0
#计算三部分温度,只计算xy两个方向维度
compute Ttop topgroup temp/partial 1 1 0
compute Tbot botgroup temp/partial 1 1 0
compute Tmob mobile temp
#对thermo命令进行温度修正
thermo_modify temp Tmob
#上下部分单独控温
fix myber1 topgroup temp/berendsen ${T} ${T} 0.1
fix_modify myber1 temp Ttop
fix myber2 botgroup temp/berendsen ${T} ${T} 0.1
fix_modify myber2 temp Tbot
#计算长度
variable L equal v_zmax-v_zmin
#没100步输出长度平均值
fix myat1 all ave/time 10 10 100 v_L file tubeLength.dat
#计算拉力,拉力为两固定端受力之差
variable longforce equal f_sf1[3]-f_sf2[3]
#对拉力进行平均后输出到文件
fix myat2 all ave/time 10 10 100 v_longforce file forcetube.dat
# 循环设置两固定的位移,实现拉伸
variable a loop 100
label loop
displace_atoms topgroup move 0 0 0.1
displace_atoms botgroup move 0 0 -0.1
run 1000
next a
#input.lammps为本文件的文件名,文件名不同会出错
jump input.lammps loop

END


QQ群:754749935

lammps案例:CNT拉伸案例代码解析_微信_04