Author Topic: how to set up a calculation of an I-V curve for the two-probe system.  (Read 10414 times)

0 Members and 1 Guest are viewing this topic.

Offline zhangfuchun

  • Regular QuantumATK user
  • **
  • Posts: 7
  • Reputation: 0
    • View Profile
as follow:
     ###############################################################
# NL Module imports
###############################################################
from NanoLanguage import *

###############################################################
# TwoProbe configuration
###############################################################

###############################################################
# Left electrode
###############################################################

# Set up lattice
vector_a = [5.76751646075, -4.50174304348e-33, 0.0]*Angstrom
vector_b = [-2.88375823037, 4.99481577175, 2.72677173011e-16]*Angstrom
vector_c = [-9.86076131526e-32, -3.85623756222e-16, 7.06373620597]*Angstrom
left_electrode_lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
left_electrode_elements = [Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold,
                           Gold, Gold]

# Define coordinates
left_electrode_coordinates = [[ 2.24397869,  2.13528941,  1.17728937],
                              [ 3.68585781,  2.9677587 ,  3.5318681 ],
                              [ 2.24397869,  3.800228  ,  5.88644684],
                              [ 0.80209958,  4.63269729,  1.17728937],
                              [ 5.12773692,  0.47035082,  3.5318681 ],
                              [ 3.68585781,  1.30282011,  5.88644684],
                              [-0.63977954,  2.13528941,  1.17728937],
                              [ 0.80209958,  2.9677587 ,  3.5318681 ],
                              [-0.63977954,  3.800228  ,  5.88644684],
                              [-2.08165865,  4.63269729,  1.17728937],
                              [ 2.24397869,  0.47035082,  3.5318681 ],
                              [ 0.80209958,  1.30282011,  5.88644684]]*Angstrom

# Set up configuration
left_electrode = BulkConfiguration(
    bravais_lattice=left_electrode_lattice,
    elements=left_electrode_elements,
    cartesian_coordinates=left_electrode_coordinates
    )

###############################################################
# Right electrode
###############################################################

# Set up lattice
vector_a = [5.76751646075, -4.50174304348e-33, 0.0]*Angstrom
vector_b = [-2.88375823037, 4.99481577175, 2.72677173011e-16]*Angstrom
vector_c = [-9.86076131526e-32, -3.85623756222e-16, 7.06373620597]*Angstrom
right_electrode_lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
right_electrode_elements = [Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold,
                            Gold, Gold]

# Define coordinates
right_electrode_coordinates = [[ 3.52353777,  1.19458777,  1.17728937],
                               [-0.80209958,  2.02705707,  3.5318681 ],
                               [ 3.52353777,  2.85952636,  5.88644684],
                               [ 2.08165865,  3.69199566,  1.17728937],
                               [-2.24397869,  4.52446495,  3.5318681 ],
                               [ 4.96541688,  0.36211848,  5.88644684],
                               [ 0.63977954,  1.19458777,  1.17728937],
                               [ 2.08165865,  2.02705707,  3.5318681 ],
                               [ 0.63977954,  2.85952636,  5.88644684],
                               [-0.80209958,  3.69199566,  1.17728937],
                               [ 0.63977954,  4.52446495,  3.5318681 ],
                               [ 2.08165865,  0.36211848,  5.88644684]]*Angstrom

# Set up configuration
right_electrode = BulkConfiguration(
    bravais_lattice=right_electrode_lattice,
    elements=right_electrode_elements,
    cartesian_coordinates=right_electrode_coordinates
    )

###############################################################
# Central region
###############################################################

# Set up lattice
vector_a = [5.76751646075, -4.50174304348e-33, 0.0]*Angstrom
vector_b = [-2.88375823037, 4.99481577175, 2.72677173011e-16]*Angstrom
vector_c = [0.0, 0.0, 23.6730584282]*Angstrom
central_region_lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
central_region_elements = [Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold,
                           Gold, Gold, Carbon, Carbon, Carbon, Carbon, Carbon, Carbon,
                           Sulfur, Sulfur, Hydrogen, Hydrogen, Hydrogen, Hydrogen, Hydrogen,
                           Hydrogen, Hydrogen, Hydrogen, Hydrogen, Hydrogen, Hydrogen,
                           Hydrogen, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold, Gold,
                           Gold, Gold, Gold]

# Define coordinates
central_region_coordinates = [[  2.24397869,   2.13528941,   1.17728937],
                              [  3.68585781,   2.9677587 ,   3.5318681 ],
                              [  2.24397869,   3.800228  ,   5.88644684],
                              [  0.80209958,   4.63269729,   1.17728937],
                              [  5.12773692,   0.47035082,   3.5318681 ],
                              [  3.68585781,   1.30282011,   5.88644684],
                              [ -0.63977954,   2.13528941,   1.17728937],
                              [  0.80209958,   2.9677587 ,   3.5318681 ],
                              [ -0.63977954,   3.800228  ,   5.88644684],
                              [ -2.08165865,   4.63269729,   1.17728937],
                              [  2.24397869,   0.47035082,   3.5318681 ],
                              [  0.80209958,   1.30282011,   5.88644684],
                              [  0.63977954,   4.52446495,  14.22404472],
                              [  2.24397869,   0.47035082,   9.44901371],
                              [  1.18002575,   3.15916078,  12.12452871],
                              [  1.70373248,   1.83565499,  11.54852972],
                              [  1.71925849,   1.79641782,  10.01331992],
                              [  1.16449974,   3.19839795,  13.65973851],
                              [  2.24397869,   0.47035082,   7.78644684],
                              [  0.63977954,   4.52446495,  15.88661159],
                              [ -0.39473083,   4.71829786,  13.88812535],
                              [  4.14531548,   0.37886964,  13.88812535],
                              [  3.27848906,   0.27651792,   9.78493308],
                              [ -1.26155725,   4.61594613,   9.78493308],
                              [  2.18858957,   3.01378545,  14.03879739],
                              [  0.54401201,   2.36303172,  14.03879739],
                              [  2.33974622,   2.63178406,   9.63426104],
                              [  0.69516866,   1.98103032,   9.63426104],
                              [  0.15514836,   3.34416821,  11.74432312],
                              [  1.80081756,   3.99535391,  11.74432312],
                              [  2.72860987,   1.65064756,  11.9287353 ],
                              [  1.08294067,   0.99946187,  11.9287353 ],
                              [  3.52353777,   1.19458777,  17.78661159],
                              [ -0.80209958,   2.02705707,  20.14119033],
                              [  3.52353777,   2.85952636,  22.49576906],
                              [  2.08165865,   3.69199566,  17.78661159],
                              [ -2.24397869,   4.52446495,  20.14119033],
                              [  4.96541688,   0.36211848,  22.49576906],
                              [  0.63977954,   1.19458777,  17.78661159],
                              [  2.08165865,   2.02705707,  20.14119033],
                              [  0.63977954,   2.85952636,  22.49576906],
                              [ -0.80209958,   3.69199566,  17.78661159],
                              [  0.63977954,   4.52446495,  20.14119033],
                              [  2.08165865,   0.36211848,  22.49576906]]*Angstrom

# Set up configuration
central_region = BulkConfiguration(
    bravais_lattice=central_region_lattice,
    elements=central_region_elements,
    cartesian_coordinates=central_region_coordinates
    )

device_configuration = DeviceConfiguration(
    central_region,
    [left_electrode, right_electrode]
    )
nlprint(device_configuration)

###############################################################
# Calculator
###############################################################
#----------------------------------------
# Numerical Accuracy Settings
#----------------------------------------
left_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(1, 1, 100),
    )

right_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(1, 1, 100),
    )

#----------------------------------------
# Contour Integral Settings
#----------------------------------------
double_contour_integral_parameters = DoubleContourIntegralParameters(
    circle_points=50,
    )

#----------------------------------------
# Electrode Calculators
#----------------------------------------
left_electrode_calculator = HuckelCalculator(
    numerical_accuracy_parameters=left_electrode_numerical_accuracy_parameters,
    )

right_electrode_calculator = HuckelCalculator(
    numerical_accuracy_parameters=right_electrode_numerical_accuracy_parameters,
    )

#----------------------------------------
# Device Calculator
#----------------------------------------
calculator = DeviceHuckelCalculator(
    contour_parameters=double_contour_integral_parameters,
    electrode_calculators=
        [left_electrode_calculator, right_electrode_calculator],
    electrode_voltages=( -0.5*Volt, 0.5*Volt)
    )

device_configuration.setCalculator(calculator)

###############################################################
# Analysis
###############################################################
device_configuration.update()
nlsave('1.nc', device_configuration)

transmission_spectrum = TransmissionSpectrum(
    configuration=device_configuration,
    energies=numpy.linspace(-5,5,200)*eV,
    kpoints=MonkhorstPackGrid(1,1,1),
    energy_zero_parameter=AverageFermiLevel,
    infinitesimal=1e-06*eV,
    self_energy_calculator=KrylovSelfEnergy(),
    )
nlsave('1.nc', transmission_spectrum)
nlprint(transmission_spectrum)

from NanoLanguage import *
#read in the old configuration
device_configuration = nlread("1.nc",DeviceConfiguration)[0]
calculator = device_configuration.calculator()
# Define sample biases
voltage_list = numpy.linspace(0.1,1.0,10)
for voltage in voltage_list:

# Set the calculator and use the old scf state as starting input.
device_configuration.setCalculator(
calculator(electrode_voltages=(-0.5*voltage,0.5*voltage)*Volt ),
initial_state=device_configuration
)
#Analysis
filename = '1.nc'
electrostatic_potential = ElectrostaticDifferencePotential(device_configuration)
nlsave(filename, electrostatic_potential, object_id='pot'+str(voltage))
transmission_spectrum = TransmissionSpectrum(
configuration=device_configuration,
energies=numpy.linspace(-5,5,200)*eV,
)
nlsave(filename, transmission_spectrum,object_id='trans'+str(voltage))
molecular_energy_spectrum = MolecularEnergySpectrum(
configuration=device_configuration,
energy_zero_parameter=FermiLevel,
projection_list=ProjectionList([Hydrogen])
)
nlsave(filename, molecular_energy_spectrum,object_id='mpsh'+str(voltage) )
------------------------------------------------------------------------

However, I found some error, how do i deal with ?
--------------------------------------------------------------------------
   NanoLanguageScript execution started
+ -------------------------------------------------------------
  File "c:\docume~1\yazyq\locals~1\temp\9707668693419072.py", in line
    device_configuration.setCalculator(
                       ^
IndentationError: expected an indented block
NanoLanguageScript execution failure
+ -------------------------------------------------------------
| NanoLanguageScript execution finished
+ -------------------------------------------------------------
« Last Edit: March 17, 2010, 11:22 by zhangfuchun »

Offline Anders Blom

  • QuantumATK Staff
  • Supreme QuantumATK Wizard
  • *****
  • Posts: 5411
  • Country: dk
  • Reputation: 89
    • View Profile
    • QuantumATK at Synopsys
Everything that comes after the "for" loop line must be indented, otherwise Python doesn't know which part of the script that should be looped over. So the correct syntax is
Code
for i in [1,2,3]:
    print i
where you now have
Code
for i in [1,2,3]:
print i

Offline zhangfuchun

  • Regular QuantumATK user
  • **
  • Posts: 7
  • Reputation: 0
    • View Profile
I add the code:
for i in [1,2,3]:
    print i
but the error is :
File "c:\docume~1\yazyq\locals~1\temp\11.py", in line
    device_configuration.setCalculator(
                       ^
IndentationError: expected an indented block
NanoLanguageScript execution failure

Offline zhangfuchun

  • Regular QuantumATK user
  • **
  • Posts: 7
  • Reputation: 0
    • View Profile
I wang to gain the complete script for the I-V curve for the two probe system(using the looping)
my code:(come from your BasicGrapheneTutorial.pdf:page:76)
------------------------------------------------------------
from NanoLanguage import *
#read in the old configuration

device_configuration = nlread("lih2li.nc",DeviceConfiguration)[0]
calculator = device_configuration.calculator()

# Define sample biases
voltage_list = numpy.linspace(0.1,1.0,10)
for voltage in voltage_list:

# Set the calculator and use the old scf state as starting input.
device_configuration.setCalculator(
calculator(electrode_voltages=(-0.5*voltage,0.5*voltage)*Volt ),
initial_state=device_configuration
)

#Analysis
filename = 'lih2li.nc'
electrostatic_potential = ElectrostaticDifferencePotential(device_configuration)
nlsave(filename, electrostatic_potential, object_id='pot'+str(voltage))
transmission_spectrum = TransmissionSpectrum(
configuration=device_configuration,
energies=numpy.linspace(-5,5,200)*eV,
)
nlsave(filename, transmission_spectrum,object_id='trans'+str(voltage))
molecular_energy_spectrum = MolecularEnergySpectrum(
configuration=device_configuration,
energy_zero_parameter=FermiLevel,
projection_list=ProjectionList([Hydrogen])
)
nlsave(filename, molecular_energy_spectrum,object_id='mpsh'+str(voltage))

Offline Anders Blom

  • QuantumATK Staff
  • Supreme QuantumATK Wizard
  • *****
  • Posts: 5411
  • Country: dk
  • Reputation: 89
    • View Profile
    • QuantumATK at Synopsys
The point of my example was not that you should include it, but to demonstrate the concept of indentation. What you need is to indent all the lines in your script that should be executed inside the loop. Specifically:
Code
from NanoLanguage import *
#read in the old configuration

device_configuration = nlread("lih2li.nc",DeviceConfiguration)[0]
calculator = device_configuration.calculator()

# Define sample biases
voltage_list = numpy.linspace(0.1,1.0,10)
for voltage in voltage_list:

    # Set the calculator and use the old scf state as starting input.
    device_configuration.setCalculator(
    calculator(electrode_voltages=(-0.5*voltage,0.5*voltage)*Volt ),
    initial_state=device_configuration
    )

    #Analysis
    filename = 'lih2li.nc'
    electrostatic_potential = ElectrostaticDifferencePotential(device_configuration)
    nlsave(filename, electrostatic_potential, object_id='pot'+str(voltage))
    transmission_spectrum = TransmissionSpectrum(
    configuration=device_configuration,
    energies=numpy.linspace(-5,5,200)*eV,
    )
    nlsave(filename, transmission_spectrum,object_id='trans'+str(voltage))
    molecular_energy_spectrum = MolecularEnergySpectrum(
    configuration=device_configuration,
    energy_zero_parameter=FermiLevel,
    projection_list=ProjectionList([Hydrogen])
    )
    nlsave(filename, molecular_energy_spectrum,object_id='mpsh'+str(voltage))
instead of
Code
from NanoLanguage import *
#read in the old configuration

device_configuration = nlread("lih2li.nc",DeviceConfiguration)[0]
calculator = device_configuration.calculator()

# Define sample biases
voltage_list = numpy.linspace(0.1,1.0,10)
for voltage in voltage_list:

# Set the calculator and use the old scf state as starting input.
device_configuration.setCalculator(
calculator(electrode_voltages=(-0.5*voltage,0.5*voltage)*Volt ),
initial_state=device_configuration
)

#Analysis
filename = 'lih2li.nc'
electrostatic_potential = ElectrostaticDifferencePotential(device_configuration)
nlsave(filename, electrostatic_potential, object_id='pot'+str(voltage))
transmission_spectrum = TransmissionSpectrum(
configuration=device_configuration,
energies=numpy.linspace(-5,5,200)*eV,
)
nlsave(filename, transmission_spectrum,object_id='trans'+str(voltage))
molecular_energy_spectrum = MolecularEnergySpectrum(
configuration=device_configuration,
energy_zero_parameter=FermiLevel,
projection_list=ProjectionList([Hydrogen])
)
nlsave(filename, molecular_energy_spectrum,object_id='mpsh'+str(voltage))
Note the difference! PS: When posting code, use the "code" tags to make it more readable, and to maintain proper formatting.