Welcome to the Nanocluster Interpolation Scheme Program (NISP) documentation!

Citation Python Version GitHub release (latest by date) PyPI Conda Binder Licence

Section author: Geoffrey Weal <geoffrey.weal@gmail.com>

Section author: Dr. Anna Garden <anna.garden@otago.ac.nz>

Section author: Dr. Andreas Pedersen

Section author: Prof. Hannes Jónsson <hj@hi.is>

Group page: https://blogs.otago.ac.nz/annagarden/

Page to cite with work from: A. L. Garden, A. Pedersen, H. Jónsson, “Reassignment of ‘magic numbers’ of decahedral and FCC structural motifs”, Nanoscale, 10, 5124-5132 (2018), DOI: 10.1039/C7NR09440J

What is this Documentation about?

This documentation is designed to guide the user to use the Nanocluster Interpolation Scheme Program (NISP) program.

What is NISP

The NISP program is an interpolation scheme that is designed to give an approximate guide for the estimated energies of unsymmetric nanoclusters based on energetic trends between perfect, closed-shell nanoclusters. This program will create all the perfect, close shell icosahedral, decahedral, and octahedral clusters that can be created between 13 atoms and an upper atom number limit. These nanoclusters are locally optimised using either an ASE, an ASE-integrated calculator, or with VASP. After the nanoclusters are locally optimised, the delta energy is obtained for each nanocluster before providing plots and text files that indicate the estimated energies of perfect, closed-shell and unsymmetric nanoclusters and how to remove atoms from the larger perfect closed-shell nanocluster to give unsymmetric nanoclusters with a certain number of atoms. See “Reassignment of ‘magic numbers’ of decahedral and FCC structural motifs” (DOI: 10.1039/C7NR09440J) for more information about how this interpolation scheme works.

The algorithm was designed by Dr Anna Garden of the University of Otago, Dunedin, New Zealand, and Dr. Andreas Pedersen and Prof. Hannes Jónsson of the University of Iceland. The Github page for this program can be found at github.com/GardenGroupUO/NISP.

Dr. Anna Garden: blogs.otago.ac.nz/annagarden

Dr. Andreas Pedersen: https://dk.linkedin.com/in/andreas-pedersen-a847025

Prof. Hannes Jónsson: english.hi.is/staff/hj

Try Organisms before you Clone/Pip/Conda (on Binder/Jupter Notebooks)!

If you are new to the NISP program, it is recommended try it out by running NISP live on our interactive Jupyter+Binder page before you download it. On Jupyter+Binder, you can play around with the NISP program on the web. You do not need to install anything to try NISP out on Jupyter+Binder.

Click the Binder button below to try NISP out on the web! (The Binder page may load quickly or may take 1 or 2 minutes to load)

Binder

Installation

It is recommended to read the installation page before using the NISP program. See Installation: Setting Up NISP and Pre-Requisites Packages for more information. Note that you can install NISP through pip3 and conda.

Output files that are created by NISP

An example of the plots that are created is the interpolation scheme plot, which shows all the estimated energies of nanoclusters across the size range of nanoclusters that you are measuring across. An example of this for Au nanoclusters, using the RGL potetial with parameters from Baletto et al. (DOI: 10.1063/1.1448484), is shown below:

Interpolation Scheme

There are also other plots created by NIPS as well as other text documents that contain the delta energies of the various nanoclusters that you calculated, as well as instructions about how to remove atoms from certain nanoclusters in order to get icosahedral, decahedral, and octahedral nanoclusters with the particular number of atoms that you desire. Click here to see examples of all of these plots and text files.

Table of Contents

How the Nanocluster Interpolation Scheme Program (NISP) works

The NISP program is an interpolation scheme that is designed to give an approximate guide for the estimated energies of unsymmetric nanoclusters based on energetic trends between perfect, closed-shell nanoclusters.

This program will create all the perfect, close shell icosahedral, decahedral, and octahedral clusters that can be created between 13 atoms and an upper atom number limit. These nanoclusters are locally optimised using either an ASE, an ASE-integrated calculator, or with VASP.

After the nanoclusters are locally optimised, the delta energy is obtained for each nanocluster before providing plots and text files that indicate the estimated energies of perfect, closed-shell and unsymmetric nanoclusters and how to remove atoms from the larger perfect closed-shell nanocluster to give unsymmetric nanoclusters with a certain number of atoms.

See “Reassignment of ‘magic numbers’ of decahedral and FCC structural motifs” (DOI: 10.1039/C7NR09440J) for more information about how this interpolation scheme works.

Installation: Setting Up NISP and Pre-Requisites Packages

In this article, we will look at how to install the NISP and all requisites required for this program.

Pre-requisites

Python 3 and pip3

This program is designed to work with Python 3. While this program has been designed to work with Python 3.6, it should work with any version of Python 3 that is the same or later than 3.6.

To find out if you have Python 3 on your computer and what version you have, type into the terminal

python3 --version

If you have Python 3 on your computer, you will get the version of python you have on your computer. E.g.

geoffreyweal@Geoffreys-Mini Documentation % python3 --version
Python 3.6.3

If you have Python 3, you may have pip3 installed on your computer as well. pip3 is a python package installation tool that is recommended by Python for installing Python packages. To see if you have pip3 installed, type into the terminal

pip3 list

If you get back a list of python packages install on your computer, you have pip3 installed. E.g.

geoffreyweal@Geoffreys-Mini Documentation % pip3 list
Package                       Version
----------------------------- ---------
alabaster                     0.7.12
asap3                         3.11.10
ase                           3.20.1
Babel                         2.8.0
certifi                       2020.6.20
chardet                       3.0.4
click                         7.1.2
cycler                        0.10.0
docutils                      0.16
Flask                         1.1.2
idna                          2.10
imagesize                     1.2.0
itsdangerous                  1.1.0
Jinja2                        2.11.2
kiwisolver                    1.2.0
MarkupSafe                    1.1.1
matplotlib                    3.3.1
numpy                         1.19.1
packaging                     20.4
Pillow                        7.2.0
pip                           20.2.4
Pygments                      2.7.1
pyparsing                     2.4.7
python-dateutil               2.8.1
pytz                          2020.1
requests                      2.24.0
scipy                         1.5.2
setuptools                    41.2.0
six                           1.15.0
snowballstemmer               2.0.0
Sphinx                        3.2.1
sphinx-pyreverse              0.0.13
sphinx-rtd-theme              0.5.0
sphinx-tabs                   1.3.0
sphinxcontrib-applehelp       1.0.2
sphinxcontrib-devhelp         1.0.2
sphinxcontrib-htmlhelp        1.0.3
sphinxcontrib-jsmath          1.0.1
sphinxcontrib-plantuml        0.18.1
sphinxcontrib-qthelp          1.0.3
sphinxcontrib-serializinghtml 1.1.4
sphinxcontrib-websupport      1.2.4
urllib3                       1.25.10
Werkzeug                      1.0.1
wheel                         0.33.1
xlrd                          1.2.0

If you do not see this, you probably do not have pip3 installed on your computer. If this is the case, check out PIP Installation

Atomic Simulation Environment

NISP uses the atomic simulation environment (ASE) to construct the various types of icosahedral, decahedral, and octahedral nanoclusters that are used to perform the interpolation scheme. This allows LatticeFinder to take advantage of the features of ASE, such as the wide range of calculators that can be used to calculate the energy of the cluster, and the local optimisers available to optimise nanoclusters created with NISP. Furthermore, ASE also offers useful tools for viewing, manipulating, reading and saving clusters and chemcial systems easily. Read more about ASE here. For NISP, it is recommended that you install a version of ase that is 3.19.1 or greater.

The installation of ASE can be found on the ASE installation page, however from experience if you are using ASE for the first time, it is best to install ASE using pip, the package manager that is an extension of python to keep all your program easily managed and easy to import into your python.

To install ASE using pip, perform the following in your terminal.

pip3 install --upgrade --user ase

Installing using pip3 ensures that ASE is being installed to be used by Python 3, and not Python 2. Installing ASE like this will also install all the requisite program needed for ASE. This installation includes the use of features such as viewing the xyz files of structure and looking at ase databases through a website. These should be already assessible, which you can test by entering into the terminal:

ase gui

This should show a gui with nothing in it, as shown below.

ase_gui_blank

This is a blank ase gui screen that you would see if enter ase gui into the terminal.

However, in the case that this does not work, we need to manually add a path to your ~/.bashrc so you can use the ASE features externally outside python. First enter the following into the terminal:

pip3 show ase

This will give a bunch of information, including the location of ase on your computer. For example, when I do this I get:

Geoffreys-Mini:~ geoffreyweal$ pip show ase
Name: ase
Version: 3.20.1
Summary: Atomic Simulation Environment
Home-page: https://wiki.fysik.dtu.dk/ase
Author: None
Author-email: None
License: LGPLv2.1+
Location: /Users/geoffreyweal/Library/Python/3.6/lib/python/site-packages
Requires: matplotlib, scipy, numpy
Required-by:

In the ‘Location’ line, if you remove the ‘lib/python/site-packages’ bit and replace it with ‘bin’. The example below is for Python 3.6.

/Users/geoffreyweal/Library/Python/3.6/bin

This is the location of these useful ASE tools. You want to put this as a path in your ~/.bashrc as below:

############################################################
# For ASE
export PATH=/Users/geoffreyweal/Library/Python/3.6/bin:$PATH
############################################################
Packaging

The packaging program is also used in this program to check the versions of ASE that you are using for compatibility issues. Easiest way to install packaging is though pip. Type the following into the terminal:

pip3 install --upgrade --user packaging

Setting up NISP

There are two ways to install NISP on your system. These ways are described below:

Install NISP through pip3

To install the NISP program using pip3, perform the following in your terminal.

pip3 install --upgrade --user NISP

The website for Organisms on pip3 can be found by clicking the button below:

PyPI
Install Organisms through conda

You can also install Organisms through conda, however I am not as versed on this as using pip3. See docs.conda.io to see more information about this. Once you have installed anaconda on your computer, I believe you install NISP using conda by performing the following in your terminal.

conda install ase
conda install nisp

The website for Organisms on conda can be found by clicking the button below:

Conda
Manual installation

First, download NISP to your computer. You can do this by cloning a version of this from Github, or obtaining a version of the program from the authors. If you are obtaining this program via Github, you want to cd to the directory that you want to place this program in on the terminal, and then clone the program from Github through the terminal as well

cd PATH/TO/WHERE_YOU_WANT_Organisms_TO_LIVE_ON_YOUR_COMPUTER
git clone https://github.com/GardenGroupUO/NISP

Next, add a python path to it in your .bashrc to indicate its location. Do this by entering into the terminal where you cloned the Organisms program into pwd

pwd

This will give you the path to the Organisms program. You want to enter the result from pwd into the .bashrc file. This is done as shown below:

export PATH_TO_NISP="<Path_to_NISP>"
export PYTHONPATH="$PATH_TO_NISP":$PYTHONPATH

where "<Path_to_NISP>" is the directory path that you place NISP (Enter in here the result you got from the pwd command). Once you have run source ~/.bashrc, the genetic algorithm should be all ready to go!

The folder called Examples contains all the files that one would want to used to use the genetic algorithm for various metals. This includes examples of the basic run code for the genetic algorithm, the Interpolation_Script.py and RunMinimisation.py files.

NISP contains subsidiary programs that contain other program that may be useful to use when using the NISP program. This is called Subsidiary_Programs in NISP. To execute any of the programs contained within the Subsidiary_Programs folder, include the following in your ~/.bashrc:

export PATH="$PATH_TO_NISP"/NISP/Subsidiary_Programs:$PATH

See Helpful Programs to run NISP for more information about the programs that are available in the Subsidiary_Programs folder.

Other Useful things to know before you start

You may use squeue to figure out what jobs are running in slurm. For monitoring what genetic algorithm jobs are running, I have found the following alias useful. Include the following in your ~/.bashrc (see How to execute all Trials using the JobArray Slurm Job Submission Scheme for what is going on in the below line)

squeue -o "%.20i %.9P %.5Q %.50j %.8u %.8T %.10M %.11l %.6D %.4C %.6b %.20S %.20R %.8q" -u $USER --sort=+i
Summary of what you want in the ~/.bashrc for the Organisms program if you manually installed the Organisms

You want to have the following in your ~/.bashrc:

#########################################################
# Paths and Pythonpaths for NISP

export PATH_TO_NISP="<Path_to_NISP>"
export PYTHONPATH="$PATH_TO_NISP":$PYTHONPATH

export PATH="$PATH_TO_NISP"/NISP/Subsidiary_Programs:$PATH

squeue -o "%.20i %.9P %.5Q %.50j %.8u %.8T %.10M %.11l %.6D %.4C %.6b %.20S %.20R %.8q" -u $USER --sort=+i

#########################################################

Interpolation_Script.py - How to run NISP

In this article, we will look at how to run NISP. NISP is run through the Interpolation_Script.py python script. You can find examples of Run.py files at github.com/GardenGroupUO/NISP under Examples. Also, you can try out this program by running an example script through a Jupyter notebook. See Examples of running NISP to get access to examples of running NISP through this Jupyter notebook!

Running the Interpolation_Script.py script

We will explain how the Interpolation_Script.py code works by running though the example shown below:

Interpolation_Script.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
from NISP import Run_Interpolation_Scheme 
from RunMinimisation_Au import Minimisation_Function

input_information = {}
input_information['Element Type'] = 'Au'
input_information['Cohesive Energy'] = -3.82819360826 #-3.82819360826
input_information['Maximum No. of Atoms'] = 2000
input_information['Local Optimiser'] = Minimisation_Function

output_information = {}
output_information['Plot upper No of atom limit']   = None
output_information['Plot lower No of atom limit']   = None
output_information['Plot upper delta energy limit'] = None
output_information['Plot lower delta energy limit'] = None
output_information['Sizes to obtain instructions to create clusters for'] = [561,742,923]#[37,38,44,55,147,40,888,1399]

no_of_cpus = 4
filename_prefix = ''

Run_Interpolation_Scheme(input_information=input_information,output_information=output_information,no_of_cpus=no_of_cpus,filename_prefix=filename_prefix)

Lets go through each part of the Interpolation_Script.py file one by one to understand how to use it.

1) Input information for the interpolation scheme

We first load the information required by the interpolation scheme. All this information is loaded as entries into the dictionary called input_information.

The pieces of information required in input_information are:

  • Element Type (str.): This is the type of element that the cluster is made up of.

  • Cohesive Energy (float): This is the cohesive energy of the element you are using. See How to obtain cohesive energies to find about about how to obtain cohesive energies.

  • Maximum No. of Atoms (int): The number of offspring generated per generation.

  • Local Optimiser (def/str.): This is a local optimisation method that you will locally optimise clusters with as well as their delta energies. See RunMinimisation.py - Writing a Local Minimisation Function for NISP for information about the local optimiser works and is written.

    • You can also use VASP to perform DFT local optimisations on your clusters. Do this by setting the 'Local Optimiser' in input_information as input_information['Local Optimiser'] = 'VASP'. See How to perform NISP with VASP calculations to learn more about how to perform VASP calculations on clusters created using NISP.

    • You can also select to manually enter in the energies of the clusters. To do this, enter in input_information['Local Optimiser'] = 'Manual Mode'. See How to manually enter energy results into NISP for more information about how to manually enter in energies for clusters into NISP.

An example of these parameters in Interpolation_Script.py is given below:

4
5
6
7
8
input_information = {}
input_information['Element Type'] = 'Au'
input_information['Cohesive Energy'] = -3.82819360826 #-3.82819360826
input_information['Maximum No. of Atoms'] = 2000
input_information['Local Optimiser'] = Minimisation_Function
2) Output information for the interpolation scheme

We then load the information required by the interpolation scheme to plot the results from the interpolation scheme. The sizes of all the clusters that you would like to obtain possible clusters for are also inputted here and given as txt files.

All this information is loaded as entries into the dictionary called output_information.

The pieces of information required in output_information are:

  • Plot upper No of atom limit (int): This is the upper size range that you would like to plot.

  • Plot lower No of atom limit (int): This is the lower size range that you would like to plot.

  • Plot upper delta energy limit (float): This is the upper delta energy range that you would like to plot.

  • Plot lower delta energy limit (float): This is the lower delta energy range that you would like to plot.

  • Sizes to obtain instructions to create clusters for (list of ints): These are all the sizes of clusters that you would like to obtain possible clusters for, including perfect, open-shell, and close-shell clusters. NISP will include text files that will include how to make all the symmetric and unsymmetric icosahedral, decahedral, and octahedral cluster that contain a particular cluster size.

  • Filename Prefix (str.): This is the prefix of the name that you want to give to files that are create by the NISP program. This does not need to be given, as there is a default prefix given. The default filename prefix includes the element of the cluster as well as the maximum no. of atoms that the program was run up to.

An example of these parameters in Interpolation_Script.py is given below:

10
11
12
13
14
15
output_information = {}
output_information['Plot upper No of atom limit']   = None
output_information['Plot lower No of atom limit']   = None
output_information['Plot upper delta energy limit'] = None
output_information['Plot lower delta energy limit'] = None
output_information['Sizes to obtain instructions to create clusters for'] = [561,742,923]#[37,38,44,55,147,40,888,1399]
3) The number of CPUs used by the program and the filename prefix of input and output files

NISP can run for a long time, especially if you have set Maximum No. of Atoms to over 1000 atoms. Therefore, it is possible to run this program for a while. Therefore, it is possible to parallelise this program so that it run a bit faster. This can be set by setting the no_of_cpus variable. no_of_cpus must be set to an int. The default value for the no_of_cpus variable is 1.

Furthermore, you can also give a custom name to the input and output files that you make/are made. This is given in filename_prefix. However, you do not need to do this. If you dont want to have a custom filename, do not include filename_prefix in your script or set filename_prefix = ''.

An example of no_of_cpus in Interpolation_Script.py is given below:

17
18
no_of_cpus = 4
filename_prefix = ''
Run NISP!

You have got to the end of all the parameter setting stuff. Now on to running NISP. The next part of the Interpolation_Script.py script tells NISP to run. This is written as follows in the Interpolation_Script.py:

20
Run_Interpolation_Scheme(input_information=input_information,output_information=output_information,no_of_cpus=no_of_cpus,filename_prefix=filename_prefix)

Output files that are created by NISP

The NISP program will create a number of plots and text documents when it is run. See Examples of data that the NISP program gives to see the types of plots and text documents that NISP will make.

RunMinimisation.py - Writing a Local Minimisation Function for NISP

In this article, we will look at how to write the local optimisation method for NISP.

What is the Minimisation_Function

The Minimisation_Function is a definition that perform local optimisations during NISP. This is used by NISP as a def (i.e. as a function). This means that, rather than a variable being passed into NISP, a function is passed into the algorithm.

The implementation of the local minimisation process into NISP has been designed to be as free as possible, so that the user can use whatever local optimisation algorithm or program they want to use. In general, this algorithm will import a cluster in an ASE format from NISP. The user can locally optimise it before sending it back to NISP again in the ASE format.

Because of this flexibility, it is possible to use any type of calculator from ASE, ASAP, GWAP, LAMMPS, etc. It is even possible for the user to design this to use with non-python user-interface based local optimisers. See How to write the Minimisation_Function for non-ASE Implemented Calculator for information on how to write a Minimisation_Function def to do this.

If you want to use VASP to perform local optimisation calculations, see How to perform NISP with VASP calculations. If you want to use another long running programming like Quantum Espresso, you will need to enter in cluster energies from the program you use into NISP manually. See How to manually enter energy results into NISP for more information.

In the following documentation we will describe how the Minimisation_Function method is designed in a RunMinimisation.py file, and how you can make your own. Examples of RunMinimisation.py files used in NISP runs can be found in github.com/GardenGroupUO/NISP in the directory path Examples (this should be found in github.com/GardenGroupUO/NISP/tree/main/Examples).

Where to write the Minimisation_Function

The Minimisation_Function can be written into the Run.py file. However, as a personal preference and also to make the code cleaner to read, write and use, I put it into another python file. This file I have called RunMinimisation.py. This does not need to be the name of this file. For example, I have named this file RunMinimisation_AuPd.py when I wanted to keep a record that this minimisation python file contained the Gupta parameters and code for locally minimising a cluster using the Gupta potential for a cluster containing Au and Pd atoms.

Furthermore, the def Minimisation_Function does not even need to be called Minimisation_Function. It could be called TheGuptaFunction, the_local_minimisation_function, or The_Electric_Eel_Function. Again, I have just always called it Minimisation_Function for simplicity and for ease when using different Interpolation_Script.py files with different Minimisation_Function codes.

However, it is important that this code is referenced somehow in your Interpolation_Script.py script if you want to locally optimise clusters during the NISP program. The algorithm is imported into Interpolation_Script.py as follows (You can also see this in Interpolation_Script.py - How to run NISP):

# The RunMinimisation.py algorithm is one set by the user. It contain the def Minimisation_Function
# That is used for local optimisations. This can be written in whatever way the user wants to perform
# the local optimisations. This is meant to be as free as possible.
from RunMinimisation import Minimisation_Function

where, in the above code, RunMinimisation is the name of the file the local minimisation code is found in (This file is called RunMinimisation.py), and Minimisation_Function is the name of the function that is found in the RunMinimisation.py. If you do it like this, make sure that your RunMinimisation.py file is in the same folder as your Run.py file.

How to write the Minimisation_Function

The Minimisation_Function must be written with the following requirements:

  • cluster (ase.Atoms): This is the unoptimised version of the cluster.

NOTE: The collection and cluster_name variables do not need to be used in your RunMinimisation.py script if you are using an ASE or ASE implemented calculator and local optimisator. This information may be useful if you want the cluster to be locally optimised using an external program that can not be easily used with python (for example with VASP, see How to write the Minimisation_Function for non-ASE Implemented Calculator).

returns:

  • cluster (ase.Atoms) - This is the optimised version of the cluster.

An example of a RunMinimisation.py file for a Gupta potential involving only Au atoms is given below:

RunMinimisation.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
'''
RunMinimisation.py, GRW, 8/6/17
 
This script is designed to locally optimise clusters.
'''
from asap3.Internal.BuiltinPotentials import Gupta
from ase.optimize import FIRE
from ase.io import write

def Minimisation_Function(cluster):
    cluster.pbc = False
    # Perform the local optimisation method on the cluster.
    # Parameter sequence: [p, q, a, xi, r0]
    #Au_parameters = {'Au': [10.229, 4.0360, 0.2061, 1.7900, 2.884]}
    r0 = 4.07/(2.0 ** 0.5)
    Au_parameters = {'Au': [10.53, 4.30, 0.2197, 1.855, r0]} # Baletto
    Gupta_parameters = Au_parameters
    cutoff = 1000
    calculator = Gupta(Gupta_parameters, cutoff=cutoff, debug=False)
    cluster.set_calculator(calculator)
    original_cluster = cluster.copy()
    dyn = FIRE(cluster,logfile=None)
    converged = False
    try:
        dyn.run(fmax=0.01,steps=5000)
        converged = dyn.converged()
        if not converged:
            cluster_name = 'issue_cluster.xyz'
            errorMessage = 'The optimisation of cluster ' + str(original_cluster) + ' did not optimise completely.\n'
            errorMessage += 'The cluster of issue before optimisation has been saved as: '+str(cluster_name)
            write(cluster_name,original_cluster)
            raise Exception(errorMessage)
    except Exception as exception_message:
        cluster_name = 'issue_cluster.xyz'
        errorMessage = 'The optimisation of cluster ' + str(original_cluster) + ' did not optimise completely.\n'
        errorMessage += 'The cluster of issue before optimisation has been saved as: '+str(cluster_name)+'\n'
        errorMessage += exception_message
        write(cluster_name,original_cluster)
        raise Exception(errorMessage)
    return cluster

We will explain the components of this example below:

Importing external code

To begin, you will need to import all the external files that you will need so that you have the descriptor of the potential you want to use, and the local optimiser that you would like to use. In this example, the Gupta potential is used as the descriptor for the potential, while FIRE is the local optimiser that will be used to locally optimise the cluster.

6
7
8
from asap3.Internal.BuiltinPotentials import Gupta
from ase.optimize import FIRE
from ase.io import write
Preparing the cluster

First, it is usually a good idea to tell ase if you want the calculator to calculate the cluster with periodic boundary conditions pbc or not. In the case of the Gupta potential, we will include the line cluster.pbc = False to make sure that there are no boundary conditions on upon the cluster, since we do not want this and the Gupta potential does not need this turned on. For your potential, you may want to include this, or not.

11
cluster.pbc = False
Preparing the Potential, and setting up the local optimiser.

We would like to set up the parameters needed for the descriptor of the potential, attach the descriptor as a calculator to the cluster, and set up the local optimiser. In this example, Gupta is called a calculator. It contains a description of the Gupta potential that can be used to calculate the energy of cluster. We do this in the line cluster.set_calculator(Gupta(Gupta_parameters, cutoff=1000, debug=True)). For more information on how this works, see Tutorial on Using Calculators in ASE.

The last line, dyn = FIRE(cluster), sets up the local optimiser, FIRE, to be used to locally minimise the cluster cluster (see Tutorial on Structure Optimization in ASE).

See below for a example:

12
13
14
15
16
17
18
19
20
21
22
# Perform the local optimisation method on the cluster.
# Parameter sequence: [p, q, a, xi, r0]
#Au_parameters = {'Au': [10.229, 4.0360, 0.2061, 1.7900, 2.884]}
r0 = 4.07/(2.0 ** 0.5)
Au_parameters = {'Au': [10.53, 4.30, 0.2197, 1.855, r0]} # Baletto
Gupta_parameters = Au_parameters
cutoff = 1000
calculator = Gupta(Gupta_parameters, cutoff=cutoff, debug=False)
cluster.set_calculator(calculator)
original_cluster = cluster.copy()
dyn = FIRE(cluster,logfile=None)
Executing the local optimiser

We would like to now get the definition to run a local optimisation. This is done by performing dyn.run(fmax=0.01,steps=5000). However I have found that if something breaks for some reason during the optimisation, this can completely stop the genetic algorithm in its tracks, and cause it to finish with a fatal error. You may want this to happen so that you can address issues when they arise, but sometimes it is hard to continue to work when it keeps happening. If you would like, you can make sure the genetic algorithm does not fail entirely by adding a Error Handling block, as shown in the example below:

23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
converged = False
try:
    dyn.run(fmax=0.01,steps=5000)
    converged = dyn.converged()
    if not converged:
        cluster_name = 'issue_cluster.xyz'
        errorMessage = 'The optimisation of cluster ' + str(original_cluster) + ' did not optimise completely.\n'
        errorMessage += 'The cluster of issue before optimisation has been saved as: '+str(cluster_name)
        write(cluster_name,original_cluster)
        raise Exception(errorMessage)
except Exception as exception_message:
    cluster_name = 'issue_cluster.xyz'
    errorMessage = 'The optimisation of cluster ' + str(original_cluster) + ' did not optimise completely.\n'
    errorMessage += 'The cluster of issue before optimisation has been saved as: '+str(cluster_name)+'\n'
    errorMessage += exception_message
    write(cluster_name,original_cluster)
    raise Exception(errorMessage)

You can also see that I have placed an if statement to determine if the local optimsation actually converged. I have found that it is useful to include a way of noting if the optimisation was able to converge or not. See more about How to perform a local optimisation in ASE here, or refer to the manual of the local optimiser you are using for more information on how to do this.

Return the Optimised Cluster and Info

Remember to return the cluster to the genetic algorithm so that it can use this information, as well as the optimiser cluster, to proceed to explore the potential energy surface of the cluster you wish to explore.

40
return cluster

How to write the Minimisation_Function for a ASE Implemented Calculator

If the descriptor for the potential you would like to use is implemented in ASE, it is very easy to implement this into your Minimisation_Function definition. You can use the example of RunMinimisation.py above, where the only component you need to change is the set_calculator function used by Opt_cluster. This is the bit of the code above that looks like this:

Gupta_parameters = {'Cu': [10.960, 2.2780, 0.0855, 1.224, 2.556]}
cluster.set_calculator(Gupta(Gupta_parameters, cutoff=1000, debug=True))

Instead of this, you can include all the parameters that you need for your potential before the set_calculator line. For example:

Potential_Parameters = ...
cluster.set_calculator(Potential(Potential_Parameters))

Where Potential is the potential you would like to use, and Potential_Parameters are all the parameters that Potential needs to work. Please consult the manual of the potential you would like to use to learn how to use that potential.

How to write the Minimisation_Function for non-ASE Implemented Calculator

In the previous section of this page we have been performing a local optimisation using ASE implemented calculators. However, you may want to use a calculator to locally optimise your cluster. This may only be possible by allowing the program you wish to use to itself completely locally optimise the cluster. This is no issue for us! We just need to be careful to implement the local optimisation using your own program, and make sure that the RunMinimisation.py file is constructed as follows:

Input into Minimisation_Function:

  • cluster (ASE.Atoms): This is the unoptimised version of the cluster.

returns:

  • cluster (ASE.Atoms) - This is now the optimised version of the cluster.

A general script for locally optimising however you want to is given below:

RunMinimisation_General.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
'''
RunMinimisation.py, GRW, 8/6/17
 
This script is designed to locally optimise clusters.
'''
import time
from ase.io import write
from subprocess import Popen

def Minimisation_Function(cluster):
    cluster.pbc = What_you_want # make sure that the periodic boundry conditions are set off
    # -----------------------------------------------------
    # Perform any pre-optimisation work here
    # -----------------------------------------------------
    startTime = time.time(); converged = False
    try:
        Popen(['run','external','program'])
    except Exception as exception_message:
        cluster_name = 'issue_cluster.xyz'
        errorMessage = 'The optimisation of cluster ' + str(original_cluster) + ' did not optimise completely.\n'
        errorMessage += 'The cluster of issue before optimisation has been saved as: '+str(cluster_name)+'\n'
        errorMessage += exception_message
        write(cluster_name,original_cluster)
        raise Exception(errorMessage)
    endTime = time.time()
    # -----------------------------------------------------
    # Perform any post-optimisation work here
    # -----------------------------------------------------
    return cluster

If you want to locally optimise your clusters with computational heavy program, like VASP and QuantumEspresso, it may be better to run these programs manually and then enter the results of this into an input file. See How to manually enter energy results into NISP to obtain more information about how to manually enter energy results into NISP.

How to perform NISP with VASP calculations

In this article, we will look at how to run NISP where VASP is used to locally optimise nanoclusters. The Interpolation_Script.py python script that is used is the same as shown previously in Interpolation_Script.py - How to run NISP, but with an extra component. An example of a Interpolation_Script.py python script that uses VASP is shown below:

Interpolation_Script.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from NISP import Run_Interpolation_Scheme

input_information = {}
input_information['Element Type'] = 'Au'
input_information['Cohesive Energy'] = -3.82819360826 #-3.82819360826
input_information['Maximum No. of Atoms'] = 400
input_information['Local Optimiser'] = 'VASP'

slurm_information = {}
slurm_information['project'] = 'uoo00084'
slurm_information['time'] = '72:00:00'
slurm_information['nodes'] = 1
slurm_information['ntasks_per_node'] = 16
slurm_information['mem-per-cpu'] = '4G'
slurm_information['partition'] = 'large'
slurm_information['email'] = 'slurmnotifications@slurmnotifications.com'
slurm_information['vasp_version'] = 'VASP/5.4.4-intel-2017a'
slurm_information['vasp_execution'] = 'vasp_std'

input_information['Slurm Information'] = slurm_information

output_information = {}
output_information['Plot upper No of atom limit']   = None
output_information['Plot lower No of atom limit']   = None
output_information['Plot upper delta energy limit'] = None
output_information['Plot lower delta energy limit'] = None
output_information['Sizes to obtain instructions to create clusters for'] = [37,38,44,55,147,40]

no_of_cpus = 1
filename_prefix = ''

Run_Interpolation_Scheme(input_information=input_information,output_information=output_information,no_of_cpus=no_of_cpus,filename_prefix=filename_prefix)

The input_information dictionary

The extra component has been included in the input_information dictionary is the slurm_information. slurm_information is a dictionary that contains all the information that is needed to create the submit.sl files required to submit VASP calculations to slurm. The following information is need in the 'slurm_information' dictionary:

  • project (str.): This is the name of the project that you want to submit this job to.

  • time (str.): This is the amount of time you want to give to your slurm jobs, given as 'HH:MM:SS', where 'HH:MM:SS' is the hours, minutes, and seconds you want to give to a job.

  • nodes (str.): This is the number of nodes that you would like to give to a job.

  • ntasks_per_node (str./int): This is the number of cpus that you give to a job.

  • mem-per-cpu (str.): This is the amount of momeory you are giving to your job per cpu

The following can also be included in 'slurm_information' dictionary, but these are default value for these if you do not give a value for them.

  • partition (str.): This is the partition that is given to your job. See Mahuika Slurm Partitions for more information about partition on NeSI (Default: 'large').

  • email (str.): This is the email address you would like notifications about your slurm job to be sent to (Default: '').

  • vasp_version (str.): This is the version of VASP that you would like to load in on slurm (Default: 'VASP/5.4.4-intel-2017a').

  • vasp_execution (str.): This is the name of the vasp program that you execute (Default: 'vasp_std').

Make sure that you include 'slurm_information' in input_information by writing in Interpolation_Script.py

input_information['Slurm Information'] = slurm_information

An example of these parameters in Interpolation_Script.py is given below:

Interpolation_Script.py
 9
10
11
12
13
14
15
16
17
18
19
20
slurm_information = {}
slurm_information['project'] = 'uoo00084'
slurm_information['time'] = '72:00:00'
slurm_information['nodes'] = 1
slurm_information['ntasks_per_node'] = 16
slurm_information['mem-per-cpu'] = '4G'
slurm_information['partition'] = 'large'
slurm_information['email'] = 'slurmnotifications@slurmnotifications.com'
slurm_information['vasp_version'] = 'VASP/5.4.4-intel-2017a'
slurm_information['vasp_execution'] = 'vasp_std'

input_information['Slurm Information'] = slurm_information

Other files that you will need

You will also need to give NISP some other files that are needed by VASP to perform calculations. In the same place where you place your Interpolation_Script.py file, you want to create another folder called VASP_Files. In this VASP_Files folder you want to include the following files:

  • INCAR: This contains all the setting that are required by VASP to perform calculations.

  • POTCAR: This is the file that contains the information required to locally optimise a nanocluster with DFT using a certain functional.

  • KPOINTS: This contain the information used to specify the Bloch vectors (k-points) that will be used to sample the Brillouin zone in your calculation.

These files will be copied by NISP into each nanocluster folder. See an example of a setup of NISP for VASP here.

What to do after you have run NISP

After you run NISP, this will create a new folder called VASP_Clusters, which contains subfolders of all your nanoclusters. Each subfolder will contain a POSCAR, INCAR, POTCAR, KPOINTS, and submit.sl that are needed by VASP to perform DFT calculations. Each nanocluster is ready to be locally optimised with VASP.

You will find that there are many nanoclusters are created by NISP. To submit all of these nanoclusters for local minimisation by VASP, you can execute the program called Run_submitSL_slurm.py which will execute all of your nanocluster DFT optimisations to slurm. To run this script, type Run_submitSL_slurm.py into the terminal inside of your newly created VASP_Clusters folder. See Installation of NISP for how to use this Run_submitSL_slurm.py script.

How to manually enter energy results into NISP

It is also possible to run NISP in manual mode, where NISP creates xyz files of all your nanoclusters, and a Au_Max_Size_YYYY_atoms_interpolation_scheme_input_file.txt, where YYYY is the maximum size cluster that you have chosen to measure up to. In this article, we will look at how to run NISP in manual mode. An example of a Interpolation_Script.py python script that is set to manual mode is shown below:

Interpolation_Script.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from NISP import Run_Interpolation_Scheme

input_information = {}
input_information['Element Type'] = 'Au'
input_information['Cohesive Energy'] = -3.82819360826 #-3.82819360826
input_information['Maximum No. of Atoms'] = 2000
input_information['Local Optimiser'] = 'Manual Mode'

output_information = {}
output_information['Plot upper No of atom limit']   = None
output_information['Plot lower No of atom limit']   = None
output_information['Plot upper delta energy limit'] = None
output_information['Plot lower delta energy limit'] = None
output_information['Sizes to obtain instructions to create clusters for'] = [561,742,923]#[37,38,44,55,147,40,888,1399]

no_of_cpus = 1
filename_prefix = ''

Run_Interpolation_Scheme(input_information=input_information,output_information=output_information,no_of_cpus=no_of_cpus,filename_prefix=filename_prefix)

Here, input_information['Local Optimiser'] = 'Manual Mode'

What to do after you have run NISP

Once you have run NISP, you will find that NISP will have made a folder called Clusters and a file called Au_Max_Size_YYYY_atoms_interpolation_scheme_input_file.txt, where YYYY.

  • Clusters: This folder contains all the xyz files of the clusters that you need to obtain energies for.

  • Au_Max_Size_YYYY_atoms_interpolation_scheme_input_file.txt: This is the file that you want to place all the energies for each nanocluster in this list.

What to do once you have got all the energies of your nanoclusters

Once you have obtained all the energies for each of the nanoclusters in the Clusters folder, you want to add these energies to the right most side of each column of the Au_Max_Size_YYYY_atoms_interpolation_scheme_input_file.txt column. For example, you want to place your energies into each place in the file below where ______ is given

Element: Au Max_Size: 2000
Enter the energies of the clusters below to the right most of each line (not the delta energies, NISP can do that for you later)
------------------------------
Icosahedron
13      2           ______
55      3           ______
147     4           ______
309     5           ______
561     6           ______
923     7           ______
1415    8           ______
Octahedron
6       (2, 0)      ______
19      (3, 0)      ______
13      (3, 1)      ______
44      (4, 0)      ______
38      (4, 1)      ______
85      (5, 0)      ______
79      (5, 1)      ______
55      (5, 2)      ______
146     (6, 0)      ______
...
Decahedron
7       (2, 1, 0)   ______
49      (2, 1, 1)   ______
156     (2, 1, 2)   ______
358     (2, 1, 3)   ______
685     (2, 1, 4)   ______
13      (2, 2, 0)   ______
75      (2, 2, 1)   ______
212     (2, 2, 2)   ______
454     (2, 2, 3)   ______
831     (2, 2, 4)   ______
1373    (2, 2, 5)   ______
19      (2, 3, 0)   ______
101     (2, 3, 1)   ______
268     (2, 3, 2)   ______
550     (2, 3, 3)   ______
977     (2, 3, 4)   ______
1579    (2, 3, 5)   ______
25      (2, 4, 0)   ______
127     (2, 4, 1)   ______
324     (2, 4, 2)   ______
646     (2, 4, 3)   ______
1123    (2, 4, 4)   ______
1785    (2, 4, 5)   ______
31      (2, 5, 0)   ______
153     (2, 5, 1)   ______
380     (2, 5, 2)   ______
742     (2, 5, 3)   ______
1269    (2, 5, 4)   ______
1991    (2, 5, 5)   ______
23      (3, 1, 0)   ______
100     (3, 1, 1)   ______
262     (3, 1, 2)   ______
539     (3, 1, 3)   ______
961     (3, 1, 4)   ______
39      (3, 2, 0)   ______
146     (3, 2, 1)   ______
348     (3, 2, 2)   ______
675     (3, 2, 3)   ______
1157    (3, 2, 4)   ______
1824    (3, 2, 5)   ______
55      (3, 3, 0)   ______
192     (3, 3, 1)   ______
434     (3, 3, 2)   ______
811     (3, 3, 3)   ______
1353    (3, 3, 4)   ______
71      (3, 4, 0)   ______
238     (3, 4, 1)   ______
...

How to obtain cohesive energies

One of the pieces of information that is needed to obtain delta energies for this program is the cohesive energy for the crystal structure for the metal of interest. This is the energy for a crystal in a cell with periodic boundary conditions divided by the number of atoms in the cell (given as eV/atom).

We have developed a program designed to help you to obtain the cohesive energy called LatticeFinder. You can find LatticeFinder at github.com/GardenGroupUO/LatticeFinder and documentation at latticefinder.readthedocs.io

Provided in the LatticeFinder Github repository are examples of Run_LatticeFinder.py. Find these various examples at https://github.com/GardenGroupUO/LatticeFinder/tree/main/Examples.

We have also developed a Jupyter notebook with some examples of various Run_LatticeFinder.py that you can play with and muck around with. The Github repository for this Jupyter notebook can also be found at https://github.com/GardenGroupUO/LatticeFinder.

Along with this Jupyter notebook, we have also implemented this Jupyter notebook into Binder. Binder (https://mybinder.org/) is an interactive online platform that allows you to use Jupyter notebooks on an web browser without having to set up anything. It does all the setting up on a virtual computer for you. If you want to play around with the LatticeFinder program before you download it on your computer or if you need help when things go wrong using LatticeFinder on your computer, Binder+Jupyter is the best way to do this. It is recommended that you try out the LatticeFinder program on Binder if you are interested or intending on using the LatticeFinder program.

The Binder webpage can be found at:

Binder

This will load a Binder page that will allow you to play about with LatticeFinder interactively in Binder. This Binder page may load quickly, or it may take 1 to 2 minutes to load. Don’t refresh the page as Binder takes a good amount of time to load. Get a coffee or a cup of tea while you wait.

Once this is done you will see a Jupyter notebook that you can interact with. Mess around with it as much as you want!

What are delta energies?

The delta energy is an estimate of the surface energy of a cluster. The delta energy is defined as:

\[\Delta = \frac{E - NE_{coh}}{N^{2/3}}\]

where \(\Delta\) is the delta energy, \(E\) is the energy of the cluster, \(N\) is the number of atoms in the cluster, and \(E_{coh}\) is the cohesive energy of a crystal lattice of the same metal that the clusters contain (where \(E_{coh}\) is given in eV/atom). The \(N^{2/3}\) term is an estimate of the number of surface atoms that the cluster contains in a spherical cluster. The units of \(\Delta\) are eV/atom, or eV per estimate number of surface atoms.

See the article for more information about the delta energy: A. L. Garden, A. Pedersen, H. Jónsson, “Reassignment of ‘magic numbers’ of decahedral and FCC structural motifs”, Nanoscale, 10, 5124-5132 (2018), DOI: 10.1039/C7NR09440J

Examples of Running NISP with Interpolation_Script.py

Binder

Provided in the NISP Github repository are examples of Interpolation_Script.py (and RunMinimisation.py, see RunMinimisation.py - Writing a Local Minimisation Function for the Genetic Algorithm for more information about this file) scripts that you can try out. Find these various examples at https://github.com/GardenGroupUO/NISP/tree/main/Examples.

We have also developed a Jupyter notebook with some examples of various Interpolation_Script.py (and RunMinimisation.py) that you can play with and muck around with. The Github repository for this Jupyter notebook can also be found at https://github.com/GardenGroupUO/NISP.

Along with this Jupyter notebook, we have also implemented this Jupyter notebook into Binder. Binder (https://mybinder.org/) is an interactive online platform that allows you to use Jupyter notebooks on an web browser without having to set up anything. It does all the setting up on a virtual computer for you. If you want to play around with the NISP program before you download it on your computer or if you need help when things go wrong using NISP on your computer, Binder+Jupyter is the best way to do this. It is recommended that you try out the NISP program on Binder if you are interested or intending on using the NISP program.

The Binder webpage can be found at:

Binder

This will load a Binder page that will allow you to play about with NISP interactively in Binder. This Binder page may load quickly, or it may take 1 to 2 minutes to load. Don’t refresh the page as Binder takes a good amount of time to load. Get a coffee or a cup of tea while you wait.

Once this is done you will see a Jupyter notebook that you can interact with. Mess around with it as much as you want!

Examples of data that the NISP program gives

Once NISP has completed or once VASP is able to get or has been given all the energies of nanoclusters, NISP will give a set of plots and data. Examples of these can be found on the github page (Click here to see examples of all of these plots and text files) and given below.

Firstly, NISP will output a series of plots and text files about various features of the nanoclusters. The first plot that is given is the interpolation scheme plot, which shows all the estimated energies of nanoclusters across the size range of nanoclusters that you are measuring across. An example of this for Au nanoclusters, using the RGL potetial with parameters from Baletto et al. DOI: 10.1063/1.1448484, is shown below:

Interpolation Scheme Plot

The second plot is the same interpolation scheme plot shown above, but with lines through it at the places that you want to obtain cluster with the particular number of atoms that you desire.

Interpolation Scheme Plot with lines for nanoclusters with a particular number of atoms

There are also a few text documents that are created by NISP. The first is a file called XX_Max_Size_YYYY_atoms_interpolation_scheme_results_file.txt, where XX is the element of interest and YYYY is the max cluster size that were generated. This file contains the number of atoms, the base structure, and the delta energy of clusters generated by NISP. An example for Au nanoclusters, using the RGL potetial with parameters from Baletto et al. (DOI: 10.1063/1.1448484), is shown below:

Element: Au Max_Size: 2000
------------------------------
Icosahedron
13      2       1.1032754037994479
55      3       1.100003781794644
147     4       1.0987059970335966
309     5       1.1059920963404124
561     6       1.115553112131466
923     7       1.1269907548069968
1415    8       1.1394066237505638
Octahedron
6       2       0       1.1190094015786765
13      3       1       1.1638224621856568
19      3       0       1.0979832400015577
38      4       1       1.0521405814430245
44      4       0       1.067143817259378
55      5       2       1.138189866616928
79      5       1       1.0325428000659487
85      5       0       1.0548437019581978
116     6       2       1.0524850917350583
140     6       1       1.0270074284856954
146     6       0       1.0476962360309887
147     7       3       1.1219838090199536
201     7       2       1.0292555823343328
225     7       1       1.0257371723399247
231     7       0       1.0436029688201243
260     8       3       1.057200064495081
309     9       4       1.1148330197406788
314     8       2       1.0212213249548565
338     8       1       1.0259936196321453
344     8       0       1.0412199350502054
405     9       3       1.0329243668424515
459     9       2       1.0187947176133691
483     9       1       1.0267388713457173
489     9       0       1.039780476733651
490     10      4       1.0616618424124262
561     11      5       1.1105816893340137
586     10      3       1.0223377246105532
640     10      2       1.0187179221666112
664     10      1       1.027788871978976
670     10      0       1.038919349769551
711     11      4       1.0375673369171623
807     11      3       1.0179067773491761
826     12      5       1.065451683596655
861     11      2       1.019557580472791
885     11      1       1.0288946740343523
891     11      0       1.0384954016447392
923     13      6       1.107986539327558
976     12      4       1.025654241565213
1072    12      3       1.0163941697802397
1126    12      2       1.0209225610011508
1139    13      5       1.0423080490997185
1150    12      1       1.0298879943900578
1156    12      0       1.0383295029773996
1288    14      6       1.0688693013913717
1289    13      4       1.0195493907284858
1385    13      3       1.0164262827288304
1415    15      7       1.1062004272998374
1439    13      2       1.0223727827352689
1463    13      1       1.0308977218222044
1469    13      0       1.03831689605
1504    14      5       1.0294836958637996
1654    14      4       1.0169058606393127
1709    15      6       1.0466394541790955
1750    14      3       1.0173524609832563
1804    14      2       1.0238887840747113
1828    14      1       1.0317899061516245
1834    14      0       1.0383656024767802
1896    16      7       1.0716861319137945
1925    15      5       1.0223405670750616
Decahedron
7       2       1       0       1.1017937744741588
13      2       2       0       1.1501771612388278
19      2       3       0       1.2088433973490311
23      3       1       0       1.0991995948493911
25      2       4       0       1.270445700676711
31      2       5       0       1.3291123029004166
39      3       2       0       1.0979830050918213
49      2       1       1       1.046982374072724
54      4       1       0       1.088495245255538
55      3       3       0       1.1296049882220227
71      3       4       0       1.1661887520089607
75      2       2       1       1.0319573159905462
85      4       2       0       1.076821815165658
87      3       5       0       1.204914273317384
100     3       1       1       1.0534128583165623
101     2       3       1       1.0416770307305245
103     3       6       0       1.2432615429056917
105     5       1       0       1.0886088712630677
116     4       3       0       1.0908967227610682
127     2       4       1       1.0605157146566482
146     3       2       1       1.0303203294892262
147     4       4       0       1.1140979959448842
153     2       5       1       1.0834524470461897
156     2       1       2       1.037045376222584
156     5       2       0       1.070347690927622
176     4       1       1       1.0620065432388022
178     4       5       0       1.1406902765651208
181     6       1       0       1.0903794185940532
192     3       3       1       1.0301186256260826
207     5       3       0       1.0742989944081809
209     4       6       0       1.1685437607098472
212     2       2       2       1.0228104604219803
238     3       4       1       1.0404010284411753
240     4       7       0       1.1966540041432234
247     4       2       1       1.036014358062041
257     6       2       0       1.0692388973011722
258     5       4       0       1.0883549664068048
262     3       1       2       1.0429429912267771
268     2       3       2       1.0246779196449565
282     5       1       1       1.0700982716052696
284     3       5       1       1.055472983804519
287     7       1       0       1.0929191650554706
309     5       5       0       1.1069784332433437
318     4       3       1       1.0297841036321091
324     2       4       2       1.0337818972196062
330     3       6       1       1.0730542403198535
333     6       3       0       1.0668426362975572
348     3       2       2       1.0226277438650595
358     2       1       3       1.0334378266783604
360     5       6       0       1.1277378513982543
380     2       5       2       1.0468060547106035
383     5       2       1       1.043254208992726
389     4       4       1       1.0341483142948795
393     7       2       0       1.0706031333849775
403     4       1       2       1.0521237254180393
409     6       4       0       1.074547548598091
411     5       7       0       1.149603597806501
423     6       1       1       1.077075334712185
428     8       1       0       1.09591162307455
434     3       3       2       1.0174940145425964
454     2       2       3       1.0233268355640692
460     4       5       1       1.0439022684287886
462     5       8       0       1.1715415984583404
484     5       3       1       1.0329704267131634
485     6       5       0       1.0875814949362173
499     7       3       0       1.0639323276004338
520     3       4       2       1.0202899991964027
524     4       2       2       1.0284304988216484
531     4       6       1       1.0566686062943933
539     3       1       3       1.0389246298086476
550     2       3       3       1.0233332663163037
559     6       2       1       1.050196914027839
561     6       6       0       1.1031598197987613
569     8       2       0       1.0732080357410643
584     5       1       2       1.0602254029875406
585     5       4       1       1.033189561449008
602     4       7       1       1.0709713062811868
604     7       1       1       1.0829999758805005
605     7       4       0       1.0671736748776157
606     3       5       2       1.0276807186955992
609     9       1       0       1.0983813564487561
637     6       7       0       1.1201040960474864
645     4       3       2       1.0189559203517278
646     2       4       3       1.0289286029460252
675     3       2       3       1.023158753407653
685     2       1       4       1.032425793681082
686     5       5       1       1.038910784777661
692     3       6       2       1.0379064353089364
695     6       3       1       1.0374501606276012
710     8       3       0       1.0637321705675284
711     7       5       0       1.0756558386813608
713     6       8       0       1.1379992874619629
742     2       5       3       1.03827731220149
745     5       2       2       1.0359104458171444
765     4       1       3       1.0459262974263792
766     4       4       2       1.017619332880287
780     7       2       1       1.0568265120815945
787     5       6       1       1.0483684202159638
789     6       9       0       1.156251396882655
790     9       2       0       1.0759816981316934
810     6       1       2       1.0681693221915103
811     3       3       3       1.0176348896347907
817     7       6       0       1.087348253000269
830     8       1       1       1.0882114367165607
831     2       2       4       1.0250367116601453
831     6       4       1       1.0345420345069662
835     10      1       0       1.1009748440852132
851     8       4       0       1.0633601935272483
887     4       5       2       1.0218086688043853
888     5       7       1       1.0591390340451714
906     5       3       2       1.023467445865111
923     7       7       0       1.1008672965324509
946     4       2       3       1.0279883528038825
947     3       4       3       1.018644613574685
956     7       3       1       1.0423911448167364
961     3       1       4       1.0367299241904282
967     6       5       1       1.0372599369793827
971     9       3       0       1.0646114378370695
977     2       3       4       1.0245090342096572
989     5       8       1       1.0713361628703204
992     8       5       0       1.068570954186557
1008    4       6       2       1.0280212280594143
1016    6       2       2       1.0430968673595469
1029    7       8       0       1.1152778795348373
1041    5       1       3       1.0539359336199197
1051    8       2       1       1.062602071647318
1061    10      2       0       1.0790378676276204
1067    5       4       2       1.0192233526522114
1083    3       5       3       1.022455144433677
1086    7       1       2       1.0744530079917134
1103    6       6       1       1.0444483384621503
1106    9       1       1       1.0924408760690854
1111    11      1       0       1.1034108596870509
1123    2       4       4       1.0287586375307691
1127    4       3       3       1.0184939554181438
1129    4       7       2       1.036728709204179
1132    7       4       1       1.0371421972174963
1133    8       6       0       1.077184161129713
1135    7       9       0       1.1304123868285583
1152    9       4       0       1.061759226951329
1157    3       2       4       1.0253228314541503
1219    3       6       3       1.0300503692625507
1222    6       3       2       1.0290517213518562
1228    5       5       2       1.021222894287424
1239    6       7       1       1.0520101536093853
1241    7       10      0       1.1458333962853755
1269    2       5       4       1.034750129380506
1272    5       2       3       1.0340739931281993
1272    8       3       1       1.0472719155273764
1274    8       7       0       1.0876684205758178
1287    10      3       0       1.066365416363215
1292    4       1       4       1.0435845857216208
1308    4       4       3       1.0161643477833935
1308    7       5       1       1.0375335867295665
1333    9       5       0       1.0643406477882664
1342    7       2       2       1.050293981210886
1353    3       3       4       1.0197899160437187
1372    6       1       3       1.0610194354429587
1373    2       2       5       1.0270770779909042
1375    6       8       1       1.061882285301361
1377    9       2       1       1.0678744951246646
1387    11      2       0       1.0821334358822232
1389    5       6       2       1.0242098799174948
1415    8       8       0       1.0997022750365375
1417    8       1       2       1.0803752196495442
1428    6       4       2       1.0226736500888474
1437    10      1       1       1.09642583626826
1442    12      1       0       1.1057510153710501
1484    7       6       1       1.041448880720697
1489    4       5       3       1.0169152950052776
1493    8       4       1       1.0402550366636496
1503    5       3       3       1.0223834035124477
1511    6       9       1       1.0725885670785242
1513    10      4       0       1.0618607823241757
1514    9       6       0       1.0703570718395008
1543    4       2       4       1.028669742178452
1549    3       4       4       1.020458041226654
1550    5       7       2       1.0304918363333329
1556    8       9       0       1.1120844108255412
1579    2       3       5       1.0263273270953015
1598    7       3       2       1.0347988166488296
1634    6       5       2       1.0213832605991042
1648    9       3       1       1.0518847830477651
1658    6       2       3       1.04047671541216
1660    7       7       1       1.0478079233320257
1663    11      3       0       1.068509509264896
1670    4       6       3       1.0222810410352614
1683    5       1       4       1.0500156112223789
1695    9       7       0       1.079000418460763
1697    8       10      0       1.1251255760646024
1711    5       8       2       1.0386964487236938
1714    8       5       1       1.0388162005567747
1728    8       2       2       1.0565848800253803
1734    5       4       3       1.0170564488352196
1739    10      5       0       1.062074539629052
1745    3       5       4       1.0223103918919954
1763    7       1       3       1.0676802115713389
1763    10      2       1       1.072662271304186
1773    12      2       0       1.0850816834668164
1785    2       4       5       1.0293106445789004
1794    4       3       4       1.0208388422462893
1808    9       1       2       1.0855289629987501
1824    3       2       5       1.0272670118051637
1828    11      1       1       1.0997082954341528
1833    13      1       0       1.1079399127435683
1836    7       8       1       1.0559859895289785
1838    8       11      0       1.1384910393672527
1840    6       6       2       1.0234579305939115
1851    4       7       3       1.0276521150675095
1854    7       4       2       1.0272755406664253
1876    9       8       0       1.0882459728176859
1919    9       4       1       1.043854561152064
1935    8       6       1       1.0409517136354511
1939    11      4       0       1.062477092244881
1941    3       6       4       1.0272831228486934
1944    6       3       3       1.027370359343128
1965    5       5       3       1.0169395149817424
1965    10      6       0       1.0661316854686624
1991    2       5       5       1.0341224979777712
1994    5       2       4       1.0337913715184734

Second, a number of XX_Max_Size_YYYY_Clusters_interpolated_at_size_ZZZ.txt are generated, where ZZZ are the size of the cluster that you wanted to obtain information about how to create. These are the number of atoms that are given in output_information['Sizes to obtain instructions to create clusters for'] in the Interpolation_Script.py script (see Output information for the interpolation scheme). These text files give the information required to create all the various symmetric and unsymmetric icosahedral, decahedral, and octahedral clusters that may have compariable energies as predicted by NISP. An example for how to make Au nanoclusters with 742 atoms, using the RGL potetial with parameters from Baletto et al. (DOI: 10.1063/1.1448484), is shown below:

------------------------------------
------------------------------------
Icosahedral Interpolation
motif: Icosahedron, type_of_connection: ico, Remove atoms from: 111 Facet, motif start details: [7], motif end details: [6], interpolation energy: 1.1212719334692314.
Number of atoms to remove from ico [7]: 181
------------------------------------
------------------------------------
Decahedral Interpolation
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [4, 5, 2], motif end details: [4, 3, 2], interpolation energy: 1.0203822945780565.
Number of atoms to remove from deca [4, 5, 2]: 145
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [3, 4, 3], motif end details: [3, 2, 3], interpolation energy: 1.0209016834911688.
Number of atoms to remove from deca [3, 4, 3]: 205
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [4, 4, 2], motif end details: [4, 2, 2], interpolation energy: 1.0230249158509677.
Number of atoms to remove from deca [4, 4, 2]: 24
motif: Decahedron, type_of_connection: reent, Remove atoms from: 100 Facet or from Corners, motif start details: [4, 4, 2], motif end details: [2, 4, 3], interpolation energy: 1.023273967913156.
Number of atoms to remove from deca [4, 4, 2]: 24
motif: Decahedron, type_of_connection: plane, Remove atoms from: 100 Facet or from Corners, motif start details: [4, 4, 2], motif end details: [5, 5, 1], interpolation energy: 1.028265058828974.
Number of atoms to remove from deca [4, 4, 2]: 24
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [3, 3, 3], motif end details: [3, 1, 3], interpolation energy: 1.0282797597217193.
Number of atoms to remove from deca [3, 3, 3]: 69
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [2, 3, 4], motif end details: [2, 1, 4], interpolation energy: 1.0284674139453696.
Number of atoms to remove from deca [2, 3, 4]: 235
motif: Decahedron, type_of_connection: reent, Remove atoms from: 100 Facet or from Corners, motif start details: [5, 2, 2], motif end details: [3, 2, 3], interpolation energy: 1.0295345996123988.
Number of atoms to remove from deca [5, 2, 2]: 3
motif: Decahedron, type_of_connection: plane, Remove atoms from: 100 Facet or from Corners, motif start details: [5, 2, 2], motif end details: [6, 3, 1], interpolation energy: 1.0366803032223728.
Number of atoms to remove from deca [5, 2, 2]: 3
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [6, 5, 1], motif end details: [6, 3, 1], interpolation energy: 1.037355048803492.
Number of atoms to remove from deca [6, 5, 1]: 225
motif: Decahedron, type_of_connection: reent, Remove atoms from: 100 Facet or from Corners, motif start details: [4, 1, 3], motif end details: [2, 1, 4], interpolation energy: 1.0391760455537304.
Number of atoms to remove from deca [4, 1, 3]: 23
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [5, 6, 1], motif end details: [5, 4, 1], interpolation energy: 1.0407789908324858.
Number of atoms to remove from deca [5, 6, 1]: 45
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [5, 3, 2], motif end details: [5, 1, 2], interpolation energy: 1.0418464244263257.
Number of atoms to remove from deca [5, 3, 2]: 164
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [6, 4, 1], motif end details: [6, 2, 1], interpolation energy: 1.0423694742674026.
Number of atoms to remove from deca [6, 4, 1]: 89
motif: Decahedron, type_of_connection: reent, Remove atoms from: 100 Facet or from Corners, motif start details: [5, 6, 1], motif end details: [3, 6, 2], interpolation energy: 1.04313742776245.
Number of atoms to remove from deca [5, 6, 1]: 45
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [5, 7, 1], motif end details: [5, 5, 1], interpolation energy: 1.0490249094114161.
Number of atoms to remove from deca [5, 7, 1]: 146
motif: Decahedron, type_of_connection: plane, Remove atoms from: 100 Facet or from Corners, motif start details: [6, 4, 1], motif end details: [7, 5, 0], interpolation energy: 1.0550989365941636.
Number of atoms to remove from deca [6, 4, 1]: 89
motif: Decahedron, type_of_connection: plane, Remove atoms from: 100 Facet or from Corners, motif start details: [7, 2, 1], motif end details: [8, 3, 0], interpolation energy: 1.0602793413245615.
Number of atoms to remove from deca [7, 2, 1]: 38
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [7, 3, 1], motif end details: [7, 1, 1], interpolation energy: 1.0626955603486183.
Number of atoms to remove from deca [7, 3, 1]: 214
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [8, 5, 0], motif end details: [8, 3, 0], interpolation energy: 1.0661515623770428.
Number of atoms to remove from deca [8, 5, 0]: 250
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [8, 4, 0], motif end details: [8, 2, 0], interpolation energy: 1.0682841146341562.
Number of atoms to remove from deca [8, 4, 0]: 109
motif: Decahedron, type_of_connection: plane, Remove atoms from: 100 Facet or from Corners, motif start details: [8, 4, 0], motif end details: [7, 5, 0], interpolation energy: 1.0695080161043045.
Number of atoms to remove from deca [8, 4, 0]: 109
motif: Decahedron, type_of_connection: plane, Remove atoms from: 100 Facet or from Corners, motif start details: [9, 2, 0], motif end details: [8, 3, 0], interpolation energy: 1.069856934349611.
Number of atoms to remove from deca [9, 2, 0]: 48
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [7, 6, 0], motif end details: [7, 4, 0], interpolation energy: 1.0772609639389423.
Number of atoms to remove from deca [7, 6, 0]: 75
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [9, 3, 0], motif end details: [9, 1, 0], interpolation energy: 1.0814963971429128.
Number of atoms to remove from deca [9, 3, 0]: 229
motif: Decahedron, type_of_connection: plane, Remove atoms from: 100 Facet or from Corners, motif start details: [5, 6, 1], motif end details: [6, 7, 0], interpolation energy: 1.084236258131725.
Number of atoms to remove from deca [5, 6, 1]: 45
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [7, 7, 0], motif end details: [7, 5, 0], interpolation energy: 1.0882615676069058.
Number of atoms to remove from deca [7, 7, 0]: 181
motif: Decahedron, type_of_connection: plane, Remove atoms from: 100 Facet or from Corners, motif start details: [5, 7, 1], motif end details: [6, 8, 0], interpolation energy: 1.0985691607535673.
Number of atoms to remove from deca [5, 7, 1]: 146
motif: Decahedron, type_of_connection: plane, Remove atoms from: 100 Facet or from Corners, motif start details: [7, 6, 0], motif end details: [6, 7, 0], interpolation energy: 1.1037261745238776.
Number of atoms to remove from deca [7, 6, 0]: 75
motif: Decahedron, type_of_connection: plane, Remove atoms from: 100 Facet or from Corners, motif start details: [7, 7, 0], motif end details: [6, 8, 0], interpolation energy: 1.1194332919972068.
Number of atoms to remove from deca [7, 7, 0]: 181
motif: Decahedron, type_of_connection: deca_111, Remove atoms from: 111 Facet, motif start details: [6, 9, 0], motif end details: [6, 7, 0], interpolation energy: 1.1381777464650709.
Number of atoms to remove from deca [6, 9, 0]: 47
------------------
The deca motif has a cluster(s) with the exact number of atoms.
No. Atoms: 742.
Motif Type: Decahedron.
Motif details: [2, 5, 3].
------------------------------------
------------------------------------
Octahedral Interpolation
motif: Octahedron, type_of_connection: octa_111, Remove atoms from: 111 Facet, motif start details: [12, 3], motif end details: [10, 1], interpolation energy: 1.022091520879608.
Number of atoms to remove from octa [12, 3]: 330
motif: Octahedron, type_of_connection: octa_111, Remove atoms from: 111 Facet, motif start details: [12, 4], motif end details: [10, 2], interpolation energy: 1.022186081865912.
Number of atoms to remove from octa [12, 4]: 234
motif: Octahedron, type_of_connection: octa_111, Remove atoms from: 111 Facet, motif start details: [11, 3], motif end details: [9, 1], interpolation energy: 1.0223228243474467.
Number of atoms to remove from octa [11, 3]: 65
motif: Octahedron, type_of_connection: octa_fcc, Remove atoms from: 100 Facet, motif start details: [11, 3], motif end details: [11, 4], interpolation energy: 1.0277370571331692.
Number of atoms to remove from octa [11, 3]: 65
motif: Octahedron, type_of_connection: octa_111, Remove atoms from: 111 Facet, motif start details: [11, 2], motif end details: [9, 0], interpolation energy: 1.0296690286032208.
Number of atoms to remove from octa [11, 2]: 119
motif: Octahedron, type_of_connection: octa_111, Remove atoms from: 111 Facet, motif start details: [12, 2], motif end details: [10, 0], interpolation energy: 1.029920955385351.
Number of atoms to remove from octa [12, 2]: 384
motif: Octahedron, type_of_connection: octa_111, Remove atoms from: 111 Facet, motif start details: [11, 1], motif end details: [9, 0], interpolation energy: 1.0343375753840016.
Number of atoms to remove from octa [11, 1]: 143
motif: Octahedron, type_of_connection: octa_111, Remove atoms from: 111 Facet, motif start details: [12, 1], motif end details: [10, 0], interpolation energy: 1.0344036720798044.
Number of atoms to remove from octa [12, 1]: 408
motif: Octahedron, type_of_connection: octa_111, Remove atoms from: 111 Facet, motif start details: [11, 0], motif end details: [10, 0], interpolation energy: 1.038707375707145.
Number of atoms to remove from octa [11, 0]: 149
motif: Octahedron, type_of_connection: octa_111, Remove atoms from: 111 Facet, motif start details: [12, 5], motif end details: [10, 3], interpolation energy: 1.0438947041036042.
Number of atoms to remove from octa [12, 5]: 84
motif: Octahedron, type_of_connection: octa_111, Remove atoms from: 111 Facet, motif start details: [13, 6], motif end details: [11, 4], interpolation energy: 1.0727769381223602.
Number of atoms to remove from octa [13, 6]: 181
------------------------------------
------------------------------------

Helpful Programs to run NISP

Included in NISP are programs to help to execute all the VASP calculations that you want to run on slurm if you are using VASP to obtain all the energies of your clusters. These programs can be run by typing the program you want to run into the terminal from whatever directory you are in.

The scripts and programs that we will be mentioned here are:

What to make sure is done before running any of these scripts.

If you installed NISP through pip3

If you installed the NISP program with pip3, these scripts will be installed in your bin. You do not need to add anything into your ~/.bashrc. You are all good to go.

If you performed a Manual installation

If you have manually added this program to your computer (such as cloning this program from Github), you will need to make sure that you have included the Subsidiary_Programs folder into your PATH in your ~/.bashrc file. All of these program can be found in the Subsidiary_Programs folder. To execute these programs from the Subsidiary_Programs folder, you must include the following in your ~/.bashrc:

export PATH_TO_NISP="<Path_to_NISP>"

where <Path_to_NISP>" is the path to get to the genetic algorithm program. Also include somewhere before this in your ~/.bashrc:

export PATH="$PATH_TO_NISP"/NISP/Subsidiary_Programs:$PATH

See more about this in Installation of NISP.

Run_submitSL_slurm.py - How to execute all Trials using the JobArray Slurm Job Submission Scheme

It is possible to perform this interpolation scheme using the energies of nanoclusters that have be obtained with DFT using VASP. If you select your 'Local Optimiser' input in your input_information dictionary to be 'VASP', NISP will create a bunch of icosahedral, decahedral, and octahedral nanoclusters that are setup to run VASP calculations upon. This includes a POSCAR and submit.sl file, as well as POTCAR, INCAR, and KPOINTS files that you provide. Many nanoclusters are created to be used in the interpolation scheme, and therefore a lot of submit.sl file to submit to slurm.

To make this easier for the user, NISP has been included with the Run_submitSL_slurm.py script, which is designed to submit all your VASP calculations to slurm. This script will walk through all subdirectories from the directory you run this from and will run all your submit.sl scripts for you automatically. All you need to do is to move into the VASP_Clusters folder that has been created by slurm and enter Run_submitSL_slurm.py into the terminal, press enter, and watch all your NISP nanocluster be submitted to slurm.

There is one input that you can pass into the program. The Run_mass_submitSL_slurm.py program is designed to wait one minute between submitting jobs. This is because you can cause slurm issues if too many jobs are submitted at once. However, you can override this if you enter in False as the first argument. This will tell Run_submitSL_slurm.py to keep submitting jobs without waiting one minute between them.

Note that you will notice that if you submit too many jobs, or if you submit too many jobs too quickly, you will get problems with slurm that you are submitting too many jobs or submitting them too quickly. This is all dependent on how slurm is set up. This has been covered by the program, and will tell you how long it will be waiting when it is waiting. Do not stop the program while it is submitting jobs. If you do quit before it has finished, it will make resubmitting jobs difficult.

The following variables can be different for different people. Feel free to change the following variables in your Subsidiary_Programs/Run_submitSL_slurm.py as you need

  • Max_jobs_in_queue_at_any_one_time (int): This is the maximum number of jobs that slurm allows you to have in your queue. This is usually set by default to 1000. I personally have set this to 10,000 and this is what is current set in Run_submitSL_slurm.py. Default: 10,000

  • time_to_wait_before_next_submission (float): This is the amount of time that this program waits after submitting a job, before continuing on. This is given in seconds. Do not set this to less than 10 seconds. Default: 20.0 (seconds)

  • time_to_wait_max_queue (float): This is the amount of time that this program waits after it has found that the maximum number of jobs have been submitted to the queue. Run_submitSL_slurm.py will wait for this amount of time before continuing again. This is given in seconds. Do not set this to less than 10 seconds. Default: 60.0 (seconds)

Problems can occur every so often when submitting jobs to slurm, but these are generally internet connectivity problems or slurm hanging problems that resolve themselves after a few tens of seconds. There are two other variables that determine how Run_submitSL_slurm.py will deal with issues.

  • time_to_wait_before_next_submission_due_to_temp_submission_issue (float): This is the amount of time that this program waits after it has experienced an error in submitting a job. This is given in seconds. Do not set this to less than 10 seconds. Default: 10.0 (seconds)

  • number_of_consecutive_error_before_exitting (int): This is the number of times that Run_mass_submitSL_slurm.py will attempt to resubmit a job to slurm before it will give up. After this many consecutive errors arising, some systematic error is likely occuring. In this case, Run_mass_submitSL_slurm.py will print the directories of all the jobs that were not submitted and then close.

Hopefully running Run_submitSL_slurm.py will submit all your genetic algorithm trials.

The names of the jobs can be quite big. When looking in squeue to see how things are going, it is sometimes useful to expand the names in the squeue output. This can be done as shown below:

squeue -o "%.20i %.9P %.5Q %.50j %.8u %.8T %.10M %.11l %.6D %.4C %.6b %.20S %.20R %.8q" -u $USER --sort=+i

Here, after -o, i specifies the job ID and j specifies the job name. You can change this number to the number of characters this will display. Here %.20i indicates that squeue will dedicate 20 characters to displaying the job ID and %.50j indicates that squeue will dedicate 50 characters to displaying the name of the job.

NISP Python Files

Below are all the files that are used by NISP to run.

Table of Contents

Run_Interpolation_Scheme.py

This method runs the NISP program.

This program is designed to run and give the results of the interpolation scheme as described in A. L. Garden, A. Pedersen, H. Jónsson, “Reassignment of ‘magic numbers’ of decahdral and FCC structural motifs”, Nanoscale, 10, 5124-5132 (2018).

Cluster.py

This class is designed to hold all the information we need to record about clusters: Inputs (str) motif - the motif you want to get the number of atoms required to create it. (list) motif_details - the information required for the motif of interest (atoms) cluster - A cluster to sample (int) no_atoms - the number of atoms in the cluster (Calculator) calculator - The calculator to use (float) e_coh - The cohesive energy of the cluster (float) delta_energy - The delta energy of the cluster. (boolean) debug - Print any information to help us if we need to. Output (int) noAtoms - the number of atoms required to make the cluster of interest

motif_methods.py

This script contains definition about motifs, such as the number of atomd a cluster contains with certain specifications.

Interpolation_Connection.py

This contains a class that writes the information about a connection between two clusters of the same motif together.

Interpolation_rules.py

This method contains all the definitions about the rules used to connect clusters of a particular motif together.

Counter.py

This class acts like a Integer and allows one to add to the counter.

Index

Python Module Index

Indices and tables