Release notes#
Release notes for the published versions of nextnanopy. Changes for the next, not-yet-released version are collected in the README on GitHub.
Version 1.3.0 (September 9th, 2026)#
all docstrings are normalized to numpydoc
the nextnano.NEGF keyword argument
debug_ouptut_specificationsis now spelleddebug_output_specifications. If you passed the old name, update it: because it reaches the command builder through**kwargs, the misspelled name is now accepted and ignored rather than raising, so a stale call silently stops passing--debugto the solver.DataFilenow raisesFileNotFoundErrorwhen the path does not exist. Existence is checked before the loader is selected, so a missing or mistyped path always raisesFileNotFoundErrorregardless of extension; previously a missing file whose extension had no loader (e.g..in,.log,.txt) raisedNotImplementedErrorinstead, reporting the wrong problem.InputFile.execute()no longer writes into the output of an earlier run of the same input file. It takes a newoverwriteargument,Falseby default: when<outputdirectory>/<input file name>/is already taken, an index is appended (example_0,example_1, …) instead of reusing it, matching whatsave()andSweep.execute()have always done. Passoverwrite=Truefor the previous behaviour — reuse the directory as it is. Note that this writes next to what the earlier run left there; nothing is deleted, then or now. If a script hard-codes the output path for post-processing, it has to passoverwrite=Trueor read the path back from.folder_output, which always holds the directory that was actually used.InputFile.execute(create_subdirectory=False)runs the simulation directly in the configuredoutputdirectory, instead of in a subdirectory named after the input file. The subdirectory is still created by default, andoverwritehas no effect when it is switched off.Sweep.execute()passes itsoverwritevalue on to every simulation of the sweep, sooverwrite=Falsenow writes over no earlier output at either level — the sweep folder or the folder of an individual simulation. The per-simulation subfolder itself is always created: it is what keeps the sweep points apart.
Version 1.2.0 (July 20th, 2026)#
InputFile(text=...)now builds an input file from a string: the product is detected from the text, the right product class is returned, and the variables are parsed — without reading anything from disk. Previously the text was silently ignored and you got back an empty, product-agnostic object.InputFile(fullpath, text=...)does the same and keepsfullpathas the name to save back to; it used to raiseTypeError. Note thatInputFile()followed byfile.text = ...cannot work and never could — with no text at construction there is nothing to detect the product from, so you get a product-agnostic object whose.variablesstays empty. UseInputFile(text=...)instead.bug fix:
InputFile’sparseargument is no longer ignored when passed positionally.InputFile(path, None, True)silently left the file unparsed (.contentwasNone); only theInputFile(path, parse=True)spelling worked. Both now behave the same.InputFilecannot be subclassed and now says so with aTypeError. It chooses the class to build from the file’s contents, so a subclass was silently discarded and you got a plain product class back. Subclass the product’sInputFile(e.g.nextnanopy.nnp.inputs.InputFile), orInputFileTemplatefor all products. Related:isinstance(InputFile(path), InputFile)isFalse— the object you get back is a product class, andInputFileTemplateis the common base to check against and annotate with.introduced
ExecutionPool(nextnanopy.inputs), aThreadPoolExecutor-based alternative toExecutionQueuefor running input files concurrently. Not yet used internally (Sweepstill usesExecutionQueue); available for direct use.Sweepnow hassave()andexecute()as the preferred, shorter names forsave_sweep()andexecute_sweep(). For now they simply forward to the existing methods, so nothing changes; in a future release the names will swap (the short names will hold the implementation and the*_sweepnames will remain as deprecated aliases). Prefersweep.save()/sweep.execute()in new code.convergence check no longer hangs headless runs:
check_convergence(mode='pause')asks how to proceed only when an interactive terminal is attached; without one (CI, cluster jobs) it now raises likemode='terminate'instead of blocking on input.nextnanopy.config.set(...)now reaches every input file you create afterwards, with nosave()needed — configure first, then build your input files. Previously aset()was ignored unless it was followed bysave(). The configuration is bound when the input file is created: it takes a copy ofnextnanopy.configas it stands at that moment, so later changes tonextnanopy.configdo not reach files that already exist, and editingfile.configchanges neithernextnanopy.confignor any other input file. The input files aSweepgenerates follow the same rule. Passingconfigpathstill takes precedence over all of this.importing
nextnanopyno longer creates or checks~/.nextnanopy-config. The config is built on first access ofnextnanopy.config(or when anInputFileis created withoutconfigpath).saving the config file is now atomic: an interrupted write can no longer leave a half-written
.nextnanopy-configbehind.Configwith an empty path now raisesValueError; a path to a non-existing file yields an empty configuration that can be filled in and saved.bug fix:
ExecutionQueueno longer busy-spins at 100% CPU while waiting for parallel simulations (limit_parallel > 1). It now sleeps between checks (ExecutionQueue.poll_interval, default 0.1 s) and fills all free parallel slots at once; wall time is unchanged.performance: creating an
InputFilereads the file (and sets up the config) only once; product detection loads the file once instead of once per product;DataFileloads the data from disk only once (product-specific.txtfiles still need two reads).DataFilerestructured: the per-productDataFileclasses are removed, only per-product.txtloaders remain. Loader autodetection now raisesNotImplementedErrorwith a clear message when no loader fits.removed
nextnanopy.defaults.get_DataFile, which mapped a product name to itsDataFileclass. Usenextnanopy.DataFile(path, product=...)instead.executeis no longer exported at the top level:nextnanopy.executeis gone. It was the low-level command runner, which requiresexe,license,databaseandoutputdirectoryto be passed by hand — the very things nextnanopy reads from your configuration for you. UseInputFile.execute()(as in all the examples), or importnextnanopy.commands.executedirectly if you really want the raw call.nextnanopy.commands.executenow raises a clearValueErrorfor an empty or non-existing input file path before starting a simulation.bug fix: nested or concurrent loops over the same
DictList,InputFileorDataFileno longer interfere with each other. Iterating the same object in an inner and an outer loop (e.g.for v1 in datafile: for v2 in datafile: ...) used to end the outer loop early, because the iteration position was stored on the object itself. Iteration still yields the values (Variable/Coordobjects, input variables), so no API change.bug fix: the detected product for invalid input files is consistently lowercase
'not valid'bug fix: replaced deprecated
xmlusage in nextnano.NEGF_classic input handlingremoved the unused
is_{product}_input_filefunctions (superseded byis_{product}_input_text)internal:
savetxtinutils/miscrefactored; first unit tests forExecutionQueueadded and sped up; nextnano++ syntax updated in the test example input file
Version 1.1.1 (July 13th, 2026)#
bugfixes
enforce ruff linting and formatting
Version 1.1.0 (May 5th, 2026)#
most of the templates are moved to the nextnano tools distribution packages, no longer part of this repo
new parameter
parseforInputFile(defaultFalse): content parsing of nextnano++ input files is now opt-in. UseInputFile(fullpath, parse=True)to populatefile.contentwith the block structure. With the defaultparse=Falsethe file loads normally — variables are available,contentisNone— which also allows loading files where preprocessor directives cause unbalanced{}that the parser cannot handle.bugfixes
Version 1.0.5 (Mar 24th, 2026)#
bugfix
Version 1.0.4 (Mar 24th, 2026)#
saving sweeps in temporary location:
Sweep.save_sweep(temp=True)bugfix with json output file of the sweep
templates updates
Version 1.0.3 (Jan 8th, 2026)#
now modern MSB input files are supported
use dandelion instead of golden in plotting pallette
enforce alphabetical order in DataFolder tree
Version 1.0.2 (Oct 10th, 2025)#
bugfix: now supports the avs binary files with ascii coords
added nextnano mpl style for plotting, see utils
added possibility to save input files in temporary folder:
InputFile.save(temp=True)improved gds import
Version 1.0.1 (Jul 12th, 2025)#
.txt files are read as Dat without coords (all columns are variables)
Version 1.0.0 (Jul 11th, 2025)#
support of python3.13
NEGF renamed to NEGF_classic (requires .nextnanopy-config update)
NEGF++ renamed to NEGF (requires .nextnanopy-config update)
Version 0.1.22 (May 7th, 2024)#
improved Dat loader
Version 0.1.21 (Feb 28th, 2024)#
Added DataFile loader for total_charges.txt
nextnanopy now supports python3.11
Version 0.1.20 (Dec 13th, 2023)#
nextnanopy is aligned to be used with nextnanoevo. nextnanoevo will be released in 2024
Version 0.1.19 (Jul 21st, 2023)#
new feature: saving DataFile: DataFile.save
new feature: DataFolder.find_multiple - search files by multiple keywords
new property DataFolder.name - return the basename of the folder
Version 0.1.18 (Jul 04th, 2023)#
new product available: nextnano.NEGF++
setting the text for InputFile is available again (but switching product when setting text os forbidden)
interface with .gds files is extended
Version 0.1.17 (Jun 07th, 2023)#
fixed a bug with nnp.shapes.GdsPolygons.get_obelisks
get_obelisks can be used again. The usage is deprecated, nnp.shapes.GdsPolygons.get_polygonal_prisms is preferred way to convert gds to nextnano++ structure
Version 0.1.16 (Apr 25th, 2023)#
nextnanopy now supports python 3.10!
The execute_sweep function has been updated to include a new parameter, separate_sweep_dir, which allows the user to specify whether the output files should be saved in a separate directory or a common output directory. By default, execute_sweep will still create a separate output directory for each sweep. However, if the user sets separate_sweep_dir to False, the output files will be saved in a common output directory instead.
ListDict now supports negative indexes (in the same way as a normal python list)
nnpp assistant is updated
shapely is no longer necessary to import geometry from gdsii file
Version 0.1.15 (Aug 31st, 2022)#
input files now can be executed in parallel through nextnanopy.inputs.ExecutionQueue class
Sweep uses ExecutionQueue and executes several simulations in parallel if parallel_limit>1 in Sweep.execute_sweep(parallel_limit = n)
Version 0.1.14 (Jul 27th, 2022)#
nextnanopy.Sweep.save_sweep has parameter round_decimal to limit round of digits in the folder names. Default round_decimal = 8
Version 0.1.13 (Jun 13th, 2022)#
Default .dat loader of nextnanopy.DataFile was changed. Before x,y,z and position were coordinates, anything else recognized as variables. Now first column of the ‘.dat’ file is recognized as coordinate, all other columns are variables.
Demo: parser of the whole input file for nextnano++. Raise error if file contains incorrect number and order of parentheses ‘{}’
Version 0.1.12 (Mar 14th, 2022)#
added support of input variables for nextnanoNEGF. Note: after save all non-xml data (i.e. comments) is not preserved.
Version 0.1.11 (Jan 10th, 2022)#
Feature: DataFile.plot() - make a preview plot. Graph for 1-dimensional data and a colormap for 2-dimensional data.
Feature: New class DataFolder. Designed to simplify navigation in output directory.
Beta feature: postprocess.simple_optimize. Runs simulation over given variables space and optimizes the desired output value.
Version 0.1.10 (Oct 06th, 2021)#
Feature: Added new class Sweep allowing to create automatic sweeps over few variables
Version 0.1.9 (Dec 16th, 2020)#
Feature: InputFile.execute has now show_log (True or False) to turn on/off the log. Note: the log file is always saved.
Removed default messages when saving an input file
Version 0.1.8 (Dec 14th, 2020)#
Buf fix: find unused name when saving input file
Version 0.1.7 (Dec 3rd, 2020)#
docstring for inputs.py, outputs.py, config.py, mycollections.py, datasets.py
Updated examples in docs/examples/
Version 0.1.6 (Dec 2nd, 2020)#
Feature: [DataFile] access with index to coordinates and to variables
df = nextnanopy.DataFile(...) df['x'] # same as df.coords['x'] df['Gamma'] # same as df.variables['Gamma']
Feature: [DataFile] is loopable as well as .coords and .variables
Feature: [InputFile] access with index to input variables
df = nextnanopy.InputFile(...) df['xmax'] # same as df.variables['xmax']
Feature: [InputFile] is loopable as well as .coords and .variables
Feature: [InputFile] extra attributes
df = nextnanopy.InputFile(...) df.folder_output # returns the output folder if it was executed, otherwise it raises an error df.filename # settable df.filename_only # settable df.folder_input # settable
Feature: User-friendly information for DataFile, InputFile, Variable, Coord and InputVariable
Bug fix: .vtr dataset reshape method
Version 0.1.5 (Dec 2nd, 2020)#
Feature: Support of .vtr data files
Feature: If unit is not found, default value is ‘a.u.’.
Bug fix: Better methods to find correctly name and unit from data file headers
Version 0.1.4 (Nov 29th, 2020)#
Feature: Create an empty input file and set the raw text with the attribute text.
Version 0.1.3 (Nov 28th, 2020)#
Bug fix: Find unused name when save input files.
Feature: Default label for Variables and Coords. The attribute label returns “name (unit)”.
Version 0.1.2 (Nov 20th, 2020)#
Bug fix: Raw text of input variables without comment was generated incorrectly.
Version 0.1.1 (Nov 18th, 2020)#
Bug fix: Find the home path for OSX and Linux.
Version 0.1.0 (Nov 13th, 2020)#
Initial release