Dear Anders,
Thanks for your reply.
You mean, if there is gate voltage or I have two different electrodes, in order to get a quick convergence, I had better to use electrode_voltages=(0.5*bias,-0.5*bias) than electrode_voltages=(1.0*bias, 0.0*bias)? And If I have the same electrode and there are no gate voltage, electrode_voltages=(0.5*bias,-0.5*bias) and electrode_voltages=(1.0*bias, 0.0*bias) are exactly the same?
Also, another qestion that may related to this thread that if I just want to get the transmission spectrum and current for 1.0 V based on a 0.0 V converged *nc file, I should write in the py file that
device_configuration = nlread("Au-C6H4S2-Au-0.0.nc")[0]
calculator=calculator(
electrode_voltages=(0.5*Volt, -0.5*Volt))
device_configuration.setCalculator(
calculator(),
initial_state=device_configuration)
device_configuration.update()
nlsave("Au-C6H4S2-Au-1.0.nc", device_configuration)
transmission_spectrum = TransmissionSpectrum(
configuration=device_configuration,
energies=numpy.linspace(-2,2,400)*eV,
kpoints=MonkhorstPackGrid(6,6),
energy_zero_parameter=AverageFermiLevel,
infinitesimal=1.36057e-05*eV,
self_energy_calculator=RecursionSelfEnergy(),
)
nlsave("Au-C6H4S2-Au-1.0.nc", transmission_spectrum)
nlprint(transmission_spectrum)
iv_curve = IVCurve(
configuration=device_configuration,
biases=[1.0, ]*Volt,
energies=numpy.linspace(-2,2,101)*eV,
kpoints=MonkhorstPackGrid(6,6),
self_energy_calculator=RecursionSelfEnergy(),
energy_zero_parameter=AverageFermiLevel,
infinitesimal=1e-06*eV,
selfconsistent_configurations_filename="Au-C6H4S2-Au-1.0.nc",
)
nlsave('Au-C6H4S2-Au-1.0.nc', iv_curve)
nlprint(iv_curve)
For the transmission spectrum calculation, I have no doubt, but for the cuurrent calculation, I think the ATK will calculate again the transmission spectrum and then get the current. How can I calculate the current based on the already calculated transmission spectrum?
Thanks so much.
Dear Anders,
Thanks for your reply.
I used TranSIESTA before, and I have to do the transmission spectrum and the current under each bias point. Now I have turned to ATK. And till now I never use ATK to do a current calculation. I just ask this question beacause the IVCurve() class do a implicit loop over bias and store the current in a *nc file. So, I think it would be sometime inconvenient to manipulate the data.
Now, I use the following script to do a tranmission spectrum and current calculation
device_configuration.setCalculator(calculator)
device_configuration = nlread("Au-C6H4S2-Au.nc")[1]
Voltage = [0.0, 0.2, 0.4]*Volt
for bias in Voltage:
calculator=calculator(
electrode_voltages=(bias/2, -bias/2))
device_configuration.setCalculator(
calculator(),
initial_state=device_configuration)
device_configuration.update()
nlsave("Au-C6H4S2-Au-%.1f.nc" % bias.inUnitsOf(Volt), device_configuration)
transmission_spectrum = TransmissionSpectrum(
configuration=device_configuration,
energies=numpy.linspace(-2,2,400)*eV,
kpoints=MonkhorstPackGrid(6,6),
energy_zero_parameter=AverageFermiLevel,
infinitesimal=1.36057e-05*eV,
self_energy_calculator=RecursionSelfEnergy(),
)
nlsave("Au-C6H4S2-Au-%.1f.nc" % bias.inUnitsOf(Volt), transmission_spectrum)
nlprint(transmission_spectrum)
transmission_spectrum.current()
I think this would be very convenient.
Again, I have tested the Au-C6H4S2-Au-*.nc can be used to be the initial guess for the next bias step calculation, and also can be used to do a post analysis calcualtion, such as MPSH, Total Energy, DOS analysis.
With best regards,
/Guangping