Complex workflows made easy

From rapid prototyping to high performance computing in material science

Screenshot

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_type=job_type, 
        job_name=job_type
    )
    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
    job.run()  # Execute the calculation

Up-scaling

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
table.run()  # Execute the analysis 
print(table.get_dataframe())  # Results are summarized in DataFrame

Extendability

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
job.run()  # Execute Custom job class 

Latest News


Supercharge your research with reproducibility.