The pathways (as indeed all "analysis quantities") can be computed afterwards, from the saved states in the NC files. It's not done from the transmission spectrum, however, it's from the configuration.
So, identify which configuration that is relevant, and make a note of its object ID; it will be often be gID000 if there is only one configuration in the file. Then you read the state from there, and compute whatever you want.
configuration = nlread("file.nc", object_id="gID000")[0]
transmission_pathway = TransmissionPathway(configuration, ...)
nlsave(transmission_pathway, "results.nc")
You can use the Script Generator for this; insert "Analysis From File" and double-click it to specify the filename and object ID, and then insert Analysis blocks as usual.
Hi Anders
Below is the script I was trying to use to calculate for the file containing scf data for different biases, where I could change the bias and also have the pathways calcualted for a range of energies. (Similar to the way IV calculation script was written)
scf_filename = "analysis_%g.nc"
analysis_filename = "pathways_0v.nc"
biases = [0]
configurations = []
for bias in biases:
configurations.append(nlread(scf_filename % bias, DeviceConfiguration)[0])
biases = [float(conf.calculator().electrodeVoltages()[0]-conf.calculator().electrodeVoltages()[1]) for conf in configurations]
configurations = [configurations[j] for j in numpy.argsort(biases)]
for configuration in configurations:
calculator = configuration.calculator()
bias = calculator.electrodeVoltages()[0]-calculator.electrodeVoltages()[1]
if float(bias) == 0. :
zero_bias_potential = ElectrostaticDifferencePotential(configuration)
break
for configuration in configurations:
calculator = configuration.calculator()
bias = calculator.electrodeVoltages()[0]-calculator.electrodeVoltages()[1]
transmission_pathways = TransmissionPathways(
configuration=configuration,
energies=numpy.linspace(-2,8,100)*eV,
kpoints=MonkhorstPackGrid(1,1),
energy_zero_parameter=AverageFermiLevel,
infinitesimal=1e-06*eV,
contributions=Left,
spin=Spin.Up,
self_energy_calculator=DirectSelfEnergy(),
)
nlsave(analysis_filename, transmission_pathways)
nlprint(transmission_pathways)
geometry = nlread('analysis_0_long.nc', DeviceConfiguration, read_state = False)[0]
nlsave(analysis_filename, geometry)
Could you please see if this approach can be applied?
Thanks
Yes, but not exactly like that. You can only specify one energy for TransmissionPathway, so you need to loop explicitly. You can also remove the first loop over configurations, you don't need the zero-bias potential for anything. So:
analysis_filename = "pathways.nc"
# Read the configurations
scf_filename = "analysis_%g.nc"
biases = [ 0 ]
configurations = []
for bias in biases:
configurations.append(nlread(scf_filename % bias, DeviceConfiguration)[0])
# Sort the configurations by bias
biases = [float(conf.calculator().electrodeVoltages()[0]-conf.calculator().electrodeVoltages()[1]) for conf in configurations]
configurations = [configurations[j] for j in numpy.argsort(biases)]
# Loop over bias and energies
energies = numpy.linspace(-2,8,100)
for configuration in configurations:
bias = float(configuration.calculator().electrodeVoltages()[0]-configuration.calculator().electrodeVoltages()[1])
for energy in energies:
transmission_pathways = TransmissionPathways(
configuration=configuration,
energy=energy*eV,
kpoints=MonkhorstPackGrid(1,1),
contributions=Left,
spin=Spin.Up,
self_energy_calculator=RecursionSelfEnergy(),
)
nlsave(analysis_filename, transmission_pathways, object_id="Bias %s E %s" % (bias,energy))
# Read the configuration (once) without state, just the geometry for convenient plotting
geometry = nlread('analysis_0_long.nc', DeviceConfiguration, read_state = False)[0]
nlsave(analysis_filename, geometry)
Hope I didn't make any mistake, I can't test it my self.
Also, always be careful to be consistent with indentation - always just 4 spaces and never tabs.