its all part of a complicated script so i am pulling it apart
parameter file looks like this: (some not used in ldos)
# -------------------------------------------------------------
# setup parms
# -------------------------------------------------------------
from NanoLanguage import *
import numpy
import ase
logs = "../logs/"
nc_files = "../nc_files/"
plots = "../plots/"
# the number of carbon atoms to replace, every <dopingLvl> atoms
# or dope <dopingLvl>% of atoms when dopingType=2
dopingLvl = 2
dopingOn = True
dopingType = 3 # 1=edge, 2=random, 3=specific doping
outFileName = ""
outFileName2 = ""
# ran on stravinsky
gate_voltage_list = [0.01, 0.02, 0.03, 0.04, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.8, 1.0]*Volt #numpy.linspace(-0.2,0.5,15)*Volt
bias_voltage_list = [0.01, 0.025, 0.05, 0.1]*Volt
transSpecEnergies = numpy.linspace(-2,2,21)*eV
kPntsX = 1
kPntsY = 1 # don't need unless periodic here
kPntsZ = 1 #101 # always use odd so gamma point is included
ldos_energies = [1]*eV #numpy.linspace(-2,2,21)*eV
iteration_control_parameters = IterationControlParameters(number_of_history_steps=12, tolerance=1e-4)
numerical_accuracy_parameters = NumericalAccuracyParameters(k_point_sampling=(kPntsX, kPntsY, kPntsZ))
# bandstructure parms
pps=30 # points_per_segment
bafl=10 # bands_above_fermi_level
SCF = 1 # self consistent or not
ldosBiasVoltage = 0.1*Volt
ldosGateVoltage = 0.0*Volt
# set vacuum amount around device based on geometry, including gate
vac = 12.0*Ang
doubleGate = True
# atomic distances for length calcs
dist_1 = float(0.71043) * float(0.1)
dist_2 = float(3.55215) * float(0.1)
dist_3 = float(5.68344) * float(0.1) # atomic distances in nm
then the ldos calc:
def doLDOS():
configuration = nlread(nc_files + outFileName, object_id="cfg")[0]
calculator = my_DeviceLCAOCalculator()
#configuration.setCalculator(calculator)
configuration.setCalculator(
calculator(electrode_voltages=(ldosBiasVoltage,0.0*Volt)),
initial_state=configuration)
metallic_region0 = configuration.metallicRegions()[0]
metallic_region1 = None
if doubleGate:
metallic_region1 = configuration.metallicRegions()[1]
configuration.setMetallicRegions([metallic_region0(value = ldosGateVoltage), metallic_region1(value = ldosGateVoltage)] )
else:
configuration.setMetallicRegions([metallic_region0(value = ldosGateVoltage)] )
configuration.update()
# Energies at which to compute the LDOS;
# arguments to linspace are (min, max, number of points)
energies = ldos_energies
# calculate ldos for each energy in the list
for energy in energies:
LDOS = LocalDeviceDensityOfStates(
configuration=configuration,
energy=energy,
kpoints=MonkhorstPackGrid(3,3),
contributions=All,
energy_zero_parameter=AverageFermiLevel,
infinitesimal=1e-06*eV,
self_energy_calculator=KrylovSelfEnergy(),
spin=Spin.Sum,
)
nlsave(nc_files + outFileName + '_ldos.nc', LDOS, object_id="LDOS at %s" % energy)
now = date.today()
nlprint("energy " + str(energy) + " done " + str(now.strftime("%m-%d-%y %I:%M %p")))
and a supporting function:
def my_DeviceLCAOCalculator():
# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
if SCF == 1:
#----------------------------------------
# Electrode Calculators
#----------------------------------------
left_electrode_calculator = LCAOCalculator(
numerical_accuracy_parameters=numerical_accuracy_parameters,
# set these for SCF
iteration_control_parameters=iteration_control_parameters,
)
right_electrode_calculator = LCAOCalculator(
numerical_accuracy_parameters=numerical_accuracy_parameters,
# set these for SCF
iteration_control_parameters=iteration_control_parameters,
)
#----------------------------------------
# Device Calculator
#----------------------------------------
calculator = DeviceLCAOCalculator(
# set these for SCF
numerical_accuracy_parameters=numerical_accuracy_parameters,
iteration_control_parameters=iteration_control_parameters,
electrode_calculators=
[left_electrode_calculator, right_electrode_calculator],
)
else:
#----------------------------------------
# Electrode Calculators
#----------------------------------------
left_electrode_calculator = LCAOCalculator(
iteration_control_parameters=NonSelfconsistent,
numerical_accuracy_parameters=numerical_accuracy_parameters,
)
right_electrode_calculator = LCAOCalculator(
iteration_control_parameters=NonSelfconsistent,
numerical_accuracy_parameters=numerical_accuracy_parameters,
)
#----------------------------------------
# Device Calculator
#----------------------------------------
device_algorithm_parameters = DeviceAlgorithmParameters(
initial_density_type=NeutralAtom(electrode_constraint_length=0.0*Ang),
)
calculator = DeviceLCAOCalculator(
numerical_accuracy_parameters=numerical_accuracy_parameters,
iteration_control_parameters=NonSelfconsistent,
device_algorithm_parameters = device_algorithm_parameters,
electrode_calculators= [left_electrode_calculator, right_electrode_calculator],
)
return calculator
Note SCF is 1
attached is the nc file with the device