I-V curve

Table of Contents

In this chapter you will learn how to calculate the I-V curve of a device - the current as a function of the source-drain bias.

VNL has a convenient tool that takes a NetCDF-file containing transmission spectra taken at different bias and calculates the I-V curve. To use this tool, you just need to set up the calculations that generate the transmission spectra at the desired bias points. In this chapter you will first do it manually for a single value of the bias, and then learn how to set up a loop to generate a whole sequence of finite bias calculations.

Self-consistent calculation at finite bias - a single point

Setting up the calculator

In the VNL main window, select the file li-h2.nc and drag the Device Configuration from the Result Browser onto the Script Generator icon . Change the output file name to li-h2.nc - the finite bias calculation will be saved in the same file as the zero-bias results, so that the I-V curve can easily be plotted.

Add a New Calculator and a TransmissionSpectrum analysis item to the right panel. Also add a ElectrostaticDifferencePotential analysis item, since you will need this result later in the tutorial.

Now double-click the New Calculator in the "Script" panel and set the Right electrode voltage to 1 V.

Also open the TransmissionSpectrum block and change the range to [-2, 5] eV and select the Krylov method to match the already calculated transmission spectrum for zero bias.

Next send the job to the Job Manager and start it. The script will save a new Transmission spectrum to the file li-h2.nc.

Calculating the I-V curve

Launch the Custom Analyzer tool by clicking the Analyzer icon in the main VNL window.

The Custom Analyzer tool comes with a few build-in analysis tools. Besides these tools, it is possible to write scripts that enables the tool to perform special analysis functions.

Start the built-in I-V curve analyzer by selecting AnalyzersI-V Curve from the menu.

Next drag and drop the file li-h2.nc onto the NC file drop zone and you should see the following plot:

The left-most plots show the I-V and dI/dV-V curves. The curves were obtained by importing each transmission spectrum in the NC file and integrating the transmission coefficient over the bias windows. In the I-V curve tool it is possible to change the electron temperature in the electrodes, and thereby the Fermi distribution used, when performing the integration over the bias windows.

The right-most plot shows the transmission spectra for the different bias voltages; the spectra have been displaced vertically for clarity. The green/blue wedge embraces the part of the transmission which is inside the bias window.

Visualizing the voltage drop

It is possible to determine the current from a calculated transmission spectrum analysis using a Python script (in fact this is how the I-V Curve analyzer works). An example script current.py is given below

# Read in the transmission spectra from the NetCDF file
transmission_spectra = nlread("li-h2.nc",TransmissionSpectrum)

# Compute the current for all of them
for t in transmission_spectra:
    t.current()

current.py

Dropping this script on the Job Manager will produce the following output

Another example of analysis carried out via scripting is to compute the voltage drop across the device. Assuming that you have performed the earlier calculations and that the NetCDF file li-h2.nc is available, you can calculate the voltage drop by dropping the following script named voltage_drop.py on the Job Manager.

# Read the electrostatic difference potentials
potential = nlread('li-h2.nc', ElectrostaticDifferencePotential)

# Calculate the voltage drop
voltage_drop = potential[1]-potential[0]

# Save the voltage drop, properly labeled
nlsave('li-h2.nc', voltage_drop, object_id='voltagedrop')

voltage_drop.py

This will add a new electrostatic difference potential object to li-h2.nc. A convenient ID “voltagedrop” is attached to the object for easy identification in the Result Browser. Select the object there and plot it as a contour plot. Then drag the Device configuration onto the open Viewer window.

The potential in the right part of the device is -1 eV, corresponding to the applied bias. (The colorbar extends a bit further, but the potential is exactly -1 eV on the right-hand side edge of the central region, since this is the boundary condition set in the Poisson equation solver.)

[Note] Note

The relatively high current running through the device at 1 Volt has the effect that the atoms in the central region cannot reach an equilibrium electron distribution. Part of the assumption in the computational model is that atoms close to the electrodes have an equilibrium distribution, but results from one-dimensional systems with a high current must be treated and analyzed with care. In the present case it has the effect that the potential in the left part of the device never reaches 0 eV until the very edge (where it is constrained to attain this value, the sharp red area).

Performing an I-V scan with scripting

The I-V curve computed above only contained two points - normally you will want at least 5-10 points on the curve. In that case it is much more convenient to use Python scripting, rather than manually setting up a new script for each bias. Below is a script which performs self-consistent calculations at 0.25, 0.5, 0.75 and 1 Volt.

def transmission(configuration):
    # Calculate the transmission spectrum and save it in a file
    transmission_spectrum = TransmissionSpectrum(
        configuration=device_configuration,
        energies=numpy.linspace(-2,5,101)*eV,
    )
    nlsave('li-h2_iv.nc', transmission_spectrum)

# Read in the converged zero-bias calculation
device_configuration = nlread("li-h2.nc",DeviceConfiguration)[0]
calculator = device_configuration.calculator()
    
# Calculate and save the transmission spectrum for zero bias
transmission(device_configuration)

# Define the bias voltages for the I-V curve
voltage_list=[0.25, 0.5, 0.75, 1.0]*Volt

# Loop over the bias voltages
for voltage in voltage_list:
    # Set electrode voltages and use the self-consistent state 
    # of the previous calculation as starting guess
    device_configuration.setCalculator(
          calculator(electrode_voltages=(voltage/2, -voltage/2)), 
          initial_state=device_configuration)

    # Calculate and save the transmission spectrum for each bias
    transmission(device_configuration)

ivscan.py

The script is very generic can be used for almost any system, where you have a converged zero-bias calculation already. The script also has an additional advantage compared to the manual approach: the calculation for the next higher bias point uses the converged calculation for the lower bias as starting guess. This reduces the calculation time considerably, and can in fact in larger systems mean the difference between successfully converging the finite-bias calculation and not.

When the calculation is finished, you can again use the Custom Analyzer (drop the NetCDF file li-h2_iv.nc on the dropzone) to get a more detailed I-V curve.