[lammps-users] How to apply a displacement field in LAMMPS?

Dear LAMMPS users,

I am currently working with simulation of fracture in metals using tensile testing, and have some problems of how to do this properly in LAMMPS.

After creating a perfect lattice and then introduce a crack, I want to apply a displacement in the x- and y-directions to a border region some distance away from the crack, in order to strain the system. The displacements will depend on the distance r and the angle theta relative to the crack-tip (which will be considered at a fixed position).

What is the best way to apply a displacement field to a group of atoms? For every atom in the group, their position must be evaluated, and their displacement must be calculated and carried out. After initial displacements are performed, I want to gradually increase parameters in the displacement fields and perform displacement of the border atoms repeatedly.

This type of displacement-loading of a system is thoroughly described in e.g. Xu et al. (2004), "Stepwise-equilibrium and adaptive molecular dynamics simulation for fracture toughness of single crystals", J. Intell. Mater. Syst. Struct. 15: 933-939.
The problem is not the method itself, but rather how to implement it in LAMMPS. Is there already some commands that can do this, or should I make additional code for moving the atoms in this way?

Hope someone can help me with this.


Christer H. Ersland,
Norwegian University of Science and Technology.

I'm unclear if you want to displace all atoms in a group by
the same amount, or if the displacement is a function of
each atom's position. For the former you may be able
to use the displace_atoms command. For the latter, I think
you would need to write a new "command" that does what
you want, which would not be particularly hard. If you wanted
to move the boundary atoms during a simulation (continuously)
then you could use the fix move command, which does let
you specify a displacement formula that is a function of
individual atoms. But it sounds like you want to move them
all at once, before a simulation.


Hi again,

I want use a displacement as a function of each atom's position, so I guess I need to write a new "command" to do this. What is the best way to extend LAMMPS to use my own code? (I have never done this before.)

In my simulation I want to displace the atoms initially, and also at regular time-steps throughout the simulation, in order to gradually load the crack I am simulating. Could this be done with the "fix move" command, or would everything then be moved every timestep?


The fix move command lets you define a variable with a formula that
specifies the displacement as a function of time, atom position, etc.
I suppose there is nothing stopping you from writing a formula that is
not time dependent and just displacing them once on the first timestep
and not thereafter. And put short runs in a loop, where you change
the formula (or a constant in the formula) each iteration to do small
regular displacement steps. Or you could modify or write a new
displace_atoms command (which works between runs) so that
it takes a variable. Of course if you can't encode your displacement
field in a variable formula, then you'll have to write code. Read
doc/Section_modify.html for info on how to extend LAMMPS with
new commands.