# IVCharacteristics¶

class IVCharacteristics(configuration, filename, object_id, gate_regions=None, gate_source_voltages=None, drain_source_voltages=None, gate_potential_alignment=None, energies=None, kpoints=None, kpoints_weights=None, self_energy_calculator=None, energy_zero_parameter=None, infinitesimal=None, log_filename_prefix=None, number_of_processes_per_task=None, device_transmission_method=None, enforce_zero_transmission_in_band_gap=None, source_electrode=None)

Constructor for the IVCharacteristics object.

Parameters: configuration (DeviceConfiguration) – The device configuration with attached calculator for which to perform the study. The configuration must include at least one metallic region acting as the gate. filename (str) – The full or relative filename path the Study object should be saved to. See nlsave(). object_id (str) – The name of the study that the Study object should be saved to within the file. This needs to be a unique name in this file. See nlsave(). gate_regions (int | list of int) – An index or list of indices of the metallic regions present in the configuration for which to apply the gate voltage. Default: All metallic regions present in the configuration. gate_source_voltages (PhysicalQuantity of type voltage | sequence of PhysicalQuantity of type voltage) – A list of the gate-source voltages for which the current will be calculated the next time the object is updated. It is assumed that the source electrode is grounded, and that the gate-source voltage is defined as V_gs = V_g - V_s. Therefore, in each transmission calculation, the source electrode voltage will be set to zero and the gate regions voltage to V_gs. Default: [0.0] * Volt drain_source_voltages (PhysicalQuantity of type voltage | sequence of PhysicalQuantity of type voltage) – A list of the drain-source voltages for which the current will be calculated the next time the object is updated. It is assumed that the source electrode is grounded, and that the drain-source voltage is defined as V_ds = V_d - V_s. Therefore, in each transmission calculation, the source electrode voltage will be set to zero and the left electrode voltage to V_ds. Default: [0.5] * Volt gate_potential_alignment (GatePotentialAlignment) – A parameter indicating the difference between the work function of the gate electrodes and the work function of a reference electrode, plus an optional energy shift. Such difference is used to determine the reference potential for V_gs=0, effectively shifting an I-Vgs characteristics. Default: GatePotentialAlignment(reference_electrode=Left, shift=0.0*eV, use_intrinsic_chemical_potential=False) energies (list of PhysicalQuantity of type energy) – A list of the energies for which the TransmissionSpectrum at each voltage should be calculated. Default: Energy range that covers the bias window, plus $$30 k_B T$$. kpoints (MonkhorstPackGrid | RegularKpointGrid | AdaptiveGrid | list (size n_kpoints) of list (size 3) of float) – The k-points for which the TransmissionSpectrum at each voltage should be calculated. Note that the k-points must be in the same xy-plane. Set nc=1 for MonkhorstPackGrid and RegularKpointGrid. Default: MonkhorstPackGrid(na, nb) where (na, nb) is the sampling used for the self-consistent calculation. kpoints_weights (list (size n_kpoints) of float) – The weight of each k-point for which the TransmissionSpectrum at each voltage should be calculated. Default: The weights corresponding to the MonkhorstPackGrid/RegularKpointGrid, or equal weights if the k-points are specified as a list. self_energy_calculator (DirectSelfEnergy | RecursionSelfEnergy | SparseRecursionSelfEnergy | KrylovSelfEnergy) – The SelfEnergyCalculator to be used for the TransmissionSpectrum calculation at each voltage. Default: RecursionSelfEnergy(storage_strategy=NoStorage()) energy_zero_parameter (AverageFermiLevel | AbsoluteEnergy) – The choice for the zero of energy to be used for the TransmissionSpectrum calculation at each voltage. Default: AverageFermiLevel infinitesimal (PhysicalQuantity of type energy) – Small positive energy, used to move the TransmissionSpectrum calculation at each voltage away from the real axis. This is only relevant for recursion-style self-energy calculators. Default: 1.0e-6 * eV log_filename_prefix (str | LogToStdOut) – Filename prefix for the logging output of the calculations, each to be stored in a separate file. If LogToStdOut, all logging will instead be sent to standard output. Default: 'iv_characteristics_' number_of_processes_per_task (int) – The number of processes that will be used to execute each task. If this value is greater than or equal to the total number of available processes, each single task will be executed collaboratively over all processes. Otherwise, a delegator-worker scheme is used; in this case, one process will be set aside as the delegator, and the remaining ones will be grouped into workers and execute tasks concurrently. Default: All available processes execute each task collaboratively. device_transmission_method (GreensFunction | SparseGreensFunction.) – The method employed in the TransmissionSpectrum calculation at each voltage. Note that GreensFunction is only supported for a maximum of 2 (1) processes_per_contour_point for Unpolarized, Polarized (Noncollinear, SpinOrbit) calculations. Default: GreensFunction(processes_per_contour_point=1). enforce_zero_transmission_in_band_gap (bool) – Flag which specifies whether the transmission values are enforced to zero inside the band gap. Default: True source_electrode (Left | Right) – Specify which electrode should be set as Source. Default: Left
addAnalysis(gate_source_voltages, drain_source_voltages, analysis_type, analysis_arguments=None)

Add an analysis object to the IVCharacteristics study for given gate-source and drain-source voltage pair.

This method can be invoked several times; in this case, multiple analysis objects will be added to the same voltage pairs.

Parameters: gate_source_voltages (PhysicalQuantity of type voltage | sequence of PhysicalQuantity of type voltage) – A list of gate-source voltages for which the analysis should be appended. Each voltage in the list needs to be already present. drain_source_voltages (PhysicalQuantity of type voltage | sequence of PhysicalQuantity of type voltage) – A list of drain-source voltages for which the analysis should be appended. Each voltage in the list needs to be already present. analysis_type (An Analysis type supported by IVCharacteristics.) – The type of the analysis object to be calculated. analysis_arguments (A dictionary of valid arguments for an analysis object of the type specified in analysis_type.) – Dictionary of optional arguments to be passed to the analysis object. The configuration arguments must not be present. Default: An empty dictionary.
addProjectedLocalDensityOfStates(gate_source_voltages, drain_source_voltages, energies=None)

Add a ProjectedLocalDensityOfStates analysis object to the IVCharacteristics study for a given gate-source and drain-source voltage pair. The input paramenters are taken from the IVCharacteristics study.

Parameters: gate_source_voltages (PhysicalQuantity of type voltage | sequence of PhysicalQuantity of type voltage) – A list of gate-source voltages for which the analysis should be appended. Each voltage in the list needs to be already present. drain_source_voltages (PhysicalQuantity of type voltage | sequence of PhysicalQuantity of type voltage) – A list of drain-source voltages for which the analysis should be appended. Each voltage in the list needs to be already present. energies (list of PhysicalQuantity of type energy) – The energies for which the density of states should be calculated. Default: The value given in the constructor of the study object, if not None; numpy.linspace(-2.0, 2.0, 200) * eV otherwise.
addVoltages(gate_source_voltages=None, drain_source_voltages=None)

Add a list of gate-source and/or drain-source voltage points to the IVCharacteristics study. These will be calculated the next time the object is updated.

Parameters: gate_source_voltages (PhysicalQuantity of type voltage | sequence of PhysicalQuantity of type voltage) – The list of gate-source voltages to add. drain_source_voltages (PhysicalQuantity of type voltage | sequence of PhysicalQuantity of type voltage) – The list of drain-source voltages to add.
calculatedVoltages()
Returns: The list of gate-source and drain-source voltage pairs for which a transmission spectrum has been calculated. list of PhysicalQuantity of type voltage
configuration(gate_source_voltage, drain_source_voltage)

Retrieve the updated configuration for the given gate-source and drain-source voltages.

This result will only be available after the calculation ran successfully.

Parameters: gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage. drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage. The configuration associated with this voltage pair. If not available, returns None. DeviceConfiguration | None
configurationCalculator(gate_source_voltage, drain_source_voltage)

Retrieve the updated configuration’s calculator for the given gate-source and drain-source voltages.

This result will only be available after the calculation ran successfully.

Parameters: gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage. drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage. The calculator associated with this voltage pair. If not available, returns None.
current(gate_source_voltage, drain_source_voltage, electrode_temperatures=None)

The current calculated from the TransmissionSpectrum analysis. The sign of the current is adjusted to be consistent with the choice of source electrode.

Parameters: gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage. drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage. electrode_temperatures (list (size 2) of PhysicalQuantity of type temperature) – The electrode temperatures to be used in the current calculation. Default: The temperatures from the calculator. The calculated current for the required gate-source and drain-source voltages. If not available, returns None. PhysicalQuantity of type current | None
dependentStudies()
Returns: The list of dependent studies. list of Study
deviceTransmissionMethod()
Returns: The method used for the TransmissionSpectrum calculation at each voltage. GreensFunction | SparseGreensFunction
drainInducedBarrierLowering(threshold_current, high_drain_source_voltage, low_drain_source_voltage, min_subthreshold_current=None, max_subthreshold_current=None, range_min=None, range_max=None, converged_only=None, electrode_temperatures=None)

Calculate drain induced barrier lowering (DIBL). The threshold voltage is defined as the gate-source voltage for which the current has a user-defined value, evaluated at a high and a low source-drain voltage value.

The DIBL is calculated as the unitless ratio

$$DIBL = \frac{V_{TH}^{low} - V_{TH}^{high}}{V_{DS}^{high} - V_{DS}^{low}}$$

In order to obtain meaningful results, a current in the subthreshold regime must be specified.

Parameters: threshold_current (PhysicalQuantity of type current) – The current for which the device is considered to be at the gate-source threshold. high_drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage at the working point (i.e., the supply voltage). low_drain_source_voltage (PhysicalQuantity of type voltage) – The low drain voltage used as reference. It needs to be a finite value close to 0. min_subthreshold_current (PhysicalQuantity of type current) – The minimum value of current used to extract the subthreshold regime model. Default: threshold_current / 10 max_subthreshold_current (PhysicalQuantity of type current) – The minimum value of current used to extract the subthreshold regime model. Default: threshold_current * 10 range_min (PhysicalQuantity of type voltage) – The minimum gate-source voltage used for the processing. This parameter can be used to select the nmos-like or pmos-like section of the IV curve in bipolar devices. Default: No restriction. range_max (bool) – The maximum gate-source voltage in the required range. This parameter can be used to select the nmos-like or pmos-like section of the IV curve in bipolar devices. Default: No restriction. converged_only – Whether to only include data points which have converged. Default: True electrode_temperatures (list (size 2) of PhysicalQuantity of type temperature) – The electrode temperatures to be used in the current calculation. Default: The temperatures from the calculator. The calculated drain induced barrier lowering. float
drainSourceSaturationVoltage(gate_source_voltage, range_min=None, range_max=None, converged_only=None, electrode_temperatures=None)

Calculate the drain-source saturation voltage for a given gate-source voltage. It is assumed that a transition to saturation regime occurs in the interval specified by range_min and range_max. The value is estimated by fitting the data to a Schichman-Hodges model (SPICE Mosfet model 1).

Parameters: gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage, for which the drain-source saturation voltage will be calculated. range_min (PhysicalQuantity of type voltage) – The minimum drain-source voltage in the required range. Default: No restriction. range_max (bool) – The maximum drain-source voltage in the required range. Default: No restriction. converged_only – Whether to only include data points which have converged. Default: True electrode_temperatures (list (size 2) of PhysicalQuantity of type temperature) – The electrode temperatures to be used in the current calculation. Default: The temperatures from the calculator. The calculated drain-source saturation voltage, fitted in the required range. PhysicalQuantity of type voltage
drainSourceVoltages()
Returns: The list of all calculated and not calculated drain-source voltages. Any drain-source voltage which has not yet been calculated will be calculated the next time the object is updated. list of PhysicalQuantity of type voltage
energies()
Returns: The list of energies used for the TransmissionSpectrum calculation at each voltage. list of PhysicalQuantity of type energy
energyZeroParameter()
Returns: The choice for the zero of energy used for the TransmissionSpectrum calculation at each voltage. AverageFermiLevel | AbsoluteEnergy
enforceZeroTransmissionInBandGap()
Returns: Whether the transmission values are enforced to zero inside the band gap. bool
filename()
Returns: The filename where the study object is stored. str
gatePotentialAlignment()
Returns: The object describing the alignment of the gate electrode potential. class:~.GatePotentialAlignment:
gateReferencePotential()
Returns: The absolute shift in gate voltages introduced by a gate potential alignment, with respect to the internal default. If the parameter gate_potential_alignment of IVCharacteristics is defined with a non-default reference_electrode then additional tasks have to be executed. In that case the absolute shift in gate voltages is returned when the information is available, and None is returned otherwise. PhysicalQuantity of type voltage | None
gateRegions()
Returns: The list of indices of the metallic regions present in the configuration which the gate voltage is applied to. list of int
gateSourceVoltages()
Returns: The list of all calculated and not calculated gate-source voltages. Any gate-source voltage which has not yet been calculated will be calculated the next time the object is updated. list of PhysicalQuantity of type voltage
infinitesimal()
Returns: The small positive energy used to move the TransmissionSpectrum calculation at each voltage away from the real axis for the case of a recursion-style self-energy calculator. PhysicalQuantity of type energy
isConverged(gate_source_voltage, drain_source_voltage)
Parameters: gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage. drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage. Whether the calculator for the required gate-source and drain-source voltages has been converged. If not available, returns None. bool | None
kpoints()
Returns: The k-points used for the TransmissionSpectrum calculation at each voltage. MonkhorstPackGrid | RegularKpointGrid | AdaptiveGrid | list (size n_kpoints) of list (size 3) of float
kpointsWeights()
Returns: The weight of each k-point used for the TransmissionSpectrum calculation at each voltage. list (size n_kpoints) of float
logFilenamePrefix()
Returns: The filename prefix for the logging output of the study. str | LogToStdOut
nlprint(stream=None)

Print a string containing an ASCII table useful for plotting the Study object.

Parameters: stream (python stream) – The stream the table should be written to. Default: NLPrintLogger()
numberOfProcessesPerTask()
Returns: The number of processes to be used to execute each task. If None, all available processes should execute each task collaboratively. int | None | ProcessesPerNode
numberOfProcessesPerTaskResolved()
Returns: The number of processes to be used to execute each task. Default values are resolved based on the current execution settings. int
objectId()
Returns: The name of the study object in the file. str
onOffRatio(drain_source_voltage, off_gate_source_voltage, on_gate_source_voltage, converged_only=None, electrode_temperatures=None)

Calculate the on/off ratio for the available data points at a given drain-source voltage.

Parameters: drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage which determines the gate-source voltage/current data set from which the on/off ratio will be calculated. Default: The first drain-source voltage in the IVCharacteristics study. off_gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage corresponding to the off state. on_gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage corresponding to the on state. converged_only – Whether to only include data points which have converged. Default: True electrode_temperatures (list (size 2) of PhysicalQuantity of type temperature) – The electrode temperatures to be used in the current calculation. Default: The temperatures from the calculator. The calculated on/off ratio in the required range. float
removeAnalysis(gate_source_voltages, drain_source_voltages, analysis_type)

Remove an analysis object from the IVCharacteristics study for given gate-source and drain-source voltage pairs.

Note that if multiple analysis objects of the same type exist, they will all be removed.

Parameters: gate_source_voltages (PhysicalQuantity of type voltage | sequence of PhysicalQuantity of type voltage) – A list of gate-source voltages for which the analysis object should be removed. drain_source_voltages (PhysicalQuantity of type voltage | sequence of PhysicalQuantity of type voltage) – A list of drain-source voltages for which the analysis object should be removed. analysis_type (An Analysis type supported by IVCharacteristics.) – The type of the analysis object to be removed.
removeDrainSourceVoltage(drain_source_voltage)

Remove a drain-source voltage from the IVCharacteristics study. All analysis objects corresponding to the given drain-source voltage will be removed.

Parameters: drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage which should be removed from the IVCharacteristics study.
removeGateSourceVoltage(gate_source_voltage)

Remove a gate-source voltage from the IVCharacteristics study. All analysis objects corresponding to the given gate-source voltage will be removed.

Parameters: gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage which should be removed from the IVCharacteristics study.
results(gate_source_voltage, drain_source_voltage, result_types=None)

Retrieve all results of the specified types for the given gate-source and drain-source voltages.

Only the results of calculations that ran successfully are available.

Parameters: gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage. drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage. result_types (list) – A list of types which should be included in the returned quantity. For example, result_types=[DeviceConfiguration] will only return instances of DeviceConfiguration. If not specified, all results are returned. The available results from calculations associated with this voltage pair. If none available, it returns an empty list. list
saveToFileAfterUpdate()
Returns: Whether the study is automatically saved after it is updated. bool
selfEnergyCalculator()
Returns: The SelfEnergyCalculator used for the TransmissionSpectrum calculation at each voltage. DirectSelfEnergy | RecursionSelfEnergy | SparseRecursionSelfEnergy | KrylovSelfEnergy
setCalculator(gate_source_voltage, drain_source_voltage, calculator, initial_state=None)

Set a new calculator and initial state for an existing gate-source and drain-source voltage pair.

The next call to update() will recalculate the configuration, transmission spectrum and any additional Analysis objects for this gate-source and drain-source voltage pair.

Parameters: gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage. drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage. calculator (DeviceLCAOCalculator | DeviceSemiEmpiricalCalculator) – The new calculator to be set on the configuration. initial_state (DeviceConfiguration) – The initial state to be used for the configuration. Default: The initial state is automatically chosen from the already run tasks.
setTransmissionSpectrumArguments(gate_source_voltage, drain_source_voltage, transmission_arguments=None)

Set new arguments for the TransmissionSpectrum object for an existing gate-source and drain-source voltage pair.

The next call to update() will recalculate the transmission spectrum for this gate-source and drain-source voltage pair.

Parameters: gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage. drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage. transmission_arguments (A dictionary of valid arguments for a TransmissionSpectrum object.) – Dictionary of arguments to be passed to the TransmissionSpectrum object. The configuration argument must not be present. Default: An empty dictionary.
sourceElectrode()
subthresholdSlope(drain_source_voltage=None, range_min=None, range_max=None, converged_only=None, electrode_temperatures=None)

Calculate the subthreshold slope for the available data points at a given drain-source voltage.

Note that by default the entire range is used for the fitting, which might give an unphysical result. It is strongly recommended for the user to define a physical range in which to perform the fitting.

Parameters: drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage which determines the gate-source voltage/current data set from which the subthreshold slope will be calculated. range_min (PhysicalQuantity of type voltage) – The minimum gate-source voltage in the required range. Default: No restriction. range_max (bool) – The maximum gate-source voltage in the required range. Default: No restriction. converged_only – Whether to only include data points which have converged. Default: True electrode_temperatures (list (size 2) of PhysicalQuantity of type temperature) – The electrode temperatures to be used in the current calculation. Default: The temperatures from the calculator. The calculated subthreshold slope, fitted in the required range. Units are mV/dec. float
transconductance(drain_source_voltage, gate_source_voltage, converged_only=None, electrode_temperatures=None)

Calculate the transconductance, defined as:

$$g_m = \partial I_{D} / \partial V_{GS}$$

at a given drain-source voltage, where $$I_{D}$$ is the drain current and $$V_{GS}$$ the gate-source voltage. The transconductance is evaluated around the gate-source voltage specified in input. The derivative is calculated by finite difference, using the available currents.

Parameters: drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage at which the transconductance is calculated, gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage at which the transconductance is evaluated. converged_only – Whether to only include data points which have converged. Default: True electrode_temperatures (list (size 2) of PhysicalQuantity of type temperature) – The electrode temperatures to be used in the current calculation. Default: The temperatures from the calculator. The value of transconductance at the given gate-source and drain-source voltage. PhysicalQuantity of type current / voltage.
transmissionSpectrum(gate_source_voltage, drain_source_voltage)

Retrieve the TransmissionSpectrum for the updated configuration for the given gate-source and drain-source voltages.

This result will only be available after the transmission spectrum calculation ran successfully.

Parameters: gate_source_voltage (PhysicalQuantity of type voltage) – The gate-source voltage. drain_source_voltage (PhysicalQuantity of type voltage) – The drain-source voltage. The transmission spectrum associated with this voltage pair. If not available, returns None. TransmissionSpectrum | None
update()

Run the calculations for the study.

## Notes¶

Note

Study objects behave differently from analysis objects. See the Study object overview for more details.

The IVCharacteristics object can be used to perform a detailed study on a device. The object is initialized by specifying the DeviceConfiguration to study, a list of gate-source and drain-source voltages over which to scan, and the parameters needed to perform a TransmissionSpectrum calculation for each voltage.

The IVCharacteristics object supports configurations with an arbitrary number of gates, defined as metallic regions in the DeviceConfiguration. During the calculation the gate voltage is set equally on the gate regions specified by the gate_regions parameter; other metallic regions present in the configuration will not be affected. It is also possible to use IVCharacteristics for a DeviceConfiguration without any gate. In this case, gate_regions and gate_source_voltages can be left unspecified. A dummy value gate_source_voltages=0.0*Volt is then assumed.

After performing the calculation, the results can be retrieved by calling a number of methods:

• calculatedVoltages
• configuration
• configurationCalculator
• current
• isConverged
• results
• transmissionSpectrum

There are also a number of post-processing methods available, which will perform their analysis on the available results:

• onOffRatio
• subthresholdSlope
• drainSourceSaturationVoltage
• drainInducedBarrierLowering
• transconductance

The user is free to add gate-source and drain-source voltage points to the study by calling addVoltages. It is also possible to specify additional Analysis objects to be calculated on the configuration alongside the TransmissionSpectrum for each voltage point (or only selected points); this can be done by calling addAnalysis. The results for these additional Analysis calculations can be retrieved by calling the results method.

Finally, existing gate voltage points can be modified by calling a number of methods:

• setCalculator
• setTransmissionSpectrumArguments

Calling update after one of these methods will recalculate any point which is no longer up to date, including any additional Analysis objects present.

Tip

See the tutotial Electrical characteristics of devices using the IVCharacteristics study object for an example of usage of IVCharacteristics study on a realistic device and a demonstration of the graphical user interface.

## Usage Example¶

This example shows how to perform a simple study of a gated carbon nanotube system and display a summary of results.

First, we define the device system with metallic regions to act as the gate. This is given in the following file (for clarity, we split this from the IVCharacteristics study itself):

iv_characteristics_device_setup.py

We can now proceed with the study. Note that this example is only intended to give an overview of the capabilities of IVCharacteristics.

# Setup the device configuration.

# -------------------------------------------------------------
# IVCharacteristics study
# -------------------------------------------------------------
# Initialize the IV characteristics study with 11 gate-source
# and a single drain-source voltage points.
iv_characteristics = IVCharacteristics(
configuration=device_configuration,
filename='ivcharacteristics.hdf5',
object_id='graphene_ribbon',
gate_regions=[0, 1],
gate_source_voltages=numpy.linspace(-1, 1, 11)*Volt,
drain_source_voltages=0.1*Volt,
log_filename_prefix='ivcharacteristics_',
)

# Run update to calculate the initial points.
iv_characteristics.update()

# Print the iv_characteristics report.
nlprint(iv_characteristics)

# Add a new gate-source voltage point.

# Call update again to calculate the new point.
iv_characteristics.update()

# Calculate the on/off ratio at Vds=0.1*Volt and print it out.
on_off_ratio = iv_characteristics.onOffRatio(
0.1 * Volt,
-1.0 * Volt,
1.0 * Volt)
print("On/off ratio:", on_off_ratio)

# Add an additional DeviceDensityOfStates calculation to two of the gate voltage
# points. We also specify custom arguments for this object.
analysis_arguments = {'energies': numpy.arange(-1.0, 1.0, 0.01) * eV}
[0.2, 0.4] * Volt,
0.1 * Volt,
DeviceDensityOfStates,
analysis_arguments
)

# Update again.
iv_characteristics.update()

# Get the calculated objects for a particular voltage value.
gate_source_voltage = 0.2 * Volt
drain_source_voltage = 0.1 * Volt
configuration = iv_characteristics.configuration(
gate_source_voltage,
drain_source_voltage)
calculator = iv_characteristics.configurationCalculator(
gate_source_voltage,
drain_source_voltage)
transmission_spectrum = iv_characteristics.transmissionSpectrum(
gate_source_voltage,
drain_source_voltage)
device_dos = iv_characteristics.results(
gate_source_voltage,
drain_source_voltage,
[DeviceDensityOfStates])[0]

# Set a new initial state for this gate voltage value.
restart_gate_voltage = -0.2 * Volt
restart_configuration = iv_characteristics.configuration(
restart_gate_voltage,
drain_source_voltage)
iv_characteristics.setCalculator(
gate_source_voltage,
drain_source_voltage,
calculator,
restart_configuration)

# Also set some new arguments for the transmission spectrum.
new_arguments = {'energies': numpy.linspace(-2, 2, 21)*eV}
iv_characteristics.setTransmissionSpectrumArguments(
gate_source_voltage,
drain_source_voltage,
new_arguments)

# Running update will calculate this gate voltage point again.
iv_characteristics.update()

# Print again the iv_characteristics report.
nlprint(iv_characteristics)


iv_characteristics.py

Here is the resulting output from the last nlprint command:

+------------------------------------------------------------------------------+
| IVCharacteristics Report                                                     |
+------------------------------------------------------------------------------+
|       Gate-source      Drain-source      Drain-source                        |
|        voltage (V)       voltage (V)       current (A)                       |
+------------------------------------------------------------------------------+
|          -1.000000          0.100000      1.432517e-13                       |
|          -0.800000          0.100000      7.487856e-13                       |
|          -0.600000          0.100000      7.141447e-12                       |
|          -0.400000          0.100000      1.520051e-10                       |
|          -0.200000          0.100000      7.014625e-09                       |
|           0.000000          0.100000      1.632069e-07                       |
|           0.200000          0.100000      5.286407e-07                       |
|           0.400000          0.100000      1.376396e-07                       |
|           0.600000          0.100000      1.431255e-07                       |
|           0.800000          0.100000      1.121649e-07                       |
|           1.000000          0.100000      1.175979e-07                       |
|           1.500000          0.100000      9.040193e-08                       |
+------------------------------------------------------------------------------+


## Gate Potential Alignment¶

The parameter gate_potential_alignment allows the definition of a reference for the gate-source potential which can rigidly shift $$V_{gs}$$ - $$I_{ds}$$ characteristics and take into account, for example, for different gate metal work functions.

In the following sections it is explained how the gate potential is applied in relation to the left and right electrode boundary conditions, and how gate_potential_alignment modifies the absolute gate potential.

### Definition of the Gate potential with Dirichlet boundary conditions¶

The solutions for the bulk left and right electrodes, evaluated at the beginning of a device calculation, provide the energy and electrostatic potential references.

During the device calculation, the electronic structures of the electrodes are shifted to align the whole system to a common energy reference and properly include any built-in potential.

In order to ensure consistency between the electrostatic potential of the device and the common energy reference, the Dirichlet boundary conditions on the left surface of the simulation grid at equilibrium ($$V_{ds}=0$$) is set as:

$V(\mathbf{r}) = V_{bulk, left}(\mathbf{r}), \mathbf{r} \in \Omega_{left}$

where $$V_{bulk,left}(\mathbf{r})$$ is the electrode bulk potential, $$V_{applied, left}$$ the voltage applied on the left contact and $$\Omega_{left}$$ the left boundary surface.

Similarly, on the right surface we have:

$V(\mathbf{r}) = V_{bulk,right}(\mathbf{r}) + V_{built-in}, \mathbf{r} \in \Omega_{right}$

where $$-|e|V_{built-in}=\mu_{bulk,right}-\mu_{bulk,left}$$ is the built-in potential due to the difference of chemical potential in the isolated electrodes at equilibrium.

When we apply a potential on a gate, the constraint $$V(\mathbf{r})=\hat{V}_{g}$$ is imposed on all points within the gate region. For $$V_{bulk,left}(\mathbf{r}) = 0$$, or in general for electrodes with $$V_{bulk,left}(\mathbf{r}) \neq 0$$ where the bulk potential converge to a uniform zero potential in the vacuum, a zero gate potential will be aligned with the vacuum level of the electrode. We can interpret it as having a gate metal workfunction equal to the left electrode workfunction.

For electrodes with non-zero bulk potential and floating boundary conditions (i.e., a combination of Periodic and Neumann boundary conditions in all directions), the electrostatic potential is shifted such that its total average is zero. As a consequence, the vacuum potential is usually close to zero, however deviations up to tens of eV can arise and translate in an effective shift of the gate reference. The vacuum level of an electrode, hence the amount of this shift, can always be determined by inspecting the electrostatic potential as shown in the tutorial InAs p-i-n junction.

The parameter gate_potential_alignment allows one to modify the alignment between gate and electrode potentials without modifying the nominal $$V_{gs}$$. This corresponds to setting the metal gate work function, in the limit of zero electrode vacuum potential.

Note

The initial reference for the gate potential is not affected by the source-drain voltage. IV curves calculated with different settings of gate_potential_alignment are equivalent, apart from a rigid shift in the $$V_{gs}$$ axis.

### Definition of the Gate potential with Neumann boundary conditions¶

When Neumann boundary conditions are applied, the potential on the left and right face of the simulation box is not directly imposed. However, all the arguments in the section Definition of the Gate potential with Dirichlet boundary conditions are still valid. In fact, the correct solution will converge to the electrostatic potential of the electrode at the boundary at zero bias, same as if Dirichlet boundary conditions had been imposed.

### Gate Potential Alignment option¶

The effective gate voltage set during an IVCharacteristics is given by:

$\hat{V}_{g} = V_{gs} + V_{ref}$

where $$V_{ref}$$ is determined through the gate_potential_alignment parameter as:

$-|e|V_{ref} = (\phi_{ref} - \phi_{left} + \Delta \phi)$

$$\phi_{left}$$, $$\phi_{ref}$$ are the work functions of the isolated left electrode and an isolated bulk reference system, which can be set to the left or right electrode through the parameter reference_electrode. Additionally, use_intrinsic_chemical_potential allows to remove any doping from the reference electrode bulk configuration when calculating the work function difference. $$\Delta \phi$$ is the work function difference between the gate metal and the isolated reference bulk system. By default, $$\phi_{ref}=\phi_{left}$$ and $$\Delta \phi=0$$.

The value of $$V_{ref}$$ can be queried using the method gateReferencePotential().

### Example¶

The effect of gate_potential_alignment can be better understood by looking at the ProjectedLocalDensityOfStates for an example p-i-n junction. The figure below shows such result for a carbon nanotube with a gate in the central region, calculated with a semi-empirical calculator. You can download the script used to generate this picture: cnt-gaa-pin.py

It can be seen that the conduction and valence band edges in the intrinsic region are aligned with the band edges in the left region. This is consistent with the fact that the gate potential is aligned by default with the left electrode potential.

If we want to modify the band alignment at equilibrium, we can do so by using gate_potential_alignment. The figure below is the ProjectedLocalDensityOfStates obtained from an IVCharacteristics with gate_potential_alignment=GatePotentialAlignment(reference_electrode=Right). We can see that the band edges in the central region are now aligned with the right electrode.

If the chemical potentials of left and right electrode are already known, the same result can be obtained by setting directly their difference, e.g. gate_potential_alignment=GatePotentialAlignment(work_function_difference=-1.4*eV).

The keyword use_intrinsic_chemical_potential can be used to set the intrinsic systems as a reference, that is, an intrinsic bulk system identical to the chosen electrode except for the absence of doping. The figure below shows the ProjectedLocalDensityOfStates obtained for IVCharacteristics with gate_potential_alignment=GatePotentialAlignment(use_intrinsic_chemical_potential=True).

The parameter use_intrinsic_chemical_potential can also be used in combination with work_function_difference. This can be useful if the user wants to simulate a metal gate for which the difference between the intrinsic electrode material and the metal work function is known.

As an example, assuming that we want to describe a device with doped bulk Silicon electrodes and a gate metal with work function difference:

$\phi_{gate} - \phi_{intrinsic} = \Delta \phi$

where $$\phi_{intrinsic}$$ is the work function of intrinsic Silicon. The user can then set the parameters use_intrinsic_chemical_potential=True and work_function_difference equal to $$\Delta \phi$$.