DISPLACEMENTS

The DISPLACEMENTS file defines the variations of geometry, vibrational amplitudes and element concentrations that should be considered in the search. In other words, the DISPLACEMENTS file defines the parameter space for the search.

The file is split into three main blocks: Geometry, Vibrations, and Occupations. The blocks are delimited by lines starting with an equals sign “=”, as in the following example

= GEO_DELTA
O 1 z = -0.05 0.05 0.005      ! Oxygen atom 1 (and symmetry-equivalent atoms) will be displaced in z direction over the range [-0.05, 0.05] with step 0.005
Ir 2-11 z = -0.05 0.05 0.01   ! Iridium atoms 2-11 (and symmetry-equivalent atoms) will be displaced in z direction over the range [-0.05, 0.05] with step 0.01
O L(2-4) z = -0.05 0.05 0.01  ! Oxygen atoms in layers 2-4 will be displaced in z direction over the range [-0.05, 0.05] with step 0.01

= VIB_DELTA
O 1 = -0.05 0.05 0.02         ! Vibrational amplitude of oxygen atom 1 (and symmetry-equivalent atoms) will be varied over the range [-0.05, 0.05] with step 0.02
Ir_top = -0.05 0.05 0.01      ! Vibrational amplitude of Iridium atoms in Ir_top sites will be varied over the range [-0.05, 0.05] with step 0.01

= OCC_DELTA
O 1 = O 0.8 1.0 0.05          ! Concentration of oxygen atom 1 (and symmetry-equivalent atoms) will be varied from 80% to 100% with 5% steps (rest: vacancies)

Indentation is allowed, but does not affect the function.

In each of the lines in the blocks, the left side of the = sign defines which atoms are being assigned displacements, while the right side defines the range of displacements to apply. Generally, atoms can be addressed by POSCAR element, chemical element, or site type. If there is an element name collision, the element will be interpreted as the POSCAR element, so the assignment will be made for all elements in ELEMENT_MIX. Supplying a list of atom numbers (N in POSCAR, or by layer number using L(x) for layer x) to further limit which atoms are being addressed is optional. If no numbers are given, the displacements on the right are applied to all atoms of the given element/site.

The exact syntax of the three blocks differs slightly, and is explained in detail here:

Generally, any displacement applied to one atom will also be applied to all symmetry-equivalent atoms (see Linking in POSCAR), such that the symmetry is preserved during the search (eg. in-plane geometrical displacements will be mirrored for atoms linked by a mirror symmetry plane). If multiple assignments are made for the same atom, the assignments will be ignored if they are consistent, but the user will be warned and the program may stop if there is a contradiction. For example, if some of the iridium atoms 2–11 in the code above were linked by a mirror plane, assigning a displacement in z direction to all of them would be accepted, but assigning the very same in-plane displacement (not parallel to the mirror plane) to all of them would lead to a contradiction, as this would break the symmetry. In that case, it would be preferable to assign the displacement explicitly to only one of the symmetry-equivalent atoms.

Note

See the Domain calculations page for information on how to format the DISPLACEMENTS file when optimizing multiple structures simultaneously.

Advanced functionality

Note

Indentation is allowed, but does not affect the function.

Further constraints: Using CONSTRAIN blocks

If some displacements should be constrained or linked in ways that go beyond simple symmetry conservation, arbitrary displacements can be linked by using CONSTRAIN blocks.

= VIB_DELTA
Ir_top = -0.05 0.05 0.02     ! see above; for example below

= CONSTRAIN
geo O_top, Ir_top = linked   ! keep geometrical displacement index the same for O_top and Ir_top atoms. Requires the displacement ranges to have the same number of steps.
vib Ir_def = linked          ! keep vibrational displacement index the same for all Ir_def atoms
vib Ir_top = -0.03           ! although a displacement range is defined for Ir_top, fix its value to -0.03 instead
vib Ir_top = ind(2)          ! same as the line before: Fix index to 2, i.e. the second entry in the displacement range

Running multiple searches

If you want to optimize multiple parameters not simultaneously, but end-to-end (necessary e.g. for geometrical optimization), you can use multiple blocks in the DISPLACEMENTS file to express this. After finishing one set of delta calculations and search, the program will then loop back to execute delta calculations and search again, starting from the optimized results of the previous search.

For example, the following DISPLACEMENTS file would first optimize z position and vibrational amplitudes simultaneously for the given set of atoms, then run another search from the optimized z and vibrational amplitudes, this time optimizing the x coordinate:

== SEARCH z

  = GEO_DELTA
  Ir L(1-6) z = -0.05 0.05 0.01

  = VIB_DELTA
  Ir = -0.005 0.005 0.0005

== SEARCH x

  = GEO_DELTA
  Ir L(1-6) xy[1 0] = -0.03 0.03 0.01

The successive search blocks are each introduced by a line starting with == SEARCH. Any text after the == SEARCH tag in the same line will be treated as a ‘name’ for the block (in the above example z and x). The name will be referenced in the log files, but does not have any influence on the behaviour of the program.

In-plane optimization shorthand

If you want to run one search to optimize positions in one in-plane direction (e.g., x), then another search for the other direction, you can either write out two search blocks, or abbreviate by entering just xy or ab as the direction, without the brackets to indicate a specific direction. This will effectively expand the block into two subsequent blocks, using the [1 0] direction in the first and the [0 1] direction in the second one. For example

== SEARCH xy

  = GEO_DELTA
  Ir L(1-6) xy = -0.03 0.03 0.01

  = VIB_DELTA
  Ir = -0.005 0.005 0.0005

is equivalent to

== SEARCH xy[1 0]

  = GEO_DELTA
  Ir L(1-6) xy[1 0] = -0.03 0.03 0.01

  = VIB_DELTA
  Ir = -0.005 0.005 0.0005

== SEARCH xy[0 1]

  = GEO_DELTA
  Ir L(1-6) xy[0 1] = -0.03 0.03 0.01

  = VIB_DELTA
  Ir = -0.005 0.005 0.0005

Looping searches

It is possible to have a set of search blocks running in a loop using the tags <loop> and </loop>. Note that these flags are expected to always be directly before a == SEARCH statement, or before the end of the file. Loops will end when their latest iteration does not yield a better \(R\) factor than the previous iteration (note that this means each looped block will be executed at least twice). For example, to optimize the z coordinate, then search x based on the optimized z, and then loop back to searching z with the optimized x, the example above could be modified like this:

<loop>
== SEARCH z

  = GEO_DELTA
  Ir L(1-6) z = -0.05 0.05 0.01

  = VIB_DELTA
  Ir = -0.005 0.005 0.0005

== SEARCH x

  = GEO_DELTA
  Ir L(1-6) xy[1 0] = -0.03 0.03 0.01

</loop>

You can also nest loops; for example, to optimize z, then loop in-plane optimization to get optimal x and y for that z, then start again with z, you could do:

<loop>

== SEARCH z

  = GEO_DELTA
  Ir L(1-6) z = -0.05 0.05 0.01

  = VIB_DELTA
  Ir = -0.005 0.005 0.0005

<loop>

! This block will automatically be split into separate blocks for optimizing x and y
== SEARCH xy

  = GEO_DELTA
  Ir L(1-6) xy = -0.03 0.03 0.01

</loop>
</loop>