Day 1 - Introduction to pyiron

This is a short introduction how to use pyiron for atomistic simulation. Starting with molecular dynamics calculation for interatomic potentials using LAMMPS followed by DFT calculation using the opensource DFT code S/PHI/nX developed at the Max Planck Institut für Eisenfoschung. The focus of this first session is to get familiar with pyiron from a user perspective. More advanced workflows, the up-scaling and publishing of new workflows as well as the implementation of new simulation codes are going to be explained in the following sessions.

Installation

As affiliated project of the numfocus foundation pyiron promotes open science principles in the materials science community. Conda-Forge is used as central package manager with over 100+ materials science specific simulation codes and tools. So you can install pyiron, all required dependencies and many other tools with a single line:

conda install -c conda-forge pyiron

For more advanced installation options, the configuration of commercial simulation codes, the connection to HPC computing resources like the queuing system or other installation options the reader is referred to the pyiron installation documentation. Alternatively this tutorial can also be executed directly in the webbrowser by using the mybinder environment.

Getting started

Moving away from the classical terminal pyiron is designed to integrate in the jupyter interactive computing environment. It should reduce the technical complexity and enable the scientist to focus on the scientific challenges. This is achieved by an abstract class of pyiron objects, which are explained in more detail in the corresponding publication. Therefore pyiron is paritcularly suitable for rapid prototyping of simulation protocols and up-scaling those simulation protocols to the high-throughput scale.

To start using pyiron only a single import is required. The Project class is imported and a new project named demonstration is created. To execute the cell below use shift plus enter:

from pyiron import Project
pr = Project("demonstration")

The Project object represents a folder on the file system, which is familiar to the user and allows the user to structure their simulation in a flexible way:

pr.path
'/home/jovyan/demonstration/'

Beyond the filesystem, the Project object is also connected to an SQL database to track simulations executed with pyiron, their relationship and create other objects.

Atomistic Structures

Rather than developing a separate structure class, pyiron is based on the ASE structure class and extends it for interactive development when necessary. The structure object is created from the Project object using auto completion (tab-completion) to minimize the commands the user has to type:

structure = pr.create.structure.ase.bulk("Fe")

The ASE database of bulk structures is used to determine that iron is bcc and select an initial guess for the lattice constant of 2.87Å. The atomistic structure object structure can then be printed in the browser using:

structure
Fe: [0. 0. 0.]
pbc: [ True  True  True]
cell: 
Cell([[-1.435, 1.435, 1.435], [1.435, -1.435, 1.435], [1.435, 1.435, -1.435]])

Or alternatively it can be visualised using NGLview:

structure.plot3d()

While visualising a single atom is not very helpful, a quick look at a larger structure can help to prevent wasting computing resources, for example when two atoms are too close. The ASE structure object behaves like a numpy array so here only a few simple manipulations are demonstrated. For a more detailed introduction to the ASE structure class the reader is referred to their documentation.

Create a cubic fcc iron structure with a lattice constant of 3.6Å:

structure_fcc = pr.create.structure.ase.bulk("Fe", crystalstructure="fcc", a=3.6, cubic=True)
structure_fcc
Fe: [0. 0. 0.]
Fe: [0.  1.8 1.8]
Fe: [1.8 0.  1.8]
Fe: [1.8 1.8 0. ]
pbc: [ True  True  True]
cell: 
Cell([3.6, 3.6, 3.6])

Remove the first atom and replace the last atom with a carbon atom. Afterwards repeat the atomistic structure once in each direction. Finally visualise the resulting structure:

del structure_fcc[0]
structure_fcc[-1] = "C"
structure_fcc.set_repeat([2,2,2])
structure_fcc.plot3d()

Molecular dynamics calculation

After the creation of the atomistic structure, the LAMMPS molecular dynamics code is used in combination with the NIST database for interatomic potentials to calculate a molecular dynamics trajectory at a temperature of 500K. Again the Project object is used to create the job object:

job_lmp = pr.create.job.Lammps(job_name="lmp_md")

For the simulation we create a new bcc structure object and repeat it again once in each direction:

fe_bcc = pr.create.structure.ase.bulk("Fe", cubic=True)
fe_bcc.set_repeat([2,2,2])

Once the structure is assigned pyiron can automatically preselect all interatomic potentials which have an interaction for iron defined:

job_lmp.structure = fe_bcc
job_lmp.view_potentials()
Config Filename Model Name Species Citations
40 [pair_style eam/fs\n, pair_coeff * * Fe.eam.fs... [potential_LAMMPS/1997--Ackland-G-J--Fe--LAMMP... NISTiprpy 1997--Ackland-G-J--Fe--LAMMPS--ipr1 [Fe] [{'Ackland_1997': {'title': 'Computer simulati...
46 [pair_style eam\n, pair_coeff 1 1 Fe_MeyerEnte... [potential_LAMMPS/1998--Meyer-R--Fe--LAMMPS--i... NISTiprpy 1998--Meyer-R--Fe--LAMMPS--ipr1 [Fe] [{'Meyer_1998': {'title': 'Martensite-austenit...
54 [pair_style meam\n, pair_coeff * * library.mea... [potential_LAMMPS/2001--Lee-B-J--Fe--LAMMPS--i... NISTiprpy 2001--Lee-B-J--Fe--LAMMPS--ipr1 [Fe] [{'Lee_2001': {'title': 'Second nearest-neighb...
55 [pair_style meam\n, pair_coeff * * library.mea... [potential_LAMMPS/2001--Lee-B-J--Fe-Cr--LAMMPS... NISTiprpy 2001--Lee-B-J--Fe-Cr--LAMMPS--ipr1 [Fe, Cr] [{'Lee_2001': {'title': 'A semi-empirical atom...
77 [pair_style eam/fs\n, pair_coeff * * Fe_2.eam.... [potential_LAMMPS/2003--Mendelev-M-I--Fe-2--LA... NISTiprpy 2003--Mendelev-M-I--Fe-2--LAMMPS--ipr3 [Fe] [{'Mendelev_2003': {'title': 'Development of n...
... ... ... ... ... ... ...
882 [pair_style kim Sim_LAMMPS_MEAM_KimJungLee_200... [] OPENKIM Sim_LAMMPS_MEAM_KimJungLee_2009_FeTiC__SM_5310... [Fe, Ti, C] [{'Hyun-Kyu_2009': {'title': 'Modified embedde...
886 [pair_style kim Sim_LAMMPS_MEAM_LiyanageKimHou... [] OPENKIM Sim_LAMMPS_MEAM_LiyanageKimHouze_2014_FeC__SM_... [Fe, C] [{'I._2014': {'title': 'Structural, elastic, a...
904 [pair_style kim Sim_LAMMPS_ReaxFF_AryanpourVan... [] OPENKIM Sim_LAMMPS_ReaxFF_AryanpourVanDuinKubicki_2010... [Fe, H, O] [{'Masoud_2010': {'title': 'Development of a R...
916 [pair_style kim Sim_LAMMPS_TersoffZBL_Byggmast... [] OPENKIM Sim_LAMMPS_TersoffZBL_ByggmastarGranberg_2020_... [Fe] [{'J._2020': {'title': 'Dynamical Stability of...
918 [pair_style kim Sim_LAMMPS_TersoffZBL_Henrikss... [] OPENKIM Sim_LAMMPS_TersoffZBL_HenrikssonBjorkasNordlun... [Fe, C] [{'E_2013': {'title': 'Atomistic simulations o...

115 rows × 6 columns

For this tutorial we just select the first available interatomic potential. For simplicity we just use the list_potentials() function, which only returns the names of the interatomic potentials and then we select the first potential from the list.

potential_selected = job_lmp.list_potentials()[0]
job_lmp.potential = potential_selected
potential_selected
'1997--Ackland-G-J--Fe--LAMMPS--ipr1'

Finally we setup the molecular dynamics calculation to run for 10000 steps at a temperature of 500K and print the thermodynamic information and positions every 100 molecular dynamics steps.

job_lmp.calc_md(temperature=500, n_ionic_steps=10000, n_print=100)
job_lmp.run()
The job lmp_md was saved and received the ID: 2

For more details on the molecular dynamics function or any other function in pyiron, the internal documentation can always be accessed using:

job_lmp.calc_md(?

The calculation finished very quickly. Now the Project object can again be used to list all existing calculations in a given project:

pr.job_table()
id status chemicalformula job subjob projectpath project timestart timestop totalcputime computer hamilton hamversion parentid masterid
0 2 finished Fe16 lmp_md /lmp_md /home/jovyan/ demonstration/ 2021-03-22 22:14:54.957075 2021-03-22 22:14:56.657214 1.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None

The job_table lists the database id of the calculation, the path where the calculation was executed, some details on the run time and finally the status of the calculation in this case finished. Before going into more technical details, the calculation can be analysed. Starting by plotting the temperature over molecular dynamics steps:

import matplotlib.pyplot as plt
plt.plot(job_lmp["output/generic/steps"], job_lmp["output/generic/temperature"])
plt.xlabel("MD steps")
plt.ylabel("Temperature")
Text(0, 0.5, 'Temperature')
_images/day1_33_1.png

The md trajectories are not stored in the SQL database but instead in an HDF5 file which is a hierachical file format optimised for large arrays like trajectories. The content of the HDF5 files can be browsed in pyiron just like folders on the filesystem. The plot above can be recreated without accessing the calculation object directly from the Project object using the universal path output/generic/steps and adding the name of the job lmp_md in the beginning:

plt.plot(pr["lmp_md/output/generic/steps"], pr["lmp_md/output/generic/temperature"])
plt.xlabel("MD steps")
plt.ylabel("Temperature")
Text(0, 0.5, 'Temperature')
_images/day1_35_1.png

In addition to the temperature also the positions of the atomistic structure can be visualised. For example the x-coordinate over time. It is important to use the unwrapped_positions rather than the positions to prevent atoms to be mirrored from one periodic boundary to another:

plt.plot(pr["lmp_md/output/generic/steps"], pr["lmp_md/output/generic/unwrapped_positions"][:,:,0])
plt.xlabel("MD steps")
plt.ylabel("Temperature")
Text(0, 0.5, 'Temperature')
_images/day1_37_1.png

Finally the molecular dynamics trajectory can be directly visualised in the browser:

job_lmp.animate_structure()

Technical implementation

The following section is designed to explain more details on the technical steps in the background. The understanding of the technical implementation is not required for all users but it can be helpful to debug failing calculation and get more insights in case something goes wrong, or in case the user wants to extend pyiron for their specific usecase.

Starting with the input of the simulation code, pyiron provides direct access to the underlying input files and the user can modify them interactively:

job_lmp.input.control
Parameter Value Comment
0 units metal
1 dimension 3
2 boundary p p p
3 atom_style atomic
4 read_data structure.inp
5 include potential.inp
6 fix___ensemble all nvt temp 500.0 500.0 0.1
7 variable___dumptime equal 100
8 variable___thermotime equal 100
9 timestep 0.001
10 velocity all create 1000.0 86897 dist gaussian
11 dump___1 all custom ${dumptime} dump.out id type xsu ysu zsu fx fy fz vx vy vz
12 dump_modify___1 sort id format line "%d %d %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g"
13 thermo_style custom step temp pe etotal pxx pxy pxz pyy pyz pzz vol
14 thermo_modify format float %20.15g
15 thermo ${thermotime}
16 run 10000
job_lmp.input.control["run"] = 20000
job_lmp.input.control
/srv/conda/envs/notebook/lib/python3.7/site-packages/pyiron_base/generic/parameters.py:284: UserWarning: The input in GenericParameters changed, while the state of the job was already finished.
  "The input in GenericParameters changed, while the state of the job was already finished."
Parameter Value Comment
0 units metal
1 dimension 3
2 boundary p p p
3 atom_style atomic
4 read_data structure.inp
5 include potential.inp
6 fix___ensemble all nvt temp 500.0 500.0 0.1
7 variable___dumptime equal 100
8 variable___thermotime equal 100
9 timestep 0.001
10 velocity all create 1000.0 86897 dist gaussian
11 dump___1 all custom ${dumptime} dump.out id type xsu ysu zsu fx fy fz vx vy vz
12 dump_modify___1 sort id format line "%d %d %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g"
13 thermo_style custom step temp pe etotal pxx pxy pxz pyy pyz pzz vol
14 thermo_modify format float %20.15g
15 thermo ${thermotime}
16 run 20000

pyiron warns the user that the calculation has already been executed and while it is possible to modify the input after the calculation it is not recommnded. To run the calculation again with the updated setting the delete_existing_job=True flag is used in the run() function:

job_lmp.run(delete_existing_job=True)
The job lmp_md was saved and received the ID: 2

In case the delete_existing_job=True flag is not set the calculation is not executed again, but instead the existing calculation is reloaded:

job_lmp.run()
2021-03-22 22:15:02,400 - pyiron_log - WARNING - The job lmp_md is being loaded instead of running. To re-run use the argument 'delete_existing_job=True in create_job'

In the background the run() function calls a shell script to call the simulation code. With this additional layer pyiron is able to support multiple version of the same executable:

job_lmp.executable.list_executables()
['2020.03.03', '2020.03.03_mpi']

By default a serial executable is selected:

job_lmp.executable
'/srv/conda/envs/notebook/share/pyiron/lammps/bin/run_lammps_2020.03.03.sh'

When the number of computing cores is increased the parallel executable is automatically selected during run time. Besides the cores also the memory and the run_time can be specified when submitting to a queuing system:

# job_lmp.server.queue = "my_queue"
job_lmp.server.cores = 2
job_lmp.server.run_time = 100  # in sec. 

More detail on the queuing system configuration and different queuing systems which are supported is available in the documentation. The executable in this example is a very simple shell script, but those scripts can be more extensive on an HPC cluster for example including the loading of modules or the setting of other environment variables. For more details on advanced executable configurations we refer to the documentation.

!cat {job_lmp.executable}
#!/bin/bash
exec lmp_serial -in control.inp;

The executable is executed in the working directory which is generated based on the project path and the job_name:

job_lmp.working_directory
'/home/jovyan/demonstration/lmp_md_hdf5/lmp_md'

By default the output files are compressed after successful parsing and transfering of the intromation into the HDF5 files. Still the archive can be decompressed to access additional outpus, for example for specific input commands:

import os
os.listdir(job_lmp.working_directory)
['lmp_md.tar.bz2']
job_lmp.decompress()
os.listdir(job_lmp.working_directory)
['structure.inp',
 'dump.out',
 'error.out',
 'Fe.eam.fs',
 'potential.inp',
 'control.inp',
 'log.lammps']

The content of the output files is again available using the edge braket notation:

job_lmp["log.lammps"]
['LAMMPS (10 Feb 2021)\n',
 'units metal\n',
 'dimension 3\n',
 'boundary p p p\n',
 'atom_style atomic\n',
 'read_data structure.inp\n',
 'Reading data file ...\n',
 '  orthogonal box = (0.0000000 0.0000000 0.0000000) to (5.7400000 5.7400000 5.7400000)\n',
 '  1 by 1 by 1 MPI processor grid\n',
 '  reading atoms ...\n',
 '  16 atoms\n',
 '  read_data CPU = 0.001 seconds\n',
 'include potential.inp\n',
 'pair_style eam/fs\n',
 'pair_coeff * * Fe.eam.fs Fe\n',
 'fix ensemble all nvt temp 500.0 500.0 0.1\n',
 'variable dumptime  equal 100\n',
 'variable thermotime  equal 100\n',
 'timestep 0.001\n',
 'velocity all create 1000.0 86897 dist gaussian\n',
 'dump 1 all custom ${dumptime} dump.out id type xsu ysu zsu fx fy fz vx vy vz\n',
 'dump 1 all custom 100 dump.out id type xsu ysu zsu fx fy fz vx vy vz\n',
 'dump_modify 1 sort id format line "%d %d %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g"\n',
 'thermo_style custom step temp pe etotal pxx pxy pxz pyy pyz pzz vol\n',
 'thermo_modify format float %20.15g\n',
 'thermo ${thermotime}\n',
 'thermo 100\n',
 'run 20000\n',
 'Neighbor list info ...\n',
 '  update every 1 steps, delay 10 steps, check yes\n',
 '  max neighbors/atom: 2000, page size: 100000\n',
 '  master list distance cutoff = 5.72645\n',
 '  ghost atom cutoff = 5.72645\n',
 '  binsize = 2.863225, bins = 3 3 3\n',
 '  1 neighbor lists, perpetual/occasional/extra = 1 0 0\n',
 '  (1) pair eam/fs, perpetual\n',
 '      attributes: half, newton on\n',
 '      pair build: half/bin/atomonly/newton\n',
 '      stencil: half/bin/3d/newton\n',
 '      bin: standard\n',
 'Per MPI rank memory allocation (min/avg/max) = 4.564 | 4.564 | 4.564 Mbytes\n',
 'Step Temp PotEng TotEng Pxx Pxy Pxz Pyy Pyz Pzz Volume \n',
 '       0                 1000    -69.0546007925025    -67.1156986175025     5690.22928091563    -3566.63661800858     3828.08723902046     5445.06250527765    -3812.23574993936     2285.38031868501           189.119224 \n',
 '     100     487.694888359492    -68.0994780084955    -67.1538853287189     20582.9440899999    -1851.41828646858     7119.64256495625     15678.0013378444    -2228.47630706355     20112.6416008409           189.119224 \n',
 '     200     548.994468833891    -68.1792500222794    -67.1148034525944     22163.3993312562    -788.546925637403     2669.65240661046     10958.2517703421    -1643.11759284431     13560.9270984988           189.119224 \n',
 '     300      623.24255242935    -68.2402822165015    -67.0318758760437     25580.6131347908    -5156.79906821285     1727.05469339029     18456.1464686315    -3108.35198517232     16501.6892543093           189.119224 \n',
 '     400     870.264850802463    -68.7211184928767    -67.0337600808298     6534.60782768123     1564.32281703411     6362.75699922961     9621.75381674537     3092.80500320262     15976.5774967056           189.119224 \n',
 '     500     380.044163929702     -67.948745386924    -67.2118769308847     26485.1739041916     -9431.1314027285     515.832758963087     20063.4174161143     2193.76683264737      19386.174588988           189.119224 \n',
 '     600     436.769354824113    -68.2644909645123    -67.4176379124705     20246.5462281838    -4646.59973244872     3426.95239597942     13558.9322068005    -5458.82499279295      9933.0052946857           189.119224 \n',
 '     700     431.258629061029    -68.3432499719448    -67.5070816780708     15860.7706451838     5888.78734488857     5711.74883423537     11366.2549836403    -1566.81128646684     15490.4001004222           189.119224 \n',
 '     800     587.615527572158    -68.3704327150599    -67.2311036905864     18782.2580100579      -6391.657920214     1515.88702759609     17532.5422832011    -2658.57317112711     16235.3663532659           189.119224 \n',
 '     900     503.766308947077    -67.7960295532766    -66.8192759611674     27683.1375641512    -836.028470193167     7904.49555091338     26520.7078337828    -7996.41400528006     22148.4850200816           189.119224 \n',
 '    1000     454.232213816354     -67.720065744835    -66.8393539175114     36882.8811467087     9032.89520787955      8772.6393044323     21267.8214160752    -5558.22020240792      25285.257960558           189.119224 \n',
 '    1100     394.161432686796    -67.9449496521161    -67.1807091929786       27705.77145781    -6381.39492992541    -954.260171364224      19349.413402174    -4718.63583945281      19487.197910583           189.119224 \n',
 '    1200     455.756252434942    -68.2226240663106    -67.3389572771946     16388.9344782097     1163.15514331822     9317.44568893183     23414.7093255223    -368.874385302015     18764.6690280745           189.119224 \n',
 '    1300     387.702528495117    -68.0663683287322      -67.31465105298     24983.0730112841     7814.74059352816       2296.459564889     19222.9570345503     2922.84674952348     19991.3225808339           189.119224 \n',
 '    1400     333.295441347864    -67.8661089955473    -67.2198817394003     29114.3906240027     -7717.9974523116    -4693.23258269484     19275.0390049419     -4805.8928694516     19184.6270996958           189.119224 \n',
 '    1500     469.434125757525     -67.944553704537    -67.0343668570865     27129.8062756767     2140.42078539929      5928.0838956266     25218.1584215521    -3447.01469295232     19489.5064035526           189.119224 \n',
 '    1600     579.735214331721     -67.918552850522    -66.7945029825301     27684.7282591365     11104.4165522888     4339.61232141665     30684.3883460719    -2070.38433965291     26452.6881517547           189.119224 \n',
 '    1700     645.641247273539    -67.7803999904825    -66.5285647718742     34977.0383181995    -810.173446393973    -2217.05034590377     26030.0038564826    -6876.72457097653     26896.3728752564           189.119224 \n',
 '    1800     427.753723197737    -67.6912680481271    -66.8618954238547     36343.6255284968      106.97201217491     2275.37934995237     21645.6902927245    -9025.06522059089     23591.1978693689           189.119224 \n',
 '    1900     434.563899881799    -68.1393591247051    -67.2967822340478     21222.3368212104     3871.63689481801     4383.80082299325     20550.0746814076    -592.747542253701     14759.6761518399           189.119224 \n',
 '    2000     488.441681128577    -68.3041211985922    -67.3570805606914     15028.8663456368    -5223.05259162249    -1969.76416388636     21779.9443594438    -2530.76037743118     15280.0120445807           189.119224 \n',
 '    2100      543.22482736989    -68.2709076219161    -67.2176478226146      21696.327100836     2785.02093908105     4357.50866291529     9778.58544950952    -1997.06906092927     18765.3388411214           189.119224 \n',
 '    2200     449.014721740961    -67.6174349687555    -66.7468393481649     35723.0174055043    -1626.06213336581      1124.0655866132     24454.5418828138     816.987263356295     22896.1659085443           189.119224 \n',
 '    2300      710.05181656068     -67.892897980101    -66.5161769686088     30197.8315191805    -12795.6171048555     4310.35521437525     33248.7824927379    -4949.46183720395     15681.2073303724           189.119224 \n',
 '    2400     789.906658723205    -68.4227987268772    -66.8912469882318     16224.9124412089     99.4910583729084     6149.96690973922     16307.8380634681    -2326.14225620572      21052.217479809           189.119224 \n',
 '    2500      547.87555533251    -68.1322626718683    -67.0699855660048      21278.468413977     169.738467920511    -3927.00264503916     14915.6428423348    -1020.45538718054     19164.7434143374           189.119224 \n',
 '    2600      515.24260440712    -68.1809897658134    -67.1819847594757     23553.9765388622    -4924.84674457911     1348.50904440391      15547.405190136    -4885.76434002148     11241.5994164732           189.119224 \n',
 '    2700     621.949437026075    -68.4838025693547    -67.2779034531648      12318.461371691    -580.567081501739     4931.88055692953     13584.9471294761     -1958.2216921151     12152.0549778762           189.119224 \n',
 '    2800     624.841686682241    -68.5146900988795    -67.3031831935406     10580.7859888411    -2094.38262228119    -3432.93088871197     14427.5001120727     1123.64458182979     11952.0390909794           189.119224 \n',
 '    2900     583.335769305998    -68.2720452458376    -67.1410142539749     20805.2662495376    -1528.78145240822     554.766417777469     10146.5939757055    -2855.94508005459     15681.2081181563           189.119224 \n',
 '    3000     725.261662541074    -68.1572009118085    -66.7509894968635     25339.4160019347    -1754.65827971169    -1457.95384845062     18562.3657083419    -1010.30193488788     15378.7572230649           189.119224 \n',
 '    3100     728.876119908569    -68.1475490699419    -66.7343295757456     22262.9737774533    -3082.62561212062    -7566.82824777213     23183.2810831858    -628.196435792358     15112.8205893601           189.119224 \n',
 '    3200     593.109487204913    -68.4288072136594    -67.2788259389047     14114.5052832433    -993.536222067486     2936.19384246504     15633.9946952749     -893.42821288974     17849.6853029097           189.119224 \n',
 '    3300     534.889347244219    -68.4677407466403    -67.4306426278841     12091.3513683733     2503.77632574415     708.148412934149     10642.8647422923     17.5420529832719     12394.5113817159           189.119224 \n',
 '    3400     480.174613313453    -68.2310773903265    -67.3000657881933     21576.6345087749    -4372.10113644826    -219.242041495483     14985.4271898287    -442.543591405971     10722.1815671382           189.119224 \n',
 '    3500     619.455808098779    -68.2141209124863    -67.0130566988472     16221.8396443446     2808.46774213255     1.24760663889673      18594.673788712    -1858.49704371026     19487.6776848794           189.119224 \n',
 '    3600     721.815347717159    -68.2099168848933    -66.8103875372561     17965.9669921883     4833.29509842292    -4529.01791305519     25722.8795120205    -2033.37824320745     20197.5786234078           189.119224 \n',
 '    3700     653.533510109081    -68.2571833184278     -66.990045774242     21301.7741826702    -3640.90668460672    -5842.38879686575     13519.6360301963    -664.269885364725     20572.7579974999           189.119224 \n',
 '    3800     350.229731442965    -68.1836154350775    -67.5045542470331     19335.4690460367     3458.72707902596    -3483.73389641675     15327.4707521643    -3516.72953171781     14586.6892833628           189.119224 \n',
 '    3900     444.073905479234     -68.379025881512    -67.5180100203175     14044.2003154747     174.588482773442    -1701.31939322231      18851.038967906    -2881.72710305372     10750.0853632543           189.119224 \n',
 '    4000     512.054830718075    -68.1894489094965     -67.196624684498     16533.2415930287    -9290.29055604713    -3420.41595217356     17659.8907076882     557.732131634097     23321.0529130319           189.119224 \n',
 '    4100     696.542151820991    -68.2563441493237    -66.9058170561788     20152.6208784727      6222.6317855683    -2446.36232979043     15462.0656630269    -1441.85838409443       19814.42576827           189.119224 \n',
 '    4200     369.535524922359    -67.6779523640468    -66.9614591310351     33678.0365474828     682.508889389129     1805.47404031562      32335.972898071     4307.77514139509     20735.8977644233           189.119224 \n',
 '    4300     440.327989255325    -67.9998762882848    -67.1461233922043     18718.6955341085    -12152.0040323602     1423.93975564655     23932.5206486449    -299.802436894389     24836.5902718733           189.119224 \n',
 '    4400     453.491497990453    -68.1673678074295    -67.2880921556318     20497.6084003214     5355.96403336459    -1697.89153709092      20101.376475201    -3490.27945830852     20695.7474691388           189.119224 \n',
 '    4500     448.285500866482    -68.4262243348478    -67.5570426021968     15805.9365641126     979.886649888205    -3650.35364653503      14261.164906231     797.550717779761     11395.9245097359           189.119224 \n',
 '    4600     129.344131794576     -68.094145740894    -67.8433601224341      16120.164033451    -10582.9992220178    -1807.70639425941     18428.9987059811     56.2142647923526     15033.8406383106           189.119224 \n',
 '    4700     336.150900421903    -68.2670733009273    -67.6153095889711     14720.3302326937     3110.87778689267      1365.6014856903     16472.3128773779    -4195.26098488008     14562.5142345086           189.119224 \n',
 '    4800      482.14221114654    -68.1656274181007    -67.2308008362493     21613.0996966867    -2837.61541844878     -4716.3697782564      20884.432458664     479.222376584237     20138.2394904674           189.119224 \n',
 '    4900     414.436527543175    -67.8300330990986    -67.0264812144457      24852.133255487    -14898.5178057281    -2388.87244176238     28624.1296131719     5203.91481133256     26777.8429006894           189.119224 \n',
 '    5000     276.346602064168    -67.4953598404239    -66.9595508126278     33129.6992912765     3057.01503667942     3446.59793700931     31697.4740831004     3961.10207195824       29651.16979487           189.119224 \n',
 '    5100     499.322068876679       -68.0988798367    -67.1307431913295     22882.7036876055    -5457.83278197503     284.149220936018     21350.5545904731    -939.643392941536     19786.6270703331           189.119224 \n',
 '    5200       313.4621879849    -68.1357623392797    -67.5279898212155     18754.1170763938    -10683.6377224478     1882.69637399437     19793.3109972728     5155.18767377783     20066.2829988818           189.119224 \n',
 '    5300     269.932840947747    -68.1268021929082    -67.6034288204907     17284.5846968456     1910.94437043792     76.7300630145136      20831.142857414     1552.42841242347      17819.585494055           189.119224 \n',
 '    5400     352.208965565976    -67.9635192484598    -67.2806205190695     26110.1710950235    -4233.10430650798    -139.177200160698     23237.8419918489     -7278.2209478181     19806.4358000375           189.119224 \n',
 '    5500     494.632590689178    -67.9520114446598    -66.9929672387466     22578.0997414302    -10963.3659510575    -64.4598703763829     23815.6895513913    -1929.05967199322     22165.8225494166           189.119224 \n',
 '    5600     362.074578320524    -67.7319357570655    -67.0299085696477     23795.2891002672     5773.34888547295    -1293.31256151372     31916.6279045114     1694.21031129508     27834.7850255666           189.119224 \n',
 '    5700     466.077905665504    -68.0915526006967    -67.1878731356824     22308.2914208104    -2140.96947317844     721.560165178586     21883.1523779216    -1098.77735248739     20162.4872258308           189.119224 \n',
 '    5800     356.038800076829    -68.0868022456235    -67.3964778417702     21821.6190157674     -7522.4242435889     1202.47578800939      18582.206847347    -551.314108756212     19753.0760744018           189.119224 \n',
 '    5900      349.72142874821    -68.1802655816066    -67.5021899427626     17720.4470525152      3662.5192490277     1051.64886227322     19962.7544883571     4217.12416096737     15224.0693549828           189.119224 \n',
 '    6000     429.658635192721     -68.159841667139    -67.3267756048563     18824.7888969185    -7580.39355585777     1192.11952294503      21461.776887653     3397.15976197445     20244.3486003674           189.119224 \n',
 '    6100     666.097347938704    -68.1610409711476    -66.8695433744675     19931.9579557043    -7547.72852077205     1982.82866179421     21650.5719014683     3108.47605553467     20846.8970428214           189.119224 \n',
 '    6200     514.947299896236    -67.8071339421012     -66.808701502322     30711.5009783596     297.551103789646     4538.84008581053     29309.6649493996    -4228.50530879763     20376.4006700938           189.119224 \n',
 '    6300     566.255878746195    -68.2280514182327    -67.1301366633252     17894.9599000633    -6144.27610669893     507.824358297614     21127.6545672763    -2931.84643480881     17127.0868071836           189.119224 \n',
 '    6400     497.185068777765    -68.4294970583663    -67.4655038471355     12740.8895871725    -3219.36194831436    -3021.98722817094     16396.1503543676     694.170269559872     13802.4957622589           189.119224 \n',
 '    6500     474.806235957821     -68.366339061612    -67.4457362180098     15047.4380542708      3792.6474201824     1346.18621710168     12977.4756276271    -3335.16265518477     13967.6433872351           189.119224 \n',
 '    6600     474.251965136879    -68.2114755123619      -67.29194734566     19328.3063683356    -1481.03803839469      3975.2478545683      17765.939153976    -4638.59647736333     17756.8497874691           189.119224 \n',
 '    6700     653.498353226316    -68.3390075530695      -67.07193817464     15864.1814834632    -421.996298444537     -4016.8601999425     19524.0943846655     3463.22701023011     11441.2891940494           189.119224 \n',
 '    6800     743.201730069583    -68.3422721336284    -66.9012766827327       15725.72568163     2957.45704015205     845.057619087385     15337.3838864861    -680.311998280713     19309.7824866262           189.119224 \n',
 '    6900       663.7336487422    -68.2423345175051    -66.9554199023382     18628.4566886571    -6495.38344068838     4051.80740071442     21590.0066463502     1087.05143731981     15709.6956743715           189.119224 \n',
 '    7000      496.60024894835    -68.3400946297111    -67.3772353269196     16818.4259823713    -3353.01054659731    -2837.24310451508     15213.5485193864     1149.47349405277     9832.74076461991           189.119224 \n',
 '    7100      542.46082905977    -68.5858066021563      -67.53402812084     8528.48114202431    -3437.11868495152    -731.429071545371     7428.72283825457     1939.55290971464     10226.8538938607           189.119224 \n',
 '    7200     595.888000041304    -68.5013592821684    -67.3459907428319     9037.20613529927    -6849.75003645453     520.783377630758     16309.1064793668     1656.59152774714     10194.1626347535           189.119224 \n',
 '    7300     669.009147594267    -68.2121630583218    -66.9150197669564     20058.1326315823     380.435400644573    -2760.33192210358     18862.6137983277    -1938.80230469002     14743.4495335969           189.119224 \n',
 '    7400     659.430454068517    -68.1496769804215    -66.8711058387668     21930.6850327685    -5436.77240414176     1059.14456460344     16222.1095504023     355.582213628936     22416.4815384044           189.119224 \n',
 '    7500     711.645666789355    -68.4313520202414    -67.0515406890742      13027.444939833    -3568.89181053397    -1008.32506575821      20351.130308969     2310.63801051076     9952.08002636352           189.119224 \n',
 '    7600     490.443540434214    -68.1907159880002    -67.2397939407377     15279.6020864768     5385.12533776779    -8779.62124482553     20334.9639865934    -6294.20182107245     20294.1056346919           189.119224 \n',
 '    7700     481.051338984936    -68.2317626951543    -67.2990512077097     17720.8415260362    -8709.39766500852    -1084.88329282393     15060.6020709811     77.1196067663184     16860.7408730865           189.119224 \n',
 '    7800     605.332553008996    -68.2151579572935    -67.0414773536661     20898.0909468126    -5109.73662246717    -2364.79109339527     18905.8008222726     1907.08845213474     16197.9945375059           189.119224 \n',
 '    7900     672.916184388496    -67.8781037955094    -66.5733851420058     22471.4274714626     1179.82029786316    -14575.3159201806     29419.8861622408    -1811.79704152835     26259.0845539241           189.119224 \n',
 '    8000     515.955847547328    -67.7833319304863    -66.7829440154728     22437.6702006277    -15315.3767804882    -6545.28180161199     29486.5570996635     5737.33023984521     24663.4338881821           189.119224 \n',
 '    8100     509.477156586317    -68.2173499622055    -67.2295235951875     23335.8183413398    -5552.95625019843    -2291.68326716869     18266.1405463503     499.561293530666     14562.7907833167           189.119224 \n',
 '    8200     392.409470756106    -68.1255347688198    -67.3646911924802      19780.062501277    -333.987626995535    -4578.95965569498     18921.6359386626    -3784.73155758239     20928.8620155989           189.119224 \n',
 '    8300     412.155038954381    -68.0737884249852    -67.2746601235194     17959.8307136111    -10089.7206905954    -2164.44282167264     23745.7110452711     3404.18696071783     18960.1139754081           189.119224 \n',
 '    8400     573.443047190617    -67.8971682275998    -66.7853182561633      27883.010545897    -3173.20568012589    -7432.76722548423     29808.0379514737     2548.82237316111     26195.5318092583           189.119224 \n',
 '    8500     616.139678337918    -67.6550718652846    -66.4604373028514     33802.8982650265     6936.65493838344    -8791.84242870696     33128.0554432494    -11840.8573937971      32236.851370418           189.119224 \n',
 '    8600     503.908359013007    -67.7503251474758    -66.7732961341848     30258.8557678567    -9153.45636967816    -829.648643473534     30466.6120631536     1418.26279518853      28353.170775842           189.119224 \n',
 '    8700     494.019609631578    -68.0023520619361    -67.0444963663288     20715.1176639107    -4645.38219332322    -10228.8052820002     21237.2535649788     8685.87550452127     23571.8984273466           189.119224 \n',
 '    8800     444.472510815461    -68.1112571983443    -67.2494684803965     17598.8418985024     3402.49807438562    -6683.96193665714     23451.7325347398    -1684.76714918021      18065.967753287           189.119224 \n',
 '    8900     378.156221476196    -68.0876660041922    -67.3544580838822     21605.6188812135    -5144.03341842641     -3710.4009119834     21871.0183612863     262.133483409984     17622.1867077445           189.119224 \n',
 '    9000     494.090133105089    -68.2344083850624    -67.2764159513389     21329.5721659101    -6376.82430806649    -9914.95783142719     13936.7768940486      7520.6141529443     18313.6474201007           189.119224 \n',
 '    9100     588.485423101699    -67.9636350332599    -66.8226193664522     22859.0624305506     3647.02999118489    -1295.84218247958     27309.5087221327    -2581.69660587991     23045.0291552201           189.119224 \n',
 '    9200      657.89781442238    -67.9429158869796    -66.6673163836683     24462.2181236445    -6112.13329151726    -5974.79621458171      29611.276681168     1858.32462194228     26543.8434290361           189.119224 \n',
 '    9300     510.362316281209    -68.0657279318423    -67.0761853267667      27425.234245919     81.6096102015337    -11648.0328951185     20477.9806505648    -219.918582807531     18263.3754170647           189.119224 \n',
 '    9400     496.077840026354    -68.3316819680063    -67.3698355650099     16575.4386341397     6080.70904651758    -1901.10632616156     13064.1074149477    -5622.08162562737     14521.3494849576           189.119224 \n',
 '    9500     506.607084644088    -68.3156122731963    -67.3333506949094     14382.3688339767    -115.325853870151     -6637.8345005762     16762.8135735116    -2241.60261997344     18207.7049101506           189.119224 \n',
 '    9600     611.237315752759    -68.3605869795741    -67.1754576186199     16850.8853616311     635.655211323809    -9747.80452848476     16032.4461849874     2225.28929034833     12554.5637929924           189.119224 \n',
 '    9700      547.27187626379    -68.0248161368555    -66.9637095056513     24740.4635172275     1674.85575549596    -10656.3626784718     22863.6109614863    -3856.85122417041     21512.8365485277           189.119224 \n',
 '    9800     805.051185043837    -68.0893185605059    -66.5284030668381     22394.3738623353     1869.73657167379    -12324.8551354018     17601.2107130093    -6219.96655906895      24626.817713438           189.119224 \n',
 '    9900     771.327934438642    -67.6981602844351    -66.2026308747138     33959.3419996729      3428.7599941819    -13904.4979051935     32306.6256587445     3421.03423863049     29455.3441256836           189.119224 \n',
 '   10000     786.766641360164    -68.4065653099462    -66.8811017577955     15515.4870845108     3744.90504723161    -6812.32085381182     13076.6293135544    -2332.26584793186     20270.0395282267           189.119224 \n',
 '   10100     559.325728787914    -68.2669263016341    -67.1824484295538     19308.1837475751    -6075.08755347678    -5190.97720213968     14870.9373655951     -2145.3759880137     17159.0479270096           189.119224 \n',
 '   10200     503.472774857546    -68.2688683699648    -67.2926839117402     16528.8873174177     6013.59482622318     -6755.7144524202     15159.0814829186    -2330.03694391745     14861.8828481813           189.119224 \n',
 '   10300     466.087359756576    -68.1726893336283    -67.2689915380563     16849.5330854815     5381.34138868399    -7825.92898527683     19818.6953002012    -7774.44558854888     19748.1688273646           189.119224 \n',
 '   10400     691.672205873936    -68.3284185827041    -66.9873338383481     16641.8769275473    -4125.50755007557    -5869.73924699397      15096.106267323    -4093.38132675261     18157.1579691784           189.119224 \n',
 '   10500     719.892936941525    -68.0116533796519    -66.6158513984488     27623.0436437595     5506.10800556824    -7959.62969196667     18435.4995582119     -8483.3556620289     26968.6915191986           189.119224 \n',
 '   10600     627.810696945363    -68.0349732267822    -66.8177097009866     22907.1934489628     4162.58046261787    -11948.8490900697     21690.9518001746    -7213.94662359217     20916.8539953123           189.119224 \n',
 '   10700     387.431463137114    -68.1209898876668    -67.3697981811268     18053.3929780958    -2208.89076983948    -9300.91351792937     23732.1421452013     598.126835816183     19687.9845241227           189.119224 \n',
 '   10800     468.926312571865    -68.2803031265456    -67.3711008791853     15334.4135160285     6805.03220597864    -7749.44024334623     14311.4039107782    -7802.42950438774     18725.5577565971           189.119224 \n',
 '   10900     499.561561354251    -68.1537181219498    -67.1851171240937     25747.1463155918     1663.68187243579    -5169.28489054965     17637.9058431475    -7035.74361490432     19113.8635282071           189.119224 \n',
 '   11000      581.93069572488    -68.0123905615476    -66.8840838699074     21428.7134144331    -6257.49231302829    -5934.23857732314      23233.237148828     6114.71345763781      23577.857447196           189.119224 \n',
 '   11100     505.837340266316    -67.6699813146148    -66.6892121953763     27996.2404488733     9712.17144204888    -11804.7904478886     32592.4874904255    -9473.39917672078     30274.1000248069           189.119224 \n',
 '   11200     547.789886830041     -68.077077307643    -67.0149663046252     24253.9756189326     5242.19344551521    -11663.6067928892     23705.5717536379    -11508.7515591851     19835.2092239648           189.119224 \n',
 '   11300     264.370001304985    -67.9724732711238    -67.4598857005888     22634.2303924334     1428.54608270639     -6600.0776972648     19664.2759533245     439.422124100082      22029.213044874           189.119224 \n',
 '   11400     454.800111297833    -68.3414139997397    -67.4596010747541     13695.3051641908     5680.42145287196    -5259.85962010287     10670.1537187705     -5384.7750881199     14528.1337682843           189.119224 \n',
 '   11500      453.37571662126    -68.0184308540652    -67.1393796910161     24332.4783940182     2211.69591911423      -10169.97416091     28230.5523742594    -4961.35905979311     20772.3214514598           189.119224 \n',
 '   11600     522.052863717569    -67.8427573102527    -66.8305478773258     27691.7262375404     790.217652144503    -12312.2408646172     31204.3194673721     1245.96565770524     26463.7843925791           189.119224 \n',
 '   11700     253.476686280167    -67.4070738672601    -66.9156073689197     33001.3033809076     10547.0376559519    -12006.1296968047     33014.2158519069    -10445.3275907663     32935.8527318868           189.119224 \n',
 '   11800     526.348588456742     -68.099540801235     -67.079002378268     20203.4069158127     3236.39064654954    -10281.8365368298     20461.8722953867    -4707.36961886242     19415.2096860531           189.119224 \n',
 '   11900     469.722387476056    -68.0611465502963    -67.1504007915728      22528.396434114     793.275998920016    -6562.42268017423     23620.5542989189     11127.4395533509     19794.6500651494           189.119224 \n',
 '   12000     451.333744229916     -68.050397637738    -67.1753056593997     19936.8389788372     7428.33356661934    -12456.3548271803     24526.7299906215    -7264.85077344323     23390.9504397957           189.119224 \n',
 '   12100     321.903064270712    -67.8065272564233    -67.1823887049697     22770.4563839042     6139.11777272957     -11461.675762944     27011.8440934193    -6583.64665106512      25870.146609072           189.119224 \n',
 '   12200     458.186121864596    -67.9916651850108    -67.1032871167727     26119.4306369964     2222.15303000458    -6306.03436901425     18645.7639592958     6462.06703139244     19886.3121503807           189.119224 \n',
 '   12300     597.103133269263     -68.109340546433    -66.9516159826379     18078.8174845455     9160.43616258605    -8346.36892366695     26358.4913038765    -5634.71023066126      21597.430934935           189.119224 \n',
 '   12400     609.010312587553    -68.1351643878537    -66.9543529681803     15705.7989377493     4344.61341291198    -7587.89960218893     23760.3633423275    -4827.94482357013     21214.6013277181           189.119224 \n',
 '   12500     436.320175315104    -68.0540476041115    -67.2080654671966     26865.3733760861     677.144526645326    -10598.0844155334     17903.6162673055      4700.3980618862     18511.9038944159           189.119224 \n',
 '   12600     384.554638081854    -68.2395641923605    -67.4939503681773     15023.7691475034     5831.03231622921    -8030.65703974759     16272.2200213344     -6212.2976551911     16213.1976482354           189.119224 \n',
 '   12700     433.623317954929    -68.3570893748596     -67.516336180546     11387.9295601037     3871.68511053094     -6813.0010108947     17914.1346010088    -5295.03020450388     11446.8655416465           189.119224 \n',
 '   12800     607.834315501665    -68.1656171708632    -66.9870858944974     20772.3824415487     325.833989032141    -9101.80672134247     17780.5591301404     4219.38666902976     21021.8051170409           189.119224 \n',
 '   12900     633.526894688352    -67.9996341428795    -66.7712874688473     22922.8341969335     3252.06499794604    -4684.79092959908     21399.7479685795    -8761.34767346794     23823.0677874981           189.119224 \n',
 '   13000     562.525560668365     -68.103422447723    -67.0127404146501     19953.0239656551     6525.69557178802    -4411.81753411584     22554.9663939456    -5937.75523540978     17054.7992507543           189.119224 \n',
 '   13100     454.379970575561    -68.2231651264351    -67.3421668132097      16300.526327926     1693.73543528649    -8168.41118546438     18874.7192487005     2905.19264250537     14146.0803511813           189.119224 \n',
 '   13200     582.392236378763    -68.5419307071296    -67.4127291333117     8311.67681004463      168.04272377494    -3410.06910594455     14040.2296653617    -4231.21184785893     12660.4189077418           189.119224 \n',
 '   13300     582.203957734991    -68.2862565942181    -67.1574200742721     20155.2857587391     2064.08844422916    -4771.89163603634     14455.7983404039     -1735.4899698052     14895.5751329145           189.119224 \n',
 '   13400     805.792326263581    -68.0452827649957    -66.4829302710049     24953.0372830364     2566.96441447507    -12386.3686921774      22928.300963938     1944.23299573617     21837.9313417016           189.119224 \n',
 '   13500     622.847600784057    -67.9883250569694    -66.7806844891157     21386.0689539598     1619.42630879136    -6822.53866485475     28413.4211215078     -11736.973260648     16961.7245851411           189.119224 \n',
 '   13600     665.507903737959    -68.4660567118509    -67.1757019898137     13731.2152188396     4010.67899720868    -5533.96575597166     14310.9683619032    -1140.62378204742     12735.5007086641           189.119224 \n',
 '   13700     537.223043472265    -68.3763123017747    -67.3346893743262     15651.2121489044     480.194823722296    -5954.08733865436     12719.5677447976    -356.811330042012     15634.0526028428           189.119224 \n',
 '   13800      609.70413005853    -68.4797361054899     -67.297579441613      13459.068510163     1155.17121837879     -3544.0349013072     13635.0080894129    -7409.23511007564     7691.99599267491           189.119224 \n',
 '   13900      540.35406592549    -67.8817482151964    -66.8340545415033     23966.8019380223      6384.6612650185    -3362.96624877103     26374.3536111761     3713.67104982243     21418.7085197226           189.119224 \n',
 '   14000     886.058820027893    -68.2052832990091    -66.4873019256791     16649.8975263285     673.969733763146    -12047.3156276603     26266.3578991116     326.483890277683     22955.1323009957           189.119224 \n',
 '   14100     619.511990526075    -68.0409238899681    -66.8397507440985     27562.3007173106     537.591040780515    -10993.2380866877     24576.7513248682    -5751.48014476964     18140.6448312877           189.119224 \n',
 '   14200      551.35200015972    -68.1625125005888    -67.0934949082885      19984.536579469      6561.1188093963    -438.250945384121     17660.3523722295     8855.62505625036     17328.6859552822           189.119224 \n',
 '   14300     428.352849338108    -68.0449596577217    -67.2144253864726     17787.8277263849    -560.345348037989    -5141.06294662621     25539.7008613965    -2768.55265331468     20216.0919685734           189.119224 \n',
 '   14400     453.431629129901     -68.134385742841    -67.2552261709072      19961.284787241    -516.650396399599    -4926.94840615207      21950.178478403     -6268.8436079025     16272.3553608913           189.119224 \n',
 '   14500     433.800814826319    -68.0042734774468    -67.1631761340632     24981.9746920816     10305.2851611355    -2278.59252225517      25804.858418349     8229.91276557155     20630.2132191788           189.119224 \n',
 '   14600     542.420558466426    -67.8676884327602    -66.8159880321849     24755.9202254414     113.321867862743    -6185.87153552356     27655.2414063822    -4593.67216700292     23299.4612148671           189.119224 \n',
 '   14700     560.709189667395      -67.78147650416    -66.6943162367714     27927.1467205074    -4984.36005225575      2559.3271654165     29229.0777439466    -9185.53691917582      26540.032995271           189.119224 \n',
 '   14800     346.041293766363    -67.8049957610306    -67.1340555439072        23382.2303397     4904.82200980686    -740.888806930079     29444.1292345134     15527.4130201166     22912.2784978262           189.119224 \n',
 '   14900     343.037336671167    -68.0664411978543    -67.4013253596763     21782.6596883595     1736.19602560827    -6889.67475336362     24368.9038114589    -4187.03384265729     16936.4249917252           189.119224 \n',
 '   15000     395.995231840521    -68.1151181275169    -67.3473221112117     18722.2376901177    -4125.75855553413     3358.31802224581      16944.859529448    -4879.38711418283     20007.9773974462           189.119224 \n',
 '   15100     340.209816329198     -67.810516630432     -67.150883077595     25405.4370988186     4341.38610427835      3418.2968906314     25804.7385302126     14087.3590237485     23422.2430355514           189.119224 \n',
 '   15200     460.309227910509    -67.8192302872192    -66.9267357240509     23235.7085674788    -592.983337670222    -3108.67853306353     33868.1387565405    -5721.61863390141     23737.9975003575           189.119224 \n',
 '   15300     544.196795713775    -67.6119650510959    -66.5568207002585     32094.0082870438    -10686.3063771603     636.527120809248     37184.8335232262    -10899.0527927301     32589.2660805992           189.119224 \n',
 '   15400     717.246688998647    -67.6735355172715    -66.2828643519605     35975.1701551024     6410.92568419312     8634.03900306921     29022.0965194596      13057.132838131     29167.1087508058           189.119224 \n',
 '   15500     472.651538365358    -67.8662004777795    -66.9497753820258     22541.0149646646    -1572.49312549023    -745.369905034059     26781.1888106538    -4816.80081224628     25121.7686161964           189.119224 \n',
 '   15600     511.435901074994    -68.2296190946364     -67.237994913669     12364.1401273502    -8106.61605672632      768.89217356199     22674.5408571583    -3512.11928816953      19196.263408022           189.119224 \n',
 '   15700      450.87806079242     -68.202705554258    -67.3284971015278     22968.5237069757     4745.77315460298     2896.01944608236      18932.816177729     4829.37594445915     14263.1211958023           189.119224 \n',
 '   15800     551.758122663529    -68.3073947085009    -67.2375896843947     15258.5120779981    -234.479305046803     1089.29935745579     16025.0158340025    -9445.10298860762     15566.0823820374           189.119224 \n',
 '   15900      461.87484725723    -67.7051651753168     -66.809635029392     23503.0753680229    -6276.33601031378     772.577615873933     25741.7670393524    -7546.86118138325     29425.0057805977           189.119224 \n',
 '   16000     779.143120120032    -68.0886674879173    -66.5779851976803     23488.3685842577     1478.33527206706    -775.909471608879     29557.1823059513      6595.5577229034     20327.2808397747           189.119224 \n',
 '   16100     577.952770666815    -68.1964134596188    -67.0758195755256     17105.1353929248    -3980.69212456051    -1448.63946554476     19918.5897195283    -8311.89572119956     18527.3770903677           189.119224 \n',
 '   16200     481.643687677941    -68.3054981764562    -67.3716381828424     16239.2204605127    -2498.48362301014    -1540.89627468492     13679.3939747306    -6875.10212124688     15473.0832734283           189.119224 \n',
 '   16300       457.0415028101    -68.1852432046264    -67.2990844407626     18871.9914285076       1851.719399411     444.131549376909     16511.9720375225     3174.07838845371     15874.6692119418           189.119224 \n',
 '   16400      684.21187402669    -68.3816324758391    -67.0550125851279     10971.6239917991    -3242.62330439286     674.959002468702     20402.1067670421    -8474.73827223267      19131.095899752           189.119224 \n',
 '   16500     638.908998429508     -68.050771606141     -66.811989559459     23564.1739974503     4951.05342294899    -9130.26051231827     24288.8238851179    -5487.22195543634      20168.419981087           189.119224 \n',
 '   16600     583.016268223076    -67.9494013268404    -66.8189898163223     29487.3541240262     2703.85022125349     4595.50217334924      20060.986970618     -5922.0573554291     20371.5594640145           189.119224 \n',
 '   16700      456.89512502458    -68.2479728999237    -67.3620979482667     15727.6322566946    -7110.78669690331     2290.10763775823     15352.1164939521    -7257.60010161444     18487.8680052807           189.119224 \n',
 '   16800     433.105086152185    -68.3521454484014    -67.5123970548574     10765.0989902454    -168.405791020238    -7656.23703527558     16736.7204597283    -3205.02163226737     14650.2934046069           189.119224 \n',
 '   16900     497.088329315483    -68.2940993894702    -67.3302937465933     16579.5152451425    -714.632869652095     154.225965838653     14448.8606006814    -4291.72978958472     15202.0741454241           189.119224 \n',
 '   17000     613.422488077343    -68.1393571196083    -66.9499909232812     22617.3522444108    -5372.04075967293     553.475893307102     17875.9148264535    -9159.83546830077     19648.3282907593           189.119224 \n',
 '   17100     561.450237287077    -67.9873595418209    -66.8987624555907     22846.4035799851     2754.18725020916    -5370.43168479384     25360.8714141913    -709.035215072487     22322.2838112935           189.119224 \n',
 '   17200     610.871964070679    -68.2013218160144    -67.0169008362313     15021.3638865581    -4972.60158479639     5827.84023028572     18967.4564474106    -4291.92928538442     25034.9534796859           189.119224 \n',
 '   17300     537.682643414338    -68.2105853771193    -67.1680713303435     21471.9521393303     -4478.1825337994     4158.48104979401     18762.4966611281    -4459.46099492902     14638.3357945985           189.119224 \n',
 '   17400     418.459819432037     -68.079066318109    -67.2677136640621     21930.0816378085      6072.2438478674    -8041.79192215654     17828.3154307043    -1598.51763162529     18824.5401989326           189.119224 \n',
 '   17500     426.617240647005    -68.1318188425541    -67.3046497467711     18753.1812699035    -11697.2914586572     8159.47005198774     17895.4213444117    -6200.54584508243     22796.9745238735           189.119224 \n',
 '   17600     477.435591645742    -68.1630882578967    -67.2373873508324     21652.1699999819    -7986.29990017899     1624.72835041846     22131.1492137033    -4674.35351320384     19897.9142004588           189.119224 \n',
 '   17700     498.322493088297    -68.0020639168441    -67.0358653511437     22724.5898590448     5260.20664889119    -10647.9482864345     20235.0448030633    -3606.36021129747     22337.8221140178           189.119224 \n',
 '   17800     557.084888633622    -67.9248647593795    -66.8447316571481     28274.0823363116    -11170.7353588201      8801.4966049562     22825.4981390324    -5101.94518440088     24451.5710291295           189.119224 \n',
 '   17900     612.310686098833    -68.1365611137705    -66.9493505927177     21978.8487531325    -8216.01369465881     3991.12398052232     19812.6667694422    -8728.08829445253     22480.0258893063           189.119224 \n',
 '   18000     291.895182160688    -67.9618360483087    -67.3958798447454       21093.14200999     158.875729881656    -2665.21616493181      24250.971247703     -4801.6999802807     25298.1979910041           189.119224 \n',
 '   18100     481.794635722219    -68.4530384679492     -67.518885800844      13889.072710422    -5407.08687400461     7272.44326603755     11035.6137895429    -3394.63537999751     10755.6494415215           189.119224 \n',
 '   18200     422.267337924793    -68.1779357970406    -67.3592007371067     23885.7729214075    -1387.11670332778     2305.96140670602     14155.6911058489    -3714.38490319216     18311.9434469411           189.119224 \n',
 '   18300     463.038850406717    -68.0641310376487    -67.1663440034857     17709.5214325514     6814.04708898342    -7735.40196577623     20145.7315815255    -1782.27556293885     24240.8361747718           189.119224 \n',
 '   18400     414.528853865626    -67.9159797659221    -67.1122488695618     24587.0033968854    -9306.81856484302     6695.97751243393     29697.7200292323    -7007.44565306775     24881.5850748898           189.119224 \n',
 '   18500     699.115513442397     -68.468447950031    -67.1129313604413     19207.0315625995    -1964.56652512555    -3002.69862269454     7006.09586953775    -3434.96870433857     14403.0553833582           189.119224 \n',
 '   18600     389.562629397405      -67.91947846445    -67.1641546350127     22333.3547009676     6198.06701221828    -8422.33423830011     20870.9383032571    -3831.77867718126     21922.7573829738           189.119224 \n',
 '   18700     495.908419148122    -68.2478085552411     -67.286290642754     14001.8257416164    -8224.17981899248     3669.10182278196     18735.7205954259    -6316.73903869347      18143.324111402           189.119224 \n',
 '   18800     480.096783833498    -68.3678642033466    -67.4370035049614     16605.6949850703    -3536.43375661869     125.444204869849     12711.2884268591    -3482.38602565509     15420.2875720372           189.119224 \n',
 '   18900     538.289843593345    -68.4395562319811    -67.3958648834576     12335.0502099604     2568.45178544301    -1108.60804185953     12442.9136800621    -2707.90643575831      11472.457135341           189.119224 \n',
 '   19000     519.180206974529    -68.0118303732697    -67.0051907407498     22900.6008027586    -7085.49449985353     5033.65002998617     20656.4218703901    -4100.87193183252      22220.845369029           189.119224 \n',
 '   19100     682.760314985113    -68.0797134988156    -66.7559080390873     23867.7764056859    -2487.73196324851    -139.302394813878     19479.3306020782    -2056.17803415283     21993.5840849855           189.119224 \n',
 '   19200     675.248381619178    -68.2562528916068    -66.9470123358202     15062.8955374318    -790.202065201523     105.737425768789     22151.4141159676     100.610252748705     19919.8022027111           189.119224 \n',
 '   19300       531.0940023034     -68.296238717134    -67.2664994009385     16598.6518368988    -7597.80757302693     920.620927359108     12257.5163719374    -3167.37046658052     14713.5379064335           189.119224 \n',
 '   19400     510.879057876232    -68.2995589784029    -67.3090144619247     18121.1103181982    -426.408954027718    -1763.10677646532     14357.5007373379    -1273.88169269523     15224.2144395129           189.119224 \n',
 '   19500     502.788810809596    -68.1970892104942    -67.2222308916498     18373.3102458239    -4288.92883192719     2026.19796992239     18538.5248950183     4480.68437693641     15561.2513614693           189.119224 \n',
 '   19600     681.997923289919    -68.3725068480854    -67.0501795912731     16374.2224614244     -10307.738442725     2315.28853519777     14121.3171496543    -2435.56930401477     20698.7087708072           189.119224 \n',
 '   19700     628.901203616282     -68.073159858465    -66.8537819469132     21967.3947767958    -1335.80730368286     2709.56918739432     21410.1258280348    -1369.52139510482     22842.1438845384           189.119224 \n',
 '   19800     662.601436415897    -68.0145417581747    -66.7298223919498     27206.1152392973    -6310.17047765051     5794.68527745809     22958.3048481937     7827.97039782678     18487.8307492595           189.119224 \n',
 '   19900     555.510546142821    -68.1759694504294    -67.0988888442777     20522.8551070372    -11129.3613120763     1412.88858414027     18256.7992115278     2164.17437233048     17684.5948473656           189.119224 \n',
 '   20000      505.21904558572    -68.4093522296588    -67.4297819233212     12098.4459233872    -4292.01093720161    -903.045201895561     15523.8146469419     1357.24541233158     18935.8949910496           189.119224 \n',
 'Loop time of 0.425478 on 1 procs for 20000 steps with 16 atoms\n',
 '\n',
 'Performance: 4061.315 ns/day, 0.006 hours/ns, 47005.958 timesteps/s\n',
 '94.9% CPU use with 1 MPI tasks x no OpenMP threads\n',
 '\n',
 'MPI task timing breakdown:\n',
 'Section |  min time  |  avg time  |  max time  |%varavg| %total\n',
 '---------------------------------------------------------------\n',
 'Pair    | 0.30868    | 0.30868    | 0.30868    |   0.0 | 72.55\n',
 'Neigh   | 0          | 0          | 0          |   0.0 |  0.00\n',
 'Comm    | 0.043128   | 0.043128   | 0.043128   |   0.0 | 10.14\n',
 'Output  | 0.037684   | 0.037684   | 0.037684   |   0.0 |  8.86\n',
 'Modify  | 0.027489   | 0.027489   | 0.027489   |   0.0 |  6.46\n',
 'Other   |            | 0.008495   |            |       |  2.00\n',
 '\n',
 'Nlocal:        16.0000 ave          16 max          16 min\n',
 'Histogram: 1 0 0 0 0 0 0 0 0 0\n',
 'Nghost:        325.000 ave         325 max         325 min\n',
 'Histogram: 1 0 0 0 0 0 0 0 0 0\n',
 'Neighs:        464.000 ave         464 max         464 min\n',
 'Histogram: 1 0 0 0 0 0 0 0 0 0\n',
 '\n',
 'Total # of neighbors = 464\n',
 'Ave neighs/atom = 29.000000\n',
 'Neighbor list builds = 0\n',
 'Dangerous builds = 0\n',
 'Total wall time: 0:00:00\n']

By being able to add additional input commands and manually parse the output, pyiron can be easily extended to support additional features which are implemented in the simulation code but which are not yet available in the pyiron interface.

Density functional theory

After the general introduction to molecular dynamics calculation with pyiron, the interface for DFT codes is briefly introduced. For comparison the energy volume curve is calculated for GPAW and S/PHI/nX in comparison to an interatomic potential calculation with LAMMPS. Starting with importing numpy:

import numpy as np

Accessing the experimental reference data from ASE for an initial guess:

from ase.data import reference_states, atomic_numbers
alat_guess = reference_states[atomic_numbers["Fe"]]["a"]  # guess for the expermential lattice constant
alat_guess
2.87

Creating a for-loop to iterate over the available simulation codes - in this test environment LAMMPS, GPAW and S/PHI/nX are available:

code_lst = ["Lammps", "Gpaw", "Sphinx"]

Then for each code calculate 11 strains ranging from 90% to 110%:

for job_type in code_lst:
    for strain in np.linspace(0.9, 1.1, 11):
        job_name = "job_" + job_type.lower() + "_" + str(strain).replace(".", "_")
        job = pr.create_job(job_type=job_type, job_name=job_name)
        job.structure = pr.create.structure.ase.bulk("Fe", a=alat_guess * strain**(1/3))
        job.run()
/srv/conda/envs/notebook/lib/python3.7/site-packages/pyiron_atomistics/lammps/base.py:238: UserWarning: No potential set via job.potential - use default potential, 1997--Ackland-G-J--Fe--LAMMPS--ipr1
  warnings.warn("No potential set via job.potential - use default potential, " + lst_of_potentials[0])
The job job_lammps_0_9 was saved and received the ID: 3
/srv/conda/envs/notebook/lib/python3.7/site-packages/pyiron_atomistics/lammps/base.py:238: UserWarning: No potential set via job.potential - use default potential, 1997--Ackland-G-J--Fe--LAMMPS--ipr1
  warnings.warn("No potential set via job.potential - use default potential, " + lst_of_potentials[0])
The job job_lammps_0_92 was saved and received the ID: 4
/srv/conda/envs/notebook/lib/python3.7/site-packages/pyiron_atomistics/lammps/base.py:238: UserWarning: No potential set via job.potential - use default potential, 1997--Ackland-G-J--Fe--LAMMPS--ipr1
  warnings.warn("No potential set via job.potential - use default potential, " + lst_of_potentials[0])
The job job_lammps_0_9400000000000001 was saved and received the ID: 5
/srv/conda/envs/notebook/lib/python3.7/site-packages/pyiron_atomistics/lammps/base.py:238: UserWarning: No potential set via job.potential - use default potential, 1997--Ackland-G-J--Fe--LAMMPS--ipr1
  warnings.warn("No potential set via job.potential - use default potential, " + lst_of_potentials[0])
The job job_lammps_0_9600000000000001 was saved and received the ID: 6
/srv/conda/envs/notebook/lib/python3.7/site-packages/pyiron_atomistics/lammps/base.py:238: UserWarning: No potential set via job.potential - use default potential, 1997--Ackland-G-J--Fe--LAMMPS--ipr1
  warnings.warn("No potential set via job.potential - use default potential, " + lst_of_potentials[0])
The job job_lammps_0_9800000000000001 was saved and received the ID: 7
/srv/conda/envs/notebook/lib/python3.7/site-packages/pyiron_atomistics/lammps/base.py:238: UserWarning: No potential set via job.potential - use default potential, 1997--Ackland-G-J--Fe--LAMMPS--ipr1
  warnings.warn("No potential set via job.potential - use default potential, " + lst_of_potentials[0])
The job job_lammps_1_0 was saved and received the ID: 8
/srv/conda/envs/notebook/lib/python3.7/site-packages/pyiron_atomistics/lammps/base.py:238: UserWarning: No potential set via job.potential - use default potential, 1997--Ackland-G-J--Fe--LAMMPS--ipr1
  warnings.warn("No potential set via job.potential - use default potential, " + lst_of_potentials[0])
The job job_lammps_1_02 was saved and received the ID: 9
/srv/conda/envs/notebook/lib/python3.7/site-packages/pyiron_atomistics/lammps/base.py:238: UserWarning: No potential set via job.potential - use default potential, 1997--Ackland-G-J--Fe--LAMMPS--ipr1
  warnings.warn("No potential set via job.potential - use default potential, " + lst_of_potentials[0])
The job job_lammps_1_04 was saved and received the ID: 10
/srv/conda/envs/notebook/lib/python3.7/site-packages/pyiron_atomistics/lammps/base.py:238: UserWarning: No potential set via job.potential - use default potential, 1997--Ackland-G-J--Fe--LAMMPS--ipr1
  warnings.warn("No potential set via job.potential - use default potential, " + lst_of_potentials[0])
The job job_lammps_1_06 was saved and received the ID: 11
/srv/conda/envs/notebook/lib/python3.7/site-packages/pyiron_atomistics/lammps/base.py:238: UserWarning: No potential set via job.potential - use default potential, 1997--Ackland-G-J--Fe--LAMMPS--ipr1
  warnings.warn("No potential set via job.potential - use default potential, " + lst_of_potentials[0])
The job job_lammps_1_08 was saved and received the ID: 12
/srv/conda/envs/notebook/lib/python3.7/site-packages/pyiron_atomistics/lammps/base.py:238: UserWarning: No potential set via job.potential - use default potential, 1997--Ackland-G-J--Fe--LAMMPS--ipr1
  warnings.warn("No potential set via job.potential - use default potential, " + lst_of_potentials[0])
The job job_lammps_1_1 was saved and received the ID: 13
The job job_gpaw_0_9 was saved and received the ID: 14
The job job_gpaw_0_92 was saved and received the ID: 15
The job job_gpaw_0_9400000000000001 was saved and received the ID: 16
The job job_gpaw_0_9600000000000001 was saved and received the ID: 17
The job job_gpaw_0_9800000000000001 was saved and received the ID: 18
The job job_gpaw_1_0 was saved and received the ID: 19
The job job_gpaw_1_02 was saved and received the ID: 20
The job job_gpaw_1_04 was saved and received the ID: 21
The job job_gpaw_1_06 was saved and received the ID: 22
The job job_gpaw_1_08 was saved and received the ID: 23
The job job_gpaw_1_1 was saved and received the ID: 24
The job job_sphinx_0_9 was saved and received the ID: 25
The job job_sphinx_0_92 was saved and received the ID: 26
The job job_sphinx_0_9400000000000001 was saved and received the ID: 27
The job job_sphinx_0_9600000000000001 was saved and received the ID: 28
The job job_sphinx_0_9800000000000001 was saved and received the ID: 29
The job job_sphinx_1_0 was saved and received the ID: 30
The job job_sphinx_1_02 was saved and received the ID: 31
The job job_sphinx_1_04 was saved and received the ID: 32
The job job_sphinx_1_06 was saved and received the ID: 33
The job job_sphinx_1_08 was saved and received the ID: 34
The job job_sphinx_1_1 was saved and received the ID: 35

With the combination of two for-loops one over the simulation codes and one over the 11 strain values, a total of 33 calculation were calculated. The job_table() function can be used to get an overview of all calculation:

pr.job_table()
id status chemicalformula job subjob projectpath project timestart timestop totalcputime computer hamilton hamversion parentid masterid
0 2 finished Fe16 lmp_md /lmp_md /home/jovyan/ demonstration/ 2021-03-22 22:14:59.380010 2021-03-22 22:15:01.970857 2.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None
1 3 finished Fe job_lammps_0_9 /job_lammps_0_9 /home/jovyan/ demonstration/ 2021-03-22 22:15:04.978244 2021-03-22 22:15:05.821316 0.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None
2 4 finished Fe job_lammps_0_92 /job_lammps_0_92 /home/jovyan/ demonstration/ 2021-03-22 22:15:07.461177 2021-03-22 22:15:08.170077 0.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None
3 5 finished Fe job_lammps_0_9400000000000001 /job_lammps_0_9400000000000001 /home/jovyan/ demonstration/ 2021-03-22 22:15:09.819766 2021-03-22 22:15:10.677887 0.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None
4 6 finished Fe job_lammps_0_9600000000000001 /job_lammps_0_9600000000000001 /home/jovyan/ demonstration/ 2021-03-22 22:15:12.633543 2021-03-22 22:15:13.438648 0.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None
5 7 finished Fe job_lammps_0_9800000000000001 /job_lammps_0_9800000000000001 /home/jovyan/ demonstration/ 2021-03-22 22:15:15.855037 2021-03-22 22:15:16.753057 0.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None
6 8 finished Fe job_lammps_1_0 /job_lammps_1_0 /home/jovyan/ demonstration/ 2021-03-22 22:15:19.399803 2021-03-22 22:15:20.298035 0.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None
7 9 finished Fe job_lammps_1_02 /job_lammps_1_02 /home/jovyan/ demonstration/ 2021-03-22 22:15:22.711962 2021-03-22 22:15:23.580871 0.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None
8 10 finished Fe job_lammps_1_04 /job_lammps_1_04 /home/jovyan/ demonstration/ 2021-03-22 22:15:26.172535 2021-03-22 22:15:26.924788 0.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None
9 11 finished Fe job_lammps_1_06 /job_lammps_1_06 /home/jovyan/ demonstration/ 2021-03-22 22:15:29.630814 2021-03-22 22:15:30.414435 0.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None
10 12 finished Fe job_lammps_1_08 /job_lammps_1_08 /home/jovyan/ demonstration/ 2021-03-22 22:15:33.514786 2021-03-22 22:15:34.384884 0.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None
11 13 finished Fe job_lammps_1_1 /job_lammps_1_1 /home/jovyan/ demonstration/ 2021-03-22 22:15:37.339551 2021-03-22 22:15:38.196258 0.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Lammps 0.1 None None
12 14 finished Fe job_gpaw_0_9 /job_gpaw_0_9 /home/jovyan/ demonstration/ 2021-03-22 22:15:40.009095 2021-03-22 22:16:22.265463 42.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 GpawJob None None None
13 15 finished Fe job_gpaw_0_92 /job_gpaw_0_92 /home/jovyan/ demonstration/ 2021-03-22 22:16:22.721536 2021-03-22 22:17:06.752122 44.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 GpawJob None None None
14 16 finished Fe job_gpaw_0_9400000000000001 /job_gpaw_0_9400000000000001 /home/jovyan/ demonstration/ 2021-03-22 22:17:07.127152 2021-03-22 22:17:51.710803 44.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 GpawJob None None None
15 17 finished Fe job_gpaw_0_9600000000000001 /job_gpaw_0_9600000000000001 /home/jovyan/ demonstration/ 2021-03-22 22:17:52.118786 2021-03-22 22:18:36.665396 44.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 GpawJob None None None
16 18 finished Fe job_gpaw_0_9800000000000001 /job_gpaw_0_9800000000000001 /home/jovyan/ demonstration/ 2021-03-22 22:18:37.036664 2021-03-22 22:19:19.936166 42.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 GpawJob None None None
17 19 finished Fe job_gpaw_1_0 /job_gpaw_1_0 /home/jovyan/ demonstration/ 2021-03-22 22:19:20.292918 2021-03-22 22:20:03.007094 42.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 GpawJob None None None
18 20 finished Fe job_gpaw_1_02 /job_gpaw_1_02 /home/jovyan/ demonstration/ 2021-03-22 22:20:03.411639 2021-03-22 22:20:46.112545 42.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 GpawJob None None None
19 21 finished Fe job_gpaw_1_04 /job_gpaw_1_04 /home/jovyan/ demonstration/ 2021-03-22 22:20:46.485096 2021-03-22 22:21:27.595402 41.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 GpawJob None None None
20 22 finished Fe job_gpaw_1_06 /job_gpaw_1_06 /home/jovyan/ demonstration/ 2021-03-22 22:21:27.977321 2021-03-22 22:22:11.084337 43.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 GpawJob None None None
21 23 finished Fe job_gpaw_1_08 /job_gpaw_1_08 /home/jovyan/ demonstration/ 2021-03-22 22:22:11.548721 2021-03-22 22:22:56.964241 45.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 GpawJob None None None
22 24 finished Fe job_gpaw_1_1 /job_gpaw_1_1 /home/jovyan/ demonstration/ 2021-03-22 22:22:57.385933 2021-03-22 22:23:54.158552 56.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 GpawJob None None None
23 25 finished Fe job_sphinx_0_9 /job_sphinx_0_9 /home/jovyan/ demonstration/ 2021-03-22 22:23:55.765440 2021-03-22 22:24:00.207315 4.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Sphinx 2.6.1 None None
24 26 finished Fe job_sphinx_0_92 /job_sphinx_0_92 /home/jovyan/ demonstration/ 2021-03-22 22:24:01.719252 2021-03-22 22:24:06.116443 4.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Sphinx 2.6.1 None None
25 27 finished Fe job_sphinx_0_9400000000000001 /job_sphinx_0_9400000000000001 /home/jovyan/ demonstration/ 2021-03-22 22:24:07.684934 2021-03-22 22:24:11.819524 4.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Sphinx 2.6.1 None None
26 28 finished Fe job_sphinx_0_9600000000000001 /job_sphinx_0_9600000000000001 /home/jovyan/ demonstration/ 2021-03-22 22:24:13.191394 2021-03-22 22:24:16.738522 3.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Sphinx 2.6.1 None None
27 29 finished Fe job_sphinx_0_9800000000000001 /job_sphinx_0_9800000000000001 /home/jovyan/ demonstration/ 2021-03-22 22:24:18.137480 2021-03-22 22:24:21.714600 3.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Sphinx 2.6.1 None None
28 30 finished Fe job_sphinx_1_0 /job_sphinx_1_0 /home/jovyan/ demonstration/ 2021-03-22 22:24:23.218162 2021-03-22 22:24:27.052932 3.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Sphinx 2.6.1 None None
29 31 finished Fe job_sphinx_1_02 /job_sphinx_1_02 /home/jovyan/ demonstration/ 2021-03-22 22:24:28.449162 2021-03-22 22:24:32.947448 4.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Sphinx 2.6.1 None None
30 32 finished Fe job_sphinx_1_04 /job_sphinx_1_04 /home/jovyan/ demonstration/ 2021-03-22 22:24:34.526377 2021-03-22 22:24:38.945663 4.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Sphinx 2.6.1 None None
31 33 finished Fe job_sphinx_1_06 /job_sphinx_1_06 /home/jovyan/ demonstration/ 2021-03-22 22:24:40.409863 2021-03-22 22:24:44.875899 4.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Sphinx 2.6.1 None None
32 34 finished Fe job_sphinx_1_08 /job_sphinx_1_08 /home/jovyan/ demonstration/ 2021-03-22 22:24:46.318580 2021-03-22 22:24:51.173380 4.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Sphinx 2.6.1 None None
33 35 finished Fe job_sphinx_1_1 /job_sphinx_1_1 /home/jovyan/ demonstration/ 2021-03-22 22:24:52.749741 2021-03-22 22:24:57.223806 4.0 pyiron@jupyter-pyiron-2dswimm-2dworkshop-2d2021-2dptsckvuq#1 Sphinx 2.6.1 None None

Still already with 10+ calculation it is no longer efficient to load each of the calculation in an python object and aggregate the data manually. Instead pyiron implements an map-reduce approach to aggregate data. Starting with a filter function to select which calculation should be considered:

def filter_jobs(job): 
    return "job_" in job.job_name

Followed by three functions to extract the data from the individual calculations, namely the volume, the total energy and the simulation code used:

def get_volume(job):
    return job["output/generic/volume"][-1]
def get_energy(job):
    return job["output/generic/energy_tot"][-1]
def get_job_type(job):
    return job.job_name.split("_")[1]

Then the iterjobs() function of the Project object can be used to iterate over all calculation in a given project and append the aggregated data to a list:

vol_lst, eng_lst, type_lst = [], [], []
for job in pr.iter_jobs(): 
    if filter_jobs(job): 
        vol_lst.append(get_volume(job))
        eng_lst.append(get_energy(job))
        type_lst.append(get_job_type(job))

Finally from the three lists a pandas dataframe is created for further processing:

import pandas 
df = pandas.DataFrame({"volume": vol_lst, "energy": eng_lst, "code": type_lst})
df
volume energy code
0 10.637956 -4.237523 lammps
1 10.874355 -4.269142 lammps
2 11.110754 -4.291747 lammps
3 11.347153 -4.306420 lammps
4 11.583552 -4.314162 lammps
5 11.819951 -4.315913 lammps
6 12.056351 -4.312422 lammps
7 12.292750 -4.304104 lammps
8 12.529149 -4.291307 lammps
9 12.765548 -4.274357 lammps
10 13.001947 -4.253559 lammps
11 10.637956 -8.415330 gpaw
12 10.874355 -8.405401 gpaw
13 11.110754 -8.391528 gpaw
14 11.347153 -8.366699 gpaw
15 11.583552 -8.337753 gpaw
16 11.819952 -8.306994 gpaw
17 12.056351 -8.269991 gpaw
18 12.292750 -8.229149 gpaw
19 12.529149 -8.183081 gpaw
20 12.765548 -8.134536 gpaw
21 13.001947 -8.083455 gpaw
22 10.637958 -3385.605809 sphinx
23 10.874357 -3385.605352 sphinx
24 11.110756 -3385.599835 sphinx
25 11.347155 -3385.581958 sphinx
26 11.583554 -3385.563189 sphinx
27 11.819954 -3385.535566 sphinx
28 12.056353 -3385.506976 sphinx
29 12.292752 -3385.473376 sphinx
30 12.529151 -3385.435295 sphinx
31 12.765550 -3385.392446 sphinx
32 13.001949 -3385.349528 sphinx

Alternatively to manually creating a for loop to iterate over a given set of calculations, pyiron also implements the pyiron table object, which behaves like a job object and can be submitted to a computing cluster to aggregate data thereL

table = pr.create.table()

Again the same functions are used and after assigning them the run() function is called to start the pyiron table object:

table.filter_function = filter_jobs
table.add["volume"] = get_volume
table.add["energy"] = get_energy
table.add["code"] = get_job_type
table.run()
100%|██████████| 35/35 [00:00<00:00, 1090.81it/s]
 12%|█▏        | 4/33 [00:00<00:00, 35.32it/s]
The job table was saved and received the ID: 36
100%|██████████| 33/33 [00:00<00:00, 42.43it/s]

The pyiron table object creates a dataframe, just like the one created above:

df_table = table.get_dataframe()
df_table
job_id volume energy code
0 3 10.637956 -4.237523 lammps
1 4 10.874355 -4.269142 lammps
2 5 11.110754 -4.291747 lammps
3 6 11.347153 -4.306420 lammps
4 7 11.583552 -4.314162 lammps
5 8 11.819951 -4.315913 lammps
6 9 12.056351 -4.312422 lammps
7 10 12.292750 -4.304104 lammps
8 11 12.529149 -4.291307 lammps
9 12 12.765548 -4.274357 lammps
10 13 13.001947 -4.253559 lammps
11 14 10.637956 -8.415330 gpaw
12 15 10.874355 -8.405401 gpaw
13 16 11.110754 -8.391528 gpaw
14 17 11.347153 -8.366699 gpaw
15 18 11.583552 -8.337753 gpaw
16 19 11.819952 -8.306994 gpaw
17 20 12.056351 -8.269991 gpaw
18 21 12.292750 -8.229149 gpaw
19 22 12.529149 -8.183081 gpaw
20 23 12.765548 -8.134536 gpaw
21 24 13.001947 -8.083455 gpaw
22 25 10.637958 -3385.605809 sphinx
23 26 10.874357 -3385.605352 sphinx
24 27 11.110756 -3385.599835 sphinx
25 28 11.347155 -3385.581958 sphinx
26 29 11.583554 -3385.563189 sphinx
27 30 11.819954 -3385.535566 sphinx
28 31 12.056353 -3385.506976 sphinx
29 32 12.292752 -3385.473376 sphinx
30 33 12.529151 -3385.435295 sphinx
31 34 12.765550 -3385.392446 sphinx
32 35 13.001949 -3385.349528 sphinx

Finally the pandas dataframe can be used in combination with matplotlib to plot the energy volume curves for the three different simulation codes:

for code in code_lst: 
    df_tmp = df_table[df_table["code"] == code.lower()]
    plt.plot(df_tmp.volume, df_tmp.energy-df_tmp.energy.min(), "x", label=code)
plt.legend()
plt.xlabel("Volume")
plt.ylabel("rel. Energy")
Text(0, 0.5, 'rel. Energy')
_images/day1_91_1.png

Additional tools

At the end of a workflow it is reasonable to collect the tools used in a given Project and publications to cite. In pyiron all publications for a given workflow can be listed usind the list_publications() function:

pr.list_publications()
author title journal volume pages issn doi url year number publisher
0 [Jan Janssen, Sudarsan Surendralal, Yury Lysogorskiy, Mira Todorova, Tilmann Hickel, Ralf Drautz, Jörg Neugebauer] pyiron: An integrated development environment for computational materials science Computational Materials Science 161 24 - 36 0927-0256 https://doi.org/10.1016/j.commatsci.2018.07.043 http://www.sciencedirect.com/science/article/pii/S0927025618304786 2019 NaN NaN
1 [Ask Hjorth Larsen, Jens Jørgen Mortensen, Jakob Blomqvist, Ivano E Castelli, Rune Christensen, Marcin Dułak, Jesper Friis, Michael N Groves, Bjørk Hammer, Cory Hargus, Eric D Hermes, Paul C Jenni... The atomic simulation environment—a Python library for working with atoms Journal of Physics: Condensed Matter 29 273002 NaN NaN http://stacks.iop.org/0953-8984/29/i=27/a=273002 2017 27 NaN
2 [Steve Plimpton] Fast Parallel Algorithms for Short-Range Molecular Dynamics Journal of Computational Physics 117 1-19 0021-9991 10.1006/jcph.1995.1039 http://www.sciencedirect.com/science/article/pii/S002199918571039X 1995 1 NaN
3 [G. J. Ackland, D. J. Bacon, A. F. Calder, T. Harry] Computer simulation of point defect properties in dilute Fe-Cu alloy using a many-body interatomic potential Philosophical Magazine A 75 713--732 NaN 10.1080/01418619708207198 https://doi.org/10.1080%2F01418619708207198 1997 3 Informa UK Limited

Another helpful function is the ability to remove all calculation in a given project. This can be done using the remove_jobs() function or even the remove_jobs_silently() function which deletes all jobs in a given repository without the need for additional confirmation. Both functions should be used very carefully:

# pr.remove_jobs(recursive=True)
pr.remove_jobs_silently(recursive=True)

Summary

At the end of the first day the following features have been presented:

  • pyiron is designed to work with Jupyter notebooks and Jupyter Lab.

  • The generic format allows the user to switch from one simulation code to the next.

  • Using the map-reduce principle pyiron is able to aggregate large amounts of data efficiently for further processing.

Additional exercises:

  • Iterate over available interatomic potentials and calculate the energy volume curve for each of them.

  • Calculate the volume expansion for different using calc_md() with the additional pressure=0.0 parameter for an NPT ensemble. An example for calculating the volume expansion is available in the documentation

  • Use the functions set_encut() and set_kpoints() to modify the convergence parameters of a plane wave DFT code and study the convergence behaviour for calculating the energy volume curve.