Atomistix ToolKit Manual

Atomistix ToolKit
Manual
Version 2009.06
Atomistix ToolKit: Manual
Version 2009.06
Copyright © 2009 QuantumWise A/S
Atomistix ToolKit License to Use Agreement
Licensor
QuantumWise A/S
Nørre Søgade 27A, 1.th
Copenhagen
DK-1370
Denmark
<[email protected]>
Introduction
Each complete package, including Atomistix Virtual NanoLab(R), Atomistix ToolKit(R) and related documentation, is referred to collectively as the
“Software”. The term “use” refers to the loading of the Software into computer memory, or the running of the Software in a CPU. The term “Install” refers
to the copying of the Software to a specific location on a machines hard drive. “License Features” are defined as the features in the FLEXlm license file.
“Licensee” is defined as the end user of the Software.
BY INSTALLING THIS SOFTWARE LICENSEE AGREES TO THE TERMS OF THIS AGREEMENT WHICH WILL BIND LICENSEE AND ITS EMPLOYEES.
IF LICENSEE DOES NOT AGREE TO THE TERMS OF THIS AGREEMENT, LICENSOR IS UNWILLING TO LICENSE THE SOFTWARE TO LICENSEE AND
LICENSEE MUST DISCONTINUE INSTALLATION OF THE SOFTWARE NOW. IN THIS CASE LICENSEE MUST IMMDEDIATELY DISCONTINUE THE
DOWNLOADING PROCESS OR (IF APPLICABLE) IMMEDIATELY RETURN THE MEDIUM ON WHICH THE SOFTWARE IS STORED AND ALL ACCOMPANYING DOCUMENTATION TO THE RETAILER WHERE IT WAS PURCHASED TOGETHER WITH PROOF OF PAYMENT.
1. Delivery
Licensor distributes the Software in electronic form from its website. Upon request, Licensor will ship the Software to the Licensee on other media.
The additional costs of such an arrangement will be covered by the Licensee alone.
2. Grant and scope of license
Subject to Licensees compliance with the terms of this Agreement Licensor hereby grants a non-exclusive, non-transferable license to the Licensee
to install and use the Software on a network server (floating license) or on an individual workstation computer (node-locked license) for a specified
period of time, as indicated in the accompanying license file.
With a floating license the Licensee is granted the right to run the software according to the individual number of each “License Feature” on any
computer in the network during the time period determined in the license file.
With a node-locked license the Licensee is granted the right to use the software on 1 cpu on 1 workstation, during the time period determined in the
license file.
Part of this software is covered by other licenses. Where relevant, these are enclosed in the installation in their original form, in conjunction with the
software component they refer to.
3. Restrictions
a. The Licensee may not lease, sub-license, rent, loan, translate, merge, adapt vary, modify or otherwise exploit the Software other than for the
Licensees internal business purposes. In case of an academic or non-profit license, the Licensee may use the Software exclusively for non-profit
research.
b. The Licensee may not de-compile, reverse engineer, or disassemble the Software, or otherwise reduce it to a human-perceivable form.
c. The Licensee may not incorporate, or let others incorporate, the Software, in part or in whole, into another program that may reasonably be
considered to constitute, in part or in whole, directly or indirectly, now or in the future, a potential competitor to the licensed Software.
d. The Licensee may only copy the Software as part of backup and maintenance of the Licensees computer. These archive copies may not be in use
at any time and must remain in the possession and control of the Licensee.
e. Under no circumstances may the Licensee publish anything based on a trial license.
f. The Licensee undertakes to supervise and control the use of the Software and ensure that the Software is used in accordance with the terms of this
Agreement by Licensees employees.
g. Licensee must permit the Licensor and its representatives, at all reasonable times and on reasonable advance notice, to inspect and have access
to any premises, and to the computer equipment located there, at which the Software is being kept or used, and any records kept pursuant to this
Licence, for the purpose of ensuring that you are complying with the terms of this Agreement.
4. Intellectual Property Rights
a. Licensee acknowledges that all intellectual property rights in the Software throughout the world belong to the Licensor, that rights in the Software
are licensed (not sold) to Licensee, and that Licensee has no rights in, or to, the Software other than the right to use it in accordance with the terms
of this Agreement.
b. Licensee acknowledges that it has no right to have access to the Software in source code form or in unlocked coding or with comments.
c. The integrity of this Software is protected by technical protection measures (TPM) so that the intellectual property rights, including copyright, in
the Software of the Licensor are not misappropriated. Licensee must not attempt in any way to remove or circumvent any such TPM, nor to apply,
manufacture for sale, hire, import, distribute, sell, nor let, offer, advertise or expose for sale or hire, nor have in your possession for private or
commercial purposes, any means whose sole intended purpose is to facilitate the unauthorised removal or circumvention of such TPM.
5. Warranty
Licensor expressly disclaims all warranties, expressed and implied to the extent permissible by mandatory law. The Licensee expressly acknowledges
and agrees that (i) the Software has not been developed to meet Licensees individual requirements and that it is therefore Licensees responsibility to
ensure that the facilities and functions of the Software as described in any pertaining documentation meet its requirements and (ii) that use of the
Software is at the Licensees sole risk. The Software and related documentation are provided “as is”, without warranty of any kind. No oral or written
information or advice given by Licensor) or by any of its representatives shall create or imply a warranty.
6. Liabilities
a. Under no circumstances shall Licensor or its directors, representatives, employees, or agents, be liable for any loss including but not limited to
loss of income, loss of business profits or contracts, business interruption, loss of information, loss of opportunity, goodwill or reputation, loss of,
damage to or corruption of data unless such loss is attributable to Licensors fraud [or gross negligence]. Licensor, its directors, representatives,
employees, and agents shall not be liable for any incidental, indirect, special or consequential damages arising out of the use, misuse or inability
to use the Software howsoever arising. In no event shall the total liability of Licensor to the Licensee exceed the amount paid by the Licensee for
the Software.
b. This Licence sets out the full extent of the Licensors obligations and liabilities in respect of the supply of the Software. In particular, there are no
conditions, warranties, representations or other terms, express or implied, that are binding on the Licensor except as specifically stated in this
Licence. Any condition, warranty, representation or other term concerning the supply of the Software which might otherwise be implied into, or
incorporated in, this Licence, or any collateral contract, whether by statute, common law or otherwise, is hereby excluded to the fullest extent
permitted by law.
7. Termination
The Licensor may terminate this Agreement immediately by written notice to Licensee if
a. Licensee commits a breach of any provision of this Agreement; or
b. the Licensee becomes insolvent or unable to pay its debts, enters into liquidation, whether voluntary or compulsory (other than for reasons of bona
fide amalgamation or reconstruction), passes a resolution for its winding-up, has a receiver or administrator manager, trustee, liquidator or similar
officer appointed over the whole or any part of its assets, makes any composition or arrangement with its creditors or takes or suffers any similar
action in consequence of its debt, or becomes unable to pay its debts.
Upon termination for any reason:
a. all rights granted to Licensee under this Licence shall cease;
b. Licensee must cease all activities authorised by this Agreement;
c. Licensee must immediately pay to the Licensor any sums due to the Licensor under this Agreement; and
d. Licensee must immediately delete or remove the Software from all computer equipment in its possession and immediately destroy or return to the
Licensor (at the Licensors option) all copies of the Software then in its possession, custody or control and, in the case of destruction, certify to the
Licensor that it has done so.
8. Transfer of rights and obligations
a. This Agreement is binding on Licensee and Licensor and on Licensors respective successors and assigns.
b. Licensee may not transfer, assign, charge or otherwise dispose of this Agreement, or any of Licensees rights or obligations arising under it, without
Licensors prior written consent.
c. The Licensor may transfer, assign, charge, sub-contract or otherwise dispose of this Agreement, or any of his rights or obligations arising under it,
at any time during the term of the Agreement.
9. Force majeure
The Licensor will not be liable or responsible for any failure to perform, or delay in performance of, any of his obligations under this Agreement that
is caused by an event outside its reasonable control (Force Majeure Event).
A Force Majeure Event includes any act, event, non-happening, omission or accident beyond Licensors reasonable control and includes in particular
(without limitation) the following:
a. strikes, lock-outs or other industrial action;
b. civil commotion, riot, invasion, terrorist attack or threat of terrorist attack, war (whether declared or not) or threat or preparation for war;
c. fire, explosion, storm, flood, earthquake, subsidence, epidemic or other natural disaster;
d. impossibility of the use of railways, shipping, aircraft, motor transport or other means of public or private transport;
e. impossibility of the use of public or private telecommunications networks;
f. the acts, decrees, legislation, regulations or restrictions of any government.
The Licensors performance under this Agreement is deemed to be suspended for the period that the Force Majeure Event continues, and Licensor will
have an extension of time for performance for the duration of that period. Licensor will use its reasonable endeavours to bring the Force Majeure
Event to a close or to find a solution by which Licensors obligations under this Agreement may be performed despite the Force Majeure Event.
1 Waiver
0.
a. If the Licensor fails, at any time during the term of this Licence, to insist on strict performance of any of the Licensees obligations under this
Agreement, or if the Licensor fails to exercise any of the rights or remedies to which it is entitled under this Agreement, this shall not constitute a
waiver of such rights or remedies and shall not relieve Licensee from compliance with such obligations.
b. A waiver by the Licensor of any default shall not constitute a waiver of any subsequent default.
c. No waiver by the Licensor of any of these terms and conditions shall be effective unless it is expressly stated to be a waiver and is communicated
to Licensee in writing.
1 General
1.
a. This Agreement and any document expressly referred to in it represents the entire agreement between Licensor and Licensee in relation to the
licensing of the Software and supersedes any prior agreement, understanding or arrangement between Licensor and Licensee, whether oral or in
writing.
b. If any term or provision of this agreement shall be found to be illegal or unenforceable, then, notwithstanding that term, all other terms of this
Agreement will remain in full force and effect.
c. The laws of Denmark will govern this Agreement in all respects. The Copenhagen Maritime and Commercial Court will adjudicate all disputes
arising in connection with this agreement. The Licensee acknowledges and agrees that this clause will supersede any conflicting standard clauses,
terms, or similar rules that the Licensee may otherwise apply in agreements.
Additional copyrights
Part of this software is covered by other licenses. Where relevant, these are enclosed in the installation in their original form, in conjunction with the
software component they refer to.
The license management portion of this software is based on: SentinelRMS*, ©1989-2006 SafeNet, Inc. All rights reserved. Sentinel is a registered*
trademark of SafeNet, Inc.
TABLE OF CONTENTS
1. Introduction ............................................................................................................ 1
Preface ............................................................................................................... 1
Introduction to NanoLanguage .............................................................................. 2
How To Read This Manual ................................................................................... 4
Moving On ......................................................................................................... 5
2. The ATK-SE Package ................................................................................................ 7
Introduction ........................................................................................................ 7
Quick Tour ......................................................................................................... 7
Background Information ..................................................................................... 23
3. External Calculators ............................................................................................... 67
Introduction ...................................................................................................... 67
GPAW .............................................................................................................. 67
4. NanoLanguage Reference Manual ........................................................................... 69
Geometry ......................................................................................................... 69
Calculators ....................................................................................................... 69
Analysis ............................................................................................................ 70
Bravais Lattices .................................................................................................. 70
IO .................................................................................................................... 71
Periodic Table ................................................................................................... 71
Physical quantities and units ............................................................................... 71
5. Appendix .............................................................................................................. 73
What is New in NL 2009.06 ............................................................................... 73
Python basics .................................................................................................... 74
Python Packages in NanoLanguage ..................................................................... 86
Bibliography ............................................................................................................. 89
I. Core NanoLanguage elements .................................................................................. 91
MoleculeConfiguration ...................................................................................... 93
BulkConfiguration ............................................................................................. 95
DeviceConfiguration .......................................................................................... 99
BoxRegion ....................................................................................................... 103
HuckelCalculator ............................................................................................. 105
DeviceHuckelCalculator ................................................................................... 107
IterationControlParameters ................................................................................ 111
NumericalAccuracyParameters .......................................................................... 115
HuckelBasisParameters ..................................................................................... 117
SlaterOrbital .................................................................................................... 121
DoubleContourIntegralParameters ...................................................................... 123
Poisson Solvers ................................................................................................. 127
MultigridSolver ................................................................................................. 129
SelfEnergyCalculators ........................................................................................ 131
DirectSelfEnergy ............................................................................................... 133
RecursionSelfEnergy ......................................................................................... 135
KrylovSelfEnergy .............................................................................................. 137
MolecularEnergySpectrum ................................................................................. 139
ElectronDifferenceDensity ................................................................................. 141
ElectrostaticDifferencePotential .......................................................................... 145
TransmissionSpectrum ...................................................................................... 147
Bandstructure ................................................................................................... 153
BravaisLattice ................................................................................................... 155
nlread ............................................................................................................. 161
nlsave ............................................................................................................. 163
nlprint ............................................................................................................. 165
PeriodicTable ................................................................................................... 167
v
Index ....................................................................................................................... 173
vi
CHAPTER 1. INTRODUCTION
PREFACE
This manual describes the new QuantumWise version of the Atomistix ToolKit, ATK. ATK is a
set of atomic-scale simulators, so-called calculators that can calculate properties of nano-scale
systems. This first QuantumWise version of ATK, only includes semi-empirical calculators, implemented in the module Atomistix ToolKit Semi-Empirical(ATK-SE). In future versions, ATK
will also include Density Functional Methods.
The input format for ATK is NanoLanguage which is an extension to the Python scripting language. Compared to the previous version ATK-2008.10, the NanoLanguage syntax has been
extended and slightly modified to provide better support for the use of different calculators.
ATK supports simulations of isolated systems (molecules), periodic systems (crystals), and systems of the type bulk-nanodevice-bulk (device systems). In this new version, it is also possible
to include continuum dielectric and metallic regions for all system types. For device systems, it
is thus possible to calculate current-voltage characteristics of nano-scale transistors, i.e. systems
where a number of electro-static gates are controlling the source-drain current.
Figure 1.1: A typical device system, consisting of a z-shaped Graphene Nano Ribbon, on top of a dielectric
and controlled by three metallic gates. The contour plot illustrates the electrostatic potential through the
system. The unique capability of ATK is its ability to study the electron transport through such types of
systems. The current version supports device systems with two electrodes, and gate electrodes are included
as non current carrying electro-static gates. The underlying algorithms are readily extended to multi-probe
systems; support for device systems with several current carrying electrodes are projected in future
versions.
1
Introduction
INTRODUCTION TO NANOLANGUAGE
WHAT IS NANOLANGUAGE?
NanoLanguage is the scripting Language that binds all QuantumWise products together, and is
a platform on which other developers and companies can build applications and extend the
functionality of QuantumWise products. In the following sections, we will try to explain some
of the idea's behind NanoLanguage; users familiar with NanoLanguage may consult the section
called “What is New in NL 2009.06” .
Put shortly, NanoLanguage is a new way of thinking scientific computing, combining the
strength of flexible object-oriented scripting interfaces (known from Mathematica and MATLAB)
with sophisticated high performance scientific computing algorithms. The goal is to enable
scientists to efficiently extend, specialize and combine methods to calculate nanoscale properties of matter, including density functional theory, semi-empirical tight-binding, classical
potentials, as well as various quantum-chemical methods.
NanoLanguage admits both low and high level detailed control of the computer simulations.
At the high level, it offers a common interface for setting up complex atomic-scale simulations
and analyzing the results. On the lower level, it provides an interface to the low-level functionality in ATK.
NanoLanguage is built on top of Python, a powerful and well-established interpreted programming language, and thus includes basic programming constructions, as well as support for
efficient manipulations of e.g. numerical array data. It is therefore an ideal tool for automating
series of batch simulations where geometric, material, and other parameters are to be optimized.
NanoLanguage allows scientists to express models of nature in a common language without the
need to re-implement already developed algorithms, and facilitates third-party development of
new functionality on top of the ATK platform. Such functionality may consist of new atomicscale modeling methodologies, tailored semi-empirical methods, or complex post-processing
methods for calculating new quantities from the fundamental simulation results.
BENEFITS OF NANOLANGUAGE
With a Python interface, the user is immediately offered all kinds of extended functionality out
of the box. This list could be made very long, and below we will just highlight some of the most
important advantages and features of NanoLanguage. First, however, it is necessary to clearly
define where “NanoLanguage” fits into this concept. That is, how is NanoLanguage related to,
or different from, Python itself.
From a programming language point of view, ATK is just a Python interpreter. That is, the syntax
is the same as in Python, and the entire behavior of the ATK application will therefore be as
close as possible to any other Python interpreter.
NanoLanguage further extends a standard Python environment with concepts and objects relevant for quantum physics and chemistry. That is, in NanoLanguage there is a periodic table
containing elements, units such as Rydberg and Angstrom, methods for calculating the oneelectron spectrum of a molecules, band-structure of solids, transmission spectra of nano-scale
devices as well of constructors for creating molecules, Bravais lattices, and nano-scale devices.
Among many other things, NanoLanguage offers you
2
Benefits of NanoLanguage
CONTROL
Using a programming language gives the user control of the program execution path, as opposed
to program using a text based input file. For instance, performing calculations of current-voltage
characteristics with different gate potentials and using combinations of self consistent potentials
from previous runs as initial guess, can easily be defined in the input file. Other tasks as defining
tight binding parameters, optimizing semi-empirical parameters based on reference calculations, or performing relaxations are planned to be in open source python modules which can
easily be modified or extended.
TRANSPARENCY
By delivering parts of the end-user functionality in the form of open scripts, NanoLanguage offers
a software transparency, giving the user increased insight as to what actually goes on inside the
program. As a consequence, the user will also have the ability to tweak the behavior, or define
new functionality within a given framework. Also, no operations are performed unless the user
requests them. Obviously this saves time, but it also makes the scripts much more self-documenting. This is also reflected in more low-level details such as that all physical quantities must
be defined with a unit. Again, this is related to transparency; nothing is implicit (and hence
subject to misunderstandings or oversights).
EXTENDABLE FUNCTIONALITY
Given the native capabilities of Python, users have the chance to extend the functionality of
NanoLanguage. On the simplest level, this can be in the form of small functions performing
routine tasks, or loops for simplifying automation (calculating the properties of a bulk sample
for a range of lattice constants, for instance). A more advanced application could be to define
entire classes to represent complex geometries (such as a nanotube).
ACCESS
NanoLanguage gives access to data, such as the electron difference density, in native Python
types (basically, numerical arrays). This, for example, enables you to perform integration over
the plane perpendicular to the transport direction to plot the effective potential along the transport axis in a two-probe system, or make cut-lines in the data. Later on, it will also be possible
to access individual elements of the density matrix and other core constituents of the calculation
through native Python types. This will allow for a multitude of user-defined analysis options,
which in many cases can be defined and delivered as open scripts, instead of core functionality
with a rigid interface.
PYTHON
In addition to the features of NanoLanguage mentioned above, we would also like to highlight
some of the specific advantages offered by using Python as the platform for ATK.
• Python is fully programmable, mature, modern object-oriented programming language.
• The Python syntax is very powerful, yet surprisingly simple to learn. It is similar to other wellknown languages such as C, but requires less unnecessary typing (in particular compared to
e.g. Perl) and gives a better structural overview via its indentation scheme.
• There are several standard Python modules which are of particular relevance for scientific
applications. As the most notable example, we can mention the fast handling of large data
arrays obtained via the NumPy package.
3
Introduction
• Since Python is inherently modularized, it will be much easier to modularize ATK. In particular, this offers great simplifications in order for users to develop their own extensions to the
basic ATK package.
• Python is an interpreted language, which could be used as an argument against it, for performance reasons. However, ATK takes advantage of the rich possibilities to couple Python
with efficient code written in C, C++, or Fortran, and all performance-critical operations are
carried out in compiled libraries, including the possibility to run in parallel. Therefore, Python, as an interpreted language, gains an advantage as it can be used interactively without
compromising the power and speed of a compiled program.
• Since the language is interpreted, the source code is, with minor exceptions, automatically
cross-platform compatible.
• Python comes with “batteries included”, meaning that you can perform a very large variety
of operations out of the box.
• On the more technical level, dynamical type-checking and name resolution are major benefits for the flexibility of the code.
For more information about Python, see the Python website. Also, we highly recommend the
Wikipedia page on Python which contains a large number of links for further reading.
HOW TO READ THIS MANUAL
In this manual, you will find a few simple examples on how to use ATK that should get you
started, for more detailed examples of usage we are planning a number of tutorials that will be
available from our website. The main purpose of the manual is to give a reference to the NanoLanguage input format. A detailed summary of all input and output parameters and available
NanoLanguage commands can be found in the alphabetically ordered Reference manual index.
This manual contains several ATK script examples, as well as in-line text references to ATK and
Python objects and functions. To ease the reading of these, we use the following style and link
conventions
• All ATK objects and functions are type set as links in bold face monospace. For example, the
object “HuckelCalculator” will appear as HuckelCalculator. Click on the link, and you will
be taken to the relevant section of the reference manual, where a detailed description of the
object “HuckelCalculator” is provided.
• More information for using basic Python constructions are provided in a separate chapter
Python basics. References to this chapter, for example regarding Python for loops and tuples, are given directly in the manual pages.
• In the HTML version of this manual, all script examples are syntax highlighted, for example
All ATK elements are color highlighted as in
MoleculeConfiguration
Python structures are type set as in
from and import
whereas script comments are displayed as
4
Moving On
# This is a comment
Beneath each script example, a link is provided in the right margin. Use this to download your
own copy of the displayed script.
MOVING ON
Before you start using ATK, we suggest that you consult the section Introduction to NanoLanguage for a presentation of all the novel concepts and features available in NanoLanguage.
Once you feel up to learning more advanced techniques for handling molecular, bulk, and twoprobe structures, you may dive into to the quick tour of the ATK-SE package.
Remember to visit our website for updates both to the manual and the software
5
6
CHAPTER 2. THE ATK-SE PACKAGE
INTRODUCTION
The Atomistix ToolKit - Semi-Empirical (ATK-SE) program can model the electronic properties
of closed and open quantum systems using both self-consistent and non-self-consistent tightbinding models. In the first version, the implemented tight-binding model is based on the
extended-Hückel model
The key parameter in the self-consistent loop is the density matrix. For open systems, the density
matrix is calculated using non-equilibrium Green's functions, while for closed or periodic systems it is calculated by diagonalization of Hamiltonian. The Density Matrix defines the electron
density, and the electron density sets up an electrostatic potential, i.e. the Hartree potential. The
Hartree potential is obtained by solving the Poisson equation in real space. In the section called
“Background Information”, we describe the mathematical formalism behind the extendedHückel Model.
QUICK TOUR
In the first part of this quick tour, we present a calculation of the band structure of a graphene
nano-ribbon using a self-consistent extended-Hückel Model. In the second part we will set up
a nano-ribbon device with a gate and calculate the transmission coefficient as a function of the
gate potential and the applied bias.
BANDSTRUCTURE OF A GRAPHENE NANO-RIBBON
In this section, we will build a NanoLanguage script for calculating the Band structure of a
graphene nano-ribbon with the ATK-SE package. The script contains three parts,
• defining the geometry
• specifying the extended-Hückel calculator
• performing the calculation and the analysis
In the following we go through these different parts of the script in detail.
SPECIFYING THE GEOMETRY OF THE NANO-RIBBON
In this section, we will setup a one-dimensional structure of carbon atoms, a so-called zigzag
edged graphene nano-ribbon. Figure 2.1 shows the structure of the system.
7
The ATK-SE Package
Figure 2.1: Unit cell with the graphene nano-ribbon visualized with VNL. The contour plot shows the
electro-static potential. The structure is periodic along the C-direction.
The input script for the geometry consists of a specification of the unit cell vectors, the atom
types, and the atom basis within the unit cell.
from NanoLanguage import *
#------------------------------------------------------------# Bulk configuration
#------------------------------------------------------------# Set up lattice
vector_a = [19.3063, 0.0, 0.0]*Angstrom
vector_b = [0.0, 10.0, 0.0]*Angstrom
vector_c = [0.0, 0.0, 2.4610017104423147]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)
# Define elements
elements = [Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
Hydrogen, Hydrogen]
# Define coordinates
cartesian_coordinates = [[
[
[
[
[
[
[
[
[
[
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
,
,
,
,
,
,
,
,
,
,
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
# Set up configuration
bulk_configuration = BulkConfiguration(
bravais_lattice=lattice,
elements=elements,
cartesian_coordinates=cartesian_coordinates
)
The first line in the script
from NanoLanguage import *
8
,
,
,
,
,
,
,
,
,
,
0.61525043],
1.84575128],
1.84575128],
0.61525043],
0.61525043],
1.84575128],
1.84575128],
0.61525043],
0.61525043],
0.61525043]]*Angstrom
Bandstructure of a Graphene Nano-ribbon
specifies that the ATK python interpreter nlpython should load the NanoLanguage package. The
following lines specify the input geometry through the use of the BulkConfiguration keyword.
Note, the use of length unit when specifying the cell vectors and input coordinates.
By saving the NanoLanguage script into a file, it is possible to import the structure into VNL and
visualize it with the Nanoscope as illustrated in Figure 2.1
SETTING UP THE HÜCKEL CALCULATOR
The next task is to specify the calculation method that should be used for describing the electronic structure of the system. We will use an extended-Hückel calculator, specified by the
HuckelCalculator keyword. The calculator takes a number of parameters specifying the details of the calculation. In the following, we only specify a few of these parameters; when no
parameters are specified, the calculator uses default settings.
#------------------------------------------------------------# Calculator
#------------------------------------------------------------basis_set = [
CerdaHuckelParameters.Carbon_graphite_Basis,
CerdaHuckelParameters.Hydrogen_C2H4_Basis,
]
numerical_accuracy_parameters = NumericalAccuracyParameters(
electron_temperature=300.0*Kelvin,
k_point_sampling=(1,1,50)
)
calculator = HuckelCalculator(
basis_set=basis_set,
numerical_accuracy_parameters=numerical_accuracy_parameters
)
bulk_configuration.set_calculator(calculator)
To obtain good accuracy, the extended-Hückel calculator requires a set of modelling parameters
optimized for structures not too different from the structure under investigation. The ATK-SE
packages comes with the original Hoffmann-Hückel parameters, which are optimized for studying molecular structures. We will use these parameters for describing Hydrogen and which is
specified through the keyword HoffmannHuckelParameters.Hydrogen_Basis.
For carbon, we will use parameters optimized for modelling the electronic structure of graphene.
The parameters are obtained from the website of J. Cerda.. These parameters were fitted to the
GGA band structure of graphene calculated with a spd localized basis set. Here the basis set
parameters are specified through the HuckelBasisParameters keyword.
In the last line we attach the HuckelCalculator to the BulkConfiguration. Now we can
inquire the BulkConfiguration about the properties, such as the electron density, which can be
calculated with the HuckelCalculator. In the following, we will look into some of the BulkConfiguration properties which can be calculated with the Hückel calculator.
SPECIFYING THE BAND-STRUCTURE CALCULATION
In the first line of the analysis part of the script shown below, we inquire about the electron
density of the bulk configuration. The bulk configuration will now use the attached calculator
for calculating its electron density. To calculate the electron density we need the self-consistent
state of the calculator, and at this point a self-consistent calculation is performed. The Bulk
configuration stores the self-consistent state and will use it for the remainder of the analysis part.
9
The ATK-SE Package
The electron density as well as the electrostatic potential and atomic configuration are saved
into the file nanowire_band.nc. This file can be visualized with VNL. Note that the electron
density for the Hückel Model is defined in ATK-SE as the electron difference density, i.e. the
electron density relative to neutral atoms. The electrostatic potential is defined as the corresponding difference Hartree potential.
#------------------------------------------------------------# Analysis
#------------------------------------------------------------filename= 'nanowire_band.nc'
difference_density = ElectronDifferenceDensity(bulk_configuration)
nlsave(filename, difference_density)
electrostatic_potential = ElectrostaticDifferencePotential(bulk_configuration)
nlsave(filename, electrostatic_potential)
nlsave(filename, bulk_configuration)
bandstructure = Bandstructure(
configuration=bulk_configuration,
route=['G', 'Z'],
points_per_segment=20,
bands_above_fermi_level=None
)
nlsave(filename, bandstructure)
The last part of the analysis is the band-structure calculation. This is done using the Bandstructure class. The route of the band structure within the Brillouin Zone is specified through
the symmetry points. The symmetry points are a property which can be retrieved from the
BravaisLattice of the BulkConfiguration. In this case, the energy bands will be sampled
using twenty points along the - direction. The band structure is subsequently stored in the
file nanowire_band.nc; this file can also be visualized with VNL.
THE COMPLETE BAND STRUCTURE CALCULATION SCRIPT
Below we show the complete script for the extended-Hückel Bandstructure calculation of the
graphene nano-ribbon.
from NanoLanguage import *
#------------------------------------------------------------# Bulk configuration
#------------------------------------------------------------# Set up lattice
vector_a = [19.3063, 0.0, 0.0]*Angstrom
vector_b = [0.0, 10.0, 0.0]*Angstrom
vector_c = [0.0, 0.0, 2.4610017104423147]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)
# Define elements
elements = [Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
Hydrogen, Hydrogen]
# Define coordinates
cartesian_coordinates = [[
[
[
[
[
[
[
[
[
10
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
,
,
,
,
,
,
,
,
,
5.
5.
5.
5.
5.
5.
5.
5.
5.
,
,
,
,
,
,
,
,
,
0.61525043],
1.84575128],
1.84575128],
0.61525043],
0.61525043],
1.84575128],
1.84575128],
0.61525043],
0.61525043],
Bandstructure of a Graphene Nano-ribbon
[ 14.3063
,
5.
,
0.61525043]]*Angstrom
# Set up configuration
bulk_configuration = BulkConfiguration(
bravais_lattice=lattice,
elements=elements,
cartesian_coordinates=cartesian_coordinates
)
#------------------------------------------------------------# Calculator
#------------------------------------------------------------basis_set = [
CerdaHuckelParameters.Carbon_graphite_Basis,
CerdaHuckelParameters.Hydrogen_C2H4_Basis,
]
numerical_accuracy_parameters = NumericalAccuracyParameters(
electron_temperature=300.0*Kelvin,
k_point_sampling=(1,1,50)
)
calculator = HuckelCalculator(
basis_set=basis_set,
numerical_accuracy_parameters=numerical_accuracy_parameters
)
bulk_configuration.set_calculator(calculator)
#------------------------------------------------------------# Analysis
#------------------------------------------------------------filename= 'nanowire_band.nc'
difference_density = ElectronDifferenceDensity(bulk_configuration)
nlsave(filename, difference_density)
electrostatic_potential = ElectrostaticDifferencePotential(bulk_configuration)
nlsave(filename, electrostatic_potential)
nlsave(filename, bulk_configuration)
bandstructure = Bandstructure(
configuration=bulk_configuration,
route=['G', 'Z'],
points_per_segment=20,
bands_above_fermi_level=None
)
nlsave(filename, bandstructure)
By clicking the link below the script, the script can be stored on your computer, and then
executed using the command
nlpython nanowire_band.py
The command performs a self-consistent calculation of the Carbon nanowire and saves the
analysis results to the file nanowire_band.nc. This file can be visualized with VNL. The result
of the visualization is illustrated in Figure 2.1 and Figure 2.2.
11
The ATK-SE Package
Figure 2.2: The bandstructure of the carbon nano-ribbon calculated within the extended-Hückel model.
PROPERTIES OF A NANO-RIBBON TRANSISTOR
We will now setup a device system consisting of a graphene nano ribbon, with a gate potential
and an applied bias potential, and then calculate the transmission spectrum. The structure of
the system is illustrated in Figure 2.3. Again, we divide the discussion into three parts
• setting up the geometry
• defining the calculator
• performing the analysis
12
Properties of a Nano-ribbon Transistor
Figure 2.3: The geometry of the graphene nano-ribbon device visualized with VNL. The device consists
of a left and a right electrode with tubes illustrating the unit cells of these bulk configurations. The central
region is located in between the two electrodes. Within the central region there is a dielectric region (brown
transparent region) and below this an electro-static gate. The contour plot shows the electro-static potential
for a gate potential of 1 Volt and a bias across the nano-ribbon of 0.2 Volt.
SETTING UP THE DEVICE CONFIGURATION
The DeviceConfiguration consists of a central region and a number of electrode regions. All
are object of the type BulkConfiguration. For the present geometry, we have two electrodes,
a left and a right, which is a so-called two-probe system. Currently, only two-probe systems are
supported in ATK-SE, but future extensions with support for one-probe and multi-probe systems
are planned.
Compared to the previous band-structure calculation, the electrode configurations have twice
as many atoms within the unit cell. This is because the structures are repeated twice along the
C-direction. For the electrodes to be valid configurations, they must be periodic along the C
direction and only have matrix elements with the neighbouring cell, i.e. the interaction range
of the attached calculator should be comparable or less than the lattice constant along the C
direction.
In the following script we set up an ideal graphene nano-ribbon two probe device
from NanoLanguage import *
# -------------------------------------------------------------------# electrodes
# -------------------------------------------------------------------# Set up lattice
vector_a = [19.3063, 0.0, 0.0]*Angstrom
vector_b = [0.0, 15.0, 0.0]*Angstrom
vector_c = [0.0, 0.0, 4.9220034208846295]*Angstrom
electrode_lattice = UnitCell(vector_a, vector_b, vector_c)
# Define elements
electrode_elements = [Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
Hydrogen, Hydrogen, Carbon, Carbon, Carbon, Carbon, Carbon,
Carbon, Carbon, Carbon, Hydrogen, Hydrogen]
13
The ATK-SE Package
# Define coordinates
electrode_coordinates = [[
6.101
,
5.
[ 6.81143
,
[ 8.23229
,
[ 8.94272
,
[ 10.36358
,
[ 11.07401
,
[ 12.49487
,
[ 13.2053
,
[ 5.
,
[ 14.3063
,
[ 6.101
,
[ 6.81143
,
[ 8.23229
,
[ 8.94272
,
[ 10.36358
,
[ 11.07401
,
[ 12.49487
,
[ 13.2053
,
[ 5.
,
[ 14.3063
,
,
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
0.61525043],
,
1.84575128],
,
1.84575128],
,
0.61525043],
,
0.61525043],
,
1.84575128],
,
1.84575128],
,
0.61525043],
,
0.61525043],
,
0.61525043],
,
3.07625214],
,
4.30675299],
,
4.30675299],
,
3.07625214],
,
3.07625214],
,
4.30675299],
,
4.30675299],
,
3.07625214],
,
3.07625214],
,
3.07625214]]*Angstrom
# Set up configuration
left_electrode = BulkConfiguration(
bravais_lattice=electrode_lattice,
elements=electrode_elements,
cartesian_coordinates=electrode_coordinates
)
right_electrode = BulkConfiguration(
bravais_lattice=electrode_lattice,
elements=electrode_elements,
cartesian_coordinates=electrode_coordinates
)
# -------------------------------------------------------------------# Central region
# -------------------------------------------------------------------# Set up lattice
vector_a = [19.3063, 0.0, 0.0]*Angstrom
vector_b = [0.0, 15.0, 0.0]*Angstrom
vector_c = [0.0, 0.0, 19.688013683538518]*Angstrom
central_region_lattice = UnitCell(vector_a, vector_b, vector_c)
# Define elements
central_region_elements = [Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
Hydrogen, Hydrogen, Carbon, Carbon, Carbon, Carbon, Carbon,
Carbon, Carbon, Carbon, Hydrogen, Hydrogen, Carbon, Carbon,
Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Hydrogen,
Hydrogen, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
Carbon, Hydrogen, Hydrogen, Carbon, Carbon, Carbon, Carbon,
Carbon, Carbon, Carbon, Carbon, Hydrogen, Hydrogen, Carbon,
Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Hydrogen,
Hydrogen, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
Carbon, Hydrogen, Hydrogen, Carbon, Carbon, Carbon, Carbon,
Carbon, Carbon, Carbon, Carbon, Hydrogen, Hydrogen]
# Define coordinates
central_region_coordinates = [[
[
[
[
[
[
[
[
[
[
[
14
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
,
,
,
,
,
,
,
,
,
,
,
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
,
,
,
,
,
,
,
,
,
,
,
0.61525043],
1.84575128],
1.84575128],
0.61525043],
0.61525043],
1.84575128],
1.84575128],
0.61525043],
0.61525043],
0.61525043],
3.07625214],
Properties of a Nano-ribbon Transistor
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
4.30675299],
4.30675299],
3.07625214],
3.07625214],
4.30675299],
4.30675299],
3.07625214],
3.07625214],
3.07625214],
5.53725385],
6.7677547 ],
6.7677547 ],
5.53725385],
5.53725385],
6.7677547 ],
6.7677547 ],
5.53725385],
5.53725385],
5.53725385],
7.99825556],
9.22875641],
9.22875641],
7.99825556],
7.99825556],
9.22875641],
9.22875641],
7.99825556],
7.99825556],
7.99825556],
10.45925727],
11.68975812],
11.68975812],
10.45925727],
10.45925727],
11.68975812],
11.68975812],
10.45925727],
10.45925727],
10.45925727],
12.92025898],
14.15075984],
14.15075984],
12.92025898],
12.92025898],
14.15075984],
14.15075984],
12.92025898],
12.92025898],
12.92025898],
15.38126069],
16.61176155],
16.61176155],
15.38126069],
15.38126069],
16.61176155],
16.61176155],
15.38126069],
15.38126069],
15.38126069],
17.8422624 ],
19.07276326],
19.07276326],
17.8422624 ],
17.8422624 ],
19.07276326],
19.07276326],
17.8422624 ],
17.8422624 ],
17.8422624 ]]*Angstrom
15
The ATK-SE Package
# Set up configuration
central_region = BulkConfiguration(
bravais_lattice=central_region_lattice,
elements=central_region_elements,
cartesian_coordinates=central_region_coordinates
)
The DeviceConfiguration is constructed by placing the left electrode to the left of the central
region and the right electrode to the right of the central region. It is important that the structure
is seemless across the boundaries between the different regions, thus, the electrode regions must
be repeated into the device region. Further details on the definition of the DeviceConfiguration can be found in the reference section.
ATTACHING DIELECTRIC AND METALLIC REGIONS TO A CONFIGURATION
We will now define a region below the nano-ribbon where there is a dielectric material with
. This is done with the BoxRegion command. Similarly, we define
the dielectric constant
the electro-static gate as a metallic region below the nano-ribbon with electro-static potential
1 Volt. The two regions are attached to the central configuration, as visualized in Figure 2.3.
Finally, we define the DeviceConfiguration from the BulkConfiguration of the left, right
and central regions.
#add dielectric regions
dielectric_region_0 = BoxRegion(
4.,
xmin = 0*Angstrom, xmax = 19.3063*Angstrom,
ymin = 0.5*Angstrom, ymax = 3.5*Angstrom,
zmin = 5*Angstrom, zmax = 15.*Angstrom
)
dielectric_regions = [dielectric_region_0]
central_region.set_dielectric_regions(dielectric_regions)
#add metallic regions
metallic_region_0 = BoxRegion(
1*Volt,
xmin = 0*Angstrom, xmax = 19.3063*Angstrom,
ymin = 0*Angstrom, ymax = 0.5*Angstrom,
zmin = 5*Angstrom, zmax = 15.*Angstrom
)
metallic_regions = [metallic_region_0 ]
central_region.set_metallic_regions(metallic_regions)
device_configuration = DeviceConfiguration(
central_region,
[left_electrode, right_electrode]
)
SETTING UP THE DEVICE CALCULATOR
Next we will set up a DeviceHuckelCalculator and attach it to the DeviceConfiguration.
A device calculator includes calculators for each electrode as well as the central region. The
electrode calculators are setup similar to the previous bulk example. However, in the section
called “Bandstructure of a Graphene Nano-ribbon”, we did not explicitly setup a Poisson solver,
implying that the default Poisson solver was used. The default Poisson solver uses periodic
boundary conditions in all three directions. For the current system, we will use Neumann
boundary conditions in the A and B directions. The Neumann boundary conditions constrain
the electric field to be zero at the boundaries.
16
Properties of a Nano-ribbon Transistor
# -------------------------------------------------------------------# Calculator
# -------------------------------------------------------------------basis_set = [
CerdaHuckelParameters.Carbon_graphite_Basis,
CerdaHuckelParameters.Hydrogen_C2H4_Basis,
]
electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
electron_temperature=300.0*Kelvin,
k_point_sampling=(1,1,100)
)
electrode_poisson_solver = MultigridSolver(boundary_conditions=[NeumannBoundaryCondition,
NeumannBoundaryCondition, PeriodicBoundaryCondition])
left_electrode_calculator = HuckelCalculator(
basis_set=basis_set,
numerical_accuracy_parameters=electrode_numerical_accuracy_parameters,
poisson_solver=electrode_poisson_solver
)
right_electrode_calculator = HuckelCalculator(
basis_set=basis_set,
numerical_accuracy_parameters=electrode_numerical_accuracy_parameters,
poisson_solver=electrode_poisson_solver
)
numerical_accuracy_parameters = NumericalAccuracyParameters(
electron_temperature=300.0*Kelvin,
k_point_sampling=(1,1,100)
)
poisson_solver = MultigridSolver(boundary_conditions=[NeumannBoundaryCondition,
NeumannBoundaryCondition, DirichletBoundaryCondition])
double_contour_integral_parameters = DoubleContourIntegralParameters(
real_axis_point_density=0.01*eV,
)
calculator = DeviceHuckelCalculator(
basis_set=basis_set,
numerical_accuracy_parameters=numerical_accuracy_parameters,
contour_parameters=double_contour_integral_parameters,
poisson_solver=poisson_solver,
electrode_calculators=
[left_electrode_calculator, right_electrode_calculator],
electrode_voltages=( -0.1*Volt, 0.1*Volt),
)
device_configuration.set_calculator(calculator)
The DeviceHuckelCalculator parameters are used in the central region. In the A and B direction, we need the same parameters in the central region and in the electrodes, i.e. the same
boundary conditions, k-point sampling, etc. In the C direction, the parameters will differ. For
the Poisson equation for the central region, we use the electro-static potential of the electrodes
(appropriately shifted, according to the applied electrode potential), as boundary condition.
Thus, we specify Dirichlet boundary conditions, which fixes the electro-static potential at the
boundary.
Other parameters that must be set are the applied electrode potential and the DoubleContourIntegralParameters which specifies the complex contour used for the integral in the density
matrix calculation.
SETTING UP THE TRANSMISSION SPECTRUM CALCULATION
Finally, we setup the analysis part. The calculation of the electron difference density and the
electrostatic potential is similar to the previous example. For calculating the transmission spec-
17
The ATK-SE Package
trum, we use the TransmissionSpectrum command. The transmission spectrum is sampled at
100 points in the range -2 eV to 2 eV around the average Fermi Level of the two electrodes.
# -------------------------------------------------------------------# Analysis
# -------------------------------------------------------------------filename='nanowire_device.nc'
difference_density = ElectronDifferenceDensity(device_configuration)
nlsave(filename, difference_density)
electrostatic_potential = ElectrostaticDifferencePotential(device_configuration)
nlsave(filename, electrostatic_potential)
nlsave(filename, device_configuration)
transmission_spectrum = TransmissionSpectrum(
configuration=device_configuration,
energies=numpy.linspace(-2,2,100)*Units.eV,
kpoints=MonkHorstPackGrid(1,1,1),
energy_zero_parameter=AverageFermiLevel,
infinitesimal=1e-06*Units.eV
)
nlsave(filename,transmission_spectrum)
THE COMPLETE DEVICE CALCULATION SCRIPT
Below you find the complete device calculation script for the transmission spectrum of the
graphene nano-ribbon.
from NanoLanguage import *
# -------------------------------------------------------------------# electrodes
# -------------------------------------------------------------------# Set up lattice
vector_a = [19.3063, 0.0, 0.0]*Angstrom
vector_b = [0.0, 15.0, 0.0]*Angstrom
vector_c = [0.0, 0.0, 4.9220034208846295]*Angstrom
electrode_lattice = UnitCell(vector_a, vector_b, vector_c)
# Define elements
electrode_elements = [Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
Hydrogen, Hydrogen, Carbon, Carbon, Carbon, Carbon, Carbon,
Carbon, Carbon, Carbon, Hydrogen, Hydrogen]
# Define coordinates
electrode_coordinates = [[
18
6.101
,
5.
[ 6.81143
,
[ 8.23229
,
[ 8.94272
,
[ 10.36358
,
[ 11.07401
,
[ 12.49487
,
[ 13.2053
,
[ 5.
,
[ 14.3063
,
[ 6.101
,
[ 6.81143
,
[ 8.23229
,
[ 8.94272
,
[ 10.36358
,
[ 11.07401
,
[ 12.49487
,
[ 13.2053
,
[ 5.
,
[ 14.3063
,
,
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
0.61525043],
,
1.84575128],
,
1.84575128],
,
0.61525043],
,
0.61525043],
,
1.84575128],
,
1.84575128],
,
0.61525043],
,
0.61525043],
,
0.61525043],
,
3.07625214],
,
4.30675299],
,
4.30675299],
,
3.07625214],
,
3.07625214],
,
4.30675299],
,
4.30675299],
,
3.07625214],
,
3.07625214],
,
3.07625214]]*Angstrom
Properties of a Nano-ribbon Transistor
# Set up configuration
left_electrode = BulkConfiguration(
bravais_lattice=electrode_lattice,
elements=electrode_elements,
cartesian_coordinates=electrode_coordinates
)
right_electrode = BulkConfiguration(
bravais_lattice=electrode_lattice,
elements=electrode_elements,
cartesian_coordinates=electrode_coordinates
)
# -------------------------------------------------------------------# Central region
# -------------------------------------------------------------------# Set up lattice
vector_a = [19.3063, 0.0, 0.0]*Angstrom
vector_b = [0.0, 15.0, 0.0]*Angstrom
vector_c = [0.0, 0.0, 19.688013683538518]*Angstrom
central_region_lattice = UnitCell(vector_a, vector_b, vector_c)
# Define elements
central_region_elements = [Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
Hydrogen, Hydrogen, Carbon, Carbon, Carbon, Carbon, Carbon,
Carbon, Carbon, Carbon, Hydrogen, Hydrogen, Carbon, Carbon,
Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Hydrogen,
Hydrogen, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
Carbon, Hydrogen, Hydrogen, Carbon, Carbon, Carbon, Carbon,
Carbon, Carbon, Carbon, Carbon, Hydrogen, Hydrogen, Carbon,
Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Hydrogen,
Hydrogen, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
Carbon, Hydrogen, Hydrogen, Carbon, Carbon, Carbon, Carbon,
Carbon, Carbon, Carbon, Carbon, Hydrogen, Hydrogen]
# Define coordinates
central_region_coordinates = [[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
0.61525043],
1.84575128],
1.84575128],
0.61525043],
0.61525043],
1.84575128],
1.84575128],
0.61525043],
0.61525043],
0.61525043],
3.07625214],
4.30675299],
4.30675299],
3.07625214],
3.07625214],
4.30675299],
4.30675299],
3.07625214],
3.07625214],
3.07625214],
5.53725385],
6.7677547 ],
6.7677547 ],
5.53725385],
5.53725385],
6.7677547 ],
6.7677547 ],
5.53725385],
5.53725385],
5.53725385],
7.99825556],
9.22875641],
19
The ATK-SE Package
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
[
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
6.101
6.81143
8.23229
8.94272
10.36358
11.07401
12.49487
13.2053
5.
14.3063
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
5.
# Set up configuration
central_region = BulkConfiguration(
bravais_lattice=central_region_lattice,
elements=central_region_elements,
cartesian_coordinates=central_region_coordinates
)
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#add dielectric regions
dielectric_region_0 = BoxRegion(
4.,
xmin = 0*Angstrom, xmax = 19.3063*Angstrom,
ymin = 0.5*Angstrom, ymax = 3.5*Angstrom,
zmin = 5*Angstrom, zmax = 15.*Angstrom
)
dielectric_regions = [dielectric_region_0]
central_region.set_dielectric_regions(dielectric_regions)
#add metallic regions
metallic_region_0 = BoxRegion(
1*Volt,
xmin = 0*Angstrom, xmax = 19.3063*Angstrom,
20
9.22875641],
7.99825556],
7.99825556],
9.22875641],
9.22875641],
7.99825556],
7.99825556],
7.99825556],
10.45925727],
11.68975812],
11.68975812],
10.45925727],
10.45925727],
11.68975812],
11.68975812],
10.45925727],
10.45925727],
10.45925727],
12.92025898],
14.15075984],
14.15075984],
12.92025898],
12.92025898],
14.15075984],
14.15075984],
12.92025898],
12.92025898],
12.92025898],
15.38126069],
16.61176155],
16.61176155],
15.38126069],
15.38126069],
16.61176155],
16.61176155],
15.38126069],
15.38126069],
15.38126069],
17.8422624 ],
19.07276326],
19.07276326],
17.8422624 ],
17.8422624 ],
19.07276326],
19.07276326],
17.8422624 ],
17.8422624 ],
17.8422624 ]]*Angstrom
Properties of a Nano-ribbon Transistor
ymin = 0*Angstrom, ymax = 0.5*Angstrom,
zmin = 5*Angstrom, zmax = 15.*Angstrom
)
metallic_regions = [metallic_region_0 ]
central_region.set_metallic_regions(metallic_regions)
device_configuration = DeviceConfiguration(
central_region,
[left_electrode, right_electrode]
)
# -------------------------------------------------------------------# Calculator
# -------------------------------------------------------------------basis_set = [
CerdaHuckelParameters.Carbon_graphite_Basis,
CerdaHuckelParameters.Hydrogen_C2H4_Basis,
]
electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
electron_temperature=300.0*Kelvin,
k_point_sampling=(1,1,100)
)
electrode_poisson_solver = MultigridSolver(boundary_conditions=[NeumannBoundaryCondition,
NeumannBoundaryCondition, PeriodicBoundaryCondition])
left_electrode_calculator = HuckelCalculator(
basis_set=basis_set,
numerical_accuracy_parameters=electrode_numerical_accuracy_parameters,
poisson_solver=electrode_poisson_solver
)
right_electrode_calculator = HuckelCalculator(
basis_set=basis_set,
numerical_accuracy_parameters=electrode_numerical_accuracy_parameters,
poisson_solver=electrode_poisson_solver
)
numerical_accuracy_parameters = NumericalAccuracyParameters(
electron_temperature=300.0*Kelvin,
k_point_sampling=(1,1,100)
)
poisson_solver = MultigridSolver(boundary_conditions=[NeumannBoundaryCondition,
NeumannBoundaryCondition, DirichletBoundaryCondition])
double_contour_integral_parameters = DoubleContourIntegralParameters(
real_axis_point_density=0.01*eV,
)
calculator = DeviceHuckelCalculator(
basis_set=basis_set,
numerical_accuracy_parameters=numerical_accuracy_parameters,
contour_parameters=double_contour_integral_parameters,
poisson_solver=poisson_solver,
electrode_calculators=
[left_electrode_calculator, right_electrode_calculator],
electrode_voltages=( -0.1*Volt, 0.1*Volt),
)
device_configuration.set_calculator(calculator)
# -------------------------------------------------------------------# Analysis
# -------------------------------------------------------------------filename='nanowire_device.nc'
difference_density = ElectronDifferenceDensity(device_configuration)
nlsave(filename, difference_density)
electrostatic_potential = ElectrostaticDifferencePotential(device_configuration)
nlsave(filename, electrostatic_potential)
21
The ATK-SE Package
nlsave(filename, device_configuration)
transmission_spectrum = TransmissionSpectrum(
configuration=device_configuration,
energies=numpy.linspace(-2,2,100)*Units.eV,
kpoints=MonkHorstPackGrid(1,1,1),
energy_zero_parameter=AverageFermiLevel,
infinitesimal=1e-06*Units.eV
)
nlsave(filename,transmission_spectrum)
By clicking the link the script will be saved on your computer, and it can then be executed with
the command
nlpython nanowire_device.py
The command performs a self-consistent calculation of the nano-ribbon device and saves the
analysis results to the file nanowire_device.nc. This file can be visualized with VNL. The
result of the visualization is illustrated in Figure 2.3 and Figure 2.4.
Figure 2.4: Transmission spectrum of the graphene nano-ribbon device with an applied bias potential of
-0.1 Volt on the left electrode, 0.1 Volt on the right electrode and an applied gate potential of 1 Volt.
It is interesting to see that the transmission is almost zero in the energy range between the
electrode Fermi Levels, while outside this energy range the transmission is close to integer values
and therefore almost ideal. The zero transmission is surprising since the nano-ribbon is metallic,
thus, we assemble three metals and obtain an insulator. In the following we will briefly discuss
the origin of this effect.
From Figure 2.3, we see that the gate potential is screened out inside the nano-ribbon and
therefore only has a minor effect on the transmission; as a consequence, we will neglect the
gate effects. From the band structure in Figure 2.2, we see that two bands meet at the Fermi
level. The two bands have different symmetry, one is the bonding band and the other is the
anti-bonding
band. For the energy range between the two Fermi levels in Figure 2.4, we will
therefore have a band from the left electrode propagating into a band in the right electrode.
22
Background Information
These two bands are orthogonal and the transmission coefficient therefore close to zero. For
energies below or above both Fermi levels, the bands in the left and right electrode have similar
symmetry giving rise to a high transmission.
BACKGROUND INFORMATION
The extended-Hückel Model provides a description of the electronic structure of the valence
electrons of molecules and solids. In this section we will describe the mathematical formalism
behind ATK-SE.
The electronic structure is expanded in a basis of local atomic orbitals (LCAO's)
where
is a spherical harmonic and
is a superposition of Slater orbitals
The LCAO basis is described by the adjustable parameters
, these parameters must
be defined for each angular shell of valence orbitals for each element.
The central object in the extended-Hückel model is the overlap matrix,
where is a composite index for
and
is the position of the center of orbital .
From the overlap matrix we define the Hamiltonian,
where
is an orbital energy, and
is a Hückel fitting parameter (often chosen to be 1.75).
is the Hartree potential from the electron density, and must be determined self-consistently. In the non-self-consistent Hückel Model the Hartree potential is not included.
WEIGHTING SCHEMES
The are two variants of the weighting schemes of the orbital energy of the off-site Hamiltonian.
The scheme used above
where
where
is due to Wolfsberg[27], while Hoffmann[28] and [29] use the scheme
.
Both variants are available in ATK-SE through the methods WolfsbergWeighting and HoffmannWeighting .
23
The ATK-SE Package
SOLVING POISSON'S EQUATION TO OBTAIN THE HARTREE POTENTIAL
The Hartree potential is obtained by solving Poisson's equation with the electron density from
the Hückel tight-binding model. The electron density is given by the occupied eigenfunctions
where
ature, and
is the Fermi function,
the energy of eigenstate
.
the Fermi energy,
the electron temper-
We next write the eigenstates in the Slater orbital basis,
and see that the total number of electrons,
where
is given by
is the Density Matrix.
Introducing the Mulliken population of atom number
we can write the total electron density as a sum of atom contributions,
. The radial
dependence of each atom density contribution is represented by a Gaussian function, and the
total induced charge in the system is
where
is the total charge of atom , i.e. the sum of the valence electron charge
and the ionic charge
.
To see the significance of the width of the Gaussian orbital, , we now calculate the electro,
static potential from a single Gaussian density at position
The onsite value of the Hartree potential is
, where
is
the onsite Hartree shift. In ATK-SE it is the value of
which is specified, and this value is used
to determine the width of the Gaussian
using the above relation.
In ATK-SE the Poisson equation is solved using a real space multigrid solver. The system is
enclosed in a bounding box, and the Hartree potential is defined on a regular grid inside the
bounding box. Different boundary conditions can be imposed on the solution at bounding box
surface.
24
DirichletBoundaryCondition
For Dirichlet boundary conditions the Hartree potential is
zero at the boundary.
NeumannBoundaryCondition
For Neumann boundary conditions the gradient of the Hartree potential, e.g. the electric field, is zero at the boundary.
The Extended-Hückel Parameters
PeriodicBoundaryCondition
For Periodic boundary conditions the potential has identical values on opposite faced boundaries.
It is possible to include an electro-static interaction with a continuum metallic or dielectric
material inside the bounding box. The continuum metals are handled by constraining the Hartree potential within the metallic region to a fixed value. Dielectric materials are handled by
introducing a spatial dependent dielectric constant,
, where
inside the dielectric
material with dielectric constant
, and
outside the dielectric materials
THE EXTENDED-HÜCKEL PARAMETERS
The parameters,
must be defined for each valence orbital, while
only
depends on the element type. Different parameter sets are provided with ATK-SE, but it is also
possible to provide user defined parameters in the input file using the HuckelBasisParameters keyword.
Table 2.1: HuckelBasisParameters
Symbol
HuckelBasisParameters
ionization_potential
wolfsberg_helmholtz_constant
onsite_hartree_shift
vacuum_level
Table 2.2: SlaterOrbital parameters
Symbol
SlaterOrbital parameters
principal_quantum_number
azimuthal_quantum_number
slater_coefficients
weights
In the current version we provide a Hoffmann parameter set which is appropriate for organic
molecules. The parameter set is available with the keyword HoffmannHuckelParameters.ElementName, where ElementName is the name of the element. For crystal parameters we refer
to the website of J. Cerda. and his paper [23],
In future versions of ATK-SE we plan to have additional parameters and functions for generating
new parameters that fit first principles data generated with ATK.
To combine parameters from different sources it is important to make sure they use the same
energy zero, in order to obtain correct charge transfers. This can be obtained by ensuring that
the crystals have the correct work function and molecules the correct ionisation energies. For
this purpose we have introduced an additional parameter
which shift the energy of the
vacuum level. I.e. if a calculation with
eV has a work function of 6.5 eV, then by
setting
eV all bands shift rigidly up by 1.5 eV and the work function becomes
5.0 eV.
A table showing the values of the electro-static parameter used in ATK-SE is shown here. A
table showing the values used for the Hoffmann-Hückel basis set parameters can be found
here; A similar table for the Müller-Hückel basis set parameters is located here. Finally, a table
for the Cerda-Hückel basis set parameters can be found here.
25
The ATK-SE Package
Table 2.3: The Hoffmann-Hückel basis set parameters. The unit of Eion is eV, where as the respective units of wi and
ηi are Bohr-3/2 and Bohr-1.
Z=1
H
Nv = 1
β = 1.75
U = 12.848 EVAC = 0 eV
eV
n
l
Eion
W1
η1
W2
1
0
-13.6
1
1.3
-
Nv = 2
β = 1.75
Z=2
He
HoffmannHuckelParameters.Helium_Basis
U = 9 eV
n
l
Eion
W1
η1
W2
1
0
-23.4
1
1.688
-
HoffmannNv = 1
HuckelParameters.Lithium_Basis
Z=3
Li
β = 1.75
U = 3.469
eV
η2
EVAC
= 0 eV
η2
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
2
0
-5.4
1
0.65
-
-
2
1
-3.5
1
0.65
-
Nv = 2
β = 1.75
Z=4
Be
HoffmannHuckelParameters.Beryllium_Basis
U = 5.935
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
2
0
-10
1
0.975
-
-
1
0.975
2
1
Z=5
B
-6
HoffmannHuckelParameters.Boron_Basis
Nv = 3
β = 1.75
U = 8 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
2
0
-15.2
1
1.3
-
-
2
1
-8.5
1
1.3
-
Nv = 4
β = 1.75
Z=6
C
HoffmannHuckelParameters.Carbon_Basis
U = 10.207
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
2
0
-21.4
1
1.625
-
-
2
1
-11.4
1
1.625
-
Z=7
N
26
HoffmannHuckelParameters.Hydrogen_Basis
HoffmannHuckelParameters.Nitrogen_Basis
Nv = 5
β = 1.75
U = 11.052
eV
EVAC
= 0 eV
Eion
W1
η1
W2
η2
0
-26
1
1.95
-
-
1
-13.4
1
1.95
-
-
n
l
2
2
The Extended-Hückel Parameters
Z=8
O
HoffmannHuckelParameters.Oxygen_Basis
Nv = 6
β = 1.75
U = 13.625 EVAC = 0 eV
eV
n
l
Eion
W1
η1
W2
η2
2
0
-32.3
1
2.275
-
-
2
1
-14.8
1
2.275
-
HoffmannNv = 7
HuckelParameters.Fluorine_Basis
Z=9
F
β = 1.75
U = 15.054
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
2
0
-40
1
2.425
-
-
2
1
-18.1
1
2.425
-
Z = 10
Ne
HoffmannHuckelParameters.Neon_Basis
Nv = 8
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
2
0
-43.2
1
2.879
-
-
2
1
-20
1
2.879
-
Z = 11
Na
HoffmannHuckelParameters.Sodium_Basis
Nv = 1
β = 1.75
U = 2.982
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
3
0
-5.1
1
0.733
-
-
3
1
-3
1
0.733
-
Z = 12
Mg
HoffmannNv = 2
HuckelParameters.Magnesium_Basis
β = 1.75
U = 4.623
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
3
0
-9
1
1.1
-
-
3
1
-4.5
1
1.1
-
Nv = 3
β = 1.75
Z = 13
Al
HoffmannHuckelParameters.Aluminium_Basis
U = 5.682
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
3
0
-12.3
1
1.167
-
-
3
1
-6.5
1
1.167
-
Z = 14
Si
HoffmannHuckelParameters.Silicon_Basis
Nv = 4
β = 1.75
U = 6.964
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
3
0
-17.3
1
1.383
-
-
27
The ATK-SE Package
3
Z = 15
P
1
HoffmannNv = 5
HuckelParameters.Phosphorus_Basis
1.383
β = 1.75
U = 9.878
eV
EVAC
= 0 eV
l
Eion
W1
η1
W2
η2
3
0
-18.6
1
1.75
-
-
3
1
-14
1
1.3
-
Nv = 6
β = 1.75
Z = 16
HoffmannHuckelParameters.Sulfur_Basis
U = 9.205
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
3
0
-20
1
2.122
-
-
1
1.827
-
-
3
1
Z = 17
Cl
-11
HoffmannHuckelParameters.Chlorine_Basis
Nv = 7
β = 1.75
U = 10.292 EVAC = 0 eV
eV
n
l
Eion
W1
η1
W2
η2
3
0
-26.3
1
2.183
-
-
3
1
-14.2
1
1.733
-
Z = 19
K
HoffmannHuckelParameters.Potassium_Basis
Nv = 1
β = 1.75
U = 3.702
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-4.34
1
0.874
-
-
4
1
-2.73
1
0.874
-
Z = 20
Ca
HoffmannNv = 2
HuckelParameters.Calcium_Basis
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-7
1
1.2
-
-
4
1
-4
1
1.2
-
HoffmannNv = 3
HuckelParameters.Scandium_Basis
β = 1.75
Z = 21
Sc
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-8.87
1
1.3
-
-
4
1
-2.75
1
1.3
-
-
0.422783
4.35
3
28
-9.2
n
S
Ti
1
2
Z = 22
-8.51
HoffmannHuckelPara-
Nv = 4
β = 1.75
0.72757
U = 9 eV
1.7
EVAC = 0 eV
The Extended-Hückel Parameters
meters.Titanium_Basis
n
l
Eion
W1
η1
W2
η2
4
0
-8.97
1
1.075
-
-
4
1
-5.44
1
1.075
-
-
3
2
-10.81
0.420607
4.55
0.783913
Z = 23
V
HoffmannNv = 5
HuckelParameters.Vanadium_Basis
β = 1.75
U = 9 eV
1.4
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-8.81
1
1.3
-
-
4
1
-5.52
1
1.3
-
-
3
2
-11
0.475509
4.75
0.705213
Z = 24
Cr
HoffmannNv = 6
HuckelParameters.Chromium_Basis
β = 1.75
U = 9 eV
1.7
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-8.66
1
1.7
-
-
4
1
-5.24
1
1.7
-
-
3
2
-11.22
0.505792
4.95
0.674723
Z = 25
Mn
HoffmannNv = 7
HuckelParameters.Manganese_Basis
β = 1.75
U = 9 eV
1.8
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-9.75
1
0.97
-
-
4
1
-5.89
1
0.97
-
-
-11.67
0.513906
5.15
3
2
Z = 26
Fe
HoffmannNv = 8
HuckelParameters.Iron_Basis
β = 1.75
0.692909
U = 9 eV
1.7
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-9.1
1
1.9
-
-
4
1
-5.32
1
1.9
-
-
3
2
-12.6
0.5505
5.35
0.626
Z = 27
Co
HoffmannHuckelParameters.Cobalt_Basis
Nv = 9
β = 1.75
U = 9 eV
2
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-9.21
1
2
-
-
4
1
-5.29
1
2
-
-
3
2
-13.18
0.567865
5.55
0.605856
2.1
29
The ATK-SE Package
Z = 28
Ni
U = 9 eV
EVAC = 0 eV
l
Eion
W1
η1
W2
η2
4
0
-10.95
1
2.1
-
-
4
1
-6.27
1
2.1
-
-
3
2
-14.2
0.549306
5.75
0.60817
Z = 29
HoffmannHuckelParameters.Copper_Basis
Nv = 11
β = 1.75
U = 9 eV
2.3
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-11.4
1
2.2
-
-
4
1
-6.06
1
2.2
-
-
-14
0.593322
5.95
3
2
Z = 30
Zn
HoffmannNv = 12
HuckelParameters.Zinc_Basis
β = 1.75
0.574421
U = 9 eV
2.3
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-12.41
1
2.01
-
-
4
1
-6.53
1
1.7
-
HoffmannNv = 3
HuckelParameters.Gallium_Basis
β = 1.75
Z = 31
Ga
U = 5.936
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-14.58
1
1.77
-
-
4
1
-6.75
1
1.55
-
HoffmannNv = 4
HuckelParameters.Germanium_Basis
β = 1.75
Z = 32
Ge
U = 6.608
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-16
1
2.16
-
-
4
1
-9
1
1.85
-
Nv = 5
β = 1.75
Z = 33
As
30
β = 1.75
n
Cu
Se
HoffmannNv = 10
HuckelParameters.Nickel_Basis
HoffmannHuckelParameters.Arsenic_Basis
U = 8.399
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-16.22
1
2.23
-
-
4
1
-12.16
1
1.89
-
Nv = 6
β = 1.75
Z = 34
HoffmannHuckelParameters.Selenium_Basis
U = 9.121
eV
EVAC
= 0 eV
The Extended-Hückel Parameters
n
l
Eion
W1
η1
W2
η2
4
0
-20.5
1
2.44
-
-
4
1
-14.4
1
2.07
-
Nv = 7
β = 1.75
Z = 35
Br
HoffmannHuckelParameters.Bromine_Basis
U = 8.823
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-22.07
1
2.588
-
-
4
1
-13.1
1
2.131
-
Z = 37
Rb
HoffmannNv = 1
HuckelParameters.Rubidium_Basis
β = 1.75
U = 2.495
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-4.18
1
0.997
-
-
5
1
-2.6
1
0.997
-
Z = 38
Sr
HoffmannHuckelParameters.Strontium_Basis
Nv = 2
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-6.62
1
1.214
-
-
5
1
-3.92
1
1.214
-
Z = 40
Zr
HoffmannHuckelParameters.Zirconium_Basis
Nv = 4
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-9.87
1
1.817
-
-
5
1
-6.76
1
1.776
-
-
4
2
-11.18
0.622416
3.835
0.578216
1.505
Z = 41
Nb
HoffmannHuckelParameters.Niobium_Basis
Nv = 5
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-10.1
1
1.89
-
-
5
1
-6.86
1
1.85
-
-
4
2
-12.1
0.640101
4.08
0.551601
Z = 42
Mo
HoffmannHuckelParameters.Molybdenum_Basis
Nv = 6
β = 1.75
U = 9 eV
1.64
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-8.34
1
1.96
-
-
5
1
-5.24
1
1.9
-
-
31
The ATK-SE Package
4
Z = 43
Tc
-10.5
0.589879
HoffmannNv = 7
HuckelParameters.Technetium_Basis
4.54
β = 1.75
0.589879
U = 9 eV
1.9
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-10.07
1
2.018
-
-
5
1
-5.4
1
1.984
-
-
-12.82
0.5715
4.9
4
2
Z = 44
Ru
HoffmannNv = 8
HuckelParameters.Ruthenium_Basis
β = 1.75
0.6012
U = 9 eV
2.094
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-10.4
1
2.08
-
-
5
1
-6.87
1
2.04
-
-
4
2
-14.9
0.534242
5.38
0.636789
Z = 45
Rh
HoffmannHuckelParameters.Rhodium_Basis
Nv = 9
β = 1.75
U = 9 eV
2.3
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-8.09
1
2.135
-
-
5
1
-4.57
1
2.1
-
-
4
2
-12.5
0.580698
4.29
0.568498
1.97
Z = 46
Pd
HoffmannNv = 10
HuckelParameters.Palladium_Basis
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-7.32
1
2.19
-
-
5
1
-3.75
1
2.152
-
-
4
2
-12.02
0.526436
5.983
0.637334
Z = 48
Cd
HoffmannHuckelParameters.Cadmium_Basis
Nv = 12
β = 1.75
U = 9 eV
2.613
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-11.8
1
1.64
-
-
1
1.6
Nv = 3
β = 1.75
5
1
Z = 49
In
32
2
-8.2
HoffmannHuckelParameters.Indium_Basis
-
-
U = 5.53 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-12.6
1
1.903
-
-
5
1
-6.19
1
1.677
-
-
The Extended-Hückel Parameters
Z = 50
Sn
HoffmannHuckelParameters.Tin_Basis
Nv = 4
β = 1.75
U = 4.297 EVAC = 0 eV
eV
n
l
Eion
W1
η1
W2
η2
5
0
-16.16
1
2.12
-
-
5
1
-8.32
1
1.82
-
Nv = 5
β = 1.75
Z = 51
Sb
HoffmannHuckelParameters.Antimony_Basis
U = 7.657
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-18.8
1
2.323
-
-
5
1
-11.7
1
1.999
-
Z = 52
Te
HoffmannNv = 6
HuckelParameters.Tellurium_Basis
β = 1.75
U = 8.985
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-20.8
1
2.51
-
-
5
1
-14.8
1
2.16
-
Nv = 7
β = 1.75
Z = 53
I
HoffmannHuckelParameters.Iodine_Basis
U = 9.448
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-18
1
2.679
-
-
5
1
-12.7
1
2.322
-
Z = 55
Cs
HoffmannHuckelParameters.Caesium_Basis
Nv = 1
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-3.88
1
1.06
-
-
6
1
-2.49
1
1.06
-
Nv = 3
β = 1.75
Z = 57
La
HoffmannHuckelParameters.Lanthanum_Basis
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-7.67
1
2.14
-
-
6
1
-5.01
1
2.08
-
-
5
2
-8.21
0.776515
3.78
0.458609
Z = 58
Ce
n
l
HoffmannHuckelParameters.Cerium_Basis
Eion
Nv = 4
W1
β = 1.75
η1
U = 9 eV
W2
1.381
EVAC
= 0 eV
η2
33
The ATK-SE Package
6
0
-4.97
1
1.799
-
-
6
1
-4.97
1
1.799
-
-
5
2
-6.43
1
2.747
-
-
4
3
-11.28
1
3.907
-
Z = 62
Sm
Nv = 8
β = 1.75
U = 9 eV
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.86
1
1.4
-
-
6
1
-4.86
1
1.4
-
-
5
2
-6.06
0.718435
2.747
0.444722
1.267
4
3
-11.28
0.735406
6.907
0.459703
Z = 64
Gd
HoffmannHuckelParameters.Gadolinium_Basis
β = 1.75
U = 9 eV
= 0 eV
η1
-5.44
1
1.369
-
-
-6.06
0.718435
2.747
0.444722
1.267
-11.28
0.735406
6.907
0.459703
l
Eion
6
0
5
2
4
3
Z = 70
Nv = 10
2.639
EVAC
W1
n
Yb
HoffmannHuckelParameters.Ytterbium_Basis
Nv = 16
β = 1.75
η2
W2
U = 9 eV
2.639
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-5.35
1
1.54
-
-
6
1
-5.35
1
1.54
-
-
5
2
-5.21
0.706344
2.81
0.48343
1.216
4
3
-13.86
0.746226
8.629
0.456538
Z = 71
Lu
HoffmannNv = 17
HuckelParameters.Lutetium_Basis
β = 1.75
U = 9 eV
3.198
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-6.05
1
1.666
-
-
6
1
-6.05
1
1.666
-
-
5
2
-5.12
0.704411
2.813
0.488008
1.21
0.733001
9.136
4
3
Z = 72
Hf
34
HoffmannHuckelParameters.Samarium_Basis
EVAC
-22.4
HoffmannHuckelParameters.Hafnium_Basis
Nv = 4
β = 1.75
0.445901
U = 9 eV
3.666
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.84
1
1.527
-
-
The Extended-Hückel Parameters
Z = 73
Ta
HoffmannHuckelParameters.Tantalum_Basis
Nv = 5
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-10.1
1
2.28
-
-
6
1
-6.86
1
2.241
-
-
5
2
-12.1
0.610612
4.762
0.610612
Z = 74
W
HoffmannNv = 6
HuckelParameters.Tungsten_Basis
β = 1.75
U = 9 eV
1.938
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-8.26
1
2.341
-
-
6
1
-5.17
1
2.309
-
-
0.668535
4.982
5
2
Z = 75
Re
-10.37
HoffmannHuckelParameters.Rhenium_Basis
Nv = 7
β = 1.75
0.542438
U = 9 eV
2.068
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-9.36
1
2.398
-
-
6
1
-5.96
1
2.372
-
-
5
2
-12.66
0.637752
5.343
0.565763
Z = 76
Os
HoffmannHuckelParameters.Osmium_Basis
Nv = 8
β = 1.75
U = 9 eV
2.277
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-8.17
1
2.452
-
-
6
1
-4.81
1
2.429
-
-
5
2
-11.84
0.637195
5.571
0.559795
Z = 77
Ir
HoffmannHuckelParameters.Iridium_Basis
Nv = 9
β = 1.75
U = 9 eV
2.416
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-11.36
1
2.5
-
-
6
1
-4.5
1
2.2
-
-
5
2
-12.17
0.635059
5.796
0.555605
Z = 78
Pt
HoffmannNv = 10
HuckelParameters.Platinum_Basis
β = 1.75
U = 8.604
eV
2.557
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-9.077
1
2.554
-
-
6
1
-5.475
1
2.554
-
-
5
2
-12.59
0.633378
6.013
0.551281
2.696
35
The ATK-SE Package
Z = 79
Au
Nv = 11
β = 1.75
U = 8.604 EVAC = 0 eV
eV
n
l
Eion
W1
η1
W2
η2
6
0
-10.92
1
2.602
-
-
6
1
-5.55
1
2.584
-
-
5
2
-15.07
0.644177
6.163
0.535576
Z = 80
Hg
HoffmannHuckelParameters.Mercury_Basis
Nv = 12
β = 1.75
U = 9 eV
2.794
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-13.68
1
2.649
-
-
6
1
-8.47
1
2.631
-
-
5
2
-17.5
0.643776
6.436
0.521481
3.032
Z = 81
Tl
HoffmannNv = 3
HuckelParameters.Thallium_Basis
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-11.6
1
2.3
-
-
6
1
-5.8
1
1.6
-
Nv = 4
β = 1.75
Z = 82
Pb
HoffmannHuckelParameters.Lead_B
asis
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-15.7
1
2.35
-
-
6
1
-8
1
2.06
-
-
Nv = 5
β = 1.75
Z = 83
Bi
HoffmannHuckelParameters.Bismuth_Basis
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-15.19
1
2.56
-
-
6
1
-7.79
1
2.072
-
Z = 90
Th
36
HoffmannHuckelParameters.Gold_B
asis
HoffmannHuckelParameters.Thorium_Basis
Nv = 0
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
3
-9.64
0.768182
4.477
0.42669
1.837
7
0
-5.39
1
1.834
-
-
7
1
-5.39
1
1.834
-
-
6
2
-10.11
0.761171
2.461
0.407085
1.165
5
3
-9.64
0.768182
4.477
0.42669
1.837
The Extended-Hückel Parameters
Z = 92
U
HoffmannHuckelParameters.Uranium_Basis
Nv = 0
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
7
0
-5.5
1
1.914
-
-
7
1
-5.5
1
1.914
-
-
6
2
-9.19
0.760793
2.581
0.412596
1.207
5
3
-10.62
0.784411
4.943
0.390806
2.106
Table 2.4: The Müller-Hückel basis set parameters. The unit of Eion is eV, where as the respective units of wi and ηi
are Bohr-3/2 and Bohr-1.
Z=1
H
MullerHuckelParameters.Hydrogen_Basis
Nv = 1
β = 1.75
U = 12.848 EVAC = 0 eV
eV
n
l
Eion
W1
η1
W2
1
0
-13.606
1
1
-
Z=2
He
MullerHuckelParameters.Helium_Basis
Nv = 2
β = 1.75
U = 9 eV
n
l
Eion
W1
η1
W2
1
0
-24.979
1
1.618
-
MullerNv = 1
HuckelParameters.Lithium_Basis
Z=3
Li
β = 1.75
U = 3.469
eV
η2
EVAC
= 0 eV
η2
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
2
0
-5.342
1
0.645
-
-
2
1
-3.499
1
0.524
-
Z=4
Be
MullerHuckelParameters.Beryllium_Basis
Nv = 2
β = 1.75
U = 5.935
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
2
0
-8.416
1
0.944
-
-
2
1
-5.632
1
0.875
-
Z=5
B
MullerHuckelParameters.Boron_Basis
Nv = 3
β = 1.75
U = 8 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
2
0
-13.462
1
1.265
-
-
2
1
-8.432
1
1.134
-
-
Z=6
C
n
MullerHuckelParameters.Carbon_Basis
l
Eion
Nv = 4
W1
β = 1.75
η1
U = 10.207 EVAC = 0 eV
eV
W2
η2
37
The ATK-SE Package
2
0
-19.376
1
1.576
-
2
1
-11.072
1
1.435
-
Z=7
N
β = 1.75
U = 11.052
eV
= 0 eV
l
Eion
W1
η1
W2
η2
2
0
-26.223
1
1.885
-
-
1
1.728
-
-
2
1
Z=8
-13.841
MullerHuckelParameters.Oxygen_Basis
Nv = 6
β = 1.75
U = 13.625 EVAC = 0 eV
eV
n
l
Eion
W1
η1
W2
η2
2
0
-34.024
1
2.192
-
-
2
1
-16.768
1
2.018
-
MullerNv = 7
HuckelParameters.Fluorine_Basis
Z=9
F
β = 1.75
U = 15.054
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
2
0
-42.791
1
2.497
-
-
2
1
-19.865
1
2.305
-
Z = 10
Ne
MullerHuckelParameters.Neon_Basis
Nv = 8
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
2
0
-52.529
1
2.802
-
-
2
1
-23.141
1
2.59
-
Nv = 1
β = 1.75
Z = 11
Na
MullerHuckelParameters.Sodium_Basis
U = 2.982
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
3
0
-4.955
1
0.832
-
-
3
1
-2.976
1
0.611
-
-
Z = 12
Mg
38
Nv = 5
EVAC
n
O
Al
MullerHuckelParameters.Nitrogen_Basis
-
MullerNv = 2
HuckelParameters.Magnesium_Basis
β = 1.75
U = 4.623 EVAC = 0 eV
eV
n
l
Eion
W1
η1
W2
η2
3
0
-6.886
1
1.076
-
-
3
1
-4.169
1
0.862
-
Z = 13
MullerHuckelParameters.Alu-
Nv = 3
β = 1.75
U = 5.682
eV
EVAC
= 0 eV
The Extended-Hückel Parameters
minium_Basis
n
l
Eion
W1
η1
W2
η2
3
0
-10.706
1
1.347
-
-
3
1
-5.713
1
1.019
-
Z = 14
Si
MullerHuckelParameters.Silicon_Basis
Nv = 4
β = 1.75
U = 6.964
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
3
0
-14.792
1
1.588
-
-
3
1
-7.585
1
1.256
-
Z = 15
P
MullerNv = 5
HuckelParameters.Phosphorus_Basis
β = 1.75
U = 9.878
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
3
0
-19.221
1
1.816
-
-
3
1
-9.539
1
1.478
-
-
Z = 16
S
MullerHuckelParameters.Sulfur_Basis
Nv = 6
β = 1.75
U = 9.205 EVAC = 0 eV
eV
n
l
Eion
W1
η1
W2
η2
3
0
-24.019
1
2.035
-
-
3
1
-11.601
1
1.691
-
Z = 17
Cl
MullerHuckelParameters.Chlorine_Basis
Nv = 7
β = 1.75
U = 10.292
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
3
0
-29.196
1
2.25
-
-
1
1.9
Nv = 8
β = 1.75
3
1
Z = 18
Ar
-13.78
MullerHuckelParameters.Argon_Basis
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
3
0
-34.759
1
2.461
-
-
3
1
-16.083
1
2.105
-
Z = 19
K
MullerHuckelParameters.Potassium_Basis
Nv = 1
β = 1.75
U = 3.702
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-4.013
1
0.858
-
-
4
1
-2.599
1
0.671
-
-
39
The ATK-SE Package
3
Z = 20
Ca
-1.581
1
MullerNv = 2
HuckelParameters.Calcium_Basis
0.364
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-5.321
1
1.067
-
-
4
1
-3.573
1
0.893
-
-
3
2
-3.337
1
1.906
-
Z = 21
Sc
MullerNv = 3
HuckelParameters.Scandium_Basis
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-5.717
1
1.136
-
-
4
1
-3.739
1
0.951
-
-
3
2
-9.353
0.4599
3.807
0.701847
1.455
Z = 22
Ti
MullerHuckelParameters.Titanium_Basis
Nv = 4
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-6.039
1
1.195
-
-
4
1
-3.863
1
0.998
-
-
3
2
-11.043
0.468935
4.218
0.685904
Z = 23
V
MullerNv = 5
HuckelParameters.Vanadium_Basis
β = 1.75
U = 9 eV
1.664
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-6.325
1
1.248
-
-
4
1
-3.963
1
1.041
-
-
-12.549
0.474002
4.6
3
2
Z = 24
Cr
MullerNv = 6
HuckelParameters.Chromium_Basis
β = 1.75
0.677004
U = 9 eV
1.846
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-6.583
1
1.296
-
-
4
1
-4.042
1
1.077
-
-
3
2
-13.909
0.474986
4.978
0.67298
Z = 25
Mn
40
2
MullerNv = 7
HuckelParameters.Manganese_Basis
β = 1.75
U = 9 eV
2.022
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-6.84
1
1.344
-
-
4
1
-4.12
1
1.113
-
-
The Extended-Hückel Parameters
3
2
Z = 26
Fe
-15.27
0.480857
MullerNv = 8
HuckelParameters.Iron_Basis
5.318
β = 1.75
0.665802
U = 9 eV
2.176
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-7.079
1
1.388
-
-
4
1
-4.183
1
1.145
-
-
0.484872
5.653
3
2
Z = 27
Co
-16.541
MullerHuckelParameters.Cobalt_Basis
Nv = 9
β = 1.75
0.660825
U = 9 eV
2.325
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-7.309
1
1.431
-
-
4
1
-4.237
1
1.174
-
-
3
2
-17.77
0.485886
5.996
0.658846
Z = 28
Ni
MullerNv = 10
HuckelParameters.Nickel_Basis
β = 1.75
U = 9 eV
2.476
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-7.532
1
1.473
-
-
4
1
-4.284
1
1.203
-
-
3
2
-18.969
0.486001
6.339
0.658001
Z = 29
Cu
MullerHuckelParameters.Copper_Basis
Nv = 11
β = 1.75
U = 9 eV
2.625
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-7.755
1
1.515
-
-
4
1
-4.331
1
1.232
-
-
3
2
-20.188
0.486895
6.676
0.656859
Z = 30
Zn
MullerNv = 12
HuckelParameters.Zinc_Basis
β = 1.75
U = 9 eV
2.768
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-7.96
1
1.553
-
-
4
1
-4.361
1
1.251
-
-
3
2
-21.294
0.48724
7.015
0.656323
2.911
Z = 31
Ga
MullerNv = 3
HuckelParameters.Gallium_Basis
β = 1.75
U = 5.936 EVAC = 0 eV
eV
n
l
Eion
W1
η1
W2
η2
4
0
-11.554
1
1.808
-
-
41
The ATK-SE Package
4
Z = 32
Ge
1
MullerNv = 4
HuckelParameters.Germanium_Basis
1.314
β = 1.75
U = 6.608
eV
EVAC
= 0 eV
l
Eion
W1
η1
W2
η2
4
0
-15.158
1
2.024
-
-
4
1
-7.329
1
1.55
-
Nv = 5
β = 1.75
Z = 33
MullerHuckelParameters.Arsenic_Basis
U = 8.399
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-18.916
1
2.222
-
-
1
1.757
-
-
4
1
Z = 34
Se
-8.984
MullerHuckelParameters.Selenium_Basis
Nv = 6
β = 1.75
U = 9.121 EVAC = 0 eV
eV
n
l
Eion
W1
η1
W2
η2
4
0
-22.862
1
2.409
-
-
4
1
-10.681
1
1.949
-
Z = 35
Br
MullerHuckelParameters.Bromine_Basis
Nv = 7
β = 1.75
U = 8.823
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-27.013
1
2.588
-
-
4
1
-12.438
1
2.131
-
Z = 36
Kr
MullerNv = 8
HuckelParameters.Krypton_Basis
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
4
0
-31.373
1
2.762
-
-
-14.264
1
2.306
-
-
4
1
Z = 37
Rb
42
-5.674
n
As
Sr
1
MullerNv = 1
HuckelParameters.Rubidium_Basis
β = 1.75
U = 2.495 EVAC = 0 eV
eV
n
l
Eion
W1
η1
W2
η2
5
0
-3.752
1
0.977
-
-
5
1
-2.452
1
0.774
-
-
4
2
-1.636
1
0.523
-
Z = 38
MullerHuckelParameters.Strontium_Basis
Nv = 2
β = 1.75
U = 9 eV
EVAC
= 0 eV
The Extended-Hückel Parameters
n
l
Eion
W1
η1
W2
η2
5
0
-4.856
1
1.187
-
-
5
1
-3.299
1
1
-
-
4
2
-3.179
1
1.694
-
Z = 39
Y
β = 1.75
U = 9 eV
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-5.337
1
1.279
-
-
5
1
-3.515
1
1.079
-
-
4
2
-6.799
0.601963
2.554
0.577964
Z = 40
Zr
MullerHuckelParameters.Zirconium_Basis
Nv = 4
β = 1.75
U = 9 eV
1.068
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-5.735
1
1.36
-
-
5
1
-3.694
1
1.151
-
-
4
2
-8.461
0.650366
2.769
0.508286
Z = 41
Nb
MullerHuckelParameters.Niobium_Basis
Nv = 5
β = 1.75
U = 9 eV
1.224
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-5.923
1
1.403
-
-
5
1
-3.757
1
1.186
-
-
4
2
-10.001
0.685854
2.955
0.461902
1.333
Z = 42
Mo
MullerHuckelParameters.Molybdenum_Basis
Nv = 6
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-6.112
1
1.446
-
-
5
1
-3.819
1
1.221
-
-
4
2
-11.541
0.71711
3.126
0.426065
Z = 43
Tc
Ru
MullerNv = 3
HuckelParameters.Yttrium_Basis
EVAC
MullerNv = 7
HuckelParameters.Technetium_Basis
β = 1.75
U = 9 eV
1.408
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-6.3
1
1.49
-
-
5
1
-3.882
1
1.256
-
-
4
2
-13.08
0.742534
3.293
0.39875
Z = 44
MullerHuckelPara-
Nv = 8
β = 1.75
U = 9 eV
1.468
EVAC
= 0 eV
43
The ATK-SE Package
meters.Ruthenium_Basis
n
l
Eion
W1
η1
W2
η2
5
0
-6.488
1
1.533
-
-
5
1
-3.945
1
1.291
-
-
4
2
-14.62
0.779822
3.429
0.367916
Z = 45
Rh
β = 1.75
U = 9 eV
= 0 eV
l
Eion
W1
η1
W2
η2
5
0
-6.677
1
1.576
-
-
5
1
-4.008
1
1.326
-
-
4
2
-16.16
0.80486
3.577
0.347939
1.452
Z = 46
MullerNv = 10
HuckelParameters.Palladium_Basis
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-6.865
1
1.619
-
-
5
1
-4.07
1
1.362
-
-
4
2
-17.7
0.814894
3.746
0.337956
Z = 47
Ag
MullerHuckelParameters.Silver_Basis
Nv = 11
β = 1.75
U = 9 eV
1.501
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-7.054
1
1.662
-
-
5
1
-4.133
1
1.397
-
-
0.824441
3.912
4
2
Z = 48
Cd
-19.24
MullerHuckelParameters.Cadmium_Basis
Nv = 12
β = 1.75
0.328777
U = 9 eV
1.545
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-7.242
1
1.706
-
-
5
1
-4.196
1
1.432
-
-
4
2
-20.78
0.823957
4.094
0.324983
Z = 49
In
44
Nv = 9
n
Pd
Sn
MullerHuckelParameters.Rhodium_Basis
1.453
EVAC
MullerHuckelParameters.Indium_Basis
Nv = 3
β = 1.75
U = 5.53 eV
1.64
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-10.141
1
1.934
-
-
5
1
-5.368
1
1.456
-
Z = 50
MullerHuckelParame-
Nv = 4
β = 1.75
U = 4.297
eV
EVAC
= 0 eV
The Extended-Hückel Parameters
ters.Tin_Basis
n
l
Eion
W1
η1
W2
η2
5
0
-13.043
1
2.129
-
-
5
1
-6.764
1
1.674
-
Z = 51
Sb
MullerHuckelParameters.Antimony_Basis
Nv = 5
β = 1.75
U = 7.657
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-16.026
1
2.305
-
-
5
1
-8.143
1
1.863
-
Z = 52
Te
MullerNv = 6
HuckelParameters.Tellurium_Basis
β = 1.75
U = 8.985
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-19.122
1
2.47
-
-
5
1
-9.54
1
2.036
-
Z = 53
I
MullerHuckelParameters.Iodine_Basis
Nv = 7
β = 1.75
U = 9.448
eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-22.344
1
2.626
-
-
1
2.198
5
1
Z = 54
Xe
-10.971
MullerHuckelParameters.Xenon_Basis
Nv = 8
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
5
0
-25.699
1
2.776
-
-
5
1
-12.444
1
2.352
-
Z = 55
Cs
MullerHuckelParameters.Caesium_Basis
Nv = 1
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-3.365
1
1.031
-
-
6
1
-2.286
1
0.845
-
-
5
2
-1.844
1
0.906
-
Z = 56
Ba
MullerHuckelParameters.Barium_Basis
Nv = 2
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.287
1
1.236
-
-
6
1
-3.063
1
1.071
-
-
5
2
-4.143
1
1.96
-
-
45
The ATK-SE Package
Z = 57
La
Nv = 3
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.637
1
1.318
-
-
6
1
-3.233
1
1.142
-
-
5
2
-7.316
0.593989
3.153
0.611989
Z = 58
Ce
MullerHuckelParameters.Cerium_Basis
Nv = 4
β = 1.75
U = 9 eV
1.338
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.697
1
1.335
-
-
6
1
-3.261
1
1.157
-
-
5
2
-7.359
1
2.027
-
-
4
3
-11.95
1
4.22
-
Nv = 5
β = 1.75
Z = 59
Pr
MullerHuckelParameters.Praseodymium_Basis
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.466
1
1.288
-
-
6
1
-3.29
1
1.127
-
-
5
2
-7.376
1
2.055
-
-
4
3
-12.94
1
4.415
-
Z = 60
Nd
MullerNv = 6
HuckelParameters.Neodymium_Basis
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.518
1
1.303
-
-
6
1
-3.318
1
1.187
-
-
5
2
-7.373
1
2.08
-
-
4
3
-13.892
1
4.619
-
Z = 61
Pm
46
MullerHuckelParameters.Lanthanum_Basis
MullerHuckelParameters.Promethium_Basis
Nv = 7
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.586
1
1.317
-
-
6
1
-3.346
1
1.201
-
-
5
2
-7.353
1
2.103
-
-
4
3
-14.901
1
4.81
-
-
The Extended-Hückel Parameters
Z = 62
Sm
MullerHuckelParameters.Samarium_Basis
Nv = 8
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.616
1
1.331
-
-
6
1
-3.375
1
1.216
-
-
5
2
-7.32
1
2.122
-
-
-15.719
1
4.991
4
3
Z = 63
Eu
MullerNv = 9
HuckelParameters.Europium_Basis
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.663
1
1.345
-
-
6
1
-3.403
1
1.231
-
-
5
2
-7.276
1
2.14
-
-
4
3
-16.451
1
5.165
-
Z = 64
Gd
MullerHuckelParameters.Gadolinium_Basis
Nv = 10
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-5.033
1
1.427
-
-
6
1
-3.431
1
1.246
-
-
5
2
-7.22
1
2.155
-
-
4
3
-17.079
1
5.33
-
Z = 65
Tb
MullerHuckelParameters.Terbium_Basis
Nv = 11
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.753
1
1.371
-
-
6
1
-3.46
1
1.261
-
-
5
2
-7.156
1
2.169
-
-
4
3
-17.707
1
5.495
-
Z = 66
Dy
MullerNv = 12
HuckelParameters.Dysprosium_Basis
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.797
1
1.383
-
-
6
1
-3.488
1
1.276
-
-
5
2
-7.084
1
2.181
-
-
4
3
-18.246
1
5.654
-
-
47
The ATK-SE Package
Z = 67
Ho
β = 1.75
U = 9 eV
EVAC = 0 eV
l
Eion
W1
η1
W2
η2
6
0
-4.84
1
1.396
-
-
6
1
-3.516
1
1.291
-
-
5
2
-7.004
1
2.19
-
-
4
3
-18.733
1
5.808
-
Z = 68
MullerHuckelParameters.Erbium_Basis
Nv = 14
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.882
1
1.408
-
-
6
1
-3.545
1
1.306
-
-
5
2
-6.917
1
2.199
-
-
4
3
-19.174
1
5.96
-
Z = 69
Tm
MullerNv = 15
HuckelParameters.Thulium_Basis
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.924
1
1.42
-
-
6
1
-3.573
1
1.32
-
-
5
2
-6.824
1
2.205
-
-
1
6.109
4
3
Z = 70
Yb
-19.571
MullerHuckelParameters.Ytterbium_Basis
Nv = 16
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-4.965
1
1.432
-
-
6
1
-3.601
1
1.335
-
-
5
2
-6.726
1
2.21
-
-
4
3
-19.929
1
6.256
-
Z = 71
Lu
48
Nv = 13
n
Er
Hf
MullerHuckelParameters.Holmium_Basis
MullerNv = 17
HuckelParameters.Lutetium_Basis
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-5.411
1
1.526
-
-
6
1
-3.63
1
1.35
-
-
5
2
-6.622
1
2.213
-
-
4
3
-20.313
1
6.404
-
Z = 72
MullerHuckelPara-
Nv = 4
β = 1.75
U = 9 eV
EVAC
= 0 eV
The Extended-Hückel Parameters
meters.Hafnium_Basis
n
l
Eion
W1
η1
W2
η2
6
0
-5.725
1
1.598
-
-
6
1
-3.658
1
1.365
-
-
5
2
-8.141
0.636594
3.337
0.545652
Z = 73
Ta
Nv = 5
β = 1.75
U = 9 eV
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-5.979
1
1.658
-
-
6
1
-3.757
1
1.417
-
-
5
2
-9.569
0.673894
3.478
0.495922
Z = 74
W
MullerNv = 6
HuckelParameters.Tungsten_Basis
β = 1.75
U = 9 eV
1.606
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-6.196
1
1.711
-
-
6
1
-3.836
1
1.463
-
-
5
2
-10.963
0.705262
3.609
0.456169
Z = 75
Re
MullerHuckelParameters.Rhenium_Basis
Nv = 7
β = 1.75
U = 9 eV
1.683
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-6.386
1
1.76
-
-
6
1
-3.902
1
1.503
-
-
5
2
-12.348
0.732016
3.734
0.424009
Z = 76
Os
MullerHuckelParameters.Osmium_Basis
Nv = 8
β = 1.75
U = 9 eV
1.742
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-6.556
1
1.804
-
-
6
1
-3.958
1
1.54
-
-
5
2
-13.737
0.757831
3.851
0.394912
1.782
Z = 77
Ir
Pt
MullerHuckelParameters.Tantalum_Basis
1.505
EVAC
MullerHuckelParameters.Iridium_Basis
Nv = 9
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-6.71
1
1.845
-
-
6
1
-4.006
1
1.574
-
-
5
2
-15.136
0.779917
3.968
0.37096
Z = 78
MullerHuckelPara-
Nv = 10
β = 1.75
U = 8.604
eV
1.813
EVAC
= 0 eV
49
The ATK-SE Package
meters.Platinum_Basis
n
l
Eion
W1
η1
W2
η2
6
0
-6.875
1
1.888
-
-
6
1
-4.034
1
1.593
-
-
5
2
-16.528
0.79785
4.084
0.351934
Z = 79
Au
Nv = 11
β = 1.75
U = 8.604
eV
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-7.037
1
1.931
-
-
6
1
-4.068
1
1.615
-
-
5
2
-17.922
0.813667
4.2
0.335863
1.861
Z = 80
Hg
MullerHuckelParameters.Mercury_Basis
Nv = 12
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-7.104
1
1.953
-
-
6
1
-4.117
1
1.66
-
-
5
2
-19.434
0.809955
4.353
0.331981
Z = 81
Tl
MullerNv = 3
HuckelParameters.Thallium_Basis
β = 1.75
U = 9 eV
1.979
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-9.827
1
2.191
-
-
6
1
-5.235
1
1.656
-
Z = 82
Pb
MullerHuckelParameters.Lead_B
asis
Nv = 4
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-12.486
1
2.386
-
-
6
1
-6.527
1
1.88
-
Nv = 5
β = 1.75
Z = 83
Bi
MullerHuckelParameters.Bismuth_Basis
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-15.189
1
2.56
-
-
6
1
-7.788
1
2.072
-
Z = 84
Po
n
50
MullerHuckelParameters.Gold_B
asis
1.84
EVAC
l
MullerNv = 6
HuckelParameters.Polonium_Basis
Eion
W1
β = 1.75
η1
U = 9 eV
W2
EVAC
= 0 eV
η2
The Extended-Hückel Parameters
6
0
-17.965
1
2.72
-
6
1
-9.053
1
2.245
-
Z = 85
At
MullerNv = 7
HuckelParameters.Astatine_Basis
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-20.827
1
2.87
-
-
6
1
-10.337
1
2.45
-
Nv = 8
β = 1.75
Z = 86
Rn
MullerHuckelParameters.Radon_Basis
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
6
0
-23.783
1
3.014
-
-
-11.647
1
2.556
6
1
Z = 87
Fr
MullerNv = 1
HuckelParameters.Francium_Basis
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
7
0
-3.209
1
1.131
-
-
7
1
-2.205
1
0.939
-
-
6
2
-1.931
1
1.258
-
Z = 88
Ra
MullerNv = 2
HuckelParameters.Radium_Basis
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
7
0
-4.048
1
1.346
-
-
7
1
-2.934
1
1.177
-
-
6
2
-4.108
1
2.113
-
Z = 89
Ac
MullerHuckelParameters.Actinium_Basis
Nv = 3
β = 1.75
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
7
0
-4.381
1
1.433
-
-
7
1
-3.098
1
1.253
-
-
6
2
-6.843
1
2.12
-
Nv = 4
β = 1.75
Z = 90
Th
MullerHuckelParameters.Thorium_Basis
U = 9 eV
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
7
0
-5.31
1
1.742
-
-
7
1
-3.345
1
1.256
-
-
6
2
-4.98
0.624003
2.811
0.503002
1.554
5
3
-6.03
0.58187
5.475
0.547877
2.863
51
The ATK-SE Package
Z = 91
Pa
Nv = 5
β = 1.75
U = 9 eV
EVAC = 0 eV
n
l
Eion
W1
η1
W2
η2
7
0
-5.41
1
1.699
-
-
7
1
-3.375
1
1.286
-
-
6
2
-5.07
0.617317
2.894
0.511263
1.595
0.594817
5.659
5
3
Z = 92
U
-7.63
MullerHuckelParameters.Uranium_Basis
Nv = 6
β = 1.75
0.530836
U = 9 eV
2.991
EVAC = 0 eV
Eion
W1
η1
W2
η2
0
-5.51
1
1.728
-
-
1
-3.406
1
1.315
-
-
6
2
-5.1
0.622063
2.944
0.509052
1.611
5
3
-9.045
0.592502
5.885
0.530449
n
l
7
7
Z = 93
Np
MullerHuckelParameters.Neptunium_Basis
Nv = 7
β = 1.75
U = 9 eV
3.135
EVAC
= 0 eV
Eion
W1
η1
W2
η2
0
-5.61
1
1.756
-
-
1
-3.436
1
1.345
-
-
6
2
-5.095
0.615803
3.017
0.516835
1.646
5
3
-10.35
0.519698
3.254
0.600651
n
l
7
7
Z = 94
Pu
MullerHuckelParameters.Plutonium_Basis
Nv = 8
β = 1.75
U = 9 eV
6.068
EVAC
= 0 eV
Eion
W1
η1
W2
η2
0
-5.71
1
1.681
-
-
1
-3.467
1
1.375
-
-
6
2
-5.06
0.609204
3.085
0.525176
1.677
5
3
-11.585
0.509646
3.364
0.608577
n
l
7
7
Z = 95
Am
52
MullerHuckelParameters.Protactinium_Basis
MullerNv = 9
HuckelParameters.Americium_Basis
β = 1.75
U = 9 eV
6.241
EVAC
= 0 eV
n
l
Eion
W1
η1
W2
η2
7
0
-5.8
1
1.704
-
-
7
1
-3.497
1
1.405
-
-
6
2
-5.01
0.596362
3.169
0.539327
1.719
5
3
-12.75
0.496199
3.457
0.620249
6.392
The Extended-Hückel Parameters
Table 2.5: The Cerda-Hückel basis set parameters. The unit of Eion is eV, where as the respective units of wi and ηi
are Bohr-3/2 and Bohr-1.
Z=1
H
CerdaHuckelParameters.Hydrogen_C2H4_
Basis
Reference structure: C2H4
n
l
1
0
-17.8384
Z=5
β = 2.3
U = 12.848 EVAC
=
eV
-6.2568 eV
Computational model: LDA-DFT
Eion
B
Nv = 1
CerdaHuckelParameters.Boron_BN_wur
tz_Basis
Reference structure: BN wurtz
W1
η1
W2
0.50494
0.87223
-
Nv = 3
β = 2.3
U = 8 eV
η2
EVAC
= -6 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
2
0
-22.6243
0.66811
1.60645
-
-
2
1
-16.6839
0.87705
1.63627
-
-
3
2
-9.36241
0.70894
0.89284
-
Z=5
B
CerdaHuckelParameters.Boron_BN_hexag_Basis
Reference structure: BN hexag
Nv = 3
β = 2.3
U = 8 eV
EVAC
= -6 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
2
0
-21.7174
0.66811
1.60645
-
-
2
1
-14.1676
0.99022
1.63627
-
-
3
2
-5.55352
0.6544
0.89284
-
Z=6
C
CerdaHuckelParameters.Carbon_graphite_Basis
Reference structure: graphite
Nv = 4
β = 2.8
EVAC
U = 10.207
=
eV
-7.36577 eV
Computational model: LDA-DFT
η1
η2
n
l
Eion
2
0
-19.8892
0.76422
2.0249
-
-
2
1
-13.08
0.27152
1.62412
0.73886
2.17687
3
2
-2.04759
0.49066
1.1944
-
Z=6
C
CerdaHuckelParameters.Carbon_diamond_Basis
Reference structure: diamond
W1
Nv = 4
β = 2.8
W2
EVAC
U = 10.207
=
eV
-9.43285 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
2
0
-21.3959
0.71927
2.0029
-
-
2
1
-15.2271
0.55108
1.63935
0.53135
3.48317
3
2
-4.06791
0.88307
0.86366
-
-
53
The ATK-SE Package
CerdaHuck- Nv = 4
elParameters.Carbon_GW_diamond_Basis
Z=6
C
Reference structure: diamond
U = 10.207 EVAC
=
eV
-9.4143 eV
Computational model: GW
W1
η1
η2
n
l
Eion
2
0
-22.5994
0.77991
2.10199
-
-
2
1
-14.7745
0.09615
1.00122
0.93068
2.16332
3
2
-3.42637
0.69317
0.91626
-
Z=6
C
CerdaHuckelParameters.Carbon_GW_Si
C_Basis
Reference structure: SiC
Nv = 4
β = 2.8
W2
EVAC
U = 10.207
=
eV
-6.14175 eV
Computational model: GW
W1
η1
W2
η2
n
l
Eion
2
0
-19.4265
0.77991
2.10199
-
-
2
1
-12.8029
0.09614
1.00122
0.93069
2.16335
3
2
-1.62663
0.69317
0.91626
-
Z=6
C
CerdaHuckelParameters.Carbon_C2H4_
Basis
Reference structure: C2H4
Nv = 4
β = 2.8
EVAC
U = 10.207
=
eV
-6.2568 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
2
0
-18.4006
0.7449
2.04927
-
-
2
1
-12.3453
0.74031
1.71703
0.3554
3.31214
3
2
-3.53572
0.76455
0.94043
-
-
Z=7
N
CerdaHuckelParameters.Nitrogen_BN_wu
rtz_Basis
Reference structure: BN wurtz
Nv = 5
β = 2.3
U = 11.052 EVAC = -6 eV
eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
2
0
-27.127
1
2.74251
-
-
2
1
-17.5276
1
2.26145
-
-
0.37978
0.62169
-
-
3
2
Z=7
N
-5.60857
CerdaHuckelParameters.Nitrogen_BN_he
xag_Basis
Reference structure: BN hexag
54
β = 2.8
Nv = 5
β = 2.3
U = 11.052 EVAC = -6 eV
eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
2
0
-26.4216
1
2.74251
-
-
2
1
-17.0156
1
2.26145
-
-
The Extended-Hückel Parameters
3
2
Z = 13
Al
-3.59026
0.51048
CerdaHuck- Nv = 3
elParameters.Aluminium_fcc_Basis
Reference structure: fcc
0.62169
β = 2.3
-
EVAC
U = 5.682
=
eV
-5.74486 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
3
0
-12.9807
0.72564
1.62763
-
-
3
1
-8.90927
0.71507
1.28508
-
-
3
2
-4.66958
0.77928
0.88276
-
-
Z = 13
Al
CerdaHuck- Nv = 3
elParameters.Aluminium_AlP_G
W_Basis
Reference structure: AlP
β = 2.3
U = 5.682 EVAC
=
eV
-6.44826 eV
Computational model: GW
W1
η1
W2
η2
n
l
Eion
3
0
-14.3073
0.72564
1.62763
-
-
3
1
-9.67525
0.71507
1.28508
-
-
-4.88276
0.77928
0.88276
-
-
3
2
Z = 13
Al
CerdaHuck- Nv = 3
elParameters.Aluminium_AlAs_G
W_Basis
Reference structure: AlAs
β = 2.3
U = 5.682 EVAC
=
eV
-6.8946 eV
Computational model: GW
W1
η1
W2
η2
n
l
Eion
3
0
-14.7568
0.72564
1.62763
-
-
3
1
-10.2301
0.71507
1.28508
-
-
0.77928
0.88276
-
-
3
2
Z = 14
Si
-4.7515
CerdaHuckelParameters.Silicon_diamond_Basis
Reference structure: diamond
Nv = 4
β = 2.3
U = 6.964 EVAC
=
eV
-7.75692 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
3
0
-18.0388
0.65715
1.78044
-
-
3
1
-11.8203
0.81839
1.61427
-
-
-6.3232
0.56273
0.79668
0.65807
2.49718
3
2
Z = 14
Si
CerdaHuck- Nv = 4
elParameters.Silicon_GW_diamond_Basis
Reference structure: diamond
β = 2.3
U = 6.964 EVAC
=
eV
-7.67047 eV
Computational model: GW
n
l
Eion
3
0
-18.1026
W1
η1
W2
η2
0.70366
1.83611
-
-
55
The ATK-SE Package
3
1
-11.253
0.0277
0.78901
0.98313
3
2
-5.34706
0.68383
0.68292
0.46957
Z = 14
Si
CerdaHuckelParameters.Silicon_GW_Si
C_Basis
Reference structure: SiC
U = 6.964
=
eV
-6.14175 eV
Computational model: GW
l
Eion
W1
η1
3
0
-19.4736
0.70366
1.83611
-
-
3
1
-11.9665
0.0277
0.78901
0.98313
1.70988
3
2
-6.45414
0.68383
0.68292
0.46957
Z = 15
CerdaHuckelParameters.Phosphorus_AlP_G
W_Basis
Reference structure: AlP
Nv = 5
β = 2.3
η2
W2
1.72102
EVAC
U = 9.878
=
eV
-6.44826 eV
Computational model: GW
W1
η1
W2
η2
n
l
Eion
3
0
-20.9897
0.64007
1.9419
-
-
3
1
-12.8889
0.71876
1.68957
0.344
3.05784
3
2
-3.60739
0.79107
0.89643
-
Z = 15
P
CerdaHuckelParameters.Phosphorus_GaP_G
W_Basis
Reference structure: GaP
Nv = 5
β = 2.3
EVAC
U = 9.88788
=
eV
-6.88753 eV
Computational model: GW
W1
η1
W2
η2
n
l
Eion
3
0
-21.3273
0.64007
1.9419
-
-
3
1
-13.1613
0.71876
1.68957
0.344
3.05784
3
2
-4.58537
0.79107
0.89643
-
Z = 15
P
CerdaHuckelParameters.Phosphorus_InP_G
W_Basis
Reference structure: InP
Nv = 5
β = 2.3
EVAC
U = 9.878
=
eV
-6.92207 eV
Computational model: GW
W1
η1
W2
η2
n
l
Eion
3
0
-21.2204
0.64007
1.9419
-
-
3
1
-13.2123
0.71876
1.68957
0.344
3.05784
-4.89407
0.79107
0.89643
3
56
β = 2.3
1.72102
EVAC
n
P
Sc
Nv = 4
1.70988
2
Z = 21
CerdaHuck- Nv = 3
elParameters.Scandium_hcp_Basis
β = 2.3
U = 9 eV
EVAC
=
-6.47371 eV
The Extended-Hückel Parameters
Reference structure: hcp
Computational model: LDA-DFT
η1
W2
η2
l
4
0
-8.36905
0.65566
1.41412
-
-
4
1
-5.82003
0.66104
1.16027
-
-
3
2
-8.36623
0.58803
1.39314
-
Z = 21
Sc
CerdaHuckelParameters.Scandium_bcc_Basis
Reference structure: bcc
Nv = 3
β = 2.3
U = 9 eV
EVAC
=
-6.47033 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
4
0
-8.27398
0.65566
1.41412
-
-
4
1
-5.68802
0.66104
1.16027
-
-
3
2
-8.43933
0.58803
1.39314
-
Z = 22
Ti
CerdaHuck- Nv = 4
elParameters.Titanium_hcp_Basis
Reference structure: hcp
β = 2.3
U = 9 eV
EVAC
=
-5.55606 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
4
0
-7.84958
0.45558
0.89722
-
-
4
1
-7.32609
0.49494
1.00909
-
-
3
2
-9.42441
0.28536
1.15327
0.81231
Z = 22
Ti
CerdaHuckelParameters.Titanium_fcc_Basis
Reference structure: fcc
Nv = 4
β = 2.3
U = 9 eV
2.63915
EVAC
=
-5.46065 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
4
0
-7.70802
0.45558
0.89722
-
-
4
1
-7.21524
0.49494
1.00909
-
-
3
2
-9.27229
0.28536
1.15327
0.81231
Z = 22
Ti
CerdaHuckelParameters.Titanium_bcc_Basis
Reference structure: bcc
V
W1
n
Eion
Nv = 4
β = 2.3
U = 9 eV
2.63915
EVAC
=
-5.8819 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
4
0
-7.61918
0.45558
0.89722
-
-
4
1
-7.129
0.49494
1.00909
-
-
3
2
-9.08015
0.28536
1.15327
0.81231
Z = 23
CerdaHuckelParameters.Vanadi-
Nv = 5
β = 2.3
U = 9 eV
2.63915
EVAC
=
-5.81563 eV
57
The ATK-SE Package
um_bcc_Basis
Reference structure: bcc
Computational model: LDA-DFT
W2
η2
4
0
-7.902
0.88449
1.51793
-
-
4
1
-5.37821
0.66078
1.30693
-
-
3
2
-9.44229
0.62062
1.68218
-
Z = 24
CerdaHuck- Nv = 6
elParameters.Chromium_bcc_Basis
Reference structure: bcc
β = 2.3
U = 9 eV
EVAC
=
-5.69969 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
4
0
-8.07927
0.64199
0.99961
-
-
4
1
-7.26305
0.58547
1.10362
-
-
3
2
-10.7296
0.33576
1.45656
0.7694
Z = 25
Mn
CerdaHuck- Nv = 7
elParameters.Manganese_fcc_Basis
Reference structure: fcc
β = 2.3
U = 9 eV
3.27523
EVAC
=
-5.92104 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
4
0
-8.93247
0.60538
1.39823
-
-
4
1
-6.56812
0.59765
1.20449
-
-
3
2
-10.8763
0.3231
1.52037
0.78115
Z = 25
Mn
CerdaHuckelParameters.Manganese_bcc_B
asis
Reference structure: bcc
Nv = 7
β = 2.3
U = 9 eV
3.44592
EVAC
=
-5.91948 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
4
0
-9.14276
0.60538
1.39823
-
-
4
1
-6.92114
0.59765
1.20449
-
-
3
2
-11.2151
0.3231
1.52037
0.78115
Z = 26
Fe
CerdaHuckelParameters.Iron_bc
c_Basis
Reference structure: bcc
Nv = 8
β = 2.3
U = 9 eV
3.44592
EVAC
= -5.21
eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
4
0
-9.39204
0.5892
1.4884
-
-
4
1
-6.66953
0.59596
1.25262
-
-
0.26494
1.48912
3
58
η1
l
Cr
Co
W1
n
Eion
2
Z = 27
-11.4024
CerdaHuckelParameters.Co-
Nv = 9
β = 2.3
0.82466
U = 9 eV
3.3483
EVAC
=
-4.95579 eV
The Extended-Hückel Parameters
balt_fcc_Basis
Reference structure: fcc
Computational model: LDA-DFT
η1
W2
η2
l
4
0
-9.90499
0.53969
1.48379
-
-
4
1
-6.97352
0.59446
1.2556
-
-
3
2
-11.7395
0.24393
1.4872
0.84379
Z = 27
Co
CerdaHuck- Nv = 9
elParameters.Cobalt_hcp_Basis
Reference structure: hcp
β = 2.3
U = 9 eV
3.41646
EVAC
=
-5.08683 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
4
0
-10.0487
0.53969
1.48379
-
-
4
1
-7.18148
0.59446
1.2556
-
-
3
2
-11.7495
0.24393
1.4872
0.84379
Z = 28
Ni
CerdaHuckelParameters.Nickel_fcc_Basis
Reference structure: fcc
Nv = 10
β = 2.3
U = 9 eV
3.41646
EVAC
=
-4.64694 eV
Computational model: LDA-DFT
W1
η1
W2
η2
-
-
n
l
Eion
4
0
-9.7934
0.60557
1.58729
4
1
-6.69928
0.61588
1.29812
-
-
3
2
-11.7794
0.29586
1.63992
0.81374
3.94689
Z = 29
Cu
CerdaHuckelParameters.Copper_fcc_Basis
Reference structure: fcc
Nv = 11
β = 2.3
U = 9 eV
EVAC
=
-5.17805 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
4
0
-10.5742
0.6063
1.69318
-
-
4
1
-6.86172
0.63888
1.33731
-
-
0.32382
1.79662
3
2
Z = 30
Zn
-12.8961
CerdaHuckelParameters.Zinc_fc
c_Basis
Reference structure: fcc
Ga
W1
n
Eion
Nv = 12
β = 2.3
0.82655
U = 9 eV
5.14331
EVAC
=
-6.67286 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
4
0
-12.9625
1
2.36615
-
-
4
1
-9.23345
0.4167
1.63016
-
-
3
2
-18.035
0.15524
2.01067
0.87781
Z = 31
CerdaHuckelParameters.Galli-
Nv = 3
β = 2.3
3.565
EVAC
U = 5.935
=
eV
-5.68337 eV
59
The ATK-SE Package
um_fcc_Basis
Reference structure: fcc
Computational model: LDA-DFT
W2
η2
4
0
-14.5101
0.67038
2.03484
-
-
4
1
-8.56214
0.71632
1.63083
-
-
4
2
-3.16883
0.89901
0.90717
-
Z = 31
CerdaHuckelParameters.Gallium_GaP_G
W_Basis
Reference structure: GaP
Nv = 3
β = 2.3
EVAC
U = 5.936
=
eV
-6.88753 eV
Computational model: GW
n
l
Eion
W1
η1
W2
η2
4
0
-16.3708
0.67038
2.03484
-
-
4
1
-10.0152
0.71632
1.63083
-
-
4
2
-3.79622
0.89901
0.90717
-
Z = 31
Ga
CerdaHuckelParameters.Gallium_GaAs_B
asis
Reference structure: GaAs
Nv = 3
β = 2.3
EVAC
U = 5.936
=
eV
-7.60579 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
4
0
-17.2549
0.57998
1.93753
-
-
4
1
-11.2889
0.64383
1.58044
-
-
4
2
-6.68155
0.65154
0.9494
-
Z = 31
Ga
CerdaHuckelParameters.Gallium_GaAs_
GW_Basis
Reference structure: GaAs
Nv = 3
β = 2.3
EVAC
U = 5.936
eV
eV
= -7.41
Computational model: GW
n
l
Eion
W1
η1
W2
η2
4
0
-16.9187
0.67038
2.03484
-
-
4
1
-10.7539
0.71632
1.63083
-
-
4
2
-3.96693
0.89901
0.90717
-
Z = 33
As
CerdaHuckelParameters.Arsenic_AlAs_G
W_Basis
Reference structure: AlAs
60
η1
l
Ga
As
W1
n
Eion
Nv = 5
β = 2.3
EVAC
U = 8.399
=
eV
-6.8946 eV
Computational model: GW
n
l
Eion
W1
η1
W2
η2
4
0
-21.9456
0.54624
2.19335
-
-
4
1
-13.0744
0.7307
1.9686
-
-
4
2
-3.38857
0.9902
0.94359
-
Z = 33
CerdaHuckelParame-
Nv = 5
β = 2.3
EVAC
U = 8.399
=
eV
-7.60579 eV
The Extended-Hückel Parameters
ters.Arsenic_GaAs_Basis
Reference structure: GaAs
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
4
0
-20.6851
0.62857
2.2775
-
-
4
1
-12.1021
0.999
2.28904
-
-
4
2
-3.36392
0.9902
1.67268
-
Z = 33
As
CerdaHuckelParameters.Arsenic_GaAs_G
W_Basis
Reference structure: GaAs
Nv = 5
β = 2.3
EVAC
U = 8.399
eV
eV
= -7.41
Computational model: GW
W1
η1
W2
η2
n
l
Eion
4
0
-22.1472
0.54624
2.19335
-
-
4
1
-13.1706
0.7307
1.9686
-
-
4
2
-4.137
0.9902
0.94359
-
Z = 33
As
CerdaHuckelParameters.Arsenic_InAs_G
W_Basis
Reference structure: InAs
Nv = 5
β = 2.3
EVAC
U = 8.399
=
eV
-7.5043 eV
Computational model: GW
W1
η1
W2
η2
n
l
Eion
4
0
-22.0247
0.54624
2.19335
-
-
4
1
-13.2078
0.7307
1.9686
-
-
4
2
-4.6414
0.9902
0.94359
-
Z = 39
Y
CerdaHuckelParameters.Yttrium_fcc_Basis
Reference structure: fcc
Nv = 3
β = 2.3
U = 9 eV
EVAC
= -6 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
5
0
-8.45573
0.66414
1.62475
-
-
5
1
-5.03686
0.72293
1.30361
-
-
4
2
-8.01171
0.68038
1.58038
-
Z = 39
Y
CerdaHuck- Nv = 3
elParameters.Yttrium_hcp_Basis
Reference structure: hcp
β = 2.3
U = 9 eV
EVAC
= -6 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
5
0
-8.47712
0.66414
1.62475
-
-
5
1
-5.08407
0.72293
1.30361
-
-
4
2
-7.99731
0.68038
1.58038
-
-
61
The ATK-SE Package
Z = 40
Zr
CerdaHuck- Nv = 4
elParameters.Zirconium_hcp_Basis
Reference structure: hcp
U = 9 eV
EVAC
=
-5.97812 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
5
0
-8.21277
0.66589
1.56164
-
-
5
1
-6.00133
0.53606
1.2688
-
-
0.61574
1.66473
4
2
Z = 40
Zr
-9.03884
CerdaHuckelParameters.Zirconium_fcc_Basis
Reference structure: fcc
Nv = 4
β = 2.3
0.64065
U = 9 eV
5.0542
EVAC
=
-5.9684 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
5
0
-8.08839
0.66589
1.56164
-
-
5
1
-5.73102
0.53606
1.2688
-
-
4
2
-8.94122
0.61574
1.66473
0.64065
Z = 40
Zr
CerdaHuckelParameters.Zirconium_bcc_Basis
Reference structure: bcc
Nv = 4
β = 2.3
U = 9 eV
5.0542
EVAC
=
-6.02619 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
5
0
-7.8852
0.66589
1.56164
-
-
5
1
-5.58256
0.53606
1.2688
-
-
4
2
-8.74286
0.61574
1.66473
0.64065
Z = 41
Nb
CerdaHuckelParameters.Niobium_bcc_Basis
Reference structure: bcc
Nv = 5
β = 2.3
U = 9 eV
5.0542
EVAC
=
-5.791 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
5
0
-7.83515
0.78125
1.66071
-
-
5
1
-5.03085
0.68753
1.27372
-
-
4
2
-9.3306
0.68669
1.85049
-
Z = 42
Mo
CerdaHuckelParameters.Molybdenum_bcc_B
asis
Reference structure: bcc
62
β = 2.3
Nv = 6
β = 2.3
U = 9 eV
EVAC
=
-5.19421 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
5
0
-8.36662
0.83018
1.72218
-
-
5
1
-5.39352
0.72696
1.3365
-
-
The Extended-Hückel Parameters
4
2
Z = 43
Tc
-10.8671
0.67217
CerdaHuck- Nv = 4
elParameters.Technetium_hcp_Basis
Reference structure: hcp
1.9978
β = 2.3
U = 9 eV
EVAC
=
-7.5149 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
5
0
-8.50569
0.77154
1.64956
-
-
5
1
-5.74739
0.63636
1.36162
-
-
4
2
-11.4215
0.45903
1.87926
0.66939
Z = 43
Tc
CerdaHuck- Nv = 4
elParameters.Technetium_fcc_Basis
Reference structure: fcc
U = 9 eV
=
-7.45582 eV
Computational model: LDA-DFT
Eion
W1
η1
W2
η2
0
-8.2267
0.77154
1.64956
-
-
1
-5.70711
0.63636
1.36162
-
-
2
-11.3582
0.45903
1.87926
0.66939
n
l
5
5
4
Z = 44
Ru
β = 2.3
3.90392
EVAC
CerdaHuck- Nv = 8
elParameters.Ruthenium_hcp_Basis
Reference structure: hcp
β = 2.3
U = 9 eV
3.90392
EVAC
=
-5.59144 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
5
0
-9.32602
0.60076
1.63558
-
-
5
1
-6.34065
0.58839
1.37066
-
-
4
2
-12.4218
0.27066
1.71196
0.80993
Z = 44
Ru
CerdaHuck- Nv = 8
elParameters.Ruthenium_fcc_Basis
Reference structure: fcc
β = 2.3
U = 9 eV
3.31356
EVAC
=
-5.17748 eV
Computational model: LDA-DFT
W1
η1
W2
η2
-
-
n
l
Eion
5
0
-8.84268
0.60076
1.63558
5
1
-6.06874
0.58839
1.37066
-
-
4
2
-11.9364
0.27066
1.71196
0.80993
3.31356
Z = 45
Rh
CerdaHuckelParameters.Rhodium_fcc_Basis
Reference structure: fcc
Nv = 9
β = 2.3
U = 9 eV
EVAC
=
-4.96235 eV
Computational model: LDA-DFT
n
l
Eion
5
0
-9.22928
W1
η1
W2
η2
0.72992
1.86894
-
-
63
The ATK-SE Package
5
1
-5.15799
0.71084
1.40344
-
4
2
-12.433
0.41591
2.00068
0.70707
Z = 46
Pd
CerdaHuckelParameters.Palladium_fcc_Basis
Reference structure: fcc
β = 2.3
U = 9 eV
4.15195
EVAC
=
-4.38749 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
5
0
-9.07916
0.63338
1.77352
-
-
5
1
-5.8727
0.64064
1.43651
-
-
4
2
-12.3746
0.31704
1.9082
0.78406
Z = 47
Ag
CerdaHuckelParameters.Silver_fcc_Basis
Reference structure: fcc
Nv = 11
β = 2.3
U = 9 eV
3.88573
EVAC
=
-5.43566 eV
Computational model: LDA-DFT
W1
η1
W2
η2
-
-
n
l
Eion
5
0
-10.3592
0.61985
1.91661
5
1
-6.20001
0.66651
1.50982
-
-
4
2
-14.5109
0.28692
2.01944
0.80921
4.14345
Z = 48
Cd
CerdaHuckelParameters.Cadmium_fcc_Basis
Reference structure: fcc
Nv = 12
β = 2.3
U = 9 eV
EVAC
=
-5.78433 eV
Computational model: LDA-DFT
W1
η1
W2
η2
0.60994
2.10439
-
-
n
l
Eion
5
0
-12.3344
5
1
-7.85805
0.5758
1.66558
-
-
4
2
-19.8661
0.93688
14.8833
0.32073
2.31681
U = 5.53 eV
EVAC
=
-5.90444 eV
Z = 49
In
CerdaHuckelParameters.Indium_fcc_Basis
Reference structure: fcc
Nv = 3
β = 2.3
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
5
0
-13.9371
0.59101
2.11757
-
-
5
1
-8.22964
0.71392
1.84269
-
-
5
2
-3.54891
0.61732
1.02658
-
-
U = 5.53 eV
EVAC
=
-6.92207 eV
W2
η2
Z = 49
In
CerdaHuckelParameters.Indium_InP_G
W_Basis
Reference structure: InP
n
64
Nv = 10
-
l
Nv = 3
β = 2.3
Computational model: GW
Eion
W1
η1
The Extended-Hückel Parameters
5
0
-15.9796
0.59101
2.11757
-
-
5
1
-9.05671
0.71392
1.84269
-
-
5
2
-3.77804
0.61732
1.02658
-
Z = 49
In
CerdaHuckelParameters.Indium_InAs_G
W_Basis
Reference structure: InAs
β = 2.3
U = 5.53 eV
=
-7.5043 eV
Computational model: GW
n
l
Eion
W1
η1
W2
η2
5
0
-16.4496
0.59101
2.11757
-
-
5
1
-9.83157
0.71392
1.84269
-
-
5
2
-3.6995
0.61732
1.02658
-
Z = 74
W
CerdaHuck- Nv = 6
elParameters.Tungsten_bcc_Basis
Reference structure: bcc
β = 2.3
U = 9 eV
EVAC
=
-5.6645 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
6
0
-10.5819
0.80244
2.30427
-
-
6
1
-5.53905
0.68049
1.72283
-
-
5
2
-10.7394
0.69067
2.3028
-
Z = 75
Re
CerdaHuck- Nv = 7
elParameters.Rhenium_hcp_Basis
Reference structure: hcp
η2
0.20733
1.6507
0.84382
2.6424
0.76128
1.58733
-
-
0.65008
2.33586
-
-10.004
1
-5.98158
2
-11.3579
6
5
Z = 77
=
-5.45363 eV
W2
0
6
U = 9 eV
η1
W1
l
β = 2.3
EVAC
Computational model: LDA-DFT
Eion
n
Ir
CerdaHuckelParameters.Iridium_fcc_Basis
Reference structure: fcc
Pt
Nv = 3
EVAC
Nv = 9
β = 2.3
U = 5.53 eV
EVAC
=
-4.2382 eV
Computational model: LDA-DFT
n
l
Eion
W1
η1
W2
η2
6
0
-12.1196
0.64865
2.32336
-
-
6
1
-6.44135
0.69422
1.80105
-
-
5
2
-13.1059
0.32075
2.16073
0.77521
Z = 78
Reference structure: fcc
CerdaHuck- Nv = 10
elParameters.Platinum_fcc_Basis
β = 2.3
4.01172
EVAC
U = 8.604
=
eV
-4.07837 eV
Computational model: LDA-DFT
65
The ATK-SE Package
n
l
Eion
W1
η1
W2
η2
6
0
-11.7091
0.65212
2.32872
-
-
6
1
-6.08105
0.7288
1.77159
-
-
5
2
-13.301
0.38501
2.30384
0.74491
Z = 79
Au
CerdaHuckelParameters.Gold_fc
c_Basis
Reference structure: fcc
66
Nv = 11
β = 2.3
4.63467
EVAC
U = 8.604
=
eV
-4.8533 eV
Computational model: LDA-DFT
W1
η1
W2
η2
n
l
Eion
6
0
-12.1342
0.60326
2.31605
-
-
6
1
-6.73967
0.62661
1.74458
-
-
5
2
-14.0257
0.37598
2.32731
0.79437
5.44496
CHAPTER 3. EXTERNAL CALCULATORS
INTRODUCTION
VNL 2009.06 supports the creation and execution of scripts for other calculators than ATK
2009.06. This chapter will present each of the calculators that are supported, and how they may
be installed such that they can be used with VNL 2009.06.
Currently, the following external calculators are supported in VNL 2009.06:
• GPAW
GPAW
GPAW is a density-functional theory Python code based on the projector-augmented wave
(PAW) method. More information about GPAW can be obtained from its website.
INSTALLATION
The GPAW calculator is not installed by default in ATK 2009.06 as distributing GPAW in this
manner is not allowed under its GPL license. You can, however, fetch GPAW and its associated
dependencies on your own and install it separately. This process, however, has been automated
for your convenience in an executable script.
The GPAW install script install_gpaw can be found in the nlpython binary directory where ATK
2009.06 has been installed. Navigate to this directory and execute the following command:
./install_gpaw
This command will unpack GPAW 0.5.3667 and install it into ATK such that it becomes available to ATK and VNL as a standard Python module. The use of GPAW depends on ASE, the
Atomistic Simulation Environment. ASE comes pre-installed in ATK.
In order to run GPAW, the Atomic PAW setups are needed. These setups are installed by the
GPAW install script into the share directory where ATK has been installed and is automatically
referenced when nlpython is run. The install script installs version 0.5.3574 of these setups.
More information about the setups is available from the GPAW website here.
67
External Calculators
EXECUTION
Once GPAW has been installed, it can be accessed and used as a standard Python module
within nlpython. This enables the execution of a GPAW Python script gpaw_script.py by
executing:
nlpython gpaw_script.py
Alternatively, GPAW can be used in interactive mode by executing nlpython to bring up an
interactive prompt and e.g. writing:
>>> from gpaw import *
Tutorials, documentation and any further assistance in running GPAW can be obtained on the
GPAW website.
68
CHAPTER 4. NANOLANGUAGE REFERENCE
MANUAL
GEOMETRY
• MoleculeConfiguration
• BulkConfiguration
• DeviceConfiguration
• Dielectric and metallic box regions
CALCULATORS
COMMON PARAMETERS
• IterationControlParameters
• NumericalAccuracyParameters
• DoubleContourIntegralParameters
• SlaterOrbital
• PoissonSolver
• SelfEnergyCalculator
ATK-SE CALCULATOR
EXTENDED HUCKEL CALCULATOR
• HuckelCalculator
• DeviceHuckelCalculator
• HuckelBasisParameters
69
NanoLanguage Reference Manual
ANALYSIS
COMMON ANALYSIS
• ElectronDifferenceDensity
• ElectrostaticDifferencePotential
MOLECULE ANALYSIS
• MolecularEnergySpectrum
BULK ANALYSIS
• Bandstructure
DEVICE ANALYSIS
• TransmissionSpectrum
BRAVAIS LATTICES
• SimpleCubic
• BodyCenteredCubic
• FaceCenteredCubic
• Rhombohedral
• Hexagonal
• SimpleTetragonal
• BodyCenteredTetragonal
• SimpleOrthorhombic
• BodyCenteredOrthorhombic
• FaceCenteredOrthorhombic
• BaseCenteredOrthorhombic
• SimpleMonoclinic
• BaseCenteredMonoclinic
• Triclinic
70
IO
• UnitCell
IO
• nlread
• nlsave
• nlprint
PERIODIC TABLE
• PeriodicTable
PHYSICAL QUANTITIES AND UNITS
• PhysicalQuantity
71
72
CHAPTER 5. APPENDIX
WHAT IS NEW IN NL 2009.06
The new QuantumWise version of NanoLanguage, 2009.06, has been modified a number of
places compared with the previous Atomistix version. In the following we give a brief summary
of the changes.
NAME OF THE BASE MODULE
Previously there were two modules ATK.KohnSham and ATK.TwoProbe; these are now merged
into a single module, with the name NanoLanguage. Thus, the old syntax
from ATK.KohnSham import *
from ATK.TwoProbe import *
should be changed to
from NanoLanguage import *
SPECIFICATION OF TWO-PROBE CONFIGURATIONS
Previously, an open system consisting of a central region and two electrodes was constructed
with the TwoProbeConfiguration. This is now substituted with the DeviceConfiguration class.
The device configuration take as input what was previously known as the equivalent bulk system
of the two-probe configuration.
METALLIC AND DIELECTRIC REGIONS AND THE POISSON SOLVER
In NL 2009.06, it is possible to specify a BoxRegion with a specific dielectric constant or specific
electro-static potential. The regions can be used for both MoleculeConfiguration, BulkConfiguration, and DeviceConfiguration, through the methods set_dielectric_region,
set_metallic_region.
To use metallic and dielectric regions requires that the MultigridSolver is selected as the
Poisson solver. With this solver it is possible to specify both a PeriodicBoundaryCondition,
DirichletBoundaryCondition, or NeumannBoundaryCondition at the unit cell boundaries.
73
Appendix
CALCULATORS
What was previously known as methods is now called calculators. The NL 2009.06 version has
support for calculators that use the extended-Hückel Model. Future versions will also have
support for DFT models. The following script
from ATK.KohnSham import *
configuration = BulkConfiguration(..)
method = KohnShamMethod()
scf_state = executeSelfconsistentCalculation(configuration,method)
density=calculateElectronDensity(scf_state)
is in NL 2009.06 written as
from NanoLanguage import *
configuration = BulkConfiguration(..)
calculator = HuckelCalculator()
configuration.set_calculator(calculator)
density=ElectronDifferenceDensity(configuration)
The calculators take a number of parameters, and a description of these parameters can be found
here:
• HuckelCalculator
• DeviceHuckelCalculator
FILE FORMAT
In NL 2009.06 there is a single NetCDF file format for saving data and configurations. Data is
saved with the nlsave command and read with the nlread command.
ANALYSIS
In NL 2009.06, the analysis is performed on the configuration after a calculator has been attached, see the section called “Calculators”. There are a number of new analysis keywords, see
the section called “Analysis”
PYTHON BASICS
INTRODUCTION
NanoLanguage is a dialect of Python, and all the standard features from Python is available
when you invoke ATK. This implies that when you construct and build up your NanoLanguage
scripts, you will have all the power of Python behind you.
If you are not familiar with Python there are many good tutorials available on the web, such as
• Official Python Tutorial (covers basic Python concepts)
• Dive into Python (a more advanced, but nevertheless, useful guide for beginners)
74
Indentation
If this is your first encounter with NanoLanguage and Python, we recommend that you keep the
Python tutorial and this Python basics page handy as you start using NanoLanguage. The spectrum of features offered by Python is enormous, and a lot of them will not be needed when you
write scripts in NanoLanguage. The minimum set of structures you really should know about
when using NanoLanguage is
• Code indentation
• Comments in Python
• Modules
• Lists
• Tuples
• Dictionaries
• For loops
• Objects
• Functions and arguments
In the next few sections, we will discuss the basic usage of the above Python concepts and some
general Python features.
INDENTATION
One important point you must know, before you embark on writing your first NanoLanguage
script is that Python relies on indentation when interpreting your script. If your code is not
correctly indented, Python will stop executing the provided script and return an error. Precisely,
when and how you should indent code in your scripts, will become apparent through the examples in this manual; a brief example, however, showing how to define a function illustrates
the point
def myNewMethod():
print 'Hello World'
The colon “:” and the indentation of the following line tells us that the print statement is a part
of the myNewMethod() function. The indentation determines if the code belongs to the defined
function or to the remaining code.
It is important to know that using both spaces and tabulation when indenting code sections or
statements could mean trouble. The reason for this is that tabulation might not be interpreted
the same way in different editors. This could become an issue if you work on the same script
using different operating systems or collaborate with others on writing them. Some editors allow
you to specify the number of spaces that should be inserted when pressing the TAB key, and
we recommend that you use this option when available or simply use the SPACE key for indentation to increase interoperability.
This will do for now, but keep in mind that Python code must be properly indented and never
to use both types of indentation in the same script. For a more complete discussion of the
indentation rules used in Python see this on-line resource on Indenting Code.
75
Appendix
COMMENTS
A comment line in Python starts with a the character “#”
# This is a comment line in Python
print 'This line will be executed'
The first line is ignored when interpreting the Python script. The second line will print the words
This line will be executed
to the screen.
Longer (multi-line) comments can be made using triple quotes
a = 2
"""
A value was just assigned to a
We will now assign a value to b
Are you ready?
"""
b = 3
print "a x b = ", b*a
The lines between the triple quotes are ignored by the Python interpreter so the result printed
by the above would be
a x b = 6
In Python, it does not matter whether you use single quotes (') or double quotes (") for declaring
a triple-quoted region.
IMPORTING MODULES
A Python module is a file containing a collection of functions, classes, and many other tools
that initially are not available when Python is invoked. In some sense, you may think of a Python
module as a library. You load a Python module by using the import statement. Modules are
typically imported in three different ways
• either by importing the entire module, for example
import math
#
x
y
z
Entire math module is now available
= 3.14
= math.cos(x)
= math.sin(x)
• or by importing specific elements from the module, for example
from math import cos
# Only cos() has been loaded from the math module
76
Lists
x = 3.14
y = cos(x)
• or by importing all methods from a module
from math import *
#
x
y
z
All names have been loaded from the math module
= 3.14
= cos(x)
= sin(x)
As mentioned above, a “#” denotes a comment in Python. Everything past this character, but
still on the same line, will not get interpreted.
You will find more information on modules in the Python tutorial, whereas an overview of the
math module is provided here.
LISTS
A list is an object used to collect elements. Lists are created as easy as
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
romans = ['a', 'b', 'c', 'd']
gases
= ['Hydrogen', 'Helium']
The last of the above examples creates a list containing two strings and saves the defined list in
a variable gases. Lists can contain several different data types at the same time, which makes
it a very flexible data structure.
Elements in a list are numbered starting from zero – so the first element in the list gases (Hydrogen) can be accessed as
print gases[0]
It is also possible to store different data types within the same list structure
gases = [1, 'Hydrogen', 2, 'Helium']
and extend these with additional elements
gases.extend([7,'Nitrogen']) print gases
which produces
[1, 'Hydrogen', 2, 'Helium', 7, 'Nitrogen']
Here we extended elements from another list to the list gases. Had we instead applied the list
method append() to the list
gases.append([8,'Oxygen'])
print gases
77
Appendix
we get
[1, 'Hydrogen', 2, 'Helium', 7, 'Nitrogen', [8, 'Oxygen']]
So, in this case, the actual list (and not the elements in it!) is added to the gases list. Another
(and shorter) way of adding elements to a list is by using the “+” operator:
a = [1,2]
a = a + [3,4]
print a
which gives
[1, 2, 3, 4]
Additional information on lists can be found here in the Python tutorial.
TUPLES
A tuple is constructed very similar to a list, but by using parentheses instead of square brackets
mytuple = ('uno','duo') # Note the curved parentheses
myothertuple = ('uno', ) # Note the comma just after 'uno'
An important detail in the above example, is that a trailing comma is needed when the tuple
only contains a single element; otherwise, it could not be distinguished from an ordinary parentheses construction. For example,
t = ('uno',) # t is a tuple
s = ('uno') # s is 'just' a string
Contrary to a list, a tuple is immutable, meaning that, once it is defined, its values can not be
changed. For example, doing this
mytuple = ('uno','duo')
mytuple[1] = 'quattro'
is illegal and results in the output
Traceback (most recent call last): File "<stdin>", line 1, in ?
object does not support item assignment
TypeError:
Here, Python raises the error
TypeError: object does not support item assignment
since the above assignment is illegal. Python informs that the error occurred on “line 1”. This
is the kind of message you would get when using Python interactively. Had we used it in a
script, the line number would refer to the actual line in the script.
Combinations of tuples and lists are allowed. To set up a collection of vectors to describe atomic
coordinates, we may use lists and tuples in this fashion
78
Dictionaries
atom_coordinate_1 = (0.1, 0.2, 0.3) atom_coordinate_2 = (0.4, 0.5, 0.6)
atom_coordinate_3 = (0.7, 0.8, 0.9)
collection_of_atoms = [
atom_coordinate_1,
atom_coordinate_2,
atom_coordinate_3
]
print collection_of_atoms
producing the output
[(0.10000000000000001, 0.20000000000000001, 0.29999999999999999),
(0.40000000000000002, 0.5,
0.59999999999999998),
(0.69999999999999996, 0.80000000000000004, 0.90000000000000002)]
Here, we have displayed the output over several lines for aesthetic reasons.
For more details on tuples, consult this section of the Python tutorial.
DICTIONARIES
Often it can be useful to assign tags or a keys to different values, in order distinguish among
these. This can be accomplished in Python by using so-called dictionaries. In Python, a dictionary is called a dict. A dict is created like this
myDict = {'username' : 'henry', 'password' : 'secret'}
print myDict['username']
which yields
henry
In this example, username and henry are a key:value pair. So is password and secret. Note that
dictionaries are created using curly braces “{}” (tuples use parentheses “()” and lists use square
brackets “[]”).
There is no internal ordering in a dict, i.e. keys and values are not stored in the same order as
they are entered into the dict. Values in the dict are accessed via their key. A value can be
associated with several keys, whereas a key may be associated with a single value only.
Two frequently used methods associated with a dict are keys() and values(). The method keys
() returns a list containing the keys of the dict whereas values() returns the values. For example
myDict = {'username':'henry','password':'secret'}
print myDict.keys()
print myDict.values()
producing
['username', 'password'] ['henry', 'secret']
It is also possible to query a dict regarding its length using the method len()
79
Appendix
myDict = {'username':'henry','password':'secret'} print 'myDict has
length', len(myDict)
resulting in the output
myDict has length 2
The return value of len() corresponds to the number of key:value pairs in the dict. You can find
more information about dict usage here in the Python tutorial.
FOR LOOPS
Once we have created lists, it would be nice if we had an automatic way of addressing its
individual elements. Python offers this functionality by using a for-loop construction, e.g.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for x in numbers:
print x,
which generates the output
1 2 3 4 5 6 7 8 9
Another way to use a for-loop is when constructing iterative loops in numerical algorithms.
Here is a simple example using Newton-Raphson iteration for determining √2
x = 20.0
for i in range(8):
x = x - (x*x - 2.0)/(2.0*x)
print x
which converges quadratically to √2 as
10.05
5.12450248756
2.75739213842
1.74135758045
1.44494338196
1.41454033013
1.41421360012
1.41421356237
Python has lots of so-called built-in functions, for example the range() function, which we have
just used above.
The range() function returns a list containing all positive integers less than the argument (including zero), which was passed to the range(). The for-loop now iterates over all the elements
generated by the range(8) call, performing a Newton update of the variable x for each iteration
step of the loop. The value of the first element in a list and the increments between neighboring
elements can be controlled by calling range() like this
80
Objects
for i in range(9,21,3):
print i
giving rise to the output
9
12
15
18
It is also possible to find the length of a list (or a tuple) using the built-in len() function. This
can neatly be combined with a for-loop to iterate over a list. For example
m = range(6)
for i in range(len(m)):
print m[i],
produces
0 1 2 3 4 5
So, len() returns the length (i.e. the number of elements) of the list. This is then used to create
a new list (using the range() function) over which the for-loop iterates. The comma “,” at the
end of the print statement instructs Python to suppress printing a new line character. Otherwise,
each number would have been printed on separate lines.
Consult the links for-loop, range() and len() for more info on loop construction in Python tutorial.
OBJECTS
Many of the structures which you work with in both NanoLanguage and Python are so-called
objects. An object is a structure, which contains a lot of handy functions for accessing and
manipulating the data assigned to the object. These special functions are called methods. Let
us see how we work with these in practice. If we define a list like
numbers = [1, 5, 3, 6, 2, 8, 7, 9, 4]
the
variable
numbers
in
fact
refers
to
a
list
object
holding
the
numbers
[1,5,3,6,2,8,7,9,4]. A list object contains several helpful methods, one of them being
reverse().
You call reverse() like this
numbers.reverse()
print numbers
which gives the output
[4, 9, 7, 8, 2, 6, 3, 5, 1]
Another list method is sort(), which sorts the elements of a list
81
Appendix
numbers.sort()
print numbers
producing
[1, 2, 3, 4, 5, 6, 7, 8, 9]
You can always use the built-in Python function dir() to display information about the functionality provided by a given object. For example,
print dir(list)
returns the following methods for the list type
['append', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', sort']
For instructions about their specific usage, e.g. for reverse(), you can apply Python's built-in
help system using the built-in help function. So, to get more information on the method reverse
(), invoke help like this
help(list.reverse)
producing the output
Help on method_descriptor:
reverse(...)
L.reverse() -- reverse *IN PLACE*
For further information about Python objects, consult the following entry in Python tutorial.
FUNCTIONS AND ARGUMENTS
Very often, you will find that you keep copying and repeating almost identical segments of your
Python code. A common approach to avoid this redundancy, is to encapsulate these structures
in a so-called function. By doing this, you keep your code readable, as well as concise and
clear. Besides this, you also avoid reinventing the wheel every time your start on a new problem.
Instead, you merely grab the function you made in a previous script.
We will use the above Newton iteration scheme as an example. To encapsulate this in a function, we could do the following
def newton():
x = 20.0
for i in range(10):
x = x - (x*x - 2.0)/(2.0*x)
print x
In the above, the def statement declares the begin of the definition of the function newton().
This also instructs the Python interpreter that all indented lines following the colon “:” belong
82
Functions and Arguments
to the function definition. Indention is very important: All lines belonging to the function must
be indented by the same number of spaces within the region that defines function. We may then
call the function, simply as
newton()
yielding
10.05
5.12450248756
2.75739213842
1.74135758045
1.44494338196
1.41454033013
1.41421360012
1.41421356237
1.41421356237
1.41421356237
Even though this already makes things easier to use, the function newton() still has certain short
comings. For example, it would be nice, if we could
• supply the initial guess (currently x = 20 is always used).
• set the maximum number of iterations steps.
In Python, we do this by passing arguments to the function. Here is an implementation of the
above wish list by passing arguments to the function newton()
def newton(n,x):
for i in range(n):
x = x - (x*x - 2.0)/(2.0*x)
print x
newton(8,4.0)
giving
2.25
1.56944444444
1.42189036382
1.41423428594
1.41421356252
1.41421356237
1.41421356237
1.41421356237
The function now uses 8 iterations steps and the initial guess for the root is set to 4.0. Still, this
is somewhat useless. Suppose that we actually wanted to use the result of the calculation (the
numerical value of √2) in some subsequent parts of our script. We solve this problem by letting
the function return the result of the calculation, which we then may “grab” and store in a new
variable. Here is how
def newton(n,x):
for i in range(n):
x = x - (x*x - 2.0)/(2.0*x)
return x
83
Appendix
x = newton(8,4.0)
print 'sqrt(2) = ', x
giving the output
sqrt(2) =
1.41421356237
This is more satisfactory, but there are still some handy features regarding function definitions
that can make life even nicer for us. Often we might be completely satisfied with using x =
2.0 and n = 8, when we call the newton() function. To avoid supplying this redundant information, we can define default values for the function arguments. We accomplish this by
specifying arguments in the following way
def newton(n=10, x=2.0):
for i in range(n):
x = x - (x*x - 2.0)/(2.0*x)
return x
If we are happy about the default settings, we may invoke the function by calling it as newton
(). On the contrary, should the default settings be changed, we may also invoke the function
by calling newton(8,2.0). When the variables for a Python function are specified like above,
they are called optional variables as opposed to required variables which have no default value.
This is certainly handy, but what if we often wanted to change the initial guess for x whereas
the value of n should be kept at the default setting? It is possible to override the default value
by explicitly naming the variable like this:
newton(x=3.0)
which overrides the default value of x while keeping the default value of the argument n. This
way of assigning values to variables makes it possible to specify the variables of the function in
whichever order you prefer:
newton(x=2.0, n=30)
The above is a valid call to the newton() function. You may include both optional and required
variables when calling a function. In this case, however, the order is important! Once you have
specified your first variable by name, no more variables may be specified according to order.
If you want to know more on specifying functions and their arguments, please see the function
section of the Python tutorial or this on-line resource on optional and required arguments.
USING NUMPY IN NANOLANGUAGE
The NumPy module is used throughout NanoLanguage to e.g. store values from analysis functions. It can be used to perform advanced mathematical operations at much faster pace than
using Python lists. NumPy objects resembles lists but they contain a lot more functionality. We
ship NanoLanguage with built-in NumPy support to easily facilitate its usage.
A few major differences between ordinary lists and a NumPy array can be seen from this short
NanoLanguage script:
84
Using NumPy in NanoLanguage
from numpy import array
a = array([1,2]) # a NumPy array
a = a+[3,4]
print a
Output:
[4, 6]
a = [1,2]
a = a+[3,4]
print a
# an ordinary Python list
Output:
[1, 2, 3, 4]
NumPy arrays can in many ways be regarded as matrices as they have much the same functionality:
a = array([[1,2],[3,4]])
a = a * [3,4]
print a
Output:
[[ 3 8]
[ 9 16]]
print a.trace()
Output:
19
a.transpose()
print a
Output:
[[ 3 9]
[ 8 16]]
print a.trace()
Output:
85
Appendix
19
Note in the above that the values 8 and 9 changed place in the matrix, however, the trace of
the matrix remains the same.
NumPy arrays may also be converted into lists
a = array([[1,2],[3,4]])
print a.tolist()
Output:
[[1, 2], [3, 4]]
There are many more possibilities using arrays from the NumPy module, plus it is usually faster
than iterating through for-loops or using lists!
More information about the NumPy module can be found at the NumPy homepage or by using
the dir() command on a NumPy array object. Details on how NumPy can be used for performance can be found on the Python speed/performance tips page.
PYTHON PACKAGES IN NANOLANGUAGE
A number of Python packages are part of the ATK distribution and can be used from the nlpython executable
Table 5.1: Python packages available from the nlpython executable
Package
Load Command Description
NumPy
import numpy
matplotlib import pylab
Support for linear algebra and numerical routines
Support for 2D plotting
math
import math
Support for a number of standard mathematical functions
ase
import ase
Support for a number of atomic-scale calculators
MAKING A 2D PLOT
The following script uses the NumPy and Matplotlib modules for making a 2D plot
from NanoLanguage import *
import pylab
x = numpy.linspace(-1,5,10)
y = numpy.exp(x)
pylab.figure()
pylab.plot(x,y)
pylab.show()
Note that the NumPy package is automatically loaded with the NanoLanguage module, and the
import numpy
86
Making a 2D Plot
statement is not needed.
87
88
BIBLIOGRAPHY
[1] ATK Manual “ATK version 2009.06”,
Atomistix A/S (www.atomistix.com).
[2] Phys. Rev. B 65, 165401, 2002 M. Brandbyge, J.-L. Mozos, P. Ordejón, J. Taylor, and K. Stokbro.
Phys. Rev. B, 65, 165401, 2002 (link).
[3] Math. Comp. 19, 577, 1965 C.G. Broyden. Math. Comp., 19, 577-593, 1965 (link).
[4] Phys. Rev. B 63, 54416, 2001 W.H. Butler, X.-G. Zhang, T.C. Schulthess, and J.M. MacLaren. Phys.
Rev. B, 63, 54416, 2001 (link).
[5] Phys. Rev. Lett. 45, 566, 1980 D.M. Ceperley and B.J Alder. Phys. Rev. Lett., 45, 566, 1980
[6] Phys. Rev. 136, B864, 1964 P. Hohenberg and W. Kohn. Phys. Rev., 136, B864, 1964 (link).
[7] Phys. Rev. B. 13, 5188, 1976 H.J. Monkhorst and J.D. Pack. Phys. Rev. B., 13, 5188, 1976 (link).
[8] Phys. Rev. Lett. 77, 3865, 1996 J.P. Perdew, K. Burke, and M. Ernzerhof. Phys. Rev. Lett., 77, 3865,
1996 (link).
[9] Phys. Rev. B 23, 5048, 1981 J.P. Perdew and A. Zunger. Phys. Rev. B, 23, 5048, 1981 (link).
[10] Chem. Phys. Lett. 73, 393, 1980 P. Pulay. Chem. Phys. Lett., 73, 393, 1980. (link)
[11] Nature 419, 906, 2002 R.H.M. Smit, Y. Noat, C. Untiedt, N. Lang, M.C. van Hemert, and J.M. van
Ruitenbeek. Nature, 419, 906, 2002 (link).
[12] J. Phys.: Condens. Matter 14, 2745, 2002 J.M. Soler, E. Artacho, J.D. Gale, A. García, J. Junquera,
P. Ordejón, and D. Sánchez-Portal, J. Phys.: Condens. Matter, 14, 2745, 2002.
[13] Comp. Mat. Sci. 27, 151, 2003 K. Stokbro, J.L. Mozos, P. Ordejón, M. Brandbyge, and J. Taylor.
Comp. Mat. Sci., 27, 151, 2003. (link)
[14] Phys. Rev. B 63, 245407, 2001 J. Taylor, H. Guo, and J. Wang. Phys. Rev. B, 63, 245407, 2001
(link).
[15] J. Phys. Cond. Mat. 16, S5819, 2004 D. Wortmann, G. Bihlmayer, and S. Blügel.
Mat., 16, S5819, 2004 (link).
J. Phys. Cond.
[16] Phys. Rev. Lett. 80, 890, 1998 Y. Zhang and W. Wang. Phys. Rev. Lett., 80, 890, 1998 (link).
[17] S. Datta S. Datta, “Electronic Transport in Mesoscopic Systems”, Cambridge University Press, (United
Kingdom), 1997.
[18] Theor. Chim. Acta. (1992) 82: 189-205 P. Culot, G. Dive, V.H. Nguyen, and J.M. Ghuysen. Theor.
Chim. Acta., 82, 189-205, 1992 (link).
89
Bibliography
[19] J. Chem. Phys. 113, 9978 (2000) G. Henkelman and H. Jonsson. J. Chem. Phys., 113, 9978, 2000
(link).
[20] Phys. Rev. B 65, 144433 (2002) H. L.Meyerheim, P. Popescu, N. Jedrecy. M. Vedpathak, M. SauvageSimkin, R. Pinchaux, B. Heinrich, and J. Kirchner. J. Chem. Phys., 113, 9978, 2000 (link).
[21] neb-98 H. Johnson, G. Mills, and K.W. Jacobsen. “Classical and Quantum Dynamics in Condensed
Phase Systems”, World Scientific, (Singapore), 1998 (link).
[22] Phys. Rev. B 67, 115404, 2003 K.S. Thygesen, M.V. Bollinger, and K.W. Jacobsen. Phys. Rev. B,
67, 115404, 2003 (link). Phys. Rev. Lett., 97, 237205, 2003.
[23] Phys. Rev. B 61, 7965, 2000 J. Cerda, F. Soria, and Phys. Rev. B, 61, 7965, 2000 (link).
[24] J. Phys. F 15, 851, (1985) M. P. Lopez Sancho, J. M. Lopez Sancho, and J. Rubio. J. Phys. F., 15,
851, 1985 (link).
[25] Phys. Rev B. 77, 155301, (2008). H. H. Sørensen, P. C. Hansen, D. E. Petersen, S. Skelboe, and K.
Stokbro. Phys. Rev. B, 77, 155301, 2008
[26] Phys. Rev. B. 59, 11936 (1999) S. Sanvito, C. J. Lambert, J. H. Jefferson, and A. M. Bratkovsky. Phys.
Rev. B, 59, 11936, 1999 (link).
[27] J. Chem. Phys. {\bf 20}, 837 (1952). M. Wolfsberg, and L. Helmholtz.
1952
J. Chem. Phys., 20, 837,
[28] J. Chem. Phys. 68, , 5498 (1978) M. H. Whangbo, and R. Hoffmann. J. Chem. Phys., 68, 5498,
1978
[29] J. Am. Chem. Soc. 100, 3686 (1978). J. H. Ammeter, H. B. Burgi, J. C. Thibeault, and R. Hoffmann. J. Am. Chem. Soc., 100, 3686, 1978
90
CORE NANOLANGUAGE ELEMENTS
The subsequent sections provide separate entries for each NanoLanguage class and function.
91
92
MoleculeConfiguration
MoleculeConfiguration — Class for representing an isolated structure, i.e a molecule.
SYNOPSIS
Namespace: NanoLanguage
Object MoleculeConfiguration(
elements,
cartesian_coordinates,
xyz_format
)
DESCRIPTION
Construction of an atomic configuration from its elements and the corresponding Cartesian
coordinates. The input can be given in two ways: (i) Either by supplying the elements and Cartesian coordinates as two separate lists of the same length, or (ii) by supplying a formatted XYZ
string as input.
List of Arguments
elements
A sequence containing the elements of the configuration.
cartesian_coordinates
A sequence containing a sequence of atomic coordinates
for each element in the configuration,
xyz_format
A XYZ formatted string representing the configuration.
When the xyz_format argument is used, the arguments
elements and cartesian_coordinates cannot be used.
OBJECT METHODS
A MoleculeConfiguration object provides the following query functions:
• get_calculator(): Return the calculator attached to the configuration, i.e. the calculator that
will be used for both simulation and analysis.
• get_cartesian_coordinates(): The Cartesian coordinates of the atoms.
• get_dielectric_regions(): Get the dielectric regions for the configuration.
• get_elements(): The elements of the configuration.
• get_metallic_regions(): Get the metallic regions for the configuration.
• get_symbols(): The element symbols of the configuration.
• nlprint(stream, name): Print a string containing an XYZ representation of the MoleculeConfiguration.
stream
The stream the XYZ representation should be written to.
93
MoleculeConfiguration
name
The name of the configuration being printed.
• set_calculator(calculator, initial_state): Attach a Calculator class to the configuration which will be used in calculations involving the configuration.
calculator
The Calculator object (HuckelCalculator) that should
be attached to the configuration.
initial_state
The initial state to be used for this configuration.
• set_dielectric_regions(dielectric_regions): Set the dielectric regions for the configuration.
dielectric_regions
A sequence of BoxRegions.
• set_metallic_regions(metallic_regions): Set the metallic regions for the configuration.
metallic_regions
A sequence of BoxRegions.
• update(): Using the configurations set calculator, a self-consistent solution is generated.
USAGE EXAMPLES
Define the geometry of and construct a water molecule:
# Import NanoLanguage modules
from NanoLanguage import *
# Set up elements and positions
elm = [ Oxygen, Hydrogen, Hydrogen ]
pos = [[ 0.000, 0.000, 0.0],
[ 0.757, 0.586, 0.0],
[-0.757, 0.586, 0.0]]*Angstrom
# Add them to a configuration
h2o = MoleculeConfiguration(elm, pos)
Alternative way of specification
# Import NanoLanguage modules
from NanoLanguage import *
# Set up elements and positions using xyz format
h2o = MoleculeConfiguration(xyz_format=
"""3
O
H
H
0.000 0.000 0.0
0.757 0.586 0.0
-0.757 0.586 0.0""")
NOTES
A molecule is considered to be a system isolated in space. The ATK calculators will place the
molecule within an unit cell, in order to obtain a real space grid for describing the effective
potential of the system.
94
BulkConfiguration
BulkConfiguration — Class for representing a periodic structure, i.e bulk configuration
SYNOPSIS
Namespace: NanoLanguage
Object BulkConfiguration(
bravais_lattice,
elements,
cartesian_coordinates,
cartesian_coordinates
)
DESCRIPTION
Construction of a bulk configuration from a BravaisLattice object bravais_lattice. The additional arguments are the elements, the Cartesian coordinates or fractional coordinates. The
cartesian_coordinates and fractional coordinates can not be given at the same time. The list
arguments containing the elements and coordinates must have the same length.
List of Arguments
bravais_lattice
A BravaisLattice defining the lattice of the bulk configuration.
elements
A sequence containing the elements of the configuration.
cartesian_coordinates
A sequence containing a sequence of atomic coordinates
for each element in the configuration,
cartesian_coordinates
A sequence containing sequences of fractional coordinates
for each element in the configuration
OBJECT METHODS
A BulkConfiguration object provides the following query functions:
• get_bravais_lattice(): Method for obtaining the BravaisLattice associated with a bulk
configuration
• get_calculator(): Return the calculator attached to the configuration, i.e. the calculator that
will be used for both simulation and analysis.
• get_cartesian_coordinates(): The Cartesian coordinates of the atoms.
• get_dielectric_regions(): Get the dielectric regions for the configuration.
• get_elements(): The elements of the configuration.
• get_metallic_regions(): Get the metallic regions for the configuration.
95
BulkConfiguration
• get_symbols(): The element symbols of the configuration.
• nlprint(stream, name): Print a string containing an ASCII description of the BulkConfiguration.
stream
The stream the description should be written to.
name
The name of the configuration being printed.
• repeat(na, nb, nc): Repeat the BulkConfiguration with the integer values na, nb, and
nc along the three primitive unit cell vectors. The repeated system is constructed with a cell
of the type UnitCell.
na
The repetition along the a-axis.
nb
The repetition along the b-axis.
nc
The repetition along the c-axis.
• set_calculator(calculator, initial_state): Attach a Calculator class to the configuration which will be used in calculations involving the configuration.
calculator
The Calculator object (HuckelCalculator) that should
be attached to the configuration.
initial_state
The initial state to be used for this configuration.
• set_dielectric_regions(dielectric_regions): Set the dielectric regions for the configuration.
dielectric_regions
A sequence of BoxRegions.
• set_metallic_regions(metallic_regions): Set the metallic regions for the configuration.
metallic_regions
A sequence of BoxRegions.
• update(): Using the configurations set calculator, a self-consistent solution is generated.
USAGE EXAMPLES
Define the geometry of a lithium BCC crystal
# Import NanoLanguage modules
from NanoLanguage import *
lattice = BodyCenteredCubic( 3.509 * Ang)
li_bcc_bulk = BulkConfiguration(
lattice,
[Lithium],
[ ( 0.0, 0.0, 0.0 ) * Ang ]
)
Specify the geometry of a diamond crystal
# Import NanoLanguage modules
from NanoLanguage import *
elements = [ Carbon ] * 2
96
coordinates = [
( 0.00, 0.00, 0.00 ),
( 0.25, 0.25, 0.25 )
]
diamond_lattice = FaceCenteredCubic( 3.567 * Ang )
diamond = BulkConfiguration(
diamond_lattice,
elements,
fractional_coordinates = coordinates
)
NOTES
ATK recognizes three types of atomic geometries:
• Molecules (MoleculeConfiguration)
• Bulk (BulkConfiguration)
• Two Probe (DeviceConfiguration)
1D or 2D periodic geometries, such as nanotubes, slabs, and atomic chains must be represented
as a BulkConfiguration with sufficient vacuum to isolate the system in the non-periodic directions. A molecule (MoleculeConfiguration) is a 0D system, and the calculators in ATK use
a similar trick for performing calculations on molecule systems.
97
98
DeviceConfiguration
DeviceConfiguration — Class for representing a structure coupled with semi-infinite bulk, i.e.
one-probe, two-probe, etc.
SYNOPSIS
Namespace: NanoLanguage
Object DeviceConfiguration(
central_region,
electrodes
)
DESCRIPTION
Construction of the device configuration class. The DeviceConfiguration is formed from a
central region given as BulkConfiguration, and one or more electrodes given as BulkConfiguration(s) as well.
List of Arguments
central_region
The central described as a BulkConfiguration.
electrodes
Electrodes of the device given as a BulkConfiguration or
a sequence of BulkConfiguration's. If there is only one
given one-electrode it is considered a one-probe. If two
electrodes are given, the device is considered a two-probe,
with the first considered to the left electrode, and the second the right electrode. If three electrodes are given, it is
considered a three-probe, where the third electrode is the
gate electrode.
OBJECT METHODS
A DeviceConfiguration object provides the following query functions:
• get_bravais_lattice(): Method for getting the Bravais lattice of the central region
• get_calculator(): Return the calculator attached to the configuration, i.e. the calculator that
will be used for both simulation and analysis.
• get_cartesian_coordinates(): The Cartesian coordinates of the atoms.
• get_central_region(): Method for obtaining the central region of a DeviceConfiguration
• get_dielectric_regions(): Method for getting the dielectric regions of the central region.
• get_electrodes(): Method for obtaining the electrode BulkConfiguration of a DeviceConfiguration
99
DeviceConfiguration
• get_electrodes_displacement(): Method for obtaining the displacement of the BravaisLattice of the electrodes in the C-direction in order to match the BravaisLattice of the
central_region
• get_elements(): Method for getting the elements of the central region.
• get_metallic_regions(): Method for getting the metallic regions of the central region.
• get_symbols(): The element symbols of the configuration.
• nlprint(stream, name): Print a string containing an ASCII description of the DeviceConfiguration.
stream
The stream the description should be written to.
name
The name of the configuration being printed.
• set_calculator(calculator, initial_state): Attach a Calculator class to the configuration which will be used in calculations involving the configuration.
calculator
The Calculator object (HuckelCalculator) that should
be attached to the configuration.
initial_state
The initial state to be used for this configuration.
• set_dielectric_regions(dielectric_regions): Set the dielectric regions of the central
region.
dielectric_regions
A sequence of BoxRegions.
• set_metallic_regions(metallic_regions): Set the metallic regions of the central region
metallic_regions
A sequence of BoxRegions.
• update(): Using the configurations set calculator, a self-consistent solution is generated.
USAGE EXAMPLES
Construct a device system consisting of a hydrogen molecule connected with two chains of
Lithium atoms.
from NanoLanguage import *
# Define A,B directions of lattice
vector_a = [5.0, 0.0, 0.0]*Angstrom
vector_b = [0.0, 5.0, 0.0]*Angstrom
# setup electrode
electrode = BulkConfiguration(
bravais_lattice=UnitCell(vector_a, vector_b,
[0.0, 0.0, 9.0]*Angstrom),
elements=[Lithium, Lithium, Lithium],
cartesian_coordinates=[[ 2.5, 2.5, 1.5],
[ 2.5, 2.5, 4.5],
[ 2.5, 2.5, 7.5]]*Angstrom
)
# setup Central region
central_region = BulkConfiguration(
bravais_lattice= UnitCell(vector_a, vector_b,
100
[0.0, 0.0, 22.0]*Angstrom),
elements=[Lithium, Lithium, Lithium, Hydrogen, Hydrogen,
Lithium, Lithium, Lithium],
cartesian_coordinates=[[ 2.5,
2.5,
1.5],
[ 2.5,
2.5,
4.5],
[ 2.5,
2.5,
7.5],
[ 2.5,
2.5, 10.5],
[ 2.5,
2.5, 11.5],
[ 2.5,
2.5, 14.5],
[ 2.5,
2.5, 17.5],
[ 2.5,
2.5, 20.5]]*Angstrom
)
#setup Device configuration
device_configuration = DeviceConfiguration(
central_region,
[electrode, electrode]
)
NOTES
• The setup of device configurations with two electrodes
A device system with two electrodes is created by placing two electrode BulkConfiguration to the left and the right of of a central BulkConfiguration. The properties within the
electrode regions are fixed at their bulk properties, while the central region of the device
configuration is described self-consistently. The device configuration must fulfill the following
properties:
◦ The electrodes and the central BulkConfiguration must have the same cell vectors in the A
and B direction.
◦ The C direction must be perpendicular to the A and B directions.
◦ If the left A-B face of the central unit cell is aligned with the left A-B face of the left electrode,
the first atoms in the central unit cell must be identical with the atoms in the left electrode.
See Figure 6 for an example.
◦ If the right A-B face of the central unit cell is aligned with the right A-B face of the right
electrode, the last atoms in the central unit cell must be identical with the atoms in the right
electrode. See Figure 6 for an example.
101
DeviceConfiguration
Figure 6: Upper panel: Example for the constituents of a device system with 2 electrodes. The
constituents are Left Electrode, Central Region, Right Electrode. Note that the first atoms in the central
region must be positioned identical to the atoms in the left electrode. Similarly, the last atoms in the
central region must be positioned relative to the right face of the unit cell, identical to the atoms in the
right electrode. Lower panel: The (periodically-repeated) two-probe system. The unit cell of the central
region is indicated with dashed lines while the unit cells of the electrodes are indicated by solid lines.
102
BoxRegion
BoxRegion — Class for representing an orthorhombic region, i.e. a rectangular box of metallic
or dielectric material.
SYNOPSIS
Namespace: NanoLanguage
Object BoxRegion(
value,
xmin,
xmax,
ymin,
ymax,
zmin,
zmax
)
DESCRIPTION
A box region object. The box is infinite in a direction if the direction is not specified.
List of Arguments
value
The value that should be assigned to the box.
xmin
The lower boundary of the box along the x-axis.
xmax
The upper boundary of the box along the x-axis.
ymin
The lower boundary of the box along the y-axis.
ymax
The upper boundary of the box along the y-axis.
zmin
The lower boundary of the box along the z-axis.
zmax
The upper boundary of the box along the z-axis.
OBJECT METHODS
A BoxRegion object provides the following query functions:
• get_value(): Function for asking for the value of the box region.
• get_xmax(): Function for asking for the maximum x-value of the box
• get_xmin(): Function for asking for the minimum x-value of the box
• get_ymax(): Function for asking for the maximum y-value of the boy
• get_ymin(): Function for asking for the minimum y-value of the box
103
BoxRegion
• get_zmax(): Function for asking for the maximum z-value of the box
• get_zmin(): Function for asking for the minimum z-value of the box
USAGE EXAMPLES
Define a dielectric region with dielectric constant
dielectric_region = BoxRegion(
4.,
xmin = 0*Angstrom, xmax = 41.439*Angstrom,
ymin = 0.5*Angstrom, ymax = 3.57914*Angstrom,
zmin = 5*Angstrom, zmax = 50.4135*Angstrom
)
Define a metallic region with electro-static potential 1 Volt.
metallic_region = BoxRegion(
1*Volt,
xmin = 0*Angstrom, xmax = 41.439*Angstrom,
ymin = 0*Angstrom, ymax = 0.5*Angstrom,
zmin = 5*Angstrom, zmax = 15.*Angstrom
)
NOTES
104
HuckelCalculator
HuckelCalculator — Class for representing calculations using the extended Huckel model for
configurations of the type MoleculeConfiguration and BulkConfiguration.
SYNOPSIS
Namespace: NanoLanguage
Object HuckelCalculator(
basis_set,
numerical_accuracy_parameters,
iteration_control_parameters,
poisson_solver,
weighting_scheme
)
DESCRIPTION
The constructor for the HuckelCalculator.
List of Arguments
basis_set
An object describing the basis set used for the ExtendedHuckel calculation. For further information, please consult
the section.
numerical_accuracy_parameters
The NumericalAccuracyParameters used for the selfconsistent Huckel calculation.
iteration_control_parameters
The IterationControlParameters used for the self-consistent Huckel calculation. For non-self-consistent calculations set this parameter to NotSelfConsistent.
poisson_solver
The Poisson solver used to determine the electrostatic potential.
weighting_scheme
The weighting scheme used for calculating off-site matrix
elements of the Huckel Hamiltonian. For further information, please consult the section.
OBJECT METHODS
A HuckelCalculator object provides the following query functions:
• get_basis_set(): Query method for getting the basis set.
• get_iteration_control_parameters(): Query method for the IterationControlParameters.
• get_numerical_accuracy_parameters(): Query method for the NumericalAccuracyParameters.
105
HuckelCalculator
• get_poisson_solver(): Query method for getting the Poisson solver.
• get_weighting_scheme(): Query method for the Weighting Scheme
USAGE EXAMPLES
Define a Hückel calculator with user defined IterationControlParameters
from NanoLanguage import *
iteration_control_parameters = IterationControlParameters(
damping_factor=0.05,
number_of_history_steps=12,
)
calculator = HuckelCalculator(
iteration_control_parameters=iteration_control_parameters,
)
Define a Hückel calculator without a Hartree term, i.e. non-self-consistent model.
from NanoLanguage import *
calculator = HuckelCalculator(
iteration_control_parameters=NonSelfconsistent
)
Restart a Hückel calculation using the self-consistent state from a previous calculation
from NanoLanguage import *
# Read in the BulkConfiguration with the old scf state
old_calculation=nlread("filename.nc",BulkConfiguration)[0]
# Define the BulkConfiguration with similar number of atoms
new_calculation=BulkConfiguration(...)
# Define the calculator
calculator = HuckelCalculator()
# Attach the calculator and use the old initial state
new_calculation.set_calculator(calculator,initial_state=old_calculation)
NOTES
For the mathematical definition of the extended-Hückel model, see Background Information.
106
DeviceHuckelCalculator
DeviceHuckelCalculator — Class for representing calculations using the extended Huckel
Model for DeviceConfigurations.
SYNOPSIS
Namespace: NanoLanguage
Object DeviceHuckelCalculator(
electrode_calculators,
contour_parameters,
basis_set,
numerical_accuracy_parameters,
iteration_control_parameters,
weighting_scheme,
self_energy_calculator_real,
self_energy_calculator_complex,
poisson_solver,
electrode_voltages
)
DESCRIPTION
A DeviceHuckelCalculator object.
List of Arguments
electrode_calculators
A sequence of HuckelCalculator's containing a calculator for each electrode.
contour_parameters
The DoubleContourIntegralParameters used for the
complex contour integration.
basis_set
An object describing the basis set used for the ExtendedHuckel calculation. For further information, please consult
the section.
numerical_accuracy_parameters
The NumericalAccuracyParameters used for the selfconsistent Huckel calculation.
iteration_control_parameters
The IterationControlParameters used for the self-consistent Huckel calculation. For non-self-consistent calculations set this parameter to NotSelfConsistent.
weighting_scheme
The weighting scheme used for calculating off-site matrix
elements of the Huckel Hamiltonian. For further information, please consult the section.
self_energy_calculator_real
The SelfEnergyCalculator that should be used for real
energies.
107
DeviceHuckelCalculator
self_energy_calculator_complex
The SelfEnergyCalculator that should be used for the
complex energies.
poisson_solver
The Poisson solver used to determine the electrostatic potential.
electrode_voltages
The voltages applied to the electrodes.
OBJECT METHODS
A DeviceHuckelCalculator object provides the following query functions:
• get_basis_set(): Query method for used basis set.
• get_contour_parameters(): Query method for the DoubleContourIntegralParameters.
• get_electrode_calculators(): Query method for the electrode calculators (see HuckelCalculator).
• get_electrode_fermi_levels(): Query method for the electrode Fermi levels.
• get_electrode_voltages(): Query method for the electrode voltages.
• get_iteration_control_parameters(): Query method for the IterationControlParameters.
• get_numerical_accuracy_parameters(): Query method for the NumericalAccuracyParameters.
• get_poisson_solver(): Query method for getting the Poisson solver.
• get_self_energy_calculator_complex(): Query method for getting the self energy calculator for the complex energies.
• get_self_energy_calculator_real(): Query method for getting the self energy calculator
for the real energies.
• get_weighting_scheme(): Query method for the Weighting Scheme
USAGE EXAMPLES
Define a DeviceHuckelCalculator with user defined NumericalAccuracyParameters,
MultigridSolver, and DoubleContourIntegralParameters
numerical_accuracy_parameters = NumericalAccuracyParameters(
grid_mesh_cutoff = 10.*Units.Hartree,
k_point_sampling=(3,2,100),
interaction_max_range = 10.*Angstrom,
)
electrode_poisson_solver = MultigridSolver(
boundary_conditions=[PeriodicBoundaryCondition,
PeriodicBoundaryCondition,
PeriodicBoundaryCondition]
)
poisson_solver = MultigridSolver(
boundary_conditions=[PeriodicBoundaryCondition,
PeriodicBoundaryCondition,
108
DirichletBoundaryCondition]
)
electrode_calculator = HuckelCalculator(
numerical_accuracy_parameters=numerical_accuracy_parameters,
poisson_solver=electrode_poisson_solver
)
contour_parameters = DoubleContourIntegralParameters(
integral_lower_bound=5.0*Units.Hartree
)
device_calculator = DeviceHuckelCalculator(
electrode_calculators=[electrode_calculator,electrode_calculator],
contour_parameters = contour_parameters,
numerical_accuracy_parameters = numerical_accuracy_parameters,
poisson_solver=poisson_solver,
electrode_voltages=(0.2*Volt, -0.3*Volt)
)
Perform a voltage sweep, and calculate I-V characteristics
calculator = DeviceHuckelCalculator()
device_configuration = DeviceConfiguration(...)
# Define voltages for voltage ramp, [0.0,0.1, ..., 1.0]*Volt
voltages = numpy.linspace(0.0,1.0,11)*Volt
v in voltages:
# Set the calculator on the configuration using the old calculation as starting input.
device_configuration.set_calculator(calculator(electrode_voltages=(0*Volt,v)),
initial_state=device_configuration)
# Calculate the transmission
t = TransmissionSpectrum(device_configuration)
# Calculate the current.
current = t.get_current()
print t.get_bias(), t.get_current()
Perform a gate bias scan
calculator = DeviceHuckelCalculator()
device_configuration = DeviceConfiguration(...)
metal_region = BoxRegion(...)
# Define gate_voltages for scan, [0.0,0.1, ..., 1.0]*Volt
gate_voltage=numpy.linspace(0.0,1.0,11)*Volt
for v in gate_voltage:
device_configuration.set_metallic_regions([metallic_region(value = gate_voltage)] )
# Set the calculator on the configuration using the old calculation as starting input.
device_configuration.set_calculator(calculator(), initial_state=device_configuration)
# Calculate the transmission
t = TransmissionSpectrum(device_configuration)
# Calculate the conductance
print t.get_bias(), t.get_conductance()
NOTES
The parameters for the constructor of a DeviceHuckelCalculator object and the parameters of
its electrode calculators must fulfill the following conditions:
109
DeviceHuckelCalculator
• The NumericalAccuracyParameters must be the same for the electrodes and the device.
The central region of the device does not use k-points in the C-direction and this parameter
is only used for the electrodes. The electrodes need a very dense k-point sampling in the C
direction.
• The poisson_solver must be set to the MultigridSolver with the same boundary conditions
in the A and B directions for the electrodes and device. In the C directions the user setting is
ignored and the program always uses PeriodicBoundaryCondition for the electrodes and
DirichletBoundaryCondition for the device.
• The electrode_voltages rise to a shift of the Fermi Levels of the electrodes by
, where
is the applied bias. Thus, a positive
on the right electrode, gives rise to an electron
flow from left to right, corresponding to an electrical current from right to left.
For the mathematical definition of the extended-Hückel model, see Background Information.
110
IterationControlParameters
IterationControlParameters — Class for representing the parameters relevant for SCF iteration
control within self-consistent electronic structure models
SYNOPSIS
Namespace: NanoLanguage
Object IterationControlParameters(
tolerance,
max_steps,
algorithm,
damping_factor,
number_of_history_steps,
start_mixing_after_step,
mixing_variable
)
DESCRIPTION
List of Arguments
tolerance
The accuracy which the SCF loop must reach before termination.
max_steps
The maximum number of iteration steps the SCF loop
should execute.
algorithm
The mixing strategy employed on the mixing variable in the
SCF loop.
damping_factor
The fraction of the output value of the mixing parameter
which is mixed into the next step.
number_of_history_steps
The total number of history steps to take into account for
the mixing algorithm.
start_mixing_after_step
The total number of steps to wait before the mixing algorithm is used.
mixing_variable
The mixing variable used in the SCF loop.
OBJECT METHODS
A IterationControlParameters object provides the following query functions:
• get_algorithm(): Return the mixing algorithm stored by the IterationControlParameters object
• get_damping_factor(): Return the damping factory stored by the IterationControlParameters object
111
IterationControlParameters
• get_max_steps(): Return the maximum steps value stored by the IterationControlParameters object
• get_mixing_variable(): Return the mixing variable stored by the IterationControlParameters object
• get_number_of_history_steps(): Return the number of history steps value stored by the
IterationControlParameters object
• get_start_mixing_after_step(): Return the step to start mixing after value stored by the
IterationControlParameters object
• get_tolerance(): Return the tolerance value stored by the IterationControlParameters object
USAGE EXAMPLES
Setup iteration control parameters for difficult convergence case
from NanoLanguage import *
iteration_control_parameters = IterationControlParameters(
damping_factor=0.05,
number_of_history_steps=12,
)
calculator = HuckelCalculator(
iteration_control_parameters=iteration_control_parameters,
)
NOTES
Currently the only SCF mixing algorithm is a PulayMixer. The Pulay Mixer implements the
Pulay-Kerker method
where
is the input value and
is the output value of the mixing_variable at iteration .
the number_of_history_steps used for finding
The parameter is the damping_factor and
the input value for the next iteration. The variables are obtained by minimizing the Residual
error of the mixing_variable assuming a linear relation between the residual errors of different
iteration numbers.
• A few notes on the variable tolerance are listed in the following.
◦ The tolerance in ATK is not relative, but absolute. For the total energy and the bandstructure energy the internal unit is Hartree, thus for these quantities the tolerance gives the
accuracy as measured in Hartree. For iteration control of a matrix (e.g., the Hamiltonian
or the density matrix) it is maximum value of the difference between the corresponding
matrix elements of the old and new matrix.
This means that the tolerance should be interpreted as given in Hartree for the total energy,
the band-structure energy, and the Hamiltonian, and as dimensionless for the density matrix. The tolerance parameter itself should, however, always be given without any unit!
◦ In order to achieve a better accuracy than the one corresponding to the choice of default
values, it is often a good idea to decrease the tolerance by one or two orders of magnitude.
112
Often, but not always, this will only add a few extra iterations to the calculation, since the
Pulay mixing algorithm usually performs very well once it approaches equilibrium. If only
a fast rough estimation of the results is needed the accuracy can be lowered by increasing
the tolerance value.
113
114
NumericalAccuracyParameters
NumericalAccuracyParameters — Class for representing the parameters for setting numerical
accuracy of a calculation.
SYNOPSIS
Namespace: NanoLanguage
Object NumericalAccuracyParameters(
grid_mesh_cutoff,
k_point_sampling,
radial_grid_sampling,
density_cutoff,
interaction_max_range,
number_of_reciprocal_points,
reciprocal_energy_cutoff,
electron_temperature
)
DESCRIPTION
A NumericalAccuracyParameters object.
List of Arguments
grid_mesh_cutoff
The mesh cutoff to be used to determine the grid sampling.
The grid_mesh_cutoff must be an energy quantity.
k_point_sampling
The k-point sampling in reciprocal space given by the Monkhorst-Park indices.
radial_grid_sampling
The sampling distance in all the radial grids as length quantity. The default is 0.01*Units.Angstrom.
density_cutoff
The density cutoff determines the limit where a density is
considered to to be zero. Smaller values therefore leads to
longer ranges and less sparsity of the models.
interaction_max_range
The interaction max_range determines the maximum allowed interaction distance between two orbital.
number_of_reciprocal_points
The number of reciprocal points used for evaluating twocenter integrals.
reciprocal_energy_cutoff
The energy cutoff in reciprocal space used for evaluating
of the two-center integrals.
electron_temperature
The electron temperature used in determining the shape of
the Fermi function.
OBJECT METHODS
A NumericalAccuracyParameters object provides the following query functions:
115
NumericalAccuracyParameters
• get_density_cutoff(): Query method for getting the density cutoff.
• get_electron_temperature(): Query method for getting the electron temperature.
• get_grid_mesh_cutoff(): Query method for getting the grid mesh cutoff distance.
• get_interaction_max_range(): Query method for getting the density cutoff.
• get_k_point_sampling(): Query method for getting the k-point sampling.
• get_number_of_reciprocal_points(): Query method for getting the number of reciprocal
points used in two-center integration.
• get_radial_grid_sampling(): Query method for getting the radial grid sampling.
• get_reciprocal_energy_cutoff(): Query method for getting the reciprocal cutoff energy.
USAGE EXAMPLES
Define the k-point sampling and real space grid mesh-cutoff.
from NanoLanguage import *
numerical_accuracy_parameters = NumericalAccuracyParameters(
grid_mesh_cutoff=12.0*Hartree,
k_point_sampling=(2, 1, 1),
electron_temperature = 200*Kelvin
)
calculator = HuckelCalculator(
iteration_control_parameters=iteration_control_parameters,
)
Specify the electron temperature in units of eV instead of Kelvin
numerical_accuracy_parameters = NumericalAccuracyParameters(
electron_temperature = 0.02 * electronVolt/Boltzmann_constant
)
NOTES
• The distance between the points in the real space grid,
off,
, through
In atomic units
, is related to the grid_mesh_cut-
, thus for energies in Hartree and distances in Bohr,
.
• When setting interaction_max_range some matrix elements are set to zero. For very long
ranged basis sets this can make the overlap matrix ill defined at certain k-points (i.e. it is not
positive definite), in such cases the matrix diagonalization routine will give a segmentation
fault. The cure is to change the interaction_max_range , i.e. either make it very large to
include all long range elements, or make it small so no long range elements are included.
116
HuckelBasisParameters
HuckelBasisParameters — Class for representing the parameters that determine the properties
of a Huckel basis.
SYNOPSIS
Namespace: NanoLanguage
Object HuckelBasisParameters(
element,
orbitals,
ionization_potential,
onsite_hartree_shift,
number_of_valence_electrons,
wolfsberg_helmholtz_constant,
vacuum_level
)
DESCRIPTION
Construction of the parameters that determines the properties of a Huckel Basis.
List of Arguments
element
The PeriodicTable element associated with the basis set.
orbitals
The basis orbitals.
ionization_potential
The ionization potential for each of the given orbitals
onsite_hartree_shift
The on-site Hartree shift.
number_of_valence_electrons
The number of valence electrons used to determine the
neutral state.
wolfsberg_helmholtz_constant
The Wolfsberg-Helmholtz constant provided as a float.
vacuum_level
The energy level of vacuum.
OBJECT METHODS
A HuckelBasisParameters object provides the following query functions:
• get_element(): Query method for getting the element of the basis set.
• get_ionization_potential(): Query for getting the ionization potential of the basis set.
• get_number_of_valence_electrons(): Query method for getting the number of valence electrons assigned to the basis set.
117
HuckelBasisParameters
• get_onsite_hartree_shift(): Query method for getting the on-site Hartree shift of the basis
set.
• get_orbitals(): Query for getting the orbitals of the basis set.
• get_vacuum_level(): Query method for getting the vacuum level of the basis set.
• get_wolfsberg_helmholtz_constant(): Query method for getting the Wolfsberg-Helmholtz
constant.
• serialize(): Serialize the basis set.
USAGE EXAMPLES
Define an Extended Huckel Basis for Carbon
from NanoLanguage import *
carbon_2s = SlaterOrbital(
principal_quantum_number=2,
azimuthal_quantum_number=0,
slater_coefficients=[ 2.0249*1/Bohr ],
weights=[ 0.76422*1/Bohr**1.5 ]
)
carbon_2p = SlaterOrbital(
principal_quantum_number=2,
azimuthal_quantum_number=1,
slater_coefficients=[ 1.62412*1/Bohr , 2.17687*1/Bohr ],
weights=[ 0.27152*1/Bohr**1.5 , 0.73886*1/Bohr**1.5 ]
)
carbon_3d = SlaterOrbital(
principal_quantum_number=3,
azimuthal_quantum_number=2,
slater_coefficients=[ 1.1944*1/Bohr ],
weights=[ 0.49066*1/Bohr**1.5 ]
)
CarbonBasis = HuckelBasisParameters(
element=Carbon,
orbitals=[ carbon_2s , carbon_2p , carbon_3d ],
ionization_potential=[ -19.88924*eV , -13.08001*eV , -2.04759*eV ],
onsite_hartree_shift=10.207*eV,
number_of_valence_electrons=4,
wolfsberg_helmholtz_constant=2.8,
vacuum_level=0.0*eV,
)
NOTES
Tables with the available parameter sets can be found in the section called “The Extended-Hückel Parameters”.
The overlap matrix,
is the central object in the extended Huckel model, where
one-electron Hamiltonian is defined by
118
is of the type SlaterOrbital. The
where the parameters
and the vacuum_level,
is the ionization_potential, the wolfsberg_helmholtz_constant,
, is used to shift the position of the vacuum level.
is the Hartree potential, which is obtained by solving Poisson's equation for the charge
density
where
is the total charge of atom , i.e. the sum of the Mulliken population
and the ionic charge
.
The width of the Gaussian,
, is specified through the onsite_hartree_shift,
.
Table 7: HuckelBasisParameters
Symbol
HuckelBasisParameters
ionization_potential
wolfsberg_helmholtz_constant
onsite_hartree_shift
vacuum_level
119
120
SlaterOrbital
SlaterOrbital — Class for representing a Slater orbital.
SYNOPSIS
Namespace: NanoLanguage
Object SlaterOrbital(
principal_quantum_number,
azimuthal_quantum_number,
slater_coefficients,
weights
)
DESCRIPTION
Constructor for the Slater orbitals.
List of Arguments
principal_quantum_number
The Principal quantum number (n) of the orbital.
azimuthal_quantum_number
The Azimuthal quantum number (l) of the orbital.
slater_coefficients
The Slater coefficients as inverse length
weights
The weight for each of the Slater coefficients.
OBJECT METHODS
A SlaterOrbital object provides the following query functions:
• get_angular_momentum(): Query method for getting the angular momentum for the orbital.
• serialize(): Method for serializing the Slater orbital.
USAGE EXAMPLES
Define a 1s Slater orbital from a single exponential function
from NanoLanguage import *
carbon_2s = SlaterOrbital(
principal_quantum_number=2,
azimuthal_quantum_number=0,
slater_coefficients=[ 2.0249*1/Bohr ],
weights=[ 0.76422*1/Bohr**1.5 ]
)
Define a 2p Slater orbital as superposition of two exponential functions
from NanoLanguage import *
carbon_2p = SlaterOrbital(
121
SlaterOrbital
principal_quantum_number=2,
azimuthal_quantum_number=1,
slater_coefficients=[ 1.62412*1/Bohr , 2.17687*1/Bohr ],
weights=[ 0.27152*1/Bohr**1.5 , 0.73886*1/Bohr**1.5 ]
)
NOTES
Within the extended-Hückel Model, the electronic structure is expanded in a basis of local
atomic orbitals (LCAO's)
where
is a spherical harmonic and
is a Slater orbital
The Slater orbital is described by the adjustable parameters
, and . These parameters
must be defined for each angular shell of valence orbitals for each element.
Table 8:Slater orbital parameters
Symbol
SlaterOrbital parameters
principal_quantum_number
azimuthal_quantum_number
slater_coefficients
weights
In the current version we provide a Hoffmann parameter set which is appropriate for organic
molecules. The parameter set is available with the keyword HoffmannHuckelParameters.ElementName, where ElementName is the name of the element. For crystal parameters, we refer to
the website of J. Cerda. and his paper [23].
122
DoubleContourIntegralParameters
DoubleContourIntegralParameters — Class for representing the parameters relevant for setting
up a complex contour integration.
SYNOPSIS
Namespace: NanoLanguage
Object DoubleContourIntegralParameters(
integral_lower_bound,
circle_eccentricity,
logarithmic_bunching,
circle_points,
real_axis_point_density,
real_axis_infinitesimal,
real_axis_kbt_padding_factor,
fermi_line_points,
fermi_function_poles
)
DESCRIPTION
List of Arguments
integral_lower_bound
The distance between the lowest Fermi-level to the lowest
energy circle contour point. This must be an energy quantity (default is 1.5 Hartree).
circle_eccentricity
The eccentricity of the circle contour, 0 -> circle, 1 -> line.
logarithmic_bunching
Logarithmic bunching of the circle contour points, 0 -> no
bunching,
circle_points
The number of points on the circle contour.
real_axis_point_density
Spacing between the points on bias window integration
line close to the real axis . This must be an energy quantity,
(default is 0.001 Hartree).
real_axis_infinitesimal
Small imaginary shift of the bias window integration line
from the real axis . This must be an energy quantity (default
is 0.001 Hartree).
real_axis_kbt_padding_factor
The integration line is extended with the amount real_axis_kbt_padding_factor*k_b*T below and above the electrode Fermi levels.
fermi_line_points
The number of points on the line from the Fermi energy
level up to infinity.
fermi_function_poles
The number of poles the Fermi function should have between the Fermi energy level and infinity.
123
DoubleContourIntegralParameters
OBJECT METHODS
A DoubleContourIntegralParameters object provides the following query functions:
• get_circle_eccentricity(): Return the eccentricity of circle contour, 0 -> circle, 1 -> line.
• get_circle_points(): Return the number of points on the circle contour.
• get_fermi_function_poles(): The number of poles, the Fermi function should have between
the Fermi energy level and infinity.
• get_fermi_line_points(): The number of points on the line from the Fermi energy level up
to infinity.
• get_integral_lower_bound(): Return the distance from the lowest Fermi-level to the lowest
energy circle contour point.
• get_logarithmic_bunching(): Return the logarithmic bunching of the circle contour points,
0 -> no bunching, 1 -> all points close to upper circle contour point.
• get_real_axis_infinitesimal(): Return the complex shift of the the non-equilibrium integration line above the real axis.
• get_real_axis_kbt_padding_factor(): Return the scaling of k_b*T used for extending the
line integration line below and above the electrode Fermi levels.
• get_real_axis_point_density(): Return the density of the points on the non-equilibrium
integration line.
USAGE EXAMPLES
Define the most important DoubleContourIntegralParameters
from NanoLanguage import *
contour_parameters = DoubleContourIntegralParameters(
integral_lower_bound = 5.*Hartree,
circle_points = 30,
real_axis_point_density = 0.002*eV,
real_axis_infinitesimal=1e-05*eV
)
NOTES
The double contour defines two equilibrium contours, to the left and to the right of the Fermi
levels, and a real axis non-equilibrium contour between the two Fermi levels. The different
contour integrals are mixed according to the scheme in [2] to give a highly accurate and reliable
calculation of the density matrix at a finite bias.
124
Figure 7: Points on the double contour for an applied bias of 1 Volt. The two equilibrium contours (black
circles, red circles) start at integral_lower_bound = 60.0*eV below the Fermi levels. There are 30
circle_points on each contour, and the ellipsoid form of the circle is due to an circle_eccentricity of
0.3. The point density on the circle is higher near the Fermi levels due to a logarithmic_bunching of 0.3.
The inset shows a magnification of the region around the Fermi levels. We see that each equilibrium
contour has 2 fermi_function_poles points positioned above each Fermi level at the Fermi poles, and
10 fermi_line_points covering the region from the end of the circle contour to infinity. The blue crosses
shows the points on the real axis for the non-equilibrium part of the contour with
real_axis_point_density = 0.01*eV. Note that the non-equilibrium points extend a little below and
above the Fermi levels, due to a real_axis_kbt_padding_factor of 5.
125
126
The following PoissonSolvers are supported by ATK
• MultigridSolver
127
128
MultigridSolver
MultigridSolver — Class for representing a multigrid-based Poisson solver.
SYNOPSIS
Namespace: NanoLanguage
Object MultigridSolver(boundary_conditions)
DESCRIPTION
Constructor for a multigrid-based Poisson solver.
List of Arguments
boundary_conditions
The boundary conditions for the multigrid solver.
OBJECT METHODS
A MultigridSolver object provides the following query functions:
• get_boundary_conditions(): Query method to obtain boundary conditions.
USAGE EXAMPLES
Define a Multi-grid solver with specified boundary conditions on the 6 faces
from NanoLanguage import *
poisson_solver = MultigridSolver(
boundary_conditions=[[DirichletBoundaryCondition, NeumannBoundaryCondition ],
[DirichletBoundaryCondition, DirichletBoundaryCondition],
[PeriodicBoundaryCondition , PeriodicBoundaryCondition ]]
)
calculator = HuckelCalculator(poisson_solver=poisson_solver)
Define a Multi-grid solver with specified boundary conditions in the A, B, and C-direction, but
similar boundary conditions on opposite faces.
from NanoLanguage import *
poisson_solver = MultigridSolver(
boundary_conditions=[DirichletBoundaryCondition,
DirichletBoundaryCondition,
PeriodicBoundaryCondition ]
)
calculator = HuckelCalculator(poisson_solver=poisson_solver)
NOTES
129
130
The following SelfEnergyCalculator are supported by ATK
• DirectSelfEnergy
• RecursionSelfEnergy
• KrylovSelfEnergy
131
132
DirectSelfEnergy
DirectSelfEnergy — Class for representing a self energy calculation using direct diagonalization.
SYNOPSIS
Namespace: NanoLanguage
Object DirectSelfEnergy(
save_self_energies,
lambda_min
)
DESCRIPTION
Constructor for a self-energy calculator based on the direct method. The direct method use direct
diagonalization for getting all the electrode modes.
List of Arguments
save_self_energies
If True, the self energies are stored between iterations for
maximum speed.
lambda_min
The smallest logarithmic decrement of a mode to take into
account.
OBJECT METHODS
A DirectSelfEnergy object provides the following query functions:
• get_lambda_min(): Query method for getting the lambda min value defined in paper (......)
• get_save_self_energies(): Query method for getting the Boolean telling if the self energies
should be saved or not
• set_save_self_energies(): Set method for setting the Boolean telling if the self energies
should be saved or not
USAGE EXAMPLES
Define that the self energy on the real contour is calculated with Direct diagonalization.
calculator=DeviceHuckelCalculator(
self_energy_calculator_real=DirectSelfEnergy() )
NOTES
The DirectSelfEnergy use a diagonalization scheme to find all propagating and decaying modes
of the electrodes. The self energy matrix is then determined from the modes[26].
133
134
RecursionSelfEnergy
RecursionSelfEnergy — Class for representing a self energy calculation using the recursion
method.
SYNOPSIS
Namespace: NanoLanguage
Object RecursionSelfEnergy(
save_self_energies,
tolerance,
maximum_iteration
)
DESCRIPTION
Constructor for a self-energy calculator based on the Recursion method. The Recursion is an
iterative scheme for getting self energies, with convergence O(2^N)
List of Arguments
save_self_energies
If True, the self energies are stored between iterations for
maximum speed.
tolerance
The tolerance of convergence of the self energies before
termination of the recursion.
maximum_iteration
The maximum number of recursion steps allowed before
termination.
OBJECT METHODS
A RecursionSelfEnergy object provides the following query functions:
• get_maximum_iteration(): Query method for getting the maximum iteration
• get_save_self_energies(): Query method for getting the Boolean telling if the self energies
should be saved or not
• get_tolerance(): Query method for getting the tolerance
• set_save_self_energies(): Set method for setting the Boolean telling if the self energies
should be saved or not
USAGE EXAMPLES
Define that the self energy on the complex contour is calculated with the recursion method,
and the self energies are not saved.
calculator=DeviceHuckelCalculator(
self_energy_calculator_complex=RecursionSelfEnergy(
save_self_energies=false) )
135
RecursionSelfEnergy
NOTES
The RecusionSelfEnergy uses the iterative scheme by Lopez, Lopez and Rubio[24] for calculating the self energy matrix.
136
KrylovSelfEnergy
KrylovSelfEnergy — Class for representing a self energy calculation using the iterative Krylov
scheme.
SYNOPSIS
Namespace: NanoLanguage
Object KrylovSelfEnergy(
save_self_energies,
lambda_min
)
DESCRIPTION
Constructor for a self-energy calculator based on the Krylov method. The Krylov scheme use an
iterative approach for getting a subset of all the electrode modes.
List of Arguments
save_self_energies
If True, the self energies are stored between iterations for
maximum speed.
lambda_min
The smallest logarithmic decrement of a mode to take into
account.
OBJECT METHODS
A KrylovSelfEnergy object provides the following query functions:
• get_lambda_min(): Query method for getting the lambda min value defined in paper (......)
• get_save_self_energies(): Query method for getting the Boolean telling if the self energies
should be saved or not
• set_save_self_energies(): Set method for setting the Boolean telling if the self energies
should be saved or not
USAGE EXAMPLES
Define that the self energy on the real contour is calculated with the Krylov method, and the
self energies are saved. Only decay modes with a slower decay than 0.05 are included.
calculator=DeviceHuckelCalculator(
self_energy_calculator_real=KrylovSelfEnergy(
save_self_energies=true,
lambda_min=0.05) )
137
KrylovSelfEnergy
NOTES
The KrylovSelfEnergy uses the iterative Krylov subspace method by H. H. Sørensen et. al. [25]
for calculating the self energy matrix. The lambda_min parameter determines the size of the
Krylov subspace. In the limit lambda_min → 0, the full space will be included.
138
MolecularEnergySpectrum
MolecularEnergySpectrum — Class for calculating the molecular energy spectrum for a MoleculeConfiguration.
SYNOPSIS
Namespace: NanoLanguage
Object MolecularEnergySpectrum(
configuration,
energy_zero_parameter
)
DESCRIPTION
Constructor for the MolecularEnergySpectrum object.
List of Arguments
configuration
The MoleculeConfiguration the molecular energy spectrum should be calculated for.
energy_zero_parameter
Specifies the choice for the energy zero,
OBJECT METHODS
A MolecularEnergySpectrum object provides the following query functions:
• evaluate(): Return the molecular energy spectrum
• get_energy_zero(): Return the energy zero used for the energy scale in this molecular energy
spectrum
• get_fermi_level(): Return the Fermi level in absolute energies used in this molecular energy
spectrum
• get_fermi_temperature(): Return the Fermi_temperatures used in this molecular energy
spectrum
• nlprint(stream): Print a string containing an ASCII table useful for plotting the molecular
energy spectrum.
stream
The stream the molecular energy spectrum should be
written to.
• occupation(): Method for calculating the occupation for these eigenstates.
USAGE EXAMPLES
Calculate the molecular energy spectrum of an ammonia molecule and print out the energy
levels and occupations
139
MolecularEnergySpectrum
from NanoLanguage import *
# Set up configuration
molecule_configuration = MoleculeConfiguration(
elements=[Nitrogen, Hydrogen, Hydrogen, Hydrogen],
cartesian_coordinates= [[ 0.
, 0.
, 0.124001],
[ 0.
, 0.941173, -0.289336],
[ 0.81508 , -0.470587, -0.289336],
[-0.81508 , -0.470587, -0.289336]]*Angstrom )
# Define the calculator
calculator = HuckelCalculator()
molecule_configuration.set_calculator(calculator)
# Calculate and save the molecular energy spectrum
molecular_energy_spectrum = MolecularEnergySpectrum(
configuration=molecule_configuration,
energy_zero_parameter=AbsoluteEnergy
)
nlsave('molecular.nc', molecular_energy_spectrum)
# Extract the energy
energy = molecular_energy_spectrum.evaluate()
occ = molecular_energy_spectrum.occupation()
# ... and print it out
print "level
energy(eV)
occupation"
for i in range(energy.shape[0]):
print ' %d %12.4f %12.4f ' % (i, energy[i].in_units_of(eV),occ[i])
NOTES
• To export the data of a molecular energy spectrum, use the method nlprint.
• The MolecularEnergySpectrum can be visualized with VNL, when saved with nlsave.
140
ElectronDifferenceDensity
ElectronDifferenceDensity — Class for calculating a difference density
SYNOPSIS
Namespace: NanoLanguage
Object ElectronDifferenceDensity(configuration)
DESCRIPTION
A class for calculating the electron difference density for a configuration.
List of Arguments
configuration
The configuration for which the difference density should
be calculated.
OBJECT METHODS
A ElectronDifferenceDensity object provides the following query functions:
• get_shape(): Return the shape of the difference density.
• get_unit_cell(): Return the unit cell for this grid
• get_volume_element(): Return the volume element of the difference density grid
• nlprint(stream): Print a string containing an ASCII table useful for plotting the electron
difference density.
stream
The stream the electron difference density should be
written to.
USAGE EXAMPLES
Calculate the electron difference density and save it to a file
from NanoLanguage import *
# Set up configuration
molecule_configuration = MoleculeConfiguration(
elements=[Nitrogen, Hydrogen, Hydrogen, Hydrogen],
cartesian_coordinates=[[ 0.
, 0.
, 0.124001],
[ 0.
, 0.941173, -0.289336],
[ 0.81508, -0.470587, -0.289336],
[-0.81508, -0.470587, -0.289336]]*Angstrom
)
# Define the calculator
calculator = HuckelCalculator()
molecule_configuration.set_calculator(calculator)
# Calculate and save the electron difference density
141
ElectronDifferenceDensity
difference_density = ElectronDifferenceDensity(molecule_configuration)
nlsave('results.nc', difference_density)
Read in the electron difference density from a file and print
from NanoLanguage import *
# import an electron difference density
difference_density = nlread('results.nc', ElectronDifferenceDensity)[0]
# Get the shape of the data.
shape = difference_density.get_shape()
# Find the volume elements.
dX, dY, dZ = difference_density.get_volume_element()
# Calculate the unit area in the y-z plane.
dAYZ = numpy.linalg.norm( numpy.cross(dY,dZ) )
# calculate density along x integrated over y,z
n_x = [ difference_density[i,:,:].sum() * dAYZ for i in range(shape[0]) ]
#print out the result
dx = dX.norm()
sum = 0 * Units.Bohr**-2
for i in range(shape[0]):
print dx*i, n_x[i]
sum+=n_x[i]*dx
print 'total density=', sum
Read in the electron difference density from a file and calculate multipoles of the density.
from NanoLanguage import *
# import an electron difference density
difference_density = nlread('results.nc', ElectronDifferenceDensity)[0]
# Get the shape of the data.
ni, nj, nk = difference_density.get_shape()
# Find the volume elements.
dX, dY, dZ = difference_density.get_volume_element()
length_unit = dX.unit()
# Calculate the volume of the volume element.
dV = numpy.dot(dX, numpy.cross(dY,dZ)) * length_unit**3
# Get a reference for the data of the difference density.
grid_data = difference_density[:]*Units.e
# Calculate the absoute density sum.
density_abs_sum = abs(grid_data).sum()
# Calculate center of mass
Mi = sum([ i*abs(grid_data[i,:,:]).sum() for i in range(ni)])/density_abs_sum
Mj = sum([ j*abs(grid_data[:,j,:]).sum() for j in range(nj)])/density_abs_sum
Mk = sum([ k*abs(grid_data[:,:,k]).sum() for k in range(nk)])/density_abs_sum
center_of_mass = Mi*dX + Mj*dY+ Mk*dZ
# Calculate monopole
density_sum = grid_data.sum()
m0 = density_sum*dV
#calculate dipole
density_i = sum([ (i-Mi)*grid_data[i,:,:].sum() for i in range(ni)])
density_j = sum([ (j-Mj)*grid_data[:,j,:].sum() for j in range(nj)])
density_k = sum([ (k-Mk)*grid_data[:,:,k].sum() for k in range(nk)])
m1 = (dX*density_i + dY*density_j + dZ*density_k)*dV
# Calculate quadropoles (3 x_i *x_j-r*r delta_ij)*dens
density_ii = sum([ (i-Mi)**2 * grid_data[i,:,:].sum() for i
density_jj = sum([ (j-Mj)**2 * grid_data[:,j,:].sum() for j
density_kk = sum([ (k-Mk)**2 * grid_data[:,:,k].sum() for k
density_ij = sum([ (i-Mi)*(j-Mj)*grid_data[i,j,:].sum() for
142
in range(ni)])
in range(nj)])
in range(nk)])
i in range(ni) for j in range(nj)])
density_ik = sum([ (i-Mi)*(k-Mk)*grid_data[i,:,k].sum() for i in range(ni) for k in range(nk)])
density_jk = sum([ (j-Mj)*(k-Mk)*grid_data[:,j,k].sum() for j in range(nj) for k in range(nk)])
m2 = (dX.outer(dX)*density_ii + dY.outer(dY)*density_jj + dZ.outer(dZ)*density_kk + \
(dX.outer(dY)+dY.outer(dX))*density_ij + (dX.outer(dZ)+dZ.outer(dX))*density_ik + \
(dY.outer(dZ)+dZ.outer(dY))*density_jk) * dV
r2 = sum(m2)
m2 = 3*m2 - numpy.identity(3)*r2
print "center of mass (bohr)
print
print
print
print
= ", center_of_mass
"monopole
(e)
= ", m0
"dipole
(e*bohr)
= ", m1
"quadropole (e*bohr**2) = "
m2
NOTES
• To export the grid data of an electron difference potential, use the method nlprint.
• For the ATK-SE package, ElectronDifferenceDensity, returns the electron difference density,
i.e. the difference between the self-consistent valence charge density and the superposition
of atomic valence densities.
143
144
ElectrostaticDifferencePotential
ElectrostaticDifferencePotential — Class for calculating the Hartree potential corresponding to
a difference density.
SYNOPSIS
Namespace: NanoLanguage
Object ElectrostaticDifferencePotential(configuration)
DESCRIPTION
A class for calculating the electrostatic difference potential for a configuration.
List of Arguments
configuration
The configuration for which the electrostatic difference potential should be calculated.
OBJECT METHODS
A ElectrostaticDifferencePotential object provides the following query functions:
• get_shape(): Return the shape of the electrostatic potential.
• get_unit_cell(): Return the unit cell for this grid
• get_volume_element(): Return the volume element of the electrostatic potential grid
• nlprint(stream): Print a string containing an ASCII table useful for plotting the electrostatic
difference potential.
stream
The stream the electrostatic difference potential should
be written to.
USAGE EXAMPLES
Calculate the electrostatic difference potential and save it to a file
from NanoLanguage import *
# Set up configuration
molecule_configuration = MoleculeConfiguration(
elements=[Nitrogen, Hydrogen, Hydrogen, Hydrogen],
cartesian_coordinates=[[ 0.
, 0.
, 0.124001],
[ 0.
, 0.941173, -0.289336],
[ 0.81508, -0.470587, -0.289336],
[-0.81508, -0.470587, -0.289336]]*Angstrom
)
# Define a calculator
calculator = HuckelCalculator()
molecule_configuration.set_calculator(calculator)
145
ElectrostaticDifferencePotential
# Calculate and save the electrostatic difference potential
potential = ElectrostaticDifferencePotential(molecule_configuration)
nlsave('results.nc', potential)
Read in the electrostatic difference potential from a file and calculate the average along the axis.
from NanoLanguage import *
# Import an ElectrostaticDifferencePotential object
potential = nlread('results.nc', ElectrostaticDifferencePotential)[0]
# Calculate the mean
v_z = numpy.apply_over_axes(numpy.mean,potential[:],[0,1]).flatten() * potential[:].unit()
# Print out the result
dX, dY, dZ = potential.get_volume_element()
dz = dZ.norm()
shape = potential.get_shape()
for i in range(shape[2]):
print dz*i, v_z[i]
NOTES
• To export the grid data of an electrostatic difference potential, use the method nlprint.
• For the ATK-SE package, the class ElectrostaticDifferencePotential represents the electrostatic difference potential, i.e. the difference between the electrostatic potential of the selfconsistent valence charge density and the electrostatic potential from a superposition of
atomic valence densities.
146
TransmissionSpectrum
TransmissionSpectrum — Class for representing the transmission spectrum for a given configuration and calculator.
SYNOPSIS
Namespace: NanoLanguage
Object TransmissionSpectrum(
configuration,
energies,
kpoints,
kpoints_weights,
self_energy_calculator,
energy_zero_parameter,
infinitesimal
)
DESCRIPTION
Constructor for the TransmissionSpectrum object.
List of Arguments
configuration
The two-probe configuration with attached calculator for
which the transmission spectrum should be calculated.
energies
The energies for which the transmission spectrum should
be calculated.
kpoints
The k-points for which the transmission spectrum should
be calculated.
kpoints_weights
The weight of each k-point for which the transmission
spectrum should be calculated.
self_energy_calculator
The SelfEnergyCalculator to be used for the transmission spectrum.
energy_zero_parameter
Specifies the choice for the energy zero.
infinitesimal
Small energy, used to move the transmission calculation
away from the real axis. This is only relevant for recursionstyle self-energy calculators.
OBJECT METHODS
A TransmissionSpectrum object provides the following query functions:
• evaluate(): Return the k-point averaged transmission spectrum
• get_bias(): Return the applied bias
147
TransmissionSpectrum
• get_conductance(electrode_voltages,
electrode_temperatures,
pling_rates): Calculate the differential conductance
cou-
electrode_voltages
The electrode voltages to be used for defining the bias
window for the current calculation. If no voltage is specified it will use the voltages in the self-consistent calculation. If voltages are specified the current will be
obtained non-self-consistent. Must be given as 2 voltages
- for example, [-0.5, 0.5]*Volt
electrode_temperatures
The electrode temperatures to be used the current calculation. If no temperature is specified it will use the
temperature from the self-consistent calculation. If temperatures are specified the current will be obtained nonself-consistent. Given as 2 temperatures - for example,
[100, 200]*Kelvin
coupling_rates
Two fractions (alfa_L, alfa_R) with alfa_L+ alfa_R=1,
which specifies the fraction of the differential voltage,
alfa_L*dV, added to the left electrode_voltage, and ,alfa_R*dV, added to the right electrode voltage. See also
note below. Default [0.5,0.5]
• get_current(electrode_voltages, electrode_temperatures): Calculate the current
with positive direction from left to right
electrode_voltages
The electrode voltages to be used for defining the bias
window for the current calculation. If no voltage is specified it will use the voltages in the self-consistent calculation. If voltages are specified the current will be
obtained non-self-consistent. Must be given as 2 voltages
- for example, [-0.5, 0.5]*Volt
electrode_temperatures
The electrode temperatures to be used the current calculation. If no temperature is specified it will use the
temperature from the self-consistent calculation. If temperatures are specified the current will be obtained nonself-consistent. Given as 2 temperatures - for example,
[100, 200]*Kelvin.
• get_electrode_fermi_levels(): Return the electrodes Fermi levels in absolute energies
• get_electrode_fermi_temperatures(): Return the electrodes Fermi temperature used in this
transmission spectrum
• get_electrode_voltages(): Return the electrode_voltages used in this transmission spectrum
• get_energies(): Return the energies used in this transmission spectrum
• get_energy_zero(): Return the energy zero used for the energy scale in this transmission
spectrum
• get_infinitesimal(): Return the infinitesimal used in for calculating the transmission
• get_kpoints(): Return the k-points used in this transmission spectrum
• get_kpoints_weights(): Return the weights of the k-points used in this transmission spectrum
148
• get_transmission(): Return the transmission coefficients of the transmission spectrum
• nlprint(stream): Print a string containing an ASCII table useful for plotting the transmission
spectrum.
stream
The stream the transmission spectrum should be written
to.
USAGE EXAMPLES
Calculate the transmission spectrum and for each energy print out all k-dependent coefficients
from NanoLanguage import *
# Define A,B directions of lattice
vector_a = [5.0, 0.0, 0.0]*Angstrom
vector_b = [0.0, 5.0, 0.0]*Angstrom
# Setup a device configuration
electrode = BulkConfiguration(
bravais_lattice=UnitCell(vector_a, vector_b,
[0.0, 0.0, 9.0]*Angstrom),
elements=[Lithium, Lithium, Lithium],
cartesian_coordinates=[[ 2.5, 2.5, 1.5],
[ 2.5, 2.5, 4.5],
[ 2.5, 2.5, 7.5]]*Angstrom
)
central_region = BulkConfiguration(
bravais_lattice= UnitCell(vector_a, vector_b,
[0.0, 0.0, 22.0]*Angstrom),
elements=[Lithium, Lithium, Lithium, Hydrogen, Hydrogen,
Lithium, Lithium, Lithium],
cartesian_coordinates=[[ 2.5,
2.5,
1.5],
[ 2.5,
2.5,
4.5],
[ 2.5,
2.5,
7.5],
[ 2.5,
2.5, 10.5],
[ 2.5,
2.5, 11.5],
[ 2.5,
2.5, 14.5],
[ 2.5,
2.5, 17.5],
[ 2.5,
2.5, 20.5]]*Angstrom
)
device_configuration = DeviceConfiguration(
central_region,
[electrode, electrode]
)
# Setup calculators
numerical_accuracy_parameters = NumericalAccuracyParameters(
k_point_sampling=(1, 1, 100))
electrode_calculator = HuckelCalculator(
numerical_accuracy_parameters=numerical_accuracy_parameters)
calculator = DeviceHuckelCalculator(
numerical_accuracy_parameters=numerical_accuracy_parameters,
electrode_calculators=[electrode_calculator, electrode_calculator])
device_configuration.set_calculator(calculator)
# Calculate the transmission coefficient
transmission_spectrum = TransmissionSpectrum(
configuration=device_configuration,
energies=numpy.linspace(-0.5,0.5,10)*eV,
kpoints=MonkHorstPackGrid(3,3,1),
energy_zero_parameter=AverageFermiLevel,
infinitesimal=1e-06*Units.eV
)
149
TransmissionSpectrum
# Print out all k-dependent transmission coefficients
data = transmission_spectrum.get_transmission()
energies = transmission_spectrum.get_energies()
kpoints = transmission_spectrum.get_kpoints()
for i in range(data.shape[0]):
print 'Transmission at energy = %12.6f eV' % (energies[i].in_units_of(eV))
print '
kx
ky
transmission '
for j in range(data.shape[1]):
print '%10.4f %10.4f %16.6e' % (kpoints[j][0],kpoints[j][1],data[i][j])
print
Alternatively to using the MonkHorstPackGrid class, we can also specify the k-points and weights
directly. The k-points are specified in units of the reciprocal lattice vectors. Note that except for
the Gamma point, the k-points have weight 2 due to use of time-reversal symmetry, i.e
.
transmission_spectrum = TransmissionSpectrum(
configuration=device_configuration,
energies=numpy.linspace(-0.5,0.5,10)*eV,
kpoints=[[0.0,0.0,0.0],[0.0,1./3.,0.0],[1./3.,-1./3.,0.0],
[1./3.,0.0,0.0],[1./3.,1./3.,0.0]],
kpoints_weights = [1.,2.,2.,2.,2.],
energy_zero_parameter=AverageFermiLevel,
infinitesimal=1e-06*Units.eV
)
Calculate the current and differential conductance for different electron temperatures in the
electrodes.
temp = numpy.linspace(0,1000,21)
current = []
conductance = []
for t in temp:
current = current + [ transmission_spectrum.get_current(electrode_temperatures=[200.,t]*Kelvin)]
conductance = conductance + [ transmission_spectrum.get_conductance(electrode_temperatures=[200.,t]
print "Temperature[Left]
Temperature[Right]
for i in range(len(temp)):
print "
%6.0f K
%6.0f K
%s
Current
Differential-Conductance "
%s" % (200.,
temp[i], current[i], conductance[i])
NOTES
To export the data of a transmission spectrum, use the method nlsave.
THE CURRENT
The current is calculated from the transmission spectrum using
where is the Fermi function. A positive current goes from left to right. The transmission spectrum is usually insensitive to the value of
and
used in the self-consistent calculation,
however, very sensitive to the value of
and
used in the self-consistent calculation. Thus,
for an accurate estimate of the current, the Transmission spectrum must be calculated from a
self-consistent calculation which used
and
. The self-consistently calculated current is
independent of how the Voltages were applied, it only depends on
.
150
Note that in ATK-SE the chemical potentials of the left electrode,
and the right
electrode,
are defined relative to the Fermi level of the left electrode, and
related to the applied bias through
THE DIFFERENTIAL CONDUCTANCE
The differential conductance is calculated from the Transmission spectrum using
The coupling constants
models how the transmission spectrum couples with
the left and right electrode. For a molecule strongly bound to the left electrode we must have
and
.
A more accurate estimate of the differential conductance which avoid introducing
is
obtained by calculating the self-consistent current at a number of applied biases,
, and performing numerical differentiation
151
152
Bandstructure
Bandstructure — Class for calculating the bandstructure for a BulkConfiguration.
SYNOPSIS
Namespace: NanoLanguage
Object Bandstructure(
configuration,
route,
points_per_segment,
bands_above_fermi_level
)
DESCRIPTION
Constructor for the bandstructure object.
List of Arguments
configuration
The BulkConfiguration for which the bandstructure
should be calculated.
route
The route to take through the Brillouin-zone.
points_per_segment
The number of points per segment of the route.
bands_above_fermi_level
The number of bands above the Fermi level.
OBJECT METHODS
A Bandstructure object provides the following query functions:
• evaluate(): Return the bandstructure
• get_energy_zero(): Return the energy zero
• get_fermi_level(): Return the Fermi level in absolute energy
• get_fermi_temperature(): Return the Fermi_temperatures used in this bandstructure
• get_kpoints(): Return the k-points used in this calculation
• get_route(): Return the route used in this calculation
• nlprint(stream): Print a string containing an ASCII table useful for plotting the bandstructure.
stream
The stream the bandstructure should be written to.
USAGE EXAMPLES
Calculate the band structure of silicon and save it to a file
153
Bandstructure
from NanoLanguage import *
# Setup a BulkConfiguration
bulk_configuration = BulkConfiguration(
bravais_lattice=FaceCenteredCubic(5.4306*Angstrom),
elements=[Silicon, Silicon],
cartesian_coordinates=[[ 0.
, 0.
, 0.
],
[ 1.35765, 1.35765, 1.35765]]*Angstrom)
# Define a calculator
calculator = HuckelCalculator(
basis_set = [CerdaHuckelParameters.Silicon_GW_diamond_Basis])
bulk_configuration.set_calculator(calculator)
# Calculate the bandstructure
bandstructure = Bandstructure(
configuration=bulk_configuration,
route=['G', 'X'],
points_per_segment=40,
bands_above_fermi_level=4
)
# Determine indirect band gap
energies = bandstructure.evaluate()
e_valence_max = energies[0][3]
e_conduction_min = energies[0][4]
i_valence_max=0
i_conduction_min=0
# Locate extrema
for i in range(energies.shape[0]):
#find maximum of valence band
if (energies[i][3] > e_valence_max):
e_valence_max=energies[i][3]
i_valence_max=i
#find minimum of conduction band
if (energies[i][4] < e_conduction_min):
e_conduction_min=energies[i][4]
i_conduction_min=i
# Print out results
print 'Valence band maximum (eV) ',e_valence_max, 'at ',
print bandstructure.get_kpoints()[i_valence_max]
print 'Conduction band minimum (eV)',e_conduction_min, 'at ',
print bandstructure.get_kpoints()[i_conduction_min]
print 'Band gap = %7.4f eV ' % (e_conduction_min-e_valence_max)
Note that the k-points are giving in units of reciprocal vectors, and in these units
.
NOTES
• To export the data of a bandstructure, use the method nlprint.
• Symmetry points of the Brillouin zones can be found here BravaisLattice
154
BravaisLattice
Bravais lattices
— The 14 Bravais lattices used to describe crystal structures.
SYNOPSIS
Namespace: NanoLanguage
Object SimpleCubic(a)
Object BodyCenteredCubic(a)
Object FaceCenteredCubic(a)
Object Rhombohedral(
a,
alpha
)
Object Hexagonal(
a,
c
)
Object SimpleTetragonal(
a,
c
)
Object BodyCenteredTetragonal(
a,
c
)
Object SimpleOrthorhombic(
a,
b,
c
)
Object BodyCenteredOrthorhombic(
a,
b,
c
155
BravaisLattice
)
Object FaceCenteredOrthorhombic(
a,
b,
c
)
Object BaseCenteredOrthorhombic(
a,
b,
c
)
Object SimpleMonoclinic(
a,
b,
c,
beta
)
Object BaseCenteredMonoclinic(
a,
b,
c,
beta
)
Object Triclinic(
a,
b,
c,
alpha,
beta,
gamma
)
Object UnitCell(
vector_a,
vector_b,
vector_c
)
DESCRIPTION
NanoLanguage has built-in support for all 14 three-dimensional Bravais lattices. If the Lattice is
specified with the UnitCell keyword, it is categorized as Triclinic. To allow ATK to take ad-
156
vantage of the symmetries of the lattice, and define the symmetry points in the Brillouin zone,
the user must use the correct Bravais lattice keyword, cf. the above list of lattices.
None of the parameters have any default value, and they must all be specified with units (see
the examples below).
OBJECT METHODS
All Bravais lattice classes share the following member functions:
• get_primitive_vectors(): Returns a NumPy array containing the vectors of the primitive unit
cell.
• get_conventional_vectors(): Returns a list containing the vectors of the conventional unit
cell.
• get_a(): Returns the lattice constant a.
• get_b(): Returns the lattice constant b.
• get_c(): Returns the lattice constant c.
• get_alpha(): Returns the angle alpha.
• get_beta(): Returns the angle beta.
• get_gamma(): Returns the angle gamma.
• get_symmetry_points(): Returns a dict with the symmetry points of the lattice.
Thus, Bravais lattices are classes, and their constructors take at most 6 arguments, corresponding
to the lattice parameters:
For the non-primitive lattices, such as face-centered cubic, the lattice constants correspond to
the conventional cell, not the primitive one. The cell created by ATK and used in the calculations
is, however, the primitive one.
Finally, all Bravais lattices except triclinic have a higher degree of symmetry. This means, that
the lattice parameters are constrained to certain values or relationships. For example, in a simple
. In those cases, the constructors only accept
cubic lattice,
the free parameters as arguments ( , in the cubic case). For a complete list of the free parameters
of each lattice, see the table below.
Table 9: The seven crystal classes; the dots indicate the free lattice parameters.
Bravais lattice
a
Cubic
•
Hexagonal
•
b c
alpha beta gamma
•
Rhombohedral •
•
Tetragonal
•
•
Orthorhombic
• • •
Monoclinic
• • •
Triclinic
• • •
•
•
•
UnitCell
• • •
•
•
•
•
157
BravaisLattice
USAGE EXAMPLES
Specify a face-centered cubic lattice with lattice constants a = 5.1 Å:
from NanoLanguage import *
lattice = FaceCenteredCubic(5.1*Ang)
Specify a base-centered monoclinic lattice with lattice constants a = 4.07 Å, b = 8.02 Å, c =
2.04 Å, and angle beta = 56°:
lattice = BaseCenteredMonoclinic(
a = 4.07*Angstrom,
b = 8.02*Angstrom,
c = 2.04*Angstrom,
beta = 56*degrees
)
Specify a lattice by providing the unit cell vectors:
lattice = UnitCell(
[19.3, 1.0, 0.0]*Angstrom,
[-2.0, 15.0, 1.0]*Angstrom,
[ 0.2, 0.4, 4.9]*Angstrom
)
Print a in Bohr, and the c/a ratio, of a hexagonal lattice:
lattice = Hexagonal(...)
print "a = %g Bohr" % (lattice.get_a().in_units_of(Bohr))
print "c/a = %g" % (lattice.get_a()/lattice.get_c())
Function that prints the lattice vectors, in Angstrom, of a given lattice:
def printLatticeVectors(lattice):
for vector in lattice.get_primitive_vectors():
for i in range(3):
print vector[i].in_units_of(Ang),'
',
print
Print the primitive vectors of a Bravais lattice and the x-coordinate of the first and third primitive
vector:
from NanoLanguage import *
lattice = FaceCenteredCubic(2.5*Angstrom)
vectors = lattice.get_primitive_vectors()
for vector in vectors:
print vector
print vectors[0][0] #x-coordinate of the first vector
print vectors[2][0] #x-coordinate of the third vector
giving rise to the output
[0.0 Ang 1.25 Ang 1.25 Ang]
[1.25 Ang 0.0 Ang 1.25 Ang]
[1.25 Ang 1.25 Ang 0.0 Ang]
0.0 Ang
1.25 Ang
158
NOTES
Use BulkConfiguration to insert atoms in the lattice.
159
160
nlread
nlread
SYNOPSIS
Namespace: NanoLanguage
Object nlread(
filename,
class_type,
object_id
)
DESCRIPTION
Function for reading a NetCDF file and retrieving the data contained within.
List of Arguments
filename
The NetCDF file that objects should be loaded from from.
class_type
Only load objects of this type.
object_id
Only load objects that match object_id.
USAGE EXAMPLES
Restore the self-consistent state of a previous calculation (to save the state, see the Usage Examples for the nlsave function).
from NanoLanguage import *
# Read self-consistent calculations
molecule_configuration_list = nlread(
'nh3_scf.nc',
MoleculeConfiguration
)
# Choose the first configuration in the list
molecule_configuration = molecule_configuration_list[0]
Restore the object with object_id = 0 from the NetCDF file bandstructure.nc (to save the
state, consult the nlsave function).
molecular_energy_spectrum = nlread(filename='spectrum.nc',object_id='id0')
Restore all MolecularEnergySpectrum objects from the file spectrum.nc and select the first
object.
molecular_energy_spectrums = nlread(
'spectrum.nc',
MolecularEnergySpectrum
161
nlread
)
molecular_energy_spectrum = molecular_energy_spectrums[0]
NOTES
162
nlsave
nlsave
SYNOPSIS
Namespace: NanoLanguage
Object nlsave(
filename,
nl_object,
object_id,
labels,
comment
)
DESCRIPTION
Function for saving the given object to a NetCDF file.
List of Arguments
filename
The full or relative filename path that the NanoLanguage
object should be saved to.
nl_object
The NanoLanguage object that should be saved to a
NetCDF file.
object_id
A unique identifier that should be attached to the saved
object.
labels
A list of strings that can serve to tag the object with.
comment
A free-text descriptive comment string that should be attached to the saved object.
USAGE EXAMPLES
Save the self-consistent state of a calculation:
from NanoLanguage import *
# Set up configuration
molecule_configuration = MoleculeConfiguration(
elements=[Nitrogen, Hydrogen, Hydrogen, Hydrogen],
cartesian_coordinates=[[ 0.
, 0.
, 0.124001],
[ 0.
, 0.941173, -0.289336],
[ 0.81508, -0.470587, -0.289336],
[-0.81508, -0.470587, -0.289336]]*Angstrom
)
calculator = HuckelCalculator()
molecule_configuration.set_calculator(calculator)
# Perform SCF loop
molecule_configuration.update()
163
nlsave
# Save state
nlsave('nh3_scf.nc', molecule_configuration)
Restore the self-consistent state from a saved file, calculate the MolecularEnergySpectrum,
and save it to the file spectrum.nc with object_id = 0. This will overwrite any data in the file
spectrum.nc associated with the object_id.
from NanoLanguage import *
# Read self-consistent calculation
molecule_configurations = nlread(
'nh3_scf.nc',
MoleculeConfiguration
)
molecule_configuration = molecule_configurations[0]
# Calculate the molecular energy spectrum
spectrum = MolecularEnergySpectrum(molecule_configuration)
# Save the molecular energy spectrum
nlsave('spectrum.nc', spectrum, 'id0')
NOTES
The nc file is written in the NetCDF format. This is a platform independent format, and the files
can for instance be written on a Linux platform and later be read on a Windows platform.
The content of the file can be converted to ASCII format with the command ncdump.
Each entry in the NetCDF file is associated with a unique id, unique_id. If a new entry is saved
without specifying a unique_id, the entry is appended to the file with an auto-generated
unique_id. If a unique_id is specified which already is present in the file, the old entry is automatically deleted.
164
nlprint
nlprint
SYNOPSIS
Namespace: NanoLanguage
Object nlprint(
object,
stream
)
DESCRIPTION
Print an ASCII representation of the object to the stream pointed to by stream. A typical usage
is to store the data as an ASCII file and then use a third party application for generating a visualization of the data.
List of Arguments
object
The object whose data should be printed.
stream
The stream the data should be printed to.
USAGE EXAMPLES
Print the data of a Bandstructure to the screen
# Set up a bandstructure object
bandstructure = Bandstructure(bulk_configuration)
nlprint(bandstructure)
Store the data of a ElectronDifferenceDensity to the file grid.dat
# Set up an electron difference density
electron_difference_density = ElectronDifferenceDensity(molecule_configuration)
# Store grid data on disk
f = open('grid.dat', 'w')
electron_difference_density.nlprint(f)
f.close()
NOTES
165
166
PeriodicTable
PeriodicTable — A class for representing elements from the periodic table.
DESCRIPTION
A set of classes used for constructing the elements from periodic table.
OBJECT METHODS
A PeriodicTable object provides the following query functions:
• get_atomic_number(): Return the atomic number of the element.
• get_symbol(): Return the elements symbol.
• get_name(): Return the name of the element.
• get_atomic_mass(): Return the atomic mass of the element.
USAGE EXAMPLES
Use the elements Hydrogen and Oxygen to set up a MoleculeConfiguration
# Import NanoLanguage modules
from NanoLanguage import *
# Set up elements and positions
elm = [ Oxygen, Hydrogen, Hydrogen ]
pos = [[ 0.000, 0.000, 0.0],
[ 0.757, 0.586, 0.0],
[-0.757, 0.586, 0.0]]*Angstrom
# Add them to a configuration
h2o = MoleculeConfiguration(elm, pos)
Alternatively, the shorter names H and O can also be used as in
# Import NanoLanguage modules
from NanoLanguage import *
# Set up elements and positions
elm = [PeriodicTable.O, PeriodicTable.H, PeriodicTable.H]
pos = [[ 0.000, 0.000, 0.0],
[ 0.757, 0.586, 0.0],
[-0.757, 0.586, 0.0]]*Angstrom
# Add them to a configuration
h2o = MoleculeConfiguration(elm, pos)
PERIODIC TABLE
The entire set of elements from the periodic system, as well as some of their key properties are
listed in the table below:
167
PeriodicTable
Table 10:Atomic data.
Z
Symbol
Name
Electron
configuration
Valence
configuration
Valence
charge
U / eV
1
H
Hydrogen
1s1
1s1
1
12.848
Helium
1s2
2s2
2
9.0
Lithium
[He]2s1
2s1
1
3.469
2s2
2
3
Li
4
Be
Beryllium
[He]2s2
2
5.935
5
B
Boron
[He]2s22p1
2s22p1
3
8.0
Carbon
[He]2s22p2
2s22p2
4
10.207
Nitrogen
[He]2s22p3
2s22p3
5
11.052
Oxygen
[He]2s22p4
2s22p4
6
13.625
2s22p5
6
7
8
C
N
O
9
F
Fluorine
[He]2s22p5
7
15.054
10
Ne
Neon
[He]2s22p6
2s22p6
8
9.0
11
Na
Sodium
[Ne]3s1
3s1
1
2.982
Magnesium
[Ne]3s2
3s2
2
4.623
Aluminium
[Ne]3s23p1
3s23p1
3
5.682
Silicon
[Ne]3s23p2
3s23p2
4
6.964
3s23p3
12
13
14
Mg
Al
Si
15
P
Phosphorus
[Ne]3s23p3
5
9.878
16
S
Sulfur
[Ne]3s23p4
3s23p4
6
9.205
Chlorine
[Ne]3s23p5
3s23p5
7
10.292
Argon
[Ne]3s23p6
3s23p6
8
9.0
Potassium
[Ar]3d04s1
4s1
1
3.702
Calcium
[Ar]3d04s2
4s2
2
3.977
4s23d1
17
18
19
20
Cl
Ar
K
Ca
21
Sc
Scandium
[Ar]3d14s2
3
9.0
22
Ti
Titanium
[Ar]3d24s2
4s23d2
4
9.0
Vanadium
[Ar]3d34s2
4s23d3
5
9.0
Chromium
[Ar]3d44s2
4s23d4
6
9.0
Manganese
[Ar]3d54s2
4s23d5
7
9.0
4s23d6
23
24
25
V
Cr
Mn
26
Fe
Iron
[Ar]3d64s2
8
9.0
27
Co
Cobalt
[Ar]3d74s2
4s23d7
9
9.0
28
Ni
Nickel
[Ar]3d84s2
4s23d8
10
9.0
Copper
[Ar]3d104s1
4s13d10
11
9.0
Zinc
[Ar]3d104s2
4s23d10
12
9.0
3
5.936
29
30
168
He
Cu
Zn
31
Ga
Gallium
[Ar]
3d104s24p1
4s24p1
32
Ge
Germanium
[Ar]
3d104s24p2
4s24p2
4
6.608
33
As
Arsenic
[Ar]
3d104s24p3
4s24p3
5
8.399
34
Se
Selenium
[Ar]
3d104s24p4
4s24p4
6
9.121
35
Br
Bromine
[Ar]
3d104s24p5
4s24p5
7
8.823
36
Kr
Krypton
[Ar]
3d104s24p6
4s24p6
8
9.0
37
Rb
Rubidium
[Kr]4d05s1
5s1
1
2.495
Z
Symbol
Name
Electron
configuration
Valence
configuration
Valence
charge
U / eV
38
Sr
Strontium
[Kr]4d05s2
5s2
2
3.749
39
Y
Yttrium
[Kr]4d15s2
5s24d1
3
9.0
Zirconium
[Kr]4d25s2
5s24d2
4
9.0
Niobium
[Kr]4d45s1
5s24d3
5
9.0
5s14d5
6
9.0
40
41
Zr
Nb
42
Mo
Molybdenum
[Kr]4d55s1
43
Tc
Technetium
[Kr]4d55s2
5s24d5
7
9.0
Ruthenium
[Kr]4d75s1
5s24d6
8
9.0
Rhodium
[Kr]4d85s1
5s14d8
9
9.0
Palladium
[Kr]4d105s0
4d10
10
9.0
Silver
[Kr]4d105s1
5s14d10
11
9.0
5s24d10
44
45
46
47
Ru
Rh
Pd
Ag
48
Cd
Cadmium
[Kr]4d105s2
12
9.0
49
In
Indium
[Kr]
4d105s25p1
5s25p1
3
5.53
50
Sn
Tin
[Kr]
4d105s25p2
5s25p2
4
4.297
51
Sb
Antimony
[Kr]
4d105s25p3
5s25p3
5
7.657
52
Te
Tellurium
[Kr]
4d105s25p4
5s25p4
6
8.985
53
I
Iodine
[Kr]
4d105s25p5
5s25p5
7
9.448
54
Xe
Xenon
[Kr]
4d105s25p6
5s25p6
8
9.0
55
Cs
Caesium
[Xe]5d06s1
6s15p6
7
9.0
56
Ba
Barium
[Xe]5d06s2
6s25p6
8
9.0
Lanthanum
[Xe]5d16s2
6s25d1
3
9.0
4
9.0
57
La
58
Ce
Cerium
[Xe]
4f25d06s2
6s24f2
59
Pr
Praseodymium
[Xe]
4f35d06s2
6s24f3
5
9.0
60
Nd
Neodymium
[Xe]
4f45d06s2
6s24f4
6
9.0
61
Pm
Promethium
[Xe]
4f55d06s2
6s24f5
7
9.0
62
Sm
Samarium
[Xe]
4f65d06s2
6s24f6
8
9.0
63
Eu
Europium
[Xe]
4f75d06s2
6s24f7
9
9.0
64
Gd
Gadolinium
[Xe]
4f75d16s2
6s25d14f7
10
9.0
65
Tb
Terbium
[Xe]
4f95d06s2
6s24f9
11
9.0
66
Dy
Dysprosium
[Xe]
4f105d06s2
6s24f10
12
9.0
67
Ho
Holmium
[Xe]
4f115d06s2
6s24f11
13
9.0
169
PeriodicTable
Z
Symbol
Name
Electron
configuration
Valence
configuration
Valence
charge
U / eV
68
Er
Erbium
[Xe]
4f125d06s2
6s24f12
14
9.0
69
Tm
Thulium
[Xe]
4f135d06s2
6s24f13
15
9.0
70
Yb
Ytterbium
[Xe]
4f145d06s2
6s24f14
16
9.0
71
Lu
Lutetium
[Xe]
4f145d16s2
6s25d14f14
17
9.0
72
Hf
Hafnium
[Xe]
4f145d26s2
6s25d2
4
9.0
73
Ta
Tantalum
[Xe]
4f145d36s2
6s25d3
5
9.0
74
W
Tungsten
[Xe]
4f145d46s2
6s15d5
6
9.0
75
Re
Rhenium
[Xe]
4f145d56s2
6s25d5
7
9.0
76
Os
Osmium
[Xe]
4f145d66s2
6s25d6
8
9.0
77
Ir
Iridium
[Xe]
4f145d76s2
6s25d7
9
9.0
78
Pt
Platinum
[Xe]
4f145d106s0
6s15d9
10
8.604
79
Au
Gold
[Xe]
4f145d106s1
6s15d10
11
8.604
80
Hg
Mercury
[Xe]
4f145d106s2
6s25d10
12
9.0
81
Tl
Thallium
[Xe]
4f145d106s2
6p1
6s26p1
3
9.0
82
Pb
Lead
[Xe]
4f145d106s2
6p2
6s26p2
4
9.0
83
Bi
Bismuth
[Xe]
4f145d106s2
6p3
6s26p3
5
9.0
84
Po
Polonium
[Xe]
4f145d106s2
6p4
6s26p4
6
9.0
85
At
Astatine
[Xe]
4f145d106s2
6p5
6s26p5
7
9.0
86
Rn
Radon
[Xe]
4f145d106s2
6p6
6s26p6
8
9.0
87
Fr
Francium
[Rn]7s1
7s16p6
7
9.0
7s26p6
88
Ra
Radium
[Rn]7s2
8
9.0
89
Ac
Actinium
[Rn]7s26d1
7s26d1
3
9.0
Thorium
[Rn]7s26d2
7s26d2
4
9.0
90
170
Th
Z
Symbol
Name
Electron
configuration
Valence
configuration
Valence
charge
U / eV
91
Pa
Protactinium
[Rn]
7s25f26d1
7s26d15f2
5
9.0
92
U
Uranium
[Rn]
7s25f36d1
7s25f36d1
6
9.0
93
Np
Neptunium
[Rn]
7s25f46d1
7s25f46d1
7
9.0
94
Pu
Plutonium
[Rn]7s25f6
7s25f6
8
9.0
Americium
[Rn]7s25f7
7s25f7
9
9.0
10
9.0
95
Am
96
Cm
Curium
[Rn]
7s25f76d1
7s25f76d1
97
Bk
Berkelium
[Rn]7s25f9
7s25f9
11
9.0
Californium
[Rn]7s25f10
7s25f10
12
9.0
Einsteinium
[Rn]7s25f11
7s25f11
13
9.0
Fermium
[Rn]7s25f12
7s25f12
14
9.0
7s25f13
15
9.0
98
99
100
Cf
Es
Fm
101
Md
Mendelevium
[Rn]7s25f13
102
No
Nobelium
[Rn]7s25f14
7s25f14
16
9.0
17
9.0
103
Lr
Lawrencium
[Rn]
7s25f147p1
7s25f147p1
104
Rf
Rutherfordium
[Rn]
7s25f146d2
7s25f146d2
18
9.0
105
Db
Dubnium
[Rn]
7s25f146d3
7s25f146d3
19
9.0
106
Sg
Seaborgium
[Rn]
7s25f146d4
7s25f146d4
20
9.0
107
Bh
Bohrium
[Rn]
7s25f146d5
7s25f146d5
21
9.0
108
Hs
Hassium
[Rn]
7s25f146d6
7s25f146d6
22
9.0
109
Mt
Meitnerium
[Rn]
7s25f146d7
7s25f146d7
23
9.0
110
Ds
Darmstadtium
[Rn]
7s15f146d9
7s15f146d9
24
9.0
111
Rg
Roentgenium
[Rn]
7s25f146d9
7s25f146d9
25
9.0
171
172
INDEX
degrees, 0
density_cutoff, 115
DeviceConfiguration, 99
DeviceHuckelCalculator, 107
dielectric_regions, 94, 96, 100
DirectSelfEnergy, 133
DoubleContourIntegralParameters, 123
E
A
a, 157
algorithm, 111
alpha, 157
Ampere, 0
Ang, 0
Angstrom, 0
azimuthal_quantum_number, 121
B
b, 157
Bandstructure, 153
bands_above_fermi_level, 153
BaseCenteredMonoclinic, 155
BaseCenteredOrthorhombic, 155
basis_set, 105, 107
beta, 157
BodyCenteredCubic, 155
BodyCenteredOrthorhombic, 155
BodyCenteredTetragonal, 155
Bohr, 0
Boltzmann_constant, 0
boundary_conditions, 129
BoxRegion, 103
bravais_lattice, 95
BulkConfiguration, 95
C
c, 157
calculator, 94, 96, 100
cartesian_coordinates, 93, 95
central_region, 99
circle_eccentricity, 123
circle_points, 123
class_type, 161
comment, 163
configuration, 139, 141, 145, 147, 153
contour_parameters, 107
coupling_rates, 148
D
damping_factor, 111
electrodes, 99
electrode_calculators, 107
electrode_temperatures, 148
electrode_voltages, 108, 148
ElectronDifferenceDensity, 141
electronVolt, 0
electron_temperature, 115
ElectrostaticDifferencePotential, 145
element, 117
elements, 93, 95
energies, 147
energy_zero_parameter, 139, 147
eV, 0
F
FaceCenteredCubic, 155
FaceCenteredOrthorhombic, 155
fermi_function_poles, 123
fermi_line_points, 123
filename, 161, 163
G
gamma, 157
grid_mesh_cutoff, 115
H
Hartree, 0
hbar, 0 , 0
Hexagonal, 155
HoffmannWeighting, 23
HuckelBasisParameters, 117
HuckelCalculator, 105
I
infinitesimal, 147
initial_state, 94, 96, 100
integral_lower_bound, 123
interaction_max_range, 115
ionization_potential, 117
IterationControlParameters, 111
iteration_control_parameters, 105, 107
K
Kelvin, 0
kpoints, 147
kpoints_weights, 147
173
Index
KrylovSelfEnergy, 137
k_point_sampling, 115
L
labels, 163
lambda_min, 133, 137
logarithmic_bunching, 123
real_axis_point_density, 123
reciprocal_energy_cutoff, 115
RecursionSelfEnergy, 135
Rhombohedral, 155
route, 153
Rydberg, 0
S
M
maximum_iteration, 135
max_steps, 111
metallic_regions, 94, 96, 100
mixing_variable, 111
MolecularEnergySpectrum, 139
MoleculeConfiguration, 93
MultigridSolver, 129
N
na, 96
name, 94, 96, 100
nanometer, 0
nanoNewton, 0
nb, 96
nc, 96
Newton, 0
nlprint, 165
nlread, 161
nlsave, 163
nl_object, 163
non-self-consistent calculation, 106
NonSelfconsistent, 106
number_of_history_steps, 111
number_of_reciprocal_points, 115
number_of_valence_electrons, 117
NumericalAccuracyParameters, 115
numerical_accuracy_parameters, 105, 107
O
object, 165
object_id, 161, 163
onsite_hartree_shift, 117
orbitals, 117
P
PeriodicTable, 167
Planck_constant, 0
points_per_segment, 153
poisson_solver, 105, 108
principal_quantum_number, 121
R
radial_grid_sampling, 115
radians, 0
real_axis_infinitesimal, 123
real_axis_kbt_padding_factor, 123
174
save_self_energies, 133, 135, 137
self_energy_calculator, 147
self_energy_calculator_complex, 108
self_energy_calculator_real, 107
Siemens, 0
SimpleCubic, 155
SimpleMonoclinic, 155
SimpleOrthorhombic, 155
SimpleTetragonal, 155
SlaterOrbital, 121
slater_coefficients, 121
start_mixing_after_step, 111
stream, 93, 96, 100, 139, 141, 145, 149, 153, 165
T
tolerance, 111, 135
TransmissionSpectrum, 147
Triclinic, 155
U
UnitCell, 155
Units.Ha, 0
Units.meV, 0
Units.nm, 0
Units.Ry, 0
V
vacuum_level, 117
value, 103
Volt, 0
W
weighting_scheme, 105, 107
weights, 121
WolfsbergWeighting, 23
wolfsberg_helmholtz_constant, 117
X
xmax, 103
xmin, 103
xyz_format, 93
Y
ymax, 103
ymin, 103
Z
zmax, 103
zmin, 103
175
176