Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Topics - Nordland

Pages: [1]
Quest for an organic solar cell.
I thought I wanted to share some work that I have been puzzling with a bit. It is a search for theoretical organic solar cell.
I have choosen to share it both because it would be fun to hear any input on this matter, but this might not be worthy of a paper, but still I find it personally quite interesting.

The outset
Being able to build a organic solar cell, would be an extremely promising source of clean energy, and the master of getting the most out of the solar energy, is nature itself, so clearly there is some potential for finding a good candidate.
The type of systems that I will consider, would be build from three components. An optical receptor, that will absorb photons to create excited electrons, an organic wire that will transfer the excited electron away from the receptor, and finally an interface between the organic wire and metallic contact (drain).
I got inspired by beta-Carotene because it has in nature an active optical group in each end of a isoprene wire, so my goal is to model an organic solar cell based on a beta-carotene hybrid.

The only computational resource I have, is my own laptop, so therefore there is a limitation of the convergence studies that I have done on some of the parameters.

Initially, I started out using LCAO-DFT, but I found out that I could get the exactly the same results with SlaterKoster, so I decided to be more elaborate in terms of the calculated derived properties, as I could do it much faster with SlaterKoster.

The organic wire
So in order for the organic wire to be well suited for the optical solar cell, it must be able to transfer a electron from the receptor to the drain (conducting). Secondly it would be preferable if it was not optical active in the range of the sun-light.

So the system I modeled is Isoprene, which I built in the builder in a minute or so starting from nothing. Then I optimized the system using DFT taking both stress and forces into consideration.

The bandstructure of Isoprene shows that it is semi-conductor with a small band gap around 0.2 eV, meaning that it would NOT be conducting at T=0 Kelvin, but possibly at finite temperature. If not, this could potential mean that isoprene is unsatisfying as the wire. I will return to this in a second.

I also calculated the absorption in the wire, and found it to not absorb any significant light in the visible range of the sun light. I have plotted the optical absorption together with the spectrum of the sun-light at earth level being reflected from a mirror at 37 degrees. (This is the typical solar cell setup where you have mirrors collecting the sunlight onto your solar cell) Therefore in terms of not being an optical active, it is a promising choice for an organic wire.

Since the organic wire has to be conducting and being so for a wide range of temperatures it is important to investigate whatever it is conducting or not.
The first naive approach is to calculate the conduction for a series of different electron temperatures and see the behavior of that. (This is the blue curve in the graph below) But it is an open question how good this relates to experiments. The band gap is very small and any vibrations in the chain would properly affect this directly, which this approach would not show.

Therefore I decided to try something else ( and perhaps new? ). I performed a MD calculation of 10000 time steps for a series of different temperatures, and for each step and each temperature I calculate the conductance using NEGF, and using the Born-Oppenheimer approximation, I justified that that the average of the ensemble of the configurations could be a valid estimated for a measurable conductance.

As you can see this method (Green dots) predicted that the conductance of isoprene is almost 6-7 times as good at room temperatures as the normal approach predicts, and more important that isoprene is conducting in a much broader temperature range. It is therefore likely that isoprene is an ideal wire for connecting the receptor to the drain.

Comming up
* Connection with the drain.

This error is very rare, and the solution for it to disable the non-working drivers and go back to software rendering
by writing in terminal before starting VNL.

It has come to my attention that there is a common mistake by people calculating the dielectric constant.

The problem is that they find a weird scaling of the dielectric constant with respect to system size (as it should not scale with the system size in isotropic material), and I will here try to explain why this the case.

The OpticalSpectrum has two parameters for control the number of bands to include in the Kubo-Greenwood calculation, and by default these are both 4. For most semi-conductors this is very sufficient, however if the semi-conductor is repeated people have observed a different between the repeated and unrepeated system. This can easliy be fixed by increasing the number of bands to include.

I have created a small case study to create demonstration of the problem and the solution. The system being modeled is atomic carbon chain. In the first picture "unrepeated_singleband.png" you will see the imaginary part dielectric constant for this system plotted against the bandstructure for the same system. You will see a dramatic increase in the imaginary part of the dielectric constant at around 7 eV. When comparing this to the bandstructure it becomes clear that this optical process is related to the electrons in the gamma of the Brillouin zone. As the title of the file says we have only included one band of valence and conduction in the calculation.

The system is then doubled in size, and as excepted there is band folding, and if we only allow a single valence band and conduction band, then at the Gamma point there is energy difference between for the highest valence band and lowest conducting band around 3 eV, but this optical transition is prohibited due to the symmetry (It is the same band zone folded),
and therefore the imaginary part of the dielectric constant is zero for all energies.
This can be seen in "repeated_singleband.png".

If the number of bands in increased in this calculation to include more valence bands and conduction bands, we see that we get the exact same dielectric constant for the repeated/unrepeated system. This can be seen in "repeated_multiband.png"

I have attached a small script for generating these plots if you want to try to yourself.

If you want to calculate the the effective mass of the electrons and holes in a semi-conductor,
I have created a small script for helping your in doing so. I have attached it to this post.

The script has been updated in a new improved version for support of anisotropic and/or indirect band gap semi-conductors.
And I have modified the tutorial to be on Si, since I could find experimental value of this material.
( However it should be noted, that one must manually enter k-points around which it should evaluate the effective mass,
and if the minimum is present at several places in the brillouin zone, the constant MC and MH must be adjusted represent this.
For instance in Si the lowest point of the conducting band is located 6 places in the brillouin zone, and hence MC must be set to 6)

Simple perform a calculation, and store the results in a NetCDF file,
and edit the script to point at this netcdf file, and the run it as normal:

It will produced the following output ( based on a quick Si calculation i maded):
# Electron effective mass
# ---> E                     = 0.238248813366
# ---> Conductivity          = 0.25471464737 me
# ---> Density of states     = 1.17006025908 me
# ---> Longitudinal          = 1.3419675337 me
# ---> Transverse (1)        = 0.165647613285 me
# ---> Transverse (2)        = 0.200168158579 me
# Hole effective mass (1)
# ---> E                     = -0.23358258646
# ---> Conductivity          = 0.641102831335 me
# ---> Density of states     = 0.641102831335 me
# ---> Longitudinal          = 0.641102831305 me
# ---> Transverse (1)        = 0.64110283176 me
# ---> Transverse (2)        = 0.64110283094 me
# Hole effective mass (2)
# ---> E                     = -0.233582586849
# ---> Conductivity          = 0.64110283086 me
# ---> Density of states     = 0.64110283086 me
# ---> Longitudinal          = 0.64110283089 me
# ---> Transverse (1)        = 0.641102830435 me
# ---> Transverse (2)        = 0.641102831255 me
# Hole effective mass (3)
# ---> E                     = -0.233582587149
# ---> Conductivity          = 0.0926545669658 me
# ---> Density of states     = 0.0926545669658 me
# ---> Longitudinal          = 0.0926545669658 me
# ---> Transverse (1)        = 0.0926545669658 me
# ---> Transverse (2)        = 0.0926545669658 me

Silicon has density of states effective mass of 1.08, conductivity effective mass of 0.26, and average hole mass of 0.56,
and I have collected the numbers in a small table below, and I think the agreement is pretty good.

Effective Mass   Experimental   CalculationError
Density of States1.081.170.09
Hole (average)0.560.460.1

Inspired by the tutorial on Graphene nanoribbons, I decided to try to make a module for calculating the
current density using ATK 2008.10, trying to prove that the current flows along the edges of graphene nanoribbons.

The module is almost complete, and I have done some studies on these nanoribbons, and I will post more information in the comming days, as they get in,
but just as a teaser, I present one of my first results.

A cut-plane of the current density, orthogonal on the axis of transport, for a metallic nanoribbon. The brighter the color of the cut-plane, the stronger the current density flows in this area, and judging from this, it appears that everyone is right, when they states that the current runs along the the egdes.

Hey everyone!

I did some snooping around - and I managed to create a function that enables the us to calculate the projected density of states using the newest version of ATK.
It requires some very advanced stuff, so I have combined into a small function that looks like all the other nanolanguage functions.
I have attached the file with the function and an example of the usage of it.
It can only calculate the projected density of states onto atoms, not orbitals, but I guess this is a good start :)
You can use just like the builtin calculateDensityOfStates, but it is called calculatedProjectedDensityOfStates and accepts the keyword
projection_atoms being a list of the indices of the atoms of the central region to project onto.
For example projection_atoms =[3,4,5,6]. I have tested that it gives the same density of states as ATK does, if you desire to project onto all the atoms,
so it should be correct.

Please free to use and please comment on it you can use it or have suggestions for modifications.

P.S Added a small script of example of usage.

Hey everyone.

Apart from Magneto-tunnel junctions, the thing I have spent most of my time modeling is molecular junctions,
and I have build some NL scripts for understanding these better, and try to enable me to speed up the process
of selecting the molecules for creating the molecular junction with the correct properties, and understand how to customize
the molecules to have the properties that I desire.
The idea is too limit the number of twoprobe calculations since they take alot of time, but you can't not leave them out for good.

For this I have written alot of code, and it is a big mesh, but I have tried to clean up in it and I thought I wanted to share the process
with you guys, if you have interest in molecular junctions.

  • Select the molecule - use the molecular builder in VNL or some other database.
  • Perform a calculation of the molecule and store the netcd file
  • Calculate the joint density of states to determine the distance between the energies levels in the molecule
  • Calculate the susceptibility of the molecule to determine between shich states the electrons couple.
  • Compare with transport calculation to see agreement

Tomorrow I will post scripts and a example of the usages of these scripts.

Hey everyone.

Alot of people have asked for getting the data of the real space properties like the electron density, effective potential etc
printed to a file. I have always used this little script which does the job.

I have attached the script to this post and the usage is pretty easy.
from export3d import *
And whola! you get the following output to your screen
# -----------------------------------------------------
#   x(bohr)      y(bohr)      z(bohr)      G(1/Bohr**3)
# -----------------------------------------------------
           0            0   0.25031613     0.0086930653
           0            0   0.50063226     0.0077889859
           0            0   0.75094839     0.0068486091
           0            0   1.0012645       0.0059856004


Scripts, Tutorials and Applications / Atomic Chainbuilder.
« on: December 22, 2008, 14:13 »
I have also posted this script under the Q&A, but I think I would share it in here as well.

The script should be adjusted to your needs, but no worry the script should be self-explained,
and it can be edited straight forward. When you are done, you can either drag and drop into the VNL
in order to visualize it or perform a calculation on the wire.

The script can build any mono-atomic wires, it will also allow your create defects/donor atoms into the
wire. It will also make you able to create a buckling of the wire. Futhermore you can also put a strain on
your wire, if it is that you are desired.

Please feel free to use - I would like ideas to improvements! :)

Hey everyone.

I have created a script for calculating the approximative stress on the unitcell for bulk crystal. I have combined this
with the relaxation module that comes with ATK, and tries to use the same interface as the one official included.

Given a bulk configuration and method to be used, it will first optimized the internal structure of the unitcell according to
the forces on the atoms, and then it will calculate the approximative stress on the unitcell, and scale the unitcell according to
the stress. It will then calculate the optimized internal geometry again, and calculate the stress again and repeat this cycle until
all the forces and stress are below a certain threshold.

Normally the fastest way to calculate the optimized geometry for bulk configuration in ATK is using the equation of state,
however for more complex systems like wurtzite ZnO, it requires alot of calculations! In these cases I think this script is
superior, however for simple systems like Si(FCC) the equation of states is properly better.

However when the goal is to determine the effect of pressure and strain on the unitcell on the band gap etc, it is important that the unitcell
is in equilibrium, and therefore I find this script quite usefull.

The usage is pretty straight forward - download this script and use it in the following way:
from stress_optimizers import *
optimized_conf = calculateOptimizedBulkConfiguration(configuration,
                                                                                         stress_tolerance = 5.0e-3*Units.eV/Units.Ang**3,
                                                                                         maximum_iterations = 100)

  • The configuration is the bulk configuration to be optimized.
  • The method is the KohnShamMethod to be used for this optimization.
  • The runtime parameters for control the verbosity and checkpoint file.
  • The geometric_optimization_parameters is the ATK geometric optimization parameters for the forces.
  • The stress tolerance thresshold for the optimization - default 5.0e-3 ev/Ang**3
  • Maximum iterations is the maximum number of iterations of the unitcell optimization.

Feel free to use.

Updated 1:
Updated the script to correctly support cells where the conventional cell and the primitive cell is not identical.

Updated 2:
Updated with version that are MPI safe and allows the user to constrain atoms.

If you want to calculate the bandgap of a semi-conductor or an insulator I have created a small script
that does it for you and I have attached it to this post.

Simple perform a calculation, and store the results in a NetCDF file,
and edit the script to point at this netcdf file, and the run it as normal:

It will produced the following output ( based on ZnSe calculation ):
Band Gap =  1.18165139396 eV

For test purposes I have also attached the script for performing calculation on znse

Updated the scripted in a slight faster version, but it also calculates the indirect band gap now.

For those experts, that want to use ASE inside ATK 2008.10, I have written a small guide for installation of ASE into ATK 2008.10.
It is very straight forward, it requires 3 shell commands and you need to insert a small piece of code into the of ASE.

Use at own risk - but it should be risk-free.

0) Download and unpack ASE from (Atomic Simulatoin Environment)
1) Execute in a shell "mkdir -p PATH_TO_YOUR_ATK/lib/python2.4/config"
2) Execute in a shell "touch PATH_TO_YOUR_ATK/lib/python2.4/config/Makefile"
3) Enter the unpacked ASE directory and edit the file - Go to line 11 where it writes "import sys".
    Insert the following line "sys.argv = sys.argv[1:]" on line 12. Save and exit.
4) Now install just like your would normally "ATH_TO_YOUR_ATK/bin/atk install"

And now you can start up ATK and write from ase import * and you are ready to use ASE from within ATK.

   Other similar python packages can be installed in the exact same way!

Hey everyone.

I just wanted to share with you a script that I made for calculating the atomization energy of molecules using NanoLanguage.
You can use the script either by copying the code directly into your own program or
 you can also just download the script and store it along your other scripts and use it by writing:
from AtomizationEnergy import *
E = calculateAtomizationEnergy(molecule, method, verbosity)

Please feel free to use and share! :)

Hey everyone.

I just thought I wanted to share with you a small script for calculate the voltage drop using two selfconsistent calculations
on a twoprobe device.

The usage is straight forward:
1)  perform a calculation of a twoprobe at zero bias and store the results in a netcdf file.
2) Do the same for the finite bias, and store this in another netcdf file.
3) Modify the script to match the names of your two calculations, and run it using atk

Then you are done, and you will recieve the voltage drop in a VNL file for visualization in VNL and the
average voltage drop will be printed to the screen. Alternative you can pipe the screen into a log file and plot it using fx GNUplot.

I have attached the script and I have attached a graph showing the voltage drop calculated using this script for a Li-H2-Li system.

Pages: [1]