The Swiss-army knife of atomic simulations
This tutorial explains how to create and manipulate systems that contain shells, for the purpose of atomistic simulations with an ionic core-shell model.
Ionic core-shell models are a type of classical empirical potential, often used to describe polarizable ionic materials. It was first introduced by B.G. Dick Jr. and A.W. Overhauser, Phys. Rev. 112 (1958) 90-103 (doi: 10.1103/PhysRev.112.90). In such a model, each ion is composed of two particles: its core that is massive and has a charge Q, and a shell that mimics the electronic cloud, that is massless (or has a small mass, depending on the type of shell model) and has a charge q. The total charge of the ion is then Q+q. If the core and shell are at the same position then the ion is not polarized; if they are at different positions, then the ion is polarized (because the centers of positive and negative charges do not coincide).
Although Atomsk is not aware of the shell-model potential itself, it is capable of dealing with the position and electric charge of shells. Shells are stored in a separate array, and always have the same index as their associated core.
For the following, let us create a unit cell of an ionic material like sodium chloride, NaCl:
atomsk --create rocksalt 5.64 Na Cl xsf
Shells can be added to all ions in an existing system, thanks to the option "-add-shells":
atomsk NaCl.xsf -add-shells all NaCl_shells.xsf
Now if you open the final file ("NaCl_shells.xsf") in a text editor, you will notice that it does not contain any shell. The reason is simple: the XSF file format does not support shells, so it is impossible to write shell positions in such a file. The shells are simply lost. It is important to bear that in mind when dealing with core-shell model: beware that if you output your system to a file format that does not support shell model, then the shells are simply lost.
To save the shell positions, one must choose a file format that supports shell model, like the GULP input file or the DL_POLY formats:
atomsk NaCl.xsf -add-shells all NaCl_shells.gin
Now if you open the file "NaCl_shells.gin" it should contain the positions of the cores and the shells. The option "-add-shells" creates shells at the same position as the original cores (i.e. ions are not polarized). This is probably very far from the equilibrium, but it can be useful as a starting configuration for a simulation.
It is possible to add shells to only one type of ions. For instance, to create shells only on Cl ions then use:
atomsk NaCl.xsf -add-shells Cl NaCl_shells.gin
Likewise, it is possible to remove shells on some or all atoms, using the option "-remove-shells". For instance, if you want shells only on Cl ions, then you can add shells to all ions, and then remove them on Na ions:
atomsk NaCl.xsf -add-shells all -remove-shells Na NaCl_shells.gin
Atomsk can handle auxiliary properties like the electric charge of the particles. To define the electric charge of ionic cores and shells, one must first write them into a text file. For instance, for NaCl let us create such a text file:
charges
Na 1.2 -0.2
Cl -0.8 -0.2
The structure of this text file is quite simple. First, the keyword "charges" indicates that electric charges follow. Then, each line contains the name of the element, followed by the electric charge of the core, and that of the shell (in units of the elementary charge e). Here, the core of Na ions have a charge of +1.2e, and their shells -0.2e. The sum of the two gives the Na ion a total charge of +1e. Similarly, the Cl core has a charge of -0.8e and its shell -0.2e, giving a total of -1e. This is just an example and does not correspond to the charges of an actual shell-model potential.
Then, the option "-properties" can be used to tell Atomsk to read the system's properties from this file:
atomsk NaCl.xsf -add-shells all -properties charges.txt NaCl_shells.gin
Now if you open the file "NaCl_shells.gin", you will notice that new columns have appeared, containing the electric charge of the particles.
Atomsk can compute the "electronic" polarization of each ion, thanks to the mode "--electronic-polarization". If the atomic file ("NaCl_shells.gin") already contains the charges of cores and shells, then this mode only takes the file name as an argument:
atomsk --electronic-polarization NaCl_shells.gin
Alternatively, if the file ("NaCl.gin") does not contain the electric charges, then it is possible to provide them with the option "-properties":
atomsk --electronic-polarization NaCl.gin -properties charges.txt
Most options are capable of handling shells. For instance, using the option "-shift" with a system that contains shells, the shells will also be shifted by the same vector as their core. If you duplicate a system containing shells (with the option "-duplicate"), then the shells will also be duplicated, so that all replicas have the same configuration (i.e. same polarization) as the original cell.
A special case is that of option "-wrap". This option detects if an atom is out of the box, and if it is, it translates it by one or more box vectors until the atom falls into the box. In the presence of shells, this option considers only the positions of cores (and not positions of shells). If a core is out of the box, then it is translated by one or more box vectors until it falls into th box; and its associated shell is translated by exactly the same vector, so as to remain close to its core. This means that after translation, the core is guaranteed to be inside the box, however the shell may be located outside of the box.
Please refer to the documentation page of each option to verify how it deals with shells.