QuantumATK Forum
QuantumATK => General Questions and Answers => Topic started by: narin on January 14, 2024, 11:26
-
Here's the example of the quantumatk website for the IV-curve calculation. My question is: do we need to do
device_configuration.update()
before the IVcurve command or does the IV curve command already do device_configuration.update()
inside?
# -------------------------------------------------------------
# Two-probe Configuration
# -------------------------------------------------------------
# -------------------------------------------------------------
# Left Electrode
# -------------------------------------------------------------
# Set up lattice
vector_a = [5.0, 0.0, 0.0]*Angstrom
vector_b = [0.0, 5.0, 0.0]*Angstrom
vector_c = [0.0, 0.0, 9.0]*Angstrom
left_electrode_lattice = UnitCell(vector_a, vector_b, vector_c)
# Define elements
left_electrode_elements = [Lithium, Lithium, Lithium]
# Define coordinates
left_electrode_coordinates = [[ 2.5, 2.5, 1.5],
[ 2.5, 2.5, 4.5],
[ 2.5, 2.5, 7.5]]*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.0, 0.0, 0.0]*Angstrom
vector_b = [0.0, 5.0, 0.0]*Angstrom
vector_c = [0.0, 0.0, 9.0]*Angstrom
right_electrode_lattice = UnitCell(vector_a, vector_b, vector_c)
# Define elements
right_electrode_elements = [Lithium, Lithium, Lithium]
# Define coordinates
right_electrode_coordinates = [[ 2.5, 2.5, 1.5],
[ 2.5, 2.5, 4.5],
[ 2.5, 2.5, 7.5]]*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.0, 0.0, 0.0]*Angstrom
vector_b = [0.0, 5.0, 0.0]*Angstrom
vector_c = [0.0, 0.0, 22.0]*Angstrom
central_region_lattice = UnitCell(vector_a, vector_b, vector_c)
# Define elements
central_region_elements = [Lithium, Lithium, Lithium, Hydrogen, Hydrogen, Lithium, Lithium,
Lithium]
# Define coordinates
central_region_coordinates = [[ 2.5, 2.5, 1.5],
[ 2.5, 2.5, 4.5],
[ 2.5, 2.5, 7.5],
[ 2.5, 2.5, 10.5],
[ 2.5, 2.5, 11.5],
[ 2.5, 2.5, 14.5],
[ 2.5, 2.5, 17.5],
[ 2.5, 2.5, 20.5]]*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]
)
# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
#----------------------------------------
# Numerical Accuracy Settings
#----------------------------------------
left_electrode_k_point_sampling = MonkhorstPackGrid(
na=1,
nb=1,
nc=100,
)
left_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
k_point_sampling=left_electrode_k_point_sampling,
)
right_electrode_k_point_sampling = MonkhorstPackGrid(
na=1,
nb=1,
nc=100,
)
right_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
k_point_sampling=right_electrode_k_point_sampling,
)
#----------------------------------------
# Poisson Solver Settings
#----------------------------------------
left_electrode_poisson_solver = FastFourier2DSolver(
boundary_conditions=[[PeriodicBoundaryCondition(),PeriodicBoundaryCondition()],
[PeriodicBoundaryCondition(),PeriodicBoundaryCondition()],
[PeriodicBoundaryCondition(),PeriodicBoundaryCondition()]]
)
right_electrode_poisson_solver = FastFourier2DSolver(
boundary_conditions=[[PeriodicBoundaryCondition(),PeriodicBoundaryCondition()],
[PeriodicBoundaryCondition(),PeriodicBoundaryCondition()],
[PeriodicBoundaryCondition(),PeriodicBoundaryCondition()]]
)
#----------------------------------------
# Electrode Calculators
#----------------------------------------
left_electrode_calculator = HuckelCalculator(
numerical_accuracy_parameters=left_electrode_numerical_accuracy_parameters,
poisson_solver=left_electrode_poisson_solver,
)
right_electrode_calculator = HuckelCalculator(
numerical_accuracy_parameters=right_electrode_numerical_accuracy_parameters,
poisson_solver=right_electrode_poisson_solver,
)
#----------------------------------------
# Device Calculator
#----------------------------------------
calculator = DeviceHuckelCalculator(
electrode_calculators=
[left_electrode_calculator, right_electrode_calculator],
)
device_configuration.setCalculator(calculator)
nlprint(device_configuration)
device_configuration.update()
nlsave('ivcurve.nc', device_configuration)
# -------------------------------------------------------------
# IV Curve
# -------------------------------------------------------------
biases = [0.000000, 0.200000, 0.400000, 0.600000, 0.800000, 1.000000,
1.200000, 1.400000, 1.600000, 1.800000, 2.000000]*Volt
iv_curve = IVCurve(
configuration=device_configuration,
biases=biases,
energies=numpy.linspace(-2,2,101)*eV,
kpoints=MonkhorstPackGrid(1,1),
self_energy_calculator=RecursionSelfEnergy(),
energy_zero_parameter=AverageFermiLevel,
infinitesimal=1e-06*eV,
selfconsistent_configurations_filename_prefix="ivcurve_selfconsistent_configuration_",
log_filename_prefix="ivcurve_"
)
nlsave('ivcurve.nc', iv_curve)
nlprint(iv_curve)
-
It will do it inside if needed, but if you leave the update line it will not do it twice.