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.
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.
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.
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()
NGLWidget()
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()
NGLWidget()
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 500
K. 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 500
K 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')
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')
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')
Finally the molecular dynamics trajectory can be directly visualised in the browser:
job_lmp.animate_structure()
NGLWidget(max_frame=100)
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.
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')
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)
At the end of the first day the following features have been presented:
Additional exercises:
calc_md()
with the additional pressure=0.0
parameter for an NPT ensemble. An example for calculating the volume expansion is available in the documentationset_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.