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) }
The user index array is preinitialized with value 0 everywhere.
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.
![]()
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) }
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. These are put under structure{ region{} }
.
Region object shapes¶
1D:
2D:
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
.
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
andbase_y
has to be set by two equal numbers to define the base line. The same holds fortop_x
andtop_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
andbase_z
has to be set by two equal numbers to define the base plane. The same holds fortop_x
,top_y
andtop_z
to define the top line.Download example input file
here
.
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
, andbase_z
has to be set by two equal numbers to define the base plane.Download example input file
here
.
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
, andbase_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 }
andthe 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)
![]()
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)
![]()
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)
![]()
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
toshift*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. Ifrepeat_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.

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:
![]()
For repeated structures which extend beyond the bounds of the simulation regions, please make sure that
min
andmax
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.