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

Last update: nn/nn/nnnn