Complex workflows made easy

From rapid prototyping to high performance computing in material science


Generic Interface

The pyiron IDE is built on top of an abstract class of Python objects, which can be combined like building blocks.

So switching from density functional theory (VASP, SPHInX) to interatomic potentials (LAMMPS) is as easy as changing a variable.

from pyiron import Project # Import Project object 

pr = Project("demonstration")  # Create a project/folder 
structure = pr.create_ase_bulk("Al")  # Create an aluminium bulk structure
for job_type in ["Gpaw", "Lammps", "Sphinx"]:  # Iterate over simulation codes
    job = pr.create_job(  # Create a job object
    job.structure = structure  # assign the structure 
    # job.server.queue = "my_queue"  # uncomment to up-scale to HPC 
    # job.server.cores = 4  # Set number of cores  # Execute the calculation


To up-scale the interactive calculation to HPC pyiron implements the server object. This enables studying trends e.g. in the periodic table.

The resulting large datasets can be quickly analyzed using the map-reduce pattern: The pyironTable object aggregates the results in a single pandas Dataframe.

table = pr.create_table()  # Create analysis object 
table.add.get_energy_tot  # Define analysis functions 
table.add.get_volume  # get the volume and total energy
table.add["job_type"] = lambda job: job.__name__  # Add custom analysis function  # Execute the analysis 
print(table.get_dataframe())  # Results are summarized in DataFrame


New simulation codes can be added easily to the pyiron IDE either by using the Python bindings (see example below) or by defining a write_input and a collect_output function to parse the input and output files of the executable.

from pyiron_base import PythonTemplateJob

class ToyJob(PythonTemplateJob):  # Create a custom job class
    def __init__(self, project, job_name):
        super().__init__(project, job_name) 
        self.input['input_energy'] = 100  # Define default input
    def run_static(self):  # Call a python function 
        self["user/result"] = self.input["input_energy"]
        self.status.finished = True  

job = pr.create_job(job_type=ToyJob, job_name="toy")  # Create job instance  # Execute Custom job class 

Latest News

Supercharge your research with reproducibility.