3. Submit, monitor and debug calculations¶
In this section we’ll be learning how to create new data in AiiDA.
We will use the Quantum Espresso package to launch a simple density functional theory calculation of a silicon crystal using the PBE exchange-correlation functional and check its results. While we’re going to debug these issues ‘manually’ here, workflows (which you’ll encounter later in this tutorial) can help you avoid these issues systematically.
Note that besides the aiida-quantumespresso
plugin, AiiDA comes with plugins for a range of other codes, all of which are listed in the AiiDA plugin registry.
3.1. Computer setup¶
In a production environment, AiiDA would typically be running on your work station or laptop, while launching calculations
on remote high-performance compute resources that you have SSH access to.
For this reason AiiDA has the concept of a Computer
to run calculations on.
To keep things simple, Quantum ESPRESSO (together with several other ab initio codes) has been installed directly in the
codes
subfolder of your virtual machine,
and you are going to launch your first calculations on the same computer where AiiDA is installed.
Nevertheless, we’re now going to set up this computer for launching calculations:
verdi computer setup --config computer.yml
where computer.yml
is a configuration file in the YAML format) that you can download here
. This is its content:
---
description: "localhost"
label: "localhost"
hostname: "localhost"
transport: local
scheduler: "direct"
work_dir: "/home/max/.aiida_run"
mpirun_command: "mpirun -np {tot_num_mpiprocs}"
mpiprocs_per_machine: "1"
shebang: "#!/bin/bash"
prepend_text: " "
append_text: " "
Note
When used without the --config
option, verdi computer setup
will prompt you for the required information, just like you have seen when setting up a profile.
The configuration file should work for the virtual machine that comes with this tutorial
but may need to be adapted when you are running AiiDA in a different environment,
as explained in this appendix.
Finally, you need to provide AiiDA with information on how to access the Computer
.
For remote computers with ssh
transport, this would involve e.g. an SSH key.
For local
computers, this is just a “formality” (press enter to confirm the default cooldown time):
verdi computer configure local localhost
Note
For remote computers with ssh
transport, use verdi computer configure ssh
instead of verdi computer configure local
.
Your localhost
computer should now show up in
verdi computer list
Before proceeding, test that it works:
verdi computer test localhost
3.2. Code setup¶
Now that we have our localhost set up, let’s configure the Code
, namely the pw.x
executable.
As with the computer, we have prepared a configuration file for you to download
.
This is its content:
---
label: "qe-6.4.1-pw"
description: "quantum_espresso v6.4.1"
input_plugin: "quantumespresso.pw"
on_computer: true
computer: "localhost"
remote_abs_path: "/usr/local/bin/pw.x"
prepend_text: "ulimit -s unlimited"
append_text: " "
Once you have the configuration file in your local working environment, set up the code:
verdi code setup --config code.yml
Warning
The configuration should work for the virtual machine that comes with this tutorial. If you are following this tutorial in a different environment, you will need to install Quantum ESPRESSO and adapt the configuration to your needs, as explained in this appendix.
Similar to the computers, you can list all the configured codes with:
verdi code list
Verify that it now contains a code named qe-6.4.1-pw
that we just configured.
You can always check the configuration details of an existing code using:
verdi code show qe-6.4.1-pw
Note
The generic
profile has already a number of other codes configured.
See verdi -p generic code list
.
3.3. The AiiDA daemon¶
First of all, check that the AiiDA daemon is actually running. The AiiDA daemon is a program that
runs continuously in the background
waits for new calculations to be submitted
transfers the inputs of new calculations to your compute resource
checks the status of your calculation at the compute resource, and
retrieves the results from the compute resource
Check the status of the daemon process by typing in the terminal:
verdi daemon status
If the daemon is running, the output should look like
Profile: default
Daemon is running as PID 2050 since 2019-04-30 12:37:12
Active workers [1]:
PID MEM % CPU % started
----- ------- ------- -------------------
2055 2.147 0 2019-04-30 12:37:12
Use verdi daemon [incr | decr] [num] to increase / decrease the amount of workers
If this is not the case, type in the terminal
verdi daemon start
to start the daemon.
3.4. Creating a new calculation¶
In the following, we’ll be working in the verdi shell
.
As you go along, feel free to keep track of your commands by
copying them into a python script test_pw.py
.
Note
The verdi shell
imports a number of AiiDA internals so that you as the user don’t have to.
You can also make those available to a python script, by running it using
verdi run <scriptname>
Every calculation sent to a cluster is linked to a code, which describes the executable file to be used as well as some metadata. Let’s have a look at the codes already installed on your machine:
verdi code list
There should be a number of them. Here, we’re interested in the “PWscf” executable of Quantum Espresso, i.e. in codes for the quantumespresso.pw
plugin:
verdi code list -P quantumespresso.pw
Pick the correct codename, that might look like, e.g.
qe-6.4.1-pw@localhost
and load it in the verdi shell.
code = load_code("<codename>")
Note
load_code
returns an object of type Code
, which is the general AiiDA class for describing simulation codes.
Let’s build the inputs for a new PwCalculation
(defined by the quantumespresso.pw
plugin, the default plugin for the code you chose before)
builder = code.get_builder()
As the first step, assign a (short) label or a (long) description to your calculation, that you might find convenient in the future.
builder.metadata.label = "PW test"
builder.metadata.description = "My first AiiDA calc with Quantum ESPRESSO on Si"
This information will be saved in the database for later queries or
inspection. Note that you can press TAB after writing builder.
to
see all inputs available for this calculation.
In order to figure out which data type is expected for a particular input, such as builder.structure
,
and whether the input is optional or required, use builder.structure??
.
Now, specify the number of machines (a.k.a. cluster nodes)
you are going to run on and the maximum time allowed for the
calculation.
The general options grouped under builder.metadata.options
are independent of
the code or plugin, and will be passed to the scheduler that handles the
queue on your compute resource .
builder.metadata.options.resources = {'num_machines': 1}
builder.metadata.options.max_wallclock_seconds = 30 * 60
Again, to see the list of available options, type
builder.metadata.options.
and hit the TAB button.
3.4.1. Preparation of inputs¶
A Quantum Espresso calculation needs a number of inputs:
a structure
a mesh in reciprocal space (k-points)
a number of input parameters
These are mirrored in the inputs of the aiida-quantumespresso
plugin
(see documentation).
We’ll start with the structure, k-points, and pseudopotentials
and leave the input parameters as the last thing to setup.
Exercise
Use what you learned in the previous section to load the structure
and kpoints
inputs for your calculation:
Use a silicon crystal structure
Define a
2x2x2
mesh of k-points.
Note: If you just copy and paste code that you executed previously,
this may result in duplication of information on your database.
In fact, you can re-use an existing structure stored in your database 1. Use a combination of the bash command
verdi data structure list
and of the shell command load_node()
to get an object representing the structure created earlier.
3.4.2. Attaching the input information to the calculation¶
Once you’ve created a structure
node and a kpoints
node,
attach it to the calculation:
builder.structure = structure
builder.kpoints = kpoints
Note
The builder accepts both stored and unstored data nodes. AiiDA will take care of storing the unstored nodes upon submission. If you decide not to submit, nothing will be stored in the database.
PWscf also needs information on the pseudopotentials,
in the form of a dictionary, where keys are the names of the elements and the values are the corresponding UpfData
objects containing the information on the pseudopotential.
However, instead of creating the dictionary by hand, we can use a helper function that picks the right pseudopotentials for our structure from a pseudopotential family.
You can list the preconfigured families from the command line:
verdi data upf listfamilies
Pick the one you configured earlier (or one of the SSSP
families that
we provide) and link it to the calculation using the command:
from aiida.orm.nodes.data.upf import get_pseudos_from_structure
builder.pseudos = get_pseudos_from_structure(structure, '<PSEUDO_FAMILY_NAME>')
Print the content of the pseudos namespace, e.g. print(builder.pseudos)
to see what the helper function created.
3.4.3. Preparing and debugging input parameters¶
Finally, we need to specify a number of input parameters (i.e. plane wave cutoffs, convergence thresholds, etc.). to launch the Quantum ESPRESSO calculation. The structure of the parameter dictionary closely follows the structure of the PWscf input file.
Since these are often the parameters to tune in a calculation, let’s introduce a few mistakes intentionally and use this part of the tutorial to learn how to debug problems.
Define a set of input parameters for Quantum ESPRESSO, preparing a dictionary of the form:
parameters_dict = {
'CONTROL': {
'calculation': 'scf',
'tstress': True,
'tprnfor': True,
},
'SYSTEM': {
'ecutwfc': 30.,
'ecutrho': 200.,
'mickeymouse': 240.,
},
'ELECTRONS': {
'conv_thr': 1.e-8,
},
}
This dictionary is almost a valid input for the Quantum ESPRESSO plugin,
except for an invalid key mickeymouse
. When Quantum ESPRESSO
receives an unrecognized key, it will stop.
By default, the AiiDA plugin will not validate your input and simply pass
it on to the code.
Let’s wrap the parameters_dict
python dictionary in an AiiDA Dict
node and see what happens.
builder.parameters = Dict(dict=parameters_dict)
3.4.4. Simulate submission¶
At this stage, you have created in memory (it’s not yet stored in the database) the input of the graph shown below. The outputs will be created by the daemon later on.

In order to check which input files AiiDA creates, we can perform a dry run of the submission process. Let’s tell the builder that we want a dry run and that we don’t want to store the provenance of the dry run:
builder.metadata.dry_run = True
builder.metadata.store_provenance = False
It’s time to run:
from aiida.engine import run
run(builder)
Note
Instead of using the builder, you can also simply pass the calculation class as the first argument, followed by the inputs as keyword arguments, e.g.:
run(PwCalculation, structure=structure, pseudos={'Si': pseudo_node}, ....)
The builder is simply a convenience wrapper providing tab-completion in the shell and automatic help strings.
This creates a folder of the form submit_test/[date]-0000[x]
in the
current directory. In your second terminal:
open the input file
aiida.in
within this foldercompare it to input data nodes you created earlier
verify that the pseudo folder contains the needed pseudopotentials
have a look at the submission script
_aiidasubmit.sh
Note
The files created by a dry run are only intended for inspection and cannot be used to correct the inputs of your calculation.
3.4.5. Submitting the calculation¶
Up to now we’ve just been playing around and our calculation has been kept in memory and not in the database. Now that we have inspected the input files and convinced ourselves that Quantum ESPRESSO will have all the information it needs to perform the calculation, we will submit the calculation properly. Doing so will make sure that all inputs are stored in the database, will run and store the calculation and link the outputs to it.
Let’s revert the following values in our builder to their defaults:
builder.metadata.dry_run = False
builder.metadata.store_provenance = True
And then rely on the submit machinery of AiiDA,
from aiida.engine import submit
calculation = submit(builder)
As soon as you have executed these lines, the calculation
variable contains a PwCalculation
instance, already submitted to the daemon.
Note
You may have noticed that we used submit
here instead of run
.
The difference is that submit
will hands over the calculation to the daemon running in the background,
while run
will execute all tasks in the current shell.
All processes in AiiDA (you will soon get to know more) can be “launched” using one of available functions:
run
run_get_node
run_get_pk
submit
which are explained in more detail in the online documentation.
The calculation is now stored in the database and was assigned a “database primary key” or pk
(calculation.pk
) as well as a UUID (calculation.uuid
).
See the previous section for more details on these identifiers.
Note that while AiiDA will prevent you from changing the content of stored nodes, the concept of “extras” allows you to set extra attributes, e.g. as a way of labelling nodes and providing information for querying.
For example, let’s add an extra attribute called element
, with value Si
:
calculation.set_extra("element", "Si")
In the mean time, after you submitted your calculation, the daemon
picked it up and started to: generate the input files, submit the calculation
to the queue, wait for it to run and finish, retrieve the output files,
parse them, store them in the database and set the state of the
calculation to Finished
.
Note
If the daemon is not running, the calculation will remain in the
NEW
state until you start the daemon.
3.4.6. Checking the status of the calculation¶
You can check the calculation status from the command line:
verdi process list
Note
Since you are running your DFT calculation directly on the VM,
verdi
commands can be a bit slow until the calculation finishes.
If you don’t see any calculation in the output, the calculation you submitted has already finished.
By default, the command only prints calculations that are still active 2. Let’s also list your finished calculations (and limit those only to the one created in the past day):
verdi process list -a -p1
as explained in the first section.
Similar to the dry run, we can also inspect the input files of the actual calculation:
verdi calcjob inputls <pk_number> -c
for the pk_number
of your calculation. This will show the
contents of the input directory (-c
prints directories in color).
Check the content of input files with
verdi calcjob inputcat <pk_number> | less
3.5. Troubleshooting¶
Your calculation should end up in a FAILED state
(last column of verdi process list -a -p1
), and correspondingly the
error code near the “Finished” status of the State should be non-zero,
$ verdi process list -a -p1
PK Created Process label Process State Process status
---- --------- --------------- ---------------- ----------------
2060 3m ago PwCalculation ⏹Finished [300]
...
$ # Anything but [0] after the Finished state signals a failure
This was expected, since we used an invalid key in the input parameters. Situations like this happen in real life, so AiiDA provides tools to trace back to the source of the problem and correct it.
A first way to proceed is to inspect the output file of PWscf.
verdi calcjob outputcat <pk_number> | less
This might be enough to understand the reason why the calculation failed.
AiiDA provides further tools for troubleshooting in a more compact way. For any calculation, both successful and failed, you can get a summary by:
$ verdi process show <pk_number>
Property Value
----------- --------------------------------------------------------------------------------
type PwCalculation
state Finished [300] Both the stdout and XML output files could not be read or parsed.
pk 2060
uuid cd874e9d-94f7-4fc8-88c5-decdfc031491
label PW test
description My first AiiDA calc with Quantum ESPRESSO on Si
ctime 2019-12-13 06:14:07.374401+00:00
mtime 2019-12-13 06:14:19.775021+00:00
computer [2] localhost
Inputs PK Type
---------- ---- -------------
pseudos
Si 2003 UpfData
code 2056 Code
kpoints 2058 KpointsData
parameters 2059 Dict
structure 2057 StructureData
Outputs PK Type
----------------- ---- --------------
output_parameters 2064 Dict
output_trajectory 2063 TrajectoryData
remote_folder 2061 RemoteData
retrieved 2062 FolderData
Log messages
---------------------------------------------
There are 3 log messages for this calculation
Run 'verdi process report 2060' to see them
The last part of the output alerts you to the fact that there
are some log messages waiting for you, if you run
verdi process report <pk>
.
Let’s now correct our input parameters dictionary by leaving out the invalid key and see if our calculation succeeds:
parameters_dict = {
'CONTROL': {
'calculation': 'scf',
'tstress': True,
'tprnfor': True,
},
'SYSTEM': {
'ecutwfc': 30.,
'ecutrho': 200.,
},
'ELECTRONS': {
'conv_thr': 1.e-8,
},
}
builder.parameters = Dict(dict=parameters_dict)
calculation = submit(builder)
If you have been using the separate script approach, modify the script to remove the faulty input and run it again with:
verdi run test_pw.py
Use verdi process list -a -p1
to verify that
the calculation reaches the finished status, with exit code zero.
3.6. Using the calculation results¶
Now you can access the results as you have seen earlier. For example,
note down the pk of the calculation so that you can load it in the
verdi shell
and check the total energy with the commands:
calculation = load_node(<pk>)
calculation.res.energy
Besides writing input files, running the software for you, storing the output
files, and connecting it all together in your provenance graph,
many AiiDA plugins will parse the output of your code and make output values
of interest available through an output dictionary node (as depicted in the
graph above).
In the case of the aiida-quantumespresso
plugin this output node
is available at calculation.outputs.output_parameters
and you can access
all the available attributes (not only the energy) using:
calculation.outputs.output_parameters.attributes
While the name of this output dictionary node can be chosen by the plugin,
AiiDA provides the “results” shortcut calculation.res
that plugin developers can use to provide what they consider the result of the
calculation.
Footnotes
- 1
In order to avoid duplication of KpointsData, you would first need to learn how to query the database, therefore we will ignore this issue for now.
- 2
A process is considered active if it is either
Created
,Running
orWaiting
. If a process is no longer active, but terminated, it will have a stateFinished
,Killed
orExcepted
.