nextnano.com
==> nextnano Documentation (New)

nextnano++ software

     

Up
doping
generation

This is the old documentation. Here's the link to the new documentation.

structure{}

Specifications that define the device structure. (New: GDSII files can be mapped onto region{...} using nextnanopy.)

 

structure{

 
Output definitions

   output_region_index{          #
output (last) region number and (last) material region number for each grid point
      boxes = yes/no             #
(optional) For each grid point, in 1D two points are printed out to mimic
   }                             # abrupt discontinuities at interfaces (in 2D four points, in 3D eight points)

   output_material_index{        #
output material number according to material database for each grid point
      boxes = yes/no             #
(optional)
   }

   output_contact_index{         #
output contact number for each grid point
      boxes = yes/no             #
(optional)
   }

   output_user_index
{            #
output (last) user defined index for each grid point
      boxes = yes/no             #
(optional)
   }                             #
1. The user index array is preinitialized with value 0 everywhere.
                                 #
2. The regions are processed in order of their definition, and only regions which have a user index defined are considered,
                                 #     (i.e. regions without user index do not affect the user index array).
                                 #
Hints: Set a user index to e.g. 0 if you want a region to e.g. merely delete the user index inside.
                                 # And use variables together with expressions such as $index = $index + 1 to generate consecutive index values from region to region.
                                 #
Download example input file: output_user_index_nnp.in
                                 #
This example shows how to create an incremental enumeration of regions using variables, and also how to keep identical number across clusters of regions.


   output_alloy_composition{     #
output alloy composition for each grid point
      boxes = yes/no             #
(optional)
   }

   output_impurities{            #
output doping concentration for each grid point in units of [1018/cm3]
      boxes = yes/no             #
(optional)
   }

   output_generation{            #
output generation rate for each grid point in units of [10^18/(cm3 s)]
      boxes = yes/no             #
(optional)
}

 

 Structure definitions
  Every region needs to have a certain shape, which can be defined by several objects.
  It consists of a certain material and/or contact, and it can have a doping profile.

  Any subsequently defined region overwrites previously defined ones in the overlapping area.
  For exclusive properties such as material and contact, this implies a substitution of the old value.

  Concerning doping, the new profile is added to any previously defined one.

  Geometric objects may also be defined such that they are partially, mostly, or completely outside of the simulation region.
  Only the parts of structures which are inside of the simulation region will be used, everything else is ignored.

  The following structures are supported:

  • 1D: line
  • 2D: rectangle
         circle
         triangle
         trapezoid
         polygon
         regular_polygon
         hexagon
         semiellipse
  • 3D: cuboid
         sphere
         cylinder
         obelisk
         hexagon_obelisk
         cone
         semiellipsoid
         regular_prism
         hexagonal_prism
         polygonal_prism
         pyramid
         regular_pyramid
         hexagonal_pyramid
         polygonal_pyramid

 

   region{


     
Region object shapes
      
Depending on the dimension of the simulation domain, different options are available.


      user_index{ 2 }                #
(optional) integer number that labels the regions (value must be >= 0), needed for output_user_index{}.
                                     #
Default region indices are written out using output_region_index{}. When plotting, each region will be visualized with a different color.
                                     # Sometimes the user wants to have the same color for several regions, e.g. to set all regions that are doped to the same index. This can be set here.

      everywhere
{}                   # region will extend over the whole simulation area
                                     #
this is useful if one wants to define a default region (i.e. a default material)
                                     # that should fill all "empty" (i.e. undefined) areas of the simulation area.

      line{                          #
1D object
         x = [10.0, 20.0]            #
a line from 10 nm to 20 nm along the x direction
      }

      line{                          #
1D object
         x = [20.0, 10.0]            #
a line from 10 nm to 20 nm along the x direction, i.e. the reverse order x1 < x2 also works
      }

      rectangle{                     #
2D object, a rectangle defined by two lines along the x and y directions
         x = [10.0, 20.0]            #
a line from 10 nm to 20 nm along the x direction
         y = [ 0.0,  5.0]            #
a line from  0 nm to  5 nm along the y direction
      }

      cuboid{                        #
3D object, a cuboid defined by three lines along the x, y and z directions
         x = [10.0, 20.0]            #
a line from 10 nm to 20 nm along the x direction
         y = [ 0.0,  5.0]            #
a line from   0 nm to  5 nm along the y direction
         z = [ 0.0,  5.0]            #
a line from   0 nm to  5 nm along the z direction
      }

 

      circle{                                    # 2D object, a circle is defined by its center and radius
         center{ x = 10.5   y = 14.0 }           #
same as for regular_polygon
         radius = 10.0                           #
radius
      }

      sphere{                                    # 3D object, a sphere is defined by its center and radius
         center{ x = 10.5   y = 14.0   z = 1.0 } #
similar as for circle
         radius = 10.0                           #
radius
      }

      cylinder{                            # 3D object, e.g. a cylinder with a freely oriented axis
         axis_start = [50.0, 50.0, 30.0]   #
coordinates of starting point of cylinder axis
         axis_end   = [50.0, 50.0, 60.0]   #
coordinates of ending point of cylinder axis
         radius     = 20.0                 #
radius of cylinder
      }

     
Download example input file: 3D_Cylinder_nnp.in


      trapezoid{                     # 2D object e.g. a simple trapezoid along the x axis
         base_x     = [ 5, 15]       #
base line extends in x direction from 5 to 15 nm
         base_y     = [25, 25]       #
base line has a constant y coordinate y = 25 nm
         top_x      = [ 8, 12]       #
top line extends in x direction from 8 to 12 nm
         top_y      = [30, 30]       #
top line has a constant y coordinate y = 30 nm
      }
     
Note: Exactly one of the elements base_x and base_y has to be set by two equal numbers to define the base line.
                     The same holds for top_x and top_y to define the top line.

      obelisk{                       #
3D object, e.g. an obelisk parallel to the (x,y) plane with top below bottom
         base_x     = [ 5, 15]       #
extension of base plane in x direction, i.e. from 5 to 15 nm.
         base_y     = [ 6, 17]       #
extension of base plane in y direction, i.e. from 6 to 17 nm.
         base_z     = [27, 27]       #
base plane at z = 27 nm
         top_x      = [ 7, 13]       #
extension of top plane in x direction, i.e. from 7 to 13 nm.
         top_y      = [ 8, 15]       #
extension of top plane in y direction, i.e. from 8 to 15 nm.
         top_z      = [21, 21]       #
top plane at z = 21 nm
      }
     
Note: Exactly one of the elements base_x, base_y, and base_z has to be set by two equal numbers to define the base plane.
                     The same holds for top_x, top_y, top_z to define the top plane.
   
      hexagon_obelisk{               # 3D object, an obelisk with its base and top planes given by hexagons
                  ... (same as obelisk to define position, orientation and extension of object)
                  permute    = yes/no         # (optional) switch between two possible orientations of the hexagon within the rectangularly defined planes
           
}

      semiellipse{                   #
2D object, e.g. a simple semiellipse along the x axis
         base_x     = [45, 55]       #
extension of base plane in x direction, i.e. from 45 to 55 nm.
         base_y     = [ 5,  5]       #
base line at y = 5 nm
         top        = [50, 15]       #
top coordinate of the semiellipse (x,y) = (50,15) in units of [nm]
      }
     
Note: Exactly one of the elements base_x, and base_y has to be set by two equal numbers to define the base line.

      semiellipsoid{                 #
3D object, e.g. a semiellipsoid parallel to the (y,z) plane with top below bottom
         base_x     = [25, 25]       #
base plane at x = 25 nm
         base_y     = [17,  6]       #
extension of base plane in y direction, i.e. from 17 to 6 nm.
         base_z     = [ 7, 19]       #
extension of base plane in z direction, i.e. from 7 to 19 nm.
         top        = [17, 13, 11]   #
top coordinate of the semiellipsoid (x,y,z) = (17,13,11) in units of [nm]
      }
     
Note: Exactly one of the elements base_x, base_y, and base_z has to be set by two equal numbers to define the base plane.

      cone{                          #
3D object, e.g. a cone parallel to the (x,z) plane
         base_x     = [ 5, 20]       #
extension of base plane in x direction, i.e. from 5 to 20 nm.
         base_y     = [20, 20]       #
base plane at y = 20 nm
         base_z     = [ 7, 19]       #
extension of base plane in z direction, i.e. from 7 to 19 nm.
         top        = [10, 30, 11]   #
top coordinate of the cone (x,y,z) = (10,30,11) in units of [nm]
         diminution = 0.0            #
(optional) minimum value is 0.0 (i.e. cone), maximum value is 1.0 (i.e. cylinder)
                                     # diminution = 0.5
corresponds to "half diameter of base diameter", default is 0.0 (i.e. cone)
      }
     
Note: Exactly one of the elements base_x, base_y, and base_z has to be set by two equal numbers to define the base plane.

 

      triangle{                        # 2D object, a triangle defined by its 3 vertices.
         vertex{ x = 10.5   y = 14.0 } #
a vertex P is defined by its x and y coordinates: P=(x,y).
         vertex{ x =  0.0   y =  0.0 } #
         vertex{ x =  5.0   y = 10.0 } #
      }

      polygon{                         # 2D object, a polygon defined by its vertices. If the first and the last defined vertex are not identical, then they are joined with a line.
         vertex{ x = 10.5   y = 14.0 } #
a vertex P is defined by its x and y coordinates: P=(x,y). Multiple vertices can and must be defined for a polygon.
                                       #
Vertices must be ordered either clockwise or counterclockwise, otherwise the behavior during structure generation will be undefined.
      }

      polygonal_prism{                 # 3D object (= 2D polygon with extension into the perpendicular direction; vertices define the circumference of the prism.)
         z = [0, 10]                   #
define the extent in the desired height direction. Here: Height is defined with respect to z direction.
         vertex{ x = 10.5   y = 14.0 } #
a vertex P is defined by its x and y coordinates: P=(x,y). Multiple vertices can and must be defined for a polygon.
                                       #
Vertices must be ordered either clockwise or counterclockwise, otherwise the behavior during structure generation will be undefined.
         axis = [0, 1, 1]              #
(optional) inclination (shear) of prism structure
                                       #
(Obviously, cyclic permutation of x, y, z are possible.)
      }

 

      regular_polygon{                 # 2D object, a polygon with equal angles and equal side lengths. It is defined by its center, one vertex and the number of facets.
         center{ x = 10.5   y = 14.0 } #
The center point M is defined by its x and y coordinates: M=(x,y).
         corner{ x = 20.0   y = 30.0 } #
A corner vertex P is defined by its x and y coordinates: P=(x,y). Only one corner must be specified. By modifying the corner coordinates the whole polygon can easily be rotated around its center.
         number_of_facets = 7          #
number of facets (= number of vertices), must be >= 3
      }

      regular_prism{                   # 3D object (= 2D regular_polygon with extension into the perpendicular direction; center and/or corner define the circumference of the prism.)
         z = [0, 10]                   #
define the extent in the desired height direction. Here: Height is defined with respect to z direction.
         center{ x = 10.5   y = 14.0 } #
The center point M is defined by its x and y coordinates: M=(x,y).
         corner{ x = 20.0   y = 30.0 } #
A corner vertex P is defined by its x and y coordinates: P=(x,y). Only one corner must be specified. By modifying the corner coordinates the whole polygon can easily be rotated around its center.
         number_of_side_facets = 7     #
number of side facets (= number of vertices), must be >= 3
         axis = [0, 1, 1]              #
(optional) inclination (shear) of prism structure
                                       #
(Obviously, cyclic permutation of x, y, z are possible.)
      }

 

      hexagon{                         # 2D object, a polygon with equal angles and equal side lengths and 6 facets. It is defined by its center and one corner vertex.
         center{ x = 10.5   y = 14.0 } #
same as for regular_polygon
         corner{ x = 20.0   y = 30.0 } #
same as for regular_polygon
      }

      hexagonal_prism{                 # 3D object (= 2D hexagon with extension into the perpendicular direction; center and/or corner define the circumference of the prism.)
         z = [0, 10]                   #
define the extent in the desired height direction. Here: Height is defined with respect to z direction.
         center{ x = 10.5   y = 14.0 } #
same as for regular_polygon
         corner{ x = 20.0   y = 30.0 } #
same as for regular_polygon
         axis = [0, 1, 1]              #
(optional) inclination (shear) of prism structure
                                       #
(Obviously, cyclic permutation of x, y, z are possible.)
      }

 

Per default, all prisms (polygonal_prism, regular_prism, hexagonal_prism) are assumed to extend along the respective layer thickness direction (i.e. normal to the defining coordinate plane). But, using the axis vector, an arbitrary axis (inclination) direction for the prism can be defined in the simulation system. The axis vector does not need to be normalized, however, its orientation defines which side of the prism layer is the base to be used as reference for the inclination.
For example,
      regular_prism{
         z = [50, -70]                 #
automatically reordered to [-70, 50]
         center{ x = 10   y = 10 }
         corner{ x = 30   y = 40 }
         number_of_side_facets = 8     #
regular octagon wanted
         axis = [15 , 25 , 120]        #
no normalization needed here
      }
defines a regular octahedral prism extending primarily in the z direction (end surfaces are x-y planes at z = -70 and z = +50).
Since the axis points upwards in z direction (z = 120), the base surface to be taken as reference is the lower x-y plane at z = -70.
There, the octagon center is at { x = 10   y = 10 } with an octagon corner at { x = 30   y = 40 }.
With the axis vector defined as above, we then find for the x-y plane at z = +50
 -
the octagon center at { x = 10+15    y = 10+25} and
 - the octagon corner at { x = 30+15    y = 40+25 }.

In analogy to polygon, we provide pyramidal structures.

      polygonal_pyramid{               # 3D object
         z = [70, -70]                 #
same as for polygonal_prism
         vertex{ x = 10.5   y = 14.0 } #
a vertex P is defined by its x and y coordinates: P=(x,y). Multiple vertices can and must be defined for a polygon.
                                       #
Vertices must be ordered either clockwise or counterclockwise, otherwise the behavior during structure generation will be undefined.
         apex{   x = 10   y = 10   z = 120}
      }

      regular_pyramid{                 #
3D object
         z = [70, -70]                 #
same as for regular_prism
         center{ x = 10   y = 10 }     #
same as for regular_prism
         corner{ x = 70   y = 70 }     #
same as for regular_prism
         number_of_side_facets = 8     #
same as for regular_prism
         apex{   x = 10   y = 10   z = 120}
      }

      hexagonal_pyramid{               #
3D object
         z = [70, -70]                 #
same as for hexagonal_prism
         center{ x = 10   y = 10 }     #
same as for hexagonal_prism
         corner{ x = 70   y = 70 }     #
same as for hexagonal_prism
         apex{   x = 10   y = 10   z = 120}
      }
 

Similar to the prismatic structures, use x, y, and z at the beginning of the respective primitive to define the extent in the desired height direction, use vertex, center, and/or corner to define the circumference of the base of the pyramid, and apex to define the position of the apex of the pyramid. Note that, for polygonal_pyramid (as for polygon), the vertices must be ordered either clockwise or counterclockwise, otherwise the behavior during structure generation will be undefined.
Also note that if the apex is located outside of the interval defined by x, y, or z  at the beginning in the height direction, the pyramid will be truncated. Also, the pyramid will point upwards if the apex is above the center of said interval (and the lower plane is used as base), and will point downwards if the apex is below the center (and the upper plane is used as base). And in case a symmetric regular pyramid is desired, please make sure to laterally align the apex with the center point.

For example
      regular_pyramid{
         z = [70, -70]
         center{ x = 10   y = 10 }
         corner{ x = 70   y = 70 }
         number_of_side_facets = 8
         apex{   x = 10   y = 10   z = 120}
      }
defines a regular octahedral pyramid with base at z = -70, centered there at { x = 10   y = 10 } and a corner there at { x = 70   y = 70 }.
The apex of the pyramid would be at { x = 10   y = 10   z = 120}, making the structure rotationally symmetric, except that the pyramid is truncated at z = +70.
Thus, a rotationally symmetric truncated octahedral pyramid has been defined.

 

      pyramid{                             # 3D object, e.g. a pyramid with 4 freely defined corner points
         point1 = [50.0, 20.0, 30.0]       #
coordinates of first point of pyramid
         point2 = [50.0, 50.0, 80.0]       #
coordinates of second point of pyramid
         point3 = [80.0, 50.0, 50.0]       #
coordinates of third point of pyramid
         point4 = [50.0, 80.0, 30.0]       #
coordinates of fourth point of pyramid
      }



     
Contact definition

      contact{                       #
(optional)
         name = "source"             #
This region will be defined as a contact. In this case the contact is called "source".
      }

      contact{                       #
(optional)
         name = "source"             #
         remove{}                    #
(optional) If a region overlaps with a previous region that has the contact attribute,
                                     #
the user might want to remove this contact attribute.
      }


     
Material definition
     
Binary, ternary and quaternary materials are possible, with several choices of alloy functions.
      Depending on the dimension of the simulation domain, different options are available.

      binary{
         name    = "GaAs"            #
binary material name for this region
      }


      ternary_constant{
         name    = "Al(x)Ga(1-x)As"  #
ternary material name for this region with constant alloy profile
         alloy_x = 0.2               #
x content of the alloy (minimum value is 0.0, maximum value is 1.0)
      }


      ternary_linear{
         name    = "In(x)Al(1-x)As"  #
ternary material name for this region with linear alloy profile
         alloy_x = [0.8, 0.2]        #
start and end value of x content (minimum value is 0.0, maximum value is 1.0)
         x       = [75.0, 125.0]     #
x coordinates of start and end point [nm]
         y       = [10.0, 20.0]      #
y coordinates of start and end point [nm] (2D or 3D only)
         z       = [10.0, 20.0]      #
z coordinates of start and end point [nm] (3D only)
                                     #
This defines an alloy profile, which varies linearly along the line from the point (75,10,10) to the point (125,20,20)
                                     #
and stays constant in the perpendicular planes.
      }

     
Example (3D quantum dot)

     

 

      ternary_pyramid{               # (e.g. for InGaAs quantum dots) starting point and direction (3D only)
         name    = "In(x)Ga(1-x)As"  #
ternary material name for this region with pyramidal alloy profile
         alloy_x = [0.28, 0.80]      # cmin
and cmax value of x content (minimum value is 0.0, maximum value is 1.0)
                                     #
vary alloy concentration from apex/axis x = 0.80 (In0.80Ga0.20As)
                                     #
to plane through apex perpendicular to axis x = 0.28 (In0.28Ga0.72As) (see figure below)
         x       = [20.0, 0]         #
x coordinate of apex and x component of axis direction [nm]
         y       = [20.0, 0]         #
y coordinate of apex and y component of axis direction [nm]
         z       = [11.0, 1]         #
z coordinate of apex and z component of axis direction [nm]
                                     #
apex located at point (20.0,20.0,11.0) (top of inverted pyramid)
                                     #
direction of center axis (0,0,1), i.e. along z axis
                                     #
The profile is symmetric with respect to the inverse of the direction of the center axis,
                                     # i.e. (0,0,1) will lead to the same pyramidal profile as (0,0,-1).
      }
     
Note: The indium content is given by the following formula, which considers an additional lateral variation of the indium content:
      c = cmin + ( cmax - cmin ) cos2(phi)
     
where phi is the angle to the center axis. The formula is based on the model proposed by Tersoff (N. Liu et al., PRL 84, 334 (2000)).
     
For simplicity the alloy profile is still isotropic around the center axis of the quantum dot.
     
The indium content depends solely on the angle to the center axis,
      with high indium content for small angles as indicated by the light regions in the figure shown below.

     
Example (3D quantum dot)

     

 

      ternary_trumpet{               # (e.g. for InGaAs quantum dots) starting point and direction (3D only)
         name    = "In(x)Ga(1-x)As"  #
ternary material name for this region with "trumpet" alloy profile
         alloy_x = [0.2, 0.5]        # cmin
and cmax value of x content (minimum value is 0.0, maximum value is 1.0)
         x       = [20.0, 0]         #
x coordinate of apex and x component of axis direction [nm]
         y       = [20.0, 0]         #
y coordinate of apex and y component of axis direction [nm]
         z       = [11.0, 1]         #
z coordinate of apex and z component of axis direction [nm]
                                     #
apex located at point (20.0,20.0,11.0) (top of inverted pyramid)
                                     #
direction of center axis (0,0,1), i.e. along z axis
                                     # The profile is symmetric with respect to the inverse of the direction of the center axis,
                                     # i.e. (0,0,1) will lead to the same trumpet profile as (0,0,-1).
         z0      = 1.25              #
parameter to vary the shape of the alloy profile (minimum value is 1e-10)
         rho0    = 0.6               #
parameter to vary the shape of the alloy profile (minimum value is 1e-10)
      }
     
Note: The indium content is given by the formula:
      c = cmin + ( cmax - cmin ) exp [ ( - SQRT(x2 + y2) exp(-z1/z0) ) / rho0 ]
     
The formula is based on the more refined model proposed by Migliorato (M.A. Migliorato et al., PRB 65, 115316 (2002)).
     
This profile resembles the horn of a trumpet and is thus called 'trumpet'.
     
The maximum indium concentration is on the center axis of the quantum dot.
     
The parameters z0 and rho0 can be used to vary the shape of the alloy profile while keeping the average indium content fixed.

     
Example (3D quantum dot)

     

 

      ternary_import{
         name        = "In(x)Al(1-x)As"          #
ternary material name for this region which uses imported alloy profile
         import_from = "import_alloy_profile1D"  #
reference to imported data in import{}. The imported profile must have exactly one data component (x).
      }

      quaternary_import{
         name        = "Al(x)Ga(y)In(1-x-y)As"   #
quaternary material name for this region which uses imported alloy profile
         import_from = "import_alloy_profile1D"  #
reference to imported data in import{}. The imported profile must have exactly two data components (x,y).
      }

      quinternary_import{ ...                    # analogous for quinternaries:
      }

 

      quaternary_constant{
         name        = "Al(x)Ga(y)In(1-x-y)As" #
quaternary material name for this region with constant alloy profile
         alloy_x     = 0.2                     #
x content of the alloy (minimum value is 0.0, maximum value is 1.0)
         alloy_y     = 0.5                     #
y content of the alloy (minimum value is 0.0, maximum value is 1.0)
      }
     
For quaternaries of type AxByC1-x-yH, the following relation must hold: x + y <= 1
     
The interpolation of AxByC1-x-yH is done according to eq. (E.10) in PhD thesis of T. Zibold apart from changes in sign of bowing parameters.
     
The interpolation of AxB1-xCyD1-y is done according to eq. (E.15) in PhD thesis of T. Zibold apart from changes in sign of bowing parameters.


      quaternary_linear{
         name    = "Al(x)Ga(y)In(1-x-y)As" #
quaternary material name for this region with linear alloy profile
         alloy_x = [0.2, 0.5]              #
start and end value of x content (minimum value is 0.0, maximum value is 1.0)
         alloy_y = [0.1, 0.3]              #
start and end value of y content (minimum value is 0.0, maximum value is 1.0)
         x       = [20.0, 20.0]            #
x coordinates of start and end point [nm]
         y       = [20.0, 20.0]            #
y coordinates of start and end point [nm] (2D or 3D only)
         z       = [11.0, 20.0]            #
z coordinates of start and end point [nm] (3D only)
      }


      quaternary_pyramid{                  #
(e.g. for InGaAs quantum dots) (3D only)
         name    = "Al(x)Ga(y)In(1-x-y)As" #
quaternary material name for this region with pyramidal alloy profile
         alloy_x = [0.2, 0.5]              #
minimum and maximum value of x content
         alloy_y = [0.1, 0.3]              #
minimum and maximum value of y content
         x       = [20.0, 0]               #
x coordinate of apex and x component of axis direction [nm]
         y       = [20.0, 0]               #
y coordinate of apex and y component of axis direction [nm]
         z       = [11.0, 1]               #
z coordinate of apex and z component of axis direction [nm]
                                           #
apex located at point (20.0,20.0,11.0) (top of inverted pyramid)
                                           #
direction of center axis (0,0,1), i.e. along z axis
                                           #
The profile is symmetric with respect to the inverse of the direction of the center axis,
                                           # i.e. (0,0,1) will lead to the same pyramidal profile as (0,0,-1).
      }


      quaternary_trumpet{                  #
(e.g. for InGaAs quantum dots) (3D only)
         name    = "Al(x)Ga(y)In(1-x-y)As" #
quaternary material name for this region with "trumpet" alloy profile
         alloy_x = [0.2, 0.5]              #
minimum and maximum value of x content
         alloy_y = [0.1, 0.3]              #
minimum and maximum value of y content
         x       = [20.0, 0]               #
x coordinate of apex and x component of axis direction [nm]
         y       = [20.0, 0]               #
y coordinate of apex and y component of axis direction [nm]
         z       = [11.0, 1]               #
z coordinate of apex and z component of axis direction [nm]
                                           #
apex located at (20.0,20.0,11.0) (top of inverted pyramid)
                                           #
direction of center axis (0,0,1), i.e. along z axis
                                           #
The profile is symmetric with respect to the inverse of the direction of the center axis,
                                           # i.e. (0,0,1) will lead to the same trumpet profile as (0,0,-1).
         z0      = 1.25                    #
parameter to vary the shape of the alloy profile (minimum value is 1e-10)
         rho0    = 0.6                     #
parameter to vary the shape of the alloy profile (minimum value is 1e-10)
      }


analogous for quinternaries:
      quinternary_constant{ ... }          #
quinternaries
      quinternary_linear{ ... }            #
quinternaries
      quinternary_pyramid{ ... }           #
quinternaries
      quinternary_trumpet{ ... }           #
quinternaries


      integrate{                           #
spatial integration of profiles in this region.
         electron_density{}                #
integrate electron density.
         hole_density{}                    #
integrate hole density.
         piezo_density{}                   #
integrate piezo charge density.
         pyro_density{}                    #
integrate pyro charge density.
         polarization_density{}            #
integrate the polarization charges density. ( = piezo + pyro)
         label = "channel"                 #
(optional) defines meaningful label for columns in output files.
                                           #
If not defined, the number of the region is taken as a label.
      }
      
Note: Due to the finite descretization of the space, it is advised to define the region for integration slightly larger than the region of actual interest,
            especially if there is a significantly high density at the boundaries of the integration region.


      Doping profiles

      doping{
         ...
      }
 

      Generation profiles

      generation{
         ...
      }
 

Repeating regions

      The following specifiers can be used to define a periodically repeated pattern. Experimentally, a periodic geometry might have been generated by e.g. etching.
      This feature is useful for multi-quantum wells, superlattices, Quantum Cascade Lasers, Bragg reflectors, etc.
      Also, it is possible to make the number of layers a variable ($NUM_QUANTUM_WELLS) in a corresponding template.
      Please also note to adjust the grid accordingly (
grid{}), e.g. if a nonuniform grid is chosen.

Note:   array_x was previously called repeat_x{} (and max was called num with max=num-1). repeat_x is deprecated and should be replaced with array_x .
      array_x{} copies the region object. The loop runs from -shift*min to shift*max.

      array_x{                           # (optional)
         shift          = 11.0           #
repeat region in x direction by shifting it 11.0 nm (in units of [nm])
         
max            = 3              #
repeat region in x direction by applying the shift 3 (=max) times (Here, 4 regions will be set: The original one, and 3 shifted ones.)
                                         
# max = 0
does not set a repeated (=shifted) region; negative values are not allowed.
         min            = 2              #
(optional, default is 0) repeat region in negative x direction 2 times, i.e. the region object will be shifted 2 times by -shift.
                                         # min = 0
does not set a repeated (=shifted) region; negative values are not allowed.
                                         #
In this example, the region is repeated 2 (=min) times into the negative direction and 3 (=max) times into the positive direction.
      }
      array_y{                           #
(optional, 2D and 3D only)
         ... (same as array_x but for y direction)
      }
      array_z{                           #
(optional, 3D only)
         ... (same as array_x but for z direction)
      }

       
repeat_profiles = "               #
enumerate profiles to be shifted. If repeat_profiles is not defined, shift all profiles (default).
                         alloy           #
                         doping          #
                         generation      # periodic generation may be caused by having a periodic light absorbing mask
                         other           #
                        "                #
       Example:
       repeat_profiles = "alloy generation"
       If you want to shift alloy/doping/generation profiles independent of each other you have to define separate regions (region) for each, for instance a separate region for doping where you add array_x and shift.
              (==> region{ doping{...} array_x{ shift = ... }})



      For instance, two identical layers containing 16 quantum dots each, can be easily generated by specifying only one quantum dot geometry.
     
      region{
         cone{                          #
Here, the quantum dot has the shape of a cone.
            base_x     = [1.0,7.0]      #
extension of base plane in x direction, i.e. from 1.0 to 7.0 nm
            base_y     = [1.0,7.0]      #
extension of base plane in y direction, i.e. from 1.0 to 7.0 nm
            base_z     = [6.0,6.0]      #
base plane at z = 6.0 nm
            top        = [4.0,4.0,10.0] #
top coordinate of the cone (x,y,z) = (4.0,4.0,10.0) in units of [nm]
            diminution = 0.25           #
cone: diminution = 0.0, cylinder: diminution = 1.0
         }
        
Note: Exactly one of the elements base_x, base_y, and base_z has to be set by two equal numbers to define the base plane.

         ternary_linear
{
            name    = "Al(x)Ga(1-x)As"  #
AlxGa1-xAs
            alloy_x = [0.25, 1.0]       #
vary alloy composition from x = 0.25 (Al0.25Ga0.75As) to x = 1.0 (AlAs)
            z       = [10, 6]           #
vary alloy content from z = 10 nm to z = 6 nm
         }

         array_x{
            shift = 11.0   max = 3      #
repeat region in x direction by shifting it 11.0 nm (4 objects in total: The original region and 3 shifted ones.)
        
}
         array_y{
            shift = 11.0   max = 3      #
repeat region in y direction by shifting it 11.0 nm (4 objects in total: The original region and 3 shifted ones.)
        
}
         array_z{
            shift = 20.0   max = 1      #
repeat region in z direction by shifting it 20.0 nm (2 objects in total: The original region and 1 shifted one.)
        
}
         repeat_profiles{ "alloy" }
      }
     

     
There is also a second hierarchy of repetitions:
      array2_x{...} #
(optional)
      array2_y{...} #
(optional)
      array2_z{...} # (optional)
      Usage is exactly as array_x, array_y, array_z. If both are defined, all possible combinations of allowed shifts will be used (e.g. can be used to define repeated clusters of objects).

      Example

 region{
   binary{ name = "InAs" }
   array_x{  shift=20  num=5 }
   array_y{  shift=20  num=5 }
   array2_x{ shift=150 num=3 }
   array2_y{ shift=150 num=3 }
   repeat_profiles = 'other doping'

   circle{
      center{ x=100 y=100 }
      radius = 30
 
 }

   doping{
      gaussian2D{
         name = B conc=1e18 x=100 y=100 sigma_x=7 sigma_y=7 add=yes}
      }
   }
}


      For repeated structures which extend beyond the bounds of the simulation regions, please make sure that
     
min and max are large enough to also include objects which are partially outside of the simulation region.

      Note: When
periodic{...} is used, objects extending over an edge of the simulation region will not automatically be continued on the opposite side.
      If such objects are present in a periodic simulation, for each periodic coordinate direction (x, y or z), please either define a repetition
      (using the size of the simulation region as shift with
max = 1 and/or min = 1 as needed),
      or extend an already present repetition to the edge of the simulation region (by increasing
min and max as needed).

      Warning: Special care has to be taken when using remove{} or add = no for doping{}/fixed charge/generation{} in some repeated regions.
      Namely, repeated regions are created by sequentially creating multiple instances of a given region at the different positions defined by the
     
array_* and array2_* statements.
      But the order in which these instances are created depends on undocumented implementation details and thus may change from release to release.
      For additive dopants/fixed charges/generation, or for repeated regions which do not self-overlap,
      the final structure and profiles do not depend on this undocumented creation order and thus no problems will occur.
      However, for repeated regions which self-overlap (e.g. due to small region shifts),
      using
remove{} or add = no results in the final structure and profiles being dependent on that creation order and often being different from the user's intentions.
      Therefore, in case of doubt, please visually inspect your structure and profiles to avoid such issues.


   }    # region
}       # structure