Wenn man LAMMPS-Skripte von vorhergehenden Projekten auf die aktuelle Version portiert, stolpert man ab und zu über geänderte Funktionen. Eine von diesen ist displace_box, welche durch die mächtigere change_box ersetzt wurde.
Für einen Scherversuch verwendete das ursprüngliche Skript
displace_box all yz delta ${lambda} |
Die moderne Formulierung ist recht einfach, lediglich remap muss hinzugefügt werden, was damals noch das Standardverhalten war.
change_box all yz delta ${lambda} remap |
Nun wird das aber so nicht funktionieren: yz ist eine Manipulation, die nur auf triklinen Kristallen funktioniert – auf orthogonalen logischerweise nicht, da der Winkel ja grade geändert werden soll.
Also sollte man nach dem Erstellen/Laden der Atome das System auf triclinic umstellen:
read_data data.${latname}.eam change_box all triclinic remap |
— und dann beim nächsten run feststellen, dass der Simulation angeblich Atome abhanden gekommen sind, obwohl sich an den Dimensionen nichts geändert hat. Die Lösung ist relativ einfach: man sage Lammps, dass es die Simulationsgrenzen mitführen soll, indem man sie erst shrinkwrappt und hinterher wieder auf den alten Wert (hier periodisch in allen Raumrichtungen) zurückstellt:
read_data data.${latname}.eam change_box all boundary s s s triclinic remap boundary p p p |
Das ganze sollte man vor der Relaxation machen, damit im Zweifelsfall die Randbedingungen wieder passen.
Das Problem ist übrigens auch im mitgelieferten Beispiel examples\ELASTIC drin. Dort am Besten in der init.mod anpassen.