structure{}

definition of device structure (including doping{})

Output definitions

The following syntaxes specifies the output file. These are put under structure{}.

output_region_index{}

output (last) region number and (last) material region number for each grid point

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

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

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

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 here.

This example shows how to create an incremental enumeration of regions using variables, and also how to keep identical number across clusters of regions.

../../../_images/output_user_index.png

output_alloy_composition{}

output alloy composition for each grid point

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 \([10^{18}/cm^{3}]\)

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

output_generation{}

output generation rate for each grid point in units of \([10^{18}/(cm^{3} s)]\)

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

Sturucture 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. These are put under structure{ region{} }.

Region object shapes

line{}

1D object. a line from start to end point along the specified direction

Example

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

rectangle{}

2D object, a rectangle defined by two lines along the x and y directions

Example

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

Example

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

Example

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

Example

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

Example

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 here.

../../../_images/cylinder.jpeg

trapezoid{}

2D object e.g. a simple trapezoid along the x axis

Example

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

Example

obelisk{                                # 3D object, e.g. an obelisk parallel to the (x,y) plane with top below bottom
        base_x     = [ 11, 19]          # extension of base plane in x direction, i.e. from 11 to 19 nm.
        base_y     = [ 9,  21]          # extension of base plane in y direction, i.e. from 9 to 21 nm.
        base_z     = [10, 10]           # base plane at z = 10 nm
        top_x      = [ 12, 18]          # extension of top plane in x direction, i.e. from 12 to 18 nm.
        top_y      = [ 11, 19]          # extension of top plane in y direction, i.e. from 11 to 19 nm.
        top_z      = [22, 22]           # top plane at z = 22 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 and top_z to define the top line.

Download example input file here.

../../../_images/obelisk.jpeg

hexagon_obelisk{}

3D object, an obelisk with its base and top planes given by hexagons

Example

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

Example

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

Example

semiellipsoid{                          # 3D object, e.g. a semiellipsoid parallel to the (x, y) plane with top below bottom
        base_x     = [9, 21]            # extension of base plane in x direction, i.e. from 9 to 21 nm.
        base_y     = [11,  20]          # extension of base plane in y direction, i.e. from 11 to 20 nm.
        base_z     = [10, 10]           # base plane at z = 10 nm
        top        = [11, 15, 24]       # top coordinate of the semiellipsoid (x,y,z) = (11,15,24) 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.

Download example input file here.

../../../_images/semiellipsoid.jpeg

cone{}

3D object, e.g. a cone parallel to the (x,z) plane

Example

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

Example

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.

Example

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.)

Example

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.

Example

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.)

Example

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.

Example

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.)

Example

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.)
}

Note

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{}

Example

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{}

Example

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{}

Example

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}
}

Note

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

Example

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 definitions

contact{}

Example

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 definitions

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{}

binary material

Example

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

ternary_constant{}

ternary material with constant alloy profile

Example

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{}

ternary material name which varies linearly along the line from start to end point

Example

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.
}

(3D quantum dot)

../../../_images/dot_alloy_linear.jpg

ternary_pyramid{}

ternary material name with pyramidal alloy profile

Example

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]      # c_{min} and c_{max} 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 = c_{min} + ( c_{max} - c_{min} ) \cos^2\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.

(3D quantum dot)

../../../_images/dot_alloy_inverted_pyramid.jpg

ternary_trumpet{}

ternary material with “trumpet” alloy profile

Example

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]        # :math:`c_{min}` and :math:`c_{max}` 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 = c_{min} + ( c_{max} - c_{min} ) \exp [ ( - \sqrt{x^2 + y^2} \exp(-z_1/z_0) ) / \rho_0 ]\)

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.

(3D quantum dot)

../../../_images/dot_alloy_trumpet.jpg

ternary_import{}

ternary material which uses imported alloy profile

Example

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{}

quaternary material which uses imported alloy profile

Example

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{}

quinternary material which uses imported alloy profile

Example

quinternary_import{
        ...                                   # analogous for quaternaries:
}

quaternary_constant{}

quaternary material with constant alloy profile

Example

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)
}

Note

For quaternaries of type AxByC1-x-yH, \(x + y \le 1\) must hold.

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{}

quaternary material with linear alloy profile

Example

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{}

quaternary material with pyramid alloy profile

Example

   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{}

quaternary material with “trumpet” alloy profile

Example

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{}

quinternary_linear{}

quinternary_pyramid{}

quinternary_trumpet{}

integrate{}

spatial integration of profiles in the region.

Example

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 and generation rate profile

In each region, we can specify the doping profile and genetation rate profile. These features are explained below:

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{}, array_y{}, array_z{}

These copy the region object. The loop runs from -shift*min to shift*max.

Example

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

repeat_profiles specifies which profiles are shifted. If repeat_profiles is not defined, shift all profiles (default).

Example

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           #
                  "               #

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.

../../../_images/dotarray_small.jpg
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" }
}

array2_x{}, array2_y{}, array2_z{}

These are the 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}
                }
        }
}

This produces the following:

../../../_images/array_x2_example.png

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.