本文介绍variable命令两种不同的使用方式:“v_”和”&”。
在lammps模拟中,variable命令用的相对比较多,可以根据需要定义不同的变量。
在使用自定义变量或者调用自定义变量的时候,lammps给出了两种命令:“v_“和”&“。
这两种命令到底有什么不同,如何选择使用?
下面以Cu拉伸代码为例,讲解这两种方式的区别。
#定义变量L0,L1
variable tmp equal "lx" variable L0 equal ${tmp} variable L1 equal v_tmp #输出 thermo 10 thermo_style custom step v_L0 v_L1 lx
在以上代码段中,我们分别定义了L0和L1,通过命令可以看出,L0和L1的值都等于变量“tmp”。
下面我们运行代码,截图log文件中的信息看一下区别。
可以看出,L0的值被设置为36.1,但是L1并没有被明确赋值。
下面是thermo命令输出的L0、L1、lx的值
L0的值并没有发生变化,而L1的值与lx值相等。
通过对比,可以看出“v_”和”&”的区别:
(1)“&”立即获取变量值
variable L0 equal ${tmp}
这句命令是把变量“tmp”的值立即计算出来,而tmp的值为lx,因此,系统取得lx的值36.1,并将36.1赋值给L0。
(2)“v_”获取变量计算公式,暂不计算具体数值
variable L1 equal v_tmp
以上命令运行后,L1的值等于v_tmp的值,即L1=v_tmp,但此时并不计算v_tmp的值,又因为v_tmp=lx,因此L1=lx。
但此时,并没有将lx的值赋值给L1,仅仅是明确这种相等的关系。
当在下一句thermo命令输出L1的时候,再计算L1的值,根据公式L1=lx,系统计算此时lx的值,并复制给L1。
下面给出全部in文件代码,可以测试一下:
units metal atom_style atomic timestep 0.001 lattice fcc 3.61 region box block 0 10 0 5 0 5 create_box 1 box create_atoms 1 box pair_style eam pair_coeff * * Cu_u3.eam velocity all create 300 8989 #定义变量L0,L1 variable tmp equal "lx" variable L0 equal ${tmp} variable L1 equal v_tmp #输出 thermo 10 thermo_style custom step v_L0 v_L1 lx fix 1 all npt temp 300 300 0.01 y 0 0 0.1 z 0 0 0.1 fix 2 all deform 1 x erate 0.02 units box remap x run 100