Author Topic: Transmission Spectrum Error  (Read 5129 times)

0 Members and 1 Guest are viewing this topic.

Offline abhishek_sharmacct

  • Regular QuantumATK user
  • **
  • Posts: 12
  • Reputation: 0
    • View Profile
Transmission Spectrum Error
« on: December 15, 2010, 09:51 »
Dear all
    I have atk+vnl version 2008.10
    When I try to calculate transmission spectrum than following error appears:


Traceback (most recent call last):
  File "c:/users/nano/appdata/local/temp/tmpf_6irn.nl", line 419, in ?
    runtime_parameters = runtime_parameters
ATKError: Exceeded maximum number of self-consistent iterations.
Terminated Abnormally



My script is following

from ATK.TwoProbe import *
from ATK.MPI import processIsMaster

# Generate time stamp
if processIsMaster():
    import platform, time
    print '#',time.ctime()
    print '#',platform.node(),platform.platform()+'\n'

# Opening vnlfile
if processIsMaster(): file = VNLFile('C:/Users/Nano/Desktop/Abshiek_Pt_Project/apt2.vnl')

# Scattering elements and coordinates
scattering_elements = [Platinum, Platinum, Platinum, Carbon,   
                       Carbon,   Platinum, Platinum]
scattering_coordinates = [[  0.00000000e+00,   0.00000000e+00,   7.84800005e+00],
                          [  1.38734353e+00,   1.38734353e+00,   9.81000042e+00],
                          [  0.00000000e+00,   0.00000000e+00,   1.17720003e+01],
                          [ -2.77555756e-17,  -4.68440608e-17,   1.37299532e+01],
                          [  2.77555756e-17,   4.68440608e-17,   1.52600468e+01],
                          [  0.00000000e+00,   0.00000000e+00,   1.72219995e+01],
                          [  1.38734353e+00,   1.38734353e+00,   1.91839996e+01]]*Angstrom
       

electrode_elements = [Platinum, Platinum, Platinum, Platinum]
electrode_coordinates = [[ 0.       ,  0.       ,  0.       ],
                         [ 1.3873435,  1.3873435,  1.962    ],
                         [ 0.       ,  0.       ,  3.924    ],
                         [ 1.3873435,  1.3873435,  5.886    ]]*Angstrom

electrode_cell = [[ 2.77468701,  0.        ,  0.        ],
                  [ 0.        ,  2.77468701,  0.        ],
                  [ 0.        ,  0.        ,  7.848     ]]*Angstrom

# Set up electrodes
electrode_configuration = PeriodicAtomConfiguration(
    electrode_cell,
    electrode_elements,
    electrode_coordinates
    )

# Set up two-probe configuration
twoprobe_configuration = TwoProbeConfiguration(
    (electrode_configuration,electrode_configuration),
    scattering_elements,
    scattering_coordinates,
    electrode_repetitions=[[1,1],[1,1]],
    equivalent_atoms=([0,0],[3,6])
    )
if processIsMaster(): nlPrint(twoprobe_configuration)
if processIsMaster(): file.addToSample(twoprobe_configuration, 'twoprobe_configuration')

######################################################################
# Central region parameters
######################################################################
exchange_correlation_type = LDA.PZ

iteration_mixing_parameters = iterationMixingParameters(
    algorithm = IterationMixing.Pulay,
    diagonal_mixing_parameter = 0.05,
    quantity = IterationMixing.Hamiltonian,
    history_steps = 6
)

electron_density_parameters = electronDensityParameters(
    mesh_cutoff = 200.0*Rydberg
)

basis_set_parameters = basisSetParameters(
    type = SingleZetaPolarized,
    radial_sampling_dr = 0.001*Bohr,
    energy_shift = 0.01*Rydberg,
    delta_rinn = 0.8,
    v0 = 40.0*Rydberg,
    charge = 0.0,
    split_norm = 0.15
)

iteration_control_parameters = iterationControlParameters(
    tolerance = 1e-005,
    criterion = IterationControl.TotalEnergy,
    max_steps = 100
)

electrode_voltages = (-0.1,0.1)*Volt

two_probe_algorithm_parameters = twoProbeAlgorithmParameters(
    electrode_constraint = ElectrodeConstraints.Off,
    initial_density_type = InitialDensityType.EquivalentBulk
)

energy_contour_integral_parameters = energyContourIntegralParameters(
    circle_points = 30,
    integral_lower_bound = 3*Rydberg,
    fermi_line_points = 10,
    fermi_function_poles = 4,
    real_axis_infinitesimal = 0.01*electronVolt,
    real_axis_point_density = 0.02*electronVolt
)

two_center_integral_parameters = twoCenterIntegralParameters(
    cutoff = 2500.0*Rydberg,
    points = 1024
)

######################################################################
# Left electrode parameters
######################################################################
left_electrode_electron_density_parameters = electronDensityParameters(
    mesh_cutoff = 200.0*Rydberg
)

left_electrode_iteration_control_parameters = iterationControlParameters(
    tolerance = 1e-005,
    criterion = IterationControl.TotalEnergy,
    max_steps = 100
)

left_electrode_brillouin_zone_integration_parameters = brillouinZoneIntegrationParameters(
    monkhorst_pack_parameters = (2, 2, 100)
)

left_electrode_iteration_mixing_parameters = iterationMixingParameters(
    algorithm = IterationMixing.Pulay,
    diagonal_mixing_parameter = 0.05,
    quantity = IterationMixing.Hamiltonian,
    history_steps = 6
)

left_electrode_eigenstate_occupation_parameters = eigenstateOccupationParameters(
    temperature = 1000.0*Kelvin
)

######################################################################
# Collect left electrode parameters
######################################################################
left_electrode_parameters = ElectrodeParameters(
    brillouin_zone_integration_parameters = left_electrode_brillouin_zone_integration_parameters,
    electron_density_parameters = left_electrode_electron_density_parameters,
    eigenstate_occupation_parameters = left_electrode_eigenstate_occupation_parameters,
    iteration_mixing_parameters = left_electrode_iteration_mixing_parameters,
    iteration_control_parameters = left_electrode_iteration_control_parameters
)

######################################################################
# Right electrode parameters
######################################################################
right_electrode_electron_density_parameters = electronDensityParameters(
    mesh_cutoff = 200.0*Rydberg
)

right_electrode_iteration_control_parameters = iterationControlParameters(
    tolerance = 1e-005,
    criterion = IterationControl.TotalEnergy,
    max_steps = 100
)

right_electrode_brillouin_zone_integration_parameters = brillouinZoneIntegrationParameters(
    monkhorst_pack_parameters = (2, 2, 100)
)

right_electrode_iteration_mixing_parameters = iterationMixingParameters(
    algorithm = IterationMixing.Pulay,
    diagonal_mixing_parameter = 0.05,
    quantity = IterationMixing.Hamiltonian,
    history_steps = 6
)

right_electrode_eigenstate_occupation_parameters = eigenstateOccupationParameters(
    temperature = 1000.0*Kelvin
)

######################################################################
# Collect right electrode parameters
######################################################################
right_electrode_parameters = ElectrodeParameters(
    brillouin_zone_integration_parameters = right_electrode_brillouin_zone_integration_parameters,
    electron_density_parameters = right_electrode_electron_density_parameters,
    eigenstate_occupation_parameters = right_electrode_eigenstate_occupation_parameters,
    iteration_mixing_parameters = right_electrode_iteration_mixing_parameters,
    iteration_control_parameters = right_electrode_iteration_control_parameters
)

######################################################################
# Initialize self-consistent field calculation
######################################################################
two_probe_method = TwoProbeMethod(
    electrode_parameters = (left_electrode_parameters,right_electrode_parameters),
    exchange_correlation_type = exchange_correlation_type,
    iteration_mixing_parameters = iteration_mixing_parameters,
    electron_density_parameters = electron_density_parameters,
    basis_set_parameters = basis_set_parameters,
    iteration_control_parameters = iteration_control_parameters,
    energy_contour_integral_parameters = energy_contour_integral_parameters,
    two_center_integral_parameters = two_center_integral_parameters,
    electrode_voltages = electrode_voltages,
    algorithm_parameters = two_probe_algorithm_parameters
)
if processIsMaster(): nlPrint(two_probe_method)

runtime_parameters = runtimeParameters(
    verbosity_level = 10,
    checkpoint_filename = 'C:/Users/Nano/Desktop/Abshiek_Pt_Project/apt2.nc'
)

# Perform self-consistent field calculation
scf = executeSelfConsistentCalculation(
    twoprobe_configuration,
    two_probe_method,
    runtime_parameters = runtime_parameters
)

######################################################################
# Calculate physical properties
######################################################################
transmission_spectrum = calculateTransmissionSpectrum(
    self_consistent_calculation = scf,
    energies = (0.0,)*electronVolt,
    brillouin_zone_integration_parameters = brillouinZoneIntegrationParameters((1, 1)),
    green_function_infinitesimal = 1.0e-5*electronVolt
)
if processIsMaster(): nlPrint(transmission_spectrum)
if processIsMaster(): file.addToSample(transmission_spectrum, 'twoprobe_configuration', 'Transmission Spectrum')

current = calculateCurrent(
    self_consistent_calculation = scf,
    brillouin_zone_integration_parameters = brillouinZoneIntegrationParameters((1, 1)),
    green_function_infinitesimal = 1.0e-5*electronVolt,
    number_of_points = 100
)
if processIsMaster(): nlPrint(current)
if processIsMaster(): file.addToSample(current, 'twoprobe_configuration', 'Current')

# Set verbosity level so that all energy components are printed
import ATK
verbosity_level=ATK.verbosityLevel()
ATK.setVerbosityLevel(10)
total_energy = calculateTotalEnergy(self_consistent_calculation = scf)
ATK.setVerbosityLevel(verbosity_level)

if processIsMaster(): nlPrint(total_energy,'Total energy')
if processIsMaster(): file.addToSample(total_energy, 'twoprobe_configuration', 'Total energy')

transmission_eigenstates = calculateTransmissionEigenstates(
    self_consistent_calculation = scf,
    energy = 0.0*electronVolt,
    quantum_numbers = (0,((0.0,0.0),(0.5,0.5)))
)
for state_index,state in enumerate(transmission_eigenstates):
    label='Transmission Eigenstates'+' '+str(state_index)
    if processIsMaster(): file.addToSample(state, 'twoprobe_configuration', label)









help me to solve this error

 

Offline zh

  • Supreme QuantumATK Wizard
  • *****
  • Posts: 1141
  • Reputation: 24
    • View Profile
Re: Transmission Spectrum Error
« Reply #1 on: December 15, 2010, 13:04 »
The message shows that the iteration steps exceed the specified one. To solve the problem, at least you may try to increase the maximum iteration step. Regarding to the setup of configuration defined in your script file, there are some other reasons for the bad convergence problem in your calculation:
i) Since the electrode consists of bulk Pt, the k-mesh in the x and y direction (i.e., 2x2x..) may not sufficient. It should be increased further.
ii) In the scattering region, the atomic layers of Pt are used as surface layers actually, and the atomic layers of carbon act as the conductor in a two-probe system. Moreover, the atomic layers of carbon seem to be cleaved from an artificial structure of carbon, rather than from graphite, diamond, graphene, or atomic chain. The atomic configuration of your two-probe system needs to checked, i.e., what kind of structure do you really to calculate in your study?
iii) For the Pt, the szp basis set may be insufficient.

Offline abhishek_sharmacct

  • Regular QuantumATK user
  • **
  • Posts: 12
  • Reputation: 0
    • View Profile
Re: Transmission Spectrum Error
« Reply #2 on: December 16, 2010, 16:20 »
The message shows that the iteration steps exceed the specified one. To solve the problem, at least you may try to increase the maximum iteration step. Regarding to the setup of configuration defined in your script file, there are some other reasons for the bad convergence problem in your calculation:
i) Since the electrode consists of bulk Pt, the k-mesh in the x and y direction (i.e., 2x2x..) may not sufficient. It should be increased further.
ii) In the scattering region, the atomic layers of Pt are used as surface layers actually, and the atomic layers of carbon act as the conductor in a two-probe system. Moreover, the atomic layers of carbon seem to be cleaved from an artificial structure of carbon, rather than from graphite, diamond, graphene, or atomic chain. The atomic configuration of your two-probe system needs to checked, i.e., what kind of structure do you really to calculate in your study?
iii) For the Pt, the szp basis set may be insufficient.


Please tell me how to decide k-mesh values in the x,y,z directions, and why the szp basis set is insufficient ?

Offline zh

  • Supreme QuantumATK Wizard
  • *****
  • Posts: 1141
  • Reputation: 24
    • View Profile
Re: Transmission Spectrum Error
« Reply #3 on: December 17, 2010, 01:53 »
For the size of k-mesh, usually one should do some test to check the convergence with respect to the k-mesh. Generally, some simple rules of thumb:
i) The k-mesh used for metal needs to be much denser than that for semiconductor (or insulator), because more k-points are needs to accurately determine the Fermi surface a metal.
ii) The required k-mesh size also depends on the size of unit cell. The longer length of lattice vector in the unit cell, the shorter length of reciprocal lattice vector in Brillouin zone. In other word, if the size unit cell is larger, the region of first-Brillouin zone will be smaller, and thus small size of k-mesh may be sufficient.
iii) The actual size of k-mesh required for a specific system, it can be found from the convergence test.

For Pt, it is a noble metal and contains d electrons. The szp basis set may not properly describe the electronic structure near Fermi surface of Pt. Before performing the calculation of a two-probe system, you need to do test calculation to check the band structure of bulk Pt using the szp basis set.