Defining New Materials¶
How to define new materials for simulations with nextnano++? You may have multiple reasons for modifying your parameter database. You may like to tune some parameters to adjust the simulation to some experimental results. You are simulation for a new material or a material with not very well established parameters, so you need to explore results in the space of various values of the parameters. Your technological process produces “the same” material with slightly different parameters in various regions of your simulation, so you need to have a duplicate behaving slightly different in different areas of your simulation.
To address all of this issues you need one of two solutions either to use a keyword group database{ } in your input file or modify the database file nextnano++\Syntax\database_nnp.in. Both methods requires you to get familiar with already existing database. If you didn’t read it yet, get familiar with our Introduction to Material Database first.
Database or Input File?¶
Before introducing any modifications to the material parameters, let us answer an important question: Should the modification be done in the database file (by default nextnano++\Syntax\database_nnp.in) or in the input file?
Here are our advices on this matter. If you want to have the change for all your simulations, then this is a good approach. If you loose the original database, then you can always download it again. Be sure that you know what you are doing. If the change is meant only for one of your simulations, then you should do it in the input file. If the change is small, and you are not sure if correct, then do it in the input file. If you need the change for multiple of your simulations but not all of them, then either create a second database or add your own modified materials independently of the default ones.
The nicest practical thing about our definition of the database is that we introduced here, that it is fully consistent with the syntax of the input file.
It means that everything what you write inside the database{ } group in the input file, will behave exactly as written in the database file, e.g., in nextnano++\Syntax\database_nnp.in.
For this purpose, the modification of the nextnano++\Syntax\database_nnp.in is not discussed in this site, as whatever you can script inside the database{ }
group in your input file can be copy-pasted to the database file, e.g., at the end of the file.
Modifying an Existing Material¶
Let us assume that you would like to modify energy band gap of GaAs to a value of 1.42 eV and the average energy of valence bands to 1.26 eV. Assuming also, that you are not familiar with the syntax yet, the best approach is to open the default database file nextnano++\Syntax\database_nnp.in and find definition of the binary compound GaAs; It begins at the line 1596. Below there is a simplified piece of the referred to database.
1596binary_zb { 1597 name = GaAs 1598 valence = III_V 1599 1600 lattice_consts{ 1601 a = 5.65325 1602 a_expansion = 3.88e-5 1603 } 1604 1605 # Some other parameters 1606 1607 conduction_bands{ 1608 Gamma{ 1609 mass = 0.067 1610 bandgap = 1.519 1611 bandgap_alpha = 0.5405e-3 1612 bandgap_beta = 204 1613 defpot_absolute = -9.36 1614 g = -0.30 1615 } 1616 1617 # Some other parameters of conduction bands 1618 1619 } 1620 1621 valence_bands{ 1622 bandoffset = 1.346 1623 1624 HH{ mass = 0.51 g = -7.86 } 1625 LH{ mass = 0.082 g = -2.62 } 1626 SO{ mass = 0.172 } 1627 1628 defpot_absolute = -1.21 1629 defpot_uniaxial_b = -2.0 defpot_uniaxial_d = -4.8 1630 1631 delta_SO = 0.341 1632 } 1633 1634 # The rest of parameters 1635}
Then, you need to copy the name
attribute specifying which material is edited and all attributes relating to the parameters of interest, together with the groups and nested groups to which they belong to.
I this case, aiming only at modification of the band gap represented by an attribute bandgap
and average valence band energy represented by an attribute bandoffset
, you need to write following script in your input file.
0database{ 1 binary_zb { 2 name = GaAs 3 conduction_bands{ 4 Gamma{ 5 bandgap = 1.49 6 } 7 } 8 9 valence_bands{ 10 bandoffset = 1.26 11 } 12 } 13}
Note that all the copy-pasted script is additionally enclosed in the database{ }
group for the input file.
Exactly the same approach can be applied to modify bowing parameters. Having definition in the database as follows
3378ternary_zb { 3379 name = "In(x)Ga(1-x)As" 3380 # Here you can add or edit: 3381 # - other attributes 3382 # - ternary bowing parameters 3383} : { 3384 name = "Ga(1-x)In(x)As" 3385 # Other Attributes 3386} : { 3387 name = "Ga(x)In(1-x)As" 3388 # Other Attributes 3389} : { 3390 name = "In(1-x)Ga(x)As" 3391 # Other Attributes 3392}
you should use only the top group, the one containing parameters, for redefinition with any of four names as reference. For example, assuming that you are aiming at changing bowing parameter for spin-orbit coupling energy, you need to have
0database{ 1 ternary_zb { 2 name = "In(x)Ga(1-x)As" 3 valence_bands{ 4 delta_SO = 0.15 5 } 6 } 7}
or
0database{ 1 ternary_zb { 2 name = "Ga(1-x)In(x)As" 3 valence_bands{ 4 delta_SO = 0.15 5 } 6 } 7}
or with one of the remaining names, in your input file.
Defining a New Binary Compound or Element¶
Defining a new material is similarly simple as editing the existing one. The main difference is that you need to define all the parameters of the material. The best approach is, again, to begin with copy-pasting and existing material with crystal symmetry of your interest. After that, you can edit it such that it represents the material of your interest. It is important, that the new material is named differently than existing ones or the ones that you are using in your simulation. Otherwise you are risking overwriting materials that you do not want to overwrite. Use the new name to refer to this material. Let us assume that you are interested in having Silicon in wurtzite symmetry. The first step is to locate any wurtzite binary compound defined in the database, like the one below.
7226binary_wz { 7227 name = GaN 7228 valence = III_V 7229 # Some parameters 7230}
The second step is to rename conveniently it and give it parameters of the wurtzite Silicon.
You can also change the family to the group IV for consistency by modifying the valence
attribute.
0database{ 1 binary_wz { 2 name = Si_wz 3 valence = IV_IV 4 # All wurtzite Si parameters 5 } 6}
After you are satisfied with your definition of the new material, in most cases, it makes sense to copy-paste it back to the database file.
Remember to remove the database{ }
group while doing so.
Defining a New Alloy¶
It’s the same copy-pasting procedure as before. The best is to begin with finding a definition of the alloy that is qualitatively similar to yours - the same interpolation schemes and stoichiometric notation. Let us assume that the target alloy is Tl(x)Bi(1-x)Sb with zincblende symmetry. Then AlInAs is one of many perfect starting points to define this alloy.
3328ternary_zb { 3329 name = "Al(x)In(1-x)As" 3330 valence = III_V 3331 binary_x = AlAs 3332 binary_1_x = InAs 3333 3334 # Some bowing parameters 3335 3336} : { 3337 name = "In(1-x)Al(x)As" 3338 valence = III_V 3339 binary_x = AlAs 3340 binary_1_x = InAs 3341} : { 3342 name = "In(x)Al(1-x)As" 3343 valence = III_V 3344 binary_x = InAs 3345 binary_1_x = AlAs 3346} : { 3347 name = "Al(1-x)In(x)As" 3348 valence = III_V 3349 binary_x = InAs 3350 binary_1_x = AlAs 3351}
The first step is to create ternary definition, so it is clear how many and which components are required. All bowing parameters are taken equal zero for simplicity in the example below.
0database{ 1 ternary_zb { 2 name = "Tl(x)Bi(1-x)Sb" 3 valence = III_V 4 binary_x = TlSb 5 binary_1_x = BiSb 6 7 # No ternary bowing parameters here if all are assumed to be zero 8 9 } : { 10 name = "Bi(1-x)Tl(x)Sb" 11 valence = III_V 12 binary_x = TlSb 13 binary_1_x = BiSb 14 } : { 15 name = "Tl(1-x)Bi(x)Sb" 16 valence = III_V 17 binary_x = BiSb 18 binary_1_x = TlSb 19 } : { 20 name = "Bi(x)Tl(1-x)Sb" 21 valence = III_V 22 binary_x = BiSb 23 binary_1_x = TlSb 24 } 25}
The clones are not necessary, but useful to have. The next step, is to define binaries. Therefore, any zinc-blend binary compound needs to be copied and pasted twice with names “BiSb” and “TlSb” as these have been used in the definition of the ternary “Tl(x)Bi(1-x)Sb”.
0database{ 1 binary_zb { 2 name = BiSb 3 valence = III_V 4 # All BiSb parameters 5 } 6 binary_zb { 7 name = TlSb 8 valence = III_V 9 # All TlSb parameters 10 } 11}
Last update: nn/nn/nnnn