Download | SearchCopyright | Publications
 * password protected


nextnano≥ software







Under the keyword $simulation-flow-control there is the specifier strain-calculation. If for this strain-minimization is chosen, this keyword has to be present in the input file.


$strain-minimization-model                    optional   !
 substrate-cluster-number         integer     required   !
reference cluster for strain
 boundary-condition-x             character   optional   ! Neumann
or periodic
 boundary-condition-y             character   optional   ! Neumann
or periodic
 boundary-condition-z             character   optional   ! Neumann
or periodic
grown-on-substrate               character   optional   ! 'yes'
or 'no' (thick substrate or freestanding structure)
 deformed-volume-correction       character   optional   ! 'yes'
or 'no'
 input-substrate-strain           character   optional   ! 'yes'
or 'no'
 strain-epsilon-substrate-xx      double      optional   ! epsilonxx
 strain-epsilon-substrate-yy      double      optional   ! epsilonyy
 strain-epsilon-substrate-zz      double      optional   ! epsilonzz
 strain-epsilon-substrate-xy      double      optional   ! epsilonxy
 strain-epsilon-substrate-xz      double      optional   ! epsilonxz
 strain-epsilon-substrate-yz      double      optional   ! epsilonyz
 input-substrate-stress           character   optional   ! 'yes'
or 'no'
 stress-sigma-substrate-xx        double      optional   ! sigmaxx
 stress-sigma-substrate-yy        double      optional   ! sigmayy
 stress-sigma-substrate-zz        double      optional   ! sigmazz
 stress-sigma-substrate-xy        double      optional   ! sigmaxy
 stress-sigma-substrate-xz        double      optional   ! sigmaxz
 stress-sigma-substrate-yz        double      optional   ! sigmayz
$end_strain-minimization-model                optional   !


substrate-cluster-number = 1
                         = 2

This refers to the reference cluster for strain. It is very important that this substrate cluster is somewhere at the boundary of the simulation area and that it has nothing to do with the specific device area one is interested in.
The strain in the substrate is set to zero. Especially, it is very important, that the substrate-cluster has its own
cluster-number and only its own region-number associated with it.
   cluster-number = 1    region-numbers = 1       ! CORRECT
The substrate must also have its own material.
   material-number =
   material-name   =
   cluster-numbers =

This would be wrong:
   cluster-number = 1    region-numbers = 1 3     ! WRONG

This would be wrong:
   material-number =
   cluster-numbers =
1  2  5                      ! WRONG
   material-name   =

Then Dirichlet values (strain=0; no displacement) for this cluster are set. (If the substrate-cluster would be identical to the other clusters containing the same material (i.e.
region-numbers = 1 AND 3), for both of these Dirichlet values would be set leading to a wrong strain calculation.)


boundary-condition-x     = periodic
                         = Neumann


boundary-condition-y     = periodic
                         = Neumann


boundary-condition-z     = periodic
                         = Neumann

Neumann boundary conditions correspond to the case of 'no external forces acting on the sample', i.e. Neumann sets the derivative of sigma (stress tensor) to zero at boundaries. Note that the stress tensor is a different quantity than the strain tensor epsilon. They are related by:

sigmaij = Cijkl epsilonij

where Cijkl is the elastic stiffness tensor.

For calculation of a quantum well in three dimensions, I got much better results (meaning more symmetric ones) when I used periodic boundary conditions.


Strain algorithm which also works for free-standing structures

 grown-on-substrate         = yes  ! thick substrate (default)
                            = no   !
 deformed-volume-correction = no   !
 deformed-volume-correction = yes  !
can be used for free-standing
Previously when one minimizes the elastic energy one usually didn't distinguish between deformed and undeformed volume. Now one can distinguish.
The elastic constants must be zero for an 'air cluster'. An air cluster can be used to allow the structure to relax into air (free-standing).
Note: strain-calculation = strain-minimization-new must be specified in $simulation-flow-control.
See also $numeric-control for
 strain-volume-correction-residual   = ...
 strain-volume-correction-iterations = ...

Deformed volumne correction: The idea is, that we have to minimize the elasticity energy: E = \int C*eps*eps* dV. In principle dV should be the non-deformed volume, not the final volume. We minimize: E = \int C * eps* eps* (1 - Tr(eps)) dV which is only a low order correction.

An example is documented in this tutorial: Strain effects in freestanding three-dimensional nitride nanostructures


Substrate with arbitrary strain tensor components (e.g. hydrostatic, biaxial, uniaxial, shear strain)

There is also the possibility that a reference lattice ('substrate') has e.g. shear strain tensor components.
The user can specify them in the input file.
Note that this strain tensor refers to the simulation coordinate system, and not to the crystal coordinate system.

 input-substrate-strain           = no       ! (default)
                                  = yes      !
 strain-epsilon-substrate-xx      = 0.05d0   ! epsilonxx
 strain-epsilon-substrate-yy      = 0.05d0   ! epsilonyy
 strain-epsilon-substrate-zz      = 0.05d0   ! epsilonzz
 strain-epsilon-substrate-xy      = 0d0      ! epsilonxy
 strain-epsilon-substrate-xz      = 0d0      ! epsilonxz
 strain-epsilon-substrate-yz      = 0d0      ! epsilonyz

If the structure is grown on a substrate then we consider the substrate material as the reference one.
But it can happen that the substrate layer is strained (due to external stress, for example).
Then the reference lattice and the substrate lattice become different.

If this is the case, the user can provide the six strain tensor components of the substrate layer.
The code will compute the new reference lattice parameters and do the elastic energy minimization.
Obviously, these strain tensor components of the substrate can only be entered if it holds: input-substrate-strain = yes
Additional documentation including equations is available as a pdf file: substrate_with_shears.pdf

Note: strain-calculation = strain-minimization-new must be specified in $simulation-flow-control.

For further information, see also this tutorial: Growth of layers on strained substrates

Rather than specifying the strain tensor, the user can alternatively specify an arbitrary stress tensor:

 input-substrate-stress           = no       ! (default)
                                  = yes      !
 stress-sigma-substrate-xx        = 1.0d9    ! [Pa] sigmaxx
 stress-sigma-substrate-yy        = 0d0      ! [Pa] sigmayy
 stress-sigma-substrate-zz        = 0d0      ! [Pa] sigmazz
 stress-sigma-substrate-xy        = 0d0      ! [Pa] sigmaxy
 stress-sigma-substrate-xz        = 0d0      ! [Pa] sigmaxz
 stress-sigma-substrate-yz        = 0d0      ! [Pa] sigmayz

The units for the stress are [Pa], e.g. if the substrate is uniaxially stressed with sigmaxx = 1 GPa along the x direction, then all other sigmaij are zero.
 stress-sigma-substrate-xx = 1d9  ! [Pa]
Note that 1 bar is 105 Pa.

Again, this stress tensor refers to the simulation coordinate system, and not to the crystal coordinate system.

The code internally calculates from the stress tensor the relevant strain tensor that is present inside the substrate, and output it.

For further information, see also this tutorial: Growth of layers on strained substrates