This program creates atomistic structure files containing line defects
using anisotropic elasticity with and without periodic boundary conditions.
The displacement, strain, stress fields ... predicted by elasticity on each atomic positions
can be printed on output.
It can also calculate the elastic energy contained in the simulation box.
Line defects can be infinite dislocations or dislocation dipoles,
as well as dislocation loops (not fully implemented).
Execution:
=========
babel input.dat
where input.dat is the input file
If input.dat="-", the input is read from current unit (keyboard or piped other command like echo)
Structure of the input file:
===========================
The input file can contain the namelist Input, Dislo, DDipole, Loops.
Only the namelist Input is mandatory.
&Input
...
//
&Dislo
...
//
&DDipole
...
//
&Loops
...
//
anisotropic_elasticity
↑
(type: logical ,
default: .false. ,
mandatory: no )
If anisotropic_elasticity=.true., the elastic constants are given
for a crystal of any symmetry.
You need to define all non null elements of the 6x6 matrix
corresponding to elastic constants in Voigt notation.
See also: CVoigt
,
cubic_elasticity
,
hexagonal_elasticity
CVoigt
↑
(type: real, dim(6,6) ,
default: 0. ,
mandatory: no )
6x6 matrix defining the elastic constants in Voigt notation
when anisotropic_elasticity=.true..
All non null elements need to be given.
By defaults, the program assumes that the elastic constants are in GPa.
See also: anisotropic_elasticity
,
CVoigt_noise
cubic_elasticity
↑
(type: logical ,
default: .false. ,
mandatory: no )
If cubic_elasticity=.true., the elastic constants are given
for a crystal of cubic symmetry.
You need then to give the three constants C11, C12, and C44.
Make sure the crystal is oriented in the cubic axes corresponding to the elastic constants,
or use anisotropic_elasticity=.true. otherwise.
See also: C11, C12, C44, C13, C33
,
anisotropic_elasticity
,
hexagonal_elasticity
hexagonal_elasticity
↑
(type: logical ,
default: .false. ,
mandatory: no )
If hexagonal_elasticity=.true., the elastic constants are given
for a crystal of hexagonal symmetry.
You need then to give the five constants C11, C12, C44, C13 and C33.
Make sure the crystal is oriented so that the z coordinate corresponds
to the 6-fold symmetry axis, or use anisotropic_elasticity=.true. otherwise.
See also: C11, C12, C44, C13, C33
,
anisotropic_elasticity
,
cubic_elasticity
C11, C12, C44, C13, C33
↑
(type: real ,
default: 0. ,
mandatory: no )
Elastic constants used for the special cases:
- cubic_elasticity=.true.: C11, C12, C44 are used
- hexagonal_elasticity=.true.: C11, C12, C44, C13 and C33 are used and C66=(C11-C12)/2
By defaults, the program assumes that the elastic constants are in GPa.
See also: cubic_elasticity
,
hexagonal_elasticity
CVoigt_noise
↑
(type: real ,
default: 0. ,
mandatory: no )
CVoigt_noise=x will add a random noise of maximal amplitude x to all elastic constants,
keeping the elastic matrix positive definite. This is the relative amplitude
and the absolute amplitude is obtained by multiplying with the norm of the elastic tensor.
This may be necessary for creating line defects when the crystal possesses some symmetries,
because of the Stroh formalism leading to undefined solutions in that cases.
CVoigt_noise=1.d-4 will generally solve the problem without perturbing the solution.
Do not use a noise smaller than 1.d-6.
When adding a noise, you should check that the result (the elastic energy or the Stroh matrix for instance)
does not depend too much on this noise by running several times the same calculation.
strain
↑
(type: logical ,
default: .false. ,
mandatory: no )
Set the variable strain to .true. if you want to apply
a homogeneous strain to the crystal in addition to the strain
created by the line defects.
The homogeneous strain to apply is defined either by epsi and eStrain
or by tau and sStrain.
See also: eStrain
,
epsi
,
tau
,
sStrain
,
induced_homogeneous_strain
eStrain
↑
(type: real, dim(3,3) ,
default: 0. ,
mandatory: no )
Tensor defining the homogeneous strain to apply when strain=.true.
The applied strain is the product of this tensor with the scalar epsi.
See also: strain
,
epsi
epsi
↑
(type: real ,
default: 1. ,
mandatory: no )
Scalar defining the homogeneous strain to apply when strain=.true.
The applied strain is the product of this scalar with the tensor eStrain(1:3,1:3).
See also: strain
,
eStrain
sStrain
↑
(type: real, dim(3,3) ,
default: 0. ,
mandatory: no )
Stress tensor used to define the homogeneous strain to apply when strain=.true.
The applied strain is the product of the inverse elastic constants tensor
with this stress tensor multiplied by the scalar tau.
See also: strain
,
tau
tau
↑
(type: real ,
default: 1. ,
mandatory: no )
Scalar used to define, with the stress tensor sStrain(1:3,1:3),
the homogeneous strain to apply when strain=.true.
The applied strain is the product of the inverse elastic constants tensor
with the stress tensor multiplied this scalar.
This needs to be given in the same units as the elastic constants (GPa).
See also: strain
,
sStrain
induced_homogeneous_strain
↑
(type: logical ,
default: .true. ,
mandatory: no )
When induced_homogeneous_strain=.true. , the homogeneous strain
induced by the line defects is applied to the crystal
so as to minimize the elastic energy existing in the simulation box.
For a dislocation dipole or a dislocation loop, this strain
corresponds to the plastic strain introduced in the crystal
when creating the dipole or the loop.
See also: strain
imm
↑
(type: integer ,
default: 0 ,
mandatory: no )
Maximal number of atom in the structure.
imm needs to be defined if the input structure is duplicated
to dimension the arrays.
Otherwise, the actual number of atoms, read from input structure file, is used.
See also: duplicate
duplicate
↑
(type: logical ,
default: .false. ,
mandatory: no )
If duplicate=.true., the crystal is duplicated.
lat(1:3) is the number of times the crystal should be duplicated
in each direction given by the vectors at(1:3,i) read in the structure file.
If lat(i) is negative, then the opposite of the vector at(1:3,i) is used.
The maximal number of atoms in the duplicated structure needs to be set with imm
and the periodicity vectors have to be defined.
When the structure is also rotated, the duplication is done first and then the rotation.
The periodicity vectors used for duplication are thus those before rotation.
See also: imm
,
lat
lat
↑
rotate
↑
(type: logical ,
default: .false. ,
mandatory: no )
If rotate=.true., the crystal is rotated using rotation matrix defined in rot(1:3,1:3).
The program also rotates the definition of the line-defect and the elastic constants.
If both rotation and translation are performed, the crystal is first rotated
and then translated.
See also: rot
rot
↑
symmetrize
↑
(type: logical ,
default: .false. ,
mandatory: no )
If symmetrize=.true., the atomic positions are symmetrized according to
symmetry operations defined in file symFile.
See also: symFile
symFile
↑
translate
↑
(type: logical ,
default: .false. ,
mandatory: no )
If translate=.true., the crystal is translated with the vector uTranslate(1:3)
The program also translates the points definig the line-defect centers.
If both rotation and translation are performed, the crystal is first rotated
and then translated.
See also: uTranslate
uTranslate
↑
(type: real, dim(3) ,
default: 0. ,
mandatory: no )
Translation vector used when translate=.true.
If alat is defined, uTranslate(1:3) is multiplied by alat.
See also: translate
,
alat
fixGravity
↑
(type: logical ,
default: .false. ,
mandatory: no )
When fixGravity=.true., a solid displacement is added to atom final positions
and displacements to keep fixed gravity center
xNoise
↑
(type: real ,
default: 0. ,
mandatory: no )
If positive, add to atomic positions of the output structure
a noise which amplitude is equal to xNoise multiplied by alat.
The gravity center is kept fixed.
See also: alat
alat
↑
(type: real ,
default: 1. ,
mandatory: no )
Length used to scale all distances in the present input file (uTranslate, rc, ...),
including the line defect definitions in other namelists (cDiso, bDislo, ...).
It is also used to scale xNoise.
It has no effect on the atomic configuration read in input structure file.
xImages, yImages, zImages
↑
(type: logical ,
default: .false. ,
mandatory: no )
If xImages=.true. (yImages or zImages), periodic boundary conditions
are assumed in the corresponding direction and periodic images are considered
for all defined line-defects. The number of periodic images considered
in each direction is controlled by nxImages (nyImages or nzImages).
See also: nxImages, nyImages, nzImages
nxImages, nyImages, nzImages
↑
(type: integer ,
default: 10 ,
mandatory: no )
Number of images to consider in each direction with periodic boundary conditions.
The default value is large enough to build an initial configuration
but should be increased for energy calculation.
For a small unit-cell like the ones used in ab-initio calculation,
you probably need to increase this value to 100.
A way to check convergence is to run several simulations. As the point where periodicity is enforced
is randomly chosen, different simulations will lead to different results for elastic energy.
Nevertheless, differences should be small (less than 0.1 meV) and correspond to calculation convergence.
See also: xImages, yImages, zImages
clipAtom
↑
(type: logical ,
default: .false. ,
mandatory: no )
If clipAtom=.true., periodic boundary conditions are applied
to atom coordinates to bring them back in the primitive unit cell.
The periodicity vectors have to be defined.
clipDisplacement
↑
(type: logical ,
default: .false. ,
mandatory: no )
If clipDisplacement=.true., periodic boundary conditions are applied
to atom displacements.
The periodicity vectors have to be defined.
remove_cut
↑
(type: logical ,
default: .false. ,
mandatory: no )
If remove_cut=.true. (or add_cut=.true.), atoms located inside the cut associated
with the creation of a single dislocation or a dislocation dipole are removed
or inserted (Volterra process).
This also works with dislocation loops.
See also: Dislo
,
DDipole
,
Loops
add_cut
↑
max_Euler
↑
(type: integer ,
default: 0 ,
mandatory: no )
EXPERIMENTAL: Eulerian or Lagrangian coordinates can be used.
In Lagrangian coordinates, elastic fields (displacement, stress) are calculated at point x0
corresponding to the initial coordinates.
In Eulerian coordinates, fields are calculated at point x = x0 + u(x),
where u(x) is the displacement calculated at the final point.
A self-consistency loop is used for Eulerian coordinates, with a maximal number of iterations
given by max_Euler.
Default value max_Euler=0 corresponds to Lagrangian coordinates and should be preferred.
See also: delta_Euler
delta_Euler
↑
(type: real ,
default: 1.d-5 ,
mandatory: no )
When Eulerian coordinates are used, delta_Euler controls the absolute convergence
of the displacement. The self-consistency loop will stop when u(x) is smaller than (x-x0)
(in absolute value).
See also: max_Euler
rc
↑
(type: real ,
default: 1. ,
mandatory: no )
Cutoff radius corresponding to the core of the line defects.
This is useful for energy calculations and to define atoms inside the core (see out_core).
If alat is defined, rc is multiplied by alat.
See also: out_core
,
alat
factorE
↑
(type: real ,
default: 0.00624150947961 ,
mandatory: no )
Conversion factor to transform stress * volume in energy.
The default value assumes that elastic constants are in GPa
and distances in Angstroms, so as to obtain energies in eV.
This is used to calculate elastic energy and with out_Ebinding
to calculate impurity binding energies
See also: out_Ebinding
inpFile
↑
(type: character string ,
default: '-' ,
mandatory: yes/no )
Name of the structure file used as input.
If input='-', the structure is read from keyboard.
The file formats are defined by inpXyz | inpCfg | inpGin | inpSiesta | inpNDM | inpLmpDump | inpLmpData | inpPoscar
See also: inpXyz, inpCfg, inpGin, inpSiesta, inpNDM, inpLmpDump, inpLmpData, inpPoscar
inpXyz, inpCfg, inpGin, inpSiesta, inpNDM, inpLmpDump, inpLmpData, inpPoscar
↑
nTypes
↑
(type: integer ,
default: 0 ,
mandatory: no )
Number of different atom types. This is necessary only if you want to define
the label(:) property for each atom and this cannot be obtained from the
input structure file. Otherwise, the number of different atom types
should be set automatically after reading the input structure file.
See also: Structure file formats
,
label
label
↑
(type: character(len=5), dim(360) ,
default: (/ A, B, ... /) ,
mandatory: no )
Label corresponding to each atom type if necessary and it cannot be obtained
from the input structure file.
See also: nTypes
,
Structure file formats
mass
↑
(type: real, dim(360) ,
default: 0. ,
mandatory: no )
Mass corresponding to each atom type if necessary and it cannot be obtained
from the input structure file.
See also: nTypes
,
Structure file formats
at
↑
(type: real, dim(3,3) ,
default: 0. ,
mandatory: no )
at(1:3,1), at(1:3,2), at(1:3,3): 3 periodicity vectors
The program tries first to read them in the input file and then
in the structure file. If vectors are defined in both files,
the ones defined in the structure file will be used.
If alat is defined, at(1:3,1:3) is multiplied by alat.
See also: inpFile
,
alat
displacementFile
↑
(type: character string ,
default: '' ,
mandatory: no )
If it is defined, a displacement vector is read in this file
for each atom and is added to atom position.
The displacement can be multiplied by displacementFileFactor.
The format of this file is xyz, as generated by programs babel or displacement.
The displacement vector should be in columns 5-7, just after atom positions.
See also: displacementFileFactor
,
Structure file formats
displacementFileFactor
↑
outFile
↑
(type: character string ,
default: '-' ,
mandatory: no )
Name of the structure file where to save the output structure
which auxiliary properties set for each atom (displacement, stress, ...)
If outFile="-", the output file is printed on screen.
The file format is defined by outXyz | outCfg | outOnlyAtoms ...
See also: outXyz, outCfg, outOnlyAtoms, outGin, outSiesta, outLmpDump, outLmpData, outPoscar
,
initial
,
out_alat
outXyz, outCfg, outOnlyAtoms, outGin, outSiesta, outLmpDump, outLmpData, outPoscar
↑
initial
↑
(type: logical ,
default: .false. ,
mandatory: no )
If initial=.true., the coordinates of the input structure,
i.e. before creation of the line defects, are used on output.
See also: outFile
out_alat
↑
(type: real ,
default: 1. ,
mandatory: no )
When the output structure is written with xyz or cfg file format,
atomic positions and periodicity vectors can be scaled by a lattice parameter
given in out_alat.
See also: outFile
,
Structure file formats
out_neighbours
↑
(type: logical ,
default: .false. ,
mandatory: no )
Print in output structure file the number of neighbours for each atom.
The neighbourhood sphere is defined by the radius rNeigh.
See also: outFile
,
rNeigh
,
max_nNeigh
rNeigh
↑
(type: real ,
default: -1 ,
mandatory: yes if out_neighbours=.true. )
Radius of the neighbourhood sphere used to look for atom neighbours.
If alat is defined, rNeigh is multiplied by alat.
See also: out_neighbours
,
alat
max_nNeigh
↑
(type: integer ,
default: 16 ,
mandatory: no )
Maximal number of neighbours for an atom.
This is used to dimension arrays when atom neighbourhoods are computed (out_neigbours=.true.).
See also: out_neighbours
out_neighbours
↑
out_displacement
↑
(type: logical ,
default: .false. ,
mandatory: no )
If out_displacement=.true., the displacement defined on each atom
is printed in output structure file.
See also: outFile
out_elasticStrain
↑
(type: logical ,
default: .false. ,
mandatory: no )
If out_elsaticStrain=.true., the elastic strain calculated on each atomic position
is printed in output structure file.
See also: outFile
out_stress
↑
(type: logical ,
default: .false. ,
mandatory: no )
If out_stress=.true., the stress tensor calculated on each atomic position
is printed in output structure file.
See also: outFile
out_pressure
↑
(type: logical ,
default: .false. ,
mandatory: no )
If out_pressure=.true., the pressure calculated on each atomic position
is printed in output structure file.
P = -1/3 Trace( stress )
See also: outFile
,
out_stress
out_VonMises
↑
(type: logical ,
default: .false. ,
mandatory: no )
If out_VonMises=.true., the Von-Misès equivalent shear stress calculated on each atomic position
is printed in output structure file.
P = -1/3 Trace( stress )
sVM = Sqrt( 3/2*( ( s11 + P )^2 + ( s22 + P )^2 + ( s33 + P )^2 + 2.d0*( s23^2 + s13^2 + s12^2 ) ) )
See also: outFile
,
out_stress
out_core
↑
(type: logical ,
default: .false. ,
mandatory: no )
If out_core=.true., print index 1 for atom belonging to defect core,
i.e. closer than rc from a line defect.
See also: outFile
,
rc
out_Ebinding
↑
(type: logical ,
default: .false. ,
mandatory: no )
If out_Ebinding=.true., the binding energy with the elastic stress field
and an impurity is calculated and printed on each atomic positions.
The elastic dipole characterizing the impurity, pImpurity(:,:), needs to be defined. (~ Eshelby inclusion eigenstrain)
See also: outFile
,
pImpurity
pImpurity
↑
(type: real, dim(3,3) ,
default: 0. ,
mandatory: yes, if out_Ebinding=.true. )
Elastic dipole characterizing the impurity for binding energy calculation.
This is equivalent to the eigenstrain for an Eshelby infinitesimal inclusion.
It should be given in the same units as the output energies (eV by default).
See also: out_Ebinding
out_x, out_y, out_z
↑
(type: logical ,
default: .false. ,
mandatory: no )
If out_x=.true., print first atomic coordinates as auxiliary properties.
(not really useful)
See also: outFile
verbosity
↑
(type: integer ,
default: 4 ,
mandatory: no )
Integer values defining amount of information on output unit.
verbosity=0: no output
verbosity=4: normal output
verbosity>=10: debugging
debug
↑
(type: logical ,
default: .false ,
mandatory: no )
For debug purpose.
Namelist used to define infinite straight dislocations.
If dislocations of opposite Burgers vector are defined, the program will try to gather them in dipoles.
This has an effect on the displacement field as its discontinuity is localized on the plane surface
bordered by the two dislocations.
When the total Burgers vector of the simulation box is null, the elastic energy is calculated
either with or without periodic boundary conditions.
Namelist used to define dipoles of infinite straight dislocations.
A dipole corresponds to two parallel dislocations of opposite Burgers vector.
This defintion is to be preferred to the one with the namelist "Dislo"
as this allows a better control of the displacement discontinuity.
Namelist used to define dislocation loops.
Both the plastic (solid angle) and the elastic parts of the displacement created by the loop
are implemented. But for the elastic part, we assume istropic elasticity and we use
a Poisson coefficient equal to 1/2. (Eq. 1 in D.M. Barnett, "The displacement field
of a triangular dislocation loop" Philos. Mag. A, 1985, 51, 383-387)
This allows building initial configurations containing a dislocation loop
which need to be relaxed then with atomistic simulations.
nLoop
↑
bLoop
↑
(type: real, dim(3,20) ,
default: 0. ,
mandatory: yes )
bLoop(1:3,i) is the Burgers vector of the loop numbered i.
If alat is defined in the namelist Input, bLoop(:,:) is multiplied by alat.
See also: alat
iLoop
↑
xLoop
↑
(type: real, dim(3,100,20) ,
default: 0. ,
mandatory: no )
xLoop(1:3,n,i) is the position of the point n belonging to the perimeter of the loop numbered i.
These points need to be defined in continuous order along the loop perimeter
as they correspond to a discretization of the dislocation line defining the loop.
Insted of defining by hand the different points on the perimeter,
you can use rLoop, cLoop, and nHabitLoop to define a circular loop
If alat is defined in the namelist Input, xLoop(:,:,:) is multiplied by alat.
See also: rLoop
,
cLoop
,
nHabitLoop
,
alat
cLoop
↑
(type: real, dim(3,20) ,
default: 0. ,
mandatory: no )
cLoop(1:3,i) is the position of the "center" of the loop numbered i.
This variable is optional and is used to define the cut surface,
i.e. the displacement discontinuity created by the loop, by considering triangles
between this point and the segments composing the loop perimeter.
If you do not define it, by default, it is taken as the last point
defining the loop perimeter (centerLoop=.FALSE. by default)
or as the gravity center of all the points used to discretize the loop perimeter
(centerLoop=.TRUE.).
cLoop(1:3,i) can also be used to draw a circular loop, defining its center cLoop(1:3,i),
it radius rLoop(i) and the normal to its habit plane nHabitLoop(1:3,i)
If alat is defined in the namelist Input, cLoop(:,:) is multiplied by alat.
See also: centerLoop
,
rLoop
,
nHabitLoop
,
alat
rLoop
↑
(type: real, dim(20) ,
default: -1. ,
mandatory: no )
rLoop(1:3,i) used to define the loop radius when drawing a circular loop.
If alat is defined in the namelist Input, rLoop(:) is multiplied by alat.
See also: cLoop
,
nHabitLoop
,
alat
nHabitLoop
↑
(type: real, dim(3,20) ,
default: 0. ,
mandatory: no )
nHabitLoop(1:3,i) used to define the normal to the loop habit plane when drawing a circular loop.
See also: cLoop
,
rLoop
shiftInsertedLoop
↑
(type: real, dim(3,20) ,
default: 0. ,
mandatory: no )
shiftInsertedLoop(1:3,i) is the displacement to add to the atoms,
which have been inserted during the Volterra procedure
for an interstitial loop.
This allows controling the stacking fault of the interstitial loop.
See also: add_cut
,
alat
xLoop_noise
↑
centerLoop
↑
(type: logical ,
default: .FALSE. ,
mandatory: no )
If centerLoop=.TRUE., then a center cLoop(1:3,n) is defined for each loop n.
This center is used to discretize the loop surface in triangles all sharing
a common corner corresponding to this center.
If centerLoop=.FALSE. (default), then the last point defining the loop perimeter
is used for the center and this last point is removed.
If you do not manage to obtain the correct atomic stacking inside the loop,
you may use this option and play with the variable cLoop(:,:).
See also: cLoop
uLoop_fast
↑
(type: logical ,
default: .FALSE. ,
mandatory: no )
If uLoop_fast=.TRUE., then only the solid angle part is calculated
for the displacement created by the dislocation loops.
If not, the elastic contribution is also calculated,
assuming isotropic elasticity with a Poisson coefficient equal to 1/2
Not really usefull, as the impact of CPU time is negligible.